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

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 (557) hide show
  1. package/LICENSE +21 -0
  2. package/dist/agent-session/ITurnResourceResolver.d.ts +69 -0
  3. package/dist/agent-session/ITurnResourceResolver.d.ts.map +1 -0
  4. package/dist/agent-session/ITurnResourceResolver.js +19 -0
  5. package/dist/agent-session/ITurnResourceResolver.js.map +1 -0
  6. package/dist/agent-session/ITurnResourceResolver.mjs +1 -0
  7. package/dist/agent-session/ITurnResourceResolver.mjs.map +1 -0
  8. package/dist/agent-session/SessionHandle.d.ts +81 -0
  9. package/dist/agent-session/SessionHandle.d.ts.map +1 -0
  10. package/dist/agent-session/SessionHandle.js +392 -0
  11. package/dist/agent-session/SessionHandle.js.map +1 -0
  12. package/dist/agent-session/SessionHandle.mjs +371 -0
  13. package/dist/agent-session/SessionHandle.mjs.map +1 -0
  14. package/dist/agent-session/Sessions.d.ts +25 -0
  15. package/dist/agent-session/Sessions.d.ts.map +1 -0
  16. package/dist/agent-session/Sessions.js +71 -0
  17. package/dist/agent-session/Sessions.js.map +1 -0
  18. package/dist/agent-session/Sessions.mjs +46 -0
  19. package/dist/agent-session/Sessions.mjs.map +1 -0
  20. package/dist/agent-session/TurnHandle.d.ts +88 -0
  21. package/dist/agent-session/TurnHandle.d.ts.map +1 -0
  22. package/dist/agent-session/TurnHandle.js +490 -0
  23. package/dist/agent-session/TurnHandle.js.map +1 -0
  24. package/dist/agent-session/TurnHandle.mjs +469 -0
  25. package/dist/agent-session/TurnHandle.mjs.map +1 -0
  26. package/dist/agent-session/TurnResourceResolver.d.ts +154 -0
  27. package/dist/agent-session/TurnResourceResolver.d.ts.map +1 -0
  28. package/dist/agent-session/TurnResourceResolver.js +178 -0
  29. package/dist/agent-session/TurnResourceResolver.js.map +1 -0
  30. package/dist/agent-session/TurnResourceResolver.mjs +153 -0
  31. package/dist/agent-session/TurnResourceResolver.mjs.map +1 -0
  32. package/dist/agent-session/builtinsFromSpec.d.ts +19 -0
  33. package/dist/agent-session/builtinsFromSpec.d.ts.map +1 -0
  34. package/dist/agent-session/builtinsFromSpec.js +73 -0
  35. package/dist/agent-session/builtinsFromSpec.js.map +1 -0
  36. package/dist/agent-session/builtinsFromSpec.mjs +48 -0
  37. package/dist/agent-session/builtinsFromSpec.mjs.map +1 -0
  38. package/dist/agent-session/index.d.ts +29 -0
  39. package/dist/agent-session/index.d.ts.map +1 -0
  40. package/dist/agent-session/index.js +117 -0
  41. package/dist/agent-session/index.js.map +1 -0
  42. package/dist/agent-session/index.mjs +84 -0
  43. package/dist/agent-session/index.mjs.map +1 -0
  44. package/dist/agent-session/models/SessionRecord.d.ts +34 -0
  45. package/dist/agent-session/models/SessionRecord.d.ts.map +1 -0
  46. package/dist/agent-session/models/SessionRecord.js +19 -0
  47. package/dist/agent-session/models/SessionRecord.js.map +1 -0
  48. package/dist/agent-session/models/SessionRecord.mjs +1 -0
  49. package/dist/agent-session/models/SessionRecord.mjs.map +1 -0
  50. package/dist/agent-session/models/TurnRecord.d.ts +37 -0
  51. package/dist/agent-session/models/TurnRecord.d.ts.map +1 -0
  52. package/dist/agent-session/models/TurnRecord.js +31 -0
  53. package/dist/agent-session/models/TurnRecord.js.map +1 -0
  54. package/dist/agent-session/models/TurnRecord.mjs +6 -0
  55. package/dist/agent-session/models/TurnRecord.mjs.map +1 -0
  56. package/dist/agent-session/schemas/agentSpec.d.ts +142 -0
  57. package/dist/agent-session/schemas/agentSpec.d.ts.map +1 -0
  58. package/dist/agent-session/schemas/agentSpec.js +170 -0
  59. package/dist/agent-session/schemas/agentSpec.js.map +1 -0
  60. package/dist/agent-session/schemas/agentSpec.mjs +154 -0
  61. package/dist/agent-session/schemas/agentSpec.mjs.map +1 -0
  62. package/dist/agent-session/schemas/events.d.ts +1037 -0
  63. package/dist/agent-session/schemas/events.d.ts.map +1 -0
  64. package/dist/agent-session/schemas/events.js +80 -0
  65. package/dist/agent-session/schemas/events.js.map +1 -0
  66. package/dist/agent-session/schemas/events.mjs +69 -0
  67. package/dist/agent-session/schemas/events.mjs.map +1 -0
  68. package/dist/agent-session/schemas/pagination.d.ts +9 -0
  69. package/dist/agent-session/schemas/pagination.d.ts.map +1 -0
  70. package/dist/agent-session/schemas/pagination.js +36 -0
  71. package/dist/agent-session/schemas/pagination.js.map +1 -0
  72. package/dist/agent-session/schemas/pagination.mjs +11 -0
  73. package/dist/agent-session/schemas/pagination.mjs.map +1 -0
  74. package/dist/agent-session/schemas/session.d.ts +319 -0
  75. package/dist/agent-session/schemas/session.d.ts.map +1 -0
  76. package/dist/agent-session/schemas/session.js +58 -0
  77. package/dist/agent-session/schemas/session.js.map +1 -0
  78. package/dist/agent-session/schemas/session.mjs +30 -0
  79. package/dist/agent-session/schemas/session.mjs.map +1 -0
  80. package/dist/agent-session/schemas/turn.d.ts +494 -0
  81. package/dist/agent-session/schemas/turn.d.ts.map +1 -0
  82. package/dist/agent-session/schemas/turn.js +131 -0
  83. package/dist/agent-session/schemas/turn.js.map +1 -0
  84. package/dist/agent-session/schemas/turn.mjs +102 -0
  85. package/dist/agent-session/schemas/turn.mjs.map +1 -0
  86. package/dist/agent-session/store/ISessionStore.d.ts +310 -0
  87. package/dist/agent-session/store/ISessionStore.d.ts.map +1 -0
  88. package/dist/agent-session/store/ISessionStore.js +19 -0
  89. package/dist/agent-session/store/ISessionStore.js.map +1 -0
  90. package/dist/agent-session/store/ISessionStore.mjs +1 -0
  91. package/dist/agent-session/store/ISessionStore.mjs.map +1 -0
  92. package/dist/agent-session/store/InMemorySessionStore.d.ts +55 -0
  93. package/dist/agent-session/store/InMemorySessionStore.d.ts.map +1 -0
  94. package/dist/agent-session/store/InMemorySessionStore.js +475 -0
  95. package/dist/agent-session/store/InMemorySessionStore.js.map +1 -0
  96. package/dist/agent-session/store/InMemorySessionStore.mjs +461 -0
  97. package/dist/agent-session/store/InMemorySessionStore.mjs.map +1 -0
  98. package/dist/agent-session/store/OffsetPageToken.d.ts +13 -0
  99. package/dist/agent-session/store/OffsetPageToken.d.ts.map +1 -0
  100. package/dist/agent-session/store/OffsetPageToken.js +60 -0
  101. package/dist/agent-session/store/OffsetPageToken.js.map +1 -0
  102. package/dist/agent-session/store/OffsetPageToken.mjs +32 -0
  103. package/dist/agent-session/store/OffsetPageToken.mjs.map +1 -0
  104. package/dist/agent-session/store/PageToken.d.ts +4 -0
  105. package/dist/agent-session/store/PageToken.d.ts.map +1 -0
  106. package/dist/agent-session/store/PageToken.js +45 -0
  107. package/dist/agent-session/store/PageToken.js.map +1 -0
  108. package/dist/agent-session/store/PageToken.mjs +19 -0
  109. package/dist/agent-session/store/PageToken.mjs.map +1 -0
  110. package/dist/agent-session/store/SessionEventPageToken.d.ts +14 -0
  111. package/dist/agent-session/store/SessionEventPageToken.d.ts.map +1 -0
  112. package/dist/agent-session/store/SessionEventPageToken.js +70 -0
  113. package/dist/agent-session/store/SessionEventPageToken.js.map +1 -0
  114. package/dist/agent-session/store/SessionEventPageToken.mjs +42 -0
  115. package/dist/agent-session/store/SessionEventPageToken.mjs.map +1 -0
  116. package/dist/agent-session/store/SessionListPageToken.d.ts +24 -0
  117. package/dist/agent-session/store/SessionListPageToken.d.ts.map +1 -0
  118. package/dist/agent-session/store/SessionListPageToken.js +66 -0
  119. package/dist/agent-session/store/SessionListPageToken.js.map +1 -0
  120. package/dist/agent-session/store/SessionListPageToken.mjs +38 -0
  121. package/dist/agent-session/store/SessionListPageToken.mjs.map +1 -0
  122. package/dist/agent-session/store/SessionStoreErrors.d.ts +43 -0
  123. package/dist/agent-session/store/SessionStoreErrors.d.ts.map +1 -0
  124. package/dist/agent-session/store/SessionStoreErrors.js +126 -0
  125. package/dist/agent-session/store/SessionStoreErrors.js.map +1 -0
  126. package/dist/agent-session/store/SessionStoreErrors.mjs +92 -0
  127. package/dist/agent-session/store/SessionStoreErrors.mjs.map +1 -0
  128. package/dist/agent-session/store/assertCreateTurnThreadDelta.d.ts +18 -0
  129. package/dist/agent-session/store/assertCreateTurnThreadDelta.d.ts.map +1 -0
  130. package/dist/agent-session/store/assertCreateTurnThreadDelta.js +67 -0
  131. package/dist/agent-session/store/assertCreateTurnThreadDelta.js.map +1 -0
  132. package/dist/agent-session/store/assertCreateTurnThreadDelta.mjs +42 -0
  133. package/dist/agent-session/store/assertCreateTurnThreadDelta.mjs.map +1 -0
  134. package/dist/core/InstructionBuilder.d.ts +71 -0
  135. package/dist/core/InstructionBuilder.d.ts.map +1 -0
  136. package/dist/core/InstructionBuilder.js +95 -0
  137. package/dist/core/InstructionBuilder.js.map +1 -0
  138. package/dist/core/InstructionBuilder.mjs +69 -0
  139. package/dist/core/InstructionBuilder.mjs.map +1 -0
  140. package/dist/core/capabilities/AgentCapability.d.ts +32 -0
  141. package/dist/core/capabilities/AgentCapability.d.ts.map +1 -0
  142. package/dist/core/capabilities/AgentCapability.js +19 -0
  143. package/dist/core/capabilities/AgentCapability.js.map +1 -0
  144. package/dist/core/capabilities/AgentCapability.mjs +1 -0
  145. package/dist/core/capabilities/AgentCapability.mjs.map +1 -0
  146. package/dist/core/capabilities/AgentContextProcessor.d.ts +30 -0
  147. package/dist/core/capabilities/AgentContextProcessor.d.ts.map +1 -0
  148. package/dist/core/capabilities/AgentContextProcessor.js +19 -0
  149. package/dist/core/capabilities/AgentContextProcessor.js.map +1 -0
  150. package/dist/core/capabilities/AgentContextProcessor.mjs +1 -0
  151. package/dist/core/capabilities/AgentContextProcessor.mjs.map +1 -0
  152. package/dist/core/capabilities/ToolResponseProcessor.d.ts +12 -0
  153. package/dist/core/capabilities/ToolResponseProcessor.d.ts.map +1 -0
  154. package/dist/core/capabilities/ToolResponseProcessor.js +19 -0
  155. package/dist/core/capabilities/ToolResponseProcessor.js.map +1 -0
  156. package/dist/core/capabilities/ToolResponseProcessor.mjs +1 -0
  157. package/dist/core/capabilities/ToolResponseProcessor.mjs.map +1 -0
  158. package/dist/core/capabilities/builtins/AskUserQuestion.d.ts +11 -0
  159. package/dist/core/capabilities/builtins/AskUserQuestion.d.ts.map +1 -0
  160. package/dist/core/capabilities/builtins/AskUserQuestion.js +90 -0
  161. package/dist/core/capabilities/builtins/AskUserQuestion.js.map +1 -0
  162. package/dist/core/capabilities/builtins/AskUserQuestion.mjs +64 -0
  163. package/dist/core/capabilities/builtins/AskUserQuestion.mjs.map +1 -0
  164. package/dist/core/capabilities/builtins/ContextCompaction.d.ts +23 -0
  165. package/dist/core/capabilities/builtins/ContextCompaction.d.ts.map +1 -0
  166. package/dist/core/capabilities/builtins/ContextCompaction.js +235 -0
  167. package/dist/core/capabilities/builtins/ContextCompaction.js.map +1 -0
  168. package/dist/core/capabilities/builtins/ContextCompaction.mjs +208 -0
  169. package/dist/core/capabilities/builtins/ContextCompaction.mjs.map +1 -0
  170. package/dist/core/capabilities/builtins/CurrentDateTime.d.ts +17 -0
  171. package/dist/core/capabilities/builtins/CurrentDateTime.d.ts.map +1 -0
  172. package/dist/core/capabilities/builtins/CurrentDateTime.js +75 -0
  173. package/dist/core/capabilities/builtins/CurrentDateTime.js.map +1 -0
  174. package/dist/core/capabilities/builtins/CurrentDateTime.mjs +47 -0
  175. package/dist/core/capabilities/builtins/CurrentDateTime.mjs.map +1 -0
  176. package/dist/core/capabilities/builtins/DynamicSubAgents.d.ts +39 -0
  177. package/dist/core/capabilities/builtins/DynamicSubAgents.d.ts.map +1 -0
  178. package/dist/core/capabilities/builtins/DynamicSubAgents.js +176 -0
  179. package/dist/core/capabilities/builtins/DynamicSubAgents.js.map +1 -0
  180. package/dist/core/capabilities/builtins/DynamicSubAgents.mjs +134 -0
  181. package/dist/core/capabilities/builtins/DynamicSubAgents.mjs.map +1 -0
  182. package/dist/core/capabilities/builtins/LargeToolResponse.d.ts +40 -0
  183. package/dist/core/capabilities/builtins/LargeToolResponse.d.ts.map +1 -0
  184. package/dist/core/capabilities/builtins/LargeToolResponse.js +225 -0
  185. package/dist/core/capabilities/builtins/LargeToolResponse.js.map +1 -0
  186. package/dist/core/capabilities/builtins/LargeToolResponse.mjs +186 -0
  187. package/dist/core/capabilities/builtins/LargeToolResponse.mjs.map +1 -0
  188. package/dist/core/capabilities/builtins/OpenUI.d.ts +31 -0
  189. package/dist/core/capabilities/builtins/OpenUI.d.ts.map +1 -0
  190. package/dist/core/capabilities/builtins/OpenUI.js +376 -0
  191. package/dist/core/capabilities/builtins/OpenUI.js.map +1 -0
  192. package/dist/core/capabilities/builtins/OpenUI.mjs +326 -0
  193. package/dist/core/capabilities/builtins/OpenUI.mjs.map +1 -0
  194. package/dist/core/errors.d.ts +33 -0
  195. package/dist/core/errors.d.ts.map +1 -0
  196. package/dist/core/errors.js +88 -0
  197. package/dist/core/errors.js.map +1 -0
  198. package/dist/core/errors.mjs +57 -0
  199. package/dist/core/errors.mjs.map +1 -0
  200. package/dist/core/events/PassthroughEvents.d.ts +30 -0
  201. package/dist/core/events/PassthroughEvents.d.ts.map +1 -0
  202. package/dist/core/events/PassthroughEvents.js +19 -0
  203. package/dist/core/events/PassthroughEvents.js.map +1 -0
  204. package/dist/core/events/PassthroughEvents.mjs +1 -0
  205. package/dist/core/events/PassthroughEvents.mjs.map +1 -0
  206. package/dist/core/events/schema.d.ts +1103 -0
  207. package/dist/core/events/schema.d.ts.map +1 -0
  208. package/dist/core/events/schema.js +337 -0
  209. package/dist/core/events/schema.js.map +1 -0
  210. package/dist/core/events/schema.mjs +283 -0
  211. package/dist/core/events/schema.mjs.map +1 -0
  212. package/dist/core/index.d.ts +60 -0
  213. package/dist/core/index.d.ts.map +1 -0
  214. package/dist/core/index.js +209 -0
  215. package/dist/core/index.js.map +1 -0
  216. package/dist/core/index.mjs +144 -0
  217. package/dist/core/index.mjs.map +1 -0
  218. package/dist/core/llm/ILLM.d.ts +15 -0
  219. package/dist/core/llm/ILLM.d.ts.map +1 -0
  220. package/dist/core/llm/ILLM.js +19 -0
  221. package/dist/core/llm/ILLM.js.map +1 -0
  222. package/dist/core/llm/ILLM.mjs +1 -0
  223. package/dist/core/llm/ILLM.mjs.map +1 -0
  224. package/dist/core/llm/LLMTypes.d.ts +369 -0
  225. package/dist/core/llm/LLMTypes.d.ts.map +1 -0
  226. package/dist/core/llm/LLMTypes.js +170 -0
  227. package/dist/core/llm/LLMTypes.js.map +1 -0
  228. package/dist/core/llm/LLMTypes.mjs +133 -0
  229. package/dist/core/llm/LLMTypes.mjs.map +1 -0
  230. package/dist/core/llm/VercelAILLM.d.ts +228 -0
  231. package/dist/core/llm/VercelAILLM.d.ts.map +1 -0
  232. package/dist/core/llm/VercelAILLM.js +1042 -0
  233. package/dist/core/llm/VercelAILLM.js.map +1 -0
  234. package/dist/core/llm/VercelAILLM.mjs +999 -0
  235. package/dist/core/llm/VercelAILLM.mjs.map +1 -0
  236. package/dist/core/llm/openaiSchemas.d.ts +190 -0
  237. package/dist/core/llm/openaiSchemas.d.ts.map +1 -0
  238. package/dist/core/llm/openaiSchemas.js +144 -0
  239. package/dist/core/llm/openaiSchemas.js.map +1 -0
  240. package/dist/core/llm/openaiSchemas.mjs +107 -0
  241. package/dist/core/llm/openaiSchemas.mjs.map +1 -0
  242. package/dist/core/llm/responseFormat.d.ts +25 -0
  243. package/dist/core/llm/responseFormat.d.ts.map +1 -0
  244. package/dist/core/llm/responseFormat.js +58 -0
  245. package/dist/core/llm/responseFormat.js.map +1 -0
  246. package/dist/core/llm/responseFormat.mjs +32 -0
  247. package/dist/core/llm/responseFormat.mjs.map +1 -0
  248. package/dist/core/llm/toOpenAIChatMessage.d.ts +11 -0
  249. package/dist/core/llm/toOpenAIChatMessage.d.ts.map +1 -0
  250. package/dist/core/llm/toOpenAIChatMessage.js +95 -0
  251. package/dist/core/llm/toOpenAIChatMessage.js.map +1 -0
  252. package/dist/core/llm/toOpenAIChatMessage.mjs +70 -0
  253. package/dist/core/llm/toOpenAIChatMessage.mjs.map +1 -0
  254. package/dist/core/llm/usage.d.ts +4 -0
  255. package/dist/core/llm/usage.d.ts.map +1 -0
  256. package/dist/core/llm/usage.js +52 -0
  257. package/dist/core/llm/usage.js.map +1 -0
  258. package/dist/core/llm/usage.mjs +26 -0
  259. package/dist/core/llm/usage.mjs.map +1 -0
  260. package/dist/core/mcp/ClientSideTool.d.ts +10 -0
  261. package/dist/core/mcp/ClientSideTool.d.ts.map +1 -0
  262. package/dist/core/mcp/ClientSideTool.js +56 -0
  263. package/dist/core/mcp/ClientSideTool.js.map +1 -0
  264. package/dist/core/mcp/ClientSideTool.mjs +31 -0
  265. package/dist/core/mcp/ClientSideTool.mjs.map +1 -0
  266. package/dist/core/mcp/IMCPServer.d.ts +78 -0
  267. package/dist/core/mcp/IMCPServer.d.ts.map +1 -0
  268. package/dist/core/mcp/IMCPServer.js +63 -0
  269. package/dist/core/mcp/IMCPServer.js.map +1 -0
  270. package/dist/core/mcp/IMCPServer.mjs +33 -0
  271. package/dist/core/mcp/IMCPServer.mjs.map +1 -0
  272. package/dist/core/mcp/LocalToolMCP.d.ts +39 -0
  273. package/dist/core/mcp/LocalToolMCP.d.ts.map +1 -0
  274. package/dist/core/mcp/LocalToolMCP.js +121 -0
  275. package/dist/core/mcp/LocalToolMCP.js.map +1 -0
  276. package/dist/core/mcp/LocalToolMCP.mjs +98 -0
  277. package/dist/core/mcp/LocalToolMCP.mjs.map +1 -0
  278. package/dist/core/mcp/RemoteMCP.d.ts +67 -0
  279. package/dist/core/mcp/RemoteMCP.d.ts.map +1 -0
  280. package/dist/core/mcp/RemoteMCP.js +244 -0
  281. package/dist/core/mcp/RemoteMCP.js.map +1 -0
  282. package/dist/core/mcp/RemoteMCP.mjs +222 -0
  283. package/dist/core/mcp/RemoteMCP.mjs.map +1 -0
  284. package/dist/core/mcp/ToolSelectorPolicy.d.ts +52 -0
  285. package/dist/core/mcp/ToolSelectorPolicy.d.ts.map +1 -0
  286. package/dist/core/mcp/ToolSelectorPolicy.js +108 -0
  287. package/dist/core/mcp/ToolSelectorPolicy.js.map +1 -0
  288. package/dist/core/mcp/ToolSelectorPolicy.mjs +90 -0
  289. package/dist/core/mcp/ToolSelectorPolicy.mjs.map +1 -0
  290. package/dist/core/mcp/ToolSet.d.ts +31 -0
  291. package/dist/core/mcp/ToolSet.d.ts.map +1 -0
  292. package/dist/core/mcp/ToolSet.js +119 -0
  293. package/dist/core/mcp/ToolSet.js.map +1 -0
  294. package/dist/core/mcp/ToolSet.mjs +98 -0
  295. package/dist/core/mcp/ToolSet.mjs.map +1 -0
  296. package/dist/core/mcp/convertMCPServers.d.ts +22 -0
  297. package/dist/core/mcp/convertMCPServers.d.ts.map +1 -0
  298. package/dist/core/mcp/convertMCPServers.js +89 -0
  299. package/dist/core/mcp/convertMCPServers.js.map +1 -0
  300. package/dist/core/mcp/convertMCPServers.mjs +64 -0
  301. package/dist/core/mcp/convertMCPServers.mjs.map +1 -0
  302. package/dist/core/mcp/executeToolCalls.d.ts +31 -0
  303. package/dist/core/mcp/executeToolCalls.d.ts.map +1 -0
  304. package/dist/core/mcp/executeToolCalls.js +168 -0
  305. package/dist/core/mcp/executeToolCalls.js.map +1 -0
  306. package/dist/core/mcp/executeToolCalls.mjs +149 -0
  307. package/dist/core/mcp/executeToolCalls.mjs.map +1 -0
  308. package/dist/core/mcp/pagination.d.ts +11 -0
  309. package/dist/core/mcp/pagination.d.ts.map +1 -0
  310. package/dist/core/mcp/pagination.js +49 -0
  311. package/dist/core/mcp/pagination.js.map +1 -0
  312. package/dist/core/mcp/pagination.mjs +24 -0
  313. package/dist/core/mcp/pagination.mjs.map +1 -0
  314. package/dist/core/mcp/remoteMcpClient.d.ts +36 -0
  315. package/dist/core/mcp/remoteMcpClient.d.ts.map +1 -0
  316. package/dist/core/mcp/remoteMcpClient.js +138 -0
  317. package/dist/core/mcp/remoteMcpClient.js.map +1 -0
  318. package/dist/core/mcp/remoteMcpClient.mjs +112 -0
  319. package/dist/core/mcp/remoteMcpClient.mjs.map +1 -0
  320. package/dist/core/mcp/toolNames.d.ts +6 -0
  321. package/dist/core/mcp/toolNames.d.ts.map +1 -0
  322. package/dist/core/mcp/toolNames.js +59 -0
  323. package/dist/core/mcp/toolNames.js.map +1 -0
  324. package/dist/core/mcp/toolNames.mjs +33 -0
  325. package/dist/core/mcp/toolNames.mjs.map +1 -0
  326. package/dist/core/mcp/toolSelectors.d.ts +28 -0
  327. package/dist/core/mcp/toolSelectors.d.ts.map +1 -0
  328. package/dist/core/mcp/toolSelectors.js +113 -0
  329. package/dist/core/mcp/toolSelectors.js.map +1 -0
  330. package/dist/core/mcp/toolSelectors.mjs +78 -0
  331. package/dist/core/mcp/toolSelectors.mjs.map +1 -0
  332. package/dist/core/runtime/AgentDefinition.d.ts +23 -0
  333. package/dist/core/runtime/AgentDefinition.d.ts.map +1 -0
  334. package/dist/core/runtime/AgentDefinition.js +19 -0
  335. package/dist/core/runtime/AgentDefinition.js.map +1 -0
  336. package/dist/core/runtime/AgentDefinition.mjs +1 -0
  337. package/dist/core/runtime/AgentDefinition.mjs.map +1 -0
  338. package/dist/core/runtime/AgentThread.d.ts +64 -0
  339. package/dist/core/runtime/AgentThread.d.ts.map +1 -0
  340. package/dist/core/runtime/AgentThread.js +1065 -0
  341. package/dist/core/runtime/AgentThread.js.map +1 -0
  342. package/dist/core/runtime/AgentThread.mjs +1062 -0
  343. package/dist/core/runtime/AgentThread.mjs.map +1 -0
  344. package/dist/core/runtime/AgentThread.types.d.ts +123 -0
  345. package/dist/core/runtime/AgentThread.types.d.ts.map +1 -0
  346. package/dist/core/runtime/AgentThread.types.js +46 -0
  347. package/dist/core/runtime/AgentThread.types.js.map +1 -0
  348. package/dist/core/runtime/AgentThread.types.mjs +20 -0
  349. package/dist/core/runtime/AgentThread.types.mjs.map +1 -0
  350. package/dist/core/runtime/AgentThreadOrchestrator.d.ts +35 -0
  351. package/dist/core/runtime/AgentThreadOrchestrator.d.ts.map +1 -0
  352. package/dist/core/runtime/AgentThreadOrchestrator.js +433 -0
  353. package/dist/core/runtime/AgentThreadOrchestrator.js.map +1 -0
  354. package/dist/core/runtime/AgentThreadOrchestrator.mjs +418 -0
  355. package/dist/core/runtime/AgentThreadOrchestrator.mjs.map +1 -0
  356. package/dist/core/runtime/CreateDynamicSubAgentThread.d.ts +11 -0
  357. package/dist/core/runtime/CreateDynamicSubAgentThread.d.ts.map +1 -0
  358. package/dist/core/runtime/CreateDynamicSubAgentThread.js +19 -0
  359. package/dist/core/runtime/CreateDynamicSubAgentThread.js.map +1 -0
  360. package/dist/core/runtime/CreateDynamicSubAgentThread.mjs +1 -0
  361. package/dist/core/runtime/CreateDynamicSubAgentThread.mjs.map +1 -0
  362. package/dist/core/runtime/DeferredTool.d.ts +34 -0
  363. package/dist/core/runtime/DeferredTool.d.ts.map +1 -0
  364. package/dist/core/runtime/DeferredTool.js +321 -0
  365. package/dist/core/runtime/DeferredTool.js.map +1 -0
  366. package/dist/core/runtime/DeferredTool.mjs +287 -0
  367. package/dist/core/runtime/DeferredTool.mjs.map +1 -0
  368. package/dist/core/runtime/OpenToolCallCloser.d.ts +21 -0
  369. package/dist/core/runtime/OpenToolCallCloser.d.ts.map +1 -0
  370. package/dist/core/runtime/OpenToolCallCloser.js +92 -0
  371. package/dist/core/runtime/OpenToolCallCloser.js.map +1 -0
  372. package/dist/core/runtime/OpenToolCallCloser.mjs +66 -0
  373. package/dist/core/runtime/OpenToolCallCloser.mjs.map +1 -0
  374. package/dist/core/runtime/UserInputMessage.d.ts +16 -0
  375. package/dist/core/runtime/UserInputMessage.d.ts.map +1 -0
  376. package/dist/core/runtime/UserInputMessage.js +183 -0
  377. package/dist/core/runtime/UserInputMessage.js.map +1 -0
  378. package/dist/core/runtime/UserInputMessage.mjs +157 -0
  379. package/dist/core/runtime/UserInputMessage.mjs.map +1 -0
  380. package/dist/core/runtime/contextUsage.d.ts +17 -0
  381. package/dist/core/runtime/contextUsage.d.ts.map +1 -0
  382. package/dist/core/runtime/contextUsage.js +56 -0
  383. package/dist/core/runtime/contextUsage.js.map +1 -0
  384. package/dist/core/runtime/contextUsage.mjs +28 -0
  385. package/dist/core/runtime/contextUsage.mjs.map +1 -0
  386. package/dist/core/runtime/contextUtils.d.ts +30 -0
  387. package/dist/core/runtime/contextUtils.d.ts.map +1 -0
  388. package/dist/core/runtime/contextUtils.js +198 -0
  389. package/dist/core/runtime/contextUtils.js.map +1 -0
  390. package/dist/core/runtime/contextUtils.mjs +148 -0
  391. package/dist/core/runtime/contextUtils.mjs.map +1 -0
  392. package/dist/core/runtime/metrics.d.ts +22 -0
  393. package/dist/core/runtime/metrics.d.ts.map +1 -0
  394. package/dist/core/runtime/metrics.js +89 -0
  395. package/dist/core/runtime/metrics.js.map +1 -0
  396. package/dist/core/runtime/metrics.mjs +61 -0
  397. package/dist/core/runtime/metrics.mjs.map +1 -0
  398. package/dist/core/sandbox/Sandbox.d.ts +121 -0
  399. package/dist/core/sandbox/Sandbox.d.ts.map +1 -0
  400. package/dist/core/sandbox/Sandbox.js +572 -0
  401. package/dist/core/sandbox/Sandbox.js.map +1 -0
  402. package/dist/core/sandbox/Sandbox.mjs +536 -0
  403. package/dist/core/sandbox/Sandbox.mjs.map +1 -0
  404. package/dist/core/sandbox/SandboxErrors.d.ts +30 -0
  405. package/dist/core/sandbox/SandboxErrors.d.ts.map +1 -0
  406. package/dist/core/sandbox/SandboxErrors.js +102 -0
  407. package/dist/core/sandbox/SandboxErrors.js.map +1 -0
  408. package/dist/core/sandbox/SandboxErrors.mjs +71 -0
  409. package/dist/core/sandbox/SandboxErrors.mjs.map +1 -0
  410. package/dist/core/sandbox/SandboxNatsBridge.d.ts +33 -0
  411. package/dist/core/sandbox/SandboxNatsBridge.d.ts.map +1 -0
  412. package/dist/core/sandbox/SandboxNatsBridge.js +222 -0
  413. package/dist/core/sandbox/SandboxNatsBridge.js.map +1 -0
  414. package/dist/core/sandbox/SandboxNatsBridge.mjs +201 -0
  415. package/dist/core/sandbox/SandboxNatsBridge.mjs.map +1 -0
  416. package/dist/core/sandbox/constants.d.ts +10 -0
  417. package/dist/core/sandbox/constants.d.ts.map +1 -0
  418. package/dist/core/sandbox/constants.js +37 -0
  419. package/dist/core/sandbox/constants.js.map +1 -0
  420. package/dist/core/sandbox/constants.mjs +10 -0
  421. package/dist/core/sandbox/constants.mjs.map +1 -0
  422. package/dist/core/sandbox/provider/DaytonaProvider.d.ts +80 -0
  423. package/dist/core/sandbox/provider/DaytonaProvider.d.ts.map +1 -0
  424. package/dist/core/sandbox/provider/DaytonaProvider.js +346 -0
  425. package/dist/core/sandbox/provider/DaytonaProvider.js.map +1 -0
  426. package/dist/core/sandbox/provider/DaytonaProvider.mjs +326 -0
  427. package/dist/core/sandbox/provider/DaytonaProvider.mjs.map +1 -0
  428. package/dist/core/sandbox/provider/Provider.d.ts +83 -0
  429. package/dist/core/sandbox/provider/Provider.d.ts.map +1 -0
  430. package/dist/core/sandbox/provider/Provider.js +43 -0
  431. package/dist/core/sandbox/provider/Provider.js.map +1 -0
  432. package/dist/core/sandbox/provider/Provider.mjs +17 -0
  433. package/dist/core/sandbox/provider/Provider.mjs.map +1 -0
  434. package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts +41 -0
  435. package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts.map +1 -0
  436. package/dist/core/sandbox/provider/TFYSandboxProvider.js +180 -0
  437. package/dist/core/sandbox/provider/TFYSandboxProvider.js.map +1 -0
  438. package/dist/core/sandbox/provider/TFYSandboxProvider.mjs +147 -0
  439. package/dist/core/sandbox/provider/TFYSandboxProvider.mjs.map +1 -0
  440. package/dist/core/sandbox/sandboxImage.d.ts +6 -0
  441. package/dist/core/sandbox/sandboxImage.d.ts.map +1 -0
  442. package/dist/core/sandbox/sandboxImage.js +31 -0
  443. package/dist/core/sandbox/sandboxImage.js.map +1 -0
  444. package/dist/core/sandbox/sandboxImage.mjs +6 -0
  445. package/dist/core/sandbox/sandboxImage.mjs.map +1 -0
  446. package/dist/core/sandbox/sandboxScripts.gen.d.ts +5 -0
  447. package/dist/core/sandbox/sandboxScripts.gen.d.ts.map +1 -0
  448. package/dist/core/sandbox/sandboxScripts.gen.js +343 -0
  449. package/dist/core/sandbox/sandboxScripts.gen.js.map +1 -0
  450. package/dist/core/sandbox/sandboxScripts.gen.mjs +318 -0
  451. package/dist/core/sandbox/sandboxScripts.gen.mjs.map +1 -0
  452. package/dist/core/sandbox/skills/ISkillMounter.d.ts +7 -0
  453. package/dist/core/sandbox/skills/ISkillMounter.d.ts.map +1 -0
  454. package/dist/core/sandbox/skills/ISkillMounter.js +19 -0
  455. package/dist/core/sandbox/skills/ISkillMounter.js.map +1 -0
  456. package/dist/core/sandbox/skills/ISkillMounter.mjs +1 -0
  457. package/dist/core/sandbox/skills/ISkillMounter.mjs.map +1 -0
  458. package/dist/core/sandbox/skills/SkillMounter.d.ts +17 -0
  459. package/dist/core/sandbox/skills/SkillMounter.d.ts.map +1 -0
  460. package/dist/core/sandbox/skills/SkillMounter.js +73 -0
  461. package/dist/core/sandbox/skills/SkillMounter.js.map +1 -0
  462. package/dist/core/sandbox/skills/SkillMounter.mjs +48 -0
  463. package/dist/core/sandbox/skills/SkillMounter.mjs.map +1 -0
  464. package/dist/core/sandbox/skills/constants.d.ts +10 -0
  465. package/dist/core/sandbox/skills/constants.d.ts.map +1 -0
  466. package/dist/core/sandbox/skills/constants.js +56 -0
  467. package/dist/core/sandbox/skills/constants.js.map +1 -0
  468. package/dist/core/sandbox/skills/constants.mjs +28 -0
  469. package/dist/core/sandbox/skills/constants.mjs.map +1 -0
  470. package/dist/core/sandbox/skills/index.d.ts +5 -0
  471. package/dist/core/sandbox/skills/index.d.ts.map +1 -0
  472. package/dist/core/sandbox/skills/index.js +40 -0
  473. package/dist/core/sandbox/skills/index.js.map +1 -0
  474. package/dist/core/sandbox/skills/index.mjs +11 -0
  475. package/dist/core/sandbox/skills/index.mjs.map +1 -0
  476. package/dist/core/tracing/AgentTracing.d.ts +38 -0
  477. package/dist/core/tracing/AgentTracing.d.ts.map +1 -0
  478. package/dist/core/tracing/AgentTracing.js +19 -0
  479. package/dist/core/tracing/AgentTracing.js.map +1 -0
  480. package/dist/core/tracing/AgentTracing.mjs +1 -0
  481. package/dist/core/tracing/AgentTracing.mjs.map +1 -0
  482. package/dist/core/tracing/NoopAgentTracing.d.ts +3 -0
  483. package/dist/core/tracing/NoopAgentTracing.d.ts.map +1 -0
  484. package/dist/core/tracing/NoopAgentTracing.js +79 -0
  485. package/dist/core/tracing/NoopAgentTracing.js.map +1 -0
  486. package/dist/core/tracing/NoopAgentTracing.mjs +54 -0
  487. package/dist/core/tracing/NoopAgentTracing.mjs.map +1 -0
  488. package/dist/core/util/abort.d.ts +2 -0
  489. package/dist/core/util/abort.d.ts.map +1 -0
  490. package/dist/core/util/abort.js +38 -0
  491. package/dist/core/util/abort.js.map +1 -0
  492. package/dist/core/util/abort.mjs +13 -0
  493. package/dist/core/util/abort.mjs.map +1 -0
  494. package/dist/core/util/errorLogFields.d.ts +6 -0
  495. package/dist/core/util/errorLogFields.d.ts.map +1 -0
  496. package/dist/core/util/errorLogFields.js +36 -0
  497. package/dist/core/util/errorLogFields.js.map +1 -0
  498. package/dist/core/util/errorLogFields.mjs +11 -0
  499. package/dist/core/util/errorLogFields.mjs.map +1 -0
  500. package/dist/core/util/promiseUtils.d.ts +7 -0
  501. package/dist/core/util/promiseUtils.d.ts.map +1 -0
  502. package/dist/core/util/promiseUtils.js +82 -0
  503. package/dist/core/util/promiseUtils.js.map +1 -0
  504. package/dist/core/util/promiseUtils.mjs +55 -0
  505. package/dist/core/util/promiseUtils.mjs.map +1 -0
  506. package/dist/index.d.ts +7 -0
  507. package/dist/index.d.ts.map +1 -0
  508. package/dist/index.js +44 -0
  509. package/dist/index.js.map +1 -0
  510. package/dist/index.mjs +8 -0
  511. package/dist/index.mjs.map +1 -0
  512. package/dist/package.json +3 -0
  513. package/dist/request-reply/client.d.ts +21 -0
  514. package/dist/request-reply/client.d.ts.map +1 -0
  515. package/dist/request-reply/client.js +92 -0
  516. package/dist/request-reply/client.js.map +1 -0
  517. package/dist/request-reply/client.mjs +67 -0
  518. package/dist/request-reply/client.mjs.map +1 -0
  519. package/dist/request-reply/errors.d.ts +23 -0
  520. package/dist/request-reply/errors.d.ts.map +1 -0
  521. package/dist/request-reply/errors.js +66 -0
  522. package/dist/request-reply/errors.js.map +1 -0
  523. package/dist/request-reply/errors.mjs +39 -0
  524. package/dist/request-reply/errors.mjs.map +1 -0
  525. package/dist/request-reply/executor.d.ts +70 -0
  526. package/dist/request-reply/executor.d.ts.map +1 -0
  527. package/dist/request-reply/executor.js +267 -0
  528. package/dist/request-reply/executor.js.map +1 -0
  529. package/dist/request-reply/executor.mjs +232 -0
  530. package/dist/request-reply/executor.mjs.map +1 -0
  531. package/dist/request-reply/index.d.ts +16 -0
  532. package/dist/request-reply/index.d.ts.map +1 -0
  533. package/dist/request-reply/index.js +47 -0
  534. package/dist/request-reply/index.js.map +1 -0
  535. package/dist/request-reply/index.mjs +16 -0
  536. package/dist/request-reply/index.mjs.map +1 -0
  537. package/dist/request-reply/router.d.ts +20 -0
  538. package/dist/request-reply/router.d.ts.map +1 -0
  539. package/dist/request-reply/router.js +55 -0
  540. package/dist/request-reply/router.js.map +1 -0
  541. package/dist/request-reply/router.mjs +30 -0
  542. package/dist/request-reply/router.mjs.map +1 -0
  543. package/dist/request-reply/types.d.ts +25 -0
  544. package/dist/request-reply/types.d.ts.map +1 -0
  545. package/dist/request-reply/types.js +54 -0
  546. package/dist/request-reply/types.js.map +1 -0
  547. package/dist/request-reply/types.mjs +28 -0
  548. package/dist/request-reply/types.mjs.map +1 -0
  549. package/dist/request-reply/utils.d.ts +9 -0
  550. package/dist/request-reply/utils.d.ts.map +1 -0
  551. package/dist/request-reply/utils.js +51 -0
  552. package/dist/request-reply/utils.js.map +1 -0
  553. package/dist/request-reply/utils.mjs +22 -0
  554. package/dist/request-reply/utils.mjs.map +1 -0
  555. package/package.json +127 -6
  556. package/README.md +0 -4
  557. package/index.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/runtime/DeferredTool.ts"],"sourcesContent":["import type { CallToolRequest } from '@modelcontextprotocol/sdk/types.js';\nimport dedent from 'dedent';\nimport type { Logger } from 'winston';\nimport { z } from 'zod';\nimport type { ApprovalDecision } from '../events/schema';\nimport { InstructionBuilder } from '../InstructionBuilder';\nimport type { InternalToolCallInfo } from '../llm/LLMTypes';\nimport {\n type AgentToolSchema,\n type CallToolResponse,\n isApprovalRequiredResponse,\n isAuthRequired,\n isCallToolResponseResult,\n type IToolSet,\n type ListToolsResolvedResponse,\n toolResultResponse,\n} from '../mcp/IMCPServer';\nimport { defineTool, LocalToolMCP, type ToolDefinition } from '../mcp/LocalToolMCP';\nimport type { AgentTracing } from '../tracing/AgentTracing';\nimport { extractErrorLogFields } from '../util/errorLogFields';\n\nexport const DEFERRED_TOOLS_SERVER_ID = 'deferred-tools';\nconst DEFERRED_TOOLS_INSTRUCTION = 'deferred-tools-instructions';\nexport const LIST_TOOLS_NAME = 'list_tools';\nexport const GET_TOOL_INFO_NAME = 'get_tool_info';\nexport const GET_TOOL_OUTPUT_SCHEMA_NAME = 'get_tool_output_schema';\nconst CALL_TOOL_NAME = 'call_tool';\nconst MAX_DESCRIPTION_LENGTH = 200;\n\nconst listToolsSchema = z.object({\n mcp_server: z.string().describe('Name of the MCP server to list tools for.'),\n});\n\nconst getToolInfoSchema = z.object({\n mcp_server: z.string().describe('Name of the MCP server.'),\n tool_name: z.string().describe('Name of the tool to inspect.'),\n});\n\nconst getToolOutputSchemaSchema = z.object({\n mcp_server: z.string().describe('Name of the MCP server.'),\n tool_name: z.string().describe('Name of the tool to get output schema for.'),\n});\n\nconst callToolSchema = z.object({\n mcp_server: z.string().describe('Name of the MCP server.'),\n tool_name: z.string().describe('Name of the tool to call.'),\n input: z.record(z.string(), z.unknown()).default({}).describe('Arguments to pass to the tool.'),\n});\n\ninterface ResolvedServerTools {\n server: IToolSet;\n tools: AgentToolSchema[];\n metadata: Omit<ListToolsResolvedResponse, 'result'>;\n}\n\nfunction isResolvedServerTools(result: CallToolResponse | ResolvedServerTools): result is ResolvedServerTools {\n return 'tools' in result;\n}\n\nexport class DeferredTool extends LocalToolMCP {\n readonly name = DEFERRED_TOOLS_SERVER_ID;\n readonly displayName = 'DeferredTools';\n override readonly description = 'Deferred tool loading for user MCP servers';\n\n private readonly serverMap: Map<string, IToolSet>;\n private readonly tools: ToolDefinition[];\n private readonly logger: Logger;\n\n constructor(\n servers: readonly IToolSet[],\n options: {\n tracing: AgentTracing;\n logger: Logger;\n },\n ) {\n super({ tracing: options.tracing });\n this.logger = options.logger.child({ module: 'DeferredTool' });\n this.serverMap = new Map(servers.map(s => [s.name, s]));\n this.tools = this.buildTools();\n }\n\n buildInstruction(builder: InstructionBuilder): void {\n const servers = [...this.serverMap.values()];\n\n // Membership follows `preload` only (origin/main). Selective `preload_tools` /\n // `hasPreloadedTools` must not hide a server from deferred discovery instructions.\n const deferredServers = servers.filter(s => !s.preload);\n\n if (deferredServers.length === 0) return;\n\n const deferredList = deferredServers\n .map(s => (s.description ? `- ${s.name}: \"${s.description.slice(0, MAX_DESCRIPTION_LENGTH)}\"` : `- ${s.name}`))\n .join('\\n');\n\n builder.addSection(\n DEFERRED_TOOLS_INSTRUCTION,\n dedent`\n The following MCP servers have deferred tool loading. Their tools are NOT pre-loaded.\n ${deferredList}\n\n The Agent MUST use ${LIST_TOOLS_NAME} and ${GET_TOOL_INFO_NAME} to discover tools before calling them.`,\n );\n }\n\n protected getTools(): ToolDefinition[] {\n return this.tools;\n }\n\n override async toolCallInfo(\n params: CallToolRequest['params'],\n resolveUnderlyingTool?: boolean,\n ): Promise<InternalToolCallInfo> {\n if (params.name !== CALL_TOOL_NAME) {\n return super.toolCallInfo(params, resolveUnderlyingTool);\n }\n if (resolveUnderlyingTool === false) {\n const base = await super.toolCallInfo(params, resolveUnderlyingTool);\n return { ...base, is_deferred: true };\n }\n const parsed = callToolSchema.safeParse(params.arguments);\n if (!parsed.success) {\n this.logger.warn(`Failed to parse call_tool arguments`, {\n tool: params.name,\n errors: parsed.error.issues,\n });\n return { ...(await super.toolCallInfo(params)), is_deferred: true };\n }\n const server = this.resolveServer(parsed.data.mcp_server);\n if (!server) {\n this.logger.warn(`Server not found for toolCallInfo`, {\n mcpServer: parsed.data.mcp_server,\n toolName: parsed.data.tool_name,\n availableServers: [...this.serverMap.keys()],\n });\n return { ...(await super.toolCallInfo(params)), is_deferred: true };\n }\n const underlying = await server.toolCallInfo({\n name: parsed.data.tool_name,\n arguments: parsed.data.input,\n });\n return { ...underlying, is_deferred: true };\n }\n\n private resolveServer(name: string): IToolSet | undefined {\n return this.serverMap.get(name);\n }\n\n private async resolveServerTools(mcpServer: string): Promise<CallToolResponse | ResolvedServerTools> {\n const server = this.resolveServer(mcpServer);\n if (!server) {\n return toolResultResponse({\n text: JSON.stringify({ error: `MCP server '${mcpServer}' not found` }),\n isError: true,\n });\n }\n\n const listResponse = await server.listTools();\n if (isAuthRequired(listResponse)) {\n return listResponse;\n }\n const { result, ...metadata } = listResponse;\n return { server, tools: result.tools, metadata };\n }\n\n private buildTools(): ToolDefinition[] {\n return [this.buildListTools(), this.buildGetToolInfo(), this.buildGetToolOutputSchema(), this.buildCallTool()];\n }\n\n private buildListTools(): ToolDefinition {\n return defineTool({\n name: LIST_TOOLS_NAME,\n description: dedent`\n List tool names available on an MCP server.\n Returns tool names only — use ${GET_TOOL_INFO_NAME} to get full details before calling a tool.`,\n schema: listToolsSchema,\n handler: async (input: { mcp_server: string }) => {\n try {\n const resolved = await this.resolveServerTools(input.mcp_server);\n if (!isResolvedServerTools(resolved)) return resolved;\n const { server, tools, metadata } = resolved;\n return toolResultResponse({\n text: `${server.name}:\\n ${tools.map(t => t.name).join(', ')}`,\n overrides: metadata,\n });\n } catch (error) {\n this.logger.error('list_tools failed', {\n ...extractErrorLogFields(error),\n mcpServer: input.mcp_server,\n });\n return toolResultResponse({\n text: JSON.stringify({ error: `Failed to list tools for '${input.mcp_server}'.` }),\n isError: true,\n });\n }\n },\n });\n }\n\n private buildGetToolInfo(): ToolDefinition {\n return defineTool({\n name: GET_TOOL_INFO_NAME,\n description: dedent`\n Get description, inputSchema and outputSchema for a specific tool on an MCP server.\n If outputSchema is null, it will NOT be present in ${GET_TOOL_OUTPUT_SCHEMA_NAME} as well.\n The Agent MUST call ${LIST_TOOLS_NAME} first to know which tools are available.`,\n schema: getToolInfoSchema,\n handler: async (input: { mcp_server: string; tool_name: string }) => {\n try {\n const resolved = await this.resolveServerTools(input.mcp_server);\n if (!isResolvedServerTools(resolved)) return resolved;\n const { tools, metadata } = resolved;\n const tool = tools.find(t => t.name === input.tool_name);\n if (!tool) {\n return toolResultResponse({\n text: JSON.stringify({ error: `Tool '${input.tool_name}' not found on server '${input.mcp_server}'` }),\n overrides: metadata,\n isError: true,\n });\n }\n\n return toolResultResponse({\n text: JSON.stringify({\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema ?? null,\n }),\n overrides: metadata,\n });\n } catch (error) {\n this.logger.error('get_tool_info failed', {\n ...extractErrorLogFields(error),\n mcpServer: input.mcp_server,\n toolName: input.tool_name,\n });\n return toolResultResponse({\n text: JSON.stringify({\n error: `Failed to get tool info: ${error instanceof Error ? error.message : 'unknown'}`,\n }),\n isError: true,\n });\n }\n },\n });\n }\n\n private buildGetToolOutputSchema(): ToolDefinition {\n return defineTool({\n name: GET_TOOL_OUTPUT_SCHEMA_NAME,\n description: dedent`\n Get the outputSchema for a specific tool on an MCP server.\n The Agent MUST not call ${GET_TOOL_OUTPUT_SCHEMA_NAME} and ${GET_TOOL_INFO_NAME} for the same tool.\n The Agent MUST either call ${GET_TOOL_OUTPUT_SCHEMA_NAME} or ${GET_TOOL_INFO_NAME} before entering Code Mode.\n The Agent must NOT assume the structure of a tool's response from its name or description alone.`,\n schema: getToolOutputSchemaSchema,\n handler: async (input: { mcp_server: string; tool_name: string }) => {\n try {\n const resolved = await this.resolveServerTools(input.mcp_server);\n if (!isResolvedServerTools(resolved)) return resolved;\n const { tools, metadata } = resolved;\n const tool = tools.find(t => t.name === input.tool_name);\n if (!tool) {\n return toolResultResponse({\n text: JSON.stringify({ error: `Tool '${input.tool_name}' not found on server '${input.mcp_server}'` }),\n overrides: metadata,\n isError: true,\n });\n }\n\n return toolResultResponse({\n text: JSON.stringify({\n outputSchema: tool.outputSchema ?? null,\n }),\n overrides: metadata,\n });\n } catch (error) {\n this.logger.error('get_tool_output_schema failed', {\n ...extractErrorLogFields(error),\n mcpServer: input.mcp_server,\n toolName: input.tool_name,\n });\n return toolResultResponse({\n text: JSON.stringify({\n error: `Failed to get output schema: ${error instanceof Error ? error.message : 'unknown'}`,\n }),\n isError: true,\n });\n }\n },\n });\n }\n\n private buildCallTool(): ToolDefinition {\n return defineTool({\n name: CALL_TOOL_NAME,\n description: dedent`\n Call a tool on an MCP server.\n The Agent MUST call ${LIST_TOOLS_NAME} and ${GET_TOOL_INFO_NAME} before calling a tool.`,\n schema: callToolSchema,\n handler: async (\n input: { mcp_server: string; tool_name: string; input: Record<string, unknown> },\n approvalDecision?: ApprovalDecision,\n ) => {\n const server = this.resolveServer(input.mcp_server);\n if (!server) {\n return toolResultResponse({\n text: JSON.stringify({ error: `MCP server '${input.mcp_server}' not found` }),\n isError: true,\n });\n }\n\n try {\n const response = await server.callTool({ name: input.tool_name, arguments: input.input }, approvalDecision);\n\n if (isAuthRequired(response)) {\n return response;\n }\n\n if (isApprovalRequiredResponse(response)) return response;\n\n if (!isCallToolResponseResult(response)) {\n throw new Error('Tool call returned an unexpected sub-agent response');\n }\n\n return response;\n } catch (error) {\n this.logger.error('call_tool failed', {\n ...extractErrorLogFields(error),\n mcpServer: input.mcp_server,\n toolName: input.tool_name,\n });\n return toolResultResponse({\n text: JSON.stringify({ error: `Tool call failed: ${error instanceof Error ? error.message : 'unknown'}` }),\n isError: true,\n });\n }\n },\n });\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * OpenToolCallCloser - Context processor that closes unresolved tool calls.
3
+ *
4
+ * When an assistant message contains tool_calls but corresponding tool response
5
+ * messages are missing (e.g., due to a failed or interrupted tool execution),
6
+ * LLMs will reject the request. This processor detects such cases in the
7
+ * **last** assistant message and appends dummy tool responses so the
8
+ * conversation can continue.
9
+ *
10
+ * Uses is_thread_creation from InternalToolCallInfo to identify sub-agent
11
+ * tool calls (which should remain open); does NOT use SUB_AGENTS_SERVER_ID.
12
+ * Older persisted contexts without is_thread_creation follow the ordinary
13
+ * non-thread-creation path (no compatibility fallback).
14
+ */
15
+ import type { AgentContextProcessorAppendContext, AgentThreadExecutionContext, PreSendContextProcessor } from '../capabilities/AgentContextProcessor';
16
+ import type { ContextMessage } from './AgentThread.types';
17
+ export declare function getClosableOpenToolCallIds(context: ContextMessage[]): Set<string>;
18
+ export declare class OpenToolCallCloser implements PreSendContextProcessor {
19
+ processPreSend(execution: Readonly<AgentThreadExecutionContext>): AsyncGenerator<AgentContextProcessorAppendContext, void, unknown>;
20
+ }
21
+ //# sourceMappingURL=OpenToolCallCloser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenToolCallCloser.d.ts","sourceRoot":"","sources":["../../../src/core/runtime/OpenToolCallCloser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EACV,kCAAkC,EAClC,2BAA2B,EAC3B,uBAAuB,EACxB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAS1D,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAqCjF;AAED,qBAAa,kBAAmB,YAAW,uBAAuB;IAEzD,cAAc,CACnB,SAAS,EAAE,QAAQ,CAAC,2BAA2B,CAAC,GAC/C,cAAc,CAAC,kCAAkC,EAAE,IAAI,EAAE,OAAO,CAAC,CAuBnE;CACF"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/core/runtime/OpenToolCallCloser.ts
21
+ var OpenToolCallCloser_exports = {};
22
+ __export(OpenToolCallCloser_exports, {
23
+ OpenToolCallCloser: () => OpenToolCallCloser,
24
+ getClosableOpenToolCallIds: () => getClosableOpenToolCallIds
25
+ });
26
+ module.exports = __toCommonJS(OpenToolCallCloser_exports);
27
+ var import_AgentThread = require("./AgentThread.types.js");
28
+ var import_contextUsage = require("./contextUsage.js");
29
+ var import_contextUtils = require("./contextUtils.js");
30
+ var DUMMY_TOOL_MESSAGE_CONTENT = JSON.stringify({
31
+ error: "Tool call was not executed. Please retry this tool call."
32
+ });
33
+ function getClosableOpenToolCallIds(context) {
34
+ const lastIdx = context.findLastIndex(
35
+ (msg) => (0, import_contextUtils.isLLMContextMessage)(msg) && msg.role === "assistant" && !!msg.tool_calls?.length
36
+ );
37
+ if (lastIdx === -1) {
38
+ return /* @__PURE__ */ new Set();
39
+ }
40
+ const lastAssistant = context[lastIdx];
41
+ if (lastAssistant === void 0 || !(0, import_contextUtils.isLLMContextMessage)(lastAssistant) || lastAssistant.role !== "assistant") {
42
+ throw new Error("Unreachable");
43
+ }
44
+ if (!lastAssistant.tool_calls) {
45
+ return /* @__PURE__ */ new Set();
46
+ }
47
+ if (lastAssistant.tool_calls.some(
48
+ (tc) => tc.tool_info.is_approval_required === true || tc.tool_info.is_client_side === true
49
+ )) {
50
+ return /* @__PURE__ */ new Set();
51
+ }
52
+ const requestedIds = new Set(
53
+ lastAssistant.tool_calls.filter((tc) => tc.tool_info.is_thread_creation !== true).map((tc) => tc.id)
54
+ );
55
+ const messagesAfterAssistant = context.slice(lastIdx + 1);
56
+ for (const msg of messagesAfterAssistant) {
57
+ if ((0, import_contextUtils.isLLMContextMessage)(msg) && msg.role === "tool") {
58
+ requestedIds.delete(msg.tool_call_id);
59
+ }
60
+ }
61
+ return requestedIds;
62
+ }
63
+ var OpenToolCallCloser = class {
64
+ // eslint-disable-next-line @typescript-eslint/require-await -- async *: AsyncIterable contract; body is sync
65
+ async *processPreSend(execution) {
66
+ const requestedIds = getClosableOpenToolCallIds(execution.context);
67
+ if (requestedIds.size === 0) {
68
+ return;
69
+ }
70
+ const dummyToolMessages = [...requestedIds].map((toolCallId) => ({
71
+ role: "tool",
72
+ tool_call_id: toolCallId,
73
+ content: DUMMY_TOOL_MESSAGE_CONTENT
74
+ }));
75
+ const currentContextUsage = (0, import_contextUsage.mergeCurrentContextUsage)(
76
+ execution.currentContextUsage,
77
+ (0, import_contextUtils.estimateTokensForContextMessages)(dummyToolMessages)
78
+ );
79
+ yield {
80
+ type: import_AgentThread.InternalEventType.AGENT_CONTEXT_APPEND,
81
+ context: dummyToolMessages,
82
+ output: [],
83
+ current_context_usage: currentContextUsage
84
+ };
85
+ }
86
+ };
87
+ // Annotate the CommonJS export names for ESM import in node:
88
+ 0 && (module.exports = {
89
+ OpenToolCallCloser,
90
+ getClosableOpenToolCallIds
91
+ });
92
+ //# sourceMappingURL=OpenToolCallCloser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/runtime/OpenToolCallCloser.ts"],"sourcesContent":["/**\n * OpenToolCallCloser - Context processor that closes unresolved tool calls.\n *\n * When an assistant message contains tool_calls but corresponding tool response\n * messages are missing (e.g., due to a failed or interrupted tool execution),\n * LLMs will reject the request. This processor detects such cases in the\n * **last** assistant message and appends dummy tool responses so the\n * conversation can continue.\n *\n * Uses is_thread_creation from InternalToolCallInfo to identify sub-agent\n * tool calls (which should remain open); does NOT use SUB_AGENTS_SERVER_ID.\n * Older persisted contexts without is_thread_creation follow the ordinary\n * non-thread-creation path (no compatibility fallback).\n */\nimport type {\n AgentContextProcessorAppendContext,\n AgentThreadExecutionContext,\n PreSendContextProcessor,\n} from '../capabilities/AgentContextProcessor';\nimport type { InternalEnrichedAssistantMessage, LLMToolMessage } from '../llm/LLMTypes';\nimport type { ContextMessage } from './AgentThread.types';\nimport { InternalEventType } from './AgentThread.types';\nimport { mergeCurrentContextUsage } from './contextUsage';\nimport { estimateTokensForContextMessages, isLLMContextMessage } from './contextUtils';\n\nconst DUMMY_TOOL_MESSAGE_CONTENT = JSON.stringify({\n error: 'Tool call was not executed. Please retry this tool call.',\n});\n\nexport function getClosableOpenToolCallIds(context: ContextMessage[]): Set<string> {\n const lastIdx = context.findLastIndex(\n (msg): msg is InternalEnrichedAssistantMessage =>\n isLLMContextMessage(msg) && msg.role === 'assistant' && !!msg.tool_calls?.length,\n );\n if (lastIdx === -1) {\n return new Set();\n }\n\n const lastAssistant = context[lastIdx];\n if (lastAssistant === undefined || !isLLMContextMessage(lastAssistant) || lastAssistant.role !== 'assistant') {\n throw new Error('Unreachable');\n }\n if (!lastAssistant.tool_calls) {\n return new Set();\n }\n\n if (\n lastAssistant.tool_calls.some(\n tc => tc.tool_info.is_approval_required === true || tc.tool_info.is_client_side === true,\n )\n ) {\n return new Set();\n }\n\n const requestedIds = new Set(\n lastAssistant.tool_calls.filter(tc => tc.tool_info.is_thread_creation !== true).map(tc => tc.id),\n );\n\n const messagesAfterAssistant = context.slice(lastIdx + 1);\n for (const msg of messagesAfterAssistant) {\n if (isLLMContextMessage(msg) && msg.role === 'tool') {\n requestedIds.delete(msg.tool_call_id);\n }\n }\n\n return requestedIds;\n}\n\nexport class OpenToolCallCloser implements PreSendContextProcessor {\n // eslint-disable-next-line @typescript-eslint/require-await -- async *: AsyncIterable contract; body is sync\n async *processPreSend(\n execution: Readonly<AgentThreadExecutionContext>,\n ): AsyncGenerator<AgentContextProcessorAppendContext, void, unknown> {\n const requestedIds = getClosableOpenToolCallIds(execution.context);\n if (requestedIds.size === 0) {\n return;\n }\n\n const dummyToolMessages: LLMToolMessage[] = [...requestedIds].map(toolCallId => ({\n role: 'tool',\n tool_call_id: toolCallId,\n content: DUMMY_TOOL_MESSAGE_CONTENT,\n }));\n\n const currentContextUsage = mergeCurrentContextUsage(\n execution.currentContextUsage,\n estimateTokensForContextMessages(dummyToolMessages),\n );\n\n yield {\n type: InternalEventType.AGENT_CONTEXT_APPEND,\n context: dummyToolMessages,\n output: [],\n current_context_usage: currentContextUsage,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA,yBAAkC;AAClC,0BAAyC;AACzC,0BAAsE;AAEtE,IAAM,6BAA6B,KAAK,UAAU;AAAA,EAChD,OAAO;AACT,CAAC;AAEM,SAAS,2BAA2B,SAAwC;AACjF,QAAM,UAAU,QAAQ;AAAA,IACtB,CAAC,YACC,yCAAoB,GAAG,KAAK,IAAI,SAAS,eAAe,CAAC,CAAC,IAAI,YAAY;AAAA,EAC9E;AACA,MAAI,YAAY,IAAI;AAClB,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,gBAAgB,QAAQ,OAAO;AACrC,MAAI,kBAAkB,UAAa,KAAC,yCAAoB,aAAa,KAAK,cAAc,SAAS,aAAa;AAC5G,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B;AACA,MAAI,CAAC,cAAc,YAAY;AAC7B,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,MACE,cAAc,WAAW;AAAA,IACvB,QAAM,GAAG,UAAU,yBAAyB,QAAQ,GAAG,UAAU,mBAAmB;AAAA,EACtF,GACA;AACA,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,eAAe,IAAI;AAAA,IACvB,cAAc,WAAW,OAAO,QAAM,GAAG,UAAU,uBAAuB,IAAI,EAAE,IAAI,QAAM,GAAG,EAAE;AAAA,EACjG;AAEA,QAAM,yBAAyB,QAAQ,MAAM,UAAU,CAAC;AACxD,aAAW,OAAO,wBAAwB;AACxC,YAAI,yCAAoB,GAAG,KAAK,IAAI,SAAS,QAAQ;AACnD,mBAAa,OAAO,IAAI,YAAY;AAAA,IACtC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,qBAAN,MAA4D;AAAA;AAAA,EAEjE,OAAO,eACL,WACmE;AACnE,UAAM,eAAe,2BAA2B,UAAU,OAAO;AACjE,QAAI,aAAa,SAAS,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,oBAAsC,CAAC,GAAG,YAAY,EAAE,IAAI,iBAAe;AAAA,MAC/E,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,IACX,EAAE;AAEF,UAAM,0BAAsB;AAAA,MAC1B,UAAU;AAAA,UACV,sDAAiC,iBAAiB;AAAA,IACpD;AAEA,UAAM;AAAA,MACJ,MAAM,qCAAkB;AAAA,MACxB,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,uBAAuB;AAAA,IACzB;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,66 @@
1
+ // src/core/runtime/OpenToolCallCloser.ts
2
+ import { InternalEventType } from "./AgentThread.types.mjs";
3
+ import { mergeCurrentContextUsage } from "./contextUsage.mjs";
4
+ import { estimateTokensForContextMessages, isLLMContextMessage } from "./contextUtils.mjs";
5
+ var DUMMY_TOOL_MESSAGE_CONTENT = JSON.stringify({
6
+ error: "Tool call was not executed. Please retry this tool call."
7
+ });
8
+ function getClosableOpenToolCallIds(context) {
9
+ const lastIdx = context.findLastIndex(
10
+ (msg) => isLLMContextMessage(msg) && msg.role === "assistant" && !!msg.tool_calls?.length
11
+ );
12
+ if (lastIdx === -1) {
13
+ return /* @__PURE__ */ new Set();
14
+ }
15
+ const lastAssistant = context[lastIdx];
16
+ if (lastAssistant === void 0 || !isLLMContextMessage(lastAssistant) || lastAssistant.role !== "assistant") {
17
+ throw new Error("Unreachable");
18
+ }
19
+ if (!lastAssistant.tool_calls) {
20
+ return /* @__PURE__ */ new Set();
21
+ }
22
+ if (lastAssistant.tool_calls.some(
23
+ (tc) => tc.tool_info.is_approval_required === true || tc.tool_info.is_client_side === true
24
+ )) {
25
+ return /* @__PURE__ */ new Set();
26
+ }
27
+ const requestedIds = new Set(
28
+ lastAssistant.tool_calls.filter((tc) => tc.tool_info.is_thread_creation !== true).map((tc) => tc.id)
29
+ );
30
+ const messagesAfterAssistant = context.slice(lastIdx + 1);
31
+ for (const msg of messagesAfterAssistant) {
32
+ if (isLLMContextMessage(msg) && msg.role === "tool") {
33
+ requestedIds.delete(msg.tool_call_id);
34
+ }
35
+ }
36
+ return requestedIds;
37
+ }
38
+ var OpenToolCallCloser = class {
39
+ // eslint-disable-next-line @typescript-eslint/require-await -- async *: AsyncIterable contract; body is sync
40
+ async *processPreSend(execution) {
41
+ const requestedIds = getClosableOpenToolCallIds(execution.context);
42
+ if (requestedIds.size === 0) {
43
+ return;
44
+ }
45
+ const dummyToolMessages = [...requestedIds].map((toolCallId) => ({
46
+ role: "tool",
47
+ tool_call_id: toolCallId,
48
+ content: DUMMY_TOOL_MESSAGE_CONTENT
49
+ }));
50
+ const currentContextUsage = mergeCurrentContextUsage(
51
+ execution.currentContextUsage,
52
+ estimateTokensForContextMessages(dummyToolMessages)
53
+ );
54
+ yield {
55
+ type: InternalEventType.AGENT_CONTEXT_APPEND,
56
+ context: dummyToolMessages,
57
+ output: [],
58
+ current_context_usage: currentContextUsage
59
+ };
60
+ }
61
+ };
62
+ export {
63
+ OpenToolCallCloser,
64
+ getClosableOpenToolCallIds
65
+ };
66
+ //# sourceMappingURL=OpenToolCallCloser.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/runtime/OpenToolCallCloser.ts"],"sourcesContent":["/**\n * OpenToolCallCloser - Context processor that closes unresolved tool calls.\n *\n * When an assistant message contains tool_calls but corresponding tool response\n * messages are missing (e.g., due to a failed or interrupted tool execution),\n * LLMs will reject the request. This processor detects such cases in the\n * **last** assistant message and appends dummy tool responses so the\n * conversation can continue.\n *\n * Uses is_thread_creation from InternalToolCallInfo to identify sub-agent\n * tool calls (which should remain open); does NOT use SUB_AGENTS_SERVER_ID.\n * Older persisted contexts without is_thread_creation follow the ordinary\n * non-thread-creation path (no compatibility fallback).\n */\nimport type {\n AgentContextProcessorAppendContext,\n AgentThreadExecutionContext,\n PreSendContextProcessor,\n} from '../capabilities/AgentContextProcessor';\nimport type { InternalEnrichedAssistantMessage, LLMToolMessage } from '../llm/LLMTypes';\nimport type { ContextMessage } from './AgentThread.types';\nimport { InternalEventType } from './AgentThread.types';\nimport { mergeCurrentContextUsage } from './contextUsage';\nimport { estimateTokensForContextMessages, isLLMContextMessage } from './contextUtils';\n\nconst DUMMY_TOOL_MESSAGE_CONTENT = JSON.stringify({\n error: 'Tool call was not executed. Please retry this tool call.',\n});\n\nexport function getClosableOpenToolCallIds(context: ContextMessage[]): Set<string> {\n const lastIdx = context.findLastIndex(\n (msg): msg is InternalEnrichedAssistantMessage =>\n isLLMContextMessage(msg) && msg.role === 'assistant' && !!msg.tool_calls?.length,\n );\n if (lastIdx === -1) {\n return new Set();\n }\n\n const lastAssistant = context[lastIdx];\n if (lastAssistant === undefined || !isLLMContextMessage(lastAssistant) || lastAssistant.role !== 'assistant') {\n throw new Error('Unreachable');\n }\n if (!lastAssistant.tool_calls) {\n return new Set();\n }\n\n if (\n lastAssistant.tool_calls.some(\n tc => tc.tool_info.is_approval_required === true || tc.tool_info.is_client_side === true,\n )\n ) {\n return new Set();\n }\n\n const requestedIds = new Set(\n lastAssistant.tool_calls.filter(tc => tc.tool_info.is_thread_creation !== true).map(tc => tc.id),\n );\n\n const messagesAfterAssistant = context.slice(lastIdx + 1);\n for (const msg of messagesAfterAssistant) {\n if (isLLMContextMessage(msg) && msg.role === 'tool') {\n requestedIds.delete(msg.tool_call_id);\n }\n }\n\n return requestedIds;\n}\n\nexport class OpenToolCallCloser implements PreSendContextProcessor {\n // eslint-disable-next-line @typescript-eslint/require-await -- async *: AsyncIterable contract; body is sync\n async *processPreSend(\n execution: Readonly<AgentThreadExecutionContext>,\n ): AsyncGenerator<AgentContextProcessorAppendContext, void, unknown> {\n const requestedIds = getClosableOpenToolCallIds(execution.context);\n if (requestedIds.size === 0) {\n return;\n }\n\n const dummyToolMessages: LLMToolMessage[] = [...requestedIds].map(toolCallId => ({\n role: 'tool',\n tool_call_id: toolCallId,\n content: DUMMY_TOOL_MESSAGE_CONTENT,\n }));\n\n const currentContextUsage = mergeCurrentContextUsage(\n execution.currentContextUsage,\n estimateTokensForContextMessages(dummyToolMessages),\n );\n\n yield {\n type: InternalEventType.AGENT_CONTEXT_APPEND,\n context: dummyToolMessages,\n output: [],\n current_context_usage: currentContextUsage,\n };\n }\n}\n"],"mappings":";AAqBA,SAAS,yBAAyB;AAClC,SAAS,gCAAgC;AACzC,SAAS,kCAAkC,2BAA2B;AAEtE,IAAM,6BAA6B,KAAK,UAAU;AAAA,EAChD,OAAO;AACT,CAAC;AAEM,SAAS,2BAA2B,SAAwC;AACjF,QAAM,UAAU,QAAQ;AAAA,IACtB,CAAC,QACC,oBAAoB,GAAG,KAAK,IAAI,SAAS,eAAe,CAAC,CAAC,IAAI,YAAY;AAAA,EAC9E;AACA,MAAI,YAAY,IAAI;AAClB,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,gBAAgB,QAAQ,OAAO;AACrC,MAAI,kBAAkB,UAAa,CAAC,oBAAoB,aAAa,KAAK,cAAc,SAAS,aAAa;AAC5G,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B;AACA,MAAI,CAAC,cAAc,YAAY;AAC7B,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,MACE,cAAc,WAAW;AAAA,IACvB,QAAM,GAAG,UAAU,yBAAyB,QAAQ,GAAG,UAAU,mBAAmB;AAAA,EACtF,GACA;AACA,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,eAAe,IAAI;AAAA,IACvB,cAAc,WAAW,OAAO,QAAM,GAAG,UAAU,uBAAuB,IAAI,EAAE,IAAI,QAAM,GAAG,EAAE;AAAA,EACjG;AAEA,QAAM,yBAAyB,QAAQ,MAAM,UAAU,CAAC;AACxD,aAAW,OAAO,wBAAwB;AACxC,QAAI,oBAAoB,GAAG,KAAK,IAAI,SAAS,QAAQ;AACnD,mBAAa,OAAO,IAAI,YAAY;AAAA,IACtC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,qBAAN,MAA4D;AAAA;AAAA,EAEjE,OAAO,eACL,WACmE;AACnE,UAAM,eAAe,2BAA2B,UAAU,OAAO;AACjE,QAAI,aAAa,SAAS,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,oBAAsC,CAAC,GAAG,YAAY,EAAE,IAAI,iBAAe;AAAA,MAC/E,MAAM;AAAA,MACN,cAAc;AAAA,MACd,SAAS;AAAA,IACX,EAAE;AAEF,UAAM,sBAAsB;AAAA,MAC1B,UAAU;AAAA,MACV,iCAAiC,iBAAiB;AAAA,IACpD;AAEA,UAAM;AAAA,MACJ,MAAM,kBAAkB;AAAA,MACxB,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,uBAAuB;AAAA,IACzB;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,16 @@
1
+ import { type AgentInputUserMessage, type FileContentPart, type TextContentPart, type UserContentPart } from '../events/schema';
2
+ import type { LLMUserMessage } from '../llm/LLMTypes';
3
+ import type { Sandbox, SandboxInfo } from '../sandbox/Sandbox';
4
+ import type { AgentSendInput } from './AgentThread.types';
5
+ export type { AgentInputUserMessage, FileContentPart, TextContentPart, UserContentPart };
6
+ export type AgentUserMessageContent = AgentInputUserMessage['content'];
7
+ export type AgentUserContentPart = UserContentPart;
8
+ export declare function isFileContentPart(part: UserContentPart): part is FileContentPart;
9
+ export declare function isAgentInputUserMessage(msg: AgentSendInput): msg is AgentInputUserMessage;
10
+ export declare function isEmptyMessageContent(content: AgentUserMessageContent): boolean;
11
+ export interface ProcessAgentUserInputResult {
12
+ message: LLMUserMessage;
13
+ sandboxCreated?: SandboxInfo | undefined;
14
+ }
15
+ export declare function processAgentUserInput(msg: AgentInputUserMessage, sandbox: Sandbox | undefined): Promise<ProcessAgentUserInputResult>;
16
+ //# sourceMappingURL=UserInputMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserInputMessage.d.ts","sourceRoot":"","sources":["../../../src/core/runtime/UserInputMessage.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AAEzF,MAAM,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;AACvE,MAAM,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAEnD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,IAAI,eAAe,CAEhF;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,cAAc,GAAG,GAAG,IAAI,qBAAqB,CAEzF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAE/E;AA+ED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC1C;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,qBAAqB,EAC1B,OAAO,EAAE,OAAO,GAAG,SAAS,GAC3B,OAAO,CAAC,2BAA2B,CAAC,CAoFtC"}
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/core/runtime/UserInputMessage.ts
21
+ var UserInputMessage_exports = {};
22
+ __export(UserInputMessage_exports, {
23
+ isAgentInputUserMessage: () => isAgentInputUserMessage,
24
+ isEmptyMessageContent: () => isEmptyMessageContent,
25
+ isFileContentPart: () => isFileContentPart,
26
+ processAgentUserInput: () => processAgentUserInput
27
+ });
28
+ module.exports = __toCommonJS(UserInputMessage_exports);
29
+ var import_errors = require("../errors.js");
30
+ var import_schema = require("../events/schema.js");
31
+ var import_contextUtils = require("./contextUtils.js");
32
+ function isFileContentPart(part) {
33
+ return part.type === "file";
34
+ }
35
+ function isAgentInputUserMessage(msg) {
36
+ return "type" in msg && msg.type === import_schema.EventType.USER_MESSAGE;
37
+ }
38
+ function isEmptyMessageContent(content) {
39
+ return typeof content === "string" ? content.trim().length === 0 : content.length === 0;
40
+ }
41
+ var INLINE_MIME_PREFIXES = ["image/", "application/pdf"];
42
+ function isInlineMime(mime) {
43
+ return INLINE_MIME_PREFIXES.some((prefix) => mime.startsWith(prefix));
44
+ }
45
+ function isImageMime(mime) {
46
+ return mime.startsWith("image/");
47
+ }
48
+ function parseMimeFromFileData(fileData) {
49
+ const match = /^data:([^;,]+)/.exec(fileData);
50
+ if (!match?.[1]) {
51
+ throw new import_errors.InvalidFileInputError("File data URI is missing or has unparseable MIME type");
52
+ }
53
+ return match[1];
54
+ }
55
+ function extractBase64(dataUri) {
56
+ const commaIndex = dataUri.indexOf(",");
57
+ if (commaIndex === -1) {
58
+ throw new import_errors.InvalidFileInputError("File data URI has no base64 payload");
59
+ }
60
+ const raw = dataUri.substring(commaIndex + 1);
61
+ if (!raw) {
62
+ throw new import_errors.InvalidFileInputError("File data URI has empty base64 payload");
63
+ }
64
+ const buffer = Buffer.from(raw, "base64");
65
+ if (buffer.length === 0) {
66
+ throw new import_errors.InvalidFileInputError("File data URI decoded to zero bytes");
67
+ }
68
+ return buffer;
69
+ }
70
+ function validatePublicFilename(filename) {
71
+ if (!filename.length) {
72
+ throw new import_errors.InvalidFileInputError("File name must not be empty");
73
+ }
74
+ const normalized = filename.replace(/\\/g, "/");
75
+ const parts = normalized.split("/");
76
+ for (const part of parts) {
77
+ if (part === "..") {
78
+ throw new import_errors.InvalidFileInputError(`File name contains path traversal: ${filename}`);
79
+ }
80
+ }
81
+ }
82
+ function buildUploadedFilesAnnouncement(files) {
83
+ const entries = files.map(
84
+ (f, i) => `[file_${String(i + 1)}]
85
+ filename: ${f.filename}
86
+ path: ${f.path}
87
+ mime: ${f.mime}
88
+ size: ${String(f.size)} bytes`
89
+ ).join("\n\n");
90
+ return (0, import_contextUtils.internalSystemTag)(`Uploaded files (${String(files.length)}):
91
+ ${entries}`);
92
+ }
93
+ function partitionContent(parts) {
94
+ const fileParts = [];
95
+ const textParts = [];
96
+ for (const part of parts) {
97
+ if (isFileContentPart(part)) {
98
+ fileParts.push(part);
99
+ } else {
100
+ textParts.push(part);
101
+ }
102
+ }
103
+ return { fileParts, textParts };
104
+ }
105
+ async function processAgentUserInput(msg, sandbox) {
106
+ if (typeof msg.content === "string") {
107
+ return { message: { role: "user", content: msg.content }, sandboxCreated: void 0 };
108
+ }
109
+ const { fileParts, textParts } = partitionContent(msg.content);
110
+ if (fileParts.length === 0) {
111
+ return { message: { role: "user", content: textParts }, sandboxCreated: void 0 };
112
+ }
113
+ const modelParts = [];
114
+ const filesToUploadToSandbox = [];
115
+ for (const filePart of fileParts) {
116
+ const filename = filePart.name.replace(/^\/+/, "");
117
+ if (!filename.length) {
118
+ throw new import_errors.InvalidFileInputError("File name must not be empty");
119
+ }
120
+ validatePublicFilename(filename);
121
+ const file_data = filePart.data;
122
+ const mime = parseMimeFromFileData(file_data);
123
+ if (isInlineMime(mime)) {
124
+ modelParts.push(
125
+ isImageMime(mime) ? { type: "image_url", image_url: { url: file_data } } : { type: "file", file: { filename, file_data } }
126
+ );
127
+ } else {
128
+ const buffer = extractBase64(file_data);
129
+ filesToUploadToSandbox.push({ filename, buffer, mime });
130
+ }
131
+ }
132
+ let sandboxCreated;
133
+ if (filesToUploadToSandbox.length > 0) {
134
+ if (!sandbox) {
135
+ throw new import_errors.AgentSandboxRequiredError(
136
+ "File uploads requiring sandbox are not supported: no sandbox configured for this agent"
137
+ );
138
+ }
139
+ const uploadResults = await Promise.allSettled(
140
+ filesToUploadToSandbox.map(
141
+ (file) => sandbox.uploadUserFile({
142
+ fileName: file.filename,
143
+ content: file.buffer,
144
+ mime: file.mime
145
+ })
146
+ )
147
+ );
148
+ const uploadedFiles = [];
149
+ for (let i = 0; i < uploadResults.length; i++) {
150
+ const result = uploadResults[i];
151
+ const file = filesToUploadToSandbox[i];
152
+ if (result === void 0 || file === void 0) {
153
+ throw new Error("Unreachable: uploadResults/files length mismatch");
154
+ }
155
+ if (result.status === "fulfilled") {
156
+ if (result.value.sandboxCreated) {
157
+ sandboxCreated = result.value.sandboxCreated;
158
+ }
159
+ uploadedFiles.push({
160
+ filename: file.filename,
161
+ path: result.value.filePath,
162
+ mime: file.mime,
163
+ size: file.buffer.length
164
+ });
165
+ } else {
166
+ throw result.reason;
167
+ }
168
+ }
169
+ if (uploadedFiles.length > 0) {
170
+ modelParts.push({ type: "text", text: buildUploadedFilesAnnouncement(uploadedFiles) });
171
+ }
172
+ }
173
+ modelParts.push(...textParts);
174
+ return { message: { role: "user", content: modelParts }, sandboxCreated };
175
+ }
176
+ // Annotate the CommonJS export names for ESM import in node:
177
+ 0 && (module.exports = {
178
+ isAgentInputUserMessage,
179
+ isEmptyMessageContent,
180
+ isFileContentPart,
181
+ processAgentUserInput
182
+ });
183
+ //# sourceMappingURL=UserInputMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/runtime/UserInputMessage.ts"],"sourcesContent":["import type { ChatCompletionContentPart } from 'openai/resources/chat';\nimport { AgentSandboxRequiredError, InvalidFileInputError } from '../errors';\nimport {\n EventType,\n type AgentInputUserMessage,\n type FileContentPart,\n type TextContentPart,\n type UserContentPart,\n} from '../events/schema';\nimport type { LLMUserMessage } from '../llm/LLMTypes';\nimport type { Sandbox, SandboxInfo } from '../sandbox/Sandbox';\nimport type { AgentSendInput } from './AgentThread.types';\nimport { internalSystemTag } from './contextUtils';\n\nexport type { AgentInputUserMessage, FileContentPart, TextContentPart, UserContentPart };\n\nexport type AgentUserMessageContent = AgentInputUserMessage['content'];\nexport type AgentUserContentPart = UserContentPart;\n\nexport function isFileContentPart(part: UserContentPart): part is FileContentPart {\n return part.type === 'file';\n}\n\nexport function isAgentInputUserMessage(msg: AgentSendInput): msg is AgentInputUserMessage {\n return 'type' in msg && msg.type === EventType.USER_MESSAGE;\n}\n\nexport function isEmptyMessageContent(content: AgentUserMessageContent): boolean {\n return typeof content === 'string' ? content.trim().length === 0 : content.length === 0;\n}\n\nconst INLINE_MIME_PREFIXES = ['image/', 'application/pdf'];\n\nfunction isInlineMime(mime: string): boolean {\n return INLINE_MIME_PREFIXES.some(prefix => mime.startsWith(prefix));\n}\n\nfunction isImageMime(mime: string): boolean {\n return mime.startsWith('image/');\n}\n\nfunction parseMimeFromFileData(fileData: string): string {\n const match = /^data:([^;,]+)/.exec(fileData);\n if (!match?.[1]) {\n throw new InvalidFileInputError('File data URI is missing or has unparseable MIME type');\n }\n return match[1];\n}\n\nfunction extractBase64(dataUri: string): Buffer {\n const commaIndex = dataUri.indexOf(',');\n if (commaIndex === -1) {\n throw new InvalidFileInputError('File data URI has no base64 payload');\n }\n const raw = dataUri.substring(commaIndex + 1);\n if (!raw) {\n throw new InvalidFileInputError('File data URI has empty base64 payload');\n }\n const buffer = Buffer.from(raw, 'base64');\n if (buffer.length === 0) {\n throw new InvalidFileInputError('File data URI decoded to zero bytes');\n }\n return buffer;\n}\n\nfunction validatePublicFilename(filename: string): void {\n if (!filename.length) {\n throw new InvalidFileInputError('File name must not be empty');\n }\n const normalized = filename.replace(/\\\\/g, '/');\n const parts = normalized.split('/');\n for (const part of parts) {\n if (part === '..') {\n throw new InvalidFileInputError(`File name contains path traversal: ${filename}`);\n }\n }\n}\n\nfunction buildUploadedFilesAnnouncement(\n files: { filename: string; path: string; mime: string; size: number }[],\n): string {\n const entries = files\n .map(\n (f, i) =>\n `[file_${String(i + 1)}]\\n filename: ${f.filename}\\n path: ${f.path}\\n mime: ${f.mime}\\n size: ${String(f.size)} bytes`,\n )\n .join('\\n\\n');\n return internalSystemTag(`Uploaded files (${String(files.length)}):\\n${entries}`);\n}\n\nfunction partitionContent(parts: readonly AgentUserContentPart[]): {\n fileParts: FileContentPart[];\n textParts: TextContentPart[];\n} {\n const fileParts: FileContentPart[] = [];\n const textParts: TextContentPart[] = [];\n\n for (const part of parts) {\n if (isFileContentPart(part)) {\n fileParts.push(part);\n } else {\n textParts.push(part);\n }\n }\n\n return { fileParts, textParts };\n}\n\nexport interface ProcessAgentUserInputResult {\n message: LLMUserMessage;\n sandboxCreated?: SandboxInfo | undefined;\n}\n\nexport async function processAgentUserInput(\n msg: AgentInputUserMessage,\n sandbox: Sandbox | undefined,\n): Promise<ProcessAgentUserInputResult> {\n if (typeof msg.content === 'string') {\n return { message: { role: 'user', content: msg.content }, sandboxCreated: undefined };\n }\n\n const { fileParts, textParts } = partitionContent(msg.content);\n\n if (fileParts.length === 0) {\n return { message: { role: 'user', content: textParts }, sandboxCreated: undefined };\n }\n\n const modelParts: ChatCompletionContentPart[] = [];\n const filesToUploadToSandbox: { filename: string; buffer: Buffer; mime: string }[] = [];\n\n for (const filePart of fileParts) {\n const filename = filePart.name.replace(/^\\/+/, '');\n if (!filename.length) {\n throw new InvalidFileInputError('File name must not be empty');\n }\n validatePublicFilename(filename);\n\n const file_data = filePart.data;\n const mime = parseMimeFromFileData(file_data);\n\n if (isInlineMime(mime)) {\n modelParts.push(\n isImageMime(mime)\n ? { type: 'image_url', image_url: { url: file_data } }\n : { type: 'file', file: { filename, file_data } },\n );\n } else {\n const buffer = extractBase64(file_data);\n filesToUploadToSandbox.push({ filename, buffer, mime });\n }\n }\n\n let sandboxCreated: SandboxInfo | undefined;\n\n if (filesToUploadToSandbox.length > 0) {\n if (!sandbox) {\n throw new AgentSandboxRequiredError(\n 'File uploads requiring sandbox are not supported: no sandbox configured for this agent',\n );\n }\n\n const uploadResults = await Promise.allSettled(\n filesToUploadToSandbox.map(file =>\n sandbox.uploadUserFile({\n fileName: file.filename,\n content: file.buffer,\n mime: file.mime,\n }),\n ),\n );\n\n const uploadedFiles: { filename: string; path: string; mime: string; size: number }[] = [];\n for (let i = 0; i < uploadResults.length; i++) {\n const result = uploadResults[i];\n const file = filesToUploadToSandbox[i];\n if (result === undefined || file === undefined) {\n throw new Error('Unreachable: uploadResults/files length mismatch');\n }\n if (result.status === 'fulfilled') {\n if (result.value.sandboxCreated) {\n sandboxCreated = result.value.sandboxCreated;\n }\n uploadedFiles.push({\n filename: file.filename,\n path: result.value.filePath,\n mime: file.mime,\n size: file.buffer.length,\n });\n } else {\n throw result.reason;\n }\n }\n if (uploadedFiles.length > 0) {\n modelParts.push({ type: 'text', text: buildUploadedFilesAnnouncement(uploadedFiles) });\n }\n }\n\n modelParts.push(...textParts);\n\n return { message: { role: 'user', content: modelParts }, sandboxCreated };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,157 @@
1
+ // src/core/runtime/UserInputMessage.ts
2
+ import { AgentSandboxRequiredError, InvalidFileInputError } from "../errors.mjs";
3
+ import {
4
+ EventType
5
+ } from "../events/schema.mjs";
6
+ import { internalSystemTag } from "./contextUtils.mjs";
7
+ function isFileContentPart(part) {
8
+ return part.type === "file";
9
+ }
10
+ function isAgentInputUserMessage(msg) {
11
+ return "type" in msg && msg.type === EventType.USER_MESSAGE;
12
+ }
13
+ function isEmptyMessageContent(content) {
14
+ return typeof content === "string" ? content.trim().length === 0 : content.length === 0;
15
+ }
16
+ var INLINE_MIME_PREFIXES = ["image/", "application/pdf"];
17
+ function isInlineMime(mime) {
18
+ return INLINE_MIME_PREFIXES.some((prefix) => mime.startsWith(prefix));
19
+ }
20
+ function isImageMime(mime) {
21
+ return mime.startsWith("image/");
22
+ }
23
+ function parseMimeFromFileData(fileData) {
24
+ const match = /^data:([^;,]+)/.exec(fileData);
25
+ if (!match?.[1]) {
26
+ throw new InvalidFileInputError("File data URI is missing or has unparseable MIME type");
27
+ }
28
+ return match[1];
29
+ }
30
+ function extractBase64(dataUri) {
31
+ const commaIndex = dataUri.indexOf(",");
32
+ if (commaIndex === -1) {
33
+ throw new InvalidFileInputError("File data URI has no base64 payload");
34
+ }
35
+ const raw = dataUri.substring(commaIndex + 1);
36
+ if (!raw) {
37
+ throw new InvalidFileInputError("File data URI has empty base64 payload");
38
+ }
39
+ const buffer = Buffer.from(raw, "base64");
40
+ if (buffer.length === 0) {
41
+ throw new InvalidFileInputError("File data URI decoded to zero bytes");
42
+ }
43
+ return buffer;
44
+ }
45
+ function validatePublicFilename(filename) {
46
+ if (!filename.length) {
47
+ throw new InvalidFileInputError("File name must not be empty");
48
+ }
49
+ const normalized = filename.replace(/\\/g, "/");
50
+ const parts = normalized.split("/");
51
+ for (const part of parts) {
52
+ if (part === "..") {
53
+ throw new InvalidFileInputError(`File name contains path traversal: ${filename}`);
54
+ }
55
+ }
56
+ }
57
+ function buildUploadedFilesAnnouncement(files) {
58
+ const entries = files.map(
59
+ (f, i) => `[file_${String(i + 1)}]
60
+ filename: ${f.filename}
61
+ path: ${f.path}
62
+ mime: ${f.mime}
63
+ size: ${String(f.size)} bytes`
64
+ ).join("\n\n");
65
+ return internalSystemTag(`Uploaded files (${String(files.length)}):
66
+ ${entries}`);
67
+ }
68
+ function partitionContent(parts) {
69
+ const fileParts = [];
70
+ const textParts = [];
71
+ for (const part of parts) {
72
+ if (isFileContentPart(part)) {
73
+ fileParts.push(part);
74
+ } else {
75
+ textParts.push(part);
76
+ }
77
+ }
78
+ return { fileParts, textParts };
79
+ }
80
+ async function processAgentUserInput(msg, sandbox) {
81
+ if (typeof msg.content === "string") {
82
+ return { message: { role: "user", content: msg.content }, sandboxCreated: void 0 };
83
+ }
84
+ const { fileParts, textParts } = partitionContent(msg.content);
85
+ if (fileParts.length === 0) {
86
+ return { message: { role: "user", content: textParts }, sandboxCreated: void 0 };
87
+ }
88
+ const modelParts = [];
89
+ const filesToUploadToSandbox = [];
90
+ for (const filePart of fileParts) {
91
+ const filename = filePart.name.replace(/^\/+/, "");
92
+ if (!filename.length) {
93
+ throw new InvalidFileInputError("File name must not be empty");
94
+ }
95
+ validatePublicFilename(filename);
96
+ const file_data = filePart.data;
97
+ const mime = parseMimeFromFileData(file_data);
98
+ if (isInlineMime(mime)) {
99
+ modelParts.push(
100
+ isImageMime(mime) ? { type: "image_url", image_url: { url: file_data } } : { type: "file", file: { filename, file_data } }
101
+ );
102
+ } else {
103
+ const buffer = extractBase64(file_data);
104
+ filesToUploadToSandbox.push({ filename, buffer, mime });
105
+ }
106
+ }
107
+ let sandboxCreated;
108
+ if (filesToUploadToSandbox.length > 0) {
109
+ if (!sandbox) {
110
+ throw new AgentSandboxRequiredError(
111
+ "File uploads requiring sandbox are not supported: no sandbox configured for this agent"
112
+ );
113
+ }
114
+ const uploadResults = await Promise.allSettled(
115
+ filesToUploadToSandbox.map(
116
+ (file) => sandbox.uploadUserFile({
117
+ fileName: file.filename,
118
+ content: file.buffer,
119
+ mime: file.mime
120
+ })
121
+ )
122
+ );
123
+ const uploadedFiles = [];
124
+ for (let i = 0; i < uploadResults.length; i++) {
125
+ const result = uploadResults[i];
126
+ const file = filesToUploadToSandbox[i];
127
+ if (result === void 0 || file === void 0) {
128
+ throw new Error("Unreachable: uploadResults/files length mismatch");
129
+ }
130
+ if (result.status === "fulfilled") {
131
+ if (result.value.sandboxCreated) {
132
+ sandboxCreated = result.value.sandboxCreated;
133
+ }
134
+ uploadedFiles.push({
135
+ filename: file.filename,
136
+ path: result.value.filePath,
137
+ mime: file.mime,
138
+ size: file.buffer.length
139
+ });
140
+ } else {
141
+ throw result.reason;
142
+ }
143
+ }
144
+ if (uploadedFiles.length > 0) {
145
+ modelParts.push({ type: "text", text: buildUploadedFilesAnnouncement(uploadedFiles) });
146
+ }
147
+ }
148
+ modelParts.push(...textParts);
149
+ return { message: { role: "user", content: modelParts }, sandboxCreated };
150
+ }
151
+ export {
152
+ isAgentInputUserMessage,
153
+ isEmptyMessageContent,
154
+ isFileContentPart,
155
+ processAgentUserInput
156
+ };
157
+ //# sourceMappingURL=UserInputMessage.mjs.map