Step 1 of colibri#143. Captured with zot rpc --provider deepseek. Wire format: bare event objects (no JSON-RPC envelope), matches glasspane's zot_event_type parser. All 6 observed types mapped. Remaining types (tool_call, text_delta, etc.) need a live API key but type names match zot source. Verdict: glasspane parser is correct. Steps 2-3 unblocked.
3.4 KiB
zot rpc transcript — DeepSeek (2026-06-21)
Request shape
{"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)
{"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 (toolcall, tool_use, textdelta, 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.