@librechat/agents 3.4.6 → 3.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 (1027) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +0 -356
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/agents/projection.cjs +0 -9
  4. package/dist/cjs/agents/projection.cjs.map +1 -1
  5. package/dist/cjs/common/constants.cjs +0 -26
  6. package/dist/cjs/common/constants.cjs.map +1 -1
  7. package/dist/cjs/common/enum.cjs +0 -85
  8. package/dist/cjs/common/enum.cjs.map +1 -1
  9. package/dist/cjs/events.cjs +0 -14
  10. package/dist/cjs/events.cjs.map +1 -1
  11. package/dist/cjs/graphs/Graph.cjs +1 -909
  12. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  13. package/dist/cjs/graphs/MultiAgentGraph.cjs +7 -272
  14. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  15. package/dist/cjs/graphs/applyGraphRuntimeConfig.cjs.map +1 -1
  16. package/dist/cjs/graphs/createGraph.cjs.map +1 -1
  17. package/dist/cjs/hitl/askUserQuestion.cjs +0 -53
  18. package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -1
  19. package/dist/cjs/hitl/askUserQuestions.cjs +0 -20
  20. package/dist/cjs/hitl/askUserQuestions.cjs.map +1 -1
  21. package/dist/cjs/hitl/askUserQuestionsInterrupt.cjs +0 -6
  22. package/dist/cjs/hitl/askUserQuestionsInterrupt.cjs.map +1 -1
  23. package/dist/cjs/hooks/HookRegistry.cjs +0 -127
  24. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  25. package/dist/cjs/hooks/createToolPolicyHook.cjs +0 -38
  26. package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -1
  27. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +0 -77
  28. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
  29. package/dist/cjs/hooks/executeHooks.cjs +0 -79
  30. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  31. package/dist/cjs/hooks/index.cjs +0 -16
  32. package/dist/cjs/hooks/index.cjs.map +1 -1
  33. package/dist/cjs/hooks/matchers.cjs +0 -104
  34. package/dist/cjs/hooks/matchers.cjs.map +1 -1
  35. package/dist/cjs/hooks/types.cjs +0 -8
  36. package/dist/cjs/hooks/types.cjs.map +1 -1
  37. package/dist/cjs/instrumentation.cjs +0 -14
  38. package/dist/cjs/instrumentation.cjs.map +1 -1
  39. package/dist/cjs/langfuse.cjs +0 -75
  40. package/dist/cjs/langfuse.cjs.map +1 -1
  41. package/dist/cjs/langfuseConfig.cjs.map +1 -1
  42. package/dist/cjs/langfuseRuntimeContext.cjs +0 -13
  43. package/dist/cjs/langfuseRuntimeContext.cjs.map +1 -1
  44. package/dist/cjs/langfuseRuntimeScope.cjs +0 -4
  45. package/dist/cjs/langfuseRuntimeScope.cjs.map +1 -1
  46. package/dist/cjs/langfuseSpanRegistry.cjs +0 -28
  47. package/dist/cjs/langfuseSpanRegistry.cjs.map +1 -1
  48. package/dist/cjs/langfuseToolOutputTracing.cjs +0 -3
  49. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  50. package/dist/cjs/langfuseTraceShaping.cjs +0 -74
  51. package/dist/cjs/langfuseTraceShaping.cjs.map +1 -1
  52. package/dist/cjs/llm/anthropic/index.cjs +0 -3
  53. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  54. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  55. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +1 -111
  56. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  57. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +0 -1
  58. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  59. package/dist/cjs/llm/anthropic/utils/stream_events.cjs +0 -8
  60. package/dist/cjs/llm/anthropic/utils/stream_events.cjs.map +1 -1
  61. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  62. package/dist/cjs/llm/bedrock/cachePoints.cjs.map +1 -1
  63. package/dist/cjs/llm/bedrock/index.cjs +1 -95
  64. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  65. package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
  66. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +0 -78
  67. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  68. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +0 -24
  69. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
  70. package/dist/cjs/llm/contextOverflowRecovery.cjs +0 -62
  71. package/dist/cjs/llm/contextOverflowRecovery.cjs.map +1 -1
  72. package/dist/cjs/llm/fake.cjs.map +1 -1
  73. package/dist/cjs/llm/google/index.cjs +2 -21
  74. package/dist/cjs/llm/google/index.cjs.map +1 -1
  75. package/dist/cjs/llm/google/utils/common.cjs +5 -35
  76. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  77. package/dist/cjs/llm/init.cjs +0 -9
  78. package/dist/cjs/llm/init.cjs.map +1 -1
  79. package/dist/cjs/llm/invoke.cjs +1 -270
  80. package/dist/cjs/llm/invoke.cjs.map +1 -1
  81. package/dist/cjs/llm/mistral/index.cjs.map +1 -1
  82. package/dist/cjs/llm/openai/index.cjs +0 -99
  83. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  84. package/dist/cjs/llm/openai/streamMetadata.cjs +0 -21
  85. package/dist/cjs/llm/openai/streamMetadata.cjs.map +1 -1
  86. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  87. package/dist/cjs/llm/openrouter/index.cjs +0 -1
  88. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  89. package/dist/cjs/llm/openrouter/toolCache.cjs +0 -6
  90. package/dist/cjs/llm/openrouter/toolCache.cjs.map +1 -1
  91. package/dist/cjs/llm/preempt.cjs +0 -75
  92. package/dist/cjs/llm/preempt.cjs.map +1 -1
  93. package/dist/cjs/llm/providers.cjs.map +1 -1
  94. package/dist/cjs/llm/request.cjs +0 -10
  95. package/dist/cjs/llm/request.cjs.map +1 -1
  96. package/dist/cjs/llm/stream/chunkAdapters.cjs +0 -62
  97. package/dist/cjs/llm/stream/chunkAdapters.cjs.map +1 -1
  98. package/dist/cjs/llm/stream/smoother.cjs +0 -58
  99. package/dist/cjs/llm/stream/smoother.cjs.map +1 -1
  100. package/dist/cjs/llm/streamLimits.cjs +4 -293
  101. package/dist/cjs/llm/streamLimits.cjs.map +1 -1
  102. package/dist/cjs/llm/truncation.cjs +0 -36
  103. package/dist/cjs/llm/truncation.cjs.map +1 -1
  104. package/dist/cjs/llm/vertexai/index.cjs +0 -330
  105. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  106. package/dist/cjs/messages/alternation.cjs +0 -43
  107. package/dist/cjs/messages/alternation.cjs.map +1 -1
  108. package/dist/cjs/messages/anthropicToolCache.cjs +0 -45
  109. package/dist/cjs/messages/anthropicToolCache.cjs.map +1 -1
  110. package/dist/cjs/messages/assistantPhase.cjs +0 -12
  111. package/dist/cjs/messages/assistantPhase.cjs.map +1 -1
  112. package/dist/cjs/messages/budget.cjs +0 -9
  113. package/dist/cjs/messages/budget.cjs.map +1 -1
  114. package/dist/cjs/messages/cache.cjs +0 -172
  115. package/dist/cjs/messages/cache.cjs.map +1 -1
  116. package/dist/cjs/messages/content.cjs +0 -9
  117. package/dist/cjs/messages/content.cjs.map +1 -1
  118. package/dist/cjs/messages/contextPruning.cjs +0 -15
  119. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  120. package/dist/cjs/messages/contextPruningSettings.cjs +0 -3
  121. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -1
  122. package/dist/cjs/messages/core.cjs +0 -48
  123. package/dist/cjs/messages/core.cjs.map +1 -1
  124. package/dist/cjs/messages/format.cjs +1 -345
  125. package/dist/cjs/messages/format.cjs.map +1 -1
  126. package/dist/cjs/messages/handoffCue.cjs +0 -36
  127. package/dist/cjs/messages/handoffCue.cjs.map +1 -1
  128. package/dist/cjs/messages/ids.cjs.map +1 -1
  129. package/dist/cjs/messages/injected.cjs +0 -33
  130. package/dist/cjs/messages/injected.cjs.map +1 -1
  131. package/dist/cjs/messages/langchain.cjs +0 -14
  132. package/dist/cjs/messages/langchain.cjs.map +1 -1
  133. package/dist/cjs/messages/prune.cjs +1 -184
  134. package/dist/cjs/messages/prune.cjs.map +1 -1
  135. package/dist/cjs/messages/recency.cjs +0 -32
  136. package/dist/cjs/messages/recency.cjs.map +1 -1
  137. package/dist/cjs/messages/reducer.cjs +0 -30
  138. package/dist/cjs/messages/reducer.cjs.map +1 -1
  139. package/dist/cjs/messages/tools.cjs +0 -14
  140. package/dist/cjs/messages/tools.cjs.map +1 -1
  141. package/dist/cjs/openai/index.cjs.map +1 -1
  142. package/dist/cjs/prompts/activityLabel.cjs +9 -79
  143. package/dist/cjs/prompts/activityLabel.cjs.map +1 -1
  144. package/dist/cjs/responses/index.cjs.map +1 -1
  145. package/dist/cjs/run.cjs +2 -538
  146. package/dist/cjs/run.cjs.map +1 -1
  147. package/dist/cjs/session/AgentSession.cjs +1 -17
  148. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  149. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  150. package/dist/cjs/session/handlers.cjs +0 -7
  151. package/dist/cjs/session/handlers.cjs.map +1 -1
  152. package/dist/cjs/session/ids.cjs.map +1 -1
  153. package/dist/cjs/session/messageSerialization.cjs +0 -4
  154. package/dist/cjs/session/messageSerialization.cjs.map +1 -1
  155. package/dist/cjs/stream.cjs +1 -93
  156. package/dist/cjs/stream.cjs.map +1 -1
  157. package/dist/cjs/summarization/index.cjs +0 -27
  158. package/dist/cjs/summarization/index.cjs.map +1 -1
  159. package/dist/cjs/summarization/node.cjs +0 -273
  160. package/dist/cjs/summarization/node.cjs.map +1 -1
  161. package/dist/cjs/tools/BashExecutor.cjs +0 -35
  162. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  163. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +0 -24
  164. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  165. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  166. package/dist/cjs/tools/CodeExecutor.cjs +0 -13
  167. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  168. package/dist/cjs/tools/CodeSessionFileSummary.cjs.map +1 -1
  169. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +0 -101
  170. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  171. package/dist/cjs/tools/ReadFile.cjs.map +1 -1
  172. package/dist/cjs/tools/SkillTool.cjs +0 -5
  173. package/dist/cjs/tools/SkillTool.cjs.map +1 -1
  174. package/dist/cjs/tools/SubagentTool.cjs +0 -10
  175. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  176. package/dist/cjs/tools/ToolNode.cjs +6 -1038
  177. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  178. package/dist/cjs/tools/ToolSearch.cjs +0 -179
  179. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  180. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -1
  181. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -1
  182. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +0 -39
  183. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
  184. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
  185. package/dist/cjs/tools/eagerEventExecution.cjs +0 -6
  186. package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -1
  187. package/dist/cjs/tools/handlers.cjs +1 -41
  188. package/dist/cjs/tools/handlers.cjs.map +1 -1
  189. package/dist/cjs/tools/intentArg.cjs +1 -132
  190. package/dist/cjs/tools/intentArg.cjs.map +1 -1
  191. package/dist/cjs/tools/local/CompileCheckTool.cjs +0 -25
  192. package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
  193. package/dist/cjs/tools/local/FileCheckpointer.cjs +0 -23
  194. package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
  195. package/dist/cjs/tools/local/LocalCodingTools.cjs +0 -80
  196. package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
  197. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +0 -126
  198. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  199. package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
  200. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +0 -12
  201. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
  202. package/dist/cjs/tools/local/attachments.cjs +0 -44
  203. package/dist/cjs/tools/local/attachments.cjs.map +1 -1
  204. package/dist/cjs/tools/local/bashAst.cjs +0 -16
  205. package/dist/cjs/tools/local/bashAst.cjs.map +1 -1
  206. package/dist/cjs/tools/local/editStrategies.cjs +0 -14
  207. package/dist/cjs/tools/local/editStrategies.cjs.map +1 -1
  208. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  209. package/dist/cjs/tools/local/syntaxCheck.cjs +0 -31
  210. package/dist/cjs/tools/local/syntaxCheck.cjs.map +1 -1
  211. package/dist/cjs/tools/local/textEncoding.cjs +0 -11
  212. package/dist/cjs/tools/local/textEncoding.cjs.map +1 -1
  213. package/dist/cjs/tools/local/workspaceFS.cjs +0 -33
  214. package/dist/cjs/tools/local/workspaceFS.cjs.map +1 -1
  215. package/dist/cjs/tools/ptcTimeout.cjs.map +1 -1
  216. package/dist/cjs/tools/schema.cjs +0 -8
  217. package/dist/cjs/tools/schema.cjs.map +1 -1
  218. package/dist/cjs/tools/search/anthropic.cjs +0 -9
  219. package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
  220. package/dist/cjs/tools/search/content.cjs.map +1 -1
  221. package/dist/cjs/tools/search/crw-scraper.cjs +0 -33
  222. package/dist/cjs/tools/search/crw-scraper.cjs.map +1 -1
  223. package/dist/cjs/tools/search/crw-search.cjs +0 -2
  224. package/dist/cjs/tools/search/crw-search.cjs.map +1 -1
  225. package/dist/cjs/tools/search/firecrawl.cjs +0 -25
  226. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  227. package/dist/cjs/tools/search/format.cjs +0 -30
  228. package/dist/cjs/tools/search/format.cjs.map +1 -1
  229. package/dist/cjs/tools/search/highlights.cjs +0 -16
  230. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  231. package/dist/cjs/tools/search/keenable-scraper.cjs +0 -8
  232. package/dist/cjs/tools/search/keenable-scraper.cjs.map +1 -1
  233. package/dist/cjs/tools/search/keenable-search.cjs +0 -7
  234. package/dist/cjs/tools/search/keenable-search.cjs.map +1 -1
  235. package/dist/cjs/tools/search/rerankers.cjs +0 -35
  236. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  237. package/dist/cjs/tools/search/schema.cjs +0 -1
  238. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  239. package/dist/cjs/tools/search/search.cjs +1 -14
  240. package/dist/cjs/tools/search/search.cjs.map +1 -1
  241. package/dist/cjs/tools/search/serper-scraper.cjs +0 -46
  242. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  243. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
  244. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  245. package/dist/cjs/tools/search/tool.cjs +0 -25
  246. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  247. package/dist/cjs/tools/search/utils.cjs +0 -8
  248. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  249. package/dist/cjs/tools/skillCatalog.cjs +0 -6
  250. package/dist/cjs/tools/skillCatalog.cjs.map +1 -1
  251. package/dist/cjs/tools/streamedToolCallSeals.cjs +0 -6
  252. package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -1
  253. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs +0 -2
  254. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs.map +1 -1
  255. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +3 -213
  256. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  257. package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -1
  258. package/dist/cjs/tools/subagent/childGraphConfig.cjs +0 -4
  259. package/dist/cjs/tools/subagent/childGraphConfig.cjs.map +1 -1
  260. package/dist/cjs/tools/subagent/runtimeLimits.cjs.map +1 -1
  261. package/dist/cjs/tools/toolOutputReferences.cjs +1 -322
  262. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  263. package/dist/cjs/types/hitl.cjs +0 -5
  264. package/dist/cjs/types/hitl.cjs.map +1 -1
  265. package/dist/cjs/utils/callbacks.cjs.map +1 -1
  266. package/dist/cjs/utils/errors.cjs +14 -165
  267. package/dist/cjs/utils/errors.cjs.map +1 -1
  268. package/dist/cjs/utils/events.cjs +0 -10
  269. package/dist/cjs/utils/events.cjs.map +1 -1
  270. package/dist/cjs/utils/graph.cjs.map +1 -1
  271. package/dist/cjs/utils/handlers.cjs +0 -3
  272. package/dist/cjs/utils/handlers.cjs.map +1 -1
  273. package/dist/cjs/utils/llm.cjs +0 -1
  274. package/dist/cjs/utils/llm.cjs.map +1 -1
  275. package/dist/cjs/utils/misc.cjs +0 -16
  276. package/dist/cjs/utils/misc.cjs.map +1 -1
  277. package/dist/cjs/utils/proxy.cjs +0 -26
  278. package/dist/cjs/utils/proxy.cjs.map +1 -1
  279. package/dist/cjs/utils/run.cjs +0 -6
  280. package/dist/cjs/utils/run.cjs.map +1 -1
  281. package/dist/cjs/utils/schema.cjs +0 -5
  282. package/dist/cjs/utils/schema.cjs.map +1 -1
  283. package/dist/cjs/utils/title.cjs +0 -6
  284. package/dist/cjs/utils/title.cjs.map +1 -1
  285. package/dist/cjs/utils/tokens.cjs +0 -113
  286. package/dist/cjs/utils/tokens.cjs.map +1 -1
  287. package/dist/cjs/utils/toolContent.cjs +0 -41
  288. package/dist/cjs/utils/toolContent.cjs.map +1 -1
  289. package/dist/cjs/utils/truncation.cjs +0 -61
  290. package/dist/cjs/utils/truncation.cjs.map +1 -1
  291. package/dist/esm/agents/AgentContext.mjs +0 -356
  292. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  293. package/dist/esm/agents/projection.mjs +0 -9
  294. package/dist/esm/agents/projection.mjs.map +1 -1
  295. package/dist/esm/common/constants.mjs +0 -26
  296. package/dist/esm/common/constants.mjs.map +1 -1
  297. package/dist/esm/common/enum.mjs +0 -85
  298. package/dist/esm/common/enum.mjs.map +1 -1
  299. package/dist/esm/events.mjs +0 -14
  300. package/dist/esm/events.mjs.map +1 -1
  301. package/dist/esm/graphs/Graph.mjs +1 -909
  302. package/dist/esm/graphs/Graph.mjs.map +1 -1
  303. package/dist/esm/graphs/MultiAgentGraph.mjs +7 -272
  304. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  305. package/dist/esm/graphs/applyGraphRuntimeConfig.mjs.map +1 -1
  306. package/dist/esm/graphs/createGraph.mjs.map +1 -1
  307. package/dist/esm/hitl/askUserQuestion.mjs +0 -53
  308. package/dist/esm/hitl/askUserQuestion.mjs.map +1 -1
  309. package/dist/esm/hitl/askUserQuestions.mjs +0 -20
  310. package/dist/esm/hitl/askUserQuestions.mjs.map +1 -1
  311. package/dist/esm/hitl/askUserQuestionsInterrupt.mjs +0 -6
  312. package/dist/esm/hitl/askUserQuestionsInterrupt.mjs.map +1 -1
  313. package/dist/esm/hooks/HookRegistry.mjs +0 -127
  314. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  315. package/dist/esm/hooks/createToolPolicyHook.mjs +0 -38
  316. package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -1
  317. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +0 -77
  318. package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
  319. package/dist/esm/hooks/executeHooks.mjs +0 -79
  320. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  321. package/dist/esm/hooks/index.mjs +0 -16
  322. package/dist/esm/hooks/index.mjs.map +1 -1
  323. package/dist/esm/hooks/matchers.mjs +0 -104
  324. package/dist/esm/hooks/matchers.mjs.map +1 -1
  325. package/dist/esm/hooks/types.mjs +0 -8
  326. package/dist/esm/hooks/types.mjs.map +1 -1
  327. package/dist/esm/instrumentation.mjs +0 -14
  328. package/dist/esm/instrumentation.mjs.map +1 -1
  329. package/dist/esm/langfuse.mjs +0 -75
  330. package/dist/esm/langfuse.mjs.map +1 -1
  331. package/dist/esm/langfuseConfig.mjs.map +1 -1
  332. package/dist/esm/langfuseRuntimeContext.mjs +0 -13
  333. package/dist/esm/langfuseRuntimeContext.mjs.map +1 -1
  334. package/dist/esm/langfuseRuntimeScope.mjs +0 -4
  335. package/dist/esm/langfuseRuntimeScope.mjs.map +1 -1
  336. package/dist/esm/langfuseSpanRegistry.mjs +0 -28
  337. package/dist/esm/langfuseSpanRegistry.mjs.map +1 -1
  338. package/dist/esm/langfuseToolOutputTracing.mjs +0 -3
  339. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  340. package/dist/esm/langfuseTraceShaping.mjs +0 -74
  341. package/dist/esm/langfuseTraceShaping.mjs.map +1 -1
  342. package/dist/esm/llm/anthropic/index.mjs +0 -3
  343. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  344. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  345. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +1 -111
  346. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  347. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +0 -1
  348. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  349. package/dist/esm/llm/anthropic/utils/stream_events.mjs +0 -8
  350. package/dist/esm/llm/anthropic/utils/stream_events.mjs.map +1 -1
  351. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  352. package/dist/esm/llm/bedrock/cachePoints.mjs.map +1 -1
  353. package/dist/esm/llm/bedrock/index.mjs +1 -95
  354. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  355. package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
  356. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +0 -78
  357. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  358. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +0 -24
  359. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
  360. package/dist/esm/llm/contextOverflowRecovery.mjs +0 -62
  361. package/dist/esm/llm/contextOverflowRecovery.mjs.map +1 -1
  362. package/dist/esm/llm/fake.mjs.map +1 -1
  363. package/dist/esm/llm/google/index.mjs +2 -21
  364. package/dist/esm/llm/google/index.mjs.map +1 -1
  365. package/dist/esm/llm/google/utils/common.mjs +5 -35
  366. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  367. package/dist/esm/llm/init.mjs +0 -9
  368. package/dist/esm/llm/init.mjs.map +1 -1
  369. package/dist/esm/llm/invoke.mjs +1 -270
  370. package/dist/esm/llm/invoke.mjs.map +1 -1
  371. package/dist/esm/llm/mistral/index.mjs.map +1 -1
  372. package/dist/esm/llm/openai/index.mjs +0 -99
  373. package/dist/esm/llm/openai/index.mjs.map +1 -1
  374. package/dist/esm/llm/openai/streamMetadata.mjs +0 -21
  375. package/dist/esm/llm/openai/streamMetadata.mjs.map +1 -1
  376. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  377. package/dist/esm/llm/openrouter/index.mjs +0 -1
  378. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  379. package/dist/esm/llm/openrouter/toolCache.mjs +0 -6
  380. package/dist/esm/llm/openrouter/toolCache.mjs.map +1 -1
  381. package/dist/esm/llm/preempt.mjs +0 -75
  382. package/dist/esm/llm/preempt.mjs.map +1 -1
  383. package/dist/esm/llm/providers.mjs.map +1 -1
  384. package/dist/esm/llm/request.mjs +0 -10
  385. package/dist/esm/llm/request.mjs.map +1 -1
  386. package/dist/esm/llm/stream/chunkAdapters.mjs +0 -62
  387. package/dist/esm/llm/stream/chunkAdapters.mjs.map +1 -1
  388. package/dist/esm/llm/stream/smoother.mjs +0 -58
  389. package/dist/esm/llm/stream/smoother.mjs.map +1 -1
  390. package/dist/esm/llm/streamLimits.mjs +4 -293
  391. package/dist/esm/llm/streamLimits.mjs.map +1 -1
  392. package/dist/esm/llm/truncation.mjs +0 -36
  393. package/dist/esm/llm/truncation.mjs.map +1 -1
  394. package/dist/esm/llm/vertexai/index.mjs +0 -330
  395. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  396. package/dist/esm/messages/alternation.mjs +0 -43
  397. package/dist/esm/messages/alternation.mjs.map +1 -1
  398. package/dist/esm/messages/anthropicToolCache.mjs +0 -45
  399. package/dist/esm/messages/anthropicToolCache.mjs.map +1 -1
  400. package/dist/esm/messages/assistantPhase.mjs +0 -12
  401. package/dist/esm/messages/assistantPhase.mjs.map +1 -1
  402. package/dist/esm/messages/budget.mjs +0 -9
  403. package/dist/esm/messages/budget.mjs.map +1 -1
  404. package/dist/esm/messages/cache.mjs +0 -172
  405. package/dist/esm/messages/cache.mjs.map +1 -1
  406. package/dist/esm/messages/content.mjs +0 -9
  407. package/dist/esm/messages/content.mjs.map +1 -1
  408. package/dist/esm/messages/contextPruning.mjs +0 -15
  409. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  410. package/dist/esm/messages/contextPruningSettings.mjs +0 -3
  411. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -1
  412. package/dist/esm/messages/core.mjs +0 -48
  413. package/dist/esm/messages/core.mjs.map +1 -1
  414. package/dist/esm/messages/format.mjs +1 -345
  415. package/dist/esm/messages/format.mjs.map +1 -1
  416. package/dist/esm/messages/handoffCue.mjs +0 -36
  417. package/dist/esm/messages/handoffCue.mjs.map +1 -1
  418. package/dist/esm/messages/ids.mjs.map +1 -1
  419. package/dist/esm/messages/injected.mjs +0 -33
  420. package/dist/esm/messages/injected.mjs.map +1 -1
  421. package/dist/esm/messages/langchain.mjs +0 -14
  422. package/dist/esm/messages/langchain.mjs.map +1 -1
  423. package/dist/esm/messages/prune.mjs +1 -184
  424. package/dist/esm/messages/prune.mjs.map +1 -1
  425. package/dist/esm/messages/recency.mjs +0 -32
  426. package/dist/esm/messages/recency.mjs.map +1 -1
  427. package/dist/esm/messages/reducer.mjs +0 -30
  428. package/dist/esm/messages/reducer.mjs.map +1 -1
  429. package/dist/esm/messages/tools.mjs +0 -14
  430. package/dist/esm/messages/tools.mjs.map +1 -1
  431. package/dist/esm/openai/index.mjs.map +1 -1
  432. package/dist/esm/prompts/activityLabel.mjs +9 -79
  433. package/dist/esm/prompts/activityLabel.mjs.map +1 -1
  434. package/dist/esm/responses/index.mjs.map +1 -1
  435. package/dist/esm/run.mjs +2 -538
  436. package/dist/esm/run.mjs.map +1 -1
  437. package/dist/esm/session/AgentSession.mjs +1 -17
  438. package/dist/esm/session/AgentSession.mjs.map +1 -1
  439. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  440. package/dist/esm/session/handlers.mjs +0 -7
  441. package/dist/esm/session/handlers.mjs.map +1 -1
  442. package/dist/esm/session/ids.mjs.map +1 -1
  443. package/dist/esm/session/messageSerialization.mjs +0 -4
  444. package/dist/esm/session/messageSerialization.mjs.map +1 -1
  445. package/dist/esm/stream.mjs +1 -93
  446. package/dist/esm/stream.mjs.map +1 -1
  447. package/dist/esm/summarization/index.mjs +0 -27
  448. package/dist/esm/summarization/index.mjs.map +1 -1
  449. package/dist/esm/summarization/node.mjs +0 -273
  450. package/dist/esm/summarization/node.mjs.map +1 -1
  451. package/dist/esm/tools/BashExecutor.mjs +0 -35
  452. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  453. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +0 -24
  454. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  455. package/dist/esm/tools/Calculator.mjs.map +1 -1
  456. package/dist/esm/tools/CodeExecutor.mjs +0 -13
  457. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  458. package/dist/esm/tools/CodeSessionFileSummary.mjs.map +1 -1
  459. package/dist/esm/tools/ProgrammaticToolCalling.mjs +0 -101
  460. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  461. package/dist/esm/tools/ReadFile.mjs.map +1 -1
  462. package/dist/esm/tools/SkillTool.mjs +0 -5
  463. package/dist/esm/tools/SkillTool.mjs.map +1 -1
  464. package/dist/esm/tools/SubagentTool.mjs +0 -10
  465. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  466. package/dist/esm/tools/ToolNode.mjs +6 -1038
  467. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  468. package/dist/esm/tools/ToolSearch.mjs +0 -179
  469. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  470. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -1
  471. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -1
  472. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +0 -39
  473. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
  474. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
  475. package/dist/esm/tools/eagerEventExecution.mjs +0 -6
  476. package/dist/esm/tools/eagerEventExecution.mjs.map +1 -1
  477. package/dist/esm/tools/handlers.mjs +1 -41
  478. package/dist/esm/tools/handlers.mjs.map +1 -1
  479. package/dist/esm/tools/intentArg.mjs +1 -132
  480. package/dist/esm/tools/intentArg.mjs.map +1 -1
  481. package/dist/esm/tools/local/CompileCheckTool.mjs +0 -25
  482. package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
  483. package/dist/esm/tools/local/FileCheckpointer.mjs +0 -23
  484. package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
  485. package/dist/esm/tools/local/LocalCodingTools.mjs +0 -80
  486. package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
  487. package/dist/esm/tools/local/LocalExecutionEngine.mjs +0 -126
  488. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  489. package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
  490. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +0 -12
  491. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
  492. package/dist/esm/tools/local/attachments.mjs +0 -44
  493. package/dist/esm/tools/local/attachments.mjs.map +1 -1
  494. package/dist/esm/tools/local/bashAst.mjs +0 -16
  495. package/dist/esm/tools/local/bashAst.mjs.map +1 -1
  496. package/dist/esm/tools/local/editStrategies.mjs +0 -14
  497. package/dist/esm/tools/local/editStrategies.mjs.map +1 -1
  498. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  499. package/dist/esm/tools/local/syntaxCheck.mjs +0 -31
  500. package/dist/esm/tools/local/syntaxCheck.mjs.map +1 -1
  501. package/dist/esm/tools/local/textEncoding.mjs +0 -11
  502. package/dist/esm/tools/local/textEncoding.mjs.map +1 -1
  503. package/dist/esm/tools/local/workspaceFS.mjs +0 -33
  504. package/dist/esm/tools/local/workspaceFS.mjs.map +1 -1
  505. package/dist/esm/tools/ptcTimeout.mjs.map +1 -1
  506. package/dist/esm/tools/schema.mjs +0 -8
  507. package/dist/esm/tools/schema.mjs.map +1 -1
  508. package/dist/esm/tools/search/anthropic.mjs +0 -9
  509. package/dist/esm/tools/search/anthropic.mjs.map +1 -1
  510. package/dist/esm/tools/search/content.mjs.map +1 -1
  511. package/dist/esm/tools/search/crw-scraper.mjs +0 -33
  512. package/dist/esm/tools/search/crw-scraper.mjs.map +1 -1
  513. package/dist/esm/tools/search/crw-search.mjs +0 -2
  514. package/dist/esm/tools/search/crw-search.mjs.map +1 -1
  515. package/dist/esm/tools/search/firecrawl.mjs +0 -25
  516. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  517. package/dist/esm/tools/search/format.mjs +0 -30
  518. package/dist/esm/tools/search/format.mjs.map +1 -1
  519. package/dist/esm/tools/search/highlights.mjs +0 -16
  520. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  521. package/dist/esm/tools/search/keenable-scraper.mjs +0 -8
  522. package/dist/esm/tools/search/keenable-scraper.mjs.map +1 -1
  523. package/dist/esm/tools/search/keenable-search.mjs +0 -7
  524. package/dist/esm/tools/search/keenable-search.mjs.map +1 -1
  525. package/dist/esm/tools/search/rerankers.mjs +0 -35
  526. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  527. package/dist/esm/tools/search/schema.mjs +0 -1
  528. package/dist/esm/tools/search/schema.mjs.map +1 -1
  529. package/dist/esm/tools/search/search.mjs +1 -14
  530. package/dist/esm/tools/search/search.mjs.map +1 -1
  531. package/dist/esm/tools/search/serper-scraper.mjs +0 -46
  532. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  533. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
  534. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  535. package/dist/esm/tools/search/tool.mjs +0 -25
  536. package/dist/esm/tools/search/tool.mjs.map +1 -1
  537. package/dist/esm/tools/search/utils.mjs +0 -8
  538. package/dist/esm/tools/search/utils.mjs.map +1 -1
  539. package/dist/esm/tools/skillCatalog.mjs +0 -6
  540. package/dist/esm/tools/skillCatalog.mjs.map +1 -1
  541. package/dist/esm/tools/streamedToolCallSeals.mjs +0 -6
  542. package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -1
  543. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs +0 -2
  544. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs.map +1 -1
  545. package/dist/esm/tools/subagent/SubagentExecutor.mjs +3 -213
  546. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  547. package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -1
  548. package/dist/esm/tools/subagent/childGraphConfig.mjs +0 -4
  549. package/dist/esm/tools/subagent/childGraphConfig.mjs.map +1 -1
  550. package/dist/esm/tools/subagent/runtimeLimits.mjs.map +1 -1
  551. package/dist/esm/tools/toolOutputReferences.mjs +1 -322
  552. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  553. package/dist/esm/types/hitl.mjs +0 -5
  554. package/dist/esm/types/hitl.mjs.map +1 -1
  555. package/dist/esm/utils/callbacks.mjs.map +1 -1
  556. package/dist/esm/utils/errors.mjs +14 -165
  557. package/dist/esm/utils/errors.mjs.map +1 -1
  558. package/dist/esm/utils/events.mjs +0 -10
  559. package/dist/esm/utils/events.mjs.map +1 -1
  560. package/dist/esm/utils/graph.mjs.map +1 -1
  561. package/dist/esm/utils/handlers.mjs +0 -3
  562. package/dist/esm/utils/handlers.mjs.map +1 -1
  563. package/dist/esm/utils/llm.mjs +0 -1
  564. package/dist/esm/utils/llm.mjs.map +1 -1
  565. package/dist/esm/utils/misc.mjs +0 -16
  566. package/dist/esm/utils/misc.mjs.map +1 -1
  567. package/dist/esm/utils/proxy.mjs +0 -26
  568. package/dist/esm/utils/proxy.mjs.map +1 -1
  569. package/dist/esm/utils/run.mjs +0 -6
  570. package/dist/esm/utils/run.mjs.map +1 -1
  571. package/dist/esm/utils/schema.mjs +0 -5
  572. package/dist/esm/utils/schema.mjs.map +1 -1
  573. package/dist/esm/utils/title.mjs +0 -6
  574. package/dist/esm/utils/title.mjs.map +1 -1
  575. package/dist/esm/utils/tokens.mjs +0 -113
  576. package/dist/esm/utils/tokens.mjs.map +1 -1
  577. package/dist/esm/utils/toolContent.mjs +0 -41
  578. package/dist/esm/utils/toolContent.mjs.map +1 -1
  579. package/dist/esm/utils/truncation.mjs +0 -61
  580. package/dist/esm/utils/truncation.mjs.map +1 -1
  581. package/dist/types/agents/AgentContext.d.ts +3 -3
  582. package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +3 -3
  583. package/dist/types/agents/projection.d.ts +1 -1
  584. package/dist/types/events.d.ts +2 -2
  585. package/dist/types/graphs/Graph.d.ts +11 -11
  586. package/dist/types/graphs/MultiAgentGraph.d.ts +2 -2
  587. package/dist/types/graphs/createGraph.d.ts +4 -4
  588. package/dist/types/graphs/graphFactory.d.ts +1 -1
  589. package/dist/types/hitl/askUserQuestion.d.ts +1 -1
  590. package/dist/types/hitl/askUserQuestions.d.ts +1 -1
  591. package/dist/types/hitl/askUserQuestionsInterrupt.d.ts +1 -1
  592. package/dist/types/hooks/types.d.ts +1 -1
  593. package/dist/types/instrumentation.d.ts +1 -1
  594. package/dist/types/langfuse.d.ts +3 -3
  595. package/dist/types/langfuseConfig.d.ts +2 -2
  596. package/dist/types/langfuseRuntimeContext.d.ts +1 -1
  597. package/dist/types/langfuseRuntimeScope.d.ts +2 -2
  598. package/dist/types/langfuseSpanRegistry.d.ts +1 -1
  599. package/dist/types/langfuseToolOutputTracing.d.ts +3 -3
  600. package/dist/types/llm/anthropic/index.d.ts +1 -1
  601. package/dist/types/llm/bedrock/index.d.ts +1 -1
  602. package/dist/types/llm/bedrock/toolCache.d.ts +2 -2
  603. package/dist/types/llm/contextOverflowRecovery.d.ts +2 -2
  604. package/dist/types/llm/google/index.d.ts +1 -1
  605. package/dist/types/llm/init.d.ts +2 -2
  606. package/dist/types/llm/invoke.d.ts +6 -6
  607. package/dist/types/llm/mistral/index.d.ts +1 -1
  608. package/dist/types/llm/openai/index.d.ts +2 -2
  609. package/dist/types/llm/openrouter/index.d.ts +2 -2
  610. package/dist/types/llm/openrouter/toolCache.d.ts +2 -2
  611. package/dist/types/llm/providers.d.ts +2 -2
  612. package/dist/types/llm/request.d.ts +2 -2
  613. package/dist/types/llm/stream/chunkAdapters.d.ts +1 -1
  614. package/dist/types/llm/streamLimits.d.ts +1 -1
  615. package/dist/types/llm/truncation.d.ts +1 -1
  616. package/dist/types/llm/vertexai/index.d.ts +1 -1
  617. package/dist/types/messages/alternation.d.ts +1 -1
  618. package/dist/types/messages/anthropicToolCache.d.ts +2 -2
  619. package/dist/types/messages/assistantPhase.d.ts +3 -3
  620. package/dist/types/messages/budget.d.ts +1 -1
  621. package/dist/types/messages/cache.d.ts +1 -1
  622. package/dist/types/messages/contextPruning.d.ts +2 -2
  623. package/dist/types/messages/core.d.ts +2 -2
  624. package/dist/types/messages/format.d.ts +2 -2
  625. package/dist/types/messages/ids.d.ts +2 -2
  626. package/dist/types/messages/injected.d.ts +1 -1
  627. package/dist/types/messages/langchain.d.ts +1 -1
  628. package/dist/types/messages/prune.d.ts +3 -3
  629. package/dist/types/openai/index.d.ts +1 -1
  630. package/dist/types/prompts/activityLabel.d.ts +2 -2
  631. package/dist/types/responses/index.d.ts +1 -1
  632. package/dist/types/run.d.ts +3 -3
  633. package/dist/types/session/handlers.d.ts +1 -1
  634. package/dist/types/session/types.d.ts +1 -1
  635. package/dist/types/stream.d.ts +4 -4
  636. package/dist/types/summarization/index.d.ts +1 -1
  637. package/dist/types/summarization/node.d.ts +6 -6
  638. package/dist/types/test/mockTools.d.ts +1 -1
  639. package/dist/types/tools/BashExecutor.d.ts +2 -2
  640. package/dist/types/tools/BashProgrammaticToolCalling.d.ts +2 -2
  641. package/dist/types/tools/CodeExecutor.d.ts +3 -3
  642. package/dist/types/tools/CodeSessionFileSummary.d.ts +1 -1
  643. package/dist/types/tools/ProgrammaticToolCalling.d.ts +2 -2
  644. package/dist/types/tools/ReadFile.d.ts +1 -1
  645. package/dist/types/tools/SkillTool.d.ts +1 -1
  646. package/dist/types/tools/SubagentTool.d.ts +3 -3
  647. package/dist/types/tools/ToolNode.d.ts +5 -5
  648. package/dist/types/tools/ToolSearch.d.ts +2 -2
  649. package/dist/types/tools/cloudflare/CloudflareBridgeRuntime.d.ts +1 -1
  650. package/dist/types/tools/cloudflare/CloudflareProgrammaticToolCalling.d.ts +1 -1
  651. package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +2 -2
  652. package/dist/types/tools/cloudflare/CloudflareSandboxTools.d.ts +1 -1
  653. package/dist/types/tools/eagerEventExecution.d.ts +1 -1
  654. package/dist/types/tools/handlers.d.ts +3 -3
  655. package/dist/types/tools/intentArg.d.ts +1 -1
  656. package/dist/types/tools/local/CompileCheckTool.d.ts +2 -2
  657. package/dist/types/tools/local/FileCheckpointer.d.ts +1 -1
  658. package/dist/types/tools/local/LocalCodingTools.d.ts +2 -2
  659. package/dist/types/tools/local/LocalExecutionEngine.d.ts +1 -1
  660. package/dist/types/tools/local/LocalExecutionTools.d.ts +1 -1
  661. package/dist/types/tools/local/LocalProgrammaticToolCalling.d.ts +1 -1
  662. package/dist/types/tools/local/bashAst.d.ts +1 -1
  663. package/dist/types/tools/local/resolveLocalExecutionTools.d.ts +1 -1
  664. package/dist/types/tools/local/syntaxCheck.d.ts +1 -1
  665. package/dist/types/tools/ptcTimeout.d.ts +1 -1
  666. package/dist/types/tools/schema.d.ts +1 -1
  667. package/dist/types/tools/search/anthropic.d.ts +1 -1
  668. package/dist/types/tools/skillCatalog.d.ts +1 -1
  669. package/dist/types/tools/subagent/SubagentExecutor.d.ts +5 -5
  670. package/dist/types/tools/subagent/SubagentReplay.d.ts +3 -3
  671. package/dist/types/tools/subagent/childGraphConfig.d.ts +2 -2
  672. package/dist/types/types/activityLabel.d.ts +3 -3
  673. package/dist/types/types/graph.d.ts +7 -7
  674. package/dist/types/types/llm.d.ts +9 -9
  675. package/dist/types/types/run.d.ts +7 -7
  676. package/dist/types/types/stream.d.ts +5 -5
  677. package/dist/types/types/summarize.d.ts +2 -2
  678. package/dist/types/types/tools.d.ts +5 -5
  679. package/dist/types/utils/__tests__/fixtures/contextOverflowSignatures.d.ts +1 -1
  680. package/dist/types/utils/errors.d.ts +1 -1
  681. package/dist/types/utils/events.d.ts +1 -1
  682. package/dist/types/utils/handlers.d.ts +3 -3
  683. package/dist/types/utils/llm.d.ts +1 -1
  684. package/dist/types/utils/llmConfig.d.ts +1 -1
  685. package/dist/types/utils/title.d.ts +1 -1
  686. package/package.json +10 -3
  687. package/src/llm/google/utils/common.ts +6 -4
  688. package/src/__tests__/stream.eagerArgsDivergence.test.ts +0 -911
  689. package/src/__tests__/stream.eagerEventExecution.test.ts +0 -5046
  690. package/src/__tests__/stream.streamLimits.test.ts +0 -1982
  691. package/src/agents/__tests__/AgentContext.anthropic.live.test.ts +0 -448
  692. package/src/agents/__tests__/AgentContext.bedrock.live.test.ts +0 -655
  693. package/src/agents/__tests__/AgentContext.openrouter.live.test.ts +0 -128
  694. package/src/agents/__tests__/AgentContext.overflow.test.ts +0 -205
  695. package/src/agents/__tests__/AgentContext.test.ts +0 -2425
  696. package/src/agents/__tests__/projection.test.ts +0 -73
  697. package/src/agents/__tests__/promptCacheLiveHelpers.ts +0 -175
  698. package/src/aggregator.test.ts +0 -1214
  699. package/src/graphs/__tests__/Graph.breakerLifecycle.test.ts +0 -273
  700. package/src/graphs/__tests__/Graph.closeRunStep.test.ts +0 -385
  701. package/src/graphs/__tests__/Graph.contextOverflow.test.ts +0 -1766
  702. package/src/graphs/__tests__/Graph.preemptSignal.test.ts +0 -126
  703. package/src/graphs/__tests__/Graph.reasoning.test.ts +0 -1717
  704. package/src/graphs/__tests__/Graph.subagentResumeState.test.ts +0 -80
  705. package/src/graphs/__tests__/MultiAgentGraph.test.ts +0 -177
  706. package/src/graphs/__tests__/composition.smoke.test.ts +0 -509
  707. package/src/graphs/__tests__/createGraph.test.ts +0 -206
  708. package/src/hooks/__tests__/HookRegistry.test.ts +0 -334
  709. package/src/hooks/__tests__/compactHooks.test.ts +0 -250
  710. package/src/hooks/__tests__/createToolPolicyHook.test.ts +0 -268
  711. package/src/hooks/__tests__/createWorkspacePolicyHook.test.ts +0 -405
  712. package/src/hooks/__tests__/executeHooks.test.ts +0 -1294
  713. package/src/hooks/__tests__/integration.test.ts +0 -337
  714. package/src/hooks/__tests__/matchers.test.ts +0 -238
  715. package/src/hooks/__tests__/preemptBoundary.test.ts +0 -152
  716. package/src/hooks/__tests__/toolHooks.test.ts +0 -669
  717. package/src/llm/__tests__/contextOverflowRecovery.test.ts +0 -401
  718. package/src/llm/__tests__/fallbackOverflow.test.ts +0 -287
  719. package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
  720. package/src/llm/anthropic/inherited-content-utils.spec.ts +0 -249
  721. package/src/llm/anthropic/inherited-stream-events.spec.ts +0 -1259
  722. package/src/llm/anthropic/inherited-strict.spec.ts +0 -302
  723. package/src/llm/anthropic/llm.spec.ts +0 -3394
  724. package/src/llm/anthropic/utils/cross-provider-reasoning.test.ts +0 -383
  725. package/src/llm/anthropic/utils/cross-provider-server-tools.test.ts +0 -110
  726. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +0 -508
  727. package/src/llm/anthropic/utils/streaming-tool-input.test.ts +0 -361
  728. package/src/llm/anthropic/utils/stripPrefillCache.test.ts +0 -111
  729. package/src/llm/anthropic/utils/tool-id-normalization.test.ts +0 -287
  730. package/src/llm/bedrock/inherited-cache.spec.ts +0 -144
  731. package/src/llm/bedrock/inherited.spec.ts +0 -724
  732. package/src/llm/bedrock/llm.spec.ts +0 -1533
  733. package/src/llm/bedrock/streamSealDispatch.test.ts +0 -331
  734. package/src/llm/bedrock/toolCache.test.ts +0 -194
  735. package/src/llm/bedrock/utils/cross-provider-reasoning.test.ts +0 -131
  736. package/src/llm/bedrock/utils/cross-provider-server-tools.test.ts +0 -122
  737. package/src/llm/bedrock/utils/message_inputs.test.ts +0 -650
  738. package/src/llm/bedrock/utils/message_outputs.test.ts +0 -85
  739. package/src/llm/bedrock/utils/toolResultCachePoint.test.ts +0 -118
  740. package/src/llm/custom-chat-models.smoke.test.ts +0 -1966
  741. package/src/llm/google/data/gettysburg10.wav +0 -0
  742. package/src/llm/google/data/hotdog.jpg +0 -0
  743. package/src/llm/google/inherited-stream-events.spec.ts +0 -350
  744. package/src/llm/google/llm.spec.ts +0 -1388
  745. package/src/llm/google/streamSmoothing.test.ts +0 -121
  746. package/src/llm/google/utils/common.test.ts +0 -185
  747. package/src/llm/invoke.alternation.test.ts +0 -87
  748. package/src/llm/invoke.handoffCue.test.ts +0 -112
  749. package/src/llm/invoke.streamLimits.test.ts +0 -142
  750. package/src/llm/invoke.test.ts +0 -1198
  751. package/src/llm/mistral/streamSmoothing.test.ts +0 -97
  752. package/src/llm/openai/cacheWriteTokens.test.ts +0 -112
  753. package/src/llm/openai/contentBlocks.test.ts +0 -381
  754. package/src/llm/openai/deepseek.test.ts +0 -747
  755. package/src/llm/openai/inherited-deepseek.spec.ts +0 -347
  756. package/src/llm/openai/inherited-xai.spec.ts +0 -416
  757. package/src/llm/openai/llm.spec.ts +0 -1774
  758. package/src/llm/openai/managedRequests.test.ts +0 -182
  759. package/src/llm/openai/sequentialToolCallSeals.test.ts +0 -199
  760. package/src/llm/openai/streamMetadata.spec.ts +0 -86
  761. package/src/llm/openai/streamMetadataDedup.spec.ts +0 -166
  762. package/src/llm/openai/utils/isReasoningModel.test.ts +0 -90
  763. package/src/llm/openai/utils/messages.test.ts +0 -488
  764. package/src/llm/openrouter/reasoning.test.ts +0 -561
  765. package/src/llm/openrouter/toolCache.test.ts +0 -134
  766. package/src/llm/preempt.test.ts +0 -323
  767. package/src/llm/stream/chunkAdapters.test.ts +0 -202
  768. package/src/llm/stream/reassembly.test.ts +0 -241
  769. package/src/llm/stream/smoother.bench.test.ts +0 -155
  770. package/src/llm/stream/smoother.test.ts +0 -519
  771. package/src/llm/streamLimits.test.ts +0 -450
  772. package/src/llm/truncation.test.ts +0 -242
  773. package/src/llm/vertexai/fixThoughtSignatures.test.ts +0 -154
  774. package/src/llm/vertexai/inherited-stream-events.spec.ts +0 -271
  775. package/src/llm/vertexai/llm.spec.ts +0 -159
  776. package/src/llm/vertexai/repairUsageMetadata.test.ts +0 -54
  777. package/src/llm/vertexai/sealStreamedToolCalls.test.ts +0 -88
  778. package/src/llm/vertexai/streamSealDispatch.test.ts +0 -148
  779. package/src/llm/vertexai/streamSmoothing.test.ts +0 -109
  780. package/src/messages/__tests__/anthropicToolCache.test.ts +0 -339
  781. package/src/messages/__tests__/observationMasking.test.ts +0 -312
  782. package/src/messages/__tests__/recency.test.ts +0 -267
  783. package/src/messages/__tests__/tools.test.ts +0 -473
  784. package/src/messages/alternation.test.ts +0 -212
  785. package/src/messages/assistantPhase.test.ts +0 -75
  786. package/src/messages/cache.tail.test.ts +0 -533
  787. package/src/messages/cache.test.ts +0 -2166
  788. package/src/messages/content.test.ts +0 -362
  789. package/src/messages/contextPruning.test.ts +0 -184
  790. package/src/messages/ensureThinkingBlock.test.ts +0 -1427
  791. package/src/messages/foldToollessToolBlocks.test.ts +0 -596
  792. package/src/messages/formatAgentMessages.reducer.test.ts +0 -162
  793. package/src/messages/formatAgentMessages.skills.test.ts +0 -513
  794. package/src/messages/formatAgentMessages.steer.test.ts +0 -598
  795. package/src/messages/formatAgentMessages.test.ts +0 -8111
  796. package/src/messages/formatAgentMessages.tools.test.ts +0 -522
  797. package/src/messages/formatMessage.test.ts +0 -693
  798. package/src/messages/handoffCue.test.ts +0 -96
  799. package/src/messages/injected.test.ts +0 -107
  800. package/src/messages/labelContentByAgent.test.ts +0 -962
  801. package/src/messages/reducer.spec.ts +0 -32
  802. package/src/messages/shiftIndexTokenCountMap.test.ts +0 -81
  803. package/src/messages/tailCacheConversion.test.ts +0 -161
  804. package/src/openai/__tests__/openai.test.ts +0 -337
  805. package/src/responses/__tests__/responses.test.ts +0 -652
  806. package/src/scripts/abort.ts +0 -157
  807. package/src/scripts/activity-labels/captured.json +0 -56
  808. package/src/scripts/activity-labels/checks.cjs +0 -205
  809. package/src/scripts/activity-labels/corpus.cjs +0 -473
  810. package/src/scripts/activity-labels/report.cjs +0 -203
  811. package/src/scripts/activity-labels/rescore.cjs +0 -102
  812. package/src/scripts/activity-labels/run.ts +0 -705
  813. package/src/scripts/activity-labels/variants.ts +0 -71
  814. package/src/scripts/ant_web_search.ts +0 -159
  815. package/src/scripts/ant_web_search_edge_case.ts +0 -163
  816. package/src/scripts/ant_web_search_error_edge_case.ts +0 -149
  817. package/src/scripts/args.ts +0 -48
  818. package/src/scripts/bedrock-cache-debug.ts +0 -250
  819. package/src/scripts/bedrock-content-aggregation-test.ts +0 -266
  820. package/src/scripts/bedrock-merge-test.ts +0 -107
  821. package/src/scripts/bedrock-parallel-tools-test.ts +0 -204
  822. package/src/scripts/bench-prompt-cache.ts +0 -479
  823. package/src/scripts/caching.ts +0 -132
  824. package/src/scripts/cli.ts +0 -172
  825. package/src/scripts/cli2.ts +0 -133
  826. package/src/scripts/cli3.ts +0 -184
  827. package/src/scripts/cli4.ts +0 -191
  828. package/src/scripts/cli5.ts +0 -191
  829. package/src/scripts/code_exec.ts +0 -214
  830. package/src/scripts/code_exec_files.ts +0 -237
  831. package/src/scripts/code_exec_multi_session.ts +0 -237
  832. package/src/scripts/code_exec_ptc.ts +0 -335
  833. package/src/scripts/code_exec_session.ts +0 -283
  834. package/src/scripts/code_exec_simple.ts +0 -148
  835. package/src/scripts/compare_pi_vs_ours.ts +0 -1259
  836. package/src/scripts/content.ts +0 -139
  837. package/src/scripts/context-overflow-probe.ts +0 -997
  838. package/src/scripts/empty_input.ts +0 -137
  839. package/src/scripts/handoff-test.ts +0 -134
  840. package/src/scripts/local_engine.ts +0 -166
  841. package/src/scripts/local_engine_checkpointer.ts +0 -205
  842. package/src/scripts/local_engine_compile.ts +0 -263
  843. package/src/scripts/local_engine_hooks.ts +0 -226
  844. package/src/scripts/local_engine_image.ts +0 -201
  845. package/src/scripts/local_engine_ptc.ts +0 -151
  846. package/src/scripts/local_engine_workspace.ts +0 -258
  847. package/src/scripts/memory.ts +0 -107
  848. package/src/scripts/multi-agent-chain.ts +0 -332
  849. package/src/scripts/multi-agent-conditional.ts +0 -222
  850. package/src/scripts/multi-agent-document-review-chain.ts +0 -198
  851. package/src/scripts/multi-agent-hybrid-flow.ts +0 -311
  852. package/src/scripts/multi-agent-parallel-start.ts +0 -265
  853. package/src/scripts/multi-agent-parallel.ts +0 -395
  854. package/src/scripts/multi-agent-sequence.ts +0 -217
  855. package/src/scripts/multi-agent-subagent.ts +0 -246
  856. package/src/scripts/multi-agent-supervisor.ts +0 -366
  857. package/src/scripts/multi-agent-test.ts +0 -187
  858. package/src/scripts/openrouter_prompt_cache_live.ts +0 -310
  859. package/src/scripts/parallel-asymmetric-tools-test.ts +0 -275
  860. package/src/scripts/parallel-full-metadata-test.ts +0 -241
  861. package/src/scripts/parallel-tools-test.ts +0 -341
  862. package/src/scripts/preempt-probe.ts +0 -330
  863. package/src/scripts/preempt-scenarios.ts +0 -388
  864. package/src/scripts/programmatic_exec.ts +0 -387
  865. package/src/scripts/programmatic_exec_agent.ts +0 -232
  866. package/src/scripts/search.ts +0 -147
  867. package/src/scripts/sequential-full-metadata-test.ts +0 -198
  868. package/src/scripts/session_live.ts +0 -548
  869. package/src/scripts/simple.ts +0 -226
  870. package/src/scripts/single-agent-metadata-test.ts +0 -196
  871. package/src/scripts/stream.ts +0 -141
  872. package/src/scripts/subagent-configurable-inheritance.ts +0 -252
  873. package/src/scripts/subagent-event-driven-debug.ts +0 -190
  874. package/src/scripts/subagent-tools-debug.ts +0 -160
  875. package/src/scripts/subagent-usage-sink.ts +0 -176
  876. package/src/scripts/summarization-recency.ts +0 -462
  877. package/src/scripts/test-custom-prompt-key.ts +0 -145
  878. package/src/scripts/test-handoff-input.ts +0 -170
  879. package/src/scripts/test-handoff-preamble.ts +0 -278
  880. package/src/scripts/test-handoff-steering.ts +0 -430
  881. package/src/scripts/test-multi-agent-list-handoff.ts +0 -418
  882. package/src/scripts/test-parallel-agent-labeling.ts +0 -327
  883. package/src/scripts/test-parallel-handoffs.ts +0 -292
  884. package/src/scripts/test-thinking-handoff-bedrock.ts +0 -154
  885. package/src/scripts/test-thinking-handoff.ts +0 -156
  886. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +0 -166
  887. package/src/scripts/test-tool-before-handoff-role-order.ts +0 -276
  888. package/src/scripts/test-tools-before-handoff.ts +0 -222
  889. package/src/scripts/test_code_api.ts +0 -354
  890. package/src/scripts/thinking-bedrock.ts +0 -160
  891. package/src/scripts/thinking-vertexai.ts +0 -168
  892. package/src/scripts/thinking.ts +0 -172
  893. package/src/scripts/tool_search.ts +0 -153
  894. package/src/scripts/tools.ts +0 -163
  895. package/src/session/__tests__/JsonlSessionStore.test.ts +0 -1463
  896. package/src/session/__tests__/handlers.test.ts +0 -161
  897. package/src/specs/activity-label-observability.live.test.ts +0 -262
  898. package/src/specs/activity-label-observability.test.ts +0 -167
  899. package/src/specs/activity-label-prompt.test.ts +0 -359
  900. package/src/specs/activity-label-trace-seed.test.ts +0 -47
  901. package/src/specs/activity-phase-label.test.ts +0 -306
  902. package/src/specs/agent-handoffs.live.test.ts +0 -140
  903. package/src/specs/agent-handoffs.test.ts +0 -2465
  904. package/src/specs/anthropic.simple.test.ts +0 -453
  905. package/src/specs/ask-user-question-batch.test.ts +0 -289
  906. package/src/specs/ask-user-questions.live.test.ts +0 -185
  907. package/src/specs/ask-user-questions.test.ts +0 -293
  908. package/src/specs/azure.simple.test.ts +0 -502
  909. package/src/specs/bedrock-toolless.live.test.ts +0 -123
  910. package/src/specs/bedrock-truncation.live.test.ts +0 -191
  911. package/src/specs/cache.simple.test.ts +0 -416
  912. package/src/specs/context-accuracy.live.test.ts +0 -409
  913. package/src/specs/context-overflow-recovery.live.test.ts +0 -213
  914. package/src/specs/context-usage-event.test.ts +0 -117
  915. package/src/specs/context-usage.live.test.ts +0 -297
  916. package/src/specs/custom-event-await.test.ts +0 -304
  917. package/src/specs/deepseek.simple.test.ts +0 -290
  918. package/src/specs/deterministic-trace-id.test.ts +0 -43
  919. package/src/specs/discovered-tools.test.ts +0 -217
  920. package/src/specs/durability-checkpoint.integration.test.ts +0 -243
  921. package/src/specs/graph-subagent.live.test.ts +0 -242
  922. package/src/specs/graph-subagent.test.ts +0 -322
  923. package/src/specs/handoffCue.test.ts +0 -165
  924. package/src/specs/langfuse-callbacks.test.ts +0 -1578
  925. package/src/specs/langfuse-config.test.ts +0 -247
  926. package/src/specs/langfuse-instrumentation.test.ts +0 -393
  927. package/src/specs/langfuse-metadata.test.ts +0 -245
  928. package/src/specs/langfuse-routing.integration.test.ts +0 -844
  929. package/src/specs/langfuse-runtime-context.test.ts +0 -92
  930. package/src/specs/langfuse-span-registry.test.ts +0 -87
  931. package/src/specs/langfuse-tool-output-tracing.test.ts +0 -1858
  932. package/src/specs/langfuse-trace-shaping.test.ts +0 -591
  933. package/src/specs/moonshot.simple.test.ts +0 -367
  934. package/src/specs/multi-agent-summarization.test.ts +0 -396
  935. package/src/specs/openai.simple.test.ts +0 -315
  936. package/src/specs/openrouter.simple.test.ts +0 -275
  937. package/src/specs/preemptSeal.test.ts +0 -678
  938. package/src/specs/prune.test.ts +0 -3741
  939. package/src/specs/reasoning.test.ts +0 -201
  940. package/src/specs/run-step-timestamps.test.ts +0 -414
  941. package/src/specs/spec.utils.ts +0 -15
  942. package/src/specs/subagent.test.ts +0 -864
  943. package/src/specs/summarization-unit.test.ts +0 -973
  944. package/src/specs/summarization.test.ts +0 -3823
  945. package/src/specs/summarize-prune.test.ts +0 -376
  946. package/src/specs/thinking-handoff.test.ts +0 -621
  947. package/src/specs/thinking-prune.test.ts +0 -827
  948. package/src/specs/token-accounting-e2e.test.ts +0 -1034
  949. package/src/specs/token-accounting-pipeline.test.ts +0 -1008
  950. package/src/specs/token-distribution-edge-case.test.ts +0 -315
  951. package/src/specs/token-memoization.test.ts +0 -40
  952. package/src/specs/tokens.test.ts +0 -1000
  953. package/src/specs/tool-error-resume.test.ts +0 -194
  954. package/src/specs/tool-error.test.ts +0 -198
  955. package/src/specs/vllm-reasoning-toolcalls.test.ts +0 -340
  956. package/src/stream.dispatch.test.ts +0 -63
  957. package/src/stream.test.ts +0 -144
  958. package/src/summarization/__tests__/aggregator.test.ts +0 -236
  959. package/src/summarization/__tests__/node.test.ts +0 -1996
  960. package/src/summarization/__tests__/trigger.test.ts +0 -149
  961. package/src/summarization/chunkHandler.test.ts +0 -196
  962. package/src/test/mockTools.ts +0 -386
  963. package/src/tools/Calculator.test.ts +0 -278
  964. package/src/tools/__tests__/BashExecutor.test.ts +0 -108
  965. package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +0 -939
  966. package/src/tools/__tests__/CodeApiAuthHeaders.test.ts +0 -858
  967. package/src/tools/__tests__/CodeExecutor.stateful.test.ts +0 -124
  968. package/src/tools/__tests__/LocalExecutionRoots.test.ts +0 -8
  969. package/src/tools/__tests__/LocalExecutionTools.test.ts +0 -2733
  970. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.ts +0 -318
  971. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +0 -1557
  972. package/src/tools/__tests__/ReadFile.test.ts +0 -44
  973. package/src/tools/__tests__/SkillTool.test.ts +0 -442
  974. package/src/tools/__tests__/SubagentExecutor.test.ts +0 -3728
  975. package/src/tools/__tests__/SubagentReplay.test.ts +0 -329
  976. package/src/tools/__tests__/SubagentTool.test.ts +0 -149
  977. package/src/tools/__tests__/ToolNode.breakerSignal.test.ts +0 -595
  978. package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +0 -1191
  979. package/src/tools/__tests__/ToolNode.invalidToolCalls.test.ts +0 -757
  980. package/src/tools/__tests__/ToolNode.langfuse.test.ts +0 -57
  981. package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +0 -736
  982. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +0 -1710
  983. package/src/tools/__tests__/ToolNode.runtimeState.test.ts +0 -120
  984. package/src/tools/__tests__/ToolNode.session.test.ts +0 -1352
  985. package/src/tools/__tests__/ToolNode.streamLimits.test.ts +0 -69
  986. package/src/tools/__tests__/ToolSearch.integration.test.ts +0 -161
  987. package/src/tools/__tests__/ToolSearch.test.ts +0 -1227
  988. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +0 -561
  989. package/src/tools/__tests__/directToolHITLResumeScope.test.ts +0 -980
  990. package/src/tools/__tests__/directToolHooks.test.ts +0 -700
  991. package/src/tools/__tests__/eagerEventExecution.session.test.ts +0 -92
  992. package/src/tools/__tests__/handlers.test.ts +0 -997
  993. package/src/tools/__tests__/hitl.test.ts +0 -4663
  994. package/src/tools/__tests__/intentArg.test.ts +0 -357
  995. package/src/tools/__tests__/intentCoverage.test.ts +0 -139
  996. package/src/tools/__tests__/localToolNames.test.ts +0 -75
  997. package/src/tools/__tests__/skillCatalog.test.ts +0 -161
  998. package/src/tools/__tests__/subagentHooks.test.ts +0 -1651
  999. package/src/tools/__tests__/toolOutputReferences.test.ts +0 -515
  1000. package/src/tools/__tests__/workspaceSeam.test.ts +0 -147
  1001. package/src/tools/local/__tests__/FileCheckpointer.test.ts +0 -162
  1002. package/src/tools/local/__tests__/editStrategies.test.ts +0 -134
  1003. package/src/tools/search/content.test.ts +0 -173
  1004. package/src/tools/search/crw.test.ts +0 -836
  1005. package/src/tools/search/format.test.ts +0 -242
  1006. package/src/tools/search/http-agent.test.ts +0 -133
  1007. package/src/tools/search/jina-reranker.test.ts +0 -306
  1008. package/src/tools/search/keenable-scraper.test.ts +0 -153
  1009. package/src/tools/search/keenable.test.ts +0 -183
  1010. package/src/tools/search/outcome.test.ts +0 -90
  1011. package/src/tools/search/output.md +0 -2775
  1012. package/src/tools/search/rag-api-reranker.test.ts +0 -891
  1013. package/src/tools/search/source-processing.test.ts +0 -516
  1014. package/src/tools/search/tavily.test.ts +0 -965
  1015. package/src/tools/search/test.html +0 -884
  1016. package/src/tools/search/test.md +0 -643
  1017. package/src/tools/subagent/__tests__/SubagentExecutionRegistry.test.ts +0 -637
  1018. package/src/tools/subagent/__tests__/SubagentExecutor.lazy.test.ts +0 -3054
  1019. package/src/tools/subagent/__tests__/childGraphConfig.test.ts +0 -521
  1020. package/src/utils/__tests__/apportion.test.ts +0 -32
  1021. package/src/utils/__tests__/errors.test.ts +0 -270
  1022. package/src/utils/__tests__/fixtures/contextOverflowSignatures.ts +0 -336
  1023. package/src/utils/__tests__/redactSecrets.test.ts +0 -56
  1024. package/src/utils/__tests__/truncation.test.ts +0 -66
  1025. package/src/utils/llm.test.ts +0 -18
  1026. package/src/utils/proxy.test.ts +0 -176
  1027. package/src/utils/toolContent.test.ts +0 -1432
@@ -1,2166 +0,0 @@
1
- import {
2
- AIMessage,
3
- BaseMessage,
4
- HumanMessage,
5
- SystemMessage,
6
- ToolMessage,
7
- } from '@langchain/core/messages';
8
- import type { MessageContentComplex } from '@langchain/core/messages';
9
- import type Anthropic from '@anthropic-ai/sdk';
10
- import type { AnthropicMessages } from '@/types/messages';
11
- import {
12
- stripAnthropicCacheControl,
13
- stripBedrockCacheControl,
14
- addBedrockCacheControl,
15
- addBedrockTailCacheControl,
16
- addCacheControl,
17
- addTailCacheControl,
18
- addCacheControlToStablePrefixMessages,
19
- buildAnthropicCacheControl,
20
- buildBedrockCachePoint,
21
- resolvePromptCacheTtl,
22
- resolveBedrockPromptCacheTtl,
23
- supportsBedrockToolCache,
24
- DEFAULT_PROMPT_CACHE_TTL,
25
- } from './cache';
26
- import { _convertMessagesToOpenAIParams } from '@/llm/openai/utils';
27
- import { toLangChainContent } from './langchain';
28
- import { formatAgentMessages } from './format';
29
- import { ContentTypes } from '@/common/enum';
30
-
31
- type CacheControlBlock = MessageContentComplex & {
32
- cache_control?: { type: 'ephemeral'; ttl?: '1h' };
33
- };
34
-
35
- describe('addCacheControl', () => {
36
- test('should add cache control to the last two user messages with array content', () => {
37
- const messages: AnthropicMessages = [
38
- { role: 'user', content: [{ type: 'text', text: 'Hello' }] },
39
- { role: 'assistant', content: [{ type: 'text', text: 'Hi there' }] },
40
- { role: 'user', content: [{ type: 'text', text: 'How are you?' }] },
41
- {
42
- role: 'assistant',
43
- content: [{ type: 'text', text: 'I\'m doing well, thanks!' }],
44
- },
45
- { role: 'user', content: [{ type: 'text', text: 'Great!' }] },
46
- ];
47
-
48
- const result = addCacheControl(messages);
49
-
50
- expect(result[0].content[0]).not.toHaveProperty('cache_control');
51
- expect(
52
- (result[2].content[0] as Anthropic.TextBlockParam).cache_control
53
- ).toEqual({ type: 'ephemeral' });
54
- expect(
55
- (result[4].content[0] as Anthropic.TextBlockParam).cache_control
56
- ).toEqual({ type: 'ephemeral' });
57
- });
58
-
59
- test('should add cache control to the last two user messages with string content', () => {
60
- const messages: AnthropicMessages = [
61
- { role: 'user', content: 'Hello' },
62
- { role: 'assistant', content: 'Hi there' },
63
- { role: 'user', content: 'How are you?' },
64
- { role: 'assistant', content: 'I\'m doing well, thanks!' },
65
- { role: 'user', content: 'Great!' },
66
- ];
67
-
68
- const result = addCacheControl(messages);
69
-
70
- expect(result[0].content).toBe('Hello');
71
- expect(result[2].content[0]).toEqual({
72
- type: 'text',
73
- text: 'How are you?',
74
- cache_control: { type: 'ephemeral' },
75
- });
76
- expect(result[4].content[0]).toEqual({
77
- type: 'text',
78
- text: 'Great!',
79
- cache_control: { type: 'ephemeral' },
80
- });
81
- });
82
-
83
- test('should handle mixed string and array content', () => {
84
- const messages: AnthropicMessages = [
85
- { role: 'user', content: 'Hello' },
86
- { role: 'assistant', content: 'Hi there' },
87
- { role: 'user', content: [{ type: 'text', text: 'How are you?' }] },
88
- ];
89
-
90
- const result = addCacheControl(messages);
91
-
92
- expect(result[0].content[0]).toEqual({
93
- type: 'text',
94
- text: 'Hello',
95
- cache_control: { type: 'ephemeral' },
96
- });
97
- expect(
98
- (result[2].content[0] as Anthropic.TextBlockParam).cache_control
99
- ).toEqual({ type: 'ephemeral' });
100
- });
101
-
102
- test('should handle less than two user messages', () => {
103
- const messages: AnthropicMessages = [
104
- { role: 'user', content: 'Hello' },
105
- { role: 'assistant', content: 'Hi there' },
106
- ];
107
-
108
- const result = addCacheControl(messages);
109
-
110
- expect(result[0].content[0]).toEqual({
111
- type: 'text',
112
- text: 'Hello',
113
- cache_control: { type: 'ephemeral' },
114
- });
115
- expect(result[1].content).toBe('Hi there');
116
- });
117
-
118
- test('should return original array if no user messages', () => {
119
- const messages: AnthropicMessages = [
120
- { role: 'assistant', content: 'Hi there' },
121
- { role: 'assistant', content: 'How can I help?' },
122
- ];
123
-
124
- const result = addCacheControl(messages);
125
-
126
- expect(result).toEqual(messages);
127
- });
128
-
129
- test('should handle empty array', () => {
130
- const messages: AnthropicMessages = [];
131
- const result = addCacheControl(messages);
132
- expect(result).toEqual([]);
133
- });
134
-
135
- test('should handle non-array input', () => {
136
- const messages = 'not an array';
137
- /** @ts-expect-error - This is a test */
138
- const result = addCacheControl(messages);
139
- expect(result).toBe('not an array');
140
- });
141
-
142
- test('should not modify assistant messages', () => {
143
- const messages: AnthropicMessages = [
144
- { role: 'user', content: 'Hello' },
145
- { role: 'assistant', content: 'Hi there' },
146
- { role: 'user', content: 'How are you?' },
147
- ];
148
-
149
- const result = addCacheControl(messages);
150
-
151
- expect(result[1].content).toBe('Hi there');
152
- });
153
-
154
- test('should handle multiple content items in user messages', () => {
155
- const messages: AnthropicMessages = [
156
- {
157
- role: 'user',
158
- content: [
159
- { type: 'text', text: 'Hello' },
160
- {
161
- type: 'image',
162
- source: { type: 'url', url: 'http://example.com/image.jpg' },
163
- },
164
- { type: 'text', text: 'This is an image' },
165
- ],
166
- },
167
- { role: 'assistant', content: 'Hi there' },
168
- { role: 'user', content: 'How are you?' },
169
- ];
170
-
171
- const result = addCacheControl(messages);
172
-
173
- expect(result[0].content[0]).not.toHaveProperty('cache_control');
174
- expect(result[0].content[1]).not.toHaveProperty('cache_control');
175
- expect(
176
- (result[0].content[2] as Anthropic.TextBlockParam).cache_control
177
- ).toEqual({ type: 'ephemeral' });
178
- expect(result[2].content[0]).toEqual({
179
- type: 'text',
180
- text: 'How are you?',
181
- cache_control: { type: 'ephemeral' },
182
- });
183
- });
184
-
185
- test('should handle an array with mixed content types', () => {
186
- const messages: AnthropicMessages = [
187
- { role: 'user', content: 'Hello' },
188
- { role: 'assistant', content: 'Hi there' },
189
- { role: 'user', content: [{ type: 'text', text: 'How are you?' }] },
190
- { role: 'assistant', content: 'I\'m doing well, thanks!' },
191
- { role: 'user', content: 'Great!' },
192
- ];
193
-
194
- const result = addCacheControl(messages);
195
-
196
- expect(result[0].content).toEqual('Hello');
197
- expect(result[2].content[0]).toEqual({
198
- type: 'text',
199
- text: 'How are you?',
200
- cache_control: { type: 'ephemeral' },
201
- });
202
- expect(result[4].content).toEqual([
203
- {
204
- type: 'text',
205
- text: 'Great!',
206
- cache_control: { type: 'ephemeral' },
207
- },
208
- ]);
209
- expect(result[1].content).toBe('Hi there');
210
- expect(result[3].content).toBe('I\'m doing well, thanks!');
211
- });
212
-
213
- test('should handle edge case with multiple content types', () => {
214
- const messages: AnthropicMessages = [
215
- {
216
- role: 'user',
217
- content: [
218
- {
219
- type: 'image',
220
- source: {
221
- type: 'base64',
222
- media_type: 'image/png',
223
- data: 'some_base64_string',
224
- },
225
- },
226
- {
227
- type: 'image',
228
- source: {
229
- type: 'base64',
230
- media_type: 'image/png',
231
- data: 'another_base64_string',
232
- },
233
- },
234
- { type: 'text', text: 'what do all these images have in common' },
235
- ],
236
- },
237
- { role: 'assistant', content: 'I see multiple images.' },
238
- { role: 'user', content: 'Correct!' },
239
- ];
240
-
241
- const result = addCacheControl(messages);
242
-
243
- expect(result[0].content[0]).not.toHaveProperty('cache_control');
244
- expect(result[0].content[1]).not.toHaveProperty('cache_control');
245
- expect(
246
- (result[0].content[2] as Anthropic.ImageBlockParam).cache_control
247
- ).toEqual({ type: 'ephemeral' });
248
- expect(result[2].content[0]).toEqual({
249
- type: 'text',
250
- text: 'Correct!',
251
- cache_control: { type: 'ephemeral' },
252
- });
253
- });
254
-
255
- test('should handle user message with no text block', () => {
256
- const messages: AnthropicMessages = [
257
- {
258
- role: 'user',
259
- content: [
260
- {
261
- type: 'image',
262
- source: {
263
- type: 'base64',
264
- media_type: 'image/png',
265
- data: 'some_base64_string',
266
- },
267
- },
268
- {
269
- type: 'image',
270
- source: {
271
- type: 'base64',
272
- media_type: 'image/png',
273
- data: 'another_base64_string',
274
- },
275
- },
276
- ],
277
- },
278
- { role: 'assistant', content: 'I see two images.' },
279
- { role: 'user', content: 'Correct!' },
280
- ];
281
-
282
- const result = addCacheControl(messages);
283
-
284
- expect(result[0].content[0]).not.toHaveProperty('cache_control');
285
- expect(result[0].content[1]).not.toHaveProperty('cache_control');
286
- expect(result[2].content[0]).toEqual({
287
- type: 'text',
288
- text: 'Correct!',
289
- cache_control: { type: 'ephemeral' },
290
- });
291
- });
292
- });
293
-
294
- type TestMsg = {
295
- role?: 'user' | 'assistant' | 'system';
296
- content?: string | MessageContentComplex[];
297
- };
298
-
299
- describe('addBedrockCacheControl (Bedrock cache checkpoints)', () => {
300
- it('returns empty input unchanged and caches a single user message', () => {
301
- const empty: TestMsg[] = [];
302
- expect(addBedrockCacheControl(empty)).toEqual(empty);
303
- const single: TestMsg[] = [{ role: 'user', content: 'only' }];
304
- expect(addBedrockCacheControl(single)[0].content).toEqual([
305
- { type: ContentTypes.TEXT, text: 'only' },
306
- { cachePoint: { type: 'default' } },
307
- ]);
308
- });
309
-
310
- it('wraps latest user string content and appends separate cachePoint block', () => {
311
- const messages: TestMsg[] = [
312
- { role: 'user', content: 'Hello' },
313
- { role: 'assistant', content: [{ type: ContentTypes.TEXT, text: 'Hi' }] },
314
- ];
315
- const result = addBedrockCacheControl(messages);
316
- const user = result[0].content as MessageContentComplex[];
317
- const assistant = result[1].content as MessageContentComplex[];
318
- expect(Array.isArray(user)).toBe(true);
319
- expect(user[0]).toEqual({ type: ContentTypes.TEXT, text: 'Hello' });
320
- expect(user[1]).toEqual({ cachePoint: { type: 'default' } });
321
- expect(assistant).toEqual([{ type: ContentTypes.TEXT, text: 'Hi' }]);
322
- });
323
-
324
- it('inserts cachePoint after the last text when multiple text blocks exist', () => {
325
- const messages: TestMsg[] = [
326
- {
327
- role: 'user',
328
- content: [
329
- { type: ContentTypes.TEXT, text: 'Intro' },
330
- { type: ContentTypes.TEXT, text: 'Details' },
331
- {
332
- type: ContentTypes.IMAGE_FILE,
333
- image_file: { file_id: 'file_123' },
334
- },
335
- ],
336
- },
337
- {
338
- role: 'assistant',
339
- content: [
340
- { type: ContentTypes.TEXT, text: 'Reply A' },
341
- { type: ContentTypes.TEXT, text: 'Reply B' },
342
- ],
343
- },
344
- ];
345
-
346
- const result = addBedrockCacheControl(messages);
347
-
348
- const first = result[0].content as MessageContentComplex[];
349
- const second = result[1].content as MessageContentComplex[];
350
-
351
- expect(first[0]).toEqual({ type: ContentTypes.TEXT, text: 'Intro' });
352
- expect(first[1]).toEqual({ type: ContentTypes.TEXT, text: 'Details' });
353
- expect(first[2]).toEqual({ cachePoint: { type: 'default' } });
354
-
355
- const img = first[3] as MessageContentComplex;
356
- expect(img.type).toBe(ContentTypes.IMAGE_FILE);
357
- if (img.type === ContentTypes.IMAGE_FILE) {
358
- expect('image_file' in img).toBe(true);
359
- }
360
-
361
- expect(second[0]).toEqual({ type: ContentTypes.TEXT, text: 'Reply A' });
362
- expect(second[1]).toEqual({ type: ContentTypes.TEXT, text: 'Reply B' });
363
- expect(second).toHaveLength(2);
364
- });
365
-
366
- it('skips empty arrays and caches the latest non-empty user message', () => {
367
- const messages: TestMsg[] = [
368
- { role: 'user', content: [] },
369
- { role: 'assistant', content: [] },
370
- { role: 'user', content: 'latest cacheable user message' },
371
- ];
372
-
373
- const result = addBedrockCacheControl(messages);
374
-
375
- const first = result[0].content as MessageContentComplex[];
376
- const second = result[1].content as MessageContentComplex[];
377
- const third = result[2].content as MessageContentComplex[];
378
-
379
- expect(Array.isArray(first)).toBe(true);
380
- expect(first.length).toBe(0);
381
-
382
- expect(Array.isArray(second)).toBe(true);
383
- expect(second.length).toBe(0);
384
- expect(second[0]).not.toEqual({ cachePoint: { type: 'default' } });
385
-
386
- expect(third).toEqual([
387
- { type: ContentTypes.TEXT, text: 'latest cacheable user message' },
388
- { cachePoint: { type: 'default' } },
389
- ]);
390
- });
391
-
392
- it('skips empty strings and caches the latest non-empty user message', () => {
393
- const messages: TestMsg[] = [
394
- { role: 'user', content: '' },
395
- { role: 'assistant', content: '' },
396
- { role: 'user', content: 'latest cacheable user message' },
397
- ];
398
-
399
- const result = addBedrockCacheControl(messages);
400
-
401
- expect(result[0].content).toBe('');
402
- expect(result[1].content).toBe('');
403
- expect(result[2].content).toEqual([
404
- { type: ContentTypes.TEXT, text: 'latest cacheable user message' },
405
- { cachePoint: { type: 'default' } },
406
- ]);
407
- });
408
-
409
- /** (I don't think this will ever occur in actual use, but its the only branch left uncovered so I'm covering it */
410
- it('skips messages with non-string, non-array content', () => {
411
- const messages: TestMsg[] = [
412
- {
413
- role: 'user',
414
- content: [{ type: ContentTypes.TEXT, text: 'Older user message' }],
415
- },
416
- { role: 'assistant', content: undefined },
417
- {
418
- role: 'user',
419
- content: [{ type: ContentTypes.TEXT, text: 'Latest user message' }],
420
- },
421
- ];
422
-
423
- const result = addBedrockCacheControl(messages);
424
-
425
- const last = result[2].content as MessageContentComplex[];
426
- expect(last[0]).toEqual({
427
- type: ContentTypes.TEXT,
428
- text: 'Latest user message',
429
- });
430
- expect(last[1]).toEqual({ cachePoint: { type: 'default' } });
431
-
432
- expect(result[1].content).toBeUndefined();
433
-
434
- const first = result[0].content as MessageContentComplex[];
435
- expect(first[0]).toEqual({
436
- type: ContentTypes.TEXT,
437
- text: 'Older user message',
438
- });
439
- expect(first[1]).toEqual({ cachePoint: { type: 'default' } });
440
- });
441
-
442
- it('preserves LangChain system message content unchanged', () => {
443
- const systemContent = [
444
- { type: ContentTypes.TEXT, text: 'Stable system text' },
445
- { cachePoint: { type: 'default' } },
446
- { type: ContentTypes.TEXT, text: 'Dynamic system text' },
447
- ] as MessageContentComplex[];
448
- const messages: BaseMessage[] = [
449
- new SystemMessage({ content: toLangChainContent(systemContent) }),
450
- new HumanMessage('Hello'),
451
- new AIMessage('Hi'),
452
- ];
453
-
454
- const result = addBedrockCacheControl(messages);
455
-
456
- expect(result[0]).toBe(messages[0]);
457
- expect(result[0].content).toEqual(systemContent);
458
- });
459
-
460
- it('preserves serialized system message content unchanged', () => {
461
- const systemContent = [
462
- { type: ContentTypes.TEXT, text: 'Stable system text' },
463
- { cachePoint: { type: 'default' } },
464
- { type: ContentTypes.TEXT, text: 'Dynamic system text' },
465
- ] as MessageContentComplex[];
466
- const messages: TestMsg[] = [
467
- { role: 'system', content: systemContent },
468
- { role: 'user', content: 'Hello' },
469
- { role: 'assistant', content: 'Hi' },
470
- ];
471
-
472
- const result = addBedrockCacheControl(messages);
473
-
474
- expect(result[0]).toBe(messages[0]);
475
- expect(result[0].content).toEqual(systemContent);
476
- });
477
-
478
- it('strips Anthropic cache_control from LangChain system messages without moving cache points', () => {
479
- const systemContent = [
480
- {
481
- type: ContentTypes.TEXT,
482
- text: 'Stable system text',
483
- cache_control: { type: 'ephemeral' },
484
- } as MessageContentComplex,
485
- { cachePoint: { type: 'default' } },
486
- {
487
- type: ContentTypes.TEXT,
488
- text: 'Dynamic system text',
489
- cache_control: { type: 'ephemeral' },
490
- } as MessageContentComplex,
491
- ] as MessageContentComplex[];
492
- const messages: BaseMessage[] = [
493
- new SystemMessage({ content: toLangChainContent(systemContent) }),
494
- new HumanMessage('Hello'),
495
- new AIMessage('Hi'),
496
- ];
497
-
498
- const result = addBedrockCacheControl(messages);
499
-
500
- expect(result[0]).not.toBe(messages[0]);
501
- expect(result[0].content).toEqual([
502
- { type: ContentTypes.TEXT, text: 'Stable system text' },
503
- { cachePoint: { type: 'default' } },
504
- { type: ContentTypes.TEXT, text: 'Dynamic system text' },
505
- ]);
506
- expect(systemContent[0]).toHaveProperty('cache_control');
507
- expect(systemContent[2]).toHaveProperty('cache_control');
508
- });
509
-
510
- it('strips Anthropic cache_control from serialized system messages without moving cache points', () => {
511
- const systemContent = [
512
- {
513
- type: ContentTypes.TEXT,
514
- text: 'Stable system text',
515
- cache_control: { type: 'ephemeral' },
516
- } as MessageContentComplex,
517
- { cachePoint: { type: 'default' } },
518
- {
519
- type: ContentTypes.TEXT,
520
- text: 'Dynamic system text',
521
- cache_control: { type: 'ephemeral' },
522
- } as MessageContentComplex,
523
- ] as MessageContentComplex[];
524
- const messages: TestMsg[] = [
525
- { role: 'system', content: systemContent },
526
- { role: 'user', content: 'Hello' },
527
- { role: 'assistant', content: 'Hi' },
528
- ];
529
-
530
- const result = addBedrockCacheControl(messages);
531
-
532
- expect(result[0]).not.toBe(messages[0]);
533
- expect(result[0].content).toEqual([
534
- { type: ContentTypes.TEXT, text: 'Stable system text' },
535
- { cachePoint: { type: 'default' } },
536
- { type: ContentTypes.TEXT, text: 'Dynamic system text' },
537
- ]);
538
- expect(systemContent[0]).toHaveProperty('cache_control');
539
- expect(systemContent[2]).toHaveProperty('cache_control');
540
- });
541
-
542
- it('skips serialized system messages while adding a cache point to the latest user turn', () => {
543
- const messages: TestMsg[] = [
544
- {
545
- role: 'system',
546
- content: [
547
- { type: ContentTypes.TEXT, text: 'You\'re an advanced AI assistant.' },
548
- ],
549
- },
550
- {
551
- role: 'user',
552
- content: [
553
- { type: ContentTypes.TEXT, text: 'What is the capital of France?' },
554
- ],
555
- },
556
- ];
557
-
558
- const result = addBedrockCacheControl(messages);
559
-
560
- let system = result[0].content as MessageContentComplex[];
561
- let user = result[1].content as MessageContentComplex[];
562
-
563
- expect(system[0]).toEqual({
564
- type: ContentTypes.TEXT,
565
- text: 'You\'re an advanced AI assistant.',
566
- });
567
- expect(system).toHaveLength(1);
568
- expect(user[0]).toEqual({
569
- type: ContentTypes.TEXT,
570
- text: 'What is the capital of France?',
571
- });
572
- expect(user[1]).toEqual({ cachePoint: { type: 'default' } });
573
-
574
- result.push({
575
- role: 'assistant',
576
- content: [
577
- {
578
- type: ContentTypes.TEXT,
579
- text: 'Sure! The capital of France is Paris.',
580
- },
581
- ],
582
- });
583
-
584
- const result2 = addBedrockCacheControl(result);
585
-
586
- system = result2[0].content as MessageContentComplex[];
587
- user = result2[1].content as MessageContentComplex[];
588
- const assistant = result2[2].content as MessageContentComplex[];
589
-
590
- expect(system[0]).toEqual({
591
- type: ContentTypes.TEXT,
592
- text: 'You\'re an advanced AI assistant.',
593
- });
594
- expect(system.length).toBe(1);
595
-
596
- expect(user[0]).toEqual({
597
- type: ContentTypes.TEXT,
598
- text: 'What is the capital of France?',
599
- });
600
- expect(user[1]).toEqual({ cachePoint: { type: 'default' } });
601
-
602
- expect(assistant[0]).toEqual({
603
- type: ContentTypes.TEXT,
604
- text: 'Sure! The capital of France is Paris.',
605
- });
606
- expect(assistant).toHaveLength(1);
607
- });
608
-
609
- it('is idempotent - calling multiple times does not add duplicate cache points', () => {
610
- const messages: TestMsg[] = [
611
- {
612
- role: 'user',
613
- content: [{ type: ContentTypes.TEXT, text: 'First message' }],
614
- },
615
- {
616
- role: 'assistant',
617
- content: [{ type: ContentTypes.TEXT, text: 'First response' }],
618
- },
619
- ];
620
-
621
- const result1 = addBedrockCacheControl(messages);
622
- const firstContent = result1[0].content as MessageContentComplex[];
623
- const secondContent = result1[1].content as MessageContentComplex[];
624
-
625
- expect(firstContent.length).toBe(2);
626
- expect(firstContent[0]).toEqual({
627
- type: ContentTypes.TEXT,
628
- text: 'First message',
629
- });
630
- expect(firstContent[1]).toEqual({ cachePoint: { type: 'default' } });
631
-
632
- expect(secondContent.length).toBe(1);
633
- expect(secondContent[0]).toEqual({
634
- type: ContentTypes.TEXT,
635
- text: 'First response',
636
- });
637
-
638
- const result2 = addBedrockCacheControl(result1);
639
- const firstContentAfter = result2[0].content as MessageContentComplex[];
640
- const secondContentAfter = result2[1].content as MessageContentComplex[];
641
-
642
- expect(firstContentAfter.length).toBe(2);
643
- expect(firstContentAfter[0]).toEqual({
644
- type: ContentTypes.TEXT,
645
- text: 'First message',
646
- });
647
- expect(firstContentAfter[1]).toEqual({ cachePoint: { type: 'default' } });
648
-
649
- expect(secondContentAfter.length).toBe(1);
650
- expect(secondContentAfter[0]).toEqual({
651
- type: ContentTypes.TEXT,
652
- text: 'First response',
653
- });
654
- });
655
-
656
- it('strips stale cache points and caches the latest user messages in multi-agent scenarios', () => {
657
- const messages: TestMsg[] = [
658
- {
659
- role: 'user',
660
- content: [{ type: ContentTypes.TEXT, text: 'Hello' }],
661
- },
662
- {
663
- role: 'assistant',
664
- content: [
665
- { type: ContentTypes.TEXT, text: 'Response from agent 1' },
666
- { cachePoint: { type: 'default' } },
667
- ],
668
- },
669
- {
670
- role: 'user',
671
- content: [{ type: ContentTypes.TEXT, text: 'Follow-up question' }],
672
- },
673
- ];
674
-
675
- const result = addBedrockCacheControl(messages);
676
- const firstContent = result[0].content as MessageContentComplex[];
677
- const lastContent = result[2].content as MessageContentComplex[];
678
- const secondLastContent = result[1].content as MessageContentComplex[];
679
-
680
- expect(firstContent.length).toBe(2);
681
- expect(firstContent[0]).toEqual({
682
- type: ContentTypes.TEXT,
683
- text: 'Hello',
684
- });
685
- expect(firstContent[1]).toEqual({ cachePoint: { type: 'default' } });
686
-
687
- expect(lastContent.length).toBe(2);
688
- expect(lastContent[0]).toEqual({
689
- type: ContentTypes.TEXT,
690
- text: 'Follow-up question',
691
- });
692
- expect(lastContent[1]).toEqual({ cachePoint: { type: 'default' } });
693
-
694
- expect(secondLastContent.length).toBe(1);
695
- expect(secondLastContent[0]).toEqual({
696
- type: ContentTypes.TEXT,
697
- text: 'Response from agent 1',
698
- });
699
- });
700
-
701
- it('skips cachePoint on AI messages with only whitespace text and reasoning (tool-call scenario)', () => {
702
- const messages = [
703
- {
704
- role: 'user',
705
- content: [
706
- {
707
- type: ContentTypes.TEXT,
708
- text: 'What can you tell me about this PR?',
709
- },
710
- ],
711
- },
712
- {
713
- role: 'assistant',
714
- content: [
715
- { type: ContentTypes.TEXT, text: '\n\n' },
716
- {
717
- type: 'reasoning_content',
718
- reasoningText: { text: 'Let me look into that.', signature: 'abc' },
719
- },
720
- ] as MessageContentComplex[],
721
- },
722
- {
723
- role: 'user',
724
- content: [{ type: ContentTypes.TEXT, text: 'tool result here' }],
725
- getType: (): 'tool' => 'tool',
726
- },
727
- ];
728
-
729
- const result = addBedrockCacheControl(
730
- messages as Parameters<typeof addBedrockCacheControl>[0]
731
- );
732
- const aiContent = result[1].content as MessageContentComplex[];
733
- const hasCachePoint = aiContent.some((b) => 'cachePoint' in b);
734
- expect(hasCachePoint).toBe(false);
735
-
736
- const userContent = result[0].content as MessageContentComplex[];
737
- expect(userContent[userContent.length - 1]).toEqual({
738
- cachePoint: { type: 'default' },
739
- });
740
- });
741
-
742
- it('keeps cachePoint on the stable user boundary through tool loops', () => {
743
- const messages: BaseMessage[] = [
744
- new HumanMessage('Use the stable prompt context.'),
745
- new AIMessage({
746
- content: 'I will call the first tool.',
747
- tool_calls: [{ id: 'call_1', name: 'lookup', args: { step: 1 } }],
748
- }),
749
- new ToolMessage({
750
- content: 'volatile tool result 1',
751
- tool_call_id: 'call_1',
752
- }),
753
- new AIMessage({
754
- content: 'I will call the second tool.',
755
- tool_calls: [{ id: 'call_2', name: 'lookup', args: { step: 2 } }],
756
- }),
757
- new ToolMessage({
758
- content: 'volatile tool result 2',
759
- tool_call_id: 'call_2',
760
- }),
761
- ];
762
-
763
- const result = addBedrockCacheControl(messages);
764
-
765
- const userContent = result[0].content as MessageContentComplex[];
766
- expect(userContent[userContent.length - 1]).toEqual({
767
- cachePoint: { type: 'default' },
768
- });
769
-
770
- for (const message of result.slice(1)) {
771
- const content = message.content;
772
- expect(
773
- Array.isArray(content) && content.some((block) => 'cachePoint' in block)
774
- ).toBe(false);
775
- }
776
- });
777
- });
778
-
779
- describe('synthetic skill/meta messages are not cache-anchored', () => {
780
- const hasAnthropicMarker = (m: BaseMessage): boolean =>
781
- Array.isArray(m.content) &&
782
- m.content.some((block) => 'cache_control' in block);
783
-
784
- const hasBedrockCachePoint = (m: BaseMessage): boolean =>
785
- Array.isArray(m.content) &&
786
- m.content.some((block) => 'cachePoint' in block);
787
-
788
- const skillBody = (skillName: string, content = 'SKILL BODY'): HumanMessage =>
789
- new HumanMessage({
790
- content,
791
- additional_kwargs: { isMeta: true, source: 'skill', skillName },
792
- });
793
-
794
- it('Anthropic: skips a trailing synthetic skill message; markers land on the real user messages', () => {
795
- const messages: BaseMessage[] = [
796
- new HumanMessage('First real question'),
797
- new AIMessage('Answer'),
798
- new HumanMessage('Second real question'),
799
- skillBody('pdf-analyzer'),
800
- ];
801
-
802
- const result = addCacheControl<BaseMessage>(messages);
803
-
804
- expect(hasAnthropicMarker(result[3])).toBe(false);
805
- expect(hasAnthropicMarker(result[2])).toBe(true);
806
- expect(hasAnthropicMarker(result[0])).toBe(true);
807
- });
808
-
809
- it('Anthropic: strips a stale marker from a synthetic skill message without re-adding one', () => {
810
- const stale = new HumanMessage({
811
- content: toLangChainContent([
812
- {
813
- type: 'text',
814
- text: 'SKILL BODY',
815
- cache_control: { type: 'ephemeral' },
816
- } as MessageContentComplex,
817
- ]),
818
- additional_kwargs: {
819
- isMeta: true,
820
- source: 'skill',
821
- skillName: 'pdf-analyzer',
822
- },
823
- });
824
- const messages: BaseMessage[] = [
825
- new HumanMessage('Real question'),
826
- new AIMessage('Answer'),
827
- stale,
828
- ];
829
-
830
- const result = addCacheControl<BaseMessage>(messages);
831
-
832
- expect(hasAnthropicMarker(result[2])).toBe(false);
833
- expect(hasAnthropicMarker(result[0])).toBe(true);
834
- });
835
-
836
- it('Anthropic: detects skill messages by additional_kwargs.source even without isMeta', () => {
837
- const messages: BaseMessage[] = [
838
- new HumanMessage('Real question'),
839
- new AIMessage('Answer'),
840
- new HumanMessage({
841
- content: 'SKILL BODY',
842
- additional_kwargs: { source: 'skill', skillName: 'pdf-analyzer' },
843
- }),
844
- ];
845
-
846
- const result = addCacheControl<BaseMessage>(messages);
847
-
848
- expect(hasAnthropicMarker(result[2])).toBe(false);
849
- expect(hasAnthropicMarker(result[0])).toBe(true);
850
- });
851
-
852
- it('Bedrock: skips a trailing synthetic skill message; cachePoints land on the real user messages', () => {
853
- const messages: BaseMessage[] = [
854
- new HumanMessage('First real question'),
855
- new AIMessage('Answer'),
856
- new HumanMessage('Second real question'),
857
- skillBody('pdf-analyzer'),
858
- ];
859
-
860
- const result = addBedrockCacheControl<BaseMessage>(messages);
861
-
862
- expect(hasBedrockCachePoint(result[3])).toBe(false);
863
- expect(hasBedrockCachePoint(result[2])).toBe(true);
864
- expect(hasBedrockCachePoint(result[0])).toBe(true);
865
- });
866
-
867
- it('stable-prefix fallback: anchors the real user message, not a synthetic skill message', () => {
868
- // Mirrors AgentContext's dynamic-tail path: the only assistant message is a
869
- // skill-only tool call (no text), so the assistant-only pass adds no marker
870
- // and the cacheable fallback runs. It must skip the reconstructed skill
871
- // HumanMessage and anchor the real user message instead.
872
- const messages: BaseMessage[] = [
873
- new HumanMessage('Real stable question'),
874
- new AIMessage({
875
- content: toLangChainContent([
876
- {
877
- type: 'tool_use',
878
- id: 'call_1',
879
- name: 'skill',
880
- input: { skillName: 'pdf-analyzer' },
881
- } as MessageContentComplex,
882
- ]),
883
- tool_calls: [
884
- { id: 'call_1', name: 'skill', args: { skillName: 'pdf-analyzer' } },
885
- ],
886
- }),
887
- skillBody('pdf-analyzer'),
888
- ];
889
-
890
- const result = addCacheControlToStablePrefixMessages<BaseMessage>(
891
- messages,
892
- 2
893
- );
894
-
895
- expect(hasAnthropicMarker(result[2])).toBe(false);
896
- expect(hasAnthropicMarker(result[0])).toBe(true);
897
- });
898
- });
899
-
900
- describe('supportsBedrockToolCache', () => {
901
- test('returns true for Claude model ids (incl. cross-region + profile)', () => {
902
- expect(
903
- supportsBedrockToolCache('anthropic.claude-3-5-sonnet-20241022-v2:0')
904
- ).toBe(true);
905
- expect(
906
- supportsBedrockToolCache('us.anthropic.claude-sonnet-4-5-20250929-v1:0')
907
- ).toBe(true);
908
- expect(supportsBedrockToolCache('anthropic.claude-opus-4-6-v1')).toBe(true);
909
- });
910
-
911
- test('returns false for Nova and other non-Claude families (tool cache only)', () => {
912
- // Nova accepts system/message cachePoints but rejects the tool checkpoint.
913
- expect(supportsBedrockToolCache('us.amazon.nova-pro-v1:0')).toBe(false);
914
- expect(supportsBedrockToolCache('amazon.nova-lite-v1:0')).toBe(false);
915
- expect(supportsBedrockToolCache('meta.llama3-1-70b-instruct-v1:0')).toBe(
916
- false
917
- );
918
- expect(supportsBedrockToolCache('mistral.mistral-large-2407-v1:0')).toBe(
919
- false
920
- );
921
- });
922
-
923
- test('returns false for empty / missing model', () => {
924
- expect(supportsBedrockToolCache('')).toBe(false);
925
- expect(supportsBedrockToolCache(undefined)).toBe(false);
926
- expect(supportsBedrockToolCache(null)).toBe(false);
927
- });
928
- });
929
-
930
- describe('resolveBedrockPromptCacheTtl', () => {
931
- test('Claude: defaults to 1h and honors an explicit ttl', () => {
932
- const claude = 'us.anthropic.claude-sonnet-4-5-20250929-v1:0';
933
- expect(resolveBedrockPromptCacheTtl(undefined, claude)).toBe('1h');
934
- expect(resolveBedrockPromptCacheTtl('1h', claude)).toBe('1h');
935
- expect(resolveBedrockPromptCacheTtl('5m', claude)).toBe('5m');
936
- });
937
-
938
- test('Nova: clamps to 5m even when 1h is configured (extended TTL Anthropic-only)', () => {
939
- const nova = 'us.amazon.nova-lite-v1:0';
940
- expect(resolveBedrockPromptCacheTtl(undefined, nova)).toBe('5m');
941
- expect(resolveBedrockPromptCacheTtl('1h', nova)).toBe('5m');
942
- expect(resolveBedrockPromptCacheTtl('5m', nova)).toBe('5m');
943
- });
944
-
945
- test('other non-Claude families clamp to 5m', () => {
946
- expect(
947
- resolveBedrockPromptCacheTtl('1h', 'meta.llama3-1-70b-instruct-v1:0')
948
- ).toBe('5m');
949
- expect(
950
- resolveBedrockPromptCacheTtl('1h', 'mistral.mistral-large-2407-v1:0')
951
- ).toBe('5m');
952
- });
953
-
954
- test('omitted model defaults to Claude behavior (1h)', () => {
955
- expect(resolveBedrockPromptCacheTtl(undefined, undefined)).toBe('1h');
956
- expect(resolveBedrockPromptCacheTtl(undefined, null)).toBe('1h');
957
- expect(resolveBedrockPromptCacheTtl('1h', undefined)).toBe('1h');
958
- });
959
- });
960
-
961
- describe('stripAnthropicCacheControl', () => {
962
- it('removes cache_control fields from content blocks', () => {
963
- const messages: TestMsg[] = [
964
- {
965
- role: 'user',
966
- content: [
967
- {
968
- type: ContentTypes.TEXT,
969
- text: 'Hello',
970
- cache_control: { type: 'ephemeral' },
971
- } as MessageContentComplex,
972
- ],
973
- },
974
- {
975
- role: 'assistant',
976
- content: [
977
- {
978
- type: ContentTypes.TEXT,
979
- text: 'Hi there',
980
- cache_control: { type: 'ephemeral' },
981
- } as MessageContentComplex,
982
- ],
983
- },
984
- ];
985
-
986
- const result = stripAnthropicCacheControl(messages);
987
-
988
- const firstContent = result[0].content as MessageContentComplex[];
989
- const secondContent = result[1].content as MessageContentComplex[];
990
-
991
- expect(firstContent[0]).toEqual({
992
- type: ContentTypes.TEXT,
993
- text: 'Hello',
994
- });
995
- expect('cache_control' in firstContent[0]).toBe(false);
996
-
997
- expect(secondContent[0]).toEqual({
998
- type: ContentTypes.TEXT,
999
- text: 'Hi there',
1000
- });
1001
- expect('cache_control' in secondContent[0]).toBe(false);
1002
- });
1003
-
1004
- it('handles messages without cache_control gracefully', () => {
1005
- const messages: TestMsg[] = [
1006
- {
1007
- role: 'user',
1008
- content: [{ type: ContentTypes.TEXT, text: 'Hello' }],
1009
- },
1010
- ];
1011
-
1012
- const result = stripAnthropicCacheControl(messages);
1013
-
1014
- expect(result[0].content).toEqual([
1015
- { type: ContentTypes.TEXT, text: 'Hello' },
1016
- ]);
1017
- });
1018
-
1019
- it('handles string content gracefully', () => {
1020
- const messages: TestMsg[] = [
1021
- {
1022
- role: 'user',
1023
- content: 'Hello',
1024
- },
1025
- ];
1026
-
1027
- const result = stripAnthropicCacheControl(messages);
1028
-
1029
- expect(result[0].content).toBe('Hello');
1030
- });
1031
-
1032
- it('ignores primitive and proxy blocks without invoking proxy traps', () => {
1033
- const unsafe = new Proxy(
1034
- {},
1035
- {
1036
- ownKeys() {
1037
- throw new Error('proxy keys must not be inspected');
1038
- },
1039
- }
1040
- );
1041
- const content = [
1042
- 'primitive',
1043
- unsafe,
1044
- {
1045
- type: ContentTypes.TEXT,
1046
- text: 'cached',
1047
- cache_control: { type: 'ephemeral' },
1048
- },
1049
- ] as unknown as MessageContentComplex[];
1050
-
1051
- const result = stripAnthropicCacheControl([{ role: 'user', content }]);
1052
- const stripped = result[0].content as unknown[];
1053
-
1054
- expect(stripped[0]).toBe('primitive');
1055
- expect(stripped[1]).toBe(unsafe);
1056
- expect(stripped[2]).toEqual({
1057
- type: ContentTypes.TEXT,
1058
- text: 'cached',
1059
- });
1060
- });
1061
-
1062
- it('removes a non-configurable cache_control from the clone only', () => {
1063
- const block = { type: ContentTypes.TEXT, text: 'cached' };
1064
- Object.defineProperty(block, 'cache_control', {
1065
- configurable: false,
1066
- enumerable: true,
1067
- value: { type: 'ephemeral' },
1068
- writable: false,
1069
- });
1070
- const messages = [
1071
- {
1072
- role: 'user',
1073
- content: [block as MessageContentComplex],
1074
- },
1075
- ];
1076
-
1077
- const result = stripAnthropicCacheControl(messages);
1078
- const stripped = (result[0].content as MessageContentComplex[])[0];
1079
-
1080
- expect('cache_control' in stripped).toBe(false);
1081
- expect(
1082
- (block as typeof block & { cache_control: unknown }).cache_control
1083
- ).toEqual({ type: 'ephemeral' });
1084
- });
1085
-
1086
- it('removes an accessor cache_control without invoking it', () => {
1087
- let getterCalls = 0;
1088
- const block = { type: ContentTypes.TEXT, text: 'cached' };
1089
- Object.defineProperty(block, 'cache_control', {
1090
- configurable: true,
1091
- enumerable: true,
1092
- get() {
1093
- getterCalls++;
1094
- throw new Error('cache getter must not run');
1095
- },
1096
- });
1097
-
1098
- const result = stripAnthropicCacheControl([
1099
- {
1100
- role: 'user',
1101
- content: [block as MessageContentComplex],
1102
- },
1103
- ]);
1104
- const stripped = (result[0].content as MessageContentComplex[])[0];
1105
-
1106
- expect(getterCalls).toBe(0);
1107
- expect('cache_control' in stripped).toBe(false);
1108
- expect(
1109
- Object.getOwnPropertyDescriptor(block, 'cache_control')
1110
- ).toBeDefined();
1111
- });
1112
-
1113
- it('returns non-array input unchanged', () => {
1114
- const notArray = 'not an array';
1115
- /** @ts-expect-error - Testing invalid input */
1116
- const result = stripAnthropicCacheControl(notArray);
1117
- expect(result).toBe('not an array');
1118
- });
1119
- });
1120
-
1121
- describe('stripBedrockCacheControl', () => {
1122
- it('removes cachePoint blocks from content arrays', () => {
1123
- const messages: TestMsg[] = [
1124
- {
1125
- role: 'user',
1126
- content: [
1127
- { type: ContentTypes.TEXT, text: 'Hello' },
1128
- { cachePoint: { type: 'default' } },
1129
- ],
1130
- },
1131
- {
1132
- role: 'assistant',
1133
- content: [
1134
- { type: ContentTypes.TEXT, text: 'Hi there' },
1135
- { cachePoint: { type: 'default' } },
1136
- ],
1137
- },
1138
- ];
1139
-
1140
- const result = stripBedrockCacheControl(messages);
1141
-
1142
- const firstContent = result[0].content as MessageContentComplex[];
1143
- const secondContent = result[1].content as MessageContentComplex[];
1144
-
1145
- expect(firstContent.length).toBe(1);
1146
- expect(firstContent[0]).toEqual({
1147
- type: ContentTypes.TEXT,
1148
- text: 'Hello',
1149
- });
1150
-
1151
- expect(secondContent.length).toBe(1);
1152
- expect(secondContent[0]).toEqual({
1153
- type: ContentTypes.TEXT,
1154
- text: 'Hi there',
1155
- });
1156
- });
1157
-
1158
- it('ignores primitive and proxy blocks while removing cache points', () => {
1159
- let getterCalls = 0;
1160
- const unsafe = new Proxy(
1161
- {},
1162
- {
1163
- getOwnPropertyDescriptor() {
1164
- throw new Error('proxy descriptors must not be inspected');
1165
- },
1166
- }
1167
- );
1168
- const accessorCachePoint = {};
1169
- Object.defineProperty(accessorCachePoint, 'cachePoint', {
1170
- configurable: true,
1171
- enumerable: true,
1172
- get() {
1173
- getterCalls++;
1174
- throw new Error('cache point getter must not run');
1175
- },
1176
- });
1177
- const content = [
1178
- 42,
1179
- unsafe,
1180
- accessorCachePoint,
1181
- { cachePoint: { type: 'default' } },
1182
- ] as unknown as MessageContentComplex[];
1183
-
1184
- const result = stripBedrockCacheControl([{ role: 'user', content }]);
1185
-
1186
- expect(result[0].content).toEqual([42, unsafe]);
1187
- expect(getterCalls).toBe(0);
1188
- });
1189
-
1190
- it('handles messages without cachePoint blocks gracefully', () => {
1191
- const messages: TestMsg[] = [
1192
- {
1193
- role: 'user',
1194
- content: [{ type: ContentTypes.TEXT, text: 'Hello' }],
1195
- },
1196
- ];
1197
-
1198
- const result = stripBedrockCacheControl(messages);
1199
-
1200
- expect(result[0].content).toEqual([
1201
- { type: ContentTypes.TEXT, text: 'Hello' },
1202
- ]);
1203
- });
1204
-
1205
- it('handles string content gracefully', () => {
1206
- const messages: TestMsg[] = [
1207
- {
1208
- role: 'user',
1209
- content: 'Hello',
1210
- },
1211
- ];
1212
-
1213
- const result = stripBedrockCacheControl(messages);
1214
-
1215
- expect(result[0].content).toBe('Hello');
1216
- });
1217
-
1218
- it('preserves content with type field', () => {
1219
- const messages: TestMsg[] = [
1220
- {
1221
- role: 'user',
1222
- content: [
1223
- { type: ContentTypes.TEXT, text: 'Hello' },
1224
- {
1225
- type: ContentTypes.IMAGE_FILE,
1226
- image_file: { file_id: 'file_123' },
1227
- },
1228
- { cachePoint: { type: 'default' } },
1229
- ],
1230
- },
1231
- ];
1232
-
1233
- const result = stripBedrockCacheControl(messages);
1234
-
1235
- const content = result[0].content as MessageContentComplex[];
1236
-
1237
- expect(content.length).toBe(2);
1238
- expect(content[0]).toEqual({ type: ContentTypes.TEXT, text: 'Hello' });
1239
- expect(content[1]).toEqual({
1240
- type: ContentTypes.IMAGE_FILE,
1241
- image_file: { file_id: 'file_123' },
1242
- });
1243
- });
1244
-
1245
- it('returns non-array input unchanged', () => {
1246
- const notArray = 'not an array';
1247
- /** @ts-expect-error - Testing invalid input */
1248
- const result = stripBedrockCacheControl(notArray);
1249
- expect(result).toBe('not an array');
1250
- });
1251
- });
1252
-
1253
- describe('Multi-agent provider interoperability', () => {
1254
- it('strips Bedrock cache before applying Anthropic cache (single pass)', () => {
1255
- const messages: TestMsg[] = [
1256
- {
1257
- role: 'user',
1258
- content: [
1259
- { type: ContentTypes.TEXT, text: 'First message' },
1260
- { cachePoint: { type: 'default' } },
1261
- ],
1262
- },
1263
- {
1264
- role: 'assistant',
1265
- content: [
1266
- { type: ContentTypes.TEXT, text: 'Response' },
1267
- { cachePoint: { type: 'default' } },
1268
- ],
1269
- },
1270
- ];
1271
-
1272
- /** @ts-expect-error - Testing cross-provider compatibility */
1273
- const result = addCacheControl(messages);
1274
-
1275
- const firstContent = result[0].content as MessageContentComplex[];
1276
-
1277
- expect(firstContent.some((b) => 'cachePoint' in b)).toBe(false);
1278
- expect('cache_control' in firstContent[0]).toBe(true);
1279
- });
1280
-
1281
- it('strips Anthropic cache before applying Bedrock cache (single pass)', () => {
1282
- const messages: TestMsg[] = [
1283
- {
1284
- role: 'user',
1285
- content: [
1286
- {
1287
- type: ContentTypes.TEXT,
1288
- text: 'First message',
1289
- cache_control: { type: 'ephemeral' },
1290
- } as MessageContentComplex,
1291
- ],
1292
- },
1293
- {
1294
- role: 'assistant',
1295
- content: [
1296
- {
1297
- type: ContentTypes.TEXT,
1298
- text: 'Response',
1299
- cache_control: { type: 'ephemeral' },
1300
- } as MessageContentComplex,
1301
- ],
1302
- },
1303
- ];
1304
-
1305
- const result = addBedrockCacheControl(messages);
1306
-
1307
- const firstContent = result[0].content as MessageContentComplex[];
1308
- const secondContent = result[1].content as MessageContentComplex[];
1309
-
1310
- expect('cache_control' in firstContent[0]).toBe(false);
1311
- expect('cache_control' in secondContent[0]).toBe(false);
1312
-
1313
- expect(firstContent.some((b) => 'cachePoint' in b)).toBe(true);
1314
- expect(secondContent.some((b) => 'cachePoint' in b)).toBe(false);
1315
- });
1316
-
1317
- it('strips Bedrock cache using separate function (backwards compat)', () => {
1318
- const messages: TestMsg[] = [
1319
- {
1320
- role: 'user',
1321
- content: [
1322
- { type: ContentTypes.TEXT, text: 'First message' },
1323
- { cachePoint: { type: 'default' } },
1324
- ],
1325
- },
1326
- ];
1327
-
1328
- const stripped = stripBedrockCacheControl(messages);
1329
- const firstContent = stripped[0].content as MessageContentComplex[];
1330
-
1331
- expect(firstContent.some((b) => 'cachePoint' in b)).toBe(false);
1332
- expect(firstContent.length).toBe(1);
1333
- });
1334
-
1335
- it('strips Anthropic cache using separate function (backwards compat)', () => {
1336
- const messages: TestMsg[] = [
1337
- {
1338
- role: 'user',
1339
- content: [
1340
- {
1341
- type: ContentTypes.TEXT,
1342
- text: 'First message',
1343
- cache_control: { type: 'ephemeral' },
1344
- } as MessageContentComplex,
1345
- ],
1346
- },
1347
- ];
1348
-
1349
- const stripped = stripAnthropicCacheControl(messages);
1350
- const firstContent = stripped[0].content as MessageContentComplex[];
1351
-
1352
- expect('cache_control' in firstContent[0]).toBe(false);
1353
- });
1354
- });
1355
-
1356
- describe('Immutability - addCacheControl does not mutate original messages', () => {
1357
- it('should not mutate original messages when adding cache control to string content', () => {
1358
- const originalMessages: TestMsg[] = [
1359
- { role: 'user', content: 'Hello' },
1360
- { role: 'assistant', content: 'Hi there' },
1361
- { role: 'user', content: 'How are you?' },
1362
- ];
1363
-
1364
- const originalFirstContent = originalMessages[0].content;
1365
- const originalThirdContent = originalMessages[2].content;
1366
-
1367
- const result = addCacheControl(originalMessages as never);
1368
-
1369
- expect(originalMessages[0].content).toBe(originalFirstContent);
1370
- expect(originalMessages[2].content).toBe(originalThirdContent);
1371
- expect(typeof originalMessages[0].content).toBe('string');
1372
- expect(typeof originalMessages[2].content).toBe('string');
1373
-
1374
- expect(Array.isArray(result[0].content)).toBe(true);
1375
- expect(Array.isArray(result[2].content)).toBe(true);
1376
- });
1377
-
1378
- it('should not mutate original messages when adding cache control to array content', () => {
1379
- const originalMessages: TestMsg[] = [
1380
- {
1381
- role: 'user',
1382
- content: [{ type: ContentTypes.TEXT, text: 'Hello' }],
1383
- },
1384
- { role: 'assistant', content: 'Hi there' },
1385
- {
1386
- role: 'user',
1387
- content: [{ type: ContentTypes.TEXT, text: 'How are you?' }],
1388
- },
1389
- ];
1390
-
1391
- const originalFirstBlock = {
1392
- ...(originalMessages[0].content as MessageContentComplex[])[0],
1393
- };
1394
- const originalThirdBlock = {
1395
- ...(originalMessages[2].content as MessageContentComplex[])[0],
1396
- };
1397
-
1398
- const result = addCacheControl(originalMessages as never);
1399
-
1400
- const firstContent = originalMessages[0].content as MessageContentComplex[];
1401
- const thirdContent = originalMessages[2].content as MessageContentComplex[];
1402
-
1403
- expect('cache_control' in firstContent[0]).toBe(false);
1404
- expect('cache_control' in thirdContent[0]).toBe(false);
1405
- expect(firstContent[0]).toEqual(originalFirstBlock);
1406
- expect(thirdContent[0]).toEqual(originalThirdBlock);
1407
-
1408
- const resultFirstContent = result[0].content as MessageContentComplex[];
1409
- const resultThirdContent = result[2].content as MessageContentComplex[];
1410
- expect('cache_control' in resultFirstContent[0]).toBe(true);
1411
- expect('cache_control' in resultThirdContent[0]).toBe(true);
1412
- });
1413
-
1414
- it('should not mutate original messages when stripping existing cache control', () => {
1415
- const originalMessages: TestMsg[] = [
1416
- {
1417
- role: 'user',
1418
- content: [
1419
- {
1420
- type: ContentTypes.TEXT,
1421
- text: 'Hello',
1422
- cache_control: { type: 'ephemeral' },
1423
- } as MessageContentComplex,
1424
- ],
1425
- },
1426
- { role: 'assistant', content: 'Hi there' },
1427
- {
1428
- role: 'user',
1429
- content: [{ type: ContentTypes.TEXT, text: 'How are you?' }],
1430
- },
1431
- ];
1432
-
1433
- const originalFirstBlock = (
1434
- originalMessages[0].content as MessageContentComplex[]
1435
- )[0];
1436
-
1437
- addCacheControl(originalMessages as never);
1438
-
1439
- expect('cache_control' in originalFirstBlock).toBe(true);
1440
- });
1441
-
1442
- it('should remove lc_kwargs to prevent serialization mismatch for LangChain messages', () => {
1443
- type LangChainLikeMsg = TestMsg & {
1444
- lc_kwargs?: { content?: MessageContentComplex[] };
1445
- };
1446
-
1447
- const messagesWithLcKwargs: LangChainLikeMsg[] = [
1448
- {
1449
- role: 'user',
1450
- content: [{ type: ContentTypes.TEXT, text: 'First user message' }],
1451
- lc_kwargs: {
1452
- content: [{ type: ContentTypes.TEXT, text: 'First user message' }],
1453
- },
1454
- },
1455
- {
1456
- role: 'assistant',
1457
- content: [{ type: ContentTypes.TEXT, text: 'Assistant response' }],
1458
- lc_kwargs: {
1459
- content: [{ type: ContentTypes.TEXT, text: 'Assistant response' }],
1460
- },
1461
- },
1462
- {
1463
- role: 'user',
1464
- content: [{ type: ContentTypes.TEXT, text: 'Second user message' }],
1465
- lc_kwargs: {
1466
- content: [{ type: ContentTypes.TEXT, text: 'Second user message' }],
1467
- },
1468
- },
1469
- ];
1470
-
1471
- const result = addCacheControl(messagesWithLcKwargs as never);
1472
-
1473
- const resultFirst = result[0] as LangChainLikeMsg;
1474
- const resultThird = result[2] as LangChainLikeMsg;
1475
-
1476
- expect(resultFirst.lc_kwargs).toBeUndefined();
1477
- expect(resultThird.lc_kwargs).toBeUndefined();
1478
-
1479
- const firstContent = resultFirst.content as MessageContentComplex[];
1480
- expect('cache_control' in firstContent[0]).toBe(true);
1481
-
1482
- const originalFirst = messagesWithLcKwargs[0];
1483
- const originalContent = originalFirst.content as MessageContentComplex[];
1484
- const originalLcContent = originalFirst.lc_kwargs
1485
- ?.content as MessageContentComplex[];
1486
- expect('cache_control' in originalContent[0]).toBe(false);
1487
- expect('cache_control' in originalLcContent[0]).toBe(false);
1488
- });
1489
- });
1490
-
1491
- describe('Immutability - addBedrockCacheControl does not mutate original messages', () => {
1492
- it('should not mutate original messages when adding cache points to string content', () => {
1493
- const originalMessages: TestMsg[] = [
1494
- { role: 'user', content: 'Hello' },
1495
- { role: 'assistant', content: 'Hi there' },
1496
- ];
1497
-
1498
- const originalFirstContent = originalMessages[0].content;
1499
- const originalSecondContent = originalMessages[1].content;
1500
-
1501
- const result = addBedrockCacheControl(originalMessages);
1502
-
1503
- expect(originalMessages[0].content).toBe(originalFirstContent);
1504
- expect(originalMessages[1].content).toBe(originalSecondContent);
1505
- expect(typeof originalMessages[0].content).toBe('string');
1506
- expect(typeof originalMessages[1].content).toBe('string');
1507
-
1508
- expect(Array.isArray(result[0].content)).toBe(true);
1509
- expect(result[1].content).toBe('Hi there');
1510
- });
1511
-
1512
- it('should not mutate original messages when adding cache points to array content', () => {
1513
- const originalMessages: TestMsg[] = [
1514
- {
1515
- role: 'user',
1516
- content: [{ type: ContentTypes.TEXT, text: 'Hello' }],
1517
- },
1518
- {
1519
- role: 'assistant',
1520
- content: [{ type: ContentTypes.TEXT, text: 'Hi there' }],
1521
- },
1522
- ];
1523
-
1524
- const originalFirstContentLength = (
1525
- originalMessages[0].content as MessageContentComplex[]
1526
- ).length;
1527
- const originalSecondContentLength = (
1528
- originalMessages[1].content as MessageContentComplex[]
1529
- ).length;
1530
-
1531
- const result = addBedrockCacheControl(originalMessages);
1532
-
1533
- const firstContent = originalMessages[0].content as MessageContentComplex[];
1534
- const secondContent = originalMessages[1]
1535
- .content as MessageContentComplex[];
1536
-
1537
- expect(firstContent.length).toBe(originalFirstContentLength);
1538
- expect(secondContent.length).toBe(originalSecondContentLength);
1539
- expect(firstContent.some((b) => 'cachePoint' in b)).toBe(false);
1540
- expect(secondContent.some((b) => 'cachePoint' in b)).toBe(false);
1541
-
1542
- const resultFirstContent = result[0].content as MessageContentComplex[];
1543
- const resultSecondContent = result[1].content as MessageContentComplex[];
1544
- expect(resultFirstContent.length).toBe(originalFirstContentLength + 1);
1545
- expect(resultSecondContent.length).toBe(originalSecondContentLength);
1546
- expect(resultFirstContent.some((b) => 'cachePoint' in b)).toBe(true);
1547
- expect(resultSecondContent.some((b) => 'cachePoint' in b)).toBe(false);
1548
- });
1549
-
1550
- it('should not mutate original messages when stripping existing cache control', () => {
1551
- const originalMessages: TestMsg[] = [
1552
- {
1553
- role: 'user',
1554
- content: [
1555
- {
1556
- type: ContentTypes.TEXT,
1557
- text: 'Hello',
1558
- cache_control: { type: 'ephemeral' },
1559
- } as MessageContentComplex,
1560
- ],
1561
- },
1562
- {
1563
- role: 'assistant',
1564
- content: [
1565
- { type: ContentTypes.TEXT, text: 'Hi there' },
1566
- { cachePoint: { type: 'default' } },
1567
- ],
1568
- },
1569
- ];
1570
-
1571
- const originalFirstBlock = (
1572
- originalMessages[0].content as MessageContentComplex[]
1573
- )[0];
1574
- const originalSecondContentLength = (
1575
- originalMessages[1].content as MessageContentComplex[]
1576
- ).length;
1577
-
1578
- addBedrockCacheControl(originalMessages);
1579
-
1580
- expect('cache_control' in originalFirstBlock).toBe(true);
1581
- expect(
1582
- (originalMessages[1].content as MessageContentComplex[]).length
1583
- ).toBe(originalSecondContentLength);
1584
- });
1585
-
1586
- it('should allow different providers to process same messages without cross-contamination', () => {
1587
- const sharedMessages: TestMsg[] = [
1588
- {
1589
- role: 'user',
1590
- content: [{ type: ContentTypes.TEXT, text: 'Shared message 1' }],
1591
- },
1592
- {
1593
- role: 'assistant',
1594
- content: [{ type: ContentTypes.TEXT, text: 'Shared response 1' }],
1595
- },
1596
- ];
1597
-
1598
- const bedrockResult = addBedrockCacheControl(sharedMessages);
1599
-
1600
- const anthropicResult = addCacheControl(sharedMessages as never);
1601
-
1602
- const originalFirstContent = sharedMessages[0]
1603
- .content as MessageContentComplex[];
1604
- expect(originalFirstContent.some((b) => 'cachePoint' in b)).toBe(false);
1605
- expect('cache_control' in originalFirstContent[0]).toBe(false);
1606
-
1607
- const bedrockFirstContent = bedrockResult[0]
1608
- .content as MessageContentComplex[];
1609
- expect(bedrockFirstContent.some((b) => 'cachePoint' in b)).toBe(true);
1610
- expect('cache_control' in bedrockFirstContent[0]).toBe(false);
1611
-
1612
- const anthropicFirstContent = anthropicResult[0]
1613
- .content as MessageContentComplex[];
1614
- expect(anthropicFirstContent.some((b) => 'cachePoint' in b)).toBe(false);
1615
- expect('cache_control' in anthropicFirstContent[0]).toBe(true);
1616
- });
1617
-
1618
- it('should remove lc_kwargs to prevent serialization mismatch for LangChain messages', () => {
1619
- type LangChainLikeMsg = TestMsg & {
1620
- lc_kwargs?: { content?: MessageContentComplex[] };
1621
- };
1622
-
1623
- const messagesWithLcKwargs: LangChainLikeMsg[] = [
1624
- {
1625
- role: 'user',
1626
- content: [{ type: ContentTypes.TEXT, text: 'User message' }],
1627
- lc_kwargs: {
1628
- content: [{ type: ContentTypes.TEXT, text: 'User message' }],
1629
- },
1630
- },
1631
- {
1632
- role: 'assistant',
1633
- content: [{ type: ContentTypes.TEXT, text: 'Assistant response' }],
1634
- lc_kwargs: {
1635
- content: [{ type: ContentTypes.TEXT, text: 'Assistant response' }],
1636
- },
1637
- },
1638
- ];
1639
-
1640
- const bedrockResult = addBedrockCacheControl(messagesWithLcKwargs);
1641
-
1642
- const resultFirst = bedrockResult[0] as LangChainLikeMsg;
1643
- const resultSecond = bedrockResult[1] as LangChainLikeMsg;
1644
-
1645
- expect(resultFirst.lc_kwargs).toBeUndefined();
1646
- expect(resultSecond.lc_kwargs).toBeUndefined();
1647
-
1648
- const firstContent = resultFirst.content as MessageContentComplex[];
1649
- expect(firstContent.some((b) => 'cachePoint' in b)).toBe(true);
1650
-
1651
- const originalFirst = messagesWithLcKwargs[0];
1652
- const originalContent = originalFirst.content as MessageContentComplex[];
1653
- const originalLcContent = originalFirst.lc_kwargs
1654
- ?.content as MessageContentComplex[];
1655
- expect(originalContent.some((b) => 'cachePoint' in b)).toBe(false);
1656
- expect(originalLcContent.some((b) => 'cachePoint' in b)).toBe(false);
1657
- });
1658
- });
1659
-
1660
- describe('Multi-turn cache cleanup', () => {
1661
- it('strips stale Bedrock cache points from previous turns before applying new ones', () => {
1662
- const messages: TestMsg[] = [
1663
- {
1664
- role: 'user',
1665
- content: [
1666
- { type: ContentTypes.TEXT, text: 'Turn 1 message 1' },
1667
- { cachePoint: { type: 'default' } },
1668
- ],
1669
- },
1670
- {
1671
- role: 'assistant',
1672
- content: [
1673
- { type: ContentTypes.TEXT, text: 'Turn 1 response 1' },
1674
- { cachePoint: { type: 'default' } },
1675
- ],
1676
- },
1677
- {
1678
- role: 'user',
1679
- content: [{ type: ContentTypes.TEXT, text: 'Turn 2 message 2' }],
1680
- },
1681
- {
1682
- role: 'assistant',
1683
- content: [{ type: ContentTypes.TEXT, text: 'Turn 2 response 2' }],
1684
- },
1685
- ];
1686
-
1687
- const result = addBedrockCacheControl(messages);
1688
-
1689
- const cachePointCount = result.reduce((count, msg) => {
1690
- if (Array.isArray(msg.content)) {
1691
- return (
1692
- count +
1693
- msg.content.filter(
1694
- (block) => 'cachePoint' in block && !('type' in block)
1695
- ).length
1696
- );
1697
- }
1698
- return count;
1699
- }, 0);
1700
-
1701
- expect(cachePointCount).toBe(2);
1702
-
1703
- const lastContent = result[3].content as MessageContentComplex[];
1704
- const secondLastContent = result[2].content as MessageContentComplex[];
1705
-
1706
- expect(lastContent.some((b) => 'cachePoint' in b)).toBe(false);
1707
- expect(secondLastContent.some((b) => 'cachePoint' in b)).toBe(true);
1708
-
1709
- const firstContent = result[0].content as MessageContentComplex[];
1710
- const secondContent = result[1].content as MessageContentComplex[];
1711
-
1712
- expect(firstContent.some((b) => 'cachePoint' in b)).toBe(true);
1713
- expect(secondContent.some((b) => 'cachePoint' in b)).toBe(false);
1714
- });
1715
-
1716
- it('strips stale Anthropic cache_control from previous turns before applying new ones', () => {
1717
- const messages: TestMsg[] = [
1718
- {
1719
- role: 'user',
1720
- content: [
1721
- {
1722
- type: ContentTypes.TEXT,
1723
- text: 'Turn 1 message 1',
1724
- cache_control: { type: 'ephemeral' },
1725
- } as MessageContentComplex,
1726
- ],
1727
- },
1728
- {
1729
- role: 'assistant',
1730
- content: [{ type: ContentTypes.TEXT, text: 'Turn 1 response 1' }],
1731
- },
1732
- {
1733
- role: 'user',
1734
- content: [
1735
- {
1736
- type: ContentTypes.TEXT,
1737
- text: 'Turn 2 message 2',
1738
- cache_control: { type: 'ephemeral' },
1739
- } as MessageContentComplex,
1740
- ],
1741
- },
1742
- {
1743
- role: 'assistant',
1744
- content: [{ type: ContentTypes.TEXT, text: 'Turn 2 response 2' }],
1745
- },
1746
- {
1747
- role: 'user',
1748
- content: [{ type: ContentTypes.TEXT, text: 'Turn 3 message 3' }],
1749
- },
1750
- ];
1751
-
1752
- /** @ts-expect-error - Testing cross-provider compatibility */
1753
- const result = addCacheControl(messages);
1754
-
1755
- const cacheControlCount = result.reduce((count, msg) => {
1756
- if (Array.isArray(msg.content)) {
1757
- return (
1758
- count +
1759
- msg.content.filter(
1760
- (block) => 'cache_control' in block && 'type' in block
1761
- ).length
1762
- );
1763
- }
1764
- return count;
1765
- }, 0);
1766
-
1767
- expect(cacheControlCount).toBe(2);
1768
-
1769
- const lastContent = result[4].content as MessageContentComplex[];
1770
- const thirdContent = result[2].content as MessageContentComplex[];
1771
-
1772
- expect('cache_control' in lastContent[0]).toBe(true);
1773
- expect('cache_control' in thirdContent[0]).toBe(true);
1774
-
1775
- const firstContent = result[0].content as MessageContentComplex[];
1776
-
1777
- expect('cache_control' in firstContent[0]).toBe(false);
1778
- });
1779
- });
1780
-
1781
- describe('LangChain message type preservation', () => {
1782
- it('preserves direct roles for formatted LangChain messages after addCacheControl', () => {
1783
- const { messages } = formatAgentMessages([
1784
- { role: 'user', content: 'Hello' },
1785
- { role: 'assistant', content: 'Hi there' },
1786
- { role: 'user', content: 'Thanks' },
1787
- ]);
1788
-
1789
- const result = addCacheControl(messages);
1790
-
1791
- expect(result.map((message) => message.role)).toEqual([
1792
- 'user',
1793
- 'assistant',
1794
- 'user',
1795
- ]);
1796
- expect(result[0]).toBeInstanceOf(HumanMessage);
1797
- expect(result[0]).not.toBe(messages[0]);
1798
- expect(Object.keys(result[0])).not.toContain('role');
1799
- expect(result[1]).toBe(messages[1]);
1800
- expect(result[2]).not.toBe(messages[2]);
1801
- });
1802
-
1803
- it('should preserve instanceof for LangChain messages after addCacheControl', () => {
1804
- const messages: BaseMessage[] = [
1805
- new HumanMessage({ content: [{ type: 'text', text: 'Hello' }] }),
1806
- new AIMessage({
1807
- content: [{ type: 'text', text: 'Using a tool' }],
1808
- tool_calls: [
1809
- { id: 'call_1', name: 'test', args: {}, type: 'tool_call' as const },
1810
- ],
1811
- }),
1812
- new ToolMessage({ content: 'result', tool_call_id: 'call_1' }),
1813
- new HumanMessage({ content: [{ type: 'text', text: 'Thanks' }] }),
1814
- new AIMessage({ content: [{ type: 'text', text: 'No problem' }] }),
1815
- ];
1816
-
1817
- const result = addCacheControl(messages);
1818
-
1819
- expect(result[0]).toBeInstanceOf(HumanMessage);
1820
- expect(result[1]).toBeInstanceOf(AIMessage);
1821
- expect(result[2]).toBeInstanceOf(ToolMessage);
1822
- expect(result[3]).toBeInstanceOf(HumanMessage);
1823
- expect(result[4]).toBeInstanceOf(AIMessage);
1824
-
1825
- // Verify tool_calls are preserved on the AIMessage
1826
- expect((result[1] as AIMessage).tool_calls).toHaveLength(1);
1827
- expect((result[1] as AIMessage).tool_calls![0].name).toBe('test');
1828
-
1829
- // Verify tool_call_id is preserved on the ToolMessage
1830
- expect((result[2] as ToolMessage).tool_call_id).toBe('call_1');
1831
- });
1832
-
1833
- it('should preserve instanceof for LangChain messages after addBedrockCacheControl', () => {
1834
- const messages: BaseMessage[] = [
1835
- new HumanMessage({ content: [{ type: 'text', text: 'Hello' }] }),
1836
- new AIMessage({
1837
- content: [
1838
- { type: 'text', text: '\n\n' },
1839
- { type: 'reasoning_content', reasoningText: { text: 'thinking...' } },
1840
- { type: 'text', text: 'Using a tool' },
1841
- ],
1842
- tool_calls: [
1843
- {
1844
- id: 'call_1',
1845
- name: 'navigate',
1846
- args: { url: 'test' },
1847
- type: 'tool_call' as const,
1848
- },
1849
- ],
1850
- }),
1851
- new ToolMessage({ content: 'navigated', tool_call_id: 'call_1' }),
1852
- new HumanMessage({ content: [{ type: 'text', text: 'Now what?' }] }),
1853
- ];
1854
-
1855
- const result = addBedrockCacheControl(messages);
1856
-
1857
- expect(result[0]).toBeInstanceOf(HumanMessage);
1858
- expect(result[1]).toBeInstanceOf(AIMessage);
1859
- expect(result[2]).toBeInstanceOf(ToolMessage);
1860
- expect(result[3]).toBeInstanceOf(HumanMessage);
1861
-
1862
- // Verify reasoning content is preserved
1863
- const aiContent = (result[1] as AIMessage)
1864
- .content as MessageContentComplex[];
1865
- expect(
1866
- aiContent.some(
1867
- (c) => (c as { type: string }).type === 'reasoning_content'
1868
- )
1869
- ).toBe(true);
1870
-
1871
- // Verify tool_calls are preserved
1872
- expect((result[1] as AIMessage).tool_calls).toHaveLength(1);
1873
- expect((result[1] as AIMessage).tool_calls![0].name).toBe('navigate');
1874
- });
1875
- });
1876
-
1877
- describe('OpenRouter prompt caching (reuses addCacheControl)', () => {
1878
- it('adds cache_control to LangChain messages for OpenRouter (same format as Anthropic)', () => {
1879
- const messages: BaseMessage[] = [
1880
- new HumanMessage({ content: [{ type: 'text', text: 'System context' }] }),
1881
- new AIMessage({ content: [{ type: 'text', text: 'Acknowledged' }] }),
1882
- new HumanMessage({ content: [{ type: 'text', text: 'User query' }] }),
1883
- ];
1884
-
1885
- const result = addCacheControl(messages);
1886
-
1887
- const firstContent = result[0].content as MessageContentComplex[];
1888
- const lastContent = result[2].content as MessageContentComplex[];
1889
-
1890
- expect((firstContent[0] as CacheControlBlock).cache_control).toEqual({
1891
- type: 'ephemeral',
1892
- });
1893
- expect((lastContent[0] as CacheControlBlock).cache_control).toEqual({
1894
- type: 'ephemeral',
1895
- });
1896
- });
1897
-
1898
- it('preserves cache_control through OpenAI message conversion used by OpenRouter', () => {
1899
- const messages: BaseMessage[] = [
1900
- new HumanMessage({
1901
- content: [
1902
- {
1903
- type: 'text',
1904
- text: 'Hello',
1905
- cache_control: { type: 'ephemeral' },
1906
- },
1907
- ],
1908
- }),
1909
- new AIMessage({ content: 'Hi there' }),
1910
- new HumanMessage({
1911
- content: [
1912
- {
1913
- type: 'text',
1914
- text: 'Follow-up',
1915
- cache_control: { type: 'ephemeral' },
1916
- },
1917
- ],
1918
- }),
1919
- ];
1920
-
1921
- const converted = _convertMessagesToOpenAIParams(messages);
1922
-
1923
- const firstUserContent = converted[0].content as CacheControlBlock[];
1924
- const lastUserContent = converted[2].content as CacheControlBlock[];
1925
-
1926
- expect(firstUserContent[0]).toHaveProperty('cache_control');
1927
- expect(firstUserContent[0].cache_control).toEqual({ type: 'ephemeral' });
1928
- expect(lastUserContent[0]).toHaveProperty('cache_control');
1929
- expect(lastUserContent[0].cache_control).toEqual({ type: 'ephemeral' });
1930
- });
1931
-
1932
- it('end-to-end: addCacheControl then convert preserves breakpoints for OpenRouter', () => {
1933
- const messages: BaseMessage[] = [
1934
- new HumanMessage({ content: 'First message with context' }),
1935
- new AIMessage({ content: 'Response' }),
1936
- new HumanMessage({ content: 'Second question' }),
1937
- ];
1938
-
1939
- const cached = addCacheControl(messages);
1940
- const converted = _convertMessagesToOpenAIParams(
1941
- cached,
1942
- 'anthropic/claude-sonnet-4-20250514'
1943
- );
1944
-
1945
- const firstUser = converted[0];
1946
- const lastUser = converted[2];
1947
-
1948
- expect(Array.isArray(firstUser.content)).toBe(true);
1949
- expect((firstUser.content as CacheControlBlock[])[0]).toHaveProperty(
1950
- 'cache_control'
1951
- );
1952
-
1953
- expect(Array.isArray(lastUser.content)).toBe(true);
1954
- expect((lastUser.content as CacheControlBlock[])[0]).toHaveProperty(
1955
- 'cache_control'
1956
- );
1957
- });
1958
-
1959
- it('strips Bedrock cache before applying OpenRouter/Anthropic cache', () => {
1960
- const messages: TestMsg[] = [
1961
- {
1962
- role: 'user',
1963
- content: [
1964
- { type: ContentTypes.TEXT, text: 'First message' },
1965
- { cachePoint: { type: 'default' } },
1966
- ],
1967
- },
1968
- {
1969
- role: 'assistant',
1970
- content: [
1971
- { type: ContentTypes.TEXT, text: 'Response' },
1972
- { cachePoint: { type: 'default' } },
1973
- ],
1974
- },
1975
- {
1976
- role: 'user',
1977
- content: [{ type: ContentTypes.TEXT, text: 'Follow-up' }],
1978
- },
1979
- ];
1980
-
1981
- /** @ts-expect-error - Testing cross-provider compatibility */
1982
- const result = addCacheControl(messages);
1983
-
1984
- for (const msg of result) {
1985
- if (Array.isArray(msg.content)) {
1986
- expect(
1987
- (msg.content as MessageContentComplex[]).some(
1988
- (b) => 'cachePoint' in b
1989
- )
1990
- ).toBe(false);
1991
- }
1992
- }
1993
-
1994
- const lastContent = result[2].content as MessageContentComplex[];
1995
- expect('cache_control' in lastContent[0]).toBe(true);
1996
- });
1997
- });
1998
-
1999
- describe('prompt-cache TTL (1h default, 5m legacy)', () => {
2000
- describe('resolvePromptCacheTtl', () => {
2001
- it('defaults to the 1h extended cache when unset', () => {
2002
- expect(resolvePromptCacheTtl(undefined)).toBe('1h');
2003
- expect(DEFAULT_PROMPT_CACHE_TTL).toBe('1h');
2004
- });
2005
-
2006
- it('passes an explicit value through unchanged', () => {
2007
- expect(resolvePromptCacheTtl('5m')).toBe('5m');
2008
- expect(resolvePromptCacheTtl('1h')).toBe('1h');
2009
- });
2010
- });
2011
-
2012
- describe('marker builders', () => {
2013
- it('buildAnthropicCacheControl adds ttl only for 1h', () => {
2014
- expect(buildAnthropicCacheControl('1h')).toEqual({
2015
- type: 'ephemeral',
2016
- ttl: '1h',
2017
- });
2018
- // 5m / undefined stay byte-identical to the legacy marker (no ttl)
2019
- expect(buildAnthropicCacheControl('5m')).toEqual({ type: 'ephemeral' });
2020
- expect(buildAnthropicCacheControl()).toEqual({ type: 'ephemeral' });
2021
- });
2022
-
2023
- it('buildBedrockCachePoint adds ttl only for 1h', () => {
2024
- expect(buildBedrockCachePoint('1h')).toEqual({
2025
- type: 'default',
2026
- ttl: '1h',
2027
- });
2028
- expect(buildBedrockCachePoint('5m')).toEqual({ type: 'default' });
2029
- expect(buildBedrockCachePoint()).toEqual({ type: 'default' });
2030
- });
2031
- });
2032
-
2033
- describe('addTailCacheControl threads ttl', () => {
2034
- const baseMessages = (): AnthropicMessages => [
2035
- { role: 'user', content: 'Hello' },
2036
- { role: 'assistant', content: 'Hi there' },
2037
- ];
2038
-
2039
- it('stamps a 1h cache_control on the tail block', () => {
2040
- const result = addTailCacheControl(baseMessages(), '1h');
2041
- const tail = result[result.length - 1].content as MessageContentComplex[];
2042
- expect(tail[tail.length - 1]).toEqual({
2043
- type: 'text',
2044
- text: 'Hi there',
2045
- cache_control: { type: 'ephemeral', ttl: '1h' },
2046
- });
2047
- });
2048
-
2049
- it('omits ttl for 5m and for the unspecified (legacy) default', () => {
2050
- for (const ttl of ['5m', undefined] as const) {
2051
- const result = addTailCacheControl(baseMessages(), ttl);
2052
- const tail = result[result.length - 1]
2053
- .content as MessageContentComplex[];
2054
- expect(
2055
- (tail[tail.length - 1] as Anthropic.TextBlockParam).cache_control
2056
- ).toEqual({ type: 'ephemeral' });
2057
- }
2058
- });
2059
- });
2060
-
2061
- describe('addCacheControl threads ttl', () => {
2062
- it('stamps a 1h cache_control on the latest user messages', () => {
2063
- const messages: AnthropicMessages = [
2064
- { role: 'user', content: 'first' },
2065
- { role: 'assistant', content: 'reply' },
2066
- { role: 'user', content: 'second' },
2067
- ];
2068
- const result = addCacheControl(messages, '1h');
2069
- const lastUser = result[2].content as MessageContentComplex[];
2070
- expect((lastUser[0] as Anthropic.TextBlockParam).cache_control).toEqual({
2071
- type: 'ephemeral',
2072
- ttl: '1h',
2073
- });
2074
- });
2075
- });
2076
-
2077
- describe('addCacheControlToStablePrefixMessages threads ttl', () => {
2078
- it('stamps 1h on every stable-prefix marker', () => {
2079
- const messages: AnthropicMessages = [
2080
- { role: 'user', content: 'turn 1' },
2081
- { role: 'assistant', content: 'reply 1' },
2082
- { role: 'user', content: 'turn 2' },
2083
- { role: 'assistant', content: 'reply 2' },
2084
- ];
2085
- const result = addCacheControlToStablePrefixMessages(messages, 2, '1h');
2086
- const marked = result
2087
- .flatMap((m) =>
2088
- Array.isArray(m.content) ? (m.content as MessageContentComplex[]) : []
2089
- )
2090
- .filter((block) => 'cache_control' in block);
2091
- expect(marked.length).toBeGreaterThan(0);
2092
- for (const block of marked) {
2093
- expect((block as Anthropic.TextBlockParam).cache_control).toEqual({
2094
- type: 'ephemeral',
2095
- ttl: '1h',
2096
- });
2097
- }
2098
- });
2099
- });
2100
-
2101
- describe('addBedrockTailCacheControl threads ttl', () => {
2102
- const messages = (): TestMsg[] => [
2103
- { role: 'user', content: 'Hello' },
2104
- { role: 'assistant', content: 'Hi' },
2105
- ];
2106
-
2107
- it('stamps a 1h cachePoint on the tail message', () => {
2108
- const result = addBedrockTailCacheControl(messages(), '1h');
2109
- const last = result[result.length - 1].content as MessageContentComplex[];
2110
- expect(last[last.length - 1]).toEqual({
2111
- cachePoint: { type: 'default', ttl: '1h' },
2112
- });
2113
- });
2114
-
2115
- it('omits ttl for 5m and the legacy default', () => {
2116
- for (const ttl of ['5m', undefined] as const) {
2117
- const result = addBedrockTailCacheControl(messages(), ttl);
2118
- const last = result[result.length - 1]
2119
- .content as MessageContentComplex[];
2120
- expect(last[last.length - 1]).toEqual({
2121
- cachePoint: { type: 'default' },
2122
- });
2123
- }
2124
- });
2125
-
2126
- it('normalizes a stale 5m system cachePoint to the resolved tail ttl', () => {
2127
- const msgs: TestMsg[] = [
2128
- {
2129
- role: 'system',
2130
- content: [
2131
- { type: ContentTypes.TEXT, text: 'System' },
2132
- { cachePoint: { type: 'default' } } as MessageContentComplex,
2133
- ],
2134
- },
2135
- { role: 'user', content: 'Hello' },
2136
- { role: 'assistant', content: 'Hi' },
2137
- ];
2138
- const result = addBedrockTailCacheControl(msgs, '1h');
2139
- // Stale 5m system checkpoint is upgraded to 1h so it never precedes the
2140
- // 1h message tail (Bedrock requires longer-TTL checkpoints first).
2141
- const system = result[0].content as MessageContentComplex[];
2142
- expect(system[system.length - 1]).toEqual({
2143
- cachePoint: { type: 'default', ttl: '1h' },
2144
- });
2145
- const tail = result[result.length - 1].content as MessageContentComplex[];
2146
- expect(tail[tail.length - 1]).toEqual({
2147
- cachePoint: { type: 'default', ttl: '1h' },
2148
- });
2149
- });
2150
- });
2151
-
2152
- describe('addBedrockCacheControl threads ttl', () => {
2153
- it('stamps a 1h cachePoint when configured', () => {
2154
- const messages: TestMsg[] = [
2155
- { role: 'user', content: 'Hello' },
2156
- { role: 'assistant', content: 'Hi' },
2157
- ];
2158
- const result = addBedrockCacheControl(messages, '1h');
2159
- // Only one user message present, so the cachePoint anchors on it.
2160
- const user = result[0].content as MessageContentComplex[];
2161
- expect(user[user.length - 1]).toEqual({
2162
- cachePoint: { type: 'default', ttl: '1h' },
2163
- });
2164
- });
2165
- });
2166
- });