@illuma-ai/agents 1.5.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +2 -2
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/enum.cjs +12 -12
  4. package/dist/cjs/common/enum.cjs.map +1 -1
  5. package/dist/cjs/graphs/Graph.cjs +5 -5
  6. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  7. package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -1
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  9. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs +1 -1
  10. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs.map +1 -1
  11. package/dist/cjs/hooks/HookRegistry.cjs +1 -1
  12. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  13. package/dist/cjs/hooks/matchers.cjs +2 -2
  14. package/dist/cjs/hooks/matchers.cjs.map +1 -1
  15. package/dist/cjs/hooks/types.cjs +1 -1
  16. package/dist/cjs/hooks/types.cjs.map +1 -1
  17. package/dist/cjs/llm/bedrock/cacheSupport.cjs +1 -1
  18. package/dist/cjs/llm/bedrock/cacheSupport.cjs.map +1 -1
  19. package/dist/cjs/llm/bedrock/index.cjs +2 -2
  20. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  21. package/dist/cjs/llm/openai/index.cjs +1 -1
  22. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  23. package/dist/cjs/llm/openai/utils/index.cjs +2 -2
  24. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  25. package/dist/cjs/memory/citations.cjs +4 -4
  26. package/dist/cjs/memory/citations.cjs.map +1 -1
  27. package/dist/cjs/memory/constants.cjs +17 -17
  28. package/dist/cjs/memory/constants.cjs.map +1 -1
  29. package/dist/cjs/memory/mmr.cjs +1 -1
  30. package/dist/cjs/memory/mmr.cjs.map +1 -1
  31. package/dist/cjs/memory/paths.cjs +1 -1
  32. package/dist/cjs/memory/paths.cjs.map +1 -1
  33. package/dist/cjs/memory/recallTracking.cjs +3 -3
  34. package/dist/cjs/memory/recallTracking.cjs.map +1 -1
  35. package/dist/cjs/memory/temporalDecay.cjs +2 -2
  36. package/dist/cjs/memory/temporalDecay.cjs.map +1 -1
  37. package/dist/cjs/messages/format.cjs +3 -3
  38. package/dist/cjs/messages/format.cjs.map +1 -1
  39. package/dist/cjs/tools/CodeExecutor.cjs +4 -3
  40. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  41. package/dist/cjs/tools/ToolNode.cjs +5 -5
  42. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  43. package/dist/cjs/tools/memory/memoryAppendTool.cjs +1 -1
  44. package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -1
  45. package/dist/cjs/tools/memory/memoryGetTool.cjs +2 -2
  46. package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -1
  47. package/dist/cjs/tools/memory/memorySearchTool.cjs +3 -3
  48. package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -1
  49. package/dist/cjs/tools/memory/shared.cjs +1 -1
  50. package/dist/cjs/tools/memory/shared.cjs.map +1 -1
  51. package/dist/cjs/types/agent-cache.cjs +6 -5
  52. package/dist/cjs/types/agent-cache.cjs.map +1 -1
  53. package/dist/cjs/types/graph.cjs.map +1 -1
  54. package/dist/esm/agents/AgentContext.mjs +2 -2
  55. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  56. package/dist/esm/common/enum.mjs +12 -12
  57. package/dist/esm/common/enum.mjs.map +1 -1
  58. package/dist/esm/graphs/Graph.mjs +5 -5
  59. package/dist/esm/graphs/Graph.mjs.map +1 -1
  60. package/dist/esm/graphs/MultiAgentGraph.mjs +1 -1
  61. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  62. package/dist/esm/graphs/phases/memoryFlushPhase.mjs +1 -1
  63. package/dist/esm/graphs/phases/memoryFlushPhase.mjs.map +1 -1
  64. package/dist/esm/hooks/HookRegistry.mjs +1 -1
  65. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  66. package/dist/esm/hooks/matchers.mjs +2 -2
  67. package/dist/esm/hooks/matchers.mjs.map +1 -1
  68. package/dist/esm/hooks/types.mjs +1 -1
  69. package/dist/esm/hooks/types.mjs.map +1 -1
  70. package/dist/esm/llm/bedrock/cacheSupport.mjs +1 -1
  71. package/dist/esm/llm/bedrock/cacheSupport.mjs.map +1 -1
  72. package/dist/esm/llm/bedrock/index.mjs +2 -2
  73. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  74. package/dist/esm/llm/openai/index.mjs +1 -1
  75. package/dist/esm/llm/openai/index.mjs.map +1 -1
  76. package/dist/esm/llm/openai/utils/index.mjs +2 -2
  77. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  78. package/dist/esm/memory/citations.mjs +4 -4
  79. package/dist/esm/memory/citations.mjs.map +1 -1
  80. package/dist/esm/memory/constants.mjs +17 -17
  81. package/dist/esm/memory/constants.mjs.map +1 -1
  82. package/dist/esm/memory/mmr.mjs +1 -1
  83. package/dist/esm/memory/mmr.mjs.map +1 -1
  84. package/dist/esm/memory/paths.mjs +1 -1
  85. package/dist/esm/memory/paths.mjs.map +1 -1
  86. package/dist/esm/memory/recallTracking.mjs +3 -3
  87. package/dist/esm/memory/recallTracking.mjs.map +1 -1
  88. package/dist/esm/memory/temporalDecay.mjs +2 -2
  89. package/dist/esm/memory/temporalDecay.mjs.map +1 -1
  90. package/dist/esm/messages/format.mjs +3 -3
  91. package/dist/esm/messages/format.mjs.map +1 -1
  92. package/dist/esm/tools/CodeExecutor.mjs +4 -3
  93. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  94. package/dist/esm/tools/ToolNode.mjs +5 -5
  95. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  96. package/dist/esm/tools/memory/memoryAppendTool.mjs +1 -1
  97. package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -1
  98. package/dist/esm/tools/memory/memoryGetTool.mjs +2 -2
  99. package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -1
  100. package/dist/esm/tools/memory/memorySearchTool.mjs +3 -3
  101. package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -1
  102. package/dist/esm/tools/memory/shared.mjs +1 -1
  103. package/dist/esm/tools/memory/shared.mjs.map +1 -1
  104. package/dist/esm/types/agent-cache.mjs +6 -5
  105. package/dist/esm/types/agent-cache.mjs.map +1 -1
  106. package/dist/esm/types/graph.mjs.map +1 -1
  107. package/dist/types/agents/AgentContext.d.ts +1 -1
  108. package/dist/types/common/enum.d.ts +12 -12
  109. package/dist/types/graphs/Graph.d.ts +2 -2
  110. package/dist/types/graphs/phases/memoryFlushPhase.d.ts +2 -2
  111. package/dist/types/hooks/HookRegistry.d.ts +1 -1
  112. package/dist/types/hooks/matchers.d.ts +2 -2
  113. package/dist/types/hooks/types.d.ts +1 -1
  114. package/dist/types/llm/bedrock/cacheSupport.d.ts +1 -1
  115. package/dist/types/llm/bedrock/index.d.ts +2 -2
  116. package/dist/types/llm/openai/index.d.ts +1 -1
  117. package/dist/types/memory/citations.d.ts +4 -4
  118. package/dist/types/memory/constants.d.ts +17 -17
  119. package/dist/types/memory/mmr.d.ts +3 -3
  120. package/dist/types/memory/paths.d.ts +1 -1
  121. package/dist/types/memory/temporalDecay.d.ts +2 -2
  122. package/dist/types/memory/types.d.ts +3 -3
  123. package/dist/types/messages/format.d.ts +1 -1
  124. package/dist/types/tools/ToolNode.d.ts +3 -3
  125. package/dist/types/tools/memory/shared.d.ts +1 -1
  126. package/dist/types/types/agent-cache.d.ts +6 -5
  127. package/dist/types/types/graph.d.ts +7 -6
  128. package/dist/types/types/messages.d.ts +1 -1
  129. package/dist/types/types/run.d.ts +1 -1
  130. package/dist/types/types/tools.d.ts +5 -5
  131. package/package.json +1 -1
  132. package/src/agents/AgentContext.ts +2 -2
  133. package/src/agents/__tests__/AgentContext.crossAgentTier1.live.test.ts +5 -3
  134. package/src/agents/__tests__/AgentContext.test.ts +1 -1
  135. package/src/common/__tests__/enum.test.ts +1 -1
  136. package/src/common/enum.ts +12 -12
  137. package/src/graphs/Graph.ts +5 -5
  138. package/src/graphs/MultiAgentGraph.ts +1 -1
  139. package/src/graphs/gapFeatures.test.ts +1 -1
  140. package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +1 -1
  141. package/src/graphs/phases/memoryFlushPhase.ts +2 -2
  142. package/src/hooks/HookRegistry.ts +1 -1
  143. package/src/hooks/index.ts +1 -1
  144. package/src/hooks/matchers.ts +2 -2
  145. package/src/hooks/types.ts +1 -1
  146. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +7 -7
  147. package/src/llm/bedrock/__tests__/bedrock-caching.test.ts +2 -2
  148. package/src/llm/bedrock/cacheSupport.ts +1 -1
  149. package/src/llm/bedrock/index.ts +2 -2
  150. package/src/llm/openai/index.ts +2 -2
  151. package/src/llm/openai/utils/index.ts +2 -2
  152. package/src/memory/citations.ts +4 -4
  153. package/src/memory/constants.ts +17 -17
  154. package/src/memory/mmr.ts +3 -3
  155. package/src/memory/paths.ts +1 -1
  156. package/src/memory/recallTracking.ts +3 -3
  157. package/src/memory/temporalDecay.ts +2 -2
  158. package/src/memory/types.ts +3 -3
  159. package/src/messages/cache.test.ts +1 -1
  160. package/src/messages/ensureThinkingBlock.test.ts +1 -1
  161. package/src/messages/format.ts +4 -4
  162. package/src/messages/formatAgentMessages.test.ts +1 -1
  163. package/src/scripts/subagent-event-driven-debug.ts +2 -2
  164. package/src/specs/anthropic.simple.test.ts +1 -1
  165. package/src/specs/prune.orphans.test.ts +1 -1
  166. package/src/tools/CodeExecutor.ts +4 -3
  167. package/src/tools/ToolNode.ts +6 -6
  168. package/src/tools/__tests__/CodeExecutor.test.ts +3 -3
  169. package/src/tools/memory/memoryAppendTool.ts +1 -1
  170. package/src/tools/memory/memoryGetTool.ts +2 -2
  171. package/src/tools/memory/memorySearchTool.ts +3 -3
  172. package/src/tools/memory/shared.ts +1 -1
  173. package/src/types/agent-cache.ts +6 -5
  174. package/src/types/graph.ts +7 -6
  175. package/src/types/messages.ts +1 -1
  176. package/src/types/run.ts +1 -1
  177. package/src/types/tools.ts +5 -5
  178. package/dist/types/tools/search/test.d.ts +0 -1
  179. package/src/agents/AgentContext.js.map +0 -1
  180. package/src/agents/AgentContext.test.js.map +0 -1
  181. package/src/agents/__tests__/AgentContext.test.js.map +0 -1
  182. package/src/agents/__tests__/resolveStructuredOutputMode.test.js.map +0 -1
  183. package/src/common/enum.js.map +0 -1
  184. package/src/common/index.js.map +0 -1
  185. package/src/events.js.map +0 -1
  186. package/src/graphs/Graph.js.map +0 -1
  187. package/src/graphs/MultiAgentGraph.js.map +0 -1
  188. package/src/graphs/__tests__/structured-output.integration.test.js.map +0 -1
  189. package/src/graphs/__tests__/structured-output.test.js.map +0 -1
  190. package/src/graphs/contextManagement.e2e.test.js.map +0 -1
  191. package/src/graphs/contextManagement.test.js.map +0 -1
  192. package/src/graphs/handoffValidation.test.js.map +0 -1
  193. package/src/graphs/index.js.map +0 -1
  194. package/src/index.js.map +0 -1
  195. package/src/instrumentation.js.map +0 -1
  196. package/src/llm/anthropic/index.js.map +0 -1
  197. package/src/llm/anthropic/types.js.map +0 -1
  198. package/src/llm/anthropic/utils/message_inputs.js.map +0 -1
  199. package/src/llm/anthropic/utils/message_outputs.js.map +0 -1
  200. package/src/llm/anthropic/utils/output_parsers.js.map +0 -1
  201. package/src/llm/anthropic/utils/tools.js.map +0 -1
  202. package/src/llm/bedrock/__tests__/bedrock-caching.test.js.map +0 -1
  203. package/src/llm/bedrock/index.js.map +0 -1
  204. package/src/llm/bedrock/types.js.map +0 -1
  205. package/src/llm/bedrock/utils/index.js.map +0 -1
  206. package/src/llm/bedrock/utils/message_inputs.js.map +0 -1
  207. package/src/llm/bedrock/utils/message_outputs.js.map +0 -1
  208. package/src/llm/fake.js.map +0 -1
  209. package/src/llm/google/index.js.map +0 -1
  210. package/src/llm/google/types.js.map +0 -1
  211. package/src/llm/google/utils/common.js.map +0 -1
  212. package/src/llm/google/utils/tools.js.map +0 -1
  213. package/src/llm/google/utils/zod_to_genai_parameters.js.map +0 -1
  214. package/src/llm/openai/index.js.map +0 -1
  215. package/src/llm/openai/types.js.map +0 -1
  216. package/src/llm/openai/utils/index.js.map +0 -1
  217. package/src/llm/openai/utils/isReasoningModel.test.js.map +0 -1
  218. package/src/llm/openrouter/index.js.map +0 -1
  219. package/src/llm/openrouter/reasoning.test.js.map +0 -1
  220. package/src/llm/providers.js.map +0 -1
  221. package/src/llm/text.js.map +0 -1
  222. package/src/llm/vertexai/index.js.map +0 -1
  223. package/src/messages/__tests__/tools.test.js.map +0 -1
  224. package/src/messages/cache.js.map +0 -1
  225. package/src/messages/cache.test.js.map +0 -1
  226. package/src/messages/content.js.map +0 -1
  227. package/src/messages/content.test.js.map +0 -1
  228. package/src/messages/core.js.map +0 -1
  229. package/src/messages/ensureThinkingBlock.test.js.map +0 -1
  230. package/src/messages/format.js.map +0 -1
  231. package/src/messages/formatAgentMessages.test.js.map +0 -1
  232. package/src/messages/formatAgentMessages.tools.test.js.map +0 -1
  233. package/src/messages/formatMessage.test.js.map +0 -1
  234. package/src/messages/ids.js.map +0 -1
  235. package/src/messages/index.js.map +0 -1
  236. package/src/messages/labelContentByAgent.test.js.map +0 -1
  237. package/src/messages/prune.js.map +0 -1
  238. package/src/messages/reducer.js.map +0 -1
  239. package/src/messages/shiftIndexTokenCountMap.test.js.map +0 -1
  240. package/src/messages/summarize.js.map +0 -1
  241. package/src/messages/summarize.test.js.map +0 -1
  242. package/src/messages/tools.js.map +0 -1
  243. package/src/mockStream.js.map +0 -1
  244. package/src/prompts/collab.js.map +0 -1
  245. package/src/prompts/index.js.map +0 -1
  246. package/src/prompts/taskmanager.js.map +0 -1
  247. package/src/run.js.map +0 -1
  248. package/src/schemas/index.js.map +0 -1
  249. package/src/schemas/schema-preparation.test.js.map +0 -1
  250. package/src/schemas/validate.js.map +0 -1
  251. package/src/schemas/validate.test.js.map +0 -1
  252. package/src/scripts/abort.js.map +0 -1
  253. package/src/scripts/ant_web_search.js.map +0 -1
  254. package/src/scripts/ant_web_search_edge_case.js.map +0 -1
  255. package/src/scripts/ant_web_search_error_edge_case.js.map +0 -1
  256. package/src/scripts/args.js.map +0 -1
  257. package/src/scripts/bedrock-cache-debug.js.map +0 -1
  258. package/src/scripts/bedrock-content-aggregation-test.js.map +0 -1
  259. package/src/scripts/bedrock-merge-test.js.map +0 -1
  260. package/src/scripts/bedrock-parallel-tools-test.js.map +0 -1
  261. package/src/scripts/caching.js.map +0 -1
  262. package/src/scripts/cli.js.map +0 -1
  263. package/src/scripts/cli2.js.map +0 -1
  264. package/src/scripts/cli3.js.map +0 -1
  265. package/src/scripts/cli4.js.map +0 -1
  266. package/src/scripts/cli5.js.map +0 -1
  267. package/src/scripts/code_exec.js.map +0 -1
  268. package/src/scripts/code_exec_files.js.map +0 -1
  269. package/src/scripts/code_exec_multi_session.js.map +0 -1
  270. package/src/scripts/code_exec_ptc.js.map +0 -1
  271. package/src/scripts/code_exec_session.js.map +0 -1
  272. package/src/scripts/code_exec_simple.js.map +0 -1
  273. package/src/scripts/content.js.map +0 -1
  274. package/src/scripts/empty_input.js.map +0 -1
  275. package/src/scripts/handoff-test.js.map +0 -1
  276. package/src/scripts/image.js.map +0 -1
  277. package/src/scripts/memory.js.map +0 -1
  278. package/src/scripts/multi-agent-chain.js.map +0 -1
  279. package/src/scripts/multi-agent-conditional.js.map +0 -1
  280. package/src/scripts/multi-agent-document-review-chain.js.map +0 -1
  281. package/src/scripts/multi-agent-hybrid-flow.js.map +0 -1
  282. package/src/scripts/multi-agent-parallel-start.js.map +0 -1
  283. package/src/scripts/multi-agent-parallel.js.map +0 -1
  284. package/src/scripts/multi-agent-sequence.js.map +0 -1
  285. package/src/scripts/multi-agent-supervisor.js.map +0 -1
  286. package/src/scripts/multi-agent-test.js.map +0 -1
  287. package/src/scripts/parallel-asymmetric-tools-test.js.map +0 -1
  288. package/src/scripts/parallel-full-metadata-test.js.map +0 -1
  289. package/src/scripts/parallel-tools-test.js.map +0 -1
  290. package/src/scripts/programmatic_exec.js.map +0 -1
  291. package/src/scripts/programmatic_exec_agent.js.map +0 -1
  292. package/src/scripts/search.js.map +0 -1
  293. package/src/scripts/sequential-full-metadata-test.js.map +0 -1
  294. package/src/scripts/simple.js.map +0 -1
  295. package/src/scripts/single-agent-metadata-test.js.map +0 -1
  296. package/src/scripts/stream.js.map +0 -1
  297. package/src/scripts/test-custom-prompt-key.js.map +0 -1
  298. package/src/scripts/test-handoff-input.js.map +0 -1
  299. package/src/scripts/test-handoff-preamble.js.map +0 -1
  300. package/src/scripts/test-handoff-steering.js.map +0 -1
  301. package/src/scripts/test-multi-agent-list-handoff.js.map +0 -1
  302. package/src/scripts/test-parallel-agent-labeling.js.map +0 -1
  303. package/src/scripts/test-parallel-handoffs.js.map +0 -1
  304. package/src/scripts/test-thinking-handoff-bedrock.js.map +0 -1
  305. package/src/scripts/test-thinking-handoff.js.map +0 -1
  306. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.js.map +0 -1
  307. package/src/scripts/test-tool-before-handoff-role-order.js.map +0 -1
  308. package/src/scripts/test-tools-before-handoff.js.map +0 -1
  309. package/src/scripts/test_code_api.js.map +0 -1
  310. package/src/scripts/thinking-bedrock.js.map +0 -1
  311. package/src/scripts/thinking-vertexai.js.map +0 -1
  312. package/src/scripts/thinking.js.map +0 -1
  313. package/src/scripts/tool_search.js.map +0 -1
  314. package/src/scripts/tools.js.map +0 -1
  315. package/src/specs/agent-handoffs-bedrock.integration.test.js.map +0 -1
  316. package/src/specs/agent-handoffs.test.js.map +0 -1
  317. package/src/specs/anthropic.simple.test.js.map +0 -1
  318. package/src/specs/azure.simple.test.js.map +0 -1
  319. package/src/specs/cache.simple.test.js.map +0 -1
  320. package/src/specs/custom-event-await.test.js.map +0 -1
  321. package/src/specs/deepseek.simple.test.js.map +0 -1
  322. package/src/specs/emergency-prune.test.js.map +0 -1
  323. package/src/specs/moonshot.simple.test.js.map +0 -1
  324. package/src/specs/observability.integration.test.js.map +0 -1
  325. package/src/specs/openai.simple.test.js.map +0 -1
  326. package/src/specs/openrouter.simple.test.js.map +0 -1
  327. package/src/specs/prune.test.js.map +0 -1
  328. package/src/specs/reasoning.test.js.map +0 -1
  329. package/src/specs/spec.utils.js.map +0 -1
  330. package/src/specs/thinking-handoff.test.js.map +0 -1
  331. package/src/specs/thinking-prune.test.js.map +0 -1
  332. package/src/specs/token-distribution-edge-case.test.js.map +0 -1
  333. package/src/specs/token-memoization.test.js.map +0 -1
  334. package/src/specs/tokens.test.js.map +0 -1
  335. package/src/specs/tool-error.test.js.map +0 -1
  336. package/src/splitStream.js.map +0 -1
  337. package/src/splitStream.test.js.map +0 -1
  338. package/src/stream.js.map +0 -1
  339. package/src/stream.test.js.map +0 -1
  340. package/src/test/mockTools.js.map +0 -1
  341. package/src/tools/BrowserTools.js.map +0 -1
  342. package/src/tools/Calculator.js.map +0 -1
  343. package/src/tools/Calculator.test.js.map +0 -1
  344. package/src/tools/CodeExecutor.js.map +0 -1
  345. package/src/tools/ProgrammaticToolCalling.js.map +0 -1
  346. package/src/tools/StreamingToolCallBuffer.js.map +0 -1
  347. package/src/tools/ToolNode.js.map +0 -1
  348. package/src/tools/ToolSearch.js.map +0 -1
  349. package/src/tools/__tests__/BrowserTools.test.js.map +0 -1
  350. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.js.map +0 -1
  351. package/src/tools/__tests__/ProgrammaticToolCalling.test.js.map +0 -1
  352. package/src/tools/__tests__/StreamingToolCallBuffer.test.js.map +0 -1
  353. package/src/tools/__tests__/ToolApproval.test.js.map +0 -1
  354. package/src/tools/__tests__/ToolNode.recovery.test.js.map +0 -1
  355. package/src/tools/__tests__/ToolNode.session.test.js.map +0 -1
  356. package/src/tools/__tests__/ToolSearch.integration.test.js.map +0 -1
  357. package/src/tools/__tests__/ToolSearch.test.js.map +0 -1
  358. package/src/tools/__tests__/handlers.test.js.map +0 -1
  359. package/src/tools/__tests__/truncation-recovery.integration.test.js.map +0 -1
  360. package/src/tools/handlers.js.map +0 -1
  361. package/src/tools/schema.js.map +0 -1
  362. package/src/tools/search/anthropic.js.map +0 -1
  363. package/src/tools/search/content.js.map +0 -1
  364. package/src/tools/search/content.test.js.map +0 -1
  365. package/src/tools/search/firecrawl.js.map +0 -1
  366. package/src/tools/search/format.js.map +0 -1
  367. package/src/tools/search/highlights.js.map +0 -1
  368. package/src/tools/search/index.js.map +0 -1
  369. package/src/tools/search/jina-reranker.test.js.map +0 -1
  370. package/src/tools/search/output.md +0 -2775
  371. package/src/tools/search/rerankers.js.map +0 -1
  372. package/src/tools/search/schema.js.map +0 -1
  373. package/src/tools/search/search.js.map +0 -1
  374. package/src/tools/search/serper-scraper.js.map +0 -1
  375. package/src/tools/search/test.html +0 -884
  376. package/src/tools/search/test.js.map +0 -1
  377. package/src/tools/search/test.md +0 -643
  378. package/src/tools/search/test.ts +0 -159
  379. package/src/tools/search/tool.js.map +0 -1
  380. package/src/tools/search/types.js.map +0 -1
  381. package/src/tools/search/utils.js.map +0 -1
  382. package/src/types/graph.js.map +0 -1
  383. package/src/types/graph.test.js.map +0 -1
  384. package/src/types/index.js.map +0 -1
  385. package/src/types/llm.js.map +0 -1
  386. package/src/types/messages.js.map +0 -1
  387. package/src/types/run.js.map +0 -1
  388. package/src/types/stream.js.map +0 -1
  389. package/src/types/tools.js.map +0 -1
  390. package/src/utils/contextAnalytics.js.map +0 -1
  391. package/src/utils/contextAnalytics.test.js.map +0 -1
  392. package/src/utils/events.js.map +0 -1
  393. package/src/utils/graph.js.map +0 -1
  394. package/src/utils/handlers.js.map +0 -1
  395. package/src/utils/index.js.map +0 -1
  396. package/src/utils/llm.js.map +0 -1
  397. package/src/utils/llmConfig.js.map +0 -1
  398. package/src/utils/logging.js.map +0 -1
  399. package/src/utils/misc.js.map +0 -1
  400. package/src/utils/run.js.map +0 -1
  401. package/src/utils/schema.js.map +0 -1
  402. package/src/utils/title.js.map +0 -1
  403. package/src/utils/tokens.js.map +0 -1
  404. package/src/utils/toonFormat.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../src/llm/openai/utils/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { type OpenAI as OpenAIClient } from 'openai';\nimport type {\n ChatCompletionContentPartText,\n ChatCompletionContentPartImage,\n ChatCompletionContentPartInputAudio,\n ChatCompletionContentPart,\n} from 'openai/resources/chat/completions';\nimport {\n AIMessage,\n AIMessageChunk,\n type BaseMessage,\n ChatMessage,\n ToolMessage,\n isAIMessage,\n type UsageMetadata,\n type BaseMessageFields,\n type MessageContent,\n type InvalidToolCall,\n type MessageContentImageUrl,\n StandardContentBlockConverter,\n parseBase64DataUrl,\n parseMimeType,\n convertToProviderContentBlock,\n isDataContentBlock,\n} from '@langchain/core/messages';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport {\n convertLangChainToolCallToOpenAI,\n makeInvalidToolCall,\n parseToolCall,\n} from '@langchain/core/output_parsers/openai_tools';\nimport type { ToolCall, ToolCallChunk } from '@langchain/core/messages/tool';\nimport type {\n OpenAICallOptions,\n OpenAIChatInput,\n ChatOpenAIReasoningSummary,\n} from '@langchain/openai';\n\nexport type { OpenAICallOptions, OpenAIChatInput };\n\n// Utility types to get hidden OpenAI response types\ntype ExtractAsyncIterableType<T> = T extends AsyncIterable<infer U> ? U : never;\ntype ExcludeController<T> = T extends { controller: unknown } ? never : T;\ntype ExcludeNonController<T> = T extends { controller: unknown } ? T : never;\n\ntype ResponsesCreate = OpenAIClient.Responses['create'];\ntype ResponsesParse = OpenAIClient.Responses['parse'];\n\ntype ResponsesInputItem = OpenAIClient.Responses.ResponseInputItem;\n\ntype ResponsesCreateInvoke = ExcludeController<\n Awaited<ReturnType<ResponsesCreate>>\n>;\n\ntype ResponsesParseInvoke = ExcludeController<\n Awaited<ReturnType<ResponsesParse>>\n>;\n\ntype ResponsesCreateStream = ExcludeNonController<\n Awaited<ReturnType<ResponsesCreate>>\n>;\n\nexport type ResponseReturnStreamEvents =\n ExtractAsyncIterableType<ResponsesCreateStream>;\n\n// TODO import from SDK when available\ntype OpenAIRoleEnum =\n | 'system'\n | 'developer'\n | 'assistant'\n | 'user'\n | 'function'\n | 'tool';\n\ntype OpenAICompletionParam =\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam;\n\nfunction extractGenericMessageCustomRole(message: ChatMessage) {\n if (\n message.role !== 'system' &&\n message.role !== 'developer' &&\n message.role !== 'assistant' &&\n message.role !== 'user' &&\n message.role !== 'function' &&\n message.role !== 'tool'\n ) {\n console.warn(`Unknown message role: ${message.role}`);\n }\n\n return message.role as OpenAIRoleEnum;\n}\n\nexport function messageToOpenAIRole(message: BaseMessage): OpenAIRoleEnum {\n const type = message._getType();\n switch (type) {\n case 'system':\n return 'system';\n case 'ai':\n return 'assistant';\n case 'human':\n return 'user';\n case 'function':\n return 'function';\n case 'tool':\n return 'tool';\n case 'generic': {\n if (!ChatMessage.isInstance(message))\n throw new Error('Invalid generic chat message');\n return extractGenericMessageCustomRole(message);\n }\n default:\n throw new Error(`Unknown message type: ${type}`);\n }\n}\n\nconst completionsApiContentBlockConverter: StandardContentBlockConverter<{\n text: ChatCompletionContentPartText;\n image: ChatCompletionContentPartImage;\n audio: ChatCompletionContentPartInputAudio;\n file: ChatCompletionContentPart.File;\n}> = {\n providerName: 'ChatOpenAI',\n\n fromStandardTextBlock(block): ChatCompletionContentPartText {\n return { type: 'text', text: block.text };\n },\n\n fromStandardImageBlock(block): ChatCompletionContentPartImage {\n if (block.source_type === 'url') {\n return {\n type: 'image_url',\n image_url: {\n url: block.url,\n ...(block.metadata?.detail\n ? { detail: block.metadata.detail as 'auto' | 'low' | 'high' }\n : {}),\n },\n };\n }\n\n if (block.source_type === 'base64') {\n const url = `data:${block.mime_type ?? ''};base64,${block.data}`;\n return {\n type: 'image_url',\n image_url: {\n url,\n ...(block.metadata?.detail\n ? { detail: block.metadata.detail as 'auto' | 'low' | 'high' }\n : {}),\n },\n };\n }\n\n throw new Error(\n `Image content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n\n fromStandardAudioBlock(block): ChatCompletionContentPartInputAudio {\n if (block.source_type === 'url') {\n const data = parseBase64DataUrl({ dataUrl: block.url });\n if (!data) {\n throw new Error(\n `URL audio blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`\n );\n }\n\n const rawMimeType = data.mime_type || block.mime_type || '';\n let mimeType: { type: string; subtype: string };\n\n try {\n mimeType = parseMimeType(rawMimeType);\n } catch {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n if (\n mimeType.type !== 'audio' ||\n (mimeType.subtype !== 'wav' && mimeType.subtype !== 'mp3')\n ) {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n return {\n type: 'input_audio',\n input_audio: {\n format: mimeType.subtype,\n data: data.data,\n },\n };\n }\n\n if (block.source_type === 'base64') {\n let mimeType: { type: string; subtype: string };\n\n try {\n mimeType = parseMimeType(block.mime_type ?? '');\n } catch {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n if (\n mimeType.type !== 'audio' ||\n (mimeType.subtype !== 'wav' && mimeType.subtype !== 'mp3')\n ) {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n return {\n type: 'input_audio',\n input_audio: {\n format: mimeType.subtype,\n data: block.data,\n },\n };\n }\n\n throw new Error(\n `Audio content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n\n fromStandardFileBlock(block): ChatCompletionContentPart.File {\n if (block.source_type === 'url') {\n const data = parseBase64DataUrl({ dataUrl: block.url });\n if (!data) {\n throw new Error(\n `URL file blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`\n );\n }\n\n return {\n type: 'file',\n file: {\n file_data: block.url, // formatted as base64 data URL\n ...(block.metadata?.filename || block.metadata?.name\n ? {\n filename: (block.metadata.filename ||\n block.metadata.name) as string,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === 'base64') {\n return {\n type: 'file',\n file: {\n file_data: `data:${block.mime_type ?? ''};base64,${block.data}`,\n ...(block.metadata?.filename ||\n block.metadata?.name ||\n block.metadata?.title\n ? {\n filename: (block.metadata.filename ||\n block.metadata.name ||\n block.metadata.title) as string,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === 'id') {\n return {\n type: 'file',\n file: {\n file_id: block.id,\n },\n };\n }\n\n throw new Error(\n `File content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n};\n\n/** Options for converting messages to OpenAI params */\nexport interface ConvertMessagesOptions {\n /** Include reasoning_content field for DeepSeek thinking mode with tool calls */\n includeReasoningContent?: boolean;\n /** Include reasoning_details field for OpenRouter/Gemini thinking mode with tool calls */\n includeReasoningDetails?: boolean;\n /** Convert reasoning_details to content blocks for Claude (requires content array format) */\n convertReasoningDetailsToContent?: boolean;\n}\n\n// Used in LangSmith, export is important here\nexport function _convertMessagesToOpenAIParams(\n messages: BaseMessage[],\n model?: string,\n options?: ConvertMessagesOptions\n): OpenAICompletionParam[] {\n /* DeepSeek reasoning roundtrip (upstream PR #136): reasoning_content on\n * an AI message must be re-sent only when the message participates in a\n * tool-call exchange. Track context across the message flat-map. */\n let hasReasoningToolCallContext = false;\n // TODO: Function messages do not support array content, fix cast\n return messages.flatMap((message) => {\n let role = messageToOpenAIRole(message);\n if (role === 'system' && isReasoningModel(model)) {\n role = 'developer';\n }\n\n let hasAnthropicThinkingBlock: boolean = false;\n\n const content =\n typeof message.content === 'string'\n ? message.content\n : message.content.map((m) => {\n if ('type' in m && m.type === 'thinking') {\n hasAnthropicThinkingBlock = true;\n return m;\n }\n if (isDataContentBlock(m)) {\n return convertToProviderContentBlock(\n m,\n completionsApiContentBlockConverter\n );\n }\n return m;\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const completionParam: Record<string, any> = {\n role,\n content,\n };\n let messageHasToolCalls = false;\n let messageIsToolResult = false;\n if (message.name != null) {\n completionParam.name = message.name;\n }\n if (message.additional_kwargs.function_call != null) {\n completionParam.function_call = message.additional_kwargs.function_call;\n completionParam.content = '';\n }\n if (isAIMessage(message) && !!message.tool_calls?.length) {\n messageHasToolCalls = true;\n completionParam.tool_calls = message.tool_calls.map(\n convertLangChainToolCallToOpenAI\n );\n completionParam.content = hasAnthropicThinkingBlock ? content : '';\n if (\n options?.includeReasoningDetails === true &&\n message.additional_kwargs.reasoning_details != null\n ) {\n // For Claude via OpenRouter, convert reasoning_details to content blocks\n const isClaudeModel =\n model?.includes('claude') === true ||\n model?.includes('anthropic') === true;\n if (\n options.convertReasoningDetailsToContent === true &&\n isClaudeModel\n ) {\n const reasoningDetails = message.additional_kwargs\n .reasoning_details as Record<string, unknown>[];\n const contentBlocks = [];\n\n // Add thinking blocks from reasoning_details\n for (const detail of reasoningDetails) {\n if (detail.type === 'reasoning.text' && detail.text != null) {\n contentBlocks.push({\n type: 'thinking',\n thinking: detail.text,\n });\n } else if (\n detail.type === 'reasoning.encrypted' &&\n detail.data != null\n ) {\n contentBlocks.push({\n type: 'redacted_thinking',\n data: detail.data,\n id: detail.id,\n });\n }\n }\n\n // Set content to array with thinking blocks\n if (contentBlocks.length > 0) {\n completionParam.content = contentBlocks;\n }\n } else {\n // For non-Claude models, pass as separate field\n completionParam.reasoning_details =\n message.additional_kwargs.reasoning_details;\n }\n }\n } else {\n if (message.additional_kwargs.tool_calls != null) {\n messageHasToolCalls =\n !Array.isArray(message.additional_kwargs.tool_calls) ||\n message.additional_kwargs.tool_calls.length > 0;\n completionParam.tool_calls = message.additional_kwargs.tool_calls;\n if (\n options?.includeReasoningDetails === true &&\n message.additional_kwargs.reasoning_details != null\n ) {\n // For Claude via OpenRouter, convert reasoning_details to content blocks\n const isClaudeModel =\n model?.includes('claude') === true ||\n model?.includes('anthropic') === true;\n if (\n options.convertReasoningDetailsToContent === true &&\n isClaudeModel\n ) {\n const reasoningDetails = message.additional_kwargs\n .reasoning_details as Record<string, unknown>[];\n const contentBlocks = [];\n\n // Add thinking blocks from reasoning_details\n for (const detail of reasoningDetails) {\n if (detail.type === 'reasoning.text' && detail.text != null) {\n contentBlocks.push({\n type: 'thinking',\n thinking: detail.text,\n });\n } else if (\n detail.type === 'reasoning.encrypted' &&\n detail.data != null\n ) {\n contentBlocks.push({\n type: 'redacted_thinking',\n data: detail.data,\n id: detail.id,\n });\n }\n }\n\n // Set content to array with thinking blocks\n if (contentBlocks.length > 0) {\n completionParam.content = contentBlocks;\n }\n } else {\n // For non-Claude models, pass as separate field\n completionParam.reasoning_details =\n message.additional_kwargs.reasoning_details;\n }\n }\n }\n if ((message as ToolMessage).tool_call_id != null) {\n messageIsToolResult = true;\n completionParam.tool_call_id = (message as ToolMessage).tool_call_id;\n }\n }\n\n /* DeepSeek reasoning roundtrip (upstream PR #136): emit\n * reasoning_content only when the message is part of a tool-call\n * exchange — either the message itself has tool_calls, or a previous\n * AI/tool message established the context. Skipping the gate causes\n * DeepSeek to drop reasoning content during multi-turn replays. */\n if (\n options?.includeReasoningContent === true &&\n isAIMessage(message) &&\n (hasReasoningToolCallContext || messageHasToolCalls) &&\n typeof message.additional_kwargs.reasoning_content === 'string' &&\n message.additional_kwargs.reasoning_content !== ''\n ) {\n completionParam.reasoning_content =\n message.additional_kwargs.reasoning_content;\n }\n\n if (messageHasToolCalls || messageIsToolResult) {\n hasReasoningToolCallContext = true;\n }\n\n if (\n message.additional_kwargs.audio &&\n typeof message.additional_kwargs.audio === 'object' &&\n 'id' in message.additional_kwargs.audio\n ) {\n const audioMessage = {\n role: 'assistant',\n audio: {\n id: message.additional_kwargs.audio.id,\n },\n };\n return [completionParam, audioMessage] as OpenAICompletionParam[];\n }\n\n return completionParam as OpenAICompletionParam;\n });\n}\n\nconst _FUNCTION_CALL_IDS_MAP_KEY = '__openai_function_call_ids__';\n\nfunction _convertReasoningSummaryToOpenAIResponsesParams(\n reasoning: ChatOpenAIReasoningSummary\n): OpenAIClient.Responses.ResponseReasoningItem {\n // combine summary parts that have the the same index and then remove the indexes\n const summary = (\n reasoning.summary.length > 1\n ? reasoning.summary.reduce(\n (acc, curr) => {\n const last = acc.at(-1);\n\n if (last!.index === curr.index) {\n last!.text += curr.text;\n } else {\n acc.push(curr);\n }\n return acc;\n },\n [{ ...reasoning.summary[0] }]\n )\n : reasoning.summary\n ).map((s) =>\n Object.fromEntries(Object.entries(s).filter(([k]) => k !== 'index'))\n ) as OpenAIClient.Responses.ResponseReasoningItem.Summary[];\n\n return {\n ...reasoning,\n summary,\n } as OpenAIClient.Responses.ResponseReasoningItem;\n}\n\nexport function _convertMessagesToOpenAIResponsesParams(\n messages: BaseMessage[],\n model?: string,\n zdrEnabled?: boolean\n): ResponsesInputItem[] {\n return messages.flatMap(\n (lcMsg): ResponsesInputItem | ResponsesInputItem[] => {\n const additional_kwargs =\n lcMsg.additional_kwargs as BaseMessageFields['additional_kwargs'] & {\n [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;\n reasoning?: OpenAIClient.Responses.ResponseReasoningItem;\n type?: string;\n refusal?: string;\n };\n\n let role = messageToOpenAIRole(lcMsg);\n if (role === 'system' && isReasoningModel(model)) role = 'developer';\n\n if (role === 'function') {\n throw new Error('Function messages are not supported in Responses API');\n }\n\n if (role === 'tool') {\n const toolMessage = lcMsg as ToolMessage;\n\n // Handle computer call output\n if (additional_kwargs.type === 'computer_call_output') {\n const output = (() => {\n if (typeof toolMessage.content === 'string') {\n return {\n type: 'computer_screenshot' as const,\n image_url: toolMessage.content,\n };\n }\n\n if (Array.isArray(toolMessage.content)) {\n const oaiScreenshot = toolMessage.content.find(\n (i) => i.type === 'computer_screenshot'\n ) as { type: 'computer_screenshot'; image_url: string };\n\n if (oaiScreenshot) return oaiScreenshot;\n\n const lcImage = toolMessage.content.find(\n (i) => i.type === 'image_url'\n ) as MessageContentImageUrl;\n\n if (lcImage) {\n return {\n type: 'computer_screenshot' as const,\n image_url:\n typeof lcImage.image_url === 'string'\n ? lcImage.image_url\n : lcImage.image_url.url,\n };\n }\n }\n\n throw new Error('Invalid computer call output');\n })();\n\n return {\n type: 'computer_call_output',\n output,\n call_id: toolMessage.tool_call_id,\n };\n }\n\n return {\n type: 'function_call_output',\n call_id: toolMessage.tool_call_id,\n id: toolMessage.id?.startsWith('fc_') ? toolMessage.id : undefined,\n output:\n typeof toolMessage.content !== 'string'\n ? JSON.stringify(toolMessage.content)\n : toolMessage.content,\n };\n }\n\n if (role === 'assistant') {\n // if we have the original response items, just reuse them\n if (\n !zdrEnabled &&\n lcMsg.response_metadata.output != null &&\n Array.isArray(lcMsg.response_metadata.output) &&\n lcMsg.response_metadata.output.length > 0 &&\n lcMsg.response_metadata.output.every((item) => 'type' in item)\n ) {\n return lcMsg.response_metadata.output;\n }\n\n // otherwise, try to reconstruct the response from what we have\n\n const input: ResponsesInputItem[] = [];\n\n // reasoning items\n if (additional_kwargs.reasoning && !zdrEnabled) {\n const reasoningItem = _convertReasoningSummaryToOpenAIResponsesParams(\n additional_kwargs.reasoning\n );\n input.push(reasoningItem);\n }\n\n // ai content\n let { content } = lcMsg;\n if (additional_kwargs.refusal) {\n if (typeof content === 'string') {\n content = [{ type: 'output_text', text: content, annotations: [] }];\n }\n content = [\n ...content,\n { type: 'refusal', refusal: additional_kwargs.refusal },\n ];\n }\n\n input.push({\n type: 'message',\n role: 'assistant',\n ...(lcMsg.id && !zdrEnabled && lcMsg.id.startsWith('msg_')\n ? { id: lcMsg.id }\n : {}),\n content:\n typeof content === 'string'\n ? content\n : content.flatMap((item) => {\n if (item.type === 'text') {\n return {\n type: 'output_text',\n text: item.text,\n // @ts-expect-error TODO: add types for `annotations`\n annotations: item.annotations ?? [],\n };\n }\n\n if (item.type === 'output_text' || item.type === 'refusal') {\n return item;\n }\n\n return [];\n }),\n });\n\n const functionCallIds = additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY];\n\n if (isAIMessage(lcMsg) && !!lcMsg.tool_calls?.length) {\n input.push(\n ...lcMsg.tool_calls.map(\n (toolCall): ResponsesInputItem => ({\n type: 'function_call',\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.args),\n call_id: toolCall.id!,\n ...(zdrEnabled ? { id: functionCallIds?.[toolCall.id!] } : {}),\n })\n )\n );\n } else if (additional_kwargs.tool_calls) {\n input.push(\n ...additional_kwargs.tool_calls.map(\n (toolCall): ResponsesInputItem => ({\n type: 'function_call',\n name: toolCall.function.name,\n call_id: toolCall.id,\n arguments: toolCall.function.arguments,\n ...(zdrEnabled ? { id: functionCallIds?.[toolCall.id] } : {}),\n })\n )\n );\n }\n\n const toolOutputs =\n ((\n lcMsg.response_metadata.output as\n | Array<ResponsesInputItem>\n | undefined\n )?.length ?? 0) > 0\n ? lcMsg.response_metadata.output\n : additional_kwargs.tool_outputs;\n\n const fallthroughCallTypes: ResponsesInputItem['type'][] = [\n 'computer_call',\n /** @ts-ignore */\n 'mcp_call',\n /** @ts-ignore */\n 'code_interpreter_call',\n /** @ts-ignore */\n 'image_generation_call',\n ];\n\n if (toolOutputs != null) {\n const castToolOutputs = toolOutputs as Array<ResponsesInputItem>;\n const fallthroughCalls = castToolOutputs.filter((item) =>\n fallthroughCallTypes.includes(item.type)\n );\n if (fallthroughCalls.length > 0) input.push(...fallthroughCalls);\n }\n\n return input;\n }\n\n if (role === 'user' || role === 'system' || role === 'developer') {\n if (typeof lcMsg.content === 'string') {\n return { type: 'message', role, content: lcMsg.content };\n }\n\n const messages: ResponsesInputItem[] = [];\n const content = lcMsg.content.flatMap((item) => {\n if (item.type === 'mcp_approval_response') {\n messages.push({\n // @ts-ignore\n type: 'mcp_approval_response',\n approval_request_id: item.approval_request_id,\n approve: item.approve,\n });\n }\n if (isDataContentBlock(item)) {\n return convertToProviderContentBlock(\n item,\n completionsApiContentBlockConverter\n );\n }\n if (item.type === 'text') {\n return {\n type: 'input_text',\n text: item.text,\n };\n }\n if (item.type === 'image_url') {\n return {\n type: 'input_image',\n image_url:\n typeof item.image_url === 'string'\n ? item.image_url\n : item.image_url.url,\n detail:\n typeof item.image_url === 'string'\n ? 'auto'\n : item.image_url.detail,\n };\n }\n if (\n item.type === 'input_text' ||\n item.type === 'input_image' ||\n item.type === 'input_file'\n ) {\n return item;\n }\n return [];\n });\n\n if (content.length > 0) {\n messages.push({ type: 'message', role, content });\n }\n return messages;\n }\n\n console.warn(\n `Unsupported role found when converting to OpenAI Responses API: ${role}`\n );\n return [];\n }\n );\n}\n\nexport function isReasoningModel(model?: string) {\n return model != null && model !== '' && /\\b(o\\d|gpt-[5-9])\\b/i.test(model);\n}\n\nfunction _convertOpenAIResponsesMessageToBaseMessage(\n response: ResponsesCreateInvoke | ResponsesParseInvoke\n): BaseMessage {\n if (response.error) {\n // TODO: add support for `addLangChainErrorFields`\n const error = new Error(response.error.message);\n error.name = response.error.code;\n throw error;\n }\n\n let messageId: string | undefined;\n const content: MessageContent = [];\n const tool_calls: ToolCall[] = [];\n const invalid_tool_calls: InvalidToolCall[] = [];\n const response_metadata: Record<string, unknown> = {\n model: response.model,\n created_at: response.created_at,\n id: response.id,\n incomplete_details: response.incomplete_details,\n metadata: response.metadata,\n object: response.object,\n status: response.status,\n user: response.user,\n service_tier: response.service_tier,\n\n // for compatibility with chat completion calls.\n model_name: response.model,\n };\n\n const additional_kwargs: {\n [key: string]: unknown;\n refusal?: string;\n reasoning?: OpenAIClient.Responses.ResponseReasoningItem;\n tool_outputs?: unknown[];\n parsed?: unknown;\n [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;\n } = {};\n\n for (const item of response.output) {\n if (item.type === 'message') {\n messageId = item.id;\n content.push(\n ...item.content.flatMap((part) => {\n if (part.type === 'output_text') {\n if ('parsed' in part && part.parsed != null) {\n additional_kwargs.parsed = part.parsed;\n }\n return {\n type: 'text',\n text: part.text,\n annotations: part.annotations,\n };\n }\n\n if (part.type === 'refusal') {\n additional_kwargs.refusal = part.refusal;\n return [];\n }\n\n return part;\n })\n );\n } else if (item.type === 'function_call') {\n const fnAdapter = {\n function: { name: item.name, arguments: item.arguments },\n id: item.call_id,\n };\n\n try {\n tool_calls.push(parseToolCall(fnAdapter, { returnId: true }));\n } catch (e: unknown) {\n let errMessage: string | undefined;\n if (\n typeof e === 'object' &&\n e != null &&\n 'message' in e &&\n typeof e.message === 'string'\n ) {\n errMessage = e.message;\n }\n invalid_tool_calls.push(makeInvalidToolCall(fnAdapter, errMessage));\n }\n\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] ??= {};\n if (item.id) {\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY][item.call_id] = item.id;\n }\n } else if (item.type === 'reasoning') {\n additional_kwargs.reasoning = item;\n } else {\n additional_kwargs.tool_outputs ??= [];\n additional_kwargs.tool_outputs.push(item);\n }\n }\n\n return new AIMessage({\n id: messageId,\n content,\n tool_calls,\n invalid_tool_calls,\n usage_metadata: response.usage,\n additional_kwargs,\n response_metadata,\n });\n}\n\nexport function _convertOpenAIResponsesDeltaToBaseMessageChunk(\n chunk: ResponseReturnStreamEvents\n) {\n const content: Record<string, unknown>[] = [];\n let generationInfo: Record<string, unknown> = {};\n let usage_metadata: UsageMetadata | undefined;\n const tool_call_chunks: ToolCallChunk[] = [];\n const response_metadata: Record<string, unknown> = {};\n const additional_kwargs: {\n [key: string]: unknown;\n reasoning?: Partial<ChatOpenAIReasoningSummary>;\n tool_outputs?: unknown[];\n } = {};\n let id: string | undefined;\n if (chunk.type === 'response.output_text.delta') {\n content.push({\n type: 'text',\n text: chunk.delta,\n index: chunk.content_index,\n });\n /** @ts-ignore */\n } else if (chunk.type === 'response.output_text_annotation.added') {\n content.push({\n type: 'text',\n text: '',\n /** @ts-ignore */\n annotations: [chunk.annotation],\n /** @ts-ignore */\n index: chunk.content_index,\n });\n } else if (\n chunk.type === 'response.output_item.added' &&\n chunk.item.type === 'message'\n ) {\n id = chunk.item.id;\n } else if (\n chunk.type === 'response.output_item.added' &&\n chunk.item.type === 'function_call'\n ) {\n tool_call_chunks.push({\n type: 'tool_call_chunk',\n name: chunk.item.name,\n args: chunk.item.arguments,\n id: chunk.item.call_id,\n index: chunk.output_index,\n });\n\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] = {\n [chunk.item.call_id]: chunk.item.id,\n };\n } else if (\n chunk.type === 'response.output_item.done' &&\n [\n 'web_search_call',\n 'file_search_call',\n 'computer_call',\n 'code_interpreter_call',\n 'mcp_call',\n 'mcp_list_tools',\n 'mcp_approval_request',\n 'image_generation_call',\n ].includes(chunk.item.type)\n ) {\n additional_kwargs.tool_outputs = [chunk.item];\n } else if (chunk.type === 'response.created') {\n response_metadata.id = chunk.response.id;\n response_metadata.model_name = chunk.response.model;\n response_metadata.model = chunk.response.model;\n } else if (chunk.type === 'response.completed') {\n const msg = _convertOpenAIResponsesMessageToBaseMessage(chunk.response);\n\n usage_metadata = chunk.response.usage;\n if (chunk.response.text?.format?.type === 'json_schema') {\n additional_kwargs.parsed ??= JSON.parse(msg.text);\n }\n for (const [key, value] of Object.entries(chunk.response)) {\n if (key !== 'id') response_metadata[key] = value;\n }\n } else if (chunk.type === 'response.function_call_arguments.delta') {\n tool_call_chunks.push({\n type: 'tool_call_chunk',\n args: chunk.delta,\n index: chunk.output_index,\n });\n } else if (\n chunk.type === 'response.web_search_call.completed' ||\n chunk.type === 'response.file_search_call.completed'\n ) {\n generationInfo = {\n tool_outputs: {\n id: chunk.item_id,\n type: chunk.type.replace('response.', '').replace('.completed', ''),\n status: 'completed',\n },\n };\n } else if (chunk.type === 'response.refusal.done') {\n additional_kwargs.refusal = chunk.refusal;\n } else if (\n chunk.type === 'response.output_item.added' &&\n 'item' in chunk &&\n chunk.item.type === 'reasoning'\n ) {\n const summary: ChatOpenAIReasoningSummary['summary'] | undefined = chunk\n .item.summary\n ? chunk.item.summary.map((s, index) => ({\n ...s,\n index,\n }))\n : undefined;\n\n additional_kwargs.reasoning = {\n // We only capture ID in the first chunk or else the concatenated result of all chunks will\n // have an ID field that is repeated once per chunk. There is special handling for the `type`\n // field that prevents this, however.\n id: chunk.item.id,\n type: chunk.item.type,\n ...(summary ? { summary } : {}),\n };\n } else if (chunk.type === 'response.reasoning_summary_part.added') {\n additional_kwargs.reasoning = {\n type: 'reasoning',\n summary: [{ ...chunk.part, index: chunk.summary_index }],\n };\n } else if (chunk.type === 'response.reasoning_summary_text.delta') {\n additional_kwargs.reasoning = {\n type: 'reasoning',\n summary: [\n { text: chunk.delta, type: 'summary_text', index: chunk.summary_index },\n ],\n };\n /** @ts-ignore */\n } else if (chunk.type === 'response.image_generation_call.partial_image') {\n // noop/fixme: retaining partial images in a message chunk means that _all_\n // partial images get kept in history, so we don't do anything here.\n return null;\n } else {\n return null;\n }\n\n return new ChatGenerationChunk({\n // Legacy reasons, `onLLMNewToken` should pulls this out\n text: content.map((part) => part.text).join(''),\n message: new AIMessageChunk({\n id,\n content,\n tool_call_chunks,\n usage_metadata,\n additional_kwargs,\n response_metadata,\n }),\n generationInfo,\n });\n}\n"],"names":["ChatMessage","parseBase64DataUrl","parseMimeType","messages","isDataContentBlock","convertToProviderContentBlock","isAIMessage","convertLangChainToolCallToOpenAI","parseToolCall","makeInvalidToolCall","AIMessage","ChatGenerationChunk","AIMessageChunk"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../src/llm/openai/utils/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { type OpenAI as OpenAIClient } from 'openai';\nimport type {\n ChatCompletionContentPartText,\n ChatCompletionContentPartImage,\n ChatCompletionContentPartInputAudio,\n ChatCompletionContentPart,\n} from 'openai/resources/chat/completions';\nimport {\n AIMessage,\n AIMessageChunk,\n type BaseMessage,\n ChatMessage,\n ToolMessage,\n isAIMessage,\n type UsageMetadata,\n type BaseMessageFields,\n type MessageContent,\n type InvalidToolCall,\n type MessageContentImageUrl,\n StandardContentBlockConverter,\n parseBase64DataUrl,\n parseMimeType,\n convertToProviderContentBlock,\n isDataContentBlock,\n} from '@langchain/core/messages';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport {\n convertLangChainToolCallToOpenAI,\n makeInvalidToolCall,\n parseToolCall,\n} from '@langchain/core/output_parsers/openai_tools';\nimport type { ToolCall, ToolCallChunk } from '@langchain/core/messages/tool';\nimport type {\n OpenAICallOptions,\n OpenAIChatInput,\n ChatOpenAIReasoningSummary,\n} from '@langchain/openai';\n\nexport type { OpenAICallOptions, OpenAIChatInput };\n\n// Utility types to get hidden OpenAI response types\ntype ExtractAsyncIterableType<T> = T extends AsyncIterable<infer U> ? U : never;\ntype ExcludeController<T> = T extends { controller: unknown } ? never : T;\ntype ExcludeNonController<T> = T extends { controller: unknown } ? T : never;\n\ntype ResponsesCreate = OpenAIClient.Responses['create'];\ntype ResponsesParse = OpenAIClient.Responses['parse'];\n\ntype ResponsesInputItem = OpenAIClient.Responses.ResponseInputItem;\n\ntype ResponsesCreateInvoke = ExcludeController<\n Awaited<ReturnType<ResponsesCreate>>\n>;\n\ntype ResponsesParseInvoke = ExcludeController<\n Awaited<ReturnType<ResponsesParse>>\n>;\n\ntype ResponsesCreateStream = ExcludeNonController<\n Awaited<ReturnType<ResponsesCreate>>\n>;\n\nexport type ResponseReturnStreamEvents =\n ExtractAsyncIterableType<ResponsesCreateStream>;\n\n// TODO import from SDK when available\ntype OpenAIRoleEnum =\n | 'system'\n | 'developer'\n | 'assistant'\n | 'user'\n | 'function'\n | 'tool';\n\ntype OpenAICompletionParam =\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam;\n\nfunction extractGenericMessageCustomRole(message: ChatMessage) {\n if (\n message.role !== 'system' &&\n message.role !== 'developer' &&\n message.role !== 'assistant' &&\n message.role !== 'user' &&\n message.role !== 'function' &&\n message.role !== 'tool'\n ) {\n console.warn(`Unknown message role: ${message.role}`);\n }\n\n return message.role as OpenAIRoleEnum;\n}\n\nexport function messageToOpenAIRole(message: BaseMessage): OpenAIRoleEnum {\n const type = message._getType();\n switch (type) {\n case 'system':\n return 'system';\n case 'ai':\n return 'assistant';\n case 'human':\n return 'user';\n case 'function':\n return 'function';\n case 'tool':\n return 'tool';\n case 'generic': {\n if (!ChatMessage.isInstance(message))\n throw new Error('Invalid generic chat message');\n return extractGenericMessageCustomRole(message);\n }\n default:\n throw new Error(`Unknown message type: ${type}`);\n }\n}\n\nconst completionsApiContentBlockConverter: StandardContentBlockConverter<{\n text: ChatCompletionContentPartText;\n image: ChatCompletionContentPartImage;\n audio: ChatCompletionContentPartInputAudio;\n file: ChatCompletionContentPart.File;\n}> = {\n providerName: 'ChatOpenAI',\n\n fromStandardTextBlock(block): ChatCompletionContentPartText {\n return { type: 'text', text: block.text };\n },\n\n fromStandardImageBlock(block): ChatCompletionContentPartImage {\n if (block.source_type === 'url') {\n return {\n type: 'image_url',\n image_url: {\n url: block.url,\n ...(block.metadata?.detail\n ? { detail: block.metadata.detail as 'auto' | 'low' | 'high' }\n : {}),\n },\n };\n }\n\n if (block.source_type === 'base64') {\n const url = `data:${block.mime_type ?? ''};base64,${block.data}`;\n return {\n type: 'image_url',\n image_url: {\n url,\n ...(block.metadata?.detail\n ? { detail: block.metadata.detail as 'auto' | 'low' | 'high' }\n : {}),\n },\n };\n }\n\n throw new Error(\n `Image content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n\n fromStandardAudioBlock(block): ChatCompletionContentPartInputAudio {\n if (block.source_type === 'url') {\n const data = parseBase64DataUrl({ dataUrl: block.url });\n if (!data) {\n throw new Error(\n `URL audio blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`\n );\n }\n\n const rawMimeType = data.mime_type || block.mime_type || '';\n let mimeType: { type: string; subtype: string };\n\n try {\n mimeType = parseMimeType(rawMimeType);\n } catch {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n if (\n mimeType.type !== 'audio' ||\n (mimeType.subtype !== 'wav' && mimeType.subtype !== 'mp3')\n ) {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n return {\n type: 'input_audio',\n input_audio: {\n format: mimeType.subtype,\n data: data.data,\n },\n };\n }\n\n if (block.source_type === 'base64') {\n let mimeType: { type: string; subtype: string };\n\n try {\n mimeType = parseMimeType(block.mime_type ?? '');\n } catch {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n if (\n mimeType.type !== 'audio' ||\n (mimeType.subtype !== 'wav' && mimeType.subtype !== 'mp3')\n ) {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n return {\n type: 'input_audio',\n input_audio: {\n format: mimeType.subtype,\n data: block.data,\n },\n };\n }\n\n throw new Error(\n `Audio content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n\n fromStandardFileBlock(block): ChatCompletionContentPart.File {\n if (block.source_type === 'url') {\n const data = parseBase64DataUrl({ dataUrl: block.url });\n if (!data) {\n throw new Error(\n `URL file blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`\n );\n }\n\n return {\n type: 'file',\n file: {\n file_data: block.url, // formatted as base64 data URL\n ...(block.metadata?.filename || block.metadata?.name\n ? {\n filename: (block.metadata.filename ||\n block.metadata.name) as string,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === 'base64') {\n return {\n type: 'file',\n file: {\n file_data: `data:${block.mime_type ?? ''};base64,${block.data}`,\n ...(block.metadata?.filename ||\n block.metadata?.name ||\n block.metadata?.title\n ? {\n filename: (block.metadata.filename ||\n block.metadata.name ||\n block.metadata.title) as string,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === 'id') {\n return {\n type: 'file',\n file: {\n file_id: block.id,\n },\n };\n }\n\n throw new Error(\n `File content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n};\n\n/** Options for converting messages to OpenAI params */\nexport interface ConvertMessagesOptions {\n /** Include reasoning_content field for DeepSeek thinking mode with tool calls */\n includeReasoningContent?: boolean;\n /** Include reasoning_details field for OpenRouter/Gemini thinking mode with tool calls */\n includeReasoningDetails?: boolean;\n /** Convert reasoning_details to content blocks for Claude (requires content array format) */\n convertReasoningDetailsToContent?: boolean;\n}\n\n// Used in LangSmith, export is important here\nexport function _convertMessagesToOpenAIParams(\n messages: BaseMessage[],\n model?: string,\n options?: ConvertMessagesOptions\n): OpenAICompletionParam[] {\n /* DeepSeek reasoning roundtrip (PR #136): reasoning_content on\n * an AI message must be re-sent only when the message participates in a\n * tool-call exchange. Track context across the message flat-map. */\n let hasReasoningToolCallContext = false;\n // TODO: Function messages do not support array content, fix cast\n return messages.flatMap((message) => {\n let role = messageToOpenAIRole(message);\n if (role === 'system' && isReasoningModel(model)) {\n role = 'developer';\n }\n\n let hasAnthropicThinkingBlock: boolean = false;\n\n const content =\n typeof message.content === 'string'\n ? message.content\n : message.content.map((m) => {\n if ('type' in m && m.type === 'thinking') {\n hasAnthropicThinkingBlock = true;\n return m;\n }\n if (isDataContentBlock(m)) {\n return convertToProviderContentBlock(\n m,\n completionsApiContentBlockConverter\n );\n }\n return m;\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const completionParam: Record<string, any> = {\n role,\n content,\n };\n let messageHasToolCalls = false;\n let messageIsToolResult = false;\n if (message.name != null) {\n completionParam.name = message.name;\n }\n if (message.additional_kwargs.function_call != null) {\n completionParam.function_call = message.additional_kwargs.function_call;\n completionParam.content = '';\n }\n if (isAIMessage(message) && !!message.tool_calls?.length) {\n messageHasToolCalls = true;\n completionParam.tool_calls = message.tool_calls.map(\n convertLangChainToolCallToOpenAI\n );\n completionParam.content = hasAnthropicThinkingBlock ? content : '';\n if (\n options?.includeReasoningDetails === true &&\n message.additional_kwargs.reasoning_details != null\n ) {\n // For Claude via OpenRouter, convert reasoning_details to content blocks\n const isClaudeModel =\n model?.includes('claude') === true ||\n model?.includes('anthropic') === true;\n if (\n options.convertReasoningDetailsToContent === true &&\n isClaudeModel\n ) {\n const reasoningDetails = message.additional_kwargs\n .reasoning_details as Record<string, unknown>[];\n const contentBlocks = [];\n\n // Add thinking blocks from reasoning_details\n for (const detail of reasoningDetails) {\n if (detail.type === 'reasoning.text' && detail.text != null) {\n contentBlocks.push({\n type: 'thinking',\n thinking: detail.text,\n });\n } else if (\n detail.type === 'reasoning.encrypted' &&\n detail.data != null\n ) {\n contentBlocks.push({\n type: 'redacted_thinking',\n data: detail.data,\n id: detail.id,\n });\n }\n }\n\n // Set content to array with thinking blocks\n if (contentBlocks.length > 0) {\n completionParam.content = contentBlocks;\n }\n } else {\n // For non-Claude models, pass as separate field\n completionParam.reasoning_details =\n message.additional_kwargs.reasoning_details;\n }\n }\n } else {\n if (message.additional_kwargs.tool_calls != null) {\n messageHasToolCalls =\n !Array.isArray(message.additional_kwargs.tool_calls) ||\n message.additional_kwargs.tool_calls.length > 0;\n completionParam.tool_calls = message.additional_kwargs.tool_calls;\n if (\n options?.includeReasoningDetails === true &&\n message.additional_kwargs.reasoning_details != null\n ) {\n // For Claude via OpenRouter, convert reasoning_details to content blocks\n const isClaudeModel =\n model?.includes('claude') === true ||\n model?.includes('anthropic') === true;\n if (\n options.convertReasoningDetailsToContent === true &&\n isClaudeModel\n ) {\n const reasoningDetails = message.additional_kwargs\n .reasoning_details as Record<string, unknown>[];\n const contentBlocks = [];\n\n // Add thinking blocks from reasoning_details\n for (const detail of reasoningDetails) {\n if (detail.type === 'reasoning.text' && detail.text != null) {\n contentBlocks.push({\n type: 'thinking',\n thinking: detail.text,\n });\n } else if (\n detail.type === 'reasoning.encrypted' &&\n detail.data != null\n ) {\n contentBlocks.push({\n type: 'redacted_thinking',\n data: detail.data,\n id: detail.id,\n });\n }\n }\n\n // Set content to array with thinking blocks\n if (contentBlocks.length > 0) {\n completionParam.content = contentBlocks;\n }\n } else {\n // For non-Claude models, pass as separate field\n completionParam.reasoning_details =\n message.additional_kwargs.reasoning_details;\n }\n }\n }\n if ((message as ToolMessage).tool_call_id != null) {\n messageIsToolResult = true;\n completionParam.tool_call_id = (message as ToolMessage).tool_call_id;\n }\n }\n\n /* DeepSeek reasoning roundtrip (PR #136): emit\n * reasoning_content only when the message is part of a tool-call\n * exchange — either the message itself has tool_calls, or a previous\n * AI/tool message established the context. Skipping the gate causes\n * DeepSeek to drop reasoning content during multi-turn replays. */\n if (\n options?.includeReasoningContent === true &&\n isAIMessage(message) &&\n (hasReasoningToolCallContext || messageHasToolCalls) &&\n typeof message.additional_kwargs.reasoning_content === 'string' &&\n message.additional_kwargs.reasoning_content !== ''\n ) {\n completionParam.reasoning_content =\n message.additional_kwargs.reasoning_content;\n }\n\n if (messageHasToolCalls || messageIsToolResult) {\n hasReasoningToolCallContext = true;\n }\n\n if (\n message.additional_kwargs.audio &&\n typeof message.additional_kwargs.audio === 'object' &&\n 'id' in message.additional_kwargs.audio\n ) {\n const audioMessage = {\n role: 'assistant',\n audio: {\n id: message.additional_kwargs.audio.id,\n },\n };\n return [completionParam, audioMessage] as OpenAICompletionParam[];\n }\n\n return completionParam as OpenAICompletionParam;\n });\n}\n\nconst _FUNCTION_CALL_IDS_MAP_KEY = '__openai_function_call_ids__';\n\nfunction _convertReasoningSummaryToOpenAIResponsesParams(\n reasoning: ChatOpenAIReasoningSummary\n): OpenAIClient.Responses.ResponseReasoningItem {\n // combine summary parts that have the the same index and then remove the indexes\n const summary = (\n reasoning.summary.length > 1\n ? reasoning.summary.reduce(\n (acc, curr) => {\n const last = acc.at(-1);\n\n if (last!.index === curr.index) {\n last!.text += curr.text;\n } else {\n acc.push(curr);\n }\n return acc;\n },\n [{ ...reasoning.summary[0] }]\n )\n : reasoning.summary\n ).map((s) =>\n Object.fromEntries(Object.entries(s).filter(([k]) => k !== 'index'))\n ) as OpenAIClient.Responses.ResponseReasoningItem.Summary[];\n\n return {\n ...reasoning,\n summary,\n } as OpenAIClient.Responses.ResponseReasoningItem;\n}\n\nexport function _convertMessagesToOpenAIResponsesParams(\n messages: BaseMessage[],\n model?: string,\n zdrEnabled?: boolean\n): ResponsesInputItem[] {\n return messages.flatMap(\n (lcMsg): ResponsesInputItem | ResponsesInputItem[] => {\n const additional_kwargs =\n lcMsg.additional_kwargs as BaseMessageFields['additional_kwargs'] & {\n [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;\n reasoning?: OpenAIClient.Responses.ResponseReasoningItem;\n type?: string;\n refusal?: string;\n };\n\n let role = messageToOpenAIRole(lcMsg);\n if (role === 'system' && isReasoningModel(model)) role = 'developer';\n\n if (role === 'function') {\n throw new Error('Function messages are not supported in Responses API');\n }\n\n if (role === 'tool') {\n const toolMessage = lcMsg as ToolMessage;\n\n // Handle computer call output\n if (additional_kwargs.type === 'computer_call_output') {\n const output = (() => {\n if (typeof toolMessage.content === 'string') {\n return {\n type: 'computer_screenshot' as const,\n image_url: toolMessage.content,\n };\n }\n\n if (Array.isArray(toolMessage.content)) {\n const oaiScreenshot = toolMessage.content.find(\n (i) => i.type === 'computer_screenshot'\n ) as { type: 'computer_screenshot'; image_url: string };\n\n if (oaiScreenshot) return oaiScreenshot;\n\n const lcImage = toolMessage.content.find(\n (i) => i.type === 'image_url'\n ) as MessageContentImageUrl;\n\n if (lcImage) {\n return {\n type: 'computer_screenshot' as const,\n image_url:\n typeof lcImage.image_url === 'string'\n ? lcImage.image_url\n : lcImage.image_url.url,\n };\n }\n }\n\n throw new Error('Invalid computer call output');\n })();\n\n return {\n type: 'computer_call_output',\n output,\n call_id: toolMessage.tool_call_id,\n };\n }\n\n return {\n type: 'function_call_output',\n call_id: toolMessage.tool_call_id,\n id: toolMessage.id?.startsWith('fc_') ? toolMessage.id : undefined,\n output:\n typeof toolMessage.content !== 'string'\n ? JSON.stringify(toolMessage.content)\n : toolMessage.content,\n };\n }\n\n if (role === 'assistant') {\n // if we have the original response items, just reuse them\n if (\n !zdrEnabled &&\n lcMsg.response_metadata.output != null &&\n Array.isArray(lcMsg.response_metadata.output) &&\n lcMsg.response_metadata.output.length > 0 &&\n lcMsg.response_metadata.output.every((item) => 'type' in item)\n ) {\n return lcMsg.response_metadata.output;\n }\n\n // otherwise, try to reconstruct the response from what we have\n\n const input: ResponsesInputItem[] = [];\n\n // reasoning items\n if (additional_kwargs.reasoning && !zdrEnabled) {\n const reasoningItem = _convertReasoningSummaryToOpenAIResponsesParams(\n additional_kwargs.reasoning\n );\n input.push(reasoningItem);\n }\n\n // ai content\n let { content } = lcMsg;\n if (additional_kwargs.refusal) {\n if (typeof content === 'string') {\n content = [{ type: 'output_text', text: content, annotations: [] }];\n }\n content = [\n ...content,\n { type: 'refusal', refusal: additional_kwargs.refusal },\n ];\n }\n\n input.push({\n type: 'message',\n role: 'assistant',\n ...(lcMsg.id && !zdrEnabled && lcMsg.id.startsWith('msg_')\n ? { id: lcMsg.id }\n : {}),\n content:\n typeof content === 'string'\n ? content\n : content.flatMap((item) => {\n if (item.type === 'text') {\n return {\n type: 'output_text',\n text: item.text,\n // @ts-expect-error TODO: add types for `annotations`\n annotations: item.annotations ?? [],\n };\n }\n\n if (item.type === 'output_text' || item.type === 'refusal') {\n return item;\n }\n\n return [];\n }),\n });\n\n const functionCallIds = additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY];\n\n if (isAIMessage(lcMsg) && !!lcMsg.tool_calls?.length) {\n input.push(\n ...lcMsg.tool_calls.map(\n (toolCall): ResponsesInputItem => ({\n type: 'function_call',\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.args),\n call_id: toolCall.id!,\n ...(zdrEnabled ? { id: functionCallIds?.[toolCall.id!] } : {}),\n })\n )\n );\n } else if (additional_kwargs.tool_calls) {\n input.push(\n ...additional_kwargs.tool_calls.map(\n (toolCall): ResponsesInputItem => ({\n type: 'function_call',\n name: toolCall.function.name,\n call_id: toolCall.id,\n arguments: toolCall.function.arguments,\n ...(zdrEnabled ? { id: functionCallIds?.[toolCall.id] } : {}),\n })\n )\n );\n }\n\n const toolOutputs =\n ((\n lcMsg.response_metadata.output as\n | Array<ResponsesInputItem>\n | undefined\n )?.length ?? 0) > 0\n ? lcMsg.response_metadata.output\n : additional_kwargs.tool_outputs;\n\n const fallthroughCallTypes: ResponsesInputItem['type'][] = [\n 'computer_call',\n /** @ts-ignore */\n 'mcp_call',\n /** @ts-ignore */\n 'code_interpreter_call',\n /** @ts-ignore */\n 'image_generation_call',\n ];\n\n if (toolOutputs != null) {\n const castToolOutputs = toolOutputs as Array<ResponsesInputItem>;\n const fallthroughCalls = castToolOutputs.filter((item) =>\n fallthroughCallTypes.includes(item.type)\n );\n if (fallthroughCalls.length > 0) input.push(...fallthroughCalls);\n }\n\n return input;\n }\n\n if (role === 'user' || role === 'system' || role === 'developer') {\n if (typeof lcMsg.content === 'string') {\n return { type: 'message', role, content: lcMsg.content };\n }\n\n const messages: ResponsesInputItem[] = [];\n const content = lcMsg.content.flatMap((item) => {\n if (item.type === 'mcp_approval_response') {\n messages.push({\n // @ts-ignore\n type: 'mcp_approval_response',\n approval_request_id: item.approval_request_id,\n approve: item.approve,\n });\n }\n if (isDataContentBlock(item)) {\n return convertToProviderContentBlock(\n item,\n completionsApiContentBlockConverter\n );\n }\n if (item.type === 'text') {\n return {\n type: 'input_text',\n text: item.text,\n };\n }\n if (item.type === 'image_url') {\n return {\n type: 'input_image',\n image_url:\n typeof item.image_url === 'string'\n ? item.image_url\n : item.image_url.url,\n detail:\n typeof item.image_url === 'string'\n ? 'auto'\n : item.image_url.detail,\n };\n }\n if (\n item.type === 'input_text' ||\n item.type === 'input_image' ||\n item.type === 'input_file'\n ) {\n return item;\n }\n return [];\n });\n\n if (content.length > 0) {\n messages.push({ type: 'message', role, content });\n }\n return messages;\n }\n\n console.warn(\n `Unsupported role found when converting to OpenAI Responses API: ${role}`\n );\n return [];\n }\n );\n}\n\nexport function isReasoningModel(model?: string) {\n return model != null && model !== '' && /\\b(o\\d|gpt-[5-9])\\b/i.test(model);\n}\n\nfunction _convertOpenAIResponsesMessageToBaseMessage(\n response: ResponsesCreateInvoke | ResponsesParseInvoke\n): BaseMessage {\n if (response.error) {\n // TODO: add support for `addLangChainErrorFields`\n const error = new Error(response.error.message);\n error.name = response.error.code;\n throw error;\n }\n\n let messageId: string | undefined;\n const content: MessageContent = [];\n const tool_calls: ToolCall[] = [];\n const invalid_tool_calls: InvalidToolCall[] = [];\n const response_metadata: Record<string, unknown> = {\n model: response.model,\n created_at: response.created_at,\n id: response.id,\n incomplete_details: response.incomplete_details,\n metadata: response.metadata,\n object: response.object,\n status: response.status,\n user: response.user,\n service_tier: response.service_tier,\n\n // for compatibility with chat completion calls.\n model_name: response.model,\n };\n\n const additional_kwargs: {\n [key: string]: unknown;\n refusal?: string;\n reasoning?: OpenAIClient.Responses.ResponseReasoningItem;\n tool_outputs?: unknown[];\n parsed?: unknown;\n [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;\n } = {};\n\n for (const item of response.output) {\n if (item.type === 'message') {\n messageId = item.id;\n content.push(\n ...item.content.flatMap((part) => {\n if (part.type === 'output_text') {\n if ('parsed' in part && part.parsed != null) {\n additional_kwargs.parsed = part.parsed;\n }\n return {\n type: 'text',\n text: part.text,\n annotations: part.annotations,\n };\n }\n\n if (part.type === 'refusal') {\n additional_kwargs.refusal = part.refusal;\n return [];\n }\n\n return part;\n })\n );\n } else if (item.type === 'function_call') {\n const fnAdapter = {\n function: { name: item.name, arguments: item.arguments },\n id: item.call_id,\n };\n\n try {\n tool_calls.push(parseToolCall(fnAdapter, { returnId: true }));\n } catch (e: unknown) {\n let errMessage: string | undefined;\n if (\n typeof e === 'object' &&\n e != null &&\n 'message' in e &&\n typeof e.message === 'string'\n ) {\n errMessage = e.message;\n }\n invalid_tool_calls.push(makeInvalidToolCall(fnAdapter, errMessage));\n }\n\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] ??= {};\n if (item.id) {\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY][item.call_id] = item.id;\n }\n } else if (item.type === 'reasoning') {\n additional_kwargs.reasoning = item;\n } else {\n additional_kwargs.tool_outputs ??= [];\n additional_kwargs.tool_outputs.push(item);\n }\n }\n\n return new AIMessage({\n id: messageId,\n content,\n tool_calls,\n invalid_tool_calls,\n usage_metadata: response.usage,\n additional_kwargs,\n response_metadata,\n });\n}\n\nexport function _convertOpenAIResponsesDeltaToBaseMessageChunk(\n chunk: ResponseReturnStreamEvents\n) {\n const content: Record<string, unknown>[] = [];\n let generationInfo: Record<string, unknown> = {};\n let usage_metadata: UsageMetadata | undefined;\n const tool_call_chunks: ToolCallChunk[] = [];\n const response_metadata: Record<string, unknown> = {};\n const additional_kwargs: {\n [key: string]: unknown;\n reasoning?: Partial<ChatOpenAIReasoningSummary>;\n tool_outputs?: unknown[];\n } = {};\n let id: string | undefined;\n if (chunk.type === 'response.output_text.delta') {\n content.push({\n type: 'text',\n text: chunk.delta,\n index: chunk.content_index,\n });\n /** @ts-ignore */\n } else if (chunk.type === 'response.output_text_annotation.added') {\n content.push({\n type: 'text',\n text: '',\n /** @ts-ignore */\n annotations: [chunk.annotation],\n /** @ts-ignore */\n index: chunk.content_index,\n });\n } else if (\n chunk.type === 'response.output_item.added' &&\n chunk.item.type === 'message'\n ) {\n id = chunk.item.id;\n } else if (\n chunk.type === 'response.output_item.added' &&\n chunk.item.type === 'function_call'\n ) {\n tool_call_chunks.push({\n type: 'tool_call_chunk',\n name: chunk.item.name,\n args: chunk.item.arguments,\n id: chunk.item.call_id,\n index: chunk.output_index,\n });\n\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] = {\n [chunk.item.call_id]: chunk.item.id,\n };\n } else if (\n chunk.type === 'response.output_item.done' &&\n [\n 'web_search_call',\n 'file_search_call',\n 'computer_call',\n 'code_interpreter_call',\n 'mcp_call',\n 'mcp_list_tools',\n 'mcp_approval_request',\n 'image_generation_call',\n ].includes(chunk.item.type)\n ) {\n additional_kwargs.tool_outputs = [chunk.item];\n } else if (chunk.type === 'response.created') {\n response_metadata.id = chunk.response.id;\n response_metadata.model_name = chunk.response.model;\n response_metadata.model = chunk.response.model;\n } else if (chunk.type === 'response.completed') {\n const msg = _convertOpenAIResponsesMessageToBaseMessage(chunk.response);\n\n usage_metadata = chunk.response.usage;\n if (chunk.response.text?.format?.type === 'json_schema') {\n additional_kwargs.parsed ??= JSON.parse(msg.text);\n }\n for (const [key, value] of Object.entries(chunk.response)) {\n if (key !== 'id') response_metadata[key] = value;\n }\n } else if (chunk.type === 'response.function_call_arguments.delta') {\n tool_call_chunks.push({\n type: 'tool_call_chunk',\n args: chunk.delta,\n index: chunk.output_index,\n });\n } else if (\n chunk.type === 'response.web_search_call.completed' ||\n chunk.type === 'response.file_search_call.completed'\n ) {\n generationInfo = {\n tool_outputs: {\n id: chunk.item_id,\n type: chunk.type.replace('response.', '').replace('.completed', ''),\n status: 'completed',\n },\n };\n } else if (chunk.type === 'response.refusal.done') {\n additional_kwargs.refusal = chunk.refusal;\n } else if (\n chunk.type === 'response.output_item.added' &&\n 'item' in chunk &&\n chunk.item.type === 'reasoning'\n ) {\n const summary: ChatOpenAIReasoningSummary['summary'] | undefined = chunk\n .item.summary\n ? chunk.item.summary.map((s, index) => ({\n ...s,\n index,\n }))\n : undefined;\n\n additional_kwargs.reasoning = {\n // We only capture ID in the first chunk or else the concatenated result of all chunks will\n // have an ID field that is repeated once per chunk. There is special handling for the `type`\n // field that prevents this, however.\n id: chunk.item.id,\n type: chunk.item.type,\n ...(summary ? { summary } : {}),\n };\n } else if (chunk.type === 'response.reasoning_summary_part.added') {\n additional_kwargs.reasoning = {\n type: 'reasoning',\n summary: [{ ...chunk.part, index: chunk.summary_index }],\n };\n } else if (chunk.type === 'response.reasoning_summary_text.delta') {\n additional_kwargs.reasoning = {\n type: 'reasoning',\n summary: [\n { text: chunk.delta, type: 'summary_text', index: chunk.summary_index },\n ],\n };\n /** @ts-ignore */\n } else if (chunk.type === 'response.image_generation_call.partial_image') {\n // noop/fixme: retaining partial images in a message chunk means that _all_\n // partial images get kept in history, so we don't do anything here.\n return null;\n } else {\n return null;\n }\n\n return new ChatGenerationChunk({\n // Legacy reasons, `onLLMNewToken` should pulls this out\n text: content.map((part) => part.text).join(''),\n message: new AIMessageChunk({\n id,\n content,\n tool_call_chunks,\n usage_metadata,\n additional_kwargs,\n response_metadata,\n }),\n generationInfo,\n });\n}\n"],"names":["ChatMessage","parseBase64DataUrl","parseMimeType","messages","isDataContentBlock","convertToProviderContentBlock","isAIMessage","convertLangChainToolCallToOpenAI","parseToolCall","makeInvalidToolCall","AIMessage","ChatGenerationChunk","AIMessageChunk"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  /**
4
4
  * Citation decoration — Phase 2.
5
5
  *
6
- * Ported from upstream `extensions/memory-core/src/tools.citations.ts`.
6
+ * Ported from a reference implementation `extensions/memory-core/src/tools.citations.ts`.
7
7
  * Decorates memory_search hits with `[path#L{start}-L{end}]` markers so
8
8
  * the model can attribute claims back to specific memory files when it
9
9
  * uses them in its answer.
@@ -12,7 +12,7 @@
12
12
  * compute line ranges from the returned content block on the fly:
13
13
  * - `startLine` = 1 (line 1 of the file)
14
14
  * - `endLine` = total number of lines in the block
15
- * This matches upstream's output format exactly while keeping the pg
15
+ * This matches the standard output format exactly while keeping the pg
16
16
  * schema chunk-free.
17
17
  */
18
18
  const DEFAULT_CITATIONS_MODE = 'auto';
@@ -32,7 +32,7 @@ function formatCitation(path, startLine, endLine) {
32
32
  return `${path}#L${startLine}-L${endLine}`;
33
33
  }
34
34
  /**
35
- * Decorate each hit with a citation marker. Mirrors upstream's behavior:
35
+ * Decorate each hit with a citation marker. Mirrors the standard behavior:
36
36
  * appends `\n\nSource: <citation>` to the content and sets `citation`.
37
37
  * When `include=false`, clears any existing citation field.
38
38
  */
@@ -50,7 +50,7 @@ function decorateCitations(hits, include) {
50
50
  /**
51
51
  * Whether citations should be emitted for this call.
52
52
  *
53
- * Upstream keys `auto` off the session type (direct/group/channel). In
53
+ * The reference implementation keys `auto` off the session type (direct/group/channel). In
54
54
  * Phase 1 we only have direct chat, so `auto` => `on`. Callers that
55
55
  * later distinguish session types can pass `mode` explicitly.
56
56
  */
@@ -1 +1 @@
1
- {"version":3,"file":"citations.cjs","sources":["../../../src/memory/citations.ts"],"sourcesContent":["/**\n * Citation decoration — Phase 2.\n *\n * Ported from upstream `extensions/memory-core/src/tools.citations.ts`.\n * Decorates memory_search hits with `[path#L{start}-L{end}]` markers so\n * the model can attribute claims back to specific memory files when it\n * uses them in its answer.\n *\n * Since our backend stores files as single rows (not line-chunked), we\n * compute line ranges from the returned content block on the fly:\n * - `startLine` = 1 (line 1 of the file)\n * - `endLine` = total number of lines in the block\n * This matches upstream's output format exactly while keeping the pg\n * schema chunk-free.\n */\n\nexport type MemoryCitationsMode = 'on' | 'off' | 'auto';\n\nexport const DEFAULT_CITATIONS_MODE: MemoryCitationsMode = 'auto';\n\nexport function resolveMemoryCitationsMode(\n raw: string | undefined | null\n): MemoryCitationsMode {\n if (raw === 'on' || raw === 'off' || raw === 'auto') return raw;\n return DEFAULT_CITATIONS_MODE;\n}\n\nexport interface CitationCandidate {\n path: string;\n content: string;\n startLine?: number;\n endLine?: number;\n citation?: string;\n}\n\nfunction countLines(text: string): number {\n if (!text) return 1;\n return Math.max(1, text.split('\\n').length);\n}\n\nfunction formatCitation(\n path: string,\n startLine: number,\n endLine: number\n): string {\n if (startLine === endLine) return `${path}#L${startLine}`;\n return `${path}#L${startLine}-L${endLine}`;\n}\n\n/**\n * Decorate each hit with a citation marker. Mirrors upstream's behavior:\n * appends `\\n\\nSource: <citation>` to the content and sets `citation`.\n * When `include=false`, clears any existing citation field.\n */\nexport function decorateCitations<T extends CitationCandidate>(\n hits: T[],\n include: boolean\n): T[] {\n if (!include) return hits.map((h) => ({ ...h, citation: undefined }));\n return hits.map((h) => {\n const start = Math.max(1, Math.floor(h.startLine ?? 1));\n const end = Math.max(start, Math.floor(h.endLine ?? countLines(h.content)));\n const citation = formatCitation(h.path, start, end);\n const content = `${(h.content ?? '').trimEnd()}\\n\\nSource: ${citation}`;\n return { ...h, citation, content, startLine: start, endLine: end };\n });\n}\n\n/**\n * Whether citations should be emitted for this call.\n *\n * Upstream keys `auto` off the session type (direct/group/channel). In\n * Phase 1 we only have direct chat, so `auto` => `on`. Callers that\n * later distinguish session types can pass `mode` explicitly.\n */\nexport function shouldIncludeCitations(mode: MemoryCitationsMode): boolean {\n if (mode === 'on') return true;\n if (mode === 'off') return false;\n return true;\n}\n"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;AAcG;AAII,MAAM,sBAAsB,GAAwB;AAErD,SAAU,0BAA0B,CACxC,GAA8B,EAAA;IAE9B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM;AAAE,QAAA,OAAO,GAAG;AAC/D,IAAA,OAAO,sBAAsB;AAC/B;AAUA,SAAS,UAAU,CAAC,IAAY,EAAA;AAC9B,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,CAAC;AACnB,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAC7C;AAEA,SAAS,cAAc,CACrB,IAAY,EACZ,SAAiB,EACjB,OAAe,EAAA;IAEf,IAAI,SAAS,KAAK,OAAO;AAAE,QAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,SAAS,EAAE;AACzD,IAAA,OAAO,GAAG,IAAI,CAAA,EAAA,EAAK,SAAS,CAAA,EAAA,EAAK,OAAO,EAAE;AAC5C;AAEA;;;;AAIG;AACG,SAAU,iBAAiB,CAC/B,IAAS,EACT,OAAgB,EAAA;AAEhB,IAAA,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AACrE,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3E,QAAA,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;AACnD,QAAA,MAAM,OAAO,GAAG,CAAA,EAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,CAAA,YAAA,EAAe,QAAQ,EAAE;AACvE,QAAA,OAAO,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE;AACpE,IAAA,CAAC,CAAC;AACJ;AAEA;;;;;;AAMG;AACG,SAAU,sBAAsB,CAAC,IAAyB,EAAA;IAC9D,IAAI,IAAI,KAAK,IAAI;AAAE,QAAA,OAAO,IAAI;IAC9B,IAAI,IAAI,KAAK,KAAK;AAAE,QAAA,OAAO,KAAK;AAChC,IAAA,OAAO,IAAI;AACb;;;;;;;"}
1
+ {"version":3,"file":"citations.cjs","sources":["../../../src/memory/citations.ts"],"sourcesContent":["/**\n * Citation decoration — Phase 2.\n *\n * Ported from a reference implementation `extensions/memory-core/src/tools.citations.ts`.\n * Decorates memory_search hits with `[path#L{start}-L{end}]` markers so\n * the model can attribute claims back to specific memory files when it\n * uses them in its answer.\n *\n * Since our backend stores files as single rows (not line-chunked), we\n * compute line ranges from the returned content block on the fly:\n * - `startLine` = 1 (line 1 of the file)\n * - `endLine` = total number of lines in the block\n * This matches the standard output format exactly while keeping the pg\n * schema chunk-free.\n */\n\nexport type MemoryCitationsMode = 'on' | 'off' | 'auto';\n\nexport const DEFAULT_CITATIONS_MODE: MemoryCitationsMode = 'auto';\n\nexport function resolveMemoryCitationsMode(\n raw: string | undefined | null\n): MemoryCitationsMode {\n if (raw === 'on' || raw === 'off' || raw === 'auto') return raw;\n return DEFAULT_CITATIONS_MODE;\n}\n\nexport interface CitationCandidate {\n path: string;\n content: string;\n startLine?: number;\n endLine?: number;\n citation?: string;\n}\n\nfunction countLines(text: string): number {\n if (!text) return 1;\n return Math.max(1, text.split('\\n').length);\n}\n\nfunction formatCitation(\n path: string,\n startLine: number,\n endLine: number\n): string {\n if (startLine === endLine) return `${path}#L${startLine}`;\n return `${path}#L${startLine}-L${endLine}`;\n}\n\n/**\n * Decorate each hit with a citation marker. Mirrors the standard behavior:\n * appends `\\n\\nSource: <citation>` to the content and sets `citation`.\n * When `include=false`, clears any existing citation field.\n */\nexport function decorateCitations<T extends CitationCandidate>(\n hits: T[],\n include: boolean\n): T[] {\n if (!include) return hits.map((h) => ({ ...h, citation: undefined }));\n return hits.map((h) => {\n const start = Math.max(1, Math.floor(h.startLine ?? 1));\n const end = Math.max(start, Math.floor(h.endLine ?? countLines(h.content)));\n const citation = formatCitation(h.path, start, end);\n const content = `${(h.content ?? '').trimEnd()}\\n\\nSource: ${citation}`;\n return { ...h, citation, content, startLine: start, endLine: end };\n });\n}\n\n/**\n * Whether citations should be emitted for this call.\n *\n * The reference implementation keys `auto` off the session type (direct/group/channel). In\n * Phase 1 we only have direct chat, so `auto` => `on`. Callers that\n * later distinguish session types can pass `mode` explicitly.\n */\nexport function shouldIncludeCitations(mode: MemoryCitationsMode): boolean {\n if (mode === 'on') return true;\n if (mode === 'off') return false;\n return true;\n}\n"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;AAcG;AAII,MAAM,sBAAsB,GAAwB;AAErD,SAAU,0BAA0B,CACxC,GAA8B,EAAA;IAE9B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM;AAAE,QAAA,OAAO,GAAG;AAC/D,IAAA,OAAO,sBAAsB;AAC/B;AAUA,SAAS,UAAU,CAAC,IAAY,EAAA;AAC9B,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,CAAC;AACnB,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAC7C;AAEA,SAAS,cAAc,CACrB,IAAY,EACZ,SAAiB,EACjB,OAAe,EAAA;IAEf,IAAI,SAAS,KAAK,OAAO;AAAE,QAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,SAAS,EAAE;AACzD,IAAA,OAAO,GAAG,IAAI,CAAA,EAAA,EAAK,SAAS,CAAA,EAAA,EAAK,OAAO,EAAE;AAC5C;AAEA;;;;AAIG;AACG,SAAU,iBAAiB,CAC/B,IAAS,EACT,OAAgB,EAAA;AAEhB,IAAA,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;AACrE,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3E,QAAA,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;AACnD,QAAA,MAAM,OAAO,GAAG,CAAA,EAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,CAAA,YAAA,EAAe,QAAQ,EAAE;AACvE,QAAA,OAAO,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE;AACpE,IAAA,CAAC,CAAC;AACJ;AAEA;;;;;;AAMG;AACG,SAAU,sBAAsB,CAAC,IAAyB,EAAA;IAC9D,IAAI,IAAI,KAAK,IAAI;AAAE,QAAA,OAAO,IAAI;IAC9B,IAAI,IAAI,KAAK,KAAK;AAAE,QAAA,OAAO,KAAK;AAChC,IAAA,OAAO,IAAI;AACb;;;;;;;"}
@@ -21,14 +21,14 @@ const DEFAULT_MEMORY_SCHEMA = 'public';
21
21
  const MEMORY_PHASE_NORMAL = 'normal';
22
22
  const MEMORY_PHASE_FLUSHING = 'memory_flushing';
23
23
  /**
24
- * Search defaults — aligned with upstream's upstream defaults.
24
+ * Search defaults — aligned with the standard defaults.
25
25
  *
26
26
  * Sources:
27
- * - `upstream reference` → maxResults=6
28
- * - `upstream reference` → maxInjectedChars=4000
27
+ * - `reference` → maxResults=6
28
+ * - `reference` → maxInjectedChars=4000
29
29
  *
30
- * Keeping these in lockstep with upstream means the mandatory-recall tool
31
- * description, budget clamps, and eval corpora line up with upstream's
30
+ * Keeping these in lockstep with means the mandatory-recall tool
31
+ * description, budget clamps, and eval corpora line up with the standard
32
32
  * tuning — we inherit their calibration instead of re-tuning from scratch.
33
33
  */
34
34
  const DEFAULT_MAX_SEARCH_RESULTS = 6;
@@ -38,11 +38,11 @@ const DEFAULT_MAX_INJECTED_CHARS = 4000;
38
38
  const HYBRID_VECTOR_WEIGHT = 0.7;
39
39
  const HYBRID_TEXT_WEIGHT = 0.3;
40
40
  /**
41
- * Phase 2 rerank defaults — ported from upstream.
41
+ * Phase 2 rerank defaults — ported from a reference implementation.
42
42
  *
43
43
  * Sources:
44
- * - `upstream reference` → lambda=0.7
45
- * - `upstream reference` → halfLifeDays=30
44
+ * - `reference` → lambda=0.7
45
+ * - `reference` → halfLifeDays=30
46
46
  *
47
47
  * Both features are opt-in (enabled=false by default) — the Phase 2
48
48
  * features are layered on top of hybrid search and don't change default
@@ -55,11 +55,11 @@ const DEFAULT_TEMPORAL_DECAY_HALF_LIFE_DAYS = 30;
55
55
  const DEFAULT_RECALL_TRACKING_ENABLED = false;
56
56
  const DEFAULT_CITATIONS_MODE = 'auto';
57
57
  /**
58
- * Flush trigger margins (token counts) — aligned with upstream upstream.
58
+ * Flush trigger margins (token counts) — aligned with standard.
59
59
  *
60
60
  * Sources:
61
- * - `upstream reference` → softThreshold=4000
62
- * - `upstream reference` → reserveFloor=20000
61
+ * - `reference` → softThreshold=4000
62
+ * - `reference` → reserveFloor=20000
63
63
  */
64
64
  const DEFAULT_FLUSH_SOFT_THRESHOLD_TOKENS = 4000;
65
65
  const DEFAULT_FLUSH_RESERVE_FLOOR_TOKENS = 20000;
@@ -69,7 +69,7 @@ const DEFAULT_MAX_APPENDS_PER_FLUSH = 20;
69
69
  * Hard cap on agentic loop iterations inside {@link runMemoryFlush}.
70
70
  *
71
71
  * Each iteration = one model.invoke() followed by execution of any
72
- * `memory_append` tool_calls it emits. Mirrors upstream's flush-plan
72
+ * `memory_append` tool_calls it emits. Mirrors the standard flush-plan
73
73
  * loop cap; 8 is enough for ~2–3 reflections of batched notes while
74
74
  * protecting against runaway cycles if the model refuses to stop.
75
75
  */
@@ -84,9 +84,9 @@ const MEMORY_APPEND_TOOL_NAME = 'memory_append';
84
84
  * Mandatory-recall description — the single most load-bearing line in the
85
85
  * whole memory system. Do not soften, shorten, or reword without an eval run.
86
86
  *
87
- * Ported VERBATIM from upstream `extensions/memory-core/src/tools.ts:186`.
87
+ * Ported VERBATIM from a reference implementation `extensions/memory-core/src/tools.ts:186`.
88
88
  * The wiki/corpus clause is retained even though Phase 1 doesn't ship
89
- * compiled-wiki supplements — keeping the string identical means upstream's
89
+ * compiled-wiki supplements — keeping the string identical means the standard
90
90
  * eval corpora remain drop-in valid.
91
91
  */
92
92
  const MEMORY_SEARCH_DESCRIPTION = 'Mandatory recall step: semantically search MEMORY.md + memory/*.md ' +
@@ -96,7 +96,7 @@ const MEMORY_SEARCH_DESCRIPTION = 'Mandatory recall step: semantically search ME
96
96
  'supplements. If response has disabled=true, memory retrieval is ' +
97
97
  'unavailable and should be surfaced to the user.';
98
98
  /**
99
- * Ported VERBATIM from upstream `extensions/memory-core/src/tools.ts:322`.
99
+ * Ported VERBATIM from a reference implementation `extensions/memory-core/src/tools.ts:322`.
100
100
  */
101
101
  const MEMORY_GET_DESCRIPTION = 'Safe snippet read from MEMORY.md or memory/*.md with optional from/lines; ' +
102
102
  '`corpus=wiki` reads from registered compiled-wiki supplements. Use after ' +
@@ -105,7 +105,7 @@ const MEMORY_GET_DESCRIPTION = 'Safe snippet read from MEMORY.md or memory/*.md
105
105
  * `memory_append` tool description.
106
106
  *
107
107
  * Phase 1 historically wrote to a single date-keyed file
108
- * (`memory/YYYY-MM-DD.md`), ported verbatim from upstream. That scheme
108
+ * (`memory/YYYY-MM-DD.md`), ported verbatim from a reference implementation. That scheme
109
109
  * is now replaced by an 8-path canonical whitelist — see
110
110
  * {@link ./paths.MEMORY_ALL_PATHS}. The tool description no longer
111
111
  * names a specific file; the flush-turn prompt renders the full rubric
@@ -118,7 +118,7 @@ const MEMORY_APPEND_DESCRIPTION = "Append a durable note to one of the agent's c
118
118
  'accumulates across sessions.';
119
119
  /**
120
120
  * Reply token that signals the flush turn produced no user-visible output.
121
- * Ported VERBATIM from upstream `src/auto-reply/tokens.ts:4`.
121
+ * Ported VERBATIM from a reference implementation `src/auto-reply/tokens.ts:4`.
122
122
  */
123
123
  const SILENT_REPLY_TOKEN = 'NO_REPLY';
124
124
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"constants.cjs","sources":["../../../src/memory/constants.ts"],"sourcesContent":["/**\n * Autonomous memory — shared constants.\n *\n * Single source of truth for defaults, limits, and magic strings used across\n * the memory store, tools, flush phase, and tests. Changing a value here\n * changes it everywhere — no hunting through files.\n */\n\n/** Default embedding provider when {@link process.env.MEMORY_EMBEDDINGS_PROVIDER} is unset. */\nexport const DEFAULT_MEMORY_PROVIDER = 'bedrock' as const;\n\n/** Default embedding model (Titan v2 — AWS-native, 6× cheaper than Cohere v4). */\nexport const DEFAULT_MEMORY_MODEL = 'amazon.titan-embed-text-v2:0';\n\n/** Default vector width (Titan v2 supports 256 / 512 / 1024). */\nexport const DEFAULT_MEMORY_DIMENSIONS = 1024;\n\n/** Default Postgres table name; can be overridden via env for dev/prod sharing. */\nexport const DEFAULT_MEMORY_TABLE = 'agent_memories';\n\n/** Default Postgres schema. */\nexport const DEFAULT_MEMORY_SCHEMA = 'public';\n\n/** Phase values used by the flush-phase gate. */\nexport const MEMORY_PHASE_NORMAL = 'normal';\nexport const MEMORY_PHASE_FLUSHING = 'memory_flushing';\n\n/**\n * Search defaults — aligned with upstream's upstream defaults.\n *\n * Sources:\n * - `upstream reference` → maxResults=6\n * - `upstream reference` → maxInjectedChars=4000\n *\n * Keeping these in lockstep with upstream means the mandatory-recall tool\n * description, budget clamps, and eval corpora line up with upstream's\n * tuning — we inherit their calibration instead of re-tuning from scratch.\n */\nexport const DEFAULT_MAX_SEARCH_RESULTS = 6;\nexport const DEFAULT_MIN_SCORE = 0.1;\nexport const DEFAULT_MAX_INJECTED_CHARS = 4000;\n\n/** Hybrid retrieval weights — 70% vector cosine, 30% BM25 / ts_rank text score. */\nexport const HYBRID_VECTOR_WEIGHT = 0.7;\nexport const HYBRID_TEXT_WEIGHT = 0.3;\n\n/**\n * Phase 2 rerank defaults — ported from upstream.\n *\n * Sources:\n * - `upstream reference` → lambda=0.7\n * - `upstream reference` → halfLifeDays=30\n *\n * Both features are opt-in (enabled=false by default) — the Phase 2\n * features are layered on top of hybrid search and don't change default\n * behavior for callers that upgrade in place.\n */\nexport const DEFAULT_MMR_ENABLED = false;\nexport const DEFAULT_MMR_LAMBDA = 0.7;\nexport const DEFAULT_TEMPORAL_DECAY_ENABLED = false;\nexport const DEFAULT_TEMPORAL_DECAY_HALF_LIFE_DAYS = 30;\nexport const DEFAULT_RECALL_TRACKING_ENABLED = false;\nexport const DEFAULT_CITATIONS_MODE = 'auto' as const;\n\n/**\n * Flush trigger margins (token counts) — aligned with upstream upstream.\n *\n * Sources:\n * - `upstream reference` → softThreshold=4000\n * - `upstream reference` → reserveFloor=20000\n */\nexport const DEFAULT_FLUSH_SOFT_THRESHOLD_TOKENS = 4000;\nexport const DEFAULT_FLUSH_RESERVE_FLOOR_TOKENS = 20000;\n\n/** Hard cap on append calls per flush phase — prevents runaway writes. */\nexport const DEFAULT_MAX_APPENDS_PER_FLUSH = 20;\n\n/**\n * Hard cap on agentic loop iterations inside {@link runMemoryFlush}.\n *\n * Each iteration = one model.invoke() followed by execution of any\n * `memory_append` tool_calls it emits. Mirrors upstream's flush-plan\n * loop cap; 8 is enough for ~2–3 reflections of batched notes while\n * protecting against runaway cycles if the model refuses to stop.\n */\nexport const DEFAULT_MAX_FLUSH_ITERATIONS = 8;\n\n/** Path prefix enforced on every append. Paths outside this are rejected. */\nexport const MEMORY_PATH_PREFIX = 'memory/';\n\n/** Tool names — kept as constants so server code + tests never drift. */\nexport const MEMORY_SEARCH_TOOL_NAME = 'memory_search';\nexport const MEMORY_GET_TOOL_NAME = 'memory_get';\nexport const MEMORY_APPEND_TOOL_NAME = 'memory_append';\n\n/**\n * Mandatory-recall description — the single most load-bearing line in the\n * whole memory system. Do not soften, shorten, or reword without an eval run.\n *\n * Ported VERBATIM from upstream `extensions/memory-core/src/tools.ts:186`.\n * The wiki/corpus clause is retained even though Phase 1 doesn't ship\n * compiled-wiki supplements — keeping the string identical means upstream's\n * eval corpora remain drop-in valid.\n */\nexport const MEMORY_SEARCH_DESCRIPTION =\n 'Mandatory recall step: semantically search MEMORY.md + memory/*.md ' +\n '(and optional session transcripts) before answering questions about ' +\n 'prior work, decisions, dates, people, preferences, or todos. Optional ' +\n '`corpus=wiki` or `corpus=all` also searches registered compiled-wiki ' +\n 'supplements. If response has disabled=true, memory retrieval is ' +\n 'unavailable and should be surfaced to the user.';\n\n/**\n * Ported VERBATIM from upstream `extensions/memory-core/src/tools.ts:322`.\n */\nexport const MEMORY_GET_DESCRIPTION =\n 'Safe snippet read from MEMORY.md or memory/*.md with optional from/lines; ' +\n '`corpus=wiki` reads from registered compiled-wiki supplements. Use after ' +\n 'search to pull only the needed lines and keep context small.';\n\n/**\n * `memory_append` tool description.\n *\n * Phase 1 historically wrote to a single date-keyed file\n * (`memory/YYYY-MM-DD.md`), ported verbatim from upstream. That scheme\n * is now replaced by an 8-path canonical whitelist — see\n * {@link ./paths.MEMORY_ALL_PATHS}. The tool description no longer\n * names a specific file; the flush-turn prompt renders the full rubric\n * inline so the model sees every writable path at inference time.\n */\nexport const MEMORY_APPEND_DESCRIPTION =\n \"Append a durable note to one of the agent's canonical memory documents. \" +\n 'The `path` argument MUST be one of the whitelisted paths listed in the ' +\n 'flush prompt rubric — unknown paths are rejected. Content is merged into ' +\n 'the existing row for that document via UPSERT, so the same document ' +\n 'accumulates across sessions.';\n\n/**\n * Reply token that signals the flush turn produced no user-visible output.\n * Ported VERBATIM from upstream `src/auto-reply/tokens.ts:4`.\n */\nexport const SILENT_REPLY_TOKEN = 'NO_REPLY';\n\n/**\n * Placeholder replaced at flush time with the rendered path-rubric for\n * the caller's scope. See `renderPathsRubric()` in `./paths.ts` and\n * `resolveFlushPrompts()` in `../prompts/memoryFlushPrompt.ts`.\n *\n * Kept as a unique sentinel so `replaceAll` is safe even if the rubric\n * content happens to contain regex metacharacters.\n */\nexport const FLUSH_PROMPT_RUBRIC_PLACEHOLDER = '{{MEMORY_PATHS_RUBRIC}}';\n\n/**\n * Memory-flush prompts — canonical-document model.\n *\n * Every durable memory routes into one of 8 stable canonical documents\n * (4 agent-tier + 4 user-tier). The rubric is injected at flush time so\n * the model reads the authoritative path list with descriptions, and for\n * isolated/autonomous agents the user-tier rows are transparently omitted\n * from the rubric — making \"user-tier writes require a scoped caller\" a\n * compile-time guarantee rather than a runtime check alone.\n *\n * Two-tier semantics the prompt enforces:\n * - **agent/** — shared operational knowledge; every user of this agent\n * benefits from rows written here. Do NOT put personal facts here.\n * - **user/** — personalization for the specific caller only. Row is\n * private to that user; other users never see it.\n */\nconst MEMORY_FLUSH_ROUTING_HINT =\n 'Route every note into exactly one of the canonical documents below by ' +\n 'picking the best match. Do NOT invent new paths; do NOT create date-keyed ' +\n 'files; unknown paths are rejected by the store.';\n\nconst MEMORY_FLUSH_TIER_HINT =\n 'Two tiers: `memory/agent/*` is SHARED operational knowledge visible to ' +\n 'every user of this agent — put successful patterns, pitfalls, domain ' +\n 'facts, and house-style there. `memory/user/*` is PRIVATE to the specific ' +\n 'caller — put their identity, preferences, projects, and references there. ' +\n 'Never put user-specific facts in an agent/* document.';\n\nconst MEMORY_FLUSH_READ_ONLY_HINT =\n 'Treat workspace bootstrap/reference files such as MEMORY.md, DREAMS.md, SOUL.md, TOOLS.md, and AGENTS.md as read-only during this flush; never overwrite, replace, or edit them.';\n\n/**\n * Learning hint — steers the flush turn to capture the things that\n * matter most for future turns: reusable patterns, tool failures\n * (so the same mistake is not repeated), explicit corrections, and\n * durable user-specific facts. Append-only via `memory_append`; one\n * note per lesson.\n */\nconst MEMORY_FLUSH_LEARNING_HINT =\n 'Capture durable lessons the agent (and future turns) should retain: ' +\n '(a) successful task patterns and workflows → memory/agent/playbook.md; ' +\n '(b) tool failures and schema mistakes → memory/agent/pitfalls.md; ' +\n '(c) stable domain facts about the systems/APIs → memory/agent/domain.md; ' +\n \"(d) this user's preferences, tone, and corrections → memory/user/preferences.md; \" +\n \"(e) this user's identity and role → memory/user/profile.md. \" +\n 'Write one note per distinct lesson. Do not log conversation summaries ' +\n 'or anything derivable from the code or recent history.';\n\nconst MEMORY_FLUSH_RUBRIC_BLOCK =\n 'Canonical documents available for this turn (path — tag — description):\\n' +\n FLUSH_PROMPT_RUBRIC_PLACEHOLDER;\n\nexport const DEFAULT_MEMORY_FLUSH_PROMPT = [\n 'Pre-compaction memory flush.',\n MEMORY_FLUSH_ROUTING_HINT,\n MEMORY_FLUSH_TIER_HINT,\n MEMORY_FLUSH_READ_ONLY_HINT,\n MEMORY_FLUSH_LEARNING_HINT,\n 'Call the `memory_append` tool for every note you want to persist, passing one of the whitelisted paths as the `path` argument. Do NOT describe what you are about to write; just call the tool.',\n `If nothing worth storing, reply with exactly ${SILENT_REPLY_TOKEN}.`,\n '',\n MEMORY_FLUSH_RUBRIC_BLOCK,\n].join('\\n');\n\nexport const DEFAULT_MEMORY_FLUSH_SYSTEM_PROMPT = [\n 'Pre-compaction memory flush turn.',\n 'The session is near auto-compaction; capture durable memories to disk.',\n MEMORY_FLUSH_ROUTING_HINT,\n MEMORY_FLUSH_TIER_HINT,\n MEMORY_FLUSH_READ_ONLY_HINT,\n MEMORY_FLUSH_LEARNING_HINT,\n 'Use the `memory_append` tool for every durable note, with `path` set to one of the whitelisted canonical documents. Never claim you wrote a note without actually calling the tool.',\n `If there is nothing worth storing, reply with exactly ${SILENT_REPLY_TOKEN}.`,\n '',\n MEMORY_FLUSH_RUBRIC_BLOCK,\n].join('\\n');\n"],"names":[],"mappings":";;AAAA;;;;;;AAMG;AAEH;AACO,MAAM,uBAAuB,GAAG;AAEvC;AACO,MAAM,oBAAoB,GAAG;AAEpC;AACO,MAAM,yBAAyB,GAAG;AAEzC;AACO,MAAM,oBAAoB,GAAG;AAEpC;AACO,MAAM,qBAAqB,GAAG;AAErC;AACO,MAAM,mBAAmB,GAAG;AAC5B,MAAM,qBAAqB,GAAG;AAErC;;;;;;;;;;AAUG;AACI,MAAM,0BAA0B,GAAG;AACnC,MAAM,iBAAiB,GAAG;AAC1B,MAAM,0BAA0B,GAAG;AAE1C;AACO,MAAM,oBAAoB,GAAG;AAC7B,MAAM,kBAAkB,GAAG;AAElC;;;;;;;;;;AAUG;AACI,MAAM,mBAAmB,GAAG;AAC5B,MAAM,kBAAkB,GAAG;AAC3B,MAAM,8BAA8B,GAAG;AACvC,MAAM,qCAAqC,GAAG;AAC9C,MAAM,+BAA+B,GAAG;AACxC,MAAM,sBAAsB,GAAG;AAEtC;;;;;;AAMG;AACI,MAAM,mCAAmC,GAAG;AAC5C,MAAM,kCAAkC,GAAG;AAElD;AACO,MAAM,6BAA6B,GAAG;AAE7C;;;;;;;AAOG;AACI,MAAM,4BAA4B,GAAG;AAE5C;AACO,MAAM,kBAAkB,GAAG;AAElC;AACO,MAAM,uBAAuB,GAAG;AAChC,MAAM,oBAAoB,GAAG;AAC7B,MAAM,uBAAuB,GAAG;AAEvC;;;;;;;;AAQG;AACI,MAAM,yBAAyB,GACpC,qEAAqE;IACrE,sEAAsE;IACtE,wEAAwE;IACxE,uEAAuE;IACvE,kEAAkE;AAClE,IAAA;AAEF;;AAEG;AACI,MAAM,sBAAsB,GACjC,4EAA4E;IAC5E,2EAA2E;AAC3E,IAAA;AAEF;;;;;;;;;AASG;AACI,MAAM,yBAAyB,GACpC,0EAA0E;IAC1E,yEAAyE;IACzE,2EAA2E;IAC3E,sEAAsE;AACtE,IAAA;AAEF;;;AAGG;AACI,MAAM,kBAAkB,GAAG;AAElC;;;;;;;AAOG;AACI,MAAM,+BAA+B,GAAG;AAE/C;;;;;;;;;;;;;;;AAeG;AACH,MAAM,yBAAyB,GAC7B,wEAAwE;IACxE,4EAA4E;AAC5E,IAAA,iDAAiD;AAEnD,MAAM,sBAAsB,GAC1B,yEAAyE;IACzE,uEAAuE;IACvE,2EAA2E;IAC3E,4EAA4E;AAC5E,IAAA,uDAAuD;AAEzD,MAAM,2BAA2B,GAC/B,kLAAkL;AAEpL;;;;;;AAMG;AACH,MAAM,0BAA0B,GAC9B,sEAAsE;IACtE,yEAAyE;IACzE,oEAAoE;IACpE,2EAA2E;IAC3E,mFAAmF;IACnF,8DAA8D;IAC9D,wEAAwE;AACxE,IAAA,wDAAwD;AAE1D,MAAM,yBAAyB,GAC7B,2EAA2E;AAC3E,IAAA,+BAA+B;AAE1B,MAAM,2BAA2B,GAAG;IACzC,8BAA8B;IAC9B,yBAAyB;IACzB,sBAAsB;IACtB,2BAA2B;IAC3B,0BAA0B;IAC1B,iMAAiM;AACjM,IAAA,CAAA,6CAAA,EAAgD,kBAAkB,CAAA,CAAA,CAAG;IACrE,EAAE;IACF,yBAAyB;AAC1B,CAAA,CAAC,IAAI,CAAC,IAAI;AAEJ,MAAM,kCAAkC,GAAG;IAChD,mCAAmC;IACnC,wEAAwE;IACxE,yBAAyB;IACzB,sBAAsB;IACtB,2BAA2B;IAC3B,0BAA0B;IAC1B,qLAAqL;AACrL,IAAA,CAAA,sDAAA,EAAyD,kBAAkB,CAAA,CAAA,CAAG;IAC9E,EAAE;IACF,yBAAyB;AAC1B,CAAA,CAAC,IAAI,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"constants.cjs","sources":["../../../src/memory/constants.ts"],"sourcesContent":["/**\n * Autonomous memory — shared constants.\n *\n * Single source of truth for defaults, limits, and magic strings used across\n * the memory store, tools, flush phase, and tests. Changing a value here\n * changes it everywhere — no hunting through files.\n */\n\n/** Default embedding provider when {@link process.env.MEMORY_EMBEDDINGS_PROVIDER} is unset. */\nexport const DEFAULT_MEMORY_PROVIDER = 'bedrock' as const;\n\n/** Default embedding model (Titan v2 — AWS-native, 6× cheaper than Cohere v4). */\nexport const DEFAULT_MEMORY_MODEL = 'amazon.titan-embed-text-v2:0';\n\n/** Default vector width (Titan v2 supports 256 / 512 / 1024). */\nexport const DEFAULT_MEMORY_DIMENSIONS = 1024;\n\n/** Default Postgres table name; can be overridden via env for dev/prod sharing. */\nexport const DEFAULT_MEMORY_TABLE = 'agent_memories';\n\n/** Default Postgres schema. */\nexport const DEFAULT_MEMORY_SCHEMA = 'public';\n\n/** Phase values used by the flush-phase gate. */\nexport const MEMORY_PHASE_NORMAL = 'normal';\nexport const MEMORY_PHASE_FLUSHING = 'memory_flushing';\n\n/**\n * Search defaults — aligned with the standard defaults.\n *\n * Sources:\n * - `reference` → maxResults=6\n * - `reference` → maxInjectedChars=4000\n *\n * Keeping these in lockstep with means the mandatory-recall tool\n * description, budget clamps, and eval corpora line up with the standard\n * tuning — we inherit their calibration instead of re-tuning from scratch.\n */\nexport const DEFAULT_MAX_SEARCH_RESULTS = 6;\nexport const DEFAULT_MIN_SCORE = 0.1;\nexport const DEFAULT_MAX_INJECTED_CHARS = 4000;\n\n/** Hybrid retrieval weights — 70% vector cosine, 30% BM25 / ts_rank text score. */\nexport const HYBRID_VECTOR_WEIGHT = 0.7;\nexport const HYBRID_TEXT_WEIGHT = 0.3;\n\n/**\n * Phase 2 rerank defaults — ported from a reference implementation.\n *\n * Sources:\n * - `reference` → lambda=0.7\n * - `reference` → halfLifeDays=30\n *\n * Both features are opt-in (enabled=false by default) — the Phase 2\n * features are layered on top of hybrid search and don't change default\n * behavior for callers that upgrade in place.\n */\nexport const DEFAULT_MMR_ENABLED = false;\nexport const DEFAULT_MMR_LAMBDA = 0.7;\nexport const DEFAULT_TEMPORAL_DECAY_ENABLED = false;\nexport const DEFAULT_TEMPORAL_DECAY_HALF_LIFE_DAYS = 30;\nexport const DEFAULT_RECALL_TRACKING_ENABLED = false;\nexport const DEFAULT_CITATIONS_MODE = 'auto' as const;\n\n/**\n * Flush trigger margins (token counts) — aligned with standard.\n *\n * Sources:\n * - `reference` → softThreshold=4000\n * - `reference` → reserveFloor=20000\n */\nexport const DEFAULT_FLUSH_SOFT_THRESHOLD_TOKENS = 4000;\nexport const DEFAULT_FLUSH_RESERVE_FLOOR_TOKENS = 20000;\n\n/** Hard cap on append calls per flush phase — prevents runaway writes. */\nexport const DEFAULT_MAX_APPENDS_PER_FLUSH = 20;\n\n/**\n * Hard cap on agentic loop iterations inside {@link runMemoryFlush}.\n *\n * Each iteration = one model.invoke() followed by execution of any\n * `memory_append` tool_calls it emits. Mirrors the standard flush-plan\n * loop cap; 8 is enough for ~2–3 reflections of batched notes while\n * protecting against runaway cycles if the model refuses to stop.\n */\nexport const DEFAULT_MAX_FLUSH_ITERATIONS = 8;\n\n/** Path prefix enforced on every append. Paths outside this are rejected. */\nexport const MEMORY_PATH_PREFIX = 'memory/';\n\n/** Tool names — kept as constants so server code + tests never drift. */\nexport const MEMORY_SEARCH_TOOL_NAME = 'memory_search';\nexport const MEMORY_GET_TOOL_NAME = 'memory_get';\nexport const MEMORY_APPEND_TOOL_NAME = 'memory_append';\n\n/**\n * Mandatory-recall description — the single most load-bearing line in the\n * whole memory system. Do not soften, shorten, or reword without an eval run.\n *\n * Ported VERBATIM from a reference implementation `extensions/memory-core/src/tools.ts:186`.\n * The wiki/corpus clause is retained even though Phase 1 doesn't ship\n * compiled-wiki supplements — keeping the string identical means the standard\n * eval corpora remain drop-in valid.\n */\nexport const MEMORY_SEARCH_DESCRIPTION =\n 'Mandatory recall step: semantically search MEMORY.md + memory/*.md ' +\n '(and optional session transcripts) before answering questions about ' +\n 'prior work, decisions, dates, people, preferences, or todos. Optional ' +\n '`corpus=wiki` or `corpus=all` also searches registered compiled-wiki ' +\n 'supplements. If response has disabled=true, memory retrieval is ' +\n 'unavailable and should be surfaced to the user.';\n\n/**\n * Ported VERBATIM from a reference implementation `extensions/memory-core/src/tools.ts:322`.\n */\nexport const MEMORY_GET_DESCRIPTION =\n 'Safe snippet read from MEMORY.md or memory/*.md with optional from/lines; ' +\n '`corpus=wiki` reads from registered compiled-wiki supplements. Use after ' +\n 'search to pull only the needed lines and keep context small.';\n\n/**\n * `memory_append` tool description.\n *\n * Phase 1 historically wrote to a single date-keyed file\n * (`memory/YYYY-MM-DD.md`), ported verbatim from a reference implementation. That scheme\n * is now replaced by an 8-path canonical whitelist — see\n * {@link ./paths.MEMORY_ALL_PATHS}. The tool description no longer\n * names a specific file; the flush-turn prompt renders the full rubric\n * inline so the model sees every writable path at inference time.\n */\nexport const MEMORY_APPEND_DESCRIPTION =\n \"Append a durable note to one of the agent's canonical memory documents. \" +\n 'The `path` argument MUST be one of the whitelisted paths listed in the ' +\n 'flush prompt rubric — unknown paths are rejected. Content is merged into ' +\n 'the existing row for that document via UPSERT, so the same document ' +\n 'accumulates across sessions.';\n\n/**\n * Reply token that signals the flush turn produced no user-visible output.\n * Ported VERBATIM from a reference implementation `src/auto-reply/tokens.ts:4`.\n */\nexport const SILENT_REPLY_TOKEN = 'NO_REPLY';\n\n/**\n * Placeholder replaced at flush time with the rendered path-rubric for\n * the caller's scope. See `renderPathsRubric()` in `./paths.ts` and\n * `resolveFlushPrompts()` in `../prompts/memoryFlushPrompt.ts`.\n *\n * Kept as a unique sentinel so `replaceAll` is safe even if the rubric\n * content happens to contain regex metacharacters.\n */\nexport const FLUSH_PROMPT_RUBRIC_PLACEHOLDER = '{{MEMORY_PATHS_RUBRIC}}';\n\n/**\n * Memory-flush prompts — canonical-document model.\n *\n * Every durable memory routes into one of 8 stable canonical documents\n * (4 agent-tier + 4 user-tier). The rubric is injected at flush time so\n * the model reads the authoritative path list with descriptions, and for\n * isolated/autonomous agents the user-tier rows are transparently omitted\n * from the rubric — making \"user-tier writes require a scoped caller\" a\n * compile-time guarantee rather than a runtime check alone.\n *\n * Two-tier semantics the prompt enforces:\n * - **agent/** — shared operational knowledge; every user of this agent\n * benefits from rows written here. Do NOT put personal facts here.\n * - **user/** — personalization for the specific caller only. Row is\n * private to that user; other users never see it.\n */\nconst MEMORY_FLUSH_ROUTING_HINT =\n 'Route every note into exactly one of the canonical documents below by ' +\n 'picking the best match. Do NOT invent new paths; do NOT create date-keyed ' +\n 'files; unknown paths are rejected by the store.';\n\nconst MEMORY_FLUSH_TIER_HINT =\n 'Two tiers: `memory/agent/*` is SHARED operational knowledge visible to ' +\n 'every user of this agent — put successful patterns, pitfalls, domain ' +\n 'facts, and house-style there. `memory/user/*` is PRIVATE to the specific ' +\n 'caller — put their identity, preferences, projects, and references there. ' +\n 'Never put user-specific facts in an agent/* document.';\n\nconst MEMORY_FLUSH_READ_ONLY_HINT =\n 'Treat workspace bootstrap/reference files such as MEMORY.md, DREAMS.md, SOUL.md, TOOLS.md, and AGENTS.md as read-only during this flush; never overwrite, replace, or edit them.';\n\n/**\n * Learning hint — steers the flush turn to capture the things that\n * matter most for future turns: reusable patterns, tool failures\n * (so the same mistake is not repeated), explicit corrections, and\n * durable user-specific facts. Append-only via `memory_append`; one\n * note per lesson.\n */\nconst MEMORY_FLUSH_LEARNING_HINT =\n 'Capture durable lessons the agent (and future turns) should retain: ' +\n '(a) successful task patterns and workflows → memory/agent/playbook.md; ' +\n '(b) tool failures and schema mistakes → memory/agent/pitfalls.md; ' +\n '(c) stable domain facts about the systems/APIs → memory/agent/domain.md; ' +\n \"(d) this user's preferences, tone, and corrections → memory/user/preferences.md; \" +\n \"(e) this user's identity and role → memory/user/profile.md. \" +\n 'Write one note per distinct lesson. Do not log conversation summaries ' +\n 'or anything derivable from the code or recent history.';\n\nconst MEMORY_FLUSH_RUBRIC_BLOCK =\n 'Canonical documents available for this turn (path — tag — description):\\n' +\n FLUSH_PROMPT_RUBRIC_PLACEHOLDER;\n\nexport const DEFAULT_MEMORY_FLUSH_PROMPT = [\n 'Pre-compaction memory flush.',\n MEMORY_FLUSH_ROUTING_HINT,\n MEMORY_FLUSH_TIER_HINT,\n MEMORY_FLUSH_READ_ONLY_HINT,\n MEMORY_FLUSH_LEARNING_HINT,\n 'Call the `memory_append` tool for every note you want to persist, passing one of the whitelisted paths as the `path` argument. Do NOT describe what you are about to write; just call the tool.',\n `If nothing worth storing, reply with exactly ${SILENT_REPLY_TOKEN}.`,\n '',\n MEMORY_FLUSH_RUBRIC_BLOCK,\n].join('\\n');\n\nexport const DEFAULT_MEMORY_FLUSH_SYSTEM_PROMPT = [\n 'Pre-compaction memory flush turn.',\n 'The session is near auto-compaction; capture durable memories to disk.',\n MEMORY_FLUSH_ROUTING_HINT,\n MEMORY_FLUSH_TIER_HINT,\n MEMORY_FLUSH_READ_ONLY_HINT,\n MEMORY_FLUSH_LEARNING_HINT,\n 'Use the `memory_append` tool for every durable note, with `path` set to one of the whitelisted canonical documents. Never claim you wrote a note without actually calling the tool.',\n `If there is nothing worth storing, reply with exactly ${SILENT_REPLY_TOKEN}.`,\n '',\n MEMORY_FLUSH_RUBRIC_BLOCK,\n].join('\\n');\n"],"names":[],"mappings":";;AAAA;;;;;;AAMG;AAEH;AACO,MAAM,uBAAuB,GAAG;AAEvC;AACO,MAAM,oBAAoB,GAAG;AAEpC;AACO,MAAM,yBAAyB,GAAG;AAEzC;AACO,MAAM,oBAAoB,GAAG;AAEpC;AACO,MAAM,qBAAqB,GAAG;AAErC;AACO,MAAM,mBAAmB,GAAG;AAC5B,MAAM,qBAAqB,GAAG;AAErC;;;;;;;;;;AAUG;AACI,MAAM,0BAA0B,GAAG;AACnC,MAAM,iBAAiB,GAAG;AAC1B,MAAM,0BAA0B,GAAG;AAE1C;AACO,MAAM,oBAAoB,GAAG;AAC7B,MAAM,kBAAkB,GAAG;AAElC;;;;;;;;;;AAUG;AACI,MAAM,mBAAmB,GAAG;AAC5B,MAAM,kBAAkB,GAAG;AAC3B,MAAM,8BAA8B,GAAG;AACvC,MAAM,qCAAqC,GAAG;AAC9C,MAAM,+BAA+B,GAAG;AACxC,MAAM,sBAAsB,GAAG;AAEtC;;;;;;AAMG;AACI,MAAM,mCAAmC,GAAG;AAC5C,MAAM,kCAAkC,GAAG;AAElD;AACO,MAAM,6BAA6B,GAAG;AAE7C;;;;;;;AAOG;AACI,MAAM,4BAA4B,GAAG;AAE5C;AACO,MAAM,kBAAkB,GAAG;AAElC;AACO,MAAM,uBAAuB,GAAG;AAChC,MAAM,oBAAoB,GAAG;AAC7B,MAAM,uBAAuB,GAAG;AAEvC;;;;;;;;AAQG;AACI,MAAM,yBAAyB,GACpC,qEAAqE;IACrE,sEAAsE;IACtE,wEAAwE;IACxE,uEAAuE;IACvE,kEAAkE;AAClE,IAAA;AAEF;;AAEG;AACI,MAAM,sBAAsB,GACjC,4EAA4E;IAC5E,2EAA2E;AAC3E,IAAA;AAEF;;;;;;;;;AASG;AACI,MAAM,yBAAyB,GACpC,0EAA0E;IAC1E,yEAAyE;IACzE,2EAA2E;IAC3E,sEAAsE;AACtE,IAAA;AAEF;;;AAGG;AACI,MAAM,kBAAkB,GAAG;AAElC;;;;;;;AAOG;AACI,MAAM,+BAA+B,GAAG;AAE/C;;;;;;;;;;;;;;;AAeG;AACH,MAAM,yBAAyB,GAC7B,wEAAwE;IACxE,4EAA4E;AAC5E,IAAA,iDAAiD;AAEnD,MAAM,sBAAsB,GAC1B,yEAAyE;IACzE,uEAAuE;IACvE,2EAA2E;IAC3E,4EAA4E;AAC5E,IAAA,uDAAuD;AAEzD,MAAM,2BAA2B,GAC/B,kLAAkL;AAEpL;;;;;;AAMG;AACH,MAAM,0BAA0B,GAC9B,sEAAsE;IACtE,yEAAyE;IACzE,oEAAoE;IACpE,2EAA2E;IAC3E,mFAAmF;IACnF,8DAA8D;IAC9D,wEAAwE;AACxE,IAAA,wDAAwD;AAE1D,MAAM,yBAAyB,GAC7B,2EAA2E;AAC3E,IAAA,+BAA+B;AAE1B,MAAM,2BAA2B,GAAG;IACzC,8BAA8B;IAC9B,yBAAyB;IACzB,sBAAsB;IACtB,2BAA2B;IAC3B,0BAA0B;IAC1B,iMAAiM;AACjM,IAAA,CAAA,6CAAA,EAAgD,kBAAkB,CAAA,CAAA,CAAG;IACrE,EAAE;IACF,yBAAyB;AAC1B,CAAA,CAAC,IAAI,CAAC,IAAI;AAEJ,MAAM,kCAAkC,GAAG;IAChD,mCAAmC;IACnC,wEAAwE;IACxE,yBAAyB;IACzB,sBAAsB;IACtB,2BAA2B;IAC3B,0BAA0B;IAC1B,qLAAqL;AACrL,IAAA,CAAA,sDAAA,EAAyD,kBAAkB,CAAA,CAAA,CAAG;IAC9E,EAAE;IACF,yBAAyB;AAC1B,CAAA,CAAC,IAAI,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -3,7 +3,7 @@
3
3
  /**
4
4
  * Maximal Marginal Relevance (MMR) re-ranking — Phase 2.
5
5
  *
6
- * Ported from upstream `extensions/memory-core/src/memory/mmr.ts` with
6
+ * Ported from a reference implementation `extensions/memory-core/src/memory/mmr.ts` with
7
7
  * minor adaptation for our `MemoryEntry` shape (content vs snippet, id vs
8
8
  * path+startLine). Behavior is identical: normalize scores, iteratively
9
9
  * pick the item that maximizes `λ * relevance - (1-λ) * max_similarity`
@@ -1 +1 @@
1
- {"version":3,"file":"mmr.cjs","sources":["../../../src/memory/mmr.ts"],"sourcesContent":["/**\n * Maximal Marginal Relevance (MMR) re-ranking — Phase 2.\n *\n * Ported from upstream `extensions/memory-core/src/memory/mmr.ts` with\n * minor adaptation for our `MemoryEntry` shape (content vs snippet, id vs\n * path+startLine). Behavior is identical: normalize scores, iteratively\n * pick the item that maximizes `λ * relevance - (1-λ) * max_similarity`\n * using Jaccard on tokenized content.\n *\n * @see Carbonell & Goldstein, \"The Use of MMR, Diversity-Based Reranking\" (1998)\n */\n\nexport interface MMRConfig {\n /** Opt-in. Upstream default is false. */\n enabled: boolean;\n /** 0 = max diversity, 1 = max relevance. Upstream default 0.7. */\n lambda: number;\n}\n\nexport const DEFAULT_MMR_CONFIG: MMRConfig = {\n enabled: false,\n lambda: 0.7,\n};\n\n/**\n * CJK Unified Ideographs + Extension A, Hiragana/Katakana, Hangul.\n * These lack whitespace boundaries so we must tokenize them differently.\n */\nconst CJK_RE =\n /[\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\u1100-\\u11ff]/;\n\n/**\n * Tokenize content into a set for Jaccard similarity.\n *\n * ASCII: alphanumeric + underscore runs, lowercased.\n * CJK: each char becomes a unigram; consecutive pairs become a bigram.\n * Non-adjacent CJK chars (e.g. `我a好`) do NOT form a bigram.\n */\nexport function tokenize(text: string): Set<string> {\n const lower = (text ?? '').toLowerCase();\n const ascii = lower.match(/[a-z0-9_]+/g) ?? [];\n\n const chars = Array.from(lower);\n const cjkData: Array<{ char: string; index: number }> = [];\n for (let i = 0; i < chars.length; i++) {\n if (CJK_RE.test(chars[i])) cjkData.push({ char: chars[i], index: i });\n }\n\n const bigrams: string[] = [];\n for (let i = 0; i < cjkData.length - 1; i++) {\n if (cjkData[i + 1].index === cjkData[i].index + 1) {\n bigrams.push(cjkData[i].char + cjkData[i + 1].char);\n }\n }\n\n return new Set([...ascii, ...bigrams, ...cjkData.map((d) => d.char)]);\n}\n\nexport function jaccardSimilarity(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 1;\n if (a.size === 0 || b.size === 0) return 0;\n\n const [smaller, larger] = a.size <= b.size ? [a, b] : [b, a];\n let intersection = 0;\n for (const t of smaller) if (larger.has(t)) intersection++;\n const union = a.size + b.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\nexport function textSimilarity(a: string, b: string): number {\n return jaccardSimilarity(tokenize(a), tokenize(b));\n}\n\nexport function computeMMRScore(\n relevance: number,\n maxSimilarity: number,\n lambda: number\n): number {\n return lambda * relevance - (1 - lambda) * maxSimilarity;\n}\n\nexport interface MMRItem {\n id: string;\n score: number;\n content: string;\n}\n\n/**\n * Re-rank items using MMR. Returns a new array in MMR order.\n */\nexport function mmrRerank<T extends MMRItem>(\n items: T[],\n config: Partial<MMRConfig> = {}\n): T[] {\n const enabled = config.enabled ?? DEFAULT_MMR_CONFIG.enabled;\n const rawLambda = config.lambda ?? DEFAULT_MMR_CONFIG.lambda;\n\n if (!enabled || items.length <= 1) return [...items];\n\n const lambda = Math.max(0, Math.min(1, rawLambda));\n if (lambda === 1) return [...items].sort((a, b) => b.score - a.score);\n\n const tokenCache = new Map<string, Set<string>>();\n for (const item of items) tokenCache.set(item.id, tokenize(item.content));\n\n const scores = items.map((i) => i.score);\n const maxScore = Math.max(...scores);\n const minScore = Math.min(...scores);\n const range = maxScore - minScore;\n const normalize = (s: number): number =>\n range === 0 ? 1 : (s - minScore) / range;\n\n const selected: T[] = [];\n const remaining = new Set(items);\n\n while (remaining.size > 0) {\n let best: T | null = null;\n let bestMMR = -Infinity;\n for (const cand of remaining) {\n const rel = normalize(cand.score);\n const candTokens = tokenCache.get(cand.id)!;\n let maxSim = 0;\n for (const sel of selected) {\n const sim = jaccardSimilarity(candTokens, tokenCache.get(sel.id)!);\n if (sim > maxSim) maxSim = sim;\n }\n const mmr = computeMMRScore(rel, maxSim, lambda);\n if (\n mmr > bestMMR ||\n (mmr === bestMMR && cand.score > (best?.score ?? -Infinity))\n ) {\n bestMMR = mmr;\n best = cand;\n }\n }\n if (!best) break;\n selected.push(best);\n remaining.delete(best);\n }\n\n return selected;\n}\n\n/**\n * Adapter: apply MMR to an array of MemoryEntry-shaped hits.\n *\n * Uses (path|id|index) as the stable ID so two hits from the same file at\n * different content still get distinct MMR identities.\n */\nexport function applyMMRToMemoryHits<\n T extends { id: string; path: string; content: string; score: number },\n>(results: T[], config: Partial<MMRConfig> = {}): T[] {\n if (results.length <= 1) return results;\n const byId = new Map<string, T>();\n const items: MMRItem[] = results.map((r, i) => {\n const id = `${r.path}#${r.id}#${i}`;\n byId.set(id, r);\n return { id, score: r.score, content: r.content };\n });\n return mmrRerank(items, config).map((m) => byId.get(m.id)!);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mmr.cjs","sources":["../../../src/memory/mmr.ts"],"sourcesContent":["/**\n * Maximal Marginal Relevance (MMR) re-ranking — Phase 2.\n *\n * Ported from a reference implementation `extensions/memory-core/src/memory/mmr.ts` with\n * minor adaptation for our `MemoryEntry` shape (content vs snippet, id vs\n * path+startLine). Behavior is identical: normalize scores, iteratively\n * pick the item that maximizes `λ * relevance - (1-λ) * max_similarity`\n * using Jaccard on tokenized content.\n *\n * @see Carbonell & Goldstein, \"The Use of MMR, Diversity-Based Reranking\" (1998)\n */\n\nexport interface MMRConfig {\n /** Opt-in. Default is false. */\n enabled: boolean;\n /** 0 = max diversity, 1 = max relevance. Default 0.7. */\n lambda: number;\n}\n\nexport const DEFAULT_MMR_CONFIG: MMRConfig = {\n enabled: false,\n lambda: 0.7,\n};\n\n/**\n * CJK Unified Ideographs + Extension A, Hiragana/Katakana, Hangul.\n * These lack whitespace boundaries so we must tokenize them differently.\n */\nconst CJK_RE =\n /[\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\u1100-\\u11ff]/;\n\n/**\n * Tokenize content into a set for Jaccard similarity.\n *\n * ASCII: alphanumeric + underscore runs, lowercased.\n * CJK: each char becomes a unigram; consecutive pairs become a bigram.\n * Non-adjacent CJK chars (e.g. `我a好`) do NOT form a bigram.\n */\nexport function tokenize(text: string): Set<string> {\n const lower = (text ?? '').toLowerCase();\n const ascii = lower.match(/[a-z0-9_]+/g) ?? [];\n\n const chars = Array.from(lower);\n const cjkData: Array<{ char: string; index: number }> = [];\n for (let i = 0; i < chars.length; i++) {\n if (CJK_RE.test(chars[i])) cjkData.push({ char: chars[i], index: i });\n }\n\n const bigrams: string[] = [];\n for (let i = 0; i < cjkData.length - 1; i++) {\n if (cjkData[i + 1].index === cjkData[i].index + 1) {\n bigrams.push(cjkData[i].char + cjkData[i + 1].char);\n }\n }\n\n return new Set([...ascii, ...bigrams, ...cjkData.map((d) => d.char)]);\n}\n\nexport function jaccardSimilarity(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 1;\n if (a.size === 0 || b.size === 0) return 0;\n\n const [smaller, larger] = a.size <= b.size ? [a, b] : [b, a];\n let intersection = 0;\n for (const t of smaller) if (larger.has(t)) intersection++;\n const union = a.size + b.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\nexport function textSimilarity(a: string, b: string): number {\n return jaccardSimilarity(tokenize(a), tokenize(b));\n}\n\nexport function computeMMRScore(\n relevance: number,\n maxSimilarity: number,\n lambda: number\n): number {\n return lambda * relevance - (1 - lambda) * maxSimilarity;\n}\n\nexport interface MMRItem {\n id: string;\n score: number;\n content: string;\n}\n\n/**\n * Re-rank items using MMR. Returns a new array in MMR order.\n */\nexport function mmrRerank<T extends MMRItem>(\n items: T[],\n config: Partial<MMRConfig> = {}\n): T[] {\n const enabled = config.enabled ?? DEFAULT_MMR_CONFIG.enabled;\n const rawLambda = config.lambda ?? DEFAULT_MMR_CONFIG.lambda;\n\n if (!enabled || items.length <= 1) return [...items];\n\n const lambda = Math.max(0, Math.min(1, rawLambda));\n if (lambda === 1) return [...items].sort((a, b) => b.score - a.score);\n\n const tokenCache = new Map<string, Set<string>>();\n for (const item of items) tokenCache.set(item.id, tokenize(item.content));\n\n const scores = items.map((i) => i.score);\n const maxScore = Math.max(...scores);\n const minScore = Math.min(...scores);\n const range = maxScore - minScore;\n const normalize = (s: number): number =>\n range === 0 ? 1 : (s - minScore) / range;\n\n const selected: T[] = [];\n const remaining = new Set(items);\n\n while (remaining.size > 0) {\n let best: T | null = null;\n let bestMMR = -Infinity;\n for (const cand of remaining) {\n const rel = normalize(cand.score);\n const candTokens = tokenCache.get(cand.id)!;\n let maxSim = 0;\n for (const sel of selected) {\n const sim = jaccardSimilarity(candTokens, tokenCache.get(sel.id)!);\n if (sim > maxSim) maxSim = sim;\n }\n const mmr = computeMMRScore(rel, maxSim, lambda);\n if (\n mmr > bestMMR ||\n (mmr === bestMMR && cand.score > (best?.score ?? -Infinity))\n ) {\n bestMMR = mmr;\n best = cand;\n }\n }\n if (!best) break;\n selected.push(best);\n remaining.delete(best);\n }\n\n return selected;\n}\n\n/**\n * Adapter: apply MMR to an array of MemoryEntry-shaped hits.\n *\n * Uses (path|id|index) as the stable ID so two hits from the same file at\n * different content still get distinct MMR identities.\n */\nexport function applyMMRToMemoryHits<\n T extends { id: string; path: string; content: string; score: number },\n>(results: T[], config: Partial<MMRConfig> = {}): T[] {\n if (results.length <= 1) return results;\n const byId = new Map<string, T>();\n const items: MMRItem[] = results.map((r, i) => {\n const id = `${r.path}#${r.id}#${i}`;\n byId.set(id, r);\n return { id, score: r.score, content: r.content };\n });\n return mmrRerank(items, config).map((m) => byId.get(m.id)!);\n}\n"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ var constants = require('./constants.cjs');
12
12
  *
13
13
  * ## Why a whitelist?
14
14
  *
15
- * Earlier upstream-faithful designs used date-keyed files
15
+ * Earlier historical designs used date-keyed files
16
16
  * (`memory/YYYY-MM-DD.md`), which have three problems for a persistent
17
17
  * multi-user agent:
18
18
  *