@framers/agentos 0.1.112 → 0.1.114

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 (552) hide show
  1. package/README.md +39 -5
  2. package/dist/api/AgentOS.d.ts +45 -12
  3. package/dist/api/AgentOS.d.ts.map +1 -1
  4. package/dist/api/AgentOS.js +225 -78
  5. package/dist/api/AgentOS.js.map +1 -1
  6. package/dist/api/AgentOSOrchestrator.d.ts +8 -0
  7. package/dist/api/AgentOSOrchestrator.d.ts.map +1 -1
  8. package/dist/api/AgentOSOrchestrator.js +350 -59
  9. package/dist/api/AgentOSOrchestrator.js.map +1 -1
  10. package/dist/api/StreamChunkEmitter.d.ts.map +1 -1
  11. package/dist/api/StreamChunkEmitter.js +2 -0
  12. package/dist/api/StreamChunkEmitter.js.map +1 -1
  13. package/dist/api/agency.d.ts.map +1 -1
  14. package/dist/api/agency.js +47 -1
  15. package/dist/api/agency.js.map +1 -1
  16. package/dist/api/agent.d.ts +18 -5
  17. package/dist/api/agent.d.ts.map +1 -1
  18. package/dist/api/agent.js +48 -9
  19. package/dist/api/agent.js.map +1 -1
  20. package/dist/api/agentExport.d.ts +202 -0
  21. package/dist/api/agentExport.d.ts.map +1 -0
  22. package/dist/api/agentExport.js +323 -0
  23. package/dist/api/agentExport.js.map +1 -0
  24. package/dist/api/editImage.d.ts +119 -0
  25. package/dist/api/editImage.d.ts.map +1 -0
  26. package/dist/api/editImage.js +150 -0
  27. package/dist/api/editImage.js.map +1 -0
  28. package/dist/api/embedText.d.ts +137 -0
  29. package/dist/api/embedText.d.ts.map +1 -0
  30. package/dist/api/embedText.js +229 -0
  31. package/dist/api/embedText.js.map +1 -0
  32. package/dist/api/externalToolRegistry.d.ts +44 -0
  33. package/dist/api/externalToolRegistry.d.ts.map +1 -0
  34. package/dist/api/externalToolRegistry.js +245 -0
  35. package/dist/api/externalToolRegistry.js.map +1 -0
  36. package/dist/api/generateImage.d.ts +1 -1
  37. package/dist/api/generateImage.d.ts.map +1 -1
  38. package/dist/api/generateImage.js +17 -13
  39. package/dist/api/generateImage.js.map +1 -1
  40. package/dist/api/generateObject.d.ts +185 -0
  41. package/dist/api/generateObject.d.ts.map +1 -0
  42. package/dist/api/generateObject.js +249 -0
  43. package/dist/api/generateObject.js.map +1 -0
  44. package/dist/api/generateText.d.ts +13 -3
  45. package/dist/api/generateText.d.ts.map +1 -1
  46. package/dist/api/generateText.js +20 -5
  47. package/dist/api/generateText.js.map +1 -1
  48. package/dist/api/interfaces/IAgentOS.d.ts +29 -1
  49. package/dist/api/interfaces/IAgentOS.d.ts.map +1 -1
  50. package/dist/api/model.d.ts +7 -7
  51. package/dist/api/model.d.ts.map +1 -1
  52. package/dist/api/model.js +22 -16
  53. package/dist/api/model.js.map +1 -1
  54. package/dist/api/processRequestWithExternalTools.d.ts +26 -0
  55. package/dist/api/processRequestWithExternalTools.d.ts.map +1 -0
  56. package/dist/api/processRequestWithExternalTools.js +52 -0
  57. package/dist/api/processRequestWithExternalTools.js.map +1 -0
  58. package/dist/api/processRequestWithRegisteredTools.d.ts +56 -0
  59. package/dist/api/processRequestWithRegisteredTools.d.ts.map +1 -0
  60. package/dist/api/processRequestWithRegisteredTools.js +125 -0
  61. package/dist/api/processRequestWithRegisteredTools.js.map +1 -0
  62. package/dist/api/provider-defaults.d.ts.map +1 -1
  63. package/dist/api/provider-defaults.js +28 -0
  64. package/dist/api/provider-defaults.js.map +1 -1
  65. package/dist/api/resumeExternalToolRequestWithRegisteredTools.d.ts +71 -0
  66. package/dist/api/resumeExternalToolRequestWithRegisteredTools.d.ts.map +1 -0
  67. package/dist/api/resumeExternalToolRequestWithRegisteredTools.js +159 -0
  68. package/dist/api/resumeExternalToolRequestWithRegisteredTools.js.map +1 -0
  69. package/dist/api/strategies/agentGraphBuilder.d.ts +170 -0
  70. package/dist/api/strategies/agentGraphBuilder.d.ts.map +1 -0
  71. package/dist/api/strategies/agentGraphBuilder.js +299 -0
  72. package/dist/api/strategies/agentGraphBuilder.js.map +1 -0
  73. package/dist/api/strategies/debate.d.ts +12 -1
  74. package/dist/api/strategies/debate.d.ts.map +1 -1
  75. package/dist/api/strategies/debate.js +41 -5
  76. package/dist/api/strategies/debate.js.map +1 -1
  77. package/dist/api/strategies/graphCompiler.d.ts +84 -0
  78. package/dist/api/strategies/graphCompiler.d.ts.map +1 -0
  79. package/dist/api/strategies/graphCompiler.js +617 -0
  80. package/dist/api/strategies/graphCompiler.js.map +1 -0
  81. package/dist/api/strategies/hierarchical.d.ts +15 -1
  82. package/dist/api/strategies/hierarchical.d.ts.map +1 -1
  83. package/dist/api/strategies/hierarchical.js +53 -8
  84. package/dist/api/strategies/hierarchical.js.map +1 -1
  85. package/dist/api/strategies/index.d.ts +29 -4
  86. package/dist/api/strategies/index.d.ts.map +1 -1
  87. package/dist/api/strategies/index.js +28 -4
  88. package/dist/api/strategies/index.js.map +1 -1
  89. package/dist/api/strategies/parallel.d.ts +15 -4
  90. package/dist/api/strategies/parallel.d.ts.map +1 -1
  91. package/dist/api/strategies/parallel.js +53 -16
  92. package/dist/api/strategies/parallel.js.map +1 -1
  93. package/dist/api/strategies/review-loop.d.ts +15 -1
  94. package/dist/api/strategies/review-loop.d.ts.map +1 -1
  95. package/dist/api/strategies/review-loop.js +36 -10
  96. package/dist/api/strategies/review-loop.js.map +1 -1
  97. package/dist/api/strategies/sequential.d.ts +11 -1
  98. package/dist/api/strategies/sequential.d.ts.map +1 -1
  99. package/dist/api/strategies/sequential.js +39 -8
  100. package/dist/api/strategies/sequential.js.map +1 -1
  101. package/dist/api/strategies/shared.d.ts +72 -8
  102. package/dist/api/strategies/shared.d.ts.map +1 -1
  103. package/dist/api/strategies/shared.js +92 -12
  104. package/dist/api/strategies/shared.js.map +1 -1
  105. package/dist/api/streamObject.d.ts +166 -0
  106. package/dist/api/streamObject.d.ts.map +1 -0
  107. package/dist/api/streamObject.js +268 -0
  108. package/dist/api/streamObject.js.map +1 -0
  109. package/dist/api/streamText.d.ts +1 -1
  110. package/dist/api/streamText.d.ts.map +1 -1
  111. package/dist/api/streamText.js +26 -8
  112. package/dist/api/streamText.js.map +1 -1
  113. package/dist/api/toolAdapter.d.ts +44 -8
  114. package/dist/api/toolAdapter.d.ts.map +1 -1
  115. package/dist/api/toolAdapter.js +224 -45
  116. package/dist/api/toolAdapter.js.map +1 -1
  117. package/dist/api/types/AgentOSExternalToolRequest.d.ts +35 -0
  118. package/dist/api/types/AgentOSExternalToolRequest.d.ts.map +1 -0
  119. package/dist/api/types/AgentOSExternalToolRequest.js +2 -0
  120. package/dist/api/types/AgentOSExternalToolRequest.js.map +1 -0
  121. package/dist/api/types/AgentOSResponse.d.ts +25 -0
  122. package/dist/api/types/AgentOSResponse.d.ts.map +1 -1
  123. package/dist/api/types/AgentOSResponse.js +20 -0
  124. package/dist/api/types/AgentOSResponse.js.map +1 -1
  125. package/dist/api/types/AgentOSToolResult.d.ts +11 -0
  126. package/dist/api/types/AgentOSToolResult.d.ts.map +1 -0
  127. package/dist/api/types/AgentOSToolResult.js +2 -0
  128. package/dist/api/types/AgentOSToolResult.js.map +1 -0
  129. package/dist/api/types.d.ts +81 -4
  130. package/dist/api/types.d.ts.map +1 -1
  131. package/dist/api/types.js.map +1 -1
  132. package/dist/api/upscaleImage.d.ts +92 -0
  133. package/dist/api/upscaleImage.d.ts.map +1 -0
  134. package/dist/api/upscaleImage.js +133 -0
  135. package/dist/api/upscaleImage.js.map +1 -0
  136. package/dist/api/variateImage.d.ts +102 -0
  137. package/dist/api/variateImage.d.ts.map +1 -0
  138. package/dist/api/variateImage.js +154 -0
  139. package/dist/api/variateImage.js.map +1 -0
  140. package/dist/cognitive_substrate/GMI.d.ts +16 -2
  141. package/dist/cognitive_substrate/GMI.d.ts.map +1 -1
  142. package/dist/cognitive_substrate/GMI.js +188 -56
  143. package/dist/cognitive_substrate/GMI.js.map +1 -1
  144. package/dist/cognitive_substrate/IGMI.d.ts +10 -0
  145. package/dist/cognitive_substrate/IGMI.d.ts.map +1 -1
  146. package/dist/cognitive_substrate/IGMI.js.map +1 -1
  147. package/dist/config/AgentOSConfig.d.ts +19 -2
  148. package/dist/config/AgentOSConfig.d.ts.map +1 -1
  149. package/dist/config/AgentOSConfig.js +46 -29
  150. package/dist/config/AgentOSConfig.js.map +1 -1
  151. package/dist/core/guardrails/IGuardrailService.d.ts +1 -1
  152. package/dist/core/images/IImageProvider.d.ts +93 -0
  153. package/dist/core/images/IImageProvider.d.ts.map +1 -1
  154. package/dist/core/images/IImageProvider.js.map +1 -1
  155. package/dist/core/images/ImageOperationError.d.ts +52 -0
  156. package/dist/core/images/ImageOperationError.d.ts.map +1 -0
  157. package/dist/core/images/ImageOperationError.js +58 -0
  158. package/dist/core/images/ImageOperationError.js.map +1 -0
  159. package/dist/core/images/imageToBuffer.d.ts +41 -0
  160. package/dist/core/images/imageToBuffer.d.ts.map +1 -0
  161. package/dist/core/images/imageToBuffer.js +95 -0
  162. package/dist/core/images/imageToBuffer.js.map +1 -0
  163. package/dist/core/images/index.d.ts +4 -0
  164. package/dist/core/images/index.d.ts.map +1 -1
  165. package/dist/core/images/index.js +8 -0
  166. package/dist/core/images/index.js.map +1 -1
  167. package/dist/core/images/providers/FalImageProvider.d.ts +208 -0
  168. package/dist/core/images/providers/FalImageProvider.d.ts.map +1 -0
  169. package/dist/core/images/providers/FalImageProvider.js +301 -0
  170. package/dist/core/images/providers/FalImageProvider.js.map +1 -0
  171. package/dist/core/images/providers/FluxImageProvider.d.ts +197 -0
  172. package/dist/core/images/providers/FluxImageProvider.d.ts.map +1 -0
  173. package/dist/core/images/providers/FluxImageProvider.js +271 -0
  174. package/dist/core/images/providers/FluxImageProvider.js.map +1 -0
  175. package/dist/core/images/providers/OpenAIImageProvider.d.ts +33 -1
  176. package/dist/core/images/providers/OpenAIImageProvider.d.ts.map +1 -1
  177. package/dist/core/images/providers/OpenAIImageProvider.js +125 -0
  178. package/dist/core/images/providers/OpenAIImageProvider.js.map +1 -1
  179. package/dist/core/images/providers/ReplicateImageProvider.d.ts +26 -1
  180. package/dist/core/images/providers/ReplicateImageProvider.d.ts.map +1 -1
  181. package/dist/core/images/providers/ReplicateImageProvider.js +118 -0
  182. package/dist/core/images/providers/ReplicateImageProvider.js.map +1 -1
  183. package/dist/core/images/providers/StabilityImageProvider.d.ts +41 -1
  184. package/dist/core/images/providers/StabilityImageProvider.d.ts.map +1 -1
  185. package/dist/core/images/providers/StabilityImageProvider.js +180 -7
  186. package/dist/core/images/providers/StabilityImageProvider.js.map +1 -1
  187. package/dist/core/images/providers/StableDiffusionLocalProvider.d.ts +29 -1
  188. package/dist/core/images/providers/StableDiffusionLocalProvider.d.ts.map +1 -1
  189. package/dist/core/images/providers/StableDiffusionLocalProvider.js +124 -0
  190. package/dist/core/images/providers/StableDiffusionLocalProvider.js.map +1 -1
  191. package/dist/core/llm/IPromptEngine.d.ts +2 -2
  192. package/dist/core/llm/IPromptEngine.d.ts.map +1 -1
  193. package/dist/core/llm/IPromptEngine.js +2 -2
  194. package/dist/core/llm/IPromptEngine.js.map +1 -1
  195. package/dist/core/llm/providers/AIModelProviderManager.d.ts +7 -1
  196. package/dist/core/llm/providers/AIModelProviderManager.d.ts.map +1 -1
  197. package/dist/core/llm/providers/AIModelProviderManager.js +24 -0
  198. package/dist/core/llm/providers/AIModelProviderManager.js.map +1 -1
  199. package/dist/core/llm/providers/errors/AnthropicProviderError.d.ts +42 -0
  200. package/dist/core/llm/providers/errors/AnthropicProviderError.d.ts.map +1 -0
  201. package/dist/core/llm/providers/errors/AnthropicProviderError.js +45 -0
  202. package/dist/core/llm/providers/errors/AnthropicProviderError.js.map +1 -0
  203. package/dist/core/llm/providers/errors/GeminiProviderError.d.ts +45 -0
  204. package/dist/core/llm/providers/errors/GeminiProviderError.d.ts.map +1 -0
  205. package/dist/core/llm/providers/errors/GeminiProviderError.js +46 -0
  206. package/dist/core/llm/providers/errors/GeminiProviderError.js.map +1 -0
  207. package/dist/core/llm/providers/errors/OllamaProviderError.d.ts +1 -1
  208. package/dist/core/llm/providers/errors/OllamaProviderError.d.ts.map +1 -1
  209. package/dist/core/llm/providers/errors/OllamaProviderError.js +1 -1
  210. package/dist/core/llm/providers/errors/OllamaProviderError.js.map +1 -1
  211. package/dist/core/llm/providers/errors/OpenAIProviderError.d.ts +1 -1
  212. package/dist/core/llm/providers/errors/OpenAIProviderError.js +1 -1
  213. package/dist/core/llm/providers/errors/OpenRouterProviderError.d.ts +1 -1
  214. package/dist/core/llm/providers/errors/OpenRouterProviderError.js +1 -1
  215. package/dist/core/llm/providers/implementations/AnthropicProvider.d.ts +340 -0
  216. package/dist/core/llm/providers/implementations/AnthropicProvider.d.ts.map +1 -0
  217. package/dist/core/llm/providers/implementations/AnthropicProvider.js +959 -0
  218. package/dist/core/llm/providers/implementations/AnthropicProvider.js.map +1 -0
  219. package/dist/core/llm/providers/implementations/GeminiProvider.d.ts +339 -0
  220. package/dist/core/llm/providers/implementations/GeminiProvider.d.ts.map +1 -0
  221. package/dist/core/llm/providers/implementations/GeminiProvider.js +1004 -0
  222. package/dist/core/llm/providers/implementations/GeminiProvider.js.map +1 -0
  223. package/dist/core/llm/providers/implementations/GroqProvider.d.ts +105 -0
  224. package/dist/core/llm/providers/implementations/GroqProvider.d.ts.map +1 -0
  225. package/dist/core/llm/providers/implementations/GroqProvider.js +134 -0
  226. package/dist/core/llm/providers/implementations/GroqProvider.js.map +1 -0
  227. package/dist/core/llm/providers/implementations/MistralProvider.d.ts +105 -0
  228. package/dist/core/llm/providers/implementations/MistralProvider.d.ts.map +1 -0
  229. package/dist/core/llm/providers/implementations/MistralProvider.js +146 -0
  230. package/dist/core/llm/providers/implementations/MistralProvider.js.map +1 -0
  231. package/dist/core/llm/providers/implementations/TogetherProvider.d.ts +107 -0
  232. package/dist/core/llm/providers/implementations/TogetherProvider.d.ts.map +1 -0
  233. package/dist/core/llm/providers/implementations/TogetherProvider.js +138 -0
  234. package/dist/core/llm/providers/implementations/TogetherProvider.js.map +1 -0
  235. package/dist/core/llm/providers/implementations/XAIProvider.d.ts +102 -0
  236. package/dist/core/llm/providers/implementations/XAIProvider.d.ts.map +1 -0
  237. package/dist/core/llm/providers/implementations/XAIProvider.js +123 -0
  238. package/dist/core/llm/providers/implementations/XAIProvider.js.map +1 -0
  239. package/dist/core/orchestration/AgentOrchestrator.d.ts.map +1 -1
  240. package/dist/core/orchestration/AgentOrchestrator.js +26 -5
  241. package/dist/core/orchestration/AgentOrchestrator.js.map +1 -1
  242. package/dist/core/tools/IToolOrchestrator.d.ts +2 -2
  243. package/dist/core/tools/IToolOrchestrator.d.ts.map +1 -1
  244. package/dist/core/tools/ToolExecutor.d.ts +3 -0
  245. package/dist/core/tools/ToolExecutor.d.ts.map +1 -1
  246. package/dist/core/tools/ToolExecutor.js +2 -1
  247. package/dist/core/tools/ToolExecutor.js.map +1 -1
  248. package/dist/core/tools/ToolOrchestrator.d.ts +7 -7
  249. package/dist/core/tools/ToolOrchestrator.d.ts.map +1 -1
  250. package/dist/core/tools/ToolOrchestrator.js +135 -36
  251. package/dist/core/tools/ToolOrchestrator.js.map +1 -1
  252. package/dist/core/tools/permissions/ToolPermissionManager.d.ts +6 -5
  253. package/dist/core/tools/permissions/ToolPermissionManager.d.ts.map +1 -1
  254. package/dist/core/tools/permissions/ToolPermissionManager.js +47 -21
  255. package/dist/core/tools/permissions/ToolPermissionManager.js.map +1 -1
  256. package/dist/core/vision/VisionPipeline.d.ts +437 -0
  257. package/dist/core/vision/VisionPipeline.d.ts.map +1 -0
  258. package/dist/core/vision/VisionPipeline.js +1113 -0
  259. package/dist/core/vision/VisionPipeline.js.map +1 -0
  260. package/dist/core/vision/index.d.ts +97 -0
  261. package/dist/core/vision/index.d.ts.map +1 -0
  262. package/dist/core/vision/index.js +182 -0
  263. package/dist/core/vision/index.js.map +1 -0
  264. package/dist/core/vision/providers/LLMVisionProvider.d.ts +135 -0
  265. package/dist/core/vision/providers/LLMVisionProvider.d.ts.map +1 -0
  266. package/dist/core/vision/providers/LLMVisionProvider.js +136 -0
  267. package/dist/core/vision/providers/LLMVisionProvider.js.map +1 -0
  268. package/dist/core/vision/providers/PipelineVisionProvider.d.ts +154 -0
  269. package/dist/core/vision/providers/PipelineVisionProvider.d.ts.map +1 -0
  270. package/dist/core/vision/providers/PipelineVisionProvider.js +160 -0
  271. package/dist/core/vision/providers/PipelineVisionProvider.js.map +1 -0
  272. package/dist/core/vision/types.d.ts +286 -0
  273. package/dist/core/vision/types.d.ts.map +1 -0
  274. package/dist/core/vision/types.js +24 -0
  275. package/dist/core/vision/types.js.map +1 -0
  276. package/dist/discovery/CapabilityDiscoveryEngine.d.ts +1 -1
  277. package/dist/discovery/CapabilityDiscoveryEngine.d.ts.map +1 -1
  278. package/dist/discovery/CapabilityDiscoveryEngine.js +1 -1
  279. package/dist/discovery/CapabilityDiscoveryEngine.js.map +1 -1
  280. package/dist/emergent/ComposableToolBuilder.d.ts +15 -4
  281. package/dist/emergent/ComposableToolBuilder.d.ts.map +1 -1
  282. package/dist/emergent/ComposableToolBuilder.js +29 -14
  283. package/dist/emergent/ComposableToolBuilder.js.map +1 -1
  284. package/dist/emergent/EmergentCapabilityEngine.d.ts +3 -3
  285. package/dist/emergent/EmergentCapabilityEngine.d.ts.map +1 -1
  286. package/dist/emergent/EmergentCapabilityEngine.js +15 -12
  287. package/dist/emergent/EmergentCapabilityEngine.js.map +1 -1
  288. package/dist/emergent/EmergentJudge.d.ts +20 -0
  289. package/dist/emergent/EmergentJudge.d.ts.map +1 -1
  290. package/dist/emergent/EmergentJudge.js +121 -26
  291. package/dist/emergent/EmergentJudge.js.map +1 -1
  292. package/dist/emergent/EmergentToolRegistry.d.ts +17 -0
  293. package/dist/emergent/EmergentToolRegistry.d.ts.map +1 -1
  294. package/dist/emergent/EmergentToolRegistry.js +26 -0
  295. package/dist/emergent/EmergentToolRegistry.js.map +1 -1
  296. package/dist/emergent/ForgeToolMetaTool.d.ts +1 -1
  297. package/dist/emergent/ForgeToolMetaTool.d.ts.map +1 -1
  298. package/dist/emergent/ForgeToolMetaTool.js +15 -2
  299. package/dist/emergent/ForgeToolMetaTool.js.map +1 -1
  300. package/dist/emergent/SandboxedToolForge.d.ts +2 -2
  301. package/dist/emergent/SandboxedToolForge.d.ts.map +1 -1
  302. package/dist/emergent/SandboxedToolForge.js +13 -23
  303. package/dist/emergent/SandboxedToolForge.js.map +1 -1
  304. package/dist/emergent/SkillExporter.d.ts +119 -0
  305. package/dist/emergent/SkillExporter.d.ts.map +1 -0
  306. package/dist/emergent/SkillExporter.js +344 -0
  307. package/dist/emergent/SkillExporter.js.map +1 -0
  308. package/dist/emergent/index.d.ts +1 -0
  309. package/dist/emergent/index.d.ts.map +1 -1
  310. package/dist/emergent/index.js +1 -0
  311. package/dist/emergent/index.js.map +1 -1
  312. package/dist/emergent/types.d.ts +4 -4
  313. package/dist/index.d.ts +30 -5
  314. package/dist/index.d.ts.map +1 -1
  315. package/dist/index.js +19 -2
  316. package/dist/index.js.map +1 -1
  317. package/dist/memory/facade/Memory.d.ts.map +1 -1
  318. package/dist/memory/facade/Memory.js +8 -0
  319. package/dist/memory/facade/Memory.js.map +1 -1
  320. package/dist/memory/facade/types.d.ts +10 -0
  321. package/dist/memory/facade/types.d.ts.map +1 -1
  322. package/dist/memory/index.d.ts +15 -7
  323. package/dist/memory/index.d.ts.map +1 -1
  324. package/dist/memory/index.js +7 -0
  325. package/dist/memory/index.js.map +1 -1
  326. package/dist/memory/ingestion/DoclingLoader.d.ts +3 -3
  327. package/dist/memory/ingestion/DoclingLoader.d.ts.map +1 -1
  328. package/dist/memory/ingestion/DoclingLoader.js +12 -8
  329. package/dist/memory/ingestion/DoclingLoader.js.map +1 -1
  330. package/dist/memory/ingestion/FolderScanner.d.ts +7 -7
  331. package/dist/memory/ingestion/FolderScanner.d.ts.map +1 -1
  332. package/dist/memory/ingestion/FolderScanner.js +6 -6
  333. package/dist/memory/ingestion/FolderScanner.js.map +1 -1
  334. package/dist/memory/ingestion/LoaderRegistry.d.ts +8 -8
  335. package/dist/memory/ingestion/LoaderRegistry.d.ts.map +1 -1
  336. package/dist/memory/ingestion/LoaderRegistry.js +9 -11
  337. package/dist/memory/ingestion/LoaderRegistry.js.map +1 -1
  338. package/dist/memory/ingestion/MultimodalAggregator.d.ts +1 -1
  339. package/dist/memory/ingestion/MultimodalAggregator.js +1 -1
  340. package/dist/memory/ingestion/OcrPdfLoader.d.ts +2 -2
  341. package/dist/memory/ingestion/OcrPdfLoader.d.ts.map +1 -1
  342. package/dist/memory/ingestion/OcrPdfLoader.js +12 -8
  343. package/dist/memory/ingestion/OcrPdfLoader.js.map +1 -1
  344. package/dist/memory/ingestion/PdfLoader.d.ts +8 -8
  345. package/dist/memory/ingestion/PdfLoader.d.ts.map +1 -1
  346. package/dist/memory/ingestion/PdfLoader.js +13 -10
  347. package/dist/memory/ingestion/PdfLoader.js.map +1 -1
  348. package/dist/memory/io/MarkdownExporter.d.ts +1 -1
  349. package/dist/memory/io/MarkdownExporter.d.ts.map +1 -1
  350. package/dist/memory/io/MarkdownExporter.js +1 -1
  351. package/dist/memory/io/MarkdownExporter.js.map +1 -1
  352. package/dist/memory/observation/MemoryObserver.d.ts +63 -1
  353. package/dist/memory/observation/MemoryObserver.d.ts.map +1 -1
  354. package/dist/memory/observation/MemoryObserver.js +115 -4
  355. package/dist/memory/observation/MemoryObserver.js.map +1 -1
  356. package/dist/memory/observation/ObservationCompressor.d.ts +88 -0
  357. package/dist/memory/observation/ObservationCompressor.d.ts.map +1 -0
  358. package/dist/memory/observation/ObservationCompressor.js +207 -0
  359. package/dist/memory/observation/ObservationCompressor.js.map +1 -0
  360. package/dist/memory/observation/ObservationReflector.d.ts +82 -0
  361. package/dist/memory/observation/ObservationReflector.d.ts.map +1 -0
  362. package/dist/memory/observation/ObservationReflector.js +212 -0
  363. package/dist/memory/observation/ObservationReflector.js.map +1 -0
  364. package/dist/memory/observation/temporal.d.ts +54 -0
  365. package/dist/memory/observation/temporal.d.ts.map +1 -0
  366. package/dist/memory/observation/temporal.js +115 -0
  367. package/dist/memory/observation/temporal.js.map +1 -0
  368. package/dist/memory/tools/MemoryAddTool.d.ts +2 -2
  369. package/dist/memory/tools/MemoryAddTool.d.ts.map +1 -1
  370. package/dist/memory/tools/MemoryAddTool.js +8 -3
  371. package/dist/memory/tools/MemoryAddTool.js.map +1 -1
  372. package/dist/memory/tools/MemorySearchTool.d.ts +3 -3
  373. package/dist/memory/tools/MemorySearchTool.d.ts.map +1 -1
  374. package/dist/memory/tools/MemorySearchTool.js +11 -9
  375. package/dist/memory/tools/MemorySearchTool.js.map +1 -1
  376. package/dist/memory/tools/scopeContext.d.ts +11 -0
  377. package/dist/memory/tools/scopeContext.d.ts.map +1 -0
  378. package/dist/memory/tools/scopeContext.js +46 -0
  379. package/dist/memory/tools/scopeContext.js.map +1 -0
  380. package/dist/orchestration/builders/AgentGraph.d.ts +12 -11
  381. package/dist/orchestration/builders/AgentGraph.d.ts.map +1 -1
  382. package/dist/orchestration/builders/AgentGraph.js +12 -11
  383. package/dist/orchestration/builders/AgentGraph.js.map +1 -1
  384. package/dist/orchestration/builders/VoiceNodeBuilder.d.ts +82 -25
  385. package/dist/orchestration/builders/VoiceNodeBuilder.d.ts.map +1 -1
  386. package/dist/orchestration/builders/VoiceNodeBuilder.js +86 -26
  387. package/dist/orchestration/builders/VoiceNodeBuilder.js.map +1 -1
  388. package/dist/orchestration/builders/WorkflowBuilder.d.ts +1 -1
  389. package/dist/orchestration/builders/WorkflowBuilder.d.ts.map +1 -1
  390. package/dist/orchestration/builders/WorkflowBuilder.js +1 -1
  391. package/dist/orchestration/builders/WorkflowBuilder.js.map +1 -1
  392. package/dist/orchestration/checkpoint/InMemoryCheckpointStore.d.ts +7 -54
  393. package/dist/orchestration/checkpoint/InMemoryCheckpointStore.d.ts.map +1 -1
  394. package/dist/orchestration/checkpoint/InMemoryCheckpointStore.js +8 -56
  395. package/dist/orchestration/checkpoint/InMemoryCheckpointStore.js.map +1 -1
  396. package/dist/orchestration/events/GraphEvent.d.ts +67 -5
  397. package/dist/orchestration/events/GraphEvent.d.ts.map +1 -1
  398. package/dist/orchestration/events/GraphEvent.js.map +1 -1
  399. package/dist/orchestration/runtime/GraphRuntime.d.ts.map +1 -1
  400. package/dist/orchestration/runtime/GraphRuntime.js +151 -1
  401. package/dist/orchestration/runtime/GraphRuntime.js.map +1 -1
  402. package/dist/orchestration/runtime/LoopController.d.ts +3 -3
  403. package/dist/orchestration/runtime/LoopController.d.ts.map +1 -1
  404. package/dist/orchestration/runtime/LoopController.js.map +1 -1
  405. package/dist/orchestration/runtime/StateManager.d.ts +3 -3
  406. package/dist/orchestration/runtime/StateManager.js +3 -3
  407. package/dist/orchestration/runtime/VoiceNodeExecutor.d.ts +103 -26
  408. package/dist/orchestration/runtime/VoiceNodeExecutor.d.ts.map +1 -1
  409. package/dist/orchestration/runtime/VoiceNodeExecutor.js +155 -43
  410. package/dist/orchestration/runtime/VoiceNodeExecutor.js.map +1 -1
  411. package/dist/orchestration/runtime/VoiceTransportAdapter.d.ts +95 -33
  412. package/dist/orchestration/runtime/VoiceTransportAdapter.d.ts.map +1 -1
  413. package/dist/orchestration/runtime/VoiceTransportAdapter.js +83 -29
  414. package/dist/orchestration/runtime/VoiceTransportAdapter.js.map +1 -1
  415. package/dist/orchestration/runtime/VoiceTurnCollector.d.ts +73 -20
  416. package/dist/orchestration/runtime/VoiceTurnCollector.d.ts.map +1 -1
  417. package/dist/orchestration/runtime/VoiceTurnCollector.js +84 -23
  418. package/dist/orchestration/runtime/VoiceTurnCollector.js.map +1 -1
  419. package/dist/query-router/KeywordFallback.d.ts +70 -0
  420. package/dist/query-router/KeywordFallback.d.ts.map +1 -0
  421. package/dist/query-router/KeywordFallback.js +132 -0
  422. package/dist/query-router/KeywordFallback.js.map +1 -0
  423. package/dist/query-router/QueryClassifier.d.ts +140 -0
  424. package/dist/query-router/QueryClassifier.d.ts.map +1 -0
  425. package/dist/query-router/QueryClassifier.js +223 -0
  426. package/dist/query-router/QueryClassifier.js.map +1 -0
  427. package/dist/query-router/QueryDispatcher.d.ts +139 -0
  428. package/dist/query-router/QueryDispatcher.d.ts.map +1 -0
  429. package/dist/query-router/QueryDispatcher.js +297 -0
  430. package/dist/query-router/QueryDispatcher.js.map +1 -0
  431. package/dist/query-router/QueryGenerator.d.ts +184 -0
  432. package/dist/query-router/QueryGenerator.d.ts.map +1 -0
  433. package/dist/query-router/QueryGenerator.js +241 -0
  434. package/dist/query-router/QueryGenerator.js.map +1 -0
  435. package/dist/query-router/QueryRouter.d.ts +292 -0
  436. package/dist/query-router/QueryRouter.d.ts.map +1 -0
  437. package/dist/query-router/QueryRouter.js +803 -0
  438. package/dist/query-router/QueryRouter.js.map +1 -0
  439. package/dist/query-router/TopicExtractor.d.ts +73 -0
  440. package/dist/query-router/TopicExtractor.d.ts.map +1 -0
  441. package/dist/query-router/TopicExtractor.js +95 -0
  442. package/dist/query-router/TopicExtractor.js.map +1 -0
  443. package/dist/query-router/index.d.ts +40 -0
  444. package/dist/query-router/index.d.ts.map +1 -0
  445. package/dist/query-router/index.js +46 -0
  446. package/dist/query-router/index.js.map +1 -0
  447. package/dist/query-router/types.d.ts +508 -0
  448. package/dist/query-router/types.d.ts.map +1 -0
  449. package/dist/query-router/types.js +39 -0
  450. package/dist/query-router/types.js.map +1 -0
  451. package/dist/rag/index.d.ts +5 -0
  452. package/dist/rag/index.d.ts.map +1 -1
  453. package/dist/rag/index.js +7 -0
  454. package/dist/rag/index.js.map +1 -1
  455. package/dist/rag/multimodal/LLMVisionAdapter.d.ts +43 -0
  456. package/dist/rag/multimodal/LLMVisionAdapter.d.ts.map +1 -0
  457. package/dist/rag/multimodal/LLMVisionAdapter.js +46 -0
  458. package/dist/rag/multimodal/LLMVisionAdapter.js.map +1 -0
  459. package/dist/rag/multimodal/MultimodalIndexer.d.ts +244 -0
  460. package/dist/rag/multimodal/MultimodalIndexer.d.ts.map +1 -0
  461. package/dist/rag/multimodal/MultimodalIndexer.js +411 -0
  462. package/dist/rag/multimodal/MultimodalIndexer.js.map +1 -0
  463. package/dist/rag/multimodal/MultimodalMemoryBridge.d.ts +448 -0
  464. package/dist/rag/multimodal/MultimodalMemoryBridge.d.ts.map +1 -0
  465. package/dist/rag/multimodal/MultimodalMemoryBridge.js +941 -0
  466. package/dist/rag/multimodal/MultimodalMemoryBridge.js.map +1 -0
  467. package/dist/rag/multimodal/SpeechProviderAdapter.d.ts +139 -0
  468. package/dist/rag/multimodal/SpeechProviderAdapter.d.ts.map +1 -0
  469. package/dist/rag/multimodal/SpeechProviderAdapter.js +143 -0
  470. package/dist/rag/multimodal/SpeechProviderAdapter.js.map +1 -0
  471. package/dist/rag/multimodal/createMultimodalIndexerFromResolver.d.ts +172 -0
  472. package/dist/rag/multimodal/createMultimodalIndexerFromResolver.d.ts.map +1 -0
  473. package/dist/rag/multimodal/createMultimodalIndexerFromResolver.js +152 -0
  474. package/dist/rag/multimodal/createMultimodalIndexerFromResolver.js.map +1 -0
  475. package/dist/rag/multimodal/index.d.ts +44 -0
  476. package/dist/rag/multimodal/index.d.ts.map +1 -0
  477. package/dist/rag/multimodal/index.js +42 -0
  478. package/dist/rag/multimodal/index.js.map +1 -0
  479. package/dist/rag/multimodal/types.d.ts +276 -0
  480. package/dist/rag/multimodal/types.d.ts.map +1 -0
  481. package/dist/rag/multimodal/types.js +26 -0
  482. package/dist/rag/multimodal/types.js.map +1 -0
  483. package/dist/social-posting/SocialPostManager.d.ts +3 -3
  484. package/dist/social-posting/SocialPostManager.d.ts.map +1 -1
  485. package/dist/social-posting/SocialPostManager.js +3 -5
  486. package/dist/social-posting/SocialPostManager.js.map +1 -1
  487. package/dist/speech/FallbackProxy.d.ts +6 -6
  488. package/dist/speech/FallbackProxy.d.ts.map +1 -1
  489. package/dist/speech/FallbackProxy.js +3 -3
  490. package/dist/speech/FallbackProxy.js.map +1 -1
  491. package/dist/speech/SpeechProviderResolver.d.ts +8 -8
  492. package/dist/speech/SpeechProviderResolver.d.ts.map +1 -1
  493. package/dist/speech/SpeechProviderResolver.js +22 -11
  494. package/dist/speech/SpeechProviderResolver.js.map +1 -1
  495. package/dist/speech/SpeechRuntime.d.ts +1 -5
  496. package/dist/speech/SpeechRuntime.d.ts.map +1 -1
  497. package/dist/speech/SpeechRuntime.js +17 -9
  498. package/dist/speech/SpeechRuntime.js.map +1 -1
  499. package/dist/speech/providers/AssemblyAISTTProvider.d.ts +4 -4
  500. package/dist/speech/providers/AssemblyAISTTProvider.js +4 -4
  501. package/dist/speech/providers/AzureSpeechTTSProvider.d.ts +3 -3
  502. package/dist/speech/providers/AzureSpeechTTSProvider.js +2 -2
  503. package/dist/speech/providers/AzureSpeechTTSProvider.js.map +1 -1
  504. package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts +9 -9
  505. package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts.map +1 -1
  506. package/dist/speech/providers/BuiltInAdaptiveVadProvider.js +5 -5
  507. package/dist/speech/providers/BuiltInAdaptiveVadProvider.js.map +1 -1
  508. package/dist/speech/providers/DeepgramBatchSTTProvider.d.ts +2 -2
  509. package/dist/speech/providers/DeepgramBatchSTTProvider.js +2 -2
  510. package/dist/speech/providers/OpenAITextToSpeechProvider.d.ts +3 -3
  511. package/dist/speech/providers/OpenAITextToSpeechProvider.js +2 -2
  512. package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.d.ts +1 -1
  513. package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.d.ts.map +1 -1
  514. package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.js +1 -1
  515. package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.js.map +1 -1
  516. package/dist/voice/TelephonyStreamTransport.d.ts +6 -6
  517. package/dist/voice/TelephonyStreamTransport.d.ts.map +1 -1
  518. package/dist/voice/TelephonyStreamTransport.js +5 -5
  519. package/dist/voice/TelephonyStreamTransport.js.map +1 -1
  520. package/dist/voice-pipeline/AcousticEndpointDetector.d.ts +4 -4
  521. package/dist/voice-pipeline/AcousticEndpointDetector.d.ts.map +1 -1
  522. package/dist/voice-pipeline/AcousticEndpointDetector.js +4 -4
  523. package/dist/voice-pipeline/AcousticEndpointDetector.js.map +1 -1
  524. package/dist/voice-pipeline/HardCutBargeinHandler.d.ts +3 -3
  525. package/dist/voice-pipeline/HardCutBargeinHandler.js +3 -3
  526. package/dist/voice-pipeline/HeuristicEndpointDetector.d.ts +3 -3
  527. package/dist/voice-pipeline/HeuristicEndpointDetector.d.ts.map +1 -1
  528. package/dist/voice-pipeline/HeuristicEndpointDetector.js +3 -3
  529. package/dist/voice-pipeline/HeuristicEndpointDetector.js.map +1 -1
  530. package/dist/voice-pipeline/SoftFadeBargeinHandler.d.ts +5 -5
  531. package/dist/voice-pipeline/SoftFadeBargeinHandler.js +1 -1
  532. package/dist/voice-pipeline/VoiceInterruptError.d.ts +6 -6
  533. package/dist/voice-pipeline/VoiceInterruptError.d.ts.map +1 -1
  534. package/dist/voice-pipeline/VoiceInterruptError.js +4 -4
  535. package/dist/voice-pipeline/VoiceInterruptError.js.map +1 -1
  536. package/dist/voice-pipeline/VoicePipelineOrchestrator.d.ts +9 -9
  537. package/dist/voice-pipeline/VoicePipelineOrchestrator.d.ts.map +1 -1
  538. package/dist/voice-pipeline/VoicePipelineOrchestrator.js +8 -8
  539. package/dist/voice-pipeline/VoicePipelineOrchestrator.js.map +1 -1
  540. package/dist/voice-pipeline/WebRTCStreamTransport.d.ts +421 -0
  541. package/dist/voice-pipeline/WebRTCStreamTransport.d.ts.map +1 -0
  542. package/dist/voice-pipeline/WebRTCStreamTransport.js +573 -0
  543. package/dist/voice-pipeline/WebRTCStreamTransport.js.map +1 -0
  544. package/dist/voice-pipeline/WebSocketStreamTransport.d.ts +8 -8
  545. package/dist/voice-pipeline/WebSocketStreamTransport.js +5 -5
  546. package/dist/voice-pipeline/index.d.ts +1 -0
  547. package/dist/voice-pipeline/index.d.ts.map +1 -1
  548. package/dist/voice-pipeline/index.js +2 -0
  549. package/dist/voice-pipeline/index.js.map +1 -1
  550. package/dist/voice-pipeline/types.d.ts +43 -43
  551. package/dist/voice-pipeline/types.d.ts.map +1 -1
  552. package/package.json +19 -1
@@ -9,11 +9,12 @@
9
9
  */
10
10
  import { TaskOutcomeTelemetryManager, evaluateTaskOutcome, resolveTaskOutcomeTelemetryConfig, resolveAdaptiveExecutionConfig, } from './TaskOutcomeTelemetryManager.js';
11
11
  import { StreamChunkEmitter } from './StreamChunkEmitter.js';
12
- import { executeRollingSummaryPhase } from './turn-phases/rolling-summary.js';
12
+ import { executeRollingSummaryPhase, } from './turn-phases/rolling-summary.js';
13
13
  import { executePromptProfilePhase } from './turn-phases/prompt-profile.js';
14
14
  import { executeLongTermMemoryPhase } from './turn-phases/long-term-memory.js';
15
15
  import { assembleConversationHistory } from './turn-phases/conversation-history.js';
16
16
  import { AgentOSResponseChunkType, } from './types/AgentOSResponse.js';
17
+ import { AGENTOS_PENDING_EXTERNAL_TOOL_REQUEST_METADATA_KEY } from './types/AgentOSExternalToolRequest.js';
17
18
  import { GMIInteractionType, // Added for GMITurnInput
18
19
  GMIOutputChunkType, // Added for comparisons
19
20
  } from '../cognitive_substrate/IGMI.js';
@@ -23,7 +24,7 @@ import { GMIError, GMIErrorCode } from '../utils/errors.js';
23
24
  import { normalizeUsage, snapshotPersonaDetails } from '../core/orchestration/helpers.js';
24
25
  import { DEFAULT_PROMPT_PROFILE_CONFIG, } from '../core/prompting/PromptProfileRouter.js';
25
26
  import { DEFAULT_ROLLING_SUMMARY_COMPACTION_CONFIG, } from '../core/conversation/RollingSummaryCompactor.js';
26
- import { DEFAULT_LONG_TERM_MEMORY_POLICY, hasAnyLongTermMemoryScope, LONG_TERM_MEMORY_POLICY_METADATA_KEY, resolveLongTermMemoryPolicy, } from '../core/conversation/LongTermMemoryPolicy.js';
27
+ import { DEFAULT_LONG_TERM_MEMORY_POLICY, hasAnyLongTermMemoryScope, LONG_TERM_MEMORY_POLICY_METADATA_KEY, ORGANIZATION_ID_METADATA_KEY, resolveLongTermMemoryPolicy, } from '../core/conversation/LongTermMemoryPolicy.js';
27
28
  import { recordAgentOSToolResultMetrics, recordAgentOSTurnMetrics, recordExceptionOnActiveSpan, runWithSpanContext, startAgentOSSpan, withAgentOSSpan, } from '../core/observability/otel.js';
28
29
  // TaskOutcomeKpiWindowEntry imported from types/OrchestratorConfig.ts
29
30
  // AdaptiveExecutionDecision imported from TaskOutcomeTelemetryManager
@@ -115,6 +116,17 @@ function resolveTenantRoutingConfig(config) {
115
116
  strictOrganizationIsolation: Boolean(config?.strictOrganizationIsolation),
116
117
  };
117
118
  }
119
+ function buildToolCallChunkMetadata(streamContext, extra) {
120
+ const metadata = {
121
+ sessionId: streamContext.sessionId,
122
+ conversationId: streamContext.conversationId,
123
+ ...extra,
124
+ };
125
+ if (streamContext.organizationId) {
126
+ metadata.organizationId = streamContext.organizationId;
127
+ }
128
+ return metadata;
129
+ }
118
130
  /**
119
131
  * @class AgentOSOrchestrator
120
132
  * @description
@@ -151,7 +163,11 @@ export class AgentOSOrchestrator {
151
163
  console.warn('AgentOSOrchestrator already initialized. Skipping re-initialization.');
152
164
  return;
153
165
  }
154
- if (!dependencies.gmiManager || !dependencies.toolOrchestrator || !dependencies.conversationManager || !dependencies.streamingManager || !dependencies.modelProviderManager) {
166
+ if (!dependencies.gmiManager ||
167
+ !dependencies.toolOrchestrator ||
168
+ !dependencies.conversationManager ||
169
+ !dependencies.streamingManager ||
170
+ !dependencies.modelProviderManager) {
155
171
  throw new GMIError('AgentOSOrchestrator: Missing essential dependencies (gmiManager, toolOrchestrator, conversationManager, streamingManager, modelProviderManager).', GMIErrorCode.CONFIGURATION_ERROR);
156
172
  }
157
173
  this.config = {
@@ -163,7 +179,10 @@ export class AgentOSOrchestrator {
163
179
  : (config.promptProfileConfig ?? DEFAULT_PROMPT_PROFILE_CONFIG),
164
180
  rollingSummaryCompactionConfig: config.rollingSummaryCompactionConfig === null
165
181
  ? null
166
- : { ...DEFAULT_ROLLING_SUMMARY_COMPACTION_CONFIG, ...(config.rollingSummaryCompactionConfig ?? {}) },
182
+ : {
183
+ ...DEFAULT_ROLLING_SUMMARY_COMPACTION_CONFIG,
184
+ ...(config.rollingSummaryCompactionConfig ?? {}),
185
+ },
167
186
  rollingSummaryCompactionProfilesConfig: config.rollingSummaryCompactionProfilesConfig ?? null,
168
187
  rollingSummarySystemPrompt: config.rollingSummarySystemPrompt ?? '',
169
188
  rollingSummaryStateKey: config.rollingSummaryStateKey ?? 'rollingSummaryState',
@@ -194,10 +213,7 @@ export class AgentOSOrchestrator {
194
213
  const tenantConfig = this.config.tenantRouting;
195
214
  if (tenantConfig.mode === 'single_tenant') {
196
215
  const fallback = tenantConfig.defaultOrganizationId;
197
- if (tenantConfig.strictOrganizationIsolation &&
198
- inbound &&
199
- fallback &&
200
- inbound !== fallback) {
216
+ if (tenantConfig.strictOrganizationIsolation && inbound && fallback && inbound !== fallback) {
201
217
  throw new GMIError(`organizationId '${inbound}' does not match configured single-tenant org '${fallback}'.`, GMIErrorCode.VALIDATION_ERROR, {
202
218
  mode: tenantConfig.mode,
203
219
  inboundOrganizationId: inbound,
@@ -304,6 +320,100 @@ export class AgentOSOrchestrator {
304
320
  });
305
321
  return agentOSStreamId;
306
322
  }
323
+ async orchestrateResumedToolResults(pendingRequest, toolResults, options = {}) {
324
+ this.ensureInitialized();
325
+ const agentOSStreamId = await this.dependencies.streamingManager.createStream();
326
+ console.log(`AgentOSOrchestrator: Resuming external tool request for conversation ${pendingRequest.conversationId} on new stream ${agentOSStreamId}.`);
327
+ const rootSpan = startAgentOSSpan('agentos.resume_external_tool_request', {
328
+ attributes: {
329
+ 'agentos.stream_id': agentOSStreamId,
330
+ 'agentos.user_id': pendingRequest.userId,
331
+ 'agentos.session_id': pendingRequest.sessionId,
332
+ 'agentos.conversation_id': pendingRequest.conversationId,
333
+ 'agentos.persona_id': pendingRequest.personaId,
334
+ 'agentos.tool_result_count': toolResults.length,
335
+ },
336
+ });
337
+ const run = async () => this._resumeToolResultsInternal(agentOSStreamId, pendingRequest, toolResults, options);
338
+ const promise = rootSpan ? runWithSpanContext(rootSpan, run) : run();
339
+ promise
340
+ .catch(async (criticalError) => {
341
+ if (rootSpan) {
342
+ try {
343
+ rootSpan.recordException(criticalError);
344
+ }
345
+ catch {
346
+ // ignore
347
+ }
348
+ }
349
+ console.error(`AgentOSOrchestrator: Critical unhandled error in _resumeToolResultsInternal for stream ${agentOSStreamId}:`, criticalError);
350
+ try {
351
+ await this.chunks.pushError(agentOSStreamId, pendingRequest.personaId || 'unknown_persona', pendingRequest.gmiInstanceId || 'orchestrator_resume_critical', GMIErrorCode.INTERNAL_SERVER_ERROR, `A critical external-tool resume error occurred: ${criticalError.message}`, { name: criticalError.name, stack: criticalError.stack });
352
+ await this.dependencies.streamingManager.closeStream(agentOSStreamId, 'Critical external-tool resume error');
353
+ }
354
+ catch (cleanupError) {
355
+ console.error(`AgentOSOrchestrator: Error during resume critical-error cleanup for stream ${agentOSStreamId}:`, cleanupError);
356
+ }
357
+ this.activeStreamContexts.delete(agentOSStreamId);
358
+ })
359
+ .finally(() => {
360
+ try {
361
+ rootSpan?.end();
362
+ }
363
+ catch {
364
+ // ignore
365
+ }
366
+ });
367
+ return agentOSStreamId;
368
+ }
369
+ async _resumeToolResultsInternal(agentOSStreamId, pendingRequest, toolResults, options) {
370
+ if (!Array.isArray(toolResults) || toolResults.length === 0) {
371
+ throw new GMIError('At least one tool result is required to resume an external tool request.', GMIErrorCode.VALIDATION_ERROR, { agentOSStreamId, conversationId: pendingRequest.conversationId });
372
+ }
373
+ const gmiResult = await withAgentOSSpan('agentos.gmi.resume_get_or_create', async (span) => {
374
+ span?.setAttribute('agentos.user_id', pendingRequest.userId);
375
+ span?.setAttribute('agentos.session_id', pendingRequest.sessionId);
376
+ span?.setAttribute('agentos.conversation_id', pendingRequest.conversationId);
377
+ span?.setAttribute('agentos.persona_id', pendingRequest.personaId);
378
+ return this.dependencies.gmiManager.getOrCreateGMIForSession(pendingRequest.userId, pendingRequest.sessionId, pendingRequest.personaId, pendingRequest.conversationId, options.preferredModelId, options.preferredProviderId, options.userApiKeys);
379
+ });
380
+ const gmi = gmiResult.gmi;
381
+ const conversationContext = gmiResult.conversationContext;
382
+ const currentPersonaId = gmi.getCurrentPrimaryPersonaId();
383
+ const gmiInstanceIdForChunks = gmi.getGMIId();
384
+ const storedOrganizationId = conversationContext.getMetadata(ORGANIZATION_ID_METADATA_KEY);
385
+ const resolvedOrganizationId = this.resolveOrganizationContext(options.organizationId ?? storedOrganizationId);
386
+ const streamContext = {
387
+ gmi,
388
+ userId: pendingRequest.userId,
389
+ sessionId: pendingRequest.sessionId,
390
+ personaId: currentPersonaId,
391
+ conversationId: conversationContext.sessionId,
392
+ organizationId: resolvedOrganizationId,
393
+ conversationContext,
394
+ userApiKeys: options.userApiKeys,
395
+ processingOptions: {
396
+ preferredModelId: options.preferredModelId,
397
+ preferredProviderId: options.preferredProviderId,
398
+ },
399
+ };
400
+ this.activeStreamContexts.set(agentOSStreamId, streamContext);
401
+ if (gmi.hydrateConversationHistory) {
402
+ gmi.hydrateConversationHistory(conversationContext.getHistory(undefined, [MessageRole.ERROR, MessageRole.THOUGHT]));
403
+ }
404
+ if (gmi.hydrateTurnContext) {
405
+ gmi.hydrateTurnContext({
406
+ sessionId: pendingRequest.sessionId,
407
+ conversationId: conversationContext.sessionId,
408
+ organizationId: resolvedOrganizationId,
409
+ });
410
+ }
411
+ await this.chunks.pushChunk(agentOSStreamId, AgentOSResponseChunkType.SYSTEM_PROGRESS, gmiInstanceIdForChunks, currentPersonaId, false, {
412
+ message: `Resuming external tool request for conversation ${conversationContext.sessionId}...`,
413
+ progressPercentage: 10,
414
+ });
415
+ await this.orchestrateToolResults(agentOSStreamId, toolResults);
416
+ }
307
417
  /**
308
418
  * Internal processing logic for a turn, designed to be called without await by `orchestrateTurn`.
309
419
  * @private
@@ -346,15 +456,25 @@ export class AgentOSOrchestrator {
346
456
  gmiInstanceIdForChunks = gmi.getGMIId();
347
457
  turnMetricsPersonaId = currentPersonaId;
348
458
  const streamContext = {
349
- gmi, userId: input.userId, sessionId: input.sessionId, personaId: currentPersonaId,
459
+ gmi,
460
+ userId: input.userId,
461
+ sessionId: input.sessionId,
462
+ personaId: currentPersonaId,
463
+ organizationId: organizationIdForMemory,
350
464
  conversationId: conversationContext.sessionId, // Use actual conversation ID from context
351
- conversationContext, userApiKeys: input.userApiKeys, processingOptions: input.options
465
+ conversationContext,
466
+ userApiKeys: input.userApiKeys,
467
+ processingOptions: input.options,
352
468
  };
353
469
  this.activeStreamContexts.set(agentOSStreamId, streamContext);
354
- await this.chunks.pushChunk(agentOSStreamId, AgentOSResponseChunkType.SYSTEM_PROGRESS, gmiInstanceIdForChunks, currentPersonaId, false, { message: `Initializing persona ${currentPersonaId}... GMI: ${gmiInstanceIdForChunks}`, progressPercentage: 10 });
470
+ await this.chunks.pushChunk(agentOSStreamId, AgentOSResponseChunkType.SYSTEM_PROGRESS, gmiInstanceIdForChunks, currentPersonaId, false, {
471
+ message: `Initializing persona ${currentPersonaId}... GMI: ${gmiInstanceIdForChunks}`,
472
+ progressPercentage: 10,
473
+ });
355
474
  const gmiInput = this.constructGMITurnInput(agentOSStreamId, input, streamContext);
356
475
  let turnPlan = null;
357
476
  const resolvedOrganizationId = this.resolveOrganizationContext(input.organizationId);
477
+ streamContext.organizationId = resolvedOrganizationId;
358
478
  if (this.dependencies.turnPlanner) {
359
479
  const planningMessage = gmiInput.type === GMIInteractionType.TEXT && typeof gmiInput.content === 'string'
360
480
  ? gmiInput.content
@@ -475,7 +595,9 @@ export class AgentOSOrchestrator {
475
595
  else if (gmiInput.type === GMIInteractionType.SYSTEM_MESSAGE) {
476
596
  conversationContext.addMessage({
477
597
  role: MessageRole.SYSTEM,
478
- content: typeof gmiInput.content === 'string' ? gmiInput.content : JSON.stringify(gmiInput.content),
598
+ content: typeof gmiInput.content === 'string'
599
+ ? gmiInput.content
600
+ : JSON.stringify(gmiInput.content),
479
601
  metadata: { agentPersonaId: currentPersonaId, source: 'agentos_input_system' },
480
602
  });
481
603
  }
@@ -490,7 +612,8 @@ export class AgentOSOrchestrator {
490
612
  }
491
613
  }
492
614
  // Build conversationHistoryForPrompt after compaction/routing so it can reflect rolling-summary trimming.
493
- const modeForRouting = typeof input.options?.customFlags?.mode === 'string' && input.options.customFlags.mode.trim()
615
+ const modeForRouting = typeof input.options?.customFlags?.mode === 'string' &&
616
+ input.options.customFlags.mode.trim()
494
617
  ? input.options.customFlags.mode.trim()
495
618
  : currentPersonaId;
496
619
  // --- Rolling summary compaction (delegated to turn-phases/rolling-summary) ---
@@ -504,7 +627,7 @@ export class AgentOSOrchestrator {
504
627
  rollingSummaryStateKey: this.config.rollingSummaryStateKey,
505
628
  modelProviderManager: this.dependencies.modelProviderManager,
506
629
  });
507
- const { result: rollingSummaryResult, profileId: rollingSummaryProfileId, configForTurn: rollingSummaryConfigForTurn } = rollingSummaryPhase;
630
+ const { result: rollingSummaryResult, profileId: rollingSummaryProfileId, configForTurn: rollingSummaryConfigForTurn, } = rollingSummaryPhase;
508
631
  const rollingSummaryEnabled = rollingSummaryPhase.enabled;
509
632
  const rollingSummaryText = rollingSummaryPhase.summaryText;
510
633
  if (!gmiInput.metadata) {
@@ -753,20 +876,26 @@ export class AgentOSOrchestrator {
753
876
  // Send a final response chunk if not already implicitly sent by an error or final GMI chunk transform.
754
877
  // This part needs careful consideration of what `lastGMIOutput` represents here.
755
878
  // It should represent the *actual* TReturn from the GMI's processing.
756
- const finalGMIStateForResponse = lastGMIOutput ||
757
- {
758
- isFinal: true,
759
- responseText: gmi ? 'Processing complete.' : 'Processing ended.',
760
- };
879
+ const finalGMIStateForResponse = lastGMIOutput || {
880
+ isFinal: true,
881
+ responseText: gmi ? 'Processing complete.' : 'Processing ended.',
882
+ };
761
883
  if (finalGMIStateForResponse.isFinal === false &&
762
884
  Array.isArray(finalGMIStateForResponse.toolCalls) &&
763
885
  finalGMIStateForResponse.toolCalls.length > 0) {
764
886
  keepStreamContextActive = true;
887
+ if (conversationContext) {
888
+ await this.persistPendingExternalToolRequest(agentOSStreamId, streamContext, gmiInstanceIdForChunks, finalGMIStateForResponse.toolCalls, finalGMIStateForResponse.responseText ||
889
+ 'Agent requires tool execution before it can complete the turn.');
890
+ }
765
891
  if (!streamedToolCallRequest) {
766
892
  await this.chunks.pushChunk(agentOSStreamId, AgentOSResponseChunkType.TOOL_CALL_REQUEST, gmiInstanceIdForChunks, currentPersonaId, false, {
767
893
  toolCalls: finalGMIStateForResponse.toolCalls,
768
894
  rationale: finalGMIStateForResponse.responseText ||
769
895
  'Agent requires tool execution before it can complete the turn.',
896
+ executionMode: 'external',
897
+ requiresExternalToolResult: true,
898
+ metadata: buildToolCallChunkMetadata(streamContext),
770
899
  });
771
900
  }
772
901
  return;
@@ -777,7 +906,9 @@ export class AgentOSOrchestrator {
777
906
  totalTokens: normalizedUsage.totalTokens,
778
907
  promptTokens: normalizedUsage.promptTokens,
779
908
  completionTokens: normalizedUsage.completionTokens,
780
- totalCostUSD: typeof normalizedUsage.totalCostUSD === 'number' ? normalizedUsage.totalCostUSD : undefined,
909
+ totalCostUSD: typeof normalizedUsage.totalCostUSD === 'number'
910
+ ? normalizedUsage.totalCostUSD
911
+ : undefined,
781
912
  };
782
913
  }
783
914
  if (didForceTerminate || Boolean(finalGMIStateForResponse.error)) {
@@ -844,18 +975,23 @@ export class AgentOSOrchestrator {
844
975
  },
845
976
  });
846
977
  }
978
+ if (conversationContext) {
979
+ await this.clearPendingExternalToolRequest(conversationContext);
980
+ }
847
981
  // Persist assistant output into ConversationContext for durable memory / prompt reconstruction.
848
982
  if (this.config.enableConversationalPersistence && conversationContext) {
849
983
  const persistContext = conversationContext;
850
984
  try {
851
- if (typeof finalGMIStateForResponse.responseText === 'string' && finalGMIStateForResponse.responseText.trim()) {
985
+ if (typeof finalGMIStateForResponse.responseText === 'string' &&
986
+ finalGMIStateForResponse.responseText.trim()) {
852
987
  conversationContext.addMessage({
853
988
  role: MessageRole.ASSISTANT,
854
989
  content: finalGMIStateForResponse.responseText,
855
990
  metadata: { agentPersonaId: currentPersonaId, source: 'agentos_output' },
856
991
  });
857
992
  }
858
- else if (finalGMIStateForResponse.toolCalls && finalGMIStateForResponse.toolCalls.length > 0) {
993
+ else if (finalGMIStateForResponse.toolCalls &&
994
+ finalGMIStateForResponse.toolCalls.length > 0) {
859
995
  conversationContext.addMessage({
860
996
  role: MessageRole.ASSISTANT,
861
997
  content: null,
@@ -885,10 +1021,12 @@ export class AgentOSOrchestrator {
885
1021
  usage: normalizedUsage,
886
1022
  reasoningTrace: finalGMIStateForResponse.reasoningTrace,
887
1023
  error: finalGMIStateForResponse.error,
888
- updatedConversationContext: conversationContext ? conversationContext.toJSON() : undefined,
1024
+ updatedConversationContext: conversationContext
1025
+ ? conversationContext.toJSON()
1026
+ : undefined,
889
1027
  activePersonaDetails: snapshotPersonaDetails(gmi?.getPersona?.()),
890
1028
  });
891
- await this.dependencies.streamingManager.closeStream(agentOSStreamId, "Processing complete.");
1029
+ await this.dependencies.streamingManager.closeStream(agentOSStreamId, 'Processing complete.');
892
1030
  }
893
1031
  catch (error) {
894
1032
  turnMetricsStatus = 'error';
@@ -929,7 +1067,8 @@ export class AgentOSOrchestrator {
929
1067
  },
930
1068
  });
931
1069
  await this.chunks.pushError(agentOSStreamId, currentPersonaId ?? 'unknown_persona', gmiInstanceIdForChunks, gmiErr.code, gmiErr.message, gmiErr.details);
932
- await this.dependencies.streamingManager.closeStream(agentOSStreamId, "Error during turn processing.");
1070
+ await this.clearPendingExternalToolRequest(conversationContext);
1071
+ await this.dependencies.streamingManager.closeStream(agentOSStreamId, 'Error during turn processing.');
933
1072
  }
934
1073
  finally {
935
1074
  recordAgentOSTurnMetrics({
@@ -969,67 +1108,150 @@ export class AgentOSOrchestrator {
969
1108
  * @throws {GMIError} If stream context is not found or GMI fails to handle result.
970
1109
  */
971
1110
  async orchestrateToolResult(agentOSStreamId, toolCallId, toolName, toolOutput, isSuccess, errorMessage) {
1111
+ return this.orchestrateToolResults(agentOSStreamId, [
1112
+ {
1113
+ toolCallId,
1114
+ toolName,
1115
+ toolOutput,
1116
+ isSuccess,
1117
+ errorMessage,
1118
+ },
1119
+ ]);
1120
+ }
1121
+ async orchestrateToolResults(agentOSStreamId, toolResults) {
972
1122
  this.ensureInitialized();
973
1123
  const startedAt = Date.now();
1124
+ if (!Array.isArray(toolResults) || toolResults.length === 0) {
1125
+ throw new GMIError('At least one tool result is required to continue the stream.', GMIErrorCode.VALIDATION_ERROR, { agentOSStreamId });
1126
+ }
974
1127
  const streamContext = this.activeStreamContexts.get(agentOSStreamId);
975
1128
  if (!streamContext) {
976
- const errMsg = `Orchestrator: Received tool result for unknown or inactive streamId: ${agentOSStreamId}. Tool: ${toolName}, CallID: ${toolCallId}`;
1129
+ const errMsg = `Orchestrator: Received tool result for unknown or inactive streamId: ${agentOSStreamId}.`;
977
1130
  console.error(errMsg);
978
1131
  // Cannot push to a non-existent stream context. This is a critical failure.
979
- throw new GMIError(errMsg, GMIErrorCode.RESOURCE_NOT_FOUND, { agentOSStreamId, toolCallId });
1132
+ throw new GMIError(errMsg, GMIErrorCode.RESOURCE_NOT_FOUND, {
1133
+ agentOSStreamId,
1134
+ toolResults: toolResults.map((toolResult) => ({
1135
+ toolCallId: toolResult.toolCallId,
1136
+ toolName: toolResult.toolName,
1137
+ })),
1138
+ });
980
1139
  }
981
1140
  const { gmi, userId, personaId, conversationContext, userApiKeys } = streamContext;
982
1141
  const gmiInstanceIdForChunks = gmi.getGMIId();
983
- const toolResultPayload = isSuccess
984
- ? { type: 'success', result: toolOutput }
985
- : { type: 'error', error: { code: 'EXTERNAL_TOOL_ERROR', message: errorMessage || `External tool '${toolName}' execution failed.` } };
986
- console.log(`AgentOSOrchestrator: Feeding tool result for stream ${agentOSStreamId}, GMI ${gmiInstanceIdForChunks}, tool call ${toolCallId} (${toolName}) back to GMI.`);
1142
+ const metricToolName = toolResults.length === 1 ? toolResults[0].toolName : '__batch_external_tools__';
1143
+ const metricToolSuccess = toolResults.every((toolResult) => toolResult.isSuccess);
1144
+ console.log(`AgentOSOrchestrator: Feeding ${toolResults.length} tool result(s) for stream ${agentOSStreamId}, GMI ${gmiInstanceIdForChunks} back to GMI.`);
987
1145
  try {
988
1146
  await withAgentOSSpan('agentos.tool_result', async (span) => {
989
1147
  span?.setAttribute('agentos.stream_id', agentOSStreamId);
990
1148
  span?.setAttribute('agentos.gmi_id', gmiInstanceIdForChunks);
991
- span?.setAttribute('agentos.tool_call_id', toolCallId);
992
- span?.setAttribute('agentos.tool_name', toolName);
993
- span?.setAttribute('agentos.tool_success', isSuccess);
1149
+ span?.setAttribute('agentos.tool_result_count', toolResults.length);
1150
+ span?.setAttribute('agentos.tool_call_ids', JSON.stringify(toolResults.map((toolResult) => toolResult.toolCallId)));
1151
+ span?.setAttribute('agentos.tool_names', JSON.stringify(toolResults.map((toolResult) => toolResult.toolName)));
1152
+ span?.setAttribute('agentos.tool_success', metricToolSuccess);
994
1153
  try {
995
- // Emit the tool result itself as a chunk
996
- await this.chunks.pushChunk(agentOSStreamId, AgentOSResponseChunkType.TOOL_RESULT_EMISSION, gmiInstanceIdForChunks, personaId, false, { toolCallId, toolName, toolResult: toolOutput, isSuccess, errorMessage });
997
- // Persist tool result into ConversationContext for durable memory / prompt reconstruction.
998
- if (this.config.enableConversationalPersistence && conversationContext) {
999
- try {
1154
+ await this.clearPendingExternalToolRequest(conversationContext);
1155
+ for (const toolResult of toolResults) {
1156
+ await this.chunks.pushChunk(agentOSStreamId, AgentOSResponseChunkType.TOOL_RESULT_EMISSION, gmiInstanceIdForChunks, personaId, false, {
1157
+ toolCallId: toolResult.toolCallId,
1158
+ toolName: toolResult.toolName,
1159
+ toolResult: toolResult.toolOutput,
1160
+ isSuccess: toolResult.isSuccess,
1161
+ errorMessage: toolResult.errorMessage,
1162
+ });
1163
+ if (this.config.enableConversationalPersistence && conversationContext) {
1000
1164
  conversationContext.addMessage({
1001
1165
  role: MessageRole.TOOL,
1002
- content: typeof toolOutput === 'string' ? toolOutput : JSON.stringify(toolOutput),
1003
- tool_call_id: toolCallId,
1004
- name: toolName,
1005
- metadata: { agentPersonaId: personaId, source: 'agentos_tool_result', isSuccess },
1166
+ content: typeof toolResult.toolOutput === 'string'
1167
+ ? toolResult.toolOutput
1168
+ : JSON.stringify(toolResult.toolOutput),
1169
+ tool_call_id: toolResult.toolCallId,
1170
+ name: toolResult.toolName,
1171
+ metadata: {
1172
+ agentPersonaId: personaId,
1173
+ source: 'agentos_tool_result',
1174
+ isSuccess: toolResult.isSuccess,
1175
+ },
1006
1176
  });
1177
+ }
1178
+ }
1179
+ if (this.config.enableConversationalPersistence && conversationContext) {
1180
+ try {
1007
1181
  await withAgentOSSpan('agentos.conversation.save', async (child) => {
1008
1182
  child?.setAttribute('agentos.stage', 'tool_result');
1009
1183
  child?.setAttribute('agentos.stream_id', agentOSStreamId);
1184
+ child?.setAttribute('agentos.tool_result_count', toolResults.length);
1010
1185
  await this.dependencies.conversationManager.saveConversation(conversationContext);
1011
1186
  });
1012
1187
  }
1013
1188
  catch (persistError) {
1014
- console.warn(`AgentOSOrchestrator: Failed to persist tool result to ConversationContext for stream ${agentOSStreamId}.`, persistError);
1189
+ console.warn(`AgentOSOrchestrator: Failed to persist tool results to ConversationContext for stream ${agentOSStreamId}.`, persistError);
1015
1190
  }
1016
1191
  }
1017
1192
  // GMI processes the tool result and gives a *final output for that step*
1018
1193
  const gmiOutputAfterTool = await withAgentOSSpan('agentos.gmi.handle_tool_result', async (child) => {
1019
1194
  child?.setAttribute('agentos.stream_id', agentOSStreamId);
1020
- child?.setAttribute('agentos.tool_call_id', toolCallId);
1021
- child?.setAttribute('agentos.tool_name', toolName);
1022
- child?.setAttribute('agentos.tool_success', isSuccess);
1023
- return gmi.handleToolResult(toolCallId, toolName, toolResultPayload, userId, userApiKeys || {});
1195
+ child?.setAttribute('agentos.tool_result_count', toolResults.length);
1196
+ child?.setAttribute('agentos.tool_call_ids', JSON.stringify(toolResults.map((toolResult) => toolResult.toolCallId)));
1197
+ child?.setAttribute('agentos.tool_names', JSON.stringify(toolResults.map((toolResult) => toolResult.toolName)));
1198
+ child?.setAttribute('agentos.tool_success', metricToolSuccess);
1199
+ if (toolResults.length > 1) {
1200
+ if (!gmi.handleToolResults) {
1201
+ throw new GMIError(`GMI ${gmiInstanceIdForChunks} does not support batched external tool continuation.`, GMIErrorCode.INVALID_STATE, {
1202
+ agentOSStreamId,
1203
+ gmiInstanceId: gmiInstanceIdForChunks,
1204
+ toolResults: toolResults.map((toolResult) => ({
1205
+ toolCallId: toolResult.toolCallId,
1206
+ toolName: toolResult.toolName,
1207
+ })),
1208
+ });
1209
+ }
1210
+ return gmi.handleToolResults(toolResults.map((toolResult) => ({
1211
+ toolCallId: toolResult.toolCallId,
1212
+ toolName: toolResult.toolName,
1213
+ output: toolResult.isSuccess
1214
+ ? toolResult.toolOutput
1215
+ : {
1216
+ code: 'EXTERNAL_TOOL_ERROR',
1217
+ message: toolResult.errorMessage ||
1218
+ `External tool '${toolResult.toolName}' execution failed.`,
1219
+ },
1220
+ isError: !toolResult.isSuccess,
1221
+ errorDetails: toolResult.isSuccess
1222
+ ? undefined
1223
+ : {
1224
+ code: 'EXTERNAL_TOOL_ERROR',
1225
+ message: toolResult.errorMessage ||
1226
+ `External tool '${toolResult.toolName}' execution failed.`,
1227
+ },
1228
+ })), userId, userApiKeys || {});
1229
+ }
1230
+ const [toolResult] = toolResults;
1231
+ const toolResultPayload = toolResult.isSuccess
1232
+ ? { type: 'success', result: toolResult.toolOutput }
1233
+ : {
1234
+ type: 'error',
1235
+ error: {
1236
+ code: 'EXTERNAL_TOOL_ERROR',
1237
+ message: toolResult.errorMessage ||
1238
+ `External tool '${toolResult.toolName}' execution failed.`,
1239
+ },
1240
+ };
1241
+ return gmi.handleToolResult(toolResult.toolCallId, toolResult.toolName, toolResultPayload, userId, userApiKeys || {});
1024
1242
  });
1025
1243
  // Process the GMIOutput (which is not a stream of chunks)
1026
1244
  await this.processGMIOutput(agentOSStreamId, streamContext, gmiOutputAfterTool, false);
1027
1245
  // If GMIOutput indicates further tool calls are needed by the GMI
1028
1246
  if (gmiOutputAfterTool.toolCalls && gmiOutputAfterTool.toolCalls.length > 0) {
1247
+ await this.persistPendingExternalToolRequest(agentOSStreamId, streamContext, gmiInstanceIdForChunks, gmiOutputAfterTool.toolCalls, gmiOutputAfterTool.responseText || 'Agent requires further tool execution.');
1029
1248
  await this.chunks.pushChunk(agentOSStreamId, AgentOSResponseChunkType.TOOL_CALL_REQUEST, gmiInstanceIdForChunks, personaId, false, // Not final, more interaction expected
1030
1249
  {
1031
1250
  toolCalls: gmiOutputAfterTool.toolCalls,
1032
1251
  rationale: gmiOutputAfterTool.responseText || 'Agent requires further tool execution.',
1252
+ executionMode: 'external',
1253
+ requiresExternalToolResult: true,
1254
+ metadata: buildToolCallChunkMetadata(streamContext),
1033
1255
  });
1034
1256
  // The orchestrator now waits for another external call to `orchestrateToolResult` for these new calls.
1035
1257
  }
@@ -1046,7 +1268,8 @@ export class AgentOSOrchestrator {
1046
1268
  metadata: { agentPersonaId: personaId, source: 'agentos_output' },
1047
1269
  });
1048
1270
  }
1049
- else if (gmiOutputAfterTool.toolCalls && gmiOutputAfterTool.toolCalls.length > 0) {
1271
+ else if (gmiOutputAfterTool.toolCalls &&
1272
+ gmiOutputAfterTool.toolCalls.length > 0) {
1050
1273
  conversationContext.addMessage({
1051
1274
  role: MessageRole.ASSISTANT,
1052
1275
  content: null,
@@ -1088,6 +1311,7 @@ export class AgentOSOrchestrator {
1088
1311
  const gmiErr = GMIError.wrap?.(error, GMIErrorCode.TOOL_ERROR, `Error in orchestrateToolResult for stream ${agentOSStreamId}`) ||
1089
1312
  new GMIError(`Error in orchestrateToolResult for stream ${agentOSStreamId}: ${error.message}`, GMIErrorCode.TOOL_ERROR, error);
1090
1313
  console.error(`AgentOSOrchestrator: Critical error processing tool result for stream ${agentOSStreamId}:`, gmiErr);
1314
+ await this.clearPendingExternalToolRequest(conversationContext);
1091
1315
  await this.chunks.pushError(agentOSStreamId, personaId, gmiInstanceIdForChunks, gmiErr.code, gmiErr.message, gmiErr.details);
1092
1316
  this.activeStreamContexts.delete(agentOSStreamId);
1093
1317
  await this.dependencies.streamingManager.closeStream(agentOSStreamId, 'Critical error during tool result processing.');
@@ -1097,20 +1321,70 @@ export class AgentOSOrchestrator {
1097
1321
  recordAgentOSToolResultMetrics({
1098
1322
  durationMs: Date.now() - startedAt,
1099
1323
  status: 'ok',
1100
- toolName,
1101
- toolSuccess: isSuccess,
1324
+ toolName: metricToolName,
1325
+ toolSuccess: metricToolSuccess,
1102
1326
  });
1103
1327
  }
1104
1328
  catch (error) {
1105
1329
  recordAgentOSToolResultMetrics({
1106
1330
  durationMs: Date.now() - startedAt,
1107
1331
  status: 'error',
1108
- toolName,
1109
- toolSuccess: isSuccess,
1332
+ toolName: metricToolName,
1333
+ toolSuccess: metricToolSuccess,
1110
1334
  });
1111
1335
  throw error;
1112
1336
  }
1113
1337
  }
1338
+ buildPendingExternalToolRequest(agentOSStreamId, streamContext, gmiInstanceId, toolCalls, rationale) {
1339
+ return {
1340
+ streamId: agentOSStreamId,
1341
+ sessionId: streamContext.sessionId,
1342
+ conversationId: streamContext.conversationId,
1343
+ userId: streamContext.userId,
1344
+ personaId: streamContext.personaId,
1345
+ gmiInstanceId,
1346
+ toolCalls,
1347
+ rationale,
1348
+ requestedAt: new Date().toISOString(),
1349
+ };
1350
+ }
1351
+ async persistPendingExternalToolRequest(agentOSStreamId, streamContext, gmiInstanceId, toolCalls, rationale) {
1352
+ const { conversationContext, personaId } = streamContext;
1353
+ const pendingRequest = this.buildPendingExternalToolRequest(agentOSStreamId, streamContext, gmiInstanceId, toolCalls, rationale);
1354
+ if (toolCalls.length > 0) {
1355
+ conversationContext.addMessage({
1356
+ role: MessageRole.ASSISTANT,
1357
+ content: null,
1358
+ tool_calls: toolCalls,
1359
+ metadata: { agentPersonaId: personaId, source: 'agentos_output_tool_calls' },
1360
+ });
1361
+ }
1362
+ conversationContext.setMetadata(AGENTOS_PENDING_EXTERNAL_TOOL_REQUEST_METADATA_KEY, pendingRequest);
1363
+ if (this.config.enableConversationalPersistence) {
1364
+ await withAgentOSSpan('agentos.conversation.save', async (span) => {
1365
+ span?.setAttribute('agentos.stage', 'pending_external_tool_request');
1366
+ span?.setAttribute('agentos.stream_id', agentOSStreamId);
1367
+ await this.dependencies.conversationManager.saveConversation(conversationContext);
1368
+ });
1369
+ }
1370
+ return pendingRequest;
1371
+ }
1372
+ async clearPendingExternalToolRequest(conversationContext) {
1373
+ if (!conversationContext) {
1374
+ return;
1375
+ }
1376
+ if (conversationContext.getMetadata(AGENTOS_PENDING_EXTERNAL_TOOL_REQUEST_METADATA_KEY) ===
1377
+ undefined) {
1378
+ return;
1379
+ }
1380
+ conversationContext.setMetadata(AGENTOS_PENDING_EXTERNAL_TOOL_REQUEST_METADATA_KEY, undefined);
1381
+ if (this.config.enableConversationalPersistence) {
1382
+ await withAgentOSSpan('agentos.conversation.save', async (span) => {
1383
+ span?.setAttribute('agentos.stage', 'clear_pending_external_tool_request');
1384
+ await this.dependencies.conversationManager.saveConversation(conversationContext);
1385
+ });
1386
+ }
1387
+ }
1114
1388
  /**
1115
1389
  * Processes a GMIOutput object (typically from handleToolResult or the end of a processTurnStream)
1116
1390
  * and pushes relevant chunks to the client stream.
@@ -1128,6 +1402,7 @@ export class AgentOSOrchestrator {
1128
1402
  await this.chunks.pushChunk(agentOSStreamId, AgentOSResponseChunkType.UI_COMMAND, gmiInstanceIdForChunks, personaId, false, { uiCommands: gmiOutput.uiCommands });
1129
1403
  }
1130
1404
  if (gmiOutput.error) {
1405
+ await this.clearPendingExternalToolRequest(conversationContext);
1131
1406
  await this.chunks.pushError(agentOSStreamId, personaId, gmiInstanceIdForChunks, gmiOutput.error.code, gmiOutput.error.message, gmiOutput.error.details);
1132
1407
  // If an error occurs in GMIOutput, it's usually final for this interaction path
1133
1408
  if (gmiOutput.isFinal) {
@@ -1139,6 +1414,7 @@ export class AgentOSOrchestrator {
1139
1414
  // Note: Tool calls from GMIOutput are handled by the calling method (orchestrateTurn or orchestrateToolResult)
1140
1415
  // to decide on looping or yielding ToolCallRequestChunks.
1141
1416
  if (gmiOutput.isFinal && (!gmiOutput.toolCalls || gmiOutput.toolCalls.length === 0)) {
1417
+ await this.clearPendingExternalToolRequest(conversationContext);
1142
1418
  if (this.config.enableConversationalPersistence && conversationContext) {
1143
1419
  await withAgentOSSpan('agentos.conversation.save', async (span) => {
1144
1420
  span?.setAttribute('agentos.stage', 'gmi_output_final');
@@ -1160,7 +1436,7 @@ export class AgentOSOrchestrator {
1160
1436
  activePersonaDetails: snapshotPersonaDetails(gmi.getPersona?.()),
1161
1437
  });
1162
1438
  this.activeStreamContexts.delete(agentOSStreamId);
1163
- await this.dependencies.streamingManager.closeStream(agentOSStreamId, "Processing complete.");
1439
+ await this.dependencies.streamingManager.closeStream(agentOSStreamId, 'Processing complete.');
1164
1440
  }
1165
1441
  }
1166
1442
  /**
@@ -1185,8 +1461,17 @@ export class AgentOSOrchestrator {
1185
1461
  case GMIOutputChunkType.TOOL_CALL_REQUEST:
1186
1462
  if (gmiChunk.content && Array.isArray(gmiChunk.content)) {
1187
1463
  const toolCalls = gmiChunk.content;
1464
+ const executionMode = gmiChunk.metadata?.executionMode === 'external' ? 'external' : 'internal';
1188
1465
  await this.chunks.pushChunk(agentOSStreamId, AgentOSResponseChunkType.TOOL_CALL_REQUEST, gmiInstanceIdForChunks, personaId, false, // Tool call request is not final for the AgentOS turn
1189
- { toolCalls, rationale: gmiChunk.metadata?.rationale || "Agent requires tool execution." });
1466
+ {
1467
+ toolCalls,
1468
+ rationale: gmiChunk.metadata?.rationale || 'Agent requires tool execution.',
1469
+ executionMode,
1470
+ requiresExternalToolResult: typeof gmiChunk.metadata?.requiresExternalToolResult === 'boolean'
1471
+ ? gmiChunk.metadata.requiresExternalToolResult
1472
+ : executionMode === 'external',
1473
+ metadata: buildToolCallChunkMetadata(streamContext, gmiChunk.metadata),
1474
+ });
1190
1475
  }
1191
1476
  break;
1192
1477
  case GMIOutputChunkType.UI_COMMAND:
@@ -1227,13 +1512,19 @@ export class AgentOSOrchestrator {
1227
1512
  gmiId: gmi.getGMIId(),
1228
1513
  // Pass relevant options to GMI if it needs them
1229
1514
  options: options,
1515
+ sessionId,
1516
+ conversationId: streamContext.conversationId,
1230
1517
  // User API keys are handled by GMIManager when fetching/creating GMI,
1231
1518
  // but can be passed in metadata if GMI needs them per-turn for some reason.
1232
1519
  userApiKeys: input.userApiKeys,
1233
1520
  userFeedback: input.userFeedback,
1234
1521
  explicitPersonaSwitchId: input.selectedPersonaId,
1235
1522
  // Task hint can be more sophisticated, based on input analysis
1236
- taskHint: input.textInput ? 'user_text_query' : (input.visionInputs || input.audioInput) ? 'user_multimodal_query' : 'general_query',
1523
+ taskHint: input.textInput
1524
+ ? 'user_text_query'
1525
+ : input.visionInputs || input.audioInput
1526
+ ? 'user_multimodal_query'
1527
+ : 'general_query',
1237
1528
  // GMI.ts specific fields if any, not standard in IGMI.GMITurnInput
1238
1529
  modelSelectionOverrides: {
1239
1530
  preferredModelId: options?.preferredModelId,
@@ -1246,7 +1537,7 @@ export class AgentOSOrchestrator {
1246
1537
  };
1247
1538
  let type;
1248
1539
  let content;
1249
- if (input.visionInputs && input.visionInputs.length > 0 || input.audioInput) {
1540
+ if ((input.visionInputs && input.visionInputs.length > 0) || input.audioInput) {
1250
1541
  type = GMIInteractionType.MULTIMODAL_CONTENT;
1251
1542
  const multiModalContent = {};
1252
1543
  if (input.textInput)
@@ -1264,7 +1555,7 @@ export class AgentOSOrchestrator {
1264
1555
  else {
1265
1556
  // Fallback or error if no meaningful input
1266
1557
  type = GMIInteractionType.SYSTEM_MESSAGE; // E.g. an empty ping or keep-alive
1267
- content = "No primary user input provided for this turn.";
1558
+ content = 'No primary user input provided for this turn.';
1268
1559
  console.warn(`AgentOSOrchestrator: No primary input in AgentOSInput for stream ${agentOSStreamId}. Sending as system message to GMI.`);
1269
1560
  }
1270
1561
  return {
@@ -1291,7 +1582,7 @@ export class AgentOSOrchestrator {
1291
1582
  // Notify and close streams managed by StreamingManager for contexts held here
1292
1583
  for (const streamId of this.activeStreamContexts.keys()) {
1293
1584
  try {
1294
- await this.dependencies.streamingManager.closeStream(streamId, "Orchestrator shutting down.");
1585
+ await this.dependencies.streamingManager.closeStream(streamId, 'Orchestrator shutting down.');
1295
1586
  }
1296
1587
  catch (e) {
1297
1588
  console.error(`AgentOSOrchestrator: Error closing stream ${streamId} during shutdown: ${e.message}`);