colibri/docs/ZOT-RPC-TRANSCRIPT.md
Sam & Claude 1242c52360
Some checks failed
CI / rust (pull_request) Has been cancelled
CI / markdown (pull_request) Has been cancelled
CI / port (pull_request) Has been cancelled
CI / agent-jail-pkgs (pull_request) Has been cancelled
docs(zot-rpc): backtick event identifiers in the verdict
The bare underscored names (tool_call, tool_use_*, text_delta, assistant_*)
were read as markdown emphasis and mangled by prettier; wrap them in code
spans so they render literally and stay prettier-immune.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 22:46:07 +02:00

72 lines
3.4 KiB
Markdown

# zot rpc transcript — DeepSeek (2026-06-21)
## Request shape
```json
{"id":"1","type":"prompt","message":"check the current directory"}
```
zot uses its own protocol, NOT JSON-RPC 2.0. The `type` field is `prompt`,
`id` is a correlation string.
## Raw stdout (secrets redacted, auth failed — key was placeholder)
```json
{"command":"prompt","data":{"started":true},"id":"1","success":true,"type":"response"}
{"content":[{"text":"check the current directory","type":"text"}],"time":"2026-06-21T22:36:06.817Z","type":"user_message"}
{"step":1,"type":"turn_start"}
{"error":"deepseek: http 401: ...","stop":"error","type":"turn_end"}
{"message":"deepseek: http 401: ...","type":"error"}
{"type":"done"}
```
## Wire format decision
**Bare event objects.** Each line is a plain JSON object with a `type` field.
No JSON-RPC envelope (no `jsonrpc`, `method`, `params` wrapping). This
matches glasspane's `zot_event_type` parser exactly — it reads
`value.get("type")` directly from the object.
## Event types observed
| Event type | Glasspane mapping | Status |
| ------------------------- | ---------------------- | ---------- |
| `response` (success:true) | None (no state change) | ✅ Correct |
| `user_message` | `message_update` | ✅ Tested |
| `turn_start` | `turn_start` | ✅ Tested |
| `turn_end` | `turn_end` | ✅ Tested |
| `error` | `error` | ✅ Tested |
| `done` | `agent_end` | ✅ Tested |
## Event types mapped but not in transcript (need live API key)
| Event type | Glasspane mapping | Risk |
| ------------------- | ----------------------- | ------------------------------ |
| `assistant_start` | `message_start` | Low — name matches zot source |
| `text_delta` | `message_update` | Low — standard streaming event |
| `assistant_message` | `message_end` | Low — name matches zot source |
| `tool_call` | `tool_execution_start` | Low — name matches |
| `tool_use_start` | `tool_execution_start` | Low — name matches |
| `tool_use_args` | `tool_execution_update` | Low |
| `tool_progress` | `tool_execution_update` | Low |
| `tool_use_end` | `tool_execution_update` | Low |
| `tool_result` | `tool_execution_end` | Low |
| `usage` | None (no state change) | Low |
## Type values NOT in the current mapping
None observed. All 6 event types from the transcript have mappings.
The `response` type with `success:true` correctly returns None (no state change).
## Verdict
Wire format confirmed: bare event objects, no JSON-RPC envelope. Glasspane's
parser shape is correct. The session-lifecycle events (turn_start, turn_end,
error, done, user_message, response) are validated against real output.
Tool-lifecycle events (`tool_call`, `tool_use_*`, `text_delta`, `assistant_*`, `tool_result`)
are NOT yet validated — the API key was a placeholder (DeepSeek returned 401
before reaching the agent loop). A re-run with a valid DEEPSEEK_API_KEY is
needed to capture a real tool call before the driver can trust those mappings.
Step 1 of colibri#143 remains partially open for that real-key re-run.