@code-yeongyu/senpi-agent-core 2026.9.7 → 2026.9.9-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +2 -2
- package/dist/agent-loop.js.map +1 -1
- package/dist/assistant-terminal-state.d.ts +7 -0
- package/dist/assistant-terminal-state.d.ts.map +1 -1
- package/dist/assistant-terminal-state.js +19 -0
- package/dist/assistant-terminal-state.js.map +1 -1
- package/dist/empty-assistant-recovery.d.ts.map +1 -1
- package/dist/empty-assistant-recovery.js +24 -16
- package/dist/empty-assistant-recovery.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/agent-loop.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIN,KAAK,OAAO,EAEZ,WAAW,EAIX,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIN,KAAK,OAAO,EAEZ,WAAW,EAIX,MAAM,uBAAuB,CAAC;AAW/B,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EAEf,YAAY,EACZ,SAAS,EACT,aAAa,EAEb,QAAQ,EACR,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAiBzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAwBzC;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AAmBD,qBAAa,uBAAwB,SAAQ,KAAK;gBACrC,SAAS,EAAE,MAAM;CAM7B;AA2ND,uGAAuG;AACvG,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,GAAG,kBAAkB,CAAC,EAClE,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CAIlB;AA+mBD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,aAAa,CAYrG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,qBAAqB,CAOpG"}
|
package/dist/agent-loop.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Transforms to Message[] only at the LLM call boundary.
|
|
4
4
|
*/
|
|
5
5
|
import { EventStream, isCursorExecResolved, validateToolArguments, } from "@earendil-works/pi-ai";
|
|
6
|
-
import { createTerminalFailureAssistantMessage, isStreamIdleTimeoutError, normalizeTerminalAssistantMessage, promoteStopWithPendingToolCalls, shouldFinalizeIdleAsStop, shouldTerminateAssistantTurn, } from "./assistant-terminal-state.js";
|
|
6
|
+
import { createTerminalFailureAssistantMessage, demoteToolUseWithoutToolCalls, isStreamIdleTimeoutError, normalizeTerminalAssistantMessage, promoteStopWithPendingToolCalls, shouldFinalizeIdleAsStop, shouldTerminateAssistantTurn, } from "./assistant-terminal-state.js";
|
|
7
7
|
import { getDefaultStreamFn, withEmptyAssistantRecovery } from "./stream-fn.js";
|
|
8
8
|
/**
|
|
9
9
|
* Start an agent loop with a new prompt message.
|
|
@@ -154,7 +154,7 @@ async function runLoop(initialContext, newMessages, initialConfig, signal, emit,
|
|
|
154
154
|
}
|
|
155
155
|
: config;
|
|
156
156
|
const streamed = await streamAssistantResponse(currentContext, requestConfig, signal, emit, withEmptyAssistantRecovery(requestConfig.model, streamFunction), isInitialProviderRequest ? config.timeoutMs : requestConfig.timeoutMs);
|
|
157
|
-
const message = promoteStopWithPendingToolCalls(streamed.message);
|
|
157
|
+
const message = demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message));
|
|
158
158
|
const providerToolResults = streamed.providerToolResults;
|
|
159
159
|
newMessages.push(message);
|
|
160
160
|
const toolResults = [];
|
package/dist/agent-loop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent loop that works with AgentMessage throughout.\n * Transforms to Message[] only at the LLM call boundary.\n */\n\nimport {\n\ttype AssistantMessage,\n\ttype AssistantMessageEvent,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\ttype CursorExecResolvedCarrier,\n\tEventStream,\n\tisCursorExecResolved,\n\ttype ToolResultMessage,\n\tvalidateToolArguments,\n} from \"@earendil-works/pi-ai\";\nimport {\n\tcreateTerminalFailureAssistantMessage,\n\tisStreamIdleTimeoutError,\n\tnormalizeTerminalAssistantMessage,\n\tpromoteStopWithPendingToolCalls,\n\tshouldFinalizeIdleAsStop,\n\tshouldTerminateAssistantTurn,\n} from \"./assistant-terminal-state.ts\";\nimport { getDefaultStreamFn, withEmptyAssistantRecovery } from \"./stream-fn.ts\";\nimport type {\n\tAgentContext,\n\tAgentEvent,\n\tAgentLoopConfig,\n\tAgentLoopTurnUpdate,\n\tAgentMessage,\n\tAgentTool,\n\tAgentToolCall,\n\tAgentToolResult,\n\tStreamFn,\n} from \"./types.ts\";\n\nexport type AgentEventSink = (event: AgentEvent) => Promise<void> | void;\n\n/**\n * Start an agent loop with a new prompt message.\n * The prompt is added to the context and events are emitted for it.\n */\nexport function agentLoop(\n\tprompts: AgentMessage[],\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstreamFn: StreamFn,\n): EventStream<AgentEvent, AgentMessage[]> {\n\tconst stream = createAgentStream();\n\n\tvoid runAgentLoop(\n\t\tprompts,\n\t\tcontext,\n\t\tconfig,\n\t\tasync (event) => {\n\t\t\tstream.push(event);\n\t\t},\n\t\tsignal,\n\t\tstreamFn,\n\t).then((messages) => {\n\t\tstream.end(messages);\n\t});\n\n\treturn stream;\n}\n\n/**\n * Continue an agent loop from the current context without adding a new message.\n * Used for retries - context already has user message or tool results.\n *\n * **Important:** The last message in context must convert to a `user` or `toolResult` message\n * via `convertToLlm`. If it doesn't, the LLM provider will reject the request.\n * This cannot be validated here since `convertToLlm` is only called once per turn.\n */\nexport function agentLoopContinue(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstreamFn: StreamFn,\n): EventStream<AgentEvent, AgentMessage[]> {\n\tif (context.messages.length === 0) {\n\t\tthrow new Error(\"Cannot continue: no messages in context\");\n\t}\n\n\tif (context.messages[context.messages.length - 1].role === \"assistant\") {\n\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t}\n\n\tconst stream = createAgentStream();\n\n\tvoid runAgentLoopContinue(\n\t\tcontext,\n\t\tconfig,\n\t\tasync (event) => {\n\t\t\tstream.push(event);\n\t\t},\n\t\tsignal,\n\t\tstreamFn,\n\t).then((messages) => {\n\t\tstream.end(messages);\n\t});\n\n\treturn stream;\n}\n\nexport async function runAgentLoop(\n\tprompts: AgentMessage[],\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\temit: AgentEventSink,\n\tsignal: AbortSignal | undefined,\n\tstreamFn: StreamFn,\n): Promise<AgentMessage[]> {\n\tconst newMessages: AgentMessage[] = [...prompts];\n\tconst currentContext: AgentContext = {\n\t\t...context,\n\t\tmessages: [...context.messages, ...prompts],\n\t};\n\n\tawait emit({ type: \"agent_start\" });\n\tawait emit({ type: \"turn_start\" });\n\tfor (const prompt of prompts) {\n\t\tawait emit({ type: \"message_start\", message: prompt });\n\t\tawait emit({ type: \"message_end\", message: prompt });\n\t}\n\n\tawait runLoop(currentContext, newMessages, config, signal, emit, streamFn ?? getDefaultStreamFn());\n\treturn newMessages;\n}\n\nexport async function runAgentLoopContinue(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\temit: AgentEventSink,\n\tsignal: AbortSignal | undefined,\n\tstreamFn: StreamFn,\n): Promise<AgentMessage[]> {\n\tif (context.messages.length === 0) {\n\t\tthrow new Error(\"Cannot continue: no messages in context\");\n\t}\n\n\tif (context.messages[context.messages.length - 1].role === \"assistant\") {\n\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t}\n\n\tconst newMessages: AgentMessage[] = [];\n\tconst currentContext: AgentContext = { ...context };\n\n\tawait emit({ type: \"agent_start\" });\n\tawait emit({ type: \"turn_start\" });\n\n\tawait runLoop(currentContext, newMessages, config, signal, emit, streamFn ?? getDefaultStreamFn());\n\treturn newMessages;\n}\n\nfunction createAgentStream(): EventStream<AgentEvent, AgentMessage[]> {\n\treturn new EventStream<AgentEvent, AgentMessage[]>(\n\t\t(event: AgentEvent) => event.type === \"agent_end\",\n\t\t(event: AgentEvent) => (event.type === \"agent_end\" ? event.messages : []),\n\t);\n}\n\nclass StreamIdleTimeoutError extends Error {\n\tconstructor(timeoutMs: number) {\n\t\tsuper(`Idle timeout waiting for provider stream after ${timeoutMs}ms`);\n\t\tthis.name = \"StreamIdleTimeoutError\";\n\t}\n}\n\n// The wording must keep matching the retryable-error classifier\n// (\"timed out\" in packages/ai/src/utils/retry.ts) so a dead stream start is\n// retried instead of dead-ending the session.\nexport class StreamStartTimeoutError extends Error {\n\tconstructor(timeoutMs: number) {\n\t\tsuper(\n\t\t\t`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs — retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`,\n\t\t);\n\t\tthis.name = \"StreamStartTimeoutError\";\n\t}\n}\n\n/**\n * Main loop logic shared by agentLoop and agentLoopContinue.\n */\nasync function runLoop(\n\tinitialContext: AgentContext,\n\tnewMessages: AgentMessage[],\n\tinitialConfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n\tstreamFunction: StreamFn,\n): Promise<void> {\n\tlet currentContext = initialContext;\n\tlet config = initialConfig;\n\tlet firstTurn = true;\n\tlet firstProviderRequest = true;\n\tlet drainedTerminatingQueue: \"steering\" | \"followUp\" | undefined;\n\tlet turnStartAlreadyEmitted = false;\n\tconst refreshTerminatingQueueDrain = async (): Promise<void> => {\n\t\tif (!drainedTerminatingQueue || !config.restorePendingMessages) return;\n\t\tawait config.restorePendingMessages(drainedTerminatingQueue, pendingMessages);\n\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\tdrainedTerminatingQueue = pendingMessages.length > 0 ? \"steering\" : undefined;\n\t\tif (pendingMessages.length === 0) {\n\t\t\tpendingMessages = (await config.getFollowUpMessages?.()) || [];\n\t\t\tdrainedTerminatingQueue = pendingMessages.length > 0 ? \"followUp\" : undefined;\n\t\t}\n\t};\n\t// Check for steering messages at start (user may have typed while waiting)\n\tlet pendingMessages: AgentMessage[] = (await config.getSteeringMessages?.()) || [];\n\n\t// Outer loop: continues when queued follow-up messages arrive after agent would stop\n\twhile (true) {\n\t\tlet hasMoreToolCalls = true;\n\n\t\t// Inner loop: process tool calls and steering messages\n\t\twhile (hasMoreToolCalls || pendingMessages.length > 0) {\n\t\t\tif (turnStartAlreadyEmitted) {\n\t\t\t\tturnStartAlreadyEmitted = false;\n\t\t\t} else if (!firstTurn) {\n\t\t\t\tawait emit({ type: \"turn_start\" });\n\t\t\t} else {\n\t\t\t\tfirstTurn = false;\n\t\t\t}\n\t\t\tif (drainedTerminatingQueue) {\n\t\t\t\tawait refreshTerminatingQueueDrain();\n\t\t\t\tif (pendingMessages.length === 0) {\n\t\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdrainedTerminatingQueue = undefined;\n\t\t\t}\n\n\t\t\t// Process pending messages (inject before next assistant response)\n\t\t\tif (pendingMessages.length > 0) {\n\t\t\t\tfor (const message of pendingMessages) {\n\t\t\t\t\tawait emit({ type: \"message_start\", message });\n\t\t\t\t\tawait emit({ type: \"message_end\", message });\n\t\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t\t\tnewMessages.push(message);\n\t\t\t\t}\n\t\t\t\tpendingMessages = [];\n\t\t\t}\n\n\t\t\t// Stream assistant response\n\t\t\tconst isInitialProviderRequest = firstProviderRequest;\n\t\t\tfirstProviderRequest = false;\n\t\t\tconst requestConfig = isInitialProviderRequest\n\t\t\t\t? {\n\t\t\t\t\t\t...config,\n\t\t\t\t\t\ttimeoutMs: config.initialRequestTimeoutMs ?? config.timeoutMs,\n\t\t\t\t\t\tstreamStartTimeoutMs: config.initialRequestStreamStartTimeoutMs ?? config.streamStartTimeoutMs,\n\t\t\t\t\t}\n\t\t\t\t: config;\n\t\t\tconst streamed = await streamAssistantResponse(\n\t\t\t\tcurrentContext,\n\t\t\t\trequestConfig,\n\t\t\t\tsignal,\n\t\t\t\temit,\n\t\t\t\twithEmptyAssistantRecovery(requestConfig.model, streamFunction),\n\t\t\t\tisInitialProviderRequest ? config.timeoutMs : requestConfig.timeoutMs,\n\t\t\t);\n\t\t\tconst message = promoteStopWithPendingToolCalls(streamed.message);\n\t\t\tconst providerToolResults = streamed.providerToolResults;\n\t\t\tnewMessages.push(message);\n\t\t\tconst toolResults: ToolResultMessage[] = [];\n\t\t\tfor (const result of providerToolResults) {\n\t\t\t\tawait emit({ type: \"message_start\", message: result });\n\t\t\t\tawait emit({ type: \"message_end\", message: result });\n\t\t\t\tcurrentContext.messages.push(result);\n\t\t\t\tnewMessages.push(result);\n\t\t\t\ttoolResults.push(result);\n\t\t\t}\n\n\t\t\tif (shouldTerminateAssistantTurn(message)) {\n\t\t\t\tawait emit({ type: \"turn_end\", message, toolResults });\n\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check for tool calls\n\t\t\tconst toolCalls = message.content.filter(\n\t\t\t\t(c): c is AgentToolCall => c.type === \"toolCall\" && !isCursorExecResolved(c as CursorExecResolvedCarrier),\n\t\t\t);\n\n\t\t\thasMoreToolCalls = false;\n\t\t\tlet toolBatchTerminated = false;\n\t\t\tif (toolCalls.length > 0) {\n\t\t\t\t// A \"length\" stop means the output was cut off by the token limit, so\n\t\t\t\t// every tool call in the message may carry truncated arguments. Fail\n\t\t\t\t// them all instead of executing potentially borked calls.\n\t\t\t\tconst executedToolBatch =\n\t\t\t\t\tmessage.stopReason === \"length\"\n\t\t\t\t\t\t? await failToolCallsFromTruncatedMessage(toolCalls, emit)\n\t\t\t\t\t\t: await executeToolCalls(currentContext, message, config, signal, emit);\n\t\t\t\ttoolResults.push(...executedToolBatch.messages);\n\t\t\t\ttoolBatchTerminated = executedToolBatch.terminate;\n\t\t\t\thasMoreToolCalls = !executedToolBatch.terminate;\n\n\t\t\t\tfor (const result of executedToolBatch.messages) {\n\t\t\t\t\tcurrentContext.messages.push(result);\n\t\t\t\t\tnewMessages.push(result);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait emit({ type: \"turn_end\", message, toolResults });\n\t\t\tif (signal?.aborted) {\n\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextTurnContext = {\n\t\t\t\tmessage,\n\t\t\t\ttoolResults,\n\t\t\t\tcontext: currentContext,\n\t\t\t\tnewMessages,\n\t\t\t};\n\t\t\tif (await config.shouldStopAfterTurn?.(nextTurnContext)) {\n\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (toolBatchTerminated) {\n\t\t\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\t\t\tif (pendingMessages.length > 0) drainedTerminatingQueue = \"steering\";\n\t\t\t\tif (pendingMessages.length === 0) {\n\t\t\t\t\tpendingMessages = (await config.getFollowUpMessages?.()) || [];\n\t\t\t\t\tif (pendingMessages.length > 0) drainedTerminatingQueue = \"followUp\";\n\t\t\t\t}\n\t\t\t\tif (pendingMessages.length === 0) {\n\t\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Give queue owners a boundary before preparation refreshes the drained\n\t\t\t\t// snapshot, so a clear or replacement wins before admission.\n\t\t\t\tawait emit({ type: \"turn_start\" });\n\t\t\t\tturnStartAlreadyEmitted = true;\n\t\t\t}\n\n\t\t\tlet nextTurnSnapshot: AgentLoopTurnUpdate | undefined;\n\t\t\ttry {\n\t\t\t\tnextTurnSnapshot = await config.prepareNextTurn?.(nextTurnContext);\n\t\t\t} catch (error) {\n\t\t\t\tif (drainedTerminatingQueue)\n\t\t\t\t\tawait config.restorePendingMessages?.(drainedTerminatingQueue, pendingMessages);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (nextTurnSnapshot) {\n\t\t\t\tcurrentContext = nextTurnSnapshot.context ?? currentContext;\n\t\t\t\tconfig = {\n\t\t\t\t\t...config,\n\t\t\t\t\tmodel: nextTurnSnapshot.model ?? config.model,\n\t\t\t\t\treasoning:\n\t\t\t\t\t\tnextTurnSnapshot.thinkingLevel === undefined\n\t\t\t\t\t\t\t? config.reasoning\n\t\t\t\t\t\t\t: nextTurnSnapshot.thinkingLevel === \"off\"\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: nextTurnSnapshot.thinkingLevel,\n\t\t\t\t\tthinkingSelection:\n\t\t\t\t\t\tnextTurnSnapshot.thinkingSelection === undefined\n\t\t\t\t\t\t\t? config.thinkingSelection\n\t\t\t\t\t\t\t: (nextTurnSnapshot.thinkingSelection ?? undefined),\n\t\t\t\t\tabortServerSideFallback: nextTurnSnapshot.abortServerSideFallback ?? config.abortServerSideFallback,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (signal?.aborted) {\n\t\t\t\tif (drainedTerminatingQueue)\n\t\t\t\t\tawait config.restorePendingMessages?.(drainedTerminatingQueue, pendingMessages);\n\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (drainedTerminatingQueue) {\n\t\t\t\tawait refreshTerminatingQueueDrain();\n\t\t\t\tif (pendingMessages.length === 0) {\n\t\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdrainedTerminatingQueue = undefined;\n\t\t\t}\n\t\t\tif (!toolBatchTerminated) {\n\t\t\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\t\t}\n\t\t}\n\n\t\t// Agent would stop here. Check for follow-up messages.\n\t\tconst followUpMessages = (await config.getFollowUpMessages?.()) || [];\n\t\tif (followUpMessages.length > 0) {\n\t\t\t// Set as pending so inner loop processes them\n\t\t\tpendingMessages = followUpMessages;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// No more messages, exit\n\t\tbreak;\n\t}\n\n\tawait emit({ type: \"agent_end\", messages: newMessages });\n}\n\n/** Build the provider context using the same transform and conversion pipeline as an agent request. */\nexport async function buildProviderContext(\n\tcontext: AgentContext,\n\tconfig: Pick<AgentLoopConfig, \"convertToLlm\" | \"transformContext\">,\n\tsignal?: AbortSignal,\n): Promise<Context> {\n\tlet messages = context.messages;\n\tif (config.transformContext) messages = await config.transformContext(messages, signal);\n\treturn { systemPrompt: context.systemPrompt, messages: await config.convertToLlm(messages), tools: context.tools };\n}\n\n/**\n * Stream an assistant response from the LLM.\n * This is where AgentMessage[] gets transformed to Message[] for the LLM.\n */\nasync function streamAssistantResponse(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n\tstreamFunction: StreamFn,\n\tstreamIdleTimeoutMs: number | undefined,\n): Promise<{\n\tmessage: AssistantMessage;\n\tproviderToolResults: ToolResultMessage[];\n}> {\n\tlet partialMessage: AssistantMessage | null = null;\n\tlet addedPartial = false;\n\t// Tool results delivered by a provider that executes tools mid-stream\n\t// (Cursor's exec channel). Buffered here and appended by the caller right\n\t// after the assistant message so pairs stay adjacent in the transcript.\n\tconst providerToolResults: ToolResultMessage[] = [];\n\tconst thinkingTiming = new Map<number, { startedAt: number; endedAt?: number }>();\n\n\tfunction propagateThinkingTiming(finalMessage: AssistantMessage): void {\n\t\tfor (const timing of thinkingTiming.values()) {\n\t\t\tif (timing.endedAt === undefined) timing.endedAt = Date.now();\n\t\t}\n\t\tfor (const [contentIndex, timing] of thinkingTiming) {\n\t\t\tconst block = finalMessage.content[contentIndex];\n\t\t\tif (block?.type !== \"thinking\") continue;\n\t\t\tblock.startedAt = timing.startedAt;\n\t\t\tblock.endedAt = timing.endedAt;\n\t\t}\n\t}\n\n\t// Dedicated controller for the provider request so the loop can tear the\n\t// request down itself (idle timeout), not only when the caller aborts.\n\tconst requestAbortController = new AbortController();\n\tlet detachCallerAbort: (() => void) | undefined;\n\tif (signal !== undefined) {\n\t\tif (signal.aborted) {\n\t\t\trequestAbortController.abort(signal.reason);\n\t\t} else {\n\t\t\tconst onCallerAbort = () => requestAbortController.abort(signal.reason);\n\t\t\tsignal.addEventListener(\"abort\", onCallerAbort, { once: true });\n\t\t\tdetachCallerAbort = () => signal.removeEventListener(\"abort\", onCallerAbort);\n\t\t}\n\t}\n\n\ttry {\n\t\tconst llmContext = await buildProviderContext(context, config, signal);\n\n\t\t// Resolve API key (important for expiring tokens)\n\t\tconst resolvedApiKey =\n\t\t\t(config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\n\t\tconst response = await streamFunction(config.model, llmContext, {\n\t\t\t...config,\n\t\t\tstreamKind: \"main\",\n\t\t\tapiKey: resolvedApiKey,\n\t\t\tsignal: requestAbortController.signal,\n\t\t\t// Cursor exec bridging (ignored by every other provider): handlers\n\t\t\t// execute mid-stream; their paired results buffer here.\n\t\t\t...(config.cursorExecHandlers\n\t\t\t\t? {\n\t\t\t\t\t\texecHandlers:\n\t\t\t\t\t\t\ttypeof config.cursorExecHandlers === \"function\"\n\t\t\t\t\t\t\t\t? config.cursorExecHandlers(signal ?? requestAbortController.signal)\n\t\t\t\t\t\t\t\t: config.cursorExecHandlers,\n\t\t\t\t\t\tonToolResult: (result: ToolResultMessage) => {\n\t\t\t\t\t\t\tproviderToolResults.push(result);\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t});\n\n\t\tconst iterator = response[Symbol.asyncIterator]();\n\t\tconst eventReader = createAssistantEventReader(\n\t\t\titerator,\n\t\t\tstreamIdleTimeoutMs,\n\t\t\trequestAbortController.signal,\n\t\t\t(error) => requestAbortController.abort(error),\n\t\t\tconfig.streamStartTimeoutMs,\n\t\t\tresponse,\n\t\t);\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst next = await eventReader.next();\n\t\t\t\tif (next.done) break;\n\t\t\t\tconst event = next.value;\n\t\t\t\tswitch (event.type) {\n\t\t\t\t\tcase \"start\":\n\t\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\t\tcontext.messages.push(partialMessage);\n\t\t\t\t\t\taddedPartial = true;\n\t\t\t\t\t\tawait emit({\n\t\t\t\t\t\t\ttype: \"message_start\",\n\t\t\t\t\t\t\tmessage: { ...partialMessage },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"text_start\":\n\t\t\t\t\tcase \"text_delta\":\n\t\t\t\t\tcase \"text_end\":\n\t\t\t\t\tcase \"thinking_start\":\n\t\t\t\t\tcase \"thinking_delta\":\n\t\t\t\t\tcase \"thinking_end\":\n\t\t\t\t\tcase \"toolcall_start\":\n\t\t\t\t\tcase \"toolcall_delta\":\n\t\t\t\t\tcase \"toolcall_end\":\n\t\t\t\t\t\tif (partialMessage) {\n\t\t\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tevent.type === \"thinking_start\" ||\n\t\t\t\t\t\t\t\tevent.type === \"thinking_delta\" ||\n\t\t\t\t\t\t\t\tevent.type === \"thinking_end\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tlet timing = thinkingTiming.get(event.contentIndex);\n\t\t\t\t\t\t\t\tif (event.type === \"thinking_start\" && timing === undefined) {\n\t\t\t\t\t\t\t\t\ttiming = { startedAt: Date.now() };\n\t\t\t\t\t\t\t\t\tthinkingTiming.set(event.contentIndex, timing);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (event.type === \"thinking_end\" && timing !== undefined) timing.endedAt = Date.now();\n\t\t\t\t\t\t\t\tconst block = partialMessage.content[event.contentIndex];\n\t\t\t\t\t\t\t\tif (block?.type === \"thinking\" && timing !== undefined) {\n\t\t\t\t\t\t\t\t\tblock.startedAt = timing.startedAt;\n\t\t\t\t\t\t\t\t\tif (timing.endedAt !== undefined) block.endedAt = timing.endedAt;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontext.messages[context.messages.length - 1] = partialMessage;\n\t\t\t\t\t\t\tawait emit({\n\t\t\t\t\t\t\t\ttype: \"message_update\",\n\t\t\t\t\t\t\t\tassistantMessageEvent: event,\n\t\t\t\t\t\t\t\tmessage: { ...partialMessage },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"done\":\n\t\t\t\t\tcase \"error\": {\n\t\t\t\t\t\tconst finalMessage = normalizeTerminalAssistantMessage(await response.result(), event);\n\t\t\t\t\t\tpropagateThinkingTiming(finalMessage);\n\t\t\t\t\t\tif (addedPartial) {\n\t\t\t\t\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.messages.push(finalMessage);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!addedPartial) {\n\t\t\t\t\t\t\tawait emit({\n\t\t\t\t\t\t\t\ttype: \"message_start\",\n\t\t\t\t\t\t\t\tmessage: { ...finalMessage },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait emit({ type: \"message_end\", message: finalMessage });\n\t\t\t\t\t\treturn { message: finalMessage, providerToolResults };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\teventReader.dispose();\n\t\t}\n\n\t\tconst finalMessage = await response.result();\n\t\tpropagateThinkingTiming(finalMessage);\n\t\tif (addedPartial) {\n\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t} else {\n\t\t\tcontext.messages.push(finalMessage);\n\t\t\tawait emit({ type: \"message_start\", message: { ...finalMessage } });\n\t\t}\n\t\tawait emit({ type: \"message_end\", message: finalMessage });\n\t\treturn { message: finalMessage, providerToolResults };\n\t} catch (error) {\n\t\tif (isStreamIdleTimeoutError(error) && shouldFinalizeIdleAsStop(partialMessage, providerToolResults)) {\n\t\t\tconst finalMessage: AssistantMessage = {\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: partialMessage?.content ?? [{ type: \"text\", text: \"\" }],\n\t\t\t\tapi: partialMessage?.api ?? config.model.api,\n\t\t\t\tprovider: partialMessage?.provider ?? config.model.provider,\n\t\t\t\tmodel: partialMessage?.model ?? config.model.id,\n\t\t\t\tresponseModel: partialMessage?.responseModel,\n\t\t\t\tresponseId: partialMessage?.responseId,\n\t\t\t\tdiagnostics: partialMessage?.diagnostics,\n\t\t\t\tusage: partialMessage?.usage ?? {\n\t\t\t\t\tinput: 0,\n\t\t\t\t\toutput: 0,\n\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t},\n\t\t\t\tstopReason: \"stop\",\n\t\t\t\ttimestamp: partialMessage?.timestamp ?? Date.now(),\n\t\t\t};\n\t\t\tpropagateThinkingTiming(finalMessage);\n\t\t\tif (addedPartial) {\n\t\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t\t} else {\n\t\t\t\tcontext.messages.push(finalMessage);\n\t\t\t\tawait emit({ type: \"message_start\", message: { ...finalMessage } });\n\t\t\t}\n\t\t\tawait emit({ type: \"message_end\", message: finalMessage });\n\t\t\treturn { message: finalMessage, providerToolResults };\n\t\t}\n\t\tconst finalMessage = createTerminalFailureAssistantMessage(\n\t\t\tconfig.model,\n\t\t\tsignal?.aborted ? \"aborted\" : \"error\",\n\t\t\terror,\n\t\t\tpartialMessage,\n\t\t);\n\t\tpropagateThinkingTiming(finalMessage);\n\t\tif (addedPartial) {\n\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t} else {\n\t\t\tcontext.messages.push(finalMessage);\n\t\t\tawait emit({ type: \"message_start\", message: { ...finalMessage } });\n\t\t}\n\t\tawait emit({ type: \"message_end\", message: finalMessage });\n\t\treturn { message: finalMessage, providerToolResults };\n\t} finally {\n\t\trequestAbortController.abort();\n\t\tdetachCallerAbort?.();\n\t}\n}\n\nconst ABORTED = Symbol(\"aborted\");\n\ntype AssistantEventReader = {\n\tnext(): Promise<IteratorResult<AssistantMessageEvent>>;\n\tdispose(): void;\n};\n\nfunction abortError(reason: unknown): Error {\n\treturn reason instanceof Error ? reason : new Error(\"Request was aborted\");\n}\n\nfunction closeAssistantIterator(iterator: AsyncIterator<AssistantMessageEvent>): void {\n\tvoid Promise.resolve(iterator.return?.()).catch(() => undefined);\n}\n\nfunction normalizeTimeoutMs(timeoutMs: number | undefined): number | undefined {\n\treturn typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : undefined;\n}\n\nfunction createAssistantEventReader(\n\titerator: AsyncIterator<AssistantMessageEvent>,\n\ttimeoutMs: number | undefined,\n\tsignal: AbortSignal | undefined,\n\tonIdleTimeout?: (error: Error) => void,\n\tstreamStartTimeoutMs?: number,\n\tstream?: Pick<AssistantMessageEventStream, \"hasPendingLocalWork\">,\n): AssistantEventReader {\n\tconst idleTimeoutMs = normalizeTimeoutMs(timeoutMs);\n\tconst startTimeoutMs = normalizeTimeoutMs(streamStartTimeoutMs);\n\tlet sawFirstEvent = false;\n\tlet removeAbortListener: (() => void) | undefined;\n\tlet abortPromise: Promise<typeof ABORTED> | undefined;\n\n\tif (signal !== undefined) {\n\t\tif (signal.aborted) {\n\t\t\tabortPromise = Promise.resolve(ABORTED);\n\t\t} else {\n\t\t\tabortPromise = new Promise<typeof ABORTED>((resolve) => {\n\t\t\t\tconst abortHandler = () => resolve(ABORTED);\n\t\t\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t\t\tremoveAbortListener = () => signal.removeEventListener(\"abort\", abortHandler);\n\t\t\t});\n\t\t}\n\t}\n\n\treturn {\n\t\tnext: async () => {\n\t\t\tif (signal?.aborted) {\n\t\t\t\tcloseAssistantIterator(iterator);\n\t\t\t\treturn Promise.reject(abortError(signal.reason));\n\t\t\t}\n\t\t\t// The start bound applies only until the provider proves the request is\n\t\t\t// alive with its first event; afterwards the idle bound governs as before.\n\t\t\tconst useStartBound = !sawFirstEvent && startTimeoutMs !== undefined;\n\t\t\tconst readTimeoutMs = useStartBound ? startTimeoutMs : idleTimeoutMs;\n\t\t\tconst makeTimeoutError = useStartBound\n\t\t\t\t? (ms: number) => new StreamStartTimeoutError(ms)\n\t\t\t\t: (ms: number) => new StreamIdleTimeoutError(ms);\n\t\t\tconst result = await readNextAssistantEvent(\n\t\t\t\titerator,\n\t\t\t\treadTimeoutMs,\n\t\t\t\tmakeTimeoutError,\n\t\t\t\tabortPromise,\n\t\t\t\tonIdleTimeout,\n\t\t\t\tstream,\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (!result.done) sawFirstEvent = true;\n\t\t\treturn result;\n\t\t},\n\t\tdispose: () => removeAbortListener?.(),\n\t};\n}\n\nasync function readNextAssistantEvent(\n\titerator: AsyncIterator<AssistantMessageEvent>,\n\tidleTimeoutMs: number | undefined,\n\tmakeTimeoutError: (timeoutMs: number) => Error,\n\tabortPromise: Promise<typeof ABORTED> | undefined,\n\tonIdleTimeout?: (error: Error) => void,\n\tstream?: Pick<AssistantMessageEventStream, \"hasPendingLocalWork\">,\n\tsignal?: AbortSignal,\n): Promise<IteratorResult<AssistantMessageEvent>> {\n\tif (idleTimeoutMs === undefined && abortPromise === undefined) {\n\t\treturn iterator.next();\n\t}\n\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\tlet settled = false;\n\n\treturn new Promise<IteratorResult<AssistantMessageEvent>>((resolve, reject) => {\n\t\tconst settle = (complete: () => void): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tif (timeout !== undefined) {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t}\n\t\t\tcomplete();\n\t\t};\n\n\t\tif (idleTimeoutMs !== undefined) {\n\t\t\tconst onIdleDeadline = () => {\n\t\t\t\t// A provider executing a server-requested tool locally (Cursor's\n\t\t\t\t// exec channel) legitimately emits no events while the tool runs.\n\t\t\t\t// That silence is tracked as local work on the stream; re-arm the\n\t\t\t\t// idle bound instead of killing a healthy request.\n\t\t\t\tif (stream?.hasPendingLocalWork?.()) {\n\t\t\t\t\ttimeout = setTimeout(onIdleDeadline, idleTimeoutMs);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst error = makeTimeoutError(idleTimeoutMs);\n\t\t\t\tcloseAssistantIterator(iterator);\n\t\t\t\tsettle(() => reject(error));\n\t\t\t\t// Abort after settling so the failure surfaces as an idle timeout,\n\t\t\t\t// not as a generic abort, while the dead request still gets torn down.\n\t\t\t\tonIdleTimeout?.(error);\n\t\t\t};\n\t\t\ttimeout = setTimeout(onIdleDeadline, idleTimeoutMs);\n\t\t}\n\n\t\tconst next = abortPromise ? Promise.race([iterator.next(), abortPromise]) : iterator.next();\n\t\tvoid next.then(\n\t\t\t(result) => {\n\t\t\t\tif (result === ABORTED) {\n\t\t\t\t\tcloseAssistantIterator(iterator);\n\t\t\t\t\tsettle(() => reject(abortError(signal?.reason)));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsettle(() => resolve(result));\n\t\t\t},\n\t\t\t(error: unknown) => settle(() => reject(error)),\n\t\t);\n\t});\n}\n\nfunction createIncompleteToolCallErrorMessage(toolName: string, errorMessage?: string): string {\n\tif (errorMessage !== undefined) {\n\t\treturn `${errorMessage}${errorMessage.endsWith(\".\") ? \"\" : \".\"} Re-issue the tool call with complete arguments.`;\n\t}\n\treturn `Tool call \"${toolName}\" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`;\n}\n\n/**\n * Fail all tool calls from an assistant message that was truncated by the\n * output token limit. Streamed tool-call arguments are finalized with a\n * best-effort JSON salvage parser, so a truncated message can yield tool calls\n * whose arguments parse and validate but are silently incomplete. None of them\n * are safe to execute; report each as an error so the model can re-issue them.\n */\nasync function failToolCallsFromTruncatedMessage(\n\ttoolCalls: AgentToolCall[],\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallBatch> {\n\tconst messages: ToolResultMessage[] = [];\n\tfor (const toolCall of toolCalls) {\n\t\tawait emit({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\t\tconst finalized: FinalizedToolCallOutcome = {\n\t\t\ttoolCall,\n\t\t\tresult: createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),\n\t\t\tisError: true,\n\t\t};\n\t\tawait emitToolExecutionEnd(finalized, emit);\n\t\tconst toolResultMessage = createToolResultMessage(finalized);\n\t\tawait emitToolResultMessage(toolResultMessage, emit);\n\t\tmessages.push(toolResultMessage);\n\t}\n\treturn { messages, terminate: false };\n}\n\n/**\n * Execute tool calls from an assistant message.\n */\nasync function executeToolCalls(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallBatch> {\n\t// Same filter as the loop's collection site (defense in depth): a block\n\t// stamped `kCursorExecResolved` was already executed by Cursor's exec\n\t// channel and its result buffered; running it again would duplicate a\n\t// side-effecting tool.\n\tconst toolCalls = assistantMessage.content.filter(\n\t\t(c): c is AgentToolCall => c.type === \"toolCall\" && !isCursorExecResolved(c as CursorExecResolvedCarrier),\n\t);\n\tif (config.toolExecution === \"sequential\") {\n\t\treturn executeToolCallsSequential(currentContext, assistantMessage, toolCalls, config, signal, emit);\n\t}\n\treturn executeToolCallsParallel(currentContext, assistantMessage, toolCalls, config, signal, emit);\n}\n\ntype ExecutedToolCallBatch = {\n\tmessages: ToolResultMessage[];\n\tterminate: boolean;\n};\n\nasync function executeToolCallsSequential(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCalls: AgentToolCall[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallBatch> {\n\tconst finalizedCalls: FinalizedToolCallOutcome[] = [];\n\tconst messages: ToolResultMessage[] = [];\n\n\tfor (const toolCall of toolCalls) {\n\t\tawait emit({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tconst preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);\n\t\tlet finalized: FinalizedToolCallOutcome;\n\t\tif (preparation.kind === \"immediate\") {\n\t\t\tfinalized = {\n\t\t\t\ttoolCall,\n\t\t\t\tresult: preparation.result,\n\t\t\t\tisError: preparation.isError,\n\t\t\t};\n\t\t} else {\n\t\t\tconst executed = await executePreparedToolCall(preparation, signal, emit);\n\t\t\tfinalized = await finalizeExecutedToolCall(\n\t\t\t\tcurrentContext,\n\t\t\t\tassistantMessage,\n\t\t\t\tpreparation,\n\t\t\t\texecuted,\n\t\t\t\tconfig,\n\t\t\t\tsignal,\n\t\t\t);\n\t\t}\n\n\t\tawait emitToolExecutionEnd(finalized, emit);\n\t\tconst toolResultMessage = createToolResultMessage(finalized);\n\t\tawait emitToolResultMessage(toolResultMessage, emit);\n\t\tfinalizedCalls.push(finalized);\n\t\tmessages.push(toolResultMessage);\n\n\t\tif (signal?.aborted) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn {\n\t\tmessages,\n\t\tterminate: shouldTerminateToolBatch(finalizedCalls),\n\t};\n}\n\nasync function executeToolCallsParallel(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCalls: AgentToolCall[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallBatch> {\n\tconst finalizedCalls: Promise<FinalizedToolCallOutcome>[] = [];\n\tconst preparedCalls: Array<{\n\t\tpreparation: PreparedToolCall | ImmediateToolCallOutcome;\n\t\tisSequential: boolean;\n\t\tdependencies: Promise<FinalizedToolCallOutcome>[];\n\t}> = [];\n\tlet lastSequentialCall: Promise<FinalizedToolCallOutcome> | undefined;\n\tlet currentParallelWave: Promise<FinalizedToolCallOutcome>[] = [];\n\n\tfor (const toolCall of toolCalls) {\n\t\tawait emit({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tconst preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);\n\t\tconst isSequential = isSequentialToolCall(currentContext, toolCall);\n\t\tconst dependencies = isSequential\n\t\t\t? [...(lastSequentialCall ? [lastSequentialCall] : []), ...currentParallelWave]\n\t\t\t: lastSequentialCall\n\t\t\t\t? [lastSequentialCall]\n\t\t\t\t: [];\n\n\t\tpreparedCalls.push({ preparation, isSequential, dependencies });\n\n\t\tif (isSequential) {\n\t\t\t// Dependencies are assigned in the second phase after all preflight hooks\n\t\t\t// have completed, so a later preflight abort vetoes every execution.\n\t\t\tlastSequentialCall = undefined;\n\t\t\tcurrentParallelWave = [];\n\t\t} else {\n\t\t\tcurrentParallelWave.push(Promise.resolve(undefined as never));\n\t\t}\n\n\t\tif (signal?.aborted) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tlet previousSequential: Promise<FinalizedToolCallOutcome> | undefined;\n\tlet previousWave: Promise<FinalizedToolCallOutcome>[] = [];\n\tfor (const { preparation, isSequential } of preparedCalls) {\n\t\tconst dependencies = isSequential\n\t\t\t? [...(previousSequential ? [previousSequential] : []), ...previousWave]\n\t\t\t: previousSequential\n\t\t\t\t? [previousSequential]\n\t\t\t\t: [];\n\t\tconst finalizedCall = (async () => {\n\t\t\tawait Promise.all(dependencies);\n\t\t\tconst finalized = signal?.aborted\n\t\t\t\t? { toolCall: preparation.toolCall, result: createErrorToolResult(\"Operation aborted\"), isError: true }\n\t\t\t\t: await runPreparedToolCall(currentContext, assistantMessage, preparation, config, signal, emit);\n\t\t\tawait emitToolExecutionEnd(finalized, emit);\n\t\t\treturn finalized;\n\t\t})();\n\t\tfinalizedCalls.push(finalizedCall);\n\t\tif (isSequential) {\n\t\t\tpreviousSequential = finalizedCall;\n\t\t\tpreviousWave = [];\n\t\t} else previousWave.push(finalizedCall);\n\t}\n\tconst orderedFinalizedCalls = await Promise.all(finalizedCalls);\n\tconst messages: ToolResultMessage[] = [];\n\tfor (const finalized of orderedFinalizedCalls) {\n\t\tconst toolResultMessage = createToolResultMessage(finalized);\n\t\tawait emitToolResultMessage(toolResultMessage, emit);\n\t\tmessages.push(toolResultMessage);\n\t}\n\n\treturn {\n\t\tmessages,\n\t\tterminate: shouldTerminateToolBatch(orderedFinalizedCalls),\n\t};\n}\n\nasync function runPreparedToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tpreparation: PreparedToolCall | ImmediateToolCallOutcome,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<FinalizedToolCallOutcome> {\n\tif (preparation.kind === \"immediate\") {\n\t\treturn {\n\t\t\ttoolCall: preparation.toolCall,\n\t\t\tresult: preparation.result,\n\t\t\tisError: preparation.isError,\n\t\t};\n\t}\n\n\tconst executed = await executePreparedToolCall(preparation, signal, emit);\n\treturn finalizeExecutedToolCall(currentContext, assistantMessage, preparation, executed, config, signal);\n}\n\nfunction isSequentialToolCall(currentContext: AgentContext, toolCall: AgentToolCall): boolean {\n\treturn currentContext.tools?.find((tool) => tool.name === toolCall.name)?.executionMode === \"sequential\";\n}\n\ntype PreparedToolCall = {\n\tkind: \"prepared\";\n\ttoolCall: AgentToolCall;\n\ttool: AgentTool;\n\targs: unknown;\n};\n\ntype ImmediateToolCallOutcome = {\n\tkind: \"immediate\";\n\ttoolCall: AgentToolCall;\n\tresult: AgentToolResult<unknown>;\n\tisError: boolean;\n};\n\ntype ExecutedToolCallOutcome = {\n\tresult: AgentToolResult<unknown>;\n\tisError: boolean;\n};\n\ntype FinalizedToolCallOutcome = {\n\ttoolCall: AgentToolCall;\n\tresult: AgentToolResult<unknown>;\n\tisError: boolean;\n};\n\nfunction shouldTerminateToolBatch(finalizedCalls: FinalizedToolCallOutcome[]): boolean {\n\treturn finalizedCalls.length > 0 && finalizedCalls.every((finalized) => finalized.result.terminate === true);\n}\n\nexport interface PreparedAgentToolCall {\n\ttoolCall: AgentToolCall;\n\ttool: AgentTool;\n\targs: unknown;\n}\n\nexport function prepareAgentToolCallArguments(tool: AgentTool, toolCall: AgentToolCall): AgentToolCall {\n\tif (!tool.prepareArguments) {\n\t\treturn toolCall;\n\t}\n\tconst preparedArguments = tool.prepareArguments(toolCall.arguments);\n\tif (preparedArguments === toolCall.arguments) {\n\t\treturn toolCall;\n\t}\n\treturn {\n\t\t...toolCall,\n\t\targuments: preparedArguments as Record<string, unknown>,\n\t};\n}\n\nexport function prepareAgentToolCall(tool: AgentTool, toolCall: AgentToolCall): PreparedAgentToolCall {\n\tconst preparedToolCall = prepareAgentToolCallArguments(tool, toolCall);\n\treturn {\n\t\ttoolCall: preparedToolCall,\n\t\ttool,\n\t\targs: validateToolArguments(tool, preparedToolCall),\n\t};\n}\n\nasync function prepareToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCall: AgentToolCall,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n): Promise<PreparedToolCall | ImmediateToolCallOutcome> {\n\tif (toolCall.incomplete === true) {\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\ttoolCall,\n\t\t\tresult: createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name, toolCall.errorMessage)),\n\t\t\tisError: true,\n\t\t};\n\t}\n\n\tlet tool = currentContext.tools?.find((candidate) => candidate.name === toolCall.name);\n\tif (!tool && config.resolveUnknownToolCall) {\n\t\ttool = await config.resolveUnknownToolCall(toolCall.name, currentContext);\n\t}\n\tif (!tool) {\n\t\tconst hint = config.removedToolHints?.[toolCall.name];\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\ttoolCall,\n\t\t\tresult: createErrorToolResult(\n\t\t\t\thint === undefined ? `Tool ${toolCall.name} not found` : `Tool ${toolCall.name} not found. ${hint}`,\n\t\t\t),\n\t\t\tisError: true,\n\t\t};\n\t}\n\n\ttry {\n\t\tconst preparedToolCall = prepareAgentToolCall(tool, toolCall);\n\t\tconst validatedArgs = preparedToolCall.args;\n\t\tif (config.beforeToolCall) {\n\t\t\tconst beforeResult = await config.beforeToolCall(\n\t\t\t\t{\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\ttoolCall: preparedToolCall.toolCall,\n\t\t\t\t\targs: validatedArgs,\n\t\t\t\t\tcontext: currentContext,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (signal?.aborted) {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"immediate\",\n\t\t\t\t\ttoolCall,\n\t\t\t\t\tresult: createErrorToolResult(\"Operation aborted\"),\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (beforeResult?.block) {\n\t\t\t\tconst result = createErrorToolResult(beforeResult.reason || \"Tool execution was blocked\");\n\t\t\t\tif (beforeResult.terminate === true) {\n\t\t\t\t\tresult.terminate = true;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"immediate\",\n\t\t\t\t\ttoolCall,\n\t\t\t\t\tresult,\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tif (signal?.aborted) {\n\t\t\treturn {\n\t\t\t\tkind: \"immediate\",\n\t\t\t\ttoolCall,\n\t\t\t\tresult: createErrorToolResult(\"Operation aborted\"),\n\t\t\t\tisError: true,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"prepared\",\n\t\t\ttoolCall: preparedToolCall.toolCall,\n\t\t\ttool,\n\t\t\targs: validatedArgs,\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\ttoolCall,\n\t\t\tresult: createErrorToolResult(error instanceof Error ? error.message : String(error)),\n\t\t\tisError: true,\n\t\t};\n\t}\n}\n\n/**\n * Resolves as soon as `signal` aborts, so a tool that never settles and never\n * observes its signal cannot pin the run forever. Without this the abort has no\n * wakeup once `execute()` is entered: no `agent_end`, the session never goes\n * idle, and every queued prompt parks behind the session work barrier while the\n * TUI shows \"Running <tool>\" with a dead ESC.\n */\nfunction abortReleasePromise(signal: AbortSignal | undefined): Promise<typeof ABORTED> | undefined {\n\tif (signal === undefined) return undefined;\n\tif (signal.aborted) return Promise.resolve(ABORTED);\n\treturn new Promise<typeof ABORTED>((resolve) => {\n\t\tsignal.addEventListener(\"abort\", () => resolve(ABORTED), { once: true });\n\t});\n}\n\nasync function executePreparedToolCall(\n\tprepared: PreparedToolCall,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallOutcome> {\n\tconst updateEvents: Promise<void>[] = [];\n\tlet acceptingUpdates = true;\n\n\ttry {\n\t\tconst execution = prepared.tool.execute(prepared.toolCall.id, prepared.args as never, signal, (partialResult) => {\n\t\t\tif (!acceptingUpdates) return;\n\t\t\tupdateEvents.push(\n\t\t\t\tPromise.resolve(\n\t\t\t\t\temit({\n\t\t\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\t\t\ttoolCallId: prepared.toolCall.id,\n\t\t\t\t\t\ttoolName: prepared.toolCall.name,\n\t\t\t\t\t\targs: prepared.toolCall.arguments,\n\t\t\t\t\t\tpartialResult,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t\tconst abortRelease = abortReleasePromise(signal);\n\t\tconst settled = abortRelease ? await Promise.race([execution, abortRelease]) : await execution;\n\t\tif (settled === ABORTED) {\n\t\t\tvoid Promise.resolve(execution).catch(() => undefined);\n\t\t\tacceptingUpdates = false;\n\t\t\tawait Promise.all(updateEvents);\n\t\t\treturn { result: createErrorToolResult(\"Tool execution aborted\"), isError: true };\n\t\t}\n\t\tacceptingUpdates = false;\n\t\tawait Promise.all(updateEvents);\n\t\treturn { result: settled, isError: false };\n\t} catch (error) {\n\t\tacceptingUpdates = false;\n\t\tawait Promise.all(updateEvents);\n\t\treturn {\n\t\t\tresult: createErrorToolResult(error instanceof Error ? error.message : String(error)),\n\t\t\tisError: true,\n\t\t};\n\t} finally {\n\t\tacceptingUpdates = false;\n\t}\n}\n\nasync function finalizeExecutedToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tprepared: PreparedToolCall,\n\texecuted: ExecutedToolCallOutcome,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n): Promise<FinalizedToolCallOutcome> {\n\tlet result = executed.result;\n\tlet isError = executed.isError;\n\n\tif (config.afterToolCall) {\n\t\ttry {\n\t\t\tconst afterResult = await config.afterToolCall(\n\t\t\t\t{\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\ttoolCall: prepared.toolCall,\n\t\t\t\t\targs: prepared.args,\n\t\t\t\t\tresult,\n\t\t\t\t\tisError,\n\t\t\t\t\tcontext: currentContext,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (afterResult) {\n\t\t\t\tresult = {\n\t\t\t\t\t...result,\n\t\t\t\t\tcontent: afterResult.content ?? result.content,\n\t\t\t\t\tdetails: afterResult.details ?? result.details,\n\t\t\t\t\tusage: afterResult.usage ?? result.usage,\n\t\t\t\t\tterminate: afterResult.terminate ?? result.terminate,\n\t\t\t\t};\n\t\t\t\tisError = afterResult.isError ?? isError;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tresult = createErrorToolResult(error instanceof Error ? error.message : String(error));\n\t\t\tisError = true;\n\t\t}\n\t}\n\n\treturn {\n\t\ttoolCall: prepared.toolCall,\n\t\tresult,\n\t\tisError,\n\t};\n}\n\nfunction createErrorToolResult(message: string): AgentToolResult<unknown> {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: message }],\n\t\tdetails: {},\n\t};\n}\n\nasync function emitToolExecutionEnd(finalized: FinalizedToolCallOutcome, emit: AgentEventSink): Promise<void> {\n\tawait emit({\n\t\ttype: \"tool_execution_end\",\n\t\ttoolCallId: finalized.toolCall.id,\n\t\ttoolName: finalized.toolCall.name,\n\t\tresult: finalized.result,\n\t\tisError: finalized.isError,\n\t});\n}\n\nfunction createToolResultMessage(finalized: FinalizedToolCallOutcome): ToolResultMessage {\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: finalized.toolCall.id,\n\t\ttoolName: finalized.toolCall.name,\n\t\t// Untyped tools (JS extensions) can return results without content; normalize\n\t\t// so the null never enters session history or provider payloads.\n\t\tcontent: finalized.result.content ?? [],\n\t\tdetails: finalized.result.details,\n\t\tusage: finalized.result.usage,\n\t\t...(finalized.result.addedToolNames?.length ? { addedToolNames: finalized.result.addedToolNames } : {}),\n\t\tisError: finalized.isError,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nasync function emitToolResultMessage(toolResultMessage: ToolResultMessage, emit: AgentEventSink): Promise<void> {\n\tawait emit({ type: \"message_start\", message: toolResultMessage });\n\tawait emit({ type: \"message_end\", message: toolResultMessage });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent loop that works with AgentMessage throughout.\n * Transforms to Message[] only at the LLM call boundary.\n */\n\nimport {\n\ttype AssistantMessage,\n\ttype AssistantMessageEvent,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\ttype CursorExecResolvedCarrier,\n\tEventStream,\n\tisCursorExecResolved,\n\ttype ToolResultMessage,\n\tvalidateToolArguments,\n} from \"@earendil-works/pi-ai\";\nimport {\n\tcreateTerminalFailureAssistantMessage,\n\tdemoteToolUseWithoutToolCalls,\n\tisStreamIdleTimeoutError,\n\tnormalizeTerminalAssistantMessage,\n\tpromoteStopWithPendingToolCalls,\n\tshouldFinalizeIdleAsStop,\n\tshouldTerminateAssistantTurn,\n} from \"./assistant-terminal-state.ts\";\nimport { getDefaultStreamFn, withEmptyAssistantRecovery } from \"./stream-fn.ts\";\nimport type {\n\tAgentContext,\n\tAgentEvent,\n\tAgentLoopConfig,\n\tAgentLoopTurnUpdate,\n\tAgentMessage,\n\tAgentTool,\n\tAgentToolCall,\n\tAgentToolResult,\n\tStreamFn,\n} from \"./types.ts\";\n\nexport type AgentEventSink = (event: AgentEvent) => Promise<void> | void;\n\n/**\n * Start an agent loop with a new prompt message.\n * The prompt is added to the context and events are emitted for it.\n */\nexport function agentLoop(\n\tprompts: AgentMessage[],\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstreamFn: StreamFn,\n): EventStream<AgentEvent, AgentMessage[]> {\n\tconst stream = createAgentStream();\n\n\tvoid runAgentLoop(\n\t\tprompts,\n\t\tcontext,\n\t\tconfig,\n\t\tasync (event) => {\n\t\t\tstream.push(event);\n\t\t},\n\t\tsignal,\n\t\tstreamFn,\n\t).then((messages) => {\n\t\tstream.end(messages);\n\t});\n\n\treturn stream;\n}\n\n/**\n * Continue an agent loop from the current context without adding a new message.\n * Used for retries - context already has user message or tool results.\n *\n * **Important:** The last message in context must convert to a `user` or `toolResult` message\n * via `convertToLlm`. If it doesn't, the LLM provider will reject the request.\n * This cannot be validated here since `convertToLlm` is only called once per turn.\n */\nexport function agentLoopContinue(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\tstreamFn: StreamFn,\n): EventStream<AgentEvent, AgentMessage[]> {\n\tif (context.messages.length === 0) {\n\t\tthrow new Error(\"Cannot continue: no messages in context\");\n\t}\n\n\tif (context.messages[context.messages.length - 1].role === \"assistant\") {\n\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t}\n\n\tconst stream = createAgentStream();\n\n\tvoid runAgentLoopContinue(\n\t\tcontext,\n\t\tconfig,\n\t\tasync (event) => {\n\t\t\tstream.push(event);\n\t\t},\n\t\tsignal,\n\t\tstreamFn,\n\t).then((messages) => {\n\t\tstream.end(messages);\n\t});\n\n\treturn stream;\n}\n\nexport async function runAgentLoop(\n\tprompts: AgentMessage[],\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\temit: AgentEventSink,\n\tsignal: AbortSignal | undefined,\n\tstreamFn: StreamFn,\n): Promise<AgentMessage[]> {\n\tconst newMessages: AgentMessage[] = [...prompts];\n\tconst currentContext: AgentContext = {\n\t\t...context,\n\t\tmessages: [...context.messages, ...prompts],\n\t};\n\n\tawait emit({ type: \"agent_start\" });\n\tawait emit({ type: \"turn_start\" });\n\tfor (const prompt of prompts) {\n\t\tawait emit({ type: \"message_start\", message: prompt });\n\t\tawait emit({ type: \"message_end\", message: prompt });\n\t}\n\n\tawait runLoop(currentContext, newMessages, config, signal, emit, streamFn ?? getDefaultStreamFn());\n\treturn newMessages;\n}\n\nexport async function runAgentLoopContinue(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\temit: AgentEventSink,\n\tsignal: AbortSignal | undefined,\n\tstreamFn: StreamFn,\n): Promise<AgentMessage[]> {\n\tif (context.messages.length === 0) {\n\t\tthrow new Error(\"Cannot continue: no messages in context\");\n\t}\n\n\tif (context.messages[context.messages.length - 1].role === \"assistant\") {\n\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t}\n\n\tconst newMessages: AgentMessage[] = [];\n\tconst currentContext: AgentContext = { ...context };\n\n\tawait emit({ type: \"agent_start\" });\n\tawait emit({ type: \"turn_start\" });\n\n\tawait runLoop(currentContext, newMessages, config, signal, emit, streamFn ?? getDefaultStreamFn());\n\treturn newMessages;\n}\n\nfunction createAgentStream(): EventStream<AgentEvent, AgentMessage[]> {\n\treturn new EventStream<AgentEvent, AgentMessage[]>(\n\t\t(event: AgentEvent) => event.type === \"agent_end\",\n\t\t(event: AgentEvent) => (event.type === \"agent_end\" ? event.messages : []),\n\t);\n}\n\nclass StreamIdleTimeoutError extends Error {\n\tconstructor(timeoutMs: number) {\n\t\tsuper(`Idle timeout waiting for provider stream after ${timeoutMs}ms`);\n\t\tthis.name = \"StreamIdleTimeoutError\";\n\t}\n}\n\n// The wording must keep matching the retryable-error classifier\n// (\"timed out\" in packages/ai/src/utils/retry.ts) so a dead stream start is\n// retried instead of dead-ending the session.\nexport class StreamStartTimeoutError extends Error {\n\tconstructor(timeoutMs: number) {\n\t\tsuper(\n\t\t\t`Provider stream start timed out after ${timeoutMs}ms (raise streamStartTimeoutMs — retry.provider.streamStartTimeoutMs in senpi settings; 0 disables)`,\n\t\t);\n\t\tthis.name = \"StreamStartTimeoutError\";\n\t}\n}\n\n/**\n * Main loop logic shared by agentLoop and agentLoopContinue.\n */\nasync function runLoop(\n\tinitialContext: AgentContext,\n\tnewMessages: AgentMessage[],\n\tinitialConfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n\tstreamFunction: StreamFn,\n): Promise<void> {\n\tlet currentContext = initialContext;\n\tlet config = initialConfig;\n\tlet firstTurn = true;\n\tlet firstProviderRequest = true;\n\tlet drainedTerminatingQueue: \"steering\" | \"followUp\" | undefined;\n\tlet turnStartAlreadyEmitted = false;\n\tconst refreshTerminatingQueueDrain = async (): Promise<void> => {\n\t\tif (!drainedTerminatingQueue || !config.restorePendingMessages) return;\n\t\tawait config.restorePendingMessages(drainedTerminatingQueue, pendingMessages);\n\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\tdrainedTerminatingQueue = pendingMessages.length > 0 ? \"steering\" : undefined;\n\t\tif (pendingMessages.length === 0) {\n\t\t\tpendingMessages = (await config.getFollowUpMessages?.()) || [];\n\t\t\tdrainedTerminatingQueue = pendingMessages.length > 0 ? \"followUp\" : undefined;\n\t\t}\n\t};\n\t// Check for steering messages at start (user may have typed while waiting)\n\tlet pendingMessages: AgentMessage[] = (await config.getSteeringMessages?.()) || [];\n\n\t// Outer loop: continues when queued follow-up messages arrive after agent would stop\n\twhile (true) {\n\t\tlet hasMoreToolCalls = true;\n\n\t\t// Inner loop: process tool calls and steering messages\n\t\twhile (hasMoreToolCalls || pendingMessages.length > 0) {\n\t\t\tif (turnStartAlreadyEmitted) {\n\t\t\t\tturnStartAlreadyEmitted = false;\n\t\t\t} else if (!firstTurn) {\n\t\t\t\tawait emit({ type: \"turn_start\" });\n\t\t\t} else {\n\t\t\t\tfirstTurn = false;\n\t\t\t}\n\t\t\tif (drainedTerminatingQueue) {\n\t\t\t\tawait refreshTerminatingQueueDrain();\n\t\t\t\tif (pendingMessages.length === 0) {\n\t\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdrainedTerminatingQueue = undefined;\n\t\t\t}\n\n\t\t\t// Process pending messages (inject before next assistant response)\n\t\t\tif (pendingMessages.length > 0) {\n\t\t\t\tfor (const message of pendingMessages) {\n\t\t\t\t\tawait emit({ type: \"message_start\", message });\n\t\t\t\t\tawait emit({ type: \"message_end\", message });\n\t\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t\t\tnewMessages.push(message);\n\t\t\t\t}\n\t\t\t\tpendingMessages = [];\n\t\t\t}\n\n\t\t\t// Stream assistant response\n\t\t\tconst isInitialProviderRequest = firstProviderRequest;\n\t\t\tfirstProviderRequest = false;\n\t\t\tconst requestConfig = isInitialProviderRequest\n\t\t\t\t? {\n\t\t\t\t\t\t...config,\n\t\t\t\t\t\ttimeoutMs: config.initialRequestTimeoutMs ?? config.timeoutMs,\n\t\t\t\t\t\tstreamStartTimeoutMs: config.initialRequestStreamStartTimeoutMs ?? config.streamStartTimeoutMs,\n\t\t\t\t\t}\n\t\t\t\t: config;\n\t\t\tconst streamed = await streamAssistantResponse(\n\t\t\t\tcurrentContext,\n\t\t\t\trequestConfig,\n\t\t\t\tsignal,\n\t\t\t\temit,\n\t\t\t\twithEmptyAssistantRecovery(requestConfig.model, streamFunction),\n\t\t\t\tisInitialProviderRequest ? config.timeoutMs : requestConfig.timeoutMs,\n\t\t\t);\n\t\t\tconst message = demoteToolUseWithoutToolCalls(promoteStopWithPendingToolCalls(streamed.message));\n\t\t\tconst providerToolResults = streamed.providerToolResults;\n\t\t\tnewMessages.push(message);\n\t\t\tconst toolResults: ToolResultMessage[] = [];\n\t\t\tfor (const result of providerToolResults) {\n\t\t\t\tawait emit({ type: \"message_start\", message: result });\n\t\t\t\tawait emit({ type: \"message_end\", message: result });\n\t\t\t\tcurrentContext.messages.push(result);\n\t\t\t\tnewMessages.push(result);\n\t\t\t\ttoolResults.push(result);\n\t\t\t}\n\n\t\t\tif (shouldTerminateAssistantTurn(message)) {\n\t\t\t\tawait emit({ type: \"turn_end\", message, toolResults });\n\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check for tool calls\n\t\t\tconst toolCalls = message.content.filter(\n\t\t\t\t(c): c is AgentToolCall => c.type === \"toolCall\" && !isCursorExecResolved(c as CursorExecResolvedCarrier),\n\t\t\t);\n\n\t\t\thasMoreToolCalls = false;\n\t\t\tlet toolBatchTerminated = false;\n\t\t\tif (toolCalls.length > 0) {\n\t\t\t\t// A \"length\" stop means the output was cut off by the token limit, so\n\t\t\t\t// every tool call in the message may carry truncated arguments. Fail\n\t\t\t\t// them all instead of executing potentially borked calls.\n\t\t\t\tconst executedToolBatch =\n\t\t\t\t\tmessage.stopReason === \"length\"\n\t\t\t\t\t\t? await failToolCallsFromTruncatedMessage(toolCalls, emit)\n\t\t\t\t\t\t: await executeToolCalls(currentContext, message, config, signal, emit);\n\t\t\t\ttoolResults.push(...executedToolBatch.messages);\n\t\t\t\ttoolBatchTerminated = executedToolBatch.terminate;\n\t\t\t\thasMoreToolCalls = !executedToolBatch.terminate;\n\n\t\t\t\tfor (const result of executedToolBatch.messages) {\n\t\t\t\t\tcurrentContext.messages.push(result);\n\t\t\t\t\tnewMessages.push(result);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait emit({ type: \"turn_end\", message, toolResults });\n\t\t\tif (signal?.aborted) {\n\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextTurnContext = {\n\t\t\t\tmessage,\n\t\t\t\ttoolResults,\n\t\t\t\tcontext: currentContext,\n\t\t\t\tnewMessages,\n\t\t\t};\n\t\t\tif (await config.shouldStopAfterTurn?.(nextTurnContext)) {\n\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (toolBatchTerminated) {\n\t\t\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\t\t\tif (pendingMessages.length > 0) drainedTerminatingQueue = \"steering\";\n\t\t\t\tif (pendingMessages.length === 0) {\n\t\t\t\t\tpendingMessages = (await config.getFollowUpMessages?.()) || [];\n\t\t\t\t\tif (pendingMessages.length > 0) drainedTerminatingQueue = \"followUp\";\n\t\t\t\t}\n\t\t\t\tif (pendingMessages.length === 0) {\n\t\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Give queue owners a boundary before preparation refreshes the drained\n\t\t\t\t// snapshot, so a clear or replacement wins before admission.\n\t\t\t\tawait emit({ type: \"turn_start\" });\n\t\t\t\tturnStartAlreadyEmitted = true;\n\t\t\t}\n\n\t\t\tlet nextTurnSnapshot: AgentLoopTurnUpdate | undefined;\n\t\t\ttry {\n\t\t\t\tnextTurnSnapshot = await config.prepareNextTurn?.(nextTurnContext);\n\t\t\t} catch (error) {\n\t\t\t\tif (drainedTerminatingQueue)\n\t\t\t\t\tawait config.restorePendingMessages?.(drainedTerminatingQueue, pendingMessages);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (nextTurnSnapshot) {\n\t\t\t\tcurrentContext = nextTurnSnapshot.context ?? currentContext;\n\t\t\t\tconfig = {\n\t\t\t\t\t...config,\n\t\t\t\t\tmodel: nextTurnSnapshot.model ?? config.model,\n\t\t\t\t\treasoning:\n\t\t\t\t\t\tnextTurnSnapshot.thinkingLevel === undefined\n\t\t\t\t\t\t\t? config.reasoning\n\t\t\t\t\t\t\t: nextTurnSnapshot.thinkingLevel === \"off\"\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: nextTurnSnapshot.thinkingLevel,\n\t\t\t\t\tthinkingSelection:\n\t\t\t\t\t\tnextTurnSnapshot.thinkingSelection === undefined\n\t\t\t\t\t\t\t? config.thinkingSelection\n\t\t\t\t\t\t\t: (nextTurnSnapshot.thinkingSelection ?? undefined),\n\t\t\t\t\tabortServerSideFallback: nextTurnSnapshot.abortServerSideFallback ?? config.abortServerSideFallback,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (signal?.aborted) {\n\t\t\t\tif (drainedTerminatingQueue)\n\t\t\t\t\tawait config.restorePendingMessages?.(drainedTerminatingQueue, pendingMessages);\n\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (drainedTerminatingQueue) {\n\t\t\t\tawait refreshTerminatingQueueDrain();\n\t\t\t\tif (pendingMessages.length === 0) {\n\t\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdrainedTerminatingQueue = undefined;\n\t\t\t}\n\t\t\tif (!toolBatchTerminated) {\n\t\t\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\t\t}\n\t\t}\n\n\t\t// Agent would stop here. Check for follow-up messages.\n\t\tconst followUpMessages = (await config.getFollowUpMessages?.()) || [];\n\t\tif (followUpMessages.length > 0) {\n\t\t\t// Set as pending so inner loop processes them\n\t\t\tpendingMessages = followUpMessages;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// No more messages, exit\n\t\tbreak;\n\t}\n\n\tawait emit({ type: \"agent_end\", messages: newMessages });\n}\n\n/** Build the provider context using the same transform and conversion pipeline as an agent request. */\nexport async function buildProviderContext(\n\tcontext: AgentContext,\n\tconfig: Pick<AgentLoopConfig, \"convertToLlm\" | \"transformContext\">,\n\tsignal?: AbortSignal,\n): Promise<Context> {\n\tlet messages = context.messages;\n\tif (config.transformContext) messages = await config.transformContext(messages, signal);\n\treturn { systemPrompt: context.systemPrompt, messages: await config.convertToLlm(messages), tools: context.tools };\n}\n\n/**\n * Stream an assistant response from the LLM.\n * This is where AgentMessage[] gets transformed to Message[] for the LLM.\n */\nasync function streamAssistantResponse(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n\tstreamFunction: StreamFn,\n\tstreamIdleTimeoutMs: number | undefined,\n): Promise<{\n\tmessage: AssistantMessage;\n\tproviderToolResults: ToolResultMessage[];\n}> {\n\tlet partialMessage: AssistantMessage | null = null;\n\tlet addedPartial = false;\n\t// Tool results delivered by a provider that executes tools mid-stream\n\t// (Cursor's exec channel). Buffered here and appended by the caller right\n\t// after the assistant message so pairs stay adjacent in the transcript.\n\tconst providerToolResults: ToolResultMessage[] = [];\n\tconst thinkingTiming = new Map<number, { startedAt: number; endedAt?: number }>();\n\n\tfunction propagateThinkingTiming(finalMessage: AssistantMessage): void {\n\t\tfor (const timing of thinkingTiming.values()) {\n\t\t\tif (timing.endedAt === undefined) timing.endedAt = Date.now();\n\t\t}\n\t\tfor (const [contentIndex, timing] of thinkingTiming) {\n\t\t\tconst block = finalMessage.content[contentIndex];\n\t\t\tif (block?.type !== \"thinking\") continue;\n\t\t\tblock.startedAt = timing.startedAt;\n\t\t\tblock.endedAt = timing.endedAt;\n\t\t}\n\t}\n\n\t// Dedicated controller for the provider request so the loop can tear the\n\t// request down itself (idle timeout), not only when the caller aborts.\n\tconst requestAbortController = new AbortController();\n\tlet detachCallerAbort: (() => void) | undefined;\n\tif (signal !== undefined) {\n\t\tif (signal.aborted) {\n\t\t\trequestAbortController.abort(signal.reason);\n\t\t} else {\n\t\t\tconst onCallerAbort = () => requestAbortController.abort(signal.reason);\n\t\t\tsignal.addEventListener(\"abort\", onCallerAbort, { once: true });\n\t\t\tdetachCallerAbort = () => signal.removeEventListener(\"abort\", onCallerAbort);\n\t\t}\n\t}\n\n\ttry {\n\t\tconst llmContext = await buildProviderContext(context, config, signal);\n\n\t\t// Resolve API key (important for expiring tokens)\n\t\tconst resolvedApiKey =\n\t\t\t(config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\n\t\tconst response = await streamFunction(config.model, llmContext, {\n\t\t\t...config,\n\t\t\tstreamKind: \"main\",\n\t\t\tapiKey: resolvedApiKey,\n\t\t\tsignal: requestAbortController.signal,\n\t\t\t// Cursor exec bridging (ignored by every other provider): handlers\n\t\t\t// execute mid-stream; their paired results buffer here.\n\t\t\t...(config.cursorExecHandlers\n\t\t\t\t? {\n\t\t\t\t\t\texecHandlers:\n\t\t\t\t\t\t\ttypeof config.cursorExecHandlers === \"function\"\n\t\t\t\t\t\t\t\t? config.cursorExecHandlers(signal ?? requestAbortController.signal)\n\t\t\t\t\t\t\t\t: config.cursorExecHandlers,\n\t\t\t\t\t\tonToolResult: (result: ToolResultMessage) => {\n\t\t\t\t\t\t\tproviderToolResults.push(result);\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t});\n\n\t\tconst iterator = response[Symbol.asyncIterator]();\n\t\tconst eventReader = createAssistantEventReader(\n\t\t\titerator,\n\t\t\tstreamIdleTimeoutMs,\n\t\t\trequestAbortController.signal,\n\t\t\t(error) => requestAbortController.abort(error),\n\t\t\tconfig.streamStartTimeoutMs,\n\t\t\tresponse,\n\t\t);\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst next = await eventReader.next();\n\t\t\t\tif (next.done) break;\n\t\t\t\tconst event = next.value;\n\t\t\t\tswitch (event.type) {\n\t\t\t\t\tcase \"start\":\n\t\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\t\tcontext.messages.push(partialMessage);\n\t\t\t\t\t\taddedPartial = true;\n\t\t\t\t\t\tawait emit({\n\t\t\t\t\t\t\ttype: \"message_start\",\n\t\t\t\t\t\t\tmessage: { ...partialMessage },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"text_start\":\n\t\t\t\t\tcase \"text_delta\":\n\t\t\t\t\tcase \"text_end\":\n\t\t\t\t\tcase \"thinking_start\":\n\t\t\t\t\tcase \"thinking_delta\":\n\t\t\t\t\tcase \"thinking_end\":\n\t\t\t\t\tcase \"toolcall_start\":\n\t\t\t\t\tcase \"toolcall_delta\":\n\t\t\t\t\tcase \"toolcall_end\":\n\t\t\t\t\t\tif (partialMessage) {\n\t\t\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tevent.type === \"thinking_start\" ||\n\t\t\t\t\t\t\t\tevent.type === \"thinking_delta\" ||\n\t\t\t\t\t\t\t\tevent.type === \"thinking_end\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tlet timing = thinkingTiming.get(event.contentIndex);\n\t\t\t\t\t\t\t\tif (event.type === \"thinking_start\" && timing === undefined) {\n\t\t\t\t\t\t\t\t\ttiming = { startedAt: Date.now() };\n\t\t\t\t\t\t\t\t\tthinkingTiming.set(event.contentIndex, timing);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (event.type === \"thinking_end\" && timing !== undefined) timing.endedAt = Date.now();\n\t\t\t\t\t\t\t\tconst block = partialMessage.content[event.contentIndex];\n\t\t\t\t\t\t\t\tif (block?.type === \"thinking\" && timing !== undefined) {\n\t\t\t\t\t\t\t\t\tblock.startedAt = timing.startedAt;\n\t\t\t\t\t\t\t\t\tif (timing.endedAt !== undefined) block.endedAt = timing.endedAt;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontext.messages[context.messages.length - 1] = partialMessage;\n\t\t\t\t\t\t\tawait emit({\n\t\t\t\t\t\t\t\ttype: \"message_update\",\n\t\t\t\t\t\t\t\tassistantMessageEvent: event,\n\t\t\t\t\t\t\t\tmessage: { ...partialMessage },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"done\":\n\t\t\t\t\tcase \"error\": {\n\t\t\t\t\t\tconst finalMessage = normalizeTerminalAssistantMessage(await response.result(), event);\n\t\t\t\t\t\tpropagateThinkingTiming(finalMessage);\n\t\t\t\t\t\tif (addedPartial) {\n\t\t\t\t\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.messages.push(finalMessage);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!addedPartial) {\n\t\t\t\t\t\t\tawait emit({\n\t\t\t\t\t\t\t\ttype: \"message_start\",\n\t\t\t\t\t\t\t\tmessage: { ...finalMessage },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait emit({ type: \"message_end\", message: finalMessage });\n\t\t\t\t\t\treturn { message: finalMessage, providerToolResults };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\teventReader.dispose();\n\t\t}\n\n\t\tconst finalMessage = await response.result();\n\t\tpropagateThinkingTiming(finalMessage);\n\t\tif (addedPartial) {\n\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t} else {\n\t\t\tcontext.messages.push(finalMessage);\n\t\t\tawait emit({ type: \"message_start\", message: { ...finalMessage } });\n\t\t}\n\t\tawait emit({ type: \"message_end\", message: finalMessage });\n\t\treturn { message: finalMessage, providerToolResults };\n\t} catch (error) {\n\t\tif (isStreamIdleTimeoutError(error) && shouldFinalizeIdleAsStop(partialMessage, providerToolResults)) {\n\t\t\tconst finalMessage: AssistantMessage = {\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: partialMessage?.content ?? [{ type: \"text\", text: \"\" }],\n\t\t\t\tapi: partialMessage?.api ?? config.model.api,\n\t\t\t\tprovider: partialMessage?.provider ?? config.model.provider,\n\t\t\t\tmodel: partialMessage?.model ?? config.model.id,\n\t\t\t\tresponseModel: partialMessage?.responseModel,\n\t\t\t\tresponseId: partialMessage?.responseId,\n\t\t\t\tdiagnostics: partialMessage?.diagnostics,\n\t\t\t\tusage: partialMessage?.usage ?? {\n\t\t\t\t\tinput: 0,\n\t\t\t\t\toutput: 0,\n\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t},\n\t\t\t\tstopReason: \"stop\",\n\t\t\t\ttimestamp: partialMessage?.timestamp ?? Date.now(),\n\t\t\t};\n\t\t\tpropagateThinkingTiming(finalMessage);\n\t\t\tif (addedPartial) {\n\t\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t\t} else {\n\t\t\t\tcontext.messages.push(finalMessage);\n\t\t\t\tawait emit({ type: \"message_start\", message: { ...finalMessage } });\n\t\t\t}\n\t\t\tawait emit({ type: \"message_end\", message: finalMessage });\n\t\t\treturn { message: finalMessage, providerToolResults };\n\t\t}\n\t\tconst finalMessage = createTerminalFailureAssistantMessage(\n\t\t\tconfig.model,\n\t\t\tsignal?.aborted ? \"aborted\" : \"error\",\n\t\t\terror,\n\t\t\tpartialMessage,\n\t\t);\n\t\tpropagateThinkingTiming(finalMessage);\n\t\tif (addedPartial) {\n\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t} else {\n\t\t\tcontext.messages.push(finalMessage);\n\t\t\tawait emit({ type: \"message_start\", message: { ...finalMessage } });\n\t\t}\n\t\tawait emit({ type: \"message_end\", message: finalMessage });\n\t\treturn { message: finalMessage, providerToolResults };\n\t} finally {\n\t\trequestAbortController.abort();\n\t\tdetachCallerAbort?.();\n\t}\n}\n\nconst ABORTED = Symbol(\"aborted\");\n\ntype AssistantEventReader = {\n\tnext(): Promise<IteratorResult<AssistantMessageEvent>>;\n\tdispose(): void;\n};\n\nfunction abortError(reason: unknown): Error {\n\treturn reason instanceof Error ? reason : new Error(\"Request was aborted\");\n}\n\nfunction closeAssistantIterator(iterator: AsyncIterator<AssistantMessageEvent>): void {\n\tvoid Promise.resolve(iterator.return?.()).catch(() => undefined);\n}\n\nfunction normalizeTimeoutMs(timeoutMs: number | undefined): number | undefined {\n\treturn typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : undefined;\n}\n\nfunction createAssistantEventReader(\n\titerator: AsyncIterator<AssistantMessageEvent>,\n\ttimeoutMs: number | undefined,\n\tsignal: AbortSignal | undefined,\n\tonIdleTimeout?: (error: Error) => void,\n\tstreamStartTimeoutMs?: number,\n\tstream?: Pick<AssistantMessageEventStream, \"hasPendingLocalWork\">,\n): AssistantEventReader {\n\tconst idleTimeoutMs = normalizeTimeoutMs(timeoutMs);\n\tconst startTimeoutMs = normalizeTimeoutMs(streamStartTimeoutMs);\n\tlet sawFirstEvent = false;\n\tlet removeAbortListener: (() => void) | undefined;\n\tlet abortPromise: Promise<typeof ABORTED> | undefined;\n\n\tif (signal !== undefined) {\n\t\tif (signal.aborted) {\n\t\t\tabortPromise = Promise.resolve(ABORTED);\n\t\t} else {\n\t\t\tabortPromise = new Promise<typeof ABORTED>((resolve) => {\n\t\t\t\tconst abortHandler = () => resolve(ABORTED);\n\t\t\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t\t\tremoveAbortListener = () => signal.removeEventListener(\"abort\", abortHandler);\n\t\t\t});\n\t\t}\n\t}\n\n\treturn {\n\t\tnext: async () => {\n\t\t\tif (signal?.aborted) {\n\t\t\t\tcloseAssistantIterator(iterator);\n\t\t\t\treturn Promise.reject(abortError(signal.reason));\n\t\t\t}\n\t\t\t// The start bound applies only until the provider proves the request is\n\t\t\t// alive with its first event; afterwards the idle bound governs as before.\n\t\t\tconst useStartBound = !sawFirstEvent && startTimeoutMs !== undefined;\n\t\t\tconst readTimeoutMs = useStartBound ? startTimeoutMs : idleTimeoutMs;\n\t\t\tconst makeTimeoutError = useStartBound\n\t\t\t\t? (ms: number) => new StreamStartTimeoutError(ms)\n\t\t\t\t: (ms: number) => new StreamIdleTimeoutError(ms);\n\t\t\tconst result = await readNextAssistantEvent(\n\t\t\t\titerator,\n\t\t\t\treadTimeoutMs,\n\t\t\t\tmakeTimeoutError,\n\t\t\t\tabortPromise,\n\t\t\t\tonIdleTimeout,\n\t\t\t\tstream,\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (!result.done) sawFirstEvent = true;\n\t\t\treturn result;\n\t\t},\n\t\tdispose: () => removeAbortListener?.(),\n\t};\n}\n\nasync function readNextAssistantEvent(\n\titerator: AsyncIterator<AssistantMessageEvent>,\n\tidleTimeoutMs: number | undefined,\n\tmakeTimeoutError: (timeoutMs: number) => Error,\n\tabortPromise: Promise<typeof ABORTED> | undefined,\n\tonIdleTimeout?: (error: Error) => void,\n\tstream?: Pick<AssistantMessageEventStream, \"hasPendingLocalWork\">,\n\tsignal?: AbortSignal,\n): Promise<IteratorResult<AssistantMessageEvent>> {\n\tif (idleTimeoutMs === undefined && abortPromise === undefined) {\n\t\treturn iterator.next();\n\t}\n\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\tlet settled = false;\n\n\treturn new Promise<IteratorResult<AssistantMessageEvent>>((resolve, reject) => {\n\t\tconst settle = (complete: () => void): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tif (timeout !== undefined) {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t}\n\t\t\tcomplete();\n\t\t};\n\n\t\tif (idleTimeoutMs !== undefined) {\n\t\t\tconst onIdleDeadline = () => {\n\t\t\t\t// A provider executing a server-requested tool locally (Cursor's\n\t\t\t\t// exec channel) legitimately emits no events while the tool runs.\n\t\t\t\t// That silence is tracked as local work on the stream; re-arm the\n\t\t\t\t// idle bound instead of killing a healthy request.\n\t\t\t\tif (stream?.hasPendingLocalWork?.()) {\n\t\t\t\t\ttimeout = setTimeout(onIdleDeadline, idleTimeoutMs);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst error = makeTimeoutError(idleTimeoutMs);\n\t\t\t\tcloseAssistantIterator(iterator);\n\t\t\t\tsettle(() => reject(error));\n\t\t\t\t// Abort after settling so the failure surfaces as an idle timeout,\n\t\t\t\t// not as a generic abort, while the dead request still gets torn down.\n\t\t\t\tonIdleTimeout?.(error);\n\t\t\t};\n\t\t\ttimeout = setTimeout(onIdleDeadline, idleTimeoutMs);\n\t\t}\n\n\t\tconst next = abortPromise ? Promise.race([iterator.next(), abortPromise]) : iterator.next();\n\t\tvoid next.then(\n\t\t\t(result) => {\n\t\t\t\tif (result === ABORTED) {\n\t\t\t\t\tcloseAssistantIterator(iterator);\n\t\t\t\t\tsettle(() => reject(abortError(signal?.reason)));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsettle(() => resolve(result));\n\t\t\t},\n\t\t\t(error: unknown) => settle(() => reject(error)),\n\t\t);\n\t});\n}\n\nfunction createIncompleteToolCallErrorMessage(toolName: string, errorMessage?: string): string {\n\tif (errorMessage !== undefined) {\n\t\treturn `${errorMessage}${errorMessage.endsWith(\".\") ? \"\" : \".\"} Re-issue the tool call with complete arguments.`;\n\t}\n\treturn `Tool call \"${toolName}\" was not executed: the response ended before the tool call was complete because it hit the output token limit. Re-issue the tool call with complete arguments.`;\n}\n\n/**\n * Fail all tool calls from an assistant message that was truncated by the\n * output token limit. Streamed tool-call arguments are finalized with a\n * best-effort JSON salvage parser, so a truncated message can yield tool calls\n * whose arguments parse and validate but are silently incomplete. None of them\n * are safe to execute; report each as an error so the model can re-issue them.\n */\nasync function failToolCallsFromTruncatedMessage(\n\ttoolCalls: AgentToolCall[],\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallBatch> {\n\tconst messages: ToolResultMessage[] = [];\n\tfor (const toolCall of toolCalls) {\n\t\tawait emit({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\t\tconst finalized: FinalizedToolCallOutcome = {\n\t\t\ttoolCall,\n\t\t\tresult: createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name)),\n\t\t\tisError: true,\n\t\t};\n\t\tawait emitToolExecutionEnd(finalized, emit);\n\t\tconst toolResultMessage = createToolResultMessage(finalized);\n\t\tawait emitToolResultMessage(toolResultMessage, emit);\n\t\tmessages.push(toolResultMessage);\n\t}\n\treturn { messages, terminate: false };\n}\n\n/**\n * Execute tool calls from an assistant message.\n */\nasync function executeToolCalls(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallBatch> {\n\t// Same filter as the loop's collection site (defense in depth): a block\n\t// stamped `kCursorExecResolved` was already executed by Cursor's exec\n\t// channel and its result buffered; running it again would duplicate a\n\t// side-effecting tool.\n\tconst toolCalls = assistantMessage.content.filter(\n\t\t(c): c is AgentToolCall => c.type === \"toolCall\" && !isCursorExecResolved(c as CursorExecResolvedCarrier),\n\t);\n\tif (config.toolExecution === \"sequential\") {\n\t\treturn executeToolCallsSequential(currentContext, assistantMessage, toolCalls, config, signal, emit);\n\t}\n\treturn executeToolCallsParallel(currentContext, assistantMessage, toolCalls, config, signal, emit);\n}\n\ntype ExecutedToolCallBatch = {\n\tmessages: ToolResultMessage[];\n\tterminate: boolean;\n};\n\nasync function executeToolCallsSequential(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCalls: AgentToolCall[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallBatch> {\n\tconst finalizedCalls: FinalizedToolCallOutcome[] = [];\n\tconst messages: ToolResultMessage[] = [];\n\n\tfor (const toolCall of toolCalls) {\n\t\tawait emit({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tconst preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);\n\t\tlet finalized: FinalizedToolCallOutcome;\n\t\tif (preparation.kind === \"immediate\") {\n\t\t\tfinalized = {\n\t\t\t\ttoolCall,\n\t\t\t\tresult: preparation.result,\n\t\t\t\tisError: preparation.isError,\n\t\t\t};\n\t\t} else {\n\t\t\tconst executed = await executePreparedToolCall(preparation, signal, emit);\n\t\t\tfinalized = await finalizeExecutedToolCall(\n\t\t\t\tcurrentContext,\n\t\t\t\tassistantMessage,\n\t\t\t\tpreparation,\n\t\t\t\texecuted,\n\t\t\t\tconfig,\n\t\t\t\tsignal,\n\t\t\t);\n\t\t}\n\n\t\tawait emitToolExecutionEnd(finalized, emit);\n\t\tconst toolResultMessage = createToolResultMessage(finalized);\n\t\tawait emitToolResultMessage(toolResultMessage, emit);\n\t\tfinalizedCalls.push(finalized);\n\t\tmessages.push(toolResultMessage);\n\n\t\tif (signal?.aborted) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn {\n\t\tmessages,\n\t\tterminate: shouldTerminateToolBatch(finalizedCalls),\n\t};\n}\n\nasync function executeToolCallsParallel(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCalls: AgentToolCall[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallBatch> {\n\tconst finalizedCalls: Promise<FinalizedToolCallOutcome>[] = [];\n\tconst preparedCalls: Array<{\n\t\tpreparation: PreparedToolCall | ImmediateToolCallOutcome;\n\t\tisSequential: boolean;\n\t\tdependencies: Promise<FinalizedToolCallOutcome>[];\n\t}> = [];\n\tlet lastSequentialCall: Promise<FinalizedToolCallOutcome> | undefined;\n\tlet currentParallelWave: Promise<FinalizedToolCallOutcome>[] = [];\n\n\tfor (const toolCall of toolCalls) {\n\t\tawait emit({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tconst preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);\n\t\tconst isSequential = isSequentialToolCall(currentContext, toolCall);\n\t\tconst dependencies = isSequential\n\t\t\t? [...(lastSequentialCall ? [lastSequentialCall] : []), ...currentParallelWave]\n\t\t\t: lastSequentialCall\n\t\t\t\t? [lastSequentialCall]\n\t\t\t\t: [];\n\n\t\tpreparedCalls.push({ preparation, isSequential, dependencies });\n\n\t\tif (isSequential) {\n\t\t\t// Dependencies are assigned in the second phase after all preflight hooks\n\t\t\t// have completed, so a later preflight abort vetoes every execution.\n\t\t\tlastSequentialCall = undefined;\n\t\t\tcurrentParallelWave = [];\n\t\t} else {\n\t\t\tcurrentParallelWave.push(Promise.resolve(undefined as never));\n\t\t}\n\n\t\tif (signal?.aborted) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tlet previousSequential: Promise<FinalizedToolCallOutcome> | undefined;\n\tlet previousWave: Promise<FinalizedToolCallOutcome>[] = [];\n\tfor (const { preparation, isSequential } of preparedCalls) {\n\t\tconst dependencies = isSequential\n\t\t\t? [...(previousSequential ? [previousSequential] : []), ...previousWave]\n\t\t\t: previousSequential\n\t\t\t\t? [previousSequential]\n\t\t\t\t: [];\n\t\tconst finalizedCall = (async () => {\n\t\t\tawait Promise.all(dependencies);\n\t\t\tconst finalized = signal?.aborted\n\t\t\t\t? { toolCall: preparation.toolCall, result: createErrorToolResult(\"Operation aborted\"), isError: true }\n\t\t\t\t: await runPreparedToolCall(currentContext, assistantMessage, preparation, config, signal, emit);\n\t\t\tawait emitToolExecutionEnd(finalized, emit);\n\t\t\treturn finalized;\n\t\t})();\n\t\tfinalizedCalls.push(finalizedCall);\n\t\tif (isSequential) {\n\t\t\tpreviousSequential = finalizedCall;\n\t\t\tpreviousWave = [];\n\t\t} else previousWave.push(finalizedCall);\n\t}\n\tconst orderedFinalizedCalls = await Promise.all(finalizedCalls);\n\tconst messages: ToolResultMessage[] = [];\n\tfor (const finalized of orderedFinalizedCalls) {\n\t\tconst toolResultMessage = createToolResultMessage(finalized);\n\t\tawait emitToolResultMessage(toolResultMessage, emit);\n\t\tmessages.push(toolResultMessage);\n\t}\n\n\treturn {\n\t\tmessages,\n\t\tterminate: shouldTerminateToolBatch(orderedFinalizedCalls),\n\t};\n}\n\nasync function runPreparedToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tpreparation: PreparedToolCall | ImmediateToolCallOutcome,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<FinalizedToolCallOutcome> {\n\tif (preparation.kind === \"immediate\") {\n\t\treturn {\n\t\t\ttoolCall: preparation.toolCall,\n\t\t\tresult: preparation.result,\n\t\t\tisError: preparation.isError,\n\t\t};\n\t}\n\n\tconst executed = await executePreparedToolCall(preparation, signal, emit);\n\treturn finalizeExecutedToolCall(currentContext, assistantMessage, preparation, executed, config, signal);\n}\n\nfunction isSequentialToolCall(currentContext: AgentContext, toolCall: AgentToolCall): boolean {\n\treturn currentContext.tools?.find((tool) => tool.name === toolCall.name)?.executionMode === \"sequential\";\n}\n\ntype PreparedToolCall = {\n\tkind: \"prepared\";\n\ttoolCall: AgentToolCall;\n\ttool: AgentTool;\n\targs: unknown;\n};\n\ntype ImmediateToolCallOutcome = {\n\tkind: \"immediate\";\n\ttoolCall: AgentToolCall;\n\tresult: AgentToolResult<unknown>;\n\tisError: boolean;\n};\n\ntype ExecutedToolCallOutcome = {\n\tresult: AgentToolResult<unknown>;\n\tisError: boolean;\n};\n\ntype FinalizedToolCallOutcome = {\n\ttoolCall: AgentToolCall;\n\tresult: AgentToolResult<unknown>;\n\tisError: boolean;\n};\n\nfunction shouldTerminateToolBatch(finalizedCalls: FinalizedToolCallOutcome[]): boolean {\n\treturn finalizedCalls.length > 0 && finalizedCalls.every((finalized) => finalized.result.terminate === true);\n}\n\nexport interface PreparedAgentToolCall {\n\ttoolCall: AgentToolCall;\n\ttool: AgentTool;\n\targs: unknown;\n}\n\nexport function prepareAgentToolCallArguments(tool: AgentTool, toolCall: AgentToolCall): AgentToolCall {\n\tif (!tool.prepareArguments) {\n\t\treturn toolCall;\n\t}\n\tconst preparedArguments = tool.prepareArguments(toolCall.arguments);\n\tif (preparedArguments === toolCall.arguments) {\n\t\treturn toolCall;\n\t}\n\treturn {\n\t\t...toolCall,\n\t\targuments: preparedArguments as Record<string, unknown>,\n\t};\n}\n\nexport function prepareAgentToolCall(tool: AgentTool, toolCall: AgentToolCall): PreparedAgentToolCall {\n\tconst preparedToolCall = prepareAgentToolCallArguments(tool, toolCall);\n\treturn {\n\t\ttoolCall: preparedToolCall,\n\t\ttool,\n\t\targs: validateToolArguments(tool, preparedToolCall),\n\t};\n}\n\nasync function prepareToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCall: AgentToolCall,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n): Promise<PreparedToolCall | ImmediateToolCallOutcome> {\n\tif (toolCall.incomplete === true) {\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\ttoolCall,\n\t\t\tresult: createErrorToolResult(createIncompleteToolCallErrorMessage(toolCall.name, toolCall.errorMessage)),\n\t\t\tisError: true,\n\t\t};\n\t}\n\n\tlet tool = currentContext.tools?.find((candidate) => candidate.name === toolCall.name);\n\tif (!tool && config.resolveUnknownToolCall) {\n\t\ttool = await config.resolveUnknownToolCall(toolCall.name, currentContext);\n\t}\n\tif (!tool) {\n\t\tconst hint = config.removedToolHints?.[toolCall.name];\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\ttoolCall,\n\t\t\tresult: createErrorToolResult(\n\t\t\t\thint === undefined ? `Tool ${toolCall.name} not found` : `Tool ${toolCall.name} not found. ${hint}`,\n\t\t\t),\n\t\t\tisError: true,\n\t\t};\n\t}\n\n\ttry {\n\t\tconst preparedToolCall = prepareAgentToolCall(tool, toolCall);\n\t\tconst validatedArgs = preparedToolCall.args;\n\t\tif (config.beforeToolCall) {\n\t\t\tconst beforeResult = await config.beforeToolCall(\n\t\t\t\t{\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\ttoolCall: preparedToolCall.toolCall,\n\t\t\t\t\targs: validatedArgs,\n\t\t\t\t\tcontext: currentContext,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (signal?.aborted) {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"immediate\",\n\t\t\t\t\ttoolCall,\n\t\t\t\t\tresult: createErrorToolResult(\"Operation aborted\"),\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (beforeResult?.block) {\n\t\t\t\tconst result = createErrorToolResult(beforeResult.reason || \"Tool execution was blocked\");\n\t\t\t\tif (beforeResult.terminate === true) {\n\t\t\t\t\tresult.terminate = true;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"immediate\",\n\t\t\t\t\ttoolCall,\n\t\t\t\t\tresult,\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tif (signal?.aborted) {\n\t\t\treturn {\n\t\t\t\tkind: \"immediate\",\n\t\t\t\ttoolCall,\n\t\t\t\tresult: createErrorToolResult(\"Operation aborted\"),\n\t\t\t\tisError: true,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"prepared\",\n\t\t\ttoolCall: preparedToolCall.toolCall,\n\t\t\ttool,\n\t\t\targs: validatedArgs,\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\ttoolCall,\n\t\t\tresult: createErrorToolResult(error instanceof Error ? error.message : String(error)),\n\t\t\tisError: true,\n\t\t};\n\t}\n}\n\n/**\n * Resolves as soon as `signal` aborts, so a tool that never settles and never\n * observes its signal cannot pin the run forever. Without this the abort has no\n * wakeup once `execute()` is entered: no `agent_end`, the session never goes\n * idle, and every queued prompt parks behind the session work barrier while the\n * TUI shows \"Running <tool>\" with a dead ESC.\n */\nfunction abortReleasePromise(signal: AbortSignal | undefined): Promise<typeof ABORTED> | undefined {\n\tif (signal === undefined) return undefined;\n\tif (signal.aborted) return Promise.resolve(ABORTED);\n\treturn new Promise<typeof ABORTED>((resolve) => {\n\t\tsignal.addEventListener(\"abort\", () => resolve(ABORTED), { once: true });\n\t});\n}\n\nasync function executePreparedToolCall(\n\tprepared: PreparedToolCall,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallOutcome> {\n\tconst updateEvents: Promise<void>[] = [];\n\tlet acceptingUpdates = true;\n\n\ttry {\n\t\tconst execution = prepared.tool.execute(prepared.toolCall.id, prepared.args as never, signal, (partialResult) => {\n\t\t\tif (!acceptingUpdates) return;\n\t\t\tupdateEvents.push(\n\t\t\t\tPromise.resolve(\n\t\t\t\t\temit({\n\t\t\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\t\t\ttoolCallId: prepared.toolCall.id,\n\t\t\t\t\t\ttoolName: prepared.toolCall.name,\n\t\t\t\t\t\targs: prepared.toolCall.arguments,\n\t\t\t\t\t\tpartialResult,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t\tconst abortRelease = abortReleasePromise(signal);\n\t\tconst settled = abortRelease ? await Promise.race([execution, abortRelease]) : await execution;\n\t\tif (settled === ABORTED) {\n\t\t\tvoid Promise.resolve(execution).catch(() => undefined);\n\t\t\tacceptingUpdates = false;\n\t\t\tawait Promise.all(updateEvents);\n\t\t\treturn { result: createErrorToolResult(\"Tool execution aborted\"), isError: true };\n\t\t}\n\t\tacceptingUpdates = false;\n\t\tawait Promise.all(updateEvents);\n\t\treturn { result: settled, isError: false };\n\t} catch (error) {\n\t\tacceptingUpdates = false;\n\t\tawait Promise.all(updateEvents);\n\t\treturn {\n\t\t\tresult: createErrorToolResult(error instanceof Error ? error.message : String(error)),\n\t\t\tisError: true,\n\t\t};\n\t} finally {\n\t\tacceptingUpdates = false;\n\t}\n}\n\nasync function finalizeExecutedToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tprepared: PreparedToolCall,\n\texecuted: ExecutedToolCallOutcome,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n): Promise<FinalizedToolCallOutcome> {\n\tlet result = executed.result;\n\tlet isError = executed.isError;\n\n\tif (config.afterToolCall) {\n\t\ttry {\n\t\t\tconst afterResult = await config.afterToolCall(\n\t\t\t\t{\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\ttoolCall: prepared.toolCall,\n\t\t\t\t\targs: prepared.args,\n\t\t\t\t\tresult,\n\t\t\t\t\tisError,\n\t\t\t\t\tcontext: currentContext,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (afterResult) {\n\t\t\t\tresult = {\n\t\t\t\t\t...result,\n\t\t\t\t\tcontent: afterResult.content ?? result.content,\n\t\t\t\t\tdetails: afterResult.details ?? result.details,\n\t\t\t\t\tusage: afterResult.usage ?? result.usage,\n\t\t\t\t\tterminate: afterResult.terminate ?? result.terminate,\n\t\t\t\t};\n\t\t\t\tisError = afterResult.isError ?? isError;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tresult = createErrorToolResult(error instanceof Error ? error.message : String(error));\n\t\t\tisError = true;\n\t\t}\n\t}\n\n\treturn {\n\t\ttoolCall: prepared.toolCall,\n\t\tresult,\n\t\tisError,\n\t};\n}\n\nfunction createErrorToolResult(message: string): AgentToolResult<unknown> {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: message }],\n\t\tdetails: {},\n\t};\n}\n\nasync function emitToolExecutionEnd(finalized: FinalizedToolCallOutcome, emit: AgentEventSink): Promise<void> {\n\tawait emit({\n\t\ttype: \"tool_execution_end\",\n\t\ttoolCallId: finalized.toolCall.id,\n\t\ttoolName: finalized.toolCall.name,\n\t\tresult: finalized.result,\n\t\tisError: finalized.isError,\n\t});\n}\n\nfunction createToolResultMessage(finalized: FinalizedToolCallOutcome): ToolResultMessage {\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: finalized.toolCall.id,\n\t\ttoolName: finalized.toolCall.name,\n\t\t// Untyped tools (JS extensions) can return results without content; normalize\n\t\t// so the null never enters session history or provider payloads.\n\t\tcontent: finalized.result.content ?? [],\n\t\tdetails: finalized.result.details,\n\t\tusage: finalized.result.usage,\n\t\t...(finalized.result.addedToolNames?.length ? { addedToolNames: finalized.result.addedToolNames } : {}),\n\t\tisError: finalized.isError,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nasync function emitToolResultMessage(toolResultMessage: ToolResultMessage, emit: AgentEventSink): Promise<void> {\n\tawait emit({ type: \"message_start\", message: toolResultMessage });\n\tawait emit({ type: \"message_end\", message: toolResultMessage });\n}\n"]}
|
|
@@ -7,6 +7,13 @@ export declare class ProviderRetryWatchdogAbortError extends Error {
|
|
|
7
7
|
readonly providerCause: string;
|
|
8
8
|
constructor(providerCause: string);
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Marks a terminal message whose `toolUse` stop reason was demoted because the provider sent no
|
|
12
|
+
* tool call. Demotion rewrites the stop reason, so this diagnostic is the only surviving evidence
|
|
13
|
+
* that the turn was malformed rather than a clean stop; downstream recovery keys on it.
|
|
14
|
+
*/
|
|
15
|
+
export declare const EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC = "empty_tool_use_terminal_state";
|
|
16
|
+
export declare function demoteToolUseWithoutToolCalls(message: AssistantMessage): AssistantMessage;
|
|
10
17
|
export declare function promoteStopWithPendingToolCalls(message: AssistantMessage): AssistantMessage;
|
|
11
18
|
export declare function shouldTerminateAssistantTurn(message: AssistantMessage): boolean;
|
|
12
19
|
export declare function isStreamIdleTimeoutError(error: unknown): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-terminal-state.d.ts","sourceRoot":"","sources":["../src/assistant-terminal-state.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAI1B,KAAK,iBAAiB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAWlD,KAAK,6BAA6B,GAAG,OAAO,CAAC,qBAAqB,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,CAAC;AAEhG,qBAAa,+BAAgC,SAAQ,KAAK;IACzD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAEnB,aAAa,EAAE,MAAM;CAKjC;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,CAI3F;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAE/E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEhE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACvC,cAAc,EAAE,gBAAgB,GAAG,IAAI,EACvC,mBAAmB,EAAE,SAAS,iBAAiB,EAAE,GAC/C,OAAO,CAMT;AAED,wBAAgB,qCAAqC,CACpD,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAC/B,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,EACpE,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,gBAAgB,GAAG,IAAI,GACrC,gBAAgB,CAiBlB;AAED,wBAAgB,iCAAiC,CAChD,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,6BAA6B,GAClC,gBAAgB,CAKlB"}
|
|
1
|
+
{"version":3,"file":"assistant-terminal-state.d.ts","sourceRoot":"","sources":["../src/assistant-terminal-state.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAI1B,KAAK,iBAAiB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAWlD,KAAK,6BAA6B,GAAG,OAAO,CAAC,qBAAqB,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,CAAC;AAEhG,qBAAa,+BAAgC,SAAQ,KAAK;IACzD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAEnB,aAAa,EAAE,MAAM;CAKjC;AAED;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,kCAAkC,CAAC;AAElF,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,CAWzF;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,CAI3F;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAE/E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEhE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACvC,cAAc,EAAE,gBAAgB,GAAG,IAAI,EACvC,mBAAmB,EAAE,SAAS,iBAAiB,EAAE,GAC/C,OAAO,CAMT;AAED,wBAAgB,qCAAqC,CACpD,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAC/B,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,EACpE,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,gBAAgB,GAAG,IAAI,GACrC,gBAAgB,CAiBlB;AAED,wBAAgB,iCAAiC,CAChD,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,6BAA6B,GAClC,gBAAgB,CAKlB"}
|
|
@@ -14,6 +14,25 @@ export class ProviderRetryWatchdogAbortError extends Error {
|
|
|
14
14
|
this.name = "ProviderRetryWatchdogAbortError";
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Marks a terminal message whose `toolUse` stop reason was demoted because the provider sent no
|
|
19
|
+
* tool call. Demotion rewrites the stop reason, so this diagnostic is the only surviving evidence
|
|
20
|
+
* that the turn was malformed rather than a clean stop; downstream recovery keys on it.
|
|
21
|
+
*/
|
|
22
|
+
export const EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC = "empty_tool_use_terminal_state";
|
|
23
|
+
export function demoteToolUseWithoutToolCalls(message) {
|
|
24
|
+
// Count raw blocks: cursor-resolved calls are legitimate completed tool calls and must not be demoted.
|
|
25
|
+
if (message.stopReason !== "toolUse" || message.content.some((block) => block.type === "toolCall"))
|
|
26
|
+
return message;
|
|
27
|
+
return {
|
|
28
|
+
...message,
|
|
29
|
+
stopReason: "stop",
|
|
30
|
+
diagnostics: [
|
|
31
|
+
...(message.diagnostics ?? []),
|
|
32
|
+
{ type: EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC, timestamp: Date.now(), details: {} },
|
|
33
|
+
],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
17
36
|
export function promoteStopWithPendingToolCalls(message) {
|
|
18
37
|
if (message.stopReason !== "stop")
|
|
19
38
|
return message;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-terminal-state.js","sourceRoot":"","sources":["../src/assistant-terminal-state.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype AssistantMessage,\n\ttype AssistantMessageEvent,\n\ttype CursorExecResolvedCarrier,\n\tisClassifierRefusal,\n\tisCursorExecResolved,\n\ttype ToolResultMessage,\n} from \"@earendil-works/pi-ai\";\nimport type { AgentLoopConfig } from \"./types.ts\";\n\nconst EMPTY_USAGE = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n} satisfies AssistantMessage[\"usage\"];\n\ntype TerminalAssistantMessageEvent = Extract<AssistantMessageEvent, { type: \"done\" | \"error\" }>;\n\nexport class ProviderRetryWatchdogAbortError extends Error {\n\treadonly providerCause: string;\n\n\tconstructor(providerCause: string) {\n\t\tsuper(providerCause);\n\t\tthis.providerCause = providerCause;\n\t\tthis.name = \"ProviderRetryWatchdogAbortError\";\n\t}\n}\n\nexport function promoteStopWithPendingToolCalls(message: AssistantMessage): AssistantMessage {\n\tif (message.stopReason !== \"stop\") return message;\n\tif (!message.content.some((block) => block.type === \"toolCall\")) return message;\n\treturn { ...message, stopReason: \"toolUse\" };\n}\n\nexport function shouldTerminateAssistantTurn(message: AssistantMessage): boolean {\n\treturn message.stopReason === \"error\" || message.stopReason === \"aborted\" || isClassifierRefusal(message);\n}\n\nexport function isStreamIdleTimeoutError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"StreamIdleTimeoutError\";\n}\n\n/**\n * After tools already finished (Cursor exec-resolved or buffered results),\n * a silent provider is a finished turn, not a failed one.\n */\nexport function shouldFinalizeIdleAsStop(\n\tpartialMessage: AssistantMessage | null,\n\tproviderToolResults: readonly ToolResultMessage[],\n): boolean {\n\tif (!partialMessage) return false;\n\tconst toolCalls = partialMessage.content.filter((block) => block.type === \"toolCall\");\n\tif (toolCalls.length === 0) return false;\n\tif (providerToolResults.length > 0) return true;\n\treturn toolCalls.every((block) => isCursorExecResolved(block as CursorExecResolvedCarrier));\n}\n\nexport function createTerminalFailureAssistantMessage(\n\tmodel: AgentLoopConfig[\"model\"],\n\treason: Extract<AssistantMessage[\"stopReason\"], \"aborted\" | \"error\">,\n\terror: unknown,\n\tpartialMessage: AssistantMessage | null,\n): AssistantMessage {\n\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: partialMessage?.content ?? [{ type: \"text\", text: \"\" }],\n\t\tapi: partialMessage?.api ?? model.api,\n\t\tprovider: partialMessage?.provider ?? model.provider,\n\t\tmodel: partialMessage?.model ?? model.id,\n\t\tresponseModel: partialMessage?.responseModel,\n\t\tresponseId: partialMessage?.responseId,\n\t\tdiagnostics: partialMessage?.diagnostics,\n\t\tusage: partialMessage?.usage ?? EMPTY_USAGE,\n\t\tstopReason: reason,\n\t\terrorMessage: errorMessage || (reason === \"aborted\" ? \"Request was aborted\" : \"Error\"),\n\t\t...(error instanceof ProviderRetryWatchdogAbortError ? { abortSource: \"provider\" as const } : {}),\n\t\ttimestamp: partialMessage?.timestamp ?? Date.now(),\n\t};\n}\n\nexport function normalizeTerminalAssistantMessage(\n\tmessage: AssistantMessage,\n\tevent: TerminalAssistantMessageEvent,\n): AssistantMessage {\n\tif (event.type === \"done\") return message;\n\tconst errorMessage = message.errorMessage ?? (event.reason === \"aborted\" ? \"Request was aborted\" : \"Error\");\n\tif (message.stopReason === event.reason && message.errorMessage === errorMessage) return message;\n\treturn { ...message, stopReason: event.reason, errorMessage };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"assistant-terminal-state.js","sourceRoot":"","sources":["../src/assistant-terminal-state.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype AssistantMessage,\n\ttype AssistantMessageEvent,\n\ttype CursorExecResolvedCarrier,\n\tisClassifierRefusal,\n\tisCursorExecResolved,\n\ttype ToolResultMessage,\n} from \"@earendil-works/pi-ai\";\nimport type { AgentLoopConfig } from \"./types.ts\";\n\nconst EMPTY_USAGE = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n} satisfies AssistantMessage[\"usage\"];\n\ntype TerminalAssistantMessageEvent = Extract<AssistantMessageEvent, { type: \"done\" | \"error\" }>;\n\nexport class ProviderRetryWatchdogAbortError extends Error {\n\treadonly providerCause: string;\n\n\tconstructor(providerCause: string) {\n\t\tsuper(providerCause);\n\t\tthis.providerCause = providerCause;\n\t\tthis.name = \"ProviderRetryWatchdogAbortError\";\n\t}\n}\n\n/**\n * Marks a terminal message whose `toolUse` stop reason was demoted because the provider sent no\n * tool call. Demotion rewrites the stop reason, so this diagnostic is the only surviving evidence\n * that the turn was malformed rather than a clean stop; downstream recovery keys on it.\n */\nexport const EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC = \"empty_tool_use_terminal_state\";\n\nexport function demoteToolUseWithoutToolCalls(message: AssistantMessage): AssistantMessage {\n\t// Count raw blocks: cursor-resolved calls are legitimate completed tool calls and must not be demoted.\n\tif (message.stopReason !== \"toolUse\" || message.content.some((block) => block.type === \"toolCall\")) return message;\n\treturn {\n\t\t...message,\n\t\tstopReason: \"stop\",\n\t\tdiagnostics: [\n\t\t\t...(message.diagnostics ?? []),\n\t\t\t{ type: EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC, timestamp: Date.now(), details: {} },\n\t\t],\n\t};\n}\n\nexport function promoteStopWithPendingToolCalls(message: AssistantMessage): AssistantMessage {\n\tif (message.stopReason !== \"stop\") return message;\n\tif (!message.content.some((block) => block.type === \"toolCall\")) return message;\n\treturn { ...message, stopReason: \"toolUse\" };\n}\n\nexport function shouldTerminateAssistantTurn(message: AssistantMessage): boolean {\n\treturn message.stopReason === \"error\" || message.stopReason === \"aborted\" || isClassifierRefusal(message);\n}\n\nexport function isStreamIdleTimeoutError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"StreamIdleTimeoutError\";\n}\n\n/**\n * After tools already finished (Cursor exec-resolved or buffered results),\n * a silent provider is a finished turn, not a failed one.\n */\nexport function shouldFinalizeIdleAsStop(\n\tpartialMessage: AssistantMessage | null,\n\tproviderToolResults: readonly ToolResultMessage[],\n): boolean {\n\tif (!partialMessage) return false;\n\tconst toolCalls = partialMessage.content.filter((block) => block.type === \"toolCall\");\n\tif (toolCalls.length === 0) return false;\n\tif (providerToolResults.length > 0) return true;\n\treturn toolCalls.every((block) => isCursorExecResolved(block as CursorExecResolvedCarrier));\n}\n\nexport function createTerminalFailureAssistantMessage(\n\tmodel: AgentLoopConfig[\"model\"],\n\treason: Extract<AssistantMessage[\"stopReason\"], \"aborted\" | \"error\">,\n\terror: unknown,\n\tpartialMessage: AssistantMessage | null,\n): AssistantMessage {\n\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: partialMessage?.content ?? [{ type: \"text\", text: \"\" }],\n\t\tapi: partialMessage?.api ?? model.api,\n\t\tprovider: partialMessage?.provider ?? model.provider,\n\t\tmodel: partialMessage?.model ?? model.id,\n\t\tresponseModel: partialMessage?.responseModel,\n\t\tresponseId: partialMessage?.responseId,\n\t\tdiagnostics: partialMessage?.diagnostics,\n\t\tusage: partialMessage?.usage ?? EMPTY_USAGE,\n\t\tstopReason: reason,\n\t\terrorMessage: errorMessage || (reason === \"aborted\" ? \"Request was aborted\" : \"Error\"),\n\t\t...(error instanceof ProviderRetryWatchdogAbortError ? { abortSource: \"provider\" as const } : {}),\n\t\ttimestamp: partialMessage?.timestamp ?? Date.now(),\n\t};\n}\n\nexport function normalizeTerminalAssistantMessage(\n\tmessage: AssistantMessage,\n\tevent: TerminalAssistantMessageEvent,\n): AssistantMessage {\n\tif (event.type === \"done\") return message;\n\tconst errorMessage = message.errorMessage ?? (event.reason === \"aborted\" ? \"Request was aborted\" : \"Error\");\n\tif (message.stopReason === event.reason && message.errorMessage === errorMessage) return message;\n\treturn { ...message, stopReason: event.reason, errorMessage };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"empty-assistant-recovery.d.ts","sourceRoot":"","sources":["../src/empty-assistant-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,GAAG,EAQR,KAAK,KAAK,EAEV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"empty-assistant-recovery.d.ts","sourceRoot":"","sources":["../src/empty-assistant-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,GAAG,EAQR,KAAK,KAAK,EAEV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAoH3C,wBAAgB,0BAA0B,CAAC,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,QAAQ,GAAG,QAAQ,CAMnH"}
|
|
@@ -1,30 +1,28 @@
|
|
|
1
1
|
import { createAssistantMessageEventStream, getToolCallFormat, hasVisibleAssistantContent, hasVisibleText, shouldRecoverTextToolCalls, } from "@earendil-works/pi-ai";
|
|
2
2
|
const EMPTY_RESPONSE_ERROR = "Model returned an empty response twice";
|
|
3
|
+
const EMPTY_TOOL_USE_ERROR = "Model returned tool_use without a tool call twice";
|
|
3
4
|
function isEmptyStop(message) {
|
|
4
5
|
return message.stopReason === "stop" && !hasVisibleAssistantContent(message);
|
|
5
6
|
}
|
|
7
|
+
function isEmptyToolUse(message) {
|
|
8
|
+
return message.stopReason === "toolUse" && !message.content.some((block) => block.type === "toolCall");
|
|
9
|
+
}
|
|
6
10
|
function eventStartsVisibleContent(event) {
|
|
7
11
|
return event.type === "toolcall_start" || (event.type === "text_delta" && hasVisibleText(event.delta));
|
|
8
12
|
}
|
|
9
|
-
function appendRetryDiagnostic(message) {
|
|
13
|
+
function appendRetryDiagnostic(message, type = "empty_assistant_response_recovery") {
|
|
10
14
|
return {
|
|
11
15
|
...message,
|
|
12
|
-
diagnostics: [
|
|
13
|
-
...(message.diagnostics ?? []),
|
|
14
|
-
{
|
|
15
|
-
type: "empty_assistant_response_recovery",
|
|
16
|
-
timestamp: Date.now(),
|
|
17
|
-
details: { retries: 1 },
|
|
18
|
-
},
|
|
19
|
-
],
|
|
16
|
+
diagnostics: [...(message.diagnostics ?? []), { type, timestamp: Date.now(), details: { retries: 1 } }],
|
|
20
17
|
};
|
|
21
18
|
}
|
|
22
|
-
function createEmptyResponseFailure(message) {
|
|
19
|
+
function createEmptyResponseFailure(message, toolUse = false) {
|
|
20
|
+
const errorMessage = toolUse ? EMPTY_TOOL_USE_ERROR : EMPTY_RESPONSE_ERROR;
|
|
23
21
|
return {
|
|
24
|
-
...appendRetryDiagnostic(message),
|
|
25
|
-
content: [{ type: "text", text:
|
|
22
|
+
...appendRetryDiagnostic(message, toolUse ? "empty_tool_use_response_recovery" : undefined),
|
|
23
|
+
content: [{ type: "text", text: errorMessage }],
|
|
26
24
|
stopReason: "error",
|
|
27
|
-
errorMessage
|
|
25
|
+
errorMessage,
|
|
28
26
|
};
|
|
29
27
|
}
|
|
30
28
|
function createRetryingStream(firstStream, createStream) {
|
|
@@ -39,17 +37,23 @@ function createRetryingStream(firstStream, createStream) {
|
|
|
39
37
|
let retry = false;
|
|
40
38
|
for await (const event of stream) {
|
|
41
39
|
if (event.type === "done") {
|
|
42
|
-
|
|
40
|
+
const emptyToolUse = isEmptyToolUse(event.message);
|
|
41
|
+
if (isEmptyStop(event.message) || emptyToolUse) {
|
|
43
42
|
if (!retrying) {
|
|
44
43
|
retry = true;
|
|
45
44
|
break;
|
|
46
45
|
}
|
|
47
|
-
const error = createEmptyResponseFailure(event.message);
|
|
46
|
+
const error = createEmptyResponseFailure(event.message, emptyToolUse);
|
|
48
47
|
outerStream.push({ type: "error", reason: "error", error });
|
|
49
48
|
outerStream.end();
|
|
50
49
|
return;
|
|
51
50
|
}
|
|
52
|
-
const terminal = retrying
|
|
51
|
+
const terminal = retrying
|
|
52
|
+
? {
|
|
53
|
+
...event,
|
|
54
|
+
message: appendRetryDiagnostic(event.message, isEmptyToolUse(event.message) ? "empty_tool_use_response_recovery" : undefined),
|
|
55
|
+
}
|
|
56
|
+
: event;
|
|
53
57
|
if (!forwarding) {
|
|
54
58
|
for (const pending of buffered)
|
|
55
59
|
outerStream.push(pending);
|
|
@@ -92,6 +96,10 @@ function createRetryingStream(firstStream, createStream) {
|
|
|
92
96
|
})();
|
|
93
97
|
return outerStream;
|
|
94
98
|
}
|
|
99
|
+
// Wrapping replaces the provider stream with a buffering proxy, which does not carry the
|
|
100
|
+
// underlying stream's liveness surface (trackLocalWork/hasPendingLocalWork) that the loop's
|
|
101
|
+
// idle watchdog reads. Only wrap models that actually need stream-level recovery; the
|
|
102
|
+
// empty-tool_use contradiction is normalized for every model by the agent loop instead.
|
|
95
103
|
export function withEmptyAssistantRecovery(model, streamFunction) {
|
|
96
104
|
if (!shouldRecoverTextToolCalls(model) && getToolCallFormat(model) === undefined)
|
|
97
105
|
return streamFunction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"empty-assistant-recovery.js","sourceRoot":"","sources":["../src/empty-assistant-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,iCAAiC,EACjC,iBAAiB,EACjB,0BAA0B,EAC1B,cAAc,EAEd,0BAA0B,GAC1B,MAAM,uBAAuB,CAAC;AAK/B,MAAM,oBAAoB,GAAG,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"empty-assistant-recovery.js","sourceRoot":"","sources":["../src/empty-assistant-recovery.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEvent,\n\ttype AssistantMessageEventStream,\n\tcreateAssistantMessageEventStream,\n\tgetToolCallFormat,\n\thasVisibleAssistantContent,\n\thasVisibleText,\n\ttype Model,\n\tshouldRecoverTextToolCalls,\n} from \"@earendil-works/pi-ai\";\nimport type { StreamFn } from \"./types.ts\";\n\ntype StreamFactory = () => AssistantMessageEventStream | Promise<AssistantMessageEventStream>;\n\nconst EMPTY_RESPONSE_ERROR = \"Model returned an empty response twice\";\nconst EMPTY_TOOL_USE_ERROR = \"Model returned tool_use without a tool call twice\";\n\nfunction isEmptyStop(message: AssistantMessage): boolean {\n\treturn message.stopReason === \"stop\" && !hasVisibleAssistantContent(message);\n}\n\nfunction isEmptyToolUse(message: AssistantMessage): boolean {\n\treturn message.stopReason === \"toolUse\" && !message.content.some((block) => block.type === \"toolCall\");\n}\n\nfunction eventStartsVisibleContent(event: AssistantMessageEvent): boolean {\n\treturn event.type === \"toolcall_start\" || (event.type === \"text_delta\" && hasVisibleText(event.delta));\n}\n\nfunction appendRetryDiagnostic(\n\tmessage: AssistantMessage,\n\ttype = \"empty_assistant_response_recovery\",\n): AssistantMessage {\n\treturn {\n\t\t...message,\n\t\tdiagnostics: [...(message.diagnostics ?? []), { type, timestamp: Date.now(), details: { retries: 1 } }],\n\t};\n}\n\nfunction createEmptyResponseFailure(message: AssistantMessage, toolUse = false): AssistantMessage {\n\tconst errorMessage = toolUse ? EMPTY_TOOL_USE_ERROR : EMPTY_RESPONSE_ERROR;\n\treturn {\n\t\t...appendRetryDiagnostic(message, toolUse ? \"empty_tool_use_response_recovery\" : undefined),\n\t\tcontent: [{ type: \"text\", text: errorMessage }],\n\t\tstopReason: \"error\",\n\t\terrorMessage,\n\t};\n}\n\nfunction createRetryingStream(firstStream: AssistantMessageEventStream, createStream: StreamFactory) {\n\tconst outerStream = createAssistantMessageEventStream();\n\n\tvoid (async (): Promise<void> => {\n\t\ttry {\n\t\t\tlet stream = firstStream;\n\t\t\tlet retrying = false;\n\t\t\tfor (;;) {\n\t\t\t\tconst buffered: AssistantMessageEvent[] = [];\n\t\t\t\tlet forwarding = false;\n\t\t\t\tlet retry = false;\n\t\t\t\tfor await (const event of stream) {\n\t\t\t\t\tif (event.type === \"done\") {\n\t\t\t\t\t\tconst emptyToolUse = isEmptyToolUse(event.message);\n\t\t\t\t\t\tif (isEmptyStop(event.message) || emptyToolUse) {\n\t\t\t\t\t\t\tif (!retrying) {\n\t\t\t\t\t\t\t\tretry = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst error = createEmptyResponseFailure(event.message, emptyToolUse);\n\t\t\t\t\t\t\touterStream.push({ type: \"error\", reason: \"error\", error });\n\t\t\t\t\t\t\touterStream.end();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst terminal = retrying\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\t\t\tmessage: appendRetryDiagnostic(\n\t\t\t\t\t\t\t\t\t\tevent.message,\n\t\t\t\t\t\t\t\t\t\tisEmptyToolUse(event.message) ? \"empty_tool_use_response_recovery\" : undefined,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: event;\n\t\t\t\t\t\tif (!forwarding) {\n\t\t\t\t\t\t\tfor (const pending of buffered) outerStream.push(pending);\n\t\t\t\t\t\t}\n\t\t\t\t\t\touterStream.push(terminal);\n\t\t\t\t\t\touterStream.end();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.type === \"error\") {\n\t\t\t\t\t\tif (!forwarding) {\n\t\t\t\t\t\t\tfor (const pending of buffered) outerStream.push(pending);\n\t\t\t\t\t\t}\n\t\t\t\t\t\touterStream.push(event);\n\t\t\t\t\t\touterStream.end();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (forwarding) {\n\t\t\t\t\t\touterStream.push(event);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tbuffered.push(event);\n\t\t\t\t\tif (eventStartsVisibleContent(event)) {\n\t\t\t\t\t\tfor (const pending of buffered) outerStream.push(pending);\n\t\t\t\t\t\tforwarding = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!retry) {\n\t\t\t\t\touterStream.end(retrying ? appendRetryDiagnostic(await stream.result()) : await stream.result());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tretrying = true;\n\t\t\t\tstream = await createStream();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\touterStream.fail(error);\n\t\t}\n\t})();\n\n\treturn outerStream;\n}\n\n// Wrapping replaces the provider stream with a buffering proxy, which does not carry the\n// underlying stream's liveness surface (trackLocalWork/hasPendingLocalWork) that the loop's\n// idle watchdog reads. Only wrap models that actually need stream-level recovery; the\n// empty-tool_use contradiction is normalized for every model by the agent loop instead.\nexport function withEmptyAssistantRecovery<TApi extends Api>(model: Model<TApi>, streamFunction: StreamFn): StreamFn {\n\tif (!shouldRecoverTextToolCalls(model) && getToolCallFormat(model) === undefined) return streamFunction;\n\treturn async (requestedModel, context, options) => {\n\t\tconst createStream = (): ReturnType<StreamFn> => streamFunction(requestedModel, context, options);\n\t\treturn createRetryingStream(await createStream(), createStream);\n\t};\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export type { AttributeValue, ExactTelemetryAttributes, InferEventAttributes, In
|
|
|
3
3
|
export { createTypedSpanStarter, defineTelemetrySchema, InMemoryTelemetryContext, NOOP_TELEMETRY_CONTEXT, } from "@earendil-works/pi-telemetry";
|
|
4
4
|
export * from "./agent.ts";
|
|
5
5
|
export * from "./agent-loop.ts";
|
|
6
|
-
export { ProviderRetryWatchdogAbortError } from "./assistant-terminal-state.ts";
|
|
6
|
+
export { EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC, ProviderRetryWatchdogAbortError } from "./assistant-terminal-state.ts";
|
|
7
7
|
export * from "./harness/agent-harness.ts";
|
|
8
8
|
export { type BranchPreparation, type BranchSummaryDetails, type BranchSummaryResult, type CollectEntriesResult, collectEntriesForBranchSummary, type FileOperations, type GenerateBranchSummaryOptions, generateBranchSummary, prepareBranchEntries, } from "./harness/compaction/branch-summarization.ts";
|
|
9
9
|
export { type CompactionPreparation, type CompactionSettings, type CompactResult, calculateContextTokens, compact, DEFAULT_COMPACTION_SETTINGS, estimateContextTokens, estimateTokens, findCutPoint, findTurnStartIndex, generateSummary, generateSummaryWithUsage, getLastAssistantUsage, prepareCompaction, serializeConversation, shouldCompact, } from "./harness/compaction/compaction.ts";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,YAAY,EACX,cAAc,EACd,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,kCAAkC,EAClC,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,cAAc,IAAI,uBAAuB,EACzC,WAAW,EACX,UAAU,EACV,4BAA4B,EAC5B,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,EAChB,iCAAiC,EACjC,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,gCAAgC,EAChC,kCAAkC,EAClC,4BAA4B,EAC5B,uBAAuB,EACvB,kCAAkC,EAClC,wBAAwB,EACxB,aAAa,EACb,uBAAuB,EACvB,iCAAiC,EACjC,gBAAgB,GAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACtB,MAAM,8BAA8B,CAAC;AACtC,cAAc,YAAY,CAAC;AAE3B,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export { createTypedSpanStarter, defineTelemetrySchema, InMemoryTelemetryContext
|
|
|
4
4
|
export * from "./agent.js";
|
|
5
5
|
// Loop functions
|
|
6
6
|
export * from "./agent-loop.js";
|
|
7
|
-
export { ProviderRetryWatchdogAbortError } from "./assistant-terminal-state.js";
|
|
7
|
+
export { EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC, ProviderRetryWatchdogAbortError } from "./assistant-terminal-state.js";
|
|
8
8
|
export * from "./harness/agent-harness.js";
|
|
9
9
|
export { collectEntriesForBranchSummary, generateBranchSummary, prepareBranchEntries, } from "./harness/compaction/branch-summarization.js";
|
|
10
10
|
export { calculateContextTokens, compact, DEFAULT_COMPACTION_SETTINGS, estimateContextTokens, estimateTokens, findCutPoint, findTurnStartIndex, generateSummary, generateSummaryWithUsage, getLastAssistantUsage, prepareCompaction, serializeConversation, shouldCompact, } from "./harness/compaction/compaction.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AAEb,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAkC/C,OAAO,EACN,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACtB,MAAM,8BAA8B,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,iBAAiB;AACjB,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AAEb,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAkC/C,OAAO,EACN,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACtB,MAAM,8BAA8B,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,iBAAiB;AACjB,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,kCAAkC,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AACpH,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAKN,8BAA8B,EAG9B,qBAAqB,EACrB,oBAAoB,GACpB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAIN,sBAAsB,EACtB,OAAO,EACP,2BAA2B,EAC3B,qBAAqB,EACrB,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,GACb,MAAM,oCAAoC,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,UAAU;AACV,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAmB3C,OAAO,EACN,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,WAAW,EACX,gBAAgB,GAChB,MAAM,wBAAwB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAMN,kBAAkB,EAElB,eAAe,EAGf,cAAc,EAEd,GAAG,EACH,SAAS,EAKT,UAAU,EACV,cAAc,EACd,EAAE,EAKF,OAAO,GACP,MAAM,oBAAoB,CAAC;AAC5B,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,QAAQ;AACR,cAAc,YAAY,CAAC","sourcesContent":["// Core Agent\n\nexport { uuidv7 } from \"@earendil-works/pi-ai\";\nexport type {\n\tAttributeValue,\n\tExactTelemetryAttributes,\n\tInferEventAttributes,\n\tInferOptionalAttributes,\n\tInferRequiredAndOptionalAttributes,\n\tInferStartAttributes,\n\tRecordedTelemetryEvent,\n\tRecordedTelemetrySpan,\n\tSchemaTelemetrySpan,\n\tSpanAttributes,\n\tSpanAttributes as TelemetrySpanAttributes,\n\tSpanOptions,\n\tSpanStatus,\n\tTelemetryAttributeDefinition,\n\tTelemetryAttributeMetadata,\n\tTelemetryAttributeType,\n\tTelemetryContext,\n\tTelemetryEventAttributeDefinition,\n\tTelemetryEventDefinition,\n\tTelemetryParentDefinition,\n\tTelemetrySchemaDefinition,\n\tTelemetrySchemaSpanEndAttributes,\n\tTelemetrySchemaSpanEventAttributes,\n\tTelemetrySchemaSpanEventName,\n\tTelemetrySchemaSpanName,\n\tTelemetrySchemaSpanStartAttributes,\n\tTelemetrySchemaSpanUnion,\n\tTelemetrySpan,\n\tTelemetrySpanDefinition,\n\tTelemetryStartAttributeDefinition,\n\tTypedSpanStarter,\n} from \"@earendil-works/pi-telemetry\";\nexport {\n\tcreateTypedSpanStarter,\n\tdefineTelemetrySchema,\n\tInMemoryTelemetryContext,\n\tNOOP_TELEMETRY_CONTEXT,\n} from \"@earendil-works/pi-telemetry\";\nexport * from \"./agent.ts\";\n// Loop functions\nexport * from \"./agent-loop.ts\";\nexport { EMPTY_TOOL_USE_DEMOTION_DIAGNOSTIC, ProviderRetryWatchdogAbortError } from \"./assistant-terminal-state.ts\";\nexport * from \"./harness/agent-harness.ts\";\nexport {\n\ttype BranchPreparation,\n\ttype BranchSummaryDetails,\n\ttype BranchSummaryResult,\n\ttype CollectEntriesResult,\n\tcollectEntriesForBranchSummary,\n\ttype FileOperations,\n\ttype GenerateBranchSummaryOptions,\n\tgenerateBranchSummary,\n\tprepareBranchEntries,\n} from \"./harness/compaction/branch-summarization.ts\";\nexport {\n\ttype CompactionPreparation,\n\ttype CompactionSettings,\n\ttype CompactResult,\n\tcalculateContextTokens,\n\tcompact,\n\tDEFAULT_COMPACTION_SETTINGS,\n\testimateContextTokens,\n\testimateTokens,\n\tfindCutPoint,\n\tfindTurnStartIndex,\n\tgenerateSummary,\n\tgenerateSummaryWithUsage,\n\tgetLastAssistantUsage,\n\tprepareCompaction,\n\tserializeConversation,\n\tshouldCompact,\n} from \"./harness/compaction/compaction.ts\";\nexport * from \"./harness/messages.ts\";\nexport * from \"./harness/prompt-templates.ts\";\n// Harness\nexport * from \"./harness/result.ts\";\nexport * from \"./harness/session/index.ts\";\nexport * from \"./harness/skills.ts\";\nexport * from \"./harness/system-prompt.ts\";\nexport type {\n\tAiSpan,\n\tAiSpanAttributes,\n\tAiSpanEndAttributes,\n\tAiSpanEventAttributes,\n\tAiSpanEventName,\n\tAiSpanName,\n\tAiSpanStartAttributes,\n\tAiTelemetrySpan,\n\tHarnessSpan,\n\tHarnessSpanAttributes,\n\tHarnessSpanEndAttributes,\n\tHarnessSpanEventAttributes,\n\tHarnessSpanEventName,\n\tHarnessSpanName,\n\tHarnessSpanStartAttributes,\n\tHarnessTelemetrySpan,\n} from \"./harness/telemetry.ts\";\nexport {\n\tAGENT_TELEMETRY_SCHEMAS,\n\tAI_TELEMETRY_SCHEMA,\n\tHARNESS_TELEMETRY_SCHEMA,\n\tstartAiSpan,\n\tstartHarnessSpan,\n} from \"./harness/telemetry.ts\";\nexport * from \"./harness/tools/index.ts\";\nexport {\n\ttype AgentHarnessResources,\n\ttype AgentHarnessStreamOptions,\n\ttype AgentHarnessStreamOptionsPatch,\n\ttype AgentHarnessTool,\n\ttype AgentHarnessToolContextSource,\n\tBranchSummaryError,\n\ttype BranchSummaryErrorCode,\n\tCompactionError,\n\ttype CompactionErrorCode,\n\ttype ExecutionEnv,\n\tExecutionError,\n\ttype ExecutionErrorCode,\n\terr,\n\tFileError,\n\ttype FileErrorCode,\n\ttype FileInfo,\n\ttype FileKind,\n\ttype FileSystem,\n\tgetOrThrow,\n\tgetOrUndefined,\n\tok,\n\ttype PromptTemplate,\n\ttype Shell,\n\ttype ShellExecOptions,\n\ttype Skill,\n\ttoError,\n} from \"./harness/types.ts\";\nexport * from \"./harness/utils/shell-output.ts\";\nexport * from \"./harness/utils/truncate.ts\";\n// Proxy utilities\nexport * from \"./proxy.ts\";\nexport * from \"./search/index.ts\";\n// Stream defaults\nexport { setDefaultStreamFn } from \"./stream-fn.ts\";\n// Types\nexport * from \"./types.ts\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-yeongyu/senpi-agent-core",
|
|
3
|
-
"version": "2026.9.
|
|
3
|
+
"version": "2026.9.9-2",
|
|
4
4
|
"description": "General-purpose agent with transport abstraction, state management, and attachment support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"prepublishOnly": "npm run build"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.9.
|
|
39
|
-
"@earendil-works/pi-telemetry": "npm:@code-yeongyu/senpi-telemetry@2026.9.
|
|
38
|
+
"@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.9.9-2",
|
|
39
|
+
"@earendil-works/pi-telemetry": "npm:@code-yeongyu/senpi-telemetry@2026.9.9-2",
|
|
40
40
|
"diff": "9.0.0",
|
|
41
41
|
"ignore": "7.0.6",
|
|
42
42
|
"typebox": "1.3.18",
|