Files
clawdbot/docs/rpc.md
2025-12-07 05:08:14 +01:00

57 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Clawdis Agent RPC (proposal)
## Motivation
- Voice wake forwarding and mac CLI currently shell out to `pnpm clawdis agent --json`, spawning a Node process per send.
- pi-monos coding-agent keeps a hot process in RPC mode: read JSON on stdin, emit JSON on stdout.
- We want the same pattern so cross-host voice → WhatsApp uses a long-lived Node worker, better latency, and structured errors.
## Goal
Run the Node CLI in `--mode rpc` on the host that has the active WhatsApp session. Communicate over stdin/stdout with newline-delimited JSON messages.
## Proposed protocol
### Commands (stdin)
- `{"type":"send", "text":"hi", "session":"main", "thinking":"low"}`
- `{"type":"abort"}` cancel current generation (if supported)
- `{"type":"status"}` health ping
- (Optional) `{"type":"compact"}` trigger session compaction
### Events (stdout)
- `{"type":"message_start", "role":"assistant"}`
- `{"type":"message_end", "text":"..."}`
- `{"type":"error", "error":"message"}`
- `{"type":"status", "ok":true, "details":"..."}`
- Preserve existing `--json` payload shape where possible so consumers can reuse parsers.
## Runtime design (Node CLI)
- Add `--mode rpc` to the Node CLI (similar to pi-monos coding-agent).
- Initialize agent/session once, keep it alive.
- Use readline on stdin; for each JSON line, dispatch:
- `send` → call agent, stream message events to stdout as they occur.
- `abort` → cancel current request.
- `status` → emit `{type:"status", ok:true}`.
- Never exit unless stdin closes; log fatal errors to stderr and emit `{type:"error"}` before exit.
## Mac-side integration
- Create an `RpcAgentProcess` helper:
- Spawn `pnpm clawdis --mode rpc` in repo root (`/Users/steipete/Projects/clawdis`).
- Keep stdin/stdout pipes; restart on exit.
- Method `send(text, session, thinking)` → write JSON line, wait for `message_end` or `error`, return result.
- XPC handler `agent`:
- Prefer RpcAgentProcess; if unavailable, fall back to one-shot `pnpm clawdis agent --json` (existing behavior).
- Return errors to callers (voice wake, CLI) so failures are visible in logs/UI.
## Voice wake path
- Voice wake forward still SSHes to the WhatsApp host; the hosts XPC `agent` uses RpcAgentProcess to deliver the message without extra process spawn.
- If RPC is down, it falls back to one-shot and logs the failure.
## Error handling & observability
- All non-OK responses emit an `error` event with the message/exit code.
- Mac logs on `VoiceWakeForwarder` already surface SSH/CLI failures; extend to tag RPC restarts.
- Consider a `clawdis-mac status --rpc` flag to report whether the RPC worker is live.
## Next steps
1) Implement `--mode rpc` in Node CLI (mirror pi-monos coding-agent main.ts rpc path).
2) Add `RpcAgentProcess` in the mac app; switch XPC `agent` to use it.
3) Wire `clawdis-mac agent` to prefer RPC, fall back to one-shot.
4) Optional: add a tiny RPC health metric to status JSON.