beeai-framework 0.1.21 → 0.1.23

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 (335) hide show
  1. package/dist/adapters/a2a/agents/agent.d.cts +6 -10
  2. package/dist/adapters/a2a/agents/agent.d.ts +6 -10
  3. package/dist/adapters/a2a/agents/events.d.cts +1 -1
  4. package/dist/adapters/a2a/agents/events.d.ts +1 -1
  5. package/dist/adapters/a2a/agents/types.d.cts +2 -2
  6. package/dist/adapters/a2a/agents/types.d.ts +2 -2
  7. package/dist/adapters/a2a/serve/agent_executor.d.cts +3 -3
  8. package/dist/adapters/a2a/serve/agent_executor.d.ts +3 -3
  9. package/dist/adapters/a2a/serve/server.d.cts +2 -2
  10. package/dist/adapters/a2a/serve/server.d.ts +2 -2
  11. package/dist/adapters/acp/agents/agent.d.cts +6 -10
  12. package/dist/adapters/acp/agents/agent.d.ts +6 -10
  13. package/dist/adapters/acp/agents/events.d.cts +1 -1
  14. package/dist/adapters/acp/agents/events.d.ts +1 -1
  15. package/dist/adapters/agentstack/agents/agent.d.cts +8 -6
  16. package/dist/adapters/agentstack/agents/agent.d.ts +8 -6
  17. package/dist/adapters/agentstack/agents/events.d.cts +1 -1
  18. package/dist/adapters/agentstack/agents/events.d.ts +1 -1
  19. package/dist/adapters/amazon-bedrock/backend/chat.d.cts +2 -2
  20. package/dist/adapters/amazon-bedrock/backend/chat.d.ts +2 -2
  21. package/dist/adapters/amazon-bedrock/backend/embedding.d.cts +2 -2
  22. package/dist/adapters/amazon-bedrock/backend/embedding.d.ts +2 -2
  23. package/dist/adapters/anthropic/backend/chat.d.cts +2 -2
  24. package/dist/adapters/anthropic/backend/chat.d.ts +2 -2
  25. package/dist/adapters/anthropic/backend/embedding.d.cts +2 -2
  26. package/dist/adapters/anthropic/backend/embedding.d.ts +2 -2
  27. package/dist/adapters/azure-openai/backend/chat.d.cts +2 -2
  28. package/dist/adapters/azure-openai/backend/chat.d.ts +2 -2
  29. package/dist/adapters/azure-openai/backend/embedding.d.cts +2 -2
  30. package/dist/adapters/azure-openai/backend/embedding.d.ts +2 -2
  31. package/dist/adapters/dummy/backend/chat.d.cts +2 -2
  32. package/dist/adapters/dummy/backend/chat.d.ts +2 -2
  33. package/dist/adapters/dummy/backend/embedding.d.cts +2 -2
  34. package/dist/adapters/dummy/backend/embedding.d.ts +2 -2
  35. package/dist/adapters/google-vertex/backend/chat.d.cts +2 -2
  36. package/dist/adapters/google-vertex/backend/chat.d.ts +2 -2
  37. package/dist/adapters/google-vertex/backend/embedding.d.cts +2 -2
  38. package/dist/adapters/google-vertex/backend/embedding.d.ts +2 -2
  39. package/dist/adapters/groq/backend/chat.d.cts +2 -2
  40. package/dist/adapters/groq/backend/chat.d.ts +2 -2
  41. package/dist/adapters/groq/backend/embedding.d.cts +2 -2
  42. package/dist/adapters/groq/backend/embedding.d.ts +2 -2
  43. package/dist/adapters/langchain/backend/chat.d.cts +2 -2
  44. package/dist/adapters/langchain/backend/chat.d.ts +2 -2
  45. package/dist/adapters/langchain/backend/embedding.d.cts +2 -2
  46. package/dist/adapters/langchain/backend/embedding.d.ts +2 -2
  47. package/dist/adapters/langchain/tools.d.cts +1 -1
  48. package/dist/adapters/langchain/tools.d.ts +1 -1
  49. package/dist/adapters/ollama/backend/chat.cjs +1 -2
  50. package/dist/adapters/ollama/backend/chat.cjs.map +1 -1
  51. package/dist/adapters/ollama/backend/chat.d.cts +2 -3
  52. package/dist/adapters/ollama/backend/chat.d.ts +2 -3
  53. package/dist/adapters/ollama/backend/chat.js +1 -2
  54. package/dist/adapters/ollama/backend/chat.js.map +1 -1
  55. package/dist/adapters/ollama/backend/embedding.d.cts +2 -2
  56. package/dist/adapters/ollama/backend/embedding.d.ts +2 -2
  57. package/dist/adapters/openai/backend/chat.d.cts +2 -2
  58. package/dist/adapters/openai/backend/chat.d.ts +2 -2
  59. package/dist/adapters/openai/backend/embedding.d.cts +2 -2
  60. package/dist/adapters/openai/backend/embedding.d.ts +2 -2
  61. package/dist/adapters/vercel/backend/chat.cjs +77 -17
  62. package/dist/adapters/vercel/backend/chat.cjs.map +1 -1
  63. package/dist/adapters/vercel/backend/chat.d.cts +2 -2
  64. package/dist/adapters/vercel/backend/chat.d.ts +2 -2
  65. package/dist/adapters/vercel/backend/chat.js +77 -17
  66. package/dist/adapters/vercel/backend/chat.js.map +1 -1
  67. package/dist/adapters/vercel/backend/embedding.d.cts +2 -2
  68. package/dist/adapters/vercel/backend/embedding.d.ts +2 -2
  69. package/dist/adapters/vercel/backend/utils.cjs +32 -0
  70. package/dist/adapters/vercel/backend/utils.cjs.map +1 -1
  71. package/dist/adapters/vercel/backend/utils.d.cts +6 -4
  72. package/dist/adapters/vercel/backend/utils.d.ts +6 -4
  73. package/dist/adapters/vercel/backend/utils.js +31 -1
  74. package/dist/adapters/vercel/backend/utils.js.map +1 -1
  75. package/dist/adapters/watsonx/backend/chat.cjs +7 -8
  76. package/dist/adapters/watsonx/backend/chat.cjs.map +1 -1
  77. package/dist/adapters/watsonx/backend/chat.d.cts +4 -4
  78. package/dist/adapters/watsonx/backend/chat.d.ts +4 -4
  79. package/dist/adapters/watsonx/backend/chat.js +7 -8
  80. package/dist/adapters/watsonx/backend/chat.js.map +1 -1
  81. package/dist/adapters/watsonx/backend/embedding.d.cts +2 -2
  82. package/dist/adapters/watsonx/backend/embedding.d.ts +2 -2
  83. package/dist/adapters/xai/backend/chat.d.cts +2 -2
  84. package/dist/adapters/xai/backend/chat.d.ts +2 -2
  85. package/dist/{agent-DvvVGvLr.d.cts → agent-BVuc9Nfn.d.cts} +5 -4
  86. package/dist/{agent-CHebzsQB.d.ts → agent-Cuy8Q4gw.d.ts} +5 -4
  87. package/dist/agents/base.cjs +5 -2
  88. package/dist/agents/base.cjs.map +1 -1
  89. package/dist/agents/base.d.cts +2 -2
  90. package/dist/agents/base.d.ts +2 -2
  91. package/dist/agents/base.js +5 -2
  92. package/dist/agents/base.js.map +1 -1
  93. package/dist/agents/experimental/replan/agent.d.cts +3 -3
  94. package/dist/agents/experimental/replan/agent.d.ts +3 -3
  95. package/dist/agents/experimental/replan/prompts.d.cts +1 -1
  96. package/dist/agents/experimental/replan/prompts.d.ts +1 -1
  97. package/dist/agents/experimental/streamlit/agent.d.cts +8 -12
  98. package/dist/agents/experimental/streamlit/agent.d.ts +8 -12
  99. package/dist/agents/react/agent.d.cts +4 -4
  100. package/dist/agents/react/agent.d.ts +4 -4
  101. package/dist/agents/react/runners/base.d.cts +4 -4
  102. package/dist/agents/react/runners/base.d.ts +4 -4
  103. package/dist/agents/react/runners/deep-think/runner.d.cts +4 -4
  104. package/dist/agents/react/runners/deep-think/runner.d.ts +4 -4
  105. package/dist/agents/react/runners/default/runner.d.cts +5 -5
  106. package/dist/agents/react/runners/default/runner.d.ts +5 -5
  107. package/dist/agents/react/runners/granite/runner.d.cts +4 -4
  108. package/dist/agents/react/runners/granite/runner.d.ts +4 -4
  109. package/dist/agents/react/types.d.cts +2 -2
  110. package/dist/agents/react/types.d.ts +2 -2
  111. package/dist/agents/requirement/agent.cjs +162 -0
  112. package/dist/agents/requirement/agent.cjs.map +1 -0
  113. package/dist/agents/requirement/agent.d.cts +29 -0
  114. package/dist/agents/requirement/agent.d.ts +29 -0
  115. package/dist/agents/requirement/agent.js +160 -0
  116. package/dist/agents/requirement/agent.js.map +1 -0
  117. package/dist/agents/requirement/prompts.cjs +95 -0
  118. package/dist/agents/requirement/prompts.cjs.map +1 -0
  119. package/dist/agents/requirement/prompts.d.cts +107 -0
  120. package/dist/agents/requirement/prompts.d.ts +107 -0
  121. package/dist/agents/requirement/prompts.js +90 -0
  122. package/dist/agents/requirement/prompts.js.map +1 -0
  123. package/dist/agents/requirement/requirements/conditional.cjs +190 -0
  124. package/dist/agents/requirement/requirements/conditional.cjs.map +1 -0
  125. package/dist/agents/requirement/requirements/conditional.d.cts +71 -0
  126. package/dist/agents/requirement/requirements/conditional.d.ts +71 -0
  127. package/dist/agents/requirement/requirements/conditional.js +188 -0
  128. package/dist/agents/requirement/requirements/conditional.js.map +1 -0
  129. package/dist/agents/requirement/requirements/requirement.cjs +107 -0
  130. package/dist/agents/requirement/requirements/requirement.cjs.map +1 -0
  131. package/dist/agents/requirement/requirements/requirement.d.cts +59 -0
  132. package/dist/agents/requirement/requirements/requirement.d.ts +59 -0
  133. package/dist/agents/requirement/requirements/requirement.js +104 -0
  134. package/dist/agents/requirement/requirements/requirement.js.map +1 -0
  135. package/dist/agents/requirement/requirements/utils.cjs +74 -0
  136. package/dist/agents/requirement/requirements/utils.cjs.map +1 -0
  137. package/dist/agents/requirement/requirements/utils.d.cts +40 -0
  138. package/dist/agents/requirement/requirements/utils.d.ts +40 -0
  139. package/dist/agents/requirement/requirements/utils.js +69 -0
  140. package/dist/agents/requirement/requirements/utils.js.map +1 -0
  141. package/dist/agents/requirement/runner.cjs +268 -0
  142. package/dist/agents/requirement/runner.cjs.map +1 -0
  143. package/dist/agents/requirement/runner.d.cts +115 -0
  144. package/dist/agents/requirement/runner.d.ts +115 -0
  145. package/dist/agents/requirement/runner.js +266 -0
  146. package/dist/agents/requirement/runner.js.map +1 -0
  147. package/dist/agents/requirement/types.cjs +40 -0
  148. package/dist/agents/requirement/types.cjs.map +1 -0
  149. package/dist/agents/requirement/types.d.cts +24 -0
  150. package/dist/agents/requirement/types.d.ts +24 -0
  151. package/dist/agents/requirement/types.js +35 -0
  152. package/dist/agents/requirement/types.js.map +1 -0
  153. package/dist/agents/requirement/utils/llm.cjs +202 -0
  154. package/dist/agents/requirement/utils/llm.cjs.map +1 -0
  155. package/dist/agents/requirement/utils/llm.d.cts +50 -0
  156. package/dist/agents/requirement/utils/llm.d.ts +50 -0
  157. package/dist/agents/requirement/utils/llm.js +199 -0
  158. package/dist/agents/requirement/utils/llm.js.map +1 -0
  159. package/dist/agents/requirement/utils/tool.cjs +95 -0
  160. package/dist/agents/requirement/utils/tool.cjs.map +1 -0
  161. package/dist/agents/requirement/utils/tool.d.cts +24 -0
  162. package/dist/agents/requirement/utils/tool.d.ts +24 -0
  163. package/dist/agents/requirement/utils/tool.js +92 -0
  164. package/dist/agents/requirement/utils/tool.js.map +1 -0
  165. package/dist/agents/requirement/utils/toolCallChecker.cjs +61 -0
  166. package/dist/agents/requirement/utils/toolCallChecker.cjs.map +1 -0
  167. package/dist/agents/requirement/utils/toolCallChecker.d.cts +28 -0
  168. package/dist/agents/requirement/utils/toolCallChecker.d.ts +28 -0
  169. package/dist/agents/requirement/utils/toolCallChecker.js +59 -0
  170. package/dist/agents/requirement/utils/toolCallChecker.js.map +1 -0
  171. package/dist/agents/toolCalling/agent.cjs +4 -1
  172. package/dist/agents/toolCalling/agent.cjs.map +1 -1
  173. package/dist/agents/toolCalling/agent.d.cts +11 -12
  174. package/dist/agents/toolCalling/agent.d.ts +11 -12
  175. package/dist/agents/toolCalling/agent.js +5 -2
  176. package/dist/agents/toolCalling/agent.js.map +1 -1
  177. package/dist/agents/toolCalling/types.d.cts +1 -1
  178. package/dist/agents/toolCalling/types.d.ts +1 -1
  179. package/dist/agents/types.d.cts +2 -2
  180. package/dist/agents/types.d.ts +2 -2
  181. package/dist/backend/backend.d.cts +2 -2
  182. package/dist/backend/backend.d.ts +2 -2
  183. package/dist/backend/chat.cjs +122 -4
  184. package/dist/backend/chat.cjs.map +1 -1
  185. package/dist/backend/chat.d.cts +3 -3
  186. package/dist/backend/chat.d.ts +3 -3
  187. package/dist/backend/chat.js +123 -5
  188. package/dist/backend/chat.js.map +1 -1
  189. package/dist/backend/core.d.cts +3 -3
  190. package/dist/backend/core.d.ts +3 -3
  191. package/dist/backend/embedding.d.cts +2 -2
  192. package/dist/backend/embedding.d.ts +2 -2
  193. package/dist/backend/message.cjs +20 -13
  194. package/dist/backend/message.cjs.map +1 -1
  195. package/dist/backend/message.d.cts +7 -3
  196. package/dist/backend/message.d.ts +7 -3
  197. package/dist/backend/message.js +20 -13
  198. package/dist/backend/message.js.map +1 -1
  199. package/dist/backend/utils.d.cts +2 -2
  200. package/dist/backend/utils.d.ts +2 -2
  201. package/dist/{base-BQgDlcGa.d.ts → base-CyFx7BRL.d.ts} +5 -3
  202. package/dist/{base-CwcxwybB.d.cts → base-XfWeXQ-S.d.cts} +5 -3
  203. package/dist/{chat-CRb3vUVg.d.cts → chat-BOb9n7AJ.d.cts} +7 -8
  204. package/dist/{chat-C0s-o6ll.d.ts → chat-DrqwUgD8.d.ts} +7 -8
  205. package/dist/context.cjs +22 -5
  206. package/dist/context.cjs.map +1 -1
  207. package/dist/context.d.cts +19 -6
  208. package/dist/context.d.ts +19 -6
  209. package/dist/context.js +23 -7
  210. package/dist/context.js.map +1 -1
  211. package/dist/emitter/emitter.cjs +21 -14
  212. package/dist/emitter/emitter.cjs.map +1 -1
  213. package/dist/emitter/emitter.d.cts +1 -1
  214. package/dist/emitter/emitter.d.ts +1 -1
  215. package/dist/emitter/emitter.js +21 -14
  216. package/dist/emitter/emitter.js.map +1 -1
  217. package/dist/emitter/types.d.cts +1 -1
  218. package/dist/emitter/types.d.ts +1 -1
  219. package/dist/{emitter-CZFbzlUi.d.ts → emitter-36-9MnvA.d.ts} +4 -3
  220. package/dist/{emitter-DpqUYjXH.d.cts → emitter-jN55XZZq.d.cts} +4 -3
  221. package/dist/index.d.cts +5 -5
  222. package/dist/index.d.ts +5 -5
  223. package/dist/internals/fetcher.d.cts +1 -1
  224. package/dist/internals/fetcher.d.ts +1 -1
  225. package/dist/internals/helpers/prototype.cjs +5 -0
  226. package/dist/internals/helpers/prototype.cjs.map +1 -1
  227. package/dist/internals/helpers/prototype.d.cts +2 -1
  228. package/dist/internals/helpers/prototype.d.ts +2 -1
  229. package/dist/internals/helpers/prototype.js +5 -1
  230. package/dist/internals/helpers/prototype.js.map +1 -1
  231. package/dist/internals/types.cjs.map +1 -1
  232. package/dist/internals/types.d.cts +1 -1
  233. package/dist/internals/types.d.ts +1 -1
  234. package/dist/internals/types.js.map +1 -1
  235. package/dist/memory/summarizeMemory.d.cts +2 -2
  236. package/dist/memory/summarizeMemory.d.ts +2 -2
  237. package/dist/middleware/streamToolCall.cjs +132 -0
  238. package/dist/middleware/streamToolCall.cjs.map +1 -0
  239. package/dist/middleware/streamToolCall.d.cts +94 -0
  240. package/dist/middleware/streamToolCall.d.ts +94 -0
  241. package/dist/middleware/streamToolCall.js +130 -0
  242. package/dist/middleware/streamToolCall.js.map +1 -0
  243. package/dist/middleware/trajectory.cjs +331 -0
  244. package/dist/middleware/trajectory.cjs.map +1 -0
  245. package/dist/middleware/trajectory.d.cts +115 -0
  246. package/dist/middleware/trajectory.d.ts +115 -0
  247. package/dist/middleware/trajectory.js +329 -0
  248. package/dist/middleware/trajectory.js.map +1 -0
  249. package/dist/parsers/linePrefix.d.cts +1 -1
  250. package/dist/parsers/linePrefix.d.ts +1 -1
  251. package/dist/serializer/serializer.cjs +5 -4
  252. package/dist/serializer/serializer.cjs.map +1 -1
  253. package/dist/serializer/serializer.d.cts +1 -1
  254. package/dist/serializer/serializer.d.ts +1 -1
  255. package/dist/serializer/serializer.js +5 -4
  256. package/dist/serializer/serializer.js.map +1 -1
  257. package/dist/serializer/utils.cjs +3 -0
  258. package/dist/serializer/utils.cjs.map +1 -1
  259. package/dist/serializer/utils.d.cts +1 -1
  260. package/dist/serializer/utils.d.ts +1 -1
  261. package/dist/serializer/utils.js +3 -0
  262. package/dist/serializer/utils.js.map +1 -1
  263. package/dist/{serializer-CQxucveV.d.ts → serializer-53t8gGQa.d.ts} +3 -2
  264. package/dist/{serializer-BKn50Vnx.d.cts → serializer-c51B2z6d.d.cts} +3 -2
  265. package/dist/template.cjs +20 -0
  266. package/dist/template.cjs.map +1 -1
  267. package/dist/template.d.cts +1 -0
  268. package/dist/template.d.ts +1 -0
  269. package/dist/template.js +20 -0
  270. package/dist/template.js.map +1 -1
  271. package/dist/tools/arxiv.d.cts +1 -1
  272. package/dist/tools/arxiv.d.ts +1 -1
  273. package/dist/tools/base.cjs.map +1 -1
  274. package/dist/tools/base.d.cts +3 -2
  275. package/dist/tools/base.d.ts +3 -2
  276. package/dist/tools/base.js.map +1 -1
  277. package/dist/tools/calculator.d.cts +1 -1
  278. package/dist/tools/calculator.d.ts +1 -1
  279. package/dist/tools/custom.d.cts +2 -2
  280. package/dist/tools/custom.d.ts +2 -2
  281. package/dist/tools/database/elasticsearch.d.cts +1 -1
  282. package/dist/tools/database/elasticsearch.d.ts +1 -1
  283. package/dist/tools/database/milvus.d.cts +3 -3
  284. package/dist/tools/database/milvus.d.ts +3 -3
  285. package/dist/tools/database/qdrant.d.cts +1 -1
  286. package/dist/tools/database/qdrant.d.ts +1 -1
  287. package/dist/tools/database/sql.d.cts +1 -1
  288. package/dist/tools/database/sql.d.ts +1 -1
  289. package/dist/tools/handoff.cjs +68 -0
  290. package/dist/tools/handoff.cjs.map +1 -0
  291. package/dist/tools/handoff.d.cts +47 -0
  292. package/dist/tools/handoff.d.ts +47 -0
  293. package/dist/tools/handoff.js +66 -0
  294. package/dist/tools/handoff.js.map +1 -0
  295. package/dist/tools/llm.d.cts +2 -2
  296. package/dist/tools/llm.d.ts +2 -2
  297. package/dist/tools/mcp.d.cts +1 -1
  298. package/dist/tools/mcp.d.ts +1 -1
  299. package/dist/tools/openapi.d.cts +1 -1
  300. package/dist/tools/openapi.d.ts +1 -1
  301. package/dist/tools/python/output.d.cts +1 -1
  302. package/dist/tools/python/output.d.ts +1 -1
  303. package/dist/tools/python/python.d.cts +2 -2
  304. package/dist/tools/python/python.d.ts +2 -2
  305. package/dist/tools/search/base.d.cts +1 -1
  306. package/dist/tools/search/base.d.ts +1 -1
  307. package/dist/tools/search/duckDuckGoSearch.d.cts +1 -1
  308. package/dist/tools/search/duckDuckGoSearch.d.ts +1 -1
  309. package/dist/tools/search/googleSearch.d.cts +1 -1
  310. package/dist/tools/search/googleSearch.d.ts +1 -1
  311. package/dist/tools/search/searXNGSearch.d.cts +1 -1
  312. package/dist/tools/search/searXNGSearch.d.ts +1 -1
  313. package/dist/tools/search/wikipedia.d.cts +1 -1
  314. package/dist/tools/search/wikipedia.d.ts +1 -1
  315. package/dist/tools/similarity.d.cts +1 -1
  316. package/dist/tools/similarity.d.ts +1 -1
  317. package/dist/tools/think.cjs +52 -0
  318. package/dist/tools/think.cjs.map +1 -0
  319. package/dist/tools/think.d.cts +47 -0
  320. package/dist/tools/think.d.ts +47 -0
  321. package/dist/tools/think.js +50 -0
  322. package/dist/tools/think.js.map +1 -0
  323. package/dist/tools/weather/openMeteo.d.cts +1 -1
  324. package/dist/tools/weather/openMeteo.d.ts +1 -1
  325. package/dist/tools/web/webCrawler.d.cts +1 -1
  326. package/dist/tools/web/webCrawler.d.ts +1 -1
  327. package/dist/types-CJwiMH3u.d.ts +213 -0
  328. package/dist/types-W0QttuP_.d.cts +213 -0
  329. package/dist/version.cjs +1 -1
  330. package/dist/version.js +1 -1
  331. package/dist/workflows/agent.d.cts +3 -3
  332. package/dist/workflows/agent.d.ts +3 -3
  333. package/dist/workflows/workflow.d.cts +1 -1
  334. package/dist/workflows/workflow.d.ts +1 -1
  335. package/package.json +11 -11
@@ -1,8 +1,7 @@
1
1
  import { Message, AssistantMessage, MessageContentPart } from './backend/message.js';
2
- import * as ai from 'ai';
3
2
  import { Run, GetRunContext } from './context.js';
4
3
  import { Serializable } from './internals/serializable.js';
5
- import { C as Callback, E as Emitter } from './emitter-CZFbzlUi.js';
4
+ import { C as Callback, E as Emitter } from './emitter-36-9MnvA.js';
6
5
  import { FrameworkError } from './errors.js';
7
6
  import { Task } from 'promise-based-task';
8
7
  import { BaseCache } from './cache/base.js';
@@ -13,6 +12,7 @@ import { ZodSchema, z, ZodType } from 'zod';
13
12
  import { SchemaObject } from 'ajv';
14
13
  import { PromptTemplate } from './template.js';
15
14
  import { Logger } from './logger/logger.js';
15
+ import { ToolCallPart } from 'ai';
16
16
 
17
17
  /**
18
18
  * Copyright 2025 © BeeAI a Series of LF Projects, LLC
@@ -39,6 +39,7 @@ interface ChatModelParameters {
39
39
  presencePenalty?: number;
40
40
  seed?: number;
41
41
  stopSequences?: string[];
42
+ stream?: boolean;
42
43
  }
43
44
  interface ResponseObjectJson {
44
45
  type: "object-json";
@@ -67,6 +68,7 @@ interface ChatModelInput extends ChatModelParameters {
67
68
  responseFormat?: ZodSchema | ResponseObjectJson;
68
69
  toolChoice?: ChatModelToolChoice;
69
70
  messages: Message[];
71
+ streamPartialToolCalls?: boolean;
70
72
  }
71
73
  type ChatModelFinishReason = "stop" | "length" | "content-filter" | "tool-calls" | "error" | "other" | "unknown";
72
74
  interface ChatModelUsage {
@@ -113,11 +115,7 @@ declare abstract class ChatModel extends Serializable {
113
115
  readonly modelSupportsToolCalling: boolean;
114
116
  abstract get modelId(): string;
115
117
  abstract get providerId(): string;
116
- create(input: ChatModelInput & {
117
- stream?: boolean;
118
- }): Run<ChatModelOutput, this, readonly [ChatModelInput & {
119
- stream?: boolean;
120
- }]>;
118
+ create(input: ChatModelInput): Run<ChatModelOutput, this, readonly [ChatModelInput]>;
121
119
  createStructure<T>(input: ChatModelObjectInput<T>): Run<ChatModelObjectOutput<T>, this, readonly [ChatModelObjectInput<T>]>;
122
120
  config({ cache, parameters }: ChatConfig): void;
123
121
  static fromName(name: FullModelName | ProviderName, options?: ChatModelParameters): Promise<ChatModel>;
@@ -150,7 +148,8 @@ declare class ChatModelOutput extends Serializable {
150
148
  constructor(messages: Message[], usage?: ChatModelUsage | undefined, finishReason?: ChatModelFinishReason | undefined);
151
149
  static fromChunks(chunks: ChatModelOutput[]): ChatModelOutput;
152
150
  merge(other: ChatModelOutput): void;
153
- getToolCalls(): ai.ToolCallPart[];
151
+ dedupe(): void;
152
+ getToolCalls(): ToolCallPart[];
154
153
  getTextMessages(): AssistantMessage[];
155
154
  getTextContent(): string;
156
155
  toString(): string;
package/dist/context.cjs CHANGED
@@ -12,6 +12,11 @@ var stream_cjs = require('./internals/helpers/stream.cjs');
12
12
 
13
13
  var __defProp = Object.defineProperty;
14
14
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
15
+ class Middleware {
16
+ static {
17
+ __name(this, "Middleware");
18
+ }
19
+ }
15
20
  class Run extends promise_cjs.LazyPromise {
16
21
  static {
17
22
  __name(this, "Run");
@@ -33,8 +38,10 @@ class Run extends promise_cjs.LazyPromise {
33
38
  });
34
39
  return this;
35
40
  }
36
- middleware(fn) {
37
- this.tasks.push(async () => fn(this.runContext));
41
+ middleware(...fns) {
42
+ for (const fn of fns) {
43
+ this.tasks.push(async () => remeda.isFunction(fn) ? fn(this.runContext) : fn.bind(this.runContext));
44
+ }
38
45
  return this;
39
46
  }
40
47
  async before() {
@@ -117,20 +124,29 @@ class RunContext extends serializable_cjs.Serializable {
117
124
  internal: true
118
125
  }
119
126
  });
127
+ const finishEvent = {};
120
128
  try {
121
- await emitter.emit("start", null);
129
+ const startEvent = {
130
+ input: runContext.runParams,
131
+ output: void 0
132
+ };
133
+ await emitter.emit("start", startEvent);
134
+ runContext.runParams = startEvent.input;
135
+ finishEvent.input = startEvent.input;
122
136
  const result = await Promise.race([
123
- RunContext.#storage.run(runContext, fn, runContext),
137
+ RunContext.#storage.run(runContext, startEvent.output === void 0 ? fn : async () => startEvent.output, runContext),
124
138
  new Promise((_, reject) => runContext.signal.addEventListener("abort", () => setTimeout(() => reject(runContext.signal.reason), 0)))
125
139
  ]);
140
+ finishEvent.output = result;
126
141
  await emitter.emit("success", result);
127
142
  return result;
128
143
  } catch (_e) {
129
144
  const e = errors_cjs.FrameworkError.ensure(_e);
145
+ finishEvent.output = e;
130
146
  await emitter.emit("error", e);
131
147
  throw e;
132
148
  } finally {
133
- await emitter.emit("finish", null);
149
+ await emitter.emit("finish", finishEvent);
134
150
  runContext.destroy();
135
151
  }
136
152
  }, runContext);
@@ -155,6 +171,7 @@ class RunContext extends serializable_cjs.Serializable {
155
171
  }
156
172
  }
157
173
 
174
+ exports.Middleware = Middleware;
158
175
  exports.Run = Run;
159
176
  exports.RunContext = RunContext;
160
177
  //# sourceMappingURL=context.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.ts"],"names":["Run","LazyPromise","tasks","handler","runContext","Symbol","toStringTag","observe","fn","push","emitter","context","value","Object","assign","middleware","before","executeSequentially","splice","Infinity","asyncIterator","response","then","isAsyncIterable","Error","RunContext","Serializable","AsyncLocalStorage","controller","runId","groupId","parentId","runParams","createdAt","signal","abort","reason","instance","input","parent","Date","params","createRandomHash","omit","AbortController","registerSignals","child","trace","id","parentRunId","pipe","destroy","FrameworkError","enter","getStore","namespace","creator","internal","emit","result","Promise","race","run","_","reject","addEventListener","setTimeout","_e","e","ensure","register","createSnapshot","shallowCopy","loadSnapshot","snapshot"],"mappings":"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","file":"context.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { createRandomHash } from \"@/internals/helpers/hash.js\";\nimport { omit } from \"remeda\";\nimport { Callback } from \"@/emitter/types.js\";\nimport { registerSignals } from \"@/internals/helpers/cancellation.js\";\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { executeSequentially, LazyPromise } from \"@/internals/helpers/promise.js\";\nimport { FrameworkError } from \"@/errors.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { isAsyncIterable } from \"@/internals/helpers/stream.js\";\n\nexport interface RunInstance<T = any> {\n emitter: Emitter<T>;\n}\n\nexport interface RunContextCallbacks {\n start: Callback<null>;\n success: Callback<unknown>;\n error: Callback<Error>;\n finish: Callback<null>;\n}\n\nexport type GetRunContext<T, P = any> = T extends RunInstance ? RunContext<T, P> : never;\nexport type GetRunInstance<T> = T extends RunInstance<infer P> ? P : never;\n\nexport class Run<R, I extends RunInstance, P = any> extends LazyPromise<R> {\n protected readonly tasks: (() => Promise<void>)[] = [];\n\n constructor(\n handler: () => Promise<R>,\n protected readonly runContext: GetRunContext<I, P>,\n ) {\n super(handler);\n }\n\n readonly [Symbol.toStringTag] = \"Promise\";\n\n observe(fn: (emitter: Emitter<GetRunInstance<I>>) => void) {\n this.tasks.push(async () => fn(this.runContext.emitter));\n return this;\n }\n\n context(value: object) {\n this.tasks.push(async () => {\n Object.assign(this.runContext.context, value);\n Object.assign(this.runContext.emitter.context, value);\n });\n return this;\n }\n\n middleware(fn: (context: GetRunContext<I, P>) => void) {\n this.tasks.push(async () => fn(this.runContext));\n return this;\n }\n\n protected async before(): Promise<void> {\n await super.before();\n await executeSequentially(this.tasks.splice(0, Infinity));\n }\n\n // @ts-expect-error too complex\n async *[Symbol.asyncIterator](): R extends AsyncIterable<infer X> ? AsyncIterator<X> : never {\n const response = await this.then();\n if (isAsyncIterable(response)) {\n yield* response;\n } else {\n throw new Error(\"Result is not iterable!\");\n }\n }\n}\n\nexport interface RunContextInput<P> {\n params: P;\n signal?: AbortSignal;\n}\n\nexport class RunContext<T extends RunInstance, P = any> extends Serializable {\n static #storage = new AsyncLocalStorage<RunContext<any>>();\n\n protected readonly controller: AbortController;\n public readonly runId: string;\n public readonly groupId: string;\n public readonly parentId?: string;\n public readonly emitter;\n public readonly context: object;\n public readonly runParams: P;\n public readonly createdAt: Date;\n\n get signal() {\n return this.controller.signal;\n }\n\n abort(reason?: Error) {\n this.controller.abort(reason);\n }\n\n constructor(\n public readonly instance: T,\n protected readonly input: RunContextInput<P>,\n parent?: RunContext<any>,\n ) {\n super();\n this.createdAt = new Date();\n this.runParams = input.params;\n this.runId = createRandomHash(5);\n this.parentId = parent?.runId;\n this.groupId = parent?.groupId ?? createRandomHash();\n this.context = omit((parent?.context ?? {}) as any, [\"id\", \"parentId\"]);\n\n this.controller = new AbortController();\n registerSignals(this.controller, [input.signal, parent?.signal]);\n\n this.emitter = instance.emitter.child<GetRunInstance<T>>({\n context: this.context,\n trace: {\n id: this.groupId,\n runId: this.runId,\n parentRunId: parent?.runId,\n },\n });\n if (parent) {\n this.emitter.pipe(parent.emitter);\n }\n }\n\n destroy() {\n this.emitter.destroy();\n this.controller.abort(new FrameworkError(\"Context destroyed.\"));\n }\n\n static enter<C2 extends RunInstance, R2, P2>(\n instance: C2,\n input: RunContextInput<P2>,\n fn: (context: GetRunContext<C2, P2>) => Promise<R2>,\n ) {\n const parent = RunContext.#storage.getStore();\n const runContext = new RunContext(instance, input, parent) as GetRunContext<C2, P2>;\n\n return new Run(async () => {\n const emitter = runContext.emitter.child<RunContextCallbacks>({\n namespace: [\"run\"],\n creator: runContext,\n context: { internal: true },\n });\n\n try {\n await emitter.emit(\"start\", null);\n const result = await Promise.race([\n RunContext.#storage.run(runContext, fn, runContext),\n new Promise<never>((_, reject) =>\n runContext.signal.addEventListener(\"abort\", () =>\n setTimeout(() => reject(runContext.signal.reason), 0),\n ),\n ),\n ]);\n await emitter.emit(\"success\", result);\n return result;\n } catch (_e) {\n const e = FrameworkError.ensure(_e);\n await emitter.emit(\"error\", e);\n throw e;\n } finally {\n await emitter.emit(\"finish\", null);\n runContext.destroy();\n }\n }, runContext);\n }\n\n static {\n this.register();\n }\n\n createSnapshot() {\n return {\n controller: this.controller,\n runId: this.runId,\n groupId: this.groupId,\n parentId: this.parentId,\n emitter: this.emitter,\n context: shallowCopy(this.context),\n runParams: shallowCopy(this.runParams),\n createdAt: new Date(this.createdAt),\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/context.ts"],"names":["Middleware","Run","LazyPromise","tasks","handler","runContext","Symbol","toStringTag","observe","fn","push","emitter","context","value","Object","assign","middleware","fns","isFunction","bind","before","executeSequentially","splice","Infinity","asyncIterator","response","then","isAsyncIterable","Error","RunContext","Serializable","AsyncLocalStorage","controller","runId","groupId","parentId","runParams","createdAt","signal","abort","reason","instance","input","parent","Date","params","createRandomHash","omit","AbortController","registerSignals","child","trace","id","parentRunId","pipe","destroy","FrameworkError","enter","getStore","namespace","creator","internal","finishEvent","startEvent","output","undefined","emit","result","Promise","race","run","_","reject","addEventListener","setTimeout","_e","e","ensure","register","createSnapshot","shallowCopy","loadSnapshot","snapshot"],"mappings":"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","file":"context.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { createRandomHash } from \"@/internals/helpers/hash.js\";\nimport { isFunction, omit } from \"remeda\";\nimport { Callback, InferCallbackValue } from \"@/emitter/types.js\";\nimport { registerSignals } from \"@/internals/helpers/cancellation.js\";\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { executeSequentially, LazyPromise } from \"@/internals/helpers/promise.js\";\nimport { FrameworkError } from \"@/errors.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { isAsyncIterable } from \"@/internals/helpers/stream.js\";\n\nexport interface RunInstance<T = any> {\n emitter: Emitter<T>;\n}\n\nexport interface RunContextCallbacks {\n start: Callback<{ input: any; output: any }>;\n success: Callback<unknown>; // TODO: should be updated to Callback<{ input: any; output: any }>\n error: Callback<Error>;\n finish: Callback<{ input: any; output?: any; error?: FrameworkError }>;\n}\n\nexport abstract class Middleware<T extends RunInstance = any> {\n abstract bind(ctx: RunContext<T>): void;\n}\n\nexport type GetRunContext<T, P = any> = T extends RunInstance ? RunContext<T, P> : never;\nexport type GetRunInstance<T> = T extends RunInstance<infer P> ? P : never;\nexport type MiddlewareFn<T> = (context: GetRunContext<T>) => void;\nexport type MiddlewareType<T extends RunInstance> = Middleware<T> | MiddlewareFn<T>;\n\nexport class Run<R, I extends RunInstance, P = any> extends LazyPromise<R> {\n protected readonly tasks: (() => Promise<void>)[] = [];\n\n constructor(\n handler: () => Promise<R>,\n protected readonly runContext: GetRunContext<I, P>,\n ) {\n super(handler);\n }\n\n readonly [Symbol.toStringTag] = \"Promise\";\n\n observe(fn: (emitter: Emitter<GetRunInstance<I>>) => void) {\n this.tasks.push(async () => fn(this.runContext.emitter));\n return this;\n }\n\n context(value: object) {\n this.tasks.push(async () => {\n Object.assign(this.runContext.context, value);\n Object.assign(this.runContext.emitter.context, value);\n });\n return this;\n }\n\n middleware(...fns: MiddlewareType<I>[]) {\n for (const fn of fns) {\n this.tasks.push(async () =>\n isFunction(fn) ? fn(this.runContext) : fn.bind(this.runContext),\n );\n }\n return this;\n }\n\n protected async before(): Promise<void> {\n await super.before();\n await executeSequentially(this.tasks.splice(0, Infinity));\n }\n\n // @ts-expect-error too complex\n async *[Symbol.asyncIterator](): R extends AsyncIterable<infer X> ? AsyncIterator<X> : never {\n const response = await this.then();\n if (isAsyncIterable(response)) {\n yield* response;\n } else {\n throw new Error(\"Result is not iterable!\");\n }\n }\n}\n\nexport interface RunContextInput<P> {\n params: P;\n signal?: AbortSignal;\n}\n\nexport class RunContext<T extends RunInstance, P = any> extends Serializable {\n static #storage = new AsyncLocalStorage<RunContext<any>>();\n\n protected readonly controller: AbortController;\n public readonly runId: string;\n public readonly groupId: string;\n public readonly parentId?: string;\n public readonly emitter;\n public readonly context: object;\n public runParams: P;\n public readonly createdAt: Date;\n\n get signal() {\n return this.controller.signal;\n }\n\n abort(reason?: Error) {\n this.controller.abort(reason);\n }\n\n constructor(\n public readonly instance: T,\n protected readonly input: RunContextInput<P>,\n parent?: RunContext<any>,\n ) {\n super();\n this.createdAt = new Date();\n this.runParams = input.params;\n this.runId = createRandomHash(5);\n this.parentId = parent?.runId;\n this.groupId = parent?.groupId ?? createRandomHash();\n this.context = omit((parent?.context ?? {}) as any, [\"id\", \"parentId\"]);\n\n this.controller = new AbortController();\n registerSignals(this.controller, [input.signal, parent?.signal]);\n\n this.emitter = instance.emitter.child<GetRunInstance<T>>({\n context: this.context,\n trace: {\n id: this.groupId,\n runId: this.runId,\n parentRunId: parent?.runId,\n },\n });\n if (parent) {\n this.emitter.pipe(parent.emitter);\n }\n }\n\n destroy() {\n this.emitter.destroy();\n this.controller.abort(new FrameworkError(\"Context destroyed.\"));\n }\n\n static enter<C2 extends RunInstance, R2, P2>(\n instance: C2,\n input: RunContextInput<P2>,\n fn: (context: GetRunContext<C2, P2>) => Promise<R2>,\n ) {\n const parent = RunContext.#storage.getStore();\n const runContext = new RunContext(instance, input, parent) as GetRunContext<C2, P2>;\n\n return new Run(async () => {\n const emitter = runContext.emitter.child<RunContextCallbacks>({\n namespace: [\"run\"],\n creator: runContext,\n context: { internal: true },\n });\n\n const finishEvent = {} as InferCallbackValue<RunContextCallbacks[\"finish\"]>;\n try {\n const startEvent: InferCallbackValue<RunContextCallbacks[\"start\"]> = {\n input: runContext.runParams,\n output: undefined,\n };\n await emitter.emit(\"start\", startEvent);\n\n // Copy back any modifications made by middleware to run_params\n runContext.runParams = startEvent.input;\n finishEvent.input = startEvent.input;\n\n const result: R2 = await Promise.race([\n RunContext.#storage.run(\n runContext,\n startEvent.output === undefined ? fn : async () => startEvent.output,\n runContext,\n ),\n new Promise<never>((_, reject) =>\n runContext.signal.addEventListener(\"abort\", () =>\n setTimeout(() => reject(runContext.signal.reason), 0),\n ),\n ),\n ]);\n finishEvent.output = result;\n await emitter.emit(\"success\", result);\n return result;\n } catch (_e) {\n const e = FrameworkError.ensure(_e);\n finishEvent.output = e;\n await emitter.emit(\"error\", e);\n throw e;\n } finally {\n await emitter.emit(\"finish\", finishEvent);\n runContext.destroy();\n }\n }, runContext);\n }\n\n static {\n this.register();\n }\n\n createSnapshot() {\n return {\n controller: this.controller,\n runId: this.runId,\n groupId: this.groupId,\n parentId: this.parentId,\n emitter: this.emitter,\n context: shallowCopy(this.context),\n runParams: shallowCopy(this.runParams),\n createdAt: new Date(this.createdAt),\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
- import { E as Emitter, C as Callback } from './emitter-DpqUYjXH.cjs';
1
+ import { E as Emitter, C as Callback } from './emitter-jN55XZZq.cjs';
2
2
  import { Serializable } from './internals/serializable.cjs';
3
3
  import { LazyPromise } from './internals/helpers/promise.cjs';
4
+ import { FrameworkError } from './errors.cjs';
4
5
  import './internals/types.cjs';
5
6
  import './internals/helpers/guards.cjs';
6
7
 
@@ -13,13 +14,25 @@ interface RunInstance<T = any> {
13
14
  emitter: Emitter<T>;
14
15
  }
15
16
  interface RunContextCallbacks {
16
- start: Callback<null>;
17
+ start: Callback<{
18
+ input: any;
19
+ output: any;
20
+ }>;
17
21
  success: Callback<unknown>;
18
22
  error: Callback<Error>;
19
- finish: Callback<null>;
23
+ finish: Callback<{
24
+ input: any;
25
+ output?: any;
26
+ error?: FrameworkError;
27
+ }>;
28
+ }
29
+ declare abstract class Middleware<T extends RunInstance = any> {
30
+ abstract bind(ctx: RunContext<T>): void;
20
31
  }
21
32
  type GetRunContext<T, P = any> = T extends RunInstance ? RunContext<T, P> : never;
22
33
  type GetRunInstance<T> = T extends RunInstance<infer P> ? P : never;
34
+ type MiddlewareFn<T> = (context: GetRunContext<T>) => void;
35
+ type MiddlewareType<T extends RunInstance> = Middleware<T> | MiddlewareFn<T>;
23
36
  declare class Run<R, I extends RunInstance, P = any> extends LazyPromise<R> {
24
37
  protected readonly runContext: GetRunContext<I, P>;
25
38
  protected readonly tasks: (() => Promise<void>)[];
@@ -27,7 +40,7 @@ declare class Run<R, I extends RunInstance, P = any> extends LazyPromise<R> {
27
40
  readonly [Symbol.toStringTag] = "Promise";
28
41
  observe(fn: (emitter: Emitter<GetRunInstance<I>>) => void): this;
29
42
  context(value: object): this;
30
- middleware(fn: (context: GetRunContext<I, P>) => void): this;
43
+ middleware(...fns: MiddlewareType<I>[]): this;
31
44
  protected before(): Promise<void>;
32
45
  [Symbol.asyncIterator](): R extends AsyncIterable<infer X> ? AsyncIterator<X> : never;
33
46
  }
@@ -45,7 +58,7 @@ declare class RunContext<T extends RunInstance, P = any> extends Serializable {
45
58
  readonly parentId?: string;
46
59
  readonly emitter: Emitter<GetRunInstance<T>>;
47
60
  readonly context: object;
48
- readonly runParams: P;
61
+ runParams: P;
49
62
  readonly createdAt: Date;
50
63
  get signal(): AbortSignal;
51
64
  abort(reason?: Error): void;
@@ -65,4 +78,4 @@ declare class RunContext<T extends RunInstance, P = any> extends Serializable {
65
78
  loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>): void;
66
79
  }
67
80
 
68
- export { type GetRunContext, type GetRunInstance, Run, RunContext, type RunContextCallbacks, type RunContextInput, type RunInstance };
81
+ export { type GetRunContext, type GetRunInstance, Middleware, type MiddlewareFn, type MiddlewareType, Run, RunContext, type RunContextCallbacks, type RunContextInput, type RunInstance };
package/dist/context.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { E as Emitter, C as Callback } from './emitter-CZFbzlUi.js';
1
+ import { E as Emitter, C as Callback } from './emitter-36-9MnvA.js';
2
2
  import { Serializable } from './internals/serializable.js';
3
3
  import { LazyPromise } from './internals/helpers/promise.js';
4
+ import { FrameworkError } from './errors.js';
4
5
  import './internals/types.js';
5
6
  import './internals/helpers/guards.js';
6
7
 
@@ -13,13 +14,25 @@ interface RunInstance<T = any> {
13
14
  emitter: Emitter<T>;
14
15
  }
15
16
  interface RunContextCallbacks {
16
- start: Callback<null>;
17
+ start: Callback<{
18
+ input: any;
19
+ output: any;
20
+ }>;
17
21
  success: Callback<unknown>;
18
22
  error: Callback<Error>;
19
- finish: Callback<null>;
23
+ finish: Callback<{
24
+ input: any;
25
+ output?: any;
26
+ error?: FrameworkError;
27
+ }>;
28
+ }
29
+ declare abstract class Middleware<T extends RunInstance = any> {
30
+ abstract bind(ctx: RunContext<T>): void;
20
31
  }
21
32
  type GetRunContext<T, P = any> = T extends RunInstance ? RunContext<T, P> : never;
22
33
  type GetRunInstance<T> = T extends RunInstance<infer P> ? P : never;
34
+ type MiddlewareFn<T> = (context: GetRunContext<T>) => void;
35
+ type MiddlewareType<T extends RunInstance> = Middleware<T> | MiddlewareFn<T>;
23
36
  declare class Run<R, I extends RunInstance, P = any> extends LazyPromise<R> {
24
37
  protected readonly runContext: GetRunContext<I, P>;
25
38
  protected readonly tasks: (() => Promise<void>)[];
@@ -27,7 +40,7 @@ declare class Run<R, I extends RunInstance, P = any> extends LazyPromise<R> {
27
40
  readonly [Symbol.toStringTag] = "Promise";
28
41
  observe(fn: (emitter: Emitter<GetRunInstance<I>>) => void): this;
29
42
  context(value: object): this;
30
- middleware(fn: (context: GetRunContext<I, P>) => void): this;
43
+ middleware(...fns: MiddlewareType<I>[]): this;
31
44
  protected before(): Promise<void>;
32
45
  [Symbol.asyncIterator](): R extends AsyncIterable<infer X> ? AsyncIterator<X> : never;
33
46
  }
@@ -45,7 +58,7 @@ declare class RunContext<T extends RunInstance, P = any> extends Serializable {
45
58
  readonly parentId?: string;
46
59
  readonly emitter: Emitter<GetRunInstance<T>>;
47
60
  readonly context: object;
48
- readonly runParams: P;
61
+ runParams: P;
49
62
  readonly createdAt: Date;
50
63
  get signal(): AbortSignal;
51
64
  abort(reason?: Error): void;
@@ -65,4 +78,4 @@ declare class RunContext<T extends RunInstance, P = any> extends Serializable {
65
78
  loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>): void;
66
79
  }
67
80
 
68
- export { type GetRunContext, type GetRunInstance, Run, RunContext, type RunContextCallbacks, type RunContextInput, type RunInstance };
81
+ export { type GetRunContext, type GetRunInstance, Middleware, type MiddlewareFn, type MiddlewareType, Run, RunContext, type RunContextCallbacks, type RunContextInput, type RunInstance };
package/dist/context.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
2
  import { createRandomHash } from './internals/helpers/hash.js';
3
- import { omit } from 'remeda';
3
+ import { isFunction, omit } from 'remeda';
4
4
  import { registerSignals } from './internals/helpers/cancellation.js';
5
5
  import { Serializable } from './internals/serializable.js';
6
6
  import { LazyPromise, executeSequentially } from './internals/helpers/promise.js';
@@ -10,6 +10,11 @@ import { isAsyncIterable } from './internals/helpers/stream.js';
10
10
 
11
11
  var __defProp = Object.defineProperty;
12
12
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
+ class Middleware {
14
+ static {
15
+ __name(this, "Middleware");
16
+ }
17
+ }
13
18
  class Run extends LazyPromise {
14
19
  static {
15
20
  __name(this, "Run");
@@ -31,8 +36,10 @@ class Run extends LazyPromise {
31
36
  });
32
37
  return this;
33
38
  }
34
- middleware(fn) {
35
- this.tasks.push(async () => fn(this.runContext));
39
+ middleware(...fns) {
40
+ for (const fn of fns) {
41
+ this.tasks.push(async () => isFunction(fn) ? fn(this.runContext) : fn.bind(this.runContext));
42
+ }
36
43
  return this;
37
44
  }
38
45
  async before() {
@@ -115,20 +122,29 @@ class RunContext extends Serializable {
115
122
  internal: true
116
123
  }
117
124
  });
125
+ const finishEvent = {};
118
126
  try {
119
- await emitter.emit("start", null);
127
+ const startEvent = {
128
+ input: runContext.runParams,
129
+ output: void 0
130
+ };
131
+ await emitter.emit("start", startEvent);
132
+ runContext.runParams = startEvent.input;
133
+ finishEvent.input = startEvent.input;
120
134
  const result = await Promise.race([
121
- RunContext.#storage.run(runContext, fn, runContext),
135
+ RunContext.#storage.run(runContext, startEvent.output === void 0 ? fn : async () => startEvent.output, runContext),
122
136
  new Promise((_, reject) => runContext.signal.addEventListener("abort", () => setTimeout(() => reject(runContext.signal.reason), 0)))
123
137
  ]);
138
+ finishEvent.output = result;
124
139
  await emitter.emit("success", result);
125
140
  return result;
126
141
  } catch (_e) {
127
142
  const e = FrameworkError.ensure(_e);
143
+ finishEvent.output = e;
128
144
  await emitter.emit("error", e);
129
145
  throw e;
130
146
  } finally {
131
- await emitter.emit("finish", null);
147
+ await emitter.emit("finish", finishEvent);
132
148
  runContext.destroy();
133
149
  }
134
150
  }, runContext);
@@ -153,6 +169,6 @@ class RunContext extends Serializable {
153
169
  }
154
170
  }
155
171
 
156
- export { Run, RunContext };
172
+ export { Middleware, Run, RunContext };
157
173
  //# sourceMappingURL=context.js.map
158
174
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.ts"],"names":["Run","LazyPromise","tasks","handler","runContext","Symbol","toStringTag","observe","fn","push","emitter","context","value","Object","assign","middleware","before","executeSequentially","splice","Infinity","asyncIterator","response","then","isAsyncIterable","Error","RunContext","Serializable","AsyncLocalStorage","controller","runId","groupId","parentId","runParams","createdAt","signal","abort","reason","instance","input","parent","Date","params","createRandomHash","omit","AbortController","registerSignals","child","trace","id","parentRunId","pipe","destroy","FrameworkError","enter","getStore","namespace","creator","internal","emit","result","Promise","race","run","_","reject","addEventListener","setTimeout","_e","e","ensure","register","createSnapshot","shallowCopy","loadSnapshot","snapshot"],"mappings":"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","file":"context.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { createRandomHash } from \"@/internals/helpers/hash.js\";\nimport { omit } from \"remeda\";\nimport { Callback } from \"@/emitter/types.js\";\nimport { registerSignals } from \"@/internals/helpers/cancellation.js\";\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { executeSequentially, LazyPromise } from \"@/internals/helpers/promise.js\";\nimport { FrameworkError } from \"@/errors.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { isAsyncIterable } from \"@/internals/helpers/stream.js\";\n\nexport interface RunInstance<T = any> {\n emitter: Emitter<T>;\n}\n\nexport interface RunContextCallbacks {\n start: Callback<null>;\n success: Callback<unknown>;\n error: Callback<Error>;\n finish: Callback<null>;\n}\n\nexport type GetRunContext<T, P = any> = T extends RunInstance ? RunContext<T, P> : never;\nexport type GetRunInstance<T> = T extends RunInstance<infer P> ? P : never;\n\nexport class Run<R, I extends RunInstance, P = any> extends LazyPromise<R> {\n protected readonly tasks: (() => Promise<void>)[] = [];\n\n constructor(\n handler: () => Promise<R>,\n protected readonly runContext: GetRunContext<I, P>,\n ) {\n super(handler);\n }\n\n readonly [Symbol.toStringTag] = \"Promise\";\n\n observe(fn: (emitter: Emitter<GetRunInstance<I>>) => void) {\n this.tasks.push(async () => fn(this.runContext.emitter));\n return this;\n }\n\n context(value: object) {\n this.tasks.push(async () => {\n Object.assign(this.runContext.context, value);\n Object.assign(this.runContext.emitter.context, value);\n });\n return this;\n }\n\n middleware(fn: (context: GetRunContext<I, P>) => void) {\n this.tasks.push(async () => fn(this.runContext));\n return this;\n }\n\n protected async before(): Promise<void> {\n await super.before();\n await executeSequentially(this.tasks.splice(0, Infinity));\n }\n\n // @ts-expect-error too complex\n async *[Symbol.asyncIterator](): R extends AsyncIterable<infer X> ? AsyncIterator<X> : never {\n const response = await this.then();\n if (isAsyncIterable(response)) {\n yield* response;\n } else {\n throw new Error(\"Result is not iterable!\");\n }\n }\n}\n\nexport interface RunContextInput<P> {\n params: P;\n signal?: AbortSignal;\n}\n\nexport class RunContext<T extends RunInstance, P = any> extends Serializable {\n static #storage = new AsyncLocalStorage<RunContext<any>>();\n\n protected readonly controller: AbortController;\n public readonly runId: string;\n public readonly groupId: string;\n public readonly parentId?: string;\n public readonly emitter;\n public readonly context: object;\n public readonly runParams: P;\n public readonly createdAt: Date;\n\n get signal() {\n return this.controller.signal;\n }\n\n abort(reason?: Error) {\n this.controller.abort(reason);\n }\n\n constructor(\n public readonly instance: T,\n protected readonly input: RunContextInput<P>,\n parent?: RunContext<any>,\n ) {\n super();\n this.createdAt = new Date();\n this.runParams = input.params;\n this.runId = createRandomHash(5);\n this.parentId = parent?.runId;\n this.groupId = parent?.groupId ?? createRandomHash();\n this.context = omit((parent?.context ?? {}) as any, [\"id\", \"parentId\"]);\n\n this.controller = new AbortController();\n registerSignals(this.controller, [input.signal, parent?.signal]);\n\n this.emitter = instance.emitter.child<GetRunInstance<T>>({\n context: this.context,\n trace: {\n id: this.groupId,\n runId: this.runId,\n parentRunId: parent?.runId,\n },\n });\n if (parent) {\n this.emitter.pipe(parent.emitter);\n }\n }\n\n destroy() {\n this.emitter.destroy();\n this.controller.abort(new FrameworkError(\"Context destroyed.\"));\n }\n\n static enter<C2 extends RunInstance, R2, P2>(\n instance: C2,\n input: RunContextInput<P2>,\n fn: (context: GetRunContext<C2, P2>) => Promise<R2>,\n ) {\n const parent = RunContext.#storage.getStore();\n const runContext = new RunContext(instance, input, parent) as GetRunContext<C2, P2>;\n\n return new Run(async () => {\n const emitter = runContext.emitter.child<RunContextCallbacks>({\n namespace: [\"run\"],\n creator: runContext,\n context: { internal: true },\n });\n\n try {\n await emitter.emit(\"start\", null);\n const result = await Promise.race([\n RunContext.#storage.run(runContext, fn, runContext),\n new Promise<never>((_, reject) =>\n runContext.signal.addEventListener(\"abort\", () =>\n setTimeout(() => reject(runContext.signal.reason), 0),\n ),\n ),\n ]);\n await emitter.emit(\"success\", result);\n return result;\n } catch (_e) {\n const e = FrameworkError.ensure(_e);\n await emitter.emit(\"error\", e);\n throw e;\n } finally {\n await emitter.emit(\"finish\", null);\n runContext.destroy();\n }\n }, runContext);\n }\n\n static {\n this.register();\n }\n\n createSnapshot() {\n return {\n controller: this.controller,\n runId: this.runId,\n groupId: this.groupId,\n parentId: this.parentId,\n emitter: this.emitter,\n context: shallowCopy(this.context),\n runParams: shallowCopy(this.runParams),\n createdAt: new Date(this.createdAt),\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/context.ts"],"names":["Middleware","Run","LazyPromise","tasks","handler","runContext","Symbol","toStringTag","observe","fn","push","emitter","context","value","Object","assign","middleware","fns","isFunction","bind","before","executeSequentially","splice","Infinity","asyncIterator","response","then","isAsyncIterable","Error","RunContext","Serializable","AsyncLocalStorage","controller","runId","groupId","parentId","runParams","createdAt","signal","abort","reason","instance","input","parent","Date","params","createRandomHash","omit","AbortController","registerSignals","child","trace","id","parentRunId","pipe","destroy","FrameworkError","enter","getStore","namespace","creator","internal","finishEvent","startEvent","output","undefined","emit","result","Promise","race","run","_","reject","addEventListener","setTimeout","_e","e","ensure","register","createSnapshot","shallowCopy","loadSnapshot","snapshot"],"mappings":"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","file":"context.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { createRandomHash } from \"@/internals/helpers/hash.js\";\nimport { isFunction, omit } from \"remeda\";\nimport { Callback, InferCallbackValue } from \"@/emitter/types.js\";\nimport { registerSignals } from \"@/internals/helpers/cancellation.js\";\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { executeSequentially, LazyPromise } from \"@/internals/helpers/promise.js\";\nimport { FrameworkError } from \"@/errors.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { isAsyncIterable } from \"@/internals/helpers/stream.js\";\n\nexport interface RunInstance<T = any> {\n emitter: Emitter<T>;\n}\n\nexport interface RunContextCallbacks {\n start: Callback<{ input: any; output: any }>;\n success: Callback<unknown>; // TODO: should be updated to Callback<{ input: any; output: any }>\n error: Callback<Error>;\n finish: Callback<{ input: any; output?: any; error?: FrameworkError }>;\n}\n\nexport abstract class Middleware<T extends RunInstance = any> {\n abstract bind(ctx: RunContext<T>): void;\n}\n\nexport type GetRunContext<T, P = any> = T extends RunInstance ? RunContext<T, P> : never;\nexport type GetRunInstance<T> = T extends RunInstance<infer P> ? P : never;\nexport type MiddlewareFn<T> = (context: GetRunContext<T>) => void;\nexport type MiddlewareType<T extends RunInstance> = Middleware<T> | MiddlewareFn<T>;\n\nexport class Run<R, I extends RunInstance, P = any> extends LazyPromise<R> {\n protected readonly tasks: (() => Promise<void>)[] = [];\n\n constructor(\n handler: () => Promise<R>,\n protected readonly runContext: GetRunContext<I, P>,\n ) {\n super(handler);\n }\n\n readonly [Symbol.toStringTag] = \"Promise\";\n\n observe(fn: (emitter: Emitter<GetRunInstance<I>>) => void) {\n this.tasks.push(async () => fn(this.runContext.emitter));\n return this;\n }\n\n context(value: object) {\n this.tasks.push(async () => {\n Object.assign(this.runContext.context, value);\n Object.assign(this.runContext.emitter.context, value);\n });\n return this;\n }\n\n middleware(...fns: MiddlewareType<I>[]) {\n for (const fn of fns) {\n this.tasks.push(async () =>\n isFunction(fn) ? fn(this.runContext) : fn.bind(this.runContext),\n );\n }\n return this;\n }\n\n protected async before(): Promise<void> {\n await super.before();\n await executeSequentially(this.tasks.splice(0, Infinity));\n }\n\n // @ts-expect-error too complex\n async *[Symbol.asyncIterator](): R extends AsyncIterable<infer X> ? AsyncIterator<X> : never {\n const response = await this.then();\n if (isAsyncIterable(response)) {\n yield* response;\n } else {\n throw new Error(\"Result is not iterable!\");\n }\n }\n}\n\nexport interface RunContextInput<P> {\n params: P;\n signal?: AbortSignal;\n}\n\nexport class RunContext<T extends RunInstance, P = any> extends Serializable {\n static #storage = new AsyncLocalStorage<RunContext<any>>();\n\n protected readonly controller: AbortController;\n public readonly runId: string;\n public readonly groupId: string;\n public readonly parentId?: string;\n public readonly emitter;\n public readonly context: object;\n public runParams: P;\n public readonly createdAt: Date;\n\n get signal() {\n return this.controller.signal;\n }\n\n abort(reason?: Error) {\n this.controller.abort(reason);\n }\n\n constructor(\n public readonly instance: T,\n protected readonly input: RunContextInput<P>,\n parent?: RunContext<any>,\n ) {\n super();\n this.createdAt = new Date();\n this.runParams = input.params;\n this.runId = createRandomHash(5);\n this.parentId = parent?.runId;\n this.groupId = parent?.groupId ?? createRandomHash();\n this.context = omit((parent?.context ?? {}) as any, [\"id\", \"parentId\"]);\n\n this.controller = new AbortController();\n registerSignals(this.controller, [input.signal, parent?.signal]);\n\n this.emitter = instance.emitter.child<GetRunInstance<T>>({\n context: this.context,\n trace: {\n id: this.groupId,\n runId: this.runId,\n parentRunId: parent?.runId,\n },\n });\n if (parent) {\n this.emitter.pipe(parent.emitter);\n }\n }\n\n destroy() {\n this.emitter.destroy();\n this.controller.abort(new FrameworkError(\"Context destroyed.\"));\n }\n\n static enter<C2 extends RunInstance, R2, P2>(\n instance: C2,\n input: RunContextInput<P2>,\n fn: (context: GetRunContext<C2, P2>) => Promise<R2>,\n ) {\n const parent = RunContext.#storage.getStore();\n const runContext = new RunContext(instance, input, parent) as GetRunContext<C2, P2>;\n\n return new Run(async () => {\n const emitter = runContext.emitter.child<RunContextCallbacks>({\n namespace: [\"run\"],\n creator: runContext,\n context: { internal: true },\n });\n\n const finishEvent = {} as InferCallbackValue<RunContextCallbacks[\"finish\"]>;\n try {\n const startEvent: InferCallbackValue<RunContextCallbacks[\"start\"]> = {\n input: runContext.runParams,\n output: undefined,\n };\n await emitter.emit(\"start\", startEvent);\n\n // Copy back any modifications made by middleware to run_params\n runContext.runParams = startEvent.input;\n finishEvent.input = startEvent.input;\n\n const result: R2 = await Promise.race([\n RunContext.#storage.run(\n runContext,\n startEvent.output === undefined ? fn : async () => startEvent.output,\n runContext,\n ),\n new Promise<never>((_, reject) =>\n runContext.signal.addEventListener(\"abort\", () =>\n setTimeout(() => reject(runContext.signal.reason), 0),\n ),\n ),\n ]);\n finishEvent.output = result;\n await emitter.emit(\"success\", result);\n return result;\n } catch (_e) {\n const e = FrameworkError.ensure(_e);\n finishEvent.output = e;\n await emitter.emit(\"error\", e);\n throw e;\n } finally {\n await emitter.emit(\"finish\", finishEvent);\n runContext.destroy();\n }\n }, runContext);\n }\n\n static {\n this.register();\n }\n\n createSnapshot() {\n return {\n controller: this.controller,\n runId: this.runId,\n groupId: this.groupId,\n parentId: this.parentId,\n emitter: this.emitter,\n context: shallowCopy(this.context),\n runParams: shallowCopy(this.runParams),\n createdAt: new Date(this.createdAt),\n };\n }\n\n loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n Object.assign(this, snapshot);\n }\n}\n"]}
@@ -7,6 +7,7 @@ var hash_cjs = require('../internals/helpers/hash.cjs');
7
7
  var utils_cjs$1 = require('../serializer/utils.cjs');
8
8
  var serializable_cjs = require('../internals/serializable.cjs');
9
9
  var remeda = require('remeda');
10
+ var array_cjs = require('../internals/helpers/array.cjs');
10
11
 
11
12
  var __defProp = Object.defineProperty;
12
13
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
@@ -25,7 +26,7 @@ class Emitter extends serializable_cjs.Serializable {
25
26
  static {
26
27
  __name(this, "Emitter");
27
28
  }
28
- listeners = /* @__PURE__ */ new Set();
29
+ listeners = [];
29
30
  groupId;
30
31
  namespace;
31
32
  creator;
@@ -84,21 +85,18 @@ class Emitter extends serializable_cjs.Serializable {
84
85
  {
85
86
  isBlocking: true,
86
87
  once: false,
87
- persistent: true
88
+ persistent: true,
89
+ matchNested: false
88
90
  }
89
91
  );
90
92
  }
91
93
  destroy() {
92
- this.listeners.clear();
94
+ this.listeners.length = 0;
93
95
  this.cleanups.forEach((child) => child());
94
96
  this.cleanups.length = 0;
95
97
  }
96
98
  reset() {
97
- for (const listener of this.listeners) {
98
- if (!listener.options?.persistent) {
99
- this.listeners.delete(listener);
100
- }
101
- }
99
+ this.listeners = this.listeners.filter((listener) => listener.options?.persistent);
102
100
  }
103
101
  registerCallbacks(callbacks, options) {
104
102
  const listeners = [];
@@ -153,8 +151,16 @@ class Emitter extends serializable_cjs.Serializable {
153
151
  raw: matcher,
154
152
  match: createMatcher()
155
153
  };
156
- this.listeners.add(listener);
157
- return () => this.listeners.delete(listener);
154
+ const priority = options?.priority ?? 0;
155
+ const insertIndex = this.listeners.findIndex((l) => (l.options?.priority ?? 0) >= priority);
156
+ if (insertIndex === -1) {
157
+ this.listeners.push(listener);
158
+ } else {
159
+ this.listeners.splice(insertIndex, 0, listener);
160
+ }
161
+ return () => {
162
+ array_cjs.removeFromArray(this.listeners, listener);
163
+ };
158
164
  }
159
165
  async emit(name, value) {
160
166
  utils_cjs.assertValidName(name);
@@ -163,12 +169,13 @@ class Emitter extends serializable_cjs.Serializable {
163
169
  }
164
170
  async invoke(data, event) {
165
171
  const executions = [];
166
- for (const listener of this.listeners.values()) {
172
+ for (let i = this.listeners.length - 1; i >= 0; i--) {
173
+ const listener = this.listeners[i];
167
174
  if (!listener.match(event)) {
168
175
  continue;
169
176
  }
170
177
  if (listener.options?.once) {
171
- this.listeners.delete(listener);
178
+ this.listeners.splice(i, 1);
172
179
  }
173
180
  const run = /* @__PURE__ */ __name(async () => listener.callback(data, event), "run");
174
181
  executions.push(listener.options?.isBlocking ? await run() : run());
@@ -196,7 +203,7 @@ class Emitter extends serializable_cjs.Serializable {
196
203
  creator: this.creator,
197
204
  context: this.context,
198
205
  trace: this.trace,
199
- listeners: Array.from(this.listeners).map(remeda.pick([
206
+ listeners: this.listeners.map(remeda.pick([
200
207
  "raw",
201
208
  "options",
202
209
  "callback"
@@ -206,7 +213,7 @@ class Emitter extends serializable_cjs.Serializable {
206
213
  }
207
214
  loadSnapshot({ listeners, ...snapshot }) {
208
215
  Object.assign(this, snapshot, {
209
- listeners: /* @__PURE__ */ new Set()
216
+ listeners: []
210
217
  });
211
218
  listeners.forEach(({ raw, callback, options }) => this.match(raw, callback, options));
212
219
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/emitter/emitter.ts"],"names":["Emitter","Serializable","listeners","Set","groupId","namespace","creator","context","trace","cleanups","input","Object","prototype","assertValidNamespace","register","root","create","child","slice","cleanup","pipe","push","target","on","toBoundedFunction","args","invoke","value","name","isBlocking","once","persistent","destroy","clear","forEach","length","reset","listener","options","delete","registerCallbacks","callbacks","entries","key","event","callback","match","matcher","createMatcher","matchers","matchNested","path","createFullPath","RegExp","test","isPath","EmitterError","matchSameRun","runId","unshift","every","raw","add","emit","assertValidName","createEvent","data","executions","values","run","Promise","all","id","createRandomHash","createdAt","Date","source","assign","shallowCopy","createSnapshot","Array","from","map","pick","loadSnapshot","snapshot"],"mappings":"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","file":"emitter.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n Callback,\n CleanupFn,\n EmitterOptions,\n EventMeta,\n EventTrace,\n Matcher,\n MatcherFn,\n StringKey,\n} from \"@/emitter/types.js\";\nexport type { EventMeta, EventTrace, Callback };\nimport { Cache } from \"@/cache/decoratorCache.js\";\nimport { createFullPath, isPath, assertValidName, assertValidNamespace } from \"@/emitter/utils.js\";\nimport { EmitterError } from \"@/emitter/errors.js\";\nimport { createRandomHash } from \"@/internals/helpers/hash.js\";\nimport { shallowCopy, toBoundedFunction } from \"@/serializer/utils.js\";\nimport { RequiredAll } from \"@/internals/types.js\";\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { pick } from \"remeda\";\n\nexport interface EmitterInput<E extends object = object> {\n groupId?: string;\n namespace?: string[];\n creator?: object;\n context?: E & object;\n trace?: EventTrace;\n}\nexport interface EmitterChildInput<E extends object = object> {\n groupId?: string;\n namespace?: string[];\n creator?: object;\n context?: E & object;\n trace?: EventTrace;\n}\n\ninterface Listener<T = any> {\n readonly match: MatcherFn;\n readonly raw: Matcher;\n readonly callback: Callback<T>;\n readonly options?: EmitterOptions;\n}\n\nexport class Emitter<T = Record<keyof any, Callback<unknown>>> extends Serializable {\n protected listeners = new Set<Listener>();\n protected readonly groupId?: string;\n public readonly namespace: string[];\n public readonly creator?: object;\n public readonly context: object;\n public readonly trace?: EventTrace;\n protected readonly cleanups: CleanupFn[] = [];\n\n constructor(input: EmitterInput = {}) {\n super();\n this.groupId = input?.groupId;\n this.namespace = input?.namespace ?? [];\n this.creator = input.creator ?? Object.prototype;\n this.context = input?.context ?? {};\n this.trace = input.trace;\n assertValidNamespace(this.namespace);\n }\n\n static {\n this.register();\n }\n\n @Cache()\n static get root() {\n return new Emitter<Record<string, Callback<any>>>({ creator: Object.create(null) });\n }\n\n child<R = T>(input: EmitterChildInput = {}): Emitter<R> {\n const child = new Emitter<R>({\n trace: input.trace ?? this.trace,\n groupId: input?.groupId ?? this.groupId,\n context: { ...this.context, ...input?.context },\n creator: input?.creator ?? this.creator,\n namespace: input?.namespace\n ? [...this.namespace, ...input.namespace]\n : this.namespace.slice(),\n });\n\n const cleanup = child.pipe(this);\n this.cleanups.push(cleanup);\n\n return child;\n }\n\n pipe(target: Emitter<any>): CleanupFn {\n return this.on(\n // @ts-expect-error\n \"*.*\",\n toBoundedFunction(\n // @ts-expect-error\n (...args) => target.invoke(...args),\n [{ value: target, name: \"target\" }],\n ),\n {\n isBlocking: true,\n once: false,\n persistent: true,\n },\n );\n }\n\n destroy() {\n this.listeners.clear();\n this.cleanups.forEach((child) => child());\n this.cleanups.length = 0;\n }\n\n reset() {\n for (const listener of this.listeners) {\n if (!listener.options?.persistent) {\n this.listeners.delete(listener);\n }\n }\n }\n\n registerCallbacks<K extends StringKey<RequiredAll<T>>>(\n callbacks: Partial<\n Record<K, NonNullable<T[K]> extends Callback<infer X> ? Callback<X> : never>\n >,\n options?: Partial<Record<K, EmitterOptions>>,\n ): CleanupFn {\n const listeners: CleanupFn[] = [];\n Object.entries(callbacks).forEach(([key, value]) => {\n if (value) {\n // @ts-expect-error\n listeners.push(this.on(key, value, options?.[key]));\n }\n });\n return () => listeners.forEach((cleanup) => cleanup());\n }\n\n on<K extends StringKey<RequiredAll<T>>>(\n event: K,\n callback: NonNullable<T[K]> extends Callback<any> ? T[K] : never,\n options?: EmitterOptions,\n ): CleanupFn {\n return this.match(event as Matcher, callback as Callback<any>, options);\n }\n\n match<L>(matcher: Matcher, callback: Callback<L>, options?: EmitterOptions): CleanupFn {\n const createMatcher = (): MatcherFn => {\n const matchers: MatcherFn[] = [];\n let matchNested = options?.matchNested;\n\n if (matcher === \"*\") {\n matchNested ??= false;\n matchers.push((event) => event.path === createFullPath(this.namespace, event.name));\n } else if (matcher === \"*.*\") {\n matchNested ??= true;\n matchers.push(() => true);\n } else if (matcher instanceof RegExp) {\n matchNested ??= true;\n matchers.push((event) => matcher.test(event.path));\n } else if (typeof matcher === \"function\") {\n matchNested ??= false;\n matchers.push(matcher);\n } else if (typeof matcher === \"string\") {\n if (isPath(matcher)) {\n matchNested ??= true;\n matchers.push((event) => event.path === matcher);\n } else {\n matchNested ??= false;\n matchers.push(\n (event) =>\n event.name === matcher && event.path === createFullPath(this.namespace, event.name),\n );\n }\n } else {\n throw new EmitterError(\"Invalid matcher provided!\");\n }\n\n if (!matchNested) {\n const matchSameRun = (event: EventMeta) => {\n // global observability x scoped observability\n return !this.trace?.runId ? true : this.trace?.runId === event.trace?.runId;\n };\n matchers.unshift(matchSameRun);\n }\n\n return (event) => matchers.every((matcher) => matcher(event));\n };\n\n const listener: Listener = {\n options,\n callback,\n raw: matcher,\n match: createMatcher(),\n };\n this.listeners.add(listener);\n\n return () => this.listeners.delete(listener);\n }\n\n async emit<K extends StringKey<RequiredAll<T>>>(\n name: K,\n value: NonNullable<T[K]> extends Callback<infer X> ? X : unknown,\n ): Promise<void> {\n assertValidName(name);\n\n const event = this.createEvent(name);\n return await this.invoke(value, event);\n }\n\n protected async invoke(data: unknown, event: EventMeta) {\n const executions: unknown[] = [];\n for (const listener of this.listeners.values()) {\n if (!listener.match(event)) {\n continue;\n }\n\n if (listener.options?.once) {\n this.listeners.delete(listener);\n }\n\n const run = async () => listener.callback(data, event);\n executions.push(listener.options?.isBlocking ? await run() : run());\n }\n await Promise.all(executions);\n }\n\n protected createEvent(name: string): EventMeta {\n return {\n id: createRandomHash(),\n groupId: this.groupId,\n name,\n path: createFullPath(this.namespace, name),\n createdAt: new Date(),\n source: this,\n creator: this.creator!,\n context: Object.assign({}, this.context, {}),\n trace: shallowCopy(this.trace), // TODO\n };\n }\n\n createSnapshot() {\n return {\n groupId: this.groupId,\n namespace: shallowCopy(this.namespace),\n creator: this.creator,\n context: this.context,\n trace: this.trace,\n listeners: Array.from(this.listeners).map(pick([\"raw\", \"options\", \"callback\"])),\n cleanups: this.cleanups,\n };\n }\n\n loadSnapshot({ listeners, ...snapshot }: ReturnType<typeof this.createSnapshot>): void {\n Object.assign(this, snapshot, { listeners: new Set() });\n listeners.forEach(({ raw, callback, options }) => this.match(raw, callback, options));\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/emitter/emitter.ts"],"names":["Emitter","Serializable","listeners","groupId","namespace","creator","context","trace","cleanups","input","Object","prototype","assertValidNamespace","register","root","create","child","slice","cleanup","pipe","push","target","on","toBoundedFunction","args","invoke","value","name","isBlocking","once","persistent","matchNested","destroy","length","forEach","reset","filter","listener","options","registerCallbacks","callbacks","entries","key","event","callback","match","matcher","createMatcher","matchers","path","createFullPath","RegExp","test","isPath","EmitterError","matchSameRun","runId","unshift","every","raw","priority","insertIndex","findIndex","l","splice","removeFromArray","emit","assertValidName","createEvent","data","executions","i","run","Promise","all","id","createRandomHash","createdAt","Date","source","assign","shallowCopy","createSnapshot","map","pick","loadSnapshot","snapshot"],"mappings":"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","file":"emitter.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n Callback,\n CleanupFn,\n EmitterOptions,\n EventMeta,\n EventTrace,\n Matcher,\n MatcherFn,\n StringKey,\n} from \"@/emitter/types.js\";\nexport type { EventMeta, EventTrace, Callback };\nimport { Cache } from \"@/cache/decoratorCache.js\";\nimport { createFullPath, isPath, assertValidName, assertValidNamespace } from \"@/emitter/utils.js\";\nimport { EmitterError } from \"@/emitter/errors.js\";\nimport { createRandomHash } from \"@/internals/helpers/hash.js\";\nimport { shallowCopy, toBoundedFunction } from \"@/serializer/utils.js\";\nimport { RequiredAll } from \"@/internals/types.js\";\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { pick } from \"remeda\";\nimport { removeFromArray } from \"@/internals/helpers/array.js\";\n\nexport interface EmitterInput<E extends object = object> {\n groupId?: string;\n namespace?: string[];\n creator?: object;\n context?: E & object;\n trace?: EventTrace;\n}\nexport interface EmitterChildInput<E extends object = object> {\n groupId?: string;\n namespace?: string[];\n creator?: object;\n context?: E & object;\n trace?: EventTrace;\n}\n\ninterface Listener<T = any> {\n readonly match: MatcherFn;\n readonly raw: Matcher;\n readonly callback: Callback<T>;\n readonly options?: EmitterOptions;\n}\n\nexport class Emitter<T = Record<keyof any, Callback<unknown>>> extends Serializable {\n protected listeners: Listener[] = [];\n protected readonly groupId?: string;\n public readonly namespace: string[];\n public readonly creator?: object;\n public readonly context: object;\n public readonly trace?: EventTrace;\n protected readonly cleanups: CleanupFn[] = [];\n\n constructor(input: EmitterInput = {}) {\n super();\n this.groupId = input?.groupId;\n this.namespace = input?.namespace ?? [];\n this.creator = input.creator ?? Object.prototype;\n this.context = input?.context ?? {};\n this.trace = input.trace;\n assertValidNamespace(this.namespace);\n }\n\n static {\n this.register();\n }\n\n @Cache()\n static get root() {\n return new Emitter<Record<string, Callback<any>>>({ creator: Object.create(null) });\n }\n\n child<R = T>(input: EmitterChildInput = {}): Emitter<R> {\n const child = new Emitter<R>({\n trace: input.trace ?? this.trace,\n groupId: input?.groupId ?? this.groupId,\n context: { ...this.context, ...input?.context },\n creator: input?.creator ?? this.creator,\n namespace: input?.namespace\n ? [...this.namespace, ...input.namespace]\n : this.namespace.slice(),\n });\n\n const cleanup = child.pipe(this);\n this.cleanups.push(cleanup);\n\n return child;\n }\n\n pipe(target: Emitter<any>): CleanupFn {\n return this.on(\n // @ts-expect-error\n \"*.*\",\n toBoundedFunction(\n // @ts-expect-error\n (...args) => target.invoke(...args),\n [{ value: target, name: \"target\" }],\n ),\n {\n isBlocking: true,\n once: false,\n persistent: true,\n matchNested: false,\n },\n );\n }\n\n destroy() {\n this.listeners.length = 0;\n this.cleanups.forEach((child) => child());\n this.cleanups.length = 0;\n }\n\n reset() {\n this.listeners = this.listeners.filter((listener) => listener.options?.persistent);\n }\n\n registerCallbacks<K extends StringKey<RequiredAll<T>>>(\n callbacks: Partial<\n Record<K, NonNullable<T[K]> extends Callback<infer X> ? Callback<X> : never>\n >,\n options?: Partial<Record<K, EmitterOptions>>,\n ): CleanupFn {\n const listeners: CleanupFn[] = [];\n Object.entries(callbacks).forEach(([key, value]) => {\n if (value) {\n // @ts-expect-error\n listeners.push(this.on(key, value, options?.[key]));\n }\n });\n return () => listeners.forEach((cleanup) => cleanup());\n }\n\n on<K extends StringKey<RequiredAll<T>>>(\n event: K,\n callback: NonNullable<T[K]> extends Callback<any> ? T[K] : never,\n options?: EmitterOptions,\n ): CleanupFn {\n return this.match(event as Matcher, callback as Callback<any>, options);\n }\n\n match<L>(matcher: Matcher, callback: Callback<L>, options?: EmitterOptions): CleanupFn {\n const createMatcher = (): MatcherFn => {\n const matchers: MatcherFn[] = [];\n let matchNested = options?.matchNested;\n\n if (matcher === \"*\") {\n matchNested ??= false;\n matchers.push((event) => event.path === createFullPath(this.namespace, event.name));\n } else if (matcher === \"*.*\") {\n matchNested ??= true;\n matchers.push(() => true);\n } else if (matcher instanceof RegExp) {\n matchNested ??= true;\n matchers.push((event) => matcher.test(event.path));\n } else if (typeof matcher === \"function\") {\n matchNested ??= false;\n matchers.push(matcher);\n } else if (typeof matcher === \"string\") {\n if (isPath(matcher)) {\n matchNested ??= true;\n matchers.push((event) => event.path === matcher);\n } else {\n matchNested ??= false;\n matchers.push(\n (event) =>\n event.name === matcher && event.path === createFullPath(this.namespace, event.name),\n );\n }\n } else {\n throw new EmitterError(\"Invalid matcher provided!\");\n }\n\n if (!matchNested) {\n const matchSameRun = (event: EventMeta) => {\n // global observability x scoped observability\n return !this.trace?.runId ? true : this.trace?.runId === event.trace?.runId;\n };\n matchers.unshift(matchSameRun);\n }\n\n return (event) => matchers.every((matcher) => matcher(event));\n };\n\n const listener: Listener = {\n options,\n callback,\n raw: matcher,\n match: createMatcher(),\n };\n\n const priority = options?.priority ?? 0;\n const insertIndex = this.listeners.findIndex((l) => (l.options?.priority ?? 0) >= priority);\n if (insertIndex === -1) {\n this.listeners.push(listener);\n } else {\n this.listeners.splice(insertIndex, 0, listener);\n }\n\n return () => {\n removeFromArray(this.listeners, listener);\n };\n }\n\n async emit<K extends StringKey<RequiredAll<T>>>(\n name: K,\n value: NonNullable<T[K]> extends Callback<infer X> ? X : unknown,\n ): Promise<void> {\n assertValidName(name);\n\n const event = this.createEvent(name);\n return await this.invoke(value, event);\n }\n\n protected async invoke(data: unknown, event: EventMeta) {\n const executions: unknown[] = [];\n // Iterate in reverse to match Python's behavior (reversed list iteration)\n for (let i = this.listeners.length - 1; i >= 0; i--) {\n const listener = this.listeners[i];\n if (!listener.match(event)) {\n continue;\n }\n\n if (listener.options?.once) {\n this.listeners.splice(i, 1);\n }\n\n const run = async () => listener.callback(data, event);\n executions.push(listener.options?.isBlocking ? await run() : run());\n }\n await Promise.all(executions);\n }\n\n protected createEvent(name: string): EventMeta {\n return {\n id: createRandomHash(),\n groupId: this.groupId,\n name,\n path: createFullPath(this.namespace, name),\n createdAt: new Date(),\n source: this,\n creator: this.creator!,\n context: Object.assign({}, this.context, {}),\n trace: shallowCopy(this.trace), // TODO\n };\n }\n\n createSnapshot() {\n return {\n groupId: this.groupId,\n namespace: shallowCopy(this.namespace),\n creator: this.creator,\n context: this.context,\n trace: this.trace,\n listeners: this.listeners.map(pick([\"raw\", \"options\", \"callback\"])),\n cleanups: this.cleanups,\n };\n }\n\n loadSnapshot({ listeners, ...snapshot }: ReturnType<typeof this.createSnapshot>): void {\n Object.assign(this, snapshot, { listeners: [] });\n listeners.forEach(({ raw, callback, options }) => this.match(raw, callback, options));\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- export { C as Callback, E as Emitter, g as EmitterChildInput, f as EmitterInput, e as EventMeta, d as EventTrace } from '../emitter-DpqUYjXH.cjs';
1
+ export { C as Callback, E as Emitter, g as EmitterChildInput, f as EmitterInput, b as EventMeta, e as EventTrace } from '../emitter-jN55XZZq.cjs';
2
2
  import '../internals/types.cjs';
3
3
  import '../internals/serializable.cjs';
4
4
  import '../internals/helpers/guards.cjs';
@@ -1,4 +1,4 @@
1
- export { C as Callback, E as Emitter, g as EmitterChildInput, f as EmitterInput, e as EventMeta, d as EventTrace } from '../emitter-CZFbzlUi.js';
1
+ export { C as Callback, E as Emitter, g as EmitterChildInput, f as EmitterInput, b as EventMeta, e as EventTrace } from '../emitter-36-9MnvA.js';
2
2
  import '../internals/types.js';
3
3
  import '../internals/serializable.js';
4
4
  import '../internals/helpers/guards.js';