OpenWalrusOpenWalrus

WHS Services

Walrus Hook Services — external processes that extend the daemon with memory, search, messaging, and custom capabilities.

OpenWalrus extends its daemon through WHS (Walrus Hook Services) — external child processes that communicate via protobuf. Official services for memory, search, and messaging ship alongside the daemon. Third-party services use the same protocol.

Service kinds

KindProtocolDirectionUse case
hookwhs.proto (UDS)Daemon → serviceMemory, search, custom tools
clientwalrus.proto (TCP)Service → daemonGateway (Telegram, Discord)
processNoneManaged subprocessArbitrary scripts

Official services

ServiceBinaryKindCapabilities
Memorywalrus-memoryhookTools, BuildAgent, Compact, EventObserver
Searchwalrus-searchhookTools
GatewaywgatewayclientTelegram, Discord

Configuration

Each service is a [services.<name>] section in walrus.toml:

[services.memory]
kind = "hook"
command = "walrus-memory"
enabled = true
config = { entities = ["project"], connections = 30 }
FieldTypeDescriptionDefault
kindstring"hook", "client", or "process"Required
commandstringBinary to spawnRequired
argsstring[]Command arguments[]
enabledboolWhether to start this servicetrue
configtable?Opaque config passed as JSON at handshake{}

Service lifecycle

  1. Spawn — daemon starts the service process with socket path or daemon address
  2. Handshake — service declares its name and capabilities via WhsReady
  3. Configure — daemon sends opaque config JSON, service acknowledges
  4. Register tools — service declares tool schemas for agent use
  5. Ready — tools are routed to the service, lifecycle hooks fire as agents run
  6. Shutdown — daemon sends WhsShutdown, service exits gracefully

Capabilities

Services declare what they can do at handshake:

CapabilityDescription
ToolsProvides tool schemas that agents can call
BuildAgentEnriches agent config at creation (inject system prompt, override tools)
BeforeRunInjects context before each agent execution
CompactEnhances context compaction prompts
EventObserverObserves agent lifecycle events (text deltas, tool calls, completions)
QueryResponds to structured queries from the daemon

What's next

On this page