@graphrefly/ts 0.0.1 → 0.0.3

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 (333) hide show
  1. package/README.md +197 -117
  2. package/dist/actions-types-CH-XCU9O.d.cts +657 -0
  3. package/dist/actions-types-w2iPQTkv.d.ts +657 -0
  4. package/dist/adapters/index.cjs +5157 -2951
  5. package/dist/adapters/index.cjs.map +1 -1
  6. package/dist/adapters/index.d.cts +207 -70
  7. package/dist/adapters/index.d.ts +207 -70
  8. package/dist/adapters/index.js +3738 -1688
  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 +3 -3
  35. package/dist/adapters/observe-storage.d.ts +3 -3
  36. package/dist/adapters/observe-storage.js +4 -4
  37. package/dist/adapters/react.cjs.map +1 -1
  38. package/dist/adapters/react.d.cts +2 -2
  39. package/dist/adapters/react.d.ts +2 -2
  40. package/dist/adapters/react.js +1 -1
  41. package/dist/adapters/solid.cjs.map +1 -1
  42. package/dist/adapters/solid.d.cts +2 -2
  43. package/dist/adapters/solid.d.ts +2 -2
  44. package/dist/adapters/solid.js +1 -1
  45. package/dist/adapters/svelte.cjs.map +1 -1
  46. package/dist/adapters/svelte.d.cts +2 -2
  47. package/dist/adapters/svelte.d.ts +2 -2
  48. package/dist/adapters/svelte.js +1 -1
  49. package/dist/adapters/vue.cjs.map +1 -1
  50. package/dist/adapters/vue.d.cts +2 -2
  51. package/dist/adapters/vue.d.ts +2 -2
  52. package/dist/adapters/vue.js +1 -1
  53. package/dist/{agent-runtime-BesGDZcB.d.ts → agent-runtime-types-core-CKwrBDyi.d.ts} +171 -320
  54. package/dist/{agent-runtime-DZTJ3C-p.d.cts → agent-runtime-types-core-bfl4m0vM.d.cts} +171 -320
  55. package/dist/agent-runtime-types-tool-BLPV3azj.d.cts +695 -0
  56. package/dist/agent-runtime-types-tool-hwqvVqNt.d.ts +695 -0
  57. package/dist/agentic-memory-retention-CLwI76JK.d.ts +14 -0
  58. package/dist/agentic-memory-retention-Cz8GR6ie.d.cts +14 -0
  59. package/dist/{agentic-memory-DfuVZ-lY.d.cts → agentic-memory-types-JDr7MPhh.d.cts} +13 -57
  60. package/dist/{agentic-memory-BmRCvh0d.d.ts → agentic-memory-types-khYJgzKL.d.ts} +13 -57
  61. package/dist/{capability-admission-B0BzqAm5.d.cts → capability-admission-B8RNFyaZ.d.cts} +3 -3
  62. package/dist/{capability-admission-g0mn9hpq.d.ts → capability-admission-Dkw1Xz3r.d.ts} +3 -3
  63. package/dist/chunk-2KUAG2GZ.js +9693 -0
  64. package/dist/chunk-2KUAG2GZ.js.map +1 -0
  65. package/dist/{chunk-CZNV3VXM.js → chunk-3J7UPZL5.js} +11 -11
  66. package/dist/{chunk-HKK2JD7Z.js → chunk-3LYI6ADX.js} +12 -125
  67. package/dist/chunk-3LYI6ADX.js.map +1 -0
  68. package/dist/{chunk-YXMZ2N6J.js → chunk-4M37FH2I.js} +1071 -1025
  69. package/dist/chunk-4M37FH2I.js.map +1 -0
  70. package/dist/{chunk-YDSIVHRR.js → chunk-4NWSNI4K.js} +1598 -1584
  71. package/dist/chunk-4NWSNI4K.js.map +1 -0
  72. package/dist/{chunk-Z2ANQ6JW.js → chunk-4Q77MMJY.js} +2 -2
  73. package/dist/{chunk-SS2A464I.js → chunk-54WPEODM.js} +3 -3
  74. package/dist/chunk-54WPEODM.js.map +1 -0
  75. package/dist/chunk-6E76H4OU.js +132 -0
  76. package/dist/chunk-6E76H4OU.js.map +1 -0
  77. package/dist/chunk-7GOTIIQ7.js +819 -0
  78. package/dist/chunk-7GOTIIQ7.js.map +1 -0
  79. package/dist/{chunk-V7CIJE4B.js → chunk-DKFWDTVY.js} +92 -9
  80. package/dist/chunk-DKFWDTVY.js.map +1 -0
  81. package/dist/{chunk-FBUU43PM.js → chunk-E4QCH32M.js} +448 -446
  82. package/dist/chunk-E4QCH32M.js.map +1 -0
  83. package/dist/{chunk-XKXWK2KP.js → chunk-GXU6WFEJ.js} +1157 -1021
  84. package/dist/chunk-GXU6WFEJ.js.map +1 -0
  85. package/dist/{chunk-K3FXTC3I.js → chunk-HJACH5PU.js} +3 -3
  86. package/dist/{chunk-GTPCOEOZ.js → chunk-IDMLXLLG.js} +3 -3
  87. package/dist/{chunk-DKP56CSW.js → chunk-JKAYLDQV.js} +2 -2
  88. package/dist/{chunk-4VLAQHZI.js → chunk-K7FB3JTD.js} +17 -1
  89. package/dist/chunk-K7FB3JTD.js.map +1 -0
  90. package/dist/{chunk-43BKLFZU.js → chunk-KFURM6FM.js} +10 -10
  91. package/dist/{chunk-H75VXTGT.js → chunk-L6LDXRWE.js} +3 -3
  92. package/dist/{chunk-H75VXTGT.js.map → chunk-L6LDXRWE.js.map} +1 -1
  93. package/dist/chunk-MCOFHMUU.js +4131 -0
  94. package/dist/chunk-MCOFHMUU.js.map +1 -0
  95. package/dist/chunk-MQEQMS7B.js +1009 -0
  96. package/dist/chunk-MQEQMS7B.js.map +1 -0
  97. package/dist/chunk-MTELVIYR.js +1421 -0
  98. package/dist/chunk-MTELVIYR.js.map +1 -0
  99. package/dist/{chunk-3JR3EDB2.js → chunk-NNDIFUKX.js} +121 -115
  100. package/dist/chunk-NNDIFUKX.js.map +1 -0
  101. package/dist/{chunk-2747WN4Y.js → chunk-PUSRRALM.js} +3 -3
  102. package/dist/{chunk-QFY4AFY4.js → chunk-PVC7WDKI.js} +58 -52
  103. package/dist/chunk-PVC7WDKI.js.map +1 -0
  104. package/dist/{chunk-VTHLCFN4.js → chunk-RAHNUYA5.js} +2 -2
  105. package/dist/chunk-TQPCAIQI.js +612 -0
  106. package/dist/chunk-TQPCAIQI.js.map +1 -0
  107. package/dist/{chunk-IXZBUWSP.js → chunk-UEMN5URK.js} +2 -2
  108. package/dist/chunk-WOS7RJYZ.js +1320 -0
  109. package/dist/chunk-WOS7RJYZ.js.map +1 -0
  110. package/dist/{chunk-6PHB5CJS.js → chunk-ZLFRB6FI.js} +2 -2
  111. package/dist/composition/index.cjs +1228 -1076
  112. package/dist/composition/index.cjs.map +1 -1
  113. package/dist/composition/index.d.cts +3 -3
  114. package/dist/composition/index.d.ts +3 -3
  115. package/dist/composition/index.js +4 -4
  116. package/dist/core/index.cjs +1198 -1046
  117. package/dist/core/index.cjs.map +1 -1
  118. package/dist/core/index.d.cts +23 -2
  119. package/dist/core/index.d.ts +23 -2
  120. package/dist/core/index.js +2 -2
  121. package/dist/cqrs/index.d.cts +3 -3
  122. package/dist/cqrs/index.d.ts +3 -3
  123. package/dist/cqrs/messaging.d.cts +4 -4
  124. package/dist/cqrs/messaging.d.ts +4 -4
  125. package/dist/cqrs/work-queue.d.cts +5 -5
  126. package/dist/cqrs/work-queue.d.ts +5 -5
  127. package/dist/data-structures/index.cjs +1226 -1074
  128. package/dist/data-structures/index.cjs.map +1 -1
  129. package/dist/data-structures/index.d.cts +8 -7
  130. package/dist/data-structures/index.d.ts +8 -7
  131. package/dist/data-structures/index.js +6 -5
  132. package/dist/{describe-DYMw_l1C.d.cts → describe-BumQ-3_0.d.cts} +1 -1
  133. package/dist/{describe-BpyJuWkw.d.ts → describe-cYr_Z5zm.d.ts} +1 -1
  134. package/dist/executors/tool-provider-adapters.cjs +3091 -0
  135. package/dist/executors/tool-provider-adapters.cjs.map +1 -0
  136. package/dist/executors/tool-provider-adapters.d.cts +174 -0
  137. package/dist/executors/tool-provider-adapters.d.ts +174 -0
  138. package/dist/executors/tool-provider-adapters.js +1336 -0
  139. package/dist/executors/tool-provider-adapters.js.map +1 -0
  140. package/dist/executors/tool-provider-runtime.cjs +5178 -0
  141. package/dist/executors/tool-provider-runtime.cjs.map +1 -0
  142. package/dist/executors/tool-provider-runtime.d.cts +17 -0
  143. package/dist/executors/tool-provider-runtime.d.ts +17 -0
  144. package/dist/executors/tool-provider-runtime.js +15 -0
  145. package/dist/executors/tool-provider-runtime.js.map +1 -0
  146. package/dist/executors/tool-provider.cjs +6392 -0
  147. package/dist/executors/tool-provider.cjs.map +1 -0
  148. package/dist/executors/tool-provider.d.cts +60 -0
  149. package/dist/executors/tool-provider.d.ts +60 -0
  150. package/dist/executors/tool-provider.js +89 -0
  151. package/dist/executors/tool-provider.js.map +1 -0
  152. package/dist/executors/work-queue.d.cts +6 -6
  153. package/dist/executors/work-queue.d.ts +6 -6
  154. package/dist/graph/index.cjs +1499 -1341
  155. package/dist/graph/index.cjs.map +1 -1
  156. package/dist/graph/index.d.cts +9 -8
  157. package/dist/graph/index.d.ts +9 -8
  158. package/dist/graph/index.js +23 -22
  159. package/dist/{graph-DCEWh4T2.d.cts → graph-C1C-wb0L.d.cts} +266 -137
  160. package/dist/{graph-D-1-SQeC.d.ts → graph-CS0b4V9B.d.ts} +266 -137
  161. package/dist/{index-72VZC0-E.d.cts → index-DLrNopda.d.cts} +151 -10
  162. package/dist/{index-Bmxeu0nK.d.ts → index-DzJni3_6.d.ts} +151 -10
  163. package/dist/index.cjs +3397 -3140
  164. package/dist/index.cjs.map +1 -1
  165. package/dist/index.d.cts +12 -9
  166. package/dist/index.d.ts +12 -9
  167. package/dist/index.js +110 -109
  168. package/dist/inspection/boundary.d.cts +4 -4
  169. package/dist/inspection/boundary.d.ts +4 -4
  170. package/dist/measurements-BWAnochv.d.ts +294 -0
  171. package/dist/measurements-B_gJfD8h.d.cts +294 -0
  172. package/dist/messaging/index.cjs +57 -51
  173. package/dist/messaging/index.cjs.map +1 -1
  174. package/dist/messaging/index.d.cts +11 -276
  175. package/dist/messaging/index.d.ts +11 -276
  176. package/dist/messaging/index.js +1 -1
  177. package/dist/operators/index.cjs +1228 -1076
  178. package/dist/operators/index.cjs.map +1 -1
  179. package/dist/operators/index.d.cts +5 -5
  180. package/dist/operators/index.d.ts +5 -5
  181. package/dist/operators/index.js +5 -5
  182. package/dist/orchestration/index.cjs +8844 -6071
  183. package/dist/orchestration/index.cjs.map +1 -1
  184. package/dist/orchestration/index.d.cts +171 -224
  185. package/dist/orchestration/index.d.ts +171 -224
  186. package/dist/orchestration/index.js +42 -991
  187. package/dist/orchestration/index.js.map +1 -1
  188. package/dist/orchestration/messaging.d.cts +5 -8
  189. package/dist/orchestration/messaging.d.ts +5 -8
  190. package/dist/orchestration/work-queue.cjs +1243 -5
  191. package/dist/orchestration/work-queue.cjs.map +1 -1
  192. package/dist/orchestration/work-queue.d.cts +121 -10
  193. package/dist/orchestration/work-queue.d.ts +121 -10
  194. package/dist/orchestration/work-queue.js +1067 -4
  195. package/dist/orchestration/work-queue.js.map +1 -1
  196. package/dist/patterns/event-flow.cjs +6 -20
  197. package/dist/patterns/event-flow.cjs.map +1 -1
  198. package/dist/patterns/event-flow.d.cts +4 -4
  199. package/dist/patterns/event-flow.d.ts +4 -4
  200. package/dist/patterns/event-flow.js +2 -2
  201. package/dist/patterns/index.cjs +453 -465
  202. package/dist/patterns/index.cjs.map +1 -1
  203. package/dist/patterns/index.d.cts +6 -5
  204. package/dist/patterns/index.d.ts +6 -5
  205. package/dist/patterns/index.js +3 -3
  206. package/dist/process-types-BB7oRhX3.d.cts +200 -0
  207. package/dist/process-types-QNhyoYJ8.d.ts +200 -0
  208. package/dist/{reactive-collection-DNV0-gFi.d.cts → reactive-collection-BYlWvtnp.d.cts} +4 -34
  209. package/dist/{reactive-collection-BAmfrGjd.d.ts → reactive-collection-efOEdGFN.d.ts} +4 -34
  210. package/dist/{reactive-collection-storage-BNEldDyi.d.cts → reactive-collection-storage-BjoLsoiC.d.cts} +5 -5
  211. package/dist/{reactive-collection-storage-YZsAQsWK.d.ts → reactive-collection-storage-DwW6UuK_.d.ts} +5 -5
  212. package/dist/{reactive-map-DRD1LJ2H.d.cts → reactive-map-BHacbIqz.d.cts} +7 -2
  213. package/dist/{reactive-map-EsDiCmJk.d.ts → reactive-map-DN4Jyqnf.d.ts} +7 -2
  214. package/dist/render/index.d.cts +2 -2
  215. package/dist/render/index.d.ts +2 -2
  216. package/dist/scheduled-readiness-BmqXxnzX.d.ts +91 -0
  217. package/dist/scheduled-readiness-CYSw7KDE.d.cts +91 -0
  218. package/dist/semantic-memory-graph-B_LwbM-E.d.cts +30 -0
  219. package/dist/semantic-memory-graph-rsFNNhwn.d.ts +30 -0
  220. package/dist/{semantic-memory-graph-DKuNzuWw.d.cts → semantic-memory-graph-types-Y73bbwVI.d.cts} +2 -28
  221. package/dist/{semantic-memory-graph-uwbwJdhe.d.ts → semantic-memory-graph-types-safmPkuX.d.ts} +2 -28
  222. package/dist/solutions/index.cjs +6353 -6169
  223. package/dist/solutions/index.cjs.map +1 -1
  224. package/dist/solutions/index.d.cts +12 -10
  225. package/dist/solutions/index.d.ts +12 -10
  226. package/dist/solutions/index.js +5 -5
  227. package/dist/solutions/reactive-layout/browser/index.cjs +116 -108
  228. package/dist/solutions/reactive-layout/browser/index.cjs.map +1 -1
  229. package/dist/solutions/reactive-layout/browser/index.d.cts +4 -4
  230. package/dist/solutions/reactive-layout/browser/index.d.ts +4 -4
  231. package/dist/solutions/reactive-layout/browser/index.js +3 -3
  232. package/dist/solutions/reactive-layout/index.cjs +3578 -3350
  233. package/dist/solutions/reactive-layout/index.cjs.map +1 -1
  234. package/dist/solutions/reactive-layout/index.d.cts +32 -576
  235. package/dist/solutions/reactive-layout/index.d.ts +32 -576
  236. package/dist/solutions/reactive-layout/index.js +65 -5
  237. package/dist/solutions/reactive-layout/node-canvas/index.cjs +127 -117
  238. package/dist/solutions/reactive-layout/node-canvas/index.cjs.map +1 -1
  239. package/dist/solutions/reactive-layout/node-canvas/index.d.cts +4 -4
  240. package/dist/solutions/reactive-layout/node-canvas/index.d.ts +4 -4
  241. package/dist/solutions/reactive-layout/node-canvas/index.js +3 -3
  242. package/dist/solutions/reactive-layout/react-native/index.cjs +127 -117
  243. package/dist/solutions/reactive-layout/react-native/index.cjs.map +1 -1
  244. package/dist/solutions/reactive-layout/react-native/index.d.cts +4 -4
  245. package/dist/solutions/reactive-layout/react-native/index.d.ts +4 -4
  246. package/dist/solutions/reactive-layout/react-native/index.js +3 -3
  247. package/dist/solutions/reactive-layout/skia/index.cjs +127 -117
  248. package/dist/solutions/reactive-layout/skia/index.cjs.map +1 -1
  249. package/dist/solutions/reactive-layout/skia/index.d.cts +4 -4
  250. package/dist/solutions/reactive-layout/skia/index.d.ts +4 -4
  251. package/dist/solutions/reactive-layout/skia/index.js +3 -3
  252. package/dist/solutions/work-item/actions.cjs +1609 -1428
  253. package/dist/solutions/work-item/actions.cjs.map +1 -1
  254. package/dist/solutions/work-item/actions.d.cts +23 -184
  255. package/dist/solutions/work-item/actions.d.ts +23 -184
  256. package/dist/solutions/work-item/actions.js +1558 -934
  257. package/dist/solutions/work-item/actions.js.map +1 -1
  258. package/dist/solutions/work-item/scheduling.cjs +9181 -1838
  259. package/dist/solutions/work-item/scheduling.cjs.map +1 -1
  260. package/dist/solutions/work-item/scheduling.d.cts +1763 -328
  261. package/dist/solutions/work-item/scheduling.d.ts +1763 -328
  262. package/dist/solutions/work-item/scheduling.js +117 -3
  263. package/dist/solutions/work-item/work-queue.d.cts +7 -7
  264. package/dist/solutions/work-item/work-queue.d.ts +7 -7
  265. package/dist/sources/browser.cjs +1318 -1083
  266. package/dist/sources/browser.cjs.map +1 -1
  267. package/dist/sources/browser.d.cts +22 -6
  268. package/dist/sources/browser.d.ts +22 -6
  269. package/dist/sources/browser.js +4 -4
  270. package/dist/sources/browser.js.map +1 -1
  271. package/dist/sources/index.cjs +1318 -1083
  272. package/dist/sources/index.cjs.map +1 -1
  273. package/dist/sources/index.d.cts +4 -4
  274. package/dist/sources/index.d.ts +4 -4
  275. package/dist/sources/index.js +4 -4
  276. package/dist/sources/node.d.cts +3 -3
  277. package/dist/sources/node.d.ts +3 -3
  278. package/dist/storage/browser.cjs +16 -0
  279. package/dist/storage/browser.cjs.map +1 -1
  280. package/dist/storage/browser.js +3 -3
  281. package/dist/storage/index.cjs +16 -0
  282. package/dist/storage/index.cjs.map +1 -1
  283. package/dist/storage/index.d.cts +5 -4
  284. package/dist/storage/index.d.ts +5 -4
  285. package/dist/storage/index.js +6 -6
  286. package/dist/storage/node.cjs +16 -0
  287. package/dist/storage/node.cjs.map +1 -1
  288. package/dist/storage/node.js +3 -3
  289. package/dist/{store-C-joM4gh.d.ts → store-6_CHF6Ge.d.ts} +1 -1
  290. package/dist/{store-CNJwmT-h.d.cts → store-BljX8RkQ.d.cts} +1 -1
  291. package/dist/types-BAw2QVVE.d.cts +274 -0
  292. package/dist/types-BUbbbh4f.d.cts +34 -0
  293. package/dist/types-CMnzoL54.d.cts +457 -0
  294. package/dist/{types-CcPIn7sy.d.cts → types-CTN3XoMl.d.cts} +57 -108
  295. package/dist/types-CV_ohy5T.d.cts +357 -0
  296. package/dist/{types-BsJvElYZ.d.ts → types-DChxk1vK.d.ts} +57 -108
  297. package/dist/types-DRu7SnLV.d.ts +274 -0
  298. package/dist/types-DeID_FRl.d.ts +34 -0
  299. package/dist/types-IhKH0hGW.d.ts +357 -0
  300. package/dist/types-ePlD2uyT.d.ts +457 -0
  301. package/dist/{work-item-runtime-qaVgsL0T.d.cts → work-item-runtime-types-BTxLskN5.d.cts} +3 -93
  302. package/dist/{work-item-runtime-C3M79vE9.d.ts → work-item-runtime-types-DAsZbb2y.d.ts} +3 -93
  303. package/dist/work-queue/index.cjs +957 -953
  304. package/dist/work-queue/index.cjs.map +1 -1
  305. package/dist/work-queue/index.d.cts +9 -357
  306. package/dist/work-queue/index.d.ts +9 -357
  307. package/dist/work-queue/index.js +957 -953
  308. package/dist/work-queue/index.js.map +1 -1
  309. package/package.json +611 -513
  310. package/dist/chunk-3JR3EDB2.js.map +0 -1
  311. package/dist/chunk-4VLAQHZI.js.map +0 -1
  312. package/dist/chunk-6XAIOL3X.js +0 -2407
  313. package/dist/chunk-6XAIOL3X.js.map +0 -1
  314. package/dist/chunk-FBUU43PM.js.map +0 -1
  315. package/dist/chunk-HKK2JD7Z.js.map +0 -1
  316. package/dist/chunk-PC3BTTBE.js +0 -3217
  317. package/dist/chunk-PC3BTTBE.js.map +0 -1
  318. package/dist/chunk-QFY4AFY4.js.map +0 -1
  319. package/dist/chunk-SS2A464I.js.map +0 -1
  320. package/dist/chunk-V7CIJE4B.js.map +0 -1
  321. package/dist/chunk-XKXWK2KP.js.map +0 -1
  322. package/dist/chunk-YDSIVHRR.js.map +0 -1
  323. package/dist/chunk-YXMZ2N6J.js.map +0 -1
  324. /package/dist/{chunk-CZNV3VXM.js.map → chunk-3J7UPZL5.js.map} +0 -0
  325. /package/dist/{chunk-Z2ANQ6JW.js.map → chunk-4Q77MMJY.js.map} +0 -0
  326. /package/dist/{chunk-K3FXTC3I.js.map → chunk-HJACH5PU.js.map} +0 -0
  327. /package/dist/{chunk-GTPCOEOZ.js.map → chunk-IDMLXLLG.js.map} +0 -0
  328. /package/dist/{chunk-DKP56CSW.js.map → chunk-JKAYLDQV.js.map} +0 -0
  329. /package/dist/{chunk-43BKLFZU.js.map → chunk-KFURM6FM.js.map} +0 -0
  330. /package/dist/{chunk-2747WN4Y.js.map → chunk-PUSRRALM.js.map} +0 -0
  331. /package/dist/{chunk-VTHLCFN4.js.map → chunk-RAHNUYA5.js.map} +0 -0
  332. /package/dist/{chunk-IXZBUWSP.js.map → chunk-UEMN5URK.js.map} +0 -0
  333. /package/dist/{chunk-6PHB5CJS.js.map → chunk-ZLFRB6FI.js.map} +0 -0
@@ -77,7 +77,59 @@ function attachMessageBusCommandSource(graph, bus, commands) {
77
77
  };
78
78
  }
79
79
 
80
- // src/messaging/index.ts
80
+ // src/messaging/utils.ts
81
+ function pullParams(pull) {
82
+ return isObjectRecord(pull?.params) ? pull.params : {};
83
+ }
84
+ function publishCommand(commandNode, command) {
85
+ commandNode.down([["DATA", command]]);
86
+ return command;
87
+ }
88
+ function makeTopicState() {
89
+ return { closed: false, headSeq: 1, nextSeq: 1, messages: [] };
90
+ }
91
+ function uniqueTopics(topics) {
92
+ const unique = [...new Set(topics)];
93
+ if (unique.length !== topics.length) throw new Error("messageBus: duplicate topic");
94
+ for (const topic of unique) assertTopicKey(topic, "messageBus");
95
+ return Object.freeze(unique.sort());
96
+ }
97
+ function assertTopicKey(topic, owner) {
98
+ const error = validateTopicKey(topic, owner);
99
+ if (error !== void 0) throw new Error(error);
100
+ }
101
+ function validateTopicKey(topic, owner) {
102
+ if (typeof topic !== "string" || topic.length === 0)
103
+ return `${owner}: topic must be a non-empty string`;
104
+ return void 0;
105
+ }
106
+ function assertNonEmpty(value, owner) {
107
+ if (typeof value !== "string" || value.length === 0)
108
+ throw new Error(`${owner}: must be a non-empty string`);
109
+ }
110
+ function positiveLimit(limit) {
111
+ if (limit === void 0) return 100;
112
+ if (!Number.isInteger(limit) || limit < 1)
113
+ throw new Error("messageBus: limit must be a positive integer");
114
+ return limit;
115
+ }
116
+ function isPositiveSeq(value) {
117
+ return Number.isInteger(value) && value >= 1;
118
+ }
119
+ function isObjectRecord(value) {
120
+ return typeof value === "object" && value !== null && !Array.isArray(value);
121
+ }
122
+ function commandTopic(command) {
123
+ return isObjectRecord(command) && typeof command.topic === "string" ? command.topic : void 0;
124
+ }
125
+ function commandIdOf(command) {
126
+ return isObjectRecord(command) && typeof command.commandId === "string" ? command.commandId : void 0;
127
+ }
128
+ function idempotencyKey(topic, key) {
129
+ return `${topic}\0${key}`;
130
+ }
131
+
132
+ // src/messaging/event-message.ts
81
133
  function eventMessage(type, payload, opts) {
82
134
  assertNonEmpty(type, "eventMessage.type");
83
135
  assertNonEmpty(opts.id, "eventMessage.id");
@@ -123,6 +175,8 @@ function eventIssue(message) {
123
175
  source: "messageBus.eventMessage"
124
176
  };
125
177
  }
178
+
179
+ // src/messaging/types.ts
126
180
  var PROMPTS_TOPIC = "prompts";
127
181
  var RESPONSES_TOPIC = "responses";
128
182
  var INJECTIONS_TOPIC = "injections";
@@ -139,6 +193,8 @@ var STANDARD_TOPICS = Object.freeze([
139
193
  CONTEXT_TOPIC,
140
194
  TODOS_TOPIC
141
195
  ]);
196
+
197
+ // src/messaging/index.ts
142
198
  function messageBus(graph, opts = {}) {
143
199
  const name = opts.name ?? "messageBus";
144
200
  const initialTopics = uniqueTopics(opts.topics ?? []);
@@ -879,56 +935,6 @@ function ensureSubscription(state, opts) {
879
935
  function getSubscription(state, topic, subscriptionId) {
880
936
  return state.subscriptions.get(`${topic}\0${subscriptionId}`);
881
937
  }
882
- function pullParams(pull) {
883
- return isObjectRecord(pull?.params) ? pull.params : {};
884
- }
885
- function publishCommand(commandNode, command) {
886
- commandNode.down([["DATA", command]]);
887
- return command;
888
- }
889
- function makeTopicState() {
890
- return { closed: false, headSeq: 1, nextSeq: 1, messages: [] };
891
- }
892
- function uniqueTopics(topics) {
893
- const unique = [...new Set(topics)];
894
- if (unique.length !== topics.length) throw new Error("messageBus: duplicate topic");
895
- for (const topic of unique) assertTopicKey(topic, "messageBus");
896
- return Object.freeze(unique.sort());
897
- }
898
- function assertTopicKey(topic, owner) {
899
- const error = validateTopicKey(topic, owner);
900
- if (error !== void 0) throw new Error(error);
901
- }
902
- function validateTopicKey(topic, owner) {
903
- if (typeof topic !== "string" || topic.length === 0)
904
- return `${owner}: topic must be a non-empty string`;
905
- return void 0;
906
- }
907
- function assertNonEmpty(value, owner) {
908
- if (typeof value !== "string" || value.length === 0)
909
- throw new Error(`${owner}: must be a non-empty string`);
910
- }
911
- function positiveLimit(limit) {
912
- if (limit === void 0) return 100;
913
- if (!Number.isInteger(limit) || limit < 1)
914
- throw new Error("messageBus: limit must be a positive integer");
915
- return limit;
916
- }
917
- function isPositiveSeq(value) {
918
- return Number.isInteger(value) && value >= 1;
919
- }
920
- function isObjectRecord(value) {
921
- return typeof value === "object" && value !== null && !Array.isArray(value);
922
- }
923
- function commandTopic(command) {
924
- return isObjectRecord(command) && typeof command.topic === "string" ? command.topic : void 0;
925
- }
926
- function commandIdOf(command) {
927
- return isObjectRecord(command) && typeof command.commandId === "string" ? command.commandId : void 0;
928
- }
929
- function idempotencyKey(topic, key) {
930
- return `${topic}\0${key}`;
931
- }
932
938
  // Annotate the CommonJS export names for ESM import in node:
933
939
  0 && (module.exports = {
934
940
  CONTEXT_TOPIC,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/messaging/index.ts","../../src/protocol/messages.ts","../../src/ctx/types.ts","../../src/messaging/internal.ts"],"sourcesContent":["/**\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 type { LockId, PullDemand } from \"../protocol/messages.js\";\nimport {\n\tattachMessageBusCommandSource,\n\tgetMessageBusState,\n\tregisterMessageBusState,\n} from \"./internal.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 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\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\ninterface TopicState {\n\tclosed: boolean;\n\theadSeq: number;\n\tnextSeq: number;\n\tmessages: MessageBusMessage[];\n}\n\ninterface SubscriptionState {\n\ttopic: string;\n\tsubscriptionId: string;\n\tnextSeq: number;\n\tclosed: boolean;\n\tretentionGap: boolean;\n}\n\ntype RuntimeEvent<T = unknown> =\n\t| { readonly kind: \"message\"; readonly message: MessageBusMessage<T> }\n\t| { readonly kind: \"status\"; readonly status: MessageBusStatus }\n\t| { readonly kind: \"issue\"; readonly issue: DataIssue }\n\t| { readonly kind: \"dead-letter\"; readonly entry: MessageBusDeadLetterEntry<T> };\n\ninterface MessageBusState {\n\treadonly graph: Graph;\n\treadonly name: string;\n\treadonly now: () => number;\n\ttopicPolicy: MessageBusTopicPolicy;\n\treadonly retention: MessageBusRetentionPolicy;\n\treadonly dedupe: MessageBusDedupePolicy;\n\treadonly topics: Map<string, TopicState>;\n\treadonly subscriptions: Map<string, SubscriptionState>;\n\treadonly seenCommandIds: Set<string>;\n\treadonly seenIdempotencyKeys: Set<string>;\n\treadonly deadLetters: MessageBusDeadLetterEntry[];\n\tdeadLetterSeq: number;\n\treadonly commandSources: Node<MessageBusCommand>[];\n\treadonly commandBody: NodeFn;\n}\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\nfunction pullParams<T>(pull: PullDemand | undefined): T {\n\treturn (isObjectRecord(pull?.params) ? pull.params : {}) as T;\n}\n\nfunction publishCommand<T extends MessageBusCommand>(\n\tcommandNode: Node<MessageBusCommand>,\n\tcommand: T,\n): T {\n\tcommandNode.down([[\"DATA\", command]]);\n\treturn command;\n}\n\nfunction makeTopicState(): TopicState {\n\treturn { closed: false, headSeq: 1, nextSeq: 1, messages: [] };\n}\n\nfunction 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\nfunction assertTopicKey(topic: string, owner: string): void {\n\tconst error = validateTopicKey(topic, owner);\n\tif (error !== undefined) throw new Error(error);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction isPositiveSeq(value: unknown): value is number {\n\treturn Number.isInteger(value) && (value as number) >= 1;\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction commandTopic(command: unknown): string | undefined {\n\treturn isObjectRecord(command) && typeof command.topic === \"string\" ? command.topic : undefined;\n}\n\nfunction commandIdOf(command: unknown): string | undefined {\n\treturn isObjectRecord(command) && typeof command.commandId === \"string\"\n\t\t? command.commandId\n\t\t: undefined;\n}\n\nfunction idempotencyKey(topic: string, key: string): string {\n\treturn `${topic}\\u0000${key}`;\n}\n","/**\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","/**\n * The fn-invocation context and per-dep input shapes.\n *\n * Canonical authority: ~/src/graphrefly/spec/rules.jsonl\n * R-fn-contract (D8/D27), R-ctx-state (D23/D29), R-cleanup-hooks (D28), R-ctx-up.\n */\n\nimport type { Dispatcher } from \"../dispatcher/index.js\";\nimport type { EnvironmentDrivers } from \"../graph/environment.js\";\nimport type { Node } from \"../node/node.js\";\nimport { type Message, type PullDemand, SENTINEL, type Wave } from \"../protocol/messages.js\";\n\n/** A downstream sink callback (the only way to connect to a node's output). */\nexport type Sink = (msg: Message, delivery?: DeliveryMeta) => void;\n\n/** Internal delivery metadata used to preserve the upstream `ctx.down(msgs)` wave boundary. */\nexport interface DeliveryMeta {\n\treadonly wave: object;\n\treadonly last: boolean;\n}\n\n/**\n * Internal current-value reader. It is deliberately a symbol-backed implementation detail:\n * raw ctx exposes `waveData` + `terminal`; helpers below derive from that plus this dep cache.\n */\nexport const CTX_DEP_CACHE: unique symbol = Symbol(\"graphrefly.ctx.depCache\");\n\nexport interface CtxDepCache {\n\treadonly latest: readonly unknown[];\n}\n\n/** Internal node-construction binding for graph-local helper-created deps. */\nexport const CTX_NODE_BINDING: unique symbol = Symbol(\"graphrefly.ctx.nodeBinding\");\n\nexport interface CtxNodeBinding {\n\treadonly dispatcher: Dispatcher;\n\tcreate<T>(factory: () => Node<T>): Node<T>;\n}\n\n/** Per-dep wave projections: dep -> waves -> values/SENTINEL markers. */\nexport type WaveData = readonly (readonly (readonly unknown[])[])[];\n\n/** Terminal metadata parallel to `waveData`: false = none, true = COMPLETE, otherwise ERROR payload. */\nexport type TerminalData = readonly unknown[];\n\nexport function isTerminalNone(t: unknown): boolean {\n\treturn t === false || t === undefined;\n}\n\nexport function isTerminalComplete(t: unknown): t is true {\n\treturn t === true;\n}\n\nexport function isTerminalError(t: unknown): boolean {\n\treturn !isTerminalNone(t) && !isTerminalComplete(t);\n}\n\nexport function terminalErrorValue(t: unknown): unknown {\n\treturn isTerminalError(t) ? t : undefined;\n}\n\n/**\n * Per-node private cross-wave state (R-ctx-state / D23,D29). Default fresh-lifecycle\n * wipe; `persist(true)` keeps it across lifecycle transitions.\n */\nexport interface CtxState {\n\tget<S = unknown>(): S | undefined;\n\tset<S = unknown>(v: S): void;\n\tpersist(on?: boolean): void;\n}\n\n/**\n * Deferred SELF-rewire (R-rewire-deferred / D47). A node fn may, DURING its run, request a\n * mutation of its OWN dep set; the request is QUEUED and applied at the committed wave boundary\n * (after the current wave settles / batch commit / final-lock RESUME) as a fresh wave, reusing\n * R-rewire surgical/Option-C semantics (D42). This is the ONLY legal self-triggered rewire — an\n * IMMEDIATE in-fn `node.subscribeDep/unsubscribeDep/replaceDeps` is the D37 mid-fn feedback-cycle ERROR. An\n * added cached dep pushes `[DIRTY,DATA]` on the boundary wave (R-push-subscribe); a removed dep\n * is drained and, if it loses its last subscriber, `_deactivate`s + fires `onDeactivation`\n * (input-side teardown — the basis for higher-order operator cancellation / abortInFlight).\n */\nexport interface RewireNext {\n\t/** Defer subscribing to a dep (paired with the re-supplied fn — positional fn-deps lock, SD-1). */\n\tsubscribeDep(dep: Node<unknown>, fn: NodeFn): void;\n\t/** Defer unsubscribing from a dep (its source is torn down if it loses its last subscriber). */\n\tunsubscribeDep(dep: Node<unknown>, fn: NodeFn): void;\n\t/** Defer replacing the whole dep set (surgical: kept deps untouched, removed drained, added fresh-subscribe). */\n\treplaceDeps(deps: Node<unknown>[], fn: NodeFn): void;\n}\n\n/**\n * The single argument to a node fn: `(ctx) => void` (R-fn-contract / D8). All emission\n * is explicit via `ctx.down`; there is no return-value framing.\n */\nexport interface Ctx {\n\t/**\n\t * Emit upstream toward deps — control tiers only (R-ctx-up). IMMEDIATE. `towardDep` (a dep index)\n\t * routes the wave up ONE declared edge (R-up-routing directed-up); omitted = broadcast up all deps.\n\t * A pull DEMAND is `up([[PULL, { pullId, params }]])` — but for a SELF-demand (demanding a dep\n\t * this fn also reads) use {@link Ctx.upNext} instead, since an immediate demand whose delivery loops back\n\t * re-enters this fn mid-wave (D37 / R-reentrancy).\n\t */\n\tup(msgs: Wave, towardDep?: number): void;\n\t/** Emit downstream toward sinks. */\n\tdown(msgs: Wave): void;\n\t/**\n\t * The single raw dep-value input surface (R-ctx-wave-data / D77): dep -> upstream waves ->\n\t * per-wave DATA payloads and INVALIDATE/SENTINEL markers. `waveData[i] = []` means dep i\n\t * delivered no wave to this invocation; `waveData[i] = [[]]` means RESOLVED-only.\n\t */\n\twaveData: WaveData;\n\t/** Terminal metadata for the same invocation; terminal values never enter `waveData`. */\n\tterminal: TerminalData;\n\tstate: CtxState;\n\t/** Release external resources on deactivation (R-cleanup-hooks). */\n\tonDeactivation(fn: () => void): void;\n\t/** Flush on INVALIDATE (R-cleanup-hooks). */\n\tonInvalidate(fn: () => void): void;\n\t/** Graph-owned environment drivers for source/adapter boundaries (D130/D131). */\n\tenvironment(): EnvironmentDrivers;\n\t/** Holder-visible context for a PULL-caused invocation (D272); absent for ordinary waves. */\n\treadonly pull?: PullDemand;\n\t/**\n\t * Deferred SELF-rewire (R-rewire-deferred / D47) — the substrate affordance higher-order\n\t * operators (switchMap/mergeMap/concatMap/exhaustMap/flatMap) use to grow/shrink their own\n\t * inner-source dep set in response to their own data. Always present; see {@link RewireNext}.\n\t */\n\trewireNext: RewireNext;\n\t/**\n\t * Deferred up — the boundary-deferred form of {@link Ctx.up} (R-up-routing / R-pull / D59). Routes\n\t * `msgs` up from this node at the COMMITTED wave boundary (broadcast, or up the single `towardDep`\n\t * edge), riding the same R-rewire-deferred (D47) drain as {@link RewireNext}. This is the\n\t * SELF-DEMAND path: a consumer issues `ctx.upNext([[PULL, { pullId, params }]])` to demand a pull\n\t * dep it ALSO reads — the cone-routed PULL reaches the pullId-holder, whose delivery loops back as a\n\t * FRESH wave (not a mid-fn re-entry → no D37). The consumer accepts one-wave latency (the\n\t * HTTP-request model). No node reference needed: the author writes the pullId verbatim.\n\t */\n\tupNext(msgs: Wave, towardDep?: number): void;\n\t/**\n\t * Read a dep's latest value by index (dynamicNode only, R-dynamic-node / D35).\n\t * Present only on dynamicNode fns; all declared deps still participate in wave\n\t * tracking. Under D49/R-resolved-undirty an unread dep's change still fires the fn,\n\t * which re-emits its (unchanged) output as a DATA occurrence — there is NO equals-\n\t * absorption; pair with distinctUntilChanged to suppress unchanged re-emits (opt-in).\n\t */\n\ttrack?(depIndex: number): unknown;\n\t[CTX_DEP_CACHE]?: CtxDepCache;\n\t[CTX_NODE_BINDING]?: CtxNodeBinding;\n}\n\n/** A node fn (R-fn-contract). Registered in a dispatcher pool, indexed by Handle. */\nexport type NodeFn = (ctx: Ctx) => void;\n\n/** Number of declared dep slots visible in this invocation. */\nexport function depCount(ctx: Ctx): number {\n\treturn ctx.waveData.length;\n}\n\n/** DATA/SENTINEL projection batches delivered by one dep in this invocation. */\nexport function depWaves(ctx: Ctx, depIndex: number): readonly (readonly unknown[])[] {\n\treturn ctx.waveData[depIndex] ?? [];\n}\n\n/** Flattened DATA projection for old event-counting operator bodies; null = no wave. */\nexport function depBatch(ctx: Ctx, depIndex: number): readonly unknown[] | null {\n\tconst waves = depWaves(ctx, depIndex);\n\tif (waves.length === 0) return null;\n\tconst flattened = waves.flat().filter((v) => v !== SENTINEL);\n\treturn flattened.length === 0 ? [] : flattened;\n}\n\n/** Latest cached DATA for a dep, derived from implementation-owned dep cache. */\nexport function depLatest(ctx: Ctx, depIndex: number): unknown {\n\treturn ctx[CTX_DEP_CACHE]?.latest[depIndex];\n}\n\n/** Terminal metadata for one dep: false = none, true = COMPLETE, otherwise ERROR payload. */\nexport function depTerminal(ctx: Ctx, depIndex: number): unknown {\n\tconst t = ctx.terminal[depIndex];\n\treturn t === undefined ? false : t;\n}\n","import type { NodeFn } from \"../ctx/types.js\";\nimport type { Graph } from \"../graph/graph.js\";\nimport type { Node } from \"../node/node.js\";\nimport type { MessageBusCommand } from \"./index.js\";\n\nexport interface MessageBusInternalState {\n\treadonly graph: Graph;\n\treadonly name: string;\n\treadonly commandSources: Node<MessageBusCommand>[];\n\treadonly commandBody: NodeFn;\n}\n\nconst busStates = new WeakMap<object, MessageBusInternalState>();\n\nexport function registerMessageBusState(bus: object, state: MessageBusInternalState): void {\n\tbusStates.set(bus, state);\n}\n\nexport function getMessageBusState(bus: object): MessageBusInternalState | undefined {\n\treturn busStates.get(bus);\n}\n\nexport function attachMessageBusCommandSource(\n\tgraph: Graph,\n\tbus: object,\n\tcommands: Node<MessageBusCommand>,\n): () => void {\n\tconst state = getMessageBusState(bus);\n\tif (state === undefined) throw new Error(\"messageBus: unknown implementation\");\n\tif (state.graph !== graph) throw new Error(\"messageBus: command source graph must match\");\n\tstate.commandSources.push(commands);\n\tconst busCommands = (bus as { readonly commands?: Node<MessageBusCommand> }).commands;\n\tif (busCommands === undefined) throw new Error(\"messageBus: missing commands node\");\n\tbusCommands.replaceDeps([...state.commandSources], state.commandBody);\n\tlet released = false;\n\treturn () => {\n\t\tif (released) return;\n\t\treleased = true;\n\t\tconst index = state.commandSources.indexOf(commands);\n\t\tif (index >= 0) state.commandSources.splice(index, 1);\n\t\tbusCommands.replaceDeps([...state.commandSources], state.commandBody);\n\t};\n}\n\nexport function attachMessageBusDeferredCommandSink(\n\tgraph: Graph,\n\tbus: object,\n\tcommands: Node<MessageBusCommand>,\n): () => void {\n\tconst state = getMessageBusState(bus);\n\tif (state === undefined) throw new Error(\"messageBus: unknown implementation\");\n\tif (state.graph !== graph) throw new Error(\"messageBus: command sink graph must match\");\n\tconst busCommands = (bus as { readonly commands?: Node<MessageBusCommand> }).commands;\n\tif (busCommands === undefined) throw new Error(\"messageBus: missing commands node\");\n\tconst boundary = commands as Node<MessageBusCommand> & {\n\t\t__deferBoundary?: (fn: () => void) => void;\n\t};\n\tconst unsubscribe = commands.subscribe((msg) => {\n\t\tif (msg[0] !== \"DATA\") return;\n\t\tconst command = msg[1] as MessageBusCommand;\n\t\tconst send = () => busCommands.down([[\"DATA\", command]]);\n\t\tif (boundary.__deferBoundary === undefined) send();\n\t\telse boundary.__deferBoundary(send);\n\t});\n\treturn unsubscribe;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC2CO,IAAM,WAAW;;;ACoHjB,SAAS,SAAS,KAAU,UAAmD;AACrF,SAAO,IAAI,SAAS,QAAQ,KAAK,CAAC;AACnC;AAGO,SAAS,SAAS,KAAU,UAA6C;AAC/E,QAAM,QAAQ,SAAS,KAAK,QAAQ;AACpC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,YAAY,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,MAAM,QAAQ;AAC3D,SAAO,UAAU,WAAW,IAAI,CAAC,IAAI;AACtC;;;AC7JA,IAAM,YAAY,oBAAI,QAAyC;AAExD,SAAS,wBAAwB,KAAa,OAAsC;AAC1F,YAAU,IAAI,KAAK,KAAK;AACzB;AAEO,SAAS,mBAAmB,KAAkD;AACpF,SAAO,UAAU,IAAI,GAAG;AACzB;AAEO,SAAS,8BACf,OACA,KACA,UACa;AACb,QAAM,QAAQ,mBAAmB,GAAG;AACpC,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,oCAAoC;AAC7E,MAAI,MAAM,UAAU,MAAO,OAAM,IAAI,MAAM,6CAA6C;AACxF,QAAM,eAAe,KAAK,QAAQ;AAClC,QAAM,cAAe,IAAwD;AAC7E,MAAI,gBAAgB,OAAW,OAAM,IAAI,MAAM,mCAAmC;AAClF,cAAY,YAAY,CAAC,GAAG,MAAM,cAAc,GAAG,MAAM,WAAW;AACpE,MAAI,WAAW;AACf,SAAO,MAAM;AACZ,QAAI,SAAU;AACd,eAAW;AACX,UAAM,QAAQ,MAAM,eAAe,QAAQ,QAAQ;AACnD,QAAI,SAAS,EAAG,OAAM,eAAe,OAAO,OAAO,CAAC;AACpD,gBAAY,YAAY,CAAC,GAAG,MAAM,cAAc,GAAG,MAAM,WAAW;AAAA,EACrE;AACD;;;AH+CO,SAAS,aACf,MACA,SACA,MACkB;AAClB,iBAAe,MAAM,mBAAmB;AACxC,iBAAe,KAAK,IAAI,iBAAiB;AACzC,SAAO;AAAA,IACN,IAAI,KAAK;AAAA,IACT;AAAA,IACA;AAAA,IACA,GAAI,KAAK,QAAQ,SAAY,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI;AAAA,IAClD,GAAI,KAAK,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,KAAK,UAAU;AAAA,IACpE,GAAI,KAAK,kBAAkB,SAAY,CAAC,IAAI,EAAE,eAAe,KAAK,cAAc;AAAA,IAChF,GAAI,KAAK,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,KAAK,YAAY;AAAA,IAC1E,GAAI,KAAK,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,KAAK,aAAa;AAAA,IAC7E,GAAI,KAAK,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM;AAAA,IACxD,GAAI,KAAK,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,KAAK,aAAa;AAAA,IAC7E,GAAI,KAAK,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO;AAAA,IAC3D,GAAI,KAAK,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS;AAAA,EAClE;AACD;AAEO,SAAS,eAAe,OAAuC;AACrE,SAAO,kBAAkB,KAAK,MAAM;AACrC;AAEO,SAAS,kBAAkB,OAAuC;AACxE,MAAI,CAAC,eAAe,KAAK,GAAG;AAC3B,WAAO,WAAW,iCAAiC;AAAA,EACpD;AACA,MAAI,OAAO,MAAM,OAAO,YAAY,MAAM,GAAG,WAAW,GAAG;AAC1D,WAAO,WAAW,6CAA6C;AAAA,EAChE;AACA,MAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,WAAW,GAAG;AAC9D,WAAO,WAAW,+CAA+C;AAAA,EAClE;AACA,MAAI,EAAE,aAAa,QAAQ;AAC1B,WAAO,WAAW,yCAAyC;AAAA,EAC5D;AACA,SAAO;AACR;AAEA,SAAS,WAAW,SAA4B;AAC/C,SAAO;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,EACT;AACD;AAEO,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AACxB,IAAM,mBAAmB;AACzB,IAAM,iBAAiB;AACvB,IAAM,eAAe;AACrB,IAAM,gBAAgB;AACtB,IAAM,cAAc;AAEpB,IAAM,kBAAkB,OAAO,OAAO;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAU;AAmRH,SAAS,WACf,OACA,OAAkC,CAAC,GACd;AACrB,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,gBAAgB,aAAa,KAAK,UAAU,CAAC,CAAC;AACpD,QAAM,iBAA4C,CAAC;AACnD,QAAM,cAAsB,CAAC,QAAQ;AACpC,aAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC/C,iBAAW,WAAW,SAAS,KAAK,CAAC,KAAK,CAAC,EAAG,KAAI,KAAK,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC;AAAA,IAC3E;AAAA,EACD;AACA,QAAM,WAAW,MAAM,KAAwB,CAAC,GAAG,aAAa;AAAA,IAC/D,MAAM,GAAG,IAAI;AAAA,IACb,SAAS;AAAA,IACT,0BAA0B;AAAA,IAC1B,oBAAoB;AAAA,EACrB,CAAC;AACD,QAAM,QAAyB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,KAAK,KAAK,OAAO,KAAK;AAAA,IACtB,aAAa,KAAK,eAAe;AAAA,IACjC,WAAW,KAAK,aAAa,CAAC;AAAA,IAC9B,QAAQ,KAAK,UAAU,EAAE,WAAW,SAAS;AAAA,IAC7C,QAAQ,IAAI,IAAI,cAAc,IAAI,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;AAAA,IACvE,eAAe,oBAAI,IAAI;AAAA,IACvB,gBAAgB,oBAAI,IAAI;AAAA,IACxB,qBAAqB,oBAAI,IAAI;AAAA,IAC7B,aAAa,CAAC;AAAA,IACd,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EACD;AACA,QAAM,UAAU,MAAM;AAAA,IACrB,CAAC,QAAQ;AAAA,IACT,CAAC,QAAQ;AACR,iBAAW,WAAW,SAAS,KAAK,CAAC,KAAK,CAAC,GAAG;AAC7C,mBAAW,SAAS,wBAAwB,OAAO,OAA4B,GAAG;AACjF,cAAI,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;AAAA,QAC3B;AAAA,MACD;AAAA,IACD;AAAA,IACA;AAAA,MACC,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,MACT,0BAA0B;AAAA,MAC1B,oBAAoB;AAAA,IACrB;AAAA,EACD;AACA,QAAM,OAAO,SAAS,EAAE,QAAQ,GAAG,IAAI,sBAAsB,CAAC;AAC9D,QAAM,WAAW,MAAM;AAAA,IACtB,CAAC,OAAO;AAAA,IACR,CAAC,QAAQ;AACR,iBAAW,SAAS,SAAS,KAAK,CAAC,KAAK,CAAC,GAAG;AAC3C,cAAM,QAAQ;AACd,YAAI,MAAM,SAAS,UAAW,KAAI,KAAK,CAAC,CAAC,QAAQ,MAAM,OAAO,CAAC,CAAC;AAAA,MACjE;AAAA,IACD;AAAA,IACA;AAAA,MACC,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,MACT,0BAA0B;AAAA,MAC1B,oBAAoB;AAAA,IACrB;AAAA,EACD;AACA,QAAM,SAAS,MAAM;AAAA,IACpB,CAAC,OAAO;AAAA,IACR,CAAC,QAAQ;AACR,iBAAW,SAAS,SAAS,KAAK,CAAC,KAAK,CAAC,GAAG;AAC3C,cAAM,QAAQ;AACd,YAAI,MAAM,SAAS,SAAU,KAAI,KAAK,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC;AAAA,MAC/D;AAAA,IACD;AAAA,IACA;AAAA,MACC,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,MACT,0BAA0B;AAAA,MAC1B,oBAAoB;AAAA,IACrB;AAAA,EACD;AACA,QAAM,SAAS,MAAM;AAAA,IACpB,CAAC,OAAO;AAAA,IACR,CAAC,QAAQ;AACR,iBAAW,SAAS,SAAS,KAAK,CAAC,KAAK,CAAC,GAAG;AAC3C,cAAM,QAAQ;AACd,YAAI,MAAM,SAAS,QAAS,KAAI,KAAK,CAAC,CAAC,QAAQ,MAAM,KAAK,CAAC,CAAC;AAAA,MAC7D;AAAA,IACD;AAAA,IACA;AAAA,MACC,MAAM,GAAG,IAAI;AAAA,MACb,SAAS;AAAA,MACT,0BAA0B;AAAA,MAC1B,oBAAoB;AAAA,IACrB;AAAA,EACD;AAEA,QAAM,MAA0B;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,OAAO,cAAc,CAAC,GAAG;AACpC,aAAO,eAAe,UAAU;AAAA,QAC/B,MAAM;AAAA,QACN;AAAA,QACA,GAAI,YAAY,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,YAAY,UAAU;AAAA,MACnF,CAAC;AAAA,IACF;AAAA,IACA,WAAW,OAAO,cAAc,CAAC,GAAG;AACnC,aAAO,eAAe,UAAU;AAAA,QAC/B,MAAM;AAAA,QACN;AAAA,QACA,GAAI,YAAY,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,YAAY,UAAU;AAAA,MACnF,CAAC;AAAA,IACF;AAAA,IACA,QACC,OACA,SACA,cAA6E,CAAC,GAC7E;AACD,aAAO,eAAe,UAAU;AAAA,QAC/B,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,GAAI,YAAY,QAAQ,SAAY,CAAC,IAAI,EAAE,KAAK,YAAY,IAAI;AAAA,QAChE,GAAI,YAAY,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,YAAY,UAAU;AAAA,QAClF,GAAI,YAAY,mBAAmB,SAChC,CAAC,IACD,EAAE,gBAAgB,YAAY,eAAe;AAAA,MACjD,CAAC;AAAA,IACF;AAAA,IACA,MAAmB,OAAwB,iBAAoC,CAAC,GAAG;AAClF,qBAAe,OAAO,kBAAkB;AACxC,YAAM,iBAAiB,uBAAO,GAAG,IAAI,IAAI,KAAK,gBAAgB;AAC9D,YAAM,WAAW,MAAM;AAAA,QACtB,CAAC,QAAQ;AAAA,QACT,CAAC,QAAQ;AACR,gBAAM,SAAS,WAAkC,IAAI,IAAI;AACzD,cAAI,KAAK,CAAC,CAAC,QAAQ,UAAa,OAAO,OAAO,MAAM,CAAC,CAAC,CAAC;AAAA,QACxD;AAAA,QACA;AAAA,UACC,MAAM,eAAe,QAAQ,GAAG,IAAI,IAAI,KAAK;AAAA,UAC7C,SAAS;AAAA,UACT,MAAM,EAAE,MAAM;AAAA,UACd,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,0BAA0B;AAAA,UAC1B,oBAAoB;AAAA,QACrB;AAAA,MACD;AACA,aAAO,EAAE,UAAU,gBAAgB,QAAQ,OAAO;AAAA,IACnD;AAAA,IACA,QAAQ,iBAAoC,CAAC,GAAG;AAC/C,YAAM,iBAAiB,uBAAO,GAAG,IAAI,kBAAkB;AACvD,YAAM,WAAW,MAAM;AAAA,QACtB,CAAC,OAAO;AAAA,QACR,CAAC,QAAQ;AACR,gBAAM,SAAS,WAAoC,IAAI,IAAI;AAC3D,cAAI,KAAK,CAAC,CAAC,QAAQ,YAAY,OAAO,MAAM,CAAC,CAAC,CAAC;AAAA,QAChD;AAAA,QACA;AAAA,UACC,MAAM,eAAe,QAAQ,GAAG,IAAI;AAAA,UACpC,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,0BAA0B;AAAA,UAC1B,oBAAoB;AAAA,QACrB;AAAA,MACD;AACA,aAAO,EAAE,UAAU,gBAAgB,QAAQ,OAAO;AAAA,IACnD;AAAA,IACA,WAAwB,iBAAoC,CAAC,GAAG;AAC/D,YAAM,iBAAiB,uBAAO,GAAG,IAAI,qBAAqB;AAC1D,YAAM,WAAW,MAAM;AAAA,QACtB,CAAC,OAAO;AAAA,QACR,CAAC,QAAQ;AACR,gBAAM,SAAS,WAAuC,IAAI,IAAI;AAC9D,cAAI,KAAK,CAAC,CAAC,QAAQ,eAAkB,OAAO,MAAM,CAAC,CAAC,CAAC;AAAA,QACtD;AAAA,QACA;AAAA,UACC,MAAM,eAAe,QAAQ,GAAG,IAAI;AAAA,UACpC,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,0BAA0B;AAAA,UAC1B,oBAAoB;AAAA,QACrB;AAAA,MACD;AACA,aAAO,EAAE,UAAU,gBAAgB,QAAQ,OAAO;AAAA,IACnD;AAAA,IACA,aAA0B,kBAKvB;AACF,qBAAe,iBAAiB,OAAO,yBAAyB;AAChE,qBAAe,iBAAiB,gBAAgB,2BAA2B;AAC3E,YAAM,MAAM,mBAAmB,OAAO;AAAA,QACrC,OAAO,iBAAiB;AAAA,QACxB,gBAAgB,iBAAiB;AAAA,QACjC,MAAM,iBAAiB,QAAQ;AAAA,MAChC,CAAC;AACD,YAAM,kBAAkB;AAAA,QACvB,GAAG,IAAI,IAAI,iBAAiB,KAAK,IAAI,iBAAiB,cAAc;AAAA,MACrE;AACA,YAAM,iBACL,iBAAiB,QACjB,GAAG,IAAI,IAAI,iBAAiB,KAAK,IAAI,iBAAiB,cAAc;AACrE,YAAM,YAAY,MAAM;AAAA,QACvB,CAAC,UAAU,MAAM;AAAA,QACjB,CAAC,QAAQ;AACR,gBAAM,SAAS,WAAsC,IAAI,IAAI;AAC7D,cAAI,KAAK,CAAC,CAAC,QAAQ,cAAiB,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC;AAAA,QAC1D;AAAA,QACA;AAAA,UACC,MAAM,GAAG,cAAc;AAAA,UACvB,SAAS;AAAA,UACT,MAAM,EAAE,OAAO,iBAAiB,OAAO,gBAAgB,iBAAiB,eAAe;AAAA,UACvF,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,0BAA0B;AAAA,UAC1B,oBAAoB;AAAA,QACrB;AAAA,MACD;AACA,YAAM,SAAS,MAAM;AAAA,QACpB,CAAC,MAAM;AAAA,QACP,CAAC,QAAQ;AACR,qBAAW,QAAQ,SAAS,KAAK,CAAC,KAAK,CAAC,GAAG;AAC1C,kBAAM,QAAQ;AACd,kBAAM,oBACL,MAAM,UAAU,IAAI,SACpB,MAAM,mBAAmB,IAAI,mBAC5B,MAAM,SAAS,wBACf,MAAM,SAAS,yBACf,MAAM,SAAS;AACjB,kBAAM,iBAAiB,MAAM,UAAU,IAAI,SAAS,MAAM,SAAS;AACnE,gBAAI,qBAAqB,gBAAgB;AACxC,kBAAI,KAAK,CAAC,CAAC,QAAQ,eAAe,OAAO,GAAG,CAAC,CAAC,CAAC;AAAA,YAChD;AAAA,UACD;AAAA,QACD;AAAA,QACA;AAAA,UACC,MAAM,GAAG,cAAc;AAAA,UACvB,SAAS;AAAA,UACT,0BAA0B;AAAA,UAC1B,oBAAoB;AAAA,QACrB;AAAA,MACD;AACA,aAAO;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,KAAK,cAAc,CAAC,GAAG;AAC1B,iBAAO,eAAe,UAAU;AAAA,YAC/B,MAAM;AAAA,YACN,OAAO,IAAI;AAAA,YACX,gBAAgB,IAAI;AAAA,YACpB;AAAA,YACA,GAAI,YAAY,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,YAAY,UAAU;AAAA,UACnF,CAAC;AAAA,QACF;AAAA,QACA,KAAK,SAAS,cAAc,CAAC,GAAG;AAC/B,iBAAO,eAAe,UAAU;AAAA,YAC/B,MAAM;AAAA,YACN,OAAO,IAAI;AAAA,YACX,gBAAgB,IAAI;AAAA,YACpB;AAAA,YACA,GAAI,YAAY,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,YAAY,UAAU;AAAA,UACnF,CAAC;AAAA,QACF;AAAA,QACA,MAAM,cAAc,CAAC,GAAG;AACvB,iBAAO,eAAe,UAAU;AAAA,YAC/B,MAAM;AAAA,YACN,OAAO,IAAI;AAAA,YACX,gBAAgB,IAAI;AAAA,YACpB,GAAI,YAAY,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,YAAY,UAAU;AAAA,UACnF,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACA,0BAAwB,KAAK,KAAK;AAClC,SAAO;AACR;AAEO,SAAS,UACf,KACA,OAC+B;AAC/B,SAAO,IAAI,MAAS,KAAK,EAAE;AAC5B;AAEO,SAAS,QACf,OACA,QACA,KACA,OACA,OAAuB,CAAC,GACL;AACnB,QAAM,QAAQ,mBAAmB,GAAG;AACpC,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,6CAA6C;AACtF,MAAI,MAAM,UAAU,MAAO,OAAM,IAAI,MAAM,0CAA0C;AACrF,iBAAe,OAAO,SAAS;AAC/B,QAAM,WAAW,MAAM;AAAA,IACtB,CAAC,MAAM;AAAA,IACP,CAAC,QAAQ;AACR,iBAAW,SAAS,SAAS,KAAK,CAAC,KAAK,CAAC,GAAG;AAC3C,cAAM,MAAM,KAAK,QAAQ,KAAK;AAC9B,cAAM,YAAY,KAAK,cAAc,KAAK;AAC1C,YAAI,KAAK;AAAA,UACR;AAAA,YACC;AAAA,YACA;AAAA,cACC,MAAM;AAAA,cACN;AAAA,cACA,SAAS;AAAA,cACT,GAAI,QAAQ,SAAY,CAAC,IAAI,EAAE,IAAI;AAAA,cACnC,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU;AAAA,YAChD;AAAA,UACD;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAAA,IACA;AAAA,MACC,MAAM,KAAK,QAAQ,GAAG,MAAM,IAAI,IAAI,KAAK;AAAA,MACzC,SAAS;AAAA,MACT,MAAM,EAAE,MAAM;AAAA,MACd,0BAA0B;AAAA,MAC1B,oBAAoB;AAAA,IACrB;AAAA,EACD;AACA,QAAM,gBAAgB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACA,MAAI,WAAW;AACf,SAAO;AAAA,IACN;AAAA,IACA,UAAU;AACT,UAAI,SAAU;AACd,iBAAW;AACX,oBAAc;AAAA,IACf;AAAA,EACD;AACD;AAEA,SAAS,wBACR,OACA,SACiB;AACjB,QAAM,YAAY,gBAAgB,OAAO;AACzC,MAAI,cAAc,OAAW,QAAO,cAAc,OAAO,SAAS,SAAS;AAC3E,MAAI,QAAQ,cAAc,QAAW;AACpC,QAAI,MAAM,eAAe,IAAI,QAAQ,SAAS,GAAG;AAChD,aAAO,uBAAuB,OAAO,SAAS,qBAAqB;AAAA,IACpE;AACA,UAAM,eAAe,IAAI,QAAQ,SAAS;AAAA,EAC3C;AACA,MACC,QAAQ,SAAS,aACjB,QAAQ,mBAAmB,UAC3B,MAAM,oBAAoB,IAAI,eAAe,QAAQ,OAAO,QAAQ,cAAc,CAAC,GAClF;AACD,WAAO,uBAAuB,OAAO,SAAS,0BAA0B;AAAA,EACzE;AACA,UAAQ,QAAQ,MAAM;AAAA,IACrB,KAAK;AACJ,aAAO,YAAY,OAAO,QAAQ,OAAO,QAAQ,SAAS;AAAA,IAC3D,KAAK,eAAe;AACnB,YAAM,QAAQ,MAAM,OAAO,IAAI,QAAQ,KAAK;AAC5C,UAAI,UAAU,QAAW;AACxB,eAAO,YAAY,OAAO,SAAS,iBAAiB,kBAAkB,QAAQ,KAAK,GAAG;AAAA,MACvF;AACA,YAAM,SAAS;AACf,aAAO;AAAA,QACN;AAAA,UACC,MAAM;AAAA,UACN,QAAQ,WAAW,OAAO,gBAAgB;AAAA,YACzC,OAAO,QAAQ;AAAA,YACf,WAAW,QAAQ;AAAA,UACpB,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD;AAAA,IACA,KAAK;AACJ,YAAM,cAAc,QAAQ;AAC5B,aAAO;AAAA,QACN;AAAA,UACC,MAAM;AAAA,UACN,QAAQ,WAAW,OAAO,oBAAoB;AAAA,YAC7C,WAAW,QAAQ;AAAA,YACnB,SAAS,EAAE,aAAa,QAAQ,YAAY;AAAA,UAC7C,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD,KAAK;AACJ,aAAO,eAAe,OAAO,OAAO;AAAA,IACrC,KAAK;AACJ,aAAO,gBAAgB,OAAO,OAAO;AAAA,IACtC,KAAK;AACJ,aAAO,iBAAiB,OAAO,OAAO;AAAA,IACvC,KAAK;AACJ,aAAO,kBAAkB,OAAO,OAAO;AAAA,EACzC;AACD;AAEA,SAAS,eACR,OACA,SACiB;AACjB,MAAI,QAAQ,MAAM,OAAO,IAAI,QAAQ,KAAK;AAC1C,QAAM,SAAyB,CAAC;AAChC,MAAI,UAAU,QAAW;AACxB,QAAI,MAAM,gBAAgB,kBAAkB;AAC3C,aAAO,YAAY,OAAO,SAAS,iBAAiB,kBAAkB,QAAQ,KAAK,GAAG;AAAA,IACvF;AACA,WAAO,KAAK,GAAG,YAAY,OAAO,QAAQ,OAAO,QAAQ,SAAS,CAAC;AACnE,YAAQ,MAAM,OAAO,IAAI,QAAQ,KAAK;AAAA,EACvC;AACA,MAAI,UAAU;AACb,WAAO,YAAY,OAAO,SAAS,iBAAiB,kBAAkB,QAAQ,KAAK,GAAG;AACvF,MAAI,MAAM;AACT,WAAO,YAAY,OAAO,SAAS,gBAAgB,iBAAiB,QAAQ,KAAK,GAAG;AACrF,QAAM,UAA6B;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,KAAK,MAAM;AAAA,IACX,SAAS,QAAQ;AAAA,IACjB,aAAa,MAAM,IAAI;AAAA,IACvB,GAAI,QAAQ,QAAQ,SAAY,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI;AAAA,IACxD,GAAI,QAAQ,mBAAmB,SAAY,CAAC,IAAI,EAAE,gBAAgB,QAAQ,eAAe;AAAA,IACzF,GAAI,QAAQ,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,UAAU;AAAA,EAC3E;AACA,MAAI,QAAQ,mBAAmB,QAAW;AACzC,UAAM,oBAAoB,IAAI,eAAe,QAAQ,OAAO,QAAQ,cAAc,CAAC;AAAA,EACpF;AACA,QAAM,SAAS,KAAK,OAAO;AAC3B,SAAO,KAAK,EAAE,MAAM,WAAW,QAAQ,CAAC;AACxC,SAAO,KAAK;AAAA,IACX,MAAM;AAAA,IACN,QAAQ,WAAW,OAAO,qBAAqB;AAAA,MAC9C,OAAO,QAAQ;AAAA,MACf,KAAK,QAAQ;AAAA,MACb,WAAW,QAAQ;AAAA,IACpB,CAAC;AAAA,EACF,CAAC;AACD,SAAO,KAAK,GAAG,cAAc,OAAO,QAAQ,OAAO,KAAK,CAAC;AACzD,SAAO;AACR;AAEA,SAAS,YAAY,OAAwB,OAAe,WAAoC;AAC/F,iBAAe,OAAO,YAAY;AAClC,MAAI,CAAC,MAAM,OAAO,IAAI,KAAK,EAAG,OAAM,OAAO,IAAI,OAAO,eAAe,CAAC;AACtE,SAAO;AAAA,IACN;AAAA,MACC,MAAM;AAAA,MACN,QAAQ,WAAW,OAAO,iBAAiB,EAAE,OAAO,UAAU,CAAC;AAAA,IAChE;AAAA,EACD;AACD;AAEA,SAAS,cACR,OACA,WACA,OACiB;AACjB,QAAM,MAAM,MAAM,UAAU;AAC5B,MAAI,QAAQ,UAAa,MAAM,SAAS,UAAU,IAAK,QAAO,CAAC;AAC/D,MAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,GAAG;AACtC,WAAO;AAAA,MACN;AAAA,MACA,EAAE,MAAM,WAAW,OAAO,WAAW,SAAS,OAAU;AAAA,MACxD;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACA,QAAM,YAAY,MAAM,SAAS,SAAS;AAC1C,QAAM,SAAS,OAAO,GAAG,SAAS;AAClC,QAAM,UAAU,MAAM,SAAS,CAAC,GAAG,OAAO,MAAM;AAChD,QAAM,SAAyB;AAAA,IAC9B;AAAA,MACC,MAAM;AAAA,MACN,QAAQ,WAAW,OAAO,qBAAqB;AAAA,QAC9C,OAAO;AAAA,QACP,SAAS,MAAM;AAAA,QACf,SAAS,EAAE,UAAU;AAAA,MACtB,CAAC;AAAA,IACF;AAAA,EACD;AACA,aAAW,OAAO,MAAM,cAAc,OAAO,GAAG;AAC/C,QAAI,IAAI,UAAU,IAAI,UAAU,aAAa,IAAI,WAAW,MAAM,QAAS;AAC3E,QAAI,eAAe;AACnB,WAAO;AAAA,MACN,GAAG;AAAA,QACF;AAAA,QACA;AAAA,UACC,MAAM;AAAA,UACN,OAAO;AAAA,UACP,gBAAgB,IAAI;AAAA,UACpB,SAAS,IAAI;AAAA,QACd;AAAA,QACA;AAAA,QACA,iBAAiB,IAAI,cAAc;AAAA,MACpC;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;AAEA,SAAS,gBACR,OACA,SACiB;AACjB,QAAM,QAAQ,MAAM,OAAO,IAAI,QAAQ,KAAK;AAC5C,MAAI,UAAU;AACb,WAAO,YAAY,OAAO,SAAS,iBAAiB,kBAAkB,QAAQ,KAAK,GAAG;AACvF,QAAM,MAAM,gBAAgB,OAAO,QAAQ,OAAO,QAAQ,cAAc;AACxE,MAAI,QAAQ;AACX,WAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,yBAAyB,QAAQ,cAAc;AAAA,IAChD;AACD,MAAI,IAAI;AACP,WAAO,YAAY,OAAO,SAAS,uBAAuB,wBAAwB;AACnF,MAAI,IAAI;AACP,WAAO,YAAY,OAAO,SAAS,iBAAiB,mCAAmC;AACxF,MAAI,QAAQ,MAAM,IAAI;AACrB,WAAO,YAAY,OAAO,SAAS,uBAAuB,mCAAmC;AAC9F,MAAI,QAAQ,OAAO,MAAM;AACxB,WAAO,YAAY,OAAO,SAAS,uBAAuB,0BAA0B;AACrF,MAAI,UAAU,KAAK,IAAI,IAAI,SAAS,QAAQ,MAAM,CAAC;AACnD,SAAO;AAAA,IACN;AAAA,MACC,MAAM;AAAA,MACN,QAAQ,WAAW,OAAO,sBAAsB;AAAA,QAC/C,OAAO,QAAQ;AAAA,QACf,gBAAgB,QAAQ;AAAA,QACxB,SAAS,IAAI;AAAA,QACb,WAAW,QAAQ;AAAA,MACpB,CAAC;AAAA,IACF;AAAA,EACD;AACD;AAEA,SAAS,iBACR,OACA,SACiB;AACjB,QAAM,QAAQ,MAAM,OAAO,IAAI,QAAQ,KAAK;AAC5C,MAAI,UAAU;AACb,WAAO,YAAY,OAAO,SAAS,iBAAiB,kBAAkB,QAAQ,KAAK,GAAG;AACvF,QAAM,MAAM,gBAAgB,OAAO,QAAQ,OAAO,QAAQ,cAAc;AACxE,MAAI,QAAQ;AACX,WAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,yBAAyB,QAAQ,cAAc;AAAA,IAChD;AACD,MAAI,IAAI;AACP,WAAO,YAAY,OAAO,SAAS,uBAAuB,wBAAwB;AACnF,MAAI,QAAQ,UAAU,MAAM;AAC3B,WAAO,YAAY,OAAO,SAAS,iBAAiB,iCAAiC;AACtF,MAAI,QAAQ,UAAU,MAAM;AAC3B,WAAO,YAAY,OAAO,SAAS,uBAAuB,2BAA2B;AACtF,MAAI,UAAU,QAAQ;AACtB,MAAI,eAAe;AACnB,SAAO;AAAA,IACN;AAAA,MACC,MAAM;AAAA,MACN,QAAQ,WAAW,OAAO,uBAAuB;AAAA,QAChD,OAAO,QAAQ;AAAA,QACf,gBAAgB,QAAQ;AAAA,QACxB,SAAS,IAAI;AAAA,QACb,WAAW,QAAQ;AAAA,MACpB,CAAC;AAAA,IACF;AAAA,EACD;AACD;AAEA,SAAS,kBACR,OACA,SACiB;AACjB,MAAI,CAAC,MAAM,OAAO,IAAI,QAAQ,KAAK;AAClC,WAAO,YAAY,OAAO,SAAS,iBAAiB,kBAAkB,QAAQ,KAAK,GAAG;AACvF,QAAM,MAAM,gBAAgB,OAAO,QAAQ,OAAO,QAAQ,cAAc;AACxE,MAAI,QAAQ;AACX,WAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,yBAAyB,QAAQ,cAAc;AAAA,IAChD;AACD,MAAI,SAAS;AACb,SAAO;AAAA,IACN;AAAA,MACC,MAAM;AAAA,MACN,QAAQ,WAAW,OAAO,uBAAuB;AAAA,QAChD,OAAO,QAAQ;AAAA,QACf,gBAAgB,QAAQ;AAAA,QACxB,SAAS,IAAI;AAAA,QACb,WAAW,QAAQ;AAAA,MACpB,CAAC;AAAA,IACF;AAAA,EACD;AACD;AAEA,SAAS,YACR,OACA,SACA,MACA,SACiB;AACjB,QAAM,QAAQ,aAAa,OAAO;AAClC,QAAM,YAAY,YAAY,OAAO;AACrC,QAAM,QAAmB;AAAA,IACxB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU,UAAU,SAAY,SAAY,EAAE,MAAM;AAAA,EACrD;AACA,QAAM,QAAmC;AAAA,IACxC,UAAU,EAAE,MAAM;AAAA,IAClB,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,IACvC,GAAI,eAAe,OAAO,IAAI,EAAE,QAAsC,IAAI,CAAC;AAAA,IAC3E;AAAA,IACA,aAAa,MAAM,IAAI;AAAA,EACxB;AACA,QAAM,YAAY,KAAK,KAAK;AAC5B,SAAO;AAAA,IACN,EAAE,MAAM,SAAS,MAAM;AAAA,IACvB,EAAE,MAAM,eAAe,MAAM;AAAA,IAC7B;AAAA,MACC,MAAM;AAAA,MACN,QAAQ,WAAW,OAAO,oBAAoB;AAAA,QAC7C;AAAA,QACA;AAAA,QACA,WAAW;AAAA,MACZ,CAAC;AAAA,IACF;AAAA,EACD;AACD;AAEA,SAAS,cAAc,OAAwB,SAAkB,QAAgC;AAChG,SAAO,YAAY,OAAO,SAAS,qBAAqB,MAAM;AAC/D;AAEA,SAAS,uBACR,OACA,SACA,SACiB;AACjB,QAAM,SAAS,WAAW,OAAO,qBAAqB;AAAA,IACrD,OAAO,WAAW,UAAU,QAAQ,QAAQ;AAAA,IAC5C,WAAW,QAAQ;AAAA,EACpB,CAAC;AACD,MAAI,MAAM,OAAO,cAAc,SAAS;AACvC,WAAO;AAAA,MACN,EAAE,MAAM,UAAU,OAAO;AAAA,MACzB,GAAG,YAAY,OAAO,SAAS,qBAAqB,OAAO;AAAA,IAC5D;AAAA,EACD;AACA,SAAO,CAAC,EAAE,MAAM,UAAU,OAAO,CAAC;AACnC;AAEA,SAAS,WACR,OACA,MACA,QACmB;AACnB,SAAO;AAAA,IACN;AAAA,IACA,aAAa,MAAM,IAAI;AAAA,IACvB,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,IAC5D,GAAI,OAAO,QAAQ,SAAY,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI;AAAA,IACtD,GAAI,OAAO,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ;AAAA,IAClE,GAAI,OAAO,mBAAmB,SAAY,CAAC,IAAI,EAAE,gBAAgB,OAAO,eAAe;AAAA,IACvF,GAAI,OAAO,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ;AAAA,IAClE,GAAI,OAAO,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,OAAO,UAAU;AAAA,IACxE,GAAI,OAAO,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,OAAO,UAAU;AAAA,IACxE,GAAI,OAAO,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ;AAAA,EACnE;AACD;AAEA,SAAS,gBAAgB,SAAsC;AAC9D,MAAI,CAAC,eAAe,OAAO,EAAG,QAAO;AACrC,MAAI,OAAO,QAAQ,SAAS,SAAU,QAAO;AAC7C,MAAI,CAAC,wBAAwB,QAAQ,IAAI,EAAG,QAAO,yBAAyB,QAAQ,IAAI;AACxF,MAAI,WAAW,SAAS;AACvB,QAAI,OAAO,QAAQ,UAAU,SAAU,QAAO;AAC9C,UAAM,aAAa,iBAAiB,QAAQ,OAAO,YAAY;AAC/D,QAAI,eAAe,OAAW,QAAO;AAAA,EACtC;AACA,MAAI,oBAAoB,WAAW,OAAO,QAAQ,mBAAmB,UAAU;AAC9E,WAAO;AAAA,EACR;AACA,MAAI,QAAQ,SAAS,aAAa,QAAQ,YAAY;AACrD,WAAO;AACR,MAAI,QAAQ,SAAS,SAAS,CAAC,cAAc,QAAQ,GAAG;AACvD,WAAO;AACR,MAAI,QAAQ,SAAS,UAAU,CAAC,cAAc,QAAQ,OAAO,GAAG;AAC/D,WAAO;AAAA,EACR;AACA,MACC,QAAQ,SAAS,kBACjB,QAAQ,gBAAgB,YACxB,QAAQ,gBAAgB,kBACvB;AACD,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAEA,SAAS,wBAAwB,MAAiD;AACjF,SACC,SAAS,kBACT,SAAS,iBACT,SAAS,aACT,SAAS,kBACT,SAAS,SACT,SAAS,UACT,SAAS;AAEX;AAEA,SAAS,YACR,OACA,QACwB;AACxB,QAAM,QAAQ,cAAc,OAAO,KAAK;AACxC,QAAM,SAAS,CAAC,GAAG,MAAM,OAAO,QAAQ,CAAC,EACvC;AAAA,IACA,CAAC,CAAC,OAAO,KAAK,OACZ,OAAO,gBAAgB,OAAO,CAAC,MAAM,YACrC,OAAO,eAAe,UAAa,QAAQ,OAAO;AAAA,EACrD,EACC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAE;AACjD,QAAM,OAAO,OAAO,MAAM,GAAG,KAAK;AAClC,QAAM,UAAU,OAAO,SAAS;AAChC,SAAO;AAAA,IACN,QAAQ,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;AAAA,MACrC;AAAA,MACA,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,MACf,cAAc,MAAM,SAAS;AAAA,IAC9B,EAAE;AAAA,IACF,GAAI,WAAW,KAAK,SAAS,IAAI,EAAE,gBAAgB,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IACnF;AAAA,EACD;AACD;AAEA,SAAS,UACR,OACA,WACA,QACyB;AACzB,QAAM,QAAQ,MAAM,OAAO,IAAI,SAAS;AACxC,QAAM,QAAQ,OAAO,aAAa,SAAa,OAAO,WAAW,IAAK,OAAO,WAAW;AACxF,QAAM,OAAO,OAAO,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,QAAQ,OAAO,KAAK;AAC5E,QAAM,QAAQ,cAAc,OAAO,KAAK;AACxC,QAAM,WAAW,IAAI,MAAM,GAAG,KAAK;AACnC,QAAM,UAAU,IAAI,SAAS;AAC7B,SAAO;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA,SAAS;AAAA,IACT,GAAI,SAAS,SAAS,IAAI,EAAE,YAAY,SAAS,SAAS,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC;AAAA,IAChF,GAAI,WAAW,SAAS,SAAS,IAAI,EAAE,cAAc,SAAS,SAAS,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC;AAAA,IAC7F;AAAA,EACD;AACD;AAEA,SAAS,cACR,OACA,KACA,QAC6B;AAC7B,QAAM,SAAS,eAAe,OAAO,GAAG;AACxC,QAAM,QAAQ,OAAO,aAAa,SAAY,IAAI,UAAU,OAAO,WAAW;AAC9E,QAAM,QAAQ,MAAM,OAAO,IAAI,IAAI,KAAK;AACxC,QAAM,MAAM,IAAI,eACb,CAAC,KACA,OAAO,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,QAAQ,OAAO,KAAK;AACnE,QAAM,QAAQ,cAAc,OAAO,KAAK;AACxC,QAAM,WAAW,IAAI,MAAM,GAAG,KAAK;AACnC,QAAM,UAAU,IAAI,SAAS;AAC7B,SAAO;AAAA,IACN,OAAO,IAAI;AAAA,IACX,gBAAgB,IAAI;AAAA,IACpB;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,GAAI,SAAS,SAAS,IAAI,EAAE,YAAY,SAAS,SAAS,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC;AAAA,IAChF,GAAI,WAAW,SAAS,SAAS,IAAI,EAAE,cAAc,SAAS,SAAS,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC;AAAA,IAC7F;AAAA,EACD;AACD;AAEA,SAAS,eACR,OACA,QAC8B;AAC9B,QAAM,QAAQ,cAAc,OAAO,KAAK;AACxC,QAAM,UAAU,MAAM,YAAY,OAAO,CAAC,UAAU;AACnD,QAAI,OAAO,kBAAkB,UAAa,MAAM,YAAY,OAAO,cAAe,QAAO;AACzF,QAAI,OAAO,UAAU,UAAa,MAAM,UAAU,OAAO,MAAO,QAAO;AACvE,QAAI,OAAO,SAAS,UAAa,MAAM,MAAM,SAAS,OAAO,KAAM,QAAO;AAC1E,WAAO;AAAA,EACR,CAAC;AACD,QAAM,OAAO,QAAQ,MAAM,GAAG,KAAK;AACnC,QAAM,UAAU,QAAQ,SAAS;AACjC,SAAO;AAAA,IACN,SAAS;AAAA,IACT,GAAI,WAAW,KAAK,SAAS,IAAI,EAAE,mBAAmB,KAAK,KAAK,SAAS,CAAC,GAAG,SAAS,IAAI,CAAC;AAAA,IAC3F;AAAA,EACD;AACD;AAEA,SAAS,eAAe,OAAwB,KAA0C;AACzF,QAAM,QAAQ,MAAM,OAAO,IAAI,IAAI,KAAK;AACxC,SAAO;AAAA,IACN,OAAO,IAAI;AAAA,IACX,gBAAgB,IAAI;AAAA,IACpB,SAAS,IAAI;AAAA,IACb,QAAQ,IAAI;AAAA,IACZ,cAAc,IAAI;AAAA,IAClB,SAAS,OAAO,WAAW;AAAA,EAC5B;AACD;AAEA,SAAS,mBACR,OACA,MACoB;AACpB,QAAM,MAAM,GAAG,KAAK,KAAK,KAAS,KAAK,cAAc;AACrD,QAAM,WAAW,MAAM,cAAc,IAAI,GAAG;AAC5C,MAAI,aAAa,OAAW,QAAO;AACnC,QAAM,QAAQ,MAAM,OAAO,IAAI,KAAK,KAAK;AACzC,QAAM,UACL,KAAK,SAAS,aACV,OAAO,WAAW,IACnB,KAAK,SAAS,WACZ,OAAO,WAAW,IACnB,KAAK;AACV,QAAM,MAAyB;AAAA,IAC9B,OAAO,KAAK;AAAA,IACZ,gBAAgB,KAAK;AAAA,IACrB;AAAA,IACA,QAAQ;AAAA,IACR,cAAc,UAAU,UAAa,UAAU,MAAM;AAAA,EACtD;AACA,QAAM,cAAc,IAAI,KAAK,GAAG;AAChC,SAAO;AACR;AAEA,SAAS,gBACR,OACA,OACA,gBACgC;AAChC,SAAO,MAAM,cAAc,IAAI,GAAG,KAAK,KAAS,cAAc,EAAE;AACjE;AAEA,SAAS,WAAc,MAAiC;AACvD,SAAQ,eAAe,MAAM,MAAM,IAAI,KAAK,SAAS,CAAC;AACvD;AAEA,SAAS,eACR,aACA,SACI;AACJ,cAAY,KAAK,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC;AACpC,SAAO;AACR;AAEA,SAAS,iBAA6B;AACrC,SAAO,EAAE,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC,EAAE;AAC9D;AAEA,SAAS,aAAa,QAA8C;AACnE,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAClC,MAAI,OAAO,WAAW,OAAO,OAAQ,OAAM,IAAI,MAAM,6BAA6B;AAClF,aAAW,SAAS,OAAQ,gBAAe,OAAO,YAAY;AAC9D,SAAO,OAAO,OAAO,OAAO,KAAK,CAAC;AACnC;AAEA,SAAS,eAAe,OAAe,OAAqB;AAC3D,QAAM,QAAQ,iBAAiB,OAAO,KAAK;AAC3C,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,KAAK;AAC/C;AAEA,SAAS,iBAAiB,OAAe,OAAmC;AAC3E,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW;AACjD,WAAO,GAAG,KAAK;AAChB,SAAO;AACR;AAEA,SAAS,eAAe,OAAe,OAAqB;AAC3D,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW;AACjD,UAAM,IAAI,MAAM,GAAG,KAAK,8BAA8B;AACxD;AAEA,SAAS,cAAc,OAAmC;AACzD,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ;AACvC,UAAM,IAAI,MAAM,8CAA8C;AAC/D,SAAO;AACR;AAEA,SAAS,cAAc,OAAiC;AACvD,SAAO,OAAO,UAAU,KAAK,KAAM,SAAoB;AACxD;AAEA,SAAS,eAAe,OAAkD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC3E;AAEA,SAAS,aAAa,SAAsC;AAC3D,SAAO,eAAe,OAAO,KAAK,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;AACvF;AAEA,SAAS,YAAY,SAAsC;AAC1D,SAAO,eAAe,OAAO,KAAK,OAAO,QAAQ,cAAc,WAC5D,QAAQ,YACR;AACJ;AAEA,SAAS,eAAe,OAAe,KAAqB;AAC3D,SAAO,GAAG,KAAK,KAAS,GAAG;AAC5B;","names":[]}
1
+ {"version":3,"sources":["../../src/messaging/index.ts","../../src/protocol/messages.ts","../../src/ctx/types.ts","../../src/messaging/internal.ts","../../src/messaging/utils.ts","../../src/messaging/event-message.ts","../../src/messaging/types.ts"],"sourcesContent":["/**\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","/**\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","/**\n * The fn-invocation context and per-dep input shapes.\n *\n * Canonical authority: ~/src/graphrefly/spec/rules.jsonl\n * R-fn-contract (D8/D27), R-ctx-state (D23/D29), R-cleanup-hooks (D28), R-ctx-up.\n */\n\nimport type { Dispatcher } from \"../dispatcher/index.js\";\nimport type { EnvironmentDrivers } from \"../graph/environment.js\";\nimport type { Node } from \"../node/node.js\";\nimport { type Message, type PullDemand, SENTINEL, type Wave } from \"../protocol/messages.js\";\n\n/** A downstream sink callback (the only way to connect to a node's output). */\nexport type Sink = (msg: Message, delivery?: DeliveryMeta) => void;\n\n/** Internal delivery metadata used to preserve the upstream `ctx.down(msgs)` wave boundary. */\nexport interface DeliveryMeta {\n\treadonly wave: object;\n\treadonly last: boolean;\n}\n\n/**\n * Internal current-value reader. It is deliberately a symbol-backed implementation detail:\n * raw ctx exposes `waveData` + `terminal`; helpers below derive from that plus this dep cache.\n */\nexport const CTX_DEP_CACHE: unique symbol = Symbol(\"graphrefly.ctx.depCache\");\n\nexport interface CtxDepCache {\n\treadonly latest: readonly unknown[];\n}\n\n/** Internal node-construction binding for graph-local helper-created deps. */\nexport const CTX_NODE_BINDING: unique symbol = Symbol(\"graphrefly.ctx.nodeBinding\");\n\nexport interface CtxNodeBinding {\n\treadonly dispatcher: Dispatcher;\n\tcreate<T>(factory: () => Node<T>): Node<T>;\n}\n\n/** Per-dep wave projections: dep -> waves -> values/SENTINEL markers. */\nexport type WaveData = readonly (readonly (readonly unknown[])[])[];\n\n/** Terminal metadata parallel to `waveData`: false = none, true = COMPLETE, otherwise ERROR payload. */\nexport type TerminalData = readonly unknown[];\n\nexport function isTerminalNone(t: unknown): boolean {\n\treturn t === false || t === undefined;\n}\n\nexport function isTerminalComplete(t: unknown): t is true {\n\treturn t === true;\n}\n\nexport function isTerminalError(t: unknown): boolean {\n\treturn !isTerminalNone(t) && !isTerminalComplete(t);\n}\n\nexport function terminalErrorValue(t: unknown): unknown {\n\treturn isTerminalError(t) ? t : undefined;\n}\n\n/**\n * Per-node private cross-wave state (R-ctx-state / D23,D29). Default fresh-lifecycle\n * wipe; `persist(true)` keeps it across lifecycle transitions.\n */\nexport interface CtxState {\n\tget<S = unknown>(): S | undefined;\n\tset<S = unknown>(v: S): void;\n\tpersist(on?: boolean): void;\n}\n\n/**\n * Deferred SELF-rewire (R-rewire-deferred / D47). A node fn may, DURING its run, request a\n * mutation of its OWN dep set; the request is QUEUED and applied at the committed wave boundary\n * (after the current wave settles / batch commit / final-lock RESUME) as a fresh wave, reusing\n * R-rewire surgical/Option-C semantics (D42). This is the ONLY legal self-triggered rewire — an\n * IMMEDIATE in-fn `node.subscribeDep/unsubscribeDep/replaceDeps` is the D37 mid-fn feedback-cycle ERROR. An\n * added cached dep pushes `[DIRTY,DATA]` on the boundary wave (R-push-subscribe); a removed dep\n * is drained and, if it loses its last subscriber, `_deactivate`s + fires `onDeactivation`\n * (input-side teardown — the basis for higher-order operator cancellation / abortInFlight).\n */\nexport interface RewireNext {\n\t/** Defer subscribing to a dep (paired with the re-supplied fn — positional fn-deps lock, SD-1). */\n\tsubscribeDep(dep: Node<unknown>, fn: NodeFn): void;\n\t/** Defer unsubscribing from a dep (its source is torn down if it loses its last subscriber). */\n\tunsubscribeDep(dep: Node<unknown>, fn: NodeFn): void;\n\t/** Defer replacing the whole dep set (surgical: kept deps untouched, removed drained, added fresh-subscribe). */\n\treplaceDeps(deps: Node<unknown>[], fn: NodeFn): void;\n}\n\n/**\n * The single argument to a node fn: `(ctx) => void` (R-fn-contract / D8). All emission\n * is explicit via `ctx.down`; there is no return-value framing.\n */\nexport interface Ctx {\n\t/**\n\t * Emit upstream toward deps — control tiers only (R-ctx-up). IMMEDIATE. `towardDep` (a dep index)\n\t * routes the wave up ONE declared edge (R-up-routing directed-up); omitted = broadcast up all deps.\n\t * A pull DEMAND is `up([[PULL, { pullId, params }]])` — but for a SELF-demand (demanding a dep\n\t * this fn also reads) use {@link Ctx.upNext} instead, since an immediate demand whose delivery loops back\n\t * re-enters this fn mid-wave (D37 / R-reentrancy).\n\t */\n\tup(msgs: Wave, towardDep?: number): void;\n\t/** Emit downstream toward sinks. */\n\tdown(msgs: Wave): void;\n\t/**\n\t * The single raw dep-value input surface (R-ctx-wave-data / D77): dep -> upstream waves ->\n\t * per-wave DATA payloads and INVALIDATE/SENTINEL markers. `waveData[i] = []` means dep i\n\t * delivered no wave to this invocation; `waveData[i] = [[]]` means RESOLVED-only.\n\t */\n\twaveData: WaveData;\n\t/** Terminal metadata for the same invocation; terminal values never enter `waveData`. */\n\tterminal: TerminalData;\n\tstate: CtxState;\n\t/** Release external resources on deactivation (R-cleanup-hooks). */\n\tonDeactivation(fn: () => void): void;\n\t/** Flush on INVALIDATE (R-cleanup-hooks). */\n\tonInvalidate(fn: () => void): void;\n\t/** Graph-owned environment drivers for source/adapter boundaries (D130/D131). */\n\tenvironment(): EnvironmentDrivers;\n\t/** Holder-visible context for a PULL-caused invocation (D272); absent for ordinary waves. */\n\treadonly pull?: PullDemand;\n\t/**\n\t * Deferred SELF-rewire (R-rewire-deferred / D47) — the substrate affordance higher-order\n\t * operators (switchMap/mergeMap/concatMap/exhaustMap/flatMap) use to grow/shrink their own\n\t * inner-source dep set in response to their own data. Always present; see {@link RewireNext}.\n\t */\n\trewireNext: RewireNext;\n\t/**\n\t * Deferred up — the boundary-deferred form of {@link Ctx.up} (R-up-routing / R-pull / D59). Routes\n\t * `msgs` up from this node at the COMMITTED wave boundary (broadcast, or up the single `towardDep`\n\t * edge), riding the same R-rewire-deferred (D47) drain as {@link RewireNext}. This is the\n\t * SELF-DEMAND path: a consumer issues `ctx.upNext([[PULL, { pullId, params }]])` to demand a pull\n\t * dep it ALSO reads — the cone-routed PULL reaches the pullId-holder, whose delivery loops back as a\n\t * FRESH wave (not a mid-fn re-entry → no D37). The consumer accepts one-wave latency (the\n\t * HTTP-request model). No node reference needed: the author writes the pullId verbatim.\n\t */\n\tupNext(msgs: Wave, towardDep?: number): void;\n\t/**\n\t * Read a dep's latest value by index (dynamicNode only, R-dynamic-node / D35).\n\t * Present only on dynamicNode fns; all declared deps still participate in wave\n\t * tracking. Under D49/R-resolved-undirty an unread dep's change still fires the fn,\n\t * which re-emits its (unchanged) output as a DATA occurrence — there is NO equals-\n\t * absorption; pair with distinctUntilChanged to suppress unchanged re-emits (opt-in).\n\t */\n\ttrack?(depIndex: number): unknown;\n\t[CTX_DEP_CACHE]?: CtxDepCache;\n\t[CTX_NODE_BINDING]?: CtxNodeBinding;\n}\n\n/** A node fn (R-fn-contract). Registered in a dispatcher pool, indexed by Handle. */\nexport type NodeFn = (ctx: Ctx) => void;\n\n/** Number of declared dep slots visible in this invocation. */\nexport function depCount(ctx: Ctx): number {\n\treturn ctx.waveData.length;\n}\n\n/** DATA/SENTINEL projection batches delivered by one dep in this invocation. */\nexport function depWaves(ctx: Ctx, depIndex: number): readonly (readonly unknown[])[] {\n\treturn ctx.waveData[depIndex] ?? [];\n}\n\n/** Flattened DATA projection for old event-counting operator bodies; null = no wave. */\nexport function depBatch(ctx: Ctx, depIndex: number): readonly unknown[] | null {\n\tconst waves = depWaves(ctx, depIndex);\n\tif (waves.length === 0) return null;\n\tconst flattened = waves.flat().filter((v) => v !== SENTINEL);\n\treturn flattened.length === 0 ? [] : flattened;\n}\n\n/** Latest cached DATA for a dep, derived from implementation-owned dep cache. */\nexport function depLatest(ctx: Ctx, depIndex: number): unknown {\n\treturn ctx[CTX_DEP_CACHE]?.latest[depIndex];\n}\n\n/** Terminal metadata for one dep: false = none, true = COMPLETE, otherwise ERROR payload. */\nexport function depTerminal(ctx: Ctx, depIndex: number): unknown {\n\tconst t = ctx.terminal[depIndex];\n\treturn t === undefined ? false : t;\n}\n","import type { NodeFn } from \"../ctx/types.js\";\nimport type { Graph } from \"../graph/graph.js\";\nimport type { Node } from \"../node/node.js\";\nimport type { MessageBusCommand } from \"./index.js\";\n\nexport interface MessageBusInternalState {\n\treadonly graph: Graph;\n\treadonly name: string;\n\treadonly commandSources: Node<MessageBusCommand>[];\n\treadonly commandBody: NodeFn;\n}\n\nconst busStates = new WeakMap<object, MessageBusInternalState>();\n\nexport function registerMessageBusState(bus: object, state: MessageBusInternalState): void {\n\tbusStates.set(bus, state);\n}\n\nexport function getMessageBusState(bus: object): MessageBusInternalState | undefined {\n\treturn busStates.get(bus);\n}\n\nexport function attachMessageBusCommandSource(\n\tgraph: Graph,\n\tbus: object,\n\tcommands: Node<MessageBusCommand>,\n): () => void {\n\tconst state = getMessageBusState(bus);\n\tif (state === undefined) throw new Error(\"messageBus: unknown implementation\");\n\tif (state.graph !== graph) throw new Error(\"messageBus: command source graph must match\");\n\tstate.commandSources.push(commands);\n\tconst busCommands = (bus as { readonly commands?: Node<MessageBusCommand> }).commands;\n\tif (busCommands === undefined) throw new Error(\"messageBus: missing commands node\");\n\tbusCommands.replaceDeps([...state.commandSources], state.commandBody);\n\tlet released = false;\n\treturn () => {\n\t\tif (released) return;\n\t\treleased = true;\n\t\tconst index = state.commandSources.indexOf(commands);\n\t\tif (index >= 0) state.commandSources.splice(index, 1);\n\t\tbusCommands.replaceDeps([...state.commandSources], state.commandBody);\n\t};\n}\n\nexport function attachMessageBusDeferredCommandSink(\n\tgraph: Graph,\n\tbus: object,\n\tcommands: Node<MessageBusCommand>,\n): () => void {\n\tconst state = getMessageBusState(bus);\n\tif (state === undefined) throw new Error(\"messageBus: unknown implementation\");\n\tif (state.graph !== graph) throw new Error(\"messageBus: command sink graph must match\");\n\tconst busCommands = (bus as { readonly commands?: Node<MessageBusCommand> }).commands;\n\tif (busCommands === undefined) throw new Error(\"messageBus: missing commands node\");\n\tconst boundary = commands as Node<MessageBusCommand> & {\n\t\t__deferBoundary?: (fn: () => void) => void;\n\t};\n\tconst unsubscribe = commands.subscribe((msg) => {\n\t\tif (msg[0] !== \"DATA\") return;\n\t\tconst command = msg[1] as MessageBusCommand;\n\t\tconst send = () => busCommands.down([[\"DATA\", command]]);\n\t\tif (boundary.__deferBoundary === undefined) send();\n\t\telse boundary.__deferBoundary(send);\n\t});\n\treturn unsubscribe;\n}\n","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"],"mappings":"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","names":[]}