Browse Source

refactor(acp-example): snapshot goldens are JSONL, not pretty-printed .txt

The goldens now mirror the shape of the surfaces they capture — one compact
JSON record per line — matching the wire (NDJSON stdout) and disk (JSONL
session log) formats, renamed *.golden.jsonl. They stay grep/jq-able and
faithful to what the agent emits, where the prior pretty-printed .txt was a
reformatted representation. Both normalizers drop the 2-space indent; the
normalizer spec asserts the compact form. All 11 goldens regenerated; replay
remains deterministic (8/8 across runs).
Tianyi Cui 3 months ago
parent
commit
ec73e11c9b
26 changed files with 366 additions and 4895 deletions
  1. 1 1
      docs/rfc/implemented/2026-06-19-acp-snapshot-tests.md
  2. 3 3
      examples/acp-agent/tests/acp.snapshot.ts
  3. 5 5
      examples/acp-agent/tests/snapshot-normalize.spec.ts
  4. 9 7
      examples/acp-agent/tests/snapshot-normalize.ts
  5. 8 0
      examples/acp-agent/tests/snapshots/cancel/session.golden.jsonl
  6. 0 95
      examples/acp-agent/tests/snapshots/cancel/session.golden.txt
  7. 5 0
      examples/acp-agent/tests/snapshots/cancel/stdout.golden.jsonl
  8. 0 62
      examples/acp-agent/tests/snapshots/cancel/stdout.golden.txt
  9. 7 0
      examples/acp-agent/tests/snapshots/error-finish/session.golden.jsonl
  10. 0 79
      examples/acp-agent/tests/snapshots/error-finish/session.golden.txt
  11. 4 0
      examples/acp-agent/tests/snapshots/error-finish/stdout.golden.jsonl
  12. 0 49
      examples/acp-agent/tests/snapshots/error-finish/stdout.golden.txt
  13. 2 0
      examples/acp-agent/tests/snapshots/handshake/stdout.golden.jsonl
  14. 0 27
      examples/acp-agent/tests/snapshots/handshake/stdout.golden.txt
  15. 66 0
      examples/acp-agent/tests/snapshots/multi-turn/session.golden.jsonl
  16. 0 929
      examples/acp-agent/tests/snapshots/multi-turn/session.golden.txt
  17. 45 0
      examples/acp-agent/tests/snapshots/multi-turn/stdout.golden.jsonl
  18. 0 615
      examples/acp-agent/tests/snapshots/multi-turn/stdout.golden.txt
  19. 35 0
      examples/acp-agent/tests/snapshots/text-turn/session.golden.jsonl
  20. 0 489
      examples/acp-agent/tests/snapshots/text-turn/session.golden.txt
  21. 25 0
      examples/acp-agent/tests/snapshots/text-turn/stdout.golden.jsonl
  22. 0 342
      examples/acp-agent/tests/snapshots/text-turn/stdout.golden.txt
  23. 100 0
      examples/acp-agent/tests/snapshots/tool-call-turn/session.golden.jsonl
  24. 0 1469
      examples/acp-agent/tests/snapshots/tool-call-turn/session.golden.txt
  25. 51 0
      examples/acp-agent/tests/snapshots/tool-call-turn/stdout.golden.jsonl
  26. 0 723
      examples/acp-agent/tests/snapshots/tool-call-turn/stdout.golden.txt

+ 1 - 1
docs/rfc/implemented/2026-06-19-acp-snapshot-tests.md

@@ -57,7 +57,7 @@ A snapshot run asserts **two** normalized goldens, because the harness's externa
 
 The two are genuinely additive: stdout is the bridge's *lossy projection* of the log (it drops `usage`, `step/*`, exact `seq`/`time`, and renders tool I/O differently), so a loop/tool/turn-structure regression can change the JSONL while leaving the stdout projection identical, and a bridge-translation regression can change stdout while the JSONL is untouched. Asserting the JSONL equality also echoes the proposed [universal replay fixture](../proposed/2026-06-11-deterministic-and-stress-testing.md) idea.
 
-Both surfaces contain non-deterministic values that a pure normalization function scrubs **before** the snapshot: `randomUUID()` session ids → `{{sessionId}}`, the temp `mkdtemp` cwd → `{{cwd}}` (it appears in terminal-card `_meta` and the log header), JSON-RPC ids → a stable sequence, and the log's per-event `time` (epoch ms) + header `createdAt` dropped or zeroed. Real bash runs during replay, so the JSONL normalizer additionally stabilizes tool-output volatility (any embedded paths/pids/timestamps) — scenarios keep bash commands tightly constrained (`echo`, file writes; no `date`/`env`/background/large-output) so this surface is small. The goldens hold normalized, stable-stringified frames/events (not opaque bytes) for clean, line-diffable PRs; a separate raw-purity assertion keeps the guarantee that every stdout line parses as JSON (no logger leak onto the protocol channel). Vitest's `toMatchFileSnapshot` provides the golden store and the `-u`/`--update` "accept the diff" workflow.
+Both surfaces contain non-deterministic values that a pure normalization function scrubs **before** the snapshot: `randomUUID()` session ids → `{{sessionId}}`, the temp `mkdtemp` cwd → `{{cwd}}` (it appears in terminal-card `_meta` and the log header), JSON-RPC ids → a stable sequence, and the log's per-event `time` (epoch ms) + header `createdAt` dropped or zeroed (the log's `seq` is left intact — it is deterministic by contract, `seq = log.length`). Real bash runs during replay, so the JSONL normalizer additionally stabilizes tool-output volatility (any embedded paths/pids/timestamps) — scenarios keep bash commands tightly constrained (`echo`, file writes; no `date`/`env`/background/large-output) so this surface is small. The goldens are themselves **JSONL** — one compact, normalized record per line, in the same shape as the surfaces they mirror (NDJSON on the wire, JSONL on disk: `stdout.golden.jsonl`, `session.golden.jsonl`), so they stay `grep`/`jq`-able and faithful to what the agent actually emits. A separate raw-purity assertion keeps the guarantee that every stdout line parses as JSON (no logger leak onto the protocol channel). Vitest's `toMatchFileSnapshot` provides the golden store and the `-u`/`--update` "accept the diff" workflow.
 
 ### Isolation: normalization now, sandbox later
 

+ 3 - 3
examples/acp-agent/tests/acp.snapshot.ts

@@ -72,12 +72,12 @@ for (const scenario of SCENARIOS) {
       }
 
       await expect(normalizeStdout(result.rawStdout, ctx))
-        .toMatchFileSnapshot(join(dir, 'stdout.golden.txt'))
+        .toMatchFileSnapshot(join(dir, 'stdout.golden.jsonl'))
 
       if (scenario.hasModelTurn) {
         expect(result.sessionLog, 'a model scenario must persist a session log').toBeDefined()
         await expect(normalizeSessionLog(result.sessionLog as string, ctx))
-          .toMatchFileSnapshot(join(dir, 'session.golden.txt'))
+          .toMatchFileSnapshot(join(dir, 'session.golden.jsonl'))
       }
     })
   })
@@ -99,7 +99,7 @@ describe('snapshot fixtures', () => {
       const dir = join(SNAPSHOTS_DIR, name)
       expect(existsSync(join(dir, 'input.json')), `${name}/input.json`).toBe(true)
       expect(existsSync(join(dir, 'session.jsonl')), `${name}/session.jsonl`).toBe(true)
-      expect(existsSync(join(dir, 'stdout.golden.txt')), `${name}/stdout.golden.txt`).toBe(true)
+      expect(existsSync(join(dir, 'stdout.golden.jsonl')), `${name}/stdout.golden.jsonl`).toBe(true)
     }
   })
 })

+ 5 - 5
examples/acp-agent/tests/snapshot-normalize.spec.ts

@@ -19,8 +19,8 @@ describe('normalizeStdout', () => {
       JSON.stringify({ jsonrpc: '2.0', id: 99, method: 'session/new' }),
     ].join('\n')
     const out = normalizeStdout(raw, ctx)
-    expect(out).toContain('"id": 1')
-    expect(out).toContain('"id": 2')
+    expect(out).toContain('"id":1')
+    expect(out).toContain('"id":2')
     expect(out).not.toContain('42')
     expect(out).not.toContain('99')
   })
@@ -65,14 +65,14 @@ describe('normalizeSessionLog', () => {
 
   it('zeroes the header createdAt', () => {
     const out = normalizeSessionLog(`${header({})}\n`, ctx)
-    expect(out).toContain('"createdAt": 0')
+    expect(out).toContain('"createdAt":0')
     expect(out).not.toContain('123')
   })
 
   it('zeroes each event time but keeps seq', () => {
     const out = normalizeSessionLog(`${header({})}\n${event({ seq: 7, time: 999 })}\n`, ctx)
-    expect(out).toContain('"time": 0')
-    expect(out).toContain('"seq": 7') // seq is deterministic — NOT scrubbed
+    expect(out).toContain('"time":0')
+    expect(out).toContain('"seq":7') // seq is deterministic — NOT scrubbed
     expect(out).not.toContain('999')
   })
 

+ 9 - 7
examples/acp-agent/tests/snapshot-normalize.ts

@@ -53,10 +53,11 @@ function scrubValue(value: unknown, ctx: NormalizeContext): unknown {
 
 /**
  * Normalize a raw stdout transcript (newline-delimited JSON-RPC frames) into a
- * stable, line-diffable golden: one pretty-printed frame per block, with the
- * JSON-RPC `id` rewritten to a per-transcript sequence (1, 2, 3, …) and all
- * volatile strings scrubbed. Throws if any non-empty line is not valid JSON —
- * that doubles as the stdout-purity check (no logger leaked onto the protocol).
+ * stable golden in the SAME shape as the wire: one compact JSON frame per line
+ * (NDJSON), with the JSON-RPC `id` rewritten to a per-transcript sequence
+ * (1, 2, 3, …) and all volatile strings scrubbed. Throws if any non-empty line
+ * is not valid JSON — that doubles as the stdout-purity check (no logger leaked
+ * onto the protocol).
  */
 export function normalizeStdout(rawStdout: string, ctx: NormalizeContext): string {
   const lines = rawStdout.split('\n').filter(line => line.trim().length > 0)
@@ -76,14 +77,15 @@ export function normalizeStdout(rawStdout: string, ctx: NormalizeContext): strin
     }
     return scrubValue(frame, ctx) as Record<string, unknown>
   })
-  return frames.map(f => JSON.stringify(f, null, 2)).join('\n') + '\n'
+  return frames.map(f => JSON.stringify(f)).join('\n') + '\n'
 }
 
 /**
  * Normalize a session JSONL log into a stable golden: the header line's
  * volatile fields (`createdAt`, `id`, `cwd`) and every event's `time` are
  * zeroed/scrubbed, all volatile strings scrubbed, and `seq` is LEFT INTACT
- * (deterministic by contract). One pretty-printed record per block.
+ * (deterministic by contract). Output is JSONL in the same shape as the input —
+ * one compact record per line.
  */
 export function normalizeSessionLog(rawLog: string, ctx: NormalizeContext): string {
   const lines = rawLog.split('\n').filter(line => line.trim().length > 0)
@@ -98,5 +100,5 @@ export function normalizeSessionLog(rawLog: string, ctx: NormalizeContext): stri
     }
     return scrubValue(record, ctx) as Record<string, unknown>
   })
-  return records.map(r => JSON.stringify(r, null, 2)).join('\n') + '\n'
+  return records.map(r => JSON.stringify(r)).join('\n') + '\n'
 }

+ 8 - 0
examples/acp-agent/tests/snapshots/cancel/session.golden.jsonl

@@ -0,0 +1,8 @@
+{"type":"session","version":1,"id":"{{sessionId}}","createdAt":0,"cwd":"{{cwd}}"}
+{"type":"turn/start","seq":0,"time":0,"data":{"turn":1,"trigger":{"kind":"message","source":{"kind":"user"}}}}
+{"type":"user/message","seq":1,"time":0,"data":{"content":[{"type":"text","text":"Start a long task; this turn will be cancelled mid-stream."}],"source":{"kind":"user"}}}
+{"type":"step/start","seq":2,"time":0,"data":{"turn":1,"step":1}}
+{"type":"assistant/chunk","seq":3,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"text"}}}
+{"type":"assistant/chunk","seq":4,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"text-delta","index":0,"text":"partial"}}}
+{"type":"step/end","seq":5,"time":0,"data":{"turn":1,"step":1}}
+{"type":"turn/end","seq":6,"time":0,"data":{"turn":1,"reason":{"kind":"aborted","reason":"session/cancel"}}}

+ 0 - 95
examples/acp-agent/tests/snapshots/cancel/session.golden.txt

@@ -1,95 +0,0 @@
-{
-  "type": "session",
-  "version": 1,
-  "id": "{{sessionId}}",
-  "createdAt": 0,
-  "cwd": "{{cwd}}"
-}
-{
-  "type": "turn/start",
-  "seq": 0,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "trigger": {
-      "kind": "message",
-      "source": {
-        "kind": "user"
-      }
-    }
-  }
-}
-{
-  "type": "user/message",
-  "seq": 1,
-  "time": 0,
-  "data": {
-    "content": [
-      {
-        "type": "text",
-        "text": "Start a long task; this turn will be cancelled mid-stream."
-      }
-    ],
-    "source": {
-      "kind": "user"
-    }
-  }
-}
-{
-  "type": "step/start",
-  "seq": 2,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 3,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-start",
-      "index": 0,
-      "blockType": "text"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 4,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "text-delta",
-      "index": 0,
-      "text": "partial"
-    }
-  }
-}
-{
-  "type": "step/end",
-  "seq": 5,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1
-  }
-}
-{
-  "type": "turn/end",
-  "seq": 6,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "reason": {
-      "kind": "aborted",
-      "reason": "session/cancel"
-    }
-  }
-}

+ 5 - 0
examples/acp-agent/tests/snapshots/cancel/stdout.golden.jsonl

@@ -0,0 +1,5 @@
+{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":1,"agentInfo":{"name":"deepseek-harness-acp","version":"0.0.1"},"agentCapabilities":{"loadSession":true,"promptCapabilities":{"image":false,"audio":false,"embeddedContext":false}},"authMethods":[]}}
+{"jsonrpc":"2.0","id":2,"result":{"sessionId":"{{sessionId}}"}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"user_message_chunk","content":{"type":"text","text":"Start a long task; this turn will be cancelled mid-stream."}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_message_chunk","content":{"type":"text","text":"partial"}}}}
+{"jsonrpc":"2.0","id":3,"result":{"stopReason":"cancelled"}}

+ 0 - 62
examples/acp-agent/tests/snapshots/cancel/stdout.golden.txt

@@ -1,62 +0,0 @@
-{
-  "jsonrpc": "2.0",
-  "id": 1,
-  "result": {
-    "protocolVersion": 1,
-    "agentInfo": {
-      "name": "deepseek-harness-acp",
-      "version": "0.0.1"
-    },
-    "agentCapabilities": {
-      "loadSession": true,
-      "promptCapabilities": {
-        "image": false,
-        "audio": false,
-        "embeddedContext": false
-      }
-    },
-    "authMethods": []
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 2,
-  "result": {
-    "sessionId": "{{sessionId}}"
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "user_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "Start a long task; this turn will be cancelled mid-stream."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "partial"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 3,
-  "result": {
-    "stopReason": "cancelled"
-  }
-}

+ 7 - 0
examples/acp-agent/tests/snapshots/error-finish/session.golden.jsonl

@@ -0,0 +1,7 @@
+{"type":"session","version":1,"id":"{{sessionId}}","createdAt":0,"cwd":"{{cwd}}"}
+{"type":"turn/start","seq":0,"time":0,"data":{"turn":1,"trigger":{"kind":"message","source":{"kind":"user"}}}}
+{"type":"user/message","seq":1,"time":0,"data":{"content":[{"type":"text","text":"This prompt triggers a recorded provider error."}],"source":{"kind":"user"}}}
+{"type":"step/start","seq":2,"time":0,"data":{"turn":1,"step":1}}
+{"type":"step/end","seq":3,"time":0,"data":{"turn":1,"step":1}}
+{"type":"error","seq":4,"time":0,"data":{"turn":1,"step":1,"message":"simulated provider error (HTTP 401)","code":"AUTH"}}
+{"type":"turn/end","seq":5,"time":0,"data":{"turn":1,"reason":{"kind":"error","message":"simulated provider error (HTTP 401)","code":"AUTH"}}}

+ 0 - 79
examples/acp-agent/tests/snapshots/error-finish/session.golden.txt

@@ -1,79 +0,0 @@
-{
-  "type": "session",
-  "version": 1,
-  "id": "{{sessionId}}",
-  "createdAt": 0,
-  "cwd": "{{cwd}}"
-}
-{
-  "type": "turn/start",
-  "seq": 0,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "trigger": {
-      "kind": "message",
-      "source": {
-        "kind": "user"
-      }
-    }
-  }
-}
-{
-  "type": "user/message",
-  "seq": 1,
-  "time": 0,
-  "data": {
-    "content": [
-      {
-        "type": "text",
-        "text": "This prompt triggers a recorded provider error."
-      }
-    ],
-    "source": {
-      "kind": "user"
-    }
-  }
-}
-{
-  "type": "step/start",
-  "seq": 2,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1
-  }
-}
-{
-  "type": "step/end",
-  "seq": 3,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1
-  }
-}
-{
-  "type": "error",
-  "seq": 4,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "message": "simulated provider error (HTTP 401)",
-    "code": "AUTH"
-  }
-}
-{
-  "type": "turn/end",
-  "seq": 5,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "reason": {
-      "kind": "error",
-      "message": "simulated provider error (HTTP 401)",
-      "code": "AUTH"
-    }
-  }
-}

+ 4 - 0
examples/acp-agent/tests/snapshots/error-finish/stdout.golden.jsonl

@@ -0,0 +1,4 @@
+{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":1,"agentInfo":{"name":"deepseek-harness-acp","version":"0.0.1"},"agentCapabilities":{"loadSession":true,"promptCapabilities":{"image":false,"audio":false,"embeddedContext":false}},"authMethods":[]}}
+{"jsonrpc":"2.0","id":2,"result":{"sessionId":"{{sessionId}}"}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"user_message_chunk","content":{"type":"text","text":"This prompt triggers a recorded provider error."}}}}
+{"jsonrpc":"2.0","id":3,"error":{"code":-32603,"message":"Internal error: turn failed: simulated provider error (HTTP 401)"}}

+ 0 - 49
examples/acp-agent/tests/snapshots/error-finish/stdout.golden.txt

@@ -1,49 +0,0 @@
-{
-  "jsonrpc": "2.0",
-  "id": 1,
-  "result": {
-    "protocolVersion": 1,
-    "agentInfo": {
-      "name": "deepseek-harness-acp",
-      "version": "0.0.1"
-    },
-    "agentCapabilities": {
-      "loadSession": true,
-      "promptCapabilities": {
-        "image": false,
-        "audio": false,
-        "embeddedContext": false
-      }
-    },
-    "authMethods": []
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 2,
-  "result": {
-    "sessionId": "{{sessionId}}"
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "user_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "This prompt triggers a recorded provider error."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 3,
-  "error": {
-    "code": -32603,
-    "message": "Internal error: turn failed: simulated provider error (HTTP 401)"
-  }
-}

+ 2 - 0
examples/acp-agent/tests/snapshots/handshake/stdout.golden.jsonl

@@ -0,0 +1,2 @@
+{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":1,"agentInfo":{"name":"deepseek-harness-acp","version":"0.0.1"},"agentCapabilities":{"loadSession":true,"promptCapabilities":{"image":false,"audio":false,"embeddedContext":false}},"authMethods":[]}}
+{"jsonrpc":"2.0","id":2,"result":{"sessionId":"{{sessionId}}"}}

+ 0 - 27
examples/acp-agent/tests/snapshots/handshake/stdout.golden.txt

@@ -1,27 +0,0 @@
-{
-  "jsonrpc": "2.0",
-  "id": 1,
-  "result": {
-    "protocolVersion": 1,
-    "agentInfo": {
-      "name": "deepseek-harness-acp",
-      "version": "0.0.1"
-    },
-    "agentCapabilities": {
-      "loadSession": true,
-      "promptCapabilities": {
-        "image": false,
-        "audio": false,
-        "embeddedContext": false
-      }
-    },
-    "authMethods": []
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 2,
-  "result": {
-    "sessionId": "{{sessionId}}"
-  }
-}

+ 66 - 0
examples/acp-agent/tests/snapshots/multi-turn/session.golden.jsonl

@@ -0,0 +1,66 @@
+{"type":"session","version":1,"id":"{{sessionId}}","createdAt":0,"cwd":"{{cwd}}"}
+{"type":"turn/start","seq":0,"time":0,"data":{"turn":1,"trigger":{"kind":"message","source":{"kind":"user"}}}}
+{"type":"user/message","seq":1,"time":0,"data":{"content":[{"type":"text","text":"Reply with exactly the word: ONE. No tools."}],"source":{"kind":"user"}}}
+{"type":"step/start","seq":2,"time":0,"data":{"turn":1,"step":1}}
+{"type":"assistant/chunk","seq":3,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"reasoning"}}}
+{"type":"assistant/chunk","seq":4,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"The"}}}
+{"type":"assistant/chunk","seq":5,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" user"}}}
+{"type":"assistant/chunk","seq":6,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" wants"}}}
+{"type":"assistant/chunk","seq":7,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" me"}}}
+{"type":"assistant/chunk","seq":8,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" to"}}}
+{"type":"assistant/chunk","seq":9,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" reply"}}}
+{"type":"assistant/chunk","seq":10,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" with"}}}
+{"type":"assistant/chunk","seq":11,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" exactly"}}}
+{"type":"assistant/chunk","seq":12,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" the"}}}
+{"type":"assistant/chunk","seq":13,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" word"}}}
+{"type":"assistant/chunk","seq":14,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" \""}}}
+{"type":"assistant/chunk","seq":15,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"ONE"}}}
+{"type":"assistant/chunk","seq":16,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"\""}}}
+{"type":"assistant/chunk","seq":17,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" and"}}}
+{"type":"assistant/chunk","seq":18,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" no"}}}
+{"type":"assistant/chunk","seq":19,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" tools"}}}
+{"type":"assistant/chunk","seq":20,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"."}}}
+{"type":"assistant/chunk","seq":21,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":1,"blockType":"text"}}}
+{"type":"assistant/chunk","seq":22,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"text-delta","index":1,"text":"ONE"}}}
+{"type":"assistant/chunk","seq":23,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"reasoning","text":"The user wants me to reply with exactly the word \"ONE\" and no tools."}}}}
+{"type":"assistant/chunk","seq":24,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":1,"block":{"type":"text","text":"ONE"}}}}
+{"type":"assistant/chunk","seq":25,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":113,"outputTokens":19,"cacheReadTokens":768,"reasoningTokens":17}}}}
+{"type":"assistant/chunk","seq":26,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"finish","reason":{"kind":"stop"}}}}
+{"type":"assistant/message","seq":27,"time":0,"data":{"turn":1,"step":1,"content":[{"type":"reasoning","text":"The user wants me to reply with exactly the word \"ONE\" and no tools."},{"type":"text","text":"ONE"}]}}
+{"type":"usage","seq":28,"time":0,"data":{"turn":1,"step":1,"usage":{"inputTokens":113,"outputTokens":19,"cacheReadTokens":768,"reasoningTokens":17}}}
+{"type":"step/end","seq":29,"time":0,"data":{"turn":1,"step":1}}
+{"type":"turn/end","seq":30,"time":0,"data":{"turn":1,"reason":{"kind":"completed"}}}
+{"type":"turn/start","seq":31,"time":0,"data":{"turn":2,"trigger":{"kind":"message","source":{"kind":"user"}}}}
+{"type":"user/message","seq":32,"time":0,"data":{"content":[{"type":"text","text":"Reply with exactly the word: TWO. No tools."}],"source":{"kind":"user"}}}
+{"type":"step/start","seq":33,"time":0,"data":{"turn":2,"step":1}}
+{"type":"assistant/chunk","seq":34,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"reasoning"}}}
+{"type":"assistant/chunk","seq":35,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"The"}}}
+{"type":"assistant/chunk","seq":36,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" user"}}}
+{"type":"assistant/chunk","seq":37,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" wants"}}}
+{"type":"assistant/chunk","seq":38,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" me"}}}
+{"type":"assistant/chunk","seq":39,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" to"}}}
+{"type":"assistant/chunk","seq":40,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" reply"}}}
+{"type":"assistant/chunk","seq":41,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" with"}}}
+{"type":"assistant/chunk","seq":42,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" exactly"}}}
+{"type":"assistant/chunk","seq":43,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" the"}}}
+{"type":"assistant/chunk","seq":44,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" word"}}}
+{"type":"assistant/chunk","seq":45,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" \""}}}
+{"type":"assistant/chunk","seq":46,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"T"}}}
+{"type":"assistant/chunk","seq":47,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"WO"}}}
+{"type":"assistant/chunk","seq":48,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"\""}}}
+{"type":"assistant/chunk","seq":49,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" and"}}}
+{"type":"assistant/chunk","seq":50,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" use"}}}
+{"type":"assistant/chunk","seq":51,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" no"}}}
+{"type":"assistant/chunk","seq":52,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" tools"}}}
+{"type":"assistant/chunk","seq":53,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"."}}}
+{"type":"assistant/chunk","seq":54,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"block-start","index":1,"blockType":"text"}}}
+{"type":"assistant/chunk","seq":55,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"text-delta","index":1,"text":"T"}}}
+{"type":"assistant/chunk","seq":56,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"text-delta","index":1,"text":"WO"}}}
+{"type":"assistant/chunk","seq":57,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"reasoning","text":"The user wants me to reply with exactly the word \"TWO\" and use no tools."}}}}
+{"type":"assistant/chunk","seq":58,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"block-end","index":1,"block":{"type":"text","text":"TWO"}}}}
+{"type":"assistant/chunk","seq":59,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":129,"outputTokens":22,"cacheReadTokens":768,"reasoningTokens":19}}}}
+{"type":"assistant/chunk","seq":60,"time":0,"data":{"turn":2,"step":1,"chunk":{"type":"finish","reason":{"kind":"stop"}}}}
+{"type":"assistant/message","seq":61,"time":0,"data":{"turn":2,"step":1,"content":[{"type":"reasoning","text":"The user wants me to reply with exactly the word \"TWO\" and use no tools."},{"type":"text","text":"TWO"}]}}
+{"type":"usage","seq":62,"time":0,"data":{"turn":2,"step":1,"usage":{"inputTokens":129,"outputTokens":22,"cacheReadTokens":768,"reasoningTokens":19}}}
+{"type":"step/end","seq":63,"time":0,"data":{"turn":2,"step":1}}
+{"type":"turn/end","seq":64,"time":0,"data":{"turn":2,"reason":{"kind":"completed"}}}

+ 0 - 929
examples/acp-agent/tests/snapshots/multi-turn/session.golden.txt

@@ -1,929 +0,0 @@
-{
-  "type": "session",
-  "version": 1,
-  "id": "{{sessionId}}",
-  "createdAt": 0,
-  "cwd": "{{cwd}}"
-}
-{
-  "type": "turn/start",
-  "seq": 0,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "trigger": {
-      "kind": "message",
-      "source": {
-        "kind": "user"
-      }
-    }
-  }
-}
-{
-  "type": "user/message",
-  "seq": 1,
-  "time": 0,
-  "data": {
-    "content": [
-      {
-        "type": "text",
-        "text": "Reply with exactly the word: ONE. No tools."
-      }
-    ],
-    "source": {
-      "kind": "user"
-    }
-  }
-}
-{
-  "type": "step/start",
-  "seq": 2,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 3,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-start",
-      "index": 0,
-      "blockType": "reasoning"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 4,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "The"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 5,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " user"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 6,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " wants"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 7,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " me"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 8,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " to"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 9,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " reply"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 10,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " with"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 11,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " exactly"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 12,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " the"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 13,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " word"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 14,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " \""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 15,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "ONE"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 16,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "\""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 17,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " and"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 18,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " no"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 19,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " tools"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 20,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "."
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 21,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-start",
-      "index": 1,
-      "blockType": "text"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 22,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "text-delta",
-      "index": 1,
-      "text": "ONE"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 23,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-end",
-      "index": 0,
-      "block": {
-        "type": "reasoning",
-        "text": "The user wants me to reply with exactly the word \"ONE\" and no tools."
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 24,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-end",
-      "index": 1,
-      "block": {
-        "type": "text",
-        "text": "ONE"
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 25,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "usage",
-      "usage": {
-        "inputTokens": 113,
-        "outputTokens": 19,
-        "cacheReadTokens": 768,
-        "reasoningTokens": 17
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 26,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "finish",
-      "reason": {
-        "kind": "stop"
-      }
-    }
-  }
-}
-{
-  "type": "assistant/message",
-  "seq": 27,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "content": [
-      {
-        "type": "reasoning",
-        "text": "The user wants me to reply with exactly the word \"ONE\" and no tools."
-      },
-      {
-        "type": "text",
-        "text": "ONE"
-      }
-    ]
-  }
-}
-{
-  "type": "usage",
-  "seq": 28,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "usage": {
-      "inputTokens": 113,
-      "outputTokens": 19,
-      "cacheReadTokens": 768,
-      "reasoningTokens": 17
-    }
-  }
-}
-{
-  "type": "step/end",
-  "seq": 29,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1
-  }
-}
-{
-  "type": "turn/end",
-  "seq": 30,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "reason": {
-      "kind": "completed"
-    }
-  }
-}
-{
-  "type": "turn/start",
-  "seq": 31,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "trigger": {
-      "kind": "message",
-      "source": {
-        "kind": "user"
-      }
-    }
-  }
-}
-{
-  "type": "user/message",
-  "seq": 32,
-  "time": 0,
-  "data": {
-    "content": [
-      {
-        "type": "text",
-        "text": "Reply with exactly the word: TWO. No tools."
-      }
-    ],
-    "source": {
-      "kind": "user"
-    }
-  }
-}
-{
-  "type": "step/start",
-  "seq": 33,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 34,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "block-start",
-      "index": 0,
-      "blockType": "reasoning"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 35,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "The"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 36,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " user"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 37,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " wants"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 38,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " me"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 39,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " to"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 40,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " reply"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 41,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " with"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 42,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " exactly"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 43,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " the"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 44,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " word"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 45,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " \""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 46,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "T"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 47,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "WO"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 48,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "\""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 49,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " and"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 50,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " use"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 51,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " no"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 52,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " tools"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 53,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "."
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 54,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "block-start",
-      "index": 1,
-      "blockType": "text"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 55,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "text-delta",
-      "index": 1,
-      "text": "T"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 56,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "text-delta",
-      "index": 1,
-      "text": "WO"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 57,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "block-end",
-      "index": 0,
-      "block": {
-        "type": "reasoning",
-        "text": "The user wants me to reply with exactly the word \"TWO\" and use no tools."
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 58,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "block-end",
-      "index": 1,
-      "block": {
-        "type": "text",
-        "text": "TWO"
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 59,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "usage",
-      "usage": {
-        "inputTokens": 129,
-        "outputTokens": 22,
-        "cacheReadTokens": 768,
-        "reasoningTokens": 19
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 60,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "chunk": {
-      "type": "finish",
-      "reason": {
-        "kind": "stop"
-      }
-    }
-  }
-}
-{
-  "type": "assistant/message",
-  "seq": 61,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "content": [
-      {
-        "type": "reasoning",
-        "text": "The user wants me to reply with exactly the word \"TWO\" and use no tools."
-      },
-      {
-        "type": "text",
-        "text": "TWO"
-      }
-    ]
-  }
-}
-{
-  "type": "usage",
-  "seq": 62,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1,
-    "usage": {
-      "inputTokens": 129,
-      "outputTokens": 22,
-      "cacheReadTokens": 768,
-      "reasoningTokens": 19
-    }
-  }
-}
-{
-  "type": "step/end",
-  "seq": 63,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "step": 1
-  }
-}
-{
-  "type": "turn/end",
-  "seq": 64,
-  "time": 0,
-  "data": {
-    "turn": 2,
-    "reason": {
-      "kind": "completed"
-    }
-  }
-}

+ 45 - 0
examples/acp-agent/tests/snapshots/multi-turn/stdout.golden.jsonl

@@ -0,0 +1,45 @@
+{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":1,"agentInfo":{"name":"deepseek-harness-acp","version":"0.0.1"},"agentCapabilities":{"loadSession":true,"promptCapabilities":{"image":false,"audio":false,"embeddedContext":false}},"authMethods":[]}}
+{"jsonrpc":"2.0","id":2,"result":{"sessionId":"{{sessionId}}"}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"user_message_chunk","content":{"type":"text","text":"Reply with exactly the word: ONE. No tools."}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"The"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" user"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" wants"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" me"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" to"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" reply"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" with"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" exactly"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" the"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" word"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" \""}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"ONE"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"\""}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" and"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" no"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" tools"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"."}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_message_chunk","content":{"type":"text","text":"ONE"}}}}
+{"jsonrpc":"2.0","id":3,"result":{"stopReason":"end_turn"}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"user_message_chunk","content":{"type":"text","text":"Reply with exactly the word: TWO. No tools."}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"The"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" user"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" wants"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" me"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" to"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" reply"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" with"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" exactly"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" the"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" word"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" \""}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"T"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"WO"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"\""}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" and"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" use"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" no"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" tools"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"."}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_message_chunk","content":{"type":"text","text":"T"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_message_chunk","content":{"type":"text","text":"WO"}}}}
+{"jsonrpc":"2.0","id":4,"result":{"stopReason":"end_turn"}}

+ 0 - 615
examples/acp-agent/tests/snapshots/multi-turn/stdout.golden.txt

@@ -1,615 +0,0 @@
-{
-  "jsonrpc": "2.0",
-  "id": 1,
-  "result": {
-    "protocolVersion": 1,
-    "agentInfo": {
-      "name": "deepseek-harness-acp",
-      "version": "0.0.1"
-    },
-    "agentCapabilities": {
-      "loadSession": true,
-      "promptCapabilities": {
-        "image": false,
-        "audio": false,
-        "embeddedContext": false
-      }
-    },
-    "authMethods": []
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 2,
-  "result": {
-    "sessionId": "{{sessionId}}"
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "user_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "Reply with exactly the word: ONE. No tools."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "The"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " user"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " wants"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " me"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " to"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " reply"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " with"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " exactly"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " the"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " word"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " \""
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "ONE"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "\""
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " and"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " no"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " tools"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "ONE"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 3,
-  "result": {
-    "stopReason": "end_turn"
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "user_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "Reply with exactly the word: TWO. No tools."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "The"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " user"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " wants"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " me"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " to"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " reply"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " with"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " exactly"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " the"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " word"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " \""
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "T"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "WO"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "\""
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " and"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " use"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " no"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " tools"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "T"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "WO"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 4,
-  "result": {
-    "stopReason": "end_turn"
-  }
-}

+ 35 - 0
examples/acp-agent/tests/snapshots/text-turn/session.golden.jsonl

@@ -0,0 +1,35 @@
+{"type":"session","version":1,"id":"{{sessionId}}","createdAt":0,"cwd":"{{cwd}}"}
+{"type":"turn/start","seq":0,"time":0,"data":{"turn":1,"trigger":{"kind":"message","source":{"kind":"user"}}}}
+{"type":"user/message","seq":1,"time":0,"data":{"content":[{"type":"text","text":"Reply with exactly the word: PONG. Do not use any tools."}],"source":{"kind":"user"}}}
+{"type":"step/start","seq":2,"time":0,"data":{"turn":1,"step":1}}
+{"type":"assistant/chunk","seq":3,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"reasoning"}}}
+{"type":"assistant/chunk","seq":4,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"The"}}}
+{"type":"assistant/chunk","seq":5,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" user"}}}
+{"type":"assistant/chunk","seq":6,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" wants"}}}
+{"type":"assistant/chunk","seq":7,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" me"}}}
+{"type":"assistant/chunk","seq":8,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" to"}}}
+{"type":"assistant/chunk","seq":9,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" reply"}}}
+{"type":"assistant/chunk","seq":10,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" with"}}}
+{"type":"assistant/chunk","seq":11,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" exactly"}}}
+{"type":"assistant/chunk","seq":12,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" the"}}}
+{"type":"assistant/chunk","seq":13,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" word"}}}
+{"type":"assistant/chunk","seq":14,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" \""}}}
+{"type":"assistant/chunk","seq":15,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"P"}}}
+{"type":"assistant/chunk","seq":16,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"ONG"}}}
+{"type":"assistant/chunk","seq":17,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"\""}}}
+{"type":"assistant/chunk","seq":18,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" without"}}}
+{"type":"assistant/chunk","seq":19,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" using"}}}
+{"type":"assistant/chunk","seq":20,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" any"}}}
+{"type":"assistant/chunk","seq":21,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" tools"}}}
+{"type":"assistant/chunk","seq":22,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"."}}}
+{"type":"assistant/chunk","seq":23,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":1,"blockType":"text"}}}
+{"type":"assistant/chunk","seq":24,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"text-delta","index":1,"text":"P"}}}
+{"type":"assistant/chunk","seq":25,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"text-delta","index":1,"text":"ONG"}}}
+{"type":"assistant/chunk","seq":26,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"reasoning","text":"The user wants me to reply with exactly the word \"PONG\" without using any tools."}}}}
+{"type":"assistant/chunk","seq":27,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":1,"block":{"type":"text","text":"PONG"}}}}
+{"type":"assistant/chunk","seq":28,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":117,"outputTokens":22,"cacheReadTokens":768,"reasoningTokens":19}}}}
+{"type":"assistant/chunk","seq":29,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"finish","reason":{"kind":"stop"}}}}
+{"type":"assistant/message","seq":30,"time":0,"data":{"turn":1,"step":1,"content":[{"type":"reasoning","text":"The user wants me to reply with exactly the word \"PONG\" without using any tools."},{"type":"text","text":"PONG"}]}}
+{"type":"usage","seq":31,"time":0,"data":{"turn":1,"step":1,"usage":{"inputTokens":117,"outputTokens":22,"cacheReadTokens":768,"reasoningTokens":19}}}
+{"type":"step/end","seq":32,"time":0,"data":{"turn":1,"step":1}}
+{"type":"turn/end","seq":33,"time":0,"data":{"turn":1,"reason":{"kind":"completed"}}}

+ 0 - 489
examples/acp-agent/tests/snapshots/text-turn/session.golden.txt

@@ -1,489 +0,0 @@
-{
-  "type": "session",
-  "version": 1,
-  "id": "{{sessionId}}",
-  "createdAt": 0,
-  "cwd": "{{cwd}}"
-}
-{
-  "type": "turn/start",
-  "seq": 0,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "trigger": {
-      "kind": "message",
-      "source": {
-        "kind": "user"
-      }
-    }
-  }
-}
-{
-  "type": "user/message",
-  "seq": 1,
-  "time": 0,
-  "data": {
-    "content": [
-      {
-        "type": "text",
-        "text": "Reply with exactly the word: PONG. Do not use any tools."
-      }
-    ],
-    "source": {
-      "kind": "user"
-    }
-  }
-}
-{
-  "type": "step/start",
-  "seq": 2,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 3,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-start",
-      "index": 0,
-      "blockType": "reasoning"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 4,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "The"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 5,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " user"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 6,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " wants"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 7,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " me"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 8,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " to"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 9,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " reply"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 10,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " with"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 11,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " exactly"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 12,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " the"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 13,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " word"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 14,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " \""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 15,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "P"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 16,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "ONG"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 17,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "\""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 18,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " without"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 19,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " using"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 20,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " any"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 21,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " tools"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 22,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "."
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 23,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-start",
-      "index": 1,
-      "blockType": "text"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 24,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "text-delta",
-      "index": 1,
-      "text": "P"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 25,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "text-delta",
-      "index": 1,
-      "text": "ONG"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 26,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-end",
-      "index": 0,
-      "block": {
-        "type": "reasoning",
-        "text": "The user wants me to reply with exactly the word \"PONG\" without using any tools."
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 27,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-end",
-      "index": 1,
-      "block": {
-        "type": "text",
-        "text": "PONG"
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 28,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "usage",
-      "usage": {
-        "inputTokens": 117,
-        "outputTokens": 22,
-        "cacheReadTokens": 768,
-        "reasoningTokens": 19
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 29,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "finish",
-      "reason": {
-        "kind": "stop"
-      }
-    }
-  }
-}
-{
-  "type": "assistant/message",
-  "seq": 30,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "content": [
-      {
-        "type": "reasoning",
-        "text": "The user wants me to reply with exactly the word \"PONG\" without using any tools."
-      },
-      {
-        "type": "text",
-        "text": "PONG"
-      }
-    ]
-  }
-}
-{
-  "type": "usage",
-  "seq": 31,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "usage": {
-      "inputTokens": 117,
-      "outputTokens": 22,
-      "cacheReadTokens": 768,
-      "reasoningTokens": 19
-    }
-  }
-}
-{
-  "type": "step/end",
-  "seq": 32,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1
-  }
-}
-{
-  "type": "turn/end",
-  "seq": 33,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "reason": {
-      "kind": "completed"
-    }
-  }
-}

+ 25 - 0
examples/acp-agent/tests/snapshots/text-turn/stdout.golden.jsonl

@@ -0,0 +1,25 @@
+{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":1,"agentInfo":{"name":"deepseek-harness-acp","version":"0.0.1"},"agentCapabilities":{"loadSession":true,"promptCapabilities":{"image":false,"audio":false,"embeddedContext":false}},"authMethods":[]}}
+{"jsonrpc":"2.0","id":2,"result":{"sessionId":"{{sessionId}}"}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"user_message_chunk","content":{"type":"text","text":"Reply with exactly the word: PONG. Do not use any tools."}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"The"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" user"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" wants"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" me"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" to"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" reply"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" with"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" exactly"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" the"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" word"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" \""}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"P"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"ONG"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"\""}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" without"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" using"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" any"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" tools"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"."}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_message_chunk","content":{"type":"text","text":"P"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_message_chunk","content":{"type":"text","text":"ONG"}}}}
+{"jsonrpc":"2.0","id":3,"result":{"stopReason":"end_turn"}}

+ 0 - 342
examples/acp-agent/tests/snapshots/text-turn/stdout.golden.txt

@@ -1,342 +0,0 @@
-{
-  "jsonrpc": "2.0",
-  "id": 1,
-  "result": {
-    "protocolVersion": 1,
-    "agentInfo": {
-      "name": "deepseek-harness-acp",
-      "version": "0.0.1"
-    },
-    "agentCapabilities": {
-      "loadSession": true,
-      "promptCapabilities": {
-        "image": false,
-        "audio": false,
-        "embeddedContext": false
-      }
-    },
-    "authMethods": []
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 2,
-  "result": {
-    "sessionId": "{{sessionId}}"
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "user_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "Reply with exactly the word: PONG. Do not use any tools."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "The"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " user"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " wants"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " me"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " to"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " reply"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " with"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " exactly"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " the"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " word"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " \""
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "P"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "ONG"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "\""
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " without"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " using"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " any"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " tools"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "P"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "ONG"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 3,
-  "result": {
-    "stopReason": "end_turn"
-  }
-}

+ 100 - 0
examples/acp-agent/tests/snapshots/tool-call-turn/session.golden.jsonl

@@ -0,0 +1,100 @@
+{"type":"session","version":1,"id":"{{sessionId}}","createdAt":0,"cwd":"{{cwd}}"}
+{"type":"turn/start","seq":0,"time":0,"data":{"turn":1,"trigger":{"kind":"message","source":{"kind":"user"}}}}
+{"type":"user/message","seq":1,"time":0,"data":{"content":[{"type":"text","text":"Use the bash tool to run exactly: echo SNAPSHOT_OK. Then reply with the single word DONE and stop."}],"source":{"kind":"user"}}}
+{"type":"step/start","seq":2,"time":0,"data":{"turn":1,"step":1}}
+{"type":"assistant/chunk","seq":3,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"reasoning"}}}
+{"type":"assistant/chunk","seq":4,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"The"}}}
+{"type":"assistant/chunk","seq":5,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" user"}}}
+{"type":"assistant/chunk","seq":6,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" wants"}}}
+{"type":"assistant/chunk","seq":7,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" me"}}}
+{"type":"assistant/chunk","seq":8,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" to"}}}
+{"type":"assistant/chunk","seq":9,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" run"}}}
+{"type":"assistant/chunk","seq":10,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" a"}}}
+{"type":"assistant/chunk","seq":11,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" specific"}}}
+{"type":"assistant/chunk","seq":12,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" command"}}}
+{"type":"assistant/chunk","seq":13,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" and"}}}
+{"type":"assistant/chunk","seq":14,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" then"}}}
+{"type":"assistant/chunk","seq":15,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" reply"}}}
+{"type":"assistant/chunk","seq":16,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" with"}}}
+{"type":"assistant/chunk","seq":17,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":" D"}}}
+{"type":"assistant/chunk","seq":18,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"ONE"}}}
+{"type":"assistant/chunk","seq":19,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"reasoning-delta","index":0,"text":"."}}}
+{"type":"assistant/chunk","seq":20,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":1,"blockType":"tool-call"}}}
+{"type":"assistant/chunk","seq":21,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":""}}}
+{"type":"assistant/chunk","seq":22,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"{"}}}
+{"type":"assistant/chunk","seq":23,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"\""}}}
+{"type":"assistant/chunk","seq":24,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"command"}}}
+{"type":"assistant/chunk","seq":25,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"\""}}}
+{"type":"assistant/chunk","seq":26,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":": "}}}
+{"type":"assistant/chunk","seq":27,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"\""}}}
+{"type":"assistant/chunk","seq":28,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"echo"}}}
+{"type":"assistant/chunk","seq":29,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":" S"}}}
+{"type":"assistant/chunk","seq":30,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"NA"}}}
+{"type":"assistant/chunk","seq":31,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"PS"}}}
+{"type":"assistant/chunk","seq":32,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"H"}}}
+{"type":"assistant/chunk","seq":33,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"OT"}}}
+{"type":"assistant/chunk","seq":34,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"_OK"}}}
+{"type":"assistant/chunk","seq":35,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"\""}}}
+{"type":"assistant/chunk","seq":36,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":", "}}}
+{"type":"assistant/chunk","seq":37,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"\""}}}
+{"type":"assistant/chunk","seq":38,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"description"}}}
+{"type":"assistant/chunk","seq":39,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"\""}}}
+{"type":"assistant/chunk","seq":40,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":": "}}}
+{"type":"assistant/chunk","seq":41,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"\""}}}
+{"type":"assistant/chunk","seq":42,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"Run"}}}
+{"type":"assistant/chunk","seq":43,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":" the"}}}
+{"type":"assistant/chunk","seq":44,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":" exact"}}}
+{"type":"assistant/chunk","seq":45,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":" echo"}}}
+{"type":"assistant/chunk","seq":46,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":" command"}}}
+{"type":"assistant/chunk","seq":47,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":" requested"}}}
+{"type":"assistant/chunk","seq":48,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"\""}}}
+{"type":"assistant/chunk","seq":49,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","argumentsDelta":"}"}}}
+{"type":"assistant/chunk","seq":50,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"reasoning","text":"The user wants me to run a specific command and then reply with DONE."}}}}
+{"type":"assistant/chunk","seq":51,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":1,"block":{"type":"tool-call","id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","arguments":"{\"command\": \"echo SNAPSHOT_OK\", \"description\": \"Run the exact echo command requested\"}"}}}}
+{"type":"assistant/chunk","seq":52,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":129,"outputTokens":86,"cacheReadTokens":768,"reasoningTokens":16}}}}
+{"type":"assistant/chunk","seq":53,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}
+{"type":"assistant/message","seq":54,"time":0,"data":{"turn":1,"step":1,"content":[{"type":"reasoning","text":"The user wants me to run a specific command and then reply with DONE."},{"type":"tool-call","id":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","arguments":"{\"command\": \"echo SNAPSHOT_OK\", \"description\": \"Run the exact echo command requested\"}"}]}}
+{"type":"usage","seq":55,"time":0,"data":{"turn":1,"step":1,"usage":{"inputTokens":129,"outputTokens":86,"cacheReadTokens":768,"reasoningTokens":16}}}
+{"type":"tool/call","seq":56,"time":0,"data":{"turn":1,"step":1,"callId":"call_00_waDnb5eZcD1dBV49O7F39256","name":"bash","arguments":"{\"command\": \"echo SNAPSHOT_OK\", \"description\": \"Run the exact echo command requested\"}"}}
+{"type":"tool/result","seq":57,"time":0,"data":{"turn":1,"step":1,"callId":"call_00_waDnb5eZcD1dBV49O7F39256","content":[{"type":"text","text":"SNAPSHOT_OK\n"}],"isError":false}}
+{"type":"step/end","seq":58,"time":0,"data":{"turn":1,"step":1}}
+{"type":"step/start","seq":59,"time":0,"data":{"turn":1,"step":2}}
+{"type":"assistant/chunk","seq":60,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"block-start","index":0,"blockType":"reasoning"}}}
+{"type":"assistant/chunk","seq":61,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":"The"}}}
+{"type":"assistant/chunk","seq":62,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" command"}}}
+{"type":"assistant/chunk","seq":63,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" ran"}}}
+{"type":"assistant/chunk","seq":64,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" successfully"}}}
+{"type":"assistant/chunk","seq":65,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" and"}}}
+{"type":"assistant/chunk","seq":66,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" output"}}}
+{"type":"assistant/chunk","seq":67,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" \""}}}
+{"type":"assistant/chunk","seq":68,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":"S"}}}
+{"type":"assistant/chunk","seq":69,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":"NA"}}}
+{"type":"assistant/chunk","seq":70,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":"PS"}}}
+{"type":"assistant/chunk","seq":71,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":"H"}}}
+{"type":"assistant/chunk","seq":72,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":"OT"}}}
+{"type":"assistant/chunk","seq":73,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":"_OK"}}}
+{"type":"assistant/chunk","seq":74,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":"\"."}}}
+{"type":"assistant/chunk","seq":75,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" Now"}}}
+{"type":"assistant/chunk","seq":76,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" I"}}}
+{"type":"assistant/chunk","seq":77,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" need"}}}
+{"type":"assistant/chunk","seq":78,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" to"}}}
+{"type":"assistant/chunk","seq":79,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" reply"}}}
+{"type":"assistant/chunk","seq":80,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" with"}}}
+{"type":"assistant/chunk","seq":81,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" the"}}}
+{"type":"assistant/chunk","seq":82,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" single"}}}
+{"type":"assistant/chunk","seq":83,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" word"}}}
+{"type":"assistant/chunk","seq":84,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":" \""}}}
+{"type":"assistant/chunk","seq":85,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":"D"}}}
+{"type":"assistant/chunk","seq":86,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":"ONE"}}}
+{"type":"assistant/chunk","seq":87,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"reasoning-delta","index":0,"text":"\"."}}}
+{"type":"assistant/chunk","seq":88,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"block-start","index":1,"blockType":"text"}}}
+{"type":"assistant/chunk","seq":89,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"text-delta","index":1,"text":"D"}}}
+{"type":"assistant/chunk","seq":90,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"text-delta","index":1,"text":"ONE"}}}
+{"type":"assistant/chunk","seq":91,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"block-end","index":0,"block":{"type":"reasoning","text":"The command ran successfully and output \"SNAPSHOT_OK\". Now I need to reply with the single word \"DONE\"."}}}}
+{"type":"assistant/chunk","seq":92,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"block-end","index":1,"block":{"type":"text","text":"DONE"}}}}
+{"type":"assistant/chunk","seq":93,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"usage","usage":{"inputTokens":105,"outputTokens":30,"cacheReadTokens":896,"reasoningTokens":27}}}}
+{"type":"assistant/chunk","seq":94,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"finish","reason":{"kind":"stop"}}}}
+{"type":"assistant/message","seq":95,"time":0,"data":{"turn":1,"step":2,"content":[{"type":"reasoning","text":"The command ran successfully and output \"SNAPSHOT_OK\". Now I need to reply with the single word \"DONE\"."},{"type":"text","text":"DONE"}]}}
+{"type":"usage","seq":96,"time":0,"data":{"turn":1,"step":2,"usage":{"inputTokens":105,"outputTokens":30,"cacheReadTokens":896,"reasoningTokens":27}}}
+{"type":"step/end","seq":97,"time":0,"data":{"turn":1,"step":2}}
+{"type":"turn/end","seq":98,"time":0,"data":{"turn":1,"reason":{"kind":"completed"}}}

+ 0 - 1469
examples/acp-agent/tests/snapshots/tool-call-turn/session.golden.txt

@@ -1,1469 +0,0 @@
-{
-  "type": "session",
-  "version": 1,
-  "id": "{{sessionId}}",
-  "createdAt": 0,
-  "cwd": "{{cwd}}"
-}
-{
-  "type": "turn/start",
-  "seq": 0,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "trigger": {
-      "kind": "message",
-      "source": {
-        "kind": "user"
-      }
-    }
-  }
-}
-{
-  "type": "user/message",
-  "seq": 1,
-  "time": 0,
-  "data": {
-    "content": [
-      {
-        "type": "text",
-        "text": "Use the bash tool to run exactly: echo SNAPSHOT_OK. Then reply with the single word DONE and stop."
-      }
-    ],
-    "source": {
-      "kind": "user"
-    }
-  }
-}
-{
-  "type": "step/start",
-  "seq": 2,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 3,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-start",
-      "index": 0,
-      "blockType": "reasoning"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 4,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "The"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 5,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " user"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 6,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " wants"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 7,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " me"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 8,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " to"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 9,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " run"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 10,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " a"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 11,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " specific"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 12,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " command"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 13,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " and"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 14,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " then"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 15,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " reply"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 16,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " with"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 17,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " D"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 18,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "ONE"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 19,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "."
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 20,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-start",
-      "index": 1,
-      "blockType": "tool-call"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 21,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": ""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 22,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "{"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 23,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "\""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 24,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "command"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 25,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "\""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 26,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": ": "
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 27,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "\""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 28,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "echo"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 29,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": " S"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 30,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "NA"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 31,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "PS"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 32,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "H"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 33,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "OT"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 34,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "_OK"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 35,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "\""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 36,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": ", "
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 37,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "\""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 38,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "description"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 39,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "\""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 40,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": ": "
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 41,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "\""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 42,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "Run"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 43,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": " the"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 44,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": " exact"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 45,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": " echo"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 46,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": " command"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 47,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": " requested"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 48,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "\""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 49,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "tool-call-delta",
-      "index": 1,
-      "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "name": "bash",
-      "argumentsDelta": "}"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 50,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-end",
-      "index": 0,
-      "block": {
-        "type": "reasoning",
-        "text": "The user wants me to run a specific command and then reply with DONE."
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 51,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "block-end",
-      "index": 1,
-      "block": {
-        "type": "tool-call",
-        "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-        "name": "bash",
-        "arguments": "{\"command\": \"echo SNAPSHOT_OK\", \"description\": \"Run the exact echo command requested\"}"
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 52,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "usage",
-      "usage": {
-        "inputTokens": 129,
-        "outputTokens": 86,
-        "cacheReadTokens": 768,
-        "reasoningTokens": 16
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 53,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "chunk": {
-      "type": "finish",
-      "reason": {
-        "kind": "tool-calls"
-      }
-    }
-  }
-}
-{
-  "type": "assistant/message",
-  "seq": 54,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "content": [
-      {
-        "type": "reasoning",
-        "text": "The user wants me to run a specific command and then reply with DONE."
-      },
-      {
-        "type": "tool-call",
-        "id": "call_00_waDnb5eZcD1dBV49O7F39256",
-        "name": "bash",
-        "arguments": "{\"command\": \"echo SNAPSHOT_OK\", \"description\": \"Run the exact echo command requested\"}"
-      }
-    ]
-  }
-}
-{
-  "type": "usage",
-  "seq": 55,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "usage": {
-      "inputTokens": 129,
-      "outputTokens": 86,
-      "cacheReadTokens": 768,
-      "reasoningTokens": 16
-    }
-  }
-}
-{
-  "type": "tool/call",
-  "seq": 56,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "callId": "call_00_waDnb5eZcD1dBV49O7F39256",
-    "name": "bash",
-    "arguments": "{\"command\": \"echo SNAPSHOT_OK\", \"description\": \"Run the exact echo command requested\"}"
-  }
-}
-{
-  "type": "tool/result",
-  "seq": 57,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1,
-    "callId": "call_00_waDnb5eZcD1dBV49O7F39256",
-    "content": [
-      {
-        "type": "text",
-        "text": "SNAPSHOT_OK\n"
-      }
-    ],
-    "isError": false
-  }
-}
-{
-  "type": "step/end",
-  "seq": 58,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 1
-  }
-}
-{
-  "type": "step/start",
-  "seq": 59,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 60,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "block-start",
-      "index": 0,
-      "blockType": "reasoning"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 61,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "The"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 62,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " command"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 63,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " ran"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 64,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " successfully"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 65,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " and"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 66,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " output"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 67,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " \""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 68,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "S"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 69,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "NA"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 70,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "PS"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 71,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "H"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 72,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "OT"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 73,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "_OK"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 74,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "\"."
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 75,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " Now"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 76,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " I"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 77,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " need"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 78,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " to"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 79,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " reply"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 80,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " with"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 81,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " the"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 82,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " single"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 83,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " word"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 84,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": " \""
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 85,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "D"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 86,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "ONE"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 87,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "reasoning-delta",
-      "index": 0,
-      "text": "\"."
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 88,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "block-start",
-      "index": 1,
-      "blockType": "text"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 89,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "text-delta",
-      "index": 1,
-      "text": "D"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 90,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "text-delta",
-      "index": 1,
-      "text": "ONE"
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 91,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "block-end",
-      "index": 0,
-      "block": {
-        "type": "reasoning",
-        "text": "The command ran successfully and output \"SNAPSHOT_OK\". Now I need to reply with the single word \"DONE\"."
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 92,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "block-end",
-      "index": 1,
-      "block": {
-        "type": "text",
-        "text": "DONE"
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 93,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "usage",
-      "usage": {
-        "inputTokens": 105,
-        "outputTokens": 30,
-        "cacheReadTokens": 896,
-        "reasoningTokens": 27
-      }
-    }
-  }
-}
-{
-  "type": "assistant/chunk",
-  "seq": 94,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "chunk": {
-      "type": "finish",
-      "reason": {
-        "kind": "stop"
-      }
-    }
-  }
-}
-{
-  "type": "assistant/message",
-  "seq": 95,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "content": [
-      {
-        "type": "reasoning",
-        "text": "The command ran successfully and output \"SNAPSHOT_OK\". Now I need to reply with the single word \"DONE\"."
-      },
-      {
-        "type": "text",
-        "text": "DONE"
-      }
-    ]
-  }
-}
-{
-  "type": "usage",
-  "seq": 96,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2,
-    "usage": {
-      "inputTokens": 105,
-      "outputTokens": 30,
-      "cacheReadTokens": 896,
-      "reasoningTokens": 27
-    }
-  }
-}
-{
-  "type": "step/end",
-  "seq": 97,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "step": 2
-  }
-}
-{
-  "type": "turn/end",
-  "seq": 98,
-  "time": 0,
-  "data": {
-    "turn": 1,
-    "reason": {
-      "kind": "completed"
-    }
-  }
-}

+ 51 - 0
examples/acp-agent/tests/snapshots/tool-call-turn/stdout.golden.jsonl

@@ -0,0 +1,51 @@
+{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":1,"agentInfo":{"name":"deepseek-harness-acp","version":"0.0.1"},"agentCapabilities":{"loadSession":true,"promptCapabilities":{"image":false,"audio":false,"embeddedContext":false}},"authMethods":[]}}
+{"jsonrpc":"2.0","id":2,"result":{"sessionId":"{{sessionId}}"}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"user_message_chunk","content":{"type":"text","text":"Use the bash tool to run exactly: echo SNAPSHOT_OK. Then reply with the single word DONE and stop."}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"The"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" user"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" wants"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" me"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" to"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" run"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" a"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" specific"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" command"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" and"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" then"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" reply"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" with"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" D"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"ONE"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"."}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"tool_call","toolCallId":"call_00_waDnb5eZcD1dBV49O7F39256","title":"echo SNAPSHOT_OK","kind":"execute","status":"in_progress","rawInput":"echo SNAPSHOT_OK","content":[{"type":"content","content":{"type":"text","text":"Run the exact echo command requested"}}]}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"tool_call_update","toolCallId":"call_00_waDnb5eZcD1dBV49O7F39256","status":"completed","content":[{"type":"content","content":{"type":"text","text":"```console\nSNAPSHOT_OK\n```"}}]}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"The"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" command"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" ran"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" successfully"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" and"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" output"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" \""}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"S"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"NA"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"PS"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"H"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"OT"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"_OK"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"\"."}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" Now"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" I"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" need"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" to"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" reply"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" with"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" the"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" single"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" word"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":" \""}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"D"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"ONE"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_thought_chunk","content":{"type":"text","text":"\"."}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_message_chunk","content":{"type":"text","text":"D"}}}}
+{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_message_chunk","content":{"type":"text","text":"ONE"}}}}
+{"jsonrpc":"2.0","id":3,"result":{"stopReason":"end_turn"}}

+ 0 - 723
examples/acp-agent/tests/snapshots/tool-call-turn/stdout.golden.txt

@@ -1,723 +0,0 @@
-{
-  "jsonrpc": "2.0",
-  "id": 1,
-  "result": {
-    "protocolVersion": 1,
-    "agentInfo": {
-      "name": "deepseek-harness-acp",
-      "version": "0.0.1"
-    },
-    "agentCapabilities": {
-      "loadSession": true,
-      "promptCapabilities": {
-        "image": false,
-        "audio": false,
-        "embeddedContext": false
-      }
-    },
-    "authMethods": []
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 2,
-  "result": {
-    "sessionId": "{{sessionId}}"
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "user_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "Use the bash tool to run exactly: echo SNAPSHOT_OK. Then reply with the single word DONE and stop."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "The"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " user"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " wants"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " me"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " to"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " run"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " a"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " specific"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " command"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " and"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " then"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " reply"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " with"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " D"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "ONE"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "tool_call",
-      "toolCallId": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "title": "echo SNAPSHOT_OK",
-      "kind": "execute",
-      "status": "in_progress",
-      "rawInput": "echo SNAPSHOT_OK",
-      "content": [
-        {
-          "type": "content",
-          "content": {
-            "type": "text",
-            "text": "Run the exact echo command requested"
-          }
-        }
-      ]
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "tool_call_update",
-      "toolCallId": "call_00_waDnb5eZcD1dBV49O7F39256",
-      "status": "completed",
-      "content": [
-        {
-          "type": "content",
-          "content": {
-            "type": "text",
-            "text": "```console\nSNAPSHOT_OK\n```"
-          }
-        }
-      ]
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "The"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " command"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " ran"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " successfully"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " and"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " output"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " \""
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "S"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "NA"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "PS"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "H"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "OT"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "_OK"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "\"."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " Now"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " I"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " need"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " to"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " reply"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " with"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " the"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " single"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " word"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": " \""
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "D"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "ONE"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_thought_chunk",
-      "content": {
-        "type": "text",
-        "text": "\"."
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "D"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "method": "session/update",
-  "params": {
-    "sessionId": "{{sessionId}}",
-    "update": {
-      "sessionUpdate": "agent_message_chunk",
-      "content": {
-        "type": "text",
-        "text": "ONE"
-      }
-    }
-  }
-}
-{
-  "jsonrpc": "2.0",
-  "id": 3,
-  "result": {
-    "stopReason": "end_turn"
-  }
-}