beeai-framework 0.1.28 → 0.1.30

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 (564) hide show
  1. package/dist/adapters/a2a/agents/agent.cjs.map +1 -1
  2. package/dist/adapters/a2a/agents/agent.d.cts +2 -2
  3. package/dist/adapters/a2a/agents/agent.d.ts +2 -2
  4. package/dist/adapters/a2a/agents/agent.js.map +1 -1
  5. package/dist/adapters/a2a/agents/events.d.cts +1 -1
  6. package/dist/adapters/a2a/agents/events.d.ts +1 -1
  7. package/dist/adapters/a2a/agents/types.d.cts +2 -2
  8. package/dist/adapters/a2a/agents/types.d.ts +2 -2
  9. package/dist/adapters/a2a/agents/utils.cjs +52 -11
  10. package/dist/adapters/a2a/agents/utils.cjs.map +1 -1
  11. package/dist/adapters/a2a/agents/utils.js +52 -11
  12. package/dist/adapters/a2a/agents/utils.js.map +1 -1
  13. package/dist/adapters/a2a/serve/agent_executor.cjs.map +1 -1
  14. package/dist/adapters/a2a/serve/agent_executor.d.cts +3 -3
  15. package/dist/adapters/a2a/serve/agent_executor.d.ts +3 -3
  16. package/dist/adapters/a2a/serve/agent_executor.js.map +1 -1
  17. package/dist/adapters/a2a/serve/server.cjs.map +1 -1
  18. package/dist/adapters/a2a/serve/server.d.cts +2 -2
  19. package/dist/adapters/a2a/serve/server.d.ts +2 -2
  20. package/dist/adapters/a2a/serve/server.js.map +1 -1
  21. package/dist/adapters/acp/agents/agent.cjs.map +1 -1
  22. package/dist/adapters/acp/agents/agent.d.cts +2 -2
  23. package/dist/adapters/acp/agents/agent.d.ts +2 -2
  24. package/dist/adapters/acp/agents/agent.js.map +1 -1
  25. package/dist/adapters/acp/agents/events.d.cts +1 -1
  26. package/dist/adapters/acp/agents/events.d.ts +1 -1
  27. package/dist/adapters/agentstack/agents/agent.cjs.map +1 -1
  28. package/dist/adapters/agentstack/agents/agent.d.cts +2 -2
  29. package/dist/adapters/agentstack/agents/agent.d.ts +2 -2
  30. package/dist/adapters/agentstack/agents/agent.js.map +1 -1
  31. package/dist/adapters/agentstack/agents/events.d.cts +1 -1
  32. package/dist/adapters/agentstack/agents/events.d.ts +1 -1
  33. package/dist/adapters/amazon-bedrock/backend/chat.cjs.map +1 -1
  34. package/dist/adapters/amazon-bedrock/backend/chat.d.cts +2 -2
  35. package/dist/adapters/amazon-bedrock/backend/chat.d.ts +2 -2
  36. package/dist/adapters/amazon-bedrock/backend/chat.js.map +1 -1
  37. package/dist/adapters/amazon-bedrock/backend/client.cjs.map +1 -1
  38. package/dist/adapters/amazon-bedrock/backend/client.js.map +1 -1
  39. package/dist/adapters/amazon-bedrock/backend/embedding.cjs.map +1 -1
  40. package/dist/adapters/amazon-bedrock/backend/embedding.d.cts +2 -2
  41. package/dist/adapters/amazon-bedrock/backend/embedding.d.ts +2 -2
  42. package/dist/adapters/amazon-bedrock/backend/embedding.js.map +1 -1
  43. package/dist/adapters/anthropic/backend/chat.cjs.map +1 -1
  44. package/dist/adapters/anthropic/backend/chat.d.cts +3 -3
  45. package/dist/adapters/anthropic/backend/chat.d.ts +3 -3
  46. package/dist/adapters/anthropic/backend/chat.js.map +1 -1
  47. package/dist/adapters/anthropic/backend/client.cjs.map +1 -1
  48. package/dist/adapters/anthropic/backend/client.js.map +1 -1
  49. package/dist/adapters/anthropic/backend/embedding.cjs.map +1 -1
  50. package/dist/adapters/anthropic/backend/embedding.d.cts +2 -2
  51. package/dist/adapters/anthropic/backend/embedding.d.ts +2 -2
  52. package/dist/adapters/anthropic/backend/embedding.js.map +1 -1
  53. package/dist/adapters/azure-openai/backend/chat.cjs.map +1 -1
  54. package/dist/adapters/azure-openai/backend/chat.d.cts +3 -3
  55. package/dist/adapters/azure-openai/backend/chat.d.ts +3 -3
  56. package/dist/adapters/azure-openai/backend/chat.js.map +1 -1
  57. package/dist/adapters/azure-openai/backend/client.cjs.map +1 -1
  58. package/dist/adapters/azure-openai/backend/client.js.map +1 -1
  59. package/dist/adapters/azure-openai/backend/embedding.cjs.map +1 -1
  60. package/dist/adapters/azure-openai/backend/embedding.d.cts +2 -2
  61. package/dist/adapters/azure-openai/backend/embedding.d.ts +2 -2
  62. package/dist/adapters/azure-openai/backend/embedding.js.map +1 -1
  63. package/dist/adapters/dummy/backend/chat.cjs.map +1 -1
  64. package/dist/adapters/dummy/backend/chat.d.cts +2 -2
  65. package/dist/adapters/dummy/backend/chat.d.ts +2 -2
  66. package/dist/adapters/dummy/backend/chat.js.map +1 -1
  67. package/dist/adapters/dummy/backend/embedding.cjs.map +1 -1
  68. package/dist/adapters/dummy/backend/embedding.d.cts +2 -2
  69. package/dist/adapters/dummy/backend/embedding.d.ts +2 -2
  70. package/dist/adapters/dummy/backend/embedding.js.map +1 -1
  71. package/dist/adapters/google-vertex/backend/chat.cjs.map +1 -1
  72. package/dist/adapters/google-vertex/backend/chat.d.cts +3 -3
  73. package/dist/adapters/google-vertex/backend/chat.d.ts +3 -3
  74. package/dist/adapters/google-vertex/backend/chat.js.map +1 -1
  75. package/dist/adapters/google-vertex/backend/client.cjs.map +1 -1
  76. package/dist/adapters/google-vertex/backend/client.js.map +1 -1
  77. package/dist/adapters/google-vertex/backend/embedding.cjs.map +1 -1
  78. package/dist/adapters/google-vertex/backend/embedding.d.cts +2 -2
  79. package/dist/adapters/google-vertex/backend/embedding.d.ts +2 -2
  80. package/dist/adapters/google-vertex/backend/embedding.js.map +1 -1
  81. package/dist/adapters/groq/backend/chat.cjs.map +1 -1
  82. package/dist/adapters/groq/backend/chat.d.cts +3 -3
  83. package/dist/adapters/groq/backend/chat.d.ts +3 -3
  84. package/dist/adapters/groq/backend/chat.js.map +1 -1
  85. package/dist/adapters/groq/backend/client.cjs.map +1 -1
  86. package/dist/adapters/groq/backend/client.js.map +1 -1
  87. package/dist/adapters/groq/backend/embedding.cjs.map +1 -1
  88. package/dist/adapters/groq/backend/embedding.d.cts +2 -2
  89. package/dist/adapters/groq/backend/embedding.d.ts +2 -2
  90. package/dist/adapters/groq/backend/embedding.js.map +1 -1
  91. package/dist/adapters/langchain/backend/chat.cjs +6 -28
  92. package/dist/adapters/langchain/backend/chat.cjs.map +1 -1
  93. package/dist/adapters/langchain/backend/chat.d.cts +6 -5
  94. package/dist/adapters/langchain/backend/chat.d.ts +6 -5
  95. package/dist/adapters/langchain/backend/chat.js +6 -28
  96. package/dist/adapters/langchain/backend/chat.js.map +1 -1
  97. package/dist/adapters/langchain/backend/embedding.cjs +3 -2
  98. package/dist/adapters/langchain/backend/embedding.cjs.map +1 -1
  99. package/dist/adapters/langchain/backend/embedding.d.cts +3 -3
  100. package/dist/adapters/langchain/backend/embedding.d.ts +3 -3
  101. package/dist/adapters/langchain/backend/embedding.js +3 -2
  102. package/dist/adapters/langchain/backend/embedding.js.map +1 -1
  103. package/dist/adapters/langchain/backend/utils.cjs +328 -0
  104. package/dist/adapters/langchain/backend/utils.cjs.map +1 -0
  105. package/dist/adapters/langchain/backend/utils.d.cts +39 -0
  106. package/dist/adapters/langchain/backend/utils.d.ts +39 -0
  107. package/dist/adapters/langchain/backend/utils.js +324 -0
  108. package/dist/adapters/langchain/backend/utils.js.map +1 -0
  109. package/dist/adapters/langchain/tools.cjs.map +1 -1
  110. package/dist/adapters/langchain/tools.d.cts +2 -2
  111. package/dist/adapters/langchain/tools.d.ts +2 -2
  112. package/dist/adapters/langchain/tools.js.map +1 -1
  113. package/dist/adapters/mcp/serve/http_server.cjs.map +1 -1
  114. package/dist/adapters/mcp/serve/http_server.js.map +1 -1
  115. package/dist/adapters/mcp/serve/in_memory_store.cjs.map +1 -1
  116. package/dist/adapters/mcp/serve/in_memory_store.js.map +1 -1
  117. package/dist/adapters/mcp/serve/server.cjs.map +1 -1
  118. package/dist/adapters/mcp/serve/server.js.map +1 -1
  119. package/dist/adapters/minimax/backend/chat.cjs +25 -0
  120. package/dist/adapters/minimax/backend/chat.cjs.map +1 -0
  121. package/dist/adapters/minimax/backend/chat.d.cts +38 -0
  122. package/dist/adapters/minimax/backend/chat.d.ts +38 -0
  123. package/dist/adapters/minimax/backend/chat.js +23 -0
  124. package/dist/adapters/minimax/backend/chat.js.map +1 -0
  125. package/dist/adapters/minimax/backend/client.cjs +31 -0
  126. package/dist/adapters/minimax/backend/client.cjs.map +1 -0
  127. package/dist/adapters/minimax/backend/client.d.cts +17 -0
  128. package/dist/adapters/minimax/backend/client.d.ts +17 -0
  129. package/dist/adapters/minimax/backend/client.js +29 -0
  130. package/dist/adapters/minimax/backend/client.js.map +1 -0
  131. package/dist/adapters/ollama/backend/chat.cjs.map +1 -1
  132. package/dist/adapters/ollama/backend/chat.d.cts +2 -2
  133. package/dist/adapters/ollama/backend/chat.d.ts +2 -2
  134. package/dist/adapters/ollama/backend/chat.js.map +1 -1
  135. package/dist/adapters/ollama/backend/client.cjs.map +1 -1
  136. package/dist/adapters/ollama/backend/client.js.map +1 -1
  137. package/dist/adapters/ollama/backend/embedding.cjs.map +1 -1
  138. package/dist/adapters/ollama/backend/embedding.d.cts +2 -2
  139. package/dist/adapters/ollama/backend/embedding.d.ts +2 -2
  140. package/dist/adapters/ollama/backend/embedding.js.map +1 -1
  141. package/dist/adapters/openai/backend/chat.cjs.map +1 -1
  142. package/dist/adapters/openai/backend/chat.d.cts +2 -2
  143. package/dist/adapters/openai/backend/chat.d.ts +2 -2
  144. package/dist/adapters/openai/backend/chat.js.map +1 -1
  145. package/dist/adapters/openai/backend/client.cjs.map +1 -1
  146. package/dist/adapters/openai/backend/client.js.map +1 -1
  147. package/dist/adapters/openai/backend/embedding.cjs.map +1 -1
  148. package/dist/adapters/openai/backend/embedding.d.cts +2 -2
  149. package/dist/adapters/openai/backend/embedding.d.ts +2 -2
  150. package/dist/adapters/openai/backend/embedding.js.map +1 -1
  151. package/dist/adapters/vercel/backend/chat.cjs.map +1 -1
  152. package/dist/adapters/vercel/backend/chat.d.cts +2 -2
  153. package/dist/adapters/vercel/backend/chat.d.ts +2 -2
  154. package/dist/adapters/vercel/backend/chat.js.map +1 -1
  155. package/dist/adapters/vercel/backend/embedding.cjs.map +1 -1
  156. package/dist/adapters/vercel/backend/embedding.d.cts +2 -2
  157. package/dist/adapters/vercel/backend/embedding.d.ts +2 -2
  158. package/dist/adapters/vercel/backend/embedding.js.map +1 -1
  159. package/dist/adapters/vercel/backend/utils.cjs.map +1 -1
  160. package/dist/adapters/vercel/backend/utils.d.cts +2 -2
  161. package/dist/adapters/vercel/backend/utils.d.ts +2 -2
  162. package/dist/adapters/vercel/backend/utils.js.map +1 -1
  163. package/dist/adapters/watsonx/backend/chat.cjs.map +1 -1
  164. package/dist/adapters/watsonx/backend/chat.d.cts +2 -2
  165. package/dist/adapters/watsonx/backend/chat.d.ts +2 -2
  166. package/dist/adapters/watsonx/backend/chat.js +1 -1
  167. package/dist/adapters/watsonx/backend/chat.js.map +1 -1
  168. package/dist/adapters/watsonx/backend/client.cjs.map +1 -1
  169. package/dist/adapters/watsonx/backend/client.js.map +1 -1
  170. package/dist/adapters/watsonx/backend/embedding.cjs.map +1 -1
  171. package/dist/adapters/watsonx/backend/embedding.d.cts +2 -2
  172. package/dist/adapters/watsonx/backend/embedding.d.ts +2 -2
  173. package/dist/adapters/watsonx/backend/embedding.js.map +1 -1
  174. package/dist/adapters/xai/backend/chat.cjs.map +1 -1
  175. package/dist/adapters/xai/backend/chat.d.cts +2 -2
  176. package/dist/adapters/xai/backend/chat.d.ts +2 -2
  177. package/dist/adapters/xai/backend/chat.js.map +1 -1
  178. package/dist/adapters/xai/backend/client.cjs.map +1 -1
  179. package/dist/adapters/xai/backend/client.js.map +1 -1
  180. package/dist/{agent-BAVf6-xf.d.ts → agent-s3uhvAba.d.ts} +5 -5
  181. package/dist/{agent-DHO-oJQf.d.cts → agent-zfT__iq9.d.cts} +5 -5
  182. package/dist/agents/base.cjs.map +1 -1
  183. package/dist/agents/base.d.cts +2 -2
  184. package/dist/agents/base.d.ts +2 -2
  185. package/dist/agents/base.js.map +1 -1
  186. package/dist/agents/experimental/replan/agent.cjs.map +1 -1
  187. package/dist/agents/experimental/replan/agent.d.cts +3 -3
  188. package/dist/agents/experimental/replan/agent.d.ts +3 -3
  189. package/dist/agents/experimental/replan/agent.js.map +1 -1
  190. package/dist/agents/experimental/replan/prompts.cjs.map +1 -1
  191. package/dist/agents/experimental/replan/prompts.d.cts +1 -1
  192. package/dist/agents/experimental/replan/prompts.d.ts +1 -1
  193. package/dist/agents/experimental/replan/prompts.js.map +1 -1
  194. package/dist/agents/experimental/streamlit/agent.cjs.map +1 -1
  195. package/dist/agents/experimental/streamlit/agent.d.cts +3 -3
  196. package/dist/agents/experimental/streamlit/agent.d.ts +3 -3
  197. package/dist/agents/experimental/streamlit/agent.js.map +1 -1
  198. package/dist/agents/experimental/streamlit/prompts.cjs +2 -2
  199. package/dist/agents/experimental/streamlit/prompts.cjs.map +1 -1
  200. package/dist/agents/experimental/streamlit/prompts.js +2 -2
  201. package/dist/agents/experimental/streamlit/prompts.js.map +1 -1
  202. package/dist/agents/react/agent.cjs +6 -6
  203. package/dist/agents/react/agent.cjs.map +1 -1
  204. package/dist/agents/react/agent.d.cts +4 -4
  205. package/dist/agents/react/agent.d.ts +4 -4
  206. package/dist/agents/react/agent.js.map +1 -1
  207. package/dist/agents/react/prompts.cjs.map +1 -1
  208. package/dist/agents/react/prompts.d.cts +1 -1
  209. package/dist/agents/react/prompts.d.ts +1 -1
  210. package/dist/agents/react/prompts.js.map +1 -1
  211. package/dist/agents/react/runners/base.cjs.map +1 -1
  212. package/dist/agents/react/runners/base.d.cts +4 -4
  213. package/dist/agents/react/runners/base.d.ts +4 -4
  214. package/dist/agents/react/runners/base.js.map +1 -1
  215. package/dist/agents/react/runners/deep-think/prompts.cjs.map +1 -1
  216. package/dist/agents/react/runners/deep-think/prompts.d.cts +1 -1
  217. package/dist/agents/react/runners/deep-think/prompts.d.ts +1 -1
  218. package/dist/agents/react/runners/deep-think/prompts.js.map +1 -1
  219. package/dist/agents/react/runners/deep-think/runner.cjs.map +1 -1
  220. package/dist/agents/react/runners/deep-think/runner.d.cts +5 -5
  221. package/dist/agents/react/runners/deep-think/runner.d.ts +5 -5
  222. package/dist/agents/react/runners/deep-think/runner.js.map +1 -1
  223. package/dist/agents/react/runners/default/runner.cjs.map +1 -1
  224. package/dist/agents/react/runners/default/runner.d.cts +5 -5
  225. package/dist/agents/react/runners/default/runner.d.ts +5 -5
  226. package/dist/agents/react/runners/default/runner.js.map +1 -1
  227. package/dist/agents/react/runners/default/runner.spec.cjs.map +1 -1
  228. package/dist/agents/react/runners/default/runner.spec.js.map +1 -1
  229. package/dist/agents/react/runners/granite/prompts.cjs.map +1 -1
  230. package/dist/agents/react/runners/granite/prompts.d.cts +1 -1
  231. package/dist/agents/react/runners/granite/prompts.d.ts +1 -1
  232. package/dist/agents/react/runners/granite/prompts.js.map +1 -1
  233. package/dist/agents/react/runners/granite/runner.cjs.map +1 -1
  234. package/dist/agents/react/runners/granite/runner.d.cts +5 -5
  235. package/dist/agents/react/runners/granite/runner.d.ts +5 -5
  236. package/dist/agents/react/runners/granite/runner.js.map +1 -1
  237. package/dist/agents/react/types.d.cts +2 -2
  238. package/dist/agents/react/types.d.ts +2 -2
  239. package/dist/agents/requirement/agent.cjs.map +1 -1
  240. package/dist/agents/requirement/agent.d.cts +5 -5
  241. package/dist/agents/requirement/agent.d.ts +5 -5
  242. package/dist/agents/requirement/agent.js.map +1 -1
  243. package/dist/agents/requirement/prompts.d.cts +2 -2
  244. package/dist/agents/requirement/prompts.d.ts +2 -2
  245. package/dist/agents/requirement/requirements/conditional.cjs.map +1 -1
  246. package/dist/agents/requirement/requirements/conditional.d.cts +5 -5
  247. package/dist/agents/requirement/requirements/conditional.d.ts +5 -5
  248. package/dist/agents/requirement/requirements/conditional.js.map +1 -1
  249. package/dist/agents/requirement/requirements/requirement.cjs.map +1 -1
  250. package/dist/agents/requirement/requirements/requirement.d.cts +4 -4
  251. package/dist/agents/requirement/requirements/requirement.d.ts +4 -4
  252. package/dist/agents/requirement/requirements/requirement.js.map +1 -1
  253. package/dist/agents/requirement/requirements/utils.cjs.map +1 -1
  254. package/dist/agents/requirement/requirements/utils.d.cts +1 -1
  255. package/dist/agents/requirement/requirements/utils.d.ts +1 -1
  256. package/dist/agents/requirement/requirements/utils.js.map +1 -1
  257. package/dist/agents/requirement/runner.cjs.map +1 -1
  258. package/dist/agents/requirement/runner.d.cts +5 -5
  259. package/dist/agents/requirement/runner.d.ts +5 -5
  260. package/dist/agents/requirement/runner.js.map +1 -1
  261. package/dist/agents/requirement/types.d.cts +4 -4
  262. package/dist/agents/requirement/types.d.ts +4 -4
  263. package/dist/agents/requirement/utils/llm.cjs.map +1 -1
  264. package/dist/agents/requirement/utils/llm.d.cts +4 -4
  265. package/dist/agents/requirement/utils/llm.d.ts +4 -4
  266. package/dist/agents/requirement/utils/llm.js.map +1 -1
  267. package/dist/agents/requirement/utils/tool.cjs.map +1 -1
  268. package/dist/agents/requirement/utils/tool.d.cts +4 -4
  269. package/dist/agents/requirement/utils/tool.d.ts +4 -4
  270. package/dist/agents/requirement/utils/tool.js.map +1 -1
  271. package/dist/agents/requirement/utils/toolCallChecker.cjs.map +1 -1
  272. package/dist/agents/requirement/utils/toolCallChecker.js.map +1 -1
  273. package/dist/agents/toolCalling/agent.cjs.map +1 -1
  274. package/dist/agents/toolCalling/agent.d.cts +4 -4
  275. package/dist/agents/toolCalling/agent.d.ts +4 -4
  276. package/dist/agents/toolCalling/agent.js.map +1 -1
  277. package/dist/agents/toolCalling/prompts.cjs.map +1 -1
  278. package/dist/agents/toolCalling/prompts.js.map +1 -1
  279. package/dist/agents/toolCalling/types.d.cts +1 -1
  280. package/dist/agents/toolCalling/types.d.ts +1 -1
  281. package/dist/agents/types.d.cts +2 -2
  282. package/dist/agents/types.d.ts +2 -2
  283. package/dist/backend/backend.cjs.map +1 -1
  284. package/dist/backend/backend.d.cts +3 -3
  285. package/dist/backend/backend.d.ts +3 -3
  286. package/dist/backend/backend.js.map +1 -1
  287. package/dist/backend/chat.cjs.map +1 -1
  288. package/dist/backend/chat.d.cts +2 -2
  289. package/dist/backend/chat.d.ts +2 -2
  290. package/dist/backend/chat.js.map +1 -1
  291. package/dist/backend/client.cjs.map +1 -1
  292. package/dist/backend/client.js.map +1 -1
  293. package/dist/backend/constants.cjs +7 -0
  294. package/dist/backend/constants.cjs.map +1 -1
  295. package/dist/backend/constants.d.cts +5 -0
  296. package/dist/backend/constants.d.ts +5 -0
  297. package/dist/backend/constants.js +7 -0
  298. package/dist/backend/constants.js.map +1 -1
  299. package/dist/backend/core.d.cts +2 -2
  300. package/dist/backend/core.d.ts +2 -2
  301. package/dist/backend/embedding.cjs.map +1 -1
  302. package/dist/backend/embedding.d.cts +2 -2
  303. package/dist/backend/embedding.d.ts +2 -2
  304. package/dist/backend/embedding.js.map +1 -1
  305. package/dist/backend/errors.cjs.map +1 -1
  306. package/dist/backend/errors.d.cts +2 -2
  307. package/dist/backend/errors.d.ts +2 -2
  308. package/dist/backend/errors.js.map +1 -1
  309. package/dist/backend/message.cjs.map +1 -1
  310. package/dist/backend/message.js.map +1 -1
  311. package/dist/backend/utils.cjs.map +1 -1
  312. package/dist/backend/utils.d.cts +2 -2
  313. package/dist/backend/utils.d.ts +2 -2
  314. package/dist/backend/utils.js.map +1 -1
  315. package/dist/{base-BfhNzUYf.d.ts → base-BjzyQ8k6.d.ts} +2 -2
  316. package/dist/{base-BqzN2QwB.d.cts → base-s3ioVIE9.d.cts} +2 -2
  317. package/dist/cache/decoratorCache.cjs.map +1 -1
  318. package/dist/cache/decoratorCache.js.map +1 -1
  319. package/dist/cache/fileCache.cjs.map +1 -1
  320. package/dist/cache/fileCache.js.map +1 -1
  321. package/dist/cache/nullCache.cjs.map +1 -1
  322. package/dist/cache/nullCache.js.map +1 -1
  323. package/dist/cache/slidingCache.cjs.map +1 -1
  324. package/dist/cache/slidingCache.js.map +1 -1
  325. package/dist/cache/unconstrainedCache.cjs.map +1 -1
  326. package/dist/cache/unconstrainedCache.js.map +1 -1
  327. package/dist/{chat-DaqV3woF.d.cts → chat-C20nYj46.d.cts} +3 -3
  328. package/dist/{chat-DTxmaKP0.d.ts → chat-CfTNfR60.d.ts} +3 -3
  329. package/dist/context.cjs.map +1 -1
  330. package/dist/context.d.cts +1 -1
  331. package/dist/context.d.ts +1 -1
  332. package/dist/context.js.map +1 -1
  333. package/dist/emitter/emitter.cjs.map +1 -1
  334. package/dist/emitter/emitter.d.cts +1 -1
  335. package/dist/emitter/emitter.d.ts +1 -1
  336. package/dist/emitter/emitter.js.map +1 -1
  337. package/dist/emitter/types.d.cts +1 -1
  338. package/dist/emitter/types.d.ts +1 -1
  339. package/dist/emitter/utils.cjs.map +1 -1
  340. package/dist/emitter/utils.js.map +1 -1
  341. package/dist/{emitter-UkIkNrek.d.cts → emitter-D4OcelZ9.d.cts} +2 -2
  342. package/dist/{emitter-CL56qab4.d.ts → emitter-kHxkUxco.d.ts} +2 -2
  343. package/dist/errors.cjs.map +1 -1
  344. package/dist/errors.js.map +1 -1
  345. package/dist/index.d.cts +4 -4
  346. package/dist/index.d.ts +4 -4
  347. package/dist/internals/env.cjs.map +1 -1
  348. package/dist/internals/env.js.map +1 -1
  349. package/dist/internals/fetcher.cjs.map +1 -1
  350. package/dist/internals/fetcher.d.cts +1 -1
  351. package/dist/internals/fetcher.d.ts +1 -1
  352. package/dist/internals/fetcher.js.map +1 -1
  353. package/dist/internals/helpers/array.cjs.map +1 -1
  354. package/dist/internals/helpers/array.js.map +1 -1
  355. package/dist/internals/helpers/cancellation.cjs.map +1 -1
  356. package/dist/internals/helpers/cancellation.js.map +1 -1
  357. package/dist/internals/helpers/counter.cjs.map +1 -1
  358. package/dist/internals/helpers/counter.js.map +1 -1
  359. package/dist/internals/helpers/general.cjs.map +1 -1
  360. package/dist/internals/helpers/general.js.map +1 -1
  361. package/dist/internals/helpers/hash.cjs.map +1 -1
  362. package/dist/internals/helpers/hash.js.map +1 -1
  363. package/dist/internals/helpers/map.cjs.map +1 -1
  364. package/dist/internals/helpers/map.js.map +1 -1
  365. package/dist/internals/helpers/math.cjs.map +1 -1
  366. package/dist/internals/helpers/math.js.map +1 -1
  367. package/dist/internals/helpers/object.cjs +7 -1
  368. package/dist/internals/helpers/object.cjs.map +1 -1
  369. package/dist/internals/helpers/object.js +7 -1
  370. package/dist/internals/helpers/object.js.map +1 -1
  371. package/dist/internals/helpers/paginate.cjs.map +1 -1
  372. package/dist/internals/helpers/paginate.js.map +1 -1
  373. package/dist/internals/helpers/promise.cjs.map +1 -1
  374. package/dist/internals/helpers/promise.js.map +1 -1
  375. package/dist/internals/helpers/prototype.cjs.map +1 -1
  376. package/dist/internals/helpers/prototype.js.map +1 -1
  377. package/dist/internals/helpers/retry.cjs.map +1 -1
  378. package/dist/internals/helpers/retry.js.map +1 -1
  379. package/dist/internals/helpers/retryable.cjs.map +1 -1
  380. package/dist/internals/helpers/retryable.js.map +1 -1
  381. package/dist/internals/helpers/schema.cjs.map +1 -1
  382. package/dist/internals/helpers/schema.d.cts +4 -4
  383. package/dist/internals/helpers/schema.d.ts +4 -4
  384. package/dist/internals/helpers/schema.js.map +1 -1
  385. package/dist/internals/helpers/stream.cjs.map +1 -1
  386. package/dist/internals/helpers/stream.js.map +1 -1
  387. package/dist/internals/helpers/string.cjs.map +1 -1
  388. package/dist/internals/helpers/string.js.map +1 -1
  389. package/dist/internals/helpers/weakRef.cjs.map +1 -1
  390. package/dist/internals/helpers/weakRef.js.map +1 -1
  391. package/dist/internals/serializable.cjs +3 -1
  392. package/dist/internals/serializable.cjs.map +1 -1
  393. package/dist/internals/serializable.d.cts +6 -0
  394. package/dist/internals/serializable.d.ts +6 -0
  395. package/dist/internals/serializable.js +3 -1
  396. package/dist/internals/serializable.js.map +1 -1
  397. package/dist/internals/types.cjs.map +1 -1
  398. package/dist/internals/types.js.map +1 -1
  399. package/dist/logger/logger.cjs.map +1 -1
  400. package/dist/logger/logger.d.cts +2 -2
  401. package/dist/logger/logger.d.ts +2 -2
  402. package/dist/logger/logger.js +2 -2
  403. package/dist/logger/logger.js.map +1 -1
  404. package/dist/logger/pretty.cjs.map +1 -1
  405. package/dist/logger/pretty.js.map +1 -1
  406. package/dist/memory/base.cjs.map +1 -1
  407. package/dist/memory/base.js.map +1 -1
  408. package/dist/memory/slidingMemory.cjs.map +1 -1
  409. package/dist/memory/slidingMemory.js.map +1 -1
  410. package/dist/memory/summarizeMemory.cjs.map +1 -1
  411. package/dist/memory/summarizeMemory.d.cts +2 -2
  412. package/dist/memory/summarizeMemory.d.ts +2 -2
  413. package/dist/memory/summarizeMemory.js.map +1 -1
  414. package/dist/memory/tokenMemory.cjs.map +1 -1
  415. package/dist/memory/tokenMemory.js.map +1 -1
  416. package/dist/memory/unconstrainedMemory.cjs.map +1 -1
  417. package/dist/memory/unconstrainedMemory.js.map +1 -1
  418. package/dist/middleware/streamToolCall.cjs.map +1 -1
  419. package/dist/middleware/streamToolCall.d.cts +2 -2
  420. package/dist/middleware/streamToolCall.d.ts +2 -2
  421. package/dist/middleware/streamToolCall.js.map +1 -1
  422. package/dist/middleware/trajectory.cjs.map +1 -1
  423. package/dist/middleware/trajectory.d.cts +2 -2
  424. package/dist/middleware/trajectory.d.ts +2 -2
  425. package/dist/middleware/trajectory.js.map +1 -1
  426. package/dist/parsers/errors.cjs.map +1 -1
  427. package/dist/parsers/errors.js.map +1 -1
  428. package/dist/parsers/field.cjs.map +1 -1
  429. package/dist/parsers/field.js.map +1 -1
  430. package/dist/parsers/linePrefix.cjs.map +1 -1
  431. package/dist/parsers/linePrefix.d.cts +1 -1
  432. package/dist/parsers/linePrefix.d.ts +1 -1
  433. package/dist/parsers/linePrefix.js.map +1 -1
  434. package/dist/serializer/error.cjs.map +1 -1
  435. package/dist/serializer/error.js.map +1 -1
  436. package/dist/serializer/serializer.cjs +16 -3
  437. package/dist/serializer/serializer.cjs.map +1 -1
  438. package/dist/serializer/serializer.d.cts +1 -1
  439. package/dist/serializer/serializer.d.ts +1 -1
  440. package/dist/serializer/serializer.js +16 -4
  441. package/dist/serializer/serializer.js.map +1 -1
  442. package/dist/serializer/utils.cjs.map +1 -1
  443. package/dist/serializer/utils.d.cts +1 -1
  444. package/dist/serializer/utils.d.ts +1 -1
  445. package/dist/serializer/utils.js.map +1 -1
  446. package/dist/{serializer-53t8gGQa.d.ts → serializer-BafOT48s.d.ts} +10 -4
  447. package/dist/{serializer-c51B2z6d.d.cts → serializer-CFDWYUco.d.cts} +10 -4
  448. package/dist/serve/server.cjs.map +1 -1
  449. package/dist/serve/server.js.map +1 -1
  450. package/dist/template.cjs.map +1 -1
  451. package/dist/template.js.map +1 -1
  452. package/dist/tools/arxiv.cjs.map +1 -1
  453. package/dist/tools/arxiv.d.cts +2 -2
  454. package/dist/tools/arxiv.d.ts +2 -2
  455. package/dist/tools/arxiv.js.map +1 -1
  456. package/dist/tools/base.cjs.map +1 -1
  457. package/dist/tools/base.d.cts +1 -1
  458. package/dist/tools/base.d.ts +1 -1
  459. package/dist/tools/base.js.map +1 -1
  460. package/dist/tools/calculator.cjs.map +1 -1
  461. package/dist/tools/calculator.d.cts +3 -3
  462. package/dist/tools/calculator.d.ts +3 -3
  463. package/dist/tools/calculator.js.map +1 -1
  464. package/dist/tools/custom.cjs.map +1 -1
  465. package/dist/tools/custom.d.cts +3 -3
  466. package/dist/tools/custom.d.ts +3 -3
  467. package/dist/tools/custom.js.map +1 -1
  468. package/dist/tools/database/elasticsearch.cjs.map +1 -1
  469. package/dist/tools/database/elasticsearch.d.cts +3 -3
  470. package/dist/tools/database/elasticsearch.d.ts +3 -3
  471. package/dist/tools/database/elasticsearch.js.map +1 -1
  472. package/dist/tools/database/metadata.cjs.map +1 -1
  473. package/dist/tools/database/metadata.js.map +1 -1
  474. package/dist/tools/database/milvus.cjs.map +1 -1
  475. package/dist/tools/database/milvus.d.cts +3 -3
  476. package/dist/tools/database/milvus.d.ts +3 -3
  477. package/dist/tools/database/milvus.js.map +1 -1
  478. package/dist/tools/database/qdrant.cjs.map +1 -1
  479. package/dist/tools/database/qdrant.d.cts +2 -2
  480. package/dist/tools/database/qdrant.d.ts +2 -2
  481. package/dist/tools/database/qdrant.js.map +1 -1
  482. package/dist/tools/database/sql.cjs.map +1 -1
  483. package/dist/tools/database/sql.d.cts +2 -2
  484. package/dist/tools/database/sql.d.ts +2 -2
  485. package/dist/tools/database/sql.js.map +1 -1
  486. package/dist/tools/handoff.cjs.map +1 -1
  487. package/dist/tools/handoff.d.cts +2 -2
  488. package/dist/tools/handoff.d.ts +2 -2
  489. package/dist/tools/handoff.js.map +1 -1
  490. package/dist/tools/llm.cjs +1 -1
  491. package/dist/tools/llm.cjs.map +1 -1
  492. package/dist/tools/llm.d.cts +3 -3
  493. package/dist/tools/llm.d.ts +3 -3
  494. package/dist/tools/llm.js +1 -1
  495. package/dist/tools/llm.js.map +1 -1
  496. package/dist/tools/mcp.cjs.map +1 -1
  497. package/dist/tools/mcp.d.cts +2 -2
  498. package/dist/tools/mcp.d.ts +2 -2
  499. package/dist/tools/mcp.js.map +1 -1
  500. package/dist/tools/openapi.cjs.map +1 -1
  501. package/dist/tools/openapi.d.cts +2 -2
  502. package/dist/tools/openapi.d.ts +2 -2
  503. package/dist/tools/openapi.js.map +1 -1
  504. package/dist/tools/python/output.cjs.map +1 -1
  505. package/dist/tools/python/output.d.cts +1 -1
  506. package/dist/tools/python/output.d.ts +1 -1
  507. package/dist/tools/python/output.js.map +1 -1
  508. package/dist/tools/python/python.cjs +5 -2
  509. package/dist/tools/python/python.cjs.map +1 -1
  510. package/dist/tools/python/python.d.cts +3 -3
  511. package/dist/tools/python/python.d.ts +3 -3
  512. package/dist/tools/python/python.js +5 -2
  513. package/dist/tools/python/python.js.map +1 -1
  514. package/dist/tools/python/storage.cjs.map +1 -1
  515. package/dist/tools/python/storage.js.map +1 -1
  516. package/dist/tools/search/base.cjs.map +1 -1
  517. package/dist/tools/search/base.d.cts +2 -2
  518. package/dist/tools/search/base.d.ts +2 -2
  519. package/dist/tools/search/base.js.map +1 -1
  520. package/dist/tools/search/duckDuckGoSearch.cjs.map +1 -1
  521. package/dist/tools/search/duckDuckGoSearch.d.cts +2 -2
  522. package/dist/tools/search/duckDuckGoSearch.d.ts +2 -2
  523. package/dist/tools/search/duckDuckGoSearch.js.map +1 -1
  524. package/dist/tools/search/googleSearch.cjs.map +1 -1
  525. package/dist/tools/search/googleSearch.d.cts +2 -2
  526. package/dist/tools/search/googleSearch.d.ts +2 -2
  527. package/dist/tools/search/googleSearch.js.map +1 -1
  528. package/dist/tools/search/searXNGSearch.cjs.map +1 -1
  529. package/dist/tools/search/searXNGSearch.d.cts +2 -2
  530. package/dist/tools/search/searXNGSearch.d.ts +2 -2
  531. package/dist/tools/search/searXNGSearch.js.map +1 -1
  532. package/dist/tools/search/wikipedia.cjs.map +1 -1
  533. package/dist/tools/search/wikipedia.d.cts +3 -3
  534. package/dist/tools/search/wikipedia.d.ts +3 -3
  535. package/dist/tools/search/wikipedia.js.map +1 -1
  536. package/dist/tools/similarity.cjs.map +1 -1
  537. package/dist/tools/similarity.d.cts +2 -2
  538. package/dist/tools/similarity.d.ts +2 -2
  539. package/dist/tools/similarity.js.map +1 -1
  540. package/dist/tools/think.cjs.map +1 -1
  541. package/dist/tools/think.d.cts +2 -2
  542. package/dist/tools/think.d.ts +2 -2
  543. package/dist/tools/think.js.map +1 -1
  544. package/dist/tools/weather/openMeteo.cjs.map +1 -1
  545. package/dist/tools/weather/openMeteo.d.cts +2 -2
  546. package/dist/tools/weather/openMeteo.d.ts +2 -2
  547. package/dist/tools/weather/openMeteo.js.map +1 -1
  548. package/dist/tools/web/webCrawler.cjs.map +1 -1
  549. package/dist/tools/web/webCrawler.d.cts +2 -2
  550. package/dist/tools/web/webCrawler.d.ts +2 -2
  551. package/dist/tools/web/webCrawler.js.map +1 -1
  552. package/dist/{types-YoNQSxQH.d.cts → types-BNsa3W7Z.d.cts} +4 -4
  553. package/dist/{types-YT-WdK3m.d.ts → types-DYtzF6ya.d.ts} +4 -4
  554. package/dist/version.cjs +1 -1
  555. package/dist/version.js +1 -1
  556. package/dist/workflows/agent.cjs.map +1 -1
  557. package/dist/workflows/agent.d.cts +40 -40
  558. package/dist/workflows/agent.d.ts +40 -40
  559. package/dist/workflows/agent.js.map +1 -1
  560. package/dist/workflows/workflow.cjs.map +1 -1
  561. package/dist/workflows/workflow.d.cts +1 -1
  562. package/dist/workflows/workflow.d.ts +1 -1
  563. package/dist/workflows/workflow.js.map +1 -1
  564. package/package.json +38 -15
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/memory/summarizeMemory.ts"],"names":["SummarizeMemoryTemplate","PromptTemplate","schema","z","object","summary","string","template","SummarizeMemory","BaseMemory","llm","config","register","messages","currentSummary","AssistantMessage","delete","message","add","_index","response","create","SystemMessage","render","role","text","getTextContent","reset","createSnapshot","shallowCopy","loadSnapshot","state","Object","assign"],"mappings":";;;;;;;;AAiBO,MAAMA,uBAAAA,GAA0B,IAAIC,cAAAA,CAAe;AACxDC,EAAAA,MAAAA,EAAQC,EAAEC,MAAAA,CAAO;AACfC,IAAAA,OAAAA,EAASF,EAAEG,MAAAA;GACb,CAAA;EACAC,QAAAA,EAAU,CAAA;;;;AAIZ,CAAA;AAEO,MAAMC,wBAAwBC,UAAAA,CAAAA;EA3BrC;;;EA4BYJ,OAAAA,GAAU,EAAA;AACVE,EAAAA,QAAAA;AACAG,EAAAA,GAAAA;AAEV,EAAA,WAAA,CAAYC,MAAAA,EAA8B;AACxC,IAAA,KAAA,EAAK;AACL,IAAA,IAAA,CAAKJ,QAAAA,GAAWI,OAAOJ,QAAAA,IAAYP,uBAAAA;AACnC,IAAA,IAAA,CAAKU,MAAMC,MAAAA,CAAOD,GAAAA;AACpB;EAEA;AACE,IAAA,IAAA,CAAKE,QAAAA,EAAQ;AACf;AAEA,EAAA,IAAIC,QAAAA,GAAsB;AACxB,IAAA,MAAMC,iBAAiB,IAAA,CAAKT,OAAAA;AAC5B,IAAA,IAAI,CAACS,cAAAA,EAAgB;AACnB,MAAA,OAAO,EAAA;AACT;AAEA,IAAA,OAAO;AAAC,MAAA,IAAIC,iBAAiBD,cAAAA;;AAC/B;;AAGA,EAAA,MAAME,OAAOC,OAAAA,EAAkB;AAC7B,IAAA,OAAO,KAAA;AACT;EAEA,MAAMC,GAAAA,CAAID,SAAkBE,MAAAA,EAAiB;AAC3C,IAAA,MAAMC,QAAAA,GAAW,MAAM,IAAA,CAAKV,GAAAA,CAAIW,MAAAA,CAAO;MACrCR,QAAAA,EAAU;QACR,IAAIS,aAAAA,CACF,IAAA,CAAKf,QAAAA,CAASgB,MAAAA,CAAO;AACnBlB,UAAAA,OAAAA,EAAS,IAAA,CAAKA;AAChB,SAAA,CAAA,CAAA;AAEF,QAAA,IAAIU,gBAAAA,CAAiB,CAAA;EAC3BE,OAAAA,CAAQO,IAAI,CAAA,EAAA,EAAKP,OAAAA,CAAQQ,IAAI;;;AAG9B,CAAA;;KAEG,CAAA;AACA,IAAA,IAAA,CAAKpB,OAAAA,GAAUe,SAASM,cAAAA,EAAc;AACxC;EAEAC,KAAAA,GAAQ;AACN,IAAA,IAAA,CAAKtB,OAAAA,GAAU,EAAA;AACjB;EAEAuB,cAAAA,GAAiB;AACf,IAAA,OAAO;AACLvB,MAAAA,OAAAA,EAAS,IAAA,CAAKA,OAAAA;AACdE,MAAAA,QAAAA,EAAU,IAAA,CAAKA,QAAAA;AACfG,MAAAA,GAAAA,EAAK,IAAA,CAAKA,GAAAA;MACVG,QAAAA,EAAUgB,WAAAA,CAAY,KAAKhB,QAAQ;AACrC,KAAA;AACF;AAEAiB,EAAAA,YAAAA,CAAaC,KAAAA,EAA+C;AAC1DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,KAAAA,CAAAA;AACtB;AACF","file":"summarizeMemory.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AssistantMessage, Message, SystemMessage } from \"@/backend/message.js\";\nimport { BaseMemory } from \"@/memory/base.js\";\nimport { PromptTemplate } from \"@/template.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { z } from \"zod\";\nimport { ChatModel } from \"@/backend/chat.js\";\n\nexport interface SummarizeMemoryInput {\n llm: ChatModel;\n template?: typeof SummarizeMemoryTemplate;\n}\n\nexport const SummarizeMemoryTemplate = new PromptTemplate({\n schema: z.object({\n summary: z.string(),\n }),\n template: `Progressively summarize the lines of conversation provided, adding onto the previous summary returning a new summary.\n\nCurrent summary:\n{{summary}}`,\n});\n\nexport class SummarizeMemory extends BaseMemory {\n protected summary = \"\";\n protected template;\n protected llm;\n\n constructor(config: SummarizeMemoryInput) {\n super();\n this.template = config.template ?? SummarizeMemoryTemplate;\n this.llm = config.llm;\n }\n\n static {\n this.register();\n }\n\n get messages(): Message[] {\n const currentSummary = this.summary;\n if (!currentSummary) {\n return [];\n }\n\n return [new AssistantMessage(currentSummary)];\n }\n\n // eslint-disable-next-line unused-imports/no-unused-vars\n async delete(message: Message) {\n return false;\n }\n\n async add(message: Message, _index?: number) {\n const response = await this.llm.create({\n messages: [\n new SystemMessage(\n this.template.render({\n summary: this.summary,\n }),\n ),\n new AssistantMessage(`New lines of conversation:\n${message.role}: ${message.text}\n\nNew summary:\n`),\n ],\n });\n this.summary = response.getTextContent();\n }\n\n reset() {\n this.summary = \"\";\n }\n\n createSnapshot() {\n return {\n summary: this.summary,\n template: this.template,\n llm: this.llm,\n messages: shallowCopy(this.messages),\n };\n }\n\n loadSnapshot(state: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, state);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/memory/summarizeMemory.ts"],"names":["SummarizeMemoryTemplate","PromptTemplate","schema","z","object","summary","string","template","SummarizeMemory","BaseMemory","llm","config","register","messages","currentSummary","AssistantMessage","delete","message","add","_index","response","create","SystemMessage","render","role","text","getTextContent","reset","createSnapshot","shallowCopy","loadSnapshot","state","Object","assign"],"mappings":";;;;;;;;AAiBO,MAAMA,uBAAAA,GAA0B,IAAIC,cAAAA,CAAe;AACxDC,EAAAA,MAAAA,EAAQC,EAAEC,MAAAA,CAAO;AACfC,IAAAA,OAAAA,EAASF,EAAEG,MAAAA;GACb,CAAA;EACAC,QAAAA,EAAU,CAAA;;;;AAIZ,CAAA;AAEO,MAAMC,wBAAwBC,UAAAA,CAAAA;EA3BrC;;;EA4BYJ,OAAAA,GAAU,EAAA;AACVE,EAAAA,QAAAA;AACAG,EAAAA,GAAAA;AAEV,EAAA,WAAA,CAAYC,MAAAA,EAA8B;AACxC,IAAA,KAAA,EAAK;AACL,IAAA,IAAA,CAAKJ,QAAAA,GAAWI,OAAOJ,QAAAA,IAAYP,uBAAAA;AACnC,IAAA,IAAA,CAAKU,MAAMC,MAAAA,CAAOD,GAAAA;AACpB,EAAA;EAEA;AACE,IAAA,IAAA,CAAKE,QAAAA,EAAQ;AACf;AAEA,EAAA,IAAIC,QAAAA,GAAsB;AACxB,IAAA,MAAMC,iBAAiB,IAAA,CAAKT,OAAAA;AAC5B,IAAA,IAAI,CAACS,cAAAA,EAAgB;AACnB,MAAA,OAAO,EAAA;AACT,IAAA;AAEA,IAAA,OAAO;AAAC,MAAA,IAAIC,iBAAiBD,cAAAA;;AAC/B,EAAA;;AAGA,EAAA,MAAME,OAAOC,OAAAA,EAAkB;AAC7B,IAAA,OAAO,KAAA;AACT,EAAA;EAEA,MAAMC,GAAAA,CAAID,SAAkBE,MAAAA,EAAiB;AAC3C,IAAA,MAAMC,QAAAA,GAAW,MAAM,IAAA,CAAKV,GAAAA,CAAIW,MAAAA,CAAO;MACrCR,QAAAA,EAAU;QACR,IAAIS,aAAAA,CACF,IAAA,CAAKf,QAAAA,CAASgB,MAAAA,CAAO;AACnBlB,UAAAA,OAAAA,EAAS,IAAA,CAAKA;AAChB,SAAA,CAAA,CAAA;AAEF,QAAA,IAAIU,gBAAAA,CAAiB,CAAA;EAC3BE,OAAAA,CAAQO,IAAI,CAAA,EAAA,EAAKP,OAAAA,CAAQQ,IAAI;;;AAG9B,CAAA;;KAEG,CAAA;AACA,IAAA,IAAA,CAAKpB,OAAAA,GAAUe,SAASM,cAAAA,EAAc;AACxC,EAAA;EAEAC,KAAAA,GAAQ;AACN,IAAA,IAAA,CAAKtB,OAAAA,GAAU,EAAA;AACjB,EAAA;EAEAuB,cAAAA,GAAiB;AACf,IAAA,OAAO;AACLvB,MAAAA,OAAAA,EAAS,IAAA,CAAKA,OAAAA;AACdE,MAAAA,QAAAA,EAAU,IAAA,CAAKA,QAAAA;AACfG,MAAAA,GAAAA,EAAK,IAAA,CAAKA,GAAAA;MACVG,QAAAA,EAAUgB,WAAAA,CAAY,KAAKhB,QAAQ;AACrC,KAAA;AACF,EAAA;AAEAiB,EAAAA,YAAAA,CAAaC,KAAAA,EAA+C;AAC1DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,KAAAA,CAAAA;AACtB,EAAA;AACF","file":"summarizeMemory.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AssistantMessage, Message, SystemMessage } from \"@/backend/message.js\";\nimport { BaseMemory } from \"@/memory/base.js\";\nimport { PromptTemplate } from \"@/template.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { z } from \"zod\";\nimport { ChatModel } from \"@/backend/chat.js\";\n\nexport interface SummarizeMemoryInput {\n llm: ChatModel;\n template?: typeof SummarizeMemoryTemplate;\n}\n\nexport const SummarizeMemoryTemplate = new PromptTemplate({\n schema: z.object({\n summary: z.string(),\n }),\n template: `Progressively summarize the lines of conversation provided, adding onto the previous summary returning a new summary.\n\nCurrent summary:\n{{summary}}`,\n});\n\nexport class SummarizeMemory extends BaseMemory {\n protected summary = \"\";\n protected template;\n protected llm;\n\n constructor(config: SummarizeMemoryInput) {\n super();\n this.template = config.template ?? SummarizeMemoryTemplate;\n this.llm = config.llm;\n }\n\n static {\n this.register();\n }\n\n get messages(): Message[] {\n const currentSummary = this.summary;\n if (!currentSummary) {\n return [];\n }\n\n return [new AssistantMessage(currentSummary)];\n }\n\n // eslint-disable-next-line unused-imports/no-unused-vars\n async delete(message: Message) {\n return false;\n }\n\n async add(message: Message, _index?: number) {\n const response = await this.llm.create({\n messages: [\n new SystemMessage(\n this.template.render({\n summary: this.summary,\n }),\n ),\n new AssistantMessage(`New lines of conversation:\n${message.role}: ${message.text}\n\nNew summary:\n`),\n ],\n });\n this.summary = response.getTextContent();\n }\n\n reset() {\n this.summary = \"\";\n }\n\n createSnapshot() {\n return {\n summary: this.summary,\n template: this.template,\n llm: this.llm,\n messages: shallowCopy(this.messages),\n };\n }\n\n loadSnapshot(state: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, state);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/memory/tokenMemory.ts"],"names":["simpleEstimate","msg","Math","ceil","text","length","simpleTokenize","msgs","sum","map","TokenMemory","BaseMemory","messages","threshold","syncThreshold","maxTokens","tokensByMessage","WeakMap","handlers","config","capacityThreshold","estimate","role","tokenize","removalSelector","R","clamp","min","max","TypeError","register","tokensUsed","get","tokensCount","isDirty","some","dirty","add","message","index","meta","has","MemoryFatalError","messageToDelete","exists","delete","set","ensureRange","splice","sync","removeFromArray","Promise","all","cache","addMany","reset","stats","messagesCount","createSnapshot","shallowCopy","filter","_","value","undefined","loadSnapshot","state","Object","assign"],"mappings":"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","file":"tokenMemory.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { BaseMemory, MemoryFatalError } from \"@/memory/base.js\";\nimport * as R from \"remeda\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { removeFromArray } from \"@/internals/helpers/array.js\";\nimport { map, sum } from \"remeda\";\nimport { ensureRange } from \"@/internals/helpers/number.js\";\nimport { Message } from \"@/backend/message.js\";\n\nexport interface Handlers {\n estimate: (messages: Message) => number;\n tokenize: (messages: Message[]) => Promise<number>;\n removalSelector: (messages: Message[]) => Message;\n}\n\nconst simpleEstimate: Handlers[\"estimate\"] = (msg: Message) => Math.ceil(msg.text.length / 4);\nconst simpleTokenize: Handlers[\"tokenize\"] = async (msgs: Message[]) =>\n sum(map(msgs, simpleEstimate)); // TODO\n\nexport interface TokenMemoryInput {\n maxTokens?: number;\n syncThreshold?: number;\n capacityThreshold?: number;\n handlers?: Partial<Handlers>;\n}\n\ninterface TokenByMessage {\n tokensCount: number;\n dirty: boolean;\n}\n\nexport class TokenMemory extends BaseMemory {\n public readonly messages: Message[] = [];\n\n protected threshold;\n protected syncThreshold;\n protected maxTokens: number | null = null;\n protected tokensByMessage = new WeakMap<Message, TokenByMessage>();\n public readonly handlers: Handlers;\n\n constructor(config: TokenMemoryInput = {}) {\n super();\n this.maxTokens = config.maxTokens ?? null;\n this.threshold = config.capacityThreshold ?? 0.75;\n this.syncThreshold = config.syncThreshold ?? 0.25;\n this.handlers = {\n ...config?.handlers,\n estimate:\n config?.handlers?.estimate || ((msg) => Math.ceil((msg.role.length + msg.text.length) / 4)),\n tokenize: config?.handlers?.tokenize || simpleTokenize,\n removalSelector: config.handlers?.removalSelector || ((messages) => messages[0]),\n };\n if (!R.clamp({ min: 0, max: 1 })(this.threshold)) {\n throw new TypeError('\"capacityThreshold\" must be a number in range (0, 1>');\n }\n }\n\n static {\n this.register();\n }\n\n get tokensUsed(): number {\n return sum(this.messages.map((msg) => this.tokensByMessage.get(msg)!.tokensCount!));\n }\n\n get isDirty(): boolean {\n return this.messages.some((msg) => this.tokensByMessage.get(msg)?.dirty !== false);\n }\n\n async add(message: Message, index?: number) {\n if (this.maxTokens === null) {\n // TODO: improve\n this.maxTokens = 128_000;\n }\n\n const meta = this.tokensByMessage.has(message)\n ? this.tokensByMessage.get(message)!\n : { tokensCount: this.handlers.estimate(message), dirty: true };\n\n if (meta.tokensCount > this.maxTokens) {\n throw new MemoryFatalError(\n `Retrieved message (${meta.tokensCount} tokens) cannot fit inside current memory (${this.maxTokens} tokens)`,\n );\n }\n\n while (this.tokensUsed > this.maxTokens - meta.tokensCount) {\n const messageToDelete = this.handlers.removalSelector(this.messages);\n const exists = await this.delete(messageToDelete);\n\n if (!messageToDelete || !exists) {\n throw new MemoryFatalError('The \"removalSelector\" handler must return a valid message!');\n }\n }\n\n this.tokensByMessage.set(message, meta);\n\n index = ensureRange(index ?? this.messages.length, { min: 0, max: this.messages.length });\n this.messages.splice(index, 0, message);\n\n if (this.isDirty && this.tokensUsed / this.maxTokens >= this.syncThreshold) {\n await this.sync();\n }\n }\n\n async delete(message: Message) {\n return removeFromArray(this.messages, message);\n }\n\n async sync() {\n const messages = await Promise.all(\n this.messages.map(async (msg) => {\n const cache = this.tokensByMessage.get(msg);\n if (cache?.dirty !== false) {\n const tokensCount = await this.handlers.tokenize([msg]);\n this.tokensByMessage.set(msg, { tokensCount, dirty: false });\n }\n return msg;\n }),\n );\n\n this.messages.length = 0;\n await this.addMany(messages);\n }\n\n reset() {\n for (const msg of this.messages) {\n this.tokensByMessage.delete(msg);\n }\n this.messages.length = 0;\n }\n\n stats() {\n return {\n tokensUsed: this.tokensUsed,\n maxTokens: this.maxTokens,\n messagesCount: this.messages.length,\n isDirty: this.isDirty,\n };\n }\n\n createSnapshot() {\n return {\n threshold: this.threshold,\n syncThreshold: this.syncThreshold,\n messages: shallowCopy(this.messages),\n handlers: shallowCopy(this.handlers),\n maxTokens: this.maxTokens,\n tokensByMessage: this.messages\n .map((message) => [message, this.tokensByMessage.get(message)])\n .filter(([_, value]) => value !== undefined) as [Message, number][],\n };\n }\n\n loadSnapshot({ tokensByMessage, ...state }: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, state, {\n tokensByMessage: new WeakMap(tokensByMessage),\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/memory/tokenMemory.ts"],"names":["simpleEstimate","msg","Math","ceil","text","length","simpleTokenize","msgs","sum","map","TokenMemory","BaseMemory","messages","threshold","syncThreshold","maxTokens","tokensByMessage","WeakMap","handlers","config","capacityThreshold","estimate","role","tokenize","removalSelector","R","clamp","min","max","TypeError","register","tokensUsed","get","tokensCount","isDirty","some","dirty","add","message","index","meta","has","MemoryFatalError","messageToDelete","exists","delete","set","ensureRange","splice","sync","removeFromArray","Promise","all","cache","addMany","reset","stats","messagesCount","createSnapshot","shallowCopy","filter","_","value","undefined","loadSnapshot","state","Object","assign"],"mappings":"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","file":"tokenMemory.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { BaseMemory, MemoryFatalError } from \"@/memory/base.js\";\nimport * as R from \"remeda\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { removeFromArray } from \"@/internals/helpers/array.js\";\nimport { map, sum } from \"remeda\";\nimport { ensureRange } from \"@/internals/helpers/number.js\";\nimport { Message } from \"@/backend/message.js\";\n\nexport interface Handlers {\n estimate: (messages: Message) => number;\n tokenize: (messages: Message[]) => Promise<number>;\n removalSelector: (messages: Message[]) => Message;\n}\n\nconst simpleEstimate: Handlers[\"estimate\"] = (msg: Message) => Math.ceil(msg.text.length / 4);\nconst simpleTokenize: Handlers[\"tokenize\"] = async (msgs: Message[]) =>\n sum(map(msgs, simpleEstimate)); // TODO\n\nexport interface TokenMemoryInput {\n maxTokens?: number;\n syncThreshold?: number;\n capacityThreshold?: number;\n handlers?: Partial<Handlers>;\n}\n\ninterface TokenByMessage {\n tokensCount: number;\n dirty: boolean;\n}\n\nexport class TokenMemory extends BaseMemory {\n public readonly messages: Message[] = [];\n\n protected threshold;\n protected syncThreshold;\n protected maxTokens: number | null = null;\n protected tokensByMessage = new WeakMap<Message, TokenByMessage>();\n public readonly handlers: Handlers;\n\n constructor(config: TokenMemoryInput = {}) {\n super();\n this.maxTokens = config.maxTokens ?? null;\n this.threshold = config.capacityThreshold ?? 0.75;\n this.syncThreshold = config.syncThreshold ?? 0.25;\n this.handlers = {\n ...config?.handlers,\n estimate:\n config?.handlers?.estimate || ((msg) => Math.ceil((msg.role.length + msg.text.length) / 4)),\n tokenize: config?.handlers?.tokenize || simpleTokenize,\n removalSelector: config.handlers?.removalSelector || ((messages) => messages[0]),\n };\n if (!R.clamp({ min: 0, max: 1 })(this.threshold)) {\n throw new TypeError('\"capacityThreshold\" must be a number in range (0, 1>');\n }\n }\n\n static {\n this.register();\n }\n\n get tokensUsed(): number {\n return sum(this.messages.map((msg) => this.tokensByMessage.get(msg)!.tokensCount!));\n }\n\n get isDirty(): boolean {\n return this.messages.some((msg) => this.tokensByMessage.get(msg)?.dirty !== false);\n }\n\n async add(message: Message, index?: number) {\n if (this.maxTokens === null) {\n // TODO: improve\n this.maxTokens = 128_000;\n }\n\n const meta = this.tokensByMessage.has(message)\n ? this.tokensByMessage.get(message)!\n : { tokensCount: this.handlers.estimate(message), dirty: true };\n\n if (meta.tokensCount > this.maxTokens) {\n throw new MemoryFatalError(\n `Retrieved message (${meta.tokensCount} tokens) cannot fit inside current memory (${this.maxTokens} tokens)`,\n );\n }\n\n while (this.tokensUsed > this.maxTokens - meta.tokensCount) {\n const messageToDelete = this.handlers.removalSelector(this.messages);\n const exists = await this.delete(messageToDelete);\n\n if (!messageToDelete || !exists) {\n throw new MemoryFatalError('The \"removalSelector\" handler must return a valid message!');\n }\n }\n\n this.tokensByMessage.set(message, meta);\n\n index = ensureRange(index ?? this.messages.length, { min: 0, max: this.messages.length });\n this.messages.splice(index, 0, message);\n\n if (this.isDirty && this.tokensUsed / this.maxTokens >= this.syncThreshold) {\n await this.sync();\n }\n }\n\n async delete(message: Message) {\n return removeFromArray(this.messages, message);\n }\n\n async sync() {\n const messages = await Promise.all(\n this.messages.map(async (msg) => {\n const cache = this.tokensByMessage.get(msg);\n if (cache?.dirty !== false) {\n const tokensCount = await this.handlers.tokenize([msg]);\n this.tokensByMessage.set(msg, { tokensCount, dirty: false });\n }\n return msg;\n }),\n );\n\n this.messages.length = 0;\n await this.addMany(messages);\n }\n\n reset() {\n for (const msg of this.messages) {\n this.tokensByMessage.delete(msg);\n }\n this.messages.length = 0;\n }\n\n stats() {\n return {\n tokensUsed: this.tokensUsed,\n maxTokens: this.maxTokens,\n messagesCount: this.messages.length,\n isDirty: this.isDirty,\n };\n }\n\n createSnapshot() {\n return {\n threshold: this.threshold,\n syncThreshold: this.syncThreshold,\n messages: shallowCopy(this.messages),\n handlers: shallowCopy(this.handlers),\n maxTokens: this.maxTokens,\n tokensByMessage: this.messages\n .map((message) => [message, this.tokensByMessage.get(message)])\n .filter(([_, value]) => value !== undefined) as [Message, number][],\n };\n }\n\n loadSnapshot({ tokensByMessage, ...state }: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, state, {\n tokensByMessage: new WeakMap(tokensByMessage),\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/memory/tokenMemory.ts"],"names":["simpleEstimate","msg","Math","ceil","text","length","simpleTokenize","msgs","sum","map","TokenMemory","BaseMemory","messages","threshold","syncThreshold","maxTokens","tokensByMessage","WeakMap","handlers","config","capacityThreshold","estimate","role","tokenize","removalSelector","R","clamp","min","max","TypeError","register","tokensUsed","get","tokensCount","isDirty","some","dirty","add","message","index","meta","has","MemoryFatalError","messageToDelete","exists","delete","set","ensureRange","splice","sync","removeFromArray","Promise","all","cache","addMany","reset","stats","messagesCount","createSnapshot","shallowCopy","filter","_","value","undefined","loadSnapshot","state","Object","assign"],"mappings":"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","file":"tokenMemory.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { BaseMemory, MemoryFatalError } from \"@/memory/base.js\";\nimport * as R from \"remeda\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { removeFromArray } from \"@/internals/helpers/array.js\";\nimport { map, sum } from \"remeda\";\nimport { ensureRange } from \"@/internals/helpers/number.js\";\nimport { Message } from \"@/backend/message.js\";\n\nexport interface Handlers {\n estimate: (messages: Message) => number;\n tokenize: (messages: Message[]) => Promise<number>;\n removalSelector: (messages: Message[]) => Message;\n}\n\nconst simpleEstimate: Handlers[\"estimate\"] = (msg: Message) => Math.ceil(msg.text.length / 4);\nconst simpleTokenize: Handlers[\"tokenize\"] = async (msgs: Message[]) =>\n sum(map(msgs, simpleEstimate)); // TODO\n\nexport interface TokenMemoryInput {\n maxTokens?: number;\n syncThreshold?: number;\n capacityThreshold?: number;\n handlers?: Partial<Handlers>;\n}\n\ninterface TokenByMessage {\n tokensCount: number;\n dirty: boolean;\n}\n\nexport class TokenMemory extends BaseMemory {\n public readonly messages: Message[] = [];\n\n protected threshold;\n protected syncThreshold;\n protected maxTokens: number | null = null;\n protected tokensByMessage = new WeakMap<Message, TokenByMessage>();\n public readonly handlers: Handlers;\n\n constructor(config: TokenMemoryInput = {}) {\n super();\n this.maxTokens = config.maxTokens ?? null;\n this.threshold = config.capacityThreshold ?? 0.75;\n this.syncThreshold = config.syncThreshold ?? 0.25;\n this.handlers = {\n ...config?.handlers,\n estimate:\n config?.handlers?.estimate || ((msg) => Math.ceil((msg.role.length + msg.text.length) / 4)),\n tokenize: config?.handlers?.tokenize || simpleTokenize,\n removalSelector: config.handlers?.removalSelector || ((messages) => messages[0]),\n };\n if (!R.clamp({ min: 0, max: 1 })(this.threshold)) {\n throw new TypeError('\"capacityThreshold\" must be a number in range (0, 1>');\n }\n }\n\n static {\n this.register();\n }\n\n get tokensUsed(): number {\n return sum(this.messages.map((msg) => this.tokensByMessage.get(msg)!.tokensCount!));\n }\n\n get isDirty(): boolean {\n return this.messages.some((msg) => this.tokensByMessage.get(msg)?.dirty !== false);\n }\n\n async add(message: Message, index?: number) {\n if (this.maxTokens === null) {\n // TODO: improve\n this.maxTokens = 128_000;\n }\n\n const meta = this.tokensByMessage.has(message)\n ? this.tokensByMessage.get(message)!\n : { tokensCount: this.handlers.estimate(message), dirty: true };\n\n if (meta.tokensCount > this.maxTokens) {\n throw new MemoryFatalError(\n `Retrieved message (${meta.tokensCount} tokens) cannot fit inside current memory (${this.maxTokens} tokens)`,\n );\n }\n\n while (this.tokensUsed > this.maxTokens - meta.tokensCount) {\n const messageToDelete = this.handlers.removalSelector(this.messages);\n const exists = await this.delete(messageToDelete);\n\n if (!messageToDelete || !exists) {\n throw new MemoryFatalError('The \"removalSelector\" handler must return a valid message!');\n }\n }\n\n this.tokensByMessage.set(message, meta);\n\n index = ensureRange(index ?? this.messages.length, { min: 0, max: this.messages.length });\n this.messages.splice(index, 0, message);\n\n if (this.isDirty && this.tokensUsed / this.maxTokens >= this.syncThreshold) {\n await this.sync();\n }\n }\n\n async delete(message: Message) {\n return removeFromArray(this.messages, message);\n }\n\n async sync() {\n const messages = await Promise.all(\n this.messages.map(async (msg) => {\n const cache = this.tokensByMessage.get(msg);\n if (cache?.dirty !== false) {\n const tokensCount = await this.handlers.tokenize([msg]);\n this.tokensByMessage.set(msg, { tokensCount, dirty: false });\n }\n return msg;\n }),\n );\n\n this.messages.length = 0;\n await this.addMany(messages);\n }\n\n reset() {\n for (const msg of this.messages) {\n this.tokensByMessage.delete(msg);\n }\n this.messages.length = 0;\n }\n\n stats() {\n return {\n tokensUsed: this.tokensUsed,\n maxTokens: this.maxTokens,\n messagesCount: this.messages.length,\n isDirty: this.isDirty,\n };\n }\n\n createSnapshot() {\n return {\n threshold: this.threshold,\n syncThreshold: this.syncThreshold,\n messages: shallowCopy(this.messages),\n handlers: shallowCopy(this.handlers),\n maxTokens: this.maxTokens,\n tokensByMessage: this.messages\n .map((message) => [message, this.tokensByMessage.get(message)])\n .filter(([_, value]) => value !== undefined) as [Message, number][],\n };\n }\n\n loadSnapshot({ tokensByMessage, ...state }: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, state, {\n tokensByMessage: new WeakMap(tokensByMessage),\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/memory/tokenMemory.ts"],"names":["simpleEstimate","msg","Math","ceil","text","length","simpleTokenize","msgs","sum","map","TokenMemory","BaseMemory","messages","threshold","syncThreshold","maxTokens","tokensByMessage","WeakMap","handlers","config","capacityThreshold","estimate","role","tokenize","removalSelector","R","clamp","min","max","TypeError","register","tokensUsed","get","tokensCount","isDirty","some","dirty","add","message","index","meta","has","MemoryFatalError","messageToDelete","exists","delete","set","ensureRange","splice","sync","removeFromArray","Promise","all","cache","addMany","reset","stats","messagesCount","createSnapshot","shallowCopy","filter","_","value","undefined","loadSnapshot","state","Object","assign"],"mappings":"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","file":"tokenMemory.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { BaseMemory, MemoryFatalError } from \"@/memory/base.js\";\nimport * as R from \"remeda\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { removeFromArray } from \"@/internals/helpers/array.js\";\nimport { map, sum } from \"remeda\";\nimport { ensureRange } from \"@/internals/helpers/number.js\";\nimport { Message } from \"@/backend/message.js\";\n\nexport interface Handlers {\n estimate: (messages: Message) => number;\n tokenize: (messages: Message[]) => Promise<number>;\n removalSelector: (messages: Message[]) => Message;\n}\n\nconst simpleEstimate: Handlers[\"estimate\"] = (msg: Message) => Math.ceil(msg.text.length / 4);\nconst simpleTokenize: Handlers[\"tokenize\"] = async (msgs: Message[]) =>\n sum(map(msgs, simpleEstimate)); // TODO\n\nexport interface TokenMemoryInput {\n maxTokens?: number;\n syncThreshold?: number;\n capacityThreshold?: number;\n handlers?: Partial<Handlers>;\n}\n\ninterface TokenByMessage {\n tokensCount: number;\n dirty: boolean;\n}\n\nexport class TokenMemory extends BaseMemory {\n public readonly messages: Message[] = [];\n\n protected threshold;\n protected syncThreshold;\n protected maxTokens: number | null = null;\n protected tokensByMessage = new WeakMap<Message, TokenByMessage>();\n public readonly handlers: Handlers;\n\n constructor(config: TokenMemoryInput = {}) {\n super();\n this.maxTokens = config.maxTokens ?? null;\n this.threshold = config.capacityThreshold ?? 0.75;\n this.syncThreshold = config.syncThreshold ?? 0.25;\n this.handlers = {\n ...config?.handlers,\n estimate:\n config?.handlers?.estimate || ((msg) => Math.ceil((msg.role.length + msg.text.length) / 4)),\n tokenize: config?.handlers?.tokenize || simpleTokenize,\n removalSelector: config.handlers?.removalSelector || ((messages) => messages[0]),\n };\n if (!R.clamp({ min: 0, max: 1 })(this.threshold)) {\n throw new TypeError('\"capacityThreshold\" must be a number in range (0, 1>');\n }\n }\n\n static {\n this.register();\n }\n\n get tokensUsed(): number {\n return sum(this.messages.map((msg) => this.tokensByMessage.get(msg)!.tokensCount!));\n }\n\n get isDirty(): boolean {\n return this.messages.some((msg) => this.tokensByMessage.get(msg)?.dirty !== false);\n }\n\n async add(message: Message, index?: number) {\n if (this.maxTokens === null) {\n // TODO: improve\n this.maxTokens = 128_000;\n }\n\n const meta = this.tokensByMessage.has(message)\n ? this.tokensByMessage.get(message)!\n : { tokensCount: this.handlers.estimate(message), dirty: true };\n\n if (meta.tokensCount > this.maxTokens) {\n throw new MemoryFatalError(\n `Retrieved message (${meta.tokensCount} tokens) cannot fit inside current memory (${this.maxTokens} tokens)`,\n );\n }\n\n while (this.tokensUsed > this.maxTokens - meta.tokensCount) {\n const messageToDelete = this.handlers.removalSelector(this.messages);\n const exists = await this.delete(messageToDelete);\n\n if (!messageToDelete || !exists) {\n throw new MemoryFatalError('The \"removalSelector\" handler must return a valid message!');\n }\n }\n\n this.tokensByMessage.set(message, meta);\n\n index = ensureRange(index ?? this.messages.length, { min: 0, max: this.messages.length });\n this.messages.splice(index, 0, message);\n\n if (this.isDirty && this.tokensUsed / this.maxTokens >= this.syncThreshold) {\n await this.sync();\n }\n }\n\n async delete(message: Message) {\n return removeFromArray(this.messages, message);\n }\n\n async sync() {\n const messages = await Promise.all(\n this.messages.map(async (msg) => {\n const cache = this.tokensByMessage.get(msg);\n if (cache?.dirty !== false) {\n const tokensCount = await this.handlers.tokenize([msg]);\n this.tokensByMessage.set(msg, { tokensCount, dirty: false });\n }\n return msg;\n }),\n );\n\n this.messages.length = 0;\n await this.addMany(messages);\n }\n\n reset() {\n for (const msg of this.messages) {\n this.tokensByMessage.delete(msg);\n }\n this.messages.length = 0;\n }\n\n stats() {\n return {\n tokensUsed: this.tokensUsed,\n maxTokens: this.maxTokens,\n messagesCount: this.messages.length,\n isDirty: this.isDirty,\n };\n }\n\n createSnapshot() {\n return {\n threshold: this.threshold,\n syncThreshold: this.syncThreshold,\n messages: shallowCopy(this.messages),\n handlers: shallowCopy(this.handlers),\n maxTokens: this.maxTokens,\n tokensByMessage: this.messages\n .map((message) => [message, this.tokensByMessage.get(message)])\n .filter(([_, value]) => value !== undefined) as [Message, number][],\n };\n }\n\n loadSnapshot({ tokensByMessage, ...state }: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, state, {\n tokensByMessage: new WeakMap(tokensByMessage),\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/memory/unconstrainedMemory.ts"],"names":["UnconstrainedMemory","BaseMemory","messages","register","add","message","index","ensureRange","length","min","max","splice","delete","removeFromArray","reset","loadSnapshot","snapshot","Object","assign","createSnapshot","shallowCopy"],"mappings":";;;;;;;;;AAWO,MAAMA,4BAA4BC,mBAAAA,CAAAA;EAXzC;;;AAYSC,EAAAA,QAAAA,GAAsB,EAAA;EAE7B;AACE,IAAA,IAAA,CAAKC,QAAAA,EAAQ;AACf;EAEA,MAAMC,GAAAA,CAAIC,SAAkBC,KAAAA,EAAgB;AAC1CA,IAAAA,KAAAA,GAAQC,sBAAAA,CAAYD,KAAAA,IAAS,IAAA,CAAKJ,QAAAA,CAASM,MAAAA,EAAQ;MAAEC,GAAAA,EAAK,CAAA;AAAGC,MAAAA,GAAAA,EAAK,KAAKR,QAAAA,CAASM;KAAO,CAAA;AACvF,IAAA,IAAA,CAAKN,QAAAA,CAASS,MAAAA,CAAOL,KAAAA,EAAO,CAAA,EAAGD,OAAAA,CAAAA;AACjC;AAEA,EAAA,MAAMO,OAAOP,OAAAA,EAAkB;AAC7B,IAAA,OAAOQ,yBAAAA,CAAgB,IAAA,CAAKX,QAAAA,EAAUG,OAAAA,CAAAA;AACxC;EAEAS,KAAAA,GAAQ;AACN,IAAA,IAAA,CAAKZ,SAASM,MAAAA,GAAS,CAAA;AACzB;AAEAO,EAAAA,YAAAA,CAAaC,QAAAA,EAAkD;AAC7DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACtB;EAEAG,cAAAA,GAAiB;AACf,IAAA,OAAO;MACLjB,QAAAA,EAAUkB,qBAAAA,CAAY,KAAKlB,QAAQ;AACrC,KAAA;AACF;AACF","file":"unconstrainedMemory.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { BaseMemory } from \"@/memory/base.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { removeFromArray } from \"@/internals/helpers/array.js\";\nimport { ensureRange } from \"@/internals/helpers/number.js\";\nimport { Message } from \"@/backend/message.js\";\n\nexport class UnconstrainedMemory extends BaseMemory {\n public messages: Message[] = [];\n\n static {\n this.register();\n }\n\n async add(message: Message, index?: number) {\n index = ensureRange(index ?? this.messages.length, { min: 0, max: this.messages.length });\n this.messages.splice(index, 0, message);\n }\n\n async delete(message: Message) {\n return removeFromArray(this.messages, message);\n }\n\n reset() {\n this.messages.length = 0;\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n\n createSnapshot() {\n return {\n messages: shallowCopy(this.messages),\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/memory/unconstrainedMemory.ts"],"names":["UnconstrainedMemory","BaseMemory","messages","register","add","message","index","ensureRange","length","min","max","splice","delete","removeFromArray","reset","loadSnapshot","snapshot","Object","assign","createSnapshot","shallowCopy"],"mappings":";;;;;;;;;AAWO,MAAMA,4BAA4BC,mBAAAA,CAAAA;EAXzC;;;AAYSC,EAAAA,QAAAA,GAAsB,EAAA;EAE7B;AACE,IAAA,IAAA,CAAKC,QAAAA,EAAQ;AACf;EAEA,MAAMC,GAAAA,CAAIC,SAAkBC,KAAAA,EAAgB;AAC1CA,IAAAA,KAAAA,GAAQC,sBAAAA,CAAYD,KAAAA,IAAS,IAAA,CAAKJ,QAAAA,CAASM,MAAAA,EAAQ;MAAEC,GAAAA,EAAK,CAAA;AAAGC,MAAAA,GAAAA,EAAK,KAAKR,QAAAA,CAASM;KAAO,CAAA;AACvF,IAAA,IAAA,CAAKN,QAAAA,CAASS,MAAAA,CAAOL,KAAAA,EAAO,CAAA,EAAGD,OAAAA,CAAAA;AACjC,EAAA;AAEA,EAAA,MAAMO,OAAOP,OAAAA,EAAkB;AAC7B,IAAA,OAAOQ,yBAAAA,CAAgB,IAAA,CAAKX,QAAAA,EAAUG,OAAAA,CAAAA;AACxC,EAAA;EAEAS,KAAAA,GAAQ;AACN,IAAA,IAAA,CAAKZ,SAASM,MAAAA,GAAS,CAAA;AACzB,EAAA;AAEAO,EAAAA,YAAAA,CAAaC,QAAAA,EAAkD;AAC7DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACtB,EAAA;EAEAG,cAAAA,GAAiB;AACf,IAAA,OAAO;MACLjB,QAAAA,EAAUkB,qBAAAA,CAAY,KAAKlB,QAAQ;AACrC,KAAA;AACF,EAAA;AACF","file":"unconstrainedMemory.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { BaseMemory } from \"@/memory/base.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { removeFromArray } from \"@/internals/helpers/array.js\";\nimport { ensureRange } from \"@/internals/helpers/number.js\";\nimport { Message } from \"@/backend/message.js\";\n\nexport class UnconstrainedMemory extends BaseMemory {\n public messages: Message[] = [];\n\n static {\n this.register();\n }\n\n async add(message: Message, index?: number) {\n index = ensureRange(index ?? this.messages.length, { min: 0, max: this.messages.length });\n this.messages.splice(index, 0, message);\n }\n\n async delete(message: Message) {\n return removeFromArray(this.messages, message);\n }\n\n reset() {\n this.messages.length = 0;\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n\n createSnapshot() {\n return {\n messages: shallowCopy(this.messages),\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/memory/unconstrainedMemory.ts"],"names":["UnconstrainedMemory","BaseMemory","messages","register","add","message","index","ensureRange","length","min","max","splice","delete","removeFromArray","reset","loadSnapshot","snapshot","Object","assign","createSnapshot","shallowCopy"],"mappings":";;;;;;;AAWO,MAAMA,4BAA4BC,UAAAA,CAAAA;EAXzC;;;AAYSC,EAAAA,QAAAA,GAAsB,EAAA;EAE7B;AACE,IAAA,IAAA,CAAKC,QAAAA,EAAQ;AACf;EAEA,MAAMC,GAAAA,CAAIC,SAAkBC,KAAAA,EAAgB;AAC1CA,IAAAA,KAAAA,GAAQC,WAAAA,CAAYD,KAAAA,IAAS,IAAA,CAAKJ,QAAAA,CAASM,MAAAA,EAAQ;MAAEC,GAAAA,EAAK,CAAA;AAAGC,MAAAA,GAAAA,EAAK,KAAKR,QAAAA,CAASM;KAAO,CAAA;AACvF,IAAA,IAAA,CAAKN,QAAAA,CAASS,MAAAA,CAAOL,KAAAA,EAAO,CAAA,EAAGD,OAAAA,CAAAA;AACjC;AAEA,EAAA,MAAMO,OAAOP,OAAAA,EAAkB;AAC7B,IAAA,OAAOQ,eAAAA,CAAgB,IAAA,CAAKX,QAAAA,EAAUG,OAAAA,CAAAA;AACxC;EAEAS,KAAAA,GAAQ;AACN,IAAA,IAAA,CAAKZ,SAASM,MAAAA,GAAS,CAAA;AACzB;AAEAO,EAAAA,YAAAA,CAAaC,QAAAA,EAAkD;AAC7DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACtB;EAEAG,cAAAA,GAAiB;AACf,IAAA,OAAO;MACLjB,QAAAA,EAAUkB,WAAAA,CAAY,KAAKlB,QAAQ;AACrC,KAAA;AACF;AACF","file":"unconstrainedMemory.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { BaseMemory } from \"@/memory/base.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { removeFromArray } from \"@/internals/helpers/array.js\";\nimport { ensureRange } from \"@/internals/helpers/number.js\";\nimport { Message } from \"@/backend/message.js\";\n\nexport class UnconstrainedMemory extends BaseMemory {\n public messages: Message[] = [];\n\n static {\n this.register();\n }\n\n async add(message: Message, index?: number) {\n index = ensureRange(index ?? this.messages.length, { min: 0, max: this.messages.length });\n this.messages.splice(index, 0, message);\n }\n\n async delete(message: Message) {\n return removeFromArray(this.messages, message);\n }\n\n reset() {\n this.messages.length = 0;\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n\n createSnapshot() {\n return {\n messages: shallowCopy(this.messages),\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/memory/unconstrainedMemory.ts"],"names":["UnconstrainedMemory","BaseMemory","messages","register","add","message","index","ensureRange","length","min","max","splice","delete","removeFromArray","reset","loadSnapshot","snapshot","Object","assign","createSnapshot","shallowCopy"],"mappings":";;;;;;;AAWO,MAAMA,4BAA4BC,UAAAA,CAAAA;EAXzC;;;AAYSC,EAAAA,QAAAA,GAAsB,EAAA;EAE7B;AACE,IAAA,IAAA,CAAKC,QAAAA,EAAQ;AACf;EAEA,MAAMC,GAAAA,CAAIC,SAAkBC,KAAAA,EAAgB;AAC1CA,IAAAA,KAAAA,GAAQC,WAAAA,CAAYD,KAAAA,IAAS,IAAA,CAAKJ,QAAAA,CAASM,MAAAA,EAAQ;MAAEC,GAAAA,EAAK,CAAA;AAAGC,MAAAA,GAAAA,EAAK,KAAKR,QAAAA,CAASM;KAAO,CAAA;AACvF,IAAA,IAAA,CAAKN,QAAAA,CAASS,MAAAA,CAAOL,KAAAA,EAAO,CAAA,EAAGD,OAAAA,CAAAA;AACjC,EAAA;AAEA,EAAA,MAAMO,OAAOP,OAAAA,EAAkB;AAC7B,IAAA,OAAOQ,eAAAA,CAAgB,IAAA,CAAKX,QAAAA,EAAUG,OAAAA,CAAAA;AACxC,EAAA;EAEAS,KAAAA,GAAQ;AACN,IAAA,IAAA,CAAKZ,SAASM,MAAAA,GAAS,CAAA;AACzB,EAAA;AAEAO,EAAAA,YAAAA,CAAaC,QAAAA,EAAkD;AAC7DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACtB,EAAA;EAEAG,cAAAA,GAAiB;AACf,IAAA,OAAO;MACLjB,QAAAA,EAAUkB,WAAAA,CAAY,KAAKlB,QAAQ;AACrC,KAAA;AACF,EAAA;AACF","file":"unconstrainedMemory.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { BaseMemory } from \"@/memory/base.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { removeFromArray } from \"@/internals/helpers/array.js\";\nimport { ensureRange } from \"@/internals/helpers/number.js\";\nimport { Message } from \"@/backend/message.js\";\n\nexport class UnconstrainedMemory extends BaseMemory {\n public messages: Message[] = [];\n\n static {\n this.register();\n }\n\n async add(message: Message, index?: number) {\n index = ensureRange(index ?? this.messages.length, { min: 0, max: this.messages.length });\n this.messages.splice(index, 0, message);\n }\n\n async delete(message: Message) {\n return removeFromArray(this.messages, message);\n }\n\n reset() {\n this.messages.length = 0;\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n\n createSnapshot() {\n return {\n messages: shallowCopy(this.messages),\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/middleware/streamToolCall.ts"],"names":["StreamToolCallMiddleware","Middleware","target","key","matchNested","forceStreaming","cleanups","output","ChatModelOutput","buffer","delta","emitter","options","Emitter","root","child","namespace","reset","add","chunk","handleNewToken","value","callbacks","abort","isEmpty","length","bind","ctx","push","instance","match","meta","creator","ChatModel","name","handleStart","createEmitterOptions","handleSuccess","unbind","fn","shift","isBlocking","process","toolName","args","parsedArgs","isString","parseBrokenJson","pair","outputStructured","parse","catch","hasProp","JSON","stringify","slice","emit","data","_meta","input","stream","streamPartialToolCalls","messages","merge","toolCalls","getToolCalls","toolCall","textContent","getTextContent","isPlainObject","parameters"],"mappings":"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","file":"streamToolCall.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { ChatModel, ChatModelEvents } from \"@/backend/chat.js\";\nimport { ChatModelOutput } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { parseBrokenJson } from \"@/internals/helpers/schema.js\";\nimport { isPlainObject, isString } from \"remeda\";\nimport { hasProp } from \"@/internals/helpers/object.js\";\nimport { EmitterOptions, InferCallbackValue } from \"@/emitter/types.js\";\n\n/**\n * Event emitted when the middleware detects an update to the target tool's arguments\n */\nexport interface StreamToolCallMiddlewareUpdateEvent<T = any> {\n /** The validated and structured tool input */\n outputStructured: T | null;\n /** The current value of the target field */\n output: string;\n /** The incremental change since the last update */\n delta: string;\n}\n\n/**\n * Callbacks for StreamToolCallMiddleware events\n */\nexport interface StreamToolCallMiddlewareCallbacks<T = any> {\n update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;\n}\n\n/**\n * Options for configuring StreamToolCallMiddleware\n */\nexport interface StreamToolCallMiddlewareOptions {\n /** The tool to monitor for streaming updates */\n target: Tool<any>;\n /** The field name in the tool's input schema to stream */\n key: string;\n /** Whether to apply middleware to nested run contexts */\n matchNested?: boolean;\n /** Whether to force streaming on the ChatModel */\n forceStreaming?: boolean;\n}\n\n/**\n * Middleware for handling streaming tool calls in a ChatModel.\n *\n * This middleware observes and listens to ChatModel stream updates and parses\n * the tool calls on demand so that they can be consumed as soon as possible.\n *\n * @example\n * ```typescript\n * const middleware = new StreamToolCallMiddleware({\n * target: thinkTool,\n * key: \"thoughts\",\n * matchNested: false,\n * forceStreaming: true,\n * });\n *\n * middleware.emitter.on(\"update\", (event) => {\n * console.log(\"Delta:\", event.delta);\n * console.log(\"Structured:\", event.outputStructured);\n * });\n *\n * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);\n * ```\n */\nexport class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {\n private readonly target: Tool<any>;\n private readonly key: string;\n private readonly matchNested: boolean;\n private readonly forceStreaming: boolean;\n private readonly cleanups: (() => void)[] = [];\n\n private output = new ChatModelOutput([]);\n private buffer = \"\";\n private delta = \"\";\n\n public readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;\n\n constructor(options: StreamToolCallMiddlewareOptions) {\n super();\n\n this.target = options.target;\n this.key = options.key;\n this.matchNested = options.matchNested ?? false;\n this.forceStreaming = options.forceStreaming ?? false;\n\n this.emitter = Emitter.root.child<StreamToolCallMiddlewareCallbacks<T>>({\n namespace: [\"middleware\", \"streamToolCall\"],\n });\n }\n\n reset() {\n this.output = new ChatModelOutput([]);\n this.buffer = \"\";\n this.delta = \"\";\n }\n\n async add(chunk: ChatModelOutput) {\n await this.handleNewToken(\n {\n value: chunk,\n callbacks: {\n abort: () => {},\n },\n },\n {} as EventMeta,\n );\n }\n\n isEmpty() {\n return this.buffer.length === 0;\n }\n\n bind(ctx: RunContext<RunInstance>): void {\n this.reset();\n\n // Listen to ChatModel start event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"start\",\n this.handleStart.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel newToken event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"newToken\",\n this.handleNewToken.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel success event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"success\",\n this.handleSuccess.bind(this),\n this.createEmitterOptions(),\n ),\n );\n }\n\n unbind(): void {\n // Clean up previous bindings\n while (this.cleanups.length > 0) {\n const fn = this.cleanups.shift()!;\n fn();\n }\n }\n\n protected createEmitterOptions(): EmitterOptions {\n return {\n matchNested: this.matchNested,\n isBlocking: true,\n };\n }\n\n private async process(toolName: string, args: any): Promise<void> {\n if (toolName !== this.target.name) {\n return;\n }\n\n const parsedArgs = isString(args) ? parseBrokenJson(args, { pair: [\"{\", \"}\"] }) : args;\n const outputStructured = (await this.target.parse(parsedArgs).catch(() => null)) as T;\n if (!outputStructured) {\n return;\n }\n\n let output = \"\";\n if (hasProp(outputStructured, this.key as keyof T)) {\n output = (outputStructured as any)[this.key] || \"\";\n if (!isString(output)) {\n output = JSON.stringify(output);\n }\n this.delta = output.slice(this.buffer.length);\n this.buffer = output;\n\n if (!this.delta) {\n return;\n }\n }\n\n await this.emitter.emit(\"update\", {\n outputStructured,\n delta: this.delta,\n output,\n });\n }\n\n private async handleStart(\n data: InferCallbackValue<ChatModelEvents[\"start\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n if (this.forceStreaming) {\n data.input.stream = true;\n data.input.streamPartialToolCalls = true;\n }\n }\n\n private async handleSuccess(\n data: InferCallbackValue<ChatModelEvents[\"success\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n // If we haven't received any tokens yet, process the final output\n if (this.output.messages.length === 0) {\n await this.handleNewToken({ value: data.value, callbacks: { abort: () => {} } }, _meta);\n }\n }\n\n private async handleNewToken(\n data: InferCallbackValue<ChatModelEvents[\"newToken\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n await this.output.merge(data.value);\n\n const toolCalls = this.output.getToolCalls();\n if (toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n await this.process(toolCall.toolName, toolCall.input);\n }\n return;\n }\n\n // Try to parse text content as a tool call\n const textContent = this.output.getTextContent();\n const toolCall = parseBrokenJson(textContent, { pair: [\"{\", \"}\"] });\n\n if (!toolCall || !isPlainObject(toolCall)) {\n return;\n }\n\n await this.process(toolCall.name as string, toolCall.parameters as any);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/middleware/streamToolCall.ts"],"names":["StreamToolCallMiddleware","Middleware","target","key","matchNested","forceStreaming","cleanups","output","ChatModelOutput","buffer","delta","emitter","options","Emitter","root","child","namespace","reset","add","chunk","handleNewToken","value","callbacks","abort","isEmpty","length","bind","ctx","push","instance","match","meta","creator","ChatModel","name","handleStart","createEmitterOptions","handleSuccess","unbind","fn","shift","isBlocking","process","toolName","args","parsedArgs","isString","parseBrokenJson","pair","outputStructured","parse","catch","hasProp","JSON","stringify","slice","emit","data","_meta","input","stream","streamPartialToolCalls","messages","merge","toolCalls","getToolCalls","toolCall","textContent","getTextContent","isPlainObject","parameters"],"mappings":";;;;;;;;;;;AAuEO,MAAMA,iCAA0CC,sBAAAA,CAAAA;EAvEvD;;;AAwEmBC,EAAAA,MAAAA;AACAC,EAAAA,GAAAA;AACAC,EAAAA,WAAAA;AACAC,EAAAA,cAAAA;AACAC,EAAAA,QAAAA,GAA2B,EAAA;EAEpCC,MAAAA,GAAS,IAAIC,wBAAAA,CAAgB,EAAE,CAAA;EAC/BC,MAAAA,GAAS,EAAA;EACTC,KAAAA,GAAQ,EAAA;AAEAC,EAAAA,OAAAA;AAEhB,EAAA,WAAA,CAAYC,OAAAA,EAA0C;AACpD,IAAA,KAAA,EAAK;AAEL,IAAA,IAAA,CAAKV,SAASU,OAAAA,CAAQV,MAAAA;AACtB,IAAA,IAAA,CAAKC,MAAMS,OAAAA,CAAQT,GAAAA;AACnB,IAAA,IAAA,CAAKC,WAAAA,GAAcQ,QAAQR,WAAAA,IAAe,KAAA;AAC1C,IAAA,IAAA,CAAKC,cAAAA,GAAiBO,QAAQP,cAAAA,IAAkB,KAAA;AAEhD,IAAA,IAAA,CAAKM,OAAAA,GAAUE,mBAAAA,CAAQC,IAAAA,CAAKC,KAAAA,CAA4C;MACtEC,SAAAA,EAAW;AAAC,QAAA,YAAA;AAAc,QAAA;;KAC5B,CAAA;AACF,EAAA;EAEAC,KAAAA,GAAQ;AACN,IAAA,IAAA,CAAKV,MAAAA,GAAS,IAAIC,wBAAAA,CAAgB,EAAE,CAAA;AACpC,IAAA,IAAA,CAAKC,MAAAA,GAAS,EAAA;AACd,IAAA,IAAA,CAAKC,KAAAA,GAAQ,EAAA;AACf,EAAA;AAEA,EAAA,MAAMQ,IAAIC,KAAAA,EAAwB;AAChC,IAAA,MAAM,KAAKC,cAAAA,CACT;MACEC,KAAAA,EAAOF,KAAAA;MACPG,SAAAA,EAAW;AACTC,QAAAA,KAAAA,kBAAO,MAAA,CAAA,MAAA;QAAO,CAAA,EAAP,OAAA;AACT;AACF,KAAA,EACA,EAAC,CAAA;AAEL,EAAA;EAEAC,OAAAA,GAAU;AACR,IAAA,OAAO,IAAA,CAAKf,OAAOgB,MAAAA,KAAW,CAAA;AAChC,EAAA;AAEAC,EAAAA,IAAAA,CAAKC,GAAAA,EAAoC;AACvC,IAAA,IAAA,CAAKV,KAAAA,EAAK;AAGV,IAAA,IAAA,CAAKX,QAAAA,CAASsB,KACZD,GAAAA,CAAIE,QAAAA,CAASlB,QAAQmB,KAAAA,CACnB,CAACC,IAAAA,KAASA,IAAAA,CAAKC,OAAAA,YAAmBC,kBAAAA,IAAaF,KAAKG,IAAAA,KAAS,OAAA,EAC7D,KAAKC,WAAAA,CAAYT,IAAAA,CAAK,IAAI,CAAA,EAC1B,IAAA,CAAKU,oBAAAA,EAAoB,CAAA,CAAA;AAK7B,IAAA,IAAA,CAAK9B,QAAAA,CAASsB,KACZD,GAAAA,CAAIE,QAAAA,CAASlB,QAAQmB,KAAAA,CACnB,CAACC,IAAAA,KAASA,IAAAA,CAAKC,OAAAA,YAAmBC,kBAAAA,IAAaF,KAAKG,IAAAA,KAAS,UAAA,EAC7D,KAAKd,cAAAA,CAAeM,IAAAA,CAAK,IAAI,CAAA,EAC7B,IAAA,CAAKU,oBAAAA,EAAoB,CAAA,CAAA;AAK7B,IAAA,IAAA,CAAK9B,QAAAA,CAASsB,KACZD,GAAAA,CAAIE,QAAAA,CAASlB,QAAQmB,KAAAA,CACnB,CAACC,IAAAA,KAASA,IAAAA,CAAKC,OAAAA,YAAmBC,kBAAAA,IAAaF,KAAKG,IAAAA,KAAS,SAAA,EAC7D,KAAKG,aAAAA,CAAcX,IAAAA,CAAK,IAAI,CAAA,EAC5B,IAAA,CAAKU,oBAAAA,EAAoB,CAAA,CAAA;AAG/B,EAAA;EAEAE,MAAAA,GAAe;AAEb,IAAA,OAAO,IAAA,CAAKhC,QAAAA,CAASmB,MAAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,MAAMc,EAAAA,GAAK,IAAA,CAAKjC,QAAAA,CAASkC,KAAAA,EAAK;AAC9BD,MAAAA,EAAAA,EAAAA;AACF,IAAA;AACF,EAAA;EAEUH,oBAAAA,GAAuC;AAC/C,IAAA,OAAO;AACLhC,MAAAA,WAAAA,EAAa,IAAA,CAAKA,WAAAA;MAClBqC,UAAAA,EAAY;AACd,KAAA;AACF,EAAA;EAEA,MAAcC,OAAAA,CAAQC,UAAkBC,IAAAA,EAA0B;AAChE,IAAA,IAAID,QAAAA,KAAa,IAAA,CAAKzC,MAAAA,CAAOgC,IAAAA,EAAM;AACjC,MAAA;AACF,IAAA;AAEA,IAAA,MAAMW,UAAAA,GAAaC,eAAAA,CAASF,IAAAA,CAAAA,GAAQG,2BAAgBH,IAAAA,EAAM;MAAEI,IAAAA,EAAM;AAAC,QAAA,GAAA;AAAK,QAAA;;AAAK,KAAA,CAAA,GAAKJ,IAAAA;AAClF,IAAA,MAAMK,gBAAAA,GAAoB,MAAM,IAAA,CAAK/C,MAAAA,CAAOgD,MAAML,UAAAA,CAAAA,CAAYM,KAAAA,CAAM,MAAM,IAAA,CAAA;AAC1E,IAAA,IAAI,CAACF,gBAAAA,EAAkB;AACrB,MAAA;AACF,IAAA;AAEA,IAAA,IAAI1C,MAAAA,GAAS,EAAA;AACb,IAAA,IAAI6C,kBAAAA,CAAQH,gBAAAA,EAAkB,IAAA,CAAK9C,GAAG,CAAA,EAAc;AAClDI,MAAAA,MAAAA,GAAU0C,gBAAAA,CAAyB,IAAA,CAAK9C,GAAG,CAAA,IAAK,EAAA;AAChD,MAAA,IAAI,CAAC2C,eAAAA,CAASvC,MAAAA,CAAAA,EAAS;AACrBA,QAAAA,MAAAA,GAAS8C,IAAAA,CAAKC,UAAU/C,MAAAA,CAAAA;AAC1B,MAAA;AACA,MAAA,IAAA,CAAKG,KAAAA,GAAQH,MAAAA,CAAOgD,KAAAA,CAAM,IAAA,CAAK9C,OAAOgB,MAAM,CAAA;AAC5C,MAAA,IAAA,CAAKhB,MAAAA,GAASF,MAAAA;AAEd,MAAA,IAAI,CAAC,KAAKG,KAAAA,EAAO;AACf,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,MAAM,IAAA,CAAKC,OAAAA,CAAQ6C,IAAAA,CAAK,QAAA,EAAU;AAChCP,MAAAA,gBAAAA;AACAvC,MAAAA,KAAAA,EAAO,IAAA,CAAKA,KAAAA;AACZH,MAAAA;KACF,CAAA;AACF,EAAA;EAEA,MAAc4B,WAAAA,CACZsB,MACAC,KAAAA,EACe;AACf,IAAA,IAAI,KAAKrD,cAAAA,EAAgB;AACvBoD,MAAAA,IAAAA,CAAKE,MAAMC,MAAAA,GAAS,IAAA;AACpBH,MAAAA,IAAAA,CAAKE,MAAME,sBAAAA,GAAyB,IAAA;AACtC,IAAA;AACF,EAAA;EAEA,MAAcxB,aAAAA,CACZoB,MACAC,KAAAA,EACe;AAEf,IAAA,IAAI,IAAA,CAAKnD,MAAAA,CAAOuD,QAAAA,CAASrC,MAAAA,KAAW,CAAA,EAAG;AACrC,MAAA,MAAM,KAAKL,cAAAA,CAAe;AAAEC,QAAAA,KAAAA,EAAOoC,IAAAA,CAAKpC,KAAAA;QAAOC,SAAAA,EAAW;AAAEC,UAAAA,KAAAA,kBAAO,MAAA,CAAA,MAAA;UAAO,CAAA,EAAP,OAAA;AAAS;AAAE,OAAA,EAAGmC,KAAAA,CAAAA;AACnF,IAAA;AACF,EAAA;EAEA,MAActC,cAAAA,CACZqC,MACAC,KAAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAKnD,MAAAA,CAAOwD,KAAAA,CAAMN,IAAAA,CAAKpC,KAAK,CAAA;AAElC,IAAA,MAAM2C,SAAAA,GAAY,IAAA,CAAKzD,MAAAA,CAAO0D,YAAAA,EAAY;AAC1C,IAAA,IAAID,SAAAA,CAAUvC,SAAS,CAAA,EAAG;AACxB,MAAA,KAAA,MAAWyC,aAAYF,SAAAA,EAAW;AAChC,QAAA,MAAM,IAAA,CAAKtB,OAAAA,CAAQwB,SAAAA,CAASvB,QAAAA,EAAUuB,UAASP,KAAK,CAAA;AACtD,MAAA;AACA,MAAA;AACF,IAAA;AAGA,IAAA,MAAMQ,WAAAA,GAAc,IAAA,CAAK5D,MAAAA,CAAO6D,cAAAA,EAAc;AAC9C,IAAA,MAAMF,QAAAA,GAAWnB,2BAAgBoB,WAAAA,EAAa;MAAEnB,IAAAA,EAAM;AAAC,QAAA,GAAA;AAAK,QAAA;;KAAK,CAAA;AAEjE,IAAA,IAAI,CAACkB,QAAAA,IAAY,CAACG,oBAAAA,CAAcH,QAAAA,CAAAA,EAAW;AACzC,MAAA;AACF,IAAA;AAEA,IAAA,MAAM,IAAA,CAAKxB,OAAAA,CAAQwB,QAAAA,CAAShC,IAAAA,EAAgBgC,SAASI,UAAU,CAAA;AACjE,EAAA;AACF","file":"streamToolCall.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { ChatModel, ChatModelEvents } from \"@/backend/chat.js\";\nimport { ChatModelOutput } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { parseBrokenJson } from \"@/internals/helpers/schema.js\";\nimport { isPlainObject, isString } from \"remeda\";\nimport { hasProp } from \"@/internals/helpers/object.js\";\nimport { EmitterOptions, InferCallbackValue } from \"@/emitter/types.js\";\n\n/**\n * Event emitted when the middleware detects an update to the target tool's arguments\n */\nexport interface StreamToolCallMiddlewareUpdateEvent<T = any> {\n /** The validated and structured tool input */\n outputStructured: T | null;\n /** The current value of the target field */\n output: string;\n /** The incremental change since the last update */\n delta: string;\n}\n\n/**\n * Callbacks for StreamToolCallMiddleware events\n */\nexport interface StreamToolCallMiddlewareCallbacks<T = any> {\n update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;\n}\n\n/**\n * Options for configuring StreamToolCallMiddleware\n */\nexport interface StreamToolCallMiddlewareOptions {\n /** The tool to monitor for streaming updates */\n target: Tool<any>;\n /** The field name in the tool's input schema to stream */\n key: string;\n /** Whether to apply middleware to nested run contexts */\n matchNested?: boolean;\n /** Whether to force streaming on the ChatModel */\n forceStreaming?: boolean;\n}\n\n/**\n * Middleware for handling streaming tool calls in a ChatModel.\n *\n * This middleware observes and listens to ChatModel stream updates and parses\n * the tool calls on demand so that they can be consumed as soon as possible.\n *\n * @example\n * ```typescript\n * const middleware = new StreamToolCallMiddleware({\n * target: thinkTool,\n * key: \"thoughts\",\n * matchNested: false,\n * forceStreaming: true,\n * });\n *\n * middleware.emitter.on(\"update\", (event) => {\n * console.log(\"Delta:\", event.delta);\n * console.log(\"Structured:\", event.outputStructured);\n * });\n *\n * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);\n * ```\n */\nexport class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {\n private readonly target: Tool<any>;\n private readonly key: string;\n private readonly matchNested: boolean;\n private readonly forceStreaming: boolean;\n private readonly cleanups: (() => void)[] = [];\n\n private output = new ChatModelOutput([]);\n private buffer = \"\";\n private delta = \"\";\n\n public readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;\n\n constructor(options: StreamToolCallMiddlewareOptions) {\n super();\n\n this.target = options.target;\n this.key = options.key;\n this.matchNested = options.matchNested ?? false;\n this.forceStreaming = options.forceStreaming ?? false;\n\n this.emitter = Emitter.root.child<StreamToolCallMiddlewareCallbacks<T>>({\n namespace: [\"middleware\", \"streamToolCall\"],\n });\n }\n\n reset() {\n this.output = new ChatModelOutput([]);\n this.buffer = \"\";\n this.delta = \"\";\n }\n\n async add(chunk: ChatModelOutput) {\n await this.handleNewToken(\n {\n value: chunk,\n callbacks: {\n abort: () => {},\n },\n },\n {} as EventMeta,\n );\n }\n\n isEmpty() {\n return this.buffer.length === 0;\n }\n\n bind(ctx: RunContext<RunInstance>): void {\n this.reset();\n\n // Listen to ChatModel start event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"start\",\n this.handleStart.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel newToken event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"newToken\",\n this.handleNewToken.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel success event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"success\",\n this.handleSuccess.bind(this),\n this.createEmitterOptions(),\n ),\n );\n }\n\n unbind(): void {\n // Clean up previous bindings\n while (this.cleanups.length > 0) {\n const fn = this.cleanups.shift()!;\n fn();\n }\n }\n\n protected createEmitterOptions(): EmitterOptions {\n return {\n matchNested: this.matchNested,\n isBlocking: true,\n };\n }\n\n private async process(toolName: string, args: any): Promise<void> {\n if (toolName !== this.target.name) {\n return;\n }\n\n const parsedArgs = isString(args) ? parseBrokenJson(args, { pair: [\"{\", \"}\"] }) : args;\n const outputStructured = (await this.target.parse(parsedArgs).catch(() => null)) as T;\n if (!outputStructured) {\n return;\n }\n\n let output = \"\";\n if (hasProp(outputStructured, this.key as keyof T)) {\n output = (outputStructured as any)[this.key] || \"\";\n if (!isString(output)) {\n output = JSON.stringify(output);\n }\n this.delta = output.slice(this.buffer.length);\n this.buffer = output;\n\n if (!this.delta) {\n return;\n }\n }\n\n await this.emitter.emit(\"update\", {\n outputStructured,\n delta: this.delta,\n output,\n });\n }\n\n private async handleStart(\n data: InferCallbackValue<ChatModelEvents[\"start\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n if (this.forceStreaming) {\n data.input.stream = true;\n data.input.streamPartialToolCalls = true;\n }\n }\n\n private async handleSuccess(\n data: InferCallbackValue<ChatModelEvents[\"success\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n // If we haven't received any tokens yet, process the final output\n if (this.output.messages.length === 0) {\n await this.handleNewToken({ value: data.value, callbacks: { abort: () => {} } }, _meta);\n }\n }\n\n private async handleNewToken(\n data: InferCallbackValue<ChatModelEvents[\"newToken\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n await this.output.merge(data.value);\n\n const toolCalls = this.output.getToolCalls();\n if (toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n await this.process(toolCall.toolName, toolCall.input);\n }\n return;\n }\n\n // Try to parse text content as a tool call\n const textContent = this.output.getTextContent();\n const toolCall = parseBrokenJson(textContent, { pair: [\"{\", \"}\"] });\n\n if (!toolCall || !isPlainObject(toolCall)) {\n return;\n }\n\n await this.process(toolCall.name as string, toolCall.parameters as any);\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Middleware, RunInstance, RunContext } from '../context.cjs';
2
- import { C as Callback, E as Emitter, a as EmitterOptions } from '../emitter-UkIkNrek.cjs';
3
- import { n as ChatModelOutput } from '../chat-DaqV3woF.cjs';
2
+ import { E as Emitter, C as Callback, a as EmitterOptions } from '../emitter-D4OcelZ9.cjs';
3
+ import { i as ChatModelOutput } from '../chat-C20nYj46.cjs';
4
4
  import { Tool } from '../tools/base.cjs';
5
5
  import '../internals/serializable.cjs';
6
6
  import '../internals/types.cjs';
@@ -1,6 +1,6 @@
1
1
  import { Middleware, RunInstance, RunContext } from '../context.js';
2
- import { C as Callback, E as Emitter, a as EmitterOptions } from '../emitter-CL56qab4.js';
3
- import { n as ChatModelOutput } from '../chat-DTxmaKP0.js';
2
+ import { E as Emitter, C as Callback, a as EmitterOptions } from '../emitter-kHxkUxco.js';
3
+ import { i as ChatModelOutput } from '../chat-CfTNfR60.js';
4
4
  import { Tool } from '../tools/base.js';
5
5
  import '../internals/serializable.js';
6
6
  import '../internals/types.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/middleware/streamToolCall.ts"],"names":["StreamToolCallMiddleware","Middleware","target","key","matchNested","forceStreaming","cleanups","output","ChatModelOutput","buffer","delta","emitter","options","Emitter","root","child","namespace","reset","add","chunk","handleNewToken","value","callbacks","abort","isEmpty","length","bind","ctx","push","instance","match","meta","creator","ChatModel","name","handleStart","createEmitterOptions","handleSuccess","unbind","fn","shift","isBlocking","process","toolName","args","parsedArgs","isString","parseBrokenJson","pair","outputStructured","parse","catch","hasProp","JSON","stringify","slice","emit","data","_meta","input","stream","streamPartialToolCalls","messages","merge","toolCalls","getToolCalls","toolCall","textContent","getTextContent","isPlainObject","parameters"],"mappings":"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","file":"streamToolCall.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { ChatModel, ChatModelEvents } from \"@/backend/chat.js\";\nimport { ChatModelOutput } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { parseBrokenJson } from \"@/internals/helpers/schema.js\";\nimport { isPlainObject, isString } from \"remeda\";\nimport { hasProp } from \"@/internals/helpers/object.js\";\nimport { EmitterOptions, InferCallbackValue } from \"@/emitter/types.js\";\n\n/**\n * Event emitted when the middleware detects an update to the target tool's arguments\n */\nexport interface StreamToolCallMiddlewareUpdateEvent<T = any> {\n /** The validated and structured tool input */\n outputStructured: T | null;\n /** The current value of the target field */\n output: string;\n /** The incremental change since the last update */\n delta: string;\n}\n\n/**\n * Callbacks for StreamToolCallMiddleware events\n */\nexport interface StreamToolCallMiddlewareCallbacks<T = any> {\n update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;\n}\n\n/**\n * Options for configuring StreamToolCallMiddleware\n */\nexport interface StreamToolCallMiddlewareOptions {\n /** The tool to monitor for streaming updates */\n target: Tool<any>;\n /** The field name in the tool's input schema to stream */\n key: string;\n /** Whether to apply middleware to nested run contexts */\n matchNested?: boolean;\n /** Whether to force streaming on the ChatModel */\n forceStreaming?: boolean;\n}\n\n/**\n * Middleware for handling streaming tool calls in a ChatModel.\n *\n * This middleware observes and listens to ChatModel stream updates and parses\n * the tool calls on demand so that they can be consumed as soon as possible.\n *\n * @example\n * ```typescript\n * const middleware = new StreamToolCallMiddleware({\n * target: thinkTool,\n * key: \"thoughts\",\n * matchNested: false,\n * forceStreaming: true,\n * });\n *\n * middleware.emitter.on(\"update\", (event) => {\n * console.log(\"Delta:\", event.delta);\n * console.log(\"Structured:\", event.outputStructured);\n * });\n *\n * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);\n * ```\n */\nexport class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {\n private readonly target: Tool<any>;\n private readonly key: string;\n private readonly matchNested: boolean;\n private readonly forceStreaming: boolean;\n private readonly cleanups: (() => void)[] = [];\n\n private output = new ChatModelOutput([]);\n private buffer = \"\";\n private delta = \"\";\n\n public readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;\n\n constructor(options: StreamToolCallMiddlewareOptions) {\n super();\n\n this.target = options.target;\n this.key = options.key;\n this.matchNested = options.matchNested ?? false;\n this.forceStreaming = options.forceStreaming ?? false;\n\n this.emitter = Emitter.root.child<StreamToolCallMiddlewareCallbacks<T>>({\n namespace: [\"middleware\", \"streamToolCall\"],\n });\n }\n\n reset() {\n this.output = new ChatModelOutput([]);\n this.buffer = \"\";\n this.delta = \"\";\n }\n\n async add(chunk: ChatModelOutput) {\n await this.handleNewToken(\n {\n value: chunk,\n callbacks: {\n abort: () => {},\n },\n },\n {} as EventMeta,\n );\n }\n\n isEmpty() {\n return this.buffer.length === 0;\n }\n\n bind(ctx: RunContext<RunInstance>): void {\n this.reset();\n\n // Listen to ChatModel start event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"start\",\n this.handleStart.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel newToken event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"newToken\",\n this.handleNewToken.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel success event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"success\",\n this.handleSuccess.bind(this),\n this.createEmitterOptions(),\n ),\n );\n }\n\n unbind(): void {\n // Clean up previous bindings\n while (this.cleanups.length > 0) {\n const fn = this.cleanups.shift()!;\n fn();\n }\n }\n\n protected createEmitterOptions(): EmitterOptions {\n return {\n matchNested: this.matchNested,\n isBlocking: true,\n };\n }\n\n private async process(toolName: string, args: any): Promise<void> {\n if (toolName !== this.target.name) {\n return;\n }\n\n const parsedArgs = isString(args) ? parseBrokenJson(args, { pair: [\"{\", \"}\"] }) : args;\n const outputStructured = (await this.target.parse(parsedArgs).catch(() => null)) as T;\n if (!outputStructured) {\n return;\n }\n\n let output = \"\";\n if (hasProp(outputStructured, this.key as keyof T)) {\n output = (outputStructured as any)[this.key] || \"\";\n if (!isString(output)) {\n output = JSON.stringify(output);\n }\n this.delta = output.slice(this.buffer.length);\n this.buffer = output;\n\n if (!this.delta) {\n return;\n }\n }\n\n await this.emitter.emit(\"update\", {\n outputStructured,\n delta: this.delta,\n output,\n });\n }\n\n private async handleStart(\n data: InferCallbackValue<ChatModelEvents[\"start\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n if (this.forceStreaming) {\n data.input.stream = true;\n data.input.streamPartialToolCalls = true;\n }\n }\n\n private async handleSuccess(\n data: InferCallbackValue<ChatModelEvents[\"success\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n // If we haven't received any tokens yet, process the final output\n if (this.output.messages.length === 0) {\n await this.handleNewToken({ value: data.value, callbacks: { abort: () => {} } }, _meta);\n }\n }\n\n private async handleNewToken(\n data: InferCallbackValue<ChatModelEvents[\"newToken\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n await this.output.merge(data.value);\n\n const toolCalls = this.output.getToolCalls();\n if (toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n await this.process(toolCall.toolName, toolCall.input);\n }\n return;\n }\n\n // Try to parse text content as a tool call\n const textContent = this.output.getTextContent();\n const toolCall = parseBrokenJson(textContent, { pair: [\"{\", \"}\"] });\n\n if (!toolCall || !isPlainObject(toolCall)) {\n return;\n }\n\n await this.process(toolCall.name as string, toolCall.parameters as any);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/middleware/streamToolCall.ts"],"names":["StreamToolCallMiddleware","Middleware","target","key","matchNested","forceStreaming","cleanups","output","ChatModelOutput","buffer","delta","emitter","options","Emitter","root","child","namespace","reset","add","chunk","handleNewToken","value","callbacks","abort","isEmpty","length","bind","ctx","push","instance","match","meta","creator","ChatModel","name","handleStart","createEmitterOptions","handleSuccess","unbind","fn","shift","isBlocking","process","toolName","args","parsedArgs","isString","parseBrokenJson","pair","outputStructured","parse","catch","hasProp","JSON","stringify","slice","emit","data","_meta","input","stream","streamPartialToolCalls","messages","merge","toolCalls","getToolCalls","toolCall","textContent","getTextContent","isPlainObject","parameters"],"mappings":";;;;;;;;;AAuEO,MAAMA,iCAA0CC,UAAAA,CAAAA;EAvEvD;;;AAwEmBC,EAAAA,MAAAA;AACAC,EAAAA,GAAAA;AACAC,EAAAA,WAAAA;AACAC,EAAAA,cAAAA;AACAC,EAAAA,QAAAA,GAA2B,EAAA;EAEpCC,MAAAA,GAAS,IAAIC,eAAAA,CAAgB,EAAE,CAAA;EAC/BC,MAAAA,GAAS,EAAA;EACTC,KAAAA,GAAQ,EAAA;AAEAC,EAAAA,OAAAA;AAEhB,EAAA,WAAA,CAAYC,OAAAA,EAA0C;AACpD,IAAA,KAAA,EAAK;AAEL,IAAA,IAAA,CAAKV,SAASU,OAAAA,CAAQV,MAAAA;AACtB,IAAA,IAAA,CAAKC,MAAMS,OAAAA,CAAQT,GAAAA;AACnB,IAAA,IAAA,CAAKC,WAAAA,GAAcQ,QAAQR,WAAAA,IAAe,KAAA;AAC1C,IAAA,IAAA,CAAKC,cAAAA,GAAiBO,QAAQP,cAAAA,IAAkB,KAAA;AAEhD,IAAA,IAAA,CAAKM,OAAAA,GAAUE,OAAAA,CAAQC,IAAAA,CAAKC,KAAAA,CAA4C;MACtEC,SAAAA,EAAW;AAAC,QAAA,YAAA;AAAc,QAAA;;KAC5B,CAAA;AACF,EAAA;EAEAC,KAAAA,GAAQ;AACN,IAAA,IAAA,CAAKV,MAAAA,GAAS,IAAIC,eAAAA,CAAgB,EAAE,CAAA;AACpC,IAAA,IAAA,CAAKC,MAAAA,GAAS,EAAA;AACd,IAAA,IAAA,CAAKC,KAAAA,GAAQ,EAAA;AACf,EAAA;AAEA,EAAA,MAAMQ,IAAIC,KAAAA,EAAwB;AAChC,IAAA,MAAM,KAAKC,cAAAA,CACT;MACEC,KAAAA,EAAOF,KAAAA;MACPG,SAAAA,EAAW;AACTC,QAAAA,KAAAA,kBAAO,MAAA,CAAA,MAAA;QAAO,CAAA,EAAP,OAAA;AACT;AACF,KAAA,EACA,EAAC,CAAA;AAEL,EAAA;EAEAC,OAAAA,GAAU;AACR,IAAA,OAAO,IAAA,CAAKf,OAAOgB,MAAAA,KAAW,CAAA;AAChC,EAAA;AAEAC,EAAAA,IAAAA,CAAKC,GAAAA,EAAoC;AACvC,IAAA,IAAA,CAAKV,KAAAA,EAAK;AAGV,IAAA,IAAA,CAAKX,QAAAA,CAASsB,KACZD,GAAAA,CAAIE,QAAAA,CAASlB,QAAQmB,KAAAA,CACnB,CAACC,IAAAA,KAASA,IAAAA,CAAKC,OAAAA,YAAmBC,SAAAA,IAAaF,KAAKG,IAAAA,KAAS,OAAA,EAC7D,KAAKC,WAAAA,CAAYT,IAAAA,CAAK,IAAI,CAAA,EAC1B,IAAA,CAAKU,oBAAAA,EAAoB,CAAA,CAAA;AAK7B,IAAA,IAAA,CAAK9B,QAAAA,CAASsB,KACZD,GAAAA,CAAIE,QAAAA,CAASlB,QAAQmB,KAAAA,CACnB,CAACC,IAAAA,KAASA,IAAAA,CAAKC,OAAAA,YAAmBC,SAAAA,IAAaF,KAAKG,IAAAA,KAAS,UAAA,EAC7D,KAAKd,cAAAA,CAAeM,IAAAA,CAAK,IAAI,CAAA,EAC7B,IAAA,CAAKU,oBAAAA,EAAoB,CAAA,CAAA;AAK7B,IAAA,IAAA,CAAK9B,QAAAA,CAASsB,KACZD,GAAAA,CAAIE,QAAAA,CAASlB,QAAQmB,KAAAA,CACnB,CAACC,IAAAA,KAASA,IAAAA,CAAKC,OAAAA,YAAmBC,SAAAA,IAAaF,KAAKG,IAAAA,KAAS,SAAA,EAC7D,KAAKG,aAAAA,CAAcX,IAAAA,CAAK,IAAI,CAAA,EAC5B,IAAA,CAAKU,oBAAAA,EAAoB,CAAA,CAAA;AAG/B,EAAA;EAEAE,MAAAA,GAAe;AAEb,IAAA,OAAO,IAAA,CAAKhC,QAAAA,CAASmB,MAAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,MAAMc,EAAAA,GAAK,IAAA,CAAKjC,QAAAA,CAASkC,KAAAA,EAAK;AAC9BD,MAAAA,EAAAA,EAAAA;AACF,IAAA;AACF,EAAA;EAEUH,oBAAAA,GAAuC;AAC/C,IAAA,OAAO;AACLhC,MAAAA,WAAAA,EAAa,IAAA,CAAKA,WAAAA;MAClBqC,UAAAA,EAAY;AACd,KAAA;AACF,EAAA;EAEA,MAAcC,OAAAA,CAAQC,UAAkBC,IAAAA,EAA0B;AAChE,IAAA,IAAID,QAAAA,KAAa,IAAA,CAAKzC,MAAAA,CAAOgC,IAAAA,EAAM;AACjC,MAAA;AACF,IAAA;AAEA,IAAA,MAAMW,UAAAA,GAAaC,QAAAA,CAASF,IAAAA,CAAAA,GAAQG,gBAAgBH,IAAAA,EAAM;MAAEI,IAAAA,EAAM;AAAC,QAAA,GAAA;AAAK,QAAA;;AAAK,KAAA,CAAA,GAAKJ,IAAAA;AAClF,IAAA,MAAMK,gBAAAA,GAAoB,MAAM,IAAA,CAAK/C,MAAAA,CAAOgD,MAAML,UAAAA,CAAAA,CAAYM,KAAAA,CAAM,MAAM,IAAA,CAAA;AAC1E,IAAA,IAAI,CAACF,gBAAAA,EAAkB;AACrB,MAAA;AACF,IAAA;AAEA,IAAA,IAAI1C,MAAAA,GAAS,EAAA;AACb,IAAA,IAAI6C,OAAAA,CAAQH,gBAAAA,EAAkB,IAAA,CAAK9C,GAAG,CAAA,EAAc;AAClDI,MAAAA,MAAAA,GAAU0C,gBAAAA,CAAyB,IAAA,CAAK9C,GAAG,CAAA,IAAK,EAAA;AAChD,MAAA,IAAI,CAAC2C,QAAAA,CAASvC,MAAAA,CAAAA,EAAS;AACrBA,QAAAA,MAAAA,GAAS8C,IAAAA,CAAKC,UAAU/C,MAAAA,CAAAA;AAC1B,MAAA;AACA,MAAA,IAAA,CAAKG,KAAAA,GAAQH,MAAAA,CAAOgD,KAAAA,CAAM,IAAA,CAAK9C,OAAOgB,MAAM,CAAA;AAC5C,MAAA,IAAA,CAAKhB,MAAAA,GAASF,MAAAA;AAEd,MAAA,IAAI,CAAC,KAAKG,KAAAA,EAAO;AACf,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,MAAM,IAAA,CAAKC,OAAAA,CAAQ6C,IAAAA,CAAK,QAAA,EAAU;AAChCP,MAAAA,gBAAAA;AACAvC,MAAAA,KAAAA,EAAO,IAAA,CAAKA,KAAAA;AACZH,MAAAA;KACF,CAAA;AACF,EAAA;EAEA,MAAc4B,WAAAA,CACZsB,MACAC,KAAAA,EACe;AACf,IAAA,IAAI,KAAKrD,cAAAA,EAAgB;AACvBoD,MAAAA,IAAAA,CAAKE,MAAMC,MAAAA,GAAS,IAAA;AACpBH,MAAAA,IAAAA,CAAKE,MAAME,sBAAAA,GAAyB,IAAA;AACtC,IAAA;AACF,EAAA;EAEA,MAAcxB,aAAAA,CACZoB,MACAC,KAAAA,EACe;AAEf,IAAA,IAAI,IAAA,CAAKnD,MAAAA,CAAOuD,QAAAA,CAASrC,MAAAA,KAAW,CAAA,EAAG;AACrC,MAAA,MAAM,KAAKL,cAAAA,CAAe;AAAEC,QAAAA,KAAAA,EAAOoC,IAAAA,CAAKpC,KAAAA;QAAOC,SAAAA,EAAW;AAAEC,UAAAA,KAAAA,kBAAO,MAAA,CAAA,MAAA;UAAO,CAAA,EAAP,OAAA;AAAS;AAAE,OAAA,EAAGmC,KAAAA,CAAAA;AACnF,IAAA;AACF,EAAA;EAEA,MAActC,cAAAA,CACZqC,MACAC,KAAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAKnD,MAAAA,CAAOwD,KAAAA,CAAMN,IAAAA,CAAKpC,KAAK,CAAA;AAElC,IAAA,MAAM2C,SAAAA,GAAY,IAAA,CAAKzD,MAAAA,CAAO0D,YAAAA,EAAY;AAC1C,IAAA,IAAID,SAAAA,CAAUvC,SAAS,CAAA,EAAG;AACxB,MAAA,KAAA,MAAWyC,aAAYF,SAAAA,EAAW;AAChC,QAAA,MAAM,IAAA,CAAKtB,OAAAA,CAAQwB,SAAAA,CAASvB,QAAAA,EAAUuB,UAASP,KAAK,CAAA;AACtD,MAAA;AACA,MAAA;AACF,IAAA;AAGA,IAAA,MAAMQ,WAAAA,GAAc,IAAA,CAAK5D,MAAAA,CAAO6D,cAAAA,EAAc;AAC9C,IAAA,MAAMF,QAAAA,GAAWnB,gBAAgBoB,WAAAA,EAAa;MAAEnB,IAAAA,EAAM;AAAC,QAAA,GAAA;AAAK,QAAA;;KAAK,CAAA;AAEjE,IAAA,IAAI,CAACkB,QAAAA,IAAY,CAACG,aAAAA,CAAcH,QAAAA,CAAAA,EAAW;AACzC,MAAA;AACF,IAAA;AAEA,IAAA,MAAM,IAAA,CAAKxB,OAAAA,CAAQwB,QAAAA,CAAShC,IAAAA,EAAgBgC,SAASI,UAAU,CAAA;AACjE,EAAA;AACF","file":"streamToolCall.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { ChatModel, ChatModelEvents } from \"@/backend/chat.js\";\nimport { ChatModelOutput } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { parseBrokenJson } from \"@/internals/helpers/schema.js\";\nimport { isPlainObject, isString } from \"remeda\";\nimport { hasProp } from \"@/internals/helpers/object.js\";\nimport { EmitterOptions, InferCallbackValue } from \"@/emitter/types.js\";\n\n/**\n * Event emitted when the middleware detects an update to the target tool's arguments\n */\nexport interface StreamToolCallMiddlewareUpdateEvent<T = any> {\n /** The validated and structured tool input */\n outputStructured: T | null;\n /** The current value of the target field */\n output: string;\n /** The incremental change since the last update */\n delta: string;\n}\n\n/**\n * Callbacks for StreamToolCallMiddleware events\n */\nexport interface StreamToolCallMiddlewareCallbacks<T = any> {\n update: Callback<StreamToolCallMiddlewareUpdateEvent<T>>;\n}\n\n/**\n * Options for configuring StreamToolCallMiddleware\n */\nexport interface StreamToolCallMiddlewareOptions {\n /** The tool to monitor for streaming updates */\n target: Tool<any>;\n /** The field name in the tool's input schema to stream */\n key: string;\n /** Whether to apply middleware to nested run contexts */\n matchNested?: boolean;\n /** Whether to force streaming on the ChatModel */\n forceStreaming?: boolean;\n}\n\n/**\n * Middleware for handling streaming tool calls in a ChatModel.\n *\n * This middleware observes and listens to ChatModel stream updates and parses\n * the tool calls on demand so that they can be consumed as soon as possible.\n *\n * @example\n * ```typescript\n * const middleware = new StreamToolCallMiddleware({\n * target: thinkTool,\n * key: \"thoughts\",\n * matchNested: false,\n * forceStreaming: true,\n * });\n *\n * middleware.emitter.on(\"update\", (event) => {\n * console.log(\"Delta:\", event.delta);\n * console.log(\"Structured:\", event.outputStructured);\n * });\n *\n * await llm.run(messages, { tools: [thinkTool] }).middleware(middleware);\n * ```\n */\nexport class StreamToolCallMiddleware<T = any> extends Middleware<RunInstance> {\n private readonly target: Tool<any>;\n private readonly key: string;\n private readonly matchNested: boolean;\n private readonly forceStreaming: boolean;\n private readonly cleanups: (() => void)[] = [];\n\n private output = new ChatModelOutput([]);\n private buffer = \"\";\n private delta = \"\";\n\n public readonly emitter: Emitter<StreamToolCallMiddlewareCallbacks<T>>;\n\n constructor(options: StreamToolCallMiddlewareOptions) {\n super();\n\n this.target = options.target;\n this.key = options.key;\n this.matchNested = options.matchNested ?? false;\n this.forceStreaming = options.forceStreaming ?? false;\n\n this.emitter = Emitter.root.child<StreamToolCallMiddlewareCallbacks<T>>({\n namespace: [\"middleware\", \"streamToolCall\"],\n });\n }\n\n reset() {\n this.output = new ChatModelOutput([]);\n this.buffer = \"\";\n this.delta = \"\";\n }\n\n async add(chunk: ChatModelOutput) {\n await this.handleNewToken(\n {\n value: chunk,\n callbacks: {\n abort: () => {},\n },\n },\n {} as EventMeta,\n );\n }\n\n isEmpty() {\n return this.buffer.length === 0;\n }\n\n bind(ctx: RunContext<RunInstance>): void {\n this.reset();\n\n // Listen to ChatModel start event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"start\",\n this.handleStart.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel newToken event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"newToken\",\n this.handleNewToken.bind(this),\n this.createEmitterOptions(),\n ),\n );\n\n // Listen to ChatModel success event\n this.cleanups.push(\n ctx.instance.emitter.match(\n (meta) => meta.creator instanceof ChatModel && meta.name === \"success\",\n this.handleSuccess.bind(this),\n this.createEmitterOptions(),\n ),\n );\n }\n\n unbind(): void {\n // Clean up previous bindings\n while (this.cleanups.length > 0) {\n const fn = this.cleanups.shift()!;\n fn();\n }\n }\n\n protected createEmitterOptions(): EmitterOptions {\n return {\n matchNested: this.matchNested,\n isBlocking: true,\n };\n }\n\n private async process(toolName: string, args: any): Promise<void> {\n if (toolName !== this.target.name) {\n return;\n }\n\n const parsedArgs = isString(args) ? parseBrokenJson(args, { pair: [\"{\", \"}\"] }) : args;\n const outputStructured = (await this.target.parse(parsedArgs).catch(() => null)) as T;\n if (!outputStructured) {\n return;\n }\n\n let output = \"\";\n if (hasProp(outputStructured, this.key as keyof T)) {\n output = (outputStructured as any)[this.key] || \"\";\n if (!isString(output)) {\n output = JSON.stringify(output);\n }\n this.delta = output.slice(this.buffer.length);\n this.buffer = output;\n\n if (!this.delta) {\n return;\n }\n }\n\n await this.emitter.emit(\"update\", {\n outputStructured,\n delta: this.delta,\n output,\n });\n }\n\n private async handleStart(\n data: InferCallbackValue<ChatModelEvents[\"start\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n if (this.forceStreaming) {\n data.input.stream = true;\n data.input.streamPartialToolCalls = true;\n }\n }\n\n private async handleSuccess(\n data: InferCallbackValue<ChatModelEvents[\"success\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n // If we haven't received any tokens yet, process the final output\n if (this.output.messages.length === 0) {\n await this.handleNewToken({ value: data.value, callbacks: { abort: () => {} } }, _meta);\n }\n }\n\n private async handleNewToken(\n data: InferCallbackValue<ChatModelEvents[\"newToken\"]>,\n _meta: EventMeta,\n ): Promise<void> {\n await this.output.merge(data.value);\n\n const toolCalls = this.output.getToolCalls();\n if (toolCalls.length > 0) {\n for (const toolCall of toolCalls) {\n await this.process(toolCall.toolName, toolCall.input);\n }\n return;\n }\n\n // Try to parse text content as a tool call\n const textContent = this.output.getTextContent();\n const toolCall = parseBrokenJson(textContent, { pair: [\"{\", \"}\"] });\n\n if (!toolCall || !isPlainObject(toolCall)) {\n return;\n }\n\n await this.process(toolCall.name as string, toolCall.parameters as any);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/middleware/trajectory.ts"],"names":["GlobalTrajectoryMiddleware","Middleware","enabled","included","excluded","cleanups","target","ctx","pretty","traceLevel","Map","prefixByType","matchNested","emitterPriority","formatter","emitter","options","createTarget","BaseAgent","ChatModel","Tool","Requirement","Array","from","entries","x","prefix","className","instanceName","eventName","Emitter","root","child","namespace","bind","length","pop","clear","set","runId","relative","absolute","bindEmitter","input","undefined","msg","console","log","Logger","debug","push","match","_","event","logTraceId","handleTopLevelEvent","data","meta","creator","RunContext","trace","isAllowed","capitalize","name","call","matchInternalEvent","isBlocking","priority","handleNestedEvent","has","parentRunId","allowed","parentTrace","get","instance","some","extractName","targetName","type","typePrefix","formatPrefix","indent","getTraceLevel","indentParent","indentDiff","repeat","formatPayload","value","isPrimitive","String","FrameworkError","explain","serialized","Serializer","serialize","JSON","stringify","deserialize","excludedKeys","Set","key","onInternalStart","payload","message","emit","level","origin","onInternalSuccess","onInternalError","onInternalFinish","error","output","names","includes","getProp","context"],"mappings":"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","file":"trajectory.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunContextCallbacks, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { FrameworkError } from \"@/errors.js\";\nimport { Logger } from \"@/logger/logger.js\";\nimport { BaseAgent } from \"@/agents/base.js\";\nimport type { AnyConstructable } from \"@/internals/types.js\";\nimport { capitalize } from \"remeda\";\nimport { ChatModel } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { Requirement } from \"@/agents/requirement/requirements/requirement.js\";\nimport type { InferCallbackValue } from \"@/emitter/types.js\";\nimport { Serializer } from \"@/serializer/serializer.js\";\nimport { isPrimitive } from \"@/internals/helpers/guards.js\";\nimport { getProp } from \"@/internals/helpers/object.js\";\n\n/**\n * Information about how deep the given entity is in the execution tree.\n */\nexport interface TraceLevel {\n /** Relative depth to the included (observed) elements */\n relative: number;\n /** Absolute depth from the root */\n absolute: number;\n}\n\n/**\n * Input for custom formatter function\n */\nexport interface GlobalTrajectoryMiddlewareFormatterInput {\n prefix: string;\n className: string;\n eventName: string;\n instanceName: string | null;\n}\n\nexport interface GlobalTrajectoryMiddlewareCallbacks {\n start: Callback<{\n message: string;\n level: TraceLevel;\n origin: [InferCallbackValue<RunContextCallbacks[\"start\"]>, EventMeta];\n }>;\n success: Callback<{\n message: string;\n level: TraceLevel;\n origin: [InferCallbackValue<RunContextCallbacks[\"success\"]>, EventMeta];\n }>;\n error: Callback<{\n message: string;\n level: TraceLevel;\n origin: [InferCallbackValue<RunContextCallbacks[\"error\"]>, EventMeta];\n }>;\n finish: Callback<{\n message: string;\n level: TraceLevel;\n origin: [InferCallbackValue<RunContextCallbacks[\"finish\"]>, EventMeta];\n }>;\n}\n\ntype OutputTargetFn = (message: string) => void;\ntype OutputTarget = Logger | OutputTargetFn;\n\nexport interface GlobalTrajectoryMiddlewareOptions {\n /** Specify output target: 'console', Logger instance, custom function, or null to disable */\n target?: OutputTarget;\n /** List of classes to include in the trajectory */\n included?: AnyConstructable[];\n /** List of classes to exclude from the trajectory */\n excluded?: AnyConstructable[];\n /** Use pretty formatting for the trajectory */\n pretty?: boolean;\n /** Customize how instances of individual classes should be printed */\n prefixByType?: Map<AnyConstructable, string>;\n /** Enable/Disable the logging */\n enabled?: boolean;\n /** Whether to observe trajectories of nested run contexts */\n matchNested?: boolean;\n /** Defines a priority for registered events */\n emitterPriority?: number;\n /** Custom formatter function */\n formatter?: (input: GlobalTrajectoryMiddlewareFormatterInput) => string;\n}\n\n/**\n * Middleware for capturing and logging execution flow of agents, tools, and models.\n * Provides hierarchical visualization with indentation to show the call stack.\n */\nexport class GlobalTrajectoryMiddleware<T extends RunInstance = any> extends Middleware<T> {\n protected enabled: boolean;\n protected included: AnyConstructable[];\n protected excluded: AnyConstructable[];\n protected cleanups: (() => void)[] = [];\n protected target: (message: string) => void;\n protected ctx: RunContext<T> | null = null;\n protected pretty: boolean;\n protected traceLevel = new Map<string, TraceLevel>();\n protected prefixByType: Map<any, string>;\n protected matchNested: boolean;\n protected emitterPriority: number;\n protected formatter: (input: GlobalTrajectoryMiddlewareFormatterInput) => string;\n public readonly emitter: Emitter<GlobalTrajectoryMiddlewareCallbacks>;\n\n constructor(options: GlobalTrajectoryMiddlewareOptions = {}) {\n super();\n\n this.enabled = options.enabled ?? true;\n this.included = options.included ?? [];\n this.excluded = options.excluded ?? [];\n this.target = this.createTarget(options.target);\n this.pretty = options.pretty ?? false;\n this.matchNested = options.matchNested ?? true;\n this.emitterPriority = options.emitterPriority ?? -1; // run later\n\n // Default prefixes\n this.prefixByType = new Map([\n [BaseAgent, \"🤖 \"],\n [ChatModel, \"💬 \"],\n [Tool, \"🛠️ \"],\n [Requirement, \"🔎 \"],\n ...((options.prefixByType ? Array.from(options.prefixByType.entries()) : []) as any),\n ]);\n\n this.formatter =\n options.formatter ??\n ((x) => `${x.prefix}${x.className}[${x.instanceName || x.className}][${x.eventName}]`);\n\n this.emitter = Emitter.root.child<GlobalTrajectoryMiddlewareCallbacks>({\n namespace: [\"middleware\", \"globalTrajectory\"],\n });\n }\n\n /**\n * Bind the middleware to a run context\n */\n bind(ctx: RunContext<T>): void {\n // Cleanup previous bindings\n while (this.cleanups.length > 0) {\n this.cleanups.pop()!();\n }\n\n this.traceLevel.clear();\n this.traceLevel.set(ctx.runId, { relative: 0, absolute: 0 });\n this.ctx = ctx;\n\n this.bindEmitter(ctx.emitter);\n }\n\n private createTarget(input?: OutputTarget): OutputTargetFn {\n if (input === null || input === undefined) {\n // eslint-disable-next-line no-console\n return (msg) => console.log(msg);\n } else if (input instanceof Logger) {\n return (msg) => input.debug(msg);\n } else {\n return input;\n }\n }\n\n private bindEmitter(emitter: Emitter<any>): void {\n // Track all events for trace ID logging\n this.cleanups.push(\n emitter.match(\"*.*\", (_, event) => this.logTraceId(event), {\n matchNested: true,\n }),\n );\n\n // Handle top-level events\n const handleTopLevelEvent = async (data: any, meta: EventMeta) => {\n if (!(meta.creator instanceof RunContext)) {\n return;\n }\n if (!meta.trace) {\n return;\n }\n\n this.logTraceId(meta);\n if (!this.isAllowed(meta)) {\n return;\n }\n if (!this.enabled) {\n return;\n }\n\n const eventName = capitalize(meta.name) as \"Start\" | \"Success\" | \"Error\" | \"Finish\";\n await this[`onInternal${eventName}` as const].call(this, data, meta);\n };\n\n this.cleanups.push(\n emitter.match(\n matchInternalEvent([\"start\", \"success\", \"error\", \"finish\"]),\n handleTopLevelEvent,\n {\n matchNested: false,\n isBlocking: true,\n priority: this.emitterPriority,\n },\n ),\n );\n\n // Handle nested events if enabled\n if (this.matchNested) {\n const handleNestedEvent = async (data: any, meta: EventMeta) => {\n if (!(meta.creator instanceof RunContext)) {\n return;\n }\n if (meta.creator.emitter !== emitter) {\n await handleTopLevelEvent(data, meta);\n this.bindEmitter(meta.creator.emitter);\n }\n };\n\n this.cleanups.push(\n emitter.match(matchInternalEvent([\"start\"]), handleNestedEvent, {\n matchNested: true,\n isBlocking: true,\n priority: this.emitterPriority,\n }),\n );\n }\n }\n\n private logTraceId(meta: EventMeta): void {\n if (!meta.trace?.runId) {\n return;\n }\n if (this.traceLevel.has(meta.trace.runId)) {\n return;\n }\n if (meta.trace.parentRunId === meta.trace.runId) {\n return;\n }\n\n if (meta.trace.parentRunId) {\n const allowed = this.isAllowed(meta);\n const parentTrace = this.traceLevel.get(meta.trace.parentRunId) ?? {\n relative: 0,\n absolute: 0,\n };\n this.traceLevel.set(meta.trace.runId, {\n relative: parentTrace.relative + (allowed ? 1 : 0),\n absolute: parentTrace.absolute + 1,\n });\n }\n }\n\n private isAllowed(meta: EventMeta): boolean {\n let target: any = meta.creator;\n if (target instanceof RunContext) {\n target = target.instance;\n }\n\n for (const excluded of this.excluded) {\n if (target instanceof excluded) {\n return false;\n }\n }\n\n if (this.included.length === 0) {\n return true;\n }\n\n return this.included.some((included) => target instanceof included);\n }\n\n private extractName(meta: EventMeta): string {\n let target: any = meta.creator;\n if (target instanceof RunContext) {\n target = target.instance;\n }\n\n const className = target.constructor.name;\n let targetName: string | null = null;\n\n if (target instanceof BaseAgent && target.meta?.name) {\n targetName = target.meta.name;\n } else if (\"name\" in target && typeof target.name === \"string\") {\n targetName = target.name;\n }\n\n let prefix = \"\";\n for (const [type, typePrefix] of this.prefixByType.entries()) {\n if (target instanceof type) {\n prefix = typePrefix;\n break;\n }\n }\n\n const input: GlobalTrajectoryMiddlewareFormatterInput = {\n prefix,\n className,\n instanceName: targetName,\n eventName: meta.name,\n };\n\n return this.formatter(input);\n }\n\n private formatPrefix(meta: EventMeta): string {\n if (!meta.trace) {\n return \"\";\n }\n\n const indent = this.getTraceLevel(meta, \"self\").relative;\n const indentParent = this.getTraceLevel(meta, \"parent\").relative;\n const indentDiff = indent - indentParent;\n\n let prefix = \"\";\n prefix += \" \".repeat(indentParent * 2);\n\n if (meta.name !== \"start\" && indent) {\n prefix += \"<\";\n }\n\n prefix += \"--\".repeat(indentDiff);\n\n if (meta.name === \"start\" && prefix && indent) {\n prefix += \">\";\n }\n\n if (prefix) {\n prefix = `${prefix} `;\n }\n\n const name = this.extractName(meta);\n return `${prefix}${name}: `;\n }\n\n private getTraceLevel(meta: EventMeta, type: \"self\" | \"parent\" = \"self\"): TraceLevel {\n if (!meta.trace) {\n return { relative: 0, absolute: 0 };\n }\n\n const runId = type === \"parent\" ? meta.trace.parentRunId || \"\" : meta.trace.runId;\n return this.traceLevel.get(runId) ?? { relative: 0, absolute: 0 };\n }\n\n private async formatPayload(value: any): Promise<string> {\n if (isPrimitive(value)) {\n return String(value);\n }\n\n if (value instanceof FrameworkError) {\n return value.explain();\n }\n\n const serialized = await Serializer.serialize(value);\n return JSON.stringify(\n await Serializer.deserialize(serialized, [], true),\n (() => {\n const excludedKeys = new Set([\"emitter\", \"cleanups\", \"creator\", \"listeners\"]);\n return (key, value) => {\n if (excludedKeys.has(key)) {\n return undefined;\n }\n if (value && value instanceof Tool) {\n return value.name;\n }\n return value;\n };\n })(),\n this.pretty ? 2 : undefined,\n );\n }\n\n private async onInternalStart(\n payload: InferCallbackValue<RunContextCallbacks[\"start\"]>,\n meta: EventMeta,\n ): Promise<void> {\n const prefix = this.formatPrefix(meta);\n const message = `${prefix}${await this.formatPayload(payload.input)}`;\n\n await this.emitter.emit(\"start\", {\n message,\n level: this.getTraceLevel(meta),\n origin: [payload, meta],\n });\n\n this.target(message);\n }\n\n private async onInternalSuccess(\n payload: InferCallbackValue<RunContextCallbacks[\"success\"]>,\n meta: EventMeta,\n ): Promise<void> {\n const prefix = this.formatPrefix(meta);\n // TODO: change to payload.output once available\n const message = `${prefix}${await this.formatPayload(payload)}`;\n\n await this.emitter.emit(\"success\", {\n message,\n level: this.getTraceLevel(meta),\n origin: [payload, meta],\n });\n\n this.target(message);\n }\n\n private async onInternalError(\n payload: InferCallbackValue<RunContextCallbacks[\"error\"]>,\n meta: EventMeta,\n ): Promise<void> {\n const prefix = this.formatPrefix(meta);\n const message = `${prefix}${await this.formatPayload(payload)}`;\n\n await this.emitter.emit(\"error\", {\n message,\n level: this.getTraceLevel(meta),\n origin: [payload, meta],\n });\n\n this.target(message);\n }\n\n private async onInternalFinish(\n payload: InferCallbackValue<RunContextCallbacks[\"finish\"]>,\n meta: EventMeta,\n ): Promise<void> {\n const prefix = this.formatPrefix(meta);\n const message = `${prefix}${await this.formatPayload(payload.error || payload.output)}`;\n await this.emitter.emit(\"finish\", {\n message,\n level: this.getTraceLevel(meta),\n origin: [payload, meta],\n });\n }\n}\n\nfunction matchInternalEvent(names: (keyof RunContextCallbacks)[]) {\n return (meta: EventMeta): boolean =>\n names.includes(meta.name as keyof RunContextCallbacks) &&\n getProp(meta.context, [\"internal\"], false);\n}\n"]}
1
+ {"version":3,"sources":["../../src/middleware/trajectory.ts"],"names":["GlobalTrajectoryMiddleware","Middleware","enabled","included","excluded","cleanups","target","ctx","pretty","traceLevel","Map","prefixByType","matchNested","emitterPriority","formatter","emitter","options","createTarget","BaseAgent","ChatModel","Tool","Requirement","Array","from","entries","x","prefix","className","instanceName","eventName","Emitter","root","child","namespace","bind","length","pop","clear","set","runId","relative","absolute","bindEmitter","input","undefined","msg","console","log","Logger","debug","push","match","_","event","logTraceId","handleTopLevelEvent","data","meta","creator","RunContext","trace","isAllowed","capitalize","name","call","matchInternalEvent","isBlocking","priority","handleNestedEvent","has","parentRunId","allowed","parentTrace","get","instance","some","extractName","targetName","type","typePrefix","formatPrefix","indent","getTraceLevel","indentParent","indentDiff","repeat","formatPayload","value","isPrimitive","String","FrameworkError","explain","serialized","Serializer","serialize","JSON","stringify","deserialize","excludedKeys","Set","key","onInternalStart","payload","message","emit","level","origin","onInternalSuccess","onInternalError","onInternalFinish","error","output","names","includes","getProp","context"],"mappings":";;;;;;;;;;;;;;;;;AA2FO,MAAMA,mCAAgEC,sBAAAA,CAAAA;EA3F7E;;;AA4FYC,EAAAA,OAAAA;AACAC,EAAAA,QAAAA;AACAC,EAAAA,QAAAA;AACAC,EAAAA,QAAAA,GAA2B,EAAA;AAC3BC,EAAAA,MAAAA;EACAC,GAAAA,GAA4B,IAAA;AAC5BC,EAAAA,MAAAA;AACAC,EAAAA,UAAAA,uBAAiBC,GAAAA,EAAAA;AACjBC,EAAAA,YAAAA;AACAC,EAAAA,WAAAA;AACAC,EAAAA,eAAAA;AACAC,EAAAA,SAAAA;AACMC,EAAAA,OAAAA;EAEhB,WAAA,CAAYC,OAAAA,GAA6C,EAAC,EAAG;AAC3D,IAAA,KAAA,EAAK;AAEL,IAAA,IAAA,CAAKd,OAAAA,GAAUc,QAAQd,OAAAA,IAAW,IAAA;AAClC,IAAA,IAAA,CAAKC,QAAAA,GAAWa,OAAAA,CAAQb,QAAAA,IAAY,EAAA;AACpC,IAAA,IAAA,CAAKC,QAAAA,GAAWY,OAAAA,CAAQZ,QAAAA,IAAY,EAAA;AACpC,IAAA,IAAA,CAAKE,MAAAA,GAAS,IAAA,CAAKW,YAAAA,CAAaD,OAAAA,CAAQV,MAAM,CAAA;AAC9C,IAAA,IAAA,CAAKE,MAAAA,GAASQ,QAAQR,MAAAA,IAAU,KAAA;AAChC,IAAA,IAAA,CAAKI,WAAAA,GAAcI,QAAQJ,WAAAA,IAAe,IAAA;AAC1C,IAAA,IAAA,CAAKC,eAAAA,GAAkBG,QAAQH,eAAAA,IAAmB,EAAA;AAGlD,IAAA,IAAA,CAAKF,YAAAA,GAAe,IAAID,GAAAA,CAAI;AAC1B,MAAA;AAACQ,QAAAA,kBAAAA;AAAW,QAAA;;AACZ,MAAA;AAACC,QAAAA,kBAAAA;AAAW,QAAA;;AACZ,MAAA;AAACC,QAAAA,eAAAA;AAAM,QAAA;;AACP,MAAA;AAACC,QAAAA,2BAAAA;AAAa,QAAA;;SACTL,OAAAA,CAAQL,YAAAA,GAAeW,MAAMC,IAAAA,CAAKP,OAAAA,CAAQL,aAAaa,OAAAA,EAAO,IAAM;AAC1E,KAAA,CAAA;AAED,IAAA,IAAA,CAAKV,YACHE,OAAAA,CAAQF,SAAAA,KACP,CAACW,CAAAA,KAAM,CAAA,EAAGA,EAAEC,MAAM,CAAA,EAAGD,CAAAA,CAAEE,SAAS,IAAIF,CAAAA,CAAEG,YAAAA,IAAgBH,EAAEE,SAAS,CAAA,EAAA,EAAKF,EAAEI,SAAS,CAAA,CAAA,CAAA,CAAA;AAEpF,IAAA,IAAA,CAAKd,OAAAA,GAAUe,mBAAAA,CAAQC,IAAAA,CAAKC,KAAAA,CAA2C;MACrEC,SAAAA,EAAW;AAAC,QAAA,YAAA;AAAc,QAAA;;KAC5B,CAAA;AACF,EAAA;;;;AAKAC,EAAAA,IAAAA,CAAK3B,GAAAA,EAA0B;AAE7B,IAAA,OAAO,IAAA,CAAKF,QAAAA,CAAS8B,MAAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK9B,QAAAA,CAAS+B,KAAG,EAAA;AACnB,IAAA;AAEA,IAAA,IAAA,CAAK3B,WAAW4B,KAAAA,EAAK;AACrB,IAAA,IAAA,CAAK5B,UAAAA,CAAW6B,GAAAA,CAAI/B,GAAAA,CAAIgC,KAAAA,EAAO;MAAEC,QAAAA,EAAU,CAAA;MAAGC,QAAAA,EAAU;KAAE,CAAA;AAC1D,IAAA,IAAA,CAAKlC,GAAAA,GAAMA,GAAAA;AAEX,IAAA,IAAA,CAAKmC,WAAAA,CAAYnC,IAAIQ,OAAO,CAAA;AAC9B,EAAA;AAEQE,EAAAA,YAAAA,CAAa0B,KAAAA,EAAsC;AACzD,IAAA,IAAIA,KAAAA,KAAU,IAAA,IAAQA,KAAAA,KAAUC,MAAAA,EAAW;AAEzC,MAAA,OAAO,CAACC,GAAAA,KAAQC,OAAAA,CAAQC,GAAAA,CAAIF,GAAAA,CAAAA;AAC9B,IAAA,CAAA,MAAA,IAAWF,iBAAiBK,iBAAAA,EAAQ;AAClC,MAAA,OAAO,CAACH,GAAAA,KAAQF,KAAAA,CAAMM,KAAAA,CAAMJ,GAAAA,CAAAA;IAC9B,CAAA,MAAO;AACL,MAAA,OAAOF,KAAAA;AACT,IAAA;AACF,EAAA;AAEQD,EAAAA,WAAAA,CAAY3B,OAAAA,EAA6B;AAE/C,IAAA,IAAA,CAAKV,QAAAA,CAAS6C,IAAAA,CACZnC,OAAAA,CAAQoC,KAAAA,CAAM,KAAA,EAAO,CAACC,CAAAA,EAAGC,KAAAA,KAAU,IAAA,CAAKC,UAAAA,CAAWD,KAAAA,CAAAA,EAAQ;MACzDzC,WAAAA,EAAa;AACf,KAAA,CAAA,CAAA;AAIF,IAAA,MAAM2C,mBAAAA,mBAAsB,MAAA,CAAA,OAAOC,IAAAA,EAAWC,IAAAA,KAAAA;AAC5C,MAAA,IAAI,EAAEA,IAAAA,CAAKC,OAAAA,YAAmBC,sBAAAA,CAAAA,EAAa;AACzC,QAAA;AACF,MAAA;AACA,MAAA,IAAI,CAACF,KAAKG,KAAAA,EAAO;AACf,QAAA;AACF,MAAA;AAEA,MAAA,IAAA,CAAKN,WAAWG,IAAAA,CAAAA;AAChB,MAAA,IAAI,CAAC,IAAA,CAAKI,SAAAA,CAAUJ,IAAAA,CAAAA,EAAO;AACzB,QAAA;AACF,MAAA;AACA,MAAA,IAAI,CAAC,KAAKvD,OAAAA,EAAS;AACjB,QAAA;AACF,MAAA;AAEA,MAAA,MAAM2B,SAAAA,GAAYiC,iBAAAA,CAAWL,IAAAA,CAAKM,IAAI,CAAA;AACtC,MAAA,MAAM,IAAA,CAAK,aAAalC,SAAAA,CAAAA,CAAW,EAAWmC,IAAAA,CAAK,IAAA,EAAMR,MAAMC,IAAAA,CAAAA;IACjE,CAAA,EAlB4B,qBAAA,CAAA;AAoB5B,IAAA,IAAA,CAAKpD,QAAAA,CAAS6C,IAAAA,CACZnC,OAAAA,CAAQoC,KAAAA,CACNc,kBAAAA,CAAmB;AAAC,MAAA,OAAA;AAAS,MAAA,SAAA;AAAW,MAAA,OAAA;AAAS,MAAA;AAAS,KAAA,CAAA,EAC1DV,mBAAAA,EACA;MACE3C,WAAAA,EAAa,KAAA;MACbsD,UAAAA,EAAY,IAAA;AACZC,MAAAA,QAAAA,EAAU,IAAA,CAAKtD;AACjB,KAAA,CAAA,CAAA;AAKJ,IAAA,IAAI,KAAKD,WAAAA,EAAa;AACpB,MAAA,MAAMwD,iBAAAA,mBAAoB,MAAA,CAAA,OAAOZ,IAAAA,EAAWC,IAAAA,KAAAA;AAC1C,QAAA,IAAI,EAAEA,IAAAA,CAAKC,OAAAA,YAAmBC,sBAAAA,CAAAA,EAAa;AACzC,UAAA;AACF,QAAA;AACA,QAAA,IAAIF,IAAAA,CAAKC,OAAAA,CAAQ3C,OAAAA,KAAYA,OAAAA,EAAS;AACpC,UAAA,MAAMwC,mBAAAA,CAAoBC,MAAMC,IAAAA,CAAAA;AAChC,UAAA,IAAA,CAAKf,WAAAA,CAAYe,IAAAA,CAAKC,OAAAA,CAAQ3C,OAAO,CAAA;AACvC,QAAA;MACF,CAAA,EAR0B,mBAAA,CAAA;AAU1B,MAAA,IAAA,CAAKV,QAAAA,CAAS6C,IAAAA,CACZnC,OAAAA,CAAQoC,KAAAA,CAAMc,kBAAAA,CAAmB;AAAC,QAAA;AAAQ,OAAA,CAAA,EAAGG,iBAAAA,EAAmB;QAC9DxD,WAAAA,EAAa,IAAA;QACbsD,UAAAA,EAAY,IAAA;AACZC,QAAAA,QAAAA,EAAU,IAAA,CAAKtD;AACjB,OAAA,CAAA,CAAA;AAEJ,IAAA;AACF,EAAA;AAEQyC,EAAAA,UAAAA,CAAWG,IAAAA,EAAuB;AACxC,IAAA,IAAI,CAACA,IAAAA,CAAKG,KAAAA,EAAOrB,KAAAA,EAAO;AACtB,MAAA;AACF,IAAA;AACA,IAAA,IAAI,KAAK9B,UAAAA,CAAW4D,GAAAA,CAAIZ,IAAAA,CAAKG,KAAAA,CAAMrB,KAAK,CAAA,EAAG;AACzC,MAAA;AACF,IAAA;AACA,IAAA,IAAIkB,IAAAA,CAAKG,KAAAA,CAAMU,WAAAA,KAAgBb,IAAAA,CAAKG,MAAMrB,KAAAA,EAAO;AAC/C,MAAA;AACF,IAAA;AAEA,IAAA,IAAIkB,IAAAA,CAAKG,MAAMU,WAAAA,EAAa;AAC1B,MAAA,MAAMC,OAAAA,GAAU,IAAA,CAAKV,SAAAA,CAAUJ,IAAAA,CAAAA;AAC/B,MAAA,MAAMe,cAAc,IAAA,CAAK/D,UAAAA,CAAWgE,IAAIhB,IAAAA,CAAKG,KAAAA,CAAMU,WAAW,CAAA,IAAK;QACjE9B,QAAAA,EAAU,CAAA;QACVC,QAAAA,EAAU;AACZ,OAAA;AACA,MAAA,IAAA,CAAKhC,UAAAA,CAAW6B,GAAAA,CAAImB,IAAAA,CAAKG,KAAAA,CAAMrB,KAAAA,EAAO;QACpCC,QAAAA,EAAUgC,WAAAA,CAAYhC,QAAAA,IAAY+B,OAAAA,GAAU,CAAA,GAAI,CAAA,CAAA;AAChD9B,QAAAA,QAAAA,EAAU+B,YAAY/B,QAAAA,GAAW;OACnC,CAAA;AACF,IAAA;AACF,EAAA;AAEQoB,EAAAA,SAAAA,CAAUJ,IAAAA,EAA0B;AAC1C,IAAA,IAAInD,SAAcmD,IAAAA,CAAKC,OAAAA;AACvB,IAAA,IAAIpD,kBAAkBqD,sBAAAA,EAAY;AAChCrD,MAAAA,MAAAA,GAASA,MAAAA,CAAOoE,QAAAA;AAClB,IAAA;AAEA,IAAA,KAAA,MAAWtE,QAAAA,IAAY,KAAKA,QAAAA,EAAU;AACpC,MAAA,IAAIE,kBAAkBF,QAAAA,EAAU;AAC9B,QAAA,OAAO,KAAA;AACT,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,IAAA,CAAKD,QAAAA,CAASgC,MAAAA,KAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,OAAO,KAAKhC,QAAAA,CAASwE,IAAAA,CAAK,CAACxE,QAAAA,KAAaG,kBAAkBH,QAAAA,CAAAA;AAC5D,EAAA;AAEQyE,EAAAA,WAAAA,CAAYnB,IAAAA,EAAyB;AAC3C,IAAA,IAAInD,SAAcmD,IAAAA,CAAKC,OAAAA;AACvB,IAAA,IAAIpD,kBAAkBqD,sBAAAA,EAAY;AAChCrD,MAAAA,MAAAA,GAASA,MAAAA,CAAOoE,QAAAA;AAClB,IAAA;AAEA,IAAA,MAAM/C,SAAAA,GAAYrB,OAAO,WAAA,CAAYyD,IAAAA;AACrC,IAAA,IAAIc,UAAAA,GAA4B,IAAA;AAEhC,IAAA,IAAIvE,MAAAA,YAAkBY,kBAAAA,IAAaZ,MAAAA,CAAOmD,IAAAA,EAAMM,IAAAA,EAAM;AACpDc,MAAAA,UAAAA,GAAavE,OAAOmD,IAAAA,CAAKM,IAAAA;AAC3B,IAAA,CAAA,MAAA,IAAW,MAAA,IAAUzD,MAAAA,IAAU,OAAOA,MAAAA,CAAOyD,SAAS,QAAA,EAAU;AAC9Dc,MAAAA,UAAAA,GAAavE,MAAAA,CAAOyD,IAAAA;AACtB,IAAA;AAEA,IAAA,IAAIrC,MAAAA,GAAS,EAAA;AACb,IAAA,KAAA,MAAW,CAACoD,IAAAA,EAAMC,UAAAA,KAAe,IAAA,CAAKpE,YAAAA,CAAaa,SAAO,EAAI;AAC5D,MAAA,IAAIlB,kBAAkBwE,IAAAA,EAAM;AAC1BpD,QAAAA,MAAAA,GAASqD,UAAAA;AACT,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,MAAMpC,KAAAA,GAAkD;AACtDjB,MAAAA,MAAAA;AACAC,MAAAA,SAAAA;MACAC,YAAAA,EAAciD,UAAAA;AACdhD,MAAAA,SAAAA,EAAW4B,IAAAA,CAAKM;AAClB,KAAA;AAEA,IAAA,OAAO,IAAA,CAAKjD,UAAU6B,KAAAA,CAAAA;AACxB,EAAA;AAEQqC,EAAAA,YAAAA,CAAavB,IAAAA,EAAyB;AAC5C,IAAA,IAAI,CAACA,KAAKG,KAAAA,EAAO;AACf,MAAA,OAAO,EAAA;AACT,IAAA;AAEA,IAAA,MAAMqB,MAAAA,GAAS,IAAA,CAAKC,aAAAA,CAAczB,IAAAA,EAAM,MAAA,CAAA,CAAQjB,QAAAA;AAChD,IAAA,MAAM2C,YAAAA,GAAe,IAAA,CAAKD,aAAAA,CAAczB,IAAAA,EAAM,QAAA,CAAA,CAAUjB,QAAAA;AACxD,IAAA,MAAM4C,aAAaH,MAAAA,GAASE,YAAAA;AAE5B,IAAA,IAAIzD,MAAAA,GAAS,EAAA;AACbA,IAAAA,MAAAA,IAAU,IAAA,CAAK2D,MAAAA,CAAOF,YAAAA,GAAe,CAAA,CAAA;AAErC,IAAA,IAAI1B,IAAAA,CAAKM,IAAAA,KAAS,OAAA,IAAWkB,MAAAA,EAAQ;AACnCvD,MAAAA,MAAAA,IAAU,GAAA;AACZ,IAAA;AAEAA,IAAAA,MAAAA,IAAU,IAAA,CAAK2D,OAAOD,UAAAA,CAAAA;AAEtB,IAAA,IAAI3B,IAAAA,CAAKM,IAAAA,KAAS,OAAA,IAAWrC,MAAAA,IAAUuD,MAAAA,EAAQ;AAC7CvD,MAAAA,MAAAA,IAAU,GAAA;AACZ,IAAA;AAEA,IAAA,IAAIA,MAAAA,EAAQ;AACVA,MAAAA,MAAAA,GAAS,GAAGA,MAAAA,CAAAA,CAAAA,CAAAA;AACd,IAAA;AAEA,IAAA,MAAMqC,IAAAA,GAAO,IAAA,CAAKa,WAAAA,CAAYnB,IAAAA,CAAAA;AAC9B,IAAA,OAAO,CAAA,EAAG/B,MAAAA,CAAAA,EAASqC,IAAAA,CAAAA,EAAAA,CAAAA;AACrB,EAAA;EAEQmB,aAAAA,CAAczB,IAAAA,EAAiBqB,OAA0B,MAAA,EAAoB;AACnF,IAAA,IAAI,CAACrB,KAAKG,KAAAA,EAAO;AACf,MAAA,OAAO;QAAEpB,QAAAA,EAAU,CAAA;QAAGC,QAAAA,EAAU;AAAE,OAAA;AACpC,IAAA;AAEA,IAAA,MAAMF,KAAAA,GAAQuC,SAAS,QAAA,GAAWrB,IAAAA,CAAKG,MAAMU,WAAAA,IAAe,EAAA,GAAKb,KAAKG,KAAAA,CAAMrB,KAAAA;AAC5E,IAAA,OAAO,IAAA,CAAK9B,UAAAA,CAAWgE,GAAAA,CAAIlC,KAAAA,CAAAA,IAAU;MAAEC,QAAAA,EAAU,CAAA;MAAGC,QAAAA,EAAU;AAAE,KAAA;AAClE,EAAA;AAEA,EAAA,MAAc6C,cAAcC,KAAAA,EAA6B;AACvD,IAAA,IAAIC,sBAAAA,CAAYD,KAAAA,CAAAA,EAAQ;AACtB,MAAA,OAAOE,OAAOF,KAAAA,CAAAA;AAChB,IAAA;AAEA,IAAA,IAAIA,iBAAiBG,yBAAAA,EAAgB;AACnC,MAAA,OAAOH,MAAMI,OAAAA,EAAO;AACtB,IAAA;AAEA,IAAA,MAAMC,UAAAA,GAAa,MAAMC,yBAAAA,CAAWC,SAAAA,CAAUP,KAAAA,CAAAA;AAC9C,IAAA,OAAOQ,IAAAA,CAAKC,SAAAA,CACV,MAAMH,yBAAAA,CAAWI,WAAAA,CAAYL,YAAY,EAAA,EAAI,IAAA,CAAA,kBAC5C,CAAA,MAAA;AACC,MAAA,MAAMM,YAAAA,uBAAmBC,GAAAA,CAAI;AAAC,QAAA,SAAA;AAAW,QAAA,UAAA;AAAY,QAAA,SAAA;AAAW,QAAA;AAAY,OAAA,CAAA;AAC5E,MAAA,OAAO,CAACC,KAAKb,MAAAA,KAAAA;AACX,QAAA,IAAIW,YAAAA,CAAa7B,GAAAA,CAAI+B,GAAAA,CAAAA,EAAM;AACzB,UAAA,OAAOxD,MAAAA;AACT,QAAA;AACA,QAAA,IAAI2C,MAAAA,IAASA,kBAAiBnE,eAAAA,EAAM;AAClC,UAAA,OAAOmE,MAAAA,CAAMxB,IAAAA;AACf,QAAA;AACA,QAAA,OAAOwB,MAAAA;AACT,MAAA,CAAA;AACF,IAAA,CAAA,GAAA,EACA,IAAA,CAAK/E,MAAAA,GAAS,CAAA,GAAIoC,MAAAA,CAAAA;AAEtB,EAAA;EAEA,MAAcyD,eAAAA,CACZC,SACA7C,IAAAA,EACe;AACf,IAAA,MAAM/B,MAAAA,GAAS,IAAA,CAAKsD,YAAAA,CAAavB,IAAAA,CAAAA;AACjC,IAAA,MAAM8C,OAAAA,GAAU,GAAG7E,MAAAA,CAAAA,EAAS,MAAM,IAAA,CAAK4D,aAAAA,CAAcgB,OAAAA,CAAQ3D,KAAK,CAAA,CAAA,CAAA;AAElE,IAAA,MAAM,IAAA,CAAK5B,OAAAA,CAAQyF,IAAAA,CAAK,OAAA,EAAS;AAC/BD,MAAAA,OAAAA;MACAE,KAAAA,EAAO,IAAA,CAAKvB,cAAczB,IAAAA,CAAAA;MAC1BiD,MAAAA,EAAQ;AAACJ,QAAAA,OAAAA;AAAS7C,QAAAA;;KACpB,CAAA;AAEA,IAAA,IAAA,CAAKnD,OAAOiG,OAAAA,CAAAA;AACd,EAAA;EAEA,MAAcI,iBAAAA,CACZL,SACA7C,IAAAA,EACe;AACf,IAAA,MAAM/B,MAAAA,GAAS,IAAA,CAAKsD,YAAAA,CAAavB,IAAAA,CAAAA;AAEjC,IAAA,MAAM8C,OAAAA,GAAU,GAAG7E,MAAAA,CAAAA,EAAS,MAAM,IAAA,CAAK4D,aAAAA,CAAcgB,OAAAA,CAAAA,CAAAA,CAAAA;AAErD,IAAA,MAAM,IAAA,CAAKvF,OAAAA,CAAQyF,IAAAA,CAAK,SAAA,EAAW;AACjCD,MAAAA,OAAAA;MACAE,KAAAA,EAAO,IAAA,CAAKvB,cAAczB,IAAAA,CAAAA;MAC1BiD,MAAAA,EAAQ;AAACJ,QAAAA,OAAAA;AAAS7C,QAAAA;;KACpB,CAAA;AAEA,IAAA,IAAA,CAAKnD,OAAOiG,OAAAA,CAAAA;AACd,EAAA;EAEA,MAAcK,eAAAA,CACZN,SACA7C,IAAAA,EACe;AACf,IAAA,MAAM/B,MAAAA,GAAS,IAAA,CAAKsD,YAAAA,CAAavB,IAAAA,CAAAA;AACjC,IAAA,MAAM8C,OAAAA,GAAU,GAAG7E,MAAAA,CAAAA,EAAS,MAAM,IAAA,CAAK4D,aAAAA,CAAcgB,OAAAA,CAAAA,CAAAA,CAAAA;AAErD,IAAA,MAAM,IAAA,CAAKvF,OAAAA,CAAQyF,IAAAA,CAAK,OAAA,EAAS;AAC/BD,MAAAA,OAAAA;MACAE,KAAAA,EAAO,IAAA,CAAKvB,cAAczB,IAAAA,CAAAA;MAC1BiD,MAAAA,EAAQ;AAACJ,QAAAA,OAAAA;AAAS7C,QAAAA;;KACpB,CAAA;AAEA,IAAA,IAAA,CAAKnD,OAAOiG,OAAAA,CAAAA;AACd,EAAA;EAEA,MAAcM,gBAAAA,CACZP,SACA7C,IAAAA,EACe;AACf,IAAA,MAAM/B,MAAAA,GAAS,IAAA,CAAKsD,YAAAA,CAAavB,IAAAA,CAAAA;AACjC,IAAA,MAAM8C,OAAAA,GAAU,CAAA,EAAG7E,MAAAA,CAAAA,EAAS,MAAM,IAAA,CAAK4D,aAAAA,CAAcgB,OAAAA,CAAQQ,KAAAA,IAASR,OAAAA,CAAQS,MAAM,CAAA,CAAA,CAAA;AACpF,IAAA,MAAM,IAAA,CAAKhG,OAAAA,CAAQyF,IAAAA,CAAK,QAAA,EAAU;AAChCD,MAAAA,OAAAA;MACAE,KAAAA,EAAO,IAAA,CAAKvB,cAAczB,IAAAA,CAAAA;MAC1BiD,MAAAA,EAAQ;AAACJ,QAAAA,OAAAA;AAAS7C,QAAAA;;KACpB,CAAA;AACF,EAAA;AACF;AAEA,SAASQ,mBAAmB+C,KAAAA,EAAoC;AAC9D,EAAA,OAAO,CAACvD,SACNuD,KAAAA,CAAMC,QAAAA,CAASxD,KAAKM,IAAI,CAAA,IACxBmD,kBAAAA,CAAQzD,IAAAA,CAAK0D,OAAAA,EAAS;AAAC,IAAA;KAAa,KAAA,CAAA;AACxC;AAJSlD,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA","file":"trajectory.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Middleware, RunContext, RunContextCallbacks, RunInstance } from \"@/context.js\";\nimport { Callback, Emitter, EventMeta } from \"@/emitter/emitter.js\";\nimport { FrameworkError } from \"@/errors.js\";\nimport { Logger } from \"@/logger/logger.js\";\nimport { BaseAgent } from \"@/agents/base.js\";\nimport type { AnyConstructable } from \"@/internals/types.js\";\nimport { capitalize } from \"remeda\";\nimport { ChatModel } from \"@/backend/chat.js\";\nimport { Tool } from \"@/tools/base.js\";\nimport { Requirement } from \"@/agents/requirement/requirements/requirement.js\";\nimport type { InferCallbackValue } from \"@/emitter/types.js\";\nimport { Serializer } from \"@/serializer/serializer.js\";\nimport { isPrimitive } from \"@/internals/helpers/guards.js\";\nimport { getProp } from \"@/internals/helpers/object.js\";\n\n/**\n * Information about how deep the given entity is in the execution tree.\n */\nexport interface TraceLevel {\n /** Relative depth to the included (observed) elements */\n relative: number;\n /** Absolute depth from the root */\n absolute: number;\n}\n\n/**\n * Input for custom formatter function\n */\nexport interface GlobalTrajectoryMiddlewareFormatterInput {\n prefix: string;\n className: string;\n eventName: string;\n instanceName: string | null;\n}\n\nexport interface GlobalTrajectoryMiddlewareCallbacks {\n start: Callback<{\n message: string;\n level: TraceLevel;\n origin: [InferCallbackValue<RunContextCallbacks[\"start\"]>, EventMeta];\n }>;\n success: Callback<{\n message: string;\n level: TraceLevel;\n origin: [InferCallbackValue<RunContextCallbacks[\"success\"]>, EventMeta];\n }>;\n error: Callback<{\n message: string;\n level: TraceLevel;\n origin: [InferCallbackValue<RunContextCallbacks[\"error\"]>, EventMeta];\n }>;\n finish: Callback<{\n message: string;\n level: TraceLevel;\n origin: [InferCallbackValue<RunContextCallbacks[\"finish\"]>, EventMeta];\n }>;\n}\n\ntype OutputTargetFn = (message: string) => void;\ntype OutputTarget = Logger | OutputTargetFn;\n\nexport interface GlobalTrajectoryMiddlewareOptions {\n /** Specify output target: 'console', Logger instance, custom function, or null to disable */\n target?: OutputTarget;\n /** List of classes to include in the trajectory */\n included?: AnyConstructable[];\n /** List of classes to exclude from the trajectory */\n excluded?: AnyConstructable[];\n /** Use pretty formatting for the trajectory */\n pretty?: boolean;\n /** Customize how instances of individual classes should be printed */\n prefixByType?: Map<AnyConstructable, string>;\n /** Enable/Disable the logging */\n enabled?: boolean;\n /** Whether to observe trajectories of nested run contexts */\n matchNested?: boolean;\n /** Defines a priority for registered events */\n emitterPriority?: number;\n /** Custom formatter function */\n formatter?: (input: GlobalTrajectoryMiddlewareFormatterInput) => string;\n}\n\n/**\n * Middleware for capturing and logging execution flow of agents, tools, and models.\n * Provides hierarchical visualization with indentation to show the call stack.\n */\nexport class GlobalTrajectoryMiddleware<T extends RunInstance = any> extends Middleware<T> {\n protected enabled: boolean;\n protected included: AnyConstructable[];\n protected excluded: AnyConstructable[];\n protected cleanups: (() => void)[] = [];\n protected target: (message: string) => void;\n protected ctx: RunContext<T> | null = null;\n protected pretty: boolean;\n protected traceLevel = new Map<string, TraceLevel>();\n protected prefixByType: Map<any, string>;\n protected matchNested: boolean;\n protected emitterPriority: number;\n protected formatter: (input: GlobalTrajectoryMiddlewareFormatterInput) => string;\n public readonly emitter: Emitter<GlobalTrajectoryMiddlewareCallbacks>;\n\n constructor(options: GlobalTrajectoryMiddlewareOptions = {}) {\n super();\n\n this.enabled = options.enabled ?? true;\n this.included = options.included ?? [];\n this.excluded = options.excluded ?? [];\n this.target = this.createTarget(options.target);\n this.pretty = options.pretty ?? false;\n this.matchNested = options.matchNested ?? true;\n this.emitterPriority = options.emitterPriority ?? -1; // run later\n\n // Default prefixes\n this.prefixByType = new Map([\n [BaseAgent, \"🤖 \"],\n [ChatModel, \"💬 \"],\n [Tool, \"🛠️ \"],\n [Requirement, \"🔎 \"],\n ...((options.prefixByType ? Array.from(options.prefixByType.entries()) : []) as any),\n ]);\n\n this.formatter =\n options.formatter ??\n ((x) => `${x.prefix}${x.className}[${x.instanceName || x.className}][${x.eventName}]`);\n\n this.emitter = Emitter.root.child<GlobalTrajectoryMiddlewareCallbacks>({\n namespace: [\"middleware\", \"globalTrajectory\"],\n });\n }\n\n /**\n * Bind the middleware to a run context\n */\n bind(ctx: RunContext<T>): void {\n // Cleanup previous bindings\n while (this.cleanups.length > 0) {\n this.cleanups.pop()!();\n }\n\n this.traceLevel.clear();\n this.traceLevel.set(ctx.runId, { relative: 0, absolute: 0 });\n this.ctx = ctx;\n\n this.bindEmitter(ctx.emitter);\n }\n\n private createTarget(input?: OutputTarget): OutputTargetFn {\n if (input === null || input === undefined) {\n // eslint-disable-next-line no-console\n return (msg) => console.log(msg);\n } else if (input instanceof Logger) {\n return (msg) => input.debug(msg);\n } else {\n return input;\n }\n }\n\n private bindEmitter(emitter: Emitter<any>): void {\n // Track all events for trace ID logging\n this.cleanups.push(\n emitter.match(\"*.*\", (_, event) => this.logTraceId(event), {\n matchNested: true,\n }),\n );\n\n // Handle top-level events\n const handleTopLevelEvent = async (data: any, meta: EventMeta) => {\n if (!(meta.creator instanceof RunContext)) {\n return;\n }\n if (!meta.trace) {\n return;\n }\n\n this.logTraceId(meta);\n if (!this.isAllowed(meta)) {\n return;\n }\n if (!this.enabled) {\n return;\n }\n\n const eventName = capitalize(meta.name) as \"Start\" | \"Success\" | \"Error\" | \"Finish\";\n await this[`onInternal${eventName}` as const].call(this, data, meta);\n };\n\n this.cleanups.push(\n emitter.match(\n matchInternalEvent([\"start\", \"success\", \"error\", \"finish\"]),\n handleTopLevelEvent,\n {\n matchNested: false,\n isBlocking: true,\n priority: this.emitterPriority,\n },\n ),\n );\n\n // Handle nested events if enabled\n if (this.matchNested) {\n const handleNestedEvent = async (data: any, meta: EventMeta) => {\n if (!(meta.creator instanceof RunContext)) {\n return;\n }\n if (meta.creator.emitter !== emitter) {\n await handleTopLevelEvent(data, meta);\n this.bindEmitter(meta.creator.emitter);\n }\n };\n\n this.cleanups.push(\n emitter.match(matchInternalEvent([\"start\"]), handleNestedEvent, {\n matchNested: true,\n isBlocking: true,\n priority: this.emitterPriority,\n }),\n );\n }\n }\n\n private logTraceId(meta: EventMeta): void {\n if (!meta.trace?.runId) {\n return;\n }\n if (this.traceLevel.has(meta.trace.runId)) {\n return;\n }\n if (meta.trace.parentRunId === meta.trace.runId) {\n return;\n }\n\n if (meta.trace.parentRunId) {\n const allowed = this.isAllowed(meta);\n const parentTrace = this.traceLevel.get(meta.trace.parentRunId) ?? {\n relative: 0,\n absolute: 0,\n };\n this.traceLevel.set(meta.trace.runId, {\n relative: parentTrace.relative + (allowed ? 1 : 0),\n absolute: parentTrace.absolute + 1,\n });\n }\n }\n\n private isAllowed(meta: EventMeta): boolean {\n let target: any = meta.creator;\n if (target instanceof RunContext) {\n target = target.instance;\n }\n\n for (const excluded of this.excluded) {\n if (target instanceof excluded) {\n return false;\n }\n }\n\n if (this.included.length === 0) {\n return true;\n }\n\n return this.included.some((included) => target instanceof included);\n }\n\n private extractName(meta: EventMeta): string {\n let target: any = meta.creator;\n if (target instanceof RunContext) {\n target = target.instance;\n }\n\n const className = target.constructor.name;\n let targetName: string | null = null;\n\n if (target instanceof BaseAgent && target.meta?.name) {\n targetName = target.meta.name;\n } else if (\"name\" in target && typeof target.name === \"string\") {\n targetName = target.name;\n }\n\n let prefix = \"\";\n for (const [type, typePrefix] of this.prefixByType.entries()) {\n if (target instanceof type) {\n prefix = typePrefix;\n break;\n }\n }\n\n const input: GlobalTrajectoryMiddlewareFormatterInput = {\n prefix,\n className,\n instanceName: targetName,\n eventName: meta.name,\n };\n\n return this.formatter(input);\n }\n\n private formatPrefix(meta: EventMeta): string {\n if (!meta.trace) {\n return \"\";\n }\n\n const indent = this.getTraceLevel(meta, \"self\").relative;\n const indentParent = this.getTraceLevel(meta, \"parent\").relative;\n const indentDiff = indent - indentParent;\n\n let prefix = \"\";\n prefix += \" \".repeat(indentParent * 2);\n\n if (meta.name !== \"start\" && indent) {\n prefix += \"<\";\n }\n\n prefix += \"--\".repeat(indentDiff);\n\n if (meta.name === \"start\" && prefix && indent) {\n prefix += \">\";\n }\n\n if (prefix) {\n prefix = `${prefix} `;\n }\n\n const name = this.extractName(meta);\n return `${prefix}${name}: `;\n }\n\n private getTraceLevel(meta: EventMeta, type: \"self\" | \"parent\" = \"self\"): TraceLevel {\n if (!meta.trace) {\n return { relative: 0, absolute: 0 };\n }\n\n const runId = type === \"parent\" ? meta.trace.parentRunId || \"\" : meta.trace.runId;\n return this.traceLevel.get(runId) ?? { relative: 0, absolute: 0 };\n }\n\n private async formatPayload(value: any): Promise<string> {\n if (isPrimitive(value)) {\n return String(value);\n }\n\n if (value instanceof FrameworkError) {\n return value.explain();\n }\n\n const serialized = await Serializer.serialize(value);\n return JSON.stringify(\n await Serializer.deserialize(serialized, [], true),\n (() => {\n const excludedKeys = new Set([\"emitter\", \"cleanups\", \"creator\", \"listeners\"]);\n return (key, value) => {\n if (excludedKeys.has(key)) {\n return undefined;\n }\n if (value && value instanceof Tool) {\n return value.name;\n }\n return value;\n };\n })(),\n this.pretty ? 2 : undefined,\n );\n }\n\n private async onInternalStart(\n payload: InferCallbackValue<RunContextCallbacks[\"start\"]>,\n meta: EventMeta,\n ): Promise<void> {\n const prefix = this.formatPrefix(meta);\n const message = `${prefix}${await this.formatPayload(payload.input)}`;\n\n await this.emitter.emit(\"start\", {\n message,\n level: this.getTraceLevel(meta),\n origin: [payload, meta],\n });\n\n this.target(message);\n }\n\n private async onInternalSuccess(\n payload: InferCallbackValue<RunContextCallbacks[\"success\"]>,\n meta: EventMeta,\n ): Promise<void> {\n const prefix = this.formatPrefix(meta);\n // TODO: change to payload.output once available\n const message = `${prefix}${await this.formatPayload(payload)}`;\n\n await this.emitter.emit(\"success\", {\n message,\n level: this.getTraceLevel(meta),\n origin: [payload, meta],\n });\n\n this.target(message);\n }\n\n private async onInternalError(\n payload: InferCallbackValue<RunContextCallbacks[\"error\"]>,\n meta: EventMeta,\n ): Promise<void> {\n const prefix = this.formatPrefix(meta);\n const message = `${prefix}${await this.formatPayload(payload)}`;\n\n await this.emitter.emit(\"error\", {\n message,\n level: this.getTraceLevel(meta),\n origin: [payload, meta],\n });\n\n this.target(message);\n }\n\n private async onInternalFinish(\n payload: InferCallbackValue<RunContextCallbacks[\"finish\"]>,\n meta: EventMeta,\n ): Promise<void> {\n const prefix = this.formatPrefix(meta);\n const message = `${prefix}${await this.formatPayload(payload.error || payload.output)}`;\n await this.emitter.emit(\"finish\", {\n message,\n level: this.getTraceLevel(meta),\n origin: [payload, meta],\n });\n }\n}\n\nfunction matchInternalEvent(names: (keyof RunContextCallbacks)[]) {\n return (meta: EventMeta): boolean =>\n names.includes(meta.name as keyof RunContextCallbacks) &&\n getProp(meta.context, [\"internal\"], false);\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { RunContextCallbacks, RunInstance, Middleware, RunContext } from '../context.cjs';
2
- import { C as Callback, I as InferCallbackValue, b as EventMeta, E as Emitter } from '../emitter-UkIkNrek.cjs';
1
+ import { RunInstance, Middleware, RunContext, RunContextCallbacks } from '../context.cjs';
2
+ import { E as Emitter, C as Callback, I as InferCallbackValue, b as EventMeta } from '../emitter-D4OcelZ9.cjs';
3
3
  import { Logger } from '../logger/logger.cjs';
4
4
  import { AnyConstructable } from '../internals/types.cjs';
5
5
  import '../internals/serializable.cjs';
@@ -1,5 +1,5 @@
1
- import { RunContextCallbacks, RunInstance, Middleware, RunContext } from '../context.js';
2
- import { C as Callback, I as InferCallbackValue, b as EventMeta, E as Emitter } from '../emitter-CL56qab4.js';
1
+ import { RunInstance, Middleware, RunContext, RunContextCallbacks } from '../context.js';
2
+ import { E as Emitter, C as Callback, I as InferCallbackValue, b as EventMeta } from '../emitter-kHxkUxco.js';
3
3
  import { Logger } from '../logger/logger.js';
4
4
  import { AnyConstructable } from '../internals/types.js';
5
5
  import '../internals/serializable.js';