@graphrefly/ts 0.0.0 → 0.0.2

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 (405) hide show
  1. package/README.md +135 -0
  2. package/dist/actions-types-CSC3NMDl.d.ts +657 -0
  3. package/dist/actions-types-wl9Mgkmr.d.cts +657 -0
  4. package/dist/adapters/index.cjs +5219 -2974
  5. package/dist/adapters/index.cjs.map +1 -1
  6. package/dist/adapters/index.d.cts +204 -192
  7. package/dist/adapters/index.d.ts +204 -192
  8. package/dist/adapters/index.js +3685 -1833
  9. package/dist/adapters/index.js.map +1 -1
  10. package/dist/adapters/nestjs/microservices.cjs +841 -0
  11. package/dist/adapters/nestjs/microservices.cjs.map +1 -0
  12. package/dist/adapters/nestjs/microservices.d.cts +45 -0
  13. package/dist/adapters/nestjs/microservices.d.ts +45 -0
  14. package/dist/adapters/nestjs/microservices.js +206 -0
  15. package/dist/adapters/nestjs/microservices.js.map +1 -0
  16. package/dist/adapters/nestjs/native.cjs +1391 -0
  17. package/dist/adapters/nestjs/native.cjs.map +1 -0
  18. package/dist/adapters/nestjs/native.d.cts +111 -0
  19. package/dist/adapters/nestjs/native.d.ts +111 -0
  20. package/dist/adapters/nestjs/native.js +577 -0
  21. package/dist/adapters/nestjs/native.js.map +1 -0
  22. package/dist/adapters/nestjs/websockets.cjs +924 -0
  23. package/dist/adapters/nestjs/websockets.cjs.map +1 -0
  24. package/dist/adapters/nestjs/websockets.d.cts +47 -0
  25. package/dist/adapters/nestjs/websockets.d.ts +47 -0
  26. package/dist/adapters/nestjs/websockets.js +286 -0
  27. package/dist/adapters/nestjs/websockets.js.map +1 -0
  28. package/dist/adapters/nestjs.cjs +1085 -0
  29. package/dist/adapters/nestjs.cjs.map +1 -0
  30. package/dist/adapters/nestjs.d.cts +385 -0
  31. package/dist/adapters/nestjs.d.ts +385 -0
  32. package/dist/adapters/nestjs.js +112 -0
  33. package/dist/adapters/nestjs.js.map +1 -0
  34. package/dist/adapters/observe-storage.d.cts +4 -4
  35. package/dist/adapters/observe-storage.d.ts +4 -4
  36. package/dist/adapters/observe-storage.js +5 -4
  37. package/dist/adapters/observe-storage.js.map +1 -1
  38. package/dist/adapters/react.cjs +166 -0
  39. package/dist/adapters/react.cjs.map +1 -0
  40. package/dist/adapters/react.d.cts +31 -0
  41. package/dist/adapters/react.d.ts +31 -0
  42. package/dist/adapters/react.js +51 -0
  43. package/dist/adapters/react.js.map +1 -0
  44. package/dist/adapters/solid.cjs +157 -0
  45. package/dist/adapters/solid.cjs.map +1 -0
  46. package/dist/adapters/solid.d.cts +26 -0
  47. package/dist/adapters/solid.d.ts +26 -0
  48. package/dist/adapters/solid.js +48 -0
  49. package/dist/adapters/solid.js.map +1 -0
  50. package/dist/adapters/svelte.cjs +148 -0
  51. package/dist/adapters/svelte.cjs.map +1 -0
  52. package/dist/adapters/svelte.d.cts +31 -0
  53. package/dist/adapters/svelte.d.ts +31 -0
  54. package/dist/adapters/svelte.js +46 -0
  55. package/dist/adapters/svelte.js.map +1 -0
  56. package/dist/adapters/vue.cjs +155 -0
  57. package/dist/adapters/vue.cjs.map +1 -0
  58. package/dist/adapters/vue.d.cts +26 -0
  59. package/dist/adapters/vue.d.ts +26 -0
  60. package/dist/adapters/vue.js +46 -0
  61. package/dist/adapters/vue.js.map +1 -0
  62. package/dist/agent-runtime-types-core-CaXfKNtY.d.cts +406 -0
  63. package/dist/agent-runtime-types-core-hU299uIC.d.ts +406 -0
  64. package/dist/agent-runtime-types-tool-BEpSINol.d.ts +695 -0
  65. package/dist/agent-runtime-types-tool-DninPEzk.d.cts +695 -0
  66. package/dist/agentic-memory-retention-BmGX368S.d.ts +14 -0
  67. package/dist/agentic-memory-retention-Ih1qhX9Z.d.cts +14 -0
  68. package/dist/agentic-memory-types-CVSUS6XR.d.ts +473 -0
  69. package/dist/agentic-memory-types-FnnYlVUs.d.cts +473 -0
  70. package/dist/capability-admission-BW2CziT6.d.ts +102 -0
  71. package/dist/capability-admission-lwSecxXs.d.cts +102 -0
  72. package/dist/chunk-2KUAG2GZ.js +9693 -0
  73. package/dist/chunk-2KUAG2GZ.js.map +1 -0
  74. package/dist/chunk-2NJP6GO4.js +1320 -0
  75. package/dist/chunk-2NJP6GO4.js.map +1 -0
  76. package/dist/{chunk-GDL26N2T.js → chunk-3KN7NJDR.js} +2 -2
  77. package/dist/{chunk-COHO25CZ.js → chunk-4NWSNI4K.js} +2232 -1672
  78. package/dist/chunk-4NWSNI4K.js.map +1 -0
  79. package/dist/{chunk-Z2ANQ6JW.js → chunk-4Q77MMJY.js} +2 -2
  80. package/dist/chunk-6E76H4OU.js +132 -0
  81. package/dist/chunk-6E76H4OU.js.map +1 -0
  82. package/dist/chunk-7GOTIIQ7.js +819 -0
  83. package/dist/chunk-7GOTIIQ7.js.map +1 -0
  84. package/dist/{chunk-D6BG7U6A.js → chunk-7HZRJMN6.js} +3 -3
  85. package/dist/{chunk-SCRFRCGR.js → chunk-BSQGE5PS.js} +1 -1
  86. package/dist/{chunk-PKVBHGBM.js → chunk-CJIFGJQG.js} +7 -7
  87. package/dist/{chunk-G4M3NHRJ.js → chunk-CX6B6PO2.js} +93 -10
  88. package/dist/chunk-CX6B6PO2.js.map +1 -0
  89. package/dist/chunk-DGUM43GV.js +11 -0
  90. package/dist/chunk-DGUM43GV.js.map +1 -0
  91. package/dist/{chunk-JIMUDQN3.js → chunk-E4QCH32M.js} +449 -447
  92. package/dist/chunk-E4QCH32M.js.map +1 -0
  93. package/dist/{chunk-RIIOUTGM.js → chunk-ECURQ3HD.js} +19 -129
  94. package/dist/chunk-ECURQ3HD.js.map +1 -0
  95. package/dist/{chunk-2ILL7HQI.js → chunk-EOKT4QFF.js} +134 -128
  96. package/dist/chunk-EOKT4QFF.js.map +1 -0
  97. package/dist/{chunk-K3FXTC3I.js → chunk-HJACH5PU.js} +3 -3
  98. package/dist/{chunk-GTPCOEOZ.js → chunk-IDMLXLLG.js} +3 -3
  99. package/dist/{chunk-DKP56CSW.js → chunk-JKAYLDQV.js} +2 -2
  100. package/dist/{chunk-4VLAQHZI.js → chunk-K7FB3JTD.js} +17 -1
  101. package/dist/chunk-K7FB3JTD.js.map +1 -0
  102. package/dist/chunk-L6LDXRWE.js +219 -0
  103. package/dist/chunk-L6LDXRWE.js.map +1 -0
  104. package/dist/chunk-M7J6Z4IJ.js +1930 -0
  105. package/dist/chunk-M7J6Z4IJ.js.map +1 -0
  106. package/dist/chunk-MQEQMS7B.js +1009 -0
  107. package/dist/chunk-MQEQMS7B.js.map +1 -0
  108. package/dist/chunk-MTELVIYR.js +1421 -0
  109. package/dist/chunk-MTELVIYR.js.map +1 -0
  110. package/dist/chunk-PVC7WDKI.js +885 -0
  111. package/dist/chunk-PVC7WDKI.js.map +1 -0
  112. package/dist/chunk-RAHNUYA5.js +368 -0
  113. package/dist/chunk-RAHNUYA5.js.map +1 -0
  114. package/dist/{chunk-DK554R7P.js → chunk-S6HXABGL.js} +2 -1
  115. package/dist/chunk-S6HXABGL.js.map +1 -0
  116. package/dist/{chunk-I3IHOHCJ.js → chunk-SHZDP2MQ.js} +1181 -1001
  117. package/dist/chunk-SHZDP2MQ.js.map +1 -0
  118. package/dist/{chunk-Y3ZLRGHC.js → chunk-SIDJO2T4.js} +16 -16
  119. package/dist/chunk-STXRMPW4.js +4131 -0
  120. package/dist/chunk-STXRMPW4.js.map +1 -0
  121. package/dist/{chunk-JR4IKCR2.js → chunk-TPND5MJS.js} +5 -5
  122. package/dist/chunk-TQPCAIQI.js +612 -0
  123. package/dist/chunk-TQPCAIQI.js.map +1 -0
  124. package/dist/chunk-UT3MHJCW.js +49 -0
  125. package/dist/chunk-UT3MHJCW.js.map +1 -0
  126. package/dist/{chunk-TEW47IVR.js → chunk-VPEFSDME.js} +2 -2
  127. package/dist/{chunk-SWTLEQL6.js → chunk-WQIA3GFB.js} +2 -2
  128. package/dist/chunk-WQIA3GFB.js.map +1 -0
  129. package/dist/{chunk-DJC4CHLQ.js → chunk-YDWBXXQZ.js} +5 -5
  130. package/dist/{chunk-6PHB5CJS.js → chunk-ZLFRB6FI.js} +2 -2
  131. package/dist/composition/index.cjs +1256 -1059
  132. package/dist/composition/index.cjs.map +1 -1
  133. package/dist/composition/index.d.cts +4 -4
  134. package/dist/composition/index.d.ts +4 -4
  135. package/dist/composition/index.js +7 -6
  136. package/dist/core/index.cjs +1218 -1021
  137. package/dist/core/index.cjs.map +1 -1
  138. package/dist/core/index.d.cts +2 -2
  139. package/dist/core/index.d.ts +2 -2
  140. package/dist/core/index.js +5 -4
  141. package/dist/cqrs/index.cjs.map +1 -1
  142. package/dist/cqrs/index.d.cts +4 -4
  143. package/dist/cqrs/index.d.ts +4 -4
  144. package/dist/cqrs/index.js +3 -2
  145. package/dist/cqrs/index.js.map +1 -1
  146. package/dist/cqrs/messaging.cjs +312 -0
  147. package/dist/cqrs/messaging.cjs.map +1 -0
  148. package/dist/cqrs/messaging.d.cts +57 -0
  149. package/dist/cqrs/messaging.d.ts +57 -0
  150. package/dist/cqrs/messaging.js +274 -0
  151. package/dist/cqrs/messaging.js.map +1 -0
  152. package/dist/cqrs/work-queue.cjs +329 -0
  153. package/dist/cqrs/work-queue.cjs.map +1 -0
  154. package/dist/cqrs/work-queue.d.cts +90 -0
  155. package/dist/cqrs/work-queue.d.ts +90 -0
  156. package/dist/cqrs/work-queue.js +292 -0
  157. package/dist/cqrs/work-queue.js.map +1 -0
  158. package/dist/data/index.cjs +19 -0
  159. package/dist/data/index.cjs.map +1 -0
  160. package/dist/data/index.d.cts +36 -0
  161. package/dist/data/index.d.ts +36 -0
  162. package/dist/data/index.js +1 -0
  163. package/dist/data/index.js.map +1 -0
  164. package/dist/data-structures/index.cjs +1252 -1052
  165. package/dist/data-structures/index.cjs.map +1 -1
  166. package/dist/data-structures/index.d.cts +9 -8
  167. package/dist/data-structures/index.d.ts +9 -8
  168. package/dist/data-structures/index.js +9 -7
  169. package/dist/{describe-BZb7AS2y.d.ts → describe-B_A5fbXH.d.ts} +1 -1
  170. package/dist/{describe-Ciu8SUnN.d.cts → describe-CQRrkv-Q.d.cts} +1 -1
  171. package/dist/executors/tool-provider-adapters.cjs +3091 -0
  172. package/dist/executors/tool-provider-adapters.cjs.map +1 -0
  173. package/dist/executors/tool-provider-adapters.d.cts +174 -0
  174. package/dist/executors/tool-provider-adapters.d.ts +174 -0
  175. package/dist/executors/tool-provider-adapters.js +1336 -0
  176. package/dist/executors/tool-provider-adapters.js.map +1 -0
  177. package/dist/executors/tool-provider-runtime.cjs +5178 -0
  178. package/dist/executors/tool-provider-runtime.cjs.map +1 -0
  179. package/dist/executors/tool-provider-runtime.d.cts +17 -0
  180. package/dist/executors/tool-provider-runtime.d.ts +17 -0
  181. package/dist/executors/tool-provider-runtime.js +15 -0
  182. package/dist/executors/tool-provider-runtime.js.map +1 -0
  183. package/dist/executors/tool-provider.cjs +6392 -0
  184. package/dist/executors/tool-provider.cjs.map +1 -0
  185. package/dist/executors/tool-provider.d.cts +60 -0
  186. package/dist/executors/tool-provider.d.ts +60 -0
  187. package/dist/executors/tool-provider.js +89 -0
  188. package/dist/executors/tool-provider.js.map +1 -0
  189. package/dist/executors/work-queue.cjs +342 -0
  190. package/dist/executors/work-queue.cjs.map +1 -0
  191. package/dist/executors/work-queue.d.cts +90 -0
  192. package/dist/executors/work-queue.d.ts +90 -0
  193. package/dist/executors/work-queue.js +306 -0
  194. package/dist/executors/work-queue.js.map +1 -0
  195. package/dist/graph/index.cjs +1536 -1324
  196. package/dist/graph/index.cjs.map +1 -1
  197. package/dist/graph/index.d.cts +10 -9
  198. package/dist/graph/index.d.ts +10 -9
  199. package/dist/graph/index.js +22 -20
  200. package/dist/{graph-s23RbbFO.d.cts → graph-CWK3HLPB.d.cts} +134 -132
  201. package/dist/{graph-DfdF9zy4.d.ts → graph-ho5sotHP.d.ts} +134 -132
  202. package/dist/{index-SnzZu3x7.d.ts → index-CQWcE0Dw.d.ts} +18 -4
  203. package/dist/{index-CAEmLCYF.d.cts → index-DHA1i67c.d.cts} +18 -4
  204. package/dist/index.cjs +3331 -3020
  205. package/dist/index.cjs.map +1 -1
  206. package/dist/index.d.cts +14 -10
  207. package/dist/index.d.ts +14 -10
  208. package/dist/index.js +114 -108
  209. package/dist/inspection/boundary.cjs +98 -0
  210. package/dist/inspection/boundary.cjs.map +1 -0
  211. package/dist/inspection/boundary.d.cts +61 -0
  212. package/dist/inspection/boundary.d.ts +61 -0
  213. package/dist/inspection/boundary.js +75 -0
  214. package/dist/inspection/boundary.js.map +1 -0
  215. package/dist/measurements-C0mAvWU1.d.cts +164 -0
  216. package/dist/measurements-OMpCeBwh.d.ts +164 -0
  217. package/dist/{messages-BZqrGGm1.d.ts → messages-CAzUPPJM.d.cts} +10 -5
  218. package/dist/{messages-BZqrGGm1.d.cts → messages-CAzUPPJM.d.ts} +10 -5
  219. package/dist/messaging/index.cjs +756 -619
  220. package/dist/messaging/index.cjs.map +1 -1
  221. package/dist/messaging/index.d.cts +17 -226
  222. package/dist/messaging/index.d.ts +17 -226
  223. package/dist/messaging/index.js +19 -749
  224. package/dist/messaging/index.js.map +1 -1
  225. package/dist/operators/index.cjs +1256 -1059
  226. package/dist/operators/index.cjs.map +1 -1
  227. package/dist/operators/index.d.cts +6 -6
  228. package/dist/operators/index.d.ts +6 -6
  229. package/dist/operators/index.js +9 -8
  230. package/dist/orchestration/index.cjs +8664 -2617
  231. package/dist/orchestration/index.cjs.map +1 -1
  232. package/dist/orchestration/index.d.cts +171 -221
  233. package/dist/orchestration/index.d.ts +171 -221
  234. package/dist/orchestration/index.js +74 -982
  235. package/dist/orchestration/index.js.map +1 -1
  236. package/dist/orchestration/messaging.cjs +314 -0
  237. package/dist/orchestration/messaging.cjs.map +1 -0
  238. package/dist/orchestration/messaging.d.cts +56 -0
  239. package/dist/orchestration/messaging.d.ts +56 -0
  240. package/dist/orchestration/messaging.js +276 -0
  241. package/dist/orchestration/messaging.js.map +1 -0
  242. package/dist/orchestration/work-queue.cjs +1500 -0
  243. package/dist/orchestration/work-queue.cjs.map +1 -0
  244. package/dist/orchestration/work-queue.d.cts +196 -0
  245. package/dist/orchestration/work-queue.d.ts +196 -0
  246. package/dist/orchestration/work-queue.js +1289 -0
  247. package/dist/orchestration/work-queue.js.map +1 -0
  248. package/dist/patterns/event-flow.cjs +433 -0
  249. package/dist/patterns/event-flow.cjs.map +1 -0
  250. package/dist/patterns/event-flow.d.cts +115 -0
  251. package/dist/patterns/event-flow.d.ts +115 -0
  252. package/dist/patterns/event-flow.js +14 -0
  253. package/dist/patterns/event-flow.js.map +1 -0
  254. package/dist/patterns/index.cjs +748 -355
  255. package/dist/patterns/index.cjs.map +1 -1
  256. package/dist/patterns/index.d.cts +9 -5
  257. package/dist/patterns/index.d.ts +9 -5
  258. package/dist/patterns/index.js +13 -4
  259. package/dist/process-types-C9uMYz3i.d.ts +200 -0
  260. package/dist/process-types-h3uRlzDc.d.cts +200 -0
  261. package/dist/{reactive-collection-BxBqtIOE.d.cts → reactive-collection-B9R0Bl1P.d.cts} +11 -41
  262. package/dist/{reactive-collection-Cb1II1Fi.d.ts → reactive-collection-BXFrH0U2.d.ts} +11 -41
  263. package/dist/{reactive-collection-storage-D-KmjE0J.d.cts → reactive-collection-storage-BLGv8Xp8.d.cts} +5 -5
  264. package/dist/{reactive-collection-storage-BNiEc-Gd.d.ts → reactive-collection-storage-a4zD3665.d.ts} +5 -5
  265. package/dist/{reactive-map-BcB4KsQR.d.ts → reactive-map-C_8sOfdS.d.cts} +7 -6
  266. package/dist/{reactive-map-D-g3dv8I.d.cts → reactive-map-jle5dnok.d.ts} +7 -6
  267. package/dist/render/index.d.cts +3 -3
  268. package/dist/render/index.d.ts +3 -3
  269. package/dist/render/index.js +1 -0
  270. package/dist/scheduled-readiness-5rwQlyjV.d.ts +91 -0
  271. package/dist/scheduled-readiness-DpRY8jI0.d.cts +91 -0
  272. package/dist/semantic-memory-graph-C2ZUwIlq.d.ts +30 -0
  273. package/dist/semantic-memory-graph-DlZBD_Eu.d.cts +30 -0
  274. package/dist/{semantic-memory-graph-BYoIlP35.d.cts → semantic-memory-graph-types-BvzdqmkY.d.cts} +2 -28
  275. package/dist/{semantic-memory-graph-CxyXLms3.d.ts → semantic-memory-graph-types-Ci-OtahO.d.ts} +2 -28
  276. package/dist/solutions/index.cjs +6788 -2128
  277. package/dist/solutions/index.cjs.map +1 -1
  278. package/dist/solutions/index.d.cts +15 -519
  279. package/dist/solutions/index.d.ts +15 -519
  280. package/dist/solutions/index.js +91 -7
  281. package/dist/solutions/reactive-layout/browser/index.cjs +457 -0
  282. package/dist/solutions/reactive-layout/browser/index.cjs.map +1 -0
  283. package/dist/solutions/reactive-layout/browser/index.d.cts +44 -0
  284. package/dist/solutions/reactive-layout/browser/index.d.ts +44 -0
  285. package/dist/solutions/reactive-layout/browser/index.js +69 -0
  286. package/dist/solutions/reactive-layout/browser/index.js.map +1 -0
  287. package/dist/solutions/reactive-layout/index.cjs +4494 -0
  288. package/dist/solutions/reactive-layout/index.cjs.map +1 -0
  289. package/dist/solutions/reactive-layout/index.d.cts +37 -0
  290. package/dist/solutions/reactive-layout/index.d.ts +37 -0
  291. package/dist/solutions/reactive-layout/index.js +146 -0
  292. package/dist/solutions/reactive-layout/index.js.map +1 -0
  293. package/dist/solutions/reactive-layout/node-canvas/index.cjs +555 -0
  294. package/dist/solutions/reactive-layout/node-canvas/index.cjs.map +1 -0
  295. package/dist/solutions/reactive-layout/node-canvas/index.d.cts +54 -0
  296. package/dist/solutions/reactive-layout/node-canvas/index.d.ts +54 -0
  297. package/dist/solutions/reactive-layout/node-canvas/index.js +131 -0
  298. package/dist/solutions/reactive-layout/node-canvas/index.js.map +1 -0
  299. package/dist/solutions/reactive-layout/react-native/index.cjs +504 -0
  300. package/dist/solutions/reactive-layout/react-native/index.cjs.map +1 -0
  301. package/dist/solutions/reactive-layout/react-native/index.d.cts +51 -0
  302. package/dist/solutions/reactive-layout/react-native/index.d.ts +51 -0
  303. package/dist/solutions/reactive-layout/react-native/index.js +77 -0
  304. package/dist/solutions/reactive-layout/react-native/index.js.map +1 -0
  305. package/dist/solutions/reactive-layout/skia/index.cjs +557 -0
  306. package/dist/solutions/reactive-layout/skia/index.cjs.map +1 -0
  307. package/dist/solutions/reactive-layout/skia/index.d.cts +64 -0
  308. package/dist/solutions/reactive-layout/skia/index.d.ts +64 -0
  309. package/dist/solutions/reactive-layout/skia/index.js +70 -0
  310. package/dist/solutions/reactive-layout/skia/index.js.map +1 -0
  311. package/dist/solutions/work-item/actions.cjs +2345 -0
  312. package/dist/solutions/work-item/actions.cjs.map +1 -0
  313. package/dist/solutions/work-item/actions.d.cts +40 -0
  314. package/dist/solutions/work-item/actions.d.ts +40 -0
  315. package/dist/solutions/work-item/actions.js +2078 -0
  316. package/dist/solutions/work-item/actions.js.map +1 -0
  317. package/dist/solutions/work-item/scheduling.cjs +9797 -0
  318. package/dist/solutions/work-item/scheduling.cjs.map +1 -0
  319. package/dist/solutions/work-item/scheduling.d.cts +1868 -0
  320. package/dist/solutions/work-item/scheduling.d.ts +1868 -0
  321. package/dist/solutions/work-item/scheduling.js +146 -0
  322. package/dist/solutions/work-item/scheduling.js.map +1 -0
  323. package/dist/solutions/work-item/work-queue.cjs +306 -0
  324. package/dist/solutions/work-item/work-queue.cjs.map +1 -0
  325. package/dist/solutions/work-item/work-queue.d.cts +71 -0
  326. package/dist/solutions/work-item/work-queue.d.ts +71 -0
  327. package/dist/solutions/work-item/work-queue.js +270 -0
  328. package/dist/solutions/work-item/work-queue.js.map +1 -0
  329. package/dist/sources/browser.cjs +1399 -1052
  330. package/dist/sources/browser.cjs.map +1 -1
  331. package/dist/sources/browser.d.cts +33 -6
  332. package/dist/sources/browser.d.ts +33 -6
  333. package/dist/sources/browser.js +73 -6
  334. package/dist/sources/browser.js.map +1 -1
  335. package/dist/sources/index.cjs +1345 -1065
  336. package/dist/sources/index.cjs.map +1 -1
  337. package/dist/sources/index.d.cts +5 -5
  338. package/dist/sources/index.d.ts +5 -5
  339. package/dist/sources/index.js +7 -6
  340. package/dist/sources/node.cjs.map +1 -1
  341. package/dist/sources/node.d.cts +4 -4
  342. package/dist/sources/node.d.ts +4 -4
  343. package/dist/sources/node.js +2 -1
  344. package/dist/sources/node.js.map +1 -1
  345. package/dist/storage/browser.cjs +16 -0
  346. package/dist/storage/browser.cjs.map +1 -1
  347. package/dist/storage/browser.js +4 -3
  348. package/dist/storage/browser.js.map +1 -1
  349. package/dist/storage/index.cjs +16 -0
  350. package/dist/storage/index.cjs.map +1 -1
  351. package/dist/storage/index.d.cts +6 -5
  352. package/dist/storage/index.d.ts +6 -5
  353. package/dist/storage/index.js +10 -9
  354. package/dist/storage/node.cjs +16 -0
  355. package/dist/storage/node.cjs.map +1 -1
  356. package/dist/storage/node.js +4 -3
  357. package/dist/storage/node.js.map +1 -1
  358. package/dist/store-BmtEs9mG.d.ts +123 -0
  359. package/dist/store-PAAsYvML.d.cts +123 -0
  360. package/dist/testing/index.cjs +1 -0
  361. package/dist/testing/index.cjs.map +1 -1
  362. package/dist/testing/index.d.cts +1 -1
  363. package/dist/testing/index.d.ts +1 -1
  364. package/dist/testing/index.js +3 -2
  365. package/dist/types-BRNKoFHj.d.ts +357 -0
  366. package/dist/{types-h12mNYbq.d.ts → types-BS6CyR-x.d.cts} +49 -130
  367. package/dist/types-BWK2ay3e.d.cts +457 -0
  368. package/dist/types-BXKSAoE1.d.cts +357 -0
  369. package/dist/types-BaPpZItj.d.ts +457 -0
  370. package/dist/types-BhveCMg5.d.cts +274 -0
  371. package/dist/{types-bNMSWKqF.d.cts → types-C9NOgNJw.d.ts} +49 -130
  372. package/dist/types-CTsQ8Ww4.d.ts +274 -0
  373. package/dist/types-DL_05n2M.d.ts +34 -0
  374. package/dist/types-XDoqxYO9.d.cts +34 -0
  375. package/dist/work-item-runtime-types-BqtWnSCS.d.ts +138 -0
  376. package/dist/work-item-runtime-types-CHO03AKh.d.cts +138 -0
  377. package/dist/work-queue/index.cjs +1136 -0
  378. package/dist/work-queue/index.cjs.map +1 -0
  379. package/dist/work-queue/index.d.cts +21 -0
  380. package/dist/work-queue/index.d.ts +21 -0
  381. package/dist/work-queue/index.js +1082 -0
  382. package/dist/work-queue/index.js.map +1 -0
  383. package/package.json +603 -249
  384. package/dist/chunk-2ILL7HQI.js.map +0 -1
  385. package/dist/chunk-4VLAQHZI.js.map +0 -1
  386. package/dist/chunk-COHO25CZ.js.map +0 -1
  387. package/dist/chunk-DK554R7P.js.map +0 -1
  388. package/dist/chunk-G4M3NHRJ.js.map +0 -1
  389. package/dist/chunk-I3IHOHCJ.js.map +0 -1
  390. package/dist/chunk-JIMUDQN3.js.map +0 -1
  391. package/dist/chunk-RIIOUTGM.js.map +0 -1
  392. package/dist/chunk-SWTLEQL6.js.map +0 -1
  393. /package/dist/{chunk-GDL26N2T.js.map → chunk-3KN7NJDR.js.map} +0 -0
  394. /package/dist/{chunk-Z2ANQ6JW.js.map → chunk-4Q77MMJY.js.map} +0 -0
  395. /package/dist/{chunk-D6BG7U6A.js.map → chunk-7HZRJMN6.js.map} +0 -0
  396. /package/dist/{chunk-SCRFRCGR.js.map → chunk-BSQGE5PS.js.map} +0 -0
  397. /package/dist/{chunk-PKVBHGBM.js.map → chunk-CJIFGJQG.js.map} +0 -0
  398. /package/dist/{chunk-K3FXTC3I.js.map → chunk-HJACH5PU.js.map} +0 -0
  399. /package/dist/{chunk-GTPCOEOZ.js.map → chunk-IDMLXLLG.js.map} +0 -0
  400. /package/dist/{chunk-DKP56CSW.js.map → chunk-JKAYLDQV.js.map} +0 -0
  401. /package/dist/{chunk-Y3ZLRGHC.js.map → chunk-SIDJO2T4.js.map} +0 -0
  402. /package/dist/{chunk-JR4IKCR2.js.map → chunk-TPND5MJS.js.map} +0 -0
  403. /package/dist/{chunk-TEW47IVR.js.map → chunk-VPEFSDME.js.map} +0 -0
  404. /package/dist/{chunk-DJC4CHLQ.js.map → chunk-YDWBXXQZ.js.map} +0 -0
  405. /package/dist/{chunk-6PHB5CJS.js.map → chunk-ZLFRB6FI.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/messaging/utils.ts","../src/messaging/event-message.ts","../src/messaging/types.ts","../src/messaging/index.ts"],"sourcesContent":["import type { Node } from \"../node/node.js\";\nimport type { PullDemand } from \"../protocol/messages.js\";\nimport type { MessageBusCommand } from \"./types.js\";\n\nexport function pullParams<T>(pull: PullDemand | undefined): T {\n\treturn (isObjectRecord(pull?.params) ? pull.params : {}) as T;\n}\n\nexport function publishCommand<T extends MessageBusCommand>(\n\tcommandNode: Node<MessageBusCommand>,\n\tcommand: T,\n): T {\n\tcommandNode.down([[\"DATA\", command]]);\n\treturn command;\n}\n\nexport function makeTopicState(): {\n\tclosed: boolean;\n\theadSeq: number;\n\tnextSeq: number;\n\tmessages: [];\n} {\n\treturn { closed: false, headSeq: 1, nextSeq: 1, messages: [] };\n}\n\nexport function uniqueTopics(topics: readonly string[]): readonly string[] {\n\tconst unique = [...new Set(topics)];\n\tif (unique.length !== topics.length) throw new Error(\"messageBus: duplicate topic\");\n\tfor (const topic of unique) assertTopicKey(topic, \"messageBus\");\n\treturn Object.freeze(unique.sort());\n}\n\nexport function assertTopicKey(topic: string, owner: string): void {\n\tconst error = validateTopicKey(topic, owner);\n\tif (error !== undefined) throw new Error(error);\n}\n\nexport function validateTopicKey(topic: string, owner: string): string | undefined {\n\tif (typeof topic !== \"string\" || topic.length === 0)\n\t\treturn `${owner}: topic must be a non-empty string`;\n\treturn undefined;\n}\n\nexport function assertNonEmpty(value: string, owner: string): void {\n\tif (typeof value !== \"string\" || value.length === 0)\n\t\tthrow new Error(`${owner}: must be a non-empty string`);\n}\n\nexport function positiveLimit(limit: number | undefined): number {\n\tif (limit === undefined) return 100;\n\tif (!Number.isInteger(limit) || limit < 1)\n\t\tthrow new Error(\"messageBus: limit must be a positive integer\");\n\treturn limit;\n}\n\nexport function isPositiveSeq(value: unknown): value is number {\n\treturn Number.isInteger(value) && (value as number) >= 1;\n}\n\nexport function isObjectRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function commandTopic(command: unknown): string | undefined {\n\treturn isObjectRecord(command) && typeof command.topic === \"string\" ? command.topic : undefined;\n}\n\nexport function commandIdOf(command: unknown): string | undefined {\n\treturn isObjectRecord(command) && typeof command.commandId === \"string\"\n\t\t? command.commandId\n\t\t: undefined;\n}\n\nexport function idempotencyKey(topic: string, key: string): string {\n\treturn `${topic}\\u0000${key}`;\n}\n","import type { DataIssue } from \"../data/index.js\";\nimport type { EventMessage, EventMessageOptions } from \"./types.js\";\nimport { assertNonEmpty, isObjectRecord } from \"./utils.js\";\n\nexport function eventMessage<T>(\n\ttype: string,\n\tpayload: T,\n\topts: EventMessageOptions,\n): EventMessage<T> {\n\tassertNonEmpty(type, \"eventMessage.type\");\n\tassertNonEmpty(opts.id, \"eventMessage.id\");\n\treturn {\n\t\tid: opts.id,\n\t\ttype,\n\t\tpayload,\n\t\t...(opts.key === undefined ? {} : { key: opts.key }),\n\t\t...(opts.subjectId === undefined ? {} : { subjectId: opts.subjectId }),\n\t\t...(opts.correlationId === undefined ? {} : { correlationId: opts.correlationId }),\n\t\t...(opts.causationId === undefined ? {} : { causationId: opts.causationId }),\n\t\t...(opts.occurredAtMs === undefined ? {} : { occurredAtMs: opts.occurredAtMs }),\n\t\t...(opts.actor === undefined ? {} : { actor: opts.actor }),\n\t\t...(opts.evidenceRefs === undefined ? {} : { evidenceRefs: opts.evidenceRefs }),\n\t\t...(opts.schema === undefined ? {} : { schema: opts.schema }),\n\t\t...(opts.metadata === undefined ? {} : { metadata: opts.metadata }),\n\t};\n}\n\nexport function isEventMessage(value: unknown): value is EventMessage {\n\treturn eventMessageIssue(value) === undefined;\n}\n\nexport function eventMessageIssue(value: unknown): DataIssue | undefined {\n\tif (!isObjectRecord(value)) {\n\t\treturn eventIssue(\"event message must be an object\");\n\t}\n\tif (typeof value.id !== \"string\" || value.id.length === 0) {\n\t\treturn eventIssue(\"event message id must be a non-empty string\");\n\t}\n\tif (typeof value.type !== \"string\" || value.type.length === 0) {\n\t\treturn eventIssue(\"event message type must be a non-empty string\");\n\t}\n\tif (!(\"payload\" in value)) {\n\t\treturn eventIssue(\"event message payload field is required\");\n\t}\n\treturn undefined;\n}\n\nfunction eventIssue(message: string): DataIssue {\n\treturn {\n\t\tkind: \"issue\",\n\t\tcode: \"malformed-event-message\",\n\t\tmessage,\n\t\tseverity: \"error\",\n\t\tsource: \"messageBus.eventMessage\",\n\t};\n}\n","import type { DataIssue } from \"../data/index.js\";\nimport type { Node } from \"../node/node.js\";\nimport type { LockId } from \"../protocol/messages.js\";\n\nexport interface MessageEnvelope<T = unknown> {\n\treadonly topic: string;\n\treadonly seq: number;\n\treadonly payload: T;\n\treadonly key?: string;\n\treadonly idempotencyKey?: string;\n\treadonly timestampMs: number;\n\treadonly commandId?: string;\n}\n\n/** Minimal JSON Schema vocabulary for passive topic payload descriptions (D125/D132). */\nexport interface JsonSchema {\n\treadonly type?:\n\t\t| \"string\"\n\t\t| \"number\"\n\t\t| \"integer\"\n\t\t| \"boolean\"\n\t\t| \"object\"\n\t\t| \"array\"\n\t\t| \"null\"\n\t\t| readonly (\"string\" | \"number\" | \"integer\" | \"boolean\" | \"object\" | \"array\" | \"null\")[];\n\treadonly properties?: Readonly<Record<string, JsonSchema>>;\n\treadonly required?: readonly string[];\n\treadonly additionalProperties?: boolean | JsonSchema;\n\treadonly items?: JsonSchema | readonly JsonSchema[];\n\treadonly enum?: readonly unknown[];\n\treadonly const?: unknown;\n\treadonly $ref?: string;\n\treadonly definitions?: Readonly<Record<string, JsonSchema>>;\n\treadonly description?: string;\n\treadonly title?: string;\n}\n\n/** Passive envelope for payloads that cross topic, agent, or graph boundaries. */\nexport interface TopicMessage<T = unknown> {\n\treadonly id: string;\n\treadonly schema?: JsonSchema;\n\treadonly expiresAt?: string;\n\treadonly correlationId?: string;\n\treadonly payload: T;\n}\n\n/** Passive domain event vocabulary for messageBus/eventFlow composition (D329). */\nexport interface EventMessage<T = unknown> {\n\treadonly id: string;\n\treadonly type: string;\n\treadonly payload: T;\n\treadonly key?: string;\n\treadonly subjectId?: string;\n\treadonly correlationId?: string;\n\treadonly causationId?: string;\n\treadonly occurredAtMs?: number;\n\treadonly actor?: string;\n\treadonly evidenceRefs?: readonly string[];\n\treadonly schema?: JsonSchema;\n\treadonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport interface EventMessageOptions {\n\treadonly id: string;\n\treadonly key?: string;\n\treadonly subjectId?: string;\n\treadonly correlationId?: string;\n\treadonly causationId?: string;\n\treadonly occurredAtMs?: number;\n\treadonly actor?: string;\n\treadonly evidenceRefs?: readonly string[];\n\treadonly schema?: JsonSchema;\n\treadonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport const PROMPTS_TOPIC = \"prompts\";\nexport const RESPONSES_TOPIC = \"responses\";\nexport const INJECTIONS_TOPIC = \"injections\";\nexport const DEFERRED_TOPIC = \"deferred\";\nexport const SPAWNS_TOPIC = \"spawns\";\nexport const CONTEXT_TOPIC = \"context\";\nexport const TODOS_TOPIC = \"todos\";\n\nexport const STANDARD_TOPICS = Object.freeze([\n\tPROMPTS_TOPIC,\n\tRESPONSES_TOPIC,\n\tINJECTIONS_TOPIC,\n\tDEFERRED_TOPIC,\n\tSPAWNS_TOPIC,\n\tCONTEXT_TOPIC,\n\tTODOS_TOPIC,\n] as const);\n\nexport type StandardTopic = (typeof STANDARD_TOPICS)[number];\n\nexport type MessageBusTopicPolicy = \"strict\" | \"create-as-fact\";\n\nexport interface MessageBusRetentionPolicy {\n\t/** Count retention. Trimming advances headSeq and never rewrites seq (D284). */\n\treadonly maxMessages?: number;\n}\n\nexport interface MessageBusDedupePolicy {\n\t/** Duplicate commandId emits status and never publishes a second retained message (D284). */\n\treadonly commandId?: \"status\" | \"issue\";\n}\n\nexport interface MessageBusOptions<TTopic extends string = string> {\n\treadonly topics?: readonly TTopic[];\n\treadonly name?: string;\n\treadonly now?: () => number;\n\treadonly topicPolicy?: MessageBusTopicPolicy;\n\treadonly retention?: MessageBusRetentionPolicy;\n\treadonly dedupe?: MessageBusDedupePolicy;\n}\n\nexport type MessageBusCommand<T = unknown> =\n\t| {\n\t\t\treadonly kind: \"ensure-topic\";\n\t\t\treadonly topic: string;\n\t\t\treadonly commandId?: string;\n\t }\n\t| {\n\t\t\treadonly kind: \"close-topic\";\n\t\t\treadonly topic: string;\n\t\t\treadonly commandId?: string;\n\t }\n\t| {\n\t\t\treadonly kind: \"publish\";\n\t\t\treadonly topic: string;\n\t\t\treadonly payload: T;\n\t\t\treadonly key?: string;\n\t\t\treadonly commandId?: string;\n\t\t\treadonly idempotencyKey?: string;\n\t }\n\t| {\n\t\t\treadonly kind: \"topic-policy\";\n\t\t\treadonly topicPolicy: MessageBusTopicPolicy;\n\t\t\treadonly commandId?: string;\n\t }\n\t| {\n\t\t\treadonly kind: \"ack\";\n\t\t\treadonly topic: string;\n\t\t\treadonly subscriptionId: string;\n\t\t\treadonly seq: number;\n\t\t\treadonly commandId?: string;\n\t }\n\t| {\n\t\t\treadonly kind: \"seek\";\n\t\t\treadonly topic: string;\n\t\t\treadonly subscriptionId: string;\n\t\t\treadonly nextSeq: number;\n\t\t\treadonly commandId?: string;\n\t }\n\t| {\n\t\t\treadonly kind: \"close-subscription\";\n\t\t\treadonly topic: string;\n\t\t\treadonly subscriptionId: string;\n\t\t\treadonly commandId?: string;\n\t };\n\nexport type MessageBusMessage<T = unknown> = MessageEnvelope<T>;\n\nexport interface MessageBusStatus {\n\treadonly kind:\n\t\t| \"topic-created\"\n\t\t| \"topic-closed\"\n\t\t| \"message-published\"\n\t\t| \"retention-trimmed\"\n\t\t| \"duplicate-command\"\n\t\t| \"subscription-acked\"\n\t\t| \"subscription-sought\"\n\t\t| \"subscription-closed\"\n\t\t| \"command-rejected\"\n\t\t| \"projection-ready\"\n\t\t| \"projection-partial\";\n\treadonly topic?: string;\n\treadonly seq?: number;\n\treadonly headSeq?: number;\n\treadonly subscriptionId?: string;\n\treadonly nextSeq?: number;\n\treadonly commandId?: string;\n\treadonly issueCode?: string;\n\treadonly timestampMs: number;\n\treadonly details?: unknown;\n}\n\nexport interface MessageBusCatalogEntry {\n\treadonly topic: string;\n\treadonly closed: boolean;\n\treadonly headSeq: number;\n\treadonly nextSeq: number;\n\treadonly messageCount: number;\n}\n\nexport interface MessageBusCatalogPage {\n\treadonly topics: readonly MessageBusCatalogEntry[];\n\treadonly nextAfterTopic?: string;\n\treadonly hasMore: boolean;\n}\n\nexport interface MessageBusDeadLetterEntry<T = unknown> {\n\treadonly entrySeq: number;\n\treadonly topic?: string;\n\treadonly command?: MessageBusCommand<T>;\n\treadonly message?: MessageBusMessage<T>;\n\treadonly issue: DataIssue;\n\treadonly timestampMs: number;\n}\n\nexport interface MessageBusDeadLetterPage<T = unknown> {\n\treadonly entries: readonly MessageBusDeadLetterEntry<T>[];\n\treadonly nextAfterEntrySeq?: number;\n\treadonly hasMore: boolean;\n}\n\nexport interface MessageBusTopicPage<T = unknown> {\n\treadonly topic: string;\n\treadonly messages: readonly MessageBusMessage<T>[];\n\treadonly fromSeq: number;\n\treadonly throughSeq?: number;\n\treadonly nextAfterSeq?: number;\n\treadonly hasMore: boolean;\n}\n\nexport interface MessageBusCursor {\n\treadonly topic: string;\n\treadonly subscriptionId: string;\n\treadonly nextSeq: number;\n\treadonly closed: boolean;\n\treadonly retentionGap: boolean;\n\treadonly headSeq: number;\n}\n\nexport interface MessageBusAvailablePage<T = unknown> {\n\treadonly topic: string;\n\treadonly subscriptionId: string;\n\treadonly cursor: MessageBusCursor;\n\treadonly messages: readonly MessageBusMessage<T>[];\n\treadonly fromSeq: number;\n\treadonly throughSeq?: number;\n\treadonly nextAfterSeq?: number;\n\treadonly hasMore: boolean;\n}\n\nexport interface MessageBusPageParams {\n\treadonly limit?: number;\n}\n\nexport interface MessageBusCatalogParams extends MessageBusPageParams {\n\treadonly afterTopic?: string;\n\treadonly includeClosed?: boolean;\n}\n\nexport interface MessageBusDeadLetterParams extends MessageBusPageParams {\n\treadonly afterEntrySeq?: number;\n\treadonly topic?: string;\n\treadonly code?: string;\n}\n\nexport interface MessageBusTopicParams extends MessageBusPageParams {\n\treadonly afterSeq?: number;\n}\n\nexport interface MessageBusAvailableParams extends MessageBusPageParams {\n\treadonly afterSeq?: number;\n}\n\nexport interface MessageBusPullProjection<TPage> {\n\treadonly snapshot: Node<TPage>;\n\treadonly snapshotPullId: LockId;\n\treadonly status: Node<MessageBusStatus>;\n\treadonly issues: Node<DataIssue>;\n}\n\nexport interface MessageBusTopicProjection<T = unknown>\n\textends MessageBusPullProjection<MessageBusTopicPage<T>> {}\n\nexport interface MessageBusSubscription<T = unknown> {\n\treadonly available: Node<MessageBusAvailablePage<T>>;\n\treadonly availablePullId: LockId;\n\treadonly cursor: Node<MessageBusCursor>;\n\treadonly status: Node<MessageBusStatus>;\n\treadonly issues: Node<DataIssue>;\n\tack(seq: number, opts?: { commandId?: string }): MessageBusCommand;\n\tseek(nextSeq: number, opts?: { commandId?: string }): MessageBusCommand;\n\tclose(opts?: { commandId?: string }): MessageBusCommand;\n}\n\nexport interface MessageBus<TTopic extends string = string> {\n\treadonly commands: Node<MessageBusCommand>;\n\treadonly messages: Node<MessageBusMessage>;\n\treadonly status: Node<MessageBusStatus>;\n\treadonly issues: Node<DataIssue>;\n\tensureTopic(topic: TTopic | string, opts?: { commandId?: string }): MessageBusCommand;\n\tcloseTopic(topic: TTopic | string, opts?: { commandId?: string }): MessageBusCommand;\n\tpublish<T = unknown>(\n\t\ttopic: TTopic | string,\n\t\tpayload: T,\n\t\topts?: { key?: string; commandId?: string; idempotencyKey?: string },\n\t): MessageBusCommand<T>;\n\ttopic<T = unknown>(\n\t\ttopic: TTopic | string,\n\t\topts?: { name?: string },\n\t): MessageBusTopicProjection<T>;\n\tcatalog(opts?: { name?: string }): MessageBusPullProjection<MessageBusCatalogPage>;\n\tdeadLetter<T = unknown>(opts?: {\n\t\tname?: string;\n\t}): MessageBusPullProjection<MessageBusDeadLetterPage<T>>;\n\tsubscription<T = unknown>(opts: {\n\t\ttopic: TTopic | string;\n\t\tsubscriptionId: string;\n\t\tfrom?: \"earliest\" | \"latest\" | number;\n\t\tname?: string;\n\t}): MessageBusSubscription<T>;\n}\n\nexport interface ToTopicOptions {\n\treadonly name?: string;\n\treadonly keyOf?: (value: unknown) => string | undefined;\n\treadonly commandIdOf?: (value: unknown) => string | undefined;\n}\n\nexport interface ToTopicBundle<T> {\n\treadonly commands: Node<MessageBusCommand<T>>;\n\trelease(): void;\n}\n","/**\n * Reusable application-infrastructure messaging namespace.\n *\n * D279/D282/D284/D285/D276: messageBus is a retained topic-log plus independent\n * subscription-cursor substrate. DynamicHub is intentionally retired; do not add aliases.\n */\n\nimport { depBatch, type NodeFn } from \"../ctx/types.js\";\nimport type { DataIssue } from \"../data/index.js\";\nimport type { Graph } from \"../graph/graph.js\";\nimport type { Node } from \"../node/node.js\";\nimport {\n\tattachMessageBusCommandSource,\n\tgetMessageBusState,\n\tregisterMessageBusState,\n} from \"./internal.js\";\nimport type {\n\tMessageBusState,\n\tRuntimeEvent,\n\tSubscriptionState,\n\tTopicState,\n} from \"./runtime-types.js\";\nimport type {\n\tMessageBus,\n\tMessageBusAvailablePage,\n\tMessageBusAvailableParams,\n\tMessageBusCatalogPage,\n\tMessageBusCatalogParams,\n\tMessageBusCommand,\n\tMessageBusCursor,\n\tMessageBusDeadLetterEntry,\n\tMessageBusDeadLetterPage,\n\tMessageBusDeadLetterParams,\n\tMessageBusMessage,\n\tMessageBusOptions,\n\tMessageBusStatus,\n\tMessageBusTopicPage,\n\tMessageBusTopicParams,\n\tToTopicBundle,\n\tToTopicOptions,\n} from \"./types.js\";\nimport {\n\tassertNonEmpty,\n\tassertTopicKey,\n\tcommandIdOf,\n\tcommandTopic,\n\tidempotencyKey,\n\tisObjectRecord,\n\tisPositiveSeq,\n\tmakeTopicState,\n\tpositiveLimit,\n\tpublishCommand,\n\tpullParams,\n\tuniqueTopics,\n\tvalidateTopicKey,\n} from \"./utils.js\";\n\nexport {\n\teventMessage,\n\teventMessageIssue,\n\tisEventMessage,\n} from \"./event-message.js\";\nexport type {\n\tEventMessage,\n\tEventMessageOptions,\n\tJsonSchema,\n\tMessageBus,\n\tMessageBusAvailablePage,\n\tMessageBusAvailableParams,\n\tMessageBusCatalogEntry,\n\tMessageBusCatalogPage,\n\tMessageBusCatalogParams,\n\tMessageBusCommand,\n\tMessageBusCursor,\n\tMessageBusDeadLetterEntry,\n\tMessageBusDeadLetterPage,\n\tMessageBusDeadLetterParams,\n\tMessageBusDedupePolicy,\n\tMessageBusMessage,\n\tMessageBusOptions,\n\tMessageBusPageParams,\n\tMessageBusPullProjection,\n\tMessageBusRetentionPolicy,\n\tMessageBusStatus,\n\tMessageBusSubscription,\n\tMessageBusTopicPage,\n\tMessageBusTopicParams,\n\tMessageBusTopicPolicy,\n\tMessageBusTopicProjection,\n\tMessageEnvelope,\n\tStandardTopic,\n\tTopicMessage,\n\tToTopicBundle,\n\tToTopicOptions,\n} from \"./types.js\";\nexport {\n\tCONTEXT_TOPIC,\n\tDEFERRED_TOPIC,\n\tINJECTIONS_TOPIC,\n\tPROMPTS_TOPIC,\n\tRESPONSES_TOPIC,\n\tSPAWNS_TOPIC,\n\tSTANDARD_TOPICS,\n\tTODOS_TOPIC,\n} from \"./types.js\";\n\nexport function messageBus<TTopic extends string>(\n\tgraph: Graph,\n\topts: MessageBusOptions<TTopic> = {},\n): MessageBus<TTopic> {\n\tconst name = opts.name ?? \"messageBus\";\n\tconst initialTopics = uniqueTopics(opts.topics ?? []);\n\tconst commandSources: Node<MessageBusCommand>[] = [];\n\tconst commandBody: NodeFn = (ctx) => {\n\t\tfor (let i = 0; i < commandSources.length; i++) {\n\t\t\tfor (const command of depBatch(ctx, i) ?? []) ctx.down([[\"DATA\", command]]);\n\t\t}\n\t};\n\tconst commands = graph.node<MessageBusCommand>([], commandBody, {\n\t\tname: `${name}/commands`,\n\t\tfactory: \"messageBusCommands\",\n\t\tcompleteWhenDepsComplete: false,\n\t\terrorWhenDepsError: false,\n\t});\n\tconst state: MessageBusState = {\n\t\tgraph,\n\t\tname,\n\t\tnow: opts.now ?? Date.now,\n\t\ttopicPolicy: opts.topicPolicy ?? \"strict\",\n\t\tretention: opts.retention ?? {},\n\t\tdedupe: opts.dedupe ?? { commandId: \"status\" },\n\t\ttopics: new Map(initialTopics.map((topic) => [topic, makeTopicState()])),\n\t\tsubscriptions: new Map(),\n\t\tseenCommandIds: new Set(),\n\t\tseenIdempotencyKeys: new Set(),\n\t\tdeadLetters: [],\n\t\tdeadLetterSeq: 0,\n\t\tcommandSources,\n\t\tcommandBody,\n\t};\n\tconst runtime = graph.node<RuntimeEvent>(\n\t\t[commands],\n\t\t(ctx) => {\n\t\t\tfor (const command of depBatch(ctx, 0) ?? []) {\n\t\t\t\tfor (const event of reduceMessageBusCommand(state, command as MessageBusCommand)) {\n\t\t\t\t\tctx.down([[\"DATA\", event]]);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tname: `${name}/runtime`,\n\t\t\tfactory: \"messageBusRuntime\",\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\terrorWhenDepsError: false,\n\t\t},\n\t);\n\tgraph.retain(runtime, { reason: `${name}.messageBus.runtime` });\n\tconst messages = graph.node<MessageBusMessage>(\n\t\t[runtime],\n\t\t(ctx) => {\n\t\t\tfor (const event of depBatch(ctx, 0) ?? []) {\n\t\t\t\tconst typed = event as RuntimeEvent;\n\t\t\t\tif (typed.kind === \"message\") ctx.down([[\"DATA\", typed.message]]);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tname: `${name}/messages`,\n\t\t\tfactory: \"messageBusMessages\",\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\terrorWhenDepsError: false,\n\t\t},\n\t);\n\tconst status = graph.node<MessageBusStatus>(\n\t\t[runtime],\n\t\t(ctx) => {\n\t\t\tfor (const event of depBatch(ctx, 0) ?? []) {\n\t\t\t\tconst typed = event as RuntimeEvent;\n\t\t\t\tif (typed.kind === \"status\") ctx.down([[\"DATA\", typed.status]]);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tname: `${name}/status`,\n\t\t\tfactory: \"messageBusStatus\",\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\terrorWhenDepsError: false,\n\t\t},\n\t);\n\tconst issues = graph.node<DataIssue>(\n\t\t[runtime],\n\t\t(ctx) => {\n\t\t\tfor (const event of depBatch(ctx, 0) ?? []) {\n\t\t\t\tconst typed = event as RuntimeEvent;\n\t\t\t\tif (typed.kind === \"issue\") ctx.down([[\"DATA\", typed.issue]]);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tname: `${name}/issues`,\n\t\t\tfactory: \"messageBusIssues\",\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\terrorWhenDepsError: false,\n\t\t},\n\t);\n\n\tconst bus: MessageBus<TTopic> = {\n\t\tcommands,\n\t\tmessages,\n\t\tstatus,\n\t\tissues,\n\t\tensureTopic(topic, commandOpts = {}) {\n\t\t\treturn publishCommand(commands, {\n\t\t\t\tkind: \"ensure-topic\",\n\t\t\t\ttopic,\n\t\t\t\t...(commandOpts.commandId === undefined ? {} : { commandId: commandOpts.commandId }),\n\t\t\t});\n\t\t},\n\t\tcloseTopic(topic, commandOpts = {}) {\n\t\t\treturn publishCommand(commands, {\n\t\t\t\tkind: \"close-topic\",\n\t\t\t\ttopic,\n\t\t\t\t...(commandOpts.commandId === undefined ? {} : { commandId: commandOpts.commandId }),\n\t\t\t});\n\t\t},\n\t\tpublish<T = unknown>(\n\t\t\ttopic: TTopic | string,\n\t\t\tpayload: T,\n\t\t\tpublishOpts: { key?: string; commandId?: string; idempotencyKey?: string } = {},\n\t\t) {\n\t\t\treturn publishCommand(commands, {\n\t\t\t\tkind: \"publish\",\n\t\t\t\ttopic,\n\t\t\t\tpayload,\n\t\t\t\t...(publishOpts.key === undefined ? {} : { key: publishOpts.key }),\n\t\t\t\t...(publishOpts.commandId === undefined ? {} : { commandId: publishOpts.commandId }),\n\t\t\t\t...(publishOpts.idempotencyKey === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { idempotencyKey: publishOpts.idempotencyKey }),\n\t\t\t});\n\t\t},\n\t\ttopic<T = unknown>(topic: TTopic | string, projectionOpts: { name?: string } = {}) {\n\t\t\tassertTopicKey(topic, \"messageBus.topic\");\n\t\t\tconst snapshotPullId = Symbol(`${name}/${topic}/topicSnapshot`);\n\t\t\tconst snapshot = graph.node<MessageBusTopicPage<T>>(\n\t\t\t\t[messages],\n\t\t\t\t(ctx) => {\n\t\t\t\t\tconst params = pullParams<MessageBusTopicParams>(ctx.pull);\n\t\t\t\t\tctx.down([[\"DATA\", topicPage<T>(state, topic, params)]]);\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: projectionOpts.name ?? `${name}/${topic}/topic`,\n\t\t\t\t\tfactory: \"messageBusTopicProjection\",\n\t\t\t\t\tmeta: { topic },\n\t\t\t\t\tpullId: snapshotPullId,\n\t\t\t\t\tpartial: true,\n\t\t\t\t\tcompleteWhenDepsComplete: false,\n\t\t\t\t\terrorWhenDepsError: false,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn { snapshot, snapshotPullId, status, issues };\n\t\t},\n\t\tcatalog(projectionOpts: { name?: string } = {}) {\n\t\t\tconst snapshotPullId = Symbol(`${name}/catalogSnapshot`);\n\t\t\tconst snapshot = graph.node<MessageBusCatalogPage>(\n\t\t\t\t[runtime],\n\t\t\t\t(ctx) => {\n\t\t\t\t\tconst params = pullParams<MessageBusCatalogParams>(ctx.pull);\n\t\t\t\t\tctx.down([[\"DATA\", catalogPage(state, params)]]);\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: projectionOpts.name ?? `${name}/catalog`,\n\t\t\t\t\tfactory: \"messageBusCatalog\",\n\t\t\t\t\tpullId: snapshotPullId,\n\t\t\t\t\tpartial: true,\n\t\t\t\t\tcompleteWhenDepsComplete: false,\n\t\t\t\t\terrorWhenDepsError: false,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn { snapshot, snapshotPullId, status, issues };\n\t\t},\n\t\tdeadLetter<T = unknown>(projectionOpts: { name?: string } = {}) {\n\t\t\tconst snapshotPullId = Symbol(`${name}/deadLetterSnapshot`);\n\t\t\tconst snapshot = graph.node<MessageBusDeadLetterPage<T>>(\n\t\t\t\t[runtime],\n\t\t\t\t(ctx) => {\n\t\t\t\t\tconst params = pullParams<MessageBusDeadLetterParams>(ctx.pull);\n\t\t\t\t\tctx.down([[\"DATA\", deadLetterPage<T>(state, params)]]);\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: projectionOpts.name ?? `${name}/deadLetter`,\n\t\t\t\t\tfactory: \"messageBusDeadLetter\",\n\t\t\t\t\tpullId: snapshotPullId,\n\t\t\t\t\tpartial: true,\n\t\t\t\t\tcompleteWhenDepsComplete: false,\n\t\t\t\t\terrorWhenDepsError: false,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn { snapshot, snapshotPullId, status, issues };\n\t\t},\n\t\tsubscription<T = unknown>(subscriptionOpts: {\n\t\t\ttopic: TTopic | string;\n\t\t\tsubscriptionId: string;\n\t\t\tfrom?: \"earliest\" | \"latest\" | number;\n\t\t\tname?: string;\n\t\t}) {\n\t\t\tassertTopicKey(subscriptionOpts.topic, \"messageBus.subscription\");\n\t\t\tassertNonEmpty(subscriptionOpts.subscriptionId, \"messageBus.subscriptionId\");\n\t\t\tconst sub = ensureSubscription(state, {\n\t\t\t\ttopic: subscriptionOpts.topic,\n\t\t\t\tsubscriptionId: subscriptionOpts.subscriptionId,\n\t\t\t\tfrom: subscriptionOpts.from ?? \"earliest\",\n\t\t\t});\n\t\t\tconst availablePullId = Symbol(\n\t\t\t\t`${name}/${subscriptionOpts.topic}/${subscriptionOpts.subscriptionId}/available`,\n\t\t\t);\n\t\t\tconst projectionName =\n\t\t\t\tsubscriptionOpts.name ??\n\t\t\t\t`${name}/${subscriptionOpts.topic}/${subscriptionOpts.subscriptionId}`;\n\t\t\tconst available = graph.node<MessageBusAvailablePage<T>>(\n\t\t\t\t[messages, status],\n\t\t\t\t(ctx) => {\n\t\t\t\t\tconst params = pullParams<MessageBusAvailableParams>(ctx.pull);\n\t\t\t\t\tctx.down([[\"DATA\", availablePage<T>(state, sub, params)]]);\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: `${projectionName}/available`,\n\t\t\t\t\tfactory: \"messageBusSubscriptionAvailable\",\n\t\t\t\t\tmeta: { topic: subscriptionOpts.topic, subscriptionId: subscriptionOpts.subscriptionId },\n\t\t\t\t\tpullId: availablePullId,\n\t\t\t\t\tpartial: true,\n\t\t\t\t\tcompleteWhenDepsComplete: false,\n\t\t\t\t\terrorWhenDepsError: false,\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst cursor = graph.node<MessageBusCursor>(\n\t\t\t\t[status],\n\t\t\t\t(ctx) => {\n\t\t\t\t\tfor (const fact of depBatch(ctx, 0) ?? []) {\n\t\t\t\t\t\tconst typed = fact as MessageBusStatus;\n\t\t\t\t\t\tconst subscriptionMoved =\n\t\t\t\t\t\t\ttyped.topic === sub.topic &&\n\t\t\t\t\t\t\ttyped.subscriptionId === sub.subscriptionId &&\n\t\t\t\t\t\t\t(typed.kind === \"subscription-acked\" ||\n\t\t\t\t\t\t\t\ttyped.kind === \"subscription-sought\" ||\n\t\t\t\t\t\t\t\ttyped.kind === \"subscription-closed\");\n\t\t\t\t\t\tconst retentionMoved = typed.topic === sub.topic && typed.kind === \"retention-trimmed\";\n\t\t\t\t\t\tif (subscriptionMoved || retentionMoved) {\n\t\t\t\t\t\t\tctx.down([[\"DATA\", cursorSnapshot(state, sub)]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: `${projectionName}/cursor`,\n\t\t\t\t\tfactory: \"messageBusSubscriptionCursor\",\n\t\t\t\t\tcompleteWhenDepsComplete: false,\n\t\t\t\t\terrorWhenDepsError: false,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tavailable,\n\t\t\t\tavailablePullId,\n\t\t\t\tcursor,\n\t\t\t\tstatus,\n\t\t\t\tissues,\n\t\t\t\tack(seq, commandOpts = {}) {\n\t\t\t\t\treturn publishCommand(commands, {\n\t\t\t\t\t\tkind: \"ack\",\n\t\t\t\t\t\ttopic: sub.topic,\n\t\t\t\t\t\tsubscriptionId: sub.subscriptionId,\n\t\t\t\t\t\tseq,\n\t\t\t\t\t\t...(commandOpts.commandId === undefined ? {} : { commandId: commandOpts.commandId }),\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tseek(nextSeq, commandOpts = {}) {\n\t\t\t\t\treturn publishCommand(commands, {\n\t\t\t\t\t\tkind: \"seek\",\n\t\t\t\t\t\ttopic: sub.topic,\n\t\t\t\t\t\tsubscriptionId: sub.subscriptionId,\n\t\t\t\t\t\tnextSeq,\n\t\t\t\t\t\t...(commandOpts.commandId === undefined ? {} : { commandId: commandOpts.commandId }),\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tclose(commandOpts = {}) {\n\t\t\t\t\treturn publishCommand(commands, {\n\t\t\t\t\t\tkind: \"close-subscription\",\n\t\t\t\t\t\ttopic: sub.topic,\n\t\t\t\t\t\tsubscriptionId: sub.subscriptionId,\n\t\t\t\t\t\t...(commandOpts.commandId === undefined ? {} : { commandId: commandOpts.commandId }),\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n\tregisterMessageBusState(bus, state);\n\treturn bus;\n}\n\nexport function fromTopic<T = unknown, TTopic extends string = string>(\n\tbus: MessageBus<TTopic>,\n\ttopic: TTopic | string,\n): Node<MessageBusTopicPage<T>> {\n\treturn bus.topic<T>(topic).snapshot;\n}\n\nexport function toTopic<T, TTopic extends string>(\n\tgraph: Graph,\n\tsource: Node<T>,\n\tbus: MessageBus<TTopic>,\n\ttopic: TTopic | string,\n\topts: ToTopicOptions = {},\n): ToTopicBundle<T> {\n\tconst state = getMessageBusState(bus);\n\tif (state === undefined) throw new Error(\"toTopic: unknown message bus implementation\");\n\tif (state.graph !== graph) throw new Error(\"toTopic: bus and source graph must match\");\n\tassertTopicKey(topic, \"toTopic\");\n\tconst commands = graph.node<MessageBusCommand<T>>(\n\t\t[source],\n\t\t(ctx) => {\n\t\t\tfor (const value of depBatch(ctx, 0) ?? []) {\n\t\t\t\tconst key = opts.keyOf?.(value);\n\t\t\t\tconst commandId = opts.commandIdOf?.(value);\n\t\t\t\tctx.down([\n\t\t\t\t\t[\n\t\t\t\t\t\t\"DATA\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkind: \"publish\",\n\t\t\t\t\t\t\ttopic,\n\t\t\t\t\t\t\tpayload: value as T,\n\t\t\t\t\t\t\t...(key === undefined ? {} : { key }),\n\t\t\t\t\t\t\t...(commandId === undefined ? {} : { commandId }),\n\t\t\t\t\t\t} satisfies MessageBusCommand<T>,\n\t\t\t\t\t],\n\t\t\t\t]);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tname: opts.name ?? `${state.name}/${topic}/toTopic`,\n\t\t\tfactory: \"toTopic\",\n\t\t\tmeta: { topic },\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\terrorWhenDepsError: false,\n\t\t},\n\t);\n\tconst releaseSource = attachMessageBusCommandSource(\n\t\tgraph,\n\t\tbus,\n\t\tcommands as Node<MessageBusCommand>,\n\t);\n\tlet released = false;\n\treturn {\n\t\tcommands,\n\t\trelease() {\n\t\t\tif (released) return;\n\t\t\treleased = true;\n\t\t\treleaseSource();\n\t\t},\n\t};\n}\n\nfunction reduceMessageBusCommand(\n\tstate: MessageBusState,\n\tcommand: MessageBusCommand,\n): RuntimeEvent[] {\n\tconst malformed = validateCommand(command);\n\tif (malformed !== undefined) return rejectCommand(state, command, malformed);\n\tif (command.commandId !== undefined) {\n\t\tif (state.seenCommandIds.has(command.commandId)) {\n\t\t\treturn duplicateCommandEvents(state, command, \"duplicate commandId\");\n\t\t}\n\t\tstate.seenCommandIds.add(command.commandId);\n\t}\n\tif (\n\t\tcommand.kind === \"publish\" &&\n\t\tcommand.idempotencyKey !== undefined &&\n\t\tstate.seenIdempotencyKeys.has(idempotencyKey(command.topic, command.idempotencyKey))\n\t) {\n\t\treturn duplicateCommandEvents(state, command, \"duplicate idempotencyKey\");\n\t}\n\tswitch (command.kind) {\n\t\tcase \"ensure-topic\":\n\t\t\treturn ensureTopic(state, command.topic, command.commandId);\n\t\tcase \"close-topic\": {\n\t\t\tconst topic = state.topics.get(command.topic);\n\t\t\tif (topic === undefined) {\n\t\t\t\treturn issueEvents(state, command, \"unknown-topic\", `unknown topic '${command.topic}'`);\n\t\t\t}\n\t\t\ttopic.closed = true;\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tkind: \"status\",\n\t\t\t\t\tstatus: statusFact(state, \"topic-closed\", {\n\t\t\t\t\t\ttopic: command.topic,\n\t\t\t\t\t\tcommandId: command.commandId,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\tcase \"topic-policy\":\n\t\t\tstate.topicPolicy = command.topicPolicy;\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tkind: \"status\",\n\t\t\t\t\tstatus: statusFact(state, \"projection-ready\", {\n\t\t\t\t\t\tcommandId: command.commandId,\n\t\t\t\t\t\tdetails: { topicPolicy: command.topicPolicy },\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t];\n\t\tcase \"publish\":\n\t\t\treturn publishMessage(state, command);\n\t\tcase \"ack\":\n\t\t\treturn ackSubscription(state, command);\n\t\tcase \"seek\":\n\t\t\treturn seekSubscription(state, command);\n\t\tcase \"close-subscription\":\n\t\t\treturn closeSubscription(state, command);\n\t}\n}\n\nfunction publishMessage(\n\tstate: MessageBusState,\n\tcommand: Extract<MessageBusCommand, { kind: \"publish\" }>,\n): RuntimeEvent[] {\n\tlet topic = state.topics.get(command.topic);\n\tconst events: RuntimeEvent[] = [];\n\tif (topic === undefined) {\n\t\tif (state.topicPolicy !== \"create-as-fact\") {\n\t\t\treturn issueEvents(state, command, \"unknown-topic\", `unknown topic '${command.topic}'`);\n\t\t}\n\t\tevents.push(...ensureTopic(state, command.topic, command.commandId));\n\t\ttopic = state.topics.get(command.topic);\n\t}\n\tif (topic === undefined)\n\t\treturn issueEvents(state, command, \"unknown-topic\", `unknown topic '${command.topic}'`);\n\tif (topic.closed)\n\t\treturn issueEvents(state, command, \"closed-topic\", `closed topic '${command.topic}'`);\n\tconst message: MessageBusMessage = {\n\t\ttopic: command.topic,\n\t\tseq: topic.nextSeq++,\n\t\tpayload: command.payload,\n\t\ttimestampMs: state.now(),\n\t\t...(command.key === undefined ? {} : { key: command.key }),\n\t\t...(command.idempotencyKey === undefined ? {} : { idempotencyKey: command.idempotencyKey }),\n\t\t...(command.commandId === undefined ? {} : { commandId: command.commandId }),\n\t};\n\tif (command.idempotencyKey !== undefined) {\n\t\tstate.seenIdempotencyKeys.add(idempotencyKey(command.topic, command.idempotencyKey));\n\t}\n\ttopic.messages.push(message);\n\tevents.push({ kind: \"message\", message });\n\tevents.push({\n\t\tkind: \"status\",\n\t\tstatus: statusFact(state, \"message-published\", {\n\t\t\ttopic: command.topic,\n\t\t\tseq: message.seq,\n\t\t\tcommandId: command.commandId,\n\t\t}),\n\t});\n\tevents.push(...trimRetention(state, command.topic, topic));\n\treturn events;\n}\n\nfunction ensureTopic(state: MessageBusState, topic: string, commandId?: string): RuntimeEvent[] {\n\tassertTopicKey(topic, \"messageBus\");\n\tif (!state.topics.has(topic)) state.topics.set(topic, makeTopicState());\n\treturn [\n\t\t{\n\t\t\tkind: \"status\",\n\t\t\tstatus: statusFact(state, \"topic-created\", { topic, commandId }),\n\t\t},\n\t];\n}\n\nfunction trimRetention(\n\tstate: MessageBusState,\n\ttopicName: string,\n\ttopic: TopicState,\n): RuntimeEvent[] {\n\tconst max = state.retention.maxMessages;\n\tif (max === undefined || topic.messages.length <= max) return [];\n\tif (!Number.isInteger(max) || max < 1) {\n\t\treturn issueEvents(\n\t\t\tstate,\n\t\t\t{ kind: \"publish\", topic: topicName, payload: undefined },\n\t\t\t\"policy-rejected\",\n\t\t\t\"retention.maxMessages must be a positive integer\",\n\t\t);\n\t}\n\tconst trimCount = topic.messages.length - max;\n\ttopic.messages.splice(0, trimCount);\n\ttopic.headSeq = topic.messages[0]?.seq ?? topic.nextSeq;\n\tconst events: RuntimeEvent[] = [\n\t\t{\n\t\t\tkind: \"status\",\n\t\t\tstatus: statusFact(state, \"retention-trimmed\", {\n\t\t\t\ttopic: topicName,\n\t\t\t\theadSeq: topic.headSeq,\n\t\t\t\tdetails: { trimCount },\n\t\t\t}),\n\t\t},\n\t];\n\tfor (const sub of state.subscriptions.values()) {\n\t\tif (sub.closed || sub.topic !== topicName || sub.nextSeq >= topic.headSeq) continue;\n\t\tsub.retentionGap = true;\n\t\tevents.push(\n\t\t\t...issueEvents(\n\t\t\t\tstate,\n\t\t\t\t{\n\t\t\t\t\tkind: \"seek\",\n\t\t\t\t\ttopic: topicName,\n\t\t\t\t\tsubscriptionId: sub.subscriptionId,\n\t\t\t\t\tnextSeq: sub.nextSeq,\n\t\t\t\t},\n\t\t\t\t\"retention-gap\",\n\t\t\t\t`subscription '${sub.subscriptionId}' is before retained headSeq`,\n\t\t\t),\n\t\t);\n\t}\n\treturn events;\n}\n\nfunction ackSubscription(\n\tstate: MessageBusState,\n\tcommand: Extract<MessageBusCommand, { kind: \"ack\" }>,\n): RuntimeEvent[] {\n\tconst topic = state.topics.get(command.topic);\n\tif (topic === undefined)\n\t\treturn issueEvents(state, command, \"unknown-topic\", `unknown topic '${command.topic}'`);\n\tconst sub = getSubscription(state, command.topic, command.subscriptionId);\n\tif (sub === undefined)\n\t\treturn issueEvents(\n\t\t\tstate,\n\t\t\tcommand,\n\t\t\t\"unknown-subscription\",\n\t\t\t`unknown subscription '${command.subscriptionId}'`,\n\t\t);\n\tif (sub.closed)\n\t\treturn issueEvents(state, command, \"subscription-closed\", \"subscription is closed\");\n\tif (sub.retentionGap)\n\t\treturn issueEvents(state, command, \"retention-gap\", \"subscription must seek before ack\");\n\tif (command.seq < sub.nextSeq)\n\t\treturn issueEvents(state, command, \"source-cursor-stale\", \"ack is behind subscription cursor\");\n\tif (command.seq >= topic.nextSeq)\n\t\treturn issueEvents(state, command, \"cursor-out-of-range\", \"ack is beyond topic tail\");\n\tsub.nextSeq = Math.max(sub.nextSeq, command.seq + 1);\n\treturn [\n\t\t{\n\t\t\tkind: \"status\",\n\t\t\tstatus: statusFact(state, \"subscription-acked\", {\n\t\t\t\ttopic: command.topic,\n\t\t\t\tsubscriptionId: command.subscriptionId,\n\t\t\t\tnextSeq: sub.nextSeq,\n\t\t\t\tcommandId: command.commandId,\n\t\t\t}),\n\t\t},\n\t];\n}\n\nfunction seekSubscription(\n\tstate: MessageBusState,\n\tcommand: Extract<MessageBusCommand, { kind: \"seek\" }>,\n): RuntimeEvent[] {\n\tconst topic = state.topics.get(command.topic);\n\tif (topic === undefined)\n\t\treturn issueEvents(state, command, \"unknown-topic\", `unknown topic '${command.topic}'`);\n\tconst sub = getSubscription(state, command.topic, command.subscriptionId);\n\tif (sub === undefined)\n\t\treturn issueEvents(\n\t\t\tstate,\n\t\t\tcommand,\n\t\t\t\"unknown-subscription\",\n\t\t\t`unknown subscription '${command.subscriptionId}'`,\n\t\t);\n\tif (sub.closed)\n\t\treturn issueEvents(state, command, \"subscription-closed\", \"subscription is closed\");\n\tif (command.nextSeq < topic.headSeq)\n\t\treturn issueEvents(state, command, \"retention-gap\", \"seek is before retained headSeq\");\n\tif (command.nextSeq > topic.nextSeq)\n\t\treturn issueEvents(state, command, \"cursor-out-of-range\", \"seek is beyond topic tail\");\n\tsub.nextSeq = command.nextSeq;\n\tsub.retentionGap = false;\n\treturn [\n\t\t{\n\t\t\tkind: \"status\",\n\t\t\tstatus: statusFact(state, \"subscription-sought\", {\n\t\t\t\ttopic: command.topic,\n\t\t\t\tsubscriptionId: command.subscriptionId,\n\t\t\t\tnextSeq: sub.nextSeq,\n\t\t\t\tcommandId: command.commandId,\n\t\t\t}),\n\t\t},\n\t];\n}\n\nfunction closeSubscription(\n\tstate: MessageBusState,\n\tcommand: Extract<MessageBusCommand, { kind: \"close-subscription\" }>,\n): RuntimeEvent[] {\n\tif (!state.topics.has(command.topic))\n\t\treturn issueEvents(state, command, \"unknown-topic\", `unknown topic '${command.topic}'`);\n\tconst sub = getSubscription(state, command.topic, command.subscriptionId);\n\tif (sub === undefined)\n\t\treturn issueEvents(\n\t\t\tstate,\n\t\t\tcommand,\n\t\t\t\"unknown-subscription\",\n\t\t\t`unknown subscription '${command.subscriptionId}'`,\n\t\t);\n\tsub.closed = true;\n\treturn [\n\t\t{\n\t\t\tkind: \"status\",\n\t\t\tstatus: statusFact(state, \"subscription-closed\", {\n\t\t\t\ttopic: command.topic,\n\t\t\t\tsubscriptionId: command.subscriptionId,\n\t\t\t\tnextSeq: sub.nextSeq,\n\t\t\t\tcommandId: command.commandId,\n\t\t\t}),\n\t\t},\n\t];\n}\n\nfunction issueEvents(\n\tstate: MessageBusState,\n\tcommand: unknown,\n\tcode: string,\n\tmessage: string,\n): RuntimeEvent[] {\n\tconst topic = commandTopic(command);\n\tconst commandId = commandIdOf(command);\n\tconst issue: DataIssue = {\n\t\tkind: \"issue\",\n\t\tcode,\n\t\tmessage,\n\t\tseverity: \"error\",\n\t\tsource: \"messageBus\",\n\t\tdetails: command,\n\t\tmetadata: topic === undefined ? undefined : { topic },\n\t};\n\tconst entry: MessageBusDeadLetterEntry = {\n\t\tentrySeq: ++state.deadLetterSeq,\n\t\t...(topic === undefined ? {} : { topic }),\n\t\t...(isObjectRecord(command) ? { command: command as MessageBusCommand } : {}),\n\t\tissue,\n\t\ttimestampMs: state.now(),\n\t};\n\tstate.deadLetters.push(entry);\n\treturn [\n\t\t{ kind: \"issue\", issue },\n\t\t{ kind: \"dead-letter\", entry },\n\t\t{\n\t\t\tkind: \"status\",\n\t\t\tstatus: statusFact(state, \"command-rejected\", {\n\t\t\t\ttopic,\n\t\t\t\tcommandId,\n\t\t\t\tissueCode: code,\n\t\t\t}),\n\t\t},\n\t];\n}\n\nfunction rejectCommand(state: MessageBusState, command: unknown, reason: string): RuntimeEvent[] {\n\treturn issueEvents(state, command, \"malformed-command\", reason);\n}\n\nfunction duplicateCommandEvents(\n\tstate: MessageBusState,\n\tcommand: MessageBusCommand,\n\tmessage: string,\n): RuntimeEvent[] {\n\tconst status = statusFact(state, \"duplicate-command\", {\n\t\ttopic: \"topic\" in command ? command.topic : undefined,\n\t\tcommandId: command.commandId,\n\t});\n\tif (state.dedupe.commandId === \"issue\") {\n\t\treturn [\n\t\t\t{ kind: \"status\", status },\n\t\t\t...issueEvents(state, command, \"duplicate-command\", message),\n\t\t];\n\t}\n\treturn [{ kind: \"status\", status }];\n}\n\nfunction statusFact(\n\tstate: MessageBusState,\n\tkind: MessageBusStatus[\"kind\"],\n\tfields: Partial<MessageBusStatus>,\n): MessageBusStatus {\n\treturn {\n\t\tkind,\n\t\ttimestampMs: state.now(),\n\t\t...(fields.topic === undefined ? {} : { topic: fields.topic }),\n\t\t...(fields.seq === undefined ? {} : { seq: fields.seq }),\n\t\t...(fields.headSeq === undefined ? {} : { headSeq: fields.headSeq }),\n\t\t...(fields.subscriptionId === undefined ? {} : { subscriptionId: fields.subscriptionId }),\n\t\t...(fields.nextSeq === undefined ? {} : { nextSeq: fields.nextSeq }),\n\t\t...(fields.commandId === undefined ? {} : { commandId: fields.commandId }),\n\t\t...(fields.issueCode === undefined ? {} : { issueCode: fields.issueCode }),\n\t\t...(fields.details === undefined ? {} : { details: fields.details }),\n\t};\n}\n\nfunction validateCommand(command: unknown): string | undefined {\n\tif (!isObjectRecord(command)) return \"command must be an object\";\n\tif (typeof command.kind !== \"string\") return \"command kind is required\";\n\tif (!isMessageBusCommandKind(command.kind)) return `unknown command kind '${command.kind}'`;\n\tif (\"topic\" in command) {\n\t\tif (typeof command.topic !== \"string\") return \"messageBus: topic must be a non-empty string\";\n\t\tconst topicError = validateTopicKey(command.topic, \"messageBus\");\n\t\tif (topicError !== undefined) return topicError;\n\t}\n\tif (\"subscriptionId\" in command && typeof command.subscriptionId !== \"string\") {\n\t\treturn \"subscriptionId must be a string\";\n\t}\n\tif (command.kind === \"publish\" && command.payload === undefined)\n\t\treturn \"publish payload is required\";\n\tif (command.kind === \"ack\" && !isPositiveSeq(command.seq))\n\t\treturn \"ack seq must be a positive integer\";\n\tif (command.kind === \"seek\" && !isPositiveSeq(command.nextSeq)) {\n\t\treturn \"seek nextSeq must be a positive integer\";\n\t}\n\tif (\n\t\tcommand.kind === \"topic-policy\" &&\n\t\tcommand.topicPolicy !== \"strict\" &&\n\t\tcommand.topicPolicy !== \"create-as-fact\"\n\t) {\n\t\treturn \"topicPolicy is not recognized\";\n\t}\n\treturn undefined;\n}\n\nfunction isMessageBusCommandKind(kind: string): kind is MessageBusCommand[\"kind\"] {\n\treturn (\n\t\tkind === \"ensure-topic\" ||\n\t\tkind === \"close-topic\" ||\n\t\tkind === \"publish\" ||\n\t\tkind === \"topic-policy\" ||\n\t\tkind === \"ack\" ||\n\t\tkind === \"seek\" ||\n\t\tkind === \"close-subscription\"\n\t);\n}\n\nfunction catalogPage(\n\tstate: MessageBusState,\n\tparams: MessageBusCatalogParams,\n): MessageBusCatalogPage {\n\tconst limit = positiveLimit(params.limit);\n\tconst topics = [...state.topics.entries()]\n\t\t.filter(\n\t\t\t([topic, value]) =>\n\t\t\t\t(params.includeClosed ? true : !value.closed) &&\n\t\t\t\t(params.afterTopic === undefined || topic > params.afterTopic),\n\t\t)\n\t\t.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n\tconst page = topics.slice(0, limit);\n\tconst hasMore = topics.length > limit;\n\treturn {\n\t\ttopics: page.map(([topic, value]) => ({\n\t\t\ttopic,\n\t\t\tclosed: value.closed,\n\t\t\theadSeq: value.headSeq,\n\t\t\tnextSeq: value.nextSeq,\n\t\t\tmessageCount: value.messages.length,\n\t\t})),\n\t\t...(hasMore && page.length > 0 ? { nextAfterTopic: page[page.length - 1]?.[0] } : {}),\n\t\thasMore,\n\t};\n}\n\nfunction topicPage<T>(\n\tstate: MessageBusState,\n\ttopicName: string,\n\tparams: MessageBusTopicParams,\n): MessageBusTopicPage<T> {\n\tconst topic = state.topics.get(topicName);\n\tconst start = params.afterSeq === undefined ? (topic?.headSeq ?? 1) : params.afterSeq + 1;\n\tconst all = (topic?.messages ?? []).filter((message) => message.seq >= start);\n\tconst limit = positiveLimit(params.limit);\n\tconst messages = all.slice(0, limit) as MessageBusMessage<T>[];\n\tconst hasMore = all.length > limit;\n\treturn {\n\t\ttopic: topicName,\n\t\tmessages,\n\t\tfromSeq: start,\n\t\t...(messages.length > 0 ? { throughSeq: messages[messages.length - 1]?.seq } : {}),\n\t\t...(hasMore && messages.length > 0 ? { nextAfterSeq: messages[messages.length - 1]?.seq } : {}),\n\t\thasMore,\n\t};\n}\n\nfunction availablePage<T>(\n\tstate: MessageBusState,\n\tsub: SubscriptionState,\n\tparams: MessageBusAvailableParams,\n): MessageBusAvailablePage<T> {\n\tconst cursor = cursorSnapshot(state, sub);\n\tconst start = params.afterSeq === undefined ? sub.nextSeq : params.afterSeq + 1;\n\tconst topic = state.topics.get(sub.topic);\n\tconst all = sub.retentionGap\n\t\t? []\n\t\t: (topic?.messages ?? []).filter((message) => message.seq >= start);\n\tconst limit = positiveLimit(params.limit);\n\tconst messages = all.slice(0, limit) as MessageBusMessage<T>[];\n\tconst hasMore = all.length > limit;\n\treturn {\n\t\ttopic: sub.topic,\n\t\tsubscriptionId: sub.subscriptionId,\n\t\tcursor,\n\t\tmessages,\n\t\tfromSeq: start,\n\t\t...(messages.length > 0 ? { throughSeq: messages[messages.length - 1]?.seq } : {}),\n\t\t...(hasMore && messages.length > 0 ? { nextAfterSeq: messages[messages.length - 1]?.seq } : {}),\n\t\thasMore,\n\t};\n}\n\nfunction deadLetterPage<T>(\n\tstate: MessageBusState,\n\tparams: MessageBusDeadLetterParams,\n): MessageBusDeadLetterPage<T> {\n\tconst limit = positiveLimit(params.limit);\n\tconst entries = state.deadLetters.filter((entry) => {\n\t\tif (params.afterEntrySeq !== undefined && entry.entrySeq <= params.afterEntrySeq) return false;\n\t\tif (params.topic !== undefined && entry.topic !== params.topic) return false;\n\t\tif (params.code !== undefined && entry.issue.code !== params.code) return false;\n\t\treturn true;\n\t});\n\tconst page = entries.slice(0, limit) as MessageBusDeadLetterEntry<T>[];\n\tconst hasMore = entries.length > limit;\n\treturn {\n\t\tentries: page,\n\t\t...(hasMore && page.length > 0 ? { nextAfterEntrySeq: page[page.length - 1]?.entrySeq } : {}),\n\t\thasMore,\n\t};\n}\n\nfunction cursorSnapshot(state: MessageBusState, sub: SubscriptionState): MessageBusCursor {\n\tconst topic = state.topics.get(sub.topic);\n\treturn {\n\t\ttopic: sub.topic,\n\t\tsubscriptionId: sub.subscriptionId,\n\t\tnextSeq: sub.nextSeq,\n\t\tclosed: sub.closed,\n\t\tretentionGap: sub.retentionGap,\n\t\theadSeq: topic?.headSeq ?? 1,\n\t};\n}\n\nfunction ensureSubscription(\n\tstate: MessageBusState,\n\topts: { topic: string; subscriptionId: string; from: \"earliest\" | \"latest\" | number },\n): SubscriptionState {\n\tconst key = `${opts.topic}\\u0000${opts.subscriptionId}`;\n\tconst existing = state.subscriptions.get(key);\n\tif (existing !== undefined) return existing;\n\tconst topic = state.topics.get(opts.topic);\n\tconst nextSeq =\n\t\topts.from === \"earliest\"\n\t\t\t? (topic?.headSeq ?? 1)\n\t\t\t: opts.from === \"latest\"\n\t\t\t\t? (topic?.nextSeq ?? 1)\n\t\t\t\t: opts.from;\n\tconst sub: SubscriptionState = {\n\t\ttopic: opts.topic,\n\t\tsubscriptionId: opts.subscriptionId,\n\t\tnextSeq,\n\t\tclosed: false,\n\t\tretentionGap: topic !== undefined && nextSeq < topic.headSeq,\n\t};\n\tstate.subscriptions.set(key, sub);\n\treturn sub;\n}\n\nfunction getSubscription(\n\tstate: MessageBusState,\n\ttopic: string,\n\tsubscriptionId: string,\n): SubscriptionState | undefined {\n\treturn state.subscriptions.get(`${topic}\\u0000${subscriptionId}`);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,368 @@
1
+ import {
2
+ eventMessageIssue
3
+ } from "./chunk-PVC7WDKI.js";
4
+ import {
5
+ depBatch
6
+ } from "./chunk-WQIA3GFB.js";
7
+
8
+ // src/patterns/event-flow.ts
9
+ function eventFlow(graph, opts) {
10
+ const name = opts.name ?? opts.flowId ?? "eventFlow";
11
+ const flowId = opts.flowId ?? name;
12
+ const now = opts.now ?? Date.now;
13
+ const sources = normalizeSources(opts.sources);
14
+ const runtime = graph.node(
15
+ sources.map((source) => source.node),
16
+ (ctx) => {
17
+ const state = ctx.state.get() ?? {
18
+ recordSeq: 0,
19
+ auditSeq: 0,
20
+ highWater: /* @__PURE__ */ new Map()
21
+ };
22
+ ctx.state.persist(true);
23
+ for (let i = 0; i < sources.length; i++) {
24
+ const source = sources[i];
25
+ for (const raw of depBatch(ctx, i) ?? []) {
26
+ reduceEventSource(
27
+ raw,
28
+ source.source,
29
+ flowId,
30
+ now(),
31
+ state,
32
+ (fact) => ctx.down([["DATA", fact]])
33
+ );
34
+ }
35
+ }
36
+ ctx.state.set(state);
37
+ },
38
+ {
39
+ name: `${name}/runtime`,
40
+ factory: "eventFlowRuntime",
41
+ meta: { flowId, sources: sources.map((source) => source.source) },
42
+ partial: true,
43
+ completeWhenDepsComplete: false,
44
+ errorWhenDepsError: false
45
+ }
46
+ );
47
+ return {
48
+ records: runtimeProjection(graph, runtime, "record", `${name}/records`, "eventFlowRecords"),
49
+ status: runtimeProjection(graph, runtime, "status", `${name}/status`, "eventFlowStatus"),
50
+ issues: runtimeProjection(graph, runtime, "issue", `${name}/issues`, "eventFlowIssues"),
51
+ audit: runtimeProjection(graph, runtime, "audit", `${name}/audit`, "eventFlowAudit"),
52
+ highWater: runtimeProjection(
53
+ graph,
54
+ runtime,
55
+ "high-water",
56
+ `${name}/highWater`,
57
+ "eventFlowHighWater"
58
+ )
59
+ };
60
+ }
61
+ function eventFlowProjection(graph, flowOrRecords, opts) {
62
+ const records = isEventFlowBundle(flowOrRecords) ? flowOrRecords.records : flowOrRecords;
63
+ const name = opts.name ?? opts.projectionId ?? "eventFlowProjection";
64
+ const projectionId = opts.projectionId ?? name;
65
+ const now = opts.now ?? Date.now;
66
+ const runtime = graph.node(
67
+ [records],
68
+ (ctx) => {
69
+ const state = ctx.state.get() ?? {
70
+ value: opts.initial,
71
+ highWater: emptyHighWater(projectionId),
72
+ sourceHighWater: /* @__PURE__ */ new Map()
73
+ };
74
+ ctx.state.persist(true);
75
+ for (const raw of depBatch(ctx, 0) ?? []) {
76
+ const record = raw;
77
+ try {
78
+ state.value = opts.reduce(state.value, record);
79
+ state.highWater = projectionHighWater(projectionId, record, state.sourceHighWater);
80
+ ctx.down([
81
+ ["DATA", { kind: "frame", frame: { state: state.value, highWater: state.highWater } }],
82
+ [
83
+ "DATA",
84
+ {
85
+ kind: "status",
86
+ status: {
87
+ kind: "projected",
88
+ projectionId,
89
+ recordSeq: record.recordSeq,
90
+ timestampMs: now()
91
+ }
92
+ }
93
+ ],
94
+ ["DATA", { kind: "high-water", highWater: state.highWater }]
95
+ ]);
96
+ } catch (error) {
97
+ const issue = dataIssue(
98
+ "event-flow-projection-threw",
99
+ error instanceof Error ? error.message : "eventFlowProjection reducer threw",
100
+ { projectionId, record }
101
+ );
102
+ ctx.down([
103
+ ["DATA", { kind: "issue", issue }],
104
+ [
105
+ "DATA",
106
+ {
107
+ kind: "status",
108
+ status: {
109
+ kind: "rejected",
110
+ projectionId,
111
+ recordSeq: record.recordSeq,
112
+ issueCode: issue.code,
113
+ timestampMs: now()
114
+ }
115
+ }
116
+ ]
117
+ ]);
118
+ }
119
+ }
120
+ ctx.state.set(state);
121
+ },
122
+ {
123
+ name: `${name}/runtime`,
124
+ factory: "eventFlowProjectionRuntime",
125
+ meta: { projectionId },
126
+ completeWhenDepsComplete: false,
127
+ errorWhenDepsError: false
128
+ }
129
+ );
130
+ return {
131
+ frames: projectionRuntime(
132
+ graph,
133
+ runtime,
134
+ "frame",
135
+ `${name}/frames`,
136
+ "eventFlowProjectionFrames"
137
+ ),
138
+ snapshot: projectionRuntime(
139
+ graph,
140
+ runtime,
141
+ "frame",
142
+ `${name}/snapshot`,
143
+ "eventFlowProjectionSnapshot",
144
+ (fact) => fact.frame.state
145
+ ),
146
+ status: projectionRuntime(
147
+ graph,
148
+ runtime,
149
+ "status",
150
+ `${name}/status`,
151
+ "eventFlowProjectionStatus"
152
+ ),
153
+ issues: projectionRuntime(
154
+ graph,
155
+ runtime,
156
+ "issue",
157
+ `${name}/issues`,
158
+ "eventFlowProjectionIssues"
159
+ ),
160
+ highWater: projectionRuntime(
161
+ graph,
162
+ runtime,
163
+ "high-water",
164
+ `${name}/highWater`,
165
+ "eventFlowProjectionHighWater"
166
+ )
167
+ };
168
+ }
169
+ function reduceEventSource(raw, source, flowId, timestampMs, state, emit) {
170
+ const normalized = normalizeInput(raw, source);
171
+ if (normalized.issue !== void 0) {
172
+ const status2 = {
173
+ kind: "rejected",
174
+ flowId,
175
+ source: normalized.source,
176
+ issueCode: normalized.issue.code,
177
+ timestampMs
178
+ };
179
+ const audit2 = auditRecord(flowId, state, "rejected", timestampMs, {
180
+ source: normalized.source,
181
+ issueCode: normalized.issue.code
182
+ });
183
+ emit({ kind: "issue", issue: normalized.issue });
184
+ emit({ kind: "status", status: status2 });
185
+ emit({ kind: "audit", audit: audit2 });
186
+ emit({ kind: "high-water", highWater: highWaterSnapshot(flowId, state) });
187
+ return;
188
+ }
189
+ const recordSeq = ++state.recordSeq;
190
+ const record = {
191
+ recordSeq,
192
+ flowId,
193
+ event: normalized.event,
194
+ source: normalized.source,
195
+ observedAtMs: timestampMs,
196
+ ...normalized.event.correlationId === void 0 ? {} : { correlationId: normalized.event.correlationId },
197
+ ...normalized.event.causationId === void 0 ? {} : { causationId: normalized.event.causationId }
198
+ };
199
+ state.highWater.set(sourceKey(normalized.source), {
200
+ source: normalized.source.source,
201
+ ...normalized.source.topic === void 0 ? {} : { topic: normalized.source.topic },
202
+ ...normalized.source.seq === void 0 ? {} : { seq: normalized.source.seq },
203
+ messageId: normalized.event.id,
204
+ recordSeq
205
+ });
206
+ const audit = auditRecord(flowId, state, "recorded", timestampMs, {
207
+ source: normalized.source,
208
+ eventId: normalized.event.id,
209
+ eventType: normalized.event.type
210
+ });
211
+ const highWater = highWaterSnapshot(flowId, state);
212
+ const status = {
213
+ kind: "recorded",
214
+ flowId,
215
+ recordSeq,
216
+ eventId: normalized.event.id,
217
+ eventType: normalized.event.type,
218
+ source: normalized.source,
219
+ timestampMs
220
+ };
221
+ emit({ kind: "record", record });
222
+ emit({ kind: "status", status });
223
+ emit({ kind: "audit", audit });
224
+ emit({ kind: "high-water", highWater });
225
+ }
226
+ function normalizeInput(raw, source) {
227
+ const envelope = messageEnvelopeOf(raw);
228
+ const value = envelope?.payload ?? raw;
229
+ const sourceRef = envelope === void 0 ? { source, ...eventIdOf(value) === void 0 ? {} : { messageId: eventIdOf(value) } } : {
230
+ source,
231
+ topic: envelope.topic,
232
+ seq: envelope.seq,
233
+ messageId: envelope.payload.id,
234
+ ...envelope.idempotencyKey === void 0 ? {} : { idempotencyKey: envelope.idempotencyKey }
235
+ };
236
+ const issue = eventMessageIssue(value);
237
+ if (issue !== void 0) {
238
+ return {
239
+ source: sourceRef,
240
+ issue: dataIssue(issue.code, issue.message, { source: sourceRef, value })
241
+ };
242
+ }
243
+ return { event: value, source: sourceRef };
244
+ }
245
+ function messageEnvelopeOf(value) {
246
+ if (!isRecord(value)) return void 0;
247
+ if (typeof value.topic !== "string" || !Number.isInteger(value.seq) || typeof value.timestampMs !== "number" || !("payload" in value)) {
248
+ return void 0;
249
+ }
250
+ const payloadIssue = eventMessageIssue(value.payload);
251
+ return payloadIssue === void 0 ? value : void 0;
252
+ }
253
+ function normalizeSources(sources) {
254
+ if (sources.length === 0) throw new Error("eventFlow: sources must be non-empty");
255
+ return sources.map((source, index) => {
256
+ if (isRecord(source) && "node" in source) {
257
+ if (typeof source.source !== "string" || source.source.length === 0) {
258
+ throw new Error("eventFlow: source name must be non-empty");
259
+ }
260
+ return source;
261
+ }
262
+ return { source: `source-${index}`, node: source };
263
+ });
264
+ }
265
+ function runtimeProjection(graph, runtime, kind, name, factory) {
266
+ return graph.node(
267
+ [runtime],
268
+ (ctx) => {
269
+ for (const fact of depBatch(ctx, 0) ?? []) {
270
+ const typed = fact;
271
+ if (typed.kind === kind) ctx.down([["DATA", valueOfRuntimeFact(typed)]]);
272
+ }
273
+ },
274
+ { name, factory, completeWhenDepsComplete: false, errorWhenDepsError: false }
275
+ );
276
+ }
277
+ function projectionRuntime(graph, runtime, kind, name, factory, map = valueOfRuntimeFact) {
278
+ return graph.node(
279
+ [runtime],
280
+ (ctx) => {
281
+ for (const fact of depBatch(ctx, 0) ?? []) {
282
+ const typed = fact;
283
+ if (typed.kind === kind) ctx.down([["DATA", map(typed)]]);
284
+ }
285
+ },
286
+ { name, factory, completeWhenDepsComplete: false, errorWhenDepsError: false }
287
+ );
288
+ }
289
+ function valueOfRuntimeFact(fact) {
290
+ if ("record" in fact) return fact.record;
291
+ if ("status" in fact) return fact.status;
292
+ if ("issue" in fact) return fact.issue;
293
+ if ("audit" in fact) return fact.audit;
294
+ if ("highWater" in fact) return fact.highWater;
295
+ if ("frame" in fact) return fact.frame;
296
+ return void 0;
297
+ }
298
+ function auditRecord(flowId, state, outcome, timestampMs, opts) {
299
+ return {
300
+ seq: ++state.auditSeq,
301
+ flowId,
302
+ outcome,
303
+ ...opts.eventId === void 0 ? {} : { eventId: opts.eventId },
304
+ ...opts.eventType === void 0 ? {} : { eventType: opts.eventType },
305
+ ...opts.issueCode === void 0 ? {} : { issueCode: opts.issueCode },
306
+ ...opts.source === void 0 ? {} : { source: opts.source },
307
+ highWater: highWaterSnapshot(flowId, state),
308
+ timestampMs
309
+ };
310
+ }
311
+ function highWaterSnapshot(flowId, state) {
312
+ return {
313
+ flowId,
314
+ recordSeq: state.recordSeq,
315
+ auditSeq: state.auditSeq,
316
+ sources: [...state.highWater.values()].sort(
317
+ (a, b) => a.source.localeCompare(b.source) || (a.topic ?? "").localeCompare(b.topic ?? "")
318
+ )
319
+ };
320
+ }
321
+ function emptyHighWater(flowId) {
322
+ return { flowId, recordSeq: 0, auditSeq: 0, sources: [] };
323
+ }
324
+ function projectionHighWater(flowId, record, sourceHighWater) {
325
+ sourceHighWater.set(sourceKey(record.source), {
326
+ source: record.source.source,
327
+ ...record.source.topic === void 0 ? {} : { topic: record.source.topic },
328
+ ...record.source.seq === void 0 ? {} : { seq: record.source.seq },
329
+ messageId: record.event.id,
330
+ recordSeq: record.recordSeq
331
+ });
332
+ return {
333
+ flowId,
334
+ recordSeq: record.recordSeq,
335
+ auditSeq: 0,
336
+ sources: [...sourceHighWater.values()].sort(
337
+ (a, b) => a.source.localeCompare(b.source) || (a.topic ?? "").localeCompare(b.topic ?? "")
338
+ )
339
+ };
340
+ }
341
+ function sourceKey(source) {
342
+ return `${source.source}\0${source.topic ?? ""}`;
343
+ }
344
+ function eventIdOf(value) {
345
+ return isRecord(value) && typeof value.id === "string" ? value.id : void 0;
346
+ }
347
+ function dataIssue(code, message, details) {
348
+ return {
349
+ kind: "issue",
350
+ code,
351
+ message,
352
+ severity: "error",
353
+ source: "eventFlow",
354
+ ...details === void 0 ? {} : { details }
355
+ };
356
+ }
357
+ function isEventFlowBundle(value) {
358
+ return isRecord(value) && "records" in value && "highWater" in value;
359
+ }
360
+ function isRecord(value) {
361
+ return typeof value === "object" && value !== null && !Array.isArray(value);
362
+ }
363
+
364
+ export {
365
+ eventFlow,
366
+ eventFlowProjection
367
+ };
368
+ //# sourceMappingURL=chunk-RAHNUYA5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/patterns/event-flow.ts"],"sourcesContent":["/**\n * Event-flow projector helpers (D326/D329/D331).\n *\n * eventFlow consumes declared graph sources that emit EventMessage or\n * MessageEnvelope<EventMessage>. It records projection facts and high-water over\n * source coordinates; it does not own topics, subscriptions, cursors, retention,\n * ack/seek/close, queues, workers, or dead-letter policy.\n */\n\nimport { depBatch } from \"../ctx/types.js\";\nimport type { DataIssue } from \"../data/index.js\";\nimport type { Graph } from \"../graph/graph.js\";\nimport type { EventMessage, MessageEnvelope } from \"../messaging/index.js\";\nimport { eventMessageIssue } from \"../messaging/index.js\";\nimport type { Node } from \"../node/node.js\";\n\nexport interface EventFlowSource<T = unknown> {\n\treadonly source: string;\n\treadonly node: Node<EventMessage<T> | MessageEnvelope<EventMessage<T>> | unknown>;\n}\n\nexport type EventFlowSourceInput<T = unknown> =\n\t| Node<EventMessage<T> | MessageEnvelope<EventMessage<T>> | unknown>\n\t| EventFlowSource<T>;\n\nexport interface EventFlowSourceRef {\n\treadonly source: string;\n\treadonly topic?: string;\n\treadonly seq?: number;\n\treadonly messageId?: string;\n\treadonly idempotencyKey?: string;\n}\n\nexport interface EventFlowRecord<T = unknown> {\n\treadonly recordSeq: number;\n\treadonly flowId: string;\n\treadonly event: EventMessage<T>;\n\treadonly source: EventFlowSourceRef;\n\treadonly observedAtMs: number;\n\treadonly correlationId?: string;\n\treadonly causationId?: string;\n}\n\nexport interface EventFlowStatus {\n\treadonly kind: \"recorded\" | \"rejected\" | \"projection-ready\" | \"projection-stale\";\n\treadonly flowId: string;\n\treadonly recordSeq?: number;\n\treadonly eventId?: string;\n\treadonly eventType?: string;\n\treadonly source?: EventFlowSourceRef;\n\treadonly issueCode?: string;\n\treadonly timestampMs: number;\n}\n\nexport interface EventFlowAuditRecord {\n\treadonly seq: number;\n\treadonly flowId: string;\n\treadonly outcome: \"recorded\" | \"rejected\";\n\treadonly eventId?: string;\n\treadonly eventType?: string;\n\treadonly issueCode?: string;\n\treadonly source?: EventFlowSourceRef;\n\treadonly highWater: EventFlowHighWater;\n\treadonly timestampMs: number;\n}\n\nexport interface EventFlowSourceHighWater {\n\treadonly source: string;\n\treadonly topic?: string;\n\treadonly seq?: number;\n\treadonly messageId?: string;\n\treadonly recordSeq: number;\n}\n\nexport interface EventFlowHighWater {\n\treadonly flowId: string;\n\treadonly recordSeq: number;\n\treadonly auditSeq: number;\n\treadonly sources: readonly EventFlowSourceHighWater[];\n}\n\nexport interface EventFlowOptions<T = unknown> {\n\treadonly flowId?: string;\n\treadonly name?: string;\n\treadonly sources: readonly EventFlowSourceInput<T>[];\n\treadonly now?: () => number;\n}\n\nexport interface EventFlowBundle<T = unknown> {\n\treadonly records: Node<EventFlowRecord<T>>;\n\treadonly status: Node<EventFlowStatus>;\n\treadonly issues: Node<DataIssue>;\n\treadonly audit: Node<EventFlowAuditRecord>;\n\treadonly highWater: Node<EventFlowHighWater>;\n}\n\nexport interface EventFlowProjectionFrame<TState> {\n\treadonly state: TState;\n\treadonly highWater: EventFlowHighWater;\n}\n\nexport interface EventFlowProjectionStatus {\n\treadonly kind: \"projected\" | \"rejected\";\n\treadonly projectionId: string;\n\treadonly recordSeq?: number;\n\treadonly issueCode?: string;\n\treadonly timestampMs: number;\n}\n\nexport interface EventFlowProjectionOptions<TState, TPayload = unknown> {\n\treadonly projectionId?: string;\n\treadonly name?: string;\n\treadonly initial: TState;\n\treadonly reduce: (state: TState, record: EventFlowRecord<TPayload>) => TState;\n\treadonly now?: () => number;\n}\n\nexport interface EventFlowProjectionBundle<TState> {\n\treadonly snapshot: Node<TState>;\n\treadonly frames: Node<EventFlowProjectionFrame<TState>>;\n\treadonly status: Node<EventFlowProjectionStatus>;\n\treadonly issues: Node<DataIssue>;\n\treadonly highWater: Node<EventFlowHighWater>;\n}\n\ntype EventFlowRuntimeFact<T = unknown> =\n\t| { readonly kind: \"record\"; readonly record: EventFlowRecord<T> }\n\t| { readonly kind: \"status\"; readonly status: EventFlowStatus }\n\t| { readonly kind: \"issue\"; readonly issue: DataIssue }\n\t| { readonly kind: \"audit\"; readonly audit: EventFlowAuditRecord }\n\t| { readonly kind: \"high-water\"; readonly highWater: EventFlowHighWater };\n\ninterface EventFlowRuntimeState {\n\trecordSeq: number;\n\tauditSeq: number;\n\thighWater: Map<string, EventFlowSourceHighWater>;\n}\n\nexport function eventFlow<T = unknown>(\n\tgraph: Graph,\n\topts: EventFlowOptions<T>,\n): EventFlowBundle<T> {\n\tconst name = opts.name ?? opts.flowId ?? \"eventFlow\";\n\tconst flowId = opts.flowId ?? name;\n\tconst now = opts.now ?? Date.now;\n\tconst sources = normalizeSources(opts.sources);\n\tconst runtime = graph.node<EventFlowRuntimeFact<T>>(\n\t\tsources.map((source) => source.node),\n\t\t(ctx) => {\n\t\t\tconst state =\n\t\t\t\tctx.state.get<EventFlowRuntimeState>() ??\n\t\t\t\t({\n\t\t\t\t\trecordSeq: 0,\n\t\t\t\t\tauditSeq: 0,\n\t\t\t\t\thighWater: new Map(),\n\t\t\t\t} satisfies EventFlowRuntimeState);\n\t\t\tctx.state.persist(true);\n\t\t\tfor (let i = 0; i < sources.length; i++) {\n\t\t\t\tconst source = sources[i];\n\t\t\t\tfor (const raw of depBatch(ctx, i) ?? []) {\n\t\t\t\t\treduceEventSource(raw, source.source, flowId, now(), state, (fact) =>\n\t\t\t\t\t\tctx.down([[\"DATA\", fact as EventFlowRuntimeFact<T>]]),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.state.set(state);\n\t\t},\n\t\t{\n\t\t\tname: `${name}/runtime`,\n\t\t\tfactory: \"eventFlowRuntime\",\n\t\t\tmeta: { flowId, sources: sources.map((source) => source.source) },\n\t\t\tpartial: true,\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\terrorWhenDepsError: false,\n\t\t},\n\t);\n\treturn {\n\t\trecords: runtimeProjection(graph, runtime, \"record\", `${name}/records`, \"eventFlowRecords\"),\n\t\tstatus: runtimeProjection(graph, runtime, \"status\", `${name}/status`, \"eventFlowStatus\"),\n\t\tissues: runtimeProjection(graph, runtime, \"issue\", `${name}/issues`, \"eventFlowIssues\"),\n\t\taudit: runtimeProjection(graph, runtime, \"audit\", `${name}/audit`, \"eventFlowAudit\"),\n\t\thighWater: runtimeProjection(\n\t\t\tgraph,\n\t\t\truntime,\n\t\t\t\"high-water\",\n\t\t\t`${name}/highWater`,\n\t\t\t\"eventFlowHighWater\",\n\t\t),\n\t};\n}\n\nexport function eventFlowProjection<TState, TPayload = unknown>(\n\tgraph: Graph,\n\tflowOrRecords: EventFlowBundle<TPayload> | Node<EventFlowRecord<TPayload>>,\n\topts: EventFlowProjectionOptions<TState, TPayload>,\n): EventFlowProjectionBundle<TState> {\n\tconst records = isEventFlowBundle(flowOrRecords) ? flowOrRecords.records : flowOrRecords;\n\tconst name = opts.name ?? opts.projectionId ?? \"eventFlowProjection\";\n\tconst projectionId = opts.projectionId ?? name;\n\tconst now = opts.now ?? Date.now;\n\tconst runtime = graph.node<\n\t\t| { readonly kind: \"frame\"; readonly frame: EventFlowProjectionFrame<TState> }\n\t\t| { readonly kind: \"status\"; readonly status: EventFlowProjectionStatus }\n\t\t| { readonly kind: \"issue\"; readonly issue: DataIssue }\n\t\t| { readonly kind: \"high-water\"; readonly highWater: EventFlowHighWater }\n\t>(\n\t\t[records],\n\t\t(ctx) => {\n\t\t\tconst state = ctx.state.get<{\n\t\t\t\tvalue: TState;\n\t\t\t\thighWater: EventFlowHighWater;\n\t\t\t\tsourceHighWater: Map<string, EventFlowSourceHighWater>;\n\t\t\t}>() ?? {\n\t\t\t\tvalue: opts.initial,\n\t\t\t\thighWater: emptyHighWater(projectionId),\n\t\t\t\tsourceHighWater: new Map(),\n\t\t\t};\n\t\t\tctx.state.persist(true);\n\t\t\tfor (const raw of depBatch(ctx, 0) ?? []) {\n\t\t\t\tconst record = raw as EventFlowRecord<TPayload>;\n\t\t\t\ttry {\n\t\t\t\t\tstate.value = opts.reduce(state.value, record);\n\t\t\t\t\tstate.highWater = projectionHighWater(projectionId, record, state.sourceHighWater);\n\t\t\t\t\tctx.down([\n\t\t\t\t\t\t[\"DATA\", { kind: \"frame\", frame: { state: state.value, highWater: state.highWater } }],\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"DATA\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkind: \"status\",\n\t\t\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\t\t\tkind: \"projected\",\n\t\t\t\t\t\t\t\t\tprojectionId,\n\t\t\t\t\t\t\t\t\trecordSeq: record.recordSeq,\n\t\t\t\t\t\t\t\t\ttimestampMs: now(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\t[\"DATA\", { kind: \"high-water\", highWater: state.highWater }],\n\t\t\t\t\t]);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst issue = dataIssue(\n\t\t\t\t\t\t\"event-flow-projection-threw\",\n\t\t\t\t\t\terror instanceof Error ? error.message : \"eventFlowProjection reducer threw\",\n\t\t\t\t\t\t{ projectionId, record },\n\t\t\t\t\t);\n\t\t\t\t\tctx.down([\n\t\t\t\t\t\t[\"DATA\", { kind: \"issue\", issue }],\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"DATA\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkind: \"status\",\n\t\t\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\t\t\tkind: \"rejected\",\n\t\t\t\t\t\t\t\t\tprojectionId,\n\t\t\t\t\t\t\t\t\trecordSeq: record.recordSeq,\n\t\t\t\t\t\t\t\t\tissueCode: issue.code,\n\t\t\t\t\t\t\t\t\ttimestampMs: now(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.state.set(state);\n\t\t},\n\t\t{\n\t\t\tname: `${name}/runtime`,\n\t\t\tfactory: \"eventFlowProjectionRuntime\",\n\t\t\tmeta: { projectionId },\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\terrorWhenDepsError: false,\n\t\t},\n\t);\n\treturn {\n\t\tframes: projectionRuntime(\n\t\t\tgraph,\n\t\t\truntime,\n\t\t\t\"frame\",\n\t\t\t`${name}/frames`,\n\t\t\t\"eventFlowProjectionFrames\",\n\t\t),\n\t\tsnapshot: projectionRuntime(\n\t\t\tgraph,\n\t\t\truntime,\n\t\t\t\"frame\",\n\t\t\t`${name}/snapshot`,\n\t\t\t\"eventFlowProjectionSnapshot\",\n\t\t\t(fact) => (fact as { readonly frame: EventFlowProjectionFrame<TState> }).frame.state,\n\t\t),\n\t\tstatus: projectionRuntime(\n\t\t\tgraph,\n\t\t\truntime,\n\t\t\t\"status\",\n\t\t\t`${name}/status`,\n\t\t\t\"eventFlowProjectionStatus\",\n\t\t),\n\t\tissues: projectionRuntime(\n\t\t\tgraph,\n\t\t\truntime,\n\t\t\t\"issue\",\n\t\t\t`${name}/issues`,\n\t\t\t\"eventFlowProjectionIssues\",\n\t\t),\n\t\thighWater: projectionRuntime(\n\t\t\tgraph,\n\t\t\truntime,\n\t\t\t\"high-water\",\n\t\t\t`${name}/highWater`,\n\t\t\t\"eventFlowProjectionHighWater\",\n\t\t),\n\t};\n}\n\nfunction reduceEventSource<T>(\n\traw: unknown,\n\tsource: string,\n\tflowId: string,\n\ttimestampMs: number,\n\tstate: EventFlowRuntimeState,\n\temit: (fact: EventFlowRuntimeFact<T>) => void,\n): void {\n\tconst normalized = normalizeInput(raw, source);\n\tif (normalized.issue !== undefined) {\n\t\tconst status: EventFlowStatus = {\n\t\t\tkind: \"rejected\",\n\t\t\tflowId,\n\t\t\tsource: normalized.source,\n\t\t\tissueCode: normalized.issue.code,\n\t\t\ttimestampMs,\n\t\t};\n\t\tconst audit = auditRecord(flowId, state, \"rejected\", timestampMs, {\n\t\t\tsource: normalized.source,\n\t\t\tissueCode: normalized.issue.code,\n\t\t});\n\t\temit({ kind: \"issue\", issue: normalized.issue });\n\t\temit({ kind: \"status\", status });\n\t\temit({ kind: \"audit\", audit });\n\t\temit({ kind: \"high-water\", highWater: highWaterSnapshot(flowId, state) });\n\t\treturn;\n\t}\n\n\tconst recordSeq = ++state.recordSeq;\n\tconst record: EventFlowRecord<T> = {\n\t\trecordSeq,\n\t\tflowId,\n\t\tevent: normalized.event as EventMessage<T>,\n\t\tsource: normalized.source,\n\t\tobservedAtMs: timestampMs,\n\t\t...(normalized.event.correlationId === undefined\n\t\t\t? {}\n\t\t\t: { correlationId: normalized.event.correlationId }),\n\t\t...(normalized.event.causationId === undefined\n\t\t\t? {}\n\t\t\t: { causationId: normalized.event.causationId }),\n\t};\n\tstate.highWater.set(sourceKey(normalized.source), {\n\t\tsource: normalized.source.source,\n\t\t...(normalized.source.topic === undefined ? {} : { topic: normalized.source.topic }),\n\t\t...(normalized.source.seq === undefined ? {} : { seq: normalized.source.seq }),\n\t\tmessageId: normalized.event.id,\n\t\trecordSeq,\n\t});\n\tconst audit = auditRecord(flowId, state, \"recorded\", timestampMs, {\n\t\tsource: normalized.source,\n\t\teventId: normalized.event.id,\n\t\teventType: normalized.event.type,\n\t});\n\tconst highWater = highWaterSnapshot(flowId, state);\n\tconst status: EventFlowStatus = {\n\t\tkind: \"recorded\",\n\t\tflowId,\n\t\trecordSeq,\n\t\teventId: normalized.event.id,\n\t\teventType: normalized.event.type,\n\t\tsource: normalized.source,\n\t\ttimestampMs,\n\t};\n\temit({ kind: \"record\", record });\n\temit({ kind: \"status\", status });\n\temit({ kind: \"audit\", audit });\n\temit({ kind: \"high-water\", highWater });\n}\n\nfunction normalizeInput(\n\traw: unknown,\n\tsource: string,\n):\n\t| {\n\t\t\treadonly event: EventMessage;\n\t\t\treadonly source: EventFlowSourceRef;\n\t\t\treadonly issue?: undefined;\n\t }\n\t| { readonly source: EventFlowSourceRef; readonly issue: DataIssue } {\n\tconst envelope = messageEnvelopeOf(raw);\n\tconst value = envelope?.payload ?? raw;\n\tconst sourceRef: EventFlowSourceRef =\n\t\tenvelope === undefined\n\t\t\t? { source, ...(eventIdOf(value) === undefined ? {} : { messageId: eventIdOf(value) }) }\n\t\t\t: {\n\t\t\t\t\tsource,\n\t\t\t\t\ttopic: envelope.topic,\n\t\t\t\t\tseq: envelope.seq,\n\t\t\t\t\tmessageId: envelope.payload.id,\n\t\t\t\t\t...(envelope.idempotencyKey === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { idempotencyKey: envelope.idempotencyKey }),\n\t\t\t\t};\n\tconst issue = eventMessageIssue(value);\n\tif (issue !== undefined) {\n\t\treturn {\n\t\t\tsource: sourceRef,\n\t\t\tissue: dataIssue(issue.code, issue.message, { source: sourceRef, value }),\n\t\t};\n\t}\n\treturn { event: value as EventMessage, source: sourceRef };\n}\n\nfunction messageEnvelopeOf(value: unknown): MessageEnvelope<EventMessage> | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (\n\t\ttypeof value.topic !== \"string\" ||\n\t\t!Number.isInteger(value.seq) ||\n\t\ttypeof value.timestampMs !== \"number\" ||\n\t\t!(\"payload\" in value)\n\t) {\n\t\treturn undefined;\n\t}\n\tconst payloadIssue = eventMessageIssue(value.payload);\n\treturn payloadIssue === undefined\n\t\t? (value as unknown as MessageEnvelope<EventMessage>)\n\t\t: undefined;\n}\n\nfunction normalizeSources<T>(\n\tsources: readonly EventFlowSourceInput<T>[],\n): readonly EventFlowSource[] {\n\tif (sources.length === 0) throw new Error(\"eventFlow: sources must be non-empty\");\n\treturn sources.map((source, index) => {\n\t\tif (isRecord(source) && \"node\" in source) {\n\t\t\tif (typeof source.source !== \"string\" || source.source.length === 0) {\n\t\t\t\tthrow new Error(\"eventFlow: source name must be non-empty\");\n\t\t\t}\n\t\t\treturn source as EventFlowSource;\n\t\t}\n\t\treturn { source: `source-${index}`, node: source as EventFlowSource[\"node\"] };\n\t});\n}\n\nfunction runtimeProjection<TOut, T>(\n\tgraph: Graph,\n\truntime: Node<EventFlowRuntimeFact<T>>,\n\tkind: EventFlowRuntimeFact<T>[\"kind\"],\n\tname: string,\n\tfactory: string,\n): Node<TOut> {\n\treturn graph.node<TOut>(\n\t\t[runtime],\n\t\t(ctx) => {\n\t\t\tfor (const fact of depBatch(ctx, 0) ?? []) {\n\t\t\t\tconst typed = fact as EventFlowRuntimeFact<T>;\n\t\t\t\tif (typed.kind === kind) ctx.down([[\"DATA\", valueOfRuntimeFact(typed) as TOut]]);\n\t\t\t}\n\t\t},\n\t\t{ name, factory, completeWhenDepsComplete: false, errorWhenDepsError: false },\n\t);\n}\n\nfunction projectionRuntime<TOut, TFact extends { readonly kind: string }>(\n\tgraph: Graph,\n\truntime: Node<TFact>,\n\tkind: TFact[\"kind\"],\n\tname: string,\n\tfactory: string,\n\tmap: (fact: Extract<TFact, { readonly kind: typeof kind }>) => TOut = valueOfRuntimeFact as never,\n): Node<TOut> {\n\treturn graph.node<TOut>(\n\t\t[runtime],\n\t\t(ctx) => {\n\t\t\tfor (const fact of depBatch(ctx, 0) ?? []) {\n\t\t\t\tconst typed = fact as TFact;\n\t\t\t\tif (typed.kind === kind) ctx.down([[\"DATA\", map(typed as never)]]);\n\t\t\t}\n\t\t},\n\t\t{ name, factory, completeWhenDepsComplete: false, errorWhenDepsError: false },\n\t);\n}\n\nfunction valueOfRuntimeFact(fact: { readonly kind: string }): unknown {\n\tif (\"record\" in fact) return fact.record;\n\tif (\"status\" in fact) return fact.status;\n\tif (\"issue\" in fact) return fact.issue;\n\tif (\"audit\" in fact) return fact.audit;\n\tif (\"highWater\" in fact) return fact.highWater;\n\tif (\"frame\" in fact) return fact.frame;\n\treturn undefined;\n}\n\nfunction auditRecord(\n\tflowId: string,\n\tstate: EventFlowRuntimeState,\n\toutcome: \"recorded\" | \"rejected\",\n\ttimestampMs: number,\n\topts: {\n\t\treadonly source?: EventFlowSourceRef;\n\t\treadonly eventId?: string;\n\t\treadonly eventType?: string;\n\t\treadonly issueCode?: string;\n\t},\n): EventFlowAuditRecord {\n\treturn {\n\t\tseq: ++state.auditSeq,\n\t\tflowId,\n\t\toutcome,\n\t\t...(opts.eventId === undefined ? {} : { eventId: opts.eventId }),\n\t\t...(opts.eventType === undefined ? {} : { eventType: opts.eventType }),\n\t\t...(opts.issueCode === undefined ? {} : { issueCode: opts.issueCode }),\n\t\t...(opts.source === undefined ? {} : { source: opts.source }),\n\t\thighWater: highWaterSnapshot(flowId, state),\n\t\ttimestampMs,\n\t};\n}\n\nfunction highWaterSnapshot(flowId: string, state: EventFlowRuntimeState): EventFlowHighWater {\n\treturn {\n\t\tflowId,\n\t\trecordSeq: state.recordSeq,\n\t\tauditSeq: state.auditSeq,\n\t\tsources: [...state.highWater.values()].sort(\n\t\t\t(a, b) => a.source.localeCompare(b.source) || (a.topic ?? \"\").localeCompare(b.topic ?? \"\"),\n\t\t),\n\t};\n}\n\nfunction emptyHighWater(flowId: string): EventFlowHighWater {\n\treturn { flowId, recordSeq: 0, auditSeq: 0, sources: [] };\n}\n\nfunction projectionHighWater(\n\tflowId: string,\n\trecord: EventFlowRecord,\n\tsourceHighWater: Map<string, EventFlowSourceHighWater>,\n): EventFlowHighWater {\n\tsourceHighWater.set(sourceKey(record.source), {\n\t\tsource: record.source.source,\n\t\t...(record.source.topic === undefined ? {} : { topic: record.source.topic }),\n\t\t...(record.source.seq === undefined ? {} : { seq: record.source.seq }),\n\t\tmessageId: record.event.id,\n\t\trecordSeq: record.recordSeq,\n\t});\n\treturn {\n\t\tflowId,\n\t\trecordSeq: record.recordSeq,\n\t\tauditSeq: 0,\n\t\tsources: [...sourceHighWater.values()].sort(\n\t\t\t(a, b) => a.source.localeCompare(b.source) || (a.topic ?? \"\").localeCompare(b.topic ?? \"\"),\n\t\t),\n\t};\n}\n\nfunction sourceKey(source: EventFlowSourceRef): string {\n\treturn `${source.source}\\u0000${source.topic ?? \"\"}`;\n}\n\nfunction eventIdOf(value: unknown): string | undefined {\n\treturn isRecord(value) && typeof value.id === \"string\" ? value.id : undefined;\n}\n\nfunction dataIssue(code: string, message: string, details?: unknown): DataIssue {\n\treturn {\n\t\tkind: \"issue\",\n\t\tcode,\n\t\tmessage,\n\t\tseverity: \"error\",\n\t\tsource: \"eventFlow\",\n\t\t...(details === undefined ? {} : { details }),\n\t};\n}\n\nfunction isEventFlowBundle<T>(value: unknown): value is EventFlowBundle<T> {\n\treturn isRecord(value) && \"records\" in value && \"highWater\" in value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["status","audit"]}
@@ -17,6 +17,7 @@ var TIER = {
17
17
  START: TIER_START,
18
18
  PAUSE: TIER_CONTROL,
19
19
  RESUME: TIER_CONTROL,
20
+ PULL: TIER_CONTROL,
20
21
  DIRTY: TIER_NOTIFICATION,
21
22
  DATA: TIER_VALUE,
22
23
  RESOLVED: TIER_VALUE,
@@ -64,4 +65,4 @@ export {
64
65
  isTerminal,
65
66
  isUpAllowed
66
67
  };
67
- //# sourceMappingURL=chunk-DK554R7P.js.map
68
+ //# sourceMappingURL=chunk-S6HXABGL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/protocol/messages.ts"],"sourcesContent":["/**\n * Wave-protocol message types and the tier const table.\n *\n * Canonical authority: ~/src/graphrefly/spec/rules.jsonl\n * R-msg-format, R-msg-closed-set, R-tier (D34), R-data-payload, R-sentinel.\n */\n\n/** Opaque pause-lock / pull identifier (R-pause-lockset, R-pull). */\nexport type LockId = string | symbol;\n\n/** Explicit pull demand payload (D269/D272). Params are holder-visible context, never DATA-up. */\nexport interface PullDemand {\n\treadonly pullId: LockId;\n\treadonly params?: unknown;\n}\n\n/**\n * The CLOSED set of 11 message types (R-msg-closed-set / D9 + D269 + START handshake).\n * No open set, no user-defined custom types. Adding a type is a spec change.\n */\nexport type Message =\n\t| readonly [\"START\"]\n\t| readonly [\"DIRTY\"]\n\t| readonly [\"DATA\", unknown]\n\t| readonly [\"RESOLVED\"]\n\t| readonly [\"INVALIDATE\"]\n\t| readonly [\"COMPLETE\"]\n\t| readonly [\"ERROR\", unknown]\n\t| readonly [\"TEARDOWN\"]\n\t| readonly [\"PAUSE\", LockId]\n\t| readonly [\"RESUME\", LockId]\n\t| readonly [\"PULL\", PullDemand];\n\n/** One array of messages delivered in one call = one Wave (R-wave-boundary). */\nexport type Wave = readonly Message[];\n\n/** The message-type tag (the first tuple element). */\nexport type MessageType = Message[0];\n\n/**\n * SENTINEL = absence-of-DATA (R-sentinel / D16). TS representation is `undefined`.\n * Never a valid DATA payload; `null` IS a valid DATA value (domain-level absence).\n */\nexport const SENTINEL = undefined;\n\n/** R-data-payload: ERROR payloads must not collide with terminal metadata shorthand. */\nexport function isInvalidErrorPayload(v: unknown): boolean {\n\treturn v === SENTINEL || typeof v === \"boolean\";\n}\n\n/** R-data-payload / D78: host-language failures that collide with ctx.terminal shorthand become diagnostics. */\nexport function errorPayload(reason: unknown, fallback = \"error without a valid payload\"): unknown {\n\treturn isInvalidErrorPayload(reason) ? new Error(fallback) : reason;\n}\n\nexport const TIER_START = 0;\nexport const TIER_CONTROL = 1;\nexport const TIER_NOTIFICATION = 2;\nexport const TIER_VALUE = 3;\nexport const TIER_SETTLE = 4;\nexport const TIER_TERMINAL = 5;\nexport const TIER_TEARDOWN = 6;\n\n/**\n * Tier const table (R-tier / D34). Tiers below value dispatch immediately; value\n * and above are batch-deferred. This is a compile-time const table (D18), not runtime config.\n */\nconst TIER: Record<MessageType, number> = {\n\tSTART: TIER_START,\n\tPAUSE: TIER_CONTROL,\n\tRESUME: TIER_CONTROL,\n\tPULL: TIER_CONTROL,\n\tDIRTY: TIER_NOTIFICATION,\n\tDATA: TIER_VALUE,\n\tRESOLVED: TIER_VALUE,\n\tINVALIDATE: TIER_SETTLE,\n\tCOMPLETE: TIER_TERMINAL,\n\tERROR: TIER_TERMINAL,\n\tTEARDOWN: TIER_TEARDOWN,\n};\n\nexport function messageTier(t: MessageType): number {\n\treturn TIER[t];\n}\n\n/** Value and above are deferred inside a batch (DATA/RESOLVED/INVALIDATE/terminal/teardown). */\nexport function isDeferredTier(t: MessageType): boolean {\n\treturn TIER[t] >= TIER_VALUE;\n}\n\n/** Value-tier messages (DATA/RESOLVED) occupy the tier-3 slot. */\nexport function isValueTier(t: MessageType): boolean {\n\treturn TIER[t] === TIER_VALUE;\n}\n\n/** The pause buffer holds the settle slice only: value-tier DATA/RESOLVED plus INVALIDATE. */\nexport function isPauseBufferedTier(t: MessageType): boolean {\n\tconst tier = TIER[t];\n\treturn tier === TIER_VALUE || tier === TIER_SETTLE;\n}\n\n/**\n * A TERMINAL message = tier 5 (COMPLETE | ERROR), R-tier / D34. Detected via the CENTRAL tier\n * table, NOT a per-variant `=== \"COMPLETE\" || === \"ERROR\"` check — so terminal routing stays\n * driven by the one const table (feedback_use_tier_for_signal_routing); discriminate COMPLETE vs\n * ERROR within the tier by the message type only where the handling actually differs.\n */\nexport function isTerminal(t: MessageType): boolean {\n\treturn TIER[t] === TIER_TERMINAL;\n}\n\n/**\n * ctx.up carries control/demand tiers only (R-ctx-up / D269): DIRTY, PAUSE, RESUME, PULL,\n * INVALIDATE, TEARDOWN. DATA/RESOLVED (tier 3) and COMPLETE/ERROR (tier 5) are\n * down-only.\n */\nexport function isUpAllowed(t: MessageType): boolean {\n\tconst tier = TIER[t];\n\treturn tier !== TIER_VALUE && tier !== TIER_TERMINAL;\n}\n"],"mappings":";AA2CO,IAAM,WAAW;AAGjB,SAAS,sBAAsB,GAAqB;AAC1D,SAAO,MAAM,YAAY,OAAO,MAAM;AACvC;AAGO,SAAS,aAAa,QAAiB,WAAW,iCAA0C;AAClG,SAAO,sBAAsB,MAAM,IAAI,IAAI,MAAM,QAAQ,IAAI;AAC9D;AAEO,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,oBAAoB;AAC1B,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AAM7B,IAAM,OAAoC;AAAA,EACzC,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AACX;AAEO,SAAS,YAAY,GAAwB;AACnD,SAAO,KAAK,CAAC;AACd;AAGO,SAAS,eAAe,GAAyB;AACvD,SAAO,KAAK,CAAC,KAAK;AACnB;AAGO,SAAS,YAAY,GAAyB;AACpD,SAAO,KAAK,CAAC,MAAM;AACpB;AAGO,SAAS,oBAAoB,GAAyB;AAC5D,QAAM,OAAO,KAAK,CAAC;AACnB,SAAO,SAAS,cAAc,SAAS;AACxC;AAQO,SAAS,WAAW,GAAyB;AACnD,SAAO,KAAK,CAAC,MAAM;AACpB;AAOO,SAAS,YAAY,GAAyB;AACpD,QAAM,OAAO,KAAK,CAAC;AACnB,SAAO,SAAS,cAAc,SAAS;AACxC;","names":[]}