@illuma-ai/agents 1.1.6 → 1.1.7

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 (136) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +1 -0
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/events.cjs +1 -0
  4. package/dist/cjs/events.cjs.map +1 -1
  5. package/dist/cjs/graphs/Graph.cjs +11 -8
  6. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  7. package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -0
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  9. package/dist/cjs/llm/openai/index.cjs +1 -0
  10. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  11. package/dist/cjs/llm/providers.cjs +1 -0
  12. package/dist/cjs/llm/providers.cjs.map +1 -1
  13. package/dist/cjs/main.cjs +35 -13
  14. package/dist/cjs/main.cjs.map +1 -1
  15. package/dist/cjs/messages/content.cjs +1 -0
  16. package/dist/cjs/messages/content.cjs.map +1 -1
  17. package/dist/cjs/messages/core.cjs +1 -0
  18. package/dist/cjs/messages/core.cjs.map +1 -1
  19. package/dist/cjs/messages/dedup.cjs +1 -0
  20. package/dist/cjs/messages/dedup.cjs.map +1 -1
  21. package/dist/cjs/messages/format.cjs +1 -0
  22. package/dist/cjs/messages/format.cjs.map +1 -1
  23. package/dist/cjs/messages/prune.cjs +1 -0
  24. package/dist/cjs/messages/prune.cjs.map +1 -1
  25. package/dist/cjs/messages/tools.cjs +1 -0
  26. package/dist/cjs/messages/tools.cjs.map +1 -1
  27. package/dist/cjs/run.cjs +1 -0
  28. package/dist/cjs/run.cjs.map +1 -1
  29. package/dist/cjs/schemas/validate.cjs +1 -0
  30. package/dist/cjs/schemas/validate.cjs.map +1 -1
  31. package/dist/cjs/splitStream.cjs +1 -0
  32. package/dist/cjs/splitStream.cjs.map +1 -1
  33. package/dist/cjs/stream.cjs +1 -0
  34. package/dist/cjs/stream.cjs.map +1 -1
  35. package/dist/cjs/tools/AskUser.cjs +1 -0
  36. package/dist/cjs/tools/AskUser.cjs.map +1 -1
  37. package/dist/cjs/tools/CodeExecutor.cjs +1 -0
  38. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  39. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +1 -0
  40. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  41. package/dist/cjs/tools/ToolNode.cjs +12 -8
  42. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  43. package/dist/cjs/tools/ToolSearch.cjs +1 -0
  44. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  45. package/dist/cjs/tools/approval/constants.cjs +107 -0
  46. package/dist/cjs/tools/approval/constants.cjs.map +1 -0
  47. package/dist/cjs/tools/handlers.cjs +1 -0
  48. package/dist/cjs/tools/handlers.cjs.map +1 -1
  49. package/dist/cjs/tools/search/tool.cjs +1 -0
  50. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  51. package/dist/cjs/utils/fileManifest.cjs.map +1 -1
  52. package/dist/cjs/utils/handlers.cjs +1 -0
  53. package/dist/cjs/utils/handlers.cjs.map +1 -1
  54. package/dist/cjs/utils/llm.cjs +1 -0
  55. package/dist/cjs/utils/llm.cjs.map +1 -1
  56. package/dist/cjs/utils/title.cjs +1 -0
  57. package/dist/cjs/utils/title.cjs.map +1 -1
  58. package/dist/cjs/utils/toolCallContinuation.cjs +1 -0
  59. package/dist/cjs/utils/toolCallContinuation.cjs.map +1 -1
  60. package/dist/cjs/utils/toolDiscoveryCache.cjs +1 -0
  61. package/dist/cjs/utils/toolDiscoveryCache.cjs.map +1 -1
  62. package/dist/esm/agents/AgentContext.mjs +1 -0
  63. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  64. package/dist/esm/events.mjs +1 -0
  65. package/dist/esm/events.mjs.map +1 -1
  66. package/dist/esm/graphs/Graph.mjs +11 -8
  67. package/dist/esm/graphs/Graph.mjs.map +1 -1
  68. package/dist/esm/graphs/MultiAgentGraph.mjs +1 -0
  69. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  70. package/dist/esm/llm/openai/index.mjs +1 -0
  71. package/dist/esm/llm/openai/index.mjs.map +1 -1
  72. package/dist/esm/llm/providers.mjs +1 -0
  73. package/dist/esm/llm/providers.mjs.map +1 -1
  74. package/dist/esm/main.mjs +1 -0
  75. package/dist/esm/main.mjs.map +1 -1
  76. package/dist/esm/messages/content.mjs +1 -0
  77. package/dist/esm/messages/content.mjs.map +1 -1
  78. package/dist/esm/messages/core.mjs +1 -0
  79. package/dist/esm/messages/core.mjs.map +1 -1
  80. package/dist/esm/messages/dedup.mjs +1 -0
  81. package/dist/esm/messages/dedup.mjs.map +1 -1
  82. package/dist/esm/messages/format.mjs +1 -0
  83. package/dist/esm/messages/format.mjs.map +1 -1
  84. package/dist/esm/messages/prune.mjs +1 -0
  85. package/dist/esm/messages/prune.mjs.map +1 -1
  86. package/dist/esm/messages/tools.mjs +1 -0
  87. package/dist/esm/messages/tools.mjs.map +1 -1
  88. package/dist/esm/run.mjs +1 -0
  89. package/dist/esm/run.mjs.map +1 -1
  90. package/dist/esm/schemas/validate.mjs +1 -0
  91. package/dist/esm/schemas/validate.mjs.map +1 -1
  92. package/dist/esm/splitStream.mjs +1 -0
  93. package/dist/esm/splitStream.mjs.map +1 -1
  94. package/dist/esm/stream.mjs +1 -0
  95. package/dist/esm/stream.mjs.map +1 -1
  96. package/dist/esm/tools/AskUser.mjs +1 -0
  97. package/dist/esm/tools/AskUser.mjs.map +1 -1
  98. package/dist/esm/tools/CodeExecutor.mjs +1 -0
  99. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  100. package/dist/esm/tools/ProgrammaticToolCalling.mjs +1 -0
  101. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  102. package/dist/esm/tools/ToolNode.mjs +12 -8
  103. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  104. package/dist/esm/tools/ToolSearch.mjs +1 -0
  105. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  106. package/dist/esm/tools/approval/constants.mjs +105 -0
  107. package/dist/esm/tools/approval/constants.mjs.map +1 -0
  108. package/dist/esm/tools/handlers.mjs +1 -0
  109. package/dist/esm/tools/handlers.mjs.map +1 -1
  110. package/dist/esm/tools/search/tool.mjs +1 -0
  111. package/dist/esm/tools/search/tool.mjs.map +1 -1
  112. package/dist/esm/utils/fileManifest.mjs.map +1 -1
  113. package/dist/esm/utils/handlers.mjs +1 -0
  114. package/dist/esm/utils/handlers.mjs.map +1 -1
  115. package/dist/esm/utils/llm.mjs +1 -0
  116. package/dist/esm/utils/llm.mjs.map +1 -1
  117. package/dist/esm/utils/title.mjs +1 -0
  118. package/dist/esm/utils/title.mjs.map +1 -1
  119. package/dist/esm/utils/toolCallContinuation.mjs +1 -0
  120. package/dist/esm/utils/toolCallContinuation.mjs.map +1 -1
  121. package/dist/esm/utils/toolDiscoveryCache.mjs +1 -0
  122. package/dist/esm/utils/toolDiscoveryCache.mjs.map +1 -1
  123. package/dist/types/common/index.d.ts +1 -0
  124. package/dist/types/tools/approval/constants.d.ts +79 -0
  125. package/dist/types/types/tools.d.ts +4 -1
  126. package/package.json +1 -1
  127. package/src/common/index.ts +1 -0
  128. package/src/graphs/Graph.ts +42 -27
  129. package/src/graphs/gapFeatures.test.ts +65 -22
  130. package/src/tools/ToolNode.ts +11 -12
  131. package/src/tools/__tests__/ToolApproval.test.ts +100 -46
  132. package/src/tools/__tests__/ToolNode.hitl.test.ts +3 -2
  133. package/src/tools/approval/__tests__/constants.test.ts +74 -0
  134. package/src/tools/approval/constants.ts +109 -0
  135. package/src/types/tools.ts +5 -1
  136. package/src/utils/fileManifest.ts +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"stream.cjs","sources":["../../src/stream.ts"],"sourcesContent":["// src/stream.ts\nimport type { ChatOpenAIReasoningSummary } from '@langchain/openai';\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { StandardGraph } from '@/graphs';\nimport type * as t from '@/types';\nimport {\n ToolCallTypes,\n ContentTypes,\n GraphEvents,\n StepTypes,\n Providers,\n} from '@/common';\nimport {\n handleServerToolResult,\n handleToolCallChunks,\n handleToolCalls,\n} from '@/tools/handlers';\nimport { getMessageId } from '@/messages';\n\n/**\n * Parses content to extract thinking sections enclosed in <think> tags using string operations\n * @param content The content to parse\n * @returns An object with separated text and thinking content\n */\nfunction parseThinkingContent(content: string): {\n text: string;\n thinking: string;\n} {\n // If no think tags, return the original content as text\n if (!content.includes('<think>')) {\n return { text: content, thinking: '' };\n }\n\n let textResult = '';\n const thinkingResult: string[] = [];\n let position = 0;\n\n while (position < content.length) {\n const thinkStart = content.indexOf('<think>', position);\n\n if (thinkStart === -1) {\n // No more think tags, add the rest and break\n textResult += content.slice(position);\n break;\n }\n\n // Add text before the think tag\n textResult += content.slice(position, thinkStart);\n\n const thinkEnd = content.indexOf('</think>', thinkStart);\n if (thinkEnd === -1) {\n // Malformed input, no closing tag\n textResult += content.slice(thinkStart);\n break;\n }\n\n // Add the thinking content\n const thinkContent = content.slice(thinkStart + 7, thinkEnd);\n thinkingResult.push(thinkContent);\n\n // Move position to after the think tag\n position = thinkEnd + 8; // 8 is the length of '</think>'\n }\n\n return {\n text: textResult.trim(),\n thinking: thinkingResult.join('\\n').trim(),\n };\n}\n\nfunction getNonEmptyValue(possibleValues: string[]): string | undefined {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nexport function getChunkContent({\n chunk,\n provider,\n reasoningKey,\n}: {\n chunk?: Partial<AIMessageChunk>;\n provider?: Providers;\n reasoningKey: 'reasoning_content' | 'reasoning';\n}): string | t.MessageContentComplex[] | undefined {\n if (\n (provider === Providers.OPENAI || provider === Providers.AZURE) &&\n (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text != null &&\n ((\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text?.length ?? 0) > 0\n ) {\n return (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text;\n }\n /**\n * For OpenRouter, reasoning is stored in additional_kwargs.reasoning (not reasoning_content).\n * NOTE: We intentionally do NOT extract text from reasoning_details here.\n * The reasoning_details array contains the FULL accumulated reasoning text (set only on final chunk),\n * but individual reasoning tokens are already streamed via additional_kwargs.reasoning.\n * Extracting from reasoning_details would cause duplication.\n * The reasoning_details is only used for:\n * 1. Detecting reasoning mode in handleReasoning()\n * 2. Final message storage (for thought signatures)\n */\n if (provider === Providers.OPENROUTER) {\n // Content presence signals end of reasoning phase - prefer content over reasoning\n // This handles transitional chunks that may have both reasoning and content\n if (typeof chunk?.content === 'string' && chunk.content !== '') {\n return chunk.content;\n }\n const reasoning = chunk?.additional_kwargs?.reasoning as string | undefined;\n if (reasoning != null && reasoning !== '') {\n return reasoning;\n }\n return chunk?.content;\n }\n return (\n ((chunk?.additional_kwargs?.[reasoningKey] as string | undefined) ?? '') ||\n chunk?.content\n );\n}\n\nexport class ChatModelStreamHandler implements t.EventHandler {\n async handle(\n event: string,\n data: t.StreamEventData,\n metadata?: Record<string, unknown>,\n graph?: StandardGraph\n ): Promise<void> {\n if (!graph) {\n throw new Error('Graph not found');\n }\n if (!graph.config) {\n throw new Error('Config not found in graph');\n }\n if (!data.chunk) {\n console.warn(`No chunk found in ${event} event`);\n return;\n }\n\n const agentContext = graph.getAgentContext(metadata);\n\n const chunk = data.chunk as Partial<AIMessageChunk>;\n const content = getChunkContent({\n chunk,\n reasoningKey: agentContext.reasoningKey,\n provider: agentContext.provider,\n });\n const skipHandling = await handleServerToolResult({\n graph,\n content,\n metadata,\n agentContext,\n });\n if (skipHandling) {\n return;\n }\n this.handleReasoning(chunk, agentContext);\n let hasToolCalls = false;\n\n if (\n chunk.tool_calls &&\n chunk.tool_calls.length > 0 &&\n chunk.tool_calls.every(\n (tc) =>\n tc.id != null &&\n tc.id !== '' &&\n (tc as Partial<ToolCall>).name != null &&\n tc.name !== ''\n )\n ) {\n hasToolCalls = true;\n await handleToolCalls(chunk.tool_calls, metadata, graph);\n }\n\n const hasToolCallChunks =\n (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;\n const isEmptyContent =\n typeof content === 'undefined' ||\n !content.length ||\n (typeof content === 'string' && !content);\n\n /** Set a preliminary message ID if found in empty chunk */\n const isEmptyChunk = isEmptyContent && !hasToolCallChunks;\n if (\n isEmptyChunk &&\n (chunk.id ?? '') !== '' &&\n !graph.prelimMessageIdsByStepKey.has(chunk.id ?? '')\n ) {\n const stepKey = graph.getStepKey(metadata);\n graph.prelimMessageIdsByStepKey.set(stepKey, chunk.id ?? '');\n } else if (isEmptyChunk) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n\n if (\n hasToolCallChunks &&\n chunk.tool_call_chunks &&\n chunk.tool_call_chunks.length &&\n typeof chunk.tool_call_chunks[0]?.index === 'number'\n ) {\n await handleToolCallChunks({\n graph,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n metadata,\n });\n }\n\n if (isEmptyContent) {\n return;\n }\n\n const message_id = getMessageId(stepKey, graph) ?? '';\n if (message_id) {\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n }\n\n const stepId = graph.getStepIdByKey(stepKey);\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n console.warn(`\\n\n==============================================================\n\n\nRun step for ${stepId} does not exist, cannot dispatch delta event.\n\nevent: ${event}\nstepId: ${stepId}\nstepKey: ${stepKey}\nmessage_id: ${message_id}\nhasToolCalls: ${hasToolCalls}\nhasToolCallChunks: ${hasToolCallChunks}\n\n==============================================================\n\\n`);\n return;\n }\n\n /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */\n if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {\n return;\n } else if (\n hasToolCallChunks &&\n (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)\n ) {\n return;\n } else if (typeof content === 'string') {\n if (agentContext.currentTokenType === ContentTypes.TEXT) {\n await graph.dispatchMessageDelta(stepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: content,\n },\n ],\n });\n } else if (agentContext.currentTokenType === 'think_and_text') {\n const { text, thinking } = parseThinkingContent(content);\n if (thinking) {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: thinking,\n },\n ],\n });\n }\n if (text) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n const newStepKey = graph.getStepKey(metadata);\n const message_id = getMessageId(newStepKey, graph) ?? '';\n await graph.dispatchRunStep(\n newStepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n\n const newStepId = graph.getStepIdByKey(newStepKey);\n await graph.dispatchMessageDelta(newStepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: text,\n },\n ],\n });\n }\n } else {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: content,\n },\n ],\n });\n }\n } else if (\n content.every((c) => c.type?.startsWith(ContentTypes.TEXT) ?? false)\n ) {\n await graph.dispatchMessageDelta(stepId, {\n content,\n });\n } else if (\n content.every(\n (c) =>\n (c.type?.startsWith(ContentTypes.THINKING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false) ||\n c.type === 'redacted_thinking'\n )\n ) {\n await graph.dispatchReasoningDelta(stepId, {\n content: content.map((c) => ({\n type: ContentTypes.THINK,\n think:\n (c as t.ThinkingContentText).thinking ??\n (c as Partial<t.GoogleReasoningContentText>).reasoning ??\n (c as Partial<t.BedrockReasoningContentText>).reasoningText?.text ??\n '',\n })),\n });\n }\n }\n handleReasoning(\n chunk: Partial<AIMessageChunk>,\n agentContext: AgentContext\n ): void {\n let reasoning_content = chunk.additional_kwargs?.[\n agentContext.reasoningKey\n ] as string | Partial<ChatOpenAIReasoningSummary> | undefined;\n if (\n Array.isArray(chunk.content) &&\n (chunk.content[0]?.type === ContentTypes.THINKING ||\n chunk.content[0]?.type === ContentTypes.REASONING ||\n chunk.content[0]?.type === ContentTypes.REASONING_CONTENT ||\n chunk.content[0]?.type === 'redacted_thinking')\n ) {\n reasoning_content = 'valid';\n } else if (\n (agentContext.provider === Providers.OPENAI ||\n agentContext.provider === Providers.AZURE) &&\n reasoning_content != null &&\n typeof reasoning_content !== 'string' &&\n reasoning_content.summary?.[0]?.text != null &&\n reasoning_content.summary[0].text\n ) {\n reasoning_content = 'valid';\n } else if (\n agentContext.provider === Providers.OPENROUTER &&\n // Only set reasoning as valid if content is NOT present (content signals end of reasoning)\n (chunk.content == null || chunk.content === '') &&\n // Check for reasoning_details (final chunk) OR reasoning string (intermediate chunks)\n ((chunk.additional_kwargs?.reasoning_details != null &&\n Array.isArray(chunk.additional_kwargs.reasoning_details) &&\n chunk.additional_kwargs.reasoning_details.length > 0) ||\n (typeof chunk.additional_kwargs?.reasoning === 'string' &&\n chunk.additional_kwargs.reasoning !== ''))\n ) {\n reasoning_content = 'valid';\n }\n if (\n reasoning_content != null &&\n reasoning_content !== '' &&\n (chunk.content == null ||\n chunk.content === '' ||\n reasoning_content === 'valid')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'reasoning';\n return;\n } else if (\n agentContext.tokenTypeSwitch === 'reasoning' &&\n agentContext.currentTokenType !== ContentTypes.TEXT &&\n ((chunk.content != null && chunk.content !== '') ||\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0)\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n agentContext.reasoningTransitionCount++;\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>') &&\n chunk.content.includes('</think>')\n ) {\n agentContext.currentTokenType = 'think_and_text';\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n agentContext.lastToken != null &&\n agentContext.lastToken.includes('</think>')\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n }\n if (typeof chunk.content !== 'string') {\n return;\n }\n agentContext.lastToken = chunk.content;\n }\n}\n\nexport function createContentAggregator(): t.ContentAggregatorResult {\n const contentParts: Array<t.MessageContentComplex | undefined> = [];\n const stepMap = new Map<string, t.RunStep>();\n const toolCallIdMap = new Map<string, string>();\n // Track step IDs for structured output tool calls that should be skipped\n const skippedStructuredOutputSteps = new Set<string>();\n // Track agentId and groupId for each content index (applied to content parts)\n const contentMetaMap = new Map<\n number,\n { agentId?: string; groupId?: number }\n >();\n\n const updateContent = (\n index: number,\n contentPart?: t.MessageContentComplex,\n finalUpdate = false\n ): void => {\n if (!contentPart) {\n console.warn(\"No content part found in 'updateContent'\");\n return;\n }\n const partType = contentPart.type ?? '';\n if (!partType) {\n console.warn('No content type found in content part');\n return;\n }\n\n if (!contentParts[index] && partType !== ContentTypes.TOOL_CALL) {\n contentParts[index] = { type: partType };\n }\n\n if (!partType.startsWith(contentParts[index]?.type ?? '')) {\n console.warn('Content type mismatch');\n return;\n }\n\n if (\n partType.startsWith(ContentTypes.TEXT) &&\n ContentTypes.TEXT in contentPart &&\n typeof contentPart.text === 'string'\n ) {\n // TODO: update this!!\n const currentContent = contentParts[index] as t.MessageDeltaUpdate;\n const update: t.MessageDeltaUpdate = {\n type: ContentTypes.TEXT,\n text: (currentContent.text || '') + contentPart.text,\n };\n\n if (contentPart.tool_call_ids) {\n update.tool_call_ids = contentPart.tool_call_ids;\n }\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.THINK) &&\n ContentTypes.THINK in contentPart &&\n typeof contentPart.think === 'string'\n ) {\n const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;\n const update: t.ReasoningDeltaUpdate = {\n type: ContentTypes.THINK,\n think: (currentContent.think || '') + contentPart.think,\n };\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.AGENT_UPDATE) &&\n ContentTypes.AGENT_UPDATE in contentPart &&\n contentPart.agent_update != null\n ) {\n const update: t.AgentUpdate = {\n type: ContentTypes.AGENT_UPDATE,\n agent_update: contentPart.agent_update,\n };\n\n contentParts[index] = update;\n } else if (\n partType === ContentTypes.IMAGE_URL &&\n 'image_url' in contentPart\n ) {\n const currentContent = contentParts[index] as {\n type: 'image_url';\n image_url: string;\n };\n contentParts[index] = {\n ...currentContent,\n };\n } else if (\n partType === ContentTypes.TOOL_CALL &&\n 'tool_call' in contentPart\n ) {\n const incomingName = contentPart.tool_call.name;\n const incomingId = contentPart.tool_call.id;\n const toolCallArgs = (contentPart.tool_call as t.ToolCallPart).args;\n\n // When we receive a tool call with a name, it's the complete tool call\n // Consolidate with any previously accumulated args from chunks\n const hasValidName = incomingName != null && incomingName !== '';\n\n const existingContent = contentParts[index] as\n | (Omit<t.ToolCallContent, 'tool_call'> & {\n tool_call?: t.ToolCallPart;\n })\n | undefined;\n\n // Allow processing if:\n // 1. Incoming has a valid name (initial tool call setup), OR\n // 2. It's a final update (ON_RUN_STEP_COMPLETED), OR\n // 3. Existing content already has a name (delta streaming — grows args progressively)\n const existingHasName =\n existingContent?.tool_call?.name != null &&\n existingContent.tool_call.name !== '';\n if (!hasValidName && !finalUpdate && !existingHasName) {\n return;\n }\n\n /** Concatenate string args for progressive streaming; replace when object (complete).\n * When incoming delta has a valid name, treat as a complete replacement —\n * this handles the Bedrock case where handleToolCalls sends complete args\n * as a delta to an existing step that already has partial args from chunks. */\n const existingArgs = existingContent?.tool_call?.args;\n const existingIsEmptyObj =\n typeof existingArgs === 'object' &&\n Object.keys(existingArgs as Record<string, unknown>).length === 0;\n const existingIsString =\n typeof existingArgs === 'string' || existingIsEmptyObj;\n let args =\n finalUpdate ||\n hasValidName ||\n (!existingIsString && typeof existingArgs === 'object') ||\n typeof toolCallArgs === 'object'\n ? contentPart.tool_call.args\n : ((existingIsEmptyObj ? '' : existingArgs) ?? '') +\n (toolCallArgs ?? '');\n if (\n finalUpdate &&\n args == null &&\n existingContent?.tool_call?.args != null\n ) {\n args = existingContent.tool_call.args;\n }\n\n const id =\n getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? '';\n const name =\n getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ??\n '';\n\n const newToolCall: ToolCall & t.PartMetadata = {\n id,\n name,\n args,\n type: ToolCallTypes.TOOL_CALL,\n };\n\n if (finalUpdate) {\n newToolCall.progress = 1;\n newToolCall.output = contentPart.tool_call.output;\n }\n\n contentParts[index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: newToolCall,\n };\n }\n\n // Apply agentId (for MultiAgentGraph) and groupId (for parallel execution) to content parts\n // - agentId present → MultiAgentGraph (show agent labels)\n // - groupId present → parallel execution (render columns)\n const meta = contentMetaMap.get(index);\n if (meta?.agentId != null) {\n (contentParts[index] as t.MessageContentComplex).agentId = meta.agentId;\n }\n if (meta?.groupId != null) {\n (contentParts[index] as t.MessageContentComplex).groupId = meta.groupId;\n }\n };\n\n const aggregateContent = ({\n event,\n data,\n }: {\n event: GraphEvents;\n data:\n | t.RunStep\n | t.AgentUpdate\n | t.MessageDeltaEvent\n | t.RunStepDeltaEvent\n | { result: t.ToolEndEvent }\n | {\n structuredResponse: Record<string, unknown>;\n schema: Record<string, unknown>;\n };\n }): void => {\n // Handle structured output - add the JSON response as a text content part\n if (event === GraphEvents.ON_STRUCTURED_OUTPUT) {\n const structuredData = data as {\n structuredResponse: Record<string, unknown>;\n schema: Record<string, unknown>;\n };\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TEXT,\n text: JSON.stringify(structuredData.structuredResponse, null, 2),\n };\n // Use the next available index\n const nextIndex = contentParts.length;\n updateContent(nextIndex, contentPart);\n return;\n }\n\n if (event === GraphEvents.ON_RUN_STEP) {\n const runStep = data as t.RunStep;\n stepMap.set(runStep.id, runStep);\n\n // Track agentId (MultiAgentGraph) and groupId (parallel execution) separately\n // - agentId: present for all MultiAgentGraph runs (enables agent labels in UI)\n // - groupId: present only for parallel execution (enables column rendering)\n const hasAgentId = runStep.agentId != null && runStep.agentId !== '';\n const hasGroupId = runStep.groupId != null;\n if (hasAgentId || hasGroupId) {\n const existingMeta = contentMetaMap.get(runStep.index) ?? {};\n if (hasAgentId) {\n existingMeta.agentId = runStep.agentId;\n }\n if (hasGroupId) {\n existingMeta.groupId = runStep.groupId;\n }\n contentMetaMap.set(runStep.index, existingMeta);\n }\n\n // Store tool call IDs if present\n if (\n runStep.stepDetails.type === StepTypes.TOOL_CALLS &&\n runStep.stepDetails.tool_calls\n ) {\n // Check if ALL tool calls are structured output tool calls\n const toolCalls = runStep.stepDetails.tool_calls as ToolCall[];\n const allAreStructuredOutput =\n toolCalls.length > 0 &&\n toolCalls.every((toolCall) => {\n const toolName = toolCall.name.toLowerCase();\n return (\n toolName === 'response' ||\n toolName === 'structuredresponse' ||\n toolName === 'structured_response'\n );\n });\n\n // If all tool calls are structured output, skip this entire step\n if (allAreStructuredOutput) {\n skippedStructuredOutputSteps.add(runStep.id);\n return;\n }\n\n // When tool_calls is empty (Bedrock sends name/args only at model end),\n // initialize a placeholder so contentParts[index] is not null.\n // ON_RUN_STEP_COMPLETED or ON_RUN_STEP_DELTA will fill in the real data.\n if (toolCalls.length === 0) {\n contentParts[runStep.index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: '',\n name: '',\n id: '',\n type: ToolCallTypes.TOOL_CALL,\n },\n };\n }\n\n toolCalls.forEach((toolCall) => {\n // Skip structured output tool calls - these are synthetic tool calls\n // used by withStructuredOutput() to extract JSON, not real tools\n const toolName = toolCall.name.toLowerCase();\n if (\n toolName === 'response' ||\n toolName === 'structuredresponse' ||\n toolName === 'structured_response'\n ) {\n return;\n }\n\n const toolCallId = toolCall.id ?? '';\n if ('id' in toolCall && toolCallId) {\n toolCallIdMap.set(runStep.id, toolCallId);\n }\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCall.args,\n name: toolCall.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_MESSAGE_DELTA) {\n const messageDelta = data as t.MessageDeltaEvent;\n const runStep = stepMap.get(messageDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for message delta event');\n return;\n }\n\n if (messageDelta.delta.content) {\n const contentPart = Array.isArray(messageDelta.delta.content)\n ? messageDelta.delta.content[0]\n : messageDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (\n event === GraphEvents.ON_AGENT_UPDATE &&\n (data as t.AgentUpdate | undefined)?.agent_update\n ) {\n const contentPart = data as t.AgentUpdate | undefined;\n if (!contentPart) {\n return;\n }\n updateContent(contentPart.agent_update.index, contentPart);\n } else if (event === GraphEvents.ON_REASONING_DELTA) {\n const reasoningDelta = data as t.ReasoningDeltaEvent;\n const runStep = stepMap.get(reasoningDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for reasoning delta event');\n return;\n }\n\n if (reasoningDelta.delta.content) {\n const contentPart = Array.isArray(reasoningDelta.delta.content)\n ? reasoningDelta.delta.content[0]\n : reasoningDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {\n const runStepDelta = data as t.RunStepDeltaEvent;\n\n // Skip deltas for structured output tool calls\n if (skippedStructuredOutputSteps.has(runStepDelta.id)) {\n return;\n }\n\n const runStep = stepMap.get(runStepDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for run step delta event');\n return;\n }\n\n if (\n runStepDelta.delta.type === StepTypes.TOOL_CALLS &&\n runStepDelta.delta.tool_calls\n ) {\n runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {\n /** Use toolCallIdMap first; fall back to the delta's own id\n * (Bedrock sends complete tool call data as a delta via handleToolCalls,\n * which includes the id, but the map was never populated because\n * the initial on_run_step had tool_calls: []) */\n const toolCallId =\n toolCallIdMap.get(runStepDelta.id) ??\n (toolCallDelta.id != null && toolCallDelta.id !== ''\n ? toolCallDelta.id\n : undefined);\n\n // Store the mapping for future lookups (e.g. on_run_step_completed)\n if (\n toolCallId != null &&\n toolCallId !== '' &&\n !toolCallIdMap.has(runStepDelta.id)\n ) {\n toolCallIdMap.set(runStepDelta.id, toolCallId);\n }\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCallDelta.args ?? '',\n name: toolCallDelta.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {\n const { result } = data as unknown as { result: t.ToolEndEvent };\n\n const { id: stepId } = result;\n\n // Skip completion events for structured output tool calls\n if (skippedStructuredOutputSteps.has(stepId)) {\n return;\n }\n\n const runStep = stepMap.get(stepId);\n if (!runStep) {\n console.warn(\n 'No run step or runId found for completed tool call event'\n );\n return;\n }\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: result.tool_call,\n };\n\n updateContent(runStep.index, contentPart, true);\n }\n };\n\n return { contentParts, aggregateContent, stepMap };\n}\n"],"names":["Providers","handleServerToolResult","handleToolCalls","handleToolCallChunks","getMessageId","StepTypes","ContentTypes","ToolCallTypes","GraphEvents"],"mappings":";;;;;;;;;AAqBA;;;;AAIG;AACH,SAAS,oBAAoB,CAAC,OAAe,EAAA;;IAK3C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;QAChC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;IACxC;IAEA,IAAI,UAAU,GAAG,EAAE;IACnB,MAAM,cAAc,GAAa,EAAE;IACnC,IAAI,QAAQ,GAAG,CAAC;AAEhB,IAAA,OAAO,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE;QAChC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC;AAEvD,QAAA,IAAI,UAAU,KAAK,EAAE,EAAE;;AAErB,YAAA,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;YACrC;QACF;;QAGA,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC;QAEjD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;AACxD,QAAA,IAAI,QAAQ,KAAK,EAAE,EAAE;;AAEnB,YAAA,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;YACvC;QACF;;AAGA,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,QAAQ,CAAC;AAC5D,QAAA,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;;AAGjC,QAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC1B;IAEA,OAAO;AACL,QAAA,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE;QACvB,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;KAC3C;AACH;AAEA,SAAS,gBAAgB,CAAC,cAAwB,EAAA;AAChD,IAAA,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE;QAClC,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAChC,YAAA,OAAO,KAAK;QACd;IACF;AACA,IAAA,OAAO,SAAS;AAClB;AAEM,SAAU,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,YAAY,GAKb,EAAA;AACC,IAAA,IACE,CAAC,QAAQ,KAAKA,eAAS,CAAC,MAAM,IAAI,QAAQ,KAAKA,eAAS,CAAC,KAAK;AAE5D,QAAA,KAAK,EAAE,iBAAiB,EAAE,SAG3B,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI;QAC7B,CACE,KAAK,EAAE,iBAAiB,EAAE,SAG3B,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,EACvC;AACA,QAAA,OACE,KAAK,EAAE,iBAAiB,EAAE,SAG3B,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,IAAI;IACvB;AACA;;;;;;;;;AASG;AACH,IAAA,IAAI,QAAQ,KAAKA,eAAS,CAAC,UAAU,EAAE;;;AAGrC,QAAA,IAAI,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE,EAAE;YAC9D,OAAO,KAAK,CAAC,OAAO;QACtB;AACA,QAAA,MAAM,SAAS,GAAG,KAAK,EAAE,iBAAiB,EAAE,SAA+B;QAC3E,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,KAAK,EAAE,EAAE;AACzC,YAAA,OAAO,SAAS;QAClB;QACA,OAAO,KAAK,EAAE,OAAO;IACvB;IACA,QACE,CAAE,KAAK,EAAE,iBAAiB,GAAG,YAAY,CAAwB,IAAI,EAAE;QACvE,KAAK,EAAE,OAAO;AAElB;MAEa,sBAAsB,CAAA;IACjC,MAAM,MAAM,CACV,KAAa,EACb,IAAuB,EACvB,QAAkC,EAClC,KAAqB,EAAA;QAErB,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC;QACpC;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACjB,YAAA,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC;QAC9C;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAA,MAAA,CAAQ,CAAC;YAChD;QACF;QAEA,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC;AAEpD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAgC;QACnD,MAAM,OAAO,GAAG,eAAe,CAAC;YAC9B,KAAK;YACL,YAAY,EAAE,YAAY,CAAC,YAAY;YACvC,QAAQ,EAAE,YAAY,CAAC,QAAQ;AAChC,SAAA,CAAC;AACF,QAAA,MAAM,YAAY,GAAG,MAAMC,+BAAsB,CAAC;YAChD,KAAK;YACL,OAAO;YACP,QAAQ;YACR,YAAY;AACb,SAAA,CAAC;QACF,IAAI,YAAY,EAAE;YAChB;QACF;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC;QACzC,IAAI,YAAY,GAAG,KAAK;QAExB,IACE,KAAK,CAAC,UAAU;AAChB,YAAA,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;AAC3B,YAAA,KAAK,CAAC,UAAU,CAAC,KAAK,CACpB,CAAC,EAAE,KACD,EAAE,CAAC,EAAE,IAAI,IAAI;gBACb,EAAE,CAAC,EAAE,KAAK,EAAE;gBACX,EAAwB,CAAC,IAAI,IAAI,IAAI;AACtC,gBAAA,EAAE,CAAC,IAAI,KAAK,EAAE,CACjB,EACD;YACA,YAAY,GAAG,IAAI;YACnB,MAAMC,wBAAe,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC;QAC1D;AAEA,QAAA,MAAM,iBAAiB,GACrB,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,KAAK,KAAK;AACxE,QAAA,MAAM,cAAc,GAClB,OAAO,OAAO,KAAK,WAAW;YAC9B,CAAC,OAAO,CAAC,MAAM;aACd,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC;;AAG3C,QAAA,MAAM,YAAY,GAAG,cAAc,IAAI,CAAC,iBAAiB;AACzD,QAAA,IACE,YAAY;AACZ,YAAA,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;AACvB,YAAA,CAAC,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EACpD;YACA,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;AAC1C,YAAA,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QAC9D;aAAO,IAAI,YAAY,EAAE;YACvB;QACF;QAEA,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;AAE1C,QAAA,IACE,iBAAiB;AACjB,YAAA,KAAK,CAAC,gBAAgB;YACtB,KAAK,CAAC,gBAAgB,CAAC,MAAM;YAC7B,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,QAAQ,EACpD;AACA,YAAA,MAAMC,6BAAoB,CAAC;gBACzB,KAAK;gBACL,OAAO;gBACP,cAAc,EAAE,KAAK,CAAC,gBAAgB;gBACtC,QAAQ;AACT,aAAA,CAAC;QACJ;QAEA,IAAI,cAAc,EAAE;YAClB;QACF;QAEA,MAAM,UAAU,GAAGC,gBAAY,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE;QACrD,IAAI,UAAU,EAAE;AACd,YAAA,MAAM,KAAK,CAAC,eAAe,CACzB,OAAO,EACP;gBACE,IAAI,EAAEC,eAAS,CAAC,gBAAgB;AAChC,gBAAA,gBAAgB,EAAE;oBAChB,UAAU;AACX,iBAAA;aACF,EACD,QAAQ,CACT;QACH;QAEA,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC;QAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,CAAC,IAAI,CAAC,CAAA;;;;eAIJ,MAAM,CAAA;;SAEZ,KAAK;UACJ,MAAM;WACL,OAAO;cACJ,UAAU;gBACR,YAAY;qBACP,iBAAiB;;;AAGnC,EAAA,CAAA,CAAC;YACE;QACF;;AAGA,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAKA,eAAS,CAAC,UAAU,EAAE;YACxE;QACF;AAAO,aAAA,IACL,iBAAiB;aAChB,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,KAAK,CAAC,EACpE;YACA;QACF;AAAO,aAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YACtC,IAAI,YAAY,CAAC,gBAAgB,KAAKC,kBAAY,CAAC,IAAI,EAAE;AACvD,gBAAA,MAAM,KAAK,CAAC,oBAAoB,CAAC,MAAM,EAAE;AACvC,oBAAA,OAAO,EAAE;AACP,wBAAA;4BACE,IAAI,EAAEA,kBAAY,CAAC,IAAI;AACvB,4BAAA,IAAI,EAAE,OAAO;AACd,yBAAA;AACF,qBAAA;AACF,iBAAA,CAAC;YACJ;AAAO,iBAAA,IAAI,YAAY,CAAC,gBAAgB,KAAK,gBAAgB,EAAE;gBAC7D,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC;gBACxD,IAAI,QAAQ,EAAE;AACZ,oBAAA,MAAM,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE;AACzC,wBAAA,OAAO,EAAE;AACP,4BAAA;gCACE,IAAI,EAAEA,kBAAY,CAAC,KAAK;AACxB,gCAAA,KAAK,EAAE,QAAQ;AAChB,6BAAA;AACF,yBAAA;AACF,qBAAA,CAAC;gBACJ;gBACA,IAAI,IAAI,EAAE;AACR,oBAAA,YAAY,CAAC,gBAAgB,GAAGA,kBAAY,CAAC,IAAI;AACjD,oBAAA,YAAY,CAAC,eAAe,GAAG,SAAS;oBACxC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAC7C,MAAM,UAAU,GAAGF,gBAAY,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE;AACxD,oBAAA,MAAM,KAAK,CAAC,eAAe,CACzB,UAAU,EACV;wBACE,IAAI,EAAEC,eAAS,CAAC,gBAAgB;AAChC,wBAAA,gBAAgB,EAAE;4BAChB,UAAU;AACX,yBAAA;qBACF,EACD,QAAQ,CACT;oBAED,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC;AAClD,oBAAA,MAAM,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE;AAC1C,wBAAA,OAAO,EAAE;AACP,4BAAA;gCACE,IAAI,EAAEC,kBAAY,CAAC,IAAI;AACvB,gCAAA,IAAI,EAAE,IAAI;AACX,6BAAA;AACF,yBAAA;AACF,qBAAA,CAAC;gBACJ;YACF;iBAAO;AACL,gBAAA,MAAM,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE;AACzC,oBAAA,OAAO,EAAE;AACP,wBAAA;4BACE,IAAI,EAAEA,kBAAY,CAAC,KAAK;AACxB,4BAAA,KAAK,EAAE,OAAO;AACf,yBAAA;AACF,qBAAA;AACF,iBAAA,CAAC;YACJ;QACF;aAAO,IACL,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,UAAU,CAACA,kBAAY,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EACpE;AACA,YAAA,MAAM,KAAK,CAAC,oBAAoB,CAAC,MAAM,EAAE;gBACvC,OAAO;AACR,aAAA,CAAC;QACJ;aAAO,IACL,OAAO,CAAC,KAAK,CACX,CAAC,CAAC,KACA,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAACA,kBAAY,CAAC,QAAQ,CAAC,IAAI,KAAK;AACnD,aAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAACA,kBAAY,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;AACrD,aAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAACA,kBAAY,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC;AAC7D,YAAA,CAAC,CAAC,IAAI,KAAK,mBAAmB,CACjC,EACD;AACA,YAAA,MAAM,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE;gBACzC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;oBAC3B,IAAI,EAAEA,kBAAY,CAAC,KAAK;oBACxB,KAAK,EACF,CAA2B,CAAC,QAAQ;AACpC,wBAAA,CAA2C,CAAC,SAAS;wBACrD,CAA4C,CAAC,aAAa,EAAE,IAAI;wBACjE,EAAE;AACL,iBAAA,CAAC,CAAC;AACJ,aAAA,CAAC;QACJ;IACF;IACA,eAAe,CACb,KAA8B,EAC9B,YAA0B,EAAA;QAE1B,IAAI,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,GAC7C,YAAY,CAAC,YAAY,CACkC;AAC7D,QAAA,IACE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;aAC3B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAKA,kBAAY,CAAC,QAAQ;gBAC/C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAKA,kBAAY,CAAC,SAAS;gBACjD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAKA,kBAAY,CAAC,iBAAiB;gBACzD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,mBAAmB,CAAC,EACjD;YACA,iBAAiB,GAAG,OAAO;QAC7B;AAAO,aAAA,IACL,CAAC,YAAY,CAAC,QAAQ,KAAKN,eAAS,CAAC,MAAM;AACzC,YAAA,YAAY,CAAC,QAAQ,KAAKA,eAAS,CAAC,KAAK;AAC3C,YAAA,iBAAiB,IAAI,IAAI;YACzB,OAAO,iBAAiB,KAAK,QAAQ;YACrC,iBAAiB,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI;YAC5C,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EACjC;YACA,iBAAiB,GAAG,OAAO;QAC7B;AAAO,aAAA,IACL,YAAY,CAAC,QAAQ,KAAKA,eAAS,CAAC,UAAU;;aAE7C,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC;;AAE/C,aAAC,CAAC,KAAK,CAAC,iBAAiB,EAAE,iBAAiB,IAAI,IAAI;gBAClD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC;gBACxD,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC;AACpD,iBAAC,OAAO,KAAK,CAAC,iBAAiB,EAAE,SAAS,KAAK,QAAQ;oBACrD,KAAK,CAAC,iBAAiB,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,EAC9C;YACA,iBAAiB,GAAG,OAAO;QAC7B;QACA,IACE,iBAAiB,IAAI,IAAI;AACzB,YAAA,iBAAiB,KAAK,EAAE;AACxB,aAAC,KAAK,CAAC,OAAO,IAAI,IAAI;gBACpB,KAAK,CAAC,OAAO,KAAK,EAAE;AACpB,gBAAA,iBAAiB,KAAK,OAAO,CAAC,EAChC;AACA,YAAA,YAAY,CAAC,gBAAgB,GAAGM,kBAAY,CAAC,KAAK;AAClD,YAAA,YAAY,CAAC,eAAe,GAAG,WAAW;YAC1C;QACF;AAAO,aAAA,IACL,YAAY,CAAC,eAAe,KAAK,WAAW;AAC5C,YAAA,YAAY,CAAC,gBAAgB,KAAKA,kBAAY,CAAC,IAAI;AACnD,aAAC,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE;gBAC7C,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AACnC,gBAAA,CAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAC5C;AACA,YAAA,YAAY,CAAC,gBAAgB,GAAGA,kBAAY,CAAC,IAAI;AACjD,YAAA,YAAY,CAAC,eAAe,GAAG,SAAS;YACxC,YAAY,CAAC,wBAAwB,EAAE;QACzC;AAAO,aAAA,IACL,KAAK,CAAC,OAAO,IAAI,IAAI;AACrB,YAAA,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;AACjC,YAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YACjC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAClC;AACA,YAAA,YAAY,CAAC,gBAAgB,GAAG,gBAAgB;AAChD,YAAA,YAAY,CAAC,eAAe,GAAG,SAAS;QAC1C;AAAO,aAAA,IACL,KAAK,CAAC,OAAO,IAAI,IAAI;AACrB,YAAA,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;YACjC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EACjC;AACA,YAAA,YAAY,CAAC,gBAAgB,GAAGA,kBAAY,CAAC,KAAK;AAClD,YAAA,YAAY,CAAC,eAAe,GAAG,SAAS;QAC1C;AAAO,aAAA,IACL,YAAY,CAAC,SAAS,IAAI,IAAI;YAC9B,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC3C;AACA,YAAA,YAAY,CAAC,gBAAgB,GAAGA,kBAAY,CAAC,IAAI;AACjD,YAAA,YAAY,CAAC,eAAe,GAAG,SAAS;QAC1C;AACA,QAAA,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE;YACrC;QACF;AACA,QAAA,YAAY,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO;IACxC;AACD;SAEe,uBAAuB,GAAA;IACrC,MAAM,YAAY,GAA+C,EAAE;AACnE,IAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB;AAC5C,IAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB;;AAE/C,IAAA,MAAM,4BAA4B,GAAG,IAAI,GAAG,EAAU;;AAEtD,IAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAG3B;IAEH,MAAM,aAAa,GAAG,CACpB,KAAa,EACb,WAAqC,EACrC,WAAW,GAAG,KAAK,KACX;QACR,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC;YACxD;QACF;AACA,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,IAAI,EAAE;QACvC,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC;YACrD;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,QAAQ,KAAKA,kBAAY,CAAC,SAAS,EAAE;YAC/D,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1C;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE;AACzD,YAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;YACrC;QACF;AAEA,QAAA,IACE,QAAQ,CAAC,UAAU,CAACA,kBAAY,CAAC,IAAI,CAAC;YACtCA,kBAAY,CAAC,IAAI,IAAI,WAAW;AAChC,YAAA,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,EACpC;;AAEA,YAAA,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAyB;AAClE,YAAA,MAAM,MAAM,GAAyB;gBACnC,IAAI,EAAEA,kBAAY,CAAC,IAAI;gBACvB,IAAI,EAAE,CAAC,cAAc,CAAC,IAAI,IAAI,EAAE,IAAI,WAAW,CAAC,IAAI;aACrD;AAED,YAAA,IAAI,WAAW,CAAC,aAAa,EAAE;AAC7B,gBAAA,MAAM,CAAC,aAAa,GAAG,WAAW,CAAC,aAAa;YAClD;AACA,YAAA,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM;QAC9B;AAAO,aAAA,IACL,QAAQ,CAAC,UAAU,CAACA,kBAAY,CAAC,KAAK,CAAC;YACvCA,kBAAY,CAAC,KAAK,IAAI,WAAW;AACjC,YAAA,OAAO,WAAW,CAAC,KAAK,KAAK,QAAQ,EACrC;AACA,YAAA,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAA2B;AACpE,YAAA,MAAM,MAAM,GAA2B;gBACrC,IAAI,EAAEA,kBAAY,CAAC,KAAK;gBACxB,KAAK,EAAE,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,IAAI,WAAW,CAAC,KAAK;aACxD;AACD,YAAA,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM;QAC9B;AAAO,aAAA,IACL,QAAQ,CAAC,UAAU,CAACA,kBAAY,CAAC,YAAY,CAAC;YAC9CA,kBAAY,CAAC,YAAY,IAAI,WAAW;AACxC,YAAA,WAAW,CAAC,YAAY,IAAI,IAAI,EAChC;AACA,YAAA,MAAM,MAAM,GAAkB;gBAC5B,IAAI,EAAEA,kBAAY,CAAC,YAAY;gBAC/B,YAAY,EAAE,WAAW,CAAC,YAAY;aACvC;AAED,YAAA,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM;QAC9B;AAAO,aAAA,IACL,QAAQ,KAAKA,kBAAY,CAAC,SAAS;YACnC,WAAW,IAAI,WAAW,EAC1B;AACA,YAAA,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAGxC;YACD,YAAY,CAAC,KAAK,CAAC,GAAG;AACpB,gBAAA,GAAG,cAAc;aAClB;QACH;AAAO,aAAA,IACL,QAAQ,KAAKA,kBAAY,CAAC,SAAS;YACnC,WAAW,IAAI,WAAW,EAC1B;AACA,YAAA,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI;AAC/C,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,EAAE;AAC3C,YAAA,MAAM,YAAY,GAAI,WAAW,CAAC,SAA4B,CAAC,IAAI;;;YAInE,MAAM,YAAY,GAAG,YAAY,IAAI,IAAI,IAAI,YAAY,KAAK,EAAE;AAEhE,YAAA,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAI7B;;;;;YAMb,MAAM,eAAe,GACnB,eAAe,EAAE,SAAS,EAAE,IAAI,IAAI,IAAI;AACxC,gBAAA,eAAe,CAAC,SAAS,CAAC,IAAI,KAAK,EAAE;YACvC,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,IAAI,CAAC,eAAe,EAAE;gBACrD;YACF;AAEA;;;AAGgF;AAChF,YAAA,MAAM,YAAY,GAAG,eAAe,EAAE,SAAS,EAAE,IAAI;AACrD,YAAA,MAAM,kBAAkB,GACtB,OAAO,YAAY,KAAK,QAAQ;gBAChC,MAAM,CAAC,IAAI,CAAC,YAAuC,CAAC,CAAC,MAAM,KAAK,CAAC;YACnE,MAAM,gBAAgB,GACpB,OAAO,YAAY,KAAK,QAAQ,IAAI,kBAAkB;YACxD,IAAI,IAAI,GACN,WAAW;gBACX,YAAY;AACZ,iBAAC,CAAC,gBAAgB,IAAI,OAAO,YAAY,KAAK,QAAQ,CAAC;gBACvD,OAAO,YAAY,KAAK;AACtB,kBAAE,WAAW,CAAC,SAAS,CAAC;AACxB,kBAAE,CAAC,CAAC,kBAAkB,GAAG,EAAE,GAAG,YAAY,KAAK,EAAE;AAC/C,qBAAC,YAAY,IAAI,EAAE,CAAC;AAC1B,YAAA,IACE,WAAW;AACX,gBAAA,IAAI,IAAI,IAAI;AACZ,gBAAA,eAAe,EAAE,SAAS,EAAE,IAAI,IAAI,IAAI,EACxC;AACA,gBAAA,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI;YACvC;AAEA,YAAA,MAAM,EAAE,GACN,gBAAgB,CAAC,CAAC,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;AACtE,YAAA,MAAM,IAAI,GACR,gBAAgB,CAAC,CAAC,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AAClE,gBAAA,EAAE;AAEJ,YAAA,MAAM,WAAW,GAA8B;gBAC7C,EAAE;gBACF,IAAI;gBACJ,IAAI;gBACJ,IAAI,EAAEC,mBAAa,CAAC,SAAS;aAC9B;YAED,IAAI,WAAW,EAAE;AACf,gBAAA,WAAW,CAAC,QAAQ,GAAG,CAAC;gBACxB,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM;YACnD;YAEA,YAAY,CAAC,KAAK,CAAC,GAAG;gBACpB,IAAI,EAAED,kBAAY,CAAC,SAAS;AAC5B,gBAAA,SAAS,EAAE,WAAW;aACvB;QACH;;;;QAKA,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE;YACxB,YAAY,CAAC,KAAK,CAA6B,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QACzE;AACA,QAAA,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE;YACxB,YAAY,CAAC,KAAK,CAA6B,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QACzE;AACF,IAAA,CAAC;IAED,MAAM,gBAAgB,GAAG,CAAC,EACxB,KAAK,EACL,IAAI,GAaL,KAAU;;AAET,QAAA,IAAI,KAAK,KAAKE,iBAAW,CAAC,oBAAoB,EAAE;YAC9C,MAAM,cAAc,GAAG,IAGtB;AACD,YAAA,MAAM,WAAW,GAA4B;gBAC3C,IAAI,EAAEF,kBAAY,CAAC,IAAI;AACvB,gBAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;aACjE;;AAED,YAAA,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM;AACrC,YAAA,aAAa,CAAC,SAAS,EAAE,WAAW,CAAC;YACrC;QACF;AAEA,QAAA,IAAI,KAAK,KAAKE,iBAAW,CAAC,WAAW,EAAE;YACrC,MAAM,OAAO,GAAG,IAAiB;YACjC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC;;;;AAKhC,YAAA,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,OAAO,KAAK,EAAE;AACpE,YAAA,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI;AAC1C,YAAA,IAAI,UAAU,IAAI,UAAU,EAAE;AAC5B,gBAAA,MAAM,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;gBAC5D,IAAI,UAAU,EAAE;AACd,oBAAA,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO;gBACxC;gBACA,IAAI,UAAU,EAAE;AACd,oBAAA,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO;gBACxC;gBACA,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC;YACjD;;YAGA,IACE,OAAO,CAAC,WAAW,CAAC,IAAI,KAAKH,eAAS,CAAC,UAAU;AACjD,gBAAA,OAAO,CAAC,WAAW,CAAC,UAAU,EAC9B;;AAEA,gBAAA,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,UAAwB;AAC9D,gBAAA,MAAM,sBAAsB,GAC1B,SAAS,CAAC,MAAM,GAAG,CAAC;AACpB,oBAAA,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAI;wBAC3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE;wBAC5C,QACE,QAAQ,KAAK,UAAU;AACvB,4BAAA,QAAQ,KAAK,oBAAoB;4BACjC,QAAQ,KAAK,qBAAqB;AAEtC,oBAAA,CAAC,CAAC;;gBAGJ,IAAI,sBAAsB,EAAE;AAC1B,oBAAA,4BAA4B,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5C;gBACF;;;;AAKA,gBAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,oBAAA,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;wBAC5B,IAAI,EAAEC,kBAAY,CAAC,SAAS;AAC5B,wBAAA,SAAS,EAAE;AACT,4BAAA,IAAI,EAAE,EAAE;AACR,4BAAA,IAAI,EAAE,EAAE;AACR,4BAAA,EAAE,EAAE,EAAE;4BACN,IAAI,EAAEC,mBAAa,CAAC,SAAS;AAC9B,yBAAA;qBACF;gBACH;AAEA,gBAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;;;oBAG7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE;oBAC5C,IACE,QAAQ,KAAK,UAAU;AACvB,wBAAA,QAAQ,KAAK,oBAAoB;wBACjC,QAAQ,KAAK,qBAAqB,EAClC;wBACA;oBACF;AAEA,oBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE;AACpC,oBAAA,IAAI,IAAI,IAAI,QAAQ,IAAI,UAAU,EAAE;wBAClC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC;oBAC3C;AACA,oBAAA,MAAM,WAAW,GAA4B;wBAC3C,IAAI,EAAED,kBAAY,CAAC,SAAS;AAC5B,wBAAA,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ,CAAC,IAAI;4BACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;AACnB,4BAAA,EAAE,EAAE,UAAU;AACf,yBAAA;qBACF;AAED,oBAAA,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC;AAC3C,gBAAA,CAAC,CAAC;YACJ;QACF;AAAO,aAAA,IAAI,KAAK,KAAKE,iBAAW,CAAC,gBAAgB,EAAE;YACjD,MAAM,YAAY,GAAG,IAA2B;YAChD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC;gBAClE;YACF;AAEA,YAAA,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE;gBAC9B,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO;sBACxD,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAE,YAAY,CAAC,KAAK,CAAC,OAAO;AAE9B,gBAAA,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC;YAC3C;QACF;AAAO,aAAA,IACL,KAAK,KAAKA,iBAAW,CAAC,eAAe;YACpC,IAAkC,EAAE,YAAY,EACjD;YACA,MAAM,WAAW,GAAG,IAAiC;YACrD,IAAI,CAAC,WAAW,EAAE;gBAChB;YACF;YACA,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC;QAC5D;AAAO,aAAA,IAAI,KAAK,KAAKA,iBAAW,CAAC,kBAAkB,EAAE;YACnD,MAAM,cAAc,GAAG,IAA6B;YACpD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CAAC,sDAAsD,CAAC;gBACpE;YACF;AAEA,YAAA,IAAI,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE;gBAChC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO;sBAC1D,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAChC,sBAAE,cAAc,CAAC,KAAK,CAAC,OAAO;AAEhC,gBAAA,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC;YAC3C;QACF;AAAO,aAAA,IAAI,KAAK,KAAKA,iBAAW,CAAC,iBAAiB,EAAE;YAClD,MAAM,YAAY,GAAG,IAA2B;;YAGhD,IAAI,4BAA4B,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE;gBACrD;YACF;YAEA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC;gBACnE;YACF;YAEA,IACE,YAAY,CAAC,KAAK,CAAC,IAAI,KAAKH,eAAS,CAAC,UAAU;AAChD,gBAAA,YAAY,CAAC,KAAK,CAAC,UAAU,EAC7B;gBACA,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,aAAa,KAAI;AACtD;;;AAGmD;oBACnD,MAAM,UAAU,GACd,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;yBACjC,aAAa,CAAC,EAAE,IAAI,IAAI,IAAI,aAAa,CAAC,EAAE,KAAK;8BAC9C,aAAa,CAAC;8BACd,SAAS,CAAC;;oBAGhB,IACE,UAAU,IAAI,IAAI;AAClB,wBAAA,UAAU,KAAK,EAAE;wBACjB,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,EACnC;wBACA,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC;oBAChD;AAEA,oBAAA,MAAM,WAAW,GAA4B;wBAC3C,IAAI,EAAEC,kBAAY,CAAC,SAAS;AAC5B,wBAAA,SAAS,EAAE;AACT,4BAAA,IAAI,EAAE,aAAa,CAAC,IAAI,IAAI,EAAE;4BAC9B,IAAI,EAAE,aAAa,CAAC,IAAI;AACxB,4BAAA,EAAE,EAAE,UAAU;AACf,yBAAA;qBACF;AAED,oBAAA,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC;AAC3C,gBAAA,CAAC,CAAC;YACJ;QACF;AAAO,aAAA,IAAI,KAAK,KAAKE,iBAAW,CAAC,qBAAqB,EAAE;AACtD,YAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAA6C;AAEhE,YAAA,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM;;AAG7B,YAAA,IAAI,4BAA4B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;gBAC5C;YACF;YAEA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CACV,0DAA0D,CAC3D;gBACD;YACF;AAEA,YAAA,MAAM,WAAW,GAA4B;gBAC3C,IAAI,EAAEF,kBAAY,CAAC,SAAS;gBAC5B,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B;YAED,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC;QACjD;AACF,IAAA,CAAC;AAED,IAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE;AACpD;;;;;;"}
1
+ {"version":3,"file":"stream.cjs","sources":["../../src/stream.ts"],"sourcesContent":["// src/stream.ts\nimport type { ChatOpenAIReasoningSummary } from '@langchain/openai';\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { StandardGraph } from '@/graphs';\nimport type * as t from '@/types';\nimport {\n ToolCallTypes,\n ContentTypes,\n GraphEvents,\n StepTypes,\n Providers,\n} from '@/common';\nimport {\n handleServerToolResult,\n handleToolCallChunks,\n handleToolCalls,\n} from '@/tools/handlers';\nimport { getMessageId } from '@/messages';\n\n/**\n * Parses content to extract thinking sections enclosed in <think> tags using string operations\n * @param content The content to parse\n * @returns An object with separated text and thinking content\n */\nfunction parseThinkingContent(content: string): {\n text: string;\n thinking: string;\n} {\n // If no think tags, return the original content as text\n if (!content.includes('<think>')) {\n return { text: content, thinking: '' };\n }\n\n let textResult = '';\n const thinkingResult: string[] = [];\n let position = 0;\n\n while (position < content.length) {\n const thinkStart = content.indexOf('<think>', position);\n\n if (thinkStart === -1) {\n // No more think tags, add the rest and break\n textResult += content.slice(position);\n break;\n }\n\n // Add text before the think tag\n textResult += content.slice(position, thinkStart);\n\n const thinkEnd = content.indexOf('</think>', thinkStart);\n if (thinkEnd === -1) {\n // Malformed input, no closing tag\n textResult += content.slice(thinkStart);\n break;\n }\n\n // Add the thinking content\n const thinkContent = content.slice(thinkStart + 7, thinkEnd);\n thinkingResult.push(thinkContent);\n\n // Move position to after the think tag\n position = thinkEnd + 8; // 8 is the length of '</think>'\n }\n\n return {\n text: textResult.trim(),\n thinking: thinkingResult.join('\\n').trim(),\n };\n}\n\nfunction getNonEmptyValue(possibleValues: string[]): string | undefined {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nexport function getChunkContent({\n chunk,\n provider,\n reasoningKey,\n}: {\n chunk?: Partial<AIMessageChunk>;\n provider?: Providers;\n reasoningKey: 'reasoning_content' | 'reasoning';\n}): string | t.MessageContentComplex[] | undefined {\n if (\n (provider === Providers.OPENAI || provider === Providers.AZURE) &&\n (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text != null &&\n ((\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text?.length ?? 0) > 0\n ) {\n return (\n chunk?.additional_kwargs?.reasoning as\n | Partial<ChatOpenAIReasoningSummary>\n | undefined\n )?.summary?.[0]?.text;\n }\n /**\n * For OpenRouter, reasoning is stored in additional_kwargs.reasoning (not reasoning_content).\n * NOTE: We intentionally do NOT extract text from reasoning_details here.\n * The reasoning_details array contains the FULL accumulated reasoning text (set only on final chunk),\n * but individual reasoning tokens are already streamed via additional_kwargs.reasoning.\n * Extracting from reasoning_details would cause duplication.\n * The reasoning_details is only used for:\n * 1. Detecting reasoning mode in handleReasoning()\n * 2. Final message storage (for thought signatures)\n */\n if (provider === Providers.OPENROUTER) {\n // Content presence signals end of reasoning phase - prefer content over reasoning\n // This handles transitional chunks that may have both reasoning and content\n if (typeof chunk?.content === 'string' && chunk.content !== '') {\n return chunk.content;\n }\n const reasoning = chunk?.additional_kwargs?.reasoning as string | undefined;\n if (reasoning != null && reasoning !== '') {\n return reasoning;\n }\n return chunk?.content;\n }\n return (\n ((chunk?.additional_kwargs?.[reasoningKey] as string | undefined) ?? '') ||\n chunk?.content\n );\n}\n\nexport class ChatModelStreamHandler implements t.EventHandler {\n async handle(\n event: string,\n data: t.StreamEventData,\n metadata?: Record<string, unknown>,\n graph?: StandardGraph\n ): Promise<void> {\n if (!graph) {\n throw new Error('Graph not found');\n }\n if (!graph.config) {\n throw new Error('Config not found in graph');\n }\n if (!data.chunk) {\n console.warn(`No chunk found in ${event} event`);\n return;\n }\n\n const agentContext = graph.getAgentContext(metadata);\n\n const chunk = data.chunk as Partial<AIMessageChunk>;\n const content = getChunkContent({\n chunk,\n reasoningKey: agentContext.reasoningKey,\n provider: agentContext.provider,\n });\n const skipHandling = await handleServerToolResult({\n graph,\n content,\n metadata,\n agentContext,\n });\n if (skipHandling) {\n return;\n }\n this.handleReasoning(chunk, agentContext);\n let hasToolCalls = false;\n\n if (\n chunk.tool_calls &&\n chunk.tool_calls.length > 0 &&\n chunk.tool_calls.every(\n (tc) =>\n tc.id != null &&\n tc.id !== '' &&\n (tc as Partial<ToolCall>).name != null &&\n tc.name !== ''\n )\n ) {\n hasToolCalls = true;\n await handleToolCalls(chunk.tool_calls, metadata, graph);\n }\n\n const hasToolCallChunks =\n (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;\n const isEmptyContent =\n typeof content === 'undefined' ||\n !content.length ||\n (typeof content === 'string' && !content);\n\n /** Set a preliminary message ID if found in empty chunk */\n const isEmptyChunk = isEmptyContent && !hasToolCallChunks;\n if (\n isEmptyChunk &&\n (chunk.id ?? '') !== '' &&\n !graph.prelimMessageIdsByStepKey.has(chunk.id ?? '')\n ) {\n const stepKey = graph.getStepKey(metadata);\n graph.prelimMessageIdsByStepKey.set(stepKey, chunk.id ?? '');\n } else if (isEmptyChunk) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n\n if (\n hasToolCallChunks &&\n chunk.tool_call_chunks &&\n chunk.tool_call_chunks.length &&\n typeof chunk.tool_call_chunks[0]?.index === 'number'\n ) {\n await handleToolCallChunks({\n graph,\n stepKey,\n toolCallChunks: chunk.tool_call_chunks,\n metadata,\n });\n }\n\n if (isEmptyContent) {\n return;\n }\n\n const message_id = getMessageId(stepKey, graph) ?? '';\n if (message_id) {\n await graph.dispatchRunStep(\n stepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n }\n\n const stepId = graph.getStepIdByKey(stepKey);\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n console.warn(`\\n\n==============================================================\n\n\nRun step for ${stepId} does not exist, cannot dispatch delta event.\n\nevent: ${event}\nstepId: ${stepId}\nstepKey: ${stepKey}\nmessage_id: ${message_id}\nhasToolCalls: ${hasToolCalls}\nhasToolCallChunks: ${hasToolCallChunks}\n\n==============================================================\n\\n`);\n return;\n }\n\n /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */\n if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {\n return;\n } else if (\n hasToolCallChunks &&\n (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)\n ) {\n return;\n } else if (typeof content === 'string') {\n if (agentContext.currentTokenType === ContentTypes.TEXT) {\n await graph.dispatchMessageDelta(stepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: content,\n },\n ],\n });\n } else if (agentContext.currentTokenType === 'think_and_text') {\n const { text, thinking } = parseThinkingContent(content);\n if (thinking) {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: thinking,\n },\n ],\n });\n }\n if (text) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n const newStepKey = graph.getStepKey(metadata);\n const message_id = getMessageId(newStepKey, graph) ?? '';\n await graph.dispatchRunStep(\n newStepKey,\n {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n },\n metadata\n );\n\n const newStepId = graph.getStepIdByKey(newStepKey);\n await graph.dispatchMessageDelta(newStepId, {\n content: [\n {\n type: ContentTypes.TEXT,\n text: text,\n },\n ],\n });\n }\n } else {\n await graph.dispatchReasoningDelta(stepId, {\n content: [\n {\n type: ContentTypes.THINK,\n think: content,\n },\n ],\n });\n }\n } else if (\n content.every((c) => c.type?.startsWith(ContentTypes.TEXT) ?? false)\n ) {\n await graph.dispatchMessageDelta(stepId, {\n content,\n });\n } else if (\n content.every(\n (c) =>\n (c.type?.startsWith(ContentTypes.THINKING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING) ?? false) ||\n (c.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false) ||\n c.type === 'redacted_thinking'\n )\n ) {\n await graph.dispatchReasoningDelta(stepId, {\n content: content.map((c) => ({\n type: ContentTypes.THINK,\n think:\n (c as t.ThinkingContentText).thinking ??\n (c as Partial<t.GoogleReasoningContentText>).reasoning ??\n (c as Partial<t.BedrockReasoningContentText>).reasoningText?.text ??\n '',\n })),\n });\n }\n }\n handleReasoning(\n chunk: Partial<AIMessageChunk>,\n agentContext: AgentContext\n ): void {\n let reasoning_content = chunk.additional_kwargs?.[\n agentContext.reasoningKey\n ] as string | Partial<ChatOpenAIReasoningSummary> | undefined;\n if (\n Array.isArray(chunk.content) &&\n (chunk.content[0]?.type === ContentTypes.THINKING ||\n chunk.content[0]?.type === ContentTypes.REASONING ||\n chunk.content[0]?.type === ContentTypes.REASONING_CONTENT ||\n chunk.content[0]?.type === 'redacted_thinking')\n ) {\n reasoning_content = 'valid';\n } else if (\n (agentContext.provider === Providers.OPENAI ||\n agentContext.provider === Providers.AZURE) &&\n reasoning_content != null &&\n typeof reasoning_content !== 'string' &&\n reasoning_content.summary?.[0]?.text != null &&\n reasoning_content.summary[0].text\n ) {\n reasoning_content = 'valid';\n } else if (\n agentContext.provider === Providers.OPENROUTER &&\n // Only set reasoning as valid if content is NOT present (content signals end of reasoning)\n (chunk.content == null || chunk.content === '') &&\n // Check for reasoning_details (final chunk) OR reasoning string (intermediate chunks)\n ((chunk.additional_kwargs?.reasoning_details != null &&\n Array.isArray(chunk.additional_kwargs.reasoning_details) &&\n chunk.additional_kwargs.reasoning_details.length > 0) ||\n (typeof chunk.additional_kwargs?.reasoning === 'string' &&\n chunk.additional_kwargs.reasoning !== ''))\n ) {\n reasoning_content = 'valid';\n }\n if (\n reasoning_content != null &&\n reasoning_content !== '' &&\n (chunk.content == null ||\n chunk.content === '' ||\n reasoning_content === 'valid')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'reasoning';\n return;\n } else if (\n agentContext.tokenTypeSwitch === 'reasoning' &&\n agentContext.currentTokenType !== ContentTypes.TEXT &&\n ((chunk.content != null && chunk.content !== '') ||\n (chunk.tool_calls?.length ?? 0) > 0 ||\n (chunk.tool_call_chunks?.length ?? 0) > 0)\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n agentContext.reasoningTransitionCount++;\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>') &&\n chunk.content.includes('</think>')\n ) {\n agentContext.currentTokenType = 'think_and_text';\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n chunk.content != null &&\n typeof chunk.content === 'string' &&\n chunk.content.includes('<think>')\n ) {\n agentContext.currentTokenType = ContentTypes.THINK;\n agentContext.tokenTypeSwitch = 'content';\n } else if (\n agentContext.lastToken != null &&\n agentContext.lastToken.includes('</think>')\n ) {\n agentContext.currentTokenType = ContentTypes.TEXT;\n agentContext.tokenTypeSwitch = 'content';\n }\n if (typeof chunk.content !== 'string') {\n return;\n }\n agentContext.lastToken = chunk.content;\n }\n}\n\nexport function createContentAggregator(): t.ContentAggregatorResult {\n const contentParts: Array<t.MessageContentComplex | undefined> = [];\n const stepMap = new Map<string, t.RunStep>();\n const toolCallIdMap = new Map<string, string>();\n // Track step IDs for structured output tool calls that should be skipped\n const skippedStructuredOutputSteps = new Set<string>();\n // Track agentId and groupId for each content index (applied to content parts)\n const contentMetaMap = new Map<\n number,\n { agentId?: string; groupId?: number }\n >();\n\n const updateContent = (\n index: number,\n contentPart?: t.MessageContentComplex,\n finalUpdate = false\n ): void => {\n if (!contentPart) {\n console.warn(\"No content part found in 'updateContent'\");\n return;\n }\n const partType = contentPart.type ?? '';\n if (!partType) {\n console.warn('No content type found in content part');\n return;\n }\n\n if (!contentParts[index] && partType !== ContentTypes.TOOL_CALL) {\n contentParts[index] = { type: partType };\n }\n\n if (!partType.startsWith(contentParts[index]?.type ?? '')) {\n console.warn('Content type mismatch');\n return;\n }\n\n if (\n partType.startsWith(ContentTypes.TEXT) &&\n ContentTypes.TEXT in contentPart &&\n typeof contentPart.text === 'string'\n ) {\n // TODO: update this!!\n const currentContent = contentParts[index] as t.MessageDeltaUpdate;\n const update: t.MessageDeltaUpdate = {\n type: ContentTypes.TEXT,\n text: (currentContent.text || '') + contentPart.text,\n };\n\n if (contentPart.tool_call_ids) {\n update.tool_call_ids = contentPart.tool_call_ids;\n }\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.THINK) &&\n ContentTypes.THINK in contentPart &&\n typeof contentPart.think === 'string'\n ) {\n const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;\n const update: t.ReasoningDeltaUpdate = {\n type: ContentTypes.THINK,\n think: (currentContent.think || '') + contentPart.think,\n };\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.AGENT_UPDATE) &&\n ContentTypes.AGENT_UPDATE in contentPart &&\n contentPart.agent_update != null\n ) {\n const update: t.AgentUpdate = {\n type: ContentTypes.AGENT_UPDATE,\n agent_update: contentPart.agent_update,\n };\n\n contentParts[index] = update;\n } else if (\n partType === ContentTypes.IMAGE_URL &&\n 'image_url' in contentPart\n ) {\n const currentContent = contentParts[index] as {\n type: 'image_url';\n image_url: string;\n };\n contentParts[index] = {\n ...currentContent,\n };\n } else if (\n partType === ContentTypes.TOOL_CALL &&\n 'tool_call' in contentPart\n ) {\n const incomingName = contentPart.tool_call.name;\n const incomingId = contentPart.tool_call.id;\n const toolCallArgs = (contentPart.tool_call as t.ToolCallPart).args;\n\n // When we receive a tool call with a name, it's the complete tool call\n // Consolidate with any previously accumulated args from chunks\n const hasValidName = incomingName != null && incomingName !== '';\n\n const existingContent = contentParts[index] as\n | (Omit<t.ToolCallContent, 'tool_call'> & {\n tool_call?: t.ToolCallPart;\n })\n | undefined;\n\n // Allow processing if:\n // 1. Incoming has a valid name (initial tool call setup), OR\n // 2. It's a final update (ON_RUN_STEP_COMPLETED), OR\n // 3. Existing content already has a name (delta streaming — grows args progressively)\n const existingHasName =\n existingContent?.tool_call?.name != null &&\n existingContent.tool_call.name !== '';\n if (!hasValidName && !finalUpdate && !existingHasName) {\n return;\n }\n\n /** Concatenate string args for progressive streaming; replace when object (complete).\n * When incoming delta has a valid name, treat as a complete replacement —\n * this handles the Bedrock case where handleToolCalls sends complete args\n * as a delta to an existing step that already has partial args from chunks. */\n const existingArgs = existingContent?.tool_call?.args;\n const existingIsEmptyObj =\n typeof existingArgs === 'object' &&\n Object.keys(existingArgs as Record<string, unknown>).length === 0;\n const existingIsString =\n typeof existingArgs === 'string' || existingIsEmptyObj;\n let args =\n finalUpdate ||\n hasValidName ||\n (!existingIsString && typeof existingArgs === 'object') ||\n typeof toolCallArgs === 'object'\n ? contentPart.tool_call.args\n : ((existingIsEmptyObj ? '' : existingArgs) ?? '') +\n (toolCallArgs ?? '');\n if (\n finalUpdate &&\n args == null &&\n existingContent?.tool_call?.args != null\n ) {\n args = existingContent.tool_call.args;\n }\n\n const id =\n getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? '';\n const name =\n getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ??\n '';\n\n const newToolCall: ToolCall & t.PartMetadata = {\n id,\n name,\n args,\n type: ToolCallTypes.TOOL_CALL,\n };\n\n if (finalUpdate) {\n newToolCall.progress = 1;\n newToolCall.output = contentPart.tool_call.output;\n }\n\n contentParts[index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: newToolCall,\n };\n }\n\n // Apply agentId (for MultiAgentGraph) and groupId (for parallel execution) to content parts\n // - agentId present → MultiAgentGraph (show agent labels)\n // - groupId present → parallel execution (render columns)\n const meta = contentMetaMap.get(index);\n if (meta?.agentId != null) {\n (contentParts[index] as t.MessageContentComplex).agentId = meta.agentId;\n }\n if (meta?.groupId != null) {\n (contentParts[index] as t.MessageContentComplex).groupId = meta.groupId;\n }\n };\n\n const aggregateContent = ({\n event,\n data,\n }: {\n event: GraphEvents;\n data:\n | t.RunStep\n | t.AgentUpdate\n | t.MessageDeltaEvent\n | t.RunStepDeltaEvent\n | { result: t.ToolEndEvent }\n | {\n structuredResponse: Record<string, unknown>;\n schema: Record<string, unknown>;\n };\n }): void => {\n // Handle structured output - add the JSON response as a text content part\n if (event === GraphEvents.ON_STRUCTURED_OUTPUT) {\n const structuredData = data as {\n structuredResponse: Record<string, unknown>;\n schema: Record<string, unknown>;\n };\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TEXT,\n text: JSON.stringify(structuredData.structuredResponse, null, 2),\n };\n // Use the next available index\n const nextIndex = contentParts.length;\n updateContent(nextIndex, contentPart);\n return;\n }\n\n if (event === GraphEvents.ON_RUN_STEP) {\n const runStep = data as t.RunStep;\n stepMap.set(runStep.id, runStep);\n\n // Track agentId (MultiAgentGraph) and groupId (parallel execution) separately\n // - agentId: present for all MultiAgentGraph runs (enables agent labels in UI)\n // - groupId: present only for parallel execution (enables column rendering)\n const hasAgentId = runStep.agentId != null && runStep.agentId !== '';\n const hasGroupId = runStep.groupId != null;\n if (hasAgentId || hasGroupId) {\n const existingMeta = contentMetaMap.get(runStep.index) ?? {};\n if (hasAgentId) {\n existingMeta.agentId = runStep.agentId;\n }\n if (hasGroupId) {\n existingMeta.groupId = runStep.groupId;\n }\n contentMetaMap.set(runStep.index, existingMeta);\n }\n\n // Store tool call IDs if present\n if (\n runStep.stepDetails.type === StepTypes.TOOL_CALLS &&\n runStep.stepDetails.tool_calls\n ) {\n // Check if ALL tool calls are structured output tool calls\n const toolCalls = runStep.stepDetails.tool_calls as ToolCall[];\n const allAreStructuredOutput =\n toolCalls.length > 0 &&\n toolCalls.every((toolCall) => {\n const toolName = toolCall.name.toLowerCase();\n return (\n toolName === 'response' ||\n toolName === 'structuredresponse' ||\n toolName === 'structured_response'\n );\n });\n\n // If all tool calls are structured output, skip this entire step\n if (allAreStructuredOutput) {\n skippedStructuredOutputSteps.add(runStep.id);\n return;\n }\n\n // When tool_calls is empty (Bedrock sends name/args only at model end),\n // initialize a placeholder so contentParts[index] is not null.\n // ON_RUN_STEP_COMPLETED or ON_RUN_STEP_DELTA will fill in the real data.\n if (toolCalls.length === 0) {\n contentParts[runStep.index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: '',\n name: '',\n id: '',\n type: ToolCallTypes.TOOL_CALL,\n },\n };\n }\n\n toolCalls.forEach((toolCall) => {\n // Skip structured output tool calls - these are synthetic tool calls\n // used by withStructuredOutput() to extract JSON, not real tools\n const toolName = toolCall.name.toLowerCase();\n if (\n toolName === 'response' ||\n toolName === 'structuredresponse' ||\n toolName === 'structured_response'\n ) {\n return;\n }\n\n const toolCallId = toolCall.id ?? '';\n if ('id' in toolCall && toolCallId) {\n toolCallIdMap.set(runStep.id, toolCallId);\n }\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCall.args,\n name: toolCall.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_MESSAGE_DELTA) {\n const messageDelta = data as t.MessageDeltaEvent;\n const runStep = stepMap.get(messageDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for message delta event');\n return;\n }\n\n if (messageDelta.delta.content) {\n const contentPart = Array.isArray(messageDelta.delta.content)\n ? messageDelta.delta.content[0]\n : messageDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (\n event === GraphEvents.ON_AGENT_UPDATE &&\n (data as t.AgentUpdate | undefined)?.agent_update\n ) {\n const contentPart = data as t.AgentUpdate | undefined;\n if (!contentPart) {\n return;\n }\n updateContent(contentPart.agent_update.index, contentPart);\n } else if (event === GraphEvents.ON_REASONING_DELTA) {\n const reasoningDelta = data as t.ReasoningDeltaEvent;\n const runStep = stepMap.get(reasoningDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for reasoning delta event');\n return;\n }\n\n if (reasoningDelta.delta.content) {\n const contentPart = Array.isArray(reasoningDelta.delta.content)\n ? reasoningDelta.delta.content[0]\n : reasoningDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {\n const runStepDelta = data as t.RunStepDeltaEvent;\n\n // Skip deltas for structured output tool calls\n if (skippedStructuredOutputSteps.has(runStepDelta.id)) {\n return;\n }\n\n const runStep = stepMap.get(runStepDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for run step delta event');\n return;\n }\n\n if (\n runStepDelta.delta.type === StepTypes.TOOL_CALLS &&\n runStepDelta.delta.tool_calls\n ) {\n runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {\n /** Use toolCallIdMap first; fall back to the delta's own id\n * (Bedrock sends complete tool call data as a delta via handleToolCalls,\n * which includes the id, but the map was never populated because\n * the initial on_run_step had tool_calls: []) */\n const toolCallId =\n toolCallIdMap.get(runStepDelta.id) ??\n (toolCallDelta.id != null && toolCallDelta.id !== ''\n ? toolCallDelta.id\n : undefined);\n\n // Store the mapping for future lookups (e.g. on_run_step_completed)\n if (\n toolCallId != null &&\n toolCallId !== '' &&\n !toolCallIdMap.has(runStepDelta.id)\n ) {\n toolCallIdMap.set(runStepDelta.id, toolCallId);\n }\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCallDelta.args ?? '',\n name: toolCallDelta.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {\n const { result } = data as unknown as { result: t.ToolEndEvent };\n\n const { id: stepId } = result;\n\n // Skip completion events for structured output tool calls\n if (skippedStructuredOutputSteps.has(stepId)) {\n return;\n }\n\n const runStep = stepMap.get(stepId);\n if (!runStep) {\n console.warn(\n 'No run step or runId found for completed tool call event'\n );\n return;\n }\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: result.tool_call,\n };\n\n updateContent(runStep.index, contentPart, true);\n }\n };\n\n return { contentParts, aggregateContent, stepMap };\n}\n"],"names":["Providers","handleServerToolResult","handleToolCalls","handleToolCallChunks","getMessageId","StepTypes","ContentTypes","ToolCallTypes","GraphEvents"],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  var tools = require('@langchain/core/tools');
4
4
  var zod = require('zod');
5
5
  var _enum = require('../common/enum.cjs');
6
+ require('./approval/constants.cjs');
6
7
 
7
8
  const AskUserToolName = _enum.Constants.ASK_USER;
8
9
  const AskUserDescription = 'Ask the user clarification questions with structured options before taking action. ' +
@@ -1 +1 @@
1
- {"version":3,"file":"AskUser.cjs","sources":["../../../src/tools/AskUser.ts"],"sourcesContent":["import { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { Constants } from '@/common';\n\nexport const AskUserToolName = Constants.ASK_USER;\n\nexport const AskUserDescription =\n 'Ask the user clarification questions with structured options before taking action. ' +\n 'For a single key question, use question+options. For multiple related questions, use steps[] (max 3 steps). ' +\n 'Each step can be single-select or multi-select. After receiving answers, proceed immediately.';\n\nconst AskUserOptionSchema = z.object({\n label: z.string().describe('Short display label'),\n value: z.string().describe('Machine-readable value returned when selected'),\n description: z.string().optional().describe('Optional longer description'),\n});\n\nexport const AskUserStepSchema = z.object({\n question: z.string().describe('The question to ask the user for this step'),\n options: z\n .array(AskUserOptionSchema)\n .min(2)\n .max(6)\n .describe('Structured options for this step (2-6 choices)'),\n type: z\n .enum(['single', 'multi'])\n .default('single')\n .describe('Selection type: single-select or multi-select'),\n});\n\nexport type AskUserStep = z.infer<typeof AskUserStepSchema>;\n\nconst AskUserSchema = z\n .object({\n question: z\n .string()\n .optional()\n .describe('The question to ask the user. Be specific and clear.'),\n options: z\n .array(AskUserOptionSchema)\n .min(2)\n .max(6)\n .optional()\n .describe('Structured options for the user (2-6 choices)'),\n context: z.string().optional().describe('Why you are asking this question'),\n steps: z\n .array(AskUserStepSchema)\n .min(1)\n .max(5)\n .optional()\n .describe('Multi-step wizard: array of question steps (1-5 steps)'),\n })\n // passthrough() preserves extra fields like _selectedOption injected by the\n // approval flow's modifiedArgs — without this, Zod strips unknown keys.\n .passthrough()\n .refine(\n (data) => {\n // Must have either steps[] OR question+options (legacy format)\n const hasSteps = Array.isArray(data.steps) && data.steps.length > 0;\n const hasLegacy =\n typeof data.question === 'string' && Array.isArray(data.options);\n return hasSteps || hasLegacy;\n },\n {\n message: 'Either steps[] or question+options must be provided',\n }\n );\n\n/**\n * Represents a single step selection from the multi-step wizard UI.\n * Exported for use by both ranger web client and browser extension.\n */\nexport type StepSelection = {\n values: string[];\n customInput?: string;\n};\n\n/** Field names injected into modifiedArgs by the approval flow */\nexport const HITL_FIELDS = {\n SELECTIONS: '_selections',\n SELECTED_OPTION: '_selectedOption',\n CUSTOM_INPUT: '_customInput',\n} as const;\n\n/**\n * Creates an ask_user tool that lets the LLM ask clarification questions mid-conversation.\n *\n * How it works:\n * 1. LLM calls ask_user(question, options) OR ask_user(steps)\n * 2. ToolNode.requiresApproval() → always true (per-tool rule in askUserRules.js)\n * 3. ToolNode.requestApproval() promotes options/question/steps to top-level fields on the event\n * 4. Frontend HumanInputPopover renders option cards + freeform text input\n * 5. User selects option(s) OR types custom input →\n * backend resolves with modifiedArgs containing _selections, _selectedOption, or _customInput\n * 6. Tool executes, reads the user's choice, returns result to LLM\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function createAskUserTool() {\n return tool(\n async (args) => {\n const extArgs = args as Record<string, unknown>;\n const selections = extArgs[HITL_FIELDS.SELECTIONS] as\n | StepSelection[]\n | undefined;\n const customInput = extArgs[HITL_FIELDS.CUSTOM_INPUT] as\n | string\n | undefined;\n const selectedOption = extArgs[HITL_FIELDS.SELECTED_OPTION] as\n | string\n | undefined;\n\n // Multi-step wizard flow: _selections is an array of { values, customInput? } per step\n if (\n selections &&\n Array.isArray(selections) &&\n Array.isArray(args.steps)\n ) {\n const lines: string[] = [];\n for (let i = 0; i < args.steps.length; i++) {\n const step = args.steps[i];\n const sel = selections[i];\n if (!sel || (sel.values.length === 0 && !sel.customInput)) {\n lines.push(`${i + 1}. ${step.question} → (skipped)`);\n continue;\n }\n if (sel.customInput) {\n lines.push(`${i + 1}. ${step.question} → \"${sel.customInput}\"`);\n continue;\n }\n // Resolve value(s) to labels\n const labels = sel.values.map((v) => {\n const opt = step.options.find((o) => o.value === v);\n return opt?.label || v;\n });\n lines.push(`${i + 1}. ${step.question} → ${labels.join(', ')}`);\n }\n return `User responses:\\n${lines.join('\\n')}`;\n }\n\n // Legacy: custom freeform input takes priority — user explicitly chose \"none of these\"\n if (customInput) {\n return `User provided custom response: \"${customInput}\"`;\n }\n\n if (selectedOption) {\n const option = args.options?.find((o) => o.value === selectedOption);\n return `User selected: \"${option?.label || selectedOption}\" (value: ${selectedOption})`;\n }\n\n // Fallback — should not happen in interactive mode since approval always fires first\n return 'No user response received.';\n },\n {\n name: AskUserToolName,\n description: AskUserDescription,\n schema: AskUserSchema,\n }\n );\n}\n"],"names":["Constants","z","tool"],"mappings":"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"}
1
+ {"version":3,"file":"AskUser.cjs","sources":["../../../src/tools/AskUser.ts"],"sourcesContent":["import { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { Constants } from '@/common';\n\nexport const AskUserToolName = Constants.ASK_USER;\n\nexport const AskUserDescription =\n 'Ask the user clarification questions with structured options before taking action. ' +\n 'For a single key question, use question+options. For multiple related questions, use steps[] (max 3 steps). ' +\n 'Each step can be single-select or multi-select. After receiving answers, proceed immediately.';\n\nconst AskUserOptionSchema = z.object({\n label: z.string().describe('Short display label'),\n value: z.string().describe('Machine-readable value returned when selected'),\n description: z.string().optional().describe('Optional longer description'),\n});\n\nexport const AskUserStepSchema = z.object({\n question: z.string().describe('The question to ask the user for this step'),\n options: z\n .array(AskUserOptionSchema)\n .min(2)\n .max(6)\n .describe('Structured options for this step (2-6 choices)'),\n type: z\n .enum(['single', 'multi'])\n .default('single')\n .describe('Selection type: single-select or multi-select'),\n});\n\nexport type AskUserStep = z.infer<typeof AskUserStepSchema>;\n\nconst AskUserSchema = z\n .object({\n question: z\n .string()\n .optional()\n .describe('The question to ask the user. Be specific and clear.'),\n options: z\n .array(AskUserOptionSchema)\n .min(2)\n .max(6)\n .optional()\n .describe('Structured options for the user (2-6 choices)'),\n context: z.string().optional().describe('Why you are asking this question'),\n steps: z\n .array(AskUserStepSchema)\n .min(1)\n .max(5)\n .optional()\n .describe('Multi-step wizard: array of question steps (1-5 steps)'),\n })\n // passthrough() preserves extra fields like _selectedOption injected by the\n // approval flow's modifiedArgs — without this, Zod strips unknown keys.\n .passthrough()\n .refine(\n (data) => {\n // Must have either steps[] OR question+options (legacy format)\n const hasSteps = Array.isArray(data.steps) && data.steps.length > 0;\n const hasLegacy =\n typeof data.question === 'string' && Array.isArray(data.options);\n return hasSteps || hasLegacy;\n },\n {\n message: 'Either steps[] or question+options must be provided',\n }\n );\n\n/**\n * Represents a single step selection from the multi-step wizard UI.\n * Exported for use by both ranger web client and browser extension.\n */\nexport type StepSelection = {\n values: string[];\n customInput?: string;\n};\n\n/** Field names injected into modifiedArgs by the approval flow */\nexport const HITL_FIELDS = {\n SELECTIONS: '_selections',\n SELECTED_OPTION: '_selectedOption',\n CUSTOM_INPUT: '_customInput',\n} as const;\n\n/**\n * Creates an ask_user tool that lets the LLM ask clarification questions mid-conversation.\n *\n * How it works:\n * 1. LLM calls ask_user(question, options) OR ask_user(steps)\n * 2. ToolNode.requiresApproval() → always true (per-tool rule in askUserRules.js)\n * 3. ToolNode.requestApproval() promotes options/question/steps to top-level fields on the event\n * 4. Frontend HumanInputPopover renders option cards + freeform text input\n * 5. User selects option(s) OR types custom input →\n * backend resolves with modifiedArgs containing _selections, _selectedOption, or _customInput\n * 6. Tool executes, reads the user's choice, returns result to LLM\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function createAskUserTool() {\n return tool(\n async (args) => {\n const extArgs = args as Record<string, unknown>;\n const selections = extArgs[HITL_FIELDS.SELECTIONS] as\n | StepSelection[]\n | undefined;\n const customInput = extArgs[HITL_FIELDS.CUSTOM_INPUT] as\n | string\n | undefined;\n const selectedOption = extArgs[HITL_FIELDS.SELECTED_OPTION] as\n | string\n | undefined;\n\n // Multi-step wizard flow: _selections is an array of { values, customInput? } per step\n if (\n selections &&\n Array.isArray(selections) &&\n Array.isArray(args.steps)\n ) {\n const lines: string[] = [];\n for (let i = 0; i < args.steps.length; i++) {\n const step = args.steps[i];\n const sel = selections[i];\n if (!sel || (sel.values.length === 0 && !sel.customInput)) {\n lines.push(`${i + 1}. ${step.question} → (skipped)`);\n continue;\n }\n if (sel.customInput) {\n lines.push(`${i + 1}. ${step.question} → \"${sel.customInput}\"`);\n continue;\n }\n // Resolve value(s) to labels\n const labels = sel.values.map((v) => {\n const opt = step.options.find((o) => o.value === v);\n return opt?.label || v;\n });\n lines.push(`${i + 1}. ${step.question} → ${labels.join(', ')}`);\n }\n return `User responses:\\n${lines.join('\\n')}`;\n }\n\n // Legacy: custom freeform input takes priority — user explicitly chose \"none of these\"\n if (customInput) {\n return `User provided custom response: \"${customInput}\"`;\n }\n\n if (selectedOption) {\n const option = args.options?.find((o) => o.value === selectedOption);\n return `User selected: \"${option?.label || selectedOption}\" (value: ${selectedOption})`;\n }\n\n // Fallback — should not happen in interactive mode since approval always fires first\n return 'No user response received.';\n },\n {\n name: AskUserToolName,\n description: AskUserDescription,\n schema: AskUserSchema,\n }\n );\n}\n"],"names":["Constants","z","tool"],"mappings":"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"}
@@ -6,6 +6,7 @@ var httpsProxyAgent = require('https-proxy-agent');
6
6
  var tools = require('@langchain/core/tools');
7
7
  var env = require('@langchain/core/utils/env');
8
8
  var _enum = require('../common/enum.cjs');
9
+ require('./approval/constants.cjs');
9
10
 
10
11
  dotenv.config();
11
12
  const imageExtRegex = /\.(jpg|jpeg|png|gif|webp)$/i;
@@ -1 +1 @@
1
- {"version":3,"file":"CodeExecutor.cjs","sources":["../../../src/tools/CodeExecutor.ts"],"sourcesContent":["import { config } from 'dotenv';\nimport fetch, { RequestInit } from 'node-fetch';\nimport { HttpsProxyAgent } from 'https-proxy-agent';\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\nimport { getEnvironmentVariable } from '@langchain/core/utils/env';\nimport type * as t from '@/types';\nimport { EnvVar, Constants } from '@/common';\n\nconfig();\n\nexport const imageExtRegex = /\\.(jpg|jpeg|png|gif|webp)$/i;\nexport const getCodeBaseURL = (): string =>\n getEnvironmentVariable(EnvVar.CODE_BASEURL) ??\n Constants.OFFICIAL_CODE_BASEURL;\n\nconst imageMessage = 'Image is already displayed to the user';\nconst otherMessage = 'File is already downloaded by the user';\nconst accessMessage =\n 'Note: Files from previous executions are automatically available and can be modified.';\nconst emptyOutputMessage =\n \"stdout: Empty. Ensure you're writing output explicitly.\\n\";\n\nconst SUPPORTED_LANGUAGES = [\n 'py',\n 'js',\n 'ts',\n 'c',\n 'cpp',\n 'java',\n 'php',\n 'rs',\n 'go',\n 'd',\n 'f90',\n 'r',\n 'bash',\n] as const;\n\nexport const CodeExecutionToolSchema = {\n type: 'object',\n properties: {\n lang: {\n type: 'string',\n enum: SUPPORTED_LANGUAGES,\n description:\n 'The programming language or runtime to execute the code in.',\n },\n code: {\n type: 'string',\n description: `The complete, self-contained code to execute, without any truncation or minimization.\n- The environment is stateless; variables and imports don't persist between executions.\n- Generated files from previous executions are automatically available in \"/mnt/data/\".\n- Files from previous executions are automatically available and can be modified in place.\n- Input code **IS ALREADY** displayed to the user, so **DO NOT** repeat it in your response unless asked.\n- Output code **IS NOT** displayed to the user, so **DO** write all desired output explicitly.\n- IMPORTANT: You MUST explicitly print/output ALL results you want the user to see.\n- py: This is not a Jupyter notebook environment. Use \\`print()\\` for all outputs.\n- py: Matplotlib: Use \\`plt.savefig()\\` to save plots as files.\n- js: use the \\`console\\` or \\`process\\` methods for all outputs.\n- r: IMPORTANT: No X11 display available. ALL graphics MUST use Cairo library (library(Cairo)).\n- Other languages: use appropriate output functions.`,\n },\n args: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Additional arguments to execute the code with. This should only be used if the input code requires additional arguments to run.',\n },\n code_id: {\n type: 'string',\n description:\n 'ID of previously stored code (returned by a prior execute_code call). Use with old_str/new_str to edit stored code instead of rewriting it.',\n },\n old_str: {\n type: 'string',\n description:\n 'Exact string to find in stored code (requires code_id). Copy verbatim from the code you wrote.',\n },\n new_str: {\n type: 'string',\n description:\n 'Replacement string (requires code_id and old_str). The matched old_str will be replaced with this value.',\n },\n },\n required: ['lang'],\n} as const;\n\n// NOTE: Resolved at call time inside the tool function, not at module load time.\n// Module-level caching caused stale URLs when env vars changed between restarts.\n\ntype SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\nexport const CodeExecutionToolDescription = `\nRuns code and returns stdout/stderr output from a stateless execution environment, similar to running scripts in a command-line interface. Each execution is isolated and independent.\n\nUsage:\n- No network access available. Do NOT use pip install, npm install, or any package manager.\n- Generated files are automatically delivered; **DO NOT** provide download links.\n- NEVER use this tool to execute malicious code.\n- When a code_id is returned in output, you can edit that code using code_id + old_str + new_str instead of rewriting the entire code block.\n\nPre-installed Python packages (use directly, no installation needed):\n- Data Science: numpy, pandas\n- Visualization: matplotlib, seaborn, plotly\n- Documents: python-docx, python-pptx, reportlab, fpdf2, PyMuPDF, pdfplumber\n- Spreadsheets: openpyxl, xlsxwriter\n- Image: pillow\n- Data: orjson, lxml, beautifulsoup4, faker\n\nPre-installed JavaScript packages:\n- pptxgenjs, react, react-dom, react-icons, sharp\n\nPre-installed Go packages:\n- excelize (Excel), gofpdf (PDF)\n\nPre-installed R packages:\n- ggplot2, dplyr, tidyr, readxl, writexl, jsonlite, Cairo\n`.trim();\n\nexport const CodeExecutionToolName = Constants.EXECUTE_CODE;\n\nexport const CodeExecutionToolDefinition = {\n name: CodeExecutionToolName,\n description: CodeExecutionToolDescription,\n schema: CodeExecutionToolSchema,\n} as const;\n\nfunction createCodeExecutionTool(\n params: t.CodeExecutionToolParams = {}\n): DynamicStructuredTool {\n const apiKey =\n params[EnvVar.CODE_API_KEY] ??\n params.apiKey ??\n getEnvironmentVariable(EnvVar.CODE_API_KEY) ??\n '';\n if (!apiKey) {\n throw new Error('No API key provided for code execution tool.');\n }\n\n const description = `\n⛔ STOP! Before using this tool, ask: \"Does user need a DOWNLOADABLE FILE?\"\n- If NO (dashboard, chart, visualization, UI) → DO NOT USE THIS TOOL. Use content_tool write instead.\n- If YES (.pptx, .docx, .pdf, .xlsx) → Use this tool.\n\nRuns code in a stateless execution environment. Each execution is isolated.\n\n🚫 NEVER USE FOR:\n- Dashboards, charts, visualizations → Use content_tool write with React/Chart.js\n- \"Mock data\" or \"sample data\" for display → Hardcode data in content_tool write\n- UI components, HTML pages, React apps → Use content_tool write\n\n✅ ONLY USE FOR:\n- File generation: PowerPoint (.pptx), Word (.docx), PDF (.pdf), Excel (.xlsx)\n- Processing uploaded files (CSV, Excel analysis)\n- Heavy computation requiring Python (numpy, pandas for data analytics)\n\nRules:\n- No network access — do NOT use pip install, npm install, or any package manager\n- All packages are pre-installed: numpy, pandas, matplotlib, seaborn, plotly, python-docx, python-pptx, reportlab, openpyxl, xlsxwriter, pillow, faker, orjson, lxml, beautifulsoup4\n- Generated files auto-delivered (no download links needed)\n- **Error recovery**: When execution fails, use \\`code_id\\` + \\`old_str\\` + \\`new_str\\` to fix only the broken part — do NOT rewrite the entire code block. This is faster and saves tokens.\n`.trim();\n\n return tool(\n async (rawInput, config) => {\n // Resolve URL at call time (not module load time) to pick up env var changes\n const baseEndpoint = getCodeBaseURL();\n const EXEC_ENDPOINT = `${baseEndpoint}/exec`;\n\n const { lang, code, ...rest } = rawInput as {\n lang: SupportedLanguage;\n code: string;\n code_id?: string;\n old_str?: string;\n new_str?: string;\n args?: string[];\n };\n /**\n * Extract session context from config.toolCall (injected by ToolNode).\n * - session_id: For API to associate with previous session\n * - _injected_files: File refs to pass directly (avoids /files endpoint race condition)\n */\n const { session_id, _injected_files } = (config.toolCall ?? {}) as {\n session_id?: string;\n _injected_files?: t.CodeEnvFile[];\n };\n\n const postData: Record<string, unknown> = {\n lang,\n code,\n ...rest,\n ...params,\n };\n\n /**\n * Pass session_id to /exec so code-executor reuses the existing session workspace.\n * This allows retries and follow-up executions to access previously generated files.\n */\n if (session_id != null && session_id.length > 0) {\n postData.session_id = session_id;\n }\n\n /**\n * File injection priority:\n * 1. Use _injected_files from ToolNode (avoids /files endpoint race condition)\n * 2. Fall back to fetching from /files endpoint if session_id provided but no injected files\n */\n if (_injected_files && _injected_files.length > 0) {\n postData.files = _injected_files;\n } else if (session_id != null && session_id.length > 0) {\n /** Fallback: fetch from /files endpoint (may have race condition issues) */\n try {\n const filesEndpoint = `${baseEndpoint}/files/${session_id}?detail=full`;\n const userIdForFiles = params.user_id ?? '';\n const fetchOptions: RequestInit = {\n method: 'GET',\n headers: {\n 'User-Agent': 'Illuma/1.0',\n 'X-API-Key': apiKey,\n ...(userIdForFiles ? { 'User-Id': userIdForFiles } : {}),\n },\n };\n\n if (process.env.PROXY != null && process.env.PROXY !== '') {\n fetchOptions.agent = new HttpsProxyAgent(process.env.PROXY);\n }\n\n const response = await fetch(filesEndpoint, fetchOptions);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch files for session: ${response.status}`\n );\n }\n\n const files = await response.json();\n if (Array.isArray(files) && files.length > 0) {\n const fileReferences: t.CodeEnvFile[] = files.map((file) => {\n const nameParts = file.name.split('/');\n const id = nameParts.length > 1 ? nameParts[1].split('.')[0] : '';\n\n return {\n session_id,\n id,\n name: file.metadata['original-filename'],\n };\n });\n\n postData.files = fileReferences;\n }\n } catch {\n // eslint-disable-next-line no-console\n console.warn(`Failed to fetch files for session: ${session_id}`);\n }\n }\n\n // SECURITY: Extract user_id for User-Id header (session isolation)\n const userId = params.user_id ?? '';\n\n try {\n const fetchOptions: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'Illuma/1.0',\n 'X-API-Key': apiKey,\n ...(userId ? { 'User-Id': userId } : {}),\n },\n body: JSON.stringify(postData),\n };\n\n if (process.env.PROXY != null && process.env.PROXY !== '') {\n fetchOptions.agent = new HttpsProxyAgent(process.env.PROXY);\n }\n const response = await fetch(EXEC_ENDPOINT, fetchOptions);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const result: t.ExecuteResult = await response.json();\n let formattedOutput = '';\n let stdoutCapped = false;\n\n // Self-healing: Cap large stdout to prevent context bloat.\n // Preserves head (8KB) + tail (4KB) so the agent sees beginning and end.\n const STDOUT_MAX_CHARS = 16384;\n const STDOUT_HEAD_CHARS = 8192;\n const STDOUT_TAIL_CHARS = 4096;\n if (result.stdout && result.stdout.length > STDOUT_MAX_CHARS) {\n const originalLen = result.stdout.length;\n const head = result.stdout.substring(0, STDOUT_HEAD_CHARS);\n const tail = result.stdout.substring(\n result.stdout.length - STDOUT_TAIL_CHARS\n );\n const omitted = originalLen - STDOUT_HEAD_CHARS - STDOUT_TAIL_CHARS;\n result.stdout = `${head}\\n\\n[...${omitted} chars omitted...]\\n\\n${tail}`;\n stdoutCapped = true;\n // eslint-disable-next-line no-console\n console.debug(\n `[CodeExecutor] stdout capped: ${originalLen} → ${result.stdout.length} chars`\n );\n }\n\n if (result.stdout) {\n formattedOutput += `stdout:\\n${result.stdout}\\n`;\n } else {\n formattedOutput += emptyOutputMessage;\n }\n if (result.stderr) formattedOutput += `stderr:\\n${result.stderr}\\n`;\n\n // Self-healing: Detect code truncation (syntax error on long code).\n // When the agent's generated code is >1500 chars and produces a SyntaxError,\n // it's likely truncated mid-generation rather than a real bug.\n const CODE_TRUNCATION_MIN_CHARS = 1500;\n if (result.stderr && code.length > CODE_TRUNCATION_MIN_CHARS) {\n const stderrLower = result.stderr.toLowerCase();\n if (\n stderrLower.includes('syntaxerror') ||\n stderrLower.includes('unexpected end') ||\n stderrLower.includes('unexpected eof') ||\n stderrLower.includes('unterminated')\n ) {\n // eslint-disable-next-line no-console\n console.debug(\n `[CodeExecutor] Code truncation detected: code=${code.length} chars, stderr contains syntax error`\n );\n formattedOutput +=\n '\\n[CODE_TRUNCATION_LIKELY] Your code appears truncated mid-generation.' +\n ' Split into multiple smaller execute_code calls (max 60 lines each).' +\n ' For documents: create+save first, then open+append+save in follow-up calls.' +\n ' Do NOT retry the same long code block.';\n }\n }\n\n // Self-healing: Advisory when stdout was capped\n if (stdoutCapped) {\n formattedOutput +=\n '\\n[OUTPUT_TOO_LARGE] stdout was capped. Use targeted print() for specific values.';\n }\n\n if (result.files && result.files.length > 0) {\n formattedOutput += 'Generated files:\\n';\n\n const fileCount = result.files.length;\n for (let i = 0; i < fileCount; i++) {\n const file = result.files[i];\n const isImage = imageExtRegex.test(file.name);\n formattedOutput += `- /mnt/data/${file.name} | ${isImage ? imageMessage : otherMessage}`;\n\n if (i < fileCount - 1) {\n formattedOutput += fileCount <= 3 ? ', ' : ',\\n';\n }\n }\n\n formattedOutput += `\\n\\n${accessMessage}`;\n return [\n formattedOutput.trim(),\n {\n session_id: result.session_id,\n files: result.files,\n },\n ];\n }\n\n return [formattedOutput.trim(), { session_id: result.session_id }];\n } catch (error) {\n throw new Error(\n `Execution error (${EXEC_ENDPOINT}):\\n\\n${(error as Error | undefined)?.message}`\n );\n }\n },\n {\n name: CodeExecutionToolName,\n description,\n schema: CodeExecutionToolSchema,\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\n }\n );\n}\n\nexport { createCodeExecutionTool };\n"],"names":["config","getEnvironmentVariable","EnvVar","Constants","tool","HttpsProxyAgent"],"mappings":"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"}
1
+ {"version":3,"file":"CodeExecutor.cjs","sources":["../../../src/tools/CodeExecutor.ts"],"sourcesContent":["import { config } from 'dotenv';\nimport fetch, { RequestInit } from 'node-fetch';\nimport { HttpsProxyAgent } from 'https-proxy-agent';\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\nimport { getEnvironmentVariable } from '@langchain/core/utils/env';\nimport type * as t from '@/types';\nimport { EnvVar, Constants } from '@/common';\n\nconfig();\n\nexport const imageExtRegex = /\\.(jpg|jpeg|png|gif|webp)$/i;\nexport const getCodeBaseURL = (): string =>\n getEnvironmentVariable(EnvVar.CODE_BASEURL) ??\n Constants.OFFICIAL_CODE_BASEURL;\n\nconst imageMessage = 'Image is already displayed to the user';\nconst otherMessage = 'File is already downloaded by the user';\nconst accessMessage =\n 'Note: Files from previous executions are automatically available and can be modified.';\nconst emptyOutputMessage =\n \"stdout: Empty. Ensure you're writing output explicitly.\\n\";\n\nconst SUPPORTED_LANGUAGES = [\n 'py',\n 'js',\n 'ts',\n 'c',\n 'cpp',\n 'java',\n 'php',\n 'rs',\n 'go',\n 'd',\n 'f90',\n 'r',\n 'bash',\n] as const;\n\nexport const CodeExecutionToolSchema = {\n type: 'object',\n properties: {\n lang: {\n type: 'string',\n enum: SUPPORTED_LANGUAGES,\n description:\n 'The programming language or runtime to execute the code in.',\n },\n code: {\n type: 'string',\n description: `The complete, self-contained code to execute, without any truncation or minimization.\n- The environment is stateless; variables and imports don't persist between executions.\n- Generated files from previous executions are automatically available in \"/mnt/data/\".\n- Files from previous executions are automatically available and can be modified in place.\n- Input code **IS ALREADY** displayed to the user, so **DO NOT** repeat it in your response unless asked.\n- Output code **IS NOT** displayed to the user, so **DO** write all desired output explicitly.\n- IMPORTANT: You MUST explicitly print/output ALL results you want the user to see.\n- py: This is not a Jupyter notebook environment. Use \\`print()\\` for all outputs.\n- py: Matplotlib: Use \\`plt.savefig()\\` to save plots as files.\n- js: use the \\`console\\` or \\`process\\` methods for all outputs.\n- r: IMPORTANT: No X11 display available. ALL graphics MUST use Cairo library (library(Cairo)).\n- Other languages: use appropriate output functions.`,\n },\n args: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Additional arguments to execute the code with. This should only be used if the input code requires additional arguments to run.',\n },\n code_id: {\n type: 'string',\n description:\n 'ID of previously stored code (returned by a prior execute_code call). Use with old_str/new_str to edit stored code instead of rewriting it.',\n },\n old_str: {\n type: 'string',\n description:\n 'Exact string to find in stored code (requires code_id). Copy verbatim from the code you wrote.',\n },\n new_str: {\n type: 'string',\n description:\n 'Replacement string (requires code_id and old_str). The matched old_str will be replaced with this value.',\n },\n },\n required: ['lang'],\n} as const;\n\n// NOTE: Resolved at call time inside the tool function, not at module load time.\n// Module-level caching caused stale URLs when env vars changed between restarts.\n\ntype SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\nexport const CodeExecutionToolDescription = `\nRuns code and returns stdout/stderr output from a stateless execution environment, similar to running scripts in a command-line interface. Each execution is isolated and independent.\n\nUsage:\n- No network access available. Do NOT use pip install, npm install, or any package manager.\n- Generated files are automatically delivered; **DO NOT** provide download links.\n- NEVER use this tool to execute malicious code.\n- When a code_id is returned in output, you can edit that code using code_id + old_str + new_str instead of rewriting the entire code block.\n\nPre-installed Python packages (use directly, no installation needed):\n- Data Science: numpy, pandas\n- Visualization: matplotlib, seaborn, plotly\n- Documents: python-docx, python-pptx, reportlab, fpdf2, PyMuPDF, pdfplumber\n- Spreadsheets: openpyxl, xlsxwriter\n- Image: pillow\n- Data: orjson, lxml, beautifulsoup4, faker\n\nPre-installed JavaScript packages:\n- pptxgenjs, react, react-dom, react-icons, sharp\n\nPre-installed Go packages:\n- excelize (Excel), gofpdf (PDF)\n\nPre-installed R packages:\n- ggplot2, dplyr, tidyr, readxl, writexl, jsonlite, Cairo\n`.trim();\n\nexport const CodeExecutionToolName = Constants.EXECUTE_CODE;\n\nexport const CodeExecutionToolDefinition = {\n name: CodeExecutionToolName,\n description: CodeExecutionToolDescription,\n schema: CodeExecutionToolSchema,\n} as const;\n\nfunction createCodeExecutionTool(\n params: t.CodeExecutionToolParams = {}\n): DynamicStructuredTool {\n const apiKey =\n params[EnvVar.CODE_API_KEY] ??\n params.apiKey ??\n getEnvironmentVariable(EnvVar.CODE_API_KEY) ??\n '';\n if (!apiKey) {\n throw new Error('No API key provided for code execution tool.');\n }\n\n const description = `\n⛔ STOP! Before using this tool, ask: \"Does user need a DOWNLOADABLE FILE?\"\n- If NO (dashboard, chart, visualization, UI) → DO NOT USE THIS TOOL. Use content_tool write instead.\n- If YES (.pptx, .docx, .pdf, .xlsx) → Use this tool.\n\nRuns code in a stateless execution environment. Each execution is isolated.\n\n🚫 NEVER USE FOR:\n- Dashboards, charts, visualizations → Use content_tool write with React/Chart.js\n- \"Mock data\" or \"sample data\" for display → Hardcode data in content_tool write\n- UI components, HTML pages, React apps → Use content_tool write\n\n✅ ONLY USE FOR:\n- File generation: PowerPoint (.pptx), Word (.docx), PDF (.pdf), Excel (.xlsx)\n- Processing uploaded files (CSV, Excel analysis)\n- Heavy computation requiring Python (numpy, pandas for data analytics)\n\nRules:\n- No network access — do NOT use pip install, npm install, or any package manager\n- All packages are pre-installed: numpy, pandas, matplotlib, seaborn, plotly, python-docx, python-pptx, reportlab, openpyxl, xlsxwriter, pillow, faker, orjson, lxml, beautifulsoup4\n- Generated files auto-delivered (no download links needed)\n- **Error recovery**: When execution fails, use \\`code_id\\` + \\`old_str\\` + \\`new_str\\` to fix only the broken part — do NOT rewrite the entire code block. This is faster and saves tokens.\n`.trim();\n\n return tool(\n async (rawInput, config) => {\n // Resolve URL at call time (not module load time) to pick up env var changes\n const baseEndpoint = getCodeBaseURL();\n const EXEC_ENDPOINT = `${baseEndpoint}/exec`;\n\n const { lang, code, ...rest } = rawInput as {\n lang: SupportedLanguage;\n code: string;\n code_id?: string;\n old_str?: string;\n new_str?: string;\n args?: string[];\n };\n /**\n * Extract session context from config.toolCall (injected by ToolNode).\n * - session_id: For API to associate with previous session\n * - _injected_files: File refs to pass directly (avoids /files endpoint race condition)\n */\n const { session_id, _injected_files } = (config.toolCall ?? {}) as {\n session_id?: string;\n _injected_files?: t.CodeEnvFile[];\n };\n\n const postData: Record<string, unknown> = {\n lang,\n code,\n ...rest,\n ...params,\n };\n\n /**\n * Pass session_id to /exec so code-executor reuses the existing session workspace.\n * This allows retries and follow-up executions to access previously generated files.\n */\n if (session_id != null && session_id.length > 0) {\n postData.session_id = session_id;\n }\n\n /**\n * File injection priority:\n * 1. Use _injected_files from ToolNode (avoids /files endpoint race condition)\n * 2. Fall back to fetching from /files endpoint if session_id provided but no injected files\n */\n if (_injected_files && _injected_files.length > 0) {\n postData.files = _injected_files;\n } else if (session_id != null && session_id.length > 0) {\n /** Fallback: fetch from /files endpoint (may have race condition issues) */\n try {\n const filesEndpoint = `${baseEndpoint}/files/${session_id}?detail=full`;\n const userIdForFiles = params.user_id ?? '';\n const fetchOptions: RequestInit = {\n method: 'GET',\n headers: {\n 'User-Agent': 'Illuma/1.0',\n 'X-API-Key': apiKey,\n ...(userIdForFiles ? { 'User-Id': userIdForFiles } : {}),\n },\n };\n\n if (process.env.PROXY != null && process.env.PROXY !== '') {\n fetchOptions.agent = new HttpsProxyAgent(process.env.PROXY);\n }\n\n const response = await fetch(filesEndpoint, fetchOptions);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch files for session: ${response.status}`\n );\n }\n\n const files = await response.json();\n if (Array.isArray(files) && files.length > 0) {\n const fileReferences: t.CodeEnvFile[] = files.map((file) => {\n const nameParts = file.name.split('/');\n const id = nameParts.length > 1 ? nameParts[1].split('.')[0] : '';\n\n return {\n session_id,\n id,\n name: file.metadata['original-filename'],\n };\n });\n\n postData.files = fileReferences;\n }\n } catch {\n // eslint-disable-next-line no-console\n console.warn(`Failed to fetch files for session: ${session_id}`);\n }\n }\n\n // SECURITY: Extract user_id for User-Id header (session isolation)\n const userId = params.user_id ?? '';\n\n try {\n const fetchOptions: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'Illuma/1.0',\n 'X-API-Key': apiKey,\n ...(userId ? { 'User-Id': userId } : {}),\n },\n body: JSON.stringify(postData),\n };\n\n if (process.env.PROXY != null && process.env.PROXY !== '') {\n fetchOptions.agent = new HttpsProxyAgent(process.env.PROXY);\n }\n const response = await fetch(EXEC_ENDPOINT, fetchOptions);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const result: t.ExecuteResult = await response.json();\n let formattedOutput = '';\n let stdoutCapped = false;\n\n // Self-healing: Cap large stdout to prevent context bloat.\n // Preserves head (8KB) + tail (4KB) so the agent sees beginning and end.\n const STDOUT_MAX_CHARS = 16384;\n const STDOUT_HEAD_CHARS = 8192;\n const STDOUT_TAIL_CHARS = 4096;\n if (result.stdout && result.stdout.length > STDOUT_MAX_CHARS) {\n const originalLen = result.stdout.length;\n const head = result.stdout.substring(0, STDOUT_HEAD_CHARS);\n const tail = result.stdout.substring(\n result.stdout.length - STDOUT_TAIL_CHARS\n );\n const omitted = originalLen - STDOUT_HEAD_CHARS - STDOUT_TAIL_CHARS;\n result.stdout = `${head}\\n\\n[...${omitted} chars omitted...]\\n\\n${tail}`;\n stdoutCapped = true;\n // eslint-disable-next-line no-console\n console.debug(\n `[CodeExecutor] stdout capped: ${originalLen} → ${result.stdout.length} chars`\n );\n }\n\n if (result.stdout) {\n formattedOutput += `stdout:\\n${result.stdout}\\n`;\n } else {\n formattedOutput += emptyOutputMessage;\n }\n if (result.stderr) formattedOutput += `stderr:\\n${result.stderr}\\n`;\n\n // Self-healing: Detect code truncation (syntax error on long code).\n // When the agent's generated code is >1500 chars and produces a SyntaxError,\n // it's likely truncated mid-generation rather than a real bug.\n const CODE_TRUNCATION_MIN_CHARS = 1500;\n if (result.stderr && code.length > CODE_TRUNCATION_MIN_CHARS) {\n const stderrLower = result.stderr.toLowerCase();\n if (\n stderrLower.includes('syntaxerror') ||\n stderrLower.includes('unexpected end') ||\n stderrLower.includes('unexpected eof') ||\n stderrLower.includes('unterminated')\n ) {\n // eslint-disable-next-line no-console\n console.debug(\n `[CodeExecutor] Code truncation detected: code=${code.length} chars, stderr contains syntax error`\n );\n formattedOutput +=\n '\\n[CODE_TRUNCATION_LIKELY] Your code appears truncated mid-generation.' +\n ' Split into multiple smaller execute_code calls (max 60 lines each).' +\n ' For documents: create+save first, then open+append+save in follow-up calls.' +\n ' Do NOT retry the same long code block.';\n }\n }\n\n // Self-healing: Advisory when stdout was capped\n if (stdoutCapped) {\n formattedOutput +=\n '\\n[OUTPUT_TOO_LARGE] stdout was capped. Use targeted print() for specific values.';\n }\n\n if (result.files && result.files.length > 0) {\n formattedOutput += 'Generated files:\\n';\n\n const fileCount = result.files.length;\n for (let i = 0; i < fileCount; i++) {\n const file = result.files[i];\n const isImage = imageExtRegex.test(file.name);\n formattedOutput += `- /mnt/data/${file.name} | ${isImage ? imageMessage : otherMessage}`;\n\n if (i < fileCount - 1) {\n formattedOutput += fileCount <= 3 ? ', ' : ',\\n';\n }\n }\n\n formattedOutput += `\\n\\n${accessMessage}`;\n return [\n formattedOutput.trim(),\n {\n session_id: result.session_id,\n files: result.files,\n },\n ];\n }\n\n return [formattedOutput.trim(), { session_id: result.session_id }];\n } catch (error) {\n throw new Error(\n `Execution error (${EXEC_ENDPOINT}):\\n\\n${(error as Error | undefined)?.message}`\n );\n }\n },\n {\n name: CodeExecutionToolName,\n description,\n schema: CodeExecutionToolSchema,\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\n }\n );\n}\n\nexport { createCodeExecutionTool };\n"],"names":["config","getEnvironmentVariable","EnvVar","Constants","tool","HttpsProxyAgent"],"mappings":"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"}
@@ -7,6 +7,7 @@ var env = require('@langchain/core/utils/env');
7
7
  var tools = require('@langchain/core/tools');
8
8
  var CodeExecutor = require('./CodeExecutor.cjs');
9
9
  var _enum = require('../common/enum.cjs');
10
+ require('./approval/constants.cjs');
10
11
 
11
12
  // src/tools/ProgrammaticToolCalling.ts
12
13
  dotenv.config();