@illuma-ai/agents 1.4.0-alpha.6 → 1.5.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 (800) hide show
  1. package/README.md +62 -0
  2. package/dist/cjs/agents/AgentContext.cjs +274 -67
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/common/enum.cjs +44 -13
  5. package/dist/cjs/common/enum.cjs.map +1 -1
  6. package/dist/cjs/graphs/Graph.cjs +182 -5
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs +152 -1167
  9. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  10. package/dist/cjs/hooks/HookRegistry.cjs +162 -0
  11. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -0
  12. package/dist/cjs/hooks/executeHooks.cjs +276 -0
  13. package/dist/cjs/hooks/executeHooks.cjs.map +1 -0
  14. package/dist/cjs/hooks/matchers.cjs +256 -0
  15. package/dist/cjs/hooks/matchers.cjs.map +1 -0
  16. package/dist/cjs/hooks/types.cjs +27 -0
  17. package/dist/cjs/hooks/types.cjs.map +1 -0
  18. package/dist/cjs/langchain/google-common.cjs +3 -0
  19. package/dist/cjs/langchain/google-common.cjs.map +1 -0
  20. package/dist/cjs/langchain/index.cjs +86 -0
  21. package/dist/cjs/langchain/index.cjs.map +1 -0
  22. package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
  23. package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
  24. package/dist/cjs/langchain/messages/tool.cjs +3 -0
  25. package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
  26. package/dist/cjs/langchain/messages.cjs +51 -0
  27. package/dist/cjs/langchain/messages.cjs.map +1 -0
  28. package/dist/cjs/langchain/openai.cjs +3 -0
  29. package/dist/cjs/langchain/openai.cjs.map +1 -0
  30. package/dist/cjs/langchain/prompts.cjs +11 -0
  31. package/dist/cjs/langchain/prompts.cjs.map +1 -0
  32. package/dist/cjs/langchain/runnables.cjs +19 -0
  33. package/dist/cjs/langchain/runnables.cjs.map +1 -0
  34. package/dist/cjs/langchain/tools.cjs +23 -0
  35. package/dist/cjs/langchain/tools.cjs.map +1 -0
  36. package/dist/cjs/langchain/utils/env.cjs +11 -0
  37. package/dist/cjs/langchain/utils/env.cjs.map +1 -0
  38. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +5 -1
  39. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  40. package/dist/cjs/llm/bedrock/cacheSupport.cjs +55 -0
  41. package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +1 -0
  42. package/dist/cjs/llm/bedrock/index.cjs +61 -33
  43. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  44. package/dist/cjs/llm/openai/index.cjs +0 -3
  45. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  46. package/dist/cjs/llm/openai/utils/index.cjs +27 -10
  47. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  48. package/dist/cjs/main.cjs +178 -127
  49. package/dist/cjs/main.cjs.map +1 -1
  50. package/dist/cjs/messages/cache.cjs +89 -0
  51. package/dist/cjs/messages/cache.cjs.map +1 -1
  52. package/dist/cjs/messages/contextPruning.cjs +156 -0
  53. package/dist/cjs/messages/contextPruning.cjs.map +1 -0
  54. package/dist/cjs/messages/contextPruningSettings.cjs +53 -0
  55. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -0
  56. package/dist/cjs/messages/format.cjs +144 -20
  57. package/dist/cjs/messages/format.cjs.map +1 -1
  58. package/dist/cjs/messages/prune.cjs +505 -4
  59. package/dist/cjs/messages/prune.cjs.map +1 -1
  60. package/dist/cjs/run.cjs +141 -1
  61. package/dist/cjs/run.cjs.map +1 -1
  62. package/dist/cjs/tools/BashExecutor.cjs +235 -0
  63. package/dist/cjs/tools/BashExecutor.cjs.map +1 -0
  64. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +297 -0
  65. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -0
  66. package/dist/cjs/tools/CodeExecutor.cjs +44 -47
  67. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  68. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +16 -11
  69. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  70. package/dist/cjs/tools/ReadFile.cjs +44 -0
  71. package/dist/cjs/tools/ReadFile.cjs.map +1 -0
  72. package/dist/cjs/tools/SkillTool.cjs +51 -0
  73. package/dist/cjs/tools/SkillTool.cjs.map +1 -0
  74. package/dist/cjs/tools/SubagentTool.cjs +93 -0
  75. package/dist/cjs/tools/SubagentTool.cjs.map +1 -0
  76. package/dist/cjs/tools/ToolNode.cjs +450 -24
  77. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  78. package/dist/cjs/tools/search/search.cjs +11 -3
  79. package/dist/cjs/tools/search/search.cjs.map +1 -1
  80. package/dist/cjs/tools/search/tavily-scraper.cjs +189 -0
  81. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -0
  82. package/dist/cjs/tools/search/tavily-search.cjs +372 -0
  83. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -0
  84. package/dist/cjs/tools/search/tool.cjs +28 -4
  85. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  86. package/dist/cjs/tools/search/utils.cjs +10 -3
  87. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  88. package/dist/cjs/tools/skillCatalog.cjs +84 -0
  89. package/dist/cjs/tools/skillCatalog.cjs.map +1 -0
  90. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +512 -0
  91. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -0
  92. package/dist/cjs/tools/toolOutputReferences.cjs +670 -0
  93. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -0
  94. package/dist/cjs/types/agent-cache.cjs +53 -0
  95. package/dist/cjs/types/agent-cache.cjs.map +1 -0
  96. package/dist/cjs/types/graph.cjs.map +1 -1
  97. package/dist/cjs/utils/truncation.cjs +135 -0
  98. package/dist/cjs/utils/truncation.cjs.map +1 -0
  99. package/dist/esm/agents/AgentContext.mjs +274 -67
  100. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  101. package/dist/esm/common/enum.mjs +44 -12
  102. package/dist/esm/common/enum.mjs.map +1 -1
  103. package/dist/esm/graphs/Graph.mjs +182 -5
  104. package/dist/esm/graphs/Graph.mjs.map +1 -1
  105. package/dist/esm/graphs/MultiAgentGraph.mjs +155 -1170
  106. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  107. package/dist/esm/hooks/HookRegistry.mjs +160 -0
  108. package/dist/esm/hooks/HookRegistry.mjs.map +1 -0
  109. package/dist/esm/hooks/executeHooks.mjs +273 -0
  110. package/dist/esm/hooks/executeHooks.mjs.map +1 -0
  111. package/dist/esm/hooks/matchers.mjs +251 -0
  112. package/dist/esm/hooks/matchers.mjs.map +1 -0
  113. package/dist/esm/hooks/types.mjs +25 -0
  114. package/dist/esm/hooks/types.mjs.map +1 -0
  115. package/dist/esm/langchain/google-common.mjs +2 -0
  116. package/dist/esm/langchain/google-common.mjs.map +1 -0
  117. package/dist/esm/langchain/index.mjs +5 -0
  118. package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
  119. package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
  120. package/dist/esm/langchain/messages/tool.mjs +2 -0
  121. package/dist/esm/langchain/messages/tool.mjs.map +1 -0
  122. package/dist/esm/langchain/messages.mjs +2 -0
  123. package/dist/esm/langchain/messages.mjs.map +1 -0
  124. package/dist/esm/langchain/openai.mjs +2 -0
  125. package/dist/esm/langchain/openai.mjs.map +1 -0
  126. package/dist/esm/langchain/prompts.mjs +2 -0
  127. package/dist/esm/langchain/prompts.mjs.map +1 -0
  128. package/dist/esm/langchain/runnables.mjs +2 -0
  129. package/dist/esm/langchain/runnables.mjs.map +1 -0
  130. package/dist/esm/langchain/tools.mjs +2 -0
  131. package/dist/esm/langchain/tools.mjs.map +1 -0
  132. package/dist/esm/langchain/utils/env.mjs +2 -0
  133. package/dist/esm/langchain/utils/env.mjs.map +1 -0
  134. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +5 -1
  135. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  136. package/dist/esm/llm/bedrock/cacheSupport.mjs +52 -0
  137. package/dist/esm/llm/bedrock/cacheSupport.mjs.map +1 -0
  138. package/dist/esm/llm/bedrock/index.mjs +61 -34
  139. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  140. package/dist/esm/llm/openai/index.mjs +0 -3
  141. package/dist/esm/llm/openai/index.mjs.map +1 -1
  142. package/dist/esm/llm/openai/utils/index.mjs +27 -10
  143. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  144. package/dist/esm/main.mjs +21 -27
  145. package/dist/esm/main.mjs.map +1 -1
  146. package/dist/esm/messages/cache.mjs +89 -0
  147. package/dist/esm/messages/cache.mjs.map +1 -1
  148. package/dist/esm/messages/contextPruning.mjs +154 -0
  149. package/dist/esm/messages/contextPruning.mjs.map +1 -0
  150. package/dist/esm/messages/contextPruningSettings.mjs +50 -0
  151. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -0
  152. package/dist/esm/messages/format.mjs +136 -12
  153. package/dist/esm/messages/format.mjs.map +1 -1
  154. package/dist/esm/messages/prune.mjs +504 -7
  155. package/dist/esm/messages/prune.mjs.map +1 -1
  156. package/dist/esm/run.mjs +141 -1
  157. package/dist/esm/run.mjs.map +1 -1
  158. package/dist/esm/tools/BashExecutor.mjs +227 -0
  159. package/dist/esm/tools/BashExecutor.mjs.map +1 -0
  160. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +288 -0
  161. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -0
  162. package/dist/esm/tools/CodeExecutor.mjs +44 -48
  163. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  164. package/dist/esm/tools/ProgrammaticToolCalling.mjs +17 -12
  165. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  166. package/dist/esm/tools/ReadFile.mjs +39 -0
  167. package/dist/esm/tools/ReadFile.mjs.map +1 -0
  168. package/dist/esm/tools/SkillTool.mjs +46 -0
  169. package/dist/esm/tools/SkillTool.mjs.map +1 -0
  170. package/dist/esm/tools/SubagentTool.mjs +86 -0
  171. package/dist/esm/tools/SubagentTool.mjs.map +1 -0
  172. package/dist/esm/tools/ToolNode.mjs +452 -26
  173. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  174. package/dist/esm/tools/search/search.mjs +11 -3
  175. package/dist/esm/tools/search/search.mjs.map +1 -1
  176. package/dist/esm/tools/search/tavily-scraper.mjs +186 -0
  177. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -0
  178. package/dist/esm/tools/search/tavily-search.mjs +370 -0
  179. package/dist/esm/tools/search/tavily-search.mjs.map +1 -0
  180. package/dist/esm/tools/search/tool.mjs +28 -4
  181. package/dist/esm/tools/search/tool.mjs.map +1 -1
  182. package/dist/esm/tools/search/utils.mjs +10 -3
  183. package/dist/esm/tools/search/utils.mjs.map +1 -1
  184. package/dist/esm/tools/skillCatalog.mjs +82 -0
  185. package/dist/esm/tools/skillCatalog.mjs.map +1 -0
  186. package/dist/esm/tools/subagent/SubagentExecutor.mjs +506 -0
  187. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -0
  188. package/dist/esm/tools/toolOutputReferences.mjs +662 -0
  189. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -0
  190. package/dist/esm/types/agent-cache.mjs +51 -0
  191. package/dist/esm/types/agent-cache.mjs.map +1 -0
  192. package/dist/esm/types/graph.mjs.map +1 -1
  193. package/dist/esm/utils/truncation.mjs +128 -0
  194. package/dist/esm/utils/truncation.mjs.map +1 -0
  195. package/dist/types/agents/AgentContext.d.ts +101 -8
  196. package/dist/types/common/enum.d.ts +39 -12
  197. package/dist/types/common/index.d.ts +0 -1
  198. package/dist/types/graphs/Graph.d.ts +43 -0
  199. package/dist/types/graphs/MultiAgentGraph.d.ts +26 -150
  200. package/dist/types/graphs/index.d.ts +0 -1
  201. package/dist/types/hooks/HookRegistry.d.ts +56 -0
  202. package/dist/types/hooks/executeHooks.d.ts +79 -0
  203. package/dist/types/hooks/index.d.ts +6 -0
  204. package/dist/types/hooks/matchers.d.ts +95 -0
  205. package/dist/types/hooks/types.d.ts +320 -0
  206. package/dist/types/index.d.ts +9 -9
  207. package/dist/types/langchain/google-common.d.ts +1 -0
  208. package/dist/types/langchain/index.d.ts +8 -0
  209. package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
  210. package/dist/types/langchain/messages/tool.d.ts +1 -0
  211. package/dist/types/langchain/messages.d.ts +2 -0
  212. package/dist/types/langchain/openai.d.ts +1 -0
  213. package/dist/types/langchain/prompts.d.ts +1 -0
  214. package/dist/types/langchain/runnables.d.ts +2 -0
  215. package/dist/types/langchain/tools.d.ts +2 -0
  216. package/dist/types/langchain/utils/env.d.ts +1 -0
  217. package/dist/types/llm/bedrock/cacheSupport.d.ts +35 -0
  218. package/dist/types/llm/bedrock/index.d.ts +54 -1
  219. package/dist/types/messages/contextPruning.d.ts +42 -0
  220. package/dist/types/messages/contextPruningSettings.d.ts +44 -0
  221. package/dist/types/messages/format.d.ts +9 -1
  222. package/dist/types/messages/index.d.ts +2 -0
  223. package/dist/types/messages/prune.d.ts +91 -1
  224. package/dist/types/run.d.ts +2 -0
  225. package/dist/types/tools/BashExecutor.d.ts +76 -0
  226. package/dist/types/tools/BashProgrammaticToolCalling.d.ts +72 -0
  227. package/dist/types/tools/CodeExecutor.d.ts +8 -26
  228. package/dist/types/tools/ReadFile.d.ts +28 -0
  229. package/dist/types/tools/SkillTool.d.ts +40 -0
  230. package/dist/types/tools/SubagentTool.d.ts +36 -0
  231. package/dist/types/tools/ToolNode.d.ts +77 -5
  232. package/dist/types/tools/search/tavily-scraper.d.ts +19 -0
  233. package/dist/types/tools/search/tavily-search.d.ts +4 -0
  234. package/dist/types/tools/search/types.d.ts +99 -5
  235. package/dist/types/tools/search/utils.d.ts +2 -2
  236. package/dist/types/tools/skillCatalog.d.ts +19 -0
  237. package/dist/types/tools/subagent/SubagentExecutor.d.ts +137 -0
  238. package/dist/types/tools/subagent/index.d.ts +2 -0
  239. package/dist/types/tools/subagent/types.d.ts +84 -0
  240. package/dist/types/tools/toolOutputReferences.d.ts +236 -0
  241. package/dist/types/types/agent-cache.d.ts +70 -0
  242. package/dist/types/types/graph.d.ts +162 -22
  243. package/dist/types/types/index.d.ts +3 -0
  244. package/dist/types/types/messages.d.ts +26 -0
  245. package/dist/types/types/run.d.ts +22 -0
  246. package/dist/types/types/skill.d.ts +9 -0
  247. package/dist/types/types/tools.d.ts +111 -0
  248. package/dist/types/utils/index.d.ts +1 -3
  249. package/dist/types/utils/truncation.d.ts +70 -0
  250. package/package.json +57 -17
  251. package/src/agents/AgentContext.js.map +1 -0
  252. package/src/agents/AgentContext.test.js.map +1 -0
  253. package/src/agents/AgentContext.ts +321 -78
  254. package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +259 -0
  255. package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +264 -0
  256. package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +342 -0
  257. package/src/agents/__tests__/AgentContext.test.js.map +1 -0
  258. package/src/agents/__tests__/AgentContext.test.ts +632 -0
  259. package/src/agents/__tests__/resolveStructuredOutputMode.test.js.map +1 -0
  260. package/src/common/__tests__/enum.test.ts +7 -17
  261. package/src/common/enum.js.map +1 -0
  262. package/src/common/enum.ts +43 -12
  263. package/src/common/index.js.map +1 -0
  264. package/src/common/index.ts +0 -1
  265. package/src/events.js.map +1 -0
  266. package/src/graphs/Graph.js.map +1 -0
  267. package/src/graphs/Graph.ts +222 -2
  268. package/src/graphs/MultiAgentGraph.js.map +1 -0
  269. package/src/graphs/MultiAgentGraph.ts +154 -1466
  270. package/src/graphs/__tests__/MultiAgentGraph.test.ts +91 -0
  271. package/src/graphs/__tests__/structured-output.integration.test.js.map +1 -0
  272. package/src/graphs/__tests__/structured-output.test.js.map +1 -0
  273. package/src/graphs/contextManagement.e2e.test.js.map +1 -0
  274. package/src/graphs/contextManagement.test.js.map +1 -0
  275. package/src/graphs/handoffValidation.test.js.map +1 -0
  276. package/src/graphs/index.js.map +1 -0
  277. package/src/graphs/index.ts +0 -1
  278. package/src/hooks/HookRegistry.ts +208 -0
  279. package/src/hooks/__tests__/HookRegistry.test.ts +190 -0
  280. package/src/hooks/__tests__/compactHooks.test.ts +214 -0
  281. package/src/hooks/__tests__/executeHooks.test.ts +1013 -0
  282. package/src/hooks/__tests__/integration.test.ts +337 -0
  283. package/src/hooks/__tests__/matchers.test.ts +238 -0
  284. package/src/hooks/__tests__/toolHooks.test.ts +665 -0
  285. package/src/hooks/executeHooks.ts +375 -0
  286. package/src/hooks/index.ts +57 -0
  287. package/src/hooks/matchers.ts +280 -0
  288. package/src/hooks/types.ts +404 -0
  289. package/src/index.js.map +1 -0
  290. package/src/index.ts +15 -24
  291. package/src/instrumentation.js.map +1 -0
  292. package/src/langchain/google-common.ts +1 -0
  293. package/src/langchain/index.ts +8 -0
  294. package/src/langchain/language_models/chat_models.ts +1 -0
  295. package/src/langchain/messages/tool.ts +5 -0
  296. package/src/langchain/messages.ts +21 -0
  297. package/src/langchain/openai.ts +1 -0
  298. package/src/langchain/prompts.ts +1 -0
  299. package/src/langchain/runnables.ts +7 -0
  300. package/src/langchain/tools.ts +8 -0
  301. package/src/langchain/utils/env.ts +1 -0
  302. package/src/llm/anthropic/index.js.map +1 -0
  303. package/src/llm/anthropic/types.js.map +1 -0
  304. package/src/llm/anthropic/utils/message_inputs.js.map +1 -0
  305. package/src/llm/anthropic/utils/message_inputs.ts +10 -1
  306. package/src/llm/anthropic/utils/message_outputs.js.map +1 -0
  307. package/src/llm/anthropic/utils/output_parsers.js.map +1 -0
  308. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +436 -0
  309. package/src/llm/anthropic/utils/tools.js.map +1 -0
  310. package/src/llm/bedrock/__tests__/bedrock-caching.test.js.map +1 -0
  311. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +166 -18
  312. package/src/llm/bedrock/cacheSupport.test.ts +99 -0
  313. package/src/llm/bedrock/cacheSupport.ts +53 -0
  314. package/src/llm/bedrock/index.js.map +1 -0
  315. package/src/llm/bedrock/index.ts +116 -41
  316. package/src/llm/bedrock/types.js.map +1 -0
  317. package/src/llm/bedrock/utils/index.js.map +1 -0
  318. package/src/llm/bedrock/utils/message_inputs.js.map +1 -0
  319. package/src/llm/bedrock/utils/message_outputs.js.map +1 -0
  320. package/src/llm/fake.js.map +1 -0
  321. package/src/llm/google/index.js.map +1 -0
  322. package/src/llm/google/types.js.map +1 -0
  323. package/src/llm/google/utils/common.js.map +1 -0
  324. package/src/llm/google/utils/tools.js.map +1 -0
  325. package/src/llm/google/utils/zod_to_genai_parameters.js.map +1 -0
  326. package/src/llm/openai/index.js.map +1 -0
  327. package/src/llm/openai/types.js.map +1 -0
  328. package/src/llm/openai/utils/index.js.map +1 -0
  329. package/src/llm/openai/utils/index.ts +31 -14
  330. package/src/llm/openai/utils/isReasoningModel.test.js.map +1 -0
  331. package/src/llm/openrouter/index.js.map +1 -0
  332. package/src/llm/openrouter/reasoning.test.js.map +1 -0
  333. package/src/llm/providers.js.map +1 -0
  334. package/src/llm/text.js.map +1 -0
  335. package/src/llm/vertexai/index.js.map +1 -0
  336. package/src/messages/__tests__/contextPruning.test.ts +228 -0
  337. package/src/messages/__tests__/tools.test.js.map +1 -0
  338. package/src/messages/cache.js.map +1 -0
  339. package/src/messages/cache.test.js.map +1 -0
  340. package/src/messages/cache.test.ts +62 -24
  341. package/src/messages/cache.ts +112 -0
  342. package/src/messages/content.js.map +1 -0
  343. package/src/messages/content.test.js.map +1 -0
  344. package/src/messages/contextPruning.ts +191 -0
  345. package/src/messages/contextPruningSettings.ts +90 -0
  346. package/src/messages/core.js.map +1 -0
  347. package/src/messages/ensureThinkingBlock.test.js.map +1 -0
  348. package/src/messages/format.js.map +1 -0
  349. package/src/messages/format.ts +164 -12
  350. package/src/messages/formatAgentMessages.skills.test.ts +413 -0
  351. package/src/messages/formatAgentMessages.test.js.map +1 -0
  352. package/src/messages/formatAgentMessages.tools.test.js.map +1 -0
  353. package/src/messages/formatMessage.test.js.map +1 -0
  354. package/src/messages/ids.js.map +1 -0
  355. package/src/messages/index.js.map +1 -0
  356. package/src/messages/index.ts +2 -0
  357. package/src/messages/labelContentByAgent.test.js.map +1 -0
  358. package/src/messages/prune.js.map +1 -0
  359. package/src/messages/prune.ts +661 -4
  360. package/src/messages/reducer.js.map +1 -0
  361. package/src/messages/shiftIndexTokenCountMap.test.js.map +1 -0
  362. package/src/messages/summarize.js.map +1 -0
  363. package/src/messages/summarize.test.js.map +1 -0
  364. package/src/messages/tools.js.map +1 -0
  365. package/src/mockStream.js.map +1 -0
  366. package/src/prompts/collab.js.map +1 -0
  367. package/src/prompts/index.js.map +1 -0
  368. package/src/prompts/taskmanager.js.map +1 -0
  369. package/src/run.js.map +1 -0
  370. package/src/run.ts +155 -1
  371. package/src/schemas/index.js.map +1 -0
  372. package/src/schemas/schema-preparation.test.js.map +1 -0
  373. package/src/schemas/validate.js.map +1 -0
  374. package/src/schemas/validate.test.js.map +1 -0
  375. package/src/scripts/abort.js.map +1 -0
  376. package/src/scripts/ant_web_search.js.map +1 -0
  377. package/src/scripts/ant_web_search_edge_case.js.map +1 -0
  378. package/src/scripts/ant_web_search_error_edge_case.js.map +1 -0
  379. package/src/scripts/args.js.map +1 -0
  380. package/src/scripts/bedrock-cache-debug.js.map +1 -0
  381. package/src/scripts/bedrock-content-aggregation-test.js.map +1 -0
  382. package/src/scripts/bedrock-merge-test.js.map +1 -0
  383. package/src/scripts/bedrock-parallel-tools-test.js.map +1 -0
  384. package/src/scripts/caching.js.map +1 -0
  385. package/src/scripts/cli.js.map +1 -0
  386. package/src/scripts/cli2.js.map +1 -0
  387. package/src/scripts/cli3.js.map +1 -0
  388. package/src/scripts/cli4.js.map +1 -0
  389. package/src/scripts/cli5.js.map +1 -0
  390. package/src/scripts/code_exec.js.map +1 -0
  391. package/src/scripts/code_exec_files.js.map +1 -0
  392. package/src/scripts/code_exec_multi_session.js.map +1 -0
  393. package/src/scripts/code_exec_ptc.js.map +1 -0
  394. package/src/scripts/code_exec_session.js.map +1 -0
  395. package/src/scripts/code_exec_simple.js.map +1 -0
  396. package/src/scripts/content.js.map +1 -0
  397. package/src/scripts/empty_input.js.map +1 -0
  398. package/src/scripts/handoff-test.js.map +1 -0
  399. package/src/scripts/image.js.map +1 -0
  400. package/src/scripts/memory.js.map +1 -0
  401. package/src/scripts/multi-agent-chain.js.map +1 -0
  402. package/src/scripts/multi-agent-chain.ts +2 -2
  403. package/src/scripts/multi-agent-conditional.js.map +1 -0
  404. package/src/scripts/multi-agent-document-review-chain.js.map +1 -0
  405. package/src/scripts/multi-agent-document-review-chain.ts +2 -2
  406. package/src/scripts/multi-agent-hybrid-flow.js.map +1 -0
  407. package/src/scripts/multi-agent-hybrid-flow.ts +4 -4
  408. package/src/scripts/multi-agent-parallel-start.js.map +1 -0
  409. package/src/scripts/multi-agent-parallel.js.map +1 -0
  410. package/src/scripts/multi-agent-parallel.ts +3 -3
  411. package/src/scripts/multi-agent-sequence.js.map +1 -0
  412. package/src/scripts/multi-agent-sequence.ts +3 -3
  413. package/src/scripts/multi-agent-subagent.ts +246 -0
  414. package/src/scripts/multi-agent-supervisor.js.map +1 -0
  415. package/src/scripts/multi-agent-supervisor.ts +5 -5
  416. package/src/scripts/multi-agent-test.js.map +1 -0
  417. package/src/scripts/parallel-asymmetric-tools-test.js.map +1 -0
  418. package/src/scripts/parallel-full-metadata-test.js.map +1 -0
  419. package/src/scripts/parallel-tools-test.js.map +1 -0
  420. package/src/scripts/poc-multi-agent-comprehensive.ts +8 -8
  421. package/src/scripts/programmatic_exec.js.map +1 -0
  422. package/src/scripts/programmatic_exec_agent.js.map +1 -0
  423. package/src/scripts/search.js.map +1 -0
  424. package/src/scripts/sequential-full-metadata-test.js.map +1 -0
  425. package/src/scripts/sequential-full-metadata-test.ts +2 -2
  426. package/src/scripts/simple.js.map +1 -0
  427. package/src/scripts/single-agent-metadata-test.js.map +1 -0
  428. package/src/scripts/stream.js.map +1 -0
  429. package/src/scripts/subagent-event-driven-debug.ts +190 -0
  430. package/src/scripts/subagent-tools-debug.ts +160 -0
  431. package/src/scripts/test-custom-prompt-key.js.map +1 -0
  432. package/src/scripts/test-custom-prompt-key.ts +3 -3
  433. package/src/scripts/test-handoff-input.js.map +1 -0
  434. package/src/scripts/test-handoff-input.ts +1 -1
  435. package/src/scripts/test-handoff-preamble.js.map +1 -0
  436. package/src/scripts/test-handoff-steering.js.map +1 -0
  437. package/src/scripts/test-handoff-steering.ts +3 -3
  438. package/src/scripts/test-multi-agent-list-handoff.js.map +1 -0
  439. package/src/scripts/test-multi-agent-list-handoff.ts +1 -1
  440. package/src/scripts/test-parallel-agent-labeling.js.map +1 -0
  441. package/src/scripts/test-parallel-agent-labeling.ts +3 -3
  442. package/src/scripts/test-parallel-handoffs.js.map +1 -0
  443. package/src/scripts/test-parallel-handoffs.ts +2 -2
  444. package/src/scripts/test-thinking-handoff-bedrock.js.map +1 -0
  445. package/src/scripts/test-thinking-handoff-bedrock.ts +1 -1
  446. package/src/scripts/test-thinking-handoff.js.map +1 -0
  447. package/src/scripts/test-thinking-handoff.ts +1 -1
  448. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js.map +1 -0
  449. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +1 -1
  450. package/src/scripts/test-tool-before-handoff-role-order.js.map +1 -0
  451. package/src/scripts/test-tool-before-handoff-role-order.ts +1 -1
  452. package/src/scripts/test-tools-before-handoff.js.map +1 -0
  453. package/src/scripts/test-tools-before-handoff.ts +1 -1
  454. package/src/scripts/test_code_api.js.map +1 -0
  455. package/src/scripts/thinking-bedrock.js.map +1 -0
  456. package/src/scripts/thinking-vertexai.js.map +1 -0
  457. package/src/scripts/thinking.js.map +1 -0
  458. package/src/scripts/tool_search.js.map +1 -0
  459. package/src/scripts/tools.js.map +1 -0
  460. package/src/specs/agent-handoffs-bedrock.integration.test.js.map +1 -0
  461. package/src/specs/agent-handoffs.test.js.map +1 -0
  462. package/src/specs/agent-handoffs.test.ts +26 -483
  463. package/src/specs/anthropic.simple.test.js.map +1 -0
  464. package/src/specs/anthropic.simple.test.ts +61 -0
  465. package/src/specs/azure.simple.test.js.map +1 -0
  466. package/src/specs/cache.simple.test.js.map +1 -0
  467. package/src/specs/custom-event-await.test.js.map +1 -0
  468. package/src/specs/deepseek.simple.test.js.map +1 -0
  469. package/src/specs/emergency-prune.test.js.map +1 -0
  470. package/src/specs/moonshot.simple.test.js.map +1 -0
  471. package/src/specs/multi-agent-summarization.test.ts +396 -0
  472. package/src/specs/observability.integration.test.js.map +1 -0
  473. package/src/specs/openai.simple.test.js.map +1 -0
  474. package/src/specs/openrouter.simple.test.js.map +1 -0
  475. package/src/specs/prune.orphans.test.ts +248 -0
  476. package/src/specs/prune.test.js.map +1 -0
  477. package/src/specs/prune.test.ts +104 -16
  478. package/src/specs/reasoning.test.js.map +1 -0
  479. package/src/specs/spec.utils.js.map +1 -0
  480. package/src/specs/thinking-handoff.test.js.map +1 -0
  481. package/src/specs/thinking-handoff.test.ts +19 -19
  482. package/src/specs/thinking-prune.test.js.map +1 -0
  483. package/src/specs/token-distribution-edge-case.test.js.map +1 -0
  484. package/src/specs/token-memoization.test.js.map +1 -0
  485. package/src/specs/tokens.test.js.map +1 -0
  486. package/src/specs/tool-error.test.js.map +1 -0
  487. package/src/splitStream.js.map +1 -0
  488. package/src/splitStream.test.js.map +1 -0
  489. package/src/stream.js.map +1 -0
  490. package/src/stream.test.js.map +1 -0
  491. package/src/test/mockTools.js.map +1 -0
  492. package/src/tools/BashExecutor.ts +281 -0
  493. package/src/tools/BashProgrammaticToolCalling.ts +397 -0
  494. package/src/tools/BrowserTools.js.map +1 -0
  495. package/src/tools/Calculator.js.map +1 -0
  496. package/src/tools/Calculator.test.js.map +1 -0
  497. package/src/tools/CodeExecutor.js.map +1 -0
  498. package/src/tools/CodeExecutor.ts +62 -54
  499. package/src/tools/ProgrammaticToolCalling.js.map +1 -0
  500. package/src/tools/ProgrammaticToolCalling.ts +29 -14
  501. package/src/tools/ReadFile.ts +39 -0
  502. package/src/tools/SkillTool.ts +46 -0
  503. package/src/tools/StreamingToolCallBuffer.js.map +1 -0
  504. package/src/tools/SubagentTool.ts +100 -0
  505. package/src/tools/ToolNode.js.map +1 -0
  506. package/src/tools/ToolNode.ts +548 -26
  507. package/src/tools/ToolSearch.js.map +1 -0
  508. package/src/tools/__tests__/BashExecutor.test.ts +49 -0
  509. package/src/tools/__tests__/BrowserTools.test.js.map +1 -0
  510. package/src/tools/__tests__/CodeExecutor.test.ts +37 -36
  511. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +1 -0
  512. package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +1 -0
  513. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +60 -0
  514. package/src/tools/__tests__/ReadFile.test.ts +44 -0
  515. package/src/tools/__tests__/SkillTool.test.ts +442 -0
  516. package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +1 -0
  517. package/src/tools/__tests__/SubagentExecutor.test.ts +1148 -0
  518. package/src/tools/__tests__/SubagentTool.test.ts +149 -0
  519. package/src/tools/__tests__/ToolApproval.test.js.map +1 -0
  520. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +1438 -0
  521. package/src/tools/__tests__/ToolNode.recovery.test.js.map +1 -0
  522. package/src/tools/__tests__/ToolNode.session.test.js.map +1 -0
  523. package/src/tools/__tests__/ToolSearch.integration.test.js.map +1 -0
  524. package/src/tools/__tests__/ToolSearch.test.js.map +1 -0
  525. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +479 -0
  526. package/src/tools/__tests__/handlers.test.js.map +1 -0
  527. package/src/tools/__tests__/skillCatalog.test.ts +161 -0
  528. package/src/tools/__tests__/subagentHooks.test.ts +210 -0
  529. package/src/tools/__tests__/toolOutputReferences.test.ts +415 -0
  530. package/src/tools/__tests__/truncation-recovery.integration.test.js.map +1 -0
  531. package/src/tools/handlers.js.map +1 -0
  532. package/src/tools/schema.js.map +1 -0
  533. package/src/tools/search/anthropic.js.map +1 -0
  534. package/src/tools/search/content.js.map +1 -0
  535. package/src/tools/search/content.test.js.map +1 -0
  536. package/src/tools/search/firecrawl.js.map +1 -0
  537. package/src/tools/search/format.js.map +1 -0
  538. package/src/tools/search/highlights.js.map +1 -0
  539. package/src/tools/search/index.js.map +1 -0
  540. package/src/tools/search/jina-reranker.test.js.map +1 -0
  541. package/src/tools/search/rerankers.js.map +1 -0
  542. package/src/tools/search/schema.js.map +1 -0
  543. package/src/tools/search/search.js.map +1 -0
  544. package/src/tools/search/search.ts +12 -2
  545. package/src/tools/search/serper-scraper.js.map +1 -0
  546. package/src/tools/search/tavily-scraper.ts +235 -0
  547. package/src/tools/search/tavily-search.ts +424 -0
  548. package/src/tools/search/tavily.test.ts +965 -0
  549. package/src/tools/search/test.js.map +1 -0
  550. package/src/tools/search/tool.js.map +1 -0
  551. package/src/tools/search/tool.ts +36 -2
  552. package/src/tools/search/types.js.map +1 -0
  553. package/src/tools/search/types.ts +133 -8
  554. package/src/tools/search/utils.js.map +1 -0
  555. package/src/tools/search/utils.ts +13 -5
  556. package/src/tools/skillCatalog.ts +126 -0
  557. package/src/tools/subagent/SubagentExecutor.ts +676 -0
  558. package/src/tools/subagent/index.ts +13 -0
  559. package/src/tools/subagent/types.test.ts +70 -0
  560. package/src/tools/subagent/types.ts +115 -0
  561. package/src/tools/toolOutputReferences.ts +825 -0
  562. package/src/types/agent-cache.ts +73 -0
  563. package/src/types/graph.js.map +1 -0
  564. package/src/types/graph.test.js.map +1 -0
  565. package/src/types/graph.ts +171 -20
  566. package/src/types/index.js.map +1 -0
  567. package/src/types/index.ts +3 -0
  568. package/src/types/llm.js.map +1 -0
  569. package/src/types/messages.js.map +1 -0
  570. package/src/types/messages.ts +27 -0
  571. package/src/types/run.js.map +1 -0
  572. package/src/types/run.ts +22 -0
  573. package/src/types/skill.ts +11 -0
  574. package/src/types/stream.js.map +1 -0
  575. package/src/types/tools.js.map +1 -0
  576. package/src/types/tools.ts +118 -0
  577. package/src/utils/__tests__/truncation.test.ts +66 -0
  578. package/src/utils/contextAnalytics.js.map +1 -0
  579. package/src/utils/contextAnalytics.test.js.map +1 -0
  580. package/src/utils/events.js.map +1 -0
  581. package/src/utils/graph.js.map +1 -0
  582. package/src/utils/handlers.js.map +1 -0
  583. package/src/utils/index.js.map +1 -0
  584. package/src/utils/index.ts +1 -3
  585. package/src/utils/llm.js.map +1 -0
  586. package/src/utils/llmConfig.js.map +1 -0
  587. package/src/utils/logging.js.map +1 -0
  588. package/src/utils/misc.js.map +1 -0
  589. package/src/utils/run.js.map +1 -0
  590. package/src/utils/schema.js.map +1 -0
  591. package/src/utils/title.js.map +1 -0
  592. package/src/utils/tokens.js.map +1 -0
  593. package/src/utils/toonFormat.js.map +1 -0
  594. package/src/utils/truncation.ts +154 -0
  595. package/dist/cjs/common/spawnPath.cjs +0 -104
  596. package/dist/cjs/common/spawnPath.cjs.map +0 -1
  597. package/dist/cjs/content/ArtifactStore.cjs +0 -579
  598. package/dist/cjs/content/ArtifactStore.cjs.map +0 -1
  599. package/dist/cjs/content/ContentStore.cjs +0 -638
  600. package/dist/cjs/content/ContentStore.cjs.map +0 -1
  601. package/dist/cjs/content/contentAnalyzer.cjs +0 -91
  602. package/dist/cjs/content/contentAnalyzer.cjs.map +0 -1
  603. package/dist/cjs/content/index.cjs +0 -20
  604. package/dist/cjs/content/index.cjs.map +0 -1
  605. package/dist/cjs/content/mcpAutoCache.cjs +0 -115
  606. package/dist/cjs/content/mcpAutoCache.cjs.map +0 -1
  607. package/dist/cjs/graphs/HandoffRegistry.cjs +0 -143
  608. package/dist/cjs/graphs/HandoffRegistry.cjs.map +0 -1
  609. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs +0 -288
  610. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs.map +0 -1
  611. package/dist/cjs/providers/a2a/client.cjs +0 -92
  612. package/dist/cjs/providers/a2a/client.cjs.map +0 -1
  613. package/dist/cjs/providers/a2a/config.cjs +0 -38
  614. package/dist/cjs/providers/a2a/config.cjs.map +0 -1
  615. package/dist/cjs/providers/capabilityNaming.cjs +0 -43
  616. package/dist/cjs/providers/capabilityNaming.cjs.map +0 -1
  617. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs +0 -244
  618. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs.map +0 -1
  619. package/dist/cjs/providers/mcp/config.cjs +0 -42
  620. package/dist/cjs/providers/mcp/config.cjs.map +0 -1
  621. package/dist/cjs/providers/mcp/transport.cjs +0 -65
  622. package/dist/cjs/providers/mcp/transport.cjs.map +0 -1
  623. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs +0 -128
  624. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs.map +0 -1
  625. package/dist/cjs/providers/types.cjs +0 -51
  626. package/dist/cjs/providers/types.cjs.map +0 -1
  627. package/dist/cjs/tools/artifacts/schema.cjs +0 -86
  628. package/dist/cjs/tools/artifacts/schema.cjs.map +0 -1
  629. package/dist/cjs/tools/artifacts/tool.cjs +0 -219
  630. package/dist/cjs/tools/artifacts/tool.cjs.map +0 -1
  631. package/dist/cjs/tools/fileSearch/formatter.cjs +0 -93
  632. package/dist/cjs/tools/fileSearch/formatter.cjs.map +0 -1
  633. package/dist/cjs/tools/fileSearch/ragClient.cjs +0 -102
  634. package/dist/cjs/tools/fileSearch/ragClient.cjs.map +0 -1
  635. package/dist/cjs/tools/fileSearch/schema.cjs +0 -18
  636. package/dist/cjs/tools/fileSearch/schema.cjs.map +0 -1
  637. package/dist/cjs/tools/fileSearch/tool.cjs +0 -155
  638. package/dist/cjs/tools/fileSearch/tool.cjs.map +0 -1
  639. package/dist/cjs/tools/proxyTool.cjs +0 -102
  640. package/dist/cjs/tools/proxyTool.cjs.map +0 -1
  641. package/dist/cjs/utils/childAgentContext.cjs +0 -242
  642. package/dist/cjs/utils/childAgentContext.cjs.map +0 -1
  643. package/dist/cjs/utils/credentials.cjs +0 -142
  644. package/dist/cjs/utils/credentials.cjs.map +0 -1
  645. package/dist/cjs/utils/httpClient.cjs +0 -74
  646. package/dist/cjs/utils/httpClient.cjs.map +0 -1
  647. package/dist/cjs/utils/toolManifest.cjs +0 -100
  648. package/dist/cjs/utils/toolManifest.cjs.map +0 -1
  649. package/dist/esm/common/spawnPath.mjs +0 -95
  650. package/dist/esm/common/spawnPath.mjs.map +0 -1
  651. package/dist/esm/content/ArtifactStore.mjs +0 -576
  652. package/dist/esm/content/ArtifactStore.mjs.map +0 -1
  653. package/dist/esm/content/ContentStore.mjs +0 -635
  654. package/dist/esm/content/ContentStore.mjs.map +0 -1
  655. package/dist/esm/content/contentAnalyzer.mjs +0 -87
  656. package/dist/esm/content/contentAnalyzer.mjs.map +0 -1
  657. package/dist/esm/content/index.mjs +0 -5
  658. package/dist/esm/content/mcpAutoCache.mjs +0 -111
  659. package/dist/esm/content/mcpAutoCache.mjs.map +0 -1
  660. package/dist/esm/graphs/HandoffRegistry.mjs +0 -141
  661. package/dist/esm/graphs/HandoffRegistry.mjs.map +0 -1
  662. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs +0 -281
  663. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs.map +0 -1
  664. package/dist/esm/providers/a2a/client.mjs +0 -88
  665. package/dist/esm/providers/a2a/client.mjs.map +0 -1
  666. package/dist/esm/providers/a2a/config.mjs +0 -35
  667. package/dist/esm/providers/a2a/config.mjs.map +0 -1
  668. package/dist/esm/providers/capabilityNaming.mjs +0 -39
  669. package/dist/esm/providers/capabilityNaming.mjs.map +0 -1
  670. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs +0 -240
  671. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs.map +0 -1
  672. package/dist/esm/providers/mcp/config.mjs +0 -39
  673. package/dist/esm/providers/mcp/config.mjs.map +0 -1
  674. package/dist/esm/providers/mcp/transport.mjs +0 -63
  675. package/dist/esm/providers/mcp/transport.mjs.map +0 -1
  676. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs +0 -126
  677. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs.map +0 -1
  678. package/dist/esm/providers/types.mjs +0 -51
  679. package/dist/esm/providers/types.mjs.map +0 -1
  680. package/dist/esm/tools/artifacts/schema.mjs +0 -79
  681. package/dist/esm/tools/artifacts/schema.mjs.map +0 -1
  682. package/dist/esm/tools/artifacts/tool.mjs +0 -213
  683. package/dist/esm/tools/artifacts/tool.mjs.map +0 -1
  684. package/dist/esm/tools/fileSearch/formatter.mjs +0 -90
  685. package/dist/esm/tools/fileSearch/formatter.mjs.map +0 -1
  686. package/dist/esm/tools/fileSearch/ragClient.mjs +0 -98
  687. package/dist/esm/tools/fileSearch/ragClient.mjs.map +0 -1
  688. package/dist/esm/tools/fileSearch/schema.mjs +0 -15
  689. package/dist/esm/tools/fileSearch/schema.mjs.map +0 -1
  690. package/dist/esm/tools/fileSearch/tool.mjs +0 -152
  691. package/dist/esm/tools/fileSearch/tool.mjs.map +0 -1
  692. package/dist/esm/tools/proxyTool.mjs +0 -100
  693. package/dist/esm/tools/proxyTool.mjs.map +0 -1
  694. package/dist/esm/utils/childAgentContext.mjs +0 -237
  695. package/dist/esm/utils/childAgentContext.mjs.map +0 -1
  696. package/dist/esm/utils/credentials.mjs +0 -135
  697. package/dist/esm/utils/credentials.mjs.map +0 -1
  698. package/dist/esm/utils/httpClient.mjs +0 -70
  699. package/dist/esm/utils/httpClient.mjs.map +0 -1
  700. package/dist/esm/utils/toolManifest.mjs +0 -96
  701. package/dist/esm/utils/toolManifest.mjs.map +0 -1
  702. package/dist/types/common/spawnPath.d.ts +0 -59
  703. package/dist/types/content/ArtifactStore.d.ts +0 -223
  704. package/dist/types/content/ContentStore.d.ts +0 -140
  705. package/dist/types/content/contentAnalyzer.d.ts +0 -38
  706. package/dist/types/content/index.d.ts +0 -24
  707. package/dist/types/content/mcpAutoCache.d.ts +0 -89
  708. package/dist/types/content/types.d.ts +0 -75
  709. package/dist/types/graphs/HandoffRegistry.d.ts +0 -97
  710. package/dist/types/providers/a2a/A2ACapabilityProvider.d.ts +0 -89
  711. package/dist/types/providers/a2a/client.d.ts +0 -47
  712. package/dist/types/providers/a2a/config.d.ts +0 -18
  713. package/dist/types/providers/a2a/index.d.ts +0 -6
  714. package/dist/types/providers/a2a/types.d.ts +0 -173
  715. package/dist/types/providers/capabilityNaming.d.ts +0 -25
  716. package/dist/types/providers/index.d.ts +0 -12
  717. package/dist/types/providers/mcp/MCPCapabilityProvider.d.ts +0 -54
  718. package/dist/types/providers/mcp/config.d.ts +0 -20
  719. package/dist/types/providers/mcp/index.d.ts +0 -5
  720. package/dist/types/providers/mcp/transport.d.ts +0 -18
  721. package/dist/types/providers/mcp/types.d.ts +0 -112
  722. package/dist/types/providers/tools-server/ToolsServerCapabilityProvider.d.ts +0 -59
  723. package/dist/types/providers/tools-server/index.d.ts +0 -1
  724. package/dist/types/providers/types.d.ts +0 -184
  725. package/dist/types/tools/artifacts/index.d.ts +0 -3
  726. package/dist/types/tools/artifacts/schema.d.ts +0 -63
  727. package/dist/types/tools/artifacts/tool.d.ts +0 -16
  728. package/dist/types/tools/artifacts/types.d.ts +0 -127
  729. package/dist/types/tools/fileSearch/formatter.d.ts +0 -25
  730. package/dist/types/tools/fileSearch/index.d.ts +0 -5
  731. package/dist/types/tools/fileSearch/ragClient.d.ts +0 -32
  732. package/dist/types/tools/fileSearch/schema.d.ts +0 -13
  733. package/dist/types/tools/fileSearch/tool.d.ts +0 -18
  734. package/dist/types/tools/fileSearch/types.d.ts +0 -139
  735. package/dist/types/tools/proxyTool.d.ts +0 -62
  736. package/dist/types/utils/childAgentContext.d.ts +0 -99
  737. package/dist/types/utils/credentials.d.ts +0 -77
  738. package/dist/types/utils/httpClient.d.ts +0 -46
  739. package/dist/types/utils/toolManifest.d.ts +0 -49
  740. package/src/common/__tests__/spawnPath.test.ts +0 -110
  741. package/src/common/spawnPath.ts +0 -101
  742. package/src/content/ArtifactStore.ts +0 -782
  743. package/src/content/ContentStore.ts +0 -753
  744. package/src/content/contentAnalyzer.ts +0 -105
  745. package/src/content/index.ts +0 -51
  746. package/src/content/mcpAutoCache.ts +0 -185
  747. package/src/content/types.ts +0 -82
  748. package/src/graphs/HandoffRegistry.ts +0 -199
  749. package/src/graphs/__tests__/HandoffRegistry.test.ts +0 -410
  750. package/src/graphs/__tests__/multi-agent-delegate.test.ts +0 -458
  751. package/src/graphs/__tests__/multi-agent-edges.test.ts +0 -276
  752. package/src/graphs/__tests__/multi-agent-nested-subgraph.test.ts +0 -221
  753. package/src/graphs/handoffValidation.test.ts +0 -353
  754. package/src/providers/__tests__/ToolsServerCapabilityProvider.integration.spec.ts +0 -79
  755. package/src/providers/__tests__/ToolsServerCapabilityProvider.test.ts +0 -271
  756. package/src/providers/__tests__/types.test.ts +0 -64
  757. package/src/providers/a2a/A2ACapabilityProvider.ts +0 -384
  758. package/src/providers/a2a/__tests__/A2ACapabilityProvider.integration.spec.ts +0 -345
  759. package/src/providers/a2a/__tests__/A2ACapabilityProvider.test.ts +0 -460
  760. package/src/providers/a2a/client.ts +0 -115
  761. package/src/providers/a2a/config.ts +0 -40
  762. package/src/providers/a2a/index.ts +0 -29
  763. package/src/providers/a2a/types.ts +0 -191
  764. package/src/providers/capabilityNaming.ts +0 -42
  765. package/src/providers/index.ts +0 -68
  766. package/src/providers/mcp/MCPCapabilityProvider.ts +0 -345
  767. package/src/providers/mcp/__tests__/MCPCapabilityProvider.integration.spec.ts +0 -386
  768. package/src/providers/mcp/__tests__/MCPCapabilityProvider.test.ts +0 -371
  769. package/src/providers/mcp/config.ts +0 -45
  770. package/src/providers/mcp/index.ts +0 -21
  771. package/src/providers/mcp/transport.ts +0 -76
  772. package/src/providers/mcp/types.ts +0 -139
  773. package/src/providers/tools-server/ToolsServerCapabilityProvider.ts +0 -249
  774. package/src/providers/tools-server/index.ts +0 -1
  775. package/src/providers/types.ts +0 -204
  776. package/src/scripts/test-bedrock-handoff-autonomous.ts +0 -267
  777. package/src/scripts/test-handoff-preamble.ts +0 -278
  778. package/src/specs/agent-handoffs-bedrock.integration.test.ts +0 -415
  779. package/src/tools/artifacts/__tests__/tool.test.ts +0 -259
  780. package/src/tools/artifacts/index.ts +0 -33
  781. package/src/tools/artifacts/schema.ts +0 -99
  782. package/src/tools/artifacts/tool.ts +0 -289
  783. package/src/tools/artifacts/types.ts +0 -162
  784. package/src/tools/fileSearch/__tests__/tool.test.ts +0 -261
  785. package/src/tools/fileSearch/formatter.ts +0 -129
  786. package/src/tools/fileSearch/index.ts +0 -23
  787. package/src/tools/fileSearch/ragClient.ts +0 -137
  788. package/src/tools/fileSearch/schema.ts +0 -19
  789. package/src/tools/fileSearch/tool.ts +0 -207
  790. package/src/tools/fileSearch/types.ts +0 -149
  791. package/src/tools/proxyTool.ts +0 -166
  792. package/src/utils/__tests__/childAgentContext.test.ts +0 -217
  793. package/src/utils/__tests__/credentials.test.ts +0 -130
  794. package/src/utils/__tests__/httpClient.test.ts +0 -75
  795. package/src/utils/__tests__/toolManifest.test.ts +0 -116
  796. package/src/utils/childAgentContext.ts +0 -259
  797. package/src/utils/credentials.ts +0 -157
  798. package/src/utils/httpClient.ts +0 -92
  799. package/src/utils/toolManifest.ts +0 -109
  800. /package/dist/esm/{content → langchain}/index.mjs.map +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"ContentStore.cjs","sources":["../../../src/content/ContentStore.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport type Keyv from 'keyv';\nimport type {\n StoreEntry,\n StoredEntry,\n ContentMetadata,\n ReadResult,\n ReadAllResult,\n SearchMatch,\n EditResult,\n} from './types';\n\n/**\n * Default 3-minute TTL for ephemeral content entries. Resets on every\n * access. Kept short to reduce cache-backing memory pressure — callers\n * that persist to durable storage (see {@link ArtifactStore}) rely on\n * lazy restore from the durable backend on cache miss.\n *\n * Exported so consumers can construct their injected {@link Keyv}\n * instance with a matching TTL without hard-coding the number.\n */\nexport const CONTENT_TTL_MS = 180_000;\n\n/** Default number of lines returned by readLines(). */\nconst DEFAULT_READ_LINES = 200;\n\n/** Maximum lines that can be read in a single call. */\nconst MAX_READ_LINES = 500;\n\n/** Maximum search results returned per call. */\nconst MAX_SEARCH_RESULTS = 50;\n\n/** Lines of context to show around a failed edit match for diagnostics. */\nconst ERROR_CONTEXT_LINES = 5;\n\n/**\n * Normalize line endings: CRLF → LF, stray CR → LF.\n * Prevents invisible mismatches when content originates from Windows/Office tools.\n */\nfunction normalizeNewlines(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n\n/**\n * Trim trailing whitespace from each line — used as a fallback when\n * exact matching fails due to invisible trailing spaces.\n */\nfunction trimTrailingPerLine(text: string): string {\n return text\n .split('\\n')\n .map((l) => l.trimEnd())\n .join('\\n');\n}\n\n/**\n * Fuzzy indentation-normalized matching. Compares line content after stripping\n * all leading whitespace, then maps back to the real line range in the content.\n * Returns `{ start, end }` character offsets in `content` if a unique match is found,\n * or `null` if no match or ambiguous (multiple matches).\n */\nfunction findIndentationNormalizedMatch(\n content: string,\n oldStr: string\n): { start: number; end: number } | null {\n const contentLines = content.split('\\n');\n const oldLines = oldStr.split('\\n');\n\n // Strip leading whitespace for comparison — keep non-empty lines only for matching key\n const oldTrimmed = oldLines.map((l) => l.trimStart());\n\n // Need at least 1 non-empty line to match on\n const nonEmptyOldLines = oldTrimmed.filter((l) => l.length > 0);\n if (nonEmptyOldLines.length === 0) return null;\n\n const matches: { start: number; end: number }[] = [];\n\n // Slide a window of oldLines.length across contentLines\n for (let i = 0; i <= contentLines.length - oldLines.length; i++) {\n let matched = true;\n for (let j = 0; j < oldLines.length; j++) {\n const contentTrimmed = contentLines[i + j].trimStart();\n if (contentTrimmed !== oldTrimmed[j]) {\n matched = false;\n break;\n }\n }\n if (matched) {\n // Calculate character offsets for the matched region\n let charStart = 0;\n for (let k = 0; k < i; k++) {\n charStart += contentLines[k].length + 1; // +1 for \\n\n }\n let charEnd = charStart;\n for (let k = 0; k < oldLines.length; k++) {\n charEnd +=\n contentLines[i + k].length + (k < oldLines.length - 1 ? 1 : 0);\n }\n matches.push({ start: charStart, end: charEnd });\n }\n }\n\n // Only return if exactly one match (unambiguous)\n return matches.length === 1 ? matches[0] : null;\n}\n\n/** Minimum fraction of lines that must match for partial fuzzy matching. */\nconst FUZZY_MATCH_THRESHOLD = 0.6;\n\n/**\n * Partial fuzzy matching — tolerates some lines being slightly different.\n * LLMs often reconstruct code from memory with subtle differences on a few lines\n * (e.g., changed variable name, missing semicolon). This layer finds the best-scoring\n * region where at least FUZZY_MATCH_THRESHOLD of lines match after trimming.\n *\n * Returns `{ start, end }` character offsets if a single high-confidence region is found.\n */\nfunction findPartialFuzzyMatch(\n content: string,\n oldStr: string\n): { start: number; end: number } | null {\n const contentLines = content.split('\\n');\n const oldLines = oldStr.split('\\n');\n\n // Need at least 3 lines for fuzzy matching to be meaningful\n if (oldLines.length < 3) return null;\n\n const oldTrimmed = oldLines.map((l) => l.trim());\n const minScore = Math.ceil(oldLines.length * FUZZY_MATCH_THRESHOLD);\n\n let bestScore = 0;\n let bestIdx = -1;\n let secondBestScore = 0;\n\n for (let i = 0; i <= contentLines.length - oldLines.length; i++) {\n let score = 0;\n for (let j = 0; j < oldLines.length; j++) {\n const contentTrimmed = contentLines[i + j].trim();\n // Exact match after trimming all whitespace\n if (contentTrimmed === oldTrimmed[j]) {\n score++;\n } else if (\n // Substring match — one contains the other (handles minor edits)\n contentTrimmed.length > 0 &&\n oldTrimmed[j].length > 0 &&\n (contentTrimmed.includes(oldTrimmed[j]) ||\n oldTrimmed[j].includes(contentTrimmed))\n ) {\n score += 0.5;\n }\n }\n if (score > bestScore) {\n secondBestScore = bestScore;\n bestScore = score;\n bestIdx = i;\n } else if (score > secondBestScore) {\n secondBestScore = score;\n }\n }\n\n // Require: meets threshold AND is clearly better than second-best (unique match)\n if (\n bestIdx < 0 ||\n bestScore < minScore ||\n secondBestScore >= bestScore * 0.9\n ) {\n return null;\n }\n\n // Calculate character offsets\n let charStart = 0;\n for (let k = 0; k < bestIdx; k++) {\n charStart += contentLines[k].length + 1;\n }\n let charEnd = charStart;\n for (let k = 0; k < oldLines.length; k++) {\n charEnd +=\n contentLines[bestIdx + k].length + (k < oldLines.length - 1 ? 1 : 0);\n }\n return { start: charStart, end: charEnd };\n}\n\n/**\n * Find the best approximate match location for `needle` in `haystack` using\n * overlapping line content. Returns the 1-based line number of the best match\n * region, or 0 if no reasonable overlap is found.\n */\nfunction findApproximateLocation(haystack: string, needle: string): number {\n const needleLines = needle\n .split('\\n')\n .map((l) => l.trim())\n .filter(Boolean);\n if (needleLines.length === 0) return 0;\n\n const haystackLines = haystack.split('\\n');\n let bestScore = 0;\n let bestLine = 0;\n\n for (let i = 0; i < haystackLines.length; i++) {\n let score = 0;\n for (\n let j = 0;\n j < needleLines.length && i + j < haystackLines.length;\n j++\n ) {\n if (\n haystackLines[i + j].trim().includes(needleLines[j]) ||\n needleLines[j].includes(haystackLines[i + j].trim())\n ) {\n score++;\n }\n }\n if (score > bestScore) {\n bestScore = score;\n bestLine = i + 1; // 1-based\n }\n }\n\n // Require at least 1 matching line to report a location\n return bestScore >= 1 ? bestLine : 0;\n}\n\n/**\n * Build a diagnostic error message showing nearby content when an edit match fails.\n */\nfunction buildEditDiagnostic(content: string, oldStr: string): string {\n const approxLine = findApproximateLocation(content, oldStr);\n const lines = content.split('\\n');\n\n let contextSnippet = '';\n if (approxLine > 0) {\n const start = Math.max(\n 0,\n approxLine - 1 - Math.floor(ERROR_CONTEXT_LINES / 2)\n );\n const end = Math.min(lines.length, start + ERROR_CONTEXT_LINES);\n const padWidth = String(end).length;\n const snippet = lines\n .slice(start, end)\n .map((l, i) => `${String(start + i + 1).padStart(padWidth, ' ')} | ${l}`)\n .join('\\n');\n contextSnippet = `\\nNearest content (around line ${approxLine}):\\n${snippet}`;\n }\n\n return `old_str not found in content. Re-read the file with content_tool read before retrying.${contextSnippet}`;\n}\n\n/**\n * Strip line-number prefixes (\" N | \") that readLines() adds.\n * Agents may copy these when constructing old_str for edits.\n */\nfunction stripLineNumberPrefixes(text: string): string {\n return text\n .split('\\n')\n .map((line) => {\n const match = line.match(/^\\s*\\d+\\s*\\|\\s?(.*)/);\n return match ? match[1] : line;\n })\n .join('\\n');\n}\n\n/**\n * Generates a short, URL-safe random ID.\n * @param length - Number of random bytes (output is hex, so 2x chars). Default 5 → 10 hex chars.\n */\nfunction generateId(length = 5): string {\n return crypto.randomBytes(length).toString('hex');\n}\n\n/**\n * Per-conversation content store backed by a caller-provided {@link Keyv}\n * cache (typically Keyv + @keyv/redis, with in-memory fallback).\n *\n * Stores large content (MCP results, artifacts, agent-generated text)\n * outside the LLM context window. Entries inherit the TTL configured on\n * the injected {@link Keyv} instance — {@link CONTENT_TTL_MS} is the\n * recommended default.\n *\n * The caller is responsible for namespacing the Keyv instance per\n * conversation so content_ids don't collide across threads.\n *\n * @example\n * ```ts\n * import Keyv from 'keyv';\n * const cache = new Keyv({ namespace: `content-store::${conversationId}`, ttl: CONTENT_TTL_MS });\n * const store = new ContentStore(cache);\n * const id = await store.store({ name: 'report.csv', type: 'text/plain', content: csv, source: 'mcp:sharepoint' });\n * const result = await store.readLines(id, 1, 50);\n * ```\n */\nexport class ContentStore {\n protected indexKey = '_index';\n\n /**\n * @param cache - A pre-namespaced {@link Keyv} instance. The store\n * writes both content entries and a per-store `_index` key, so\n * callers MUST namespace the Keyv per conversation to avoid\n * cross-thread collisions.\n */\n constructor(protected cache: Keyv) {}\n\n /**\n * Store new content and return a content ID.\n * @param entry - The content to store with metadata.\n * @returns The generated content ID.\n */\n async store(entry: StoreEntry): Promise<string> {\n const id = generateId();\n const lines = entry.content.split('\\n');\n\n const metadata: ContentMetadata = {\n id,\n name: entry.name,\n type: entry.type,\n source: entry.source,\n totalLines: lines.length,\n totalChars: entry.content.length,\n createdAt: Date.now(),\n };\n\n const stored: StoredEntry = { content: entry.content, metadata };\n await this.cache.set(id, JSON.stringify(stored));\n\n // Update the index\n const index = await this.getIndex();\n index[id] = metadata;\n await this.cache.set(this.indexKey, JSON.stringify(index));\n\n return id;\n }\n\n /**\n * Get metadata for a content entry without loading the full content.\n * @param contentId - The content entry ID.\n * @returns Metadata or null if not found.\n */\n async info(contentId: string): Promise<ContentMetadata | null> {\n const stored = await this.getStored(contentId);\n if (!stored) {\n return null;\n }\n // Touch both content entry and index to reset TTL\n await this.touchEntry(contentId, stored);\n return stored.metadata;\n }\n\n /**\n * Read lines from a content entry with optional range.\n * Lines are 1-based and inclusive. Returns formatted content with line numbers.\n *\n * @param contentId - The content entry ID.\n * @param startLine - First line to read (1-based, default 1).\n * @param endLine - Last line to read (inclusive, default startLine + DEFAULT_READ_LINES - 1).\n * @returns Read result with formatted content and range info, or null if not found.\n */\n async readLines(\n contentId: string,\n startLine?: number,\n endLine?: number\n ): Promise<ReadResult | null> {\n const stored = await this.getStored(contentId);\n if (!stored) {\n return null;\n }\n\n const lines = stored.content.split('\\n');\n const totalLines = lines.length;\n\n // Clamp start to valid range\n const start = Math.max(1, startLine ?? 1);\n // Clamp end: default to start + DEFAULT_READ_LINES - 1, cap at totalLines and start + MAX_READ_LINES - 1\n let end = endLine ?? start + DEFAULT_READ_LINES - 1;\n end = Math.min(end, totalLines, start + MAX_READ_LINES - 1);\n\n // Slice is 0-based, our line numbers are 1-based\n const slice = lines.slice(start - 1, end);\n\n // Format with line numbers (padded for alignment)\n const padWidth = String(end).length;\n const formatted = slice\n .map((line, i) => {\n const lineNum = String(start + i).padStart(padWidth, ' ');\n return `${lineNum} | ${line}`;\n })\n .join('\\n');\n\n // Touch both content entry and index to reset TTL\n await this.touchEntry(contentId, stored);\n\n return {\n content: formatted,\n startLine: start,\n endLine: end,\n totalLines,\n totalChars: stored.content.length,\n truncated: end < totalLines,\n };\n }\n\n /**\n * Read the full content of an entry without line-number formatting or line caps.\n * Used by API endpoints that serve complete content to the frontend (e.g., CodeViz).\n * Unlike readLines(), this has no MAX_READ_LINES cap and returns raw content.\n *\n * @param contentId - The content entry ID.\n * @returns Raw content with total line/char counts, or null if not found.\n */\n async readAll(contentId: string): Promise<ReadAllResult | null> {\n const stored = await this.getStored(contentId);\n if (!stored) {\n return null;\n }\n\n // Touch both content entry and index to reset TTL\n await this.touchEntry(contentId, stored);\n\n return {\n content: stored.content,\n totalLines: stored.content.split('\\n').length,\n totalChars: stored.content.length,\n };\n }\n\n /**\n * Search for a pattern within a content entry.\n * Supports plain text matching and regex patterns.\n *\n * @param contentId - The content entry ID.\n * @param pattern - Text or regex pattern to match.\n * @param maxResults - Maximum matches to return (default MAX_SEARCH_RESULTS).\n * @returns Array of matches with line numbers, or null if content not found.\n */\n async search(\n contentId: string,\n pattern: string,\n maxResults = MAX_SEARCH_RESULTS\n ): Promise<SearchMatch[] | null> {\n const stored = await this.getStored(contentId);\n if (!stored) {\n return null;\n }\n\n const lines = stored.content.split('\\n');\n const matches: SearchMatch[] = [];\n\n // Try regex first, fall back to plain string match\n let regex: RegExp | null = null;\n try {\n regex = new RegExp(pattern, 'i');\n } catch {\n // Invalid regex — use plain string matching below\n }\n\n for (let i = 0; i < lines.length && matches.length < maxResults; i++) {\n const line = lines[i];\n const isMatch = regex ? regex.test(line) : line.includes(pattern);\n if (isMatch) {\n matches.push({ lineNumber: i + 1, content: line });\n }\n }\n\n // Touch both content entry and index to reset TTL\n await this.touchEntry(contentId, stored);\n\n return matches;\n }\n\n /**\n * Surgical string replacement within a content entry.\n * Fails if old_str is not found or appears more than once (ambiguous).\n *\n * Uses layered matching: exact → line-number-stripped → CRLF-normalized → trailing-whitespace-trimmed.\n * On failure, returns diagnostic context showing nearby content to help the agent self-correct.\n *\n * @param contentId - The content entry ID.\n * @param oldStr - Exact string to find.\n * @param newStr - Replacement string.\n * @returns Edit result with diff and affected line info.\n */\n async strReplace(\n contentId: string,\n oldStr: string,\n newStr: string\n ): Promise<EditResult> {\n const stored = await this.getStored(contentId);\n if (!stored) {\n return {\n success: false,\n diff: '',\n lineNumber: 0,\n linesAffected: 0,\n error: `Content \"${contentId}\" not found`,\n };\n }\n\n const content = stored.content;\n let effectiveOldStr = oldStr;\n let firstIdx = content.indexOf(effectiveOldStr);\n\n // Layer 1: Strip line-number prefixes that readLines() adds.\n // Agents often copy formatted output (e.g., \" 1 | import React\") into old_str.\n if (firstIdx === -1) {\n const stripped = stripLineNumberPrefixes(oldStr);\n if (stripped !== oldStr) {\n firstIdx = content.indexOf(stripped);\n if (firstIdx !== -1) {\n effectiveOldStr = stripped;\n }\n }\n }\n\n // Layer 2: Normalize CRLF → LF (content from Windows/Office/MCP tools may have \\r\\n)\n if (firstIdx === -1) {\n const normContent = normalizeNewlines(content);\n const normOld = normalizeNewlines(effectiveOldStr);\n if (normContent !== content || normOld !== effectiveOldStr) {\n const normIdx = normContent.indexOf(normOld);\n if (normIdx !== -1) {\n // Normalize stored content permanently so future edits don't hit this again\n stored.content = normContent;\n effectiveOldStr = normOld;\n firstIdx = normIdx;\n }\n }\n }\n\n // Layer 3: Trim trailing whitespace per line (invisible trailing spaces cause mismatches)\n if (firstIdx === -1) {\n const trimmedContent = trimTrailingPerLine(stored.content);\n const trimmedOld = trimTrailingPerLine(effectiveOldStr);\n if (trimmedContent !== stored.content || trimmedOld !== effectiveOldStr) {\n const trimIdx = trimmedContent.indexOf(trimmedOld);\n if (trimIdx !== -1) {\n // Use trimmed content for matching; map back to actual content position\n // by finding the equivalent position in the original\n stored.content = trimmedContent;\n effectiveOldStr = trimmedOld;\n firstIdx = trimIdx;\n }\n }\n }\n\n // Layer 4: Indentation-normalized line-by-line matching.\n // Agent often gets the right code but with different indentation (e.g., 2 vs 4 spaces).\n // Match lines by trimmed content, then replace the actual content range.\n let rangeMatch: { start: number; end: number } | null = null;\n if (firstIdx === -1) {\n rangeMatch = findIndentationNormalizedMatch(\n stored.content,\n effectiveOldStr\n );\n if (rangeMatch) {\n effectiveOldStr = stored.content.substring(\n rangeMatch.start,\n rangeMatch.end\n );\n firstIdx = rangeMatch.start;\n }\n }\n\n // Layer 5: Partial fuzzy matching — tolerates some lines being slightly different.\n // LLMs reconstruct code from memory and often get 80-90% of lines right but miss a few.\n // This layer finds the best-scoring unique region above a match threshold.\n if (firstIdx === -1) {\n rangeMatch = findPartialFuzzyMatch(stored.content, effectiveOldStr);\n if (rangeMatch) {\n effectiveOldStr = stored.content.substring(\n rangeMatch.start,\n rangeMatch.end\n );\n firstIdx = rangeMatch.start;\n }\n }\n\n if (firstIdx === -1) {\n const diagnostic = buildEditDiagnostic(stored.content, oldStr);\n return {\n success: false,\n diff: '',\n lineNumber: 0,\n linesAffected: 0,\n error: diagnostic,\n };\n }\n\n // For range-matched edits (layers 4/5), skip the ambiguity check (already verified unique)\n const lastIdx = rangeMatch\n ? firstIdx\n : stored.content.lastIndexOf(effectiveOldStr);\n if (firstIdx !== lastIdx) {\n return {\n success: false,\n diff: '',\n lineNumber: 0,\n linesAffected: 0,\n error: 'old_str appears multiple times — make it more specific',\n };\n }\n\n // Find the line number where the match starts\n const currentContent = stored.content;\n const beforeMatch = currentContent.substring(0, firstIdx);\n const lineNumber = beforeMatch.split('\\n').length;\n\n // Perform replacement\n const newContent =\n currentContent.substring(0, firstIdx) +\n newStr +\n currentContent.substring(firstIdx + effectiveOldStr.length);\n\n // Build a simple diff\n const oldLines = effectiveOldStr.split('\\n');\n const newLines = newStr.split('\\n');\n let diff = '';\n for (const line of oldLines) {\n diff += `- ${line}\\n`;\n }\n for (const line of newLines) {\n diff += `+ ${line}\\n`;\n }\n\n const linesAffected = Math.max(oldLines.length, newLines.length);\n\n // Update stored content and metadata\n stored.content = newContent;\n stored.metadata.totalLines = newContent.split('\\n').length;\n stored.metadata.totalChars = newContent.length;\n await this.cache.set(contentId, JSON.stringify(stored));\n\n // Update index metadata\n const index = await this.getIndex();\n if (index[contentId]) {\n index[contentId] = stored.metadata;\n await this.cache.set(this.indexKey, JSON.stringify(index));\n }\n\n return { success: true, diff: diff.trimEnd(), lineNumber, linesAffected };\n }\n\n /**\n * Overwrite content for an existing entry, preserving its name/source/type.\n * @param contentId - The content entry ID.\n * @param content - New content to write.\n * @throws If content ID is not found.\n */\n async write(contentId: string, content: string): Promise<void> {\n const stored = await this.getStored(contentId);\n if (!stored) {\n throw new Error(`Content \"${contentId}\" not found`);\n }\n\n stored.content = content;\n stored.metadata.totalLines = content.split('\\n').length;\n stored.metadata.totalChars = content.length;\n await this.cache.set(contentId, JSON.stringify(stored));\n\n // Update index metadata\n const index = await this.getIndex();\n if (index[contentId]) {\n index[contentId] = stored.metadata;\n await this.cache.set(this.indexKey, JSON.stringify(index));\n }\n }\n\n /**\n * List all content entries in this conversation's store.\n * @returns Array of metadata for all entries.\n */\n async list(): Promise<ContentMetadata[]> {\n const index = await this.getIndex();\n // Touch index to reset TTL on access\n if (Object.keys(index).length > 0) {\n await this.cache.set(this.indexKey, JSON.stringify(index));\n }\n return Object.values(index);\n }\n\n /**\n * Get the raw content string for a content entry, without line-number formatting.\n * Resets TTL on access. Used by code edit wrapper to retrieve stored code for execution.\n *\n * @param contentId - The content entry ID.\n * @returns Raw content string, or null if not found/expired.\n */\n async getRawContent(contentId: string): Promise<string | null> {\n const stored = await this.getStored(contentId);\n if (!stored) {\n return null;\n }\n await this.touchEntry(contentId, stored);\n return stored.content;\n }\n\n /**\n * Delete a content entry.\n * @param contentId - The content entry ID.\n */\n async delete(contentId: string): Promise<void> {\n await this.cache.delete(contentId);\n\n const index = await this.getIndex();\n delete index[contentId];\n await this.cache.set(this.indexKey, JSON.stringify(index));\n }\n\n /**\n * Reset TTL on both a content entry and the index.\n * Called on every access to keep active content alive.\n * @param contentId - The content entry ID.\n * @param stored - The stored entry to re-set (resets TTL via Keyv).\n */\n protected async touchEntry(\n contentId: string,\n stored: StoredEntry\n ): Promise<void> {\n await this.cache.set(contentId, JSON.stringify(stored));\n const index = await this.getIndex();\n if (Object.keys(index).length > 0) {\n await this.cache.set(this.indexKey, JSON.stringify(index));\n }\n }\n\n /**\n * Retrieve the full stored entry (content + metadata) from Redis.\n * Returns null if the entry has expired or doesn't exist.\n */\n protected async getStored(contentId: string): Promise<StoredEntry | null> {\n const raw = (await this.cache.get(contentId)) as string | undefined;\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw) as StoredEntry;\n } catch {\n return null;\n }\n }\n\n /**\n * Retrieve the conversation's content index from Redis.\n * The index maps content IDs to their metadata.\n */\n protected async getIndex(): Promise<Record<string, ContentMetadata>> {\n const raw = (await this.cache.get(this.indexKey)) as string | undefined;\n if (!raw) {\n return {};\n }\n try {\n return JSON.parse(raw) as Record<string, ContentMetadata>;\n } catch {\n return {};\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,91 +0,0 @@
1
- 'use strict';
2
-
3
- /**
4
- * Utilities for measuring, classifying, and previewing content.
5
- * Used by the content_tool and MCP auto-caching (Phase 2) to decide
6
- * when content is "large" and how to summarize it for the LLM.
7
- */
8
- /**
9
- * Threshold in characters above which content is considered "large"
10
- * and should be stored in ContentStore rather than inlined.
11
- * 50K chars ~ 12.5K tokens ~ 6% of 200K context window.
12
- */
13
- const LARGE_CONTENT_THRESHOLD = 50_000;
14
- /**
15
- * Measure content size and determine if it exceeds the large-content threshold.
16
- * @param text - The content to measure.
17
- * @returns Measurement with char count, line count, and large flag.
18
- */
19
- function measureContent(text) {
20
- return {
21
- totalChars: text.length,
22
- totalLines: text.split('\n').length,
23
- isLarge: text.length > LARGE_CONTENT_THRESHOLD,
24
- };
25
- }
26
- /**
27
- * Detect the structural type of content.
28
- * @param text - The content to classify.
29
- * @returns The detected type: 'json_array', 'json_object', 'text', or 'mixed'.
30
- */
31
- function detectContentType(text) {
32
- const trimmed = text.trim();
33
- if (!trimmed) {
34
- return 'text';
35
- }
36
- // Fast check: does it look like JSON?
37
- if (trimmed[0] === '[' || trimmed[0] === '{') {
38
- try {
39
- const parsed = JSON.parse(trimmed);
40
- if (Array.isArray(parsed)) {
41
- return 'json_array';
42
- }
43
- if (typeof parsed === 'object' && parsed !== null) {
44
- return 'json_object';
45
- }
46
- }
47
- catch {
48
- // Not valid JSON — might be mixed content
49
- if (trimmed[0] === '[' || trimmed[0] === '{') {
50
- return 'mixed';
51
- }
52
- }
53
- }
54
- return 'text';
55
- }
56
- /**
57
- * Generate a preview/summary of content for the LLM context.
58
- * For JSON arrays, shows the first N items. For text, truncates with an ellipsis.
59
- *
60
- * @param text - The full content to preview.
61
- * @param opts - Options controlling preview size.
62
- * @returns A truncated preview string.
63
- */
64
- function generatePreview(text, opts) {
65
- const maxItems = opts?.maxItems ?? 5;
66
- const maxChars = opts?.maxChars ?? 2048;
67
- const contentType = detectContentType(text);
68
- if (contentType === 'json_array') {
69
- try {
70
- const arr = JSON.parse(text.trim());
71
- if (arr.length <= maxItems) {
72
- return text.trim();
73
- }
74
- const preview = arr.slice(0, maxItems);
75
- const result = JSON.stringify(preview, null, 2);
76
- return `${result}\n... (${arr.length - maxItems} more items, ${arr.length} total)`;
77
- }
78
- catch {
79
- // Fall through to text truncation
80
- }
81
- }
82
- if (text.length <= maxChars) {
83
- return text;
84
- }
85
- return `${text.substring(0, maxChars)}\n... (truncated, ${text.length} chars total)`;
86
- }
87
-
88
- exports.detectContentType = detectContentType;
89
- exports.generatePreview = generatePreview;
90
- exports.measureContent = measureContent;
91
- //# sourceMappingURL=contentAnalyzer.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contentAnalyzer.cjs","sources":["../../../src/content/contentAnalyzer.ts"],"sourcesContent":["/**\n * Utilities for measuring, classifying, and previewing content.\n * Used by the content_tool and MCP auto-caching (Phase 2) to decide\n * when content is \"large\" and how to summarize it for the LLM.\n */\n\n/**\n * Threshold in characters above which content is considered \"large\"\n * and should be stored in ContentStore rather than inlined.\n * 50K chars ~ 12.5K tokens ~ 6% of 200K context window.\n */\nconst LARGE_CONTENT_THRESHOLD = 50_000;\n\n/** Content size measurements. */\nexport interface ContentMeasurement {\n totalChars: number;\n totalLines: number;\n /** True if content exceeds the large-content threshold. */\n isLarge: boolean;\n}\n\n/** Detected content type. */\nexport type ContentType = 'json_array' | 'json_object' | 'text' | 'mixed';\n\n/**\n * Measure content size and determine if it exceeds the large-content threshold.\n * @param text - The content to measure.\n * @returns Measurement with char count, line count, and large flag.\n */\nexport function measureContent(text: string): ContentMeasurement {\n return {\n totalChars: text.length,\n totalLines: text.split('\\n').length,\n isLarge: text.length > LARGE_CONTENT_THRESHOLD,\n };\n}\n\n/**\n * Detect the structural type of content.\n * @param text - The content to classify.\n * @returns The detected type: 'json_array', 'json_object', 'text', or 'mixed'.\n */\nexport function detectContentType(text: string): ContentType {\n const trimmed = text.trim();\n if (!trimmed) {\n return 'text';\n }\n\n // Fast check: does it look like JSON?\n if (trimmed[0] === '[' || trimmed[0] === '{') {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n return 'json_array';\n }\n if (typeof parsed === 'object' && parsed !== null) {\n return 'json_object';\n }\n } catch {\n // Not valid JSON — might be mixed content\n if (trimmed[0] === '[' || trimmed[0] === '{') {\n return 'mixed';\n }\n }\n }\n\n return 'text';\n}\n\n/**\n * Generate a preview/summary of content for the LLM context.\n * For JSON arrays, shows the first N items. For text, truncates with an ellipsis.\n *\n * @param text - The full content to preview.\n * @param opts - Options controlling preview size.\n * @returns A truncated preview string.\n */\nexport function generatePreview(\n text: string,\n opts?: { maxItems?: number; maxChars?: number }\n): string {\n const maxItems = opts?.maxItems ?? 5;\n const maxChars = opts?.maxChars ?? 2048;\n const contentType = detectContentType(text);\n\n if (contentType === 'json_array') {\n try {\n const arr = JSON.parse(text.trim()) as unknown[];\n if (arr.length <= maxItems) {\n return text.trim();\n }\n const preview = arr.slice(0, maxItems);\n const result = JSON.stringify(preview, null, 2);\n return `${result}\\n... (${arr.length - maxItems} more items, ${arr.length} total)`;\n } catch {\n // Fall through to text truncation\n }\n }\n\n if (text.length <= maxChars) {\n return text;\n }\n\n return `${text.substring(0, maxChars)}\\n... (truncated, ${text.length} chars total)`;\n}\n"],"names":[],"mappings":";;AAAA;;;;AAIG;AAEH;;;;AAIG;AACH,MAAM,uBAAuB,GAAG,MAAM;AAatC;;;;AAIG;AACG,SAAU,cAAc,CAAC,IAAY,EAAA;IACzC,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,MAAM;QACvB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;AACnC,QAAA,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,uBAAuB;KAC/C;AACH;AAEA;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,IAAY,EAAA;AAC5C,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE;IAC3B,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,OAAO,MAAM;IACf;;AAGA,IAAA,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AAC5C,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAClC,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACzB,gBAAA,OAAO,YAAY;YACrB;YACA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;AACjD,gBAAA,OAAO,aAAa;YACtB;QACF;AAAE,QAAA,MAAM;;AAEN,YAAA,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AAC5C,gBAAA,OAAO,OAAO;YAChB;QACF;IACF;AAEA,IAAA,OAAO,MAAM;AACf;AAEA;;;;;;;AAOG;AACG,SAAU,eAAe,CAC7B,IAAY,EACZ,IAA+C,EAAA;AAE/C,IAAA,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,CAAC;AACpC,IAAA,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,IAAI;AACvC,IAAA,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC;AAE3C,IAAA,IAAI,WAAW,KAAK,YAAY,EAAE;AAChC,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAc;AAChD,YAAA,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ,EAAE;AAC1B,gBAAA,OAAO,IAAI,CAAC,IAAI,EAAE;YACpB;YACA,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;AACtC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,YAAA,OAAO,CAAA,EAAG,MAAM,CAAA,OAAA,EAAU,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAA,aAAA,EAAgB,GAAG,CAAC,MAAM,SAAS;QACpF;AAAE,QAAA,MAAM;;QAER;IACF;AAEA,IAAA,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE;AAC3B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA,kBAAA,EAAqB,IAAI,CAAC,MAAM,eAAe;AACtF;;;;;;"}
@@ -1,20 +0,0 @@
1
- 'use strict';
2
-
3
- var ContentStore = require('./ContentStore.cjs');
4
- var ArtifactStore = require('./ArtifactStore.cjs');
5
- var contentAnalyzer = require('./contentAnalyzer.cjs');
6
- var mcpAutoCache = require('./mcpAutoCache.cjs');
7
-
8
-
9
-
10
- exports.CONTENT_TTL_MS = ContentStore.CONTENT_TTL_MS;
11
- exports.ContentStore = ContentStore.ContentStore;
12
- exports.ArtifactStore = ArtifactStore.ArtifactStore;
13
- exports.sanitizeName = ArtifactStore.sanitizeName;
14
- exports.detectContentType = contentAnalyzer.detectContentType;
15
- exports.generatePreview = contentAnalyzer.generatePreview;
16
- exports.measureContent = contentAnalyzer.measureContent;
17
- exports.buildCachedResponse = mcpAutoCache.buildCachedResponse;
18
- exports.extractUiMarkers = mcpAutoCache.extractUiMarkers;
19
- exports.interceptMcpResult = mcpAutoCache.interceptMcpResult;
20
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
@@ -1,115 +0,0 @@
1
- 'use strict';
2
-
3
- var contentAnalyzer = require('./contentAnalyzer.cjs');
4
-
5
- /**
6
- * MCP Auto-Caching Interceptor
7
- *
8
- * When an MCP tool returns a large text result (>50K chars / ~12.5K tokens),
9
- * stores it in the caller-provided {@link ContentStore} and returns a
10
- * compact metadata reference. The LLM then uses a `content_reader` tool
11
- * (read/search/list/info) to pull relevant pieces of the stored result
12
- * without burning tokens on the full payload.
13
- *
14
- * Gate: callers MUST pass `contentReaderEnabled: true` on the context —
15
- * otherwise the interceptor returns the original text unchanged, because
16
- * caching without a reader tool leaves the agent with a content_id it
17
- * cannot dereference.
18
- *
19
- * Design:
20
- * - Only text content is cached. Images and UI resources pass through.
21
- * - UI resource markers (\ui{...}) are preserved in the returned text.
22
- * - Artifacts (second element of the tuple) are never modified.
23
- * - Cached response is a compact one-liner (~30 tokens) — no preview blob.
24
- * - If the store write fails, degrades gracefully — returns original text.
25
- */
26
- /**
27
- * Regex to detect UI resource markers: \ui{...}
28
- * These MUST be preserved in the returned text even after caching.
29
- */
30
- const UI_MARKER_REGEX = /\\ui\{[^}]+\}/g;
31
- /**
32
- * Extract all UI resource markers from text.
33
- * @param text - The text to scan.
34
- * @returns Array of marker strings (e.g. ['\\ui{abc123}', '\\ui{def456}'])
35
- */
36
- function extractUiMarkers(text) {
37
- return text.match(UI_MARKER_REGEX) ?? [];
38
- }
39
- /**
40
- * Build a compact metadata reference for the cached content.
41
- * Keeps token usage minimal (~30 tokens) while giving the LLM all it needs
42
- * to access the data via content_tool.
43
- *
44
- * @param contentId - ContentStore entry ID.
45
- * @param measurement - Size data.
46
- * @param toolName - The MCP tool that produced the result.
47
- * @param uiMarkers - UI markers extracted from the original text.
48
- */
49
- function buildCachedResponse(contentId, measurement, toolName, uiMarkers) {
50
- const sizeKB = (measurement.totalChars / 1024).toFixed(0);
51
- let response = `[Stored: ${toolName} result | ${sizeKB}KB | ${measurement.totalLines} lines | content_id: ${contentId}]\nUse content_reader (action: read or search) with this content_id to access the full result — do NOT re-run the MCP tool.`;
52
- if (uiMarkers.length > 0) {
53
- response += '\n\n' + uiMarkers.join('\n');
54
- }
55
- return response;
56
- }
57
- /**
58
- * Core auto-cache interceptor for MCP tool results.
59
- *
60
- * If the text exceeds the large-content threshold (50K chars), stores it
61
- * in ContentStore and returns a preview + content_id. Otherwise passes through.
62
- *
63
- * @param text - The text content from the MCP tool result.
64
- * @param context - MCP tool and conversation context.
65
- * @returns AutoCacheResult with possibly-modified text and caching metadata.
66
- */
67
- async function interceptMcpResult(text, context) {
68
- const measurement = contentAnalyzer.measureContent(text);
69
- const log = context.logger;
70
- if (!measurement.isLarge) {
71
- return { text, cached: false, measurement };
72
- }
73
- // Gate: caching only makes sense when the agent can read back the stub.
74
- // If content_reader is disabled, returning a content_id the agent can't
75
- // dereference is strictly worse than returning the full text — the model
76
- // would either hallucinate tool calls or flag the result as inaccessible.
77
- if (!context.contentReaderEnabled) {
78
- log?.debug(`[MCP Auto-Cache] Skipped caching for ${context.serverName}:${context.toolName} — content_reader disabled on this agent`, {
79
- totalChars: measurement.totalChars,
80
- totalLines: measurement.totalLines,
81
- conversationId: context.conversationId,
82
- });
83
- return { text, cached: false, measurement };
84
- }
85
- try {
86
- const contentType = contentAnalyzer.detectContentType(text);
87
- const contentId = await context.store.store({
88
- name: `${context.toolName} result`,
89
- type: contentType === 'text' ? 'text/plain' : 'application/json',
90
- content: text,
91
- source: `mcp:${context.serverName}`,
92
- });
93
- const uiMarkers = extractUiMarkers(text);
94
- const replacementText = buildCachedResponse(contentId, measurement, context.toolName, uiMarkers);
95
- log?.debug(`[MCP Auto-Cache] Cached large result from ${context.serverName}:${context.toolName}`, {
96
- contentId,
97
- totalChars: measurement.totalChars,
98
- totalLines: measurement.totalLines,
99
- conversationId: context.conversationId,
100
- contentType,
101
- uiMarkersPreserved: uiMarkers.length,
102
- });
103
- return { text: replacementText, cached: true, contentId, measurement };
104
- }
105
- catch (error) {
106
- // PERF: If caching fails, fall through silently — full content goes to LLM
107
- log?.warn(`[MCP Auto-Cache] Failed to cache result from ${context.serverName}:${context.toolName}, passing through`, { error: error.message });
108
- return { text, cached: false, measurement };
109
- }
110
- }
111
-
112
- exports.buildCachedResponse = buildCachedResponse;
113
- exports.extractUiMarkers = extractUiMarkers;
114
- exports.interceptMcpResult = interceptMcpResult;
115
- //# sourceMappingURL=mcpAutoCache.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcpAutoCache.cjs","sources":["../../../src/content/mcpAutoCache.ts"],"sourcesContent":["/**\n * MCP Auto-Caching Interceptor\n *\n * When an MCP tool returns a large text result (>50K chars / ~12.5K tokens),\n * stores it in the caller-provided {@link ContentStore} and returns a\n * compact metadata reference. The LLM then uses a `content_reader` tool\n * (read/search/list/info) to pull relevant pieces of the stored result\n * without burning tokens on the full payload.\n *\n * Gate: callers MUST pass `contentReaderEnabled: true` on the context —\n * otherwise the interceptor returns the original text unchanged, because\n * caching without a reader tool leaves the agent with a content_id it\n * cannot dereference.\n *\n * Design:\n * - Only text content is cached. Images and UI resources pass through.\n * - UI resource markers (\\ui{...}) are preserved in the returned text.\n * - Artifacts (second element of the tuple) are never modified.\n * - Cached response is a compact one-liner (~30 tokens) — no preview blob.\n * - If the store write fails, degrades gracefully — returns original text.\n */\n\nimport { ContentStore } from './ContentStore';\nimport { measureContent, detectContentType } from './contentAnalyzer';\nimport type { Logger } from './ArtifactStore';\nimport type { ContentMeasurement } from './contentAnalyzer';\n\n/** Context for the auto-cache interceptor. */\nexport interface AutoCacheContext {\n /**\n * Pre-constructed {@link ContentStore} instance scoped to the current\n * conversation. Caller owns the underlying cache lifecycle.\n */\n store: ContentStore;\n /** MCP server name (e.g. \"sharepoint\", \"github\"). */\n serverName: string;\n /** MCP tool name (e.g. \"read_file\", \"search_code\"). */\n toolName: string;\n /**\n * Whether the current agent has `content_reader` available. When false,\n * the interceptor passes the large text through unchanged — caching\n * without a reader tool leaves the agent with a content_id it cannot\n * dereference, which is worse than returning the raw text.\n */\n contentReaderEnabled: boolean;\n /**\n * Optional diagnostic echo. Typically the conversation ID so operators\n * can correlate the log line with upstream traces.\n */\n conversationId?: string;\n /** Optional logger; defaults to silence. */\n logger?: Logger;\n}\n\n/** Result of the auto-cache interception. */\nexport interface AutoCacheResult {\n /** The (possibly modified) text content to return to the LLM. */\n text: string;\n /** Whether the content was cached. */\n cached: boolean;\n /** The content_id if cached. */\n contentId?: string;\n /** Content measurement data. */\n measurement?: ContentMeasurement;\n}\n\n/**\n * Regex to detect UI resource markers: \\ui{...}\n * These MUST be preserved in the returned text even after caching.\n */\nconst UI_MARKER_REGEX = /\\\\ui\\{[^}]+\\}/g;\n\n/**\n * Extract all UI resource markers from text.\n * @param text - The text to scan.\n * @returns Array of marker strings (e.g. ['\\\\ui{abc123}', '\\\\ui{def456}'])\n */\nexport function extractUiMarkers(text: string): string[] {\n return text.match(UI_MARKER_REGEX) ?? [];\n}\n\n/**\n * Build a compact metadata reference for the cached content.\n * Keeps token usage minimal (~30 tokens) while giving the LLM all it needs\n * to access the data via content_tool.\n *\n * @param contentId - ContentStore entry ID.\n * @param measurement - Size data.\n * @param toolName - The MCP tool that produced the result.\n * @param uiMarkers - UI markers extracted from the original text.\n */\nexport function buildCachedResponse(\n contentId: string,\n measurement: ContentMeasurement,\n toolName: string,\n uiMarkers: string[]\n): string {\n const sizeKB = (measurement.totalChars / 1024).toFixed(0);\n let response = `[Stored: ${toolName} result | ${sizeKB}KB | ${measurement.totalLines} lines | content_id: ${contentId}]\\nUse content_reader (action: read or search) with this content_id to access the full result — do NOT re-run the MCP tool.`;\n\n if (uiMarkers.length > 0) {\n response += '\\n\\n' + uiMarkers.join('\\n');\n }\n\n return response;\n}\n\n/**\n * Core auto-cache interceptor for MCP tool results.\n *\n * If the text exceeds the large-content threshold (50K chars), stores it\n * in ContentStore and returns a preview + content_id. Otherwise passes through.\n *\n * @param text - The text content from the MCP tool result.\n * @param context - MCP tool and conversation context.\n * @returns AutoCacheResult with possibly-modified text and caching metadata.\n */\nexport async function interceptMcpResult(\n text: string,\n context: AutoCacheContext\n): Promise<AutoCacheResult> {\n const measurement = measureContent(text);\n const log = context.logger;\n\n if (!measurement.isLarge) {\n return { text, cached: false, measurement };\n }\n\n // Gate: caching only makes sense when the agent can read back the stub.\n // If content_reader is disabled, returning a content_id the agent can't\n // dereference is strictly worse than returning the full text — the model\n // would either hallucinate tool calls or flag the result as inaccessible.\n if (!context.contentReaderEnabled) {\n log?.debug(\n `[MCP Auto-Cache] Skipped caching for ${context.serverName}:${context.toolName} — content_reader disabled on this agent`,\n {\n totalChars: measurement.totalChars,\n totalLines: measurement.totalLines,\n conversationId: context.conversationId,\n }\n );\n return { text, cached: false, measurement };\n }\n\n try {\n const contentType = detectContentType(text);\n\n const contentId = await context.store.store({\n name: `${context.toolName} result`,\n type: contentType === 'text' ? 'text/plain' : 'application/json',\n content: text,\n source: `mcp:${context.serverName}`,\n });\n\n const uiMarkers = extractUiMarkers(text);\n\n const replacementText = buildCachedResponse(\n contentId,\n measurement,\n context.toolName,\n uiMarkers\n );\n\n log?.debug(\n `[MCP Auto-Cache] Cached large result from ${context.serverName}:${context.toolName}`,\n {\n contentId,\n totalChars: measurement.totalChars,\n totalLines: measurement.totalLines,\n conversationId: context.conversationId,\n contentType,\n uiMarkersPreserved: uiMarkers.length,\n }\n );\n\n return { text: replacementText, cached: true, contentId, measurement };\n } catch (error) {\n // PERF: If caching fails, fall through silently — full content goes to LLM\n log?.warn(\n `[MCP Auto-Cache] Failed to cache result from ${context.serverName}:${context.toolName}, passing through`,\n { error: (error as Error).message }\n );\n return { text, cached: false, measurement };\n }\n}\n"],"names":["measureContent","detectContentType"],"mappings":"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"}
@@ -1,143 +0,0 @@
1
- 'use strict';
2
-
3
- /**
4
- * Registry for async handoff execution.
5
- *
6
- * Enables the autonomous orchestration pattern:
7
- * 1. Orchestrator spawns children (non-blocking)
8
- * 2. Orchestrator stays alive to reason, spawn more, or check status
9
- * 3. Orchestrator collects results when ready
10
- *
11
- * Scoped per MultiAgentGraph instance — each orchestrator graph gets its own registry.
12
- */
13
- class HandoffRegistry {
14
- records = new Map();
15
- /** Monotonically increasing counter for unique spawn IDs */
16
- spawnCounter = 0;
17
- /**
18
- * Register a spawned handoff child.
19
- * The promise runs in the background — not awaited here.
20
- * Uses a unique key per spawn so the same agent can be spawned multiple times
21
- * across rounds without overwriting prior records.
22
- */
23
- spawn(params) {
24
- // Unique internal key: agentId + counter to support multiple spawns of same agent.
25
- // record.id stays as the agent identity so callers/observability can attribute
26
- // results to the agent regardless of which spawn round they came from.
27
- const spawnKey = `${params.id}__${this.spawnCounter++}`;
28
- const record = {
29
- id: params.id,
30
- spawnKey,
31
- name: params.name,
32
- task: params.task,
33
- spawnedAt: Date.now(),
34
- status: 'running',
35
- promise: params.promise,
36
- };
37
- // Wire up the promise to update the record on completion
38
- params.promise
39
- .then((result) => {
40
- const resultText = params.extractResult(result.messages, params.id);
41
- const truncated = params.truncateResult(resultText, params.maxResultChars);
42
- record.status = 'completed';
43
- record.resultText = truncated;
44
- record.durationMs = Date.now() - record.spawnedAt;
45
- record.resultMessageCount = result.messages.length;
46
- params.onComplete?.(record);
47
- })
48
- .catch((err) => {
49
- record.status = 'failed';
50
- record.error = err instanceof Error ? err.message : String(err);
51
- record.durationMs = Date.now() - record.spawnedAt;
52
- params.onComplete?.(record);
53
- });
54
- this.records.set(spawnKey, record);
55
- }
56
- /** List all pending (running) handoffs */
57
- listPending() {
58
- return Array.from(this.records.values()).filter((r) => r.status === 'running');
59
- }
60
- /** List all completed handoffs (not yet collected) */
61
- listCompleted() {
62
- return Array.from(this.records.values()).filter((r) => r.status === 'completed' || r.status === 'failed');
63
- }
64
- /** List all handoffs regardless of status */
65
- listAll() {
66
- return Array.from(this.records.values());
67
- }
68
- /**
69
- * Get a handoff record by either its unique spawnKey or by agentId.
70
- * - Exact spawnKey match wins (O(1)).
71
- * - Falls back to the most recently spawned record for that agentId — matching
72
- * lookups by callers that only know the agent identity, not the spawn round.
73
- */
74
- get(idOrSpawnKey) {
75
- const direct = this.records.get(idOrSpawnKey);
76
- if (direct)
77
- return direct;
78
- let latest;
79
- for (const record of this.records.values()) {
80
- if (record.id !== idOrSpawnKey)
81
- continue;
82
- if (!latest || record.spawnedAt >= latest.spawnedAt)
83
- latest = record;
84
- }
85
- return latest;
86
- }
87
- /** Check if any handoffs are still running */
88
- hasPending() {
89
- return this.listPending().length > 0;
90
- }
91
- /**
92
- * Wait for ALL pending handoffs to complete and return all records.
93
- * Records are NOT auto-cleared — caller removes collected records via remove().
94
- */
95
- async waitForAll() {
96
- const pending = this.listPending();
97
- if (pending.length > 0) {
98
- await Promise.allSettled(pending.map((r) => r.promise));
99
- }
100
- const results = this.listAll();
101
- return results;
102
- }
103
- /**
104
- * Wait for ANY pending handoff to complete.
105
- * Returns the newly completed record(s).
106
- */
107
- async waitForAny() {
108
- const pending = this.listPending();
109
- if (pending.length === 0) {
110
- return this.listCompleted();
111
- }
112
- // Race all pending promises — at least one will resolve
113
- await Promise.race(pending.map((r) => r.promise.then(() => r).catch(() => r)));
114
- // Small yield to let promise handlers update records
115
- await new Promise((resolve) => setTimeout(resolve, 0));
116
- return this.listCompleted();
117
- }
118
- /**
119
- * Remove record(s) by spawnKey or agentId.
120
- * - Exact spawnKey match removes only that record.
121
- * - agentId match removes ALL records for that agent (covers callers that
122
- * want to forget everything tied to a given agent).
123
- */
124
- remove(idOrSpawnKey) {
125
- if (this.records.delete(idOrSpawnKey))
126
- return;
127
- for (const [key, record] of this.records) {
128
- if (record.id === idOrSpawnKey)
129
- this.records.delete(key);
130
- }
131
- }
132
- /** Clear all records (for cleanup between graph invocations) */
133
- clear() {
134
- this.records.clear();
135
- }
136
- /** Number of total tracked handoffs */
137
- get size() {
138
- return this.records.size;
139
- }
140
- }
141
-
142
- exports.HandoffRegistry = HandoffRegistry;
143
- //# sourceMappingURL=HandoffRegistry.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HandoffRegistry.cjs","sources":["../../../src/graphs/HandoffRegistry.ts"],"sourcesContent":["import type { BaseMessage } from '@langchain/core/messages';\nimport type * as t from '@/types';\n\n/**\n * Tracks the lifecycle of a spawned handoff child agent.\n */\nexport type HandoffRecord = {\n /** Agent identity (destination agentId) — stable across multiple spawns of the same agent */\n id: string;\n /** Unique internal key for this specific spawn (agentId + monotonic counter) */\n spawnKey: string;\n /** Display name of the child agent */\n name: string;\n /** Task description / instructions passed to child */\n task: string;\n /** When the handoff was spawned */\n spawnedAt: number;\n /** Current status */\n status: 'pending' | 'running' | 'completed' | 'failed';\n /** The background promise executing the child subgraph */\n promise: Promise<t.BaseGraphState>;\n /** Resolved result text (populated on completion) */\n resultText?: string;\n /** Error message (populated on failure) */\n error?: string;\n /** Duration in ms (populated on completion/failure) */\n durationMs?: number;\n /** Number of messages in child's output */\n resultMessageCount?: number;\n};\n\n/**\n * Registry for async handoff execution.\n *\n * Enables the autonomous orchestration pattern:\n * 1. Orchestrator spawns children (non-blocking)\n * 2. Orchestrator stays alive to reason, spawn more, or check status\n * 3. Orchestrator collects results when ready\n *\n * Scoped per MultiAgentGraph instance — each orchestrator graph gets its own registry.\n */\nexport class HandoffRegistry {\n private records: Map<string, HandoffRecord> = new Map();\n /** Monotonically increasing counter for unique spawn IDs */\n private spawnCounter = 0;\n\n /**\n * Register a spawned handoff child.\n * The promise runs in the background — not awaited here.\n * Uses a unique key per spawn so the same agent can be spawned multiple times\n * across rounds without overwriting prior records.\n */\n spawn(params: {\n id: string;\n name: string;\n task: string;\n promise: Promise<t.BaseGraphState>;\n extractResult: (messages: BaseMessage[], agentId: string) => string;\n truncateResult: (text: string, maxChars: number) => string;\n maxResultChars: number;\n /** Callback when child completes (for SSE events) */\n onComplete?: (record: HandoffRecord) => void;\n }): void {\n // Unique internal key: agentId + counter to support multiple spawns of same agent.\n // record.id stays as the agent identity so callers/observability can attribute\n // results to the agent regardless of which spawn round they came from.\n const spawnKey = `${params.id}__${this.spawnCounter++}`;\n const record: HandoffRecord = {\n id: params.id,\n spawnKey,\n name: params.name,\n task: params.task,\n spawnedAt: Date.now(),\n status: 'running',\n promise: params.promise,\n };\n\n // Wire up the promise to update the record on completion\n params.promise\n .then((result) => {\n const resultText = params.extractResult(result.messages, params.id);\n const truncated = params.truncateResult(\n resultText,\n params.maxResultChars\n );\n record.status = 'completed';\n record.resultText = truncated;\n record.durationMs = Date.now() - record.spawnedAt;\n record.resultMessageCount = result.messages.length;\n params.onComplete?.(record);\n })\n .catch((err) => {\n record.status = 'failed';\n record.error = err instanceof Error ? err.message : String(err);\n record.durationMs = Date.now() - record.spawnedAt;\n params.onComplete?.(record);\n });\n\n this.records.set(spawnKey, record);\n }\n\n /** List all pending (running) handoffs */\n listPending(): HandoffRecord[] {\n return Array.from(this.records.values()).filter(\n (r) => r.status === 'running'\n );\n }\n\n /** List all completed handoffs (not yet collected) */\n listCompleted(): HandoffRecord[] {\n return Array.from(this.records.values()).filter(\n (r) => r.status === 'completed' || r.status === 'failed'\n );\n }\n\n /** List all handoffs regardless of status */\n listAll(): HandoffRecord[] {\n return Array.from(this.records.values());\n }\n\n /**\n * Get a handoff record by either its unique spawnKey or by agentId.\n * - Exact spawnKey match wins (O(1)).\n * - Falls back to the most recently spawned record for that agentId — matching\n * lookups by callers that only know the agent identity, not the spawn round.\n */\n get(idOrSpawnKey: string): HandoffRecord | undefined {\n const direct = this.records.get(idOrSpawnKey);\n if (direct) return direct;\n let latest: HandoffRecord | undefined;\n for (const record of this.records.values()) {\n if (record.id !== idOrSpawnKey) continue;\n if (!latest || record.spawnedAt >= latest.spawnedAt) latest = record;\n }\n return latest;\n }\n\n /** Check if any handoffs are still running */\n hasPending(): boolean {\n return this.listPending().length > 0;\n }\n\n /**\n * Wait for ALL pending handoffs to complete and return all records.\n * Records are NOT auto-cleared — caller removes collected records via remove().\n */\n async waitForAll(): Promise<HandoffRecord[]> {\n const pending = this.listPending();\n if (pending.length > 0) {\n await Promise.allSettled(pending.map((r) => r.promise));\n }\n const results = this.listAll();\n return results;\n }\n\n /**\n * Wait for ANY pending handoff to complete.\n * Returns the newly completed record(s).\n */\n async waitForAny(): Promise<HandoffRecord[]> {\n const pending = this.listPending();\n if (pending.length === 0) {\n return this.listCompleted();\n }\n\n // Race all pending promises — at least one will resolve\n await Promise.race(\n pending.map((r) => r.promise.then(() => r).catch(() => r))\n );\n\n // Small yield to let promise handlers update records\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n return this.listCompleted();\n }\n\n /**\n * Remove record(s) by spawnKey or agentId.\n * - Exact spawnKey match removes only that record.\n * - agentId match removes ALL records for that agent (covers callers that\n * want to forget everything tied to a given agent).\n */\n remove(idOrSpawnKey: string): void {\n if (this.records.delete(idOrSpawnKey)) return;\n for (const [key, record] of this.records) {\n if (record.id === idOrSpawnKey) this.records.delete(key);\n }\n }\n\n /** Clear all records (for cleanup between graph invocations) */\n clear(): void {\n this.records.clear();\n }\n\n /** Number of total tracked handoffs */\n get size(): number {\n return this.records.size;\n }\n}\n"],"names":[],"mappings":"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"}