beeai-framework 0.1.21 → 0.1.22

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 (303) 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.d.cts +2 -2
  50. package/dist/adapters/ollama/backend/chat.d.ts +2 -2
  51. package/dist/adapters/ollama/backend/embedding.d.cts +2 -2
  52. package/dist/adapters/ollama/backend/embedding.d.ts +2 -2
  53. package/dist/adapters/openai/backend/chat.d.cts +2 -2
  54. package/dist/adapters/openai/backend/chat.d.ts +2 -2
  55. package/dist/adapters/openai/backend/embedding.d.cts +2 -2
  56. package/dist/adapters/openai/backend/embedding.d.ts +2 -2
  57. package/dist/adapters/vercel/backend/chat.d.cts +2 -2
  58. package/dist/adapters/vercel/backend/chat.d.ts +2 -2
  59. package/dist/adapters/vercel/backend/embedding.d.cts +2 -2
  60. package/dist/adapters/vercel/backend/embedding.d.ts +2 -2
  61. package/dist/adapters/vercel/backend/utils.cjs +15 -0
  62. package/dist/adapters/vercel/backend/utils.cjs.map +1 -1
  63. package/dist/adapters/vercel/backend/utils.d.cts +4 -3
  64. package/dist/adapters/vercel/backend/utils.d.ts +4 -3
  65. package/dist/adapters/vercel/backend/utils.js +15 -1
  66. package/dist/adapters/vercel/backend/utils.js.map +1 -1
  67. package/dist/adapters/watsonx/backend/chat.d.cts +2 -2
  68. package/dist/adapters/watsonx/backend/chat.d.ts +2 -2
  69. package/dist/adapters/watsonx/backend/embedding.d.cts +2 -2
  70. package/dist/adapters/watsonx/backend/embedding.d.ts +2 -2
  71. package/dist/adapters/xai/backend/chat.d.cts +2 -2
  72. package/dist/adapters/xai/backend/chat.d.ts +2 -2
  73. package/dist/{agent-DvvVGvLr.d.cts → agent-BMfyig7X.d.cts} +5 -4
  74. package/dist/{agent-CHebzsQB.d.ts → agent-Dxw8AGWb.d.ts} +5 -4
  75. package/dist/agents/base.cjs +5 -2
  76. package/dist/agents/base.cjs.map +1 -1
  77. package/dist/agents/base.d.cts +2 -2
  78. package/dist/agents/base.d.ts +2 -2
  79. package/dist/agents/base.js +5 -2
  80. package/dist/agents/base.js.map +1 -1
  81. package/dist/agents/experimental/replan/agent.d.cts +3 -3
  82. package/dist/agents/experimental/replan/agent.d.ts +3 -3
  83. package/dist/agents/experimental/replan/prompts.d.cts +1 -1
  84. package/dist/agents/experimental/replan/prompts.d.ts +1 -1
  85. package/dist/agents/experimental/streamlit/agent.d.cts +8 -12
  86. package/dist/agents/experimental/streamlit/agent.d.ts +8 -12
  87. package/dist/agents/react/agent.d.cts +4 -4
  88. package/dist/agents/react/agent.d.ts +4 -4
  89. package/dist/agents/react/prompts.d.cts +1 -1
  90. package/dist/agents/react/prompts.d.ts +1 -1
  91. package/dist/agents/react/runners/base.d.cts +4 -4
  92. package/dist/agents/react/runners/base.d.ts +4 -4
  93. package/dist/agents/react/runners/deep-think/prompts.d.cts +1 -1
  94. package/dist/agents/react/runners/deep-think/prompts.d.ts +1 -1
  95. package/dist/agents/react/runners/deep-think/runner.d.cts +5 -5
  96. package/dist/agents/react/runners/deep-think/runner.d.ts +5 -5
  97. package/dist/agents/react/runners/default/runner.d.cts +5 -5
  98. package/dist/agents/react/runners/default/runner.d.ts +5 -5
  99. package/dist/agents/react/runners/granite/prompts.d.cts +1 -1
  100. package/dist/agents/react/runners/granite/prompts.d.ts +1 -1
  101. package/dist/agents/react/runners/granite/runner.d.cts +5 -5
  102. package/dist/agents/react/runners/granite/runner.d.ts +5 -5
  103. package/dist/agents/react/types.d.cts +2 -2
  104. package/dist/agents/react/types.d.ts +2 -2
  105. package/dist/agents/requirement/agent.cjs +162 -0
  106. package/dist/agents/requirement/agent.cjs.map +1 -0
  107. package/dist/agents/requirement/agent.d.cts +29 -0
  108. package/dist/agents/requirement/agent.d.ts +29 -0
  109. package/dist/agents/requirement/agent.js +160 -0
  110. package/dist/agents/requirement/agent.js.map +1 -0
  111. package/dist/agents/requirement/prompts.cjs +95 -0
  112. package/dist/agents/requirement/prompts.cjs.map +1 -0
  113. package/dist/agents/requirement/prompts.d.cts +107 -0
  114. package/dist/agents/requirement/prompts.d.ts +107 -0
  115. package/dist/agents/requirement/prompts.js +90 -0
  116. package/dist/agents/requirement/prompts.js.map +1 -0
  117. package/dist/agents/requirement/requirements/conditional.cjs +190 -0
  118. package/dist/agents/requirement/requirements/conditional.cjs.map +1 -0
  119. package/dist/agents/requirement/requirements/conditional.d.cts +71 -0
  120. package/dist/agents/requirement/requirements/conditional.d.ts +71 -0
  121. package/dist/agents/requirement/requirements/conditional.js +188 -0
  122. package/dist/agents/requirement/requirements/conditional.js.map +1 -0
  123. package/dist/agents/requirement/requirements/requirement.cjs +107 -0
  124. package/dist/agents/requirement/requirements/requirement.cjs.map +1 -0
  125. package/dist/agents/requirement/requirements/requirement.d.cts +59 -0
  126. package/dist/agents/requirement/requirements/requirement.d.ts +59 -0
  127. package/dist/agents/requirement/requirements/requirement.js +104 -0
  128. package/dist/agents/requirement/requirements/requirement.js.map +1 -0
  129. package/dist/agents/requirement/requirements/utils.cjs +74 -0
  130. package/dist/agents/requirement/requirements/utils.cjs.map +1 -0
  131. package/dist/agents/requirement/requirements/utils.d.cts +40 -0
  132. package/dist/agents/requirement/requirements/utils.d.ts +40 -0
  133. package/dist/agents/requirement/requirements/utils.js +69 -0
  134. package/dist/agents/requirement/requirements/utils.js.map +1 -0
  135. package/dist/agents/requirement/runner.cjs +252 -0
  136. package/dist/agents/requirement/runner.cjs.map +1 -0
  137. package/dist/agents/requirement/runner.d.cts +117 -0
  138. package/dist/agents/requirement/runner.d.ts +117 -0
  139. package/dist/agents/requirement/runner.js +250 -0
  140. package/dist/agents/requirement/runner.js.map +1 -0
  141. package/dist/agents/requirement/types.cjs +40 -0
  142. package/dist/agents/requirement/types.cjs.map +1 -0
  143. package/dist/agents/requirement/types.d.cts +24 -0
  144. package/dist/agents/requirement/types.d.ts +24 -0
  145. package/dist/agents/requirement/types.js +35 -0
  146. package/dist/agents/requirement/types.js.map +1 -0
  147. package/dist/agents/requirement/utils/llm.cjs +202 -0
  148. package/dist/agents/requirement/utils/llm.cjs.map +1 -0
  149. package/dist/agents/requirement/utils/llm.d.cts +50 -0
  150. package/dist/agents/requirement/utils/llm.d.ts +50 -0
  151. package/dist/agents/requirement/utils/llm.js +199 -0
  152. package/dist/agents/requirement/utils/llm.js.map +1 -0
  153. package/dist/agents/requirement/utils/tool.cjs +94 -0
  154. package/dist/agents/requirement/utils/tool.cjs.map +1 -0
  155. package/dist/agents/requirement/utils/tool.d.cts +24 -0
  156. package/dist/agents/requirement/utils/tool.d.ts +24 -0
  157. package/dist/agents/requirement/utils/tool.js +91 -0
  158. package/dist/agents/requirement/utils/tool.js.map +1 -0
  159. package/dist/agents/requirement/utils/toolCallChecker.cjs +61 -0
  160. package/dist/agents/requirement/utils/toolCallChecker.cjs.map +1 -0
  161. package/dist/agents/requirement/utils/toolCallChecker.d.cts +28 -0
  162. package/dist/agents/requirement/utils/toolCallChecker.d.ts +28 -0
  163. package/dist/agents/requirement/utils/toolCallChecker.js +59 -0
  164. package/dist/agents/requirement/utils/toolCallChecker.js.map +1 -0
  165. package/dist/agents/toolCalling/agent.d.cts +8 -12
  166. package/dist/agents/toolCalling/agent.d.ts +8 -12
  167. package/dist/agents/toolCalling/types.d.cts +1 -1
  168. package/dist/agents/toolCalling/types.d.ts +1 -1
  169. package/dist/agents/types.d.cts +2 -2
  170. package/dist/agents/types.d.ts +2 -2
  171. package/dist/backend/backend.d.cts +2 -2
  172. package/dist/backend/backend.d.ts +2 -2
  173. package/dist/backend/chat.d.cts +2 -2
  174. package/dist/backend/chat.d.ts +2 -2
  175. package/dist/backend/core.d.cts +2 -2
  176. package/dist/backend/core.d.ts +2 -2
  177. package/dist/backend/embedding.d.cts +2 -2
  178. package/dist/backend/embedding.d.ts +2 -2
  179. package/dist/backend/utils.d.cts +2 -2
  180. package/dist/backend/utils.d.ts +2 -2
  181. package/dist/{base-BQgDlcGa.d.ts → base-BurRTBA7.d.ts} +4 -2
  182. package/dist/{base-CwcxwybB.d.cts → base-v-PYIq5G.d.cts} +4 -2
  183. package/dist/{chat-C0s-o6ll.d.ts → chat-BbCYMAdE.d.ts} +1 -1
  184. package/dist/{chat-CRb3vUVg.d.cts → chat-DB_cf15S.d.cts} +1 -1
  185. package/dist/context.cjs +22 -5
  186. package/dist/context.cjs.map +1 -1
  187. package/dist/context.d.cts +19 -6
  188. package/dist/context.d.ts +19 -6
  189. package/dist/context.js +23 -7
  190. package/dist/context.js.map +1 -1
  191. package/dist/emitter/emitter.cjs +19 -13
  192. package/dist/emitter/emitter.cjs.map +1 -1
  193. package/dist/emitter/emitter.d.cts +1 -1
  194. package/dist/emitter/emitter.d.ts +1 -1
  195. package/dist/emitter/emitter.js +19 -13
  196. package/dist/emitter/emitter.js.map +1 -1
  197. package/dist/emitter/types.d.cts +1 -1
  198. package/dist/emitter/types.d.ts +1 -1
  199. package/dist/{emitter-DpqUYjXH.d.cts → emitter-CGKd_-kK.d.cts} +3 -2
  200. package/dist/{emitter-CZFbzlUi.d.ts → emitter-CN7I4uSV.d.ts} +3 -2
  201. package/dist/index.d.cts +5 -5
  202. package/dist/index.d.ts +5 -5
  203. package/dist/internals/fetcher.d.cts +1 -1
  204. package/dist/internals/fetcher.d.ts +1 -1
  205. package/dist/internals/helpers/prototype.cjs +5 -0
  206. package/dist/internals/helpers/prototype.cjs.map +1 -1
  207. package/dist/internals/helpers/prototype.d.cts +2 -1
  208. package/dist/internals/helpers/prototype.d.ts +2 -1
  209. package/dist/internals/helpers/prototype.js +5 -1
  210. package/dist/internals/helpers/prototype.js.map +1 -1
  211. package/dist/internals/types.cjs.map +1 -1
  212. package/dist/internals/types.d.cts +1 -1
  213. package/dist/internals/types.d.ts +1 -1
  214. package/dist/internals/types.js.map +1 -1
  215. package/dist/memory/summarizeMemory.d.cts +2 -2
  216. package/dist/memory/summarizeMemory.d.ts +2 -2
  217. package/dist/middleware/trajectory.cjs +322 -0
  218. package/dist/middleware/trajectory.cjs.map +1 -0
  219. package/dist/middleware/trajectory.d.cts +115 -0
  220. package/dist/middleware/trajectory.d.ts +115 -0
  221. package/dist/middleware/trajectory.js +320 -0
  222. package/dist/middleware/trajectory.js.map +1 -0
  223. package/dist/parsers/linePrefix.d.cts +1 -1
  224. package/dist/parsers/linePrefix.d.ts +1 -1
  225. package/dist/serializer/serializer.cjs +5 -4
  226. package/dist/serializer/serializer.cjs.map +1 -1
  227. package/dist/serializer/serializer.d.cts +1 -1
  228. package/dist/serializer/serializer.d.ts +1 -1
  229. package/dist/serializer/serializer.js +5 -4
  230. package/dist/serializer/serializer.js.map +1 -1
  231. package/dist/serializer/utils.cjs +3 -0
  232. package/dist/serializer/utils.cjs.map +1 -1
  233. package/dist/serializer/utils.d.cts +1 -1
  234. package/dist/serializer/utils.d.ts +1 -1
  235. package/dist/serializer/utils.js +3 -0
  236. package/dist/serializer/utils.js.map +1 -1
  237. package/dist/{serializer-CQxucveV.d.ts → serializer-53t8gGQa.d.ts} +3 -2
  238. package/dist/{serializer-BKn50Vnx.d.cts → serializer-c51B2z6d.d.cts} +3 -2
  239. package/dist/template.cjs +20 -0
  240. package/dist/template.cjs.map +1 -1
  241. package/dist/template.d.cts +1 -0
  242. package/dist/template.d.ts +1 -0
  243. package/dist/template.js +20 -0
  244. package/dist/template.js.map +1 -1
  245. package/dist/tools/arxiv.d.cts +1 -1
  246. package/dist/tools/arxiv.d.ts +1 -1
  247. package/dist/tools/base.cjs.map +1 -1
  248. package/dist/tools/base.d.cts +3 -2
  249. package/dist/tools/base.d.ts +3 -2
  250. package/dist/tools/base.js.map +1 -1
  251. package/dist/tools/calculator.d.cts +1 -1
  252. package/dist/tools/calculator.d.ts +1 -1
  253. package/dist/tools/custom.d.cts +2 -2
  254. package/dist/tools/custom.d.ts +2 -2
  255. package/dist/tools/database/elasticsearch.d.cts +1 -1
  256. package/dist/tools/database/elasticsearch.d.ts +1 -1
  257. package/dist/tools/database/milvus.d.cts +1 -1
  258. package/dist/tools/database/milvus.d.ts +1 -1
  259. package/dist/tools/database/qdrant.d.cts +1 -1
  260. package/dist/tools/database/qdrant.d.ts +1 -1
  261. package/dist/tools/database/sql.d.cts +1 -1
  262. package/dist/tools/database/sql.d.ts +1 -1
  263. package/dist/tools/llm.d.cts +2 -2
  264. package/dist/tools/llm.d.ts +2 -2
  265. package/dist/tools/mcp.d.cts +1 -1
  266. package/dist/tools/mcp.d.ts +1 -1
  267. package/dist/tools/openapi.d.cts +1 -1
  268. package/dist/tools/openapi.d.ts +1 -1
  269. package/dist/tools/python/output.d.cts +1 -1
  270. package/dist/tools/python/output.d.ts +1 -1
  271. package/dist/tools/python/python.d.cts +2 -2
  272. package/dist/tools/python/python.d.ts +2 -2
  273. package/dist/tools/search/base.d.cts +1 -1
  274. package/dist/tools/search/base.d.ts +1 -1
  275. package/dist/tools/search/duckDuckGoSearch.d.cts +1 -1
  276. package/dist/tools/search/duckDuckGoSearch.d.ts +1 -1
  277. package/dist/tools/search/googleSearch.d.cts +1 -1
  278. package/dist/tools/search/googleSearch.d.ts +1 -1
  279. package/dist/tools/search/searXNGSearch.d.cts +1 -1
  280. package/dist/tools/search/searXNGSearch.d.ts +1 -1
  281. package/dist/tools/search/wikipedia.d.cts +1 -1
  282. package/dist/tools/search/wikipedia.d.ts +1 -1
  283. package/dist/tools/similarity.d.cts +1 -1
  284. package/dist/tools/similarity.d.ts +1 -1
  285. package/dist/tools/think.cjs +52 -0
  286. package/dist/tools/think.cjs.map +1 -0
  287. package/dist/tools/think.d.cts +47 -0
  288. package/dist/tools/think.d.ts +47 -0
  289. package/dist/tools/think.js +50 -0
  290. package/dist/tools/think.js.map +1 -0
  291. package/dist/tools/weather/openMeteo.d.cts +1 -1
  292. package/dist/tools/weather/openMeteo.d.ts +1 -1
  293. package/dist/tools/web/webCrawler.d.cts +1 -1
  294. package/dist/tools/web/webCrawler.d.ts +1 -1
  295. package/dist/types-BXkkbABd.d.ts +213 -0
  296. package/dist/types-Cx6f43du.d.cts +213 -0
  297. package/dist/version.cjs +1 -1
  298. package/dist/version.js +1 -1
  299. package/dist/workflows/agent.d.cts +3 -3
  300. package/dist/workflows/agent.d.ts +3 -3
  301. package/dist/workflows/workflow.d.cts +1 -1
  302. package/dist/workflows/workflow.d.ts +1 -1
  303. package/package.json +4 -4
@@ -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-CGKd_-kK.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-CN7I4uSV.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;
@@ -89,16 +90,12 @@ class Emitter extends serializable_cjs.Serializable {
89
90
  );
90
91
  }
91
92
  destroy() {
92
- this.listeners.clear();
93
+ this.listeners.length = 0;
93
94
  this.cleanups.forEach((child) => child());
94
95
  this.cleanups.length = 0;
95
96
  }
96
97
  reset() {
97
- for (const listener of this.listeners) {
98
- if (!listener.options?.persistent) {
99
- this.listeners.delete(listener);
100
- }
101
- }
98
+ this.listeners = this.listeners.filter((listener) => listener.options?.persistent);
102
99
  }
103
100
  registerCallbacks(callbacks, options) {
104
101
  const listeners = [];
@@ -153,8 +150,16 @@ class Emitter extends serializable_cjs.Serializable {
153
150
  raw: matcher,
154
151
  match: createMatcher()
155
152
  };
156
- this.listeners.add(listener);
157
- return () => this.listeners.delete(listener);
153
+ const priority = options?.priority ?? 0;
154
+ const insertIndex = this.listeners.findIndex((l) => (l.options?.priority ?? 0) >= priority);
155
+ if (insertIndex === -1) {
156
+ this.listeners.push(listener);
157
+ } else {
158
+ this.listeners.splice(insertIndex, 0, listener);
159
+ }
160
+ return () => {
161
+ array_cjs.removeFromArray(this.listeners, listener);
162
+ };
158
163
  }
159
164
  async emit(name, value) {
160
165
  utils_cjs.assertValidName(name);
@@ -163,12 +168,13 @@ class Emitter extends serializable_cjs.Serializable {
163
168
  }
164
169
  async invoke(data, event) {
165
170
  const executions = [];
166
- for (const listener of this.listeners.values()) {
171
+ for (let i = this.listeners.length - 1; i >= 0; i--) {
172
+ const listener = this.listeners[i];
167
173
  if (!listener.match(event)) {
168
174
  continue;
169
175
  }
170
176
  if (listener.options?.once) {
171
- this.listeners.delete(listener);
177
+ this.listeners.splice(i, 1);
172
178
  }
173
179
  const run = /* @__PURE__ */ __name(async () => listener.callback(data, event), "run");
174
180
  executions.push(listener.options?.isBlocking ? await run() : run());
@@ -196,7 +202,7 @@ class Emitter extends serializable_cjs.Serializable {
196
202
  creator: this.creator,
197
203
  context: this.context,
198
204
  trace: this.trace,
199
- listeners: Array.from(this.listeners).map(remeda.pick([
205
+ listeners: this.listeners.map(remeda.pick([
200
206
  "raw",
201
207
  "options",
202
208
  "callback"
@@ -206,7 +212,7 @@ class Emitter extends serializable_cjs.Serializable {
206
212
  }
207
213
  loadSnapshot({ listeners, ...snapshot }) {
208
214
  Object.assign(this, snapshot, {
209
- listeners: /* @__PURE__ */ new Set()
215
+ listeners: []
210
216
  });
211
217
  listeners.forEach(({ raw, callback, options }) => this.match(raw, callback, options));
212
218
  }
@@ -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","destroy","length","forEach","reset","filter","listener","options","registerCallbacks","callbacks","entries","key","event","callback","match","matcher","createMatcher","matchers","matchNested","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 },\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, a as EventMeta, e as EventTrace } from '../emitter-CGKd_-kK.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, a as EventMeta, e as EventTrace } from '../emitter-CN7I4uSV.js';
2
2
  import '../internals/types.js';
3
3
  import '../internals/serializable.js';
4
4
  import '../internals/helpers/guards.js';
@@ -5,6 +5,7 @@ import { createRandomHash } from '../internals/helpers/hash.js';
5
5
  import { toBoundedFunction, shallowCopy } from '../serializer/utils.js';
6
6
  import { Serializable } from '../internals/serializable.js';
7
7
  import { pick } from 'remeda';
8
+ import { removeFromArray } from '../internals/helpers/array.js';
8
9
 
9
10
  var __defProp = Object.defineProperty;
10
11
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
@@ -23,7 +24,7 @@ class Emitter extends Serializable {
23
24
  static {
24
25
  __name(this, "Emitter");
25
26
  }
26
- listeners = /* @__PURE__ */ new Set();
27
+ listeners = [];
27
28
  groupId;
28
29
  namespace;
29
30
  creator;
@@ -87,16 +88,12 @@ class Emitter extends Serializable {
87
88
  );
88
89
  }
89
90
  destroy() {
90
- this.listeners.clear();
91
+ this.listeners.length = 0;
91
92
  this.cleanups.forEach((child) => child());
92
93
  this.cleanups.length = 0;
93
94
  }
94
95
  reset() {
95
- for (const listener of this.listeners) {
96
- if (!listener.options?.persistent) {
97
- this.listeners.delete(listener);
98
- }
99
- }
96
+ this.listeners = this.listeners.filter((listener) => listener.options?.persistent);
100
97
  }
101
98
  registerCallbacks(callbacks, options) {
102
99
  const listeners = [];
@@ -151,8 +148,16 @@ class Emitter extends Serializable {
151
148
  raw: matcher,
152
149
  match: createMatcher()
153
150
  };
154
- this.listeners.add(listener);
155
- return () => this.listeners.delete(listener);
151
+ const priority = options?.priority ?? 0;
152
+ const insertIndex = this.listeners.findIndex((l) => (l.options?.priority ?? 0) >= priority);
153
+ if (insertIndex === -1) {
154
+ this.listeners.push(listener);
155
+ } else {
156
+ this.listeners.splice(insertIndex, 0, listener);
157
+ }
158
+ return () => {
159
+ removeFromArray(this.listeners, listener);
160
+ };
156
161
  }
157
162
  async emit(name, value) {
158
163
  assertValidName(name);
@@ -161,12 +166,13 @@ class Emitter extends Serializable {
161
166
  }
162
167
  async invoke(data, event) {
163
168
  const executions = [];
164
- for (const listener of this.listeners.values()) {
169
+ for (let i = this.listeners.length - 1; i >= 0; i--) {
170
+ const listener = this.listeners[i];
165
171
  if (!listener.match(event)) {
166
172
  continue;
167
173
  }
168
174
  if (listener.options?.once) {
169
- this.listeners.delete(listener);
175
+ this.listeners.splice(i, 1);
170
176
  }
171
177
  const run = /* @__PURE__ */ __name(async () => listener.callback(data, event), "run");
172
178
  executions.push(listener.options?.isBlocking ? await run() : run());
@@ -194,7 +200,7 @@ class Emitter extends Serializable {
194
200
  creator: this.creator,
195
201
  context: this.context,
196
202
  trace: this.trace,
197
- listeners: Array.from(this.listeners).map(pick([
203
+ listeners: this.listeners.map(pick([
198
204
  "raw",
199
205
  "options",
200
206
  "callback"
@@ -204,7 +210,7 @@ class Emitter extends Serializable {
204
210
  }
205
211
  loadSnapshot({ listeners, ...snapshot }) {
206
212
  Object.assign(this, snapshot, {
207
- listeners: /* @__PURE__ */ new Set()
213
+ listeners: []
208
214
  });
209
215
  listeners.forEach(({ raw, callback, options }) => this.match(raw, callback, options));
210
216
  }