From 47af1fad0fecebd45588849e340df1076a0da2f5 Mon Sep 17 00:00:00 2001 From: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> Date: Sat, 26 Sep 2026 00:36:14 -0700 Subject: [PATCH] fix(server): Pi rollback works past a turn you stopped Stop always restarts the Pi runtime, so the adapter killed Pi before finalizeTurn could read the session tree. The stopped turn kept its weak synthetic ref, and any later rollback past it failed with "Pi rollback target has no captured session-tree entry" while the effect retried. Read the turn's session-tree refs after the abort and before terminating, and let finalizeTurn reuse them. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../orchestration-v2/Adapters/PiAdapterV2.ts | 38 ++- .../testkit/fixtures/index.ts | 17 + .../thread_rollback_after_stop/input.ts | 29 ++ .../thread_rollback_after_stop/pi_output.ts | 77 +++++ .../pi_transcript.ndjson | 306 ++++++++++++++++++ .../turn_interrupt_mid_tool/pi_output.ts | 2 + .../pi_transcript.ndjson | 124 ++++--- 7 files changed, 516 insertions(+), 77 deletions(-) create mode 100644 apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback_after_stop/input.ts create mode 100644 apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback_after_stop/pi_output.ts create mode 100644 apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback_after_stop/pi_transcript.ndjson diff --git a/apps/server/src/orchestration-v2/Adapters/PiAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/PiAdapterV2.ts index b31f1d3117f5..dc19647fa583 100644 --- a/apps/server/src/orchestration-v2/Adapters/PiAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/PiAdapterV2.ts @@ -351,6 +351,13 @@ interface ActivePiTurn { activeCompaction: PiCompactionState | null; activeProviderRetry: PiProviderRetryState | null; failure: ReturnType | null; + /** Session-tree refs read just before Stop terminates Pi, when no read is possible later. */ + stopTreeRefs?: PiTurnTreeRefs | null; +} + +interface PiTurnTreeRefs { + readonly turnStartEntryId: string | null; + readonly leafId: string | null; } interface PendingPiPrompt { @@ -1367,13 +1374,18 @@ export function makePiAdapterV2(options: PiAdapterV2Options): ProviderAdapterV2S * point `fork` rolls back to); the leaf becomes the conversation head. * Pure bookkeeping: failures degrade to the synthetic refs. */ - const captureTurnTreeRefs = Effect.fnUntraced(function* () { + const captureTurnTreeRefs = Effect.fnUntraced(function* ( + timeoutMs = PI_REQUEST_TIMEOUT_MS, + ): Effect.fn.Return { const cursorWasStale = leafCursorStale; const cursor = cursorWasStale ? null : lastKnownLeaf; - const data = yield* request({ - type: "get_entries", - ...(cursor === null ? {} : { since: cursor }), - }).pipe(Effect.orElseSucceed(() => undefined)); + const data = yield* request( + { + type: "get_entries", + ...(cursor === null ? {} : { since: cursor }), + }, + timeoutMs, + ).pipe(Effect.orElseSucceed(() => undefined)); if (data === undefined) { // Pi may have advanced past `lastKnownLeaf` while this failed, so the // cursor can no longer be trusted to bound a single turn. @@ -1431,7 +1443,8 @@ export function makePiAdapterV2(options: PiAdapterV2Options): ProviderAdapterV2S } } yield* cancelPendingPrompts(completedAt); - const treeRefs = yield* captureTurnTreeRefs(); + const treeRefs = + turn.stopTreeRefs !== undefined ? turn.stopTreeRefs : yield* captureTurnTreeRefs(); const tokenUsage = readUsage ? yield* readTokenUsage(turn.latestCompactionAfterTokens, completedAt) : undefined; @@ -2490,7 +2503,18 @@ export function makePiAdapterV2(options: PiAdapterV2Options): ProviderAdapterV2S if (interruptInput.requestRuntimeRestart === true && !turn.settleWhenIdle) { yield* request({ type: "abort" }, 2_000).pipe(Effect.ignore); } - yield* connection.terminate; + // Terminating fails every later request, so read the stopped + // turn's session-tree refs first: rolling back past this turn + // forks at its user entry. Holding the event permit also lets a + // finalize that is already reading them finish before the kill. + yield* sessionEventPermit.withPermits(1)( + Effect.gen(function* () { + if (threadState?.activeTurn === turn && turn.stopTreeRefs === undefined) { + turn.stopTreeRefs = yield* captureTurnTreeRefs(2_000); + } + yield* connection.terminate; + }), + ); return; } yield* request({ type: "abort" }).pipe( diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/index.ts b/apps/server/src/orchestration-v2/testkit/fixtures/index.ts index b15423ff3d24..cb344ed89a19 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/index.ts +++ b/apps/server/src/orchestration-v2/testkit/fixtures/index.ts @@ -87,6 +87,8 @@ import { assertClaudeThreadRollbackOutput } from "./thread_rollback/claude_outpu import { assertThreadRollbackOutput } from "./thread_rollback/codex_output.ts"; import { threadRollbackInput } from "./thread_rollback/input.ts"; import { assertPiThreadRollbackOutput } from "./thread_rollback/pi_output.ts"; +import { threadRollbackAfterStopInput } from "./thread_rollback_after_stop/input.ts"; +import { assertPiThreadRollbackAfterStopOutput } from "./thread_rollback_after_stop/pi_output.ts"; import { assertTodoListOutput } from "./todo_list/codex_output.ts"; import { assertTodoListCursorOutput } from "./todo_list/cursor_output.ts"; import { assertTodoListGrokOutput } from "./todo_list/grok_output.ts"; @@ -1109,6 +1111,21 @@ export const ORCHESTRATOR_REPLAY_FIXTURES: ReadonlyArray + entry.type === "expect_outbound" && field(entry.frame, "type") === type ? [entry.frame] : [], + ); +} + +/** + * Stop terminates Pi (Stop-with-restart), so the stopped turn's session-tree + * user entry has to be read before the kill. Rolling back to turn 1 then forks + * at that entry, which discards the stopped turn and everything after it. + */ +export function assertPiThreadRollbackAfterStopOutput( + result: OrchestratorV2ScenarioResult, + transcript: ProviderReplayTranscript, +) { + assertBaseProjection({ result, transcript, runCount: 4 }); + const projection = projectionFor(result, transcript.scenario); + assertSemanticProjectionIntegrity(projection); + assertRunOrdinals(projection, [1, 2, 3, 4]); + const runStatus = (ordinal: number) => + projection.runs.find((run) => run.ordinal === ordinal)?.status; + assert.equal(runStatus(1), "completed"); + assert.equal(runStatus(3), "rolled_back"); + assert.equal(runStatus(4), "completed"); + + // The stopped turn must carry the strong ref rollback forks at. + const stoppedTurn = projection.providerTurns.find((providerTurn) => providerTurn.ordinal === 2); + assert.equal(stoppedTurn?.status, "interrupted"); + assert.equal(stoppedTurn?.nativeTurnRef?.strength, "strong"); + + const stopIndex = transcript.entries.findIndex( + (entry) => entry.type === "expect_outbound" && field(entry.frame, "type") === "abort", + ); + const captureIndex = transcript.entries.findIndex( + (entry, index) => + index > stopIndex && + entry.type === "expect_outbound" && + field(entry.frame, "type") === "get_entries", + ); + assert.isAbove(captureIndex, stopIndex, "Stop must read the session tree before terminating Pi"); + + const forks = outboundOfType(transcript, "fork"); + assert.lengthOf(forks, 1, "rollback must fork the Pi session tree exactly once"); + assert.equal(field(forks[0], "entryId"), stoppedTurn?.nativeTurnRef?.nativeId); + + assertVisibleUserMessagesInclude(projection, [ + THREAD_ROLLBACK_FIRST_PROMPT, + THREAD_ROLLBACK_AFTER_PROMPT, + ]); + assertVisibleUserMessagesExclude(projection, [THREAD_ROLLBACK_SECOND_PROMPT]); + + // Pi's surviving branch holds only turn 1. + const finalAnswer = projection.turnItems.findLast((item) => item.type === "assistant_message"); + assert.include(finalAnswer?.text, "rollback fixture first turn complete"); + assert.notInclude(finalAnswer?.text, "second turn"); + assert.notInclude(finalAnswer?.text, "interrupt fixture"); +} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback_after_stop/pi_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback_after_stop/pi_transcript.ndjson new file mode 100644 index 000000000000..bad6306324a9 --- /dev/null +++ b/apps/server/src/orchestration-v2/testkit/fixtures/thread_rollback_after_stop/pi_transcript.ndjson @@ -0,0 +1,306 @@ +{"type":"transcript_start","provider":"pi","protocol":"pi.rpc-jsonl","version":"0.87.1","scenario":"thread_rollback_after_stop","metadata":{"generatedBy":"live-pi-recorder","piVersion":"0.87.1","model":"openrouter/deepseek/deepseek-v4-flash","launchArgs":"--provider openrouter --model deepseek/deepseek-v4-flash --no-extensions --no-skills --no-prompt-templates --no-context-files --approve"}} +{"type":"expect_outbound","label":"process_start","frame":{"type":"process_start","args":["--mode","rpc","--provider","openrouter","--model","deepseek/deepseek-v4-flash","--no-extensions","--no-skills","--no-prompt-templates","--no-context-files","--approve","--extension",""]}} +{"type":"expect_outbound","label":"get_state","frame":{"type":"get_state","id":"t3-0"}} +{"type":"expect_outbound","label":"get_commands","frame":{"type":"get_commands","id":"t3-1"}} +{"type":"emit_inbound","label":"extension_ui_request","frame":{"type":"extension_ui_request","id":"00000000-0000-4000-8000-000000000001","method":"notify","message":"t3-code MCP unavailable: T3_MCP_URL or T3_MCP_BEARER_TOKEN is missing.","notifyType":"warning"}} +{"type":"emit_inbound","label":"response:get_state","frame":{"id":"t3-0","type":"response","command":"get_state","success":true,"data":{"model":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}},"thinkingLevel":"high","isStreaming":false,"isCompacting":false,"steeringMode":"one-at-a-time","followUpMode":"one-at-a-time","sessionFile":"/pi-sessions/session-1.jsonl","sessionId":"00000000-0000-4000-8000-000000000002","autoCompactionEnabled":true,"messageCount":0,"pendingMessageCount":0}}} +{"type":"emit_inbound","label":"response:get_commands","frame":{"id":"t3-1","type":"response","command":"get_commands","success":true,"data":{"commands":[{"name":"llama","description":"Manage llama.cpp router models","source":"extension","sourceInfo":{"path":"","source":"inline","scope":"temporary","origin":"top-level"}}]}}} +{"type":"expect_outbound","label":"get_available_models","frame":{"type":"get_available_models","id":"t3-2"}} +{"type":"emit_inbound","label":"response:get_available_models","frame":{"id":"t3-2","type":"response","command":"get_available_models","success":true,"data":{"models":[{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}}]}}} +{"type":"expect_outbound","label":"get_entries","frame":{"type":"get_entries","id":"t3-3"}} +{"type":"emit_inbound","label":"response:get_entries","frame":{"id":"t3-3","type":"response","command":"get_entries","success":true,"data":{"entries":[{"type":"model_change","id":"cc722d40","parentId":null,"timestamp":"2026-01-01T00:00:00.000Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"thinking_level_change","id":"de9dbea7","parentId":"cc722d40","timestamp":"2026-01-01T00:00:00.000Z","thinkingLevel":"high"}],"leafId":"de9dbea7"}}} +{"type":"expect_outbound","label":"set_model","frame":{"type":"set_model","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash","id":"t3-4"}} +{"type":"emit_inbound","label":"response:set_model","frame":{"id":"t3-4","type":"response","command":"set_model","success":true,"data":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}}}} +{"type":"expect_outbound","label":"set_session_name","frame":{"type":"set_session_name","name":"Replay fixture: thread_rollback_after_stop","id":"t3-5"}} +{"type":"emit_inbound","label":"session_info_changed","frame":{"type":"session_info_changed","name":"Replay fixture: thread_rollback_after_stop"}} +{"type":"emit_inbound","label":"response:set_session_name","frame":{"id":"t3-5","type":"response","command":"set_session_name","success":true}} +{"type":"expect_outbound","label":"prompt","frame":{"type":"prompt","message":"Respond with exactly: rollback fixture first turn complete"}} +{"type":"emit_inbound","label":"response:prompt","frame":{"type":"response","command":"prompt","success":true}} +{"type":"emit_inbound","label":"agent_start","frame":{"type":"agent_start"}} +{"type":"emit_inbound","label":"turn_start","frame":{"type":"turn_start"}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790407554806,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790407554806,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]}}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"user","content":[{"type":"text","text":"Respond with exactly: rollback fixture first turn complete"}],"timestamp":1767225600312}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"user","content":[{"type":"text","text":"Respond with exactly: rollback fixture first turn complete"}],"timestamp":1767225600312}}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"pending","timestamp":1767225600334}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_start","contentIndex":0}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"The"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" user wants"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" me to"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" respond with"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" a specific"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" phrase."}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_start","contentIndex":1}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":"roll"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":"back fixture"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" first turn"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" complete"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":1681,"output":19,"cacheRead":0,"cacheWrite":0,"reasoning":11,"totalTokens":1700,"cost":{"input":0.000082369,"output":0.0000018620000000000001,"cacheRead":0,"cacheWrite":0,"total":0.000084231}},"assistantMessageEvent":{"type":"thinking_end","contentIndex":0,"content":"The user wants me to respond with a specific phrase."}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":1681,"output":19,"cacheRead":0,"cacheWrite":0,"reasoning":11,"totalTokens":1700,"cost":{"input":0.000082369,"output":0.0000018620000000000001,"cacheRead":0,"cacheWrite":0,"total":0.000084231}},"assistantMessageEvent":{"type":"text_end","contentIndex":1,"content":"rollback fixture first turn complete"}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to respond with a specific phrase.","thinkingSignature":""},{"type":"text","text":"rollback fixture first turn complete"}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1681,"output":19,"cacheRead":0,"cacheWrite":0,"reasoning":11,"totalTokens":1700,"cost":{"input":0.000082369,"output":0.0000018620000000000001,"cacheRead":0,"cacheWrite":0,"total":0.000084231}},"stopReason":"stop","timestamp":1767225600334,"responseId":"gen-1790407555-8ryAwKro3sTLilmYXQsu","rawStopReason":"stop"}}} +{"type":"emit_inbound","label":"turn_end","frame":{"type":"turn_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to respond with a specific phrase.","thinkingSignature":""},{"type":"text","text":"rollback fixture first turn complete"}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1681,"output":19,"cacheRead":0,"cacheWrite":0,"reasoning":11,"totalTokens":1700,"cost":{"input":0.000082369,"output":0.0000018620000000000001,"cacheRead":0,"cacheWrite":0,"total":0.000084231}},"stopReason":"stop","timestamp":1767225600334,"responseId":"gen-1790407555-8ryAwKro3sTLilmYXQsu","rawStopReason":"stop"},"toolResults":[]}} +{"type":"emit_inbound","label":"agent_end","frame":{"type":"agent_end","messages":[{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790407554806,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]},{"role":"user","content":[{"type":"text","text":"Respond with exactly: rollback fixture first turn complete"}],"timestamp":1767225600312},{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to respond with a specific phrase.","thinkingSignature":""},{"type":"text","text":"rollback fixture first turn complete"}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1681,"output":19,"cacheRead":0,"cacheWrite":0,"reasoning":11,"totalTokens":1700,"cost":{"input":0.000082369,"output":0.0000018620000000000001,"cacheRead":0,"cacheWrite":0,"total":0.000084231}},"stopReason":"stop","timestamp":1767225600334,"responseId":"gen-1790407555-8ryAwKro3sTLilmYXQsu","rawStopReason":"stop"}],"willRetry":false}} +{"type":"emit_inbound","label":"agent_settled","frame":{"type":"agent_settled"}} +{"type":"expect_outbound","label":"get_state","frame":{"type":"get_state","id":"t3-6"}} +{"type":"emit_inbound","label":"response:get_state","frame":{"id":"t3-6","type":"response","command":"get_state","success":true,"data":{"model":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}},"thinkingLevel":"high","isStreaming":false,"isCompacting":false,"steeringMode":"one-at-a-time","followUpMode":"one-at-a-time","sessionFile":"/pi-sessions/session-1.jsonl","sessionId":"00000000-0000-4000-8000-000000000002","sessionName":"Replay fixture: thread_rollback_after_stop","autoCompactionEnabled":true,"messageCount":3,"pendingMessageCount":0}}} +{"type":"expect_outbound","label":"get_entries","frame":{"type":"get_entries","since":"de9dbea7","id":"t3-7"}} +{"type":"emit_inbound","label":"response:get_entries","frame":{"id":"t3-7","type":"response","command":"get_entries","success":true,"data":{"entries":[{"type":"model_change","id":"4bb2e130","parentId":"de9dbea7","timestamp":"2026-01-01T00:00:00.304Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"session_info","id":"21ad9a4f","parentId":"4bb2e130","timestamp":"2026-01-01T00:00:00.308Z","name":"Replay fixture: thread_rollback_after_stop"},{"type":"message","id":"cc511dc1","parentId":"21ad9a4f","timestamp":"2026-01-01T00:00:00.316Z","message":{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790407554806,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]}},{"type":"message","id":"cfa8012c","parentId":"cc511dc1","timestamp":"2026-01-01T00:00:00.316Z","message":{"role":"user","content":[{"type":"text","text":"Respond with exactly: rollback fixture first turn complete"}],"timestamp":1767225600312}},{"type":"message","id":"9d54d155","parentId":"cfa8012c","timestamp":"2026-01-01T00:00:01.668Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to respond with a specific phrase.","thinkingSignature":""},{"type":"text","text":"rollback fixture first turn complete"}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1681,"output":19,"cacheRead":0,"cacheWrite":0,"reasoning":11,"totalTokens":1700,"cost":{"input":0.000082369,"output":0.0000018620000000000001,"cacheRead":0,"cacheWrite":0,"total":0.000084231}},"stopReason":"stop","timestamp":1767225600334,"responseId":"gen-1790407555-8ryAwKro3sTLilmYXQsu","rawStopReason":"stop"}}],"leafId":"9d54d155"}}} +{"type":"expect_outbound","label":"get_session_stats","frame":{"type":"get_session_stats","id":"t3-8"}} +{"type":"emit_inbound","label":"response:get_session_stats","frame":{"id":"t3-8","type":"response","command":"get_session_stats","success":true,"data":{"sessionFile":"/pi-sessions/session-1.jsonl","sessionId":"00000000-0000-4000-8000-000000000002","userMessages":1,"assistantMessages":1,"toolCalls":0,"toolResults":0,"totalMessages":3,"tokens":{"input":1681,"output":19,"cacheRead":0,"cacheWrite":0,"total":1700},"cost":0.000084231,"contextUsage":{"tokens":1700,"contextWindow":1024000,"percent":0.166015625}}}} +{"type":"expect_outbound","label":"prompt","frame":{"type":"prompt","message":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}} +{"type":"emit_inbound","label":"response:prompt","frame":{"type":"response","command":"prompt","success":true}} +{"type":"emit_inbound","label":"agent_start","frame":{"type":"agent_start"}} +{"type":"emit_inbound","label":"turn_start","frame":{"type":"turn_start"}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225602003}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225602003}}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"pending","timestamp":1767225602005}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_start","contentIndex":0}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"The"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" user wants"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" me to"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" run a"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" Node"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":".js command"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" that will"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" wait"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" for"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" 30"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" seconds."}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" They"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" want me"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" to wait"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" for it"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" to complete"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"."}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" But"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" the command"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" has"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" a "}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"30 second"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" timeout,"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" and they"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" said \""}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"Do"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" not answer"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" until it"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" completes.\""}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" However"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":", I"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" have"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" a tool"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" timeout"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" parameter I"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" could"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" set."}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" Let me"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" just run"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" it without"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" a timeout"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" and"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" wait"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" for it"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" to complete"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":".\n\nActually"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":", looking"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" at the"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" command"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":","}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" it will"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" run"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" for "}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"30 seconds"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":". I"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" should just"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" run it"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" and wait"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"."}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_start","contentIndex":1,"id":"call_6a880d60d4dd4f0daf8bbd1e","toolName":"bash"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":""}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":""}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"{"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"\"command\": \"node -"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"e \\\""}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"console.log"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"('in"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"terrupt fixtu"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"re tool started"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"'); setTimeou"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"t(() =>"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":" {},"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":" 30000"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":")\\\"\"}"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":1750,"output":163,"cacheRead":0,"cacheWrite":0,"reasoning":99,"totalTokens":1913,"cost":{"input":0.00008575,"output":0.000015974,"cacheRead":0,"cacheWrite":0,"total":0.000101724}},"assistantMessageEvent":{"type":"thinking_end","contentIndex":0,"content":"The user wants me to run a Node.js command that will wait for 30 seconds. They want me to wait for it to complete. But the command has a 30 second timeout, and they said \"Do not answer until it completes.\" However, I have a tool timeout parameter I could set. Let me just run it without a timeout and wait for it to complete.\n\nActually, looking at the command, it will run for 30 seconds. I should just run it and wait."}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":1750,"output":163,"cacheRead":0,"cacheWrite":0,"reasoning":99,"totalTokens":1913,"cost":{"input":0.00008575,"output":0.000015974,"cacheRead":0,"cacheWrite":0,"total":0.000101724}},"assistantMessageEvent":{"type":"toolcall_end","contentIndex":1,"toolCall":{"type":"toolCall","id":"call_6a880d60d4dd4f0daf8bbd1e","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\""}}}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a Node.js command that will wait for 30 seconds. They want me to wait for it to complete. But the command has a 30 second timeout, and they said \"Do not answer until it completes.\" However, I have a tool timeout parameter I could set. Let me just run it without a timeout and wait for it to complete.\n\nActually, looking at the command, it will run for 30 seconds. I should just run it and wait.","thinkingSignature":""},{"type":"toolCall","id":"call_6a880d60d4dd4f0daf8bbd1e","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\""}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1750,"output":163,"cacheRead":0,"cacheWrite":0,"reasoning":99,"totalTokens":1913,"cost":{"input":0.00008575,"output":0.000015974,"cacheRead":0,"cacheWrite":0,"total":0.000101724}},"stopReason":"toolUse","timestamp":1767225602005,"responseId":"gen-1790407556-3iZqMEXDnLoAqMFMjuR9","rawStopReason":"tool_calls"}}} +{"type":"emit_inbound","label":"tool_execution_start","frame":{"type":"tool_execution_start","toolCallId":"call_6a880d60d4dd4f0daf8bbd1e","toolName":"bash","args":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\""}}} +{"type":"emit_inbound","label":"tool_execution_update","frame":{"type":"tool_execution_update","toolCallId":"call_6a880d60d4dd4f0daf8bbd1e","toolName":"bash","args":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\""},"partialResult":{"content":[]}}} +{"type":"expect_outbound","label":"abort","frame":{"type":"abort","id":"t3-9"}} +{"type":"emit_inbound","label":"tool_execution_update","frame":{"type":"tool_execution_update","toolCallId":"call_6a880d60d4dd4f0daf8bbd1e","toolName":"bash","args":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\""},"partialResult":{"content":[{"type":"text","text":"interrupt fixture tool started\n"}],"details":{}}}} +{"type":"emit_inbound","label":"tool_execution_end","frame":{"type":"tool_execution_end","toolCallId":"call_6a880d60d4dd4f0daf8bbd1e","toolName":"bash","result":{"content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{}},"isError":true}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"toolResult","toolCallId":"call_6a880d60d4dd4f0daf8bbd1e","toolName":"bash","content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{},"isError":true,"timestamp":1767225604144}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"toolResult","toolCallId":"call_6a880d60d4dd4f0daf8bbd1e","toolName":"bash","content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{},"isError":true,"timestamp":1767225604144}}} +{"type":"emit_inbound","label":"turn_end","frame":{"type":"turn_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a Node.js command that will wait for 30 seconds. They want me to wait for it to complete. But the command has a 30 second timeout, and they said \"Do not answer until it completes.\" However, I have a tool timeout parameter I could set. Let me just run it without a timeout and wait for it to complete.\n\nActually, looking at the command, it will run for 30 seconds. I should just run it and wait.","thinkingSignature":""},{"type":"toolCall","id":"call_6a880d60d4dd4f0daf8bbd1e","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\""}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1750,"output":163,"cacheRead":0,"cacheWrite":0,"reasoning":99,"totalTokens":1913,"cost":{"input":0.00008575,"output":0.000015974,"cacheRead":0,"cacheWrite":0,"total":0.000101724}},"stopReason":"toolUse","timestamp":1767225602005,"responseId":"gen-1790407556-3iZqMEXDnLoAqMFMjuR9","rawStopReason":"tool_calls"},"toolResults":[{"role":"toolResult","toolCallId":"call_6a880d60d4dd4f0daf8bbd1e","toolName":"bash","content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{},"isError":true,"timestamp":1767225604144}]}} +{"type":"emit_inbound","label":"turn_start","frame":{"type":"turn_start"}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225604150}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225604150}}} +{"type":"emit_inbound","label":"turn_end","frame":{"type":"turn_end","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225604150},"toolResults":[]}} +{"type":"emit_inbound","label":"agent_end","frame":{"type":"agent_end","messages":[{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225602003},{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a Node.js command that will wait for 30 seconds. They want me to wait for it to complete. But the command has a 30 second timeout, and they said \"Do not answer until it completes.\" However, I have a tool timeout parameter I could set. Let me just run it without a timeout and wait for it to complete.\n\nActually, looking at the command, it will run for 30 seconds. I should just run it and wait.","thinkingSignature":""},{"type":"toolCall","id":"call_6a880d60d4dd4f0daf8bbd1e","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\""}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1750,"output":163,"cacheRead":0,"cacheWrite":0,"reasoning":99,"totalTokens":1913,"cost":{"input":0.00008575,"output":0.000015974,"cacheRead":0,"cacheWrite":0,"total":0.000101724}},"stopReason":"toolUse","timestamp":1767225602005,"responseId":"gen-1790407556-3iZqMEXDnLoAqMFMjuR9","rawStopReason":"tool_calls"},{"role":"toolResult","toolCallId":"call_6a880d60d4dd4f0daf8bbd1e","toolName":"bash","content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{},"isError":true,"timestamp":1767225604144},{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225604150}],"willRetry":false}} +{"type":"emit_inbound","label":"agent_settled","frame":{"type":"agent_settled"}} +{"type":"emit_inbound","label":"response:abort","frame":{"id":"t3-9","type":"response","command":"abort","success":true}} +{"type":"expect_outbound","label":"get_entries","frame":{"type":"get_entries","since":"9d54d155","id":"t3-10"}} +{"type":"emit_inbound","label":"response:get_entries","frame":{"id":"t3-10","type":"response","command":"get_entries","success":true,"data":{"entries":[{"type":"message","id":"1458a9c9","parentId":"9d54d155","timestamp":"2026-01-01T00:00:02.004Z","message":{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225602003}},{"type":"message","id":"1bf7b1e7","parentId":"1458a9c9","timestamp":"2026-01-01T00:00:04.089Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a Node.js command that will wait for 30 seconds. They want me to wait for it to complete. But the command has a 30 second timeout, and they said \"Do not answer until it completes.\" However, I have a tool timeout parameter I could set. Let me just run it without a timeout and wait for it to complete.\n\nActually, looking at the command, it will run for 30 seconds. I should just run it and wait.","thinkingSignature":""},{"type":"toolCall","id":"call_6a880d60d4dd4f0daf8bbd1e","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\""}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1750,"output":163,"cacheRead":0,"cacheWrite":0,"reasoning":99,"totalTokens":1913,"cost":{"input":0.00008575,"output":0.000015974,"cacheRead":0,"cacheWrite":0,"total":0.000101724}},"stopReason":"toolUse","timestamp":1767225602005,"responseId":"gen-1790407556-3iZqMEXDnLoAqMFMjuR9","rawStopReason":"tool_calls"}},{"type":"message","id":"e103aa0b","parentId":"1bf7b1e7","timestamp":"2026-01-01T00:00:04.144Z","message":{"role":"toolResult","toolCallId":"call_6a880d60d4dd4f0daf8bbd1e","toolName":"bash","content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{},"isError":true,"timestamp":1767225604144}},{"type":"message","id":"43c793aa","parentId":"e103aa0b","timestamp":"2026-01-01T00:00:04.150Z","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225604150}}],"leafId":"43c793aa"}}} +{"type":"expect_outbound","label":"process_start@p2","frame":{"type":"process_start","args":["--mode","rpc","--provider","openrouter","--model","deepseek/deepseek-v4-flash","--no-extensions","--no-skills","--no-prompt-templates","--no-context-files","--approve","--extension",""]}} +{"type":"expect_outbound","label":"switch_session@p2","frame":{"type":"switch_session","sessionPath":"/pi-sessions/session-1.jsonl","id":"t3-0"}} +{"type":"expect_outbound","label":"get_commands@p2","frame":{"type":"get_commands","id":"t3-1"}} +{"type":"emit_inbound","label":"extension_ui_request@p2","frame":{"type":"extension_ui_request","id":"00000000-0000-4000-8000-000000000003","method":"notify","message":"t3-code MCP unavailable: T3_MCP_URL or T3_MCP_BEARER_TOKEN is missing.","notifyType":"warning"}} +{"type":"emit_inbound","label":"response:get_commands@p2","frame":{"id":"t3-1","type":"response","command":"get_commands","success":true,"data":{"commands":[{"name":"llama","description":"Manage llama.cpp router models","source":"extension","sourceInfo":{"path":"","source":"inline","scope":"temporary","origin":"top-level"}}]}}} +{"type":"emit_inbound","label":"extension_ui_request@p2","frame":{"type":"extension_ui_request","id":"00000000-0000-4000-8000-000000000004","method":"notify","message":"t3-code MCP unavailable: T3_MCP_URL or T3_MCP_BEARER_TOKEN is missing.","notifyType":"warning"}} +{"type":"emit_inbound","label":"extension_ui_request@p2","frame":{"type":"extension_ui_request","id":"00000000-0000-4000-8000-000000000005","method":"notify","message":"t3-code MCP unavailable: T3_MCP_URL or T3_MCP_BEARER_TOKEN is missing.","notifyType":"warning"}} +{"type":"emit_inbound","label":"response:switch_session@p2","frame":{"id":"t3-0","type":"response","command":"switch_session","success":true,"data":{"cancelled":false}}} +{"type":"expect_outbound","label":"get_state@p2","frame":{"type":"get_state","id":"t3-2"}} +{"type":"emit_inbound","label":"response:get_state@p2","frame":{"id":"t3-2","type":"response","command":"get_state","success":true,"data":{"model":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}},"thinkingLevel":"high","isStreaming":false,"isCompacting":false,"steeringMode":"one-at-a-time","followUpMode":"one-at-a-time","sessionFile":"/pi-sessions/session-1.jsonl","sessionId":"00000000-0000-4000-8000-000000000002","sessionName":"Replay fixture: thread_rollback_after_stop","autoCompactionEnabled":true,"messageCount":7,"pendingMessageCount":0}}} +{"type":"expect_outbound","label":"get_available_models@p2","frame":{"type":"get_available_models","id":"t3-3"}} +{"type":"emit_inbound","label":"response:get_available_models@p2","frame":{"id":"t3-3","type":"response","command":"get_available_models","success":true,"data":{"models":[{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}}]}}} +{"type":"expect_outbound","label":"get_entries@p2","frame":{"type":"get_entries","id":"t3-4"}} +{"type":"emit_inbound","label":"response:get_entries@p2","frame":{"id":"t3-4","type":"response","command":"get_entries","success":true,"data":{"entries":[{"type":"model_change","id":"cc722d40","parentId":null,"timestamp":"2026-01-01T00:00:00.000Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"thinking_level_change","id":"de9dbea7","parentId":"cc722d40","timestamp":"2026-01-01T00:00:00.000Z","thinkingLevel":"high"},{"type":"model_change","id":"4bb2e130","parentId":"de9dbea7","timestamp":"2026-01-01T00:00:00.304Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"session_info","id":"21ad9a4f","parentId":"4bb2e130","timestamp":"2026-01-01T00:00:00.308Z","name":"Replay fixture: thread_rollback_after_stop"},{"type":"message","id":"cc511dc1","parentId":"21ad9a4f","timestamp":"2026-01-01T00:00:00.316Z","message":{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790407554806,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]}},{"type":"message","id":"cfa8012c","parentId":"cc511dc1","timestamp":"2026-01-01T00:00:00.316Z","message":{"role":"user","content":[{"type":"text","text":"Respond with exactly: rollback fixture first turn complete"}],"timestamp":1767225600312}},{"type":"message","id":"9d54d155","parentId":"cfa8012c","timestamp":"2026-01-01T00:00:01.668Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to respond with a specific phrase.","thinkingSignature":""},{"type":"text","text":"rollback fixture first turn complete"}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1681,"output":19,"cacheRead":0,"cacheWrite":0,"reasoning":11,"totalTokens":1700,"cost":{"input":0.000082369,"output":0.0000018620000000000001,"cacheRead":0,"cacheWrite":0,"total":0.000084231}},"stopReason":"stop","timestamp":1767225600334,"responseId":"gen-1790407555-8ryAwKro3sTLilmYXQsu","rawStopReason":"stop"}},{"type":"message","id":"1458a9c9","parentId":"9d54d155","timestamp":"2026-01-01T00:00:02.004Z","message":{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225602003}},{"type":"message","id":"1bf7b1e7","parentId":"1458a9c9","timestamp":"2026-01-01T00:00:04.089Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a Node.js command that will wait for 30 seconds. They want me to wait for it to complete. But the command has a 30 second timeout, and they said \"Do not answer until it completes.\" However, I have a tool timeout parameter I could set. Let me just run it without a timeout and wait for it to complete.\n\nActually, looking at the command, it will run for 30 seconds. I should just run it and wait.","thinkingSignature":""},{"type":"toolCall","id":"call_6a880d60d4dd4f0daf8bbd1e","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\""}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1750,"output":163,"cacheRead":0,"cacheWrite":0,"reasoning":99,"totalTokens":1913,"cost":{"input":0.00008575,"output":0.000015974,"cacheRead":0,"cacheWrite":0,"total":0.000101724}},"stopReason":"toolUse","timestamp":1767225602005,"responseId":"gen-1790407556-3iZqMEXDnLoAqMFMjuR9","rawStopReason":"tool_calls"}},{"type":"message","id":"e103aa0b","parentId":"1bf7b1e7","timestamp":"2026-01-01T00:00:04.144Z","message":{"role":"toolResult","toolCallId":"call_6a880d60d4dd4f0daf8bbd1e","toolName":"bash","content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{},"isError":true,"timestamp":1767225604144}},{"type":"message","id":"43c793aa","parentId":"e103aa0b","timestamp":"2026-01-01T00:00:04.150Z","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225604150}}],"leafId":"43c793aa"}}} +{"type":"expect_outbound","label":"set_model@p2","frame":{"type":"set_model","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash","id":"t3-5"}} +{"type":"emit_inbound","label":"response:set_model@p2","frame":{"id":"t3-5","type":"response","command":"set_model","success":true,"data":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}}}} +{"type":"expect_outbound","label":"set_session_name@p2","frame":{"type":"set_session_name","name":"Replay fixture: thread_rollback_after_stop","id":"t3-6"}} +{"type":"emit_inbound","label":"session_info_changed@p2","frame":{"type":"session_info_changed","name":"Replay fixture: thread_rollback_after_stop"}} +{"type":"emit_inbound","label":"response:set_session_name@p2","frame":{"id":"t3-6","type":"response","command":"set_session_name","success":true}} +{"type":"expect_outbound","label":"prompt@p2","frame":{"type":"prompt","message":"Respond with exactly: rollback fixture second turn complete"}} +{"type":"emit_inbound","label":"response:prompt@p2","frame":{"type":"response","command":"prompt","success":true}} +{"type":"emit_inbound","label":"agent_start@p2","frame":{"type":"agent_start"}} +{"type":"emit_inbound","label":"turn_start@p2","frame":{"type":"turn_start"}} +{"type":"emit_inbound","label":"message_start@p2","frame":{"type":"message_start","message":{"role":"user","content":[{"type":"text","text":"Respond with exactly: rollback fixture second turn complete"}],"timestamp":1767225606294}}} +{"type":"emit_inbound","label":"message_end@p2","frame":{"type":"message_end","message":{"role":"user","content":[{"type":"text","text":"Respond with exactly: rollback fixture second turn complete"}],"timestamp":1767225606294}}} +{"type":"emit_inbound","label":"message_start@p2","frame":{"type":"message_start","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"pending","timestamp":1767225606310}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_start","contentIndex":0}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"The"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" command was"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" ab"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"orted,"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" so"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" it did"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" not finish"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" naturally ("}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"as"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" expected"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":")."}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" Now"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" I"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" need"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" to respond"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" with \""}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"roll"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"back"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" fixture second"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" turn complete"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"\"."}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_start","contentIndex":1}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":"roll"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":"back fixture"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" second turn"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" complete"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":1943,"output":38,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1981,"cost":{"input":0.000095207,"output":0.0000037240000000000003,"cacheRead":0,"cacheWrite":0,"total":0.00009893099999999999}},"assistantMessageEvent":{"type":"thinking_end","contentIndex":0,"content":"The command was aborted, so it did not finish naturally (as expected). Now I need to respond with \"rollback fixture second turn complete\"."}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":1943,"output":38,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1981,"cost":{"input":0.000095207,"output":0.0000037240000000000003,"cacheRead":0,"cacheWrite":0,"total":0.00009893099999999999}},"assistantMessageEvent":{"type":"text_end","contentIndex":1,"content":"rollback fixture second turn complete"}}} +{"type":"emit_inbound","label":"message_end@p2","frame":{"type":"message_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The command was aborted, so it did not finish naturally (as expected). Now I need to respond with \"rollback fixture second turn complete\".","thinkingSignature":""},{"type":"text","text":"rollback fixture second turn complete"}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1943,"output":38,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1981,"cost":{"input":0.000095207,"output":0.0000037240000000000003,"cacheRead":0,"cacheWrite":0,"total":0.00009893099999999999}},"stopReason":"stop","timestamp":1767225606310,"responseId":"gen-1790407561-TJtNFeyZhhYD935MAb8O","rawStopReason":"stop"}}} +{"type":"emit_inbound","label":"turn_end@p2","frame":{"type":"turn_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The command was aborted, so it did not finish naturally (as expected). Now I need to respond with \"rollback fixture second turn complete\".","thinkingSignature":""},{"type":"text","text":"rollback fixture second turn complete"}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1943,"output":38,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1981,"cost":{"input":0.000095207,"output":0.0000037240000000000003,"cacheRead":0,"cacheWrite":0,"total":0.00009893099999999999}},"stopReason":"stop","timestamp":1767225606310,"responseId":"gen-1790407561-TJtNFeyZhhYD935MAb8O","rawStopReason":"stop"},"toolResults":[]}} +{"type":"emit_inbound","label":"agent_end@p2","frame":{"type":"agent_end","messages":[{"role":"user","content":[{"type":"text","text":"Respond with exactly: rollback fixture second turn complete"}],"timestamp":1767225606294},{"role":"assistant","content":[{"type":"thinking","thinking":"The command was aborted, so it did not finish naturally (as expected). Now I need to respond with \"rollback fixture second turn complete\".","thinkingSignature":""},{"type":"text","text":"rollback fixture second turn complete"}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1943,"output":38,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1981,"cost":{"input":0.000095207,"output":0.0000037240000000000003,"cacheRead":0,"cacheWrite":0,"total":0.00009893099999999999}},"stopReason":"stop","timestamp":1767225606310,"responseId":"gen-1790407561-TJtNFeyZhhYD935MAb8O","rawStopReason":"stop"}],"willRetry":false}} +{"type":"emit_inbound","label":"agent_settled@p2","frame":{"type":"agent_settled"}} +{"type":"expect_outbound","label":"get_state@p2","frame":{"type":"get_state","id":"t3-7"}} +{"type":"emit_inbound","label":"response:get_state@p2","frame":{"id":"t3-7","type":"response","command":"get_state","success":true,"data":{"model":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}},"thinkingLevel":"high","isStreaming":false,"isCompacting":false,"steeringMode":"one-at-a-time","followUpMode":"one-at-a-time","sessionFile":"/pi-sessions/session-1.jsonl","sessionId":"00000000-0000-4000-8000-000000000002","sessionName":"Replay fixture: thread_rollback_after_stop","autoCompactionEnabled":true,"messageCount":9,"pendingMessageCount":0}}} +{"type":"expect_outbound","label":"get_entries@p2","frame":{"type":"get_entries","since":"43c793aa","id":"t3-8"}} +{"type":"emit_inbound","label":"response:get_entries@p2","frame":{"id":"t3-8","type":"response","command":"get_entries","success":true,"data":{"entries":[{"type":"model_change","id":"c5da86a0","parentId":"43c793aa","timestamp":"2026-01-01T00:00:06.283Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"session_info","id":"095ceb5b","parentId":"c5da86a0","timestamp":"2026-01-01T00:00:06.287Z","name":"Replay fixture: thread_rollback_after_stop"},{"type":"message","id":"fa0efbf2","parentId":"095ceb5b","timestamp":"2026-01-01T00:00:06.297Z","message":{"role":"user","content":[{"type":"text","text":"Respond with exactly: rollback fixture second turn complete"}],"timestamp":1767225606294}},{"type":"message","id":"9a39eedb","parentId":"fa0efbf2","timestamp":"2026-01-01T00:00:07.649Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The command was aborted, so it did not finish naturally (as expected). Now I need to respond with \"rollback fixture second turn complete\".","thinkingSignature":""},{"type":"text","text":"rollback fixture second turn complete"}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1943,"output":38,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1981,"cost":{"input":0.000095207,"output":0.0000037240000000000003,"cacheRead":0,"cacheWrite":0,"total":0.00009893099999999999}},"stopReason":"stop","timestamp":1767225606310,"responseId":"gen-1790407561-TJtNFeyZhhYD935MAb8O","rawStopReason":"stop"}}],"leafId":"9a39eedb"}}} +{"type":"expect_outbound","label":"get_session_stats@p2","frame":{"type":"get_session_stats","id":"t3-9"}} +{"type":"emit_inbound","label":"response:get_session_stats@p2","frame":{"id":"t3-9","type":"response","command":"get_session_stats","success":true,"data":{"sessionFile":"/pi-sessions/session-1.jsonl","sessionId":"00000000-0000-4000-8000-000000000002","userMessages":3,"assistantMessages":4,"toolCalls":1,"toolResults":1,"totalMessages":9,"tokens":{"input":5374,"output":220,"cacheRead":0,"cacheWrite":0,"total":5594},"cost":0.00028488600000000004,"contextUsage":{"tokens":1981,"contextWindow":1024000,"percent":0.19345703125000002}}}} +{"type":"expect_outbound","label":"fork@p2","frame":{"type":"fork","entryId":"1458a9c9","id":"t3-10"}} +{"type":"emit_inbound","label":"extension_ui_request@p2","frame":{"type":"extension_ui_request","id":"00000000-0000-4000-8000-000000000006","method":"notify","message":"t3-code MCP unavailable: T3_MCP_URL or T3_MCP_BEARER_TOKEN is missing.","notifyType":"warning"}} +{"type":"emit_inbound","label":"extension_ui_request@p2","frame":{"type":"extension_ui_request","id":"00000000-0000-4000-8000-000000000007","method":"notify","message":"t3-code MCP unavailable: T3_MCP_URL or T3_MCP_BEARER_TOKEN is missing.","notifyType":"warning"}} +{"type":"emit_inbound","label":"response:fork@p2","frame":{"id":"t3-10","type":"response","command":"fork","success":true,"data":{"text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally.","cancelled":false}}} +{"type":"expect_outbound","label":"get_state@p2","frame":{"type":"get_state","id":"t3-11"}} +{"type":"emit_inbound","label":"response:get_state@p2","frame":{"id":"t3-11","type":"response","command":"get_state","success":true,"data":{"model":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}},"thinkingLevel":"high","isStreaming":false,"isCompacting":false,"steeringMode":"one-at-a-time","followUpMode":"one-at-a-time","sessionFile":"/pi-sessions/session-2.jsonl","sessionId":"00000000-0000-4000-8000-000000000008","sessionName":"Replay fixture: thread_rollback_after_stop","autoCompactionEnabled":true,"messageCount":3,"pendingMessageCount":0}}} +{"type":"expect_outbound","label":"get_entries@p2","frame":{"type":"get_entries","id":"t3-12"}} +{"type":"emit_inbound","label":"response:get_entries@p2","frame":{"id":"t3-12","type":"response","command":"get_entries","success":true,"data":{"entries":[{"type":"model_change","id":"cc722d40","parentId":null,"timestamp":"2026-01-01T00:00:00.000Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"thinking_level_change","id":"de9dbea7","parentId":"cc722d40","timestamp":"2026-01-01T00:00:00.000Z","thinkingLevel":"high"},{"type":"model_change","id":"4bb2e130","parentId":"de9dbea7","timestamp":"2026-01-01T00:00:00.304Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"session_info","id":"21ad9a4f","parentId":"4bb2e130","timestamp":"2026-01-01T00:00:00.308Z","name":"Replay fixture: thread_rollback_after_stop"},{"type":"message","id":"cc511dc1","parentId":"21ad9a4f","timestamp":"2026-01-01T00:00:00.316Z","message":{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790407554806,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]}},{"type":"message","id":"cfa8012c","parentId":"cc511dc1","timestamp":"2026-01-01T00:00:00.316Z","message":{"role":"user","content":[{"type":"text","text":"Respond with exactly: rollback fixture first turn complete"}],"timestamp":1767225600312}},{"type":"message","id":"9d54d155","parentId":"cfa8012c","timestamp":"2026-01-01T00:00:01.668Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to respond with a specific phrase.","thinkingSignature":""},{"type":"text","text":"rollback fixture first turn complete"}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1681,"output":19,"cacheRead":0,"cacheWrite":0,"reasoning":11,"totalTokens":1700,"cost":{"input":0.000082369,"output":0.0000018620000000000001,"cacheRead":0,"cacheWrite":0,"total":0.000084231}},"stopReason":"stop","timestamp":1767225600334,"responseId":"gen-1790407555-8ryAwKro3sTLilmYXQsu","rawStopReason":"stop"}}],"leafId":"9d54d155"}}} +{"type":"expect_outbound","label":"switch_session@p2","frame":{"type":"switch_session","sessionPath":"/pi-sessions/session-2.jsonl","id":"t3-13"}} +{"type":"emit_inbound","label":"extension_ui_request@p2","frame":{"type":"extension_ui_request","id":"00000000-0000-4000-8000-000000000009","method":"notify","message":"t3-code MCP unavailable: T3_MCP_URL or T3_MCP_BEARER_TOKEN is missing.","notifyType":"warning"}} +{"type":"emit_inbound","label":"extension_ui_request@p2","frame":{"type":"extension_ui_request","id":"00000000-0000-4000-8000-000000000010","method":"notify","message":"t3-code MCP unavailable: T3_MCP_URL or T3_MCP_BEARER_TOKEN is missing.","notifyType":"warning"}} +{"type":"emit_inbound","label":"response:switch_session@p2","frame":{"id":"t3-13","type":"response","command":"switch_session","success":true,"data":{"cancelled":false}}} +{"type":"expect_outbound","label":"get_state@p2","frame":{"type":"get_state","id":"t3-14"}} +{"type":"emit_inbound","label":"response:get_state@p2","frame":{"id":"t3-14","type":"response","command":"get_state","success":true,"data":{"model":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}},"thinkingLevel":"high","isStreaming":false,"isCompacting":false,"steeringMode":"one-at-a-time","followUpMode":"one-at-a-time","sessionFile":"/pi-sessions/session-2.jsonl","sessionId":"00000000-0000-4000-8000-000000000008","sessionName":"Replay fixture: thread_rollback_after_stop","autoCompactionEnabled":true,"messageCount":3,"pendingMessageCount":0}}} +{"type":"expect_outbound","label":"get_entries@p2","frame":{"type":"get_entries","id":"t3-15"}} +{"type":"emit_inbound","label":"response:get_entries@p2","frame":{"id":"t3-15","type":"response","command":"get_entries","success":true,"data":{"entries":[{"type":"model_change","id":"cc722d40","parentId":null,"timestamp":"2026-01-01T00:00:00.000Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"thinking_level_change","id":"de9dbea7","parentId":"cc722d40","timestamp":"2026-01-01T00:00:00.000Z","thinkingLevel":"high"},{"type":"model_change","id":"4bb2e130","parentId":"de9dbea7","timestamp":"2026-01-01T00:00:00.304Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"session_info","id":"21ad9a4f","parentId":"4bb2e130","timestamp":"2026-01-01T00:00:00.308Z","name":"Replay fixture: thread_rollback_after_stop"},{"type":"message","id":"cc511dc1","parentId":"21ad9a4f","timestamp":"2026-01-01T00:00:00.316Z","message":{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790407554806,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]}},{"type":"message","id":"cfa8012c","parentId":"cc511dc1","timestamp":"2026-01-01T00:00:00.316Z","message":{"role":"user","content":[{"type":"text","text":"Respond with exactly: rollback fixture first turn complete"}],"timestamp":1767225600312}},{"type":"message","id":"9d54d155","parentId":"cfa8012c","timestamp":"2026-01-01T00:00:01.668Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to respond with a specific phrase.","thinkingSignature":""},{"type":"text","text":"rollback fixture first turn complete"}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1681,"output":19,"cacheRead":0,"cacheWrite":0,"reasoning":11,"totalTokens":1700,"cost":{"input":0.000082369,"output":0.0000018620000000000001,"cacheRead":0,"cacheWrite":0,"total":0.000084231}},"stopReason":"stop","timestamp":1767225600334,"responseId":"gen-1790407555-8ryAwKro3sTLilmYXQsu","rawStopReason":"stop"}}],"leafId":"9d54d155"}}} +{"type":"expect_outbound","label":"set_model@p2","frame":{"type":"set_model","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash","id":"t3-16"}} +{"type":"emit_inbound","label":"response:set_model@p2","frame":{"id":"t3-16","type":"response","command":"set_model","success":true,"data":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}}}} +{"type":"expect_outbound","label":"set_session_name@p2","frame":{"type":"set_session_name","name":"Replay fixture: thread_rollback_after_stop","id":"t3-17"}} +{"type":"emit_inbound","label":"session_info_changed@p2","frame":{"type":"session_info_changed","name":"Replay fixture: thread_rollback_after_stop"}} +{"type":"emit_inbound","label":"response:set_session_name@p2","frame":{"id":"t3-17","type":"response","command":"set_session_name","success":true}} +{"type":"expect_outbound","label":"prompt@p2","frame":{"type":"prompt","message":"Repeat the conversation verbatim."}} +{"type":"emit_inbound","label":"response:prompt@p2","frame":{"type":"response","command":"prompt","success":true}} +{"type":"emit_inbound","label":"agent_start@p2","frame":{"type":"agent_start"}} +{"type":"emit_inbound","label":"turn_start@p2","frame":{"type":"turn_start"}} +{"type":"emit_inbound","label":"message_start@p2","frame":{"type":"message_start","message":{"role":"user","content":[{"type":"text","text":"Repeat the conversation verbatim."}],"timestamp":1767225608504}}} +{"type":"emit_inbound","label":"message_end@p2","frame":{"type":"message_end","message":{"role":"user","content":[{"type":"text","text":"Repeat the conversation verbatim."}],"timestamp":1767225608504}}} +{"type":"emit_inbound","label":"message_start@p2","frame":{"type":"message_start","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"pending","timestamp":1767225608508}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_start","contentIndex":0}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"The"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" user wants"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" me"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" to repeat"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" the entire"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" conversation verb"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"atim."}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" Let"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" me"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" do that"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":".\n\n"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"CON"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"V"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"ERS"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"ATION:\n\n"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"User"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":":"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" Respond"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" with"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" exactly:"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" rollback"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" fixture first"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" turn complete"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"\nAssistant"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":": roll"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"back fixture"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" first turn"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" complete\n"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"User:"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" Repeat the"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" conversation verb"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"atim."}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_start","contentIndex":1}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":"User"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":": Respond"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" with exactly"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":": roll"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":"back fixture"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" first turn"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" complete\n"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":"Assistant:"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" rollback"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" fixture first"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" turn complete"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":"\nUser"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":": Repeat"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" the conversation"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":" verbatim"}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":"."}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":173,"output":84,"cacheRead":1536,"cacheWrite":0,"reasoning":52,"totalTokens":1793,"cost":{"input":0.000008477,"output":0.000008232,"cacheRead":0.0000150528,"cacheWrite":0,"total":0.0000317618}},"assistantMessageEvent":{"type":"thinking_end","contentIndex":0,"content":"The user wants me to repeat the entire conversation verbatim. Let me do that.\n\nCONVERSATION:\n\nUser: Respond with exactly: rollback fixture first turn complete\nAssistant: rollback fixture first turn complete\nUser: Repeat the conversation verbatim."}}} +{"type":"emit_inbound","label":"message_update@p2","frame":{"type":"message_update","usage":{"input":173,"output":84,"cacheRead":1536,"cacheWrite":0,"reasoning":52,"totalTokens":1793,"cost":{"input":0.000008477,"output":0.000008232,"cacheRead":0.0000150528,"cacheWrite":0,"total":0.0000317618}},"assistantMessageEvent":{"type":"text_end","contentIndex":1,"content":"User: Respond with exactly: rollback fixture first turn complete\nAssistant: rollback fixture first turn complete\nUser: Repeat the conversation verbatim."}}} +{"type":"emit_inbound","label":"message_end@p2","frame":{"type":"message_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to repeat the entire conversation verbatim. Let me do that.\n\nCONVERSATION:\n\nUser: Respond with exactly: rollback fixture first turn complete\nAssistant: rollback fixture first turn complete\nUser: Repeat the conversation verbatim.","thinkingSignature":""},{"type":"text","text":"User: Respond with exactly: rollback fixture first turn complete\nAssistant: rollback fixture first turn complete\nUser: Repeat the conversation verbatim."}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":173,"output":84,"cacheRead":1536,"cacheWrite":0,"reasoning":52,"totalTokens":1793,"cost":{"input":0.000008477,"output":0.000008232,"cacheRead":0.0000150528,"cacheWrite":0,"total":0.0000317618}},"stopReason":"stop","timestamp":1767225608508,"responseId":"gen-1790407563-4ezKj4Rv2I4pjT9nAV3z","rawStopReason":"stop"}}} +{"type":"emit_inbound","label":"turn_end@p2","frame":{"type":"turn_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to repeat the entire conversation verbatim. Let me do that.\n\nCONVERSATION:\n\nUser: Respond with exactly: rollback fixture first turn complete\nAssistant: rollback fixture first turn complete\nUser: Repeat the conversation verbatim.","thinkingSignature":""},{"type":"text","text":"User: Respond with exactly: rollback fixture first turn complete\nAssistant: rollback fixture first turn complete\nUser: Repeat the conversation verbatim."}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":173,"output":84,"cacheRead":1536,"cacheWrite":0,"reasoning":52,"totalTokens":1793,"cost":{"input":0.000008477,"output":0.000008232,"cacheRead":0.0000150528,"cacheWrite":0,"total":0.0000317618}},"stopReason":"stop","timestamp":1767225608508,"responseId":"gen-1790407563-4ezKj4Rv2I4pjT9nAV3z","rawStopReason":"stop"},"toolResults":[]}} +{"type":"emit_inbound","label":"agent_end@p2","frame":{"type":"agent_end","messages":[{"role":"user","content":[{"type":"text","text":"Repeat the conversation verbatim."}],"timestamp":1767225608504},{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to repeat the entire conversation verbatim. Let me do that.\n\nCONVERSATION:\n\nUser: Respond with exactly: rollback fixture first turn complete\nAssistant: rollback fixture first turn complete\nUser: Repeat the conversation verbatim.","thinkingSignature":""},{"type":"text","text":"User: Respond with exactly: rollback fixture first turn complete\nAssistant: rollback fixture first turn complete\nUser: Repeat the conversation verbatim."}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":173,"output":84,"cacheRead":1536,"cacheWrite":0,"reasoning":52,"totalTokens":1793,"cost":{"input":0.000008477,"output":0.000008232,"cacheRead":0.0000150528,"cacheWrite":0,"total":0.0000317618}},"stopReason":"stop","timestamp":1767225608508,"responseId":"gen-1790407563-4ezKj4Rv2I4pjT9nAV3z","rawStopReason":"stop"}],"willRetry":false}} +{"type":"emit_inbound","label":"agent_settled@p2","frame":{"type":"agent_settled"}} +{"type":"expect_outbound","label":"get_state@p2","frame":{"type":"get_state","id":"t3-18"}} +{"type":"emit_inbound","label":"response:get_state@p2","frame":{"id":"t3-18","type":"response","command":"get_state","success":true,"data":{"model":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}},"thinkingLevel":"high","isStreaming":false,"isCompacting":false,"steeringMode":"one-at-a-time","followUpMode":"one-at-a-time","sessionFile":"/pi-sessions/session-2.jsonl","sessionId":"00000000-0000-4000-8000-000000000008","sessionName":"Replay fixture: thread_rollback_after_stop","autoCompactionEnabled":true,"messageCount":5,"pendingMessageCount":0}}} +{"type":"expect_outbound","label":"get_entries@p2","frame":{"type":"get_entries","since":"9d54d155","id":"t3-19"}} +{"type":"emit_inbound","label":"response:get_entries@p2","frame":{"id":"t3-19","type":"response","command":"get_entries","success":true,"data":{"entries":[{"type":"model_change","id":"1dbfc8d1","parentId":"9d54d155","timestamp":"2026-01-01T00:00:08.499Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"session_info","id":"fb9359a1","parentId":"1dbfc8d1","timestamp":"2026-01-01T00:00:08.502Z","name":"Replay fixture: thread_rollback_after_stop"},{"type":"message","id":"062a4c6e","parentId":"fb9359a1","timestamp":"2026-01-01T00:00:08.506Z","message":{"role":"user","content":[{"type":"text","text":"Repeat the conversation verbatim."}],"timestamp":1767225608504}},{"type":"message","id":"0df9073e","parentId":"062a4c6e","timestamp":"2026-01-01T00:00:09.886Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to repeat the entire conversation verbatim. Let me do that.\n\nCONVERSATION:\n\nUser: Respond with exactly: rollback fixture first turn complete\nAssistant: rollback fixture first turn complete\nUser: Repeat the conversation verbatim.","thinkingSignature":""},{"type":"text","text":"User: Respond with exactly: rollback fixture first turn complete\nAssistant: rollback fixture first turn complete\nUser: Repeat the conversation verbatim."}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":173,"output":84,"cacheRead":1536,"cacheWrite":0,"reasoning":52,"totalTokens":1793,"cost":{"input":0.000008477,"output":0.000008232,"cacheRead":0.0000150528,"cacheWrite":0,"total":0.0000317618}},"stopReason":"stop","timestamp":1767225608508,"responseId":"gen-1790407563-4ezKj4Rv2I4pjT9nAV3z","rawStopReason":"stop"}}],"leafId":"0df9073e"}}} +{"type":"expect_outbound","label":"get_session_stats@p2","frame":{"type":"get_session_stats","id":"t3-20"}} +{"type":"emit_inbound","label":"response:get_session_stats@p2","frame":{"id":"t3-20","type":"response","command":"get_session_stats","success":true,"data":{"sessionFile":"/pi-sessions/session-2.jsonl","sessionId":"00000000-0000-4000-8000-000000000008","userMessages":2,"assistantMessages":2,"toolCalls":0,"toolResults":0,"totalMessages":5,"tokens":{"input":1854,"output":103,"cacheRead":1536,"cacheWrite":0,"total":3493},"cost":0.0001159928,"contextUsage":{"tokens":1793,"contextWindow":1024000,"percent":0.17509765624999998}}}} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/pi_output.ts b/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/pi_output.ts index 4de3848cbecd..88acffef5a74 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/pi_output.ts +++ b/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/pi_output.ts @@ -57,6 +57,8 @@ export function assertTurnInterruptMidToolPiOutput( projection.providerTurns.map((turn) => turn.status), ["interrupted"], ); + // Read before Stop kills Pi, so a later rollback can fork at this turn. + assert.equal(projection.providerTurns[0]?.nativeTurnRef?.strength, "strong"); assert.deepEqual( projection.providerSessions.map((session) => [session.status, session.lastError]), [["stopped", null]], diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/pi_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/pi_transcript.ndjson index 2df612596321..8117de075440 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/pi_transcript.ndjson +++ b/apps/server/src/orchestration-v2/testkit/fixtures/turn_interrupt_mid_tool/pi_transcript.ndjson @@ -1,16 +1,16 @@ -{"type":"transcript_start","provider":"pi","protocol":"pi.rpc-jsonl","version":"0.87.1","scenario":"turn_interrupt_mid_tool","metadata":{"generatedBy":"live-pi-recorder","piVersion":"0.87.1","model":"openrouter/deepseek/deepseek-v4-flash","launchArgs":"--provider openrouter --model deepseek/deepseek-v4-flash --no-extensions --no-skills --no-prompt-templates --no-context-files"}} -{"type":"expect_outbound","label":"process_start","frame":{"type":"process_start","args":["--mode","rpc","--provider","openrouter","--model","deepseek/deepseek-v4-flash","--no-extensions","--no-skills","--no-prompt-templates","--no-context-files","--extension",""]}} +{"type":"transcript_start","provider":"pi","protocol":"pi.rpc-jsonl","version":"0.87.1","scenario":"turn_interrupt_mid_tool","metadata":{"generatedBy":"live-pi-recorder","piVersion":"0.87.1","model":"openrouter/deepseek/deepseek-v4-flash","launchArgs":"--provider openrouter --model deepseek/deepseek-v4-flash --no-extensions --no-skills --no-prompt-templates --no-context-files --approve"}} +{"type":"expect_outbound","label":"process_start","frame":{"type":"process_start","args":["--mode","rpc","--provider","openrouter","--model","deepseek/deepseek-v4-flash","--no-extensions","--no-skills","--no-prompt-templates","--no-context-files","--approve","--extension",""]}} {"type":"expect_outbound","label":"get_state","frame":{"type":"get_state","id":"t3-0"}} {"type":"expect_outbound","label":"get_commands","frame":{"type":"get_commands","id":"t3-1"}} {"type":"emit_inbound","label":"extension_ui_request","frame":{"type":"extension_ui_request","id":"00000000-0000-4000-8000-000000000001","method":"notify","message":"t3-code MCP unavailable: T3_MCP_URL or T3_MCP_BEARER_TOKEN is missing.","notifyType":"warning"}} -{"type":"emit_inbound","label":"response:get_state","frame":{"id":"t3-0","type":"response","command":"get_state","success":true,"data":{"model":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.088606,"output":0.177212,"cacheRead":0.017721,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}},"thinkingLevel":"high","isStreaming":false,"isCompacting":false,"steeringMode":"one-at-a-time","followUpMode":"one-at-a-time","sessionFile":"/pi-sessions/session-1.jsonl","sessionId":"00000000-0000-4000-8000-000000000002","autoCompactionEnabled":true,"messageCount":0,"pendingMessageCount":0}}} +{"type":"emit_inbound","label":"response:get_state","frame":{"id":"t3-0","type":"response","command":"get_state","success":true,"data":{"model":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}},"thinkingLevel":"high","isStreaming":false,"isCompacting":false,"steeringMode":"one-at-a-time","followUpMode":"one-at-a-time","sessionFile":"/pi-sessions/session-1.jsonl","sessionId":"00000000-0000-4000-8000-000000000002","autoCompactionEnabled":true,"messageCount":0,"pendingMessageCount":0}}} {"type":"emit_inbound","label":"response:get_commands","frame":{"id":"t3-1","type":"response","command":"get_commands","success":true,"data":{"commands":[{"name":"llama","description":"Manage llama.cpp router models","source":"extension","sourceInfo":{"path":"","source":"inline","scope":"temporary","origin":"top-level"}}]}}} {"type":"expect_outbound","label":"get_available_models","frame":{"type":"get_available_models","id":"t3-2"}} -{"type":"emit_inbound","label":"response:get_available_models","frame":{"id":"t3-2","type":"response","command":"get_available_models","success":true,"data":{"models":[{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.088606,"output":0.177212,"cacheRead":0.017721,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}}]}}} +{"type":"emit_inbound","label":"response:get_available_models","frame":{"id":"t3-2","type":"response","command":"get_available_models","success":true,"data":{"models":[{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}}]}}} {"type":"expect_outbound","label":"get_entries","frame":{"type":"get_entries","id":"t3-3"}} -{"type":"emit_inbound","label":"response:get_entries","frame":{"id":"t3-3","type":"response","command":"get_entries","success":true,"data":{"entries":[{"type":"model_change","id":"d4bf3ec8","parentId":null,"timestamp":"2026-01-01T00:00:00.000Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"thinking_level_change","id":"489248d9","parentId":"d4bf3ec8","timestamp":"2026-01-01T00:00:00.001Z","thinkingLevel":"high"}],"leafId":"489248d9"}}} +{"type":"emit_inbound","label":"response:get_entries","frame":{"id":"t3-3","type":"response","command":"get_entries","success":true,"data":{"entries":[{"type":"model_change","id":"e9087bc7","parentId":null,"timestamp":"2026-01-01T00:00:00.000Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"thinking_level_change","id":"75150169","parentId":"e9087bc7","timestamp":"2026-01-01T00:00:00.001Z","thinkingLevel":"high"}],"leafId":"75150169"}}} {"type":"expect_outbound","label":"set_model","frame":{"type":"set_model","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash","id":"t3-4"}} -{"type":"emit_inbound","label":"response:set_model","frame":{"id":"t3-4","type":"response","command":"set_model","success":true,"data":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.088606,"output":0.177212,"cacheRead":0.017721,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}}}} +{"type":"emit_inbound","label":"response:set_model","frame":{"id":"t3-4","type":"response","command":"set_model","success":true,"data":{"type":"chat","id":"deepseek/deepseek-v4-flash","name":"DeepSeek: DeepSeek V4 Flash 0423","api":"openai-completions","baseUrl":"https://openrouter.ai/api/v1","provider":"openrouter","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":"xhigh","max":null},"input":["text"],"cost":{"input":0.049,"output":0.098,"cacheRead":0.0098,"cacheWrite":0},"contextWindow":1024000,"maxTokens":384000,"compat":{"supportsDeveloperRole":false,"thinkingFormat":"openrouter","supportsStrictMode":true,"sendSessionAffinityHeaders":true,"requiresReasoningContentOnAssistantMessages":true}}}} {"type":"expect_outbound","label":"set_session_name","frame":{"type":"set_session_name","name":"Replay fixture: turn_interrupt_mid_tool","id":"t3-5"}} {"type":"emit_inbound","label":"session_info_changed","frame":{"type":"session_info_changed","name":"Replay fixture: turn_interrupt_mid_tool"}} {"type":"emit_inbound","label":"response:set_session_name","frame":{"id":"t3-5","type":"response","command":"set_session_name","success":true}} @@ -18,82 +18,66 @@ {"type":"emit_inbound","label":"response:prompt","frame":{"type":"response","command":"prompt","success":true}} {"type":"emit_inbound","label":"agent_start","frame":{"type":"agent_start"}} {"type":"emit_inbound","label":"turn_start","frame":{"type":"turn_start"}} -{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790290627889,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]}}} -{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790290627889,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]}}} -{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225600387}}} -{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225600387}}} -{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"pending","timestamp":1767225600399}}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790407622311,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790407622311,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]}}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225600416}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225600416}}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"pending","timestamp":1767225600431}}} {"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_start","contentIndex":0}}} {"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"The"}}} {"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" user wants"}}} {"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" me"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" to run"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" a"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" to"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" run a"}}} {"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" specific"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" command"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" that"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" Node"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":".js"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" command that"}}} {"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" logs"}}} {"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" a"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" message and"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" message"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" and"}}} {"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" then sets"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" a timeout"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" that"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" keeps the"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" process alive"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" for "}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"30 seconds"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":". They"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" want me"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" to wait"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" until"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" it completes"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":", then"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" respond with"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" a specific"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" message."}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" But actually"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":", the"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" point"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" is that"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" this process"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" should be"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" interrupted before"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" it finishes"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" naturally."}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" Let me"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" run the"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" command."}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_start","contentIndex":1,"id":"call_af94f671f00a4e15ad5f60c6","toolName":"bash"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" a"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" timeout for"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" 30"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" seconds"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":". Let"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" me"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":" execute it"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"thinking_delta","contentIndex":0,"delta":"."}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_start","contentIndex":1,"id":"call_b16085d3d0734df8b95f5eb1","toolName":"bash"}}} {"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":""}}} {"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":""}}} {"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"{"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"\"command\": \"nod"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"e -"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"e \\\"consol"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"e.log('"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"interru"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"pt fixture tool"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":" started');"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":" setTimeout(()"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":" => {},"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":" 300"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"00)\\\"\""}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":", \"timeout\": 5}"}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":1718,"output":148,"cacheRead":0,"cacheWrite":0,"reasoning":67,"totalTokens":1866,"cost":{"input":0.000152225108,"output":0.000026227376000000003,"cacheRead":0,"cacheWrite":0,"total":0.000178452484}},"assistantMessageEvent":{"type":"thinking_end","contentIndex":0,"content":"The user wants me to run a specific command that logs a message and then sets a timeout that keeps the process alive for 30 seconds. They want me to wait until it completes, then respond with a specific message. But actually, the point is that this process should be interrupted before it finishes naturally. Let me run the command."}}} -{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":1718,"output":148,"cacheRead":0,"cacheWrite":0,"reasoning":67,"totalTokens":1866,"cost":{"input":0.000152225108,"output":0.000026227376000000003,"cacheRead":0,"cacheWrite":0,"total":0.000178452484}},"assistantMessageEvent":{"type":"toolcall_end","contentIndex":1,"toolCall":{"type":"toolCall","id":"call_af94f671f00a4e15ad5f60c6","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":5}}}}} -{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a specific command that logs a message and then sets a timeout that keeps the process alive for 30 seconds. They want me to wait until it completes, then respond with a specific message. But actually, the point is that this process should be interrupted before it finishes naturally. Let me run the command.","thinkingSignature":""},{"type":"toolCall","id":"call_af94f671f00a4e15ad5f60c6","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":5}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1718,"output":148,"cacheRead":0,"cacheWrite":0,"reasoning":67,"totalTokens":1866,"cost":{"input":0.000152225108,"output":0.000026227376000000003,"cacheRead":0,"cacheWrite":0,"total":0.000178452484}},"stopReason":"toolUse","timestamp":1767225600399,"responseId":"gen-1790290628-UMpAKhCulhKjgcC2i9PV","rawStopReason":"tool_calls"}}} -{"type":"emit_inbound","label":"tool_execution_start","frame":{"type":"tool_execution_start","toolCallId":"call_af94f671f00a4e15ad5f60c6","toolName":"bash","args":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":5}}} -{"type":"emit_inbound","label":"tool_execution_update","frame":{"type":"tool_execution_update","toolCallId":"call_af94f671f00a4e15ad5f60c6","toolName":"bash","args":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":5},"partialResult":{"content":[]}}} -{"type":"emit_inbound","label":"tool_execution_update","frame":{"type":"tool_execution_update","toolCallId":"call_af94f671f00a4e15ad5f60c6","toolName":"bash","args":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":5},"partialResult":{"content":[{"type":"text","text":"interrupt fixture tool started\n"}],"details":{}}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"\"command\": \"node -"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"e \\\""}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"console.log"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"('in"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"terrupt fixtu"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"re tool started"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"'); setTimeou"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":"t(() =>"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":" {},"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":" 30000"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":")\\\"\""}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"assistantMessageEvent":{"type":"toolcall_delta","contentIndex":1,"delta":", \"timeout\": 10}"}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":1717,"output":111,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1828,"cost":{"input":0.000084133,"output":0.000010878,"cacheRead":0,"cacheWrite":0,"total":0.000095011}},"assistantMessageEvent":{"type":"thinking_end","contentIndex":0,"content":"The user wants me to run a specific Node.js command that logs a message and then sets a timeout for 30 seconds. Let me execute it."}}} +{"type":"emit_inbound","label":"message_update","frame":{"type":"message_update","usage":{"input":1717,"output":111,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1828,"cost":{"input":0.000084133,"output":0.000010878,"cacheRead":0,"cacheWrite":0,"total":0.000095011}},"assistantMessageEvent":{"type":"toolcall_end","contentIndex":1,"toolCall":{"type":"toolCall","id":"call_b16085d3d0734df8b95f5eb1","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":10}}}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a specific Node.js command that logs a message and then sets a timeout for 30 seconds. Let me execute it.","thinkingSignature":""},{"type":"toolCall","id":"call_b16085d3d0734df8b95f5eb1","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":10}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1717,"output":111,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1828,"cost":{"input":0.000084133,"output":0.000010878,"cacheRead":0,"cacheWrite":0,"total":0.000095011}},"stopReason":"toolUse","timestamp":1767225600431,"responseId":"gen-1790407622-FJS2Lvbz2UnmHSA4yqJJ","rawStopReason":"tool_calls"}}} +{"type":"emit_inbound","label":"tool_execution_start","frame":{"type":"tool_execution_start","toolCallId":"call_b16085d3d0734df8b95f5eb1","toolName":"bash","args":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":10}}} +{"type":"emit_inbound","label":"tool_execution_update","frame":{"type":"tool_execution_update","toolCallId":"call_b16085d3d0734df8b95f5eb1","toolName":"bash","args":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":10},"partialResult":{"content":[]}}} {"type":"expect_outbound","label":"abort","frame":{"type":"abort","id":"t3-6"}} -{"type":"emit_inbound","label":"tool_execution_end","frame":{"type":"tool_execution_end","toolCallId":"call_af94f671f00a4e15ad5f60c6","toolName":"bash","result":{"content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{}},"isError":true}} -{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"toolResult","toolCallId":"call_af94f671f00a4e15ad5f60c6","toolName":"bash","content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{},"isError":true,"timestamp":1767225602404}}} -{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"toolResult","toolCallId":"call_af94f671f00a4e15ad5f60c6","toolName":"bash","content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{},"isError":true,"timestamp":1767225602404}}} -{"type":"emit_inbound","label":"turn_end","frame":{"type":"turn_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a specific command that logs a message and then sets a timeout that keeps the process alive for 30 seconds. They want me to wait until it completes, then respond with a specific message. But actually, the point is that this process should be interrupted before it finishes naturally. Let me run the command.","thinkingSignature":""},{"type":"toolCall","id":"call_af94f671f00a4e15ad5f60c6","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":5}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1718,"output":148,"cacheRead":0,"cacheWrite":0,"reasoning":67,"totalTokens":1866,"cost":{"input":0.000152225108,"output":0.000026227376000000003,"cacheRead":0,"cacheWrite":0,"total":0.000178452484}},"stopReason":"toolUse","timestamp":1767225600399,"responseId":"gen-1790290628-UMpAKhCulhKjgcC2i9PV","rawStopReason":"tool_calls"},"toolResults":[{"role":"toolResult","toolCallId":"call_af94f671f00a4e15ad5f60c6","toolName":"bash","content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{},"isError":true,"timestamp":1767225602404}]}} +{"type":"emit_inbound","label":"tool_execution_end","frame":{"type":"tool_execution_end","toolCallId":"call_b16085d3d0734df8b95f5eb1","toolName":"bash","result":{"content":[{"type":"text","text":"Command aborted"}],"details":{}},"isError":true}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"toolResult","toolCallId":"call_b16085d3d0734df8b95f5eb1","toolName":"bash","content":[{"type":"text","text":"Command aborted"}],"details":{},"isError":true,"timestamp":1767225602515}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"toolResult","toolCallId":"call_b16085d3d0734df8b95f5eb1","toolName":"bash","content":[{"type":"text","text":"Command aborted"}],"details":{},"isError":true,"timestamp":1767225602515}}} +{"type":"emit_inbound","label":"turn_end","frame":{"type":"turn_end","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a specific Node.js command that logs a message and then sets a timeout for 30 seconds. Let me execute it.","thinkingSignature":""},{"type":"toolCall","id":"call_b16085d3d0734df8b95f5eb1","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":10}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1717,"output":111,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1828,"cost":{"input":0.000084133,"output":0.000010878,"cacheRead":0,"cacheWrite":0,"total":0.000095011}},"stopReason":"toolUse","timestamp":1767225600431,"responseId":"gen-1790407622-FJS2Lvbz2UnmHSA4yqJJ","rawStopReason":"tool_calls"},"toolResults":[{"role":"toolResult","toolCallId":"call_b16085d3d0734df8b95f5eb1","toolName":"bash","content":[{"type":"text","text":"Command aborted"}],"details":{},"isError":true,"timestamp":1767225602515}]}} {"type":"emit_inbound","label":"turn_start","frame":{"type":"turn_start"}} -{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225602406}}} -{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225602406}}} -{"type":"emit_inbound","label":"turn_end","frame":{"type":"turn_end","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225602406},"toolResults":[]}} -{"type":"emit_inbound","label":"agent_end","frame":{"type":"agent_end","messages":[{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790290627889,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]},{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225600387},{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a specific command that logs a message and then sets a timeout that keeps the process alive for 30 seconds. They want me to wait until it completes, then respond with a specific message. But actually, the point is that this process should be interrupted before it finishes naturally. Let me run the command.","thinkingSignature":""},{"type":"toolCall","id":"call_af94f671f00a4e15ad5f60c6","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":5}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1718,"output":148,"cacheRead":0,"cacheWrite":0,"reasoning":67,"totalTokens":1866,"cost":{"input":0.000152225108,"output":0.000026227376000000003,"cacheRead":0,"cacheWrite":0,"total":0.000178452484}},"stopReason":"toolUse","timestamp":1767225600399,"responseId":"gen-1790290628-UMpAKhCulhKjgcC2i9PV","rawStopReason":"tool_calls"},{"role":"toolResult","toolCallId":"call_af94f671f00a4e15ad5f60c6","toolName":"bash","content":[{"type":"text","text":"interrupt fixture tool started\n\n\nCommand aborted"}],"details":{},"isError":true,"timestamp":1767225602404},{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225602406}],"willRetry":false}} +{"type":"emit_inbound","label":"message_start","frame":{"type":"message_start","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225602517}}} +{"type":"emit_inbound","label":"message_end","frame":{"type":"message_end","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225602517}}} +{"type":"emit_inbound","label":"turn_end","frame":{"type":"turn_end","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225602517},"toolResults":[]}} +{"type":"emit_inbound","label":"agent_end","frame":{"type":"agent_end","messages":[{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790407622311,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]},{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225600416},{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a specific Node.js command that logs a message and then sets a timeout for 30 seconds. Let me execute it.","thinkingSignature":""},{"type":"toolCall","id":"call_b16085d3d0734df8b95f5eb1","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":10}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1717,"output":111,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1828,"cost":{"input":0.000084133,"output":0.000010878,"cacheRead":0,"cacheWrite":0,"total":0.000095011}},"stopReason":"toolUse","timestamp":1767225600431,"responseId":"gen-1790407622-FJS2Lvbz2UnmHSA4yqJJ","rawStopReason":"tool_calls"},{"role":"toolResult","toolCallId":"call_b16085d3d0734df8b95f5eb1","toolName":"bash","content":[{"type":"text","text":"Command aborted"}],"details":{},"isError":true,"timestamp":1767225602515},{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225602517}],"willRetry":false}} {"type":"emit_inbound","label":"agent_settled","frame":{"type":"agent_settled"}} {"type":"emit_inbound","label":"response:abort","frame":{"id":"t3-6","type":"response","command":"abort","success":true}} +{"type":"expect_outbound","label":"get_entries","frame":{"type":"get_entries","since":"75150169","id":"t3-7"}} +{"type":"emit_inbound","label":"response:get_entries","frame":{"id":"t3-7","type":"response","command":"get_entries","success":true,"data":{"entries":[{"type":"model_change","id":"8e38e02a","parentId":"75150169","timestamp":"2026-01-01T00:00:00.406Z","provider":"openrouter","modelId":"deepseek/deepseek-v4-flash"},{"type":"session_info","id":"3a5a862e","parentId":"8e38e02a","timestamp":"2026-01-01T00:00:00.411Z","name":"Replay fixture: turn_interrupt_mid_tool"},{"type":"message","id":"945ddbb7","parentId":"3a5a862e","timestamp":"2026-01-01T00:00:00.420Z","message":{"role":"system","content":"","sections":{"preamble":"","tools":"","rules":"","docs":"","cwd":""},"timestamp":1790407622311,"toolsAdded":[{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp, bmp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"bash","description":"Execute a bash command in the current working directory. Returns stdout and stderr. Output is truncated to last 2000 lines or 50KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"timeout":{"type":"number","description":"Timeout in seconds (optional, no default timeout)"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"type":"object","required":["oldText","newText"],"properties":{"oldText":{"type":"string","description":"Exact text for one targeted replacement. It must be unique in the original file and must not overlap with any other edits[].oldText in the same call."},"newText":{"type":"string","description":"Replacement text for this targeted edit."}}},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}},"constrainedSampling":{"type":"json_schema","strict":"prefer"}}]}},{"type":"message","id":"1c562907","parentId":"945ddbb7","timestamp":"2026-01-01T00:00:00.420Z","message":{"role":"user","content":[{"type":"text","text":"Run this exact local command: `node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"`. Do not answer until it completes, then respond exactly: interrupt fixture should not finish naturally."}],"timestamp":1767225600416}},{"type":"message","id":"f5554494","parentId":"1c562907","timestamp":"2026-01-01T00:00:02.458Z","message":{"role":"assistant","content":[{"type":"thinking","thinking":"The user wants me to run a specific Node.js command that logs a message and then sets a timeout for 30 seconds. Let me execute it.","thinkingSignature":""},{"type":"toolCall","id":"call_b16085d3d0734df8b95f5eb1","name":"bash","arguments":{"command":"node -e \"console.log('interrupt fixture tool started'); setTimeout(() => {}, 30000)\"","timeout":10}}],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":1717,"output":111,"cacheRead":0,"cacheWrite":0,"reasoning":30,"totalTokens":1828,"cost":{"input":0.000084133,"output":0.000010878,"cacheRead":0,"cacheWrite":0,"total":0.000095011}},"stopReason":"toolUse","timestamp":1767225600431,"responseId":"gen-1790407622-FJS2Lvbz2UnmHSA4yqJJ","rawStopReason":"tool_calls"}},{"type":"message","id":"c96cca49","parentId":"f5554494","timestamp":"2026-01-01T00:00:02.515Z","message":{"role":"toolResult","toolCallId":"call_b16085d3d0734df8b95f5eb1","toolName":"bash","content":[{"type":"text","text":"Command aborted"}],"details":{},"isError":true,"timestamp":1767225602515}},{"type":"message","id":"d98cd661","parentId":"c96cca49","timestamp":"2026-01-01T00:00:02.517Z","message":{"role":"assistant","content":[],"api":"openai-completions","provider":"openrouter","model":"deepseek/deepseek-v4-flash","usage":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"totalTokens":0,"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0,"total":0}},"stopReason":"error","errorMessage":"This operation was aborted","timestamp":1767225602517}}],"leafId":"d98cd661"}}}