@illuma-ai/agents 1.4.0-alpha.6 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (653) 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/graphs/phases/memoryFlushPhase.cjs +1 -1
  11. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs.map +1 -1
  12. package/dist/cjs/hooks/HookRegistry.cjs +162 -0
  13. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -0
  14. package/dist/cjs/hooks/executeHooks.cjs +276 -0
  15. package/dist/cjs/hooks/executeHooks.cjs.map +1 -0
  16. package/dist/cjs/hooks/matchers.cjs +256 -0
  17. package/dist/cjs/hooks/matchers.cjs.map +1 -0
  18. package/dist/cjs/hooks/types.cjs +27 -0
  19. package/dist/cjs/hooks/types.cjs.map +1 -0
  20. package/dist/cjs/langchain/google-common.cjs +3 -0
  21. package/dist/cjs/langchain/google-common.cjs.map +1 -0
  22. package/dist/cjs/langchain/index.cjs +86 -0
  23. package/dist/cjs/langchain/index.cjs.map +1 -0
  24. package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
  25. package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
  26. package/dist/cjs/langchain/messages/tool.cjs +3 -0
  27. package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
  28. package/dist/cjs/langchain/messages.cjs +51 -0
  29. package/dist/cjs/langchain/messages.cjs.map +1 -0
  30. package/dist/cjs/langchain/openai.cjs +3 -0
  31. package/dist/cjs/langchain/openai.cjs.map +1 -0
  32. package/dist/cjs/langchain/prompts.cjs +11 -0
  33. package/dist/cjs/langchain/prompts.cjs.map +1 -0
  34. package/dist/cjs/langchain/runnables.cjs +19 -0
  35. package/dist/cjs/langchain/runnables.cjs.map +1 -0
  36. package/dist/cjs/langchain/tools.cjs +23 -0
  37. package/dist/cjs/langchain/tools.cjs.map +1 -0
  38. package/dist/cjs/langchain/utils/env.cjs +11 -0
  39. package/dist/cjs/langchain/utils/env.cjs.map +1 -0
  40. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +5 -1
  41. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  42. package/dist/cjs/llm/bedrock/cacheSupport.cjs +55 -0
  43. package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +1 -0
  44. package/dist/cjs/llm/bedrock/index.cjs +61 -33
  45. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  46. package/dist/cjs/llm/openai/index.cjs +1 -4
  47. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  48. package/dist/cjs/llm/openai/utils/index.cjs +27 -10
  49. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  50. package/dist/cjs/main.cjs +178 -127
  51. package/dist/cjs/main.cjs.map +1 -1
  52. package/dist/cjs/memory/citations.cjs +4 -4
  53. package/dist/cjs/memory/citations.cjs.map +1 -1
  54. package/dist/cjs/memory/constants.cjs +17 -17
  55. package/dist/cjs/memory/constants.cjs.map +1 -1
  56. package/dist/cjs/memory/mmr.cjs +1 -1
  57. package/dist/cjs/memory/mmr.cjs.map +1 -1
  58. package/dist/cjs/memory/paths.cjs +1 -1
  59. package/dist/cjs/memory/paths.cjs.map +1 -1
  60. package/dist/cjs/memory/recallTracking.cjs +3 -3
  61. package/dist/cjs/memory/recallTracking.cjs.map +1 -1
  62. package/dist/cjs/memory/temporalDecay.cjs +2 -2
  63. package/dist/cjs/memory/temporalDecay.cjs.map +1 -1
  64. package/dist/cjs/messages/cache.cjs +89 -0
  65. package/dist/cjs/messages/cache.cjs.map +1 -1
  66. package/dist/cjs/messages/contextPruning.cjs +156 -0
  67. package/dist/cjs/messages/contextPruning.cjs.map +1 -0
  68. package/dist/cjs/messages/contextPruningSettings.cjs +53 -0
  69. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -0
  70. package/dist/cjs/messages/format.cjs +144 -20
  71. package/dist/cjs/messages/format.cjs.map +1 -1
  72. package/dist/cjs/messages/prune.cjs +505 -4
  73. package/dist/cjs/messages/prune.cjs.map +1 -1
  74. package/dist/cjs/run.cjs +141 -1
  75. package/dist/cjs/run.cjs.map +1 -1
  76. package/dist/cjs/tools/BashExecutor.cjs +235 -0
  77. package/dist/cjs/tools/BashExecutor.cjs.map +1 -0
  78. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +297 -0
  79. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -0
  80. package/dist/cjs/tools/CodeExecutor.cjs +45 -47
  81. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  82. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +16 -11
  83. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  84. package/dist/cjs/tools/ReadFile.cjs +44 -0
  85. package/dist/cjs/tools/ReadFile.cjs.map +1 -0
  86. package/dist/cjs/tools/SkillTool.cjs +51 -0
  87. package/dist/cjs/tools/SkillTool.cjs.map +1 -0
  88. package/dist/cjs/tools/SubagentTool.cjs +93 -0
  89. package/dist/cjs/tools/SubagentTool.cjs.map +1 -0
  90. package/dist/cjs/tools/ToolNode.cjs +450 -24
  91. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  92. package/dist/cjs/tools/memory/memoryAppendTool.cjs +1 -1
  93. package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -1
  94. package/dist/cjs/tools/memory/memoryGetTool.cjs +2 -2
  95. package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -1
  96. package/dist/cjs/tools/memory/memorySearchTool.cjs +3 -3
  97. package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -1
  98. package/dist/cjs/tools/memory/shared.cjs +1 -1
  99. package/dist/cjs/tools/memory/shared.cjs.map +1 -1
  100. package/dist/cjs/tools/search/search.cjs +11 -3
  101. package/dist/cjs/tools/search/search.cjs.map +1 -1
  102. package/dist/cjs/tools/search/tavily-scraper.cjs +189 -0
  103. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -0
  104. package/dist/cjs/tools/search/tavily-search.cjs +372 -0
  105. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -0
  106. package/dist/cjs/tools/search/tool.cjs +28 -4
  107. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  108. package/dist/cjs/tools/search/utils.cjs +10 -3
  109. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  110. package/dist/cjs/tools/skillCatalog.cjs +84 -0
  111. package/dist/cjs/tools/skillCatalog.cjs.map +1 -0
  112. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +512 -0
  113. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -0
  114. package/dist/cjs/tools/toolOutputReferences.cjs +670 -0
  115. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -0
  116. package/dist/cjs/types/agent-cache.cjs +54 -0
  117. package/dist/cjs/types/agent-cache.cjs.map +1 -0
  118. package/dist/cjs/types/graph.cjs.map +1 -1
  119. package/dist/cjs/utils/truncation.cjs +135 -0
  120. package/dist/cjs/utils/truncation.cjs.map +1 -0
  121. package/dist/esm/agents/AgentContext.mjs +274 -67
  122. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  123. package/dist/esm/common/enum.mjs +44 -12
  124. package/dist/esm/common/enum.mjs.map +1 -1
  125. package/dist/esm/graphs/Graph.mjs +182 -5
  126. package/dist/esm/graphs/Graph.mjs.map +1 -1
  127. package/dist/esm/graphs/MultiAgentGraph.mjs +155 -1170
  128. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  129. package/dist/esm/graphs/phases/memoryFlushPhase.mjs +1 -1
  130. package/dist/esm/graphs/phases/memoryFlushPhase.mjs.map +1 -1
  131. package/dist/esm/hooks/HookRegistry.mjs +160 -0
  132. package/dist/esm/hooks/HookRegistry.mjs.map +1 -0
  133. package/dist/esm/hooks/executeHooks.mjs +273 -0
  134. package/dist/esm/hooks/executeHooks.mjs.map +1 -0
  135. package/dist/esm/hooks/matchers.mjs +251 -0
  136. package/dist/esm/hooks/matchers.mjs.map +1 -0
  137. package/dist/esm/hooks/types.mjs +25 -0
  138. package/dist/esm/hooks/types.mjs.map +1 -0
  139. package/dist/esm/langchain/google-common.mjs +2 -0
  140. package/dist/esm/langchain/google-common.mjs.map +1 -0
  141. package/dist/esm/langchain/index.mjs +5 -0
  142. package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
  143. package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
  144. package/dist/esm/langchain/messages/tool.mjs +2 -0
  145. package/dist/esm/langchain/messages/tool.mjs.map +1 -0
  146. package/dist/esm/langchain/messages.mjs +2 -0
  147. package/dist/esm/langchain/messages.mjs.map +1 -0
  148. package/dist/esm/langchain/openai.mjs +2 -0
  149. package/dist/esm/langchain/openai.mjs.map +1 -0
  150. package/dist/esm/langchain/prompts.mjs +2 -0
  151. package/dist/esm/langchain/prompts.mjs.map +1 -0
  152. package/dist/esm/langchain/runnables.mjs +2 -0
  153. package/dist/esm/langchain/runnables.mjs.map +1 -0
  154. package/dist/esm/langchain/tools.mjs +2 -0
  155. package/dist/esm/langchain/tools.mjs.map +1 -0
  156. package/dist/esm/langchain/utils/env.mjs +2 -0
  157. package/dist/esm/langchain/utils/env.mjs.map +1 -0
  158. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +5 -1
  159. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  160. package/dist/esm/llm/bedrock/cacheSupport.mjs +52 -0
  161. package/dist/esm/llm/bedrock/cacheSupport.mjs.map +1 -0
  162. package/dist/esm/llm/bedrock/index.mjs +61 -34
  163. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  164. package/dist/esm/llm/openai/index.mjs +1 -4
  165. package/dist/esm/llm/openai/index.mjs.map +1 -1
  166. package/dist/esm/llm/openai/utils/index.mjs +27 -10
  167. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  168. package/dist/esm/main.mjs +21 -27
  169. package/dist/esm/main.mjs.map +1 -1
  170. package/dist/esm/memory/citations.mjs +4 -4
  171. package/dist/esm/memory/citations.mjs.map +1 -1
  172. package/dist/esm/memory/constants.mjs +17 -17
  173. package/dist/esm/memory/constants.mjs.map +1 -1
  174. package/dist/esm/memory/mmr.mjs +1 -1
  175. package/dist/esm/memory/mmr.mjs.map +1 -1
  176. package/dist/esm/memory/paths.mjs +1 -1
  177. package/dist/esm/memory/paths.mjs.map +1 -1
  178. package/dist/esm/memory/recallTracking.mjs +3 -3
  179. package/dist/esm/memory/recallTracking.mjs.map +1 -1
  180. package/dist/esm/memory/temporalDecay.mjs +2 -2
  181. package/dist/esm/memory/temporalDecay.mjs.map +1 -1
  182. package/dist/esm/messages/cache.mjs +89 -0
  183. package/dist/esm/messages/cache.mjs.map +1 -1
  184. package/dist/esm/messages/contextPruning.mjs +154 -0
  185. package/dist/esm/messages/contextPruning.mjs.map +1 -0
  186. package/dist/esm/messages/contextPruningSettings.mjs +50 -0
  187. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -0
  188. package/dist/esm/messages/format.mjs +136 -12
  189. package/dist/esm/messages/format.mjs.map +1 -1
  190. package/dist/esm/messages/prune.mjs +504 -7
  191. package/dist/esm/messages/prune.mjs.map +1 -1
  192. package/dist/esm/run.mjs +141 -1
  193. package/dist/esm/run.mjs.map +1 -1
  194. package/dist/esm/tools/BashExecutor.mjs +227 -0
  195. package/dist/esm/tools/BashExecutor.mjs.map +1 -0
  196. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +288 -0
  197. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -0
  198. package/dist/esm/tools/CodeExecutor.mjs +45 -48
  199. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  200. package/dist/esm/tools/ProgrammaticToolCalling.mjs +17 -12
  201. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  202. package/dist/esm/tools/ReadFile.mjs +39 -0
  203. package/dist/esm/tools/ReadFile.mjs.map +1 -0
  204. package/dist/esm/tools/SkillTool.mjs +46 -0
  205. package/dist/esm/tools/SkillTool.mjs.map +1 -0
  206. package/dist/esm/tools/SubagentTool.mjs +86 -0
  207. package/dist/esm/tools/SubagentTool.mjs.map +1 -0
  208. package/dist/esm/tools/ToolNode.mjs +452 -26
  209. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  210. package/dist/esm/tools/memory/memoryAppendTool.mjs +1 -1
  211. package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -1
  212. package/dist/esm/tools/memory/memoryGetTool.mjs +2 -2
  213. package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -1
  214. package/dist/esm/tools/memory/memorySearchTool.mjs +3 -3
  215. package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -1
  216. package/dist/esm/tools/memory/shared.mjs +1 -1
  217. package/dist/esm/tools/memory/shared.mjs.map +1 -1
  218. package/dist/esm/tools/search/search.mjs +11 -3
  219. package/dist/esm/tools/search/search.mjs.map +1 -1
  220. package/dist/esm/tools/search/tavily-scraper.mjs +186 -0
  221. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -0
  222. package/dist/esm/tools/search/tavily-search.mjs +370 -0
  223. package/dist/esm/tools/search/tavily-search.mjs.map +1 -0
  224. package/dist/esm/tools/search/tool.mjs +28 -4
  225. package/dist/esm/tools/search/tool.mjs.map +1 -1
  226. package/dist/esm/tools/search/utils.mjs +10 -3
  227. package/dist/esm/tools/search/utils.mjs.map +1 -1
  228. package/dist/esm/tools/skillCatalog.mjs +82 -0
  229. package/dist/esm/tools/skillCatalog.mjs.map +1 -0
  230. package/dist/esm/tools/subagent/SubagentExecutor.mjs +506 -0
  231. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -0
  232. package/dist/esm/tools/toolOutputReferences.mjs +662 -0
  233. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -0
  234. package/dist/esm/types/agent-cache.mjs +52 -0
  235. package/dist/esm/types/agent-cache.mjs.map +1 -0
  236. package/dist/esm/types/graph.mjs.map +1 -1
  237. package/dist/esm/utils/truncation.mjs +128 -0
  238. package/dist/esm/utils/truncation.mjs.map +1 -0
  239. package/dist/types/agents/AgentContext.d.ts +101 -8
  240. package/dist/types/common/enum.d.ts +39 -12
  241. package/dist/types/common/index.d.ts +0 -1
  242. package/dist/types/graphs/Graph.d.ts +43 -0
  243. package/dist/types/graphs/MultiAgentGraph.d.ts +26 -150
  244. package/dist/types/graphs/index.d.ts +0 -1
  245. package/dist/types/graphs/phases/memoryFlushPhase.d.ts +2 -2
  246. package/dist/types/hooks/HookRegistry.d.ts +56 -0
  247. package/dist/types/hooks/executeHooks.d.ts +79 -0
  248. package/dist/types/hooks/index.d.ts +6 -0
  249. package/dist/types/hooks/matchers.d.ts +95 -0
  250. package/dist/types/hooks/types.d.ts +320 -0
  251. package/dist/types/index.d.ts +9 -9
  252. package/dist/types/langchain/google-common.d.ts +1 -0
  253. package/dist/types/langchain/index.d.ts +8 -0
  254. package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
  255. package/dist/types/langchain/messages/tool.d.ts +1 -0
  256. package/dist/types/langchain/messages.d.ts +2 -0
  257. package/dist/types/langchain/openai.d.ts +1 -0
  258. package/dist/types/langchain/prompts.d.ts +1 -0
  259. package/dist/types/langchain/runnables.d.ts +2 -0
  260. package/dist/types/langchain/tools.d.ts +2 -0
  261. package/dist/types/langchain/utils/env.d.ts +1 -0
  262. package/dist/types/llm/bedrock/cacheSupport.d.ts +35 -0
  263. package/dist/types/llm/bedrock/index.d.ts +54 -1
  264. package/dist/types/llm/openai/index.d.ts +1 -1
  265. package/dist/types/memory/citations.d.ts +4 -4
  266. package/dist/types/memory/constants.d.ts +17 -17
  267. package/dist/types/memory/mmr.d.ts +3 -3
  268. package/dist/types/memory/paths.d.ts +1 -1
  269. package/dist/types/memory/temporalDecay.d.ts +2 -2
  270. package/dist/types/memory/types.d.ts +3 -3
  271. package/dist/types/messages/contextPruning.d.ts +42 -0
  272. package/dist/types/messages/contextPruningSettings.d.ts +44 -0
  273. package/dist/types/messages/format.d.ts +9 -1
  274. package/dist/types/messages/index.d.ts +2 -0
  275. package/dist/types/messages/prune.d.ts +91 -1
  276. package/dist/types/run.d.ts +2 -0
  277. package/dist/types/tools/BashExecutor.d.ts +76 -0
  278. package/dist/types/tools/BashProgrammaticToolCalling.d.ts +72 -0
  279. package/dist/types/tools/CodeExecutor.d.ts +8 -26
  280. package/dist/types/tools/ReadFile.d.ts +28 -0
  281. package/dist/types/tools/SkillTool.d.ts +40 -0
  282. package/dist/types/tools/SubagentTool.d.ts +36 -0
  283. package/dist/types/tools/ToolNode.d.ts +77 -5
  284. package/dist/types/tools/memory/shared.d.ts +1 -1
  285. package/dist/types/tools/search/tavily-scraper.d.ts +19 -0
  286. package/dist/types/tools/search/tavily-search.d.ts +4 -0
  287. package/dist/types/tools/search/types.d.ts +99 -5
  288. package/dist/types/tools/search/utils.d.ts +2 -2
  289. package/dist/types/tools/skillCatalog.d.ts +19 -0
  290. package/dist/types/tools/subagent/SubagentExecutor.d.ts +137 -0
  291. package/dist/types/tools/subagent/index.d.ts +2 -0
  292. package/dist/types/tools/subagent/types.d.ts +84 -0
  293. package/dist/types/tools/toolOutputReferences.d.ts +236 -0
  294. package/dist/types/types/agent-cache.d.ts +71 -0
  295. package/dist/types/types/graph.d.ts +163 -22
  296. package/dist/types/types/index.d.ts +3 -0
  297. package/dist/types/types/messages.d.ts +26 -0
  298. package/dist/types/types/run.d.ts +22 -0
  299. package/dist/types/types/skill.d.ts +9 -0
  300. package/dist/types/types/tools.d.ts +111 -0
  301. package/dist/types/utils/index.d.ts +1 -3
  302. package/dist/types/utils/truncation.d.ts +70 -0
  303. package/package.json +57 -17
  304. package/src/agents/AgentContext.ts +321 -78
  305. package/src/agents/__tests__/AgentContext.cacheTtl.live.test.ts +259 -0
  306. package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +266 -0
  307. package/src/agents/__tests__/AgentContext.crossUserCache.live.test.ts +342 -0
  308. package/src/agents/__tests__/AgentContext.test.ts +632 -0
  309. package/src/common/__tests__/enum.test.ts +7 -17
  310. package/src/common/enum.ts +43 -12
  311. package/src/common/index.ts +0 -1
  312. package/src/graphs/Graph.ts +222 -2
  313. package/src/graphs/MultiAgentGraph.ts +154 -1466
  314. package/src/graphs/__tests__/MultiAgentGraph.test.ts +91 -0
  315. package/src/graphs/gapFeatures.test.ts +1 -1
  316. package/src/graphs/index.ts +0 -1
  317. package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +1 -1
  318. package/src/graphs/phases/memoryFlushPhase.ts +2 -2
  319. package/src/hooks/HookRegistry.ts +208 -0
  320. package/src/hooks/__tests__/HookRegistry.test.ts +190 -0
  321. package/src/hooks/__tests__/compactHooks.test.ts +214 -0
  322. package/src/hooks/__tests__/executeHooks.test.ts +1013 -0
  323. package/src/hooks/__tests__/integration.test.ts +337 -0
  324. package/src/hooks/__tests__/matchers.test.ts +238 -0
  325. package/src/hooks/__tests__/toolHooks.test.ts +665 -0
  326. package/src/hooks/executeHooks.ts +375 -0
  327. package/src/hooks/index.ts +57 -0
  328. package/src/hooks/matchers.ts +280 -0
  329. package/src/hooks/types.ts +404 -0
  330. package/src/index.ts +15 -24
  331. package/src/langchain/google-common.ts +1 -0
  332. package/src/langchain/index.ts +8 -0
  333. package/src/langchain/language_models/chat_models.ts +1 -0
  334. package/src/langchain/messages/tool.ts +5 -0
  335. package/src/langchain/messages.ts +21 -0
  336. package/src/langchain/openai.ts +1 -0
  337. package/src/langchain/prompts.ts +1 -0
  338. package/src/langchain/runnables.ts +7 -0
  339. package/src/langchain/tools.ts +8 -0
  340. package/src/langchain/utils/env.ts +1 -0
  341. package/src/llm/anthropic/utils/message_inputs.ts +10 -1
  342. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +436 -0
  343. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +166 -18
  344. package/src/llm/bedrock/cacheSupport.test.ts +99 -0
  345. package/src/llm/bedrock/cacheSupport.ts +53 -0
  346. package/src/llm/bedrock/index.ts +116 -41
  347. package/src/llm/openai/index.ts +2 -2
  348. package/src/llm/openai/utils/index.ts +31 -14
  349. package/src/memory/citations.ts +4 -4
  350. package/src/memory/constants.ts +17 -17
  351. package/src/memory/mmr.ts +3 -3
  352. package/src/memory/paths.ts +1 -1
  353. package/src/memory/recallTracking.ts +3 -3
  354. package/src/memory/temporalDecay.ts +2 -2
  355. package/src/memory/types.ts +3 -3
  356. package/src/messages/__tests__/contextPruning.test.ts +228 -0
  357. package/src/messages/cache.test.ts +62 -24
  358. package/src/messages/cache.ts +112 -0
  359. package/src/messages/contextPruning.ts +191 -0
  360. package/src/messages/contextPruningSettings.ts +90 -0
  361. package/src/messages/ensureThinkingBlock.test.ts +1 -1
  362. package/src/messages/format.ts +164 -12
  363. package/src/messages/formatAgentMessages.skills.test.ts +413 -0
  364. package/src/messages/formatAgentMessages.test.ts +1 -1
  365. package/src/messages/index.ts +2 -0
  366. package/src/messages/prune.ts +661 -4
  367. package/src/run.ts +155 -1
  368. package/src/scripts/multi-agent-chain.ts +2 -2
  369. package/src/scripts/multi-agent-document-review-chain.ts +2 -2
  370. package/src/scripts/multi-agent-hybrid-flow.ts +4 -4
  371. package/src/scripts/multi-agent-parallel.ts +3 -3
  372. package/src/scripts/multi-agent-sequence.ts +3 -3
  373. package/src/scripts/multi-agent-subagent.ts +246 -0
  374. package/src/scripts/multi-agent-supervisor.ts +5 -5
  375. package/src/scripts/poc-multi-agent-comprehensive.ts +8 -8
  376. package/src/scripts/sequential-full-metadata-test.ts +2 -2
  377. package/src/scripts/subagent-event-driven-debug.ts +190 -0
  378. package/src/scripts/subagent-tools-debug.ts +160 -0
  379. package/src/scripts/test-custom-prompt-key.ts +3 -3
  380. package/src/scripts/test-handoff-input.ts +1 -1
  381. package/src/scripts/test-handoff-steering.ts +3 -3
  382. package/src/scripts/test-multi-agent-list-handoff.ts +1 -1
  383. package/src/scripts/test-parallel-agent-labeling.ts +3 -3
  384. package/src/scripts/test-parallel-handoffs.ts +2 -2
  385. package/src/scripts/test-thinking-handoff-bedrock.ts +1 -1
  386. package/src/scripts/test-thinking-handoff.ts +1 -1
  387. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +1 -1
  388. package/src/scripts/test-tool-before-handoff-role-order.ts +1 -1
  389. package/src/scripts/test-tools-before-handoff.ts +1 -1
  390. package/src/specs/agent-handoffs.test.ts +26 -483
  391. package/src/specs/anthropic.simple.test.ts +61 -0
  392. package/src/specs/multi-agent-summarization.test.ts +396 -0
  393. package/src/specs/prune.orphans.test.ts +248 -0
  394. package/src/specs/prune.test.ts +104 -16
  395. package/src/specs/thinking-handoff.test.ts +19 -19
  396. package/src/tools/BashExecutor.ts +281 -0
  397. package/src/tools/BashProgrammaticToolCalling.ts +397 -0
  398. package/src/tools/CodeExecutor.ts +63 -54
  399. package/src/tools/ProgrammaticToolCalling.ts +29 -14
  400. package/src/tools/ReadFile.ts +39 -0
  401. package/src/tools/SkillTool.ts +46 -0
  402. package/src/tools/SubagentTool.ts +100 -0
  403. package/src/tools/ToolNode.ts +548 -26
  404. package/src/tools/__tests__/BashExecutor.test.ts +49 -0
  405. package/src/tools/__tests__/CodeExecutor.test.ts +37 -36
  406. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +60 -0
  407. package/src/tools/__tests__/ReadFile.test.ts +44 -0
  408. package/src/tools/__tests__/SkillTool.test.ts +442 -0
  409. package/src/tools/__tests__/SubagentExecutor.test.ts +1148 -0
  410. package/src/tools/__tests__/SubagentTool.test.ts +149 -0
  411. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +1438 -0
  412. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +479 -0
  413. package/src/tools/__tests__/skillCatalog.test.ts +161 -0
  414. package/src/tools/__tests__/subagentHooks.test.ts +210 -0
  415. package/src/tools/__tests__/toolOutputReferences.test.ts +415 -0
  416. package/src/tools/memory/memoryAppendTool.ts +1 -1
  417. package/src/tools/memory/memoryGetTool.ts +2 -2
  418. package/src/tools/memory/memorySearchTool.ts +3 -3
  419. package/src/tools/memory/shared.ts +1 -1
  420. package/src/tools/search/search.ts +12 -2
  421. package/src/tools/search/tavily-scraper.ts +235 -0
  422. package/src/tools/search/tavily-search.ts +424 -0
  423. package/src/tools/search/tavily.test.ts +965 -0
  424. package/src/tools/search/tool.ts +36 -2
  425. package/src/tools/search/types.ts +133 -8
  426. package/src/tools/search/utils.ts +13 -5
  427. package/src/tools/skillCatalog.ts +126 -0
  428. package/src/tools/subagent/SubagentExecutor.ts +676 -0
  429. package/src/tools/subagent/index.ts +13 -0
  430. package/src/tools/subagent/types.test.ts +70 -0
  431. package/src/tools/subagent/types.ts +115 -0
  432. package/src/tools/toolOutputReferences.ts +825 -0
  433. package/src/types/agent-cache.ts +74 -0
  434. package/src/types/graph.ts +172 -20
  435. package/src/types/index.ts +3 -0
  436. package/src/types/messages.ts +27 -0
  437. package/src/types/run.ts +22 -0
  438. package/src/types/skill.ts +11 -0
  439. package/src/types/tools.ts +118 -0
  440. package/src/utils/__tests__/truncation.test.ts +66 -0
  441. package/src/utils/index.ts +1 -3
  442. package/src/utils/truncation.ts +154 -0
  443. package/dist/cjs/common/spawnPath.cjs +0 -104
  444. package/dist/cjs/common/spawnPath.cjs.map +0 -1
  445. package/dist/cjs/content/ArtifactStore.cjs +0 -579
  446. package/dist/cjs/content/ArtifactStore.cjs.map +0 -1
  447. package/dist/cjs/content/ContentStore.cjs +0 -638
  448. package/dist/cjs/content/ContentStore.cjs.map +0 -1
  449. package/dist/cjs/content/contentAnalyzer.cjs +0 -91
  450. package/dist/cjs/content/contentAnalyzer.cjs.map +0 -1
  451. package/dist/cjs/content/index.cjs +0 -20
  452. package/dist/cjs/content/index.cjs.map +0 -1
  453. package/dist/cjs/content/mcpAutoCache.cjs +0 -115
  454. package/dist/cjs/content/mcpAutoCache.cjs.map +0 -1
  455. package/dist/cjs/graphs/HandoffRegistry.cjs +0 -143
  456. package/dist/cjs/graphs/HandoffRegistry.cjs.map +0 -1
  457. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs +0 -288
  458. package/dist/cjs/providers/a2a/A2ACapabilityProvider.cjs.map +0 -1
  459. package/dist/cjs/providers/a2a/client.cjs +0 -92
  460. package/dist/cjs/providers/a2a/client.cjs.map +0 -1
  461. package/dist/cjs/providers/a2a/config.cjs +0 -38
  462. package/dist/cjs/providers/a2a/config.cjs.map +0 -1
  463. package/dist/cjs/providers/capabilityNaming.cjs +0 -43
  464. package/dist/cjs/providers/capabilityNaming.cjs.map +0 -1
  465. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs +0 -244
  466. package/dist/cjs/providers/mcp/MCPCapabilityProvider.cjs.map +0 -1
  467. package/dist/cjs/providers/mcp/config.cjs +0 -42
  468. package/dist/cjs/providers/mcp/config.cjs.map +0 -1
  469. package/dist/cjs/providers/mcp/transport.cjs +0 -65
  470. package/dist/cjs/providers/mcp/transport.cjs.map +0 -1
  471. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs +0 -128
  472. package/dist/cjs/providers/tools-server/ToolsServerCapabilityProvider.cjs.map +0 -1
  473. package/dist/cjs/providers/types.cjs +0 -51
  474. package/dist/cjs/providers/types.cjs.map +0 -1
  475. package/dist/cjs/tools/artifacts/schema.cjs +0 -86
  476. package/dist/cjs/tools/artifacts/schema.cjs.map +0 -1
  477. package/dist/cjs/tools/artifacts/tool.cjs +0 -219
  478. package/dist/cjs/tools/artifacts/tool.cjs.map +0 -1
  479. package/dist/cjs/tools/fileSearch/formatter.cjs +0 -93
  480. package/dist/cjs/tools/fileSearch/formatter.cjs.map +0 -1
  481. package/dist/cjs/tools/fileSearch/ragClient.cjs +0 -102
  482. package/dist/cjs/tools/fileSearch/ragClient.cjs.map +0 -1
  483. package/dist/cjs/tools/fileSearch/schema.cjs +0 -18
  484. package/dist/cjs/tools/fileSearch/schema.cjs.map +0 -1
  485. package/dist/cjs/tools/fileSearch/tool.cjs +0 -155
  486. package/dist/cjs/tools/fileSearch/tool.cjs.map +0 -1
  487. package/dist/cjs/tools/proxyTool.cjs +0 -102
  488. package/dist/cjs/tools/proxyTool.cjs.map +0 -1
  489. package/dist/cjs/utils/childAgentContext.cjs +0 -242
  490. package/dist/cjs/utils/childAgentContext.cjs.map +0 -1
  491. package/dist/cjs/utils/credentials.cjs +0 -142
  492. package/dist/cjs/utils/credentials.cjs.map +0 -1
  493. package/dist/cjs/utils/httpClient.cjs +0 -74
  494. package/dist/cjs/utils/httpClient.cjs.map +0 -1
  495. package/dist/cjs/utils/toolManifest.cjs +0 -100
  496. package/dist/cjs/utils/toolManifest.cjs.map +0 -1
  497. package/dist/esm/common/spawnPath.mjs +0 -95
  498. package/dist/esm/common/spawnPath.mjs.map +0 -1
  499. package/dist/esm/content/ArtifactStore.mjs +0 -576
  500. package/dist/esm/content/ArtifactStore.mjs.map +0 -1
  501. package/dist/esm/content/ContentStore.mjs +0 -635
  502. package/dist/esm/content/ContentStore.mjs.map +0 -1
  503. package/dist/esm/content/contentAnalyzer.mjs +0 -87
  504. package/dist/esm/content/contentAnalyzer.mjs.map +0 -1
  505. package/dist/esm/content/index.mjs +0 -5
  506. package/dist/esm/content/mcpAutoCache.mjs +0 -111
  507. package/dist/esm/content/mcpAutoCache.mjs.map +0 -1
  508. package/dist/esm/graphs/HandoffRegistry.mjs +0 -141
  509. package/dist/esm/graphs/HandoffRegistry.mjs.map +0 -1
  510. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs +0 -281
  511. package/dist/esm/providers/a2a/A2ACapabilityProvider.mjs.map +0 -1
  512. package/dist/esm/providers/a2a/client.mjs +0 -88
  513. package/dist/esm/providers/a2a/client.mjs.map +0 -1
  514. package/dist/esm/providers/a2a/config.mjs +0 -35
  515. package/dist/esm/providers/a2a/config.mjs.map +0 -1
  516. package/dist/esm/providers/capabilityNaming.mjs +0 -39
  517. package/dist/esm/providers/capabilityNaming.mjs.map +0 -1
  518. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs +0 -240
  519. package/dist/esm/providers/mcp/MCPCapabilityProvider.mjs.map +0 -1
  520. package/dist/esm/providers/mcp/config.mjs +0 -39
  521. package/dist/esm/providers/mcp/config.mjs.map +0 -1
  522. package/dist/esm/providers/mcp/transport.mjs +0 -63
  523. package/dist/esm/providers/mcp/transport.mjs.map +0 -1
  524. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs +0 -126
  525. package/dist/esm/providers/tools-server/ToolsServerCapabilityProvider.mjs.map +0 -1
  526. package/dist/esm/providers/types.mjs +0 -51
  527. package/dist/esm/providers/types.mjs.map +0 -1
  528. package/dist/esm/tools/artifacts/schema.mjs +0 -79
  529. package/dist/esm/tools/artifacts/schema.mjs.map +0 -1
  530. package/dist/esm/tools/artifacts/tool.mjs +0 -213
  531. package/dist/esm/tools/artifacts/tool.mjs.map +0 -1
  532. package/dist/esm/tools/fileSearch/formatter.mjs +0 -90
  533. package/dist/esm/tools/fileSearch/formatter.mjs.map +0 -1
  534. package/dist/esm/tools/fileSearch/ragClient.mjs +0 -98
  535. package/dist/esm/tools/fileSearch/ragClient.mjs.map +0 -1
  536. package/dist/esm/tools/fileSearch/schema.mjs +0 -15
  537. package/dist/esm/tools/fileSearch/schema.mjs.map +0 -1
  538. package/dist/esm/tools/fileSearch/tool.mjs +0 -152
  539. package/dist/esm/tools/fileSearch/tool.mjs.map +0 -1
  540. package/dist/esm/tools/proxyTool.mjs +0 -100
  541. package/dist/esm/tools/proxyTool.mjs.map +0 -1
  542. package/dist/esm/utils/childAgentContext.mjs +0 -237
  543. package/dist/esm/utils/childAgentContext.mjs.map +0 -1
  544. package/dist/esm/utils/credentials.mjs +0 -135
  545. package/dist/esm/utils/credentials.mjs.map +0 -1
  546. package/dist/esm/utils/httpClient.mjs +0 -70
  547. package/dist/esm/utils/httpClient.mjs.map +0 -1
  548. package/dist/esm/utils/toolManifest.mjs +0 -96
  549. package/dist/esm/utils/toolManifest.mjs.map +0 -1
  550. package/dist/types/common/spawnPath.d.ts +0 -59
  551. package/dist/types/content/ArtifactStore.d.ts +0 -223
  552. package/dist/types/content/ContentStore.d.ts +0 -140
  553. package/dist/types/content/contentAnalyzer.d.ts +0 -38
  554. package/dist/types/content/index.d.ts +0 -24
  555. package/dist/types/content/mcpAutoCache.d.ts +0 -89
  556. package/dist/types/content/types.d.ts +0 -75
  557. package/dist/types/graphs/HandoffRegistry.d.ts +0 -97
  558. package/dist/types/providers/a2a/A2ACapabilityProvider.d.ts +0 -89
  559. package/dist/types/providers/a2a/client.d.ts +0 -47
  560. package/dist/types/providers/a2a/config.d.ts +0 -18
  561. package/dist/types/providers/a2a/index.d.ts +0 -6
  562. package/dist/types/providers/a2a/types.d.ts +0 -173
  563. package/dist/types/providers/capabilityNaming.d.ts +0 -25
  564. package/dist/types/providers/index.d.ts +0 -12
  565. package/dist/types/providers/mcp/MCPCapabilityProvider.d.ts +0 -54
  566. package/dist/types/providers/mcp/config.d.ts +0 -20
  567. package/dist/types/providers/mcp/index.d.ts +0 -5
  568. package/dist/types/providers/mcp/transport.d.ts +0 -18
  569. package/dist/types/providers/mcp/types.d.ts +0 -112
  570. package/dist/types/providers/tools-server/ToolsServerCapabilityProvider.d.ts +0 -59
  571. package/dist/types/providers/tools-server/index.d.ts +0 -1
  572. package/dist/types/providers/types.d.ts +0 -184
  573. package/dist/types/tools/artifacts/index.d.ts +0 -3
  574. package/dist/types/tools/artifacts/schema.d.ts +0 -63
  575. package/dist/types/tools/artifacts/tool.d.ts +0 -16
  576. package/dist/types/tools/artifacts/types.d.ts +0 -127
  577. package/dist/types/tools/fileSearch/formatter.d.ts +0 -25
  578. package/dist/types/tools/fileSearch/index.d.ts +0 -5
  579. package/dist/types/tools/fileSearch/ragClient.d.ts +0 -32
  580. package/dist/types/tools/fileSearch/schema.d.ts +0 -13
  581. package/dist/types/tools/fileSearch/tool.d.ts +0 -18
  582. package/dist/types/tools/fileSearch/types.d.ts +0 -139
  583. package/dist/types/tools/proxyTool.d.ts +0 -62
  584. package/dist/types/tools/search/test.d.ts +0 -1
  585. package/dist/types/utils/childAgentContext.d.ts +0 -99
  586. package/dist/types/utils/credentials.d.ts +0 -77
  587. package/dist/types/utils/httpClient.d.ts +0 -46
  588. package/dist/types/utils/toolManifest.d.ts +0 -49
  589. package/src/common/__tests__/spawnPath.test.ts +0 -110
  590. package/src/common/spawnPath.ts +0 -101
  591. package/src/content/ArtifactStore.ts +0 -782
  592. package/src/content/ContentStore.ts +0 -753
  593. package/src/content/contentAnalyzer.ts +0 -105
  594. package/src/content/index.ts +0 -51
  595. package/src/content/mcpAutoCache.ts +0 -185
  596. package/src/content/types.ts +0 -82
  597. package/src/graphs/HandoffRegistry.ts +0 -199
  598. package/src/graphs/__tests__/HandoffRegistry.test.ts +0 -410
  599. package/src/graphs/__tests__/multi-agent-delegate.test.ts +0 -458
  600. package/src/graphs/__tests__/multi-agent-edges.test.ts +0 -276
  601. package/src/graphs/__tests__/multi-agent-nested-subgraph.test.ts +0 -221
  602. package/src/graphs/handoffValidation.test.ts +0 -353
  603. package/src/providers/__tests__/ToolsServerCapabilityProvider.integration.spec.ts +0 -79
  604. package/src/providers/__tests__/ToolsServerCapabilityProvider.test.ts +0 -271
  605. package/src/providers/__tests__/types.test.ts +0 -64
  606. package/src/providers/a2a/A2ACapabilityProvider.ts +0 -384
  607. package/src/providers/a2a/__tests__/A2ACapabilityProvider.integration.spec.ts +0 -345
  608. package/src/providers/a2a/__tests__/A2ACapabilityProvider.test.ts +0 -460
  609. package/src/providers/a2a/client.ts +0 -115
  610. package/src/providers/a2a/config.ts +0 -40
  611. package/src/providers/a2a/index.ts +0 -29
  612. package/src/providers/a2a/types.ts +0 -191
  613. package/src/providers/capabilityNaming.ts +0 -42
  614. package/src/providers/index.ts +0 -68
  615. package/src/providers/mcp/MCPCapabilityProvider.ts +0 -345
  616. package/src/providers/mcp/__tests__/MCPCapabilityProvider.integration.spec.ts +0 -386
  617. package/src/providers/mcp/__tests__/MCPCapabilityProvider.test.ts +0 -371
  618. package/src/providers/mcp/config.ts +0 -45
  619. package/src/providers/mcp/index.ts +0 -21
  620. package/src/providers/mcp/transport.ts +0 -76
  621. package/src/providers/mcp/types.ts +0 -139
  622. package/src/providers/tools-server/ToolsServerCapabilityProvider.ts +0 -249
  623. package/src/providers/tools-server/index.ts +0 -1
  624. package/src/providers/types.ts +0 -204
  625. package/src/scripts/test-bedrock-handoff-autonomous.ts +0 -267
  626. package/src/scripts/test-handoff-preamble.ts +0 -278
  627. package/src/specs/agent-handoffs-bedrock.integration.test.ts +0 -415
  628. package/src/tools/artifacts/__tests__/tool.test.ts +0 -259
  629. package/src/tools/artifacts/index.ts +0 -33
  630. package/src/tools/artifacts/schema.ts +0 -99
  631. package/src/tools/artifacts/tool.ts +0 -289
  632. package/src/tools/artifacts/types.ts +0 -162
  633. package/src/tools/fileSearch/__tests__/tool.test.ts +0 -261
  634. package/src/tools/fileSearch/formatter.ts +0 -129
  635. package/src/tools/fileSearch/index.ts +0 -23
  636. package/src/tools/fileSearch/ragClient.ts +0 -137
  637. package/src/tools/fileSearch/schema.ts +0 -19
  638. package/src/tools/fileSearch/tool.ts +0 -207
  639. package/src/tools/fileSearch/types.ts +0 -149
  640. package/src/tools/proxyTool.ts +0 -166
  641. package/src/tools/search/output.md +0 -2775
  642. package/src/tools/search/test.html +0 -884
  643. package/src/tools/search/test.md +0 -643
  644. package/src/tools/search/test.ts +0 -159
  645. package/src/utils/__tests__/childAgentContext.test.ts +0 -217
  646. package/src/utils/__tests__/credentials.test.ts +0 -130
  647. package/src/utils/__tests__/httpClient.test.ts +0 -75
  648. package/src/utils/__tests__/toolManifest.test.ts +0 -116
  649. package/src/utils/childAgentContext.ts +0 -259
  650. package/src/utils/credentials.ts +0 -157
  651. package/src/utils/httpClient.ts +0 -92
  652. package/src/utils/toolManifest.ts +0 -109
  653. /package/dist/esm/{content → langchain}/index.mjs.map +0 -0
@@ -1,635 +0,0 @@
1
- import crypto from 'node:crypto';
2
-
3
- /**
4
- * Default 3-minute TTL for ephemeral content entries. Resets on every
5
- * access. Kept short to reduce cache-backing memory pressure — callers
6
- * that persist to durable storage (see {@link ArtifactStore}) rely on
7
- * lazy restore from the durable backend on cache miss.
8
- *
9
- * Exported so consumers can construct their injected {@link Keyv}
10
- * instance with a matching TTL without hard-coding the number.
11
- */
12
- const CONTENT_TTL_MS = 180_000;
13
- /** Default number of lines returned by readLines(). */
14
- const DEFAULT_READ_LINES = 200;
15
- /** Maximum lines that can be read in a single call. */
16
- const MAX_READ_LINES = 500;
17
- /** Maximum search results returned per call. */
18
- const MAX_SEARCH_RESULTS = 50;
19
- /** Lines of context to show around a failed edit match for diagnostics. */
20
- const ERROR_CONTEXT_LINES = 5;
21
- /**
22
- * Normalize line endings: CRLF → LF, stray CR → LF.
23
- * Prevents invisible mismatches when content originates from Windows/Office tools.
24
- */
25
- function normalizeNewlines(text) {
26
- return text.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
27
- }
28
- /**
29
- * Trim trailing whitespace from each line — used as a fallback when
30
- * exact matching fails due to invisible trailing spaces.
31
- */
32
- function trimTrailingPerLine(text) {
33
- return text
34
- .split('\n')
35
- .map((l) => l.trimEnd())
36
- .join('\n');
37
- }
38
- /**
39
- * Fuzzy indentation-normalized matching. Compares line content after stripping
40
- * all leading whitespace, then maps back to the real line range in the content.
41
- * Returns `{ start, end }` character offsets in `content` if a unique match is found,
42
- * or `null` if no match or ambiguous (multiple matches).
43
- */
44
- function findIndentationNormalizedMatch(content, oldStr) {
45
- const contentLines = content.split('\n');
46
- const oldLines = oldStr.split('\n');
47
- // Strip leading whitespace for comparison — keep non-empty lines only for matching key
48
- const oldTrimmed = oldLines.map((l) => l.trimStart());
49
- // Need at least 1 non-empty line to match on
50
- const nonEmptyOldLines = oldTrimmed.filter((l) => l.length > 0);
51
- if (nonEmptyOldLines.length === 0)
52
- return null;
53
- const matches = [];
54
- // Slide a window of oldLines.length across contentLines
55
- for (let i = 0; i <= contentLines.length - oldLines.length; i++) {
56
- let matched = true;
57
- for (let j = 0; j < oldLines.length; j++) {
58
- const contentTrimmed = contentLines[i + j].trimStart();
59
- if (contentTrimmed !== oldTrimmed[j]) {
60
- matched = false;
61
- break;
62
- }
63
- }
64
- if (matched) {
65
- // Calculate character offsets for the matched region
66
- let charStart = 0;
67
- for (let k = 0; k < i; k++) {
68
- charStart += contentLines[k].length + 1; // +1 for \n
69
- }
70
- let charEnd = charStart;
71
- for (let k = 0; k < oldLines.length; k++) {
72
- charEnd +=
73
- contentLines[i + k].length + (k < oldLines.length - 1 ? 1 : 0);
74
- }
75
- matches.push({ start: charStart, end: charEnd });
76
- }
77
- }
78
- // Only return if exactly one match (unambiguous)
79
- return matches.length === 1 ? matches[0] : null;
80
- }
81
- /** Minimum fraction of lines that must match for partial fuzzy matching. */
82
- const FUZZY_MATCH_THRESHOLD = 0.6;
83
- /**
84
- * Partial fuzzy matching — tolerates some lines being slightly different.
85
- * LLMs often reconstruct code from memory with subtle differences on a few lines
86
- * (e.g., changed variable name, missing semicolon). This layer finds the best-scoring
87
- * region where at least FUZZY_MATCH_THRESHOLD of lines match after trimming.
88
- *
89
- * Returns `{ start, end }` character offsets if a single high-confidence region is found.
90
- */
91
- function findPartialFuzzyMatch(content, oldStr) {
92
- const contentLines = content.split('\n');
93
- const oldLines = oldStr.split('\n');
94
- // Need at least 3 lines for fuzzy matching to be meaningful
95
- if (oldLines.length < 3)
96
- return null;
97
- const oldTrimmed = oldLines.map((l) => l.trim());
98
- const minScore = Math.ceil(oldLines.length * FUZZY_MATCH_THRESHOLD);
99
- let bestScore = 0;
100
- let bestIdx = -1;
101
- let secondBestScore = 0;
102
- for (let i = 0; i <= contentLines.length - oldLines.length; i++) {
103
- let score = 0;
104
- for (let j = 0; j < oldLines.length; j++) {
105
- const contentTrimmed = contentLines[i + j].trim();
106
- // Exact match after trimming all whitespace
107
- if (contentTrimmed === oldTrimmed[j]) {
108
- score++;
109
- }
110
- else if (
111
- // Substring match — one contains the other (handles minor edits)
112
- contentTrimmed.length > 0 &&
113
- oldTrimmed[j].length > 0 &&
114
- (contentTrimmed.includes(oldTrimmed[j]) ||
115
- oldTrimmed[j].includes(contentTrimmed))) {
116
- score += 0.5;
117
- }
118
- }
119
- if (score > bestScore) {
120
- secondBestScore = bestScore;
121
- bestScore = score;
122
- bestIdx = i;
123
- }
124
- else if (score > secondBestScore) {
125
- secondBestScore = score;
126
- }
127
- }
128
- // Require: meets threshold AND is clearly better than second-best (unique match)
129
- if (bestIdx < 0 ||
130
- bestScore < minScore ||
131
- secondBestScore >= bestScore * 0.9) {
132
- return null;
133
- }
134
- // Calculate character offsets
135
- let charStart = 0;
136
- for (let k = 0; k < bestIdx; k++) {
137
- charStart += contentLines[k].length + 1;
138
- }
139
- let charEnd = charStart;
140
- for (let k = 0; k < oldLines.length; k++) {
141
- charEnd +=
142
- contentLines[bestIdx + k].length + (k < oldLines.length - 1 ? 1 : 0);
143
- }
144
- return { start: charStart, end: charEnd };
145
- }
146
- /**
147
- * Find the best approximate match location for `needle` in `haystack` using
148
- * overlapping line content. Returns the 1-based line number of the best match
149
- * region, or 0 if no reasonable overlap is found.
150
- */
151
- function findApproximateLocation(haystack, needle) {
152
- const needleLines = needle
153
- .split('\n')
154
- .map((l) => l.trim())
155
- .filter(Boolean);
156
- if (needleLines.length === 0)
157
- return 0;
158
- const haystackLines = haystack.split('\n');
159
- let bestScore = 0;
160
- let bestLine = 0;
161
- for (let i = 0; i < haystackLines.length; i++) {
162
- let score = 0;
163
- for (let j = 0; j < needleLines.length && i + j < haystackLines.length; j++) {
164
- if (haystackLines[i + j].trim().includes(needleLines[j]) ||
165
- needleLines[j].includes(haystackLines[i + j].trim())) {
166
- score++;
167
- }
168
- }
169
- if (score > bestScore) {
170
- bestScore = score;
171
- bestLine = i + 1; // 1-based
172
- }
173
- }
174
- // Require at least 1 matching line to report a location
175
- return bestScore >= 1 ? bestLine : 0;
176
- }
177
- /**
178
- * Build a diagnostic error message showing nearby content when an edit match fails.
179
- */
180
- function buildEditDiagnostic(content, oldStr) {
181
- const approxLine = findApproximateLocation(content, oldStr);
182
- const lines = content.split('\n');
183
- let contextSnippet = '';
184
- if (approxLine > 0) {
185
- const start = Math.max(0, approxLine - 1 - Math.floor(ERROR_CONTEXT_LINES / 2));
186
- const end = Math.min(lines.length, start + ERROR_CONTEXT_LINES);
187
- const padWidth = String(end).length;
188
- const snippet = lines
189
- .slice(start, end)
190
- .map((l, i) => `${String(start + i + 1).padStart(padWidth, ' ')} | ${l}`)
191
- .join('\n');
192
- contextSnippet = `\nNearest content (around line ${approxLine}):\n${snippet}`;
193
- }
194
- return `old_str not found in content. Re-read the file with content_tool read before retrying.${contextSnippet}`;
195
- }
196
- /**
197
- * Strip line-number prefixes (" N | ") that readLines() adds.
198
- * Agents may copy these when constructing old_str for edits.
199
- */
200
- function stripLineNumberPrefixes(text) {
201
- return text
202
- .split('\n')
203
- .map((line) => {
204
- const match = line.match(/^\s*\d+\s*\|\s?(.*)/);
205
- return match ? match[1] : line;
206
- })
207
- .join('\n');
208
- }
209
- /**
210
- * Generates a short, URL-safe random ID.
211
- * @param length - Number of random bytes (output is hex, so 2x chars). Default 5 → 10 hex chars.
212
- */
213
- function generateId(length = 5) {
214
- return crypto.randomBytes(length).toString('hex');
215
- }
216
- /**
217
- * Per-conversation content store backed by a caller-provided {@link Keyv}
218
- * cache (typically Keyv + @keyv/redis, with in-memory fallback).
219
- *
220
- * Stores large content (MCP results, artifacts, agent-generated text)
221
- * outside the LLM context window. Entries inherit the TTL configured on
222
- * the injected {@link Keyv} instance — {@link CONTENT_TTL_MS} is the
223
- * recommended default.
224
- *
225
- * The caller is responsible for namespacing the Keyv instance per
226
- * conversation so content_ids don't collide across threads.
227
- *
228
- * @example
229
- * ```ts
230
- * import Keyv from 'keyv';
231
- * const cache = new Keyv({ namespace: `content-store::${conversationId}`, ttl: CONTENT_TTL_MS });
232
- * const store = new ContentStore(cache);
233
- * const id = await store.store({ name: 'report.csv', type: 'text/plain', content: csv, source: 'mcp:sharepoint' });
234
- * const result = await store.readLines(id, 1, 50);
235
- * ```
236
- */
237
- class ContentStore {
238
- cache;
239
- indexKey = '_index';
240
- /**
241
- * @param cache - A pre-namespaced {@link Keyv} instance. The store
242
- * writes both content entries and a per-store `_index` key, so
243
- * callers MUST namespace the Keyv per conversation to avoid
244
- * cross-thread collisions.
245
- */
246
- constructor(cache) {
247
- this.cache = cache;
248
- }
249
- /**
250
- * Store new content and return a content ID.
251
- * @param entry - The content to store with metadata.
252
- * @returns The generated content ID.
253
- */
254
- async store(entry) {
255
- const id = generateId();
256
- const lines = entry.content.split('\n');
257
- const metadata = {
258
- id,
259
- name: entry.name,
260
- type: entry.type,
261
- source: entry.source,
262
- totalLines: lines.length,
263
- totalChars: entry.content.length,
264
- createdAt: Date.now(),
265
- };
266
- const stored = { content: entry.content, metadata };
267
- await this.cache.set(id, JSON.stringify(stored));
268
- // Update the index
269
- const index = await this.getIndex();
270
- index[id] = metadata;
271
- await this.cache.set(this.indexKey, JSON.stringify(index));
272
- return id;
273
- }
274
- /**
275
- * Get metadata for a content entry without loading the full content.
276
- * @param contentId - The content entry ID.
277
- * @returns Metadata or null if not found.
278
- */
279
- async info(contentId) {
280
- const stored = await this.getStored(contentId);
281
- if (!stored) {
282
- return null;
283
- }
284
- // Touch both content entry and index to reset TTL
285
- await this.touchEntry(contentId, stored);
286
- return stored.metadata;
287
- }
288
- /**
289
- * Read lines from a content entry with optional range.
290
- * Lines are 1-based and inclusive. Returns formatted content with line numbers.
291
- *
292
- * @param contentId - The content entry ID.
293
- * @param startLine - First line to read (1-based, default 1).
294
- * @param endLine - Last line to read (inclusive, default startLine + DEFAULT_READ_LINES - 1).
295
- * @returns Read result with formatted content and range info, or null if not found.
296
- */
297
- async readLines(contentId, startLine, endLine) {
298
- const stored = await this.getStored(contentId);
299
- if (!stored) {
300
- return null;
301
- }
302
- const lines = stored.content.split('\n');
303
- const totalLines = lines.length;
304
- // Clamp start to valid range
305
- const start = Math.max(1, startLine ?? 1);
306
- // Clamp end: default to start + DEFAULT_READ_LINES - 1, cap at totalLines and start + MAX_READ_LINES - 1
307
- let end = endLine ?? start + DEFAULT_READ_LINES - 1;
308
- end = Math.min(end, totalLines, start + MAX_READ_LINES - 1);
309
- // Slice is 0-based, our line numbers are 1-based
310
- const slice = lines.slice(start - 1, end);
311
- // Format with line numbers (padded for alignment)
312
- const padWidth = String(end).length;
313
- const formatted = slice
314
- .map((line, i) => {
315
- const lineNum = String(start + i).padStart(padWidth, ' ');
316
- return `${lineNum} | ${line}`;
317
- })
318
- .join('\n');
319
- // Touch both content entry and index to reset TTL
320
- await this.touchEntry(contentId, stored);
321
- return {
322
- content: formatted,
323
- startLine: start,
324
- endLine: end,
325
- totalLines,
326
- totalChars: stored.content.length,
327
- truncated: end < totalLines,
328
- };
329
- }
330
- /**
331
- * Read the full content of an entry without line-number formatting or line caps.
332
- * Used by API endpoints that serve complete content to the frontend (e.g., CodeViz).
333
- * Unlike readLines(), this has no MAX_READ_LINES cap and returns raw content.
334
- *
335
- * @param contentId - The content entry ID.
336
- * @returns Raw content with total line/char counts, or null if not found.
337
- */
338
- async readAll(contentId) {
339
- const stored = await this.getStored(contentId);
340
- if (!stored) {
341
- return null;
342
- }
343
- // Touch both content entry and index to reset TTL
344
- await this.touchEntry(contentId, stored);
345
- return {
346
- content: stored.content,
347
- totalLines: stored.content.split('\n').length,
348
- totalChars: stored.content.length,
349
- };
350
- }
351
- /**
352
- * Search for a pattern within a content entry.
353
- * Supports plain text matching and regex patterns.
354
- *
355
- * @param contentId - The content entry ID.
356
- * @param pattern - Text or regex pattern to match.
357
- * @param maxResults - Maximum matches to return (default MAX_SEARCH_RESULTS).
358
- * @returns Array of matches with line numbers, or null if content not found.
359
- */
360
- async search(contentId, pattern, maxResults = MAX_SEARCH_RESULTS) {
361
- const stored = await this.getStored(contentId);
362
- if (!stored) {
363
- return null;
364
- }
365
- const lines = stored.content.split('\n');
366
- const matches = [];
367
- // Try regex first, fall back to plain string match
368
- let regex = null;
369
- try {
370
- regex = new RegExp(pattern, 'i');
371
- }
372
- catch {
373
- // Invalid regex — use plain string matching below
374
- }
375
- for (let i = 0; i < lines.length && matches.length < maxResults; i++) {
376
- const line = lines[i];
377
- const isMatch = regex ? regex.test(line) : line.includes(pattern);
378
- if (isMatch) {
379
- matches.push({ lineNumber: i + 1, content: line });
380
- }
381
- }
382
- // Touch both content entry and index to reset TTL
383
- await this.touchEntry(contentId, stored);
384
- return matches;
385
- }
386
- /**
387
- * Surgical string replacement within a content entry.
388
- * Fails if old_str is not found or appears more than once (ambiguous).
389
- *
390
- * Uses layered matching: exact → line-number-stripped → CRLF-normalized → trailing-whitespace-trimmed.
391
- * On failure, returns diagnostic context showing nearby content to help the agent self-correct.
392
- *
393
- * @param contentId - The content entry ID.
394
- * @param oldStr - Exact string to find.
395
- * @param newStr - Replacement string.
396
- * @returns Edit result with diff and affected line info.
397
- */
398
- async strReplace(contentId, oldStr, newStr) {
399
- const stored = await this.getStored(contentId);
400
- if (!stored) {
401
- return {
402
- success: false,
403
- diff: '',
404
- lineNumber: 0,
405
- linesAffected: 0,
406
- error: `Content "${contentId}" not found`,
407
- };
408
- }
409
- const content = stored.content;
410
- let effectiveOldStr = oldStr;
411
- let firstIdx = content.indexOf(effectiveOldStr);
412
- // Layer 1: Strip line-number prefixes that readLines() adds.
413
- // Agents often copy formatted output (e.g., " 1 | import React") into old_str.
414
- if (firstIdx === -1) {
415
- const stripped = stripLineNumberPrefixes(oldStr);
416
- if (stripped !== oldStr) {
417
- firstIdx = content.indexOf(stripped);
418
- if (firstIdx !== -1) {
419
- effectiveOldStr = stripped;
420
- }
421
- }
422
- }
423
- // Layer 2: Normalize CRLF → LF (content from Windows/Office/MCP tools may have \r\n)
424
- if (firstIdx === -1) {
425
- const normContent = normalizeNewlines(content);
426
- const normOld = normalizeNewlines(effectiveOldStr);
427
- if (normContent !== content || normOld !== effectiveOldStr) {
428
- const normIdx = normContent.indexOf(normOld);
429
- if (normIdx !== -1) {
430
- // Normalize stored content permanently so future edits don't hit this again
431
- stored.content = normContent;
432
- effectiveOldStr = normOld;
433
- firstIdx = normIdx;
434
- }
435
- }
436
- }
437
- // Layer 3: Trim trailing whitespace per line (invisible trailing spaces cause mismatches)
438
- if (firstIdx === -1) {
439
- const trimmedContent = trimTrailingPerLine(stored.content);
440
- const trimmedOld = trimTrailingPerLine(effectiveOldStr);
441
- if (trimmedContent !== stored.content || trimmedOld !== effectiveOldStr) {
442
- const trimIdx = trimmedContent.indexOf(trimmedOld);
443
- if (trimIdx !== -1) {
444
- // Use trimmed content for matching; map back to actual content position
445
- // by finding the equivalent position in the original
446
- stored.content = trimmedContent;
447
- effectiveOldStr = trimmedOld;
448
- firstIdx = trimIdx;
449
- }
450
- }
451
- }
452
- // Layer 4: Indentation-normalized line-by-line matching.
453
- // Agent often gets the right code but with different indentation (e.g., 2 vs 4 spaces).
454
- // Match lines by trimmed content, then replace the actual content range.
455
- let rangeMatch = null;
456
- if (firstIdx === -1) {
457
- rangeMatch = findIndentationNormalizedMatch(stored.content, effectiveOldStr);
458
- if (rangeMatch) {
459
- effectiveOldStr = stored.content.substring(rangeMatch.start, rangeMatch.end);
460
- firstIdx = rangeMatch.start;
461
- }
462
- }
463
- // Layer 5: Partial fuzzy matching — tolerates some lines being slightly different.
464
- // LLMs reconstruct code from memory and often get 80-90% of lines right but miss a few.
465
- // This layer finds the best-scoring unique region above a match threshold.
466
- if (firstIdx === -1) {
467
- rangeMatch = findPartialFuzzyMatch(stored.content, effectiveOldStr);
468
- if (rangeMatch) {
469
- effectiveOldStr = stored.content.substring(rangeMatch.start, rangeMatch.end);
470
- firstIdx = rangeMatch.start;
471
- }
472
- }
473
- if (firstIdx === -1) {
474
- const diagnostic = buildEditDiagnostic(stored.content, oldStr);
475
- return {
476
- success: false,
477
- diff: '',
478
- lineNumber: 0,
479
- linesAffected: 0,
480
- error: diagnostic,
481
- };
482
- }
483
- // For range-matched edits (layers 4/5), skip the ambiguity check (already verified unique)
484
- const lastIdx = rangeMatch
485
- ? firstIdx
486
- : stored.content.lastIndexOf(effectiveOldStr);
487
- if (firstIdx !== lastIdx) {
488
- return {
489
- success: false,
490
- diff: '',
491
- lineNumber: 0,
492
- linesAffected: 0,
493
- error: 'old_str appears multiple times — make it more specific',
494
- };
495
- }
496
- // Find the line number where the match starts
497
- const currentContent = stored.content;
498
- const beforeMatch = currentContent.substring(0, firstIdx);
499
- const lineNumber = beforeMatch.split('\n').length;
500
- // Perform replacement
501
- const newContent = currentContent.substring(0, firstIdx) +
502
- newStr +
503
- currentContent.substring(firstIdx + effectiveOldStr.length);
504
- // Build a simple diff
505
- const oldLines = effectiveOldStr.split('\n');
506
- const newLines = newStr.split('\n');
507
- let diff = '';
508
- for (const line of oldLines) {
509
- diff += `- ${line}\n`;
510
- }
511
- for (const line of newLines) {
512
- diff += `+ ${line}\n`;
513
- }
514
- const linesAffected = Math.max(oldLines.length, newLines.length);
515
- // Update stored content and metadata
516
- stored.content = newContent;
517
- stored.metadata.totalLines = newContent.split('\n').length;
518
- stored.metadata.totalChars = newContent.length;
519
- await this.cache.set(contentId, JSON.stringify(stored));
520
- // Update index metadata
521
- const index = await this.getIndex();
522
- if (index[contentId]) {
523
- index[contentId] = stored.metadata;
524
- await this.cache.set(this.indexKey, JSON.stringify(index));
525
- }
526
- return { success: true, diff: diff.trimEnd(), lineNumber, linesAffected };
527
- }
528
- /**
529
- * Overwrite content for an existing entry, preserving its name/source/type.
530
- * @param contentId - The content entry ID.
531
- * @param content - New content to write.
532
- * @throws If content ID is not found.
533
- */
534
- async write(contentId, content) {
535
- const stored = await this.getStored(contentId);
536
- if (!stored) {
537
- throw new Error(`Content "${contentId}" not found`);
538
- }
539
- stored.content = content;
540
- stored.metadata.totalLines = content.split('\n').length;
541
- stored.metadata.totalChars = content.length;
542
- await this.cache.set(contentId, JSON.stringify(stored));
543
- // Update index metadata
544
- const index = await this.getIndex();
545
- if (index[contentId]) {
546
- index[contentId] = stored.metadata;
547
- await this.cache.set(this.indexKey, JSON.stringify(index));
548
- }
549
- }
550
- /**
551
- * List all content entries in this conversation's store.
552
- * @returns Array of metadata for all entries.
553
- */
554
- async list() {
555
- const index = await this.getIndex();
556
- // Touch index to reset TTL on access
557
- if (Object.keys(index).length > 0) {
558
- await this.cache.set(this.indexKey, JSON.stringify(index));
559
- }
560
- return Object.values(index);
561
- }
562
- /**
563
- * Get the raw content string for a content entry, without line-number formatting.
564
- * Resets TTL on access. Used by code edit wrapper to retrieve stored code for execution.
565
- *
566
- * @param contentId - The content entry ID.
567
- * @returns Raw content string, or null if not found/expired.
568
- */
569
- async getRawContent(contentId) {
570
- const stored = await this.getStored(contentId);
571
- if (!stored) {
572
- return null;
573
- }
574
- await this.touchEntry(contentId, stored);
575
- return stored.content;
576
- }
577
- /**
578
- * Delete a content entry.
579
- * @param contentId - The content entry ID.
580
- */
581
- async delete(contentId) {
582
- await this.cache.delete(contentId);
583
- const index = await this.getIndex();
584
- delete index[contentId];
585
- await this.cache.set(this.indexKey, JSON.stringify(index));
586
- }
587
- /**
588
- * Reset TTL on both a content entry and the index.
589
- * Called on every access to keep active content alive.
590
- * @param contentId - The content entry ID.
591
- * @param stored - The stored entry to re-set (resets TTL via Keyv).
592
- */
593
- async touchEntry(contentId, stored) {
594
- await this.cache.set(contentId, JSON.stringify(stored));
595
- const index = await this.getIndex();
596
- if (Object.keys(index).length > 0) {
597
- await this.cache.set(this.indexKey, JSON.stringify(index));
598
- }
599
- }
600
- /**
601
- * Retrieve the full stored entry (content + metadata) from Redis.
602
- * Returns null if the entry has expired or doesn't exist.
603
- */
604
- async getStored(contentId) {
605
- const raw = (await this.cache.get(contentId));
606
- if (!raw) {
607
- return null;
608
- }
609
- try {
610
- return JSON.parse(raw);
611
- }
612
- catch {
613
- return null;
614
- }
615
- }
616
- /**
617
- * Retrieve the conversation's content index from Redis.
618
- * The index maps content IDs to their metadata.
619
- */
620
- async getIndex() {
621
- const raw = (await this.cache.get(this.indexKey));
622
- if (!raw) {
623
- return {};
624
- }
625
- try {
626
- return JSON.parse(raw);
627
- }
628
- catch {
629
- return {};
630
- }
631
- }
632
- }
633
-
634
- export { CONTENT_TTL_MS, ContentStore };
635
- //# sourceMappingURL=ContentStore.mjs.map