@truefoundry/trueforge-core 0.1.0-rc.0 → 0.1.1

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.
Files changed (184) hide show
  1. package/README.md +27 -0
  2. package/dist/agent-session/TurnResourceResolver.d.ts.map +1 -1
  3. package/dist/agent-session/TurnResourceResolver.js +6 -2
  4. package/dist/agent-session/TurnResourceResolver.js.map +1 -1
  5. package/dist/agent-session/TurnResourceResolver.mjs +6 -2
  6. package/dist/agent-session/TurnResourceResolver.mjs.map +1 -1
  7. package/dist/agent-session/schemas/turn.d.ts.map +1 -1
  8. package/dist/agent-session/schemas/turn.js +3 -1
  9. package/dist/agent-session/schemas/turn.js.map +1 -1
  10. package/dist/agent-session/schemas/turn.mjs +3 -1
  11. package/dist/agent-session/schemas/turn.mjs.map +1 -1
  12. package/dist/agent-session/store/InMemorySessionStore.d.ts.map +1 -1
  13. package/dist/agent-session/store/InMemorySessionStore.js +24 -8
  14. package/dist/agent-session/store/InMemorySessionStore.js.map +1 -1
  15. package/dist/agent-session/store/InMemorySessionStore.mjs +24 -8
  16. package/dist/agent-session/store/InMemorySessionStore.mjs.map +1 -1
  17. package/dist/agent-session/store/OffsetPageToken.d.ts.map +1 -1
  18. package/dist/agent-session/store/OffsetPageToken.js +3 -1
  19. package/dist/agent-session/store/OffsetPageToken.js.map +1 -1
  20. package/dist/agent-session/store/OffsetPageToken.mjs +3 -1
  21. package/dist/agent-session/store/OffsetPageToken.mjs.map +1 -1
  22. package/dist/agent-session/store/SessionListPageToken.d.ts.map +1 -1
  23. package/dist/agent-session/store/SessionListPageToken.js +3 -1
  24. package/dist/agent-session/store/SessionListPageToken.js.map +1 -1
  25. package/dist/agent-session/store/SessionListPageToken.mjs +3 -1
  26. package/dist/agent-session/store/SessionListPageToken.mjs.map +1 -1
  27. package/dist/core/InstructionBuilder.d.ts.map +1 -1
  28. package/dist/core/InstructionBuilder.js +12 -4
  29. package/dist/core/InstructionBuilder.js.map +1 -1
  30. package/dist/core/InstructionBuilder.mjs +12 -4
  31. package/dist/core/InstructionBuilder.mjs.map +1 -1
  32. package/dist/core/capabilities/builtins/AskUserQuestion.d.ts.map +1 -1
  33. package/dist/core/capabilities/builtins/AskUserQuestion.js +5 -0
  34. package/dist/core/capabilities/builtins/AskUserQuestion.js.map +1 -1
  35. package/dist/core/capabilities/builtins/AskUserQuestion.mjs +5 -0
  36. package/dist/core/capabilities/builtins/AskUserQuestion.mjs.map +1 -1
  37. package/dist/core/capabilities/builtins/LargeToolResponse.d.ts.map +1 -1
  38. package/dist/core/capabilities/builtins/LargeToolResponse.js +6 -2
  39. package/dist/core/capabilities/builtins/LargeToolResponse.js.map +1 -1
  40. package/dist/core/capabilities/builtins/LargeToolResponse.mjs +6 -2
  41. package/dist/core/capabilities/builtins/LargeToolResponse.mjs.map +1 -1
  42. package/dist/core/index.d.ts +9 -3
  43. package/dist/core/index.d.ts.map +1 -1
  44. package/dist/core/index.js +25 -0
  45. package/dist/core/index.js.map +1 -1
  46. package/dist/core/index.mjs +24 -2
  47. package/dist/core/index.mjs.map +1 -1
  48. package/dist/core/llm/VercelAILLM.d.ts +1 -0
  49. package/dist/core/llm/VercelAILLM.d.ts.map +1 -1
  50. package/dist/core/llm/VercelAILLM.js +13 -14
  51. package/dist/core/llm/VercelAILLM.js.map +1 -1
  52. package/dist/core/llm/VercelAILLM.mjs +13 -15
  53. package/dist/core/llm/VercelAILLM.mjs.map +1 -1
  54. package/dist/core/mcp/RemoteMCP.d.ts.map +1 -1
  55. package/dist/core/mcp/RemoteMCP.js +15 -5
  56. package/dist/core/mcp/RemoteMCP.js.map +1 -1
  57. package/dist/core/mcp/RemoteMCP.mjs +15 -5
  58. package/dist/core/mcp/RemoteMCP.mjs.map +1 -1
  59. package/dist/core/mcp/ToolSelectorPolicy.d.ts.map +1 -1
  60. package/dist/core/mcp/ToolSelectorPolicy.js +3 -1
  61. package/dist/core/mcp/ToolSelectorPolicy.js.map +1 -1
  62. package/dist/core/mcp/ToolSelectorPolicy.mjs +3 -1
  63. package/dist/core/mcp/ToolSelectorPolicy.mjs.map +1 -1
  64. package/dist/core/mcp/ToolSet.d.ts.map +1 -1
  65. package/dist/core/mcp/ToolSet.js +9 -3
  66. package/dist/core/mcp/ToolSet.js.map +1 -1
  67. package/dist/core/mcp/ToolSet.mjs +9 -3
  68. package/dist/core/mcp/ToolSet.mjs.map +1 -1
  69. package/dist/core/mcp/convertMCPServers.d.ts.map +1 -1
  70. package/dist/core/mcp/convertMCPServers.js +6 -2
  71. package/dist/core/mcp/convertMCPServers.js.map +1 -1
  72. package/dist/core/mcp/convertMCPServers.mjs +6 -2
  73. package/dist/core/mcp/convertMCPServers.mjs.map +1 -1
  74. package/dist/core/mcp/remoteMcpClient.d.ts.map +1 -1
  75. package/dist/core/mcp/remoteMcpClient.js +21 -7
  76. package/dist/core/mcp/remoteMcpClient.js.map +1 -1
  77. package/dist/core/mcp/remoteMcpClient.mjs +21 -7
  78. package/dist/core/mcp/remoteMcpClient.mjs.map +1 -1
  79. package/dist/core/mcp/toolSelectors.d.ts.map +1 -1
  80. package/dist/core/mcp/toolSelectors.js +18 -6
  81. package/dist/core/mcp/toolSelectors.js.map +1 -1
  82. package/dist/core/mcp/toolSelectors.mjs +18 -6
  83. package/dist/core/mcp/toolSelectors.mjs.map +1 -1
  84. package/dist/core/runtime/AgentThread.d.ts.map +1 -1
  85. package/dist/core/runtime/AgentThread.js +45 -15
  86. package/dist/core/runtime/AgentThread.js.map +1 -1
  87. package/dist/core/runtime/AgentThread.mjs +45 -15
  88. package/dist/core/runtime/AgentThread.mjs.map +1 -1
  89. package/dist/core/runtime/AgentThreadOrchestrator.d.ts.map +1 -1
  90. package/dist/core/runtime/AgentThreadOrchestrator.js +27 -9
  91. package/dist/core/runtime/AgentThreadOrchestrator.js.map +1 -1
  92. package/dist/core/runtime/AgentThreadOrchestrator.mjs +27 -9
  93. package/dist/core/runtime/AgentThreadOrchestrator.mjs.map +1 -1
  94. package/dist/core/runtime/DeferredTool.d.ts.map +1 -1
  95. package/dist/core/runtime/DeferredTool.js +15 -5
  96. package/dist/core/runtime/DeferredTool.js.map +1 -1
  97. package/dist/core/runtime/DeferredTool.mjs +15 -5
  98. package/dist/core/runtime/DeferredTool.mjs.map +1 -1
  99. package/dist/core/runtime/contextUtils.d.ts.map +1 -1
  100. package/dist/core/runtime/contextUtils.js +3 -1
  101. package/dist/core/runtime/contextUtils.js.map +1 -1
  102. package/dist/core/runtime/contextUtils.mjs +3 -1
  103. package/dist/core/runtime/contextUtils.mjs.map +1 -1
  104. package/dist/core/sandbox/Sandbox.d.ts +7 -9
  105. package/dist/core/sandbox/Sandbox.d.ts.map +1 -1
  106. package/dist/core/sandbox/Sandbox.js +55 -63
  107. package/dist/core/sandbox/Sandbox.js.map +1 -1
  108. package/dist/core/sandbox/Sandbox.mjs +56 -64
  109. package/dist/core/sandbox/Sandbox.mjs.map +1 -1
  110. package/dist/core/sandbox/codeMode/CodeModeDispatcher.d.ts +29 -0
  111. package/dist/core/sandbox/codeMode/CodeModeDispatcher.d.ts.map +1 -0
  112. package/dist/core/sandbox/codeMode/CodeModeDispatcher.js +134 -0
  113. package/dist/core/sandbox/codeMode/CodeModeDispatcher.js.map +1 -0
  114. package/dist/core/sandbox/codeMode/CodeModeDispatcher.mjs +113 -0
  115. package/dist/core/sandbox/codeMode/CodeModeDispatcher.mjs.map +1 -0
  116. package/dist/core/sandbox/codeMode/CodeModeTransport.d.ts +21 -0
  117. package/dist/core/sandbox/codeMode/CodeModeTransport.d.ts.map +1 -0
  118. package/dist/core/sandbox/codeMode/CodeModeTransport.js +19 -0
  119. package/dist/core/sandbox/codeMode/CodeModeTransport.js.map +1 -0
  120. package/dist/core/sandbox/codeMode/CodeModeTransport.mjs +1 -0
  121. package/dist/core/sandbox/codeMode/CodeModeTransport.mjs.map +1 -0
  122. package/dist/core/sandbox/codeMode/nats/CodeModeNatsTransport.d.ts +34 -0
  123. package/dist/core/sandbox/codeMode/nats/CodeModeNatsTransport.d.ts.map +1 -0
  124. package/dist/core/sandbox/codeMode/nats/CodeModeNatsTransport.js +193 -0
  125. package/dist/core/sandbox/codeMode/nats/CodeModeNatsTransport.js.map +1 -0
  126. package/dist/core/sandbox/codeMode/nats/CodeModeNatsTransport.mjs +168 -0
  127. package/dist/core/sandbox/codeMode/nats/CodeModeNatsTransport.mjs.map +1 -0
  128. package/dist/core/sandbox/codeMode/types.d.ts +34 -0
  129. package/dist/core/sandbox/codeMode/types.d.ts.map +1 -0
  130. package/dist/core/sandbox/codeMode/types.js +59 -0
  131. package/dist/core/sandbox/codeMode/types.js.map +1 -0
  132. package/dist/core/sandbox/codeMode/types.mjs +32 -0
  133. package/dist/core/sandbox/codeMode/types.mjs.map +1 -0
  134. package/dist/core/sandbox/provider/DaytonaProvider.d.ts +19 -1
  135. package/dist/core/sandbox/provider/DaytonaProvider.d.ts.map +1 -1
  136. package/dist/core/sandbox/provider/DaytonaProvider.js +96 -23
  137. package/dist/core/sandbox/provider/DaytonaProvider.js.map +1 -1
  138. package/dist/core/sandbox/provider/DaytonaProvider.mjs +96 -23
  139. package/dist/core/sandbox/provider/DaytonaProvider.mjs.map +1 -1
  140. package/dist/core/sandbox/provider/Provider.d.ts +4 -3
  141. package/dist/core/sandbox/provider/Provider.d.ts.map +1 -1
  142. package/dist/core/sandbox/provider/Provider.js.map +1 -1
  143. package/dist/core/sandbox/provider/Provider.mjs.map +1 -1
  144. package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts +2 -1
  145. package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts.map +1 -1
  146. package/dist/core/sandbox/provider/TFYSandboxProvider.js +20 -6
  147. package/dist/core/sandbox/provider/TFYSandboxProvider.js.map +1 -1
  148. package/dist/core/sandbox/provider/TFYSandboxProvider.mjs +20 -6
  149. package/dist/core/sandbox/provider/TFYSandboxProvider.mjs.map +1 -1
  150. package/dist/core/sandbox/sandboxImage.d.ts +1 -1
  151. package/dist/core/sandbox/sandboxImage.d.ts.map +1 -1
  152. package/dist/core/sandbox/sandboxImage.js +1 -1
  153. package/dist/core/sandbox/sandboxImage.js.map +1 -1
  154. package/dist/core/sandbox/sandboxImage.mjs +1 -1
  155. package/dist/core/sandbox/sandboxImage.mjs.map +1 -1
  156. package/dist/core/sandbox/sandboxScripts.gen.d.ts +1 -1
  157. package/dist/core/sandbox/sandboxScripts.gen.d.ts.map +1 -1
  158. package/dist/core/sandbox/sandboxScripts.gen.js +8 -8
  159. package/dist/core/sandbox/sandboxScripts.gen.js.map +1 -1
  160. package/dist/core/sandbox/sandboxScripts.gen.mjs +8 -8
  161. package/dist/core/sandbox/sandboxScripts.gen.mjs.map +1 -1
  162. package/dist/core/sandbox/skills/SkillMounter.d.ts.map +1 -1
  163. package/dist/core/sandbox/skills/SkillMounter.js +3 -1
  164. package/dist/core/sandbox/skills/SkillMounter.js.map +1 -1
  165. package/dist/core/sandbox/skills/SkillMounter.mjs +3 -1
  166. package/dist/core/sandbox/skills/SkillMounter.mjs.map +1 -1
  167. package/dist/core/util/abort.d.ts.map +1 -1
  168. package/dist/core/util/abort.js +3 -1
  169. package/dist/core/util/abort.js.map +1 -1
  170. package/dist/core/util/abort.mjs +3 -1
  171. package/dist/core/util/abort.mjs.map +1 -1
  172. package/dist/core/util/errorLogFields.d.ts +5 -0
  173. package/dist/core/util/errorLogFields.d.ts.map +1 -1
  174. package/dist/core/util/errorLogFields.js +38 -2
  175. package/dist/core/util/errorLogFields.js.map +1 -1
  176. package/dist/core/util/errorLogFields.mjs +37 -2
  177. package/dist/core/util/errorLogFields.mjs.map +1 -1
  178. package/package.json +10 -6
  179. package/dist/core/sandbox/SandboxNatsBridge.d.ts +0 -33
  180. package/dist/core/sandbox/SandboxNatsBridge.d.ts.map +0 -1
  181. package/dist/core/sandbox/SandboxNatsBridge.js +0 -222
  182. package/dist/core/sandbox/SandboxNatsBridge.js.map +0 -1
  183. package/dist/core/sandbox/SandboxNatsBridge.mjs +0 -201
  184. package/dist/core/sandbox/SandboxNatsBridge.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/runtime/AgentThread.ts"],"sourcesContent":["import type { ChatCompletionMessageParam, ChatCompletionTool } from 'openai/resources/chat';\nimport type { Logger } from 'winston';\nimport type { AgentCapability, CapabilityState } from '../capabilities/AgentCapability';\nimport type {\n AgentContextProcessorOutput,\n AgentContextProcessorOverwriteContext,\n AgentThreadExecutionContext,\n PostToolCallAgentContextProcessor,\n PreLLMAgentContextProcessor,\n PreLLMEphemeralAgentContextProcessor,\n PreSendContextProcessor,\n} from '../capabilities/AgentContextProcessor';\nimport { SUB_AGENT_IDENTITY } from '../capabilities/builtins/DynamicSubAgents';\nimport type { ToolResponseProcessor } from '../capabilities/ToolResponseProcessor';\nimport { AgentHarnessError, InvalidAgentSendInputError } from '../errors';\nimport type { RegisteredPassthroughEvent } from '../events/PassthroughEvents';\nimport {\n EventType,\n newEventId,\n type AgentApprovalDecisionMessage,\n type AgentInfo,\n type AgentOutputEvent,\n type AgentParent,\n type MCPInitializeEvent,\n type MCPServerInitInfo,\n type ModelMessageDeltaEvent,\n type ModelMessageEvent,\n type ModelMessageUsage,\n type SandboxCreatedEvent,\n type ThreadOverwriteContextEvent,\n type ToolApprovalRequiredEvent,\n type ToolResponseEvent,\n type ToolResponseRequiredEvent,\n type UserToolApprovalMessage,\n type UserToolResponseMessage,\n} from '../events/schema';\nimport { InstructionBuilder, ROOT_AGENT_IDENTITY } from '../InstructionBuilder';\nimport type { LLMCreateParamsStreaming } from '../llm/ILLM';\nimport {\n type CompletionUsage,\n type ExtendedChatCompletionChunk,\n type FinishReason,\n type InternalEnrichedAssistantMessage,\n type InternalEnrichedToolCall,\n type LLMToolMessage,\n type LLMUserMessage,\n type RawAssistantMessage,\n} from '../llm/LLMTypes';\nimport { toOpenAIResponseFormat } from '../llm/responseFormat';\nimport { toOpenAIChatMessage } from '../llm/toOpenAIChatMessage';\nimport { estimateTokensForString } from '../llm/usage';\nimport { convertMCPServersToTools, type ConvertToolsResult, type MappedMCPTool } from '../mcp/convertMCPServers';\nimport { executeToolCalls } from '../mcp/executeToolCalls';\nimport type { IToolSet, MCPAuthRequired } from '../mcp/IMCPServer';\nimport type { Sandbox, SandboxInfo } from '../sandbox/Sandbox';\nimport type { AgentTracing } from '../tracing/AgentTracing';\nimport type { AgentDefinition } from './AgentDefinition';\nimport type {\n AgentThreadConstructorInput,\n AgentThreadRuntimeSendBatch,\n AgentThreadRuntimeSendInput,\n AgentThreadSnapshot,\n} from './AgentThread.types';\nimport {\n InternalEventType,\n type AgentThreadAppendContext,\n type AgentThreadEvent,\n type ContextMessage,\n type InternalCapabilityStateEvent,\n type InternalMCPAuthRequiredEvent,\n type InternalThreadDoneEvent,\n type SubAgentCompletionMarker,\n} from './AgentThread.types';\nimport {\n currentContextUsageFromCompletion,\n getEmptyCurrentContextUsage,\n mergeCurrentContextUsage,\n type CurrentContextUsage,\n} from './contextUsage';\nimport {\n assistantMessageContentToStringForSubAgent,\n estimateTokensForContextMessages,\n INTERNAL_SYSTEM_PROMPT,\n isApprovalDecisionMessage,\n isClientSideToolResponseMessage,\n isInputUserMessage,\n isLLMContextMessage,\n isLLMToolMessage,\n makeUnknownToolInfo,\n scanApprovalDecisions,\n toEnrichedToolCall,\n toToolCallInfo,\n} from './contextUtils';\nimport { DeferredTool } from './DeferredTool';\nimport { createEmptyAgentThreadMetrics, updateMetricsFromUsage, type AgentThreadMetrics } from './metrics';\nimport { getClosableOpenToolCallIds, OpenToolCallCloser } from './OpenToolCallCloser';\nimport { isEmptyMessageContent, processAgentUserInput, type AgentInputUserMessage } from './UserInputMessage';\n\nconst DEFAULT_ITERATION_LIMIT = 25;\n\ntype AgentThreadState = 'llm-call-required' | 'tool-response-required' | 'user-input-required';\n\ntype StepOutcome = 'exit' | 'continue';\n\nconst VALID_TRANSITIONS: Record<AgentThreadState, AgentThreadState[]> = {\n 'llm-call-required': ['tool-response-required', 'user-input-required'],\n 'tool-response-required': ['llm-call-required'],\n // user-input-required transitions to:\n // tool-response-required — after approval decisions are appended (approval flow)\n // llm-call-required — after client-side tool responses resolve tool calls directly\n 'user-input-required': ['tool-response-required', 'llm-call-required'],\n};\n\nfunction assertValidTransition(from: AgentThreadState, to: AgentThreadState): void {\n if (!VALID_TRANSITIONS[from].includes(to)) {\n throw new Error(`Invalid state transition: ${from} → ${to}`);\n }\n}\n\nfunction deriveAgentThreadState(context: ContextMessage[]): AgentThreadState {\n const openToolCallIds = getOpenToolCallIds(context);\n if (openToolCallIds.size === 0) return 'llm-call-required';\n\n const assistant = lastAssistantInContext(context);\n const decisions = scanApprovalDecisions(context);\n const hasPendingApproval = assistant?.tool_calls?.some(\n tc => openToolCallIds.has(tc.id) && tc.tool_info.is_approval_required === true && !decisions.has(tc.id),\n );\n const hasPendingClientSideTool = assistant?.tool_calls?.some(\n tc => openToolCallIds.has(tc.id) && tc.tool_info.is_client_side === true,\n );\n return hasPendingApproval || hasPendingClientSideTool ? 'user-input-required' : 'tool-response-required';\n}\n\nfunction hasToolCalls(message: InternalEnrichedAssistantMessage): boolean {\n return Boolean(message.tool_calls && message.tool_calls.length > 0);\n}\n\n// Tool call ids issued by the last assistant message that have no matching\n// tool response after it. Walks the context tail-first and stops at the last\n// assistant message — under the invariant that older assistant tool_calls are\n// already resolved, only the last assistant message can have open ids.\nfunction getOpenToolCallIds(context: ContextMessage[]): Set<string> {\n const resolvedToolCallIds = new Set<string>();\n const openToolCallIds = new Set<string>();\n for (let i = context.length - 1; i >= 0; i--) {\n const msg = context[i];\n if (msg === undefined) continue;\n if (!isLLMContextMessage(msg)) continue;\n if (msg.role === 'tool') {\n resolvedToolCallIds.add(msg.tool_call_id);\n continue;\n }\n if (msg.role === 'assistant') {\n for (const tc of msg.tool_calls ?? []) openToolCallIds.add(tc.id);\n for (const id of resolvedToolCallIds) openToolCallIds.delete(id);\n break;\n }\n }\n return openToolCallIds;\n}\n\nfunction lastAssistantInContext(context: ContextMessage[]): InternalEnrichedAssistantMessage | undefined {\n return context.findLast(\n (msg): msg is InternalEnrichedAssistantMessage => isLLMContextMessage(msg) && msg.role === 'assistant',\n );\n}\n\n// Open tool calls that block a new user message: the open set minus those OpenToolCallCloser will\n// auto-close during preSend. Lets a user message resume a thread whose only open calls are dangling\n// regular tool calls (which the closer repairs), while still blocking on approval/client-side/\n// sub-agent calls that genuinely need resolution. Takes the already-computed open set; copies it\n// since it mutates (deletes) the closable ids.\nfunction getUnclosableOpenToolCallIds(context: ContextMessage[], openToolCallIds: Set<string>): Set<string> {\n const blockingOpenToolCallIds = new Set(openToolCallIds);\n for (const id of getClosableOpenToolCallIds(context)) {\n blockingOpenToolCallIds.delete(id);\n }\n return blockingOpenToolCallIds;\n}\n\nfunction buildMCPInitializeEvent(initInfo: MCPServerInitInfo[], threadId: string): MCPInitializeEvent {\n return {\n type: EventType.MCP_INITIALIZE,\n id: newEventId(),\n created_at: new Date().toISOString(),\n thread_id: threadId,\n mcp_servers: initInfo,\n };\n}\n\nfunction buildMCPAuthRequiredEvent(\n authRequirementInfo: MCPAuthRequired[],\n threadId: string,\n): InternalMCPAuthRequiredEvent {\n return {\n type: InternalEventType.MCP_AUTH_REQUIRED,\n id: newEventId(),\n created_at: new Date().toISOString(),\n mcp_servers: authRequirementInfo.flatMap(or => or.servers.map(s => ({ ...s, thread_ids: [threadId] }))),\n // threadId identifies which thread triggered auth for each server so AgentThreadOrchestrator can merge\n // auth events across parallel sub-agents by server.\n thread_id: null,\n };\n}\n\nfunction buildSandboxCreatedEvent(info: SandboxInfo): SandboxCreatedEvent {\n return {\n type: EventType.SANDBOX_CREATED,\n id: newEventId(),\n created_at: new Date().toISOString(),\n ...info,\n thread_id: null,\n };\n}\n\nfunction buildModelMessageEvent({\n assistantMessage,\n threadId,\n finishReason,\n usage,\n id,\n}: {\n assistantMessage: InternalEnrichedAssistantMessage;\n threadId: string;\n finishReason: FinishReason | null;\n usage: ModelMessageUsage | undefined;\n id: string;\n}): ModelMessageEvent {\n // `thinking_blocks` / `source` stay on the context message for replay; strip them from the client event.\n const { role, tool_calls, thinking_blocks, source, ...rest } = assistantMessage;\n void role;\n void thinking_blocks;\n void source;\n const event: ModelMessageEvent = {\n ...rest,\n tool_calls: tool_calls?.map(toEnrichedToolCall),\n type: EventType.MODEL_MESSAGE,\n id,\n created_at: new Date().toISOString(),\n thread_id: threadId,\n finish_reason: finishReason,\n ...(usage && { usage }),\n };\n return event;\n}\n\nfunction validateUserMessage(\n message: { content: AgentInputUserMessage['content'] },\n blockingOpenToolCallIds: Set<string>,\n index: number,\n): void {\n if (isEmptyMessageContent(message.content)) {\n throw new InvalidAgentSendInputError(`messages[${String(index)}] user message has empty content`);\n }\n if (blockingOpenToolCallIds.size > 0) {\n throw new InvalidAgentSendInputError('user message cannot be sent while approvals or questions are pending');\n }\n}\n\nfunction validateToolMessage(\n message: LLMToolMessage | UserToolResponseMessage,\n openToolCallIds: Set<string>,\n index: number,\n): void {\n if (!openToolCallIds.has(message.tool_call_id)) {\n throw new InvalidAgentSendInputError(\n `messages[${String(index)}] no open tool call for tool_call_id '${message.tool_call_id}'`,\n );\n }\n}\n\nfunction validateApprovalMessage(\n message: UserToolApprovalMessage,\n pendingApprovalIds: Set<string>,\n index: number,\n): void {\n if (!pendingApprovalIds.has(message.tool_call_id)) {\n throw new InvalidAgentSendInputError(\n `messages[${String(index)}] no pending approval for tool_call_id '${message.tool_call_id}'`,\n );\n }\n}\n\nfunction getPendingApprovalToolCalls(context: ContextMessage[]): InternalEnrichedToolCall[] {\n const openToolCallIds = getOpenToolCallIds(context);\n const decisions = scanApprovalDecisions(context);\n const assistant = lastAssistantInContext(context);\n return (assistant?.tool_calls ?? []).filter(\n tc => openToolCallIds.has(tc.id) && tc.tool_info.is_approval_required === true && !decisions.has(tc.id),\n );\n}\n\nfunction getPendingClientSideToolCalls(context: ContextMessage[]): InternalEnrichedToolCall[] {\n const openToolCallIds = getOpenToolCallIds(context);\n const assistant = lastAssistantInContext(context);\n return (assistant?.tool_calls ?? []).filter(tc => openToolCallIds.has(tc.id) && tc.tool_info.is_client_side === true);\n}\n\nfunction validateInputMessageTypesGivenContext(\n context: ContextMessage[],\n messages: AgentThreadRuntimeSendInput[],\n): void {\n // Full open set: validates incoming tool responses and dedupes within the batch.\n const openToolCallIds = getOpenToolCallIds(context);\n // Subset that blocks a fresh user message: excludes calls OpenToolCallCloser will auto-close\n // during preSend, so a dangling regular tool call doesn't reject a user message it will repair.\n const blockingOpenToolCallIds = getUnclosableOpenToolCallIds(context, openToolCallIds);\n const pendingApprovalIds = new Set(getPendingApprovalToolCalls(context).map(tc => tc.id));\n const pendingClientSideIds = new Set(getPendingClientSideToolCalls(context).map(tc => tc.id));\n\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i];\n if (m === undefined) continue;\n if (isApprovalDecisionMessage(m)) {\n validateApprovalMessage(m, pendingApprovalIds, i);\n pendingApprovalIds.delete(m.tool_call_id);\n } else if (isInputUserMessage(m)) {\n validateUserMessage(m, blockingOpenToolCallIds, i);\n } else if (isClientSideToolResponseMessage(m) || isLLMToolMessage(m)) {\n validateToolMessage(m, openToolCallIds, i);\n openToolCallIds.delete(m.tool_call_id);\n blockingOpenToolCallIds.delete(m.tool_call_id);\n pendingClientSideIds.delete(m.tool_call_id);\n } else {\n const _exhaustive: never = m;\n throw new InvalidAgentSendInputError(\n `messages[${String(i)}] has unsupported type: ${JSON.stringify(_exhaustive)}`,\n );\n }\n }\n\n // A send for a thread awaiting user input must resolve every pending approval and client-side\n // tool call in the same batch; any left unresolved (including an empty batch) is a blocker.\n if (pendingApprovalIds.size > 0 || pendingClientSideIds.size > 0) {\n const missing = [...pendingApprovalIds, ...pendingClientSideIds];\n throw new InvalidAgentSendInputError(\n `Send batch must resolve all pending tool calls awaiting user input. Missing: ${missing.join(', ')}`,\n );\n }\n}\n\nasync function buildModelMessageDeltaEvent({\n chunk,\n threadId,\n toolMapping,\n usage,\n id,\n logger,\n}: {\n chunk: ExtendedChatCompletionChunk;\n threadId: string;\n toolMapping: Map<string, MappedMCPTool>;\n usage: ModelMessageUsage | undefined;\n id: string;\n logger: Logger;\n}): Promise<ModelMessageDeltaEvent | undefined> {\n const choice = chunk.choices[0];\n const delta = choice?.delta;\n const finishReason = choice?.finish_reason;\n\n if (!delta || (Object.keys(delta).length === 0 && !finishReason && !usage)) {\n return;\n }\n\n // Drop empty deltas that carry no displayable or actionable data\n if (!delta.tool_calls?.length && !delta.content && !delta.reasoning_content && !finishReason && !usage) {\n return;\n }\n\n const toolCalls = delta.tool_calls ?? [];\n for (const toolCall of toolCalls) {\n if (toolCall.function?.name) {\n const toolInfo = toolMapping.get(toolCall.function.name);\n if (!toolInfo) {\n logger.warn(`LLM called unknown tool: Tool ${toolCall.function.name} not found in tool mapping.`);\n toolCall.tool_info = toToolCallInfo(makeUnknownToolInfo(toolCall.function.name));\n continue;\n }\n toolCall.tool_info = toToolCallInfo(\n await toolInfo.toolSet.toolCallInfo({ name: toolInfo.originalToolName }, false /* resolveUnderlyingTool */),\n );\n }\n }\n\n // Strip legacy `function_call` and replay-only `thinking_blocks` so neither reaches the client or delta stream.\n const { role, function_call, thinking_blocks, ...deltaWithoutRole } = delta;\n void role;\n void function_call;\n void thinking_blocks;\n return {\n ...deltaWithoutRole,\n type: EventType.MODEL_MESSAGE_DELTA,\n id,\n thread_id: threadId,\n ...(finishReason && { finish_reason: finishReason }),\n ...(usage && { usage }),\n };\n}\n\nasync function buildContextAssistantMessage(\n assistantMessage: RawAssistantMessage,\n toolMapping: Map<string, MappedMCPTool>,\n): Promise<InternalEnrichedAssistantMessage> {\n // Omit tool_calls when empty; OpenAI rejects `tool_calls: []` on replay.\n if (!assistantMessage.tool_calls?.length) {\n const { tool_calls, ...rest } = assistantMessage;\n void tool_calls;\n return rest;\n }\n\n // Sequential loop instead of Promise.all: the first call populates the MCP server's tool cache\n // (via listTools), making subsequent calls instant cache hits.\n // No race conditions either way but parallelism buys nothing here.\n const enrichedToolCalls = [];\n for (const toolCall of assistantMessage.tool_calls) {\n const toolInfo = toolMapping.get(toolCall.function.name);\n if (!toolInfo) {\n enrichedToolCalls.push({ ...toolCall, tool_info: makeUnknownToolInfo(toolCall.function.name) });\n continue;\n }\n const tool_info = await toolInfo.toolSet.toolCallInfo(\n {\n name: toolInfo.originalToolName,\n arguments: tryParseToolArgs(toolCall.function.arguments),\n },\n // During context persistence, we have the complete message and hence the tool arguments are available.\n // Hence, we resolve the underlying tool to get the tool information.\n true /* resolveUnderlyingTool */,\n );\n enrichedToolCalls.push({ ...toolCall, tool_info });\n }\n return { ...assistantMessage, tool_calls: enrichedToolCalls };\n}\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// Args are only used by DeferredTool to delegate to the underlying server.\n// Defensive parse — hallucinated JSON shouldn't crash assistant-message construction.\nfunction tryParseToolArgs(args: string | undefined): Record<string, unknown> {\n if (!args) return {};\n try {\n const parsed: unknown = JSON.parse(args);\n return isJsonObject(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\n// State-sync contract: in-memory state must stay consistent with what the consumer\n// def foo():\n// for x in range(1, 10):\n// yield x\n// # This cannot raise exception\n// # This does not execute if update_redis fails.\n// update_local_context(x)\n// for x in foo():\n// # This can raise exception.\n// update_redis(x)\n\nexport class AgentThread {\n readonly threadId: string;\n readonly parent?: AgentParent | undefined;\n readonly definition: AgentDefinition;\n readonly title: string;\n readonly agentInfo?: AgentInfo | undefined;\n\n private context: ContextMessage[];\n private currentContextUsage: CurrentContextUsage;\n private preSendContextProcessors: PreSendContextProcessor[];\n private preLLMContextProcessors: PreLLMAgentContextProcessor[];\n private preEphemeralLLMContextProcessors: PreLLMEphemeralAgentContextProcessor[];\n private postToolCallContextProcessor: PostToolCallAgentContextProcessor[];\n\n private instruction: string | undefined;\n private toolResponseProcessors: ToolResponseProcessor[];\n private instructionBuilders: readonly ((builder: InstructionBuilder) => void)[];\n private systemToolSets: readonly IToolSet[];\n private deferredTool?: DeferredTool | undefined;\n private convertedTools: ConvertToolsResult | undefined;\n private pendingSandboxCreatedEvents: SandboxCreatedEvent[] = [];\n private sandbox?: Sandbox | undefined;\n private readonly tracing: AgentTracing;\n private readonly logger: Logger;\n\n private metrics: AgentThreadMetrics = createEmptyAgentThreadMetrics();\n private tfyManagedServerNames = new Set<string>();\n\n private contextBusy = false;\n private preSendRanThisTurn = false;\n private currentState: AgentThreadState | null = null;\n private readonly preComputedCompletion?: SubAgentCompletionMarker | undefined;\n /** Mirrored capability KV — source for toSnapshot().capability_state. */\n private capabilityState: CapabilityState = {};\n private readonly capabilityStateKeys: ReadonlySet<string>;\n\n constructor(input: AgentThreadConstructorInput) {\n this.tracing = input.tracing;\n this.logger = input.logger.child({ module: 'AgentThread' });\n this.threadId = input.threadId;\n this.definition = input.definition;\n this.context = input.context ? [...input.context] : [];\n this.title = input.title;\n this.parent = input.parent;\n this.currentContextUsage = input.currentContextUsage ?? getEmptyCurrentContextUsage();\n this.agentInfo = input.agentInfo;\n this.preComputedCompletion = input.preComputedCompletion;\n this.sandbox = input.sandbox;\n\n const capabilities = input.capabilities ?? [];\n this.systemToolSets = capabilities.flatMap(c => c.systemToolSets ?? []);\n this.preLLMContextProcessors = capabilities.flatMap(c => c.preLLMProcessors ?? []);\n this.preEphemeralLLMContextProcessors = capabilities.flatMap(c => c.preLLMEphemeralProcessors ?? []);\n this.postToolCallContextProcessor = capabilities.flatMap(c => c.postToolCallProcessors ?? []);\n this.toolResponseProcessors = capabilities.flatMap(c => c.toolResponseProcessors ?? []);\n this.instructionBuilders = capabilities.flatMap(c => c.instructionBuilders ?? []);\n const capabilityPreSend = capabilities.flatMap(c => c.preSendProcessors ?? []);\n // OpenToolCallCloser is fixed core before contributed preSend processors.\n this.preSendContextProcessors = [new OpenToolCallCloser(), ...capabilityPreSend];\n\n assertUniqueStateKeys(capabilities);\n const claimed = claimCapabilityState(capabilities, input.capabilityState, this.logger);\n this.capabilityState = claimed;\n this.capabilityStateKeys = new Set(\n capabilities.map(c => c.state?.key).filter((k): k is string => typeof k === 'string'),\n );\n for (const capability of capabilities) {\n if (!capability.state) continue;\n const value = claimed[capability.state.key];\n if (value !== undefined) {\n capability.state.load(value);\n }\n }\n\n if (this.definition.toolSets?.length) {\n this.deferredTool = new DeferredTool(this.definition.toolSets, {\n tracing: this.tracing,\n logger: input.logger,\n });\n }\n\n if (this.sandbox) {\n this.sandbox.configureCodeMode(this.definition.toolSets ?? []);\n }\n\n this.instruction = this.buildInstruction(this.definition.instruction);\n }\n\n private buildInstruction(userInstruction?: string): string {\n const identity = this.parent ? SUB_AGENT_IDENTITY : ROOT_AGENT_IDENTITY;\n const builder = InstructionBuilder.createSystemPrompt(identity);\n const capabilities = builder.beginSection('agent-capabilities');\n capabilities.addSection('internal-messages', INTERNAL_SYSTEM_PROMPT);\n\n if (this.sandbox) {\n this.sandbox.buildInstruction(capabilities);\n }\n if (this.deferredTool) {\n this.deferredTool.buildInstruction(capabilities);\n }\n for (const build of this.instructionBuilders) {\n build(capabilities);\n }\n if (!this.parent && userInstruction?.trim()) {\n builder.addSection('user-instructions', userInstruction.trim(), true);\n }\n return builder.build();\n }\n\n public async *send(messages: AgentThreadRuntimeSendBatch): AsyncGenerator<AgentThreadAppendContext, void, unknown> {\n // An empty batch is a no-op only when the thread is not awaiting user input.\n // While awaiting input, fall through so the validator rejects the empty/incomplete batch.\n if (messages.length === 0 && !this.isAwaitingUserInput()) {\n return;\n }\n this.throwIfContextBusy();\n\n this.contextBusy = true;\n try {\n for await (const event of this.executeContextProcessors('preSend')) {\n yield event;\n }\n this.preSendRanThisTurn = true;\n\n validateInputMessageTypesGivenContext(this.context, messages);\n\n const approvals: UserToolApprovalMessage[] = [];\n const clientSideToolResponses: UserToolResponseMessage[] = [];\n const contextMessages: (LLMUserMessage | LLMToolMessage)[] = [];\n\n for (const m of messages) {\n if (isApprovalDecisionMessage(m)) {\n approvals.push(m);\n } else if (isClientSideToolResponseMessage(m)) {\n clientSideToolResponses.push(m);\n } else if (isInputUserMessage(m)) {\n const result = await processAgentUserInput(m, this.sandbox);\n contextMessages.push(result.message);\n if (result.sandboxCreated) {\n this.pendingSandboxCreatedEvents.push(buildSandboxCreatedEvent(result.sandboxCreated));\n }\n } else if (isLLMToolMessage(m)) {\n contextMessages.push(m);\n } else {\n const _exhaustive: never = m;\n throw new InvalidAgentSendInputError(`Unsupported send input: ${JSON.stringify(_exhaustive)}`);\n }\n }\n\n if (approvals.length > 0 || clientSideToolResponses.length > 0) {\n const approvalContext: AgentApprovalDecisionMessage[] = approvals.map(a => ({\n type: EventType.USER_TOOL_APPROVAL,\n tool_call_id: a.tool_call_id,\n approval: a.approval,\n }));\n const toolResponseContext: LLMToolMessage[] = clientSideToolResponses.map(m => ({\n role: 'tool',\n tool_call_id: m.tool_call_id,\n content: m.content,\n }));\n yield* this.appendToContext({\n context: [...approvalContext, ...toolResponseContext],\n output: [],\n currentContextUsage: undefined,\n usage: undefined,\n });\n }\n if (contextMessages.length > 0) {\n yield* this.appendToContext({\n context: contextMessages,\n output: [],\n currentContextUsage: undefined,\n usage: undefined,\n });\n }\n } finally {\n this.contextBusy = false;\n }\n }\n\n private throwIfContextBusy(): void {\n if (this.contextBusy) {\n throw new Error(`context is busy for thread ${this.threadId}`);\n }\n }\n\n private deriveState(): AgentThreadState {\n const next = deriveAgentThreadState(this.context);\n if (this.currentState) {\n assertValidTransition(this.currentState, next);\n }\n this.currentState = next;\n return next;\n }\n\n private *appendToContext(opts: {\n context: ContextMessage[];\n output: AgentOutputEvent[];\n currentContextUsage: CurrentContextUsage | undefined;\n usage: CompletionUsage | undefined;\n completion?: SubAgentCompletionMarker | undefined;\n }): Generator<AgentThreadAppendContext, void, unknown> {\n const { context, output, currentContextUsage, usage, completion } = opts;\n\n const newCurrentContextUsage =\n currentContextUsage ??\n mergeCurrentContextUsage(this.currentContextUsage, estimateTokensForContextMessages(context));\n\n const event: AgentThreadAppendContext = {\n type: InternalEventType.AGENT_CONTEXT_APPEND,\n thread_id: this.threadId,\n context,\n output,\n current_context_usage: newCurrentContextUsage,\n ...(completion && { completion }),\n };\n\n // Update metrics before yield so we still count it if the stream stops here.\n if (usage) {\n updateMetricsFromUsage(this.metrics, usage);\n }\n\n yield event;\n\n this.context = this.context.concat(context);\n this.currentContextUsage = newCurrentContextUsage;\n }\n\n private *overwriteContext(\n payload: AgentContextProcessorOverwriteContext,\n ): Generator<ThreadOverwriteContextEvent, void, unknown> {\n const event: ThreadOverwriteContextEvent = {\n thread_id: this.threadId,\n ...payload,\n };\n // Update metrics before yield so we still count it if the stream stops here.\n updateMetricsFromUsage(this.metrics, payload.usage);\n\n yield event;\n this.context = payload.context;\n this.currentContextUsage = payload.current_context_usage;\n this.metrics.total_summarizations++;\n }\n\n private generateErrorEvent(message: string, output?: ModelMessageEvent): InternalThreadDoneEvent {\n return {\n type: InternalEventType.AGENT_DONE,\n status: 'error',\n thread_id: this.threadId,\n title: this.title,\n error: message,\n parent: this.parent,\n send_to_parent: this.parent\n ? {\n role: 'tool',\n content: message,\n tool_call_id: this.parent.tool_call_id,\n }\n : undefined,\n ...(output && { output }),\n };\n }\n\n public hasOpenToolCallId(toolCallId: string): boolean {\n return getOpenToolCallIds(this.context).has(toolCallId);\n }\n\n // True when this thread is paused waiting on the user to resolve a pending tool\n // approval or a client-side tool response.\n public isAwaitingUserInput(): boolean {\n return (\n getPendingApprovalToolCalls(this.context).length > 0 || getPendingClientSideToolCalls(this.context).length > 0\n );\n }\n\n // Pure validation of an input batch against this thread's current context; throws\n // on an invalid/incomplete batch without mutating the context.\n public validateSendInput(messages: AgentThreadRuntimeSendBatch): void {\n validateInputMessageTypesGivenContext(this.context, messages);\n }\n\n public toSnapshot(): AgentThreadSnapshot {\n const capability_state = Object.keys(this.capabilityState).length > 0 ? { ...this.capabilityState } : null;\n return {\n thread_id: this.threadId,\n context: this.context,\n current_context_usage: this.currentContextUsage,\n parent: this.parent ?? null,\n agent_info: this.agentInfo ?? null,\n completion: this.preComputedCompletion ?? null,\n capability_state,\n };\n }\n\n public getAgentThreadMetrics(): AgentThreadMetrics {\n return { ...this.metrics };\n }\n\n private transformToLLMRequest(tools: ChatCompletionTool[]): LLMCreateParamsStreaming {\n let messages: ChatCompletionMessageParam[] = [];\n\n if (this.instruction) {\n messages.push({\n role: 'system',\n content: this.instruction,\n });\n }\n\n if (this.definition.messages) {\n for (const msg of this.definition.messages) {\n if (isLLMContextMessage(msg)) {\n messages.push(toOpenAIChatMessage(msg));\n }\n }\n }\n\n // NOTE: all this code-golf is to remove `tool_info` before sending the message to Gateway\n // ApprovalDecisionMessage rows are persisted in context but must not be sent to the LLM.\n const contextMessages = this.context.filter(isLLMContextMessage).map(msg => toOpenAIChatMessage(msg));\n\n messages.push(...contextMessages);\n\n for (const processor of this.preEphemeralLLMContextProcessors) {\n messages = processor.processPreLLMEphemeral(messages) ?? messages;\n }\n\n // modelParams may include provider extensions (e.g. reasoning_effort) beyond the SDK's\n // ChatCompletionCreateParamsStreaming field set; assign after constructing the typed body.\n // Model identity is owned by modelClient — do not set `model` on the request.\n const requestBody: LLMCreateParamsStreaming = {\n messages,\n stream: true,\n ...(this.definition.responseFormat !== undefined\n ? { response_format: toOpenAIResponseFormat(this.definition.responseFormat) }\n : {}),\n };\n if (this.definition.modelParams) {\n Object.assign(requestBody, this.definition.modelParams);\n }\n\n if (tools.length > 0) {\n requestBody.tools = tools;\n }\n\n return requestBody;\n }\n\n private computeAssistantMessageUsage(params: {\n requestBody: LLMCreateParamsStreaming;\n usage: CompletionUsage;\n toolMapping: Map<string, MappedMCPTool>;\n }): ModelMessageUsage {\n const { requestBody, usage, toolMapping } = params;\n // Sub-agents have no <user-instructions> section — their agent.instruction is\n // SUB_AGENT_IDENTITY which is harness content, not user-defined instructions.\n const trimmedInstruction = this.definition.instruction?.trim() ?? '';\n const instructionsEstimate = this.parent ? 0 : Math.round(estimateTokensForString(trimmedInstruction));\n\n const skillsEstimate = this.sandbox?.estimateSkillsTokens() ?? 0;\n\n let tfyManagedToolTokens = 0;\n let userToolTokens = 0;\n if (requestBody.tools) {\n for (const tool of requestBody.tools) {\n const toolTokens = Math.round(estimateTokensForString(JSON.stringify(tool)));\n const info = 'function' in tool ? toolMapping.get(tool.function.name) : undefined;\n if (info && this.tfyManagedServerNames.has(info.toolSet.name)) {\n tfyManagedToolTokens += toolTokens;\n } else {\n userToolTokens += toolTokens;\n }\n }\n }\n\n const totalInstructionTokens = Math.round(estimateTokensForString(this.instruction ?? ''));\n const harnessInstructionTokens = Math.max(0, totalInstructionTokens - instructionsEstimate - skillsEstimate);\n const harnessEstimate = harnessInstructionTokens + tfyManagedToolTokens;\n\n const estimatedComponentsTotal = harnessEstimate + skillsEstimate + instructionsEstimate + userToolTokens;\n const messagesEstimate = Math.max(0, usage.input_tokens - estimatedComponentsTotal);\n\n return {\n input_tokens: usage.input_tokens,\n output_tokens: usage.output_tokens,\n cache_read_tokens: usage.cache_read_tokens,\n cache_write_tokens: usage.cache_write_tokens,\n input_tokens_breakdown: {\n harness: harnessEstimate,\n skills: skillsEstimate,\n instructions: instructionsEstimate,\n tool_definitions: userToolTokens,\n messages: messagesEstimate,\n },\n };\n }\n\n private executeContextProcessors(hook: 'preSend'): AsyncGenerator<AgentThreadAppendContext, void, unknown>;\n private executeContextProcessors(\n hook: 'preLLM' | 'postToolCall',\n ): AsyncGenerator<\n | ThreadOverwriteContextEvent\n | AgentThreadAppendContext\n | { type: typeof InternalEventType.PASSTHROUGH; event: RegisteredPassthroughEvent }\n | InternalCapabilityStateEvent,\n void,\n unknown\n >;\n private async *executeContextProcessors(\n hook: 'preSend' | 'preLLM' | 'postToolCall',\n ): AsyncGenerator<\n | ThreadOverwriteContextEvent\n | AgentThreadAppendContext\n | { type: typeof InternalEventType.PASSTHROUGH; event: RegisteredPassthroughEvent }\n | InternalCapabilityStateEvent,\n void,\n unknown\n > {\n let processors: ((\n execution: Readonly<AgentThreadExecutionContext>,\n ) => AsyncIterable<AgentContextProcessorOutput>)[];\n switch (hook) {\n case 'preSend':\n processors = this.preSendContextProcessors.map(p => p.processPreSend.bind(p));\n break;\n case 'preLLM':\n processors = this.preLLMContextProcessors.map(p => p.processPreLLM.bind(p));\n break;\n case 'postToolCall':\n processors = this.postToolCallContextProcessor.map(p => p.processPostToolCall.bind(p));\n break;\n default:\n throw new Error(`Unknown hook: ${String(hook)}`);\n }\n\n const execution: Readonly<AgentThreadExecutionContext> = {\n threadId: this.threadId,\n sandbox: this.sandbox,\n currentContextUsage: this.currentContextUsage,\n context: this.context,\n };\n\n for (const processor of processors) {\n for await (const response of processor(execution)) {\n switch (response.type) {\n case InternalEventType.AGENT_CONTEXT_APPEND:\n yield* this.appendToContext({\n context: response.context,\n output: response.output,\n currentContextUsage: response.current_context_usage ?? this.currentContextUsage,\n usage: undefined,\n });\n break;\n case EventType.AGENT_CONTEXT_OVERWRITE:\n yield* this.overwriteContext(response);\n break;\n case InternalEventType.PASSTHROUGH:\n yield response;\n break;\n case InternalEventType.CAPABILITY_STATE:\n if (!this.capabilityStateKeys.has(response.key)) {\n throw new AgentHarnessError(\n 'capability_state_error',\n `CAPABILITY_STATE key '${response.key}' is not declared by any capability on thread '${this.threadId}'`,\n );\n }\n yield {\n type: InternalEventType.CAPABILITY_STATE,\n thread_id: this.threadId,\n key: response.key,\n state: response.state,\n };\n this.capabilityState[response.key] = response.state;\n break;\n default: {\n const _exhaustive: never = response;\n return _exhaustive;\n }\n }\n }\n }\n }\n\n private async init(): Promise<{\n initializationInfo: MCPServerInitInfo[];\n authRequirementInfo: MCPAuthRequired[];\n }> {\n if (this.convertedTools) {\n return { initializationInfo: [], authRequirementInfo: [] };\n }\n return this.initTools();\n }\n\n private async initTools(): Promise<{\n initializationInfo: MCPServerInitInfo[];\n authRequirementInfo: MCPAuthRequired[];\n }> {\n const tfyManagedServers: IToolSet[] = [...this.systemToolSets];\n if (this.sandbox) {\n tfyManagedServers.push(this.sandbox);\n }\n if (this.deferredTool) {\n tfyManagedServers.push(this.deferredTool);\n }\n const userServers = [...(this.definition.toolSets ?? [])];\n\n const { convertedTools, initializationInfo, authRequirementInfo } = await convertMCPServersToTools({\n tfyManagedServers,\n userServers,\n });\n this.convertedTools = convertedTools;\n this.tfyManagedServerNames = new Set(tfyManagedServers.map(s => s.name));\n return { initializationInfo, authRequirementInfo };\n }\n\n private getConvertedTools(): ConvertToolsResult {\n if (!this.convertedTools) {\n throw new Error('unreachable');\n }\n return this.convertedTools;\n }\n\n private async *stepLLMCall(\n tools: ChatCompletionTool[],\n toolMapping: Map<string, MappedMCPTool>,\n signal?: AbortSignal,\n ): AsyncGenerator<AgentThreadEvent, { outcome: StepOutcome; modelMessageEventId: string }, unknown> {\n const modelMessageEventId = newEventId();\n if (signal?.aborted) {\n return { outcome: 'exit', modelMessageEventId };\n }\n\n for await (const event of this.executeContextProcessors('preLLM')) {\n yield event;\n }\n\n const requestBody = this.transformToLLMRequest(tools);\n const llmStream = this.definition.modelClient.create(requestBody);\n\n // We start the delta stream with a model message event.\n yield {\n type: EventType.MODEL_MESSAGE,\n thread_id: this.threadId,\n created_at: new Date().toISOString(),\n id: modelMessageEventId,\n } satisfies ModelMessageEvent;\n\n let firstDeltaTimestamped = false;\n let result = await llmStream.next();\n let modelMessageUsage: ModelMessageUsage | undefined = undefined;\n while (!result.done) {\n const chunk = result.value;\n if (chunk.usage) {\n modelMessageUsage = this.computeAssistantMessageUsage({\n requestBody,\n usage: chunk.usage,\n toolMapping,\n });\n }\n const event = await buildModelMessageDeltaEvent({\n chunk,\n threadId: this.threadId,\n toolMapping,\n usage: modelMessageUsage,\n id: modelMessageEventId,\n logger: this.logger,\n });\n if (event) {\n if (!firstDeltaTimestamped) {\n firstDeltaTimestamped = true;\n yield { ...event, created_at: new Date().toISOString() };\n } else {\n yield event;\n }\n }\n result = await llmStream.next();\n }\n\n // If the stream was aborted mid-way, result.value.output is only a partial\n // accumulation of the deltas — not the true complete response. Skip the\n // final model.message event to avoid emitting an inconsistent assembled message.\n if (signal?.aborted) {\n return { outcome: 'exit', modelMessageEventId };\n }\n\n // should be computed by this point but in case provider never gives out any delta with usage, compute it now.\n modelMessageUsage ??= this.computeAssistantMessageUsage({\n requestBody,\n usage: result.value.usage,\n toolMapping,\n });\n const assistantMessage: InternalEnrichedAssistantMessage = await buildContextAssistantMessage(\n result.value.output,\n toolMapping,\n );\n const finishReason = result.value.finish_reason;\n const agentAssistantMessage = buildModelMessageEvent({\n assistantMessage,\n threadId: this.threadId,\n finishReason,\n usage: modelMessageUsage,\n id: modelMessageEventId,\n });\n\n let completion: SubAgentCompletionMarker | undefined;\n if (this.parent) {\n if (finishReason === 'length') {\n const errorMessage = assistantMessageContentToStringForSubAgent(\n assistantMessage.content,\n 'max_tokens breached',\n );\n completion = {\n type: 'error',\n output: agentAssistantMessage,\n error_message: errorMessage,\n send_to_parent: { role: 'tool', tool_call_id: this.parent.tool_call_id, content: errorMessage },\n };\n } else if (!hasToolCalls(assistantMessage)) {\n const content = assistantMessageContentToStringForSubAgent(assistantMessage.content);\n completion = {\n type: 'done',\n output: agentAssistantMessage,\n send_to_parent: { role: 'tool', tool_call_id: this.parent.tool_call_id, content },\n };\n }\n }\n\n yield* this.appendToContext({\n context: [assistantMessage],\n output: [agentAssistantMessage],\n currentContextUsage: currentContextUsageFromCompletion(result.value.usage),\n usage: result.value.usage,\n completion,\n });\n\n if (finishReason === 'length') {\n const errorContent = completion?.error_message ?? 'max_tokens breached';\n yield this.generateErrorEvent(errorContent, agentAssistantMessage);\n return { outcome: 'exit', modelMessageEventId };\n }\n\n if (!hasToolCalls(assistantMessage)) {\n yield {\n type: InternalEventType.AGENT_DONE,\n status: 'done',\n thread_id: this.threadId,\n title: this.title,\n output: agentAssistantMessage,\n parent: this.parent,\n send_to_parent: completion?.send_to_parent,\n };\n return { outcome: 'exit', modelMessageEventId };\n }\n\n return { outcome: 'continue', modelMessageEventId };\n }\n\n private async *stepToolResponse(\n toolMapping: Map<string, MappedMCPTool>,\n ): AsyncGenerator<AgentThreadEvent, StepOutcome, unknown> {\n const assistantMessage = lastAssistantInContext(this.context);\n if (!assistantMessage) {\n throw new Error('unreachable');\n }\n\n const openIds = getOpenToolCallIds(this.context);\n const openCalls = assistantMessage.tool_calls?.filter(tc => openIds.has(tc.id)) ?? [];\n const decisions = scanApprovalDecisions(this.context);\n\n const assistantForExecution: InternalEnrichedAssistantMessage = {\n ...assistantMessage,\n tool_calls: openCalls,\n };\n const {\n toolCallResults,\n initializationInfo,\n createThreadEvents,\n sandboxCreated,\n authRequirementInfo,\n approvalRequiredToolCalls,\n clientSideToolCalls,\n events: passthroughEvents,\n } = await executeToolCalls({\n assistantMessage: assistantForExecution,\n toolMapping,\n threadId: this.threadId,\n approvalDecisions: decisions,\n });\n void clientSideToolCalls;\n if (approvalRequiredToolCalls.length > 0) {\n throw new Error('Unreachable');\n }\n this.metrics.total_tool_calls += toolCallResults.length;\n this.metrics.total_sub_agents += createThreadEvents.length;\n\n if (initializationInfo.length > 0) {\n yield buildMCPInitializeEvent(initializationInfo, this.threadId);\n }\n\n if (sandboxCreated) {\n yield buildSandboxCreatedEvent(sandboxCreated);\n }\n\n for (const event of passthroughEvents) {\n yield { type: InternalEventType.PASSTHROUGH, event };\n }\n\n const toolIdsBeforeProcessing = toolCallResults.map(t => t.message.tool_call_id);\n const toolResponseExecution: Readonly<AgentThreadExecutionContext> = {\n threadId: this.threadId,\n sandbox: this.sandbox,\n currentContextUsage: this.currentContextUsage,\n context: this.context,\n };\n for (const processor of this.toolResponseProcessors) {\n const processorResult = await processor.process(toolCallResults, toolResponseExecution);\n if (processorResult.sandboxCreated) {\n yield buildSandboxCreatedEvent(processorResult.sandboxCreated);\n }\n for (const event of processorResult.events ?? []) {\n yield { type: InternalEventType.PASSTHROUGH, event };\n }\n }\n if (toolIdsBeforeProcessing.length !== toolCallResults.length) {\n throw Error('Some tool call processor has removed tool call.');\n }\n const toolIdsAfterProcessing = new Set(toolCallResults.map(t => t.message.tool_call_id));\n\n if (!toolIdsBeforeProcessing.every(id => toolIdsAfterProcessing.has(id))) {\n throw Error('Tool call IDs do not match after processing.');\n }\n\n const agentToolMessages: ToolResponseEvent[] = toolCallResults.map(t => {\n const { role, ...toolMessage } = t.message;\n void role;\n return {\n ...toolMessage,\n type: EventType.TOOL_RESPONSE,\n id: newEventId(),\n created_at: t.completedAt,\n thread_id: this.threadId,\n };\n });\n for (const msg of agentToolMessages) {\n yield msg;\n }\n // tool.response is persisted by the session/response layer when yielded; only mutate context here.\n yield* this.appendToContext({\n context: toolCallResults.map(t => t.message),\n output: [],\n currentContextUsage: undefined,\n usage: undefined,\n });\n\n if (authRequirementInfo.length > 0) {\n yield buildMCPAuthRequiredEvent(authRequirementInfo, this.threadId);\n return 'exit';\n }\n\n for await (const event of this.executeContextProcessors('postToolCall')) {\n yield event;\n }\n for (const event of createThreadEvents) {\n yield event;\n }\n if (createThreadEvents.length > 0) {\n return 'exit';\n }\n\n return 'continue';\n }\n\n private *stepUserInputRequired(modelMessageEventId: string): Generator<AgentThreadEvent, StepOutcome, unknown> {\n const pendingClientSideToolCalls = getPendingClientSideToolCalls(this.context);\n if (pendingClientSideToolCalls.length > 0) {\n const responseRequiredEvent: ToolResponseRequiredEvent = {\n type: EventType.TOOL_RESPONSE_REQUIRED,\n id: newEventId(),\n created_at: new Date().toISOString(),\n thread_id: this.threadId,\n tool_calls: pendingClientSideToolCalls.map(tc => ({ id: tc.id, source_event_id: modelMessageEventId })),\n };\n yield responseRequiredEvent;\n }\n\n const pendingApprovalToolCalls = getPendingApprovalToolCalls(this.context);\n if (pendingApprovalToolCalls.length > 0) {\n const event: ToolApprovalRequiredEvent = {\n type: EventType.TOOL_APPROVAL_REQUIRED,\n id: newEventId(),\n created_at: new Date().toISOString(),\n thread_id: this.threadId,\n tool_calls: pendingApprovalToolCalls.map(({ id }) => ({ id, source_event_id: modelMessageEventId })),\n };\n yield event;\n }\n return 'exit';\n }\n\n private buildReplayEvent(c: SubAgentCompletionMarker): InternalThreadDoneEvent {\n const base = {\n type: InternalEventType.AGENT_DONE,\n thread_id: this.threadId,\n title: this.title,\n parent: this.parent,\n send_to_parent: c.send_to_parent,\n };\n return c.type === 'done'\n ? { ...base, status: 'done', output: c.output }\n : { ...base, status: 'error', error: c.error_message ?? 'Sub-agent errored', output: c.output };\n }\n\n public async *execute(options?: {\n signal?: AbortSignal | undefined;\n }): AsyncGenerator<AgentThreadEvent, void, unknown> {\n const signal = options?.signal;\n\n this.throwIfContextBusy();\n this.contextBusy = true;\n this.currentState = null;\n\n // there should always be this top level try-catch block because agent execution cant raise an error. it should yield an error event.\n try {\n if (this.preComputedCompletion) {\n yield this.buildReplayEvent(this.preComputedCompletion);\n return;\n }\n\n if (!this.preSendRanThisTurn) {\n for await (const event of this.executeContextProcessors('preSend')) {\n yield event;\n }\n }\n this.preSendRanThisTurn = false;\n const { initializationInfo, authRequirementInfo } = await this.tracing.withInitSpan(() => this.init());\n\n if (initializationInfo.length > 0) {\n yield buildMCPInitializeEvent(initializationInfo, this.threadId);\n }\n\n if (authRequirementInfo.length > 0) {\n yield buildMCPAuthRequiredEvent(authRequirementInfo, this.threadId);\n return;\n }\n\n const { tools, toolMapping } = this.getConvertedTools();\n\n const iterationLimit = this.definition.iterationLimit ?? DEFAULT_ITERATION_LIMIT;\n // Starts empty; set only after stepLLMCall in this execute(). That is intentional:\n // user-input-required is only reachable here right after an LLM step that produced\n // pending approval/client-side tools (which sets currentModelMessageEventId first).\n // A resumed turn that is still awaiting user input never reaches this loop — orchestrator\n // send() / validateSendInput rejects empty or incomplete batches before execute runs.\n let currentModelMessageEventId = '';\n\n for (;;) {\n for (;;) {\n const sandboxCreatedEvent = this.pendingSandboxCreatedEvents.shift();\n if (sandboxCreatedEvent === undefined) break;\n yield sandboxCreatedEvent;\n }\n\n const state = this.deriveState();\n let outcome: StepOutcome;\n switch (state) {\n case 'llm-call-required': {\n // Cancel only before network/side-effecting steps (LLM call, tool execution), never before 'user-input-required', so the required event is always emitted once the assistant message is committed.\n if (signal?.aborted) return;\n if (this.metrics.iterations >= iterationLimit) {\n yield this.generateErrorEvent(\n `You have reached iteration limit of ${String(iterationLimit)}, please request again`,\n );\n return;\n }\n this.metrics.iterations++;\n\n const llmResult = yield* this.stepLLMCall(tools, toolMapping, signal);\n outcome = llmResult.outcome;\n currentModelMessageEventId = llmResult.modelMessageEventId;\n break;\n }\n case 'tool-response-required': {\n if (signal?.aborted) return;\n outcome = yield* this.stepToolResponse(toolMapping);\n break;\n }\n case 'user-input-required': {\n // Intentionally no cancellation check here — see comment in 'llm-call-required'.\n // source_event_id comes from currentModelMessageEventId; see comment where it is declared.\n outcome = yield* this.stepUserInputRequired(currentModelMessageEventId);\n break;\n }\n default: {\n throw new Error('unreachable');\n }\n }\n if (outcome === 'exit') return;\n }\n } catch (error) {\n yield this.generateErrorEvent(error instanceof Error ? error.message : 'Unknown error occurred');\n } finally {\n this.contextBusy = false;\n }\n }\n}\n\nfunction assertUniqueStateKeys(capabilities: readonly AgentCapability[]): void {\n const seen = new Set<string>();\n for (const capability of capabilities) {\n const key = capability.state?.key;\n if (!key) continue;\n if (seen.has(key)) {\n throw new AgentHarnessError(\n 'capability_state_error',\n `Duplicate capability state key '${key}' — each key may be claimed by at most one capability`,\n );\n }\n seen.add(key);\n }\n}\n\nfunction claimCapabilityState(\n capabilities: readonly AgentCapability[],\n input: CapabilityState | undefined,\n logger: Logger,\n): CapabilityState {\n if (!input) return {};\n const claimedKeys = new Set(capabilities.map(c => c.state?.key).filter((k): k is string => typeof k === 'string'));\n const claimed: CapabilityState = {};\n for (const [key, value] of Object.entries(input)) {\n if (!claimedKeys.has(key)) {\n logger.warn(`Dropping unclaimed capability_state key '${key}' — no capability declares it`);\n continue;\n }\n claimed[key] = value;\n }\n return claimed;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/core/runtime/AgentThread.ts"],"sourcesContent":["import type { ChatCompletionMessageParam, ChatCompletionTool } from 'openai/resources/chat';\nimport type { Logger } from 'winston';\nimport type { AgentCapability, CapabilityState } from '../capabilities/AgentCapability';\nimport type {\n AgentContextProcessorOutput,\n AgentContextProcessorOverwriteContext,\n AgentThreadExecutionContext,\n PostToolCallAgentContextProcessor,\n PreLLMAgentContextProcessor,\n PreLLMEphemeralAgentContextProcessor,\n PreSendContextProcessor,\n} from '../capabilities/AgentContextProcessor';\nimport { SUB_AGENT_IDENTITY } from '../capabilities/builtins/DynamicSubAgents';\nimport type { ToolResponseProcessor } from '../capabilities/ToolResponseProcessor';\nimport { AgentHarnessError, InvalidAgentSendInputError } from '../errors';\nimport type { RegisteredPassthroughEvent } from '../events/PassthroughEvents';\nimport {\n EventType,\n newEventId,\n type AgentApprovalDecisionMessage,\n type AgentInfo,\n type AgentOutputEvent,\n type AgentParent,\n type MCPInitializeEvent,\n type MCPServerInitInfo,\n type ModelMessageDeltaEvent,\n type ModelMessageEvent,\n type ModelMessageUsage,\n type SandboxCreatedEvent,\n type ThreadOverwriteContextEvent,\n type ToolApprovalRequiredEvent,\n type ToolResponseEvent,\n type ToolResponseRequiredEvent,\n type UserToolApprovalMessage,\n type UserToolResponseMessage,\n} from '../events/schema';\nimport { InstructionBuilder, ROOT_AGENT_IDENTITY } from '../InstructionBuilder';\nimport type { LLMCreateParamsStreaming } from '../llm/ILLM';\nimport {\n type CompletionUsage,\n type ExtendedChatCompletionChunk,\n type FinishReason,\n type InternalEnrichedAssistantMessage,\n type InternalEnrichedToolCall,\n type LLMToolMessage,\n type LLMUserMessage,\n type RawAssistantMessage,\n} from '../llm/LLMTypes';\nimport { toOpenAIResponseFormat } from '../llm/responseFormat';\nimport { toOpenAIChatMessage } from '../llm/toOpenAIChatMessage';\nimport { estimateTokensForString } from '../llm/usage';\nimport { convertMCPServersToTools, type ConvertToolsResult, type MappedMCPTool } from '../mcp/convertMCPServers';\nimport { executeToolCalls } from '../mcp/executeToolCalls';\nimport type { IToolSet, MCPAuthRequired } from '../mcp/IMCPServer';\nimport type { Sandbox, SandboxInfo } from '../sandbox/Sandbox';\nimport type { AgentTracing } from '../tracing/AgentTracing';\nimport { describeUnknownError, extractErrorLogFields } from '../util/errorLogFields';\nimport type { AgentDefinition } from './AgentDefinition';\nimport type {\n AgentThreadConstructorInput,\n AgentThreadRuntimeSendBatch,\n AgentThreadRuntimeSendInput,\n AgentThreadSnapshot,\n} from './AgentThread.types';\nimport {\n InternalEventType,\n type AgentThreadAppendContext,\n type AgentThreadEvent,\n type ContextMessage,\n type InternalCapabilityStateEvent,\n type InternalMCPAuthRequiredEvent,\n type InternalThreadDoneEvent,\n type SubAgentCompletionMarker,\n} from './AgentThread.types';\nimport {\n currentContextUsageFromCompletion,\n getEmptyCurrentContextUsage,\n mergeCurrentContextUsage,\n type CurrentContextUsage,\n} from './contextUsage';\nimport {\n assistantMessageContentToStringForSubAgent,\n estimateTokensForContextMessages,\n INTERNAL_SYSTEM_PROMPT,\n isApprovalDecisionMessage,\n isClientSideToolResponseMessage,\n isInputUserMessage,\n isLLMContextMessage,\n isLLMToolMessage,\n makeUnknownToolInfo,\n scanApprovalDecisions,\n toEnrichedToolCall,\n toToolCallInfo,\n} from './contextUtils';\nimport { DeferredTool } from './DeferredTool';\nimport { createEmptyAgentThreadMetrics, updateMetricsFromUsage, type AgentThreadMetrics } from './metrics';\nimport { getClosableOpenToolCallIds, OpenToolCallCloser } from './OpenToolCallCloser';\nimport { isEmptyMessageContent, processAgentUserInput, type AgentInputUserMessage } from './UserInputMessage';\n\nconst DEFAULT_ITERATION_LIMIT = 25;\n\ntype AgentThreadState = 'llm-call-required' | 'tool-response-required' | 'user-input-required';\n\ntype StepOutcome = 'exit' | 'continue';\n\nconst VALID_TRANSITIONS: Record<AgentThreadState, AgentThreadState[]> = {\n 'llm-call-required': ['tool-response-required', 'user-input-required'],\n 'tool-response-required': ['llm-call-required'],\n // user-input-required transitions to:\n // tool-response-required — after approval decisions are appended (approval flow)\n // llm-call-required — after client-side tool responses resolve tool calls directly\n 'user-input-required': ['tool-response-required', 'llm-call-required'],\n};\n\nfunction assertValidTransition(from: AgentThreadState, to: AgentThreadState): void {\n if (!VALID_TRANSITIONS[from].includes(to)) {\n throw new Error(`Invalid state transition: ${from} → ${to}`);\n }\n}\n\nfunction deriveAgentThreadState(context: ContextMessage[]): AgentThreadState {\n const openToolCallIds = getOpenToolCallIds(context);\n if (openToolCallIds.size === 0) {\n return 'llm-call-required';\n }\n\n const assistant = lastAssistantInContext(context);\n const decisions = scanApprovalDecisions(context);\n const hasPendingApproval = assistant?.tool_calls?.some(\n tc => openToolCallIds.has(tc.id) && tc.tool_info.is_approval_required === true && !decisions.has(tc.id),\n );\n const hasPendingClientSideTool = assistant?.tool_calls?.some(\n tc => openToolCallIds.has(tc.id) && tc.tool_info.is_client_side === true,\n );\n return hasPendingApproval || hasPendingClientSideTool ? 'user-input-required' : 'tool-response-required';\n}\n\nfunction hasToolCalls(message: InternalEnrichedAssistantMessage): boolean {\n return Boolean(message.tool_calls && message.tool_calls.length > 0);\n}\n\n// Tool call ids issued by the last assistant message that have no matching\n// tool response after it. Walks the context tail-first and stops at the last\n// assistant message — under the invariant that older assistant tool_calls are\n// already resolved, only the last assistant message can have open ids.\nfunction getOpenToolCallIds(context: ContextMessage[]): Set<string> {\n const resolvedToolCallIds = new Set<string>();\n const openToolCallIds = new Set<string>();\n for (let i = context.length - 1; i >= 0; i--) {\n const msg = context[i];\n if (msg === undefined) {\n continue;\n }\n if (!isLLMContextMessage(msg)) {\n continue;\n }\n if (msg.role === 'tool') {\n resolvedToolCallIds.add(msg.tool_call_id);\n continue;\n }\n if (msg.role === 'assistant') {\n for (const tc of msg.tool_calls ?? []) {\n openToolCallIds.add(tc.id);\n }\n for (const id of resolvedToolCallIds) {\n openToolCallIds.delete(id);\n }\n break;\n }\n }\n return openToolCallIds;\n}\n\nfunction lastAssistantInContext(context: ContextMessage[]): InternalEnrichedAssistantMessage | undefined {\n return context.findLast(\n (msg): msg is InternalEnrichedAssistantMessage => isLLMContextMessage(msg) && msg.role === 'assistant',\n );\n}\n\n// Open tool calls that block a new user message: the open set minus those OpenToolCallCloser will\n// auto-close during preSend. Lets a user message resume a thread whose only open calls are dangling\n// regular tool calls (which the closer repairs), while still blocking on approval/client-side/\n// sub-agent calls that genuinely need resolution. Takes the already-computed open set; copies it\n// since it mutates (deletes) the closable ids.\nfunction getUnclosableOpenToolCallIds(context: ContextMessage[], openToolCallIds: Set<string>): Set<string> {\n const blockingOpenToolCallIds = new Set(openToolCallIds);\n for (const id of getClosableOpenToolCallIds(context)) {\n blockingOpenToolCallIds.delete(id);\n }\n return blockingOpenToolCallIds;\n}\n\nfunction buildMCPInitializeEvent(initInfo: MCPServerInitInfo[], threadId: string): MCPInitializeEvent {\n return {\n type: EventType.MCP_INITIALIZE,\n id: newEventId(),\n created_at: new Date().toISOString(),\n thread_id: threadId,\n mcp_servers: initInfo,\n };\n}\n\nfunction buildMCPAuthRequiredEvent(\n authRequirementInfo: MCPAuthRequired[],\n threadId: string,\n): InternalMCPAuthRequiredEvent {\n return {\n type: InternalEventType.MCP_AUTH_REQUIRED,\n id: newEventId(),\n created_at: new Date().toISOString(),\n mcp_servers: authRequirementInfo.flatMap(or => or.servers.map(s => ({ ...s, thread_ids: [threadId] }))),\n // threadId identifies which thread triggered auth for each server so AgentThreadOrchestrator can merge\n // auth events across parallel sub-agents by server.\n thread_id: null,\n };\n}\n\nfunction buildSandboxCreatedEvent(info: SandboxInfo): SandboxCreatedEvent {\n return {\n type: EventType.SANDBOX_CREATED,\n id: newEventId(),\n created_at: new Date().toISOString(),\n ...info,\n thread_id: null,\n };\n}\n\nfunction buildModelMessageEvent({\n assistantMessage,\n threadId,\n finishReason,\n usage,\n id,\n}: {\n assistantMessage: InternalEnrichedAssistantMessage;\n threadId: string;\n finishReason: FinishReason | null;\n usage: ModelMessageUsage | undefined;\n id: string;\n}): ModelMessageEvent {\n // `thinking_blocks` / `source` stay on the context message for replay; strip them from the client event.\n const { role, tool_calls, thinking_blocks, source, ...rest } = assistantMessage;\n void role;\n void thinking_blocks;\n void source;\n const event: ModelMessageEvent = {\n ...rest,\n tool_calls: tool_calls?.map(toEnrichedToolCall),\n type: EventType.MODEL_MESSAGE,\n id,\n created_at: new Date().toISOString(),\n thread_id: threadId,\n finish_reason: finishReason,\n ...(usage && { usage }),\n };\n return event;\n}\n\nfunction validateUserMessage(\n message: { content: AgentInputUserMessage['content'] },\n blockingOpenToolCallIds: Set<string>,\n index: number,\n): void {\n if (isEmptyMessageContent(message.content)) {\n throw new InvalidAgentSendInputError(`messages[${String(index)}] user message has empty content`);\n }\n if (blockingOpenToolCallIds.size > 0) {\n throw new InvalidAgentSendInputError('user message cannot be sent while approvals or questions are pending');\n }\n}\n\nfunction validateToolMessage(\n message: LLMToolMessage | UserToolResponseMessage,\n openToolCallIds: Set<string>,\n index: number,\n): void {\n if (!openToolCallIds.has(message.tool_call_id)) {\n throw new InvalidAgentSendInputError(\n `messages[${String(index)}] no open tool call for tool_call_id '${message.tool_call_id}'`,\n );\n }\n}\n\nfunction validateApprovalMessage(\n message: UserToolApprovalMessage,\n pendingApprovalIds: Set<string>,\n index: number,\n): void {\n if (!pendingApprovalIds.has(message.tool_call_id)) {\n throw new InvalidAgentSendInputError(\n `messages[${String(index)}] no pending approval for tool_call_id '${message.tool_call_id}'`,\n );\n }\n}\n\nfunction getPendingApprovalToolCalls(context: ContextMessage[]): InternalEnrichedToolCall[] {\n const openToolCallIds = getOpenToolCallIds(context);\n const decisions = scanApprovalDecisions(context);\n const assistant = lastAssistantInContext(context);\n return (assistant?.tool_calls ?? []).filter(\n tc => openToolCallIds.has(tc.id) && tc.tool_info.is_approval_required === true && !decisions.has(tc.id),\n );\n}\n\nfunction getPendingClientSideToolCalls(context: ContextMessage[]): InternalEnrichedToolCall[] {\n const openToolCallIds = getOpenToolCallIds(context);\n const assistant = lastAssistantInContext(context);\n return (assistant?.tool_calls ?? []).filter(tc => openToolCallIds.has(tc.id) && tc.tool_info.is_client_side === true);\n}\n\nfunction validateInputMessageTypesGivenContext(\n context: ContextMessage[],\n messages: AgentThreadRuntimeSendInput[],\n): void {\n // Full open set: validates incoming tool responses and dedupes within the batch.\n const openToolCallIds = getOpenToolCallIds(context);\n // Subset that blocks a fresh user message: excludes calls OpenToolCallCloser will auto-close\n // during preSend, so a dangling regular tool call doesn't reject a user message it will repair.\n const blockingOpenToolCallIds = getUnclosableOpenToolCallIds(context, openToolCallIds);\n const pendingApprovalIds = new Set(getPendingApprovalToolCalls(context).map(tc => tc.id));\n const pendingClientSideIds = new Set(getPendingClientSideToolCalls(context).map(tc => tc.id));\n\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i];\n if (m === undefined) {\n continue;\n }\n if (isApprovalDecisionMessage(m)) {\n validateApprovalMessage(m, pendingApprovalIds, i);\n pendingApprovalIds.delete(m.tool_call_id);\n } else if (isInputUserMessage(m)) {\n validateUserMessage(m, blockingOpenToolCallIds, i);\n } else if (isClientSideToolResponseMessage(m) || isLLMToolMessage(m)) {\n validateToolMessage(m, openToolCallIds, i);\n openToolCallIds.delete(m.tool_call_id);\n blockingOpenToolCallIds.delete(m.tool_call_id);\n pendingClientSideIds.delete(m.tool_call_id);\n } else {\n const _exhaustive: never = m;\n throw new InvalidAgentSendInputError(\n `messages[${String(i)}] has unsupported type: ${JSON.stringify(_exhaustive)}`,\n );\n }\n }\n\n // A send for a thread awaiting user input must resolve every pending approval and client-side\n // tool call in the same batch; any left unresolved (including an empty batch) is a blocker.\n if (pendingApprovalIds.size > 0 || pendingClientSideIds.size > 0) {\n const missing = [...pendingApprovalIds, ...pendingClientSideIds];\n throw new InvalidAgentSendInputError(\n `Send batch must resolve all pending tool calls awaiting user input. Missing: ${missing.join(', ')}`,\n );\n }\n}\n\nasync function buildModelMessageDeltaEvent({\n chunk,\n threadId,\n toolMapping,\n usage,\n id,\n logger,\n}: {\n chunk: ExtendedChatCompletionChunk;\n threadId: string;\n toolMapping: Map<string, MappedMCPTool>;\n usage: ModelMessageUsage | undefined;\n id: string;\n logger: Logger;\n}): Promise<ModelMessageDeltaEvent | undefined> {\n const choice = chunk.choices[0];\n const delta = choice?.delta;\n const finishReason = choice?.finish_reason;\n\n if (!delta || (Object.keys(delta).length === 0 && !finishReason && !usage)) {\n return;\n }\n\n // Drop empty deltas that carry no displayable or actionable data\n if (!delta.tool_calls?.length && !delta.content && !delta.reasoning_content && !finishReason && !usage) {\n return;\n }\n\n const toolCalls = delta.tool_calls ?? [];\n for (const toolCall of toolCalls) {\n if (toolCall.function?.name) {\n const toolInfo = toolMapping.get(toolCall.function.name);\n if (!toolInfo) {\n logger.warn(`LLM called unknown tool: Tool ${toolCall.function.name} not found in tool mapping.`);\n toolCall.tool_info = toToolCallInfo(makeUnknownToolInfo(toolCall.function.name));\n continue;\n }\n toolCall.tool_info = toToolCallInfo(\n await toolInfo.toolSet.toolCallInfo({ name: toolInfo.originalToolName }, false /* resolveUnderlyingTool */),\n );\n }\n }\n\n // Strip legacy `function_call` and replay-only `thinking_blocks` so neither reaches the client or delta stream.\n const { role, function_call, thinking_blocks, ...deltaWithoutRole } = delta;\n void role;\n void function_call;\n void thinking_blocks;\n return {\n ...deltaWithoutRole,\n type: EventType.MODEL_MESSAGE_DELTA,\n id,\n thread_id: threadId,\n ...(finishReason && { finish_reason: finishReason }),\n ...(usage && { usage }),\n };\n}\n\nasync function buildContextAssistantMessage(\n assistantMessage: RawAssistantMessage,\n toolMapping: Map<string, MappedMCPTool>,\n): Promise<InternalEnrichedAssistantMessage> {\n // Omit tool_calls when empty; OpenAI rejects `tool_calls: []` on replay.\n if (!assistantMessage.tool_calls?.length) {\n const { tool_calls, ...rest } = assistantMessage;\n void tool_calls;\n return rest;\n }\n\n // Sequential loop instead of Promise.all: the first call populates the MCP server's tool cache\n // (via listTools), making subsequent calls instant cache hits.\n // No race conditions either way but parallelism buys nothing here.\n const enrichedToolCalls = [];\n for (const toolCall of assistantMessage.tool_calls) {\n const toolInfo = toolMapping.get(toolCall.function.name);\n if (!toolInfo) {\n enrichedToolCalls.push({ ...toolCall, tool_info: makeUnknownToolInfo(toolCall.function.name) });\n continue;\n }\n const tool_info = await toolInfo.toolSet.toolCallInfo(\n {\n name: toolInfo.originalToolName,\n arguments: tryParseToolArgs(toolCall.function.arguments),\n },\n // During context persistence, we have the complete message and hence the tool arguments are available.\n // Hence, we resolve the underlying tool to get the tool information.\n true /* resolveUnderlyingTool */,\n );\n enrichedToolCalls.push({ ...toolCall, tool_info });\n }\n return { ...assistantMessage, tool_calls: enrichedToolCalls };\n}\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// Args are only used by DeferredTool to delegate to the underlying server.\n// Defensive parse — hallucinated JSON shouldn't crash assistant-message construction.\nfunction tryParseToolArgs(args: string | undefined): Record<string, unknown> {\n if (!args) {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(args);\n return isJsonObject(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\n// State-sync contract: in-memory state must stay consistent with what the consumer\n// def foo():\n// for x in range(1, 10):\n// yield x\n// # This cannot raise exception\n// # This does not execute if update_redis fails.\n// update_local_context(x)\n// for x in foo():\n// # This can raise exception.\n// update_redis(x)\n\nexport class AgentThread {\n readonly threadId: string;\n readonly parent?: AgentParent | undefined;\n readonly definition: AgentDefinition;\n readonly title: string;\n readonly agentInfo?: AgentInfo | undefined;\n\n private context: ContextMessage[];\n private currentContextUsage: CurrentContextUsage;\n private preSendContextProcessors: PreSendContextProcessor[];\n private preLLMContextProcessors: PreLLMAgentContextProcessor[];\n private preEphemeralLLMContextProcessors: PreLLMEphemeralAgentContextProcessor[];\n private postToolCallContextProcessor: PostToolCallAgentContextProcessor[];\n\n private instruction: string | undefined;\n private toolResponseProcessors: ToolResponseProcessor[];\n private instructionBuilders: readonly ((builder: InstructionBuilder) => void)[];\n private systemToolSets: readonly IToolSet[];\n private deferredTool?: DeferredTool | undefined;\n private convertedTools: ConvertToolsResult | undefined;\n private pendingSandboxCreatedEvents: SandboxCreatedEvent[] = [];\n private sandbox?: Sandbox | undefined;\n private readonly tracing: AgentTracing;\n private readonly logger: Logger;\n\n private metrics: AgentThreadMetrics = createEmptyAgentThreadMetrics();\n private tfyManagedServerNames = new Set<string>();\n\n private contextBusy = false;\n private preSendRanThisTurn = false;\n private currentState: AgentThreadState | null = null;\n private readonly preComputedCompletion?: SubAgentCompletionMarker | undefined;\n /** Mirrored capability KV — source for toSnapshot().capability_state. */\n private capabilityState: CapabilityState = {};\n private readonly capabilityStateKeys: ReadonlySet<string>;\n\n constructor(input: AgentThreadConstructorInput) {\n this.tracing = input.tracing;\n this.logger = input.logger.child({ module: 'AgentThread' });\n this.threadId = input.threadId;\n this.definition = input.definition;\n this.context = input.context ? [...input.context] : [];\n this.title = input.title;\n this.parent = input.parent;\n this.currentContextUsage = input.currentContextUsage ?? getEmptyCurrentContextUsage();\n this.agentInfo = input.agentInfo;\n this.preComputedCompletion = input.preComputedCompletion;\n this.sandbox = input.sandbox;\n\n const capabilities = input.capabilities ?? [];\n this.systemToolSets = capabilities.flatMap(c => c.systemToolSets ?? []);\n this.preLLMContextProcessors = capabilities.flatMap(c => c.preLLMProcessors ?? []);\n this.preEphemeralLLMContextProcessors = capabilities.flatMap(c => c.preLLMEphemeralProcessors ?? []);\n this.postToolCallContextProcessor = capabilities.flatMap(c => c.postToolCallProcessors ?? []);\n this.toolResponseProcessors = capabilities.flatMap(c => c.toolResponseProcessors ?? []);\n this.instructionBuilders = capabilities.flatMap(c => c.instructionBuilders ?? []);\n const capabilityPreSend = capabilities.flatMap(c => c.preSendProcessors ?? []);\n // OpenToolCallCloser is fixed core before contributed preSend processors.\n this.preSendContextProcessors = [new OpenToolCallCloser(), ...capabilityPreSend];\n\n assertUniqueStateKeys(capabilities);\n const claimed = claimCapabilityState(capabilities, input.capabilityState, this.logger);\n this.capabilityState = claimed;\n this.capabilityStateKeys = new Set(\n capabilities.map(c => c.state?.key).filter((k): k is string => typeof k === 'string'),\n );\n for (const capability of capabilities) {\n if (!capability.state) {\n continue;\n }\n const value = claimed[capability.state.key];\n if (value !== undefined) {\n capability.state.load(value);\n }\n }\n\n if (this.definition.toolSets?.length) {\n this.deferredTool = new DeferredTool(this.definition.toolSets, {\n tracing: this.tracing,\n logger: input.logger,\n });\n }\n\n if (this.sandbox) {\n this.sandbox.configureCodeMode(this.definition.toolSets ?? []);\n }\n\n this.instruction = this.buildInstruction(this.definition.instruction);\n }\n\n private buildInstruction(userInstruction?: string): string {\n const identity = this.parent ? SUB_AGENT_IDENTITY : ROOT_AGENT_IDENTITY;\n const builder = InstructionBuilder.createSystemPrompt(identity);\n const capabilities = builder.beginSection('agent-capabilities');\n capabilities.addSection('internal-messages', INTERNAL_SYSTEM_PROMPT);\n\n if (this.sandbox) {\n this.sandbox.buildInstruction(capabilities);\n }\n if (this.deferredTool) {\n this.deferredTool.buildInstruction(capabilities);\n }\n for (const build of this.instructionBuilders) {\n build(capabilities);\n }\n if (!this.parent && userInstruction?.trim()) {\n builder.addSection('user-instructions', userInstruction.trim(), true);\n }\n return builder.build();\n }\n\n public async *send(messages: AgentThreadRuntimeSendBatch): AsyncGenerator<AgentThreadAppendContext, void, unknown> {\n // An empty batch is a no-op only when the thread is not awaiting user input.\n // While awaiting input, fall through so the validator rejects the empty/incomplete batch.\n if (messages.length === 0 && !this.isAwaitingUserInput()) {\n return;\n }\n this.throwIfContextBusy();\n\n this.contextBusy = true;\n try {\n for await (const event of this.executeContextProcessors('preSend')) {\n yield event;\n }\n this.preSendRanThisTurn = true;\n\n validateInputMessageTypesGivenContext(this.context, messages);\n\n const approvals: UserToolApprovalMessage[] = [];\n const clientSideToolResponses: UserToolResponseMessage[] = [];\n const contextMessages: (LLMUserMessage | LLMToolMessage)[] = [];\n\n for (const m of messages) {\n if (isApprovalDecisionMessage(m)) {\n approvals.push(m);\n } else if (isClientSideToolResponseMessage(m)) {\n clientSideToolResponses.push(m);\n } else if (isInputUserMessage(m)) {\n const result = await processAgentUserInput(m, this.sandbox);\n contextMessages.push(result.message);\n if (result.sandboxCreated) {\n this.pendingSandboxCreatedEvents.push(buildSandboxCreatedEvent(result.sandboxCreated));\n }\n } else if (isLLMToolMessage(m)) {\n contextMessages.push(m);\n } else {\n const _exhaustive: never = m;\n throw new InvalidAgentSendInputError(`Unsupported send input: ${JSON.stringify(_exhaustive)}`);\n }\n }\n\n if (approvals.length > 0 || clientSideToolResponses.length > 0) {\n const approvalContext: AgentApprovalDecisionMessage[] = approvals.map(a => ({\n type: EventType.USER_TOOL_APPROVAL,\n tool_call_id: a.tool_call_id,\n approval: a.approval,\n }));\n const toolResponseContext: LLMToolMessage[] = clientSideToolResponses.map(m => ({\n role: 'tool',\n tool_call_id: m.tool_call_id,\n content: m.content,\n }));\n yield* this.appendToContext({\n context: [...approvalContext, ...toolResponseContext],\n output: [],\n currentContextUsage: undefined,\n usage: undefined,\n });\n }\n if (contextMessages.length > 0) {\n yield* this.appendToContext({\n context: contextMessages,\n output: [],\n currentContextUsage: undefined,\n usage: undefined,\n });\n }\n } finally {\n this.contextBusy = false;\n }\n }\n\n private throwIfContextBusy(): void {\n if (this.contextBusy) {\n throw new Error(`context is busy for thread ${this.threadId}`);\n }\n }\n\n private deriveState(): AgentThreadState {\n const next = deriveAgentThreadState(this.context);\n if (this.currentState) {\n assertValidTransition(this.currentState, next);\n }\n this.currentState = next;\n return next;\n }\n\n private *appendToContext(opts: {\n context: ContextMessage[];\n output: AgentOutputEvent[];\n currentContextUsage: CurrentContextUsage | undefined;\n usage: CompletionUsage | undefined;\n completion?: SubAgentCompletionMarker | undefined;\n }): Generator<AgentThreadAppendContext, void, unknown> {\n const { context, output, currentContextUsage, usage, completion } = opts;\n\n const newCurrentContextUsage =\n currentContextUsage ??\n mergeCurrentContextUsage(this.currentContextUsage, estimateTokensForContextMessages(context));\n\n const event: AgentThreadAppendContext = {\n type: InternalEventType.AGENT_CONTEXT_APPEND,\n thread_id: this.threadId,\n context,\n output,\n current_context_usage: newCurrentContextUsage,\n ...(completion && { completion }),\n };\n\n // Update metrics before yield so we still count it if the stream stops here.\n if (usage) {\n updateMetricsFromUsage(this.metrics, usage);\n }\n\n yield event;\n\n this.context = this.context.concat(context);\n this.currentContextUsage = newCurrentContextUsage;\n }\n\n private *overwriteContext(\n payload: AgentContextProcessorOverwriteContext,\n ): Generator<ThreadOverwriteContextEvent, void, unknown> {\n const event: ThreadOverwriteContextEvent = {\n thread_id: this.threadId,\n ...payload,\n };\n // Update metrics before yield so we still count it if the stream stops here.\n updateMetricsFromUsage(this.metrics, payload.usage);\n\n yield event;\n this.context = payload.context;\n this.currentContextUsage = payload.current_context_usage;\n this.metrics.total_summarizations++;\n }\n\n private generateErrorEvent(message: string, output?: ModelMessageEvent): InternalThreadDoneEvent {\n return {\n type: InternalEventType.AGENT_DONE,\n status: 'error',\n thread_id: this.threadId,\n title: this.title,\n error: message,\n parent: this.parent,\n send_to_parent: this.parent\n ? {\n role: 'tool',\n content: message,\n tool_call_id: this.parent.tool_call_id,\n }\n : undefined,\n ...(output && { output }),\n };\n }\n\n public hasOpenToolCallId(toolCallId: string): boolean {\n return getOpenToolCallIds(this.context).has(toolCallId);\n }\n\n // True when this thread is paused waiting on the user to resolve a pending tool\n // approval or a client-side tool response.\n public isAwaitingUserInput(): boolean {\n return (\n getPendingApprovalToolCalls(this.context).length > 0 || getPendingClientSideToolCalls(this.context).length > 0\n );\n }\n\n // Pure validation of an input batch against this thread's current context; throws\n // on an invalid/incomplete batch without mutating the context.\n public validateSendInput(messages: AgentThreadRuntimeSendBatch): void {\n validateInputMessageTypesGivenContext(this.context, messages);\n }\n\n public toSnapshot(): AgentThreadSnapshot {\n const capability_state = Object.keys(this.capabilityState).length > 0 ? { ...this.capabilityState } : null;\n return {\n thread_id: this.threadId,\n context: this.context,\n current_context_usage: this.currentContextUsage,\n parent: this.parent ?? null,\n agent_info: this.agentInfo ?? null,\n completion: this.preComputedCompletion ?? null,\n capability_state,\n };\n }\n\n public getAgentThreadMetrics(): AgentThreadMetrics {\n return { ...this.metrics };\n }\n\n private transformToLLMRequest(tools: ChatCompletionTool[]): LLMCreateParamsStreaming {\n let messages: ChatCompletionMessageParam[] = [];\n\n if (this.instruction) {\n messages.push({\n role: 'system',\n content: this.instruction,\n });\n }\n\n if (this.definition.messages) {\n for (const msg of this.definition.messages) {\n if (isLLMContextMessage(msg)) {\n messages.push(toOpenAIChatMessage(msg));\n }\n }\n }\n\n // NOTE: all this code-golf is to remove `tool_info` before sending the message to Gateway\n // ApprovalDecisionMessage rows are persisted in context but must not be sent to the LLM.\n const contextMessages = this.context.filter(isLLMContextMessage).map(msg => toOpenAIChatMessage(msg));\n\n messages.push(...contextMessages);\n\n for (const processor of this.preEphemeralLLMContextProcessors) {\n messages = processor.processPreLLMEphemeral(messages) ?? messages;\n }\n\n // modelParams may include provider extensions (e.g. reasoning_effort) beyond the SDK's\n // ChatCompletionCreateParamsStreaming field set; assign after constructing the typed body.\n // Model identity is owned by modelClient — do not set `model` on the request.\n const requestBody: LLMCreateParamsStreaming = {\n messages,\n stream: true,\n ...(this.definition.responseFormat !== undefined\n ? { response_format: toOpenAIResponseFormat(this.definition.responseFormat) }\n : {}),\n };\n if (this.definition.modelParams) {\n Object.assign(requestBody, this.definition.modelParams);\n }\n\n if (tools.length > 0) {\n requestBody.tools = tools;\n }\n\n return requestBody;\n }\n\n private computeAssistantMessageUsage(params: {\n requestBody: LLMCreateParamsStreaming;\n usage: CompletionUsage;\n toolMapping: Map<string, MappedMCPTool>;\n }): ModelMessageUsage {\n const { requestBody, usage, toolMapping } = params;\n // Sub-agents have no <user-instructions> section — their agent.instruction is\n // SUB_AGENT_IDENTITY which is harness content, not user-defined instructions.\n const trimmedInstruction = this.definition.instruction?.trim() ?? '';\n const instructionsEstimate = this.parent ? 0 : Math.round(estimateTokensForString(trimmedInstruction));\n\n const skillsEstimate = this.sandbox?.estimateSkillsTokens() ?? 0;\n\n let tfyManagedToolTokens = 0;\n let userToolTokens = 0;\n if (requestBody.tools) {\n for (const tool of requestBody.tools) {\n const toolTokens = Math.round(estimateTokensForString(JSON.stringify(tool)));\n const info = 'function' in tool ? toolMapping.get(tool.function.name) : undefined;\n if (info && this.tfyManagedServerNames.has(info.toolSet.name)) {\n tfyManagedToolTokens += toolTokens;\n } else {\n userToolTokens += toolTokens;\n }\n }\n }\n\n const totalInstructionTokens = Math.round(estimateTokensForString(this.instruction ?? ''));\n const harnessInstructionTokens = Math.max(0, totalInstructionTokens - instructionsEstimate - skillsEstimate);\n const harnessEstimate = harnessInstructionTokens + tfyManagedToolTokens;\n\n const estimatedComponentsTotal = harnessEstimate + skillsEstimate + instructionsEstimate + userToolTokens;\n const messagesEstimate = Math.max(0, usage.input_tokens - estimatedComponentsTotal);\n\n return {\n input_tokens: usage.input_tokens,\n output_tokens: usage.output_tokens,\n cache_read_tokens: usage.cache_read_tokens,\n cache_write_tokens: usage.cache_write_tokens,\n input_tokens_breakdown: {\n harness: harnessEstimate,\n skills: skillsEstimate,\n instructions: instructionsEstimate,\n tool_definitions: userToolTokens,\n messages: messagesEstimate,\n },\n };\n }\n\n private executeContextProcessors(hook: 'preSend'): AsyncGenerator<AgentThreadAppendContext, void, unknown>;\n private executeContextProcessors(\n hook: 'preLLM' | 'postToolCall',\n ): AsyncGenerator<\n | ThreadOverwriteContextEvent\n | AgentThreadAppendContext\n | { type: typeof InternalEventType.PASSTHROUGH; event: RegisteredPassthroughEvent }\n | InternalCapabilityStateEvent,\n void,\n unknown\n >;\n private async *executeContextProcessors(\n hook: 'preSend' | 'preLLM' | 'postToolCall',\n ): AsyncGenerator<\n | ThreadOverwriteContextEvent\n | AgentThreadAppendContext\n | { type: typeof InternalEventType.PASSTHROUGH; event: RegisteredPassthroughEvent }\n | InternalCapabilityStateEvent,\n void,\n unknown\n > {\n let processors: ((\n execution: Readonly<AgentThreadExecutionContext>,\n ) => AsyncIterable<AgentContextProcessorOutput>)[];\n switch (hook) {\n case 'preSend':\n processors = this.preSendContextProcessors.map(p => p.processPreSend.bind(p));\n break;\n case 'preLLM':\n processors = this.preLLMContextProcessors.map(p => p.processPreLLM.bind(p));\n break;\n case 'postToolCall':\n processors = this.postToolCallContextProcessor.map(p => p.processPostToolCall.bind(p));\n break;\n default:\n throw new Error(`Unknown hook: ${String(hook)}`);\n }\n\n const execution: Readonly<AgentThreadExecutionContext> = {\n threadId: this.threadId,\n sandbox: this.sandbox,\n currentContextUsage: this.currentContextUsage,\n context: this.context,\n };\n\n for (const processor of processors) {\n for await (const response of processor(execution)) {\n switch (response.type) {\n case InternalEventType.AGENT_CONTEXT_APPEND:\n yield* this.appendToContext({\n context: response.context,\n output: response.output,\n currentContextUsage: response.current_context_usage ?? this.currentContextUsage,\n usage: undefined,\n });\n break;\n case EventType.AGENT_CONTEXT_OVERWRITE:\n yield* this.overwriteContext(response);\n break;\n case InternalEventType.PASSTHROUGH:\n yield response;\n break;\n case InternalEventType.CAPABILITY_STATE:\n if (!this.capabilityStateKeys.has(response.key)) {\n throw new AgentHarnessError(\n 'capability_state_error',\n `CAPABILITY_STATE key '${response.key}' is not declared by any capability on thread '${this.threadId}'`,\n );\n }\n yield {\n type: InternalEventType.CAPABILITY_STATE,\n thread_id: this.threadId,\n key: response.key,\n state: response.state,\n };\n this.capabilityState[response.key] = response.state;\n break;\n default: {\n const _exhaustive: never = response;\n return _exhaustive;\n }\n }\n }\n }\n }\n\n private async init(): Promise<{\n initializationInfo: MCPServerInitInfo[];\n authRequirementInfo: MCPAuthRequired[];\n }> {\n if (this.convertedTools) {\n return { initializationInfo: [], authRequirementInfo: [] };\n }\n return this.initTools();\n }\n\n private async initTools(): Promise<{\n initializationInfo: MCPServerInitInfo[];\n authRequirementInfo: MCPAuthRequired[];\n }> {\n const tfyManagedServers: IToolSet[] = [...this.systemToolSets];\n if (this.sandbox) {\n tfyManagedServers.push(this.sandbox);\n }\n if (this.deferredTool) {\n tfyManagedServers.push(this.deferredTool);\n }\n const userServers = [...(this.definition.toolSets ?? [])];\n\n const { convertedTools, initializationInfo, authRequirementInfo } = await convertMCPServersToTools({\n tfyManagedServers,\n userServers,\n });\n this.convertedTools = convertedTools;\n this.tfyManagedServerNames = new Set(tfyManagedServers.map(s => s.name));\n return { initializationInfo, authRequirementInfo };\n }\n\n private getConvertedTools(): ConvertToolsResult {\n if (!this.convertedTools) {\n throw new Error('unreachable');\n }\n return this.convertedTools;\n }\n\n private async *stepLLMCall(\n tools: ChatCompletionTool[],\n toolMapping: Map<string, MappedMCPTool>,\n signal?: AbortSignal,\n ): AsyncGenerator<AgentThreadEvent, { outcome: StepOutcome; modelMessageEventId: string }, unknown> {\n const modelMessageEventId = newEventId();\n if (signal?.aborted) {\n return { outcome: 'exit', modelMessageEventId };\n }\n\n for await (const event of this.executeContextProcessors('preLLM')) {\n yield event;\n }\n\n const requestBody = this.transformToLLMRequest(tools);\n const llmStream = this.definition.modelClient.create(requestBody);\n\n // We start the delta stream with a model message event.\n yield {\n type: EventType.MODEL_MESSAGE,\n thread_id: this.threadId,\n created_at: new Date().toISOString(),\n id: modelMessageEventId,\n } satisfies ModelMessageEvent;\n\n let firstDeltaTimestamped = false;\n let result = await llmStream.next();\n let modelMessageUsage: ModelMessageUsage | undefined = undefined;\n while (!result.done) {\n const chunk = result.value;\n if (chunk.usage) {\n modelMessageUsage = this.computeAssistantMessageUsage({\n requestBody,\n usage: chunk.usage,\n toolMapping,\n });\n }\n const event = await buildModelMessageDeltaEvent({\n chunk,\n threadId: this.threadId,\n toolMapping,\n usage: modelMessageUsage,\n id: modelMessageEventId,\n logger: this.logger,\n });\n if (event) {\n if (!firstDeltaTimestamped) {\n firstDeltaTimestamped = true;\n yield { ...event, created_at: new Date().toISOString() };\n } else {\n yield event;\n }\n }\n result = await llmStream.next();\n }\n\n // If the stream was aborted mid-way, result.value.output is only a partial\n // accumulation of the deltas — not the true complete response. Skip the\n // final model.message event to avoid emitting an inconsistent assembled message.\n if (signal?.aborted) {\n return { outcome: 'exit', modelMessageEventId };\n }\n\n // should be computed by this point but in case provider never gives out any delta with usage, compute it now.\n modelMessageUsage ??= this.computeAssistantMessageUsage({\n requestBody,\n usage: result.value.usage,\n toolMapping,\n });\n const assistantMessage: InternalEnrichedAssistantMessage = await buildContextAssistantMessage(\n result.value.output,\n toolMapping,\n );\n const finishReason = result.value.finish_reason;\n const agentAssistantMessage = buildModelMessageEvent({\n assistantMessage,\n threadId: this.threadId,\n finishReason,\n usage: modelMessageUsage,\n id: modelMessageEventId,\n });\n\n let completion: SubAgentCompletionMarker | undefined;\n if (this.parent) {\n if (finishReason === 'length') {\n const errorMessage = assistantMessageContentToStringForSubAgent(\n assistantMessage.content,\n 'max_tokens breached',\n );\n completion = {\n type: 'error',\n output: agentAssistantMessage,\n error_message: errorMessage,\n send_to_parent: { role: 'tool', tool_call_id: this.parent.tool_call_id, content: errorMessage },\n };\n } else if (!hasToolCalls(assistantMessage)) {\n const content = assistantMessageContentToStringForSubAgent(assistantMessage.content);\n completion = {\n type: 'done',\n output: agentAssistantMessage,\n send_to_parent: { role: 'tool', tool_call_id: this.parent.tool_call_id, content },\n };\n }\n }\n\n yield* this.appendToContext({\n context: [assistantMessage],\n output: [agentAssistantMessage],\n currentContextUsage: currentContextUsageFromCompletion(result.value.usage),\n usage: result.value.usage,\n completion,\n });\n\n if (finishReason === 'length') {\n const errorContent = completion?.error_message ?? 'max_tokens breached';\n yield this.generateErrorEvent(errorContent, agentAssistantMessage);\n return { outcome: 'exit', modelMessageEventId };\n }\n\n if (!hasToolCalls(assistantMessage)) {\n yield {\n type: InternalEventType.AGENT_DONE,\n status: 'done',\n thread_id: this.threadId,\n title: this.title,\n output: agentAssistantMessage,\n parent: this.parent,\n send_to_parent: completion?.send_to_parent,\n };\n return { outcome: 'exit', modelMessageEventId };\n }\n\n return { outcome: 'continue', modelMessageEventId };\n }\n\n private async *stepToolResponse(\n toolMapping: Map<string, MappedMCPTool>,\n ): AsyncGenerator<AgentThreadEvent, StepOutcome, unknown> {\n const assistantMessage = lastAssistantInContext(this.context);\n if (!assistantMessage) {\n throw new Error('unreachable');\n }\n\n const openIds = getOpenToolCallIds(this.context);\n const openCalls = assistantMessage.tool_calls?.filter(tc => openIds.has(tc.id)) ?? [];\n const decisions = scanApprovalDecisions(this.context);\n\n const assistantForExecution: InternalEnrichedAssistantMessage = {\n ...assistantMessage,\n tool_calls: openCalls,\n };\n const {\n toolCallResults,\n initializationInfo,\n createThreadEvents,\n sandboxCreated,\n authRequirementInfo,\n approvalRequiredToolCalls,\n clientSideToolCalls,\n events: passthroughEvents,\n } = await executeToolCalls({\n assistantMessage: assistantForExecution,\n toolMapping,\n threadId: this.threadId,\n approvalDecisions: decisions,\n });\n void clientSideToolCalls;\n if (approvalRequiredToolCalls.length > 0) {\n throw new Error('Unreachable');\n }\n this.metrics.total_tool_calls += toolCallResults.length;\n this.metrics.total_sub_agents += createThreadEvents.length;\n\n if (initializationInfo.length > 0) {\n yield buildMCPInitializeEvent(initializationInfo, this.threadId);\n }\n\n if (sandboxCreated) {\n yield buildSandboxCreatedEvent(sandboxCreated);\n }\n\n for (const event of passthroughEvents) {\n yield { type: InternalEventType.PASSTHROUGH, event };\n }\n\n const toolIdsBeforeProcessing = toolCallResults.map(t => t.message.tool_call_id);\n const toolResponseExecution: Readonly<AgentThreadExecutionContext> = {\n threadId: this.threadId,\n sandbox: this.sandbox,\n currentContextUsage: this.currentContextUsage,\n context: this.context,\n };\n for (const processor of this.toolResponseProcessors) {\n const processorResult = await processor.process(toolCallResults, toolResponseExecution);\n if (processorResult.sandboxCreated) {\n yield buildSandboxCreatedEvent(processorResult.sandboxCreated);\n }\n for (const event of processorResult.events ?? []) {\n yield { type: InternalEventType.PASSTHROUGH, event };\n }\n }\n if (toolIdsBeforeProcessing.length !== toolCallResults.length) {\n throw Error('Some tool call processor has removed tool call.');\n }\n const toolIdsAfterProcessing = new Set(toolCallResults.map(t => t.message.tool_call_id));\n\n if (!toolIdsBeforeProcessing.every(id => toolIdsAfterProcessing.has(id))) {\n throw Error('Tool call IDs do not match after processing.');\n }\n\n const agentToolMessages: ToolResponseEvent[] = toolCallResults.map(t => {\n const { role, ...toolMessage } = t.message;\n void role;\n return {\n ...toolMessage,\n type: EventType.TOOL_RESPONSE,\n id: newEventId(),\n created_at: t.completedAt,\n thread_id: this.threadId,\n };\n });\n for (const msg of agentToolMessages) {\n yield msg;\n }\n // tool.response is persisted by the session/response layer when yielded; only mutate context here.\n yield* this.appendToContext({\n context: toolCallResults.map(t => t.message),\n output: [],\n currentContextUsage: undefined,\n usage: undefined,\n });\n\n if (authRequirementInfo.length > 0) {\n yield buildMCPAuthRequiredEvent(authRequirementInfo, this.threadId);\n return 'exit';\n }\n\n for await (const event of this.executeContextProcessors('postToolCall')) {\n yield event;\n }\n for (const event of createThreadEvents) {\n yield event;\n }\n if (createThreadEvents.length > 0) {\n return 'exit';\n }\n\n return 'continue';\n }\n\n private *stepUserInputRequired(modelMessageEventId: string): Generator<AgentThreadEvent, StepOutcome, unknown> {\n const pendingClientSideToolCalls = getPendingClientSideToolCalls(this.context);\n if (pendingClientSideToolCalls.length > 0) {\n const responseRequiredEvent: ToolResponseRequiredEvent = {\n type: EventType.TOOL_RESPONSE_REQUIRED,\n id: newEventId(),\n created_at: new Date().toISOString(),\n thread_id: this.threadId,\n tool_calls: pendingClientSideToolCalls.map(tc => ({ id: tc.id, source_event_id: modelMessageEventId })),\n };\n yield responseRequiredEvent;\n }\n\n const pendingApprovalToolCalls = getPendingApprovalToolCalls(this.context);\n if (pendingApprovalToolCalls.length > 0) {\n const event: ToolApprovalRequiredEvent = {\n type: EventType.TOOL_APPROVAL_REQUIRED,\n id: newEventId(),\n created_at: new Date().toISOString(),\n thread_id: this.threadId,\n tool_calls: pendingApprovalToolCalls.map(({ id }) => ({ id, source_event_id: modelMessageEventId })),\n };\n yield event;\n }\n return 'exit';\n }\n\n private buildReplayEvent(c: SubAgentCompletionMarker): InternalThreadDoneEvent {\n const base = {\n type: InternalEventType.AGENT_DONE,\n thread_id: this.threadId,\n title: this.title,\n parent: this.parent,\n send_to_parent: c.send_to_parent,\n };\n return c.type === 'done'\n ? { ...base, status: 'done', output: c.output }\n : { ...base, status: 'error', error: c.error_message ?? 'Sub-agent errored', output: c.output };\n }\n\n public async *execute(options?: {\n signal?: AbortSignal | undefined;\n }): AsyncGenerator<AgentThreadEvent, void, unknown> {\n const signal = options?.signal;\n\n this.throwIfContextBusy();\n this.contextBusy = true;\n this.currentState = null;\n\n // there should always be this top level try-catch block because agent execution cant raise an error. it should yield an error event.\n try {\n if (this.preComputedCompletion) {\n yield this.buildReplayEvent(this.preComputedCompletion);\n return;\n }\n\n if (!this.preSendRanThisTurn) {\n for await (const event of this.executeContextProcessors('preSend')) {\n yield event;\n }\n }\n this.preSendRanThisTurn = false;\n const { initializationInfo, authRequirementInfo } = await this.tracing.withInitSpan(() => this.init());\n\n if (initializationInfo.length > 0) {\n yield buildMCPInitializeEvent(initializationInfo, this.threadId);\n }\n\n if (authRequirementInfo.length > 0) {\n yield buildMCPAuthRequiredEvent(authRequirementInfo, this.threadId);\n return;\n }\n\n const { tools, toolMapping } = this.getConvertedTools();\n\n const iterationLimit = this.definition.iterationLimit ?? DEFAULT_ITERATION_LIMIT;\n // Starts empty; set only after stepLLMCall in this execute(). That is intentional:\n // user-input-required is only reachable here right after an LLM step that produced\n // pending approval/client-side tools (which sets currentModelMessageEventId first).\n // A resumed turn that is still awaiting user input never reaches this loop — orchestrator\n // send() / validateSendInput rejects empty or incomplete batches before execute runs.\n let currentModelMessageEventId = '';\n\n for (;;) {\n for (;;) {\n const sandboxCreatedEvent = this.pendingSandboxCreatedEvents.shift();\n if (sandboxCreatedEvent === undefined) {\n break;\n }\n yield sandboxCreatedEvent;\n }\n\n const state = this.deriveState();\n let outcome: StepOutcome;\n switch (state) {\n case 'llm-call-required': {\n // Cancel only before network/side-effecting steps (LLM call, tool execution), never before 'user-input-required', so the required event is always emitted once the assistant message is committed.\n if (signal?.aborted) {\n return;\n }\n if (this.metrics.iterations >= iterationLimit) {\n yield this.generateErrorEvent(\n `You have reached iteration limit of ${String(iterationLimit)}, please request again`,\n );\n return;\n }\n this.metrics.iterations++;\n\n const llmResult = yield* this.stepLLMCall(tools, toolMapping, signal);\n outcome = llmResult.outcome;\n currentModelMessageEventId = llmResult.modelMessageEventId;\n break;\n }\n case 'tool-response-required': {\n if (signal?.aborted) {\n return;\n }\n outcome = yield* this.stepToolResponse(toolMapping);\n break;\n }\n case 'user-input-required': {\n // Intentionally no cancellation check here — see comment in 'llm-call-required'.\n // source_event_id comes from currentModelMessageEventId; see comment where it is declared.\n outcome = yield* this.stepUserInputRequired(currentModelMessageEventId);\n break;\n }\n default: {\n throw new Error('unreachable');\n }\n }\n if (outcome === 'exit') {\n return;\n }\n }\n } catch (error) {\n // Providers / transports often reject with plain objects; instanceof Error would\n // otherwise collapse those into an opaque \"Unknown error occurred\" in Agent Steps.\n this.logger.error('Agent thread execution failed', extractErrorLogFields(error));\n yield this.generateErrorEvent(describeUnknownError(error));\n } finally {\n this.contextBusy = false;\n }\n }\n}\n\nfunction assertUniqueStateKeys(capabilities: readonly AgentCapability[]): void {\n const seen = new Set<string>();\n for (const capability of capabilities) {\n const key = capability.state?.key;\n if (!key) {\n continue;\n }\n if (seen.has(key)) {\n throw new AgentHarnessError(\n 'capability_state_error',\n `Duplicate capability state key '${key}' — each key may be claimed by at most one capability`,\n );\n }\n seen.add(key);\n }\n}\n\nfunction claimCapabilityState(\n capabilities: readonly AgentCapability[],\n input: CapabilityState | undefined,\n logger: Logger,\n): CapabilityState {\n if (!input) {\n return {};\n }\n const claimedKeys = new Set(capabilities.map(c => c.state?.key).filter((k): k is string => typeof k === 'string'));\n const claimed: CapabilityState = {};\n for (const [key, value] of Object.entries(input)) {\n if (!claimedKeys.has(key)) {\n logger.warn(`Dropping unclaimed capability_state key '${key}' — no capability declares it`);\n continue;\n }\n claimed[key] = value;\n }\n return claimed;\n}\n"],"mappings":"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","names":[]}
@@ -12,6 +12,7 @@ import { toOpenAIChatMessage } from "../llm/toOpenAIChatMessage.mjs";
12
12
  import { estimateTokensForString } from "../llm/usage.mjs";
13
13
  import { convertMCPServersToTools } from "../mcp/convertMCPServers.mjs";
14
14
  import { executeToolCalls } from "../mcp/executeToolCalls.mjs";
15
+ import { describeUnknownError, extractErrorLogFields } from "../util/errorLogFields.mjs";
15
16
  import {
16
17
  InternalEventType
17
18
  } from "./AgentThread.types.mjs";
@@ -54,7 +55,9 @@ function assertValidTransition(from, to) {
54
55
  }
55
56
  function deriveAgentThreadState(context) {
56
57
  const openToolCallIds = getOpenToolCallIds(context);
57
- if (openToolCallIds.size === 0) return "llm-call-required";
58
+ if (openToolCallIds.size === 0) {
59
+ return "llm-call-required";
60
+ }
58
61
  const assistant = lastAssistantInContext(context);
59
62
  const decisions = scanApprovalDecisions(context);
60
63
  const hasPendingApproval = assistant?.tool_calls?.some(
@@ -73,15 +76,23 @@ function getOpenToolCallIds(context) {
73
76
  const openToolCallIds = /* @__PURE__ */ new Set();
74
77
  for (let i = context.length - 1; i >= 0; i--) {
75
78
  const msg = context[i];
76
- if (msg === void 0) continue;
77
- if (!isLLMContextMessage(msg)) continue;
79
+ if (msg === void 0) {
80
+ continue;
81
+ }
82
+ if (!isLLMContextMessage(msg)) {
83
+ continue;
84
+ }
78
85
  if (msg.role === "tool") {
79
86
  resolvedToolCallIds.add(msg.tool_call_id);
80
87
  continue;
81
88
  }
82
89
  if (msg.role === "assistant") {
83
- for (const tc of msg.tool_calls ?? []) openToolCallIds.add(tc.id);
84
- for (const id of resolvedToolCallIds) openToolCallIds.delete(id);
90
+ for (const tc of msg.tool_calls ?? []) {
91
+ openToolCallIds.add(tc.id);
92
+ }
93
+ for (const id of resolvedToolCallIds) {
94
+ openToolCallIds.delete(id);
95
+ }
85
96
  break;
86
97
  }
87
98
  }
@@ -193,7 +204,9 @@ function validateInputMessageTypesGivenContext(context, messages) {
193
204
  const pendingClientSideIds = new Set(getPendingClientSideToolCalls(context).map((tc) => tc.id));
194
205
  for (let i = 0; i < messages.length; i++) {
195
206
  const m = messages[i];
196
- if (m === void 0) continue;
207
+ if (m === void 0) {
208
+ continue;
209
+ }
197
210
  if (isApprovalDecisionMessage(m)) {
198
211
  validateApprovalMessage(m, pendingApprovalIds, i);
199
212
  pendingApprovalIds.delete(m.tool_call_id);
@@ -296,7 +309,9 @@ function isJsonObject(value) {
296
309
  return typeof value === "object" && value !== null && !Array.isArray(value);
297
310
  }
298
311
  function tryParseToolArgs(args) {
299
- if (!args) return {};
312
+ if (!args) {
313
+ return {};
314
+ }
300
315
  try {
301
316
  const parsed = JSON.parse(args);
302
317
  return isJsonObject(parsed) ? parsed : {};
@@ -363,7 +378,9 @@ var AgentThread = class {
363
378
  capabilities.map((c) => c.state?.key).filter((k) => typeof k === "string")
364
379
  );
365
380
  for (const capability of capabilities) {
366
- if (!capability.state) continue;
381
+ if (!capability.state) {
382
+ continue;
383
+ }
367
384
  const value = claimed[capability.state.key];
368
385
  if (value !== void 0) {
369
386
  capability.state.load(value);
@@ -987,14 +1004,18 @@ var AgentThread = class {
987
1004
  for (; ; ) {
988
1005
  for (; ; ) {
989
1006
  const sandboxCreatedEvent = this.pendingSandboxCreatedEvents.shift();
990
- if (sandboxCreatedEvent === void 0) break;
1007
+ if (sandboxCreatedEvent === void 0) {
1008
+ break;
1009
+ }
991
1010
  yield sandboxCreatedEvent;
992
1011
  }
993
1012
  const state = this.deriveState();
994
1013
  let outcome;
995
1014
  switch (state) {
996
1015
  case "llm-call-required": {
997
- if (signal?.aborted) return;
1016
+ if (signal?.aborted) {
1017
+ return;
1018
+ }
998
1019
  if (this.metrics.iterations >= iterationLimit) {
999
1020
  yield this.generateErrorEvent(
1000
1021
  `You have reached iteration limit of ${String(iterationLimit)}, please request again`
@@ -1008,7 +1029,9 @@ var AgentThread = class {
1008
1029
  break;
1009
1030
  }
1010
1031
  case "tool-response-required": {
1011
- if (signal?.aborted) return;
1032
+ if (signal?.aborted) {
1033
+ return;
1034
+ }
1012
1035
  outcome = yield* this.stepToolResponse(toolMapping);
1013
1036
  break;
1014
1037
  }
@@ -1020,10 +1043,13 @@ var AgentThread = class {
1020
1043
  throw new Error("unreachable");
1021
1044
  }
1022
1045
  }
1023
- if (outcome === "exit") return;
1046
+ if (outcome === "exit") {
1047
+ return;
1048
+ }
1024
1049
  }
1025
1050
  } catch (error) {
1026
- yield this.generateErrorEvent(error instanceof Error ? error.message : "Unknown error occurred");
1051
+ this.logger.error("Agent thread execution failed", extractErrorLogFields(error));
1052
+ yield this.generateErrorEvent(describeUnknownError(error));
1027
1053
  } finally {
1028
1054
  this.contextBusy = false;
1029
1055
  }
@@ -1033,7 +1059,9 @@ function assertUniqueStateKeys(capabilities) {
1033
1059
  const seen = /* @__PURE__ */ new Set();
1034
1060
  for (const capability of capabilities) {
1035
1061
  const key = capability.state?.key;
1036
- if (!key) continue;
1062
+ if (!key) {
1063
+ continue;
1064
+ }
1037
1065
  if (seen.has(key)) {
1038
1066
  throw new AgentHarnessError(
1039
1067
  "capability_state_error",
@@ -1044,7 +1072,9 @@ function assertUniqueStateKeys(capabilities) {
1044
1072
  }
1045
1073
  }
1046
1074
  function claimCapabilityState(capabilities, input, logger) {
1047
- if (!input) return {};
1075
+ if (!input) {
1076
+ return {};
1077
+ }
1048
1078
  const claimedKeys = new Set(capabilities.map((c) => c.state?.key).filter((k) => typeof k === "string"));
1049
1079
  const claimed = {};
1050
1080
  for (const [key, value] of Object.entries(input)) {