@logixjs/core 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/LICENSE +201 -0
  2. package/dist/{Bound-BN1DQ_lM.d.ts → Bound-CEa1ihvH.d.ts} +2 -2
  3. package/dist/{Bound-BPIfH9SS.d.cts → Bound-CNLNkC7c.d.cts} +2 -2
  4. package/dist/Bound.cjs +620 -163
  5. package/dist/Bound.cjs.map +1 -1
  6. package/dist/Bound.d.cts +3 -3
  7. package/dist/Bound.d.ts +3 -3
  8. package/dist/Bound.js +14 -14
  9. package/dist/{Debug-Bq8Sqjcr.d.cts → Debug-BhMYr-1i.d.cts} +3 -3
  10. package/dist/{Debug-B5q5Bkzx.d.ts → Debug-ByM7m4Ft.d.ts} +3 -3
  11. package/dist/Debug.cjs +553 -32
  12. package/dist/Debug.cjs.map +1 -1
  13. package/dist/Debug.d.cts +10 -8
  14. package/dist/Debug.d.ts +10 -8
  15. package/dist/Debug.js +12 -10
  16. package/dist/EffectOp.cjs.map +1 -1
  17. package/dist/EffectOp.js +2 -3
  18. package/dist/EffectOp.js.map +1 -1
  19. package/dist/Env.cjs +664 -6
  20. package/dist/Env.cjs.map +1 -1
  21. package/dist/Env.js +5 -2
  22. package/dist/ExternalStore-BAz83PVq.d.cts +60 -0
  23. package/dist/ExternalStore-BYWPbYs8.d.ts +60 -0
  24. package/dist/ExternalStore.cjs +746 -0
  25. package/dist/ExternalStore.cjs.map +1 -0
  26. package/dist/ExternalStore.d.cts +4 -0
  27. package/dist/ExternalStore.d.ts +4 -0
  28. package/dist/ExternalStore.js +19 -0
  29. package/dist/ExternalStore.js.map +1 -0
  30. package/dist/{Flow-1fZT8MpX.d.cts → Flow-BlSoMmhV.d.cts} +2 -2
  31. package/dist/{Flow-BhpjE22E.d.ts → Flow-CQSGve5c.d.ts} +2 -2
  32. package/dist/Flow.cjs +2 -2
  33. package/dist/Flow.cjs.map +1 -1
  34. package/dist/Flow.d.cts +4 -4
  35. package/dist/Flow.d.ts +4 -4
  36. package/dist/Flow.js +7 -8
  37. package/dist/{Handle-D_cLW1Z3.d.ts → Handle-B7PSmsrY.d.ts} +1 -1
  38. package/dist/{Handle-D8D1zPb_.d.cts → Handle-ByovhL-c.d.cts} +1 -1
  39. package/dist/Handle.d.cts +3 -3
  40. package/dist/Handle.d.ts +3 -3
  41. package/dist/{Kernel-CnGE1Fyk.d.ts → Kernel-DGSpS4GM.d.ts} +2 -2
  42. package/dist/{Kernel-8kC-jOda.d.cts → Kernel-DZAk-Mrn.d.cts} +2 -2
  43. package/dist/Kernel.cjs +680 -22
  44. package/dist/Kernel.cjs.map +1 -1
  45. package/dist/Kernel.d.cts +10 -8
  46. package/dist/Kernel.d.ts +10 -8
  47. package/dist/Kernel.js +7 -4
  48. package/dist/{Link-Db7975nU.d.ts → Link-Cm4eR9n0.d.ts} +10 -3
  49. package/dist/{Link-fX8x1eCK.d.cts → Link-DF8i8iWR.d.cts} +10 -3
  50. package/dist/Link.cjs +1128 -86
  51. package/dist/Link.cjs.map +1 -1
  52. package/dist/Link.d.cts +3 -3
  53. package/dist/Link.d.ts +3 -3
  54. package/dist/Link.js +30 -25
  55. package/dist/{Logic-DRh4sDZj.d.cts → Logic-BcQA0AvE.d.cts} +1 -1
  56. package/dist/{Logic-BRjEMr-W.d.ts → Logic-OotSE1xw.d.ts} +1 -1
  57. package/dist/Logic.d.cts +3 -3
  58. package/dist/Logic.d.ts +3 -3
  59. package/dist/{MatchBuilder-CJk5oCkR.d.cts → MatchBuilder-BNDJ8waF.d.ts} +1 -1
  60. package/dist/{MatchBuilder-0QOc-nlU.d.ts → MatchBuilder-CvZ5WY1B.d.cts} +1 -1
  61. package/dist/MatchBuilder.d.cts +4 -4
  62. package/dist/MatchBuilder.d.ts +4 -4
  63. package/dist/Middleware-D8tUDLv_.d.cts +100 -0
  64. package/dist/Middleware-DS7CbTTN.d.ts +100 -0
  65. package/dist/Middleware.cjs +461 -13
  66. package/dist/Middleware.cjs.map +1 -1
  67. package/dist/Middleware.d.cts +2 -86
  68. package/dist/Middleware.d.ts +2 -86
  69. package/dist/Middleware.js +13 -11
  70. package/dist/{Module-DnzluX2J.d.ts → Module-CFj0I2yE.d.ts} +45 -18
  71. package/dist/{Module-B_0xRDMR.d.cts → Module-DpXPW9EQ.d.cts} +45 -18
  72. package/dist/Module.cjs +8583 -5741
  73. package/dist/Module.cjs.map +1 -1
  74. package/dist/Module.d.cts +5 -4
  75. package/dist/Module.d.ts +5 -4
  76. package/dist/Module.js +32 -27
  77. package/dist/ModuleTag-BcVF6z7B.d.ts +113 -0
  78. package/dist/ModuleTag-DuZXo_NS.d.cts +113 -0
  79. package/dist/ModuleTag.cjs +2609 -1232
  80. package/dist/ModuleTag.cjs.map +1 -1
  81. package/dist/ModuleTag.d.cts +4 -4
  82. package/dist/ModuleTag.d.ts +4 -4
  83. package/dist/ModuleTag.js +28 -25
  84. package/dist/{Observability-cY4kLn0S.d.ts → Observability-D-ZWeEVb.d.ts} +22 -15
  85. package/dist/{Observability-COqEvp2C.d.cts → Observability-V7sRMYTh.d.cts} +22 -15
  86. package/dist/Observability.cjs +1938 -640
  87. package/dist/Observability.cjs.map +1 -1
  88. package/dist/Observability.d.cts +4 -4
  89. package/dist/Observability.d.ts +4 -4
  90. package/dist/Observability.js +21 -19
  91. package/dist/{Process-mL8fHDSB.d.cts → Process-B55aJMFk.d.cts} +29 -4
  92. package/dist/{Process-CM9xbMdP.d.ts → Process-DvhFEwUS.d.ts} +29 -4
  93. package/dist/Process.cjs +1122 -85
  94. package/dist/Process.cjs.map +1 -1
  95. package/dist/Process.d.cts +4 -3
  96. package/dist/Process.d.ts +4 -3
  97. package/dist/Process.js +27 -22
  98. package/dist/{ReadQuery-BlMwhe-F.d.ts → ReadQuery-C4vZ8Prc.d.ts} +2 -2
  99. package/dist/{ReadQuery-SinbStGF.d.ts → ReadQuery-CafjlJQo.d.cts} +1 -1
  100. package/dist/{ReadQuery-SinbStGF.d.cts → ReadQuery-CafjlJQo.d.ts} +1 -1
  101. package/dist/{ReadQuery-CL5XlXts.d.cts → ReadQuery-mc0NgrFV.d.cts} +2 -2
  102. package/dist/ReadQuery.cjs +3 -3
  103. package/dist/ReadQuery.cjs.map +1 -1
  104. package/dist/ReadQuery.d.cts +2 -2
  105. package/dist/ReadQuery.d.ts +2 -2
  106. package/dist/ReadQuery.js +3 -3
  107. package/dist/{Reflection-CQnKwPXj.d.ts → Reflection-C8xZ267q.d.ts} +88 -7
  108. package/dist/{Reflection-Kabo1mlU.d.cts → Reflection-DP7Vsv3f.d.cts} +88 -7
  109. package/dist/Reflection.cjs +2934 -1553
  110. package/dist/Reflection.cjs.map +1 -1
  111. package/dist/Reflection.d.cts +14 -11
  112. package/dist/Reflection.d.ts +14 -11
  113. package/dist/Reflection.js +26 -21
  114. package/dist/Resource.cjs +670 -12
  115. package/dist/Resource.cjs.map +1 -1
  116. package/dist/Resource.js +6 -3
  117. package/dist/Root.cjs +675 -17
  118. package/dist/Root.cjs.map +1 -1
  119. package/dist/Root.js +7 -3
  120. package/dist/{Runtime-CtyzZG4i.d.ts → Runtime-BWc9YfUB.d.ts} +37 -7
  121. package/dist/{Runtime-B-aL-f29.d.cts → Runtime-PShIC4DW.d.cts} +37 -7
  122. package/dist/Runtime.cjs +1899 -809
  123. package/dist/Runtime.cjs.map +1 -1
  124. package/dist/Runtime.d.cts +14 -11
  125. package/dist/Runtime.d.ts +14 -11
  126. package/dist/Runtime.js +33 -28
  127. package/dist/ScopeRegistry.cjs +668 -10
  128. package/dist/ScopeRegistry.cjs.map +1 -1
  129. package/dist/ScopeRegistry.js +6 -3
  130. package/dist/{StateTrait-OWhbj12c.d.cts → StateTrait-CQsDlXJm.d.cts} +23 -6
  131. package/dist/{StateTrait-BGsZghTz.d.ts → StateTrait-YvJzVDKl.d.ts} +23 -6
  132. package/dist/StateTrait.cjs +1475 -370
  133. package/dist/StateTrait.cjs.map +1 -1
  134. package/dist/StateTrait.d.cts +7 -5
  135. package/dist/StateTrait.d.ts +7 -5
  136. package/dist/StateTrait.js +17 -14
  137. package/dist/{TraitLifecycle-LdIWmKlg.d.ts → TraitLifecycle-CjIBICAA.d.ts} +2 -2
  138. package/dist/{TraitLifecycle-CwV5WPFX.d.cts → TraitLifecycle-NmqGiXPC.d.cts} +2 -2
  139. package/dist/TraitLifecycle.cjs +489 -32
  140. package/dist/TraitLifecycle.cjs.map +1 -1
  141. package/dist/TraitLifecycle.d.cts +4 -4
  142. package/dist/TraitLifecycle.d.ts +4 -4
  143. package/dist/TraitLifecycle.js +7 -7
  144. package/dist/Workflow-BlFG_20_.d.cts +414 -0
  145. package/dist/Workflow-CW9S_aAP.d.ts +414 -0
  146. package/dist/Workflow.cjs +2977 -0
  147. package/dist/Workflow.cjs.map +1 -0
  148. package/dist/Workflow.d.cts +7 -0
  149. package/dist/Workflow.d.ts +7 -0
  150. package/dist/Workflow.js +55 -0
  151. package/dist/Workflow.js.map +1 -0
  152. package/dist/{chunk-G5ZBFPNU.js → chunk-2A4UKO2D.js} +2 -2
  153. package/dist/chunk-2DE6D42I.js +248 -0
  154. package/dist/chunk-2DE6D42I.js.map +1 -0
  155. package/dist/{chunk-ANLBCBDC.js → chunk-2DVLMSOE.js} +6 -6
  156. package/dist/{chunk-BE3HW4FY.js → chunk-34CF6OGE.js} +14 -16
  157. package/dist/chunk-34CF6OGE.js.map +1 -0
  158. package/dist/{chunk-ZFY7U2FR.js → chunk-3LPIXG56.js} +43 -3
  159. package/dist/chunk-3LPIXG56.js.map +1 -0
  160. package/dist/chunk-3VZYDNXZ.js +10 -0
  161. package/dist/chunk-3VZYDNXZ.js.map +1 -0
  162. package/dist/{chunk-3TMODYZV.js → chunk-3XO4HR6V.js} +2 -2
  163. package/dist/chunk-46FGVWRF.js +817 -0
  164. package/dist/chunk-46FGVWRF.js.map +1 -0
  165. package/dist/chunk-4LODUXFI.js +288 -0
  166. package/dist/chunk-4LODUXFI.js.map +1 -0
  167. package/dist/{chunk-GMPEOUP2.js → chunk-4MZ7BT3R.js} +2 -2
  168. package/dist/chunk-4MZ7BT3R.js.map +1 -0
  169. package/dist/{chunk-TKZ7MEIA.js → chunk-53GVPGSM.js} +2 -2
  170. package/dist/{chunk-KP7MUZNX.js → chunk-5W2V2NVJ.js} +2 -2
  171. package/dist/chunk-5W2V2NVJ.js.map +1 -0
  172. package/dist/chunk-6DACKW3D.js +613 -0
  173. package/dist/chunk-6DACKW3D.js.map +1 -0
  174. package/dist/chunk-AQ7L2QZ5.js +1395 -0
  175. package/dist/chunk-AQ7L2QZ5.js.map +1 -0
  176. package/dist/{chunk-NZJKFF45.js → chunk-C2UZZQ76.js} +2 -2
  177. package/dist/chunk-CCKP5Z6F.js +701 -0
  178. package/dist/chunk-CCKP5Z6F.js.map +1 -0
  179. package/dist/chunk-CUKM2XUW.js +27 -0
  180. package/dist/{chunk-QCHIQWAJ.js.map → chunk-CUKM2XUW.js.map} +1 -1
  181. package/dist/{chunk-M2RGJPXX.js → chunk-DBD6Q6JH.js} +3 -3
  182. package/dist/{chunk-ZGDVUPTM.js → chunk-EB4RGQO3.js} +2 -2
  183. package/dist/{chunk-PAYXCY6A.js → chunk-G7ESIQTI.js} +12 -14
  184. package/dist/chunk-G7ESIQTI.js.map +1 -0
  185. package/dist/chunk-GPBAZQ23.js +348 -0
  186. package/dist/chunk-GPBAZQ23.js.map +1 -0
  187. package/dist/{chunk-OFADUJWJ.js → chunk-I4LCE5OY.js} +3 -5
  188. package/dist/{chunk-OFADUJWJ.js.map → chunk-I4LCE5OY.js.map} +1 -1
  189. package/dist/{chunk-DFNM3WX2.js → chunk-IMCC6TBN.js} +158 -39
  190. package/dist/chunk-IMCC6TBN.js.map +1 -0
  191. package/dist/{chunk-76WT3HOR.js → chunk-IROZNQAF.js} +22 -21
  192. package/dist/chunk-IROZNQAF.js.map +1 -0
  193. package/dist/{chunk-TAAPQVZN.js → chunk-ISKNULNH.js} +2 -2
  194. package/dist/chunk-J3CWXIPV.js +242 -0
  195. package/dist/chunk-J3CWXIPV.js.map +1 -0
  196. package/dist/{chunk-PYOE4VSI.js → chunk-JBKYRTCS.js} +224 -161
  197. package/dist/chunk-JBKYRTCS.js.map +1 -0
  198. package/dist/{chunk-66ALHVEX.js → chunk-KKIAYH4X.js} +3 -3
  199. package/dist/{chunk-3RMKLXHX.js → chunk-KLDVG3SY.js} +2 -2
  200. package/dist/{chunk-BABLDP24.js → chunk-KSZQYSEH.js} +3 -3
  201. package/dist/chunk-KSZQYSEH.js.map +1 -0
  202. package/dist/{chunk-CW6T36TN.js → chunk-M3M7JFAH.js} +4 -4
  203. package/dist/chunk-M3M7JFAH.js.map +1 -0
  204. package/dist/{chunk-THATMZXD.js → chunk-MLB253V2.js} +2 -2
  205. package/dist/{chunk-THATMZXD.js.map → chunk-MLB253V2.js.map} +1 -1
  206. package/dist/{chunk-JGIWG6SR.js → chunk-MS77U77X.js} +664 -550
  207. package/dist/chunk-MS77U77X.js.map +1 -0
  208. package/dist/chunk-MW4FA3MW.js +23 -0
  209. package/dist/chunk-MW4FA3MW.js.map +1 -0
  210. package/dist/chunk-MYKNINNN.js +228 -0
  211. package/dist/chunk-MYKNINNN.js.map +1 -0
  212. package/dist/{chunk-4CQAV7YB.js → chunk-O6TTQXTY.js} +2 -2
  213. package/dist/{chunk-NBD3KUOZ.js → chunk-OJDJ4VDQ.js} +35 -24
  214. package/dist/chunk-OJDJ4VDQ.js.map +1 -0
  215. package/dist/{chunk-NQZ2OSGR.js → chunk-PVZEMNJY.js} +9 -9
  216. package/dist/chunk-PVZEMNJY.js.map +1 -0
  217. package/dist/chunk-RN26DV2M.js +271 -0
  218. package/dist/chunk-RN26DV2M.js.map +1 -0
  219. package/dist/{chunk-JCXGZRMU.js → chunk-RQQW3IQC.js} +3 -3
  220. package/dist/chunk-RQQW3IQC.js.map +1 -0
  221. package/dist/{chunk-24VULZ7A.js → chunk-TKOGZDD6.js} +3 -3
  222. package/dist/{chunk-EGK3KN7B.js → chunk-TQYLVXGY.js} +70 -39
  223. package/dist/chunk-TQYLVXGY.js.map +1 -0
  224. package/dist/{chunk-QMM6O4CD.js → chunk-UACD2CL2.js} +15 -3
  225. package/dist/{chunk-QMM6O4CD.js.map → chunk-UACD2CL2.js.map} +1 -1
  226. package/dist/{chunk-M3WTHJHJ.js → chunk-VH575UTV.js} +30 -34
  227. package/dist/chunk-VH575UTV.js.map +1 -0
  228. package/dist/{chunk-AUIR5O6W.js → chunk-WWBMC24F.js} +9 -15
  229. package/dist/chunk-WWBMC24F.js.map +1 -0
  230. package/dist/{chunk-JWOYLO27.js → chunk-WYJUJV4L.js} +80 -7
  231. package/dist/chunk-WYJUJV4L.js.map +1 -0
  232. package/dist/{chunk-EY4NZKDR.js → chunk-XFMMPYNU.js} +2 -2
  233. package/dist/chunk-Y4VRBIS6.js +35 -0
  234. package/dist/chunk-Y4VRBIS6.js.map +1 -0
  235. package/dist/{chunk-DMBALCE2.js → chunk-ZC7MSQ5U.js} +77 -4
  236. package/dist/chunk-ZC7MSQ5U.js.map +1 -0
  237. package/dist/{chunk-OGWBVHB3.js → chunk-ZCK6SCOE.js} +67 -8
  238. package/dist/chunk-ZCK6SCOE.js.map +1 -0
  239. package/dist/{chunk-IHVBV5C2.js → chunk-ZTFTABXV.js} +2 -1
  240. package/dist/chunk-ZTFTABXV.js.map +1 -0
  241. package/dist/index.cjs +9532 -5017
  242. package/dist/index.cjs.map +1 -1
  243. package/dist/index.d.cts +163 -27
  244. package/dist/index.d.ts +163 -27
  245. package/dist/index.js +119 -56
  246. package/dist/index.js.map +1 -1
  247. package/dist/{ir-BMP7yxJJ.d.cts → ir-C-Zm_GlZ.d.cts} +1 -1
  248. package/dist/{ir-DUOz6H-5.d.ts → ir-DGyGiwVe.d.ts} +1 -1
  249. package/dist/{module-k7m3txak.d.ts → module-DqQ1U-Me.d.ts} +129 -100
  250. package/dist/{module-B8CBqIZ_.d.cts → module-doenaCsZ.d.cts} +129 -100
  251. package/package.json +12 -1
  252. package/dist/ModuleTag-C8FHY_sY.d.ts +0 -93
  253. package/dist/ModuleTag-EGbgBMpZ.d.cts +0 -93
  254. package/dist/chunk-3QMIVH35.js +0 -43
  255. package/dist/chunk-3QMIVH35.js.map +0 -1
  256. package/dist/chunk-76WT3HOR.js.map +0 -1
  257. package/dist/chunk-AUIR5O6W.js.map +0 -1
  258. package/dist/chunk-BABLDP24.js.map +0 -1
  259. package/dist/chunk-BE3HW4FY.js.map +0 -1
  260. package/dist/chunk-CW6T36TN.js.map +0 -1
  261. package/dist/chunk-DFNM3WX2.js.map +0 -1
  262. package/dist/chunk-DMBALCE2.js.map +0 -1
  263. package/dist/chunk-EGK3KN7B.js.map +0 -1
  264. package/dist/chunk-GMPEOUP2.js.map +0 -1
  265. package/dist/chunk-IHVBV5C2.js.map +0 -1
  266. package/dist/chunk-JCXGZRMU.js.map +0 -1
  267. package/dist/chunk-JGIWG6SR.js.map +0 -1
  268. package/dist/chunk-JWOYLO27.js.map +0 -1
  269. package/dist/chunk-KIXAU3GM.js +0 -137
  270. package/dist/chunk-KIXAU3GM.js.map +0 -1
  271. package/dist/chunk-KP7MUZNX.js.map +0 -1
  272. package/dist/chunk-M3WTHJHJ.js.map +0 -1
  273. package/dist/chunk-M7IYCTJV.js +0 -79
  274. package/dist/chunk-M7IYCTJV.js.map +0 -1
  275. package/dist/chunk-NBD3KUOZ.js.map +0 -1
  276. package/dist/chunk-NQZ2OSGR.js.map +0 -1
  277. package/dist/chunk-OGWBVHB3.js.map +0 -1
  278. package/dist/chunk-PAYXCY6A.js.map +0 -1
  279. package/dist/chunk-PYOE4VSI.js.map +0 -1
  280. package/dist/chunk-QCHIQWAJ.js +0 -21
  281. package/dist/chunk-VZB726PE.js +0 -93
  282. package/dist/chunk-VZB726PE.js.map +0 -1
  283. package/dist/chunk-W3TEWHLO.js +0 -568
  284. package/dist/chunk-W3TEWHLO.js.map +0 -1
  285. package/dist/chunk-ZFLHVFUC.js +0 -192
  286. package/dist/chunk-ZFLHVFUC.js.map +0 -1
  287. package/dist/chunk-ZFY7U2FR.js.map +0 -1
  288. /package/dist/{chunk-G5ZBFPNU.js.map → chunk-2A4UKO2D.js.map} +0 -0
  289. /package/dist/{chunk-ANLBCBDC.js.map → chunk-2DVLMSOE.js.map} +0 -0
  290. /package/dist/{chunk-3TMODYZV.js.map → chunk-3XO4HR6V.js.map} +0 -0
  291. /package/dist/{chunk-TKZ7MEIA.js.map → chunk-53GVPGSM.js.map} +0 -0
  292. /package/dist/{chunk-NZJKFF45.js.map → chunk-C2UZZQ76.js.map} +0 -0
  293. /package/dist/{chunk-M2RGJPXX.js.map → chunk-DBD6Q6JH.js.map} +0 -0
  294. /package/dist/{chunk-ZGDVUPTM.js.map → chunk-EB4RGQO3.js.map} +0 -0
  295. /package/dist/{chunk-TAAPQVZN.js.map → chunk-ISKNULNH.js.map} +0 -0
  296. /package/dist/{chunk-66ALHVEX.js.map → chunk-KKIAYH4X.js.map} +0 -0
  297. /package/dist/{chunk-3RMKLXHX.js.map → chunk-KLDVG3SY.js.map} +0 -0
  298. /package/dist/{chunk-4CQAV7YB.js.map → chunk-O6TTQXTY.js.map} +0 -0
  299. /package/dist/{chunk-24VULZ7A.js.map → chunk-TKOGZDD6.js.map} +0 -0
  300. /package/dist/{chunk-EY4NZKDR.js.map → chunk-XFMMPYNU.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Workflow.ts","../src/internal/serviceId.ts","../src/internal/digest.ts","../src/internal/observability/jsonValue.ts","../src/internal/workflow/errors.ts","../src/internal/workflow/inputExpr.ts","../src/internal/workflow/compiler.ts","../src/internal/runtime/core/WorkflowRuntime.ts","../src/internal/runtime/core/EffectOpCore.ts","../src/internal/runtime/core/DebugSink.record.ts","../src/internal/runtime/core/errorSummary.ts","../src/internal/runtime/core/LogicUnitMeta.ts","../src/internal/runtime/core/env.ts","../src/internal/runtime/core/HostScheduler.ts","../src/internal/runtime/core/RuntimeStore.ts","../src/internal/runtime/core/TickScheduler.ts","../src/internal/runtime/core/DevtoolsHub.ts","../src/internal/runtime/core/TaskRunner.ts","../src/internal/runtime/core/DeclarativeLinkRuntime.ts","../src/internal/runtime/core/TxnOriginOverride.ts","../src/internal/runtime/core/runtimeInternalsAccessor.ts","../src/internal/runtime/core/RootContext.ts","../src/internal/effect-op.ts","../src/internal/observability/runSession.ts"],"sourcesContent":["import { Context } from 'effect'\nimport type { JsonValue } from './internal/observability/jsonValue.js'\nimport { fromTag as serviceIdFromTag } from './internal/serviceId.js'\nimport { makeWorkflowError } from './internal/workflow/errors.js'\nimport type { AnyModuleShape, ModuleLogic, ModuleTag } from './internal/module.js'\nimport type {\n InputExprV1,\n WorkflowComposeResultV1,\n WorkflowDefV1,\n WorkflowFragmentV1,\n WorkflowPartV1,\n WorkflowPolicyV1,\n WorkflowStaticIrV1,\n WorkflowStepV1,\n WorkflowTriggerV1,\n} from './internal/workflow/model.js'\nimport { compileWorkflowStaticIrV1, normalizeWorkflowDefV1, validateWorkflowDefV1 } from './internal/workflow/compiler.js'\nimport * as WorkflowRuntime from './internal/runtime/core/WorkflowRuntime.js'\n\nexport type ActionTagsOfModule<M> = M extends { readonly actions: infer A } ? Extract<keyof A, string> : string\n\nexport type WorkflowTrigger<ActionTag extends string = string> =\n | { readonly kind: 'action'; readonly actionTag: ActionTag }\n | { readonly kind: 'lifecycle'; readonly phase: 'onStart' | 'onInit' }\n\nexport type WorkflowPolicy = WorkflowPolicyV1\n\nexport type WorkflowStep<ActionTag extends string = string> =\n | { readonly kind: 'dispatch'; readonly key: string; readonly actionTag: ActionTag; readonly payload?: InputExprV1 }\n | { readonly kind: 'delay'; readonly key: string; readonly ms: number }\n | {\n readonly kind: 'call'\n readonly key: string\n readonly serviceId: string\n readonly input?: InputExprV1\n readonly timeoutMs?: number\n readonly retry?: { readonly times: number }\n readonly onSuccess: ReadonlyArray<WorkflowStep<ActionTag>>\n readonly onFailure: ReadonlyArray<WorkflowStep<ActionTag>>\n }\n\nexport type WorkflowDef<ActionTag extends string = string> = {\n readonly astVersion: 1\n readonly localId: string\n readonly trigger: WorkflowTrigger<ActionTag>\n readonly policy?: WorkflowPolicyV1\n readonly steps: ReadonlyArray<WorkflowStep<ActionTag>>\n readonly sources?: WorkflowDefV1['sources']\n readonly meta?: { readonly generator?: JsonValue }\n}\n\nexport type WorkflowStaticIr = WorkflowStaticIrV1\nexport type InputExpr = InputExprV1\n\nexport type WorkflowFragment<ActionTag extends string = string> = {\n readonly fragmentId: string\n readonly steps: ReadonlyArray<WorkflowStep<ActionTag>>\n readonly sources?: WorkflowDefV1['sources']\n readonly policy?: WorkflowPolicyV1\n}\n\nexport type WorkflowComposeResult<ActionTag extends string = string> = {\n readonly steps: ReadonlyArray<WorkflowStep<ActionTag>>\n readonly sources?: WorkflowDefV1['sources']\n readonly policy?: WorkflowPolicyV1\n}\n\nexport type WorkflowPart<ActionTag extends string = string> =\n | ReadonlyArray<WorkflowStep<ActionTag>>\n | WorkflowFragment<ActionTag>\n | WorkflowComposeResult<ActionTag>\n\nclass KernelSourceRefreshPortTagImpl extends Context.Tag('logix/kernel/sourceRefresh')<\n KernelSourceRefreshPortTagImpl,\n unknown\n>() {}\n\nexport const KernelPorts = {\n sourceRefresh: KernelSourceRefreshPortTagImpl,\n} as const\n\nexport const forModule = <M extends { readonly actions: Record<string, unknown> }>(_module: M) => {\n type ActionTag = ActionTagsOfModule<M>\n\n return {\n onAction: (actionTag: ActionTag) => onAction(actionTag),\n onStart,\n onInit,\n payload,\n payloadPath,\n constValue,\n object,\n merge,\n dispatch: (args: { readonly key: string; readonly actionTag: ActionTag; readonly payload?: InputExpr }) => dispatch(args),\n delay,\n callById: (args: {\n readonly key: string\n readonly serviceId: string\n readonly input?: InputExpr\n readonly timeoutMs?: number\n readonly retry?: { readonly times: number }\n readonly onSuccess?: ReadonlyArray<WorkflowStep<ActionTag>>\n readonly onFailure?: ReadonlyArray<WorkflowStep<ActionTag>>\n }) => callById<ActionTag>(args),\n call: <Id, Svc>(args: {\n readonly key: string\n readonly service: Context.Tag<Id, Svc>\n readonly input?: InputExpr\n readonly timeoutMs?: number\n readonly retry?: { readonly times: number }\n readonly onSuccess?: ReadonlyArray<WorkflowStep<ActionTag>>\n readonly onFailure?: ReadonlyArray<WorkflowStep<ActionTag>>\n }) => call(args),\n fragment: (fragmentId: string, steps: ReadonlyArray<WorkflowStep<ActionTag>>) => fragment<ActionTag>(fragmentId, steps),\n withPolicy: (patch: WithPolicyPatch, part: WorkflowPart<ActionTag>) => withPolicy<ActionTag>(patch, part),\n compose: (...parts: ReadonlyArray<WorkflowPart<ActionTag>>) => compose<ActionTag>(...parts),\n make: (input: {\n readonly astVersion?: 1\n readonly localId: string\n readonly trigger: WorkflowTrigger<ActionTag>\n readonly policy?: WorkflowPolicy\n readonly steps: WorkflowStepsInput<ActionTag>\n readonly meta?: { readonly generator?: JsonValue }\n }) => make<M>(input),\n fromJSON: (def: WorkflowDef<ActionTag>) => fromJSON<ActionTag>(def),\n } as const\n}\n\nexport type WithPolicyPatch = {\n readonly concurrency?: WorkflowPolicyV1['concurrency']\n readonly priority?: WorkflowPolicyV1['priority']\n /** Default for call.timeoutMs (only fills when step.timeoutMs is missing). */\n readonly timeoutMs?: number\n /** Default for call.retry.times (only fills when step.retry is missing). */\n readonly retry?: { readonly times: number }\n}\n\nexport type WorkflowStepsInput<ActionTag extends string = string> =\n | ReadonlyArray<WorkflowStep<ActionTag>>\n | (WorkflowComposeResult<ActionTag> & {\n readonly steps: ReadonlyArray<WorkflowStep<ActionTag>>\n })\n\nexport interface Workflow {\n readonly _tag: 'Workflow'\n readonly def: WorkflowDefV1\n readonly toJSON: () => WorkflowDefV1\n readonly validate: () => void\n readonly exportStaticIr: (moduleId: string) => WorkflowStaticIrV1\n readonly install: (moduleTag: ModuleTag<string, AnyModuleShape>) => ModuleLogic<AnyModuleShape, unknown, never>\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isReadonlyArray = (value: unknown): value is ReadonlyArray<unknown> => Array.isArray(value)\n\nconst asNonEmptyString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined\n\nconst mergePolicy = (base: WorkflowPolicyV1 | undefined, patch: WorkflowPolicyV1 | undefined): WorkflowPolicyV1 | undefined => {\n if (!base && !patch) return undefined\n return {\n ...(base ?? {}),\n ...(patch ?? {}),\n }\n}\n\nconst applyCallDefaults = (steps: ReadonlyArray<WorkflowStepV1>, patch: WithPolicyPatch): ReadonlyArray<WorkflowStepV1> => {\n const timeoutMsDefault = patch.timeoutMs\n const retryDefault = patch.retry\n\n const visit = (step: WorkflowStepV1): WorkflowStepV1 => {\n if (step.kind !== 'call') return step\n\n let changed = false\n const timeoutMs = step.timeoutMs ?? timeoutMsDefault\n if (timeoutMs !== step.timeoutMs) changed = true\n\n const retry = step.retry ?? retryDefault\n if (retry !== step.retry) changed = true\n\n const onSuccess = step.onSuccess.map(visit)\n const onFailure = step.onFailure.map(visit)\n if (onSuccess !== step.onSuccess) changed = true\n if (onFailure !== step.onFailure) changed = true\n\n if (!changed) return step\n\n return {\n ...step,\n ...(timeoutMs !== undefined ? { timeoutMs } : null),\n ...(retry !== undefined ? { retry } : null),\n onSuccess,\n onFailure,\n }\n }\n\n return steps.map(visit)\n}\n\nconst resolveStepsInput = (input: unknown): WorkflowComposeResultV1 => {\n if (Array.isArray(input)) {\n return { steps: input as ReadonlyArray<WorkflowStepV1> }\n }\n if (isRecord(input) && Array.isArray(input.steps)) {\n return input as WorkflowComposeResultV1\n }\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_DEF',\n message: 'Workflow.make: \"steps\" must be an array or a { steps, sources?, policy? } object.',\n detail: { steps: input },\n })\n}\n\nconst recordSourcesForFragment = (\n sources: Record<string, { readonly fragmentId?: string }>,\n fragmentId: string,\n step: WorkflowStepV1,\n): void => {\n sources[step.key] = { fragmentId }\n if (step.kind !== 'call') return\n for (const inner of step.onSuccess) recordSourcesForFragment(sources, fragmentId, inner)\n for (const inner of step.onFailure) recordSourcesForFragment(sources, fragmentId, inner)\n}\n\nexport const onAction = <ActionTag extends string>(actionTag: ActionTag): Extract<WorkflowTrigger<ActionTag>, { kind: 'action' }> => ({\n kind: 'action',\n actionTag,\n})\n\nexport const onStart = (): { readonly kind: 'lifecycle'; readonly phase: 'onStart' } => ({\n kind: 'lifecycle',\n phase: 'onStart',\n})\n\nexport const onInit = (): { readonly kind: 'lifecycle'; readonly phase: 'onInit' } => ({\n kind: 'lifecycle',\n phase: 'onInit',\n})\n\nexport const payload = (): InputExprV1 => ({ kind: 'payload' })\n\nexport const payloadPath = (pointer: string): InputExprV1 => ({ kind: 'payload.path', pointer })\n\nexport const constValue = (value: JsonValue): InputExprV1 => ({ kind: 'const', value })\n\nexport const object = (fields: Record<string, InputExprV1>): InputExprV1 => ({ kind: 'object', fields })\n\nexport const merge = (items: ReadonlyArray<InputExprV1>): InputExprV1 => ({ kind: 'merge', items })\n\nexport const dispatch = <ActionTag extends string>(args: {\n readonly key: string\n readonly actionTag: ActionTag\n readonly payload?: InputExprV1\n}): Extract<WorkflowStep<ActionTag>, { kind: 'dispatch' }> => ({\n kind: 'dispatch',\n key: args.key,\n actionTag: args.actionTag,\n ...(args.payload ? { payload: args.payload } : null),\n})\n\nexport const delay = (args: { readonly key: string; readonly ms: number }): Extract<WorkflowStep, { kind: 'delay' }> => ({\n kind: 'delay',\n key: args.key,\n ms: args.ms,\n})\n\nexport const callById = <ActionTag extends string = never>(args: {\n readonly key: string\n readonly serviceId: string\n readonly input?: InputExprV1\n readonly timeoutMs?: number\n readonly retry?: { readonly times: number }\n readonly onSuccess?: ReadonlyArray<WorkflowStep<ActionTag>>\n readonly onFailure?: ReadonlyArray<WorkflowStep<ActionTag>>\n}): Extract<WorkflowStep<ActionTag>, { kind: 'call' }> => ({\n kind: 'call',\n key: args.key,\n serviceId: args.serviceId,\n ...(args.input ? { input: args.input } : null),\n ...(args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : null),\n ...(args.retry ? { retry: args.retry } : null),\n onSuccess: args.onSuccess ?? [],\n onFailure: args.onFailure ?? [],\n})\n\nexport const call = <Id, Svc, ActionTag extends string = never>(args: {\n readonly key: string\n readonly service: Context.Tag<Id, Svc>\n readonly input?: InputExprV1\n readonly timeoutMs?: number\n readonly retry?: { readonly times: number }\n readonly onSuccess?: ReadonlyArray<WorkflowStep<ActionTag>>\n readonly onFailure?: ReadonlyArray<WorkflowStep<ActionTag>>\n}): Extract<WorkflowStep<ActionTag>, { kind: 'call' }> => {\n const serviceId = serviceIdFromTag(args.service)\n if (!serviceId) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_SERVICE_ID',\n message: 'call(service): serviceId derived from tag must be a non-empty string (see 078 ServiceId contract).',\n detail: { tag: String(args.service) },\n })\n }\n\n return callById<ActionTag>({\n ...args,\n serviceId,\n })\n}\n\nexport const fragment = <ActionTag extends string = never>(\n fragmentId: string,\n steps: ReadonlyArray<WorkflowStep<ActionTag>>,\n): WorkflowFragment<ActionTag> => ({\n fragmentId,\n steps,\n})\n\nexport const withPolicy = <ActionTag extends string = never>(\n patch: WithPolicyPatch,\n part: WorkflowPart<ActionTag>,\n): WorkflowComposeResult<ActionTag> => {\n let normalized: WorkflowComposeResult<ActionTag>\n if (isReadonlyArray(part)) {\n normalized = { steps: part }\n } else {\n const partUnknown: unknown = part\n if (!isRecord(partUnknown) || !isReadonlyArray(partUnknown.steps)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_DEF',\n message: 'withPolicy: invalid workflow part (expected steps[] / fragment / composeResult).',\n detail: { part },\n })\n }\n normalized = {\n steps: part.steps,\n ...(part.sources ? { sources: part.sources } : null),\n ...(part.policy ? { policy: part.policy } : null),\n }\n }\n\n const steps = applyCallDefaults(normalized.steps as ReadonlyArray<WorkflowStepV1>, patch) as ReadonlyArray<WorkflowStep<ActionTag>>\n const patchPolicy: WorkflowPolicyV1 | undefined = (() => {\n const concurrency = patch.concurrency\n const priority = patch.priority\n return concurrency !== undefined || priority !== undefined ? { concurrency, priority } : undefined\n })()\n\n // Outer withPolicy is weaker than inner (nested) policies: only fill missing program policy fields.\n const nextPolicy = mergePolicy(patchPolicy, normalized.policy)\n\n return {\n steps,\n ...(normalized.sources ? { sources: normalized.sources } : null),\n ...(nextPolicy ? { policy: nextPolicy } : null),\n }\n}\n\nexport const compose = <ActionTag extends string = never>(\n ...parts: ReadonlyArray<WorkflowPart<ActionTag>>\n): WorkflowComposeResult<ActionTag> => {\n const steps: Array<WorkflowStep<ActionTag>> = []\n const sources: Record<string, { readonly fragmentId?: string }> = {}\n let policy: WorkflowPolicyV1 | undefined = undefined\n\n const ownersByKey = new Map<string, Array<{ readonly stepKey: string; readonly fragmentId?: string }>>()\n\n const recordOwner = (stepKey: string, fragmentId: string | undefined) => {\n const list = ownersByKey.get(stepKey) ?? []\n list.push({ stepKey, ...(fragmentId ? { fragmentId } : null) })\n ownersByKey.set(stepKey, list)\n }\n\n const recordOwners = (\n step: WorkflowStep<ActionTag>,\n resolveFragmentId: (stepKey: string) => string | undefined,\n ): void => {\n recordOwner(step.key, resolveFragmentId(step.key))\n if (step.kind !== 'call') return\n for (const inner of step.onSuccess) recordOwners(inner, resolveFragmentId)\n for (const inner of step.onFailure) recordOwners(inner, resolveFragmentId)\n }\n\n for (const part of parts) {\n if (isReadonlyArray(part)) {\n steps.push(...part)\n for (const step of part) recordOwners(step, () => undefined)\n continue\n }\n\n // fragment / composeResult (both carry `steps`)\n const partSteps = part.steps\n steps.push(...partSteps)\n\n const partSources = part.sources\n if (partSources && typeof partSources === 'object') {\n for (const k of Object.keys(partSources).sort()) {\n sources[k] = { ...partSources[k]! }\n }\n }\n\n const fragmentId = 'fragmentId' in part ? part.fragmentId : undefined\n if (typeof fragmentId === 'string' && fragmentId.length > 0) {\n for (const step of partSteps as ReadonlyArray<WorkflowStepV1>) {\n recordSourcesForFragment(sources, fragmentId, step)\n }\n }\n\n const resolveFragmentIdForPart = (stepKey: string): string | undefined => {\n if (typeof fragmentId === 'string' && fragmentId.length > 0) return fragmentId\n const fromSources = partSources?.[stepKey]?.fragmentId\n return typeof fromSources === 'string' && fromSources.length > 0 ? fromSources : undefined\n }\n for (const step of partSteps) recordOwners(step, resolveFragmentIdForPart)\n\n policy = mergePolicy(policy, part.policy)\n }\n\n const finalSources: WorkflowDefV1['sources'] | undefined = Object.keys(sources).length > 0 ? sources : undefined\n const duplicateKeys = Array.from(ownersByKey.entries())\n .filter(([, owners]) => owners.length > 1)\n .map(([k]) => k)\n .sort()\n if (duplicateKeys.length > 0) {\n const k = duplicateKeys[0]!\n throw makeWorkflowError({\n code: 'WORKFLOW_DUPLICATE_STEP_KEY',\n message: `Duplicate stepKey \"${k}\" detected during composition.`,\n source: { stepKey: k },\n detail: { duplicateKey: k, owners: ownersByKey.get(k) ?? [] },\n })\n }\n\n return {\n steps,\n ...(finalSources ? { sources: finalSources } : null),\n ...(policy ? { policy } : null),\n }\n}\n\nexport const make = <M = unknown>(input: {\n readonly astVersion?: 1\n readonly localId: string\n readonly trigger: WorkflowTrigger<ActionTagsOfModule<M>>\n readonly policy?: WorkflowPolicyV1\n readonly steps: WorkflowStepsInput<ActionTagsOfModule<M>>\n readonly meta?: { readonly generator?: JsonValue }\n}): Workflow => {\n const localId = asNonEmptyString(input.localId)\n if (!localId) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_DEF',\n message: 'Workflow.make: localId must be a non-empty string.',\n detail: { localId: input.localId },\n })\n }\n\n const stepsInput = resolveStepsInput(input.steps)\n const merged = mergePolicy(input.policy, stepsInput.policy)\n\n const def: WorkflowDefV1 = normalizeWorkflowDefV1({\n astVersion: 1,\n localId,\n trigger: input.trigger,\n ...(merged ? { policy: merged } : null),\n steps: stepsInput.steps,\n ...(stepsInput.sources ? { sources: stepsInput.sources } : null),\n ...(input.meta ? { meta: input.meta } : null),\n })\n\n const staticIrCache = new Map<string, WorkflowStaticIrV1>()\n\n return {\n _tag: 'Workflow',\n def,\n toJSON: () => def,\n validate: () => validateWorkflowDefV1(def),\n exportStaticIr: (moduleId) => {\n const cached = staticIrCache.get(moduleId)\n if (cached) return cached\n const ir = compileWorkflowStaticIrV1({ moduleId, def })\n staticIrCache.set(moduleId, ir)\n return ir\n },\n install: (moduleTag) =>\n WorkflowRuntime.installOne({\n moduleTag: moduleTag as unknown as Parameters<typeof WorkflowRuntime.installOne>[0]['moduleTag'],\n program: { _tag: 'Workflow', def },\n }),\n } satisfies Workflow\n}\n\nexport const fromJSON = <ActionTag extends string = string>(def: WorkflowDef<ActionTag>): Workflow =>\n make({\n localId: def.localId,\n trigger: def.trigger,\n ...(def.policy ? { policy: def.policy } : null),\n steps: {\n steps: def.steps,\n ...(def.sources ? { sources: def.sources } : null),\n },\n ...(def.meta ? { meta: def.meta } : null),\n })\n","import type { Context } from 'effect'\n\n/**\n * ServiceId contract (specs/078-module-service-manifest/contracts/service-id.md):\n * - Stable string derived from Context.Tag by priority: tag.key ?? tag.id ?? tag._id\n * - tag.toString() is forbidden as an identity source (diagnostics only).\n */\n\nexport type ServiceId = string\n\nconst asNonEmptyString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.length > 0 ? value : undefined\n\nexport const fromTag = (tag: Context.Tag<any, any>): ServiceId | undefined => {\n const anyTag = tag as any\n return asNonEmptyString(anyTag.key) ?? asNonEmptyString(anyTag.id) ?? asNonEmptyString(anyTag._id)\n}\n\nexport const requireFromTag = (tag: Context.Tag<any, any>, options?: { readonly hint?: string }): ServiceId => {\n const id = fromTag(tag)\n if (id) return id\n\n const hint =\n options?.hint ??\n 'Define the Tag with a stable string key, e.g. `class X extends Context.Tag(\"my-svc/x\")<X, Service>() {}`.'\n\n throw new Error(`[InvalidServiceId] Tag is missing a stable id (tag.key/tag.id/tag._id).\\n${hint}`)\n}\n","/**\n * internal/digest:\n * - Minimal \"stable digest\" utilities for Runtime / Static IR / Traits, etc.\n * - Goal: stable output across runs/processes while staying lightweight (no extra dependencies).\n *\n * Note: stableStringify does not aim for full JSON equivalence; it only covers the subset needed by this repo:\n * - Stable key ordering (object fields sorted lexicographically).\n * - Non-finite numbers (NaN/±Infinity) degrade to null.\n * - Other non-representable values (undefined/function/symbol, etc.) degrade to null.\n * - undefined inside objects is not omitted; it is encoded as null (differs from JSON.stringify).\n */\n\nexport const stableStringify = (value: unknown): string => {\n if (value === null) return 'null'\n const t = typeof value\n if (t === 'string') return JSON.stringify(value)\n if (t === 'number') return Number.isFinite(value) ? String(value) : 'null'\n if (t === 'boolean') return value ? 'true' : 'false'\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`\n }\n\n if (t === 'object') {\n const record = value as Record<string, unknown>\n const keys = Object.keys(record).sort()\n return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(record[k])}`).join(',')}}`\n }\n\n return 'null'\n}\n\n/**\n * fnv1a32:\n * - 32-bit FNV-1a hash (for short digests); outputs fixed 8-char hex.\n */\nexport const fnv1a32 = (input: string): string => {\n let hash = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i)\n hash = (hash * 0x01000193) >>> 0\n }\n return hash.toString(16).padStart(8, '0')\n}\n","export type JsonValue =\n | null\n | boolean\n | number\n | string\n | ReadonlyArray<JsonValue>\n | { readonly [key: string]: JsonValue }\n\nexport type DowngradeReason = 'non_serializable' | 'oversized' | 'unknown'\n\nexport const isJsonValue = (input: unknown): input is JsonValue => {\n const seen = new WeakSet<object>()\n\n const loop = (value: unknown, depth: number): value is JsonValue => {\n if (depth > 64) return false\n if (value === null) return true\n\n switch (typeof value) {\n case 'string':\n case 'boolean':\n return true\n case 'number':\n return Number.isFinite(value)\n case 'object': {\n if (Array.isArray(value)) {\n if (seen.has(value)) return false\n seen.add(value)\n for (const item of value) {\n if (!loop(item, depth + 1)) return false\n }\n return true\n }\n\n if (!isPlainRecord(value)) return false\n if (seen.has(value)) return false\n seen.add(value)\n\n for (const v of Object.values(value)) {\n if (!loop(v, depth + 1)) return false\n }\n\n return true\n }\n default:\n return false\n }\n }\n\n return loop(input, 0)\n}\n\nexport interface JsonValueProjectionStats {\n readonly dropped: number\n readonly oversized: number\n readonly nonSerializable: number\n}\n\nexport interface JsonValueProjection {\n readonly value: JsonValue\n readonly stats: JsonValueProjectionStats\n readonly downgrade?: DowngradeReason\n}\n\nexport interface JsonValueProjectOptions {\n readonly maxDepth?: number\n readonly maxObjectKeys?: number\n readonly maxArrayLength?: number\n readonly maxStringLength?: number\n readonly maxJsonBytes?: number\n readonly oversizedPreviewBytes?: number\n}\n\nconst defaultOptions: Required<JsonValueProjectOptions> = {\n maxDepth: 6,\n maxObjectKeys: 32,\n maxArrayLength: 32,\n maxStringLength: 256,\n maxJsonBytes: 4 * 1024,\n oversizedPreviewBytes: 256,\n}\n\nconst truncateString = (value: string, maxLen: number, stats: MutableStats): string => {\n if (value.length <= maxLen) return value\n stats.oversized += 1\n return value.slice(0, maxLen)\n}\n\ntype MutableStats = {\n dropped: number\n oversized: number\n nonSerializable: number\n}\n\nconst mergeDowngrade = (current: DowngradeReason | undefined, next: DowngradeReason): DowngradeReason => {\n if (!current) return next\n if (current === 'non_serializable' || next === 'non_serializable') return 'non_serializable'\n if (current === 'oversized' || next === 'oversized') return 'oversized'\n return 'unknown'\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\nconst asNumber = (value: number, stats: MutableStats): JsonValue => {\n if (Number.isFinite(value)) return value\n stats.nonSerializable += 1\n return String(value)\n}\n\nconst toJsonValueInternal = (\n input: unknown,\n options: Required<JsonValueProjectOptions>,\n stats: MutableStats,\n seen: WeakSet<object>,\n depth: number,\n): JsonValue => {\n if (input === null) return null\n\n switch (typeof input) {\n case 'string':\n return truncateString(input, options.maxStringLength, stats)\n case 'number':\n return asNumber(input, stats)\n case 'boolean':\n return input\n case 'bigint':\n stats.nonSerializable += 1\n return truncateString(input.toString(), options.maxStringLength, stats)\n case 'symbol':\n stats.nonSerializable += 1\n return truncateString(input.toString(), options.maxStringLength, stats)\n case 'function':\n stats.nonSerializable += 1\n return '[Function]'\n case 'undefined':\n stats.dropped += 1\n return null\n }\n\n // object\n if (depth >= options.maxDepth) {\n stats.oversized += 1\n return '[Truncated]'\n }\n\n if (input instanceof Date) {\n return input.toISOString()\n }\n\n if (input instanceof Error) {\n stats.nonSerializable += 1\n return {\n name: truncateString(input.name, options.maxStringLength, stats),\n message: truncateString(input.message, options.maxStringLength, stats),\n }\n }\n\n if (typeof input === 'object') {\n if (seen.has(input)) {\n stats.nonSerializable += 1\n return '[Circular]'\n }\n seen.add(input)\n }\n\n if (Array.isArray(input)) {\n const out: Array<JsonValue> = []\n const limit = Math.min(input.length, options.maxArrayLength)\n for (let i = 0; i < limit; i++) {\n out.push(toJsonValueInternal(input[i], options, stats, seen, depth + 1))\n }\n if (input.length > limit) {\n stats.oversized += 1\n out.push(`[...${input.length - limit} more]`)\n }\n return out\n }\n\n if (!isPlainRecord(input)) {\n stats.nonSerializable += 1\n return truncateString(String(input), options.maxStringLength, stats)\n }\n\n const keys = Object.keys(input).sort()\n const limit = Math.min(keys.length, options.maxObjectKeys)\n const out: Record<string, JsonValue> = {}\n\n for (let i = 0; i < limit; i++) {\n const rawKey = keys[i]!\n const rawValue = (input as any)[rawKey]\n const key = truncateString(rawKey, options.maxStringLength, stats)\n if (rawValue === undefined) {\n stats.dropped += 1\n continue\n }\n out[key] = toJsonValueInternal(rawValue, options, stats, seen, depth + 1)\n }\n\n if (keys.length > limit) {\n stats.oversized += 1\n out.__truncatedKeys = keys.length - limit\n }\n\n return out\n}\n\nexport const projectJsonValue = (input: unknown, options?: JsonValueProjectOptions): JsonValueProjection => {\n const resolved: Required<JsonValueProjectOptions> = { ...defaultOptions, ...(options ?? {}) }\n const stats: MutableStats = { dropped: 0, oversized: 0, nonSerializable: 0 }\n const seen = new WeakSet<object>()\n\n let downgrade: DowngradeReason | undefined\n const value = toJsonValueInternal(input, resolved, stats, seen, 0)\n\n if (stats.nonSerializable > 0) {\n downgrade = mergeDowngrade(downgrade, 'non_serializable')\n }\n if (stats.oversized > 0) {\n downgrade = mergeDowngrade(downgrade, 'oversized')\n }\n\n // Hard gate: ensure JSON.stringify never throws and respect the max byte budget.\n try {\n const json = JSON.stringify(value)\n if (json.length > resolved.maxJsonBytes) {\n downgrade = mergeDowngrade(downgrade, 'oversized')\n const preview = json.slice(0, Math.min(resolved.oversizedPreviewBytes, resolved.maxJsonBytes))\n return {\n value: {\n _tag: 'oversized',\n bytes: json.length,\n preview,\n },\n stats: {\n dropped: stats.dropped,\n oversized: stats.oversized + 1,\n nonSerializable: stats.nonSerializable,\n },\n downgrade,\n }\n }\n } catch {\n downgrade = mergeDowngrade(downgrade, 'non_serializable')\n return {\n value: '[Unserializable]',\n stats: {\n dropped: stats.dropped,\n oversized: stats.oversized,\n nonSerializable: stats.nonSerializable + 1,\n },\n downgrade,\n }\n }\n\n return {\n value,\n stats: {\n dropped: stats.dropped,\n oversized: stats.oversized,\n nonSerializable: stats.nonSerializable,\n },\n downgrade,\n }\n}\n","import { stableStringify } from '../digest.js'\nimport { isJsonValue, type JsonValue, projectJsonValue } from '../observability/jsonValue.js'\n\nexport type WorkflowErrorCode =\n | 'WORKFLOW_UNSUPPORTED_VERSION'\n | 'WORKFLOW_INVALID_DEF'\n | 'WORKFLOW_INVALID_TRIGGER'\n | 'WORKFLOW_INVALID_STEP'\n | 'WORKFLOW_DUPLICATE_STEP_KEY'\n | 'WORKFLOW_INVALID_INPUT_EXPR'\n | 'WORKFLOW_INVALID_JSON_POINTER'\n | 'WORKFLOW_INVALID_MERGE_ITEMS'\n | 'WORKFLOW_INVALID_SERVICE_ID'\n | 'WORKFLOW_MISSING_SERVICE'\n | 'WORKFLOW_INVALID_SERVICE_PORT'\n | 'WORKFLOW_CALL_TIMEOUT'\n\nexport interface WorkflowError extends Error {\n readonly _tag: 'WorkflowError'\n readonly code: WorkflowErrorCode\n readonly programId?: string\n readonly source?: {\n readonly stepKey?: string\n readonly fragmentId?: string\n }\n readonly detail?: JsonValue\n}\n\nconst toJsonValue = (detail: unknown): JsonValue => {\n if (isJsonValue(detail)) return detail\n return projectJsonValue(detail).value\n}\n\nexport const makeWorkflowError = (args: {\n readonly code: WorkflowErrorCode\n readonly message: string\n readonly programId?: string\n readonly source?: WorkflowError['source']\n readonly detail?: unknown\n}): WorkflowError => {\n const detailJson = args.detail !== undefined ? toJsonValue(args.detail) : undefined\n const msg = args.detail !== undefined ? `${args.message}\\n(detail=${stableStringify(detailJson)})` : args.message\n\n return Object.assign(new Error(msg), {\n _tag: 'WorkflowError' as const,\n code: args.code,\n programId: args.programId,\n source: args.source,\n detail: detailJson,\n }) as WorkflowError\n}\n","import { isJsonValue } from '../observability/jsonValue.js'\nimport { makeWorkflowError } from './errors.js'\nimport type { InputExprV1 } from './model.js'\n\nexport type JsonPointerToken = string | number\n\nconst decodePointerToken = (raw: string): string => raw.replace(/~1/g, '/').replace(/~0/g, '~')\n\nconst isIndexToken = (token: string): boolean => token === '0' || (!token.startsWith('0') && /^\\d+$/.test(token))\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nexport const parseJsonPointer = (pointer: string): ReadonlyArray<JsonPointerToken> => {\n if (pointer === '') return []\n if (!pointer.startsWith('/')) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_JSON_POINTER',\n message: 'Invalid JSON Pointer (must be \"\" or start with \"/\").',\n detail: { pointer },\n })\n }\n\n const raw = pointer.split('/').slice(1)\n const out: JsonPointerToken[] = []\n for (const part of raw) {\n const decoded = decodePointerToken(part)\n out.push(isIndexToken(decoded) ? Number(decoded) : decoded)\n }\n return out\n}\n\nexport type CompiledInputExpr =\n | { readonly kind: 'payload' }\n | { readonly kind: 'payload.path'; readonly pointer: string; readonly tokens: ReadonlyArray<JsonPointerToken> }\n | { readonly kind: 'const'; readonly value: unknown }\n | { readonly kind: 'object'; readonly fields: ReadonlyArray<readonly [string, CompiledInputExpr]> }\n | { readonly kind: 'merge'; readonly items: ReadonlyArray<CompiledInputExpr> }\n\nexport const compileInputExpr = (expr: InputExprV1, pathForError?: { readonly stepKey?: string }): CompiledInputExpr => {\n switch (expr.kind) {\n case 'payload':\n return { kind: 'payload' }\n case 'payload.path': {\n const pointer = expr.pointer\n if (typeof pointer !== 'string') {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_INPUT_EXPR',\n message: 'InputExpr.payload.path.pointer must be a string.',\n source: { stepKey: pathForError?.stepKey },\n detail: { pointer },\n })\n }\n return { kind: 'payload.path', pointer, tokens: parseJsonPointer(pointer) }\n }\n case 'const': {\n const value: unknown = expr.value\n if (!isJsonValue(value)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_INPUT_EXPR',\n message: 'InputExpr.const.value must be JSON-serializable.',\n source: { stepKey: pathForError?.stepKey },\n detail: { value },\n })\n }\n return { kind: 'const', value }\n }\n case 'object': {\n const fields: unknown = expr.fields\n if (!fields || typeof fields !== 'object' || Array.isArray(fields)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_INPUT_EXPR',\n message: 'InputExpr.object.fields must be a record.',\n source: { stepKey: pathForError?.stepKey },\n })\n }\n const entries = Object.entries(fields as Record<string, InputExprV1>).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n return {\n kind: 'object',\n fields: entries.map(([k, v]) => [k, compileInputExpr(v, pathForError)] as const),\n }\n }\n case 'merge': {\n const items: unknown = expr.items\n if (!Array.isArray(items)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_INPUT_EXPR',\n message: 'InputExpr.merge.items must be an array.',\n source: { stepKey: pathForError?.stepKey },\n })\n }\n\n // Hard gate: merge.items must all be object (enforced at compile-time; runtime should not branch).\n for (const item of items) {\n const kind = isRecord(item) ? item.kind : undefined\n if (kind !== 'object') {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_MERGE_ITEMS',\n message: 'InputExpr.merge.items must all be InputExpr.object.',\n source: { stepKey: pathForError?.stepKey },\n detail: { kind },\n })\n }\n }\n\n return {\n kind: 'merge',\n items: (items as ReadonlyArray<InputExprV1>).map((i) => compileInputExpr(i, pathForError)),\n }\n }\n }\n}\n\nconst isPlainRecord = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null) return false\n if (Array.isArray(value)) return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\nconst evalPointer = (root: unknown, tokens: ReadonlyArray<JsonPointerToken>): unknown => {\n let current: unknown = root\n for (const token of tokens) {\n if (current == null) return undefined\n if (Array.isArray(current) && typeof token === 'number') {\n current = current[token]\n continue\n }\n if (typeof current !== 'object') return undefined\n const key = typeof token === 'number' ? String(token) : token\n current = (current as Record<string, unknown>)[key]\n }\n return current\n}\n\nexport const evalInputExpr = (expr: CompiledInputExpr, payload: unknown): unknown => {\n switch (expr.kind) {\n case 'payload':\n return payload\n case 'payload.path':\n return evalPointer(payload, expr.tokens)\n case 'const':\n return expr.value\n case 'object': {\n const out: Record<string, unknown> = {}\n for (const [k, v] of expr.fields) {\n out[k] = evalInputExpr(v, payload)\n }\n return out\n }\n case 'merge': {\n const out: Record<string, unknown> = {}\n for (const item of expr.items) {\n const value = evalInputExpr(item, payload)\n if (isPlainRecord(value)) {\n for (const [k, v] of Object.entries(value)) {\n out[k] = v\n }\n }\n }\n return out\n }\n }\n}\n","import { fnv1a32, stableStringify } from '../digest.js'\nimport { isJsonValue, projectJsonValue, type JsonValue } from '../observability/jsonValue.js'\nimport { makeWorkflowError } from './errors.js'\nimport type {\n InputExprV1,\n StepKey,\n WorkflowDefV1,\n WorkflowStepV1,\n WorkflowStaticIrV1,\n WorkflowStaticNode,\n WorkflowStaticStep,\n WorkflowTriggerV1,\n WorkflowStableId,\n WorkflowNodeId,\n WorkflowEdge,\n WorkflowEdgeKind,\n} from './model.js'\nimport { compileInputExpr, type CompiledInputExpr } from './inputExpr.js'\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst asNonEmptyString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined\n\nconst asNonNegInt = (value: unknown): number | undefined => {\n if (typeof value !== 'number' || !Number.isFinite(value)) return undefined\n const n = Math.floor(value)\n return n >= 0 ? n : undefined\n}\n\nconst asPosInt = (value: unknown): number | undefined => {\n if (typeof value !== 'number' || !Number.isFinite(value)) return undefined\n const n = Math.floor(value)\n return n > 0 ? n : undefined\n}\n\nexport const normalizeWorkflowDefV1 = (input: WorkflowDefV1): WorkflowDefV1 => {\n // Fill trivial defaults (canonical shape):\n // - call.onSuccess/onFailure must be explicit arrays.\n // - The normalization must be deep: nested call steps may come from def-like inputs and miss the arrays.\n const normalizeStep = (step: WorkflowStepV1): WorkflowStepV1 => {\n if (!isRecord(step)) return step\n if (step.kind !== 'call') return step\n\n const raw = step as unknown as { readonly onSuccess?: unknown; readonly onFailure?: unknown }\n const onSuccessRaw = Array.isArray(raw.onSuccess) ? (raw.onSuccess as ReadonlyArray<WorkflowStepV1>) : []\n const onFailureRaw = Array.isArray(raw.onFailure) ? (raw.onFailure as ReadonlyArray<WorkflowStepV1>) : []\n\n return {\n ...step,\n onSuccess: onSuccessRaw.map(normalizeStep),\n onFailure: onFailureRaw.map(normalizeStep),\n }\n }\n\n const normalizeSteps = (steps: ReadonlyArray<WorkflowStepV1>): ReadonlyArray<WorkflowStepV1> => steps.map(normalizeStep)\n\n return {\n ...input,\n steps: normalizeSteps(input.steps),\n }\n}\n\nexport function validateWorkflowDefV1(def: unknown, options?: { readonly moduleId?: string }): asserts def is WorkflowDefV1 {\n if (!isRecord(def)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_DEF',\n message: 'WorkflowDef must be an object.',\n detail: { def },\n })\n }\n\n if (def.astVersion !== 1) {\n throw makeWorkflowError({\n code: 'WORKFLOW_UNSUPPORTED_VERSION',\n message: 'Unsupported workflow astVersion.',\n detail: { astVersion: def.astVersion },\n })\n }\n\n if (!asNonEmptyString(def.localId)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_DEF',\n message: 'WorkflowDef.localId must be a non-empty string.',\n detail: { localId: def.localId },\n })\n }\n\n const trigger = def.trigger\n if (!isRecord(trigger)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_TRIGGER',\n message: 'Workflow trigger must be an object.',\n detail: { trigger },\n })\n }\n if (trigger.kind === 'action') {\n if (!asNonEmptyString(trigger.actionTag)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_TRIGGER',\n message: 'Workflow trigger.actionTag must be a non-empty string.',\n detail: { trigger },\n })\n }\n } else if (trigger.kind === 'lifecycle') {\n const phase = trigger.phase\n if (phase !== 'onStart' && phase !== 'onInit') {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_TRIGGER',\n message: 'Workflow trigger.phase must be \"onStart\" or \"onInit\".',\n detail: { trigger },\n })\n }\n } else {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_TRIGGER',\n message: 'Workflow trigger.kind must be \"action\" or \"lifecycle\".',\n detail: { trigger },\n })\n }\n\n if (!Array.isArray(def.steps)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_DEF',\n message: 'WorkflowDef.steps must be an array.',\n detail: { steps: def.steps },\n })\n }\n\n const seenKeys = new Set<string>()\n const visit = (step: unknown, fragmentId?: string): void => {\n if (!isRecord(step)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_STEP',\n message: 'Workflow step must be an object.',\n detail: { step },\n source: fragmentId ? { fragmentId } : undefined,\n })\n }\n\n const key = asNonEmptyString(step.key)\n if (!key) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_STEP',\n message: 'Workflow step.key must be a non-empty string.',\n detail: { stepKey: step.key, kind: step.kind },\n source: fragmentId ? { fragmentId } : undefined,\n })\n }\n\n if (seenKeys.has(key)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_DUPLICATE_STEP_KEY',\n message: `Duplicate stepKey \"${key}\" detected.`,\n detail: { duplicateKey: key },\n source: { stepKey: key, ...(fragmentId ? { fragmentId } : null) },\n })\n }\n seenKeys.add(key)\n\n if (step.kind === 'dispatch') {\n if (!asNonEmptyString(step.actionTag)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_STEP',\n message: 'dispatch.actionTag must be a non-empty string.',\n source: { stepKey: key, ...(fragmentId ? { fragmentId } : null) },\n detail: { actionTag: step.actionTag },\n })\n }\n const payload = step.payload\n if (payload !== undefined) {\n validateInputExpr(payload, { stepKey: key })\n }\n return\n }\n\n if (step.kind === 'delay') {\n const ms = asNonNegInt(step.ms)\n if (ms === undefined) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_STEP',\n message: 'delay.ms must be a non-negative integer.',\n source: { stepKey: key, ...(fragmentId ? { fragmentId } : null) },\n detail: { ms: step.ms },\n })\n }\n return\n }\n\n if (step.kind === 'call') {\n if (!asNonEmptyString(step.serviceId)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_SERVICE_ID',\n message: 'call.serviceId must be a non-empty string.',\n source: { stepKey: key, ...(fragmentId ? { fragmentId } : null) },\n detail: { serviceId: step.serviceId },\n })\n }\n const inputExpr = step.input\n if (inputExpr !== undefined) {\n validateInputExpr(inputExpr, { stepKey: key })\n }\n const timeoutMsRaw = step.timeoutMs\n if (timeoutMsRaw !== undefined && asPosInt(timeoutMsRaw) === undefined) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_STEP',\n message: 'call.timeoutMs must be a positive integer (milliseconds).',\n source: { stepKey: key, ...(fragmentId ? { fragmentId } : null) },\n detail: { timeoutMs: timeoutMsRaw },\n })\n }\n const retryRaw = step.retry\n if (retryRaw !== undefined) {\n const times = isRecord(retryRaw) ? asPosInt(retryRaw.times) : undefined\n if (times === undefined) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_STEP',\n message: 'call.retry.times must be a positive integer.',\n source: { stepKey: key, ...(fragmentId ? { fragmentId } : null) },\n detail: { retry: retryRaw },\n })\n }\n }\n\n const onSuccess = Array.isArray(step.onSuccess) ? step.onSuccess : []\n const onFailure = Array.isArray(step.onFailure) ? step.onFailure : []\n for (const inner of onSuccess) visit(inner, fragmentId)\n for (const inner of onFailure) visit(inner, fragmentId)\n return\n }\n\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_STEP',\n message: 'Unknown step kind.',\n source: { stepKey: key, ...(fragmentId ? { fragmentId } : null) },\n detail: { kind: step.kind },\n })\n }\n\n const sources = def.sources\n const fragmentByStepKey = new Map<string, string | undefined>()\n if (sources && typeof sources === 'object') {\n for (const [k, v] of Object.entries(sources)) {\n fragmentByStepKey.set(k, isRecord(v) ? asNonEmptyString(v.fragmentId) : undefined)\n }\n }\n\n for (const step of def.steps) {\n const key = isRecord(step) ? asNonEmptyString(step.key) : undefined\n const fragmentId = key ? fragmentByStepKey.get(key) : undefined\n visit(step, fragmentId)\n }\n\n // meta.generator must stay JSON-only.\n const generator = isRecord(def.meta) ? def.meta.generator : undefined\n if (generator !== undefined && !isJsonValue(generator)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_DEF',\n message: 'WorkflowDef.meta.generator must be JSON-serializable.',\n detail: { generator },\n })\n }\n\n // policy validation (minimal)\n const policy = isRecord(def.policy) ? def.policy : undefined\n if (policy) {\n const concurrency = policy.concurrency\n if (concurrency !== undefined && concurrency !== 'latest' && concurrency !== 'exhaust' && concurrency !== 'parallel') {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_DEF',\n message: 'policy.concurrency must be latest|exhaust|parallel.',\n detail: { concurrency },\n })\n }\n const priority = policy.priority\n if (priority !== undefined && priority !== 'urgent' && priority !== 'nonUrgent') {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_DEF',\n message: 'policy.priority must be urgent|nonUrgent.',\n detail: { priority },\n })\n }\n }\n\n // moduleId is only used to improve error context; no additional validation here.\n void options?.moduleId\n}\n\nconst validateInputExpr = (expr: unknown, options?: { readonly stepKey?: string }): void => {\n const visit = (e: unknown): void => {\n if (!isRecord(e)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_INPUT_EXPR',\n message: 'InputExpr must be an object.',\n source: { stepKey: options?.stepKey },\n detail: { expr: e },\n })\n }\n const kind = e.kind\n switch (kind) {\n case 'payload':\n return\n case 'payload.path': {\n const pointer = e.pointer\n if (typeof pointer !== 'string') {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_INPUT_EXPR',\n message: 'InputExpr.payload.path.pointer must be a string.',\n source: { stepKey: options?.stepKey },\n detail: { pointer },\n })\n }\n return\n }\n case 'const': {\n const value = e.value\n if (!isJsonValue(value)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_INPUT_EXPR',\n message: 'InputExpr.const.value must be JSON-serializable.',\n source: { stepKey: options?.stepKey },\n })\n }\n return\n }\n case 'object': {\n const fields = e.fields\n if (!isRecord(fields)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_INPUT_EXPR',\n message: 'InputExpr.object.fields must be a record.',\n source: { stepKey: options?.stepKey },\n })\n }\n for (const v of Object.values(fields)) {\n visit(v)\n }\n return\n }\n case 'merge': {\n const items = e.items\n if (!Array.isArray(items)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_INPUT_EXPR',\n message: 'InputExpr.merge.items must be an array.',\n source: { stepKey: options?.stepKey },\n })\n }\n for (const item of items) {\n visit(item)\n }\n return\n }\n default:\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_INPUT_EXPR',\n message: 'Unknown InputExpr kind.',\n source: { stepKey: options?.stepKey },\n detail: { kind },\n })\n }\n }\n\n visit(expr)\n}\n\n// ---- Static IR compilation ----\n\nconst makeDigest = (prefix: string, value: unknown): string => `${prefix}:${fnv1a32(stableStringify(value))}`\n\nconst makeTriggerNodeId = (programId: string): WorkflowNodeId => `wf_trigger_v1:${fnv1a32(programId)}`\n\nconst makeStepNodeId = (programId: string, stepKey: StepKey, kind: string): WorkflowNodeId =>\n `wf_node_v1:${fnv1a32(`${programId}\\u0000${stepKey}\\u0000${kind}`)}`\n\nconst budgetJsonValue = (value: JsonValue): JsonValue => projectJsonValue(value).value\n\nconst budgetInputExpr = (expr: InputExprV1): InputExprV1 => {\n switch (expr.kind) {\n case 'payload':\n case 'payload.path':\n return expr\n case 'const': {\n const value: unknown = expr.value\n if (!isJsonValue(value)) return expr\n return { ...expr, value: budgetJsonValue(expr.value) }\n }\n case 'object': {\n const out: { [k: string]: InputExprV1 } = {}\n for (const k of Object.keys(expr.fields).sort()) {\n out[k] = budgetInputExpr(expr.fields[k]!)\n }\n return { ...expr, fields: out }\n }\n case 'merge':\n return { ...expr, items: expr.items.map(budgetInputExpr) }\n }\n}\n\nconst toStaticStep = (step: WorkflowStepV1): WorkflowStaticStep => {\n switch (step.kind) {\n case 'dispatch':\n return {\n kind: 'dispatch',\n actionTag: step.actionTag,\n ...(step.payload ? { payload: budgetInputExpr(step.payload) } : null),\n }\n case 'delay':\n return { kind: 'delay', ms: step.ms }\n case 'call': {\n const policy =\n step.timeoutMs !== undefined || step.retry !== undefined\n ? {\n ...(step.timeoutMs !== undefined ? { timeoutMs: step.timeoutMs } : null),\n ...(step.retry !== undefined ? { retry: { times: step.retry.times } } : null),\n }\n : undefined\n return {\n kind: 'call',\n serviceId: step.serviceId,\n ...(step.input ? { input: budgetInputExpr(step.input) } : null),\n ...(policy ? { policy } : null),\n }\n }\n }\n}\n\nexport const compileWorkflowStaticIrV1 = (args: {\n readonly moduleId: string\n readonly def: WorkflowDefV1\n}): WorkflowStaticIrV1 => {\n const normalized = normalizeWorkflowDefV1(args.def)\n validateWorkflowDefV1(normalized, { moduleId: args.moduleId })\n\n const programId: WorkflowStableId = `${args.moduleId}.${normalized.localId}`\n const triggerNodeId = makeTriggerNodeId(programId)\n\n const fragmentByStepKey = new Map<string, string | undefined>()\n if (normalized.sources && typeof normalized.sources === 'object') {\n for (const [k, v] of Object.entries(normalized.sources)) {\n fragmentByStepKey.set(k, isRecord(v) ? asNonEmptyString(v.fragmentId) : undefined)\n }\n }\n\n const nodesByKey = new Map<string, WorkflowNodeId>()\n\n const collectNodes = (steps: ReadonlyArray<WorkflowStepV1>) => {\n for (const step of steps) {\n const id = makeStepNodeId(programId, step.key, step.kind)\n nodesByKey.set(step.key, id)\n if (step.kind === 'call') {\n collectNodes(step.onSuccess)\n collectNodes(step.onFailure)\n }\n }\n }\n collectNodes(normalized.steps)\n\n const nodes: WorkflowStaticNode[] = [\n {\n id: triggerNodeId,\n kind: 'trigger',\n trigger: normalized.trigger,\n },\n ]\n\n const addStepNodes = (steps: ReadonlyArray<WorkflowStepV1>) => {\n for (const step of steps) {\n const id = nodesByKey.get(step.key)\n if (!id) continue\n const fragmentId = fragmentByStepKey.get(step.key)\n nodes.push({\n id,\n kind: 'step',\n step: toStaticStep(step),\n source: {\n stepKey: step.key,\n ...(fragmentId ? { fragmentId } : null),\n },\n })\n if (step.kind === 'call') {\n addStepNodes(step.onSuccess)\n addStepNodes(step.onFailure)\n }\n }\n }\n addStepNodes(normalized.steps)\n\n const edges: WorkflowEdge[] = []\n\n const pushEdge = (from: WorkflowNodeId, to: WorkflowNodeId, kind: WorkflowEdgeKind): void => {\n edges.push({ from, to, kind })\n }\n\n const compileBlock = (args: {\n readonly steps: ReadonlyArray<WorkflowStepV1>\n readonly entryFrom: ReadonlyArray<WorkflowNodeId>\n readonly entryKind: WorkflowEdgeKind\n readonly continuation?: WorkflowNodeId\n }): void => {\n if (args.steps.length === 0) {\n if (args.continuation) {\n for (const from of args.entryFrom) {\n pushEdge(from, args.continuation, args.entryKind)\n }\n }\n return\n }\n\n const first = args.steps[0]!\n const firstId = nodesByKey.get(first.key)\n if (!firstId) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_STEP',\n message: 'Internal error: missing node id for stepKey.',\n programId,\n source: { stepKey: first.key },\n })\n }\n\n for (const from of args.entryFrom) {\n pushEdge(from, firstId, args.entryKind)\n }\n\n const compileStepAndTail = (step: WorkflowStepV1, tail: ReadonlyArray<WorkflowStepV1>, continuation?: WorkflowNodeId) => {\n const stepId = nodesByKey.get(step.key)\n if (!stepId) return\n\n if (step.kind !== 'call') {\n compileBlock({ steps: tail, entryFrom: [stepId], entryKind: 'next', continuation })\n return\n }\n\n const cont = tail.length > 0 ? nodesByKey.get(tail[0]!.key) : continuation\n\n compileBlock({\n steps: step.onSuccess,\n entryFrom: [stepId],\n entryKind: 'success',\n continuation: cont,\n })\n compileBlock({\n steps: step.onFailure,\n entryFrom: [stepId],\n entryKind: 'failure',\n continuation: cont,\n })\n\n compileBlock({ steps: tail, entryFrom: [], entryKind: 'next', continuation })\n }\n\n compileStepAndTail(first, args.steps.slice(1), args.continuation)\n }\n\n compileBlock({ steps: normalized.steps, entryFrom: [triggerNodeId], entryKind: 'next', continuation: undefined })\n\n // Stable ordering (for diff/digest).\n nodes.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n edges.sort((a, b) => {\n if (a.from !== b.from) return a.from < b.from ? -1 : 1\n if (a.to !== b.to) return a.to < b.to ? -1 : 1\n const ak = String(a.kind ?? '')\n const bk = String(b.kind ?? '')\n if (ak !== bk) return ak < bk ? -1 : 1\n return 0\n })\n\n const meta: Record<string, JsonValue> | undefined = (() => {\n const generator = normalized.meta?.generator\n if (generator === undefined) return undefined\n return { generator: budgetJsonValue(generator) }\n })()\n\n const irNoDigest = {\n version: 1,\n programId,\n nodes,\n edges,\n policy: normalized.policy,\n meta,\n } as const\n\n const digest = makeDigest('workflow_ir_v1', irNoDigest)\n\n return {\n ...irNoDigest,\n digest,\n }\n}\n\n// ---- Runtime compilation (InputExpr precompile + shape checks) ----\n\nexport type CompiledWorkflowStep =\n | { readonly kind: 'dispatch'; readonly key: StepKey; readonly actionTag: string; readonly payload?: CompiledInputExpr }\n | { readonly kind: 'delay'; readonly key: StepKey; readonly ms: number }\n | {\n readonly kind: 'call'\n readonly key: StepKey\n readonly serviceId: string\n readonly input?: CompiledInputExpr\n readonly timeoutMs?: number\n readonly retryTimes?: number\n readonly onSuccess: ReadonlyArray<CompiledWorkflowStep>\n readonly onFailure: ReadonlyArray<CompiledWorkflowStep>\n }\n\nexport const compileWorkflowRuntimeStepsV1 = (args: {\n readonly def: WorkflowDefV1\n}): ReadonlyArray<CompiledWorkflowStep> => {\n const normalized = normalizeWorkflowDefV1(args.def)\n validateWorkflowDefV1(normalized)\n\n const compileStep = (step: WorkflowStepV1): CompiledWorkflowStep => {\n const stepKey = step.key\n switch (step.kind) {\n case 'dispatch':\n return {\n kind: 'dispatch',\n key: step.key,\n actionTag: step.actionTag,\n ...(step.payload ? { payload: compileInputExpr(step.payload, { stepKey }) } : null),\n }\n case 'delay':\n return { kind: 'delay', key: step.key, ms: step.ms }\n case 'call': {\n const retryTimes = step.retry?.times\n return {\n kind: 'call',\n key: step.key,\n serviceId: step.serviceId,\n ...(step.input ? { input: compileInputExpr(step.input, { stepKey }) } : null),\n ...(step.timeoutMs !== undefined ? { timeoutMs: step.timeoutMs } : null),\n ...(retryTimes !== undefined ? { retryTimes } : null),\n onSuccess: step.onSuccess.map(compileStep),\n onFailure: step.onFailure.map(compileStep),\n }\n }\n }\n }\n\n return normalized.steps.map(compileStep)\n}\n","import { Cause, Context, Deferred, Effect, Exit, Fiber, FiberRef, Option, Stream } from 'effect'\nimport * as EffectOpCore from './EffectOpCore.js'\nimport * as Debug from './DebugSink.js'\nimport * as LogicUnitMeta from './LogicUnitMeta.js'\nimport { toSerializableErrorSummary } from './errorSummary.js'\nimport type { AnyModuleShape, LogicPlan, ModuleRuntime as PublicModuleRuntime } from './module.js'\nimport { HostSchedulerTag, TickSchedulerTag } from './env.js'\nimport { currentTxnOriginOverride } from './TxnOriginOverride.js'\nimport { getRuntimeInternals } from './runtimeInternalsAccessor.js'\nimport { RootContextTag, type RootContext } from './RootContext.js'\nimport * as TaskRunner from './TaskRunner.js'\nimport * as EffectOp from '../../effect-op.js'\nimport { makeWorkflowError } from '../../workflow/errors.js'\nimport { compileWorkflowRuntimeStepsV1, type CompiledWorkflowStep } from '../../workflow/compiler.js'\nimport { evalInputExpr, type CompiledInputExpr } from '../../workflow/inputExpr.js'\nimport type { WorkflowDefV1, WorkflowTriggerV1 } from '../../workflow/model.js'\n\ntype ModuleTag = Context.Tag<unknown, PublicModuleRuntime<unknown, unknown>>\n\nexport type WorkflowLike = {\n readonly _tag?: 'Workflow'\n readonly def: WorkflowDefV1\n readonly validate?: () => void\n}\n\ntype ConcurrencyMode = 'latest' | 'exhaust' | 'parallel'\ntype Priority = 'urgent' | 'nonUrgent'\n\ntype ServicePort = (input: unknown) => Effect.Effect<unknown, unknown, unknown>\n\ntype CompiledRuntimeStep =\n | { readonly kind: 'dispatch'; readonly key: string; readonly actionTag: string; readonly payload?: CompiledInputExpr }\n | { readonly kind: 'delay'; readonly key: string; readonly ms: number }\n | {\n readonly kind: 'call'\n readonly key: string\n readonly serviceId: string\n readonly input?: CompiledInputExpr\n readonly timeoutMs?: number\n readonly retryTimes?: number\n readonly port: ServicePort\n readonly onSuccess: ReadonlyArray<CompiledRuntimeStep>\n readonly onFailure: ReadonlyArray<CompiledRuntimeStep>\n }\n\ntype CompiledProgram = {\n readonly programId: string\n readonly localId: string\n readonly trigger: WorkflowTriggerV1\n readonly concurrency: ConcurrencyMode\n readonly priority: Priority\n readonly compiledSteps: ReadonlyArray<CompiledWorkflowStep>\n steps?: ReadonlyArray<CompiledRuntimeStep>\n}\n\ntype ProgramState =\n | { readonly mode: 'latest'; runSeq: number; current?: Fiber.RuntimeFiber<void, never>; currentRunId?: string }\n | { readonly mode: 'exhaust'; runSeq: number; busy: boolean }\n | { readonly mode: 'parallel'; runSeq: number }\n\ntype ProgramEntry = {\n readonly program: CompiledProgram\n readonly state: ProgramState\n}\n\ntype WorkflowRegistryV1 = {\n readonly byActionTag: Map<string, ReadonlyArray<ProgramEntry>>\n readonly entries: Array<ProgramEntry>\n watcherStarted: boolean\n watcherStartCount: number\n portsResolving: boolean\n portsReady: Deferred.Deferred<void, unknown>\n parallelLimiter: Effect.Semaphore | null | undefined\n}\n\nconst WORKFLOW_REGISTRY = Symbol.for('@logixjs/core/workflowRegistry')\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isObjectLike = (value: unknown): value is Record<string, unknown> | ((...args: never[]) => unknown) =>\n (typeof value === 'object' && value !== null) || typeof value === 'function'\n\nconst getRegistry = (runtime: object): WorkflowRegistryV1 | undefined =>\n (runtime as Record<PropertyKey, unknown>)[WORKFLOW_REGISTRY] as WorkflowRegistryV1 | undefined\n\nconst resolveActionTag = (action: unknown): string | undefined => {\n const tag = isObjectLike(action) ? (action as Record<string, unknown>)._tag : undefined\n if (typeof tag === 'string' && tag.length > 0) return tag\n const type = isObjectLike(action) ? (action as Record<string, unknown>).type : undefined\n if (typeof type === 'string' && type.length > 0) return type\n if (tag != null) return String(tag)\n if (type != null) return String(type)\n return undefined\n}\n\nconst asNonEmptyString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined\n\nconst KERNEL_PORT_SOURCE_REFRESH = 'logix/kernel/sourceRefresh'\n\nconst resolveServicePort = (\n runtime: PublicModuleRuntime<unknown, unknown>,\n env: Context.Context<unknown>,\n serviceId: string,\n programId: string,\n stepKey: string,\n): ServicePort => {\n if (serviceId === KERNEL_PORT_SOURCE_REFRESH) {\n return (input) =>\n Effect.gen(function* () {\n const fieldPath = asNonEmptyString(isRecord(input) ? input.fieldPath : undefined)\n if (!fieldPath) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_STEP',\n message: 'KernelPort sourceRefresh requires input.fieldPath (non-empty string).',\n programId,\n source: { stepKey },\n detail: { serviceId, input },\n })\n }\n\n const internals = getRuntimeInternals(runtime)\n const handler = internals.traits.getSourceRefreshHandler(fieldPath)\n\n // If no refresh handler is registered, treat it as a no-op (aligns with BoundApiRuntime behavior).\n if (!handler) {\n return\n }\n\n const force = isRecord(input) && input.force === true\n const runHandler = (state: unknown) =>\n force ? Effect.locally(TaskRunner.forceSourceRefresh, true)(handler(state)) : handler(state)\n\n const inTxn = yield* FiberRef.get(TaskRunner.inSyncTransactionFiber)\n if (inTxn) {\n const state = yield* runtime.getState\n yield* runHandler(state)\n return\n }\n\n yield* internals.txn.runWithStateTransaction(\n {\n kind: 'source-refresh',\n name: fieldPath,\n },\n () =>\n Effect.gen(function* () {\n const state = yield* runtime.getState\n yield* runHandler(state)\n }),\n )\n })\n }\n\n const tag = Context.GenericTag<unknown>(serviceId)\n const opt = Context.getOption(env, tag)\n if (Option.isNone(opt)) {\n throw makeWorkflowError({\n code: 'WORKFLOW_MISSING_SERVICE',\n message: `Missing service for serviceId=\"${serviceId}\".`,\n programId,\n source: { stepKey },\n detail: { serviceId },\n })\n }\n\n const value: unknown = opt.value\n if (typeof value === 'function') {\n const fn = value as (input: unknown) => Effect.Effect<unknown, unknown, unknown>\n return (input) => fn(input)\n }\n\n const callFn = isObjectLike(value) ? (value as Record<string, unknown>).call : undefined\n if (typeof callFn === 'function') {\n const call = callFn as (this: unknown, input: unknown) => Effect.Effect<unknown, unknown, unknown>\n return (input) => call.call(value, input)\n }\n\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_SERVICE_PORT',\n message: `Invalid service port for serviceId=\"${serviceId}\" (expected a function or { call(input): Effect }).`,\n programId,\n source: { stepKey },\n detail: { serviceId, portType: typeof value },\n })\n}\n\nconst compileSteps = (steps: ReadonlyArray<CompiledWorkflowStep>, resolvePort: (serviceId: string, stepKey: string) => ServicePort) => {\n const visit = (step: CompiledWorkflowStep): CompiledRuntimeStep => {\n switch (step.kind) {\n case 'dispatch':\n return {\n kind: 'dispatch',\n key: step.key,\n actionTag: step.actionTag,\n ...(step.payload ? { payload: step.payload } : null),\n }\n case 'delay':\n return { kind: 'delay', key: step.key, ms: step.ms }\n case 'call':\n return {\n kind: 'call',\n key: step.key,\n serviceId: step.serviceId,\n port: resolvePort(step.serviceId, step.key),\n ...(step.input ? { input: step.input } : null),\n ...(step.timeoutMs !== undefined ? { timeoutMs: step.timeoutMs } : null),\n ...(step.retryTimes !== undefined ? { retryTimes: step.retryTimes } : null),\n onSuccess: step.onSuccess.map(visit),\n onFailure: step.onFailure.map(visit),\n }\n }\n }\n\n return steps.map(visit)\n}\n\nconst resolveConcurrency = (def: WorkflowDefV1): ConcurrencyMode => (def.policy?.concurrency ?? 'parallel') as ConcurrencyMode\nconst resolvePriority = (def: WorkflowDefV1): Priority => (def.policy?.priority ?? 'urgent') as Priority\n\nconst makeRunId = (instanceId: string, programId: string, runSeq: number): string =>\n `${instanceId}::wf:${programId}::r${runSeq}`\n\nconst runBoundary = <A, E, R>(args: {\n readonly kind: EffectOp.EffectOp['kind']\n readonly name: string\n readonly effect: Effect.Effect<A, E, R>\n readonly payload?: unknown\n readonly meta?: EffectOp.EffectOp['meta']\n readonly middleware: EffectOpCore.EffectOpMiddlewareEnv | undefined\n}): Effect.Effect<A, E, R> =>\n Effect.gen(function* () {\n const op = yield* EffectOp.makeInRunSession({\n kind: args.kind,\n name: args.name,\n effect: args.effect,\n payload: args.payload,\n meta: args.meta,\n })\n const stack = args.middleware?.stack ?? []\n return yield* EffectOp.run(op, stack)\n }) as unknown as Effect.Effect<A, E, R>\n\nconst makeTimer = (args: {\n readonly host: {\n readonly scheduleMicrotask: (cb: () => void) => void\n readonly scheduleTimeout: (ms: number, cb: () => void) => () => void\n }\n readonly ms: number\n readonly onCancel: Effect.Effect<void, never, unknown>\n}): Effect.Effect<void, never, unknown> =>\n Effect.async<void, never, unknown>((resume) => {\n let fired = false\n const cancel = args.host.scheduleTimeout(args.ms, () => {\n fired = true\n // Route resumption through a microtask boundary:\n // - Improves determinism in tests (deterministic HostScheduler).\n // - Avoids deep JS-microtask chains that are invisible to HostScheduler flushing.\n args.host.scheduleMicrotask(() => resume(Effect.void))\n })\n return Effect.sync(() => {\n cancel()\n }).pipe(Effect.zipRight(fired ? Effect.void : args.onCancel))\n })\n\nconst ensureLimiterReady = (registry: WorkflowRegistryV1, runtime: PublicModuleRuntime<unknown, unknown>) =>\n Effect.gen(function* () {\n if (registry.parallelLimiter !== undefined) return\n\n const internals = getRuntimeInternals(runtime)\n const policy = yield* internals.concurrency.resolveConcurrencyPolicy()\n const limit = policy.concurrencyLimit\n if (limit === 'unbounded') {\n registry.parallelLimiter = null\n return\n }\n\n const n = typeof limit === 'number' && Number.isFinite(limit) && limit >= 1 ? Math.floor(limit) : 16\n registry.parallelLimiter = yield* Effect.makeSemaphore(n)\n })\n\nconst withRootEnvIfAvailable = <A, E, R>(eff: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>\n Effect.gen(function* () {\n const rootOpt = yield* Effect.serviceOption(RootContextTag)\n if (Option.isNone(rootOpt)) {\n return yield* eff\n }\n const root: RootContext = rootOpt.value\n const rootEnv = root.context ?? (yield* Deferred.await(root.ready))\n\n const currentEnv = yield* Effect.context<unknown>()\n const mergedEnv = Context.merge(rootEnv as unknown as Context.Context<unknown>, currentEnv)\n return yield* (Effect.provide(eff as unknown as Effect.Effect<A, E, unknown>, mergedEnv) as unknown as Effect.Effect<A, E, R>)\n }) as unknown as Effect.Effect<A, E, R>\n\nconst ensurePortsResolved = (\n registry: WorkflowRegistryV1,\n runtime: PublicModuleRuntime<unknown, unknown>,\n): Effect.Effect<void, unknown, unknown> =>\n Effect.gen(function* () {\n const done = yield* Deferred.isDone(registry.portsReady)\n if (done) {\n yield* Deferred.await(registry.portsReady)\n return\n }\n\n if (registry.portsResolving) {\n yield* Deferred.await(registry.portsReady)\n return\n }\n\n registry.portsResolving = true\n const env = yield* Effect.context<unknown>()\n\n yield* Effect.sync(() => {\n const portCache = new Map<string, ServicePort>()\n for (const entry of registry.entries) {\n const program = entry.program\n if (program.steps) continue\n\n const resolvePort = (serviceId: string, stepKey: string): ServicePort => {\n const cached = portCache.get(serviceId)\n if (cached) return cached\n const resolved = resolveServicePort(runtime, env, serviceId, program.programId, stepKey)\n portCache.set(serviceId, resolved)\n return resolved\n }\n\n program.steps = compileSteps(program.compiledSteps, resolvePort)\n }\n }).pipe(\n Effect.tap(() => Deferred.succeed(registry.portsReady, undefined)),\n Effect.catchAllCause((cause) => Deferred.failCause(registry.portsReady, cause).pipe(Effect.zipRight(Effect.failCause(cause)))),\n Effect.ensuring(\n Effect.sync(() => {\n registry.portsResolving = false\n }),\n ),\n )\n })\n\nconst shouldObserveForRun = (diagnostics: Debug.DiagnosticsLevel, runSeq: number): boolean => {\n if (diagnostics === 'off') return false\n if (diagnostics === 'sampled') {\n // Deterministic sampling (no Math.random): 1/16 by runSeq.\n return (runSeq & 0x0f) === 0\n }\n return true\n}\n\nconst startProgramRun = (args: {\n readonly entry: ProgramEntry\n readonly runtime: PublicModuleRuntime<unknown, unknown>\n readonly registry: WorkflowRegistryV1\n readonly trigger: { readonly kind: 'action'; readonly actionTag: string } | { readonly kind: 'lifecycle'; readonly phase: string }\n readonly payload: unknown\n readonly middleware: EffectOpCore.EffectOpMiddlewareEnv | undefined\n}): Effect.Effect<void, never, unknown> =>\n Effect.gen(function* () {\n const { entry, runtime, registry } = args\n const { program, state } = entry\n\n const diagnostics = yield* FiberRef.get(Debug.currentDiagnosticsLevel)\n\n const beginRun = (): { readonly runSeq: number; readonly runId: string; readonly canWriteBack: () => boolean } => {\n if (state.mode === 'latest') {\n state.runSeq += 1\n const runSeq = state.runSeq\n const runId = makeRunId(runtime.instanceId, program.programId, runSeq)\n return {\n runSeq,\n runId,\n canWriteBack: () => state.runSeq === runSeq,\n }\n }\n\n state.runSeq += 1\n const runSeq = state.runSeq\n const runId = makeRunId(runtime.instanceId, program.programId, runSeq)\n return {\n runSeq,\n runId,\n canWriteBack: () => true,\n }\n }\n\n if (state.mode === 'exhaust') {\n if (state.busy) {\n if (diagnostics !== 'off') {\n const observe = shouldObserveForRun(diagnostics, state.runSeq)\n const tickSeq = observe ? (yield* TickSchedulerTag).getTickSeq() : undefined\n yield* runBoundary({\n kind: 'flow',\n name: 'workflow.drop',\n payload: { programId: program.programId, trigger: args.trigger },\n meta: {\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n programId: program.programId,\n ...(tickSeq !== undefined ? { tickSeq } : null),\n policy: { disableObservers: !observe },\n reason: 'exhaust' as const,\n },\n effect: Effect.void,\n middleware: args.middleware,\n })\n }\n return\n }\n state.busy = true\n }\n\n const { runSeq, runId, canWriteBack } = beginRun()\n\n if (state.mode === 'latest') {\n const prev = state.current\n const prevRunId = state.currentRunId\n if (prev) {\n yield* Fiber.interruptFork(prev)\n if (diagnostics !== 'off') {\n const observe = shouldObserveForRun(diagnostics, runSeq)\n const tickSeq = observe ? (yield* TickSchedulerTag).getTickSeq() : undefined\n yield* runBoundary({\n kind: 'flow',\n name: 'workflow.cancel',\n payload: { programId: program.programId, cancelled: prevRunId, by: runId },\n meta: {\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n programId: program.programId,\n ...(tickSeq !== undefined ? { tickSeq } : null),\n policy: { disableObservers: !observe },\n reason: 'latest' as const,\n cancelledByRunId: runId,\n cancelledRunId: prevRunId,\n },\n effect: Effect.void,\n middleware: args.middleware,\n })\n }\n }\n state.currentRunId = runId\n }\n\n const observe = shouldObserveForRun(diagnostics, runSeq)\n const policy = { disableObservers: !observe } satisfies NonNullable<EffectOp.EffectOp['meta']>['policy']\n\n const programEffect = Effect.gen(function* () {\n const host = yield* HostSchedulerTag\n const tick = yield* TickSchedulerTag\n\n if (!program.steps) {\n const env = yield* Effect.context<unknown>()\n const portCache = new Map<string, ServicePort>()\n const resolvePort = (serviceId: string, stepKey: string): ServicePort => {\n const cached = portCache.get(serviceId)\n if (cached) return cached\n const resolved = resolveServicePort(runtime, env, serviceId, program.programId, stepKey)\n portCache.set(serviceId, resolved)\n return resolved\n }\n program.steps = compileSteps(program.compiledSteps, resolvePort)\n }\n\n const getTickSeq = (): number | undefined => (observe ? tick.getTickSeq() : undefined)\n const emitTimerEvents = observe && diagnostics === 'full'\n\n const evalPayload = (expr: CompiledInputExpr | undefined): unknown => (expr ? evalInputExpr(expr, args.payload) : undefined)\n\n const defaultInputForCall = (): unknown =>\n args.trigger.kind === 'action' ? args.payload : undefined\n\n let timerTriggered = false\n\n const runSteps = (steps: ReadonlyArray<CompiledRuntimeStep>): Effect.Effect<void, never, unknown> =>\n Effect.gen(function* () {\n for (const step of steps) {\n if (!canWriteBack()) return\n\n if (step.kind === 'dispatch') {\n const payload = evalPayload(step.payload)\n const action = { _tag: step.actionTag, payload }\n const tickSeq = getTickSeq()\n\n const dispatchEffectBase =\n program.priority === 'nonUrgent' ? runtime.dispatchLowPriority(action) : runtime.dispatch(action)\n\n const dispatchEffect = timerTriggered\n ? Effect.locally(\n currentTxnOriginOverride,\n {\n kind: 'workflow.timer',\n name: `timer:${program.programId}:${step.key}`,\n },\n )(dispatchEffectBase)\n : dispatchEffectBase\n\n yield* runBoundary({\n kind: 'flow',\n name: 'workflow.dispatch',\n payload: { actionTag: step.actionTag },\n meta: {\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n programId: program.programId,\n runId,\n stepKey: step.key,\n ...(tickSeq !== undefined ? { tickSeq } : null),\n policy,\n },\n effect: dispatchEffect,\n middleware: args.middleware,\n }).pipe(Effect.asVoid)\n continue\n }\n\n if (step.kind === 'delay') {\n const timerId = emitTimerEvents ? `${runId}::timer:${step.key}` : undefined\n\n const recordTimerEvent = (name: string, patchMeta?: Record<string, unknown>) =>\n Effect.gen(function* () {\n const tickSeq = getTickSeq()\n yield* runBoundary({\n kind: 'flow',\n name,\n payload: { ms: step.ms },\n meta: {\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n programId: program.programId,\n runId,\n stepKey: step.key,\n ...(timerId ? { timerId } : null),\n ...(tickSeq !== undefined ? { tickSeq } : null),\n policy,\n ...(patchMeta ?? null),\n },\n effect: Effect.void,\n middleware: args.middleware,\n })\n })\n\n const schedule = emitTimerEvents ? recordTimerEvent('workflow.timer.schedule') : Effect.void\n const onCancel = emitTimerEvents ? recordTimerEvent('workflow.timer.cancel', { reason: 'interrupt' }) : Effect.void\n const fired = emitTimerEvents ? recordTimerEvent('workflow.timer.fired') : Effect.void\n\n const delayEffect = schedule.pipe(\n Effect.zipRight(makeTimer({ host, ms: step.ms, onCancel })),\n Effect.zipRight(fired),\n )\n\n const tickSeq = getTickSeq()\n\n yield* runBoundary({\n kind: 'flow',\n name: 'workflow.delay',\n payload: { ms: step.ms },\n meta: {\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n programId: program.programId,\n runId,\n stepKey: step.key,\n ...(tickSeq !== undefined ? { tickSeq } : null),\n ...(timerId ? { timerId } : null),\n policy,\n },\n effect: delayEffect,\n middleware: args.middleware,\n }).pipe(Effect.asVoid)\n\n timerTriggered = true\n continue\n }\n\n // call\n const input = step.input ? evalInputExpr(step.input, args.payload) : defaultInputForCall()\n const maxRetries = step.retryTimes ?? 0\n // Attempt id is 1-based and stable within a run.\n let exit: Exit.Exit<unknown, unknown> | undefined\n for (let attempt = 1; attempt <= maxRetries + 1; attempt += 1) {\n const tickSeq = getTickSeq()\n\n const base = runBoundary({\n kind: 'service',\n name: `workflow.call:${step.serviceId}`,\n payload: { serviceId: step.serviceId },\n meta: {\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n programId: program.programId,\n runId,\n stepKey: step.key,\n serviceId: step.serviceId,\n attempt,\n ...(tickSeq !== undefined ? { tickSeq } : null),\n policy,\n },\n effect: step.port(input),\n middleware: args.middleware,\n })\n\n const withTimeout =\n step.timeoutMs === undefined\n ? base\n : Effect.gen(function* () {\n const timeoutMs = step.timeoutMs\n if (timeoutMs === undefined) {\n // Defensive: TS doesn't keep narrowing across generator boundaries.\n return yield* base\n }\n\n // Unique per attempt (otherwise retries would reuse the same timerId and break explainability).\n const timerId = emitTimerEvents ? `${runId}::timeout:${step.key}:a${attempt}` : undefined\n\n const recordTimeoutEvent = (name: string, patchMeta?: Record<string, unknown>) =>\n Effect.gen(function* () {\n const tickSeq = getTickSeq()\n yield* runBoundary({\n kind: 'flow',\n name,\n payload: { ms: timeoutMs },\n meta: {\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n programId: program.programId,\n runId,\n stepKey: step.key,\n attempt,\n ...(timerId ? { timerId } : null),\n ...(tickSeq !== undefined ? { tickSeq } : null),\n policy,\n ...(patchMeta ?? null),\n },\n effect: Effect.void,\n middleware: args.middleware,\n })\n })\n\n const schedule = emitTimerEvents ? recordTimeoutEvent('workflow.timeout.schedule') : Effect.void\n const onCancel = emitTimerEvents\n ? recordTimeoutEvent('workflow.timeout.cancel', { reason: 'interrupt' })\n : Effect.void\n const fired = emitTimerEvents ? recordTimeoutEvent('workflow.timeout.fired') : Effect.void\n\n const timeoutError = makeWorkflowError({\n code: 'WORKFLOW_CALL_TIMEOUT',\n message: `Workflow call timed out (serviceId=\"${step.serviceId}\", timeoutMs=${timeoutMs}).`,\n programId: program.programId,\n source: { stepKey: step.key },\n detail: { serviceId: step.serviceId, timeoutMs, attempt },\n })\n\n const timeoutFail = schedule.pipe(\n Effect.zipRight(makeTimer({ host, ms: timeoutMs, onCancel })),\n Effect.zipRight(fired),\n Effect.zipRight(Effect.fail(timeoutError)),\n )\n\n return yield* Effect.raceFirst(base, timeoutFail)\n })\n\n const attemptExit = yield* Effect.exit(withTimeout)\n exit = attemptExit\n\n if (!canWriteBack() || Exit.isSuccess(attemptExit)) {\n break\n }\n\n // Do not retry defects/interrupts; only retry failure-channel errors.\n if (Cause.isInterrupted(attemptExit.cause) || Option.isNone(Cause.failureOption(attemptExit.cause))) {\n break\n }\n\n // Retry if we still have remaining attempts.\n if (attempt < maxRetries + 1) {\n continue\n }\n\n break\n }\n\n // Defensive: attempt loop always runs at least once.\n if (!exit) {\n exit = Exit.succeed(undefined) as Exit.Exit<unknown, unknown>\n }\n\n if (!canWriteBack()) return\n\n if (Exit.isSuccess(exit)) {\n yield* runSteps(step.onSuccess)\n } else {\n // Timeout uses a timer; mark the continuation as timer-triggered (for trace:tick.triggerSummary).\n const failure = Option.getOrUndefined(Cause.failureOption(exit.cause))\n const isTimeout =\n isObjectLike(failure) &&\n (failure as Record<string, unknown>)._tag === 'WorkflowError' &&\n (failure as Record<string, unknown>).code === 'WORKFLOW_CALL_TIMEOUT'\n if (isTimeout) timerTriggered = true\n yield* runSteps(step.onFailure)\n }\n }\n })\n\n const runTickSeq = getTickSeq()\n yield* runBoundary({\n kind: 'flow',\n name: 'workflow.run',\n payload: { trigger: args.trigger },\n meta: {\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n programId: program.programId,\n runId,\n ...(runTickSeq !== undefined ? { tickSeq: runTickSeq } : null),\n policy,\n },\n effect: runSteps(program.steps!),\n middleware: args.middleware,\n }).pipe(Effect.asVoid)\n })\n\n const limited = registry.parallelLimiter ? registry.parallelLimiter.withPermits(1)(programEffect) : programEffect\n\n const fiber = yield* Effect.forkScoped(\n limited.pipe(\n Effect.catchAllCause((cause) => {\n const { errorSummary, downgrade } = toSerializableErrorSummary(cause)\n const downgradeHint = downgrade ? ` (downgrade=${downgrade})` : ''\n return Debug.record({\n type: 'diagnostic',\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n code: 'workflow::run_crashed',\n severity: 'error',\n message: `Workflow run crashed for programId=\"${program.programId}\" runId=\"${runId}\".${downgradeHint}`,\n hint: `${errorSummary.name ? `${errorSummary.name}: ` : ''}${errorSummary.message}`,\n actionTag: args.trigger.kind === 'action' ? args.trigger.actionTag : undefined,\n kind: 'workflow_run_crashed',\n trigger: {\n kind: 'workflow',\n name: 'run',\n details: {\n programId: program.programId,\n runId,\n trigger: args.trigger,\n },\n },\n }).pipe(Effect.catchAllCause(() => Effect.void))\n }),\n Effect.ensuring(\n Effect.sync(() => {\n if (state.mode === 'exhaust') {\n state.busy = false\n }\n }),\n ),\n ),\n )\n\n if (state.mode === 'latest') {\n state.current = fiber as Fiber.RuntimeFiber<void, never>\n }\n })\n\ntype RegistryInit = {\n readonly moduleId: string\n readonly instanceId: string\n readonly registry: WorkflowRegistryV1\n}\n\nconst ensureRegistry = (runtime: PublicModuleRuntime<unknown, unknown>) =>\n Effect.gen(function* () {\n const existing = getRegistry(runtime)\n if (existing) {\n return {\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n registry: existing,\n }\n }\n\n const portsReady = yield* Deferred.make<void, unknown>()\n\n const next: WorkflowRegistryV1 = {\n byActionTag: new Map(),\n entries: [],\n watcherStarted: false,\n watcherStartCount: 0,\n portsResolving: false,\n portsReady,\n parallelLimiter: undefined,\n }\n\n Object.defineProperty(runtime, WORKFLOW_REGISTRY, {\n value: next,\n enumerable: false,\n configurable: true,\n writable: false,\n })\n\n return { moduleId: runtime.moduleId, instanceId: runtime.instanceId, registry: next }\n })\n\nconst registerPrograms = (args: {\n readonly moduleTag: ModuleTag\n readonly programs: ReadonlyArray<WorkflowLike>\n readonly entryLabel: string\n}): Effect.Effect<void, never, unknown> =>\n Effect.gen(function* () {\n const runtime = yield* args.moduleTag\n const { moduleId, instanceId, registry } = yield* ensureRegistry(runtime)\n\n // Lazily resolve the global parallel limiter once.\n if (registry.parallelLimiter === undefined) {\n yield* ensureLimiterReady(registry, runtime)\n }\n\n const validateNoIoStepsForOnInit = (steps: ReadonlyArray<CompiledWorkflowStep>, programId: string): void => {\n const visit = (step: CompiledWorkflowStep): void => {\n if (step.kind === 'call' || step.kind === 'delay') {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_TRIGGER',\n message: 'Lifecycle onInit programs must not include call/delay (initRequired must stay sync-only; use onStart for IO/time).',\n programId,\n source: { stepKey: step.key },\n detail: { kind: step.kind },\n })\n }\n }\n for (const s of steps) visit(s)\n }\n\n const programHasCall = (steps: ReadonlyArray<CompiledWorkflowStep>): boolean =>\n steps.some((s) => s.kind === 'call')\n\n const insertEntry = (actionTag: string, entry: ProgramEntry): void => {\n const prev = registry.byActionTag.get(actionTag)\n registry.byActionTag.set(actionTag, prev ? [...prev, entry] : [entry])\n }\n\n const internals = getRuntimeInternals(runtime)\n\n for (const program of args.programs) {\n const def = program.def\n const localId = asNonEmptyString(def.localId)\n if (!localId) {\n throw makeWorkflowError({\n code: 'WORKFLOW_INVALID_DEF',\n message: 'Workflow.install: def.localId must be a non-empty string.',\n detail: { localId: def.localId },\n })\n }\n\n const programId = `${moduleId}.${localId}`\n const compiled = compileWorkflowRuntimeStepsV1({ def })\n\n if (def.trigger.kind === 'lifecycle' && def.trigger.phase === 'onInit') {\n validateNoIoStepsForOnInit(compiled, programId)\n }\n\n const compiledProgram: CompiledProgram = {\n programId,\n localId,\n trigger: def.trigger,\n concurrency: resolveConcurrency(def),\n priority: resolvePriority(def),\n compiledSteps: compiled,\n }\n\n if (!programHasCall(compiled)) {\n compiledProgram.steps = compileSteps(compiled, () => {\n throw makeWorkflowError({\n code: 'WORKFLOW_MISSING_SERVICE',\n message: 'Internal error: unexpected call step while resolving call-less program.',\n programId,\n detail: { programId },\n })\n })\n }\n\n const state: ProgramState =\n compiledProgram.concurrency === 'latest'\n ? { mode: 'latest', runSeq: 0, current: undefined, currentRunId: undefined }\n : compiledProgram.concurrency === 'exhaust'\n ? { mode: 'exhaust', runSeq: 0, busy: false }\n : { mode: 'parallel', runSeq: 0 }\n\n const entry: ProgramEntry = { program: compiledProgram, state }\n registry.entries.push(entry)\n\n if (def.trigger.kind === 'action') {\n insertEntry(def.trigger.actionTag, entry)\n } else {\n if (def.trigger.phase === 'onStart') {\n internals.lifecycle.registerStart(\n withRootEnvIfAvailable(\n Effect.gen(function* () {\n const middlewareOpt = yield* Effect.serviceOption(EffectOpCore.EffectOpMiddlewareTag)\n const middleware = Option.isSome(middlewareOpt) ? middlewareOpt.value : undefined\n yield* ensurePortsResolved(registry, runtime).pipe(Effect.orDie)\n yield* startProgramRun({\n entry,\n runtime,\n registry,\n trigger: { kind: 'lifecycle', phase: 'onStart' },\n payload: undefined,\n middleware,\n })\n }),\n ),\n { name: `workflow:${localId}` },\n )\n } else {\n internals.lifecycle.registerInitRequired(\n Effect.gen(function* () {\n const middlewareOpt = yield* Effect.serviceOption(EffectOpCore.EffectOpMiddlewareTag)\n const middleware = Option.isSome(middlewareOpt) ? middlewareOpt.value : undefined\n yield* startProgramRun({\n entry,\n runtime,\n registry,\n trigger: { kind: 'lifecycle', phase: 'onInit' },\n payload: undefined,\n middleware,\n })\n }),\n { name: `workflow:${localId}` },\n )\n }\n }\n }\n\n void instanceId\n })\n\nconst startWatcherIfNeeded = (args: {\n readonly moduleTag: ModuleTag\n readonly entryLabel: string\n}): Effect.Effect<void, never, unknown> =>\n Effect.gen(function* () {\n const runtime = yield* args.moduleTag\n const init = yield* ensureRegistry(runtime)\n const registry = init.registry\n\n if (registry.watcherStarted) {\n return\n }\n\n registry.watcherStarted = true\n registry.watcherStartCount += 1\n\n const middlewareOpt = yield* Effect.serviceOption(EffectOpCore.EffectOpMiddlewareTag)\n const middleware = Option.isSome(middlewareOpt) ? middlewareOpt.value : undefined\n\n const actions$ = runtime.actions$ as Stream.Stream<unknown>\n\n const portsExit = yield* Effect.exit(ensurePortsResolved(registry, runtime))\n if (Exit.isFailure(portsExit)) {\n const { errorSummary, downgrade } = toSerializableErrorSummary(portsExit.cause)\n const downgradeHint = downgrade ? ` (downgrade=${downgrade})` : ''\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n code: 'workflow::ports_resolution_failed',\n severity: 'error',\n message: `Workflow ports resolution failed before starting watcher.${downgradeHint}`,\n hint: `${errorSummary.name ? `${errorSummary.name}: ` : ''}${errorSummary.message}`,\n kind: 'workflow_ports_resolution_failed',\n trigger: {\n kind: 'workflow',\n name: 'portsResolution',\n details: {\n entryLabel: args.entryLabel,\n },\n },\n })\n return\n }\n\n yield* Stream.runForEach(actions$, (action) =>\n Effect.gen(function* () {\n const actionTag = resolveActionTag(action)\n if (!actionTag) return\n\n const entries = registry.byActionTag.get(actionTag)\n if (!entries || entries.length === 0) return\n\n const payload = isRecord(action) ? action.payload : undefined\n\n yield* Effect.forEach(\n entries,\n (entry) =>\n startProgramRun({\n entry,\n runtime,\n registry,\n trigger: { kind: 'action', actionTag },\n payload,\n middleware,\n }),\n { discard: true },\n )\n }),\n ).pipe(\n Effect.catchAllCause((cause) => {\n const { errorSummary, downgrade } = toSerializableErrorSummary(cause)\n const downgradeHint = downgrade ? ` (downgrade=${downgrade})` : ''\n return Debug.record({\n type: 'diagnostic',\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n code: 'workflow::watcher_crashed',\n severity: 'error',\n message: `Workflow watcher crashed.${downgradeHint}`,\n hint: `${errorSummary.name ? `${errorSummary.name}: ` : ''}${errorSummary.message}`,\n kind: 'workflow_watcher_crashed',\n trigger: {\n kind: 'workflow',\n name: 'watcher',\n details: {\n entryLabel: args.entryLabel,\n },\n },\n })\n }),\n )\n\n void args.entryLabel\n })\n\nexport const mountAll = (args: {\n readonly moduleTag: ModuleTag\n readonly programs: ReadonlyArray<WorkflowLike>\n}): LogicPlan<AnyModuleShape, unknown, never> => {\n const plan = {\n setup: registerPrograms({ moduleTag: args.moduleTag, programs: args.programs, entryLabel: 'mountAll' }),\n run: startWatcherIfNeeded({ moduleTag: args.moduleTag, entryLabel: 'mountAll' }),\n } satisfies LogicPlan<AnyModuleShape, unknown, never>\n\n LogicUnitMeta.attachLogicUnitMeta(plan, {\n id: '__logix_internal:workflows',\n kind: 'internal',\n name: 'workflows',\n })\n\n return plan\n}\n\nexport const installOne = (args: {\n readonly moduleTag: ModuleTag\n readonly program: WorkflowLike\n}): LogicPlan<AnyModuleShape, unknown, never> => {\n const localId = asNonEmptyString(args.program.def.localId) ?? 'unknown'\n const plan = {\n setup: registerPrograms({ moduleTag: args.moduleTag, programs: [args.program], entryLabel: `install:${localId}` }),\n run: startWatcherIfNeeded({ moduleTag: args.moduleTag, entryLabel: `install:${localId}` }),\n } satisfies LogicPlan<AnyModuleShape, unknown, never>\n\n LogicUnitMeta.attachLogicUnitMeta(plan, {\n id: `workflow:${localId}`,\n kind: 'workflow',\n name: localId,\n })\n\n return plan\n}\n\n// test-only probe: whether a watcher has started (for single-subscription gates).\nexport const __unsafeGetWatcherStartCount = (runtime: unknown): number => {\n if (!runtime || typeof runtime !== 'object') return 0\n const reg = getRegistry(runtime)\n return reg ? reg.watcherStartCount : 0\n}\n","// EffectOp core model and middleware composition logic.\n// For higher-level Runtime / Devtools integration, see:\n// specs/000-module-traits-runtime/references/effectop-and-middleware.md\n\nimport { Context, Effect, FiberRef } from 'effect'\n\n/**\n * currentLinkId:\n * - Stores the current operation chain id (linkId) in a FiberRef.\n * - Used to correlate multiple boundary ops within the same chain (can be shared across modules via the same FiberRef).\n */\nexport const currentLinkId = FiberRef.unsafeMake<string | undefined>(undefined)\n\n/**\n * OperationPolicy:\n * - Local policy markers (intent only; no rule logic attached).\n *\n * Constraints (enforced by Runtime/middleware together):\n * - Only observation-only capabilities (Observer) may be disabled; global guards must not be disabled.\n */\nexport interface OperationPolicy {\n readonly disableObservers?: boolean\n}\n\n/**\n * OperationRejected:\n * - Unified failure result when a guard rejects execution.\n * - Semantics: explicit failure with no business side effects (rejection must happen before user code executes).\n */\nexport interface OperationRejected {\n readonly _tag: 'OperationRejected'\n readonly message: string\n readonly kind?: EffectOp['kind']\n readonly name?: string\n readonly linkId?: string\n readonly details?: unknown\n}\n\n/**\n * OperationError:\n * - Any boundary operation executed via EffectOp may be explicitly rejected by Guard middleware.\n * - Therefore, the middleware error channel must allow OperationRejected to be added.\n */\nexport type OperationError<E> = E | OperationRejected\n\nexport const makeOperationRejected = (params: {\n readonly message: string\n readonly kind?: EffectOp['kind']\n readonly name?: string\n readonly linkId?: string\n readonly details?: unknown\n}): OperationRejected => ({\n _tag: 'OperationRejected',\n message: params.message,\n kind: params.kind,\n name: params.name,\n linkId: params.linkId,\n details: params.details,\n})\n\n/**\n * EffectOp: a unified representation of an Effect execution at an \"observable boundary\".\n *\n * - Out / Err / Env are the generic parameters of the underlying Effect.\n * - meta carries structured context needed by Devtools / Middleware.\n */\nexport interface EffectOp<Out = unknown, Err = unknown, Env = unknown> {\n readonly id: string\n readonly kind:\n | 'action'\n | 'flow'\n | 'state'\n | 'service'\n | 'lifecycle'\n | 'trait-computed'\n | 'trait-link'\n | 'trait-source'\n | 'devtools'\n readonly name: string\n readonly payload?: unknown\n readonly meta?: {\n /**\n * linkId:\n * - Operation chain id: multiple boundary ops in the same chain must share it.\n * - Runtime ensures this field is populated on all boundary ops.\n */\n linkId?: string\n moduleId?: string\n instanceId?: string\n runtimeLabel?: string\n txnId?: string\n txnSeq?: number\n opSeq?: number\n fieldPath?: string\n deps?: ReadonlyArray<string>\n from?: string\n to?: string\n traitNodeId?: string\n stepId?: string\n resourceId?: string\n key?: unknown\n trace?: ReadonlyArray<string>\n tags?: ReadonlyArray<string>\n policy?: OperationPolicy\n // Reserved extension slot for middleware/devtools to attach extra information.\n readonly [k: string]: unknown\n }\n readonly effect: Effect.Effect<Out, Err, Env>\n}\n\n/**\n * Middleware: the general middleware model for observing / wrapping / guarding EffectOps.\n */\nexport type Middleware = <A, E, R>(op: EffectOp<A, E, R>) => Effect.Effect<A, OperationError<E>, R>\n\nexport type MiddlewareStack = ReadonlyArray<Middleware>\n\n/**\n * EffectOpMiddlewareEnv:\n * - A Service in Effect Env that carries the current Runtime's MiddlewareStack.\n * - Injected by Runtime.ts when constructing a ManagedRuntime.\n * - Runtime code (e.g. StateTrait.install) uses this Service to decide which MiddlewareStack to use.\n */\nexport interface EffectOpMiddlewareEnv {\n readonly stack: MiddlewareStack\n}\n\nexport class EffectOpMiddlewareTag extends Context.Tag('Logix/EffectOpMiddleware')<\n EffectOpMiddlewareTag,\n EffectOpMiddlewareEnv\n>() {}\n\n/**\n * composeMiddleware:\n * - Composes Middleware from \"outer to inner\" in declaration order:\n * - stack = [mw1, mw2] => mw1 -> mw2 -> effect -> mw2 -> mw1\n * - Matches the reduceRight example in the reference docs.\n */\nexport const composeMiddleware = (stack: MiddlewareStack): Middleware => {\n return <A, E, R>(op: EffectOp<A, E, R>): Effect.Effect<A, OperationError<E>, R> =>\n stack.reduceRight<Effect.Effect<A, OperationError<E>, R>>(\n (eff, mw) => mw({ ...op, effect: eff } as any) as any,\n op.effect as Effect.Effect<A, OperationError<E>, R>,\n )\n}\n\n/**\n * runWithMiddleware:\n * - Executes a given EffectOp with a MiddlewareStack according to the composition rules.\n * - If the stack is empty, returns op.effect directly.\n */\nexport const runWithMiddleware = <A, E, R>(op: EffectOp<A, E, R>, stack: MiddlewareStack): Effect.Effect<A, E, R> => {\n return Effect.gen(function* () {\n const existing = yield* FiberRef.get(currentLinkId)\n const metaLinkId = (op.meta as any)?.linkId\n const linkId = typeof metaLinkId === 'string' && metaLinkId.length > 0 ? metaLinkId : (existing ?? op.id)\n\n const nextOp: EffectOp<A, E, R> = {\n ...op,\n meta: {\n ...(op.meta ?? {}),\n linkId,\n },\n }\n\n const program = stack.length ? composeMiddleware(stack)(nextOp) : nextOp.effect\n\n // linkId is created at the boundary root and reused for nested ops (the FiberRef is the global single source of truth).\n // NOTE: middleware may explicitly reject with OperationRejected.\n return yield* Effect.locally(currentLinkId, linkId)(program as any)\n }) as Effect.Effect<A, E, R>\n}\n","import { Cause, Effect, FiberRef, Layer, Logger } from 'effect'\nimport {\n projectJsonValue,\n type DowngradeReason as JsonDowngradeReason,\n type JsonValue,\n type JsonValueProjectionStats,\n} from '../../observability/jsonValue.js'\nimport type * as ReplayLog from './ReplayLog.js'\nimport {\n toSerializableErrorSummary,\n type DowngradeReason as ErrorDowngradeReason,\n type SerializableErrorSummary,\n} from './errorSummary.js'\nimport * as EffectOpCore from './EffectOpCore.js'\nimport type * as ProcessProtocol from './process/protocol.js'\nimport type { ConvergeStaticIrExport } from '../../state-trait/converge-ir.js'\n\nexport interface TriggerRef {\n readonly kind: string\n readonly name?: string\n readonly details?: unknown\n}\n\ntype TraceEventType = `trace:${string}`\ntype GenericTraceEventType = Exclude<\n TraceEventType,\n 'trace:trait:converge' | 'trace:trait:check' | 'trace:trait:validate'\n>\n\n/**\n * ReplayEventRef:\n * - Replay event structure referenced from Debug events.\n * - Based on ReplayLog.Event, enriched with txn/trigger association fields for Devtools aggregation and explanation.\n */\nexport type ReplayEventRef = ReplayLog.ReplayLogEvent & {\n readonly txnId?: string\n readonly trigger?: TriggerRef\n}\n\nexport type Event =\n | {\n readonly type: 'module:init'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'module:destroy'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'lifecycle:phase'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly phase: 'init' | 'run' | 'destroy' | 'platform'\n readonly name: string\n readonly payload?: unknown\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'action:dispatch'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly action: unknown\n readonly actionTag?: string\n readonly unknownAction?: boolean\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'state:update'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly state: unknown\n readonly txnSeq?: number\n readonly txnId?: string\n /**\n * Optional: Static IR digest aligned with FieldPathId/StepId (for consumer-side reverse-mapping & alignment).\n * - When missing or mismatched, consumers must not attempt to reverse-map rootIds -> rootPaths (avoid wrong UI).\n * - Allowed to be omitted on near-zero-cost diagnostics=off paths.\n */\n readonly staticIrDigest?: string\n /**\n * Optional: the affected scope aggregated by this commit (field-level dirty-set).\n * - Populated by Runtime at commit time;\n * - Must stay slim and serializable;\n * - Devtools can use it to explain \"why converge/validate ran / why it degraded to full\".\n */\n readonly dirtySet?: unknown\n /**\n * Optional: patch count aggregated by this commit (from StateTransaction).\n * - Populated by Runtime only on transaction paths.\n * - Devtools can use it as a lightweight transaction summary metric.\n */\n readonly patchCount?: number\n /**\n * Optional: whether patch records were truncated (bounded) under full instrumentation.\n */\n readonly patchesTruncated?: boolean\n /**\n * Optional: truncation reason code (stable enum).\n */\n readonly patchesTruncatedReason?: 'max_patches'\n /**\n * Optional: commit mode (normal/batched/low-priority, etc).\n * - Populated by Runtime;\n * - Default is chosen by the caller (typically \"normal\").\n */\n readonly commitMode?: string\n /**\n * Optional: external visibility priority (normal/low).\n * - Populated by Runtime.\n * - Mainly used by React external subscription scheduling (avoid unnecessary renders).\n */\n readonly priority?: string\n /**\n * Optional: transaction origin kind (origin.kind) that triggered this state commit:\n * - e.g. \"action\" / \"source-refresh\" / \"service-callback\" / \"devtools\".\n * - Populated by Runtime only on StateTransaction-based paths.\n * - Devtools can distinguish app transactions vs devtools time-travel operations.\n */\n readonly originKind?: string\n /**\n * Optional: transaction origin name (origin.name) that triggered this state commit:\n * - e.g. action dispatch / fieldPath / task:success/task:failure, etc.\n * - Populated by Runtime only on StateTransaction-based paths.\n */\n readonly originName?: string\n /**\n * Reserved: Trait converge summary (for Devtools window-level stats / TopN costs / degrade reasons, etc.).\n * - Phase 2: field slot only; structure is not fixed.\n * - Later phases will align with the Trait/Replay event model into an explainable structure.\n */\n readonly traitSummary?: unknown\n /**\n * Reserved: replay event associated with this transaction (re-emit source of truth from ReplayLog).\n * - Phase 2: field slot only.\n * - Later phases will align with ReplayLog.Event structure.\n */\n readonly replayEvent?: ReplayEventRef\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type:\n | 'process:start'\n | 'process:stop'\n | 'process:restart'\n | 'process:trigger'\n | 'process:dispatch'\n | 'process:error'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly identity: ProcessProtocol.ProcessInstanceIdentity\n readonly severity: 'info' | 'warning' | 'error'\n readonly eventSeq: number\n readonly timestampMs: number\n readonly trigger?: ProcessProtocol.ProcessTrigger\n readonly dispatch?: {\n readonly moduleId: string\n readonly instanceId: string\n readonly actionId: string\n }\n readonly error?: ProcessProtocol.SerializableErrorSummary\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'lifecycle:error'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly cause: unknown\n readonly phase?: 'init' | 'run' | 'destroy' | 'platform'\n readonly hook?: 'initRequired' | 'start' | 'destroy' | 'suspend' | 'resume' | 'reset' | 'unknown'\n readonly taskId?: string\n readonly opSeq?: number\n readonly origin?: string\n readonly txnSeq?: number\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'diagnostic'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly code: string\n readonly severity: 'error' | 'warning' | 'info'\n readonly message: string\n readonly hint?: string\n readonly actionTag?: string\n readonly kind?: string\n readonly txnSeq?: number\n readonly txnId?: string\n readonly trigger?: TriggerRef\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'warn:priority-inversion'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly tickSeq: number\n readonly reason: 'deferredBacklog' | 'subscribedNonUrgent'\n readonly selectorId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'warn:microtask-starvation'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly tickSeq: number\n readonly microtaskChainDepth?: number\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n /**\n * trace:* events:\n * - Extension hook for runtime tracing / Playground / Alignment Lab.\n * - Only the type prefix and moduleId are standardized; payload shape is defined by higher layers (e.g. spanId/attributes in data).\n */\n | {\n readonly type: 'trace:trait:converge'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data: JsonValue\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'trace:trait:check'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data: JsonValue\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'trace:trait:validate'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data: JsonValue\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: GenericTraceEventType\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data?: unknown\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n\nexport interface Sink {\n readonly record: (event: Event) => Effect.Effect<void>\n}\nexport const currentDebugSinks = FiberRef.unsafeMake<ReadonlyArray<Sink>>([])\nexport const currentRuntimeLabel = FiberRef.unsafeMake<string | undefined>(undefined)\nexport const currentTxnId = FiberRef.unsafeMake<string | undefined>(undefined)\nexport const currentOpSeq = FiberRef.unsafeMake<number | undefined>(undefined)\nexport type DiagnosticsLevel = 'off' | 'light' | 'sampled' | 'full'\nexport const currentDiagnosticsLevel = FiberRef.unsafeMake<DiagnosticsLevel>('off')\n\nexport const diagnosticsLevel = (level: DiagnosticsLevel): Layer.Layer<any, never, never> =>\n Layer.fiberRefLocallyScopedWith(currentDiagnosticsLevel as any, () => level) as Layer.Layer<any, never, never>\n\nexport interface TraitConvergeDiagnosticsSamplingConfig {\n /**\n * Sample once every N txns (deterministic, based on stable txnSeq).\n * - 1: sample every txn (timing granularity similar to full, while keeping payload slim)\n */\n readonly sampleEveryN: number\n /**\n * Max number of TopK hotspots to output (recommended ≤ 3).\n */\n readonly topK: number\n}\n\nexport const currentTraitConvergeDiagnosticsSampling = FiberRef.unsafeMake<TraitConvergeDiagnosticsSamplingConfig>({\n sampleEveryN: 32,\n topK: 3,\n})\n\nexport const traitConvergeDiagnosticsSampling = (\n config: TraitConvergeDiagnosticsSamplingConfig,\n): Layer.Layer<any, never, never> =>\n Layer.fiberRefLocallyScopedWith(currentTraitConvergeDiagnosticsSampling as any, () => config) as Layer.Layer<\n any,\n never,\n never\n >\n\nexport const appendSinks = (sinks: ReadonlyArray<Sink>): Layer.Layer<any, never, never> =>\n Layer.fiberRefLocallyScopedWith(currentDebugSinks, (current) => [...current, ...sinks]) as Layer.Layer<\n any,\n never,\n never\n >\n\nexport type RuntimeDebugEventKind =\n | 'action'\n | 'state'\n | 'service'\n | 'process'\n | 'trait-computed'\n | 'trait-link'\n | 'trait-source'\n | 'lifecycle'\n | 'react-render'\n | 'devtools'\n | 'diagnostic'\n | (string & {})\n\nexport interface RuntimeDebugEventRef {\n readonly eventId: string\n readonly eventSeq: number\n readonly moduleId: string\n readonly instanceId: string\n readonly runtimeLabel?: string\n readonly txnSeq: number\n readonly txnId?: string\n /**\n * linkId:\n * - Current operation chain id (shared by boundary ops in the same chain).\n * - Created by Runtime at the boundary root and propagated via FiberRef across nested/cross-module chains.\n */\n readonly linkId?: string\n readonly timestamp: number\n readonly kind: RuntimeDebugEventKind\n readonly label: string\n readonly meta?: JsonValue\n readonly errorSummary?: SerializableErrorSummary\n readonly downgrade?: {\n readonly reason?: 'non_serializable' | 'oversized' | 'unknown'\n }\n}\n\nexport type TxnLaneEvidenceReason =\n | 'disabled'\n | 'forced_off'\n | 'forced_sync'\n | 'queued_non_urgent'\n | 'preempted_by_urgent'\n | 'budget_yield'\n | 'coalesced'\n | 'canceled'\n | 'max_lag_forced'\n | 'starvation_protection'\n\nexport type TxnLaneNonUrgentYieldReason = 'none' | 'input_pending' | 'budget_exceeded' | 'forced_frame_yield'\n\nexport type TxnLaneEvidence = {\n readonly anchor: {\n readonly moduleId: string\n readonly instanceId: string\n readonly txnSeq: number\n readonly opSeq?: number\n }\n readonly lane: 'urgent' | 'nonUrgent'\n readonly kind: string\n readonly policy: {\n readonly enabled: boolean\n readonly overrideMode?: 'forced_off' | 'forced_sync'\n readonly configScope: 'provider' | 'runtime_module' | 'runtime_default' | 'builtin'\n readonly budgetMs: number\n readonly debounceMs: number\n readonly maxLagMs: number\n readonly allowCoalesce: boolean\n readonly yieldStrategy?: 'baseline' | 'inputPending'\n readonly queueMode?: 'fifo' | 'lanes'\n }\n readonly backlog: {\n readonly pendingCount: number\n readonly ageMs?: number\n readonly coalescedCount?: number\n readonly canceledCount?: number\n }\n readonly budget?: {\n readonly budgetMs?: number\n readonly sliceDurationMs?: number\n readonly yieldCount?: number\n readonly yielded?: boolean\n readonly yieldReason?: TxnLaneNonUrgentYieldReason\n }\n readonly starvation?: {\n readonly triggered?: boolean\n readonly reason?: string\n }\n readonly reasons: ReadonlyArray<TxnLaneEvidenceReason>\n}\n\nlet nextGlobalEventSeq = 0\n\nexport const clearRuntimeDebugEventSeq = (): void => {\n nextGlobalEventSeq = 0\n}\n\nconst nextEventSeq = (): number => {\n nextGlobalEventSeq += 1\n return nextGlobalEventSeq\n}\n\nconst makeEventId = (instanceId: string, eventSeq: number): string => `${instanceId}::e${eventSeq}`\n\ntype DowngradeReason = JsonDowngradeReason | ErrorDowngradeReason\n\nconst mergeDowngrade = (\n current: DowngradeReason | undefined,\n next: DowngradeReason | undefined,\n): DowngradeReason | undefined => {\n if (!current) return next\n if (!next) return current\n if (current === 'non_serializable' || next === 'non_serializable') return 'non_serializable'\n if (current === 'oversized' || next === 'oversized') return 'oversized'\n return 'unknown'\n}\n\n// In browsers, to reduce duplicated noise caused by React StrictMode, etc.,\n// de-duplicate lifecycle:error and diagnostic events: print the same moduleId+payload only once.\nconst browserLifecycleSeen = new Set<string>()\nconst browserDiagnosticSeen = new Set<string>()\n\n// Align trace:react-render events with the most recent state:update txn (UI-only association).\nconst lastTxnByInstance = new Map<string, { readonly txnId: string; readonly txnSeq: number }>()\n\n// trace:react-render / trace:react-selector may enter the sink before state:update (reordering due to concurrency/scheduling).\n// To provide usable txn anchors in Devtools/UI, we allow a one-time backfill for refs missing txn fields.\nconst pendingTxnAlignmentByInstance = new Map<string, Array<RuntimeDebugEventRef>>()\n\nconst enqueuePendingTxnAlignment = (instanceId: string, ref: RuntimeDebugEventRef): void => {\n const list = pendingTxnAlignmentByInstance.get(instanceId)\n if (!list) {\n pendingTxnAlignmentByInstance.set(instanceId, [ref])\n return\n }\n list.push(ref)\n if (list.length > 64) {\n list.shift()\n }\n}\n\nconst backfillPendingTxnAlignment = (\n instanceId: string,\n txn: { readonly txnId: string; readonly txnSeq: number },\n): void => {\n const pending = pendingTxnAlignmentByInstance.get(instanceId)\n if (!pending || pending.length === 0) {\n pendingTxnAlignmentByInstance.delete(instanceId)\n return\n }\n\n for (const ref of pending) {\n const anyRef: any = ref as any\n if (anyRef.txnId == null) {\n anyRef.txnId = txn.txnId\n }\n if (typeof anyRef.txnSeq !== 'number' || anyRef.txnSeq <= 0) {\n anyRef.txnSeq = txn.txnSeq\n }\n }\n\n pendingTxnAlignmentByInstance.delete(instanceId)\n}\n\nconst lifecycleErrorLog = (event: Extract<Event, { readonly type: 'lifecycle:error' }>) => {\n const moduleId = event.moduleId ?? 'unknown'\n const causePretty = (() => {\n try {\n return Cause.pretty(event.cause as Cause.Cause<unknown>, {\n renderErrorCause: true,\n })\n } catch {\n try {\n return JSON.stringify(event.cause, null, 2)\n } catch {\n return String(event.cause)\n }\n }\n })()\n\n const message = `[Logix][module=${moduleId}] lifecycle:error\\n${causePretty}`\n\n return Effect.logError(message).pipe(\n Effect.annotateLogs({\n 'logix.moduleId': moduleId,\n 'logix.event': 'lifecycle:error',\n 'logix.cause': causePretty,\n }),\n )\n}\n\nconst diagnosticLog = (event: Extract<Event, { readonly type: 'diagnostic' }>) => {\n const moduleId = event.moduleId ?? 'unknown'\n const header = `[Logix][module=${moduleId}] diagnostic(${event.severity})`\n const detail = `code=${event.code} message=${event.message}${\n event.actionTag ? ` action=${event.actionTag}` : ''\n }${event.hint ? `\\nhint: ${event.hint}` : ''}`\n const msg = `${header}\\n${detail}`\n\n const base =\n event.severity === 'warning'\n ? Effect.logWarning(msg)\n : event.severity === 'info'\n ? Effect.logInfo(msg)\n : Effect.logError(msg)\n\n const annotations: Record<string, unknown> = {\n 'logix.moduleId': moduleId,\n 'logix.event': `diagnostic(${event.severity})`,\n 'logix.diagnostic.code': event.code,\n 'logix.diagnostic.message': event.message,\n }\n if (event.hint) {\n annotations['logix.diagnostic.hint'] = event.hint\n }\n if (event.actionTag) {\n annotations['logix.diagnostic.actionTag'] = event.actionTag\n }\n\n return base.pipe(Effect.annotateLogs(annotations))\n}\n\n/**\n * Default Layer composition based on FiberRef.currentDebugSinks:\n * - Uses Layer.locallyScoped to inject Debug sinks via FiberRef state.\n * - Avoids misusing FiberRef as a Context.Tag.\n */\nexport const noopLayer = Layer.locallyScoped(currentDebugSinks, [])\n\n/**\n * errorOnlyLayer:\n * - Default DebugSink implementation that only cares about lifecycle:error events.\n * - Suitable as a \"minimum observability\" layer so fatal errors don't silently disappear.\n * - Other events (module:init/destroy, action:dispatch, state:update) are not recorded by default.\n */\nconst errorOnlySink: Sink = {\n record: (event: Event) =>\n event.type === 'lifecycle:error'\n ? lifecycleErrorLog(event)\n : event.type === 'diagnostic' && event.severity !== 'info'\n ? diagnosticLog(event)\n : Effect.void,\n}\n\nexport const errorOnlyLayer = Layer.locallyScoped(currentDebugSinks, [errorOnlySink])\n\nexport const isErrorOnlyOnlySinks = (sinks: ReadonlyArray<Sink>): boolean => sinks.length === 1 && sinks[0] === errorOnlySink\n\n/**\n * consoleLayer:\n * - Full debug layer that logs all Debug events via Effect logs (logfmt / structured).\n * - Suitable as an observability layer for general environments (Node / tests).\n */\nconst consoleSink: Sink = {\n record: (event: Event) =>\n event.type === 'lifecycle:error'\n ? lifecycleErrorLog(event)\n : event.type === 'diagnostic'\n ? diagnosticLog(event)\n : Effect.logDebug({ debugEvent: event }),\n}\n\nexport const consoleLayer = Layer.locallyScoped(currentDebugSinks, [consoleSink])\n\nconst isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'\n\n// Shared browser console rendering logic used by the default DebugSink and browserConsoleLayer.\nconst renderBrowserConsoleEvent = (event: Event): Effect.Effect<void> => {\n // trace:* events: shown as separate groups in browsers for Playground / DevTools observation.\n if (typeof (event as any).type === 'string' && (event as any).type.startsWith('trace:')) {\n const moduleId = (event as any).moduleId ?? 'unknown'\n const type = (event as any).type\n\n return Effect.sync(() => {\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n '%c[Logix]%c trace %c' + moduleId + '%c ' + String(type),\n 'color:#6b7280;font-weight:bold', // tag\n 'color:#3b82f6', // label\n 'color:#9ca3af', // module id\n 'color:#6b7280', // type\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n })\n }\n\n if (event.type === 'lifecycle:error') {\n const moduleId = event.moduleId ?? 'unknown'\n const causePretty = (() => {\n try {\n return Cause.pretty(event.cause as Cause.Cause<unknown>, { renderErrorCause: true })\n } catch {\n try {\n return JSON.stringify(event.cause, null, 2)\n } catch {\n return String(event.cause)\n }\n }\n })()\n\n const key = `${moduleId}|${causePretty}`\n if (browserLifecycleSeen.has(key)) {\n return Effect.void\n }\n browserLifecycleSeen.add(key)\n\n return Effect.sync(() => {\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n '%c[Logix]%c lifecycle:error %c' + moduleId,\n 'color:#ef4444;font-weight:bold', // tag\n 'color:#ef4444', // label\n 'color:#9ca3af', // module id\n )\n // eslint-disable-next-line no-console\n console.error(causePretty)\n // eslint-disable-next-line no-console\n console.groupEnd()\n })\n }\n\n if (event.type === 'diagnostic') {\n const moduleId = event.moduleId ?? 'unknown'\n const detail = `code=${event.code} message=${event.message}${\n event.actionTag ? ` action=${event.actionTag}` : ''\n }${event.hint ? `\\nhint: ${event.hint}` : ''}`\n\n const color =\n event.severity === 'warning' ? 'color:#d97706' : event.severity === 'info' ? 'color:#3b82f6' : 'color:#ef4444'\n\n const label =\n event.severity === 'warning'\n ? 'diagnostic(warning)'\n : event.severity === 'info'\n ? 'diagnostic(info)'\n : 'diagnostic(error)'\n\n const key = `${moduleId}|${event.code}|${event.message}`\n if (browserDiagnosticSeen.has(key)) {\n return Effect.void\n }\n browserDiagnosticSeen.add(key)\n\n return Effect.sync(() => {\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n '%c[Logix]%c ' + label + '%c module=' + moduleId,\n 'color:#6b7280;font-weight:bold',\n color,\n 'color:#9ca3af',\n )\n if (event.severity === 'warning') {\n // eslint-disable-next-line no-console\n console.warn(detail)\n } else if (event.severity === 'info') {\n // eslint-disable-next-line no-console\n console.info(detail)\n } else {\n // eslint-disable-next-line no-console\n console.error(detail)\n }\n // eslint-disable-next-line no-console\n console.groupEnd()\n })\n }\n\n // Other events are not printed to the browser console by default to avoid being too noisy during development.\n // For internal debug events, use a custom Debug sink or use consoleLayer in Node.\n return Effect.void\n}\n\n/**\n * Browser console debug layer:\n * - In browsers, uses console.groupCollapsed + colored labels to simulate pretty logger grouping.\n * - In non-browser environments, falls back to consoleLayer's Effect logging implementation.\n */\nconst browserConsoleSink: Sink = {\n record: (event: Event) => {\n if (!isBrowser) {\n // Non-browser: fall back to consoleLayer behavior (Effect.log*).\n return event.type === 'lifecycle:error'\n ? lifecycleErrorLog(event)\n : event.type === 'diagnostic'\n ? diagnosticLog(event)\n : Effect.logDebug({ debugEvent: event })\n }\n\n return renderBrowserConsoleEvent(event)\n },\n}\n\nexport const browserConsoleLayer = Layer.locallyScoped(currentDebugSinks, [browserConsoleSink])\n\n/**\n * Browser diagnostic-only debug layer:\n * - In browsers, prints only lifecycle:error + diagnostic(warning/error) via console.groupCollapsed.\n * - Drops trace:* and other high-frequency events from the browser console (use DevtoolsHub instead).\n * - In non-browser environments, behaves like errorOnlySink (Effect.log*).\n */\nconst browserDiagnosticConsoleSink: Sink = {\n record: (event: Event) => {\n if (!isBrowser) {\n return event.type === 'lifecycle:error'\n ? lifecycleErrorLog(event)\n : event.type === 'diagnostic' && event.severity !== 'info'\n ? diagnosticLog(event)\n : Effect.void\n }\n\n return event.type === 'lifecycle:error' || (event.type === 'diagnostic' && event.severity !== 'info')\n ? renderBrowserConsoleEvent(event)\n : Effect.void\n },\n}\n\nexport const browserDiagnosticConsoleLayer = Layer.locallyScoped(currentDebugSinks, [browserDiagnosticConsoleSink])\n\n/**\n * Browser-friendly Logger layer: replaces the default logger with Effect's pretty logger (browser mode).\n * - Avoids hand-written console styles; reuses Effect's colored/grouped formatting.\n * - Safely degrades to the default logger in server environments.\n */\nexport const browserPrettyLoggerLayer = Logger.replace(\n Logger.defaultLogger,\n Logger.prettyLogger({ mode: 'browser', colors: true }),\n)\n\n/**\n * defaultLayer:\n * - Public default layer; currently equivalent to errorOnlyLayer.\n * - Records lifecycle:error only, avoiding a large volume of action/state logs by default.\n */\nexport const defaultLayer = errorOnlyLayer\n\nexport const record = (event: Event) =>\n Effect.gen(function* () {\n const sinks = yield* FiberRef.get(currentDebugSinks)\n\n // Fast path: production default installs errorOnlyLayer (sinks=1).\n // Avoid paying diagnostics FiberRef + enrichment costs for high-frequency events that are always dropped by errorOnly.\n if (isErrorOnlyOnlySinks(sinks)) {\n if (event.type === 'lifecycle:error') {\n yield* lifecycleErrorLog(event)\n return\n }\n if (event.type === 'diagnostic') {\n if (event.severity !== 'info') {\n yield* diagnosticLog(event)\n } else {\n yield* Effect.void\n }\n return\n }\n yield* Effect.void\n return\n }\n\n // Fast path: when no sinks are installed, only a small subset of events are ever surfaced.\n // Avoid paying per-event FiberRef + enrichment costs for high-frequency events like state:update.\n if (sinks.length === 0) {\n if (isBrowser) {\n if (event.type === 'lifecycle:error' || event.type === 'diagnostic') {\n yield* renderBrowserConsoleEvent(event)\n return\n }\n yield* Effect.void\n return\n }\n\n if (event.type === 'lifecycle:error') {\n yield* lifecycleErrorLog(event)\n return\n }\n if (event.type === 'diagnostic') {\n yield* diagnosticLog(event)\n return\n }\n yield* Effect.void\n return\n }\n\n const enriched = event as Event\n\n const diagnosticsLevel = yield* FiberRef.get(currentDiagnosticsLevel)\n\n // Enrich Debug.Event with basic fields (enabled only when diagnosticsLevel!=off):\n // - timestamp: for Devtools/Timeline/Overview time aggregation; avoids UI-side \"first observed time\" distortion.\n // - runtimeLabel: from FiberRef for grouping by runtime (injected only when not already provided by the event).\n let now: number | undefined\n const getNow = (): number => {\n if (now === undefined) now = Date.now()\n return now\n }\n\n // diagnostics=off: keep near-zero cost; do not add timestamp for high-frequency events (avoid extra Date.now()).\n // Low-frequency events (lifecycle:error/diagnostic) may still get timestamp for easier debugging.\n if (\n enriched.timestamp === undefined &&\n (diagnosticsLevel !== 'off' || enriched.type === 'lifecycle:error' || enriched.type === 'diagnostic')\n ) {\n ;(enriched as any).timestamp = getNow()\n }\n if (diagnosticsLevel !== 'off' && enriched.runtimeLabel === undefined) {\n const runtimeLabel = yield* FiberRef.get(currentRuntimeLabel)\n if (runtimeLabel) {\n ;(enriched as any).runtimeLabel = runtimeLabel\n }\n }\n\n if (enriched.type === 'diagnostic' && (enriched as any).txnId === undefined) {\n const txnId = yield* FiberRef.get(currentTxnId)\n if (txnId) {\n ;(enriched as any).txnId = txnId\n }\n }\n // linkId is meaningful only for EffectOp events: avoid extra FiberRef reads on high-frequency events (state:update, etc.).\n if (\n diagnosticsLevel !== 'off' &&\n (enriched as any).type === 'trace:effectop' &&\n (enriched as any).linkId === undefined\n ) {\n const linkId = yield* FiberRef.get(EffectOpCore.currentLinkId)\n if (linkId) {\n ;(enriched as any).linkId = linkId\n }\n }\n\n if (sinks.length === 1) {\n yield* sinks[0]!.record(enriched)\n return\n }\n\n yield* Effect.forEach(sinks, (sink) => sink.record(enriched), { discard: true })\n })\n\n/**\n * Normalizes internal Debug.Event into RuntimeDebugEventRef:\n * - Allows Devtools / Runtime to consume Debug events uniformly.\n * - Does not change DebugSink behavior; provides a structured view only.\n */\nexport const toRuntimeDebugEventRef = (\n event: Event,\n options?: {\n readonly diagnosticsLevel?: DiagnosticsLevel\n readonly eventSeq?: number\n readonly resolveConvergeStaticIr?: (staticIrDigest: string) => ConvergeStaticIrExport | undefined\n readonly onMetaProjection?: (projection: {\n readonly stats: JsonValueProjectionStats\n readonly downgrade?: JsonDowngradeReason\n }) => void\n },\n): RuntimeDebugEventRef | undefined => {\n const diagnosticsLevel = options?.diagnosticsLevel ?? 'full'\n if (diagnosticsLevel === 'off') {\n return undefined\n }\n\n const isLightLike = diagnosticsLevel === 'light' || diagnosticsLevel === 'sampled'\n\n const timestamp =\n typeof event.timestamp === 'number' && Number.isFinite(event.timestamp) ? event.timestamp : Date.now()\n\n const moduleIdRaw = (event as any).moduleId\n const moduleId = typeof moduleIdRaw === 'string' && moduleIdRaw.length > 0 ? moduleIdRaw : 'unknown'\n\n const instanceIdRaw = (event as any).instanceId\n const instanceId = typeof instanceIdRaw === 'string' && instanceIdRaw.length > 0 ? instanceIdRaw : 'unknown'\n\n const runtimeLabelRaw = (event as any).runtimeLabel\n const runtimeLabel = typeof runtimeLabelRaw === 'string' && runtimeLabelRaw.length > 0 ? runtimeLabelRaw : undefined\n\n const txnSeqRaw = (event as any).txnSeq\n const txnSeq =\n typeof txnSeqRaw === 'number' && Number.isFinite(txnSeqRaw) && txnSeqRaw >= 0 ? Math.floor(txnSeqRaw) : 0\n\n const txnIdRaw = (event as any).txnId\n const txnId =\n typeof txnIdRaw === 'string' && txnIdRaw.length > 0\n ? txnIdRaw\n : txnSeq > 0\n ? `${instanceId}::t${txnSeq}`\n : undefined\n\n const linkId = (() => {\n const linkIdRaw = (event as any).linkId\n if (typeof linkIdRaw === 'string' && linkIdRaw.length > 0) return linkIdRaw\n\n // trace:*: allow fallback extraction from data.meta.linkId (avoid UI diving into deep meta).\n if (typeof (event as any).type !== 'string' || !(event as any).type.startsWith('trace:')) {\n return undefined\n }\n\n const data: any = (event as any).data\n const meta: any = data?.meta\n const linkIdFromMeta = meta?.linkId\n if (typeof linkIdFromMeta === 'string' && linkIdFromMeta.length > 0) return linkIdFromMeta\n\n return undefined\n })()\n\n const eventSeqRaw = options?.eventSeq\n const eventSeq =\n typeof eventSeqRaw === 'number' && Number.isFinite(eventSeqRaw) && eventSeqRaw > 0\n ? Math.floor(eventSeqRaw)\n : nextEventSeq()\n const eventId = makeEventId(instanceId, eventSeq)\n\n const base = {\n eventId,\n eventSeq,\n moduleId,\n instanceId,\n runtimeLabel,\n txnSeq,\n txnId,\n linkId,\n timestamp,\n } as const\n\n let downgrade: DowngradeReason | undefined\n\n const withDowngrade = (ref: Omit<RuntimeDebugEventRef, 'downgrade'>): RuntimeDebugEventRef => {\n if (!downgrade) return ref\n return { ...ref, downgrade: { reason: downgrade } }\n }\n\n switch (event.type) {\n case 'module:init':\n return withDowngrade({\n ...base,\n kind: 'lifecycle',\n label: 'module:init',\n })\n case 'module:destroy':\n return withDowngrade({\n ...base,\n kind: 'lifecycle',\n label: 'module:destroy',\n })\n case 'lifecycle:phase': {\n const e = event as Extract<Event, { readonly type: 'lifecycle:phase' }>\n const metaInput = isLightLike\n ? { type: 'lifecycle:phase', phase: e.phase, name: e.name }\n : { type: 'lifecycle:phase', phase: e.phase, name: e.name, payload: e.payload }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n return withDowngrade({\n ...base,\n kind: 'lifecycle',\n label: e.name,\n meta: metaProjection.value,\n })\n }\n case 'action:dispatch': {\n const action: any = (event as any).action\n const actionTagRaw = (event as any).actionTag\n const tag = typeof actionTagRaw === 'string' && actionTagRaw.length > 0 ? actionTagRaw : (action?._tag ?? action?.type)\n const label = String(tag ?? 'action:dispatch')\n const labelNormalized = label.length > 0 ? label : 'unknown'\n const unknownAction = (event as any).unknownAction === true ? true : undefined\n const metaInput = isLightLike\n ? { actionTag: labelNormalized, ...(unknownAction ? { unknownAction: true } : {}) }\n : { action, ...(unknownAction ? { unknownAction: true } : {}) }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n if (unknownAction) {\n downgrade = mergeDowngrade(downgrade, 'unknown')\n }\n return withDowngrade({\n ...base,\n kind: 'action',\n label: labelNormalized,\n meta: metaProjection.value,\n })\n }\n case 'state:update': {\n const e = event as Extract<Event, { readonly type: 'state:update' }>\n\n const resolveDirtySetRootPaths = (): ReadonlyArray<JsonValue> | undefined => {\n const resolve = options?.resolveConvergeStaticIr\n if (!resolve) return undefined\n\n const digest = e.staticIrDigest\n if (typeof digest !== 'string' || digest.length === 0) return undefined\n\n const dirtySet = e.dirtySet as any\n if (!dirtySet || typeof dirtySet !== 'object' || Array.isArray(dirtySet)) return undefined\n\n const rootIds = dirtySet.rootIds\n if (!Array.isArray(rootIds) || rootIds.length === 0) return undefined\n\n const ir = resolve(digest) as ConvergeStaticIrExport | undefined\n const fieldPaths = (ir as any)?.fieldPaths as unknown\n if (!Array.isArray(fieldPaths) || fieldPaths.length === 0) return undefined\n\n const out: Array<JsonValue> = []\n for (const rawId of rootIds) {\n if (typeof rawId !== 'number' || !Number.isFinite(rawId)) continue\n const id = Math.floor(rawId)\n if (id < 0) continue\n const path = (fieldPaths as any)[id] as unknown\n if (!Array.isArray(path) || path.length === 0) continue\n if (!path.every((seg) => typeof seg === 'string' && seg.length > 0)) continue\n out.push(path as any)\n }\n\n return out.length > 0 ? out : undefined\n }\n\n const dirtySetWithRootPaths = (() => {\n const rootPaths = resolveDirtySetRootPaths()\n if (!rootPaths) return e.dirtySet\n const dirtySet = e.dirtySet as any\n if (!dirtySet || typeof dirtySet !== 'object' || Array.isArray(dirtySet)) return e.dirtySet\n return { ...dirtySet, rootPaths }\n })()\n\n const metaInput = isLightLike\n ? {\n state: e.state,\n dirtySet: dirtySetWithRootPaths,\n patchCount: e.patchCount,\n patchesTruncated: e.patchesTruncated,\n patchesTruncatedReason: e.patchesTruncatedReason,\n staticIrDigest: e.staticIrDigest,\n commitMode: e.commitMode,\n priority: e.priority,\n originKind: e.originKind,\n originName: e.originName,\n }\n : {\n state: e.state,\n dirtySet: dirtySetWithRootPaths,\n patchCount: e.patchCount,\n patchesTruncated: e.patchesTruncated,\n patchesTruncatedReason: e.patchesTruncatedReason,\n staticIrDigest: e.staticIrDigest,\n commitMode: e.commitMode,\n priority: e.priority,\n originKind: e.originKind,\n originName: e.originName,\n traitSummary: e.traitSummary,\n replayEvent: e.replayEvent,\n }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n if (txnId) {\n lastTxnByInstance.set(instanceId, { txnId, txnSeq })\n backfillPendingTxnAlignment(instanceId, { txnId, txnSeq })\n }\n return withDowngrade({\n ...base,\n kind: 'state',\n label: 'state:update',\n meta: metaProjection.value,\n })\n }\n case 'process:start':\n case 'process:stop':\n case 'process:restart':\n case 'process:trigger':\n case 'process:dispatch':\n case 'process:error': {\n const e = event as Extract<\n Event,\n {\n readonly type:\n | 'process:start'\n | 'process:stop'\n | 'process:restart'\n | 'process:trigger'\n | 'process:dispatch'\n | 'process:error'\n }\n >\n\n const ts2 = typeof e.timestampMs === 'number' && Number.isFinite(e.timestampMs) ? e.timestampMs : timestamp\n\n const metaInput = {\n identity: e.identity,\n severity: e.severity,\n eventSeq: e.eventSeq,\n timestampMs: e.timestampMs,\n trigger: e.trigger,\n dispatch: e.dispatch,\n error: e.error,\n }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n const errorSummary =\n e.type === 'process:error' || e.type === 'process:restart'\n ? (e.error as any as SerializableErrorSummary | undefined)\n : undefined\n\n return withDowngrade({\n ...base,\n timestamp: ts2,\n kind: 'process',\n label: e.type,\n meta: metaProjection.value,\n errorSummary,\n })\n }\n case 'lifecycle:error': {\n const e = event as Extract<Event, { readonly type: 'lifecycle:error' }>\n const summary = toSerializableErrorSummary(e.cause)\n downgrade = mergeDowngrade(downgrade, summary.downgrade)\n const metaInput = isLightLike\n ? { type: 'lifecycle:error', phase: e.phase, name: e.hook }\n : {\n type: 'lifecycle:error',\n phase: e.phase,\n name: e.hook,\n hook: e.hook,\n taskId: e.taskId,\n origin: e.origin,\n txnSeq: e.txnSeq,\n opSeq: e.opSeq,\n }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n return withDowngrade({\n ...base,\n kind: 'lifecycle',\n label: 'lifecycle:error',\n meta: metaProjection.value,\n errorSummary: summary.errorSummary,\n })\n }\n case 'diagnostic': {\n const e = event as Extract<Event, { readonly type: 'diagnostic' }>\n const metaInput = {\n code: e.code,\n severity: e.severity,\n message: e.message,\n hint: e.hint,\n actionTag: e.actionTag,\n kind: e.kind,\n trigger: e.trigger,\n }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n return withDowngrade({\n ...base,\n kind: 'diagnostic',\n label: e.code,\n meta: metaProjection.value,\n })\n }\n case 'warn:priority-inversion': {\n const e = event as Extract<Event, { readonly type: 'warn:priority-inversion' }>\n const metaInput = isLightLike\n ? {\n tickSeq: e.tickSeq,\n reason: e.reason,\n selectorId: e.selectorId,\n }\n : {\n tickSeq: e.tickSeq,\n reason: e.reason,\n selectorId: e.selectorId,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'diagnostic',\n label: e.type,\n meta: metaProjection.value,\n })\n }\n case 'warn:microtask-starvation': {\n const e = event as Extract<Event, { readonly type: 'warn:microtask-starvation' }>\n const metaInput = isLightLike\n ? {\n tickSeq: e.tickSeq,\n microtaskChainDepth: e.microtaskChainDepth,\n }\n : {\n tickSeq: e.tickSeq,\n microtaskChainDepth: e.microtaskChainDepth,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'diagnostic',\n label: e.type,\n meta: metaProjection.value,\n })\n }\n default: {\n if (typeof event.type !== 'string' || !event.type.startsWith('trace:')) {\n return undefined\n }\n\n // trace:tick: runtime tick evidence; keep Slim payload even in light tier.\n if (event.type === 'trace:tick') {\n const data: any = (event as any).data\n const metaInput = isLightLike\n ? {\n tickSeq: data?.tickSeq,\n phase: data?.phase,\n schedule: data?.schedule,\n triggerSummary: data?.triggerSummary,\n anchors: data?.anchors,\n budget: data?.budget,\n backlog: data?.backlog,\n result: data?.result,\n }\n : {\n data,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:txn-lane: slim evidence for Txn Lanes (lane/backlog/reasons), used for Devtools summary and offline export.\n if (event.type === 'trace:txn-lane') {\n const data: any = (event as any).data\n const evidence = data?.evidence ?? data\n\n const metaProjection = projectJsonValue(evidence)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n const label =\n typeof evidence?.kind === 'string' && evidence.kind.length > 0 ? String(evidence.kind) : 'txn-lane'\n\n return withDowngrade({\n ...base,\n kind: 'txn-lane',\n label,\n meta: metaProjection.value,\n })\n }\n\n // trace:react-render / trace:react-selector: keep slim meta only (field trimming is handled by JsonValue projection).\n if (event.type === 'trace:react-render' || event.type === 'trace:react-selector') {\n const data: any = (event as any).data\n const metaProjection = projectJsonValue(\n isLightLike\n ? {\n componentLabel: data?.componentLabel,\n selectorKey: data?.selectorKey,\n fieldPaths: data?.fieldPaths,\n selectorId: data?.selectorId,\n lane: data?.lane,\n producer: data?.producer,\n fallbackReason: data?.fallbackReason,\n readsDigest: data?.readsDigest,\n equalsKind: data?.equalsKind,\n strictModePhase: data?.strictModePhase,\n }\n : {\n componentLabel: data?.componentLabel,\n selectorKey: data?.selectorKey,\n fieldPaths: data?.fieldPaths,\n selectorId: data?.selectorId,\n lane: data?.lane,\n producer: data?.producer,\n fallbackReason: data?.fallbackReason,\n readsDigest: data?.readsDigest,\n equalsKind: data?.equalsKind,\n strictModePhase: data?.strictModePhase,\n meta: data?.meta,\n },\n )\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n const label =\n typeof data?.componentLabel === 'string' && data.componentLabel.length > 0\n ? data.componentLabel\n : event.type === 'trace:react-selector'\n ? 'react-selector'\n : 'react-render'\n const last = lastTxnByInstance.get(instanceId)\n const txnSeqFromMeta =\n typeof data?.meta?.txnSeq === 'number' && Number.isFinite(data.meta.txnSeq) && data.meta.txnSeq >= 0\n ? Math.floor(data.meta.txnSeq)\n : undefined\n const txnIdFromMeta =\n typeof data?.meta?.txnId === 'string' && data.meta.txnId.length > 0 ? data.meta.txnId : undefined\n const txnIdAligned = txnIdFromMeta ?? base.txnId ?? last?.txnId\n const txnSeqAligned = txnSeqFromMeta ?? (base.txnSeq > 0 ? base.txnSeq : (last?.txnSeq ?? base.txnSeq))\n const ref = withDowngrade({\n ...base,\n txnId: txnIdAligned,\n txnSeq: txnSeqAligned,\n kind: event.type === 'trace:react-selector' ? 'react-selector' : 'react-render',\n label,\n meta: metaProjection.value,\n })\n\n if (instanceId !== 'unknown' && (ref.txnId == null || ref.txnSeq <= 0)) {\n enqueuePendingTxnAlignment(instanceId, ref)\n }\n\n return ref\n }\n\n // trace:selector:eval: SelectorGraph evaluation evidence within commit (used for txn→selector→render causal chain).\n if (event.type === 'trace:selector:eval') {\n const data: any = (event as any).data\n const metaInput = {\n selectorId: data?.selectorId,\n lane: data?.lane,\n producer: data?.producer,\n fallbackReason: data?.fallbackReason,\n readsDigest: data?.readsDigest,\n equalsKind: data?.equalsKind,\n changed: data?.changed,\n evalMs: data?.evalMs,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:exec-vm: Exec VM hit/miss evidence (049). In light tier we keep minimal summary fields.\n if (event.type === 'trace:exec-vm') {\n const data: any = (event as any).data\n const metaInput = {\n version: data?.version,\n stage: data?.stage,\n hit: data?.hit,\n reasonCode: data?.reasonCode ?? data?.reason,\n reasonDetail: data?.reasonDetail,\n execIrVersion: data?.execIrVersion,\n execIrHash: data?.execIrHash,\n serviceId: data?.serviceId,\n implId: data?.implId,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:trait:converge: converge evidence must be exportable (JsonValue hard gate) and trims heavy fields in light tier.\n if (event.type === 'trace:trait:converge') {\n const resolveDirtyRootPaths = (args: {\n readonly staticIrDigest: unknown\n readonly rootIds: unknown\n }): ReadonlyArray<JsonValue> | undefined => {\n const resolve = options?.resolveConvergeStaticIr\n if (!resolve) return undefined\n const digest = args.staticIrDigest\n if (typeof digest !== 'string' || digest.length === 0) return undefined\n\n const rootIds = args.rootIds\n if (!Array.isArray(rootIds) || rootIds.length === 0) return undefined\n\n const ir = resolve(digest) as ConvergeStaticIrExport | undefined\n const fieldPaths = (ir as any)?.fieldPaths as unknown\n if (!Array.isArray(fieldPaths) || fieldPaths.length === 0) return undefined\n\n const out: Array<JsonValue> = []\n for (const id of rootIds) {\n if (typeof id !== 'number' || !Number.isFinite(id)) continue\n const idx = Math.floor(id)\n if (idx < 0 || idx >= fieldPaths.length) continue\n const path = fieldPaths[idx]\n if (Array.isArray(path)) {\n out.push(path as any)\n }\n }\n\n return out.length > 0 ? out : undefined\n }\n\n const enrichDirtyRootPaths = (value: JsonValue): JsonValue => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n\n const anyValue = value as any\n const dirty = anyValue.dirty\n if (!dirty || typeof dirty !== 'object' || Array.isArray(dirty)) return value\n\n const dirtyRootPaths = resolveDirtyRootPaths({\n staticIrDigest: anyValue.staticIrDigest,\n rootIds: dirty?.rootIds,\n })\n if (!dirtyRootPaths) return value\n\n return {\n ...anyValue,\n dirty: {\n ...(dirty as any),\n rootPaths: dirtyRootPaths,\n },\n } as JsonValue\n }\n\n const stripHeavyLight = (value: JsonValue): JsonValue => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n\n const anyValue = value as any\n const dirty = anyValue.dirty\n const dirtyRootPaths = resolveDirtyRootPaths({\n staticIrDigest: anyValue.staticIrDigest,\n rootIds: dirty?.rootIds,\n })\n const dirtySlim =\n dirty && typeof dirty === 'object' && !Array.isArray(dirty)\n ? {\n dirtyAll: (dirty as any).dirtyAll,\n ...(typeof (dirty as any).reason === 'string' ? { reason: (dirty as any).reason } : null),\n ...(Array.isArray((dirty as any).rootIds) ? { rootIds: (dirty as any).rootIds } : null),\n ...(typeof (dirty as any).rootIdsTruncated === 'boolean'\n ? { rootIdsTruncated: (dirty as any).rootIdsTruncated }\n : null),\n ...(dirtyRootPaths ? { rootPaths: dirtyRootPaths } : null),\n }\n : undefined\n\n const { top3, dirtyRoots, ...rest } = anyValue\n return (dirtySlim ? { ...rest, dirty: dirtySlim } : rest) as JsonValue\n }\n\n const stripHeavySampled = (value: JsonValue): JsonValue => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n\n const anyValue = value as any\n const dirty = anyValue.dirty\n const dirtySlim =\n dirty && typeof dirty === 'object' && !Array.isArray(dirty)\n ? {\n dirtyAll: (dirty as any).dirtyAll,\n ...(typeof (dirty as any).reason === 'string' ? { reason: (dirty as any).reason } : null),\n }\n : undefined\n\n const { dirtyRoots, ...rest } = anyValue\n return (dirtySlim ? { ...rest, dirty: dirtySlim } : rest) as JsonValue\n }\n\n const data = (event as Extract<Event, { readonly type: 'trace:trait:converge' }>).data\n const metaInput =\n diagnosticsLevel === 'light'\n ? stripHeavyLight(data)\n : diagnosticsLevel === 'sampled'\n ? stripHeavySampled(data)\n : enrichDirtyRootPaths(data)\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'trait:converge',\n label: 'trait:converge',\n meta: metaProjection.value,\n })\n }\n\n // trace:trait:check: validation diagnostics must be exportable and stay slim in light tier (keep key fields).\n if (event.type === 'trace:trait:check') {\n const stripHeavy = (value: JsonValue): JsonValue => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n const anyValue = value as any\n const degraded = anyValue.degraded\n const degradedSlim =\n degraded && typeof degraded === 'object' && !Array.isArray(degraded)\n ? { kind: (degraded as any).kind }\n : undefined\n\n const { degraded: _degraded, ...rest } = anyValue\n return (degradedSlim ? { ...rest, degraded: degradedSlim } : rest) as JsonValue\n }\n\n const data = (event as Extract<Event, { readonly type: 'trace:trait:check' }>).data\n const metaInput = isLightLike ? stripHeavy(data) : data\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'trait:check',\n label: 'trait:check',\n meta: metaProjection.value,\n })\n }\n\n // trace:trait:validate: validation decision summary must be exportable and slim in light tier (no heavy fields by default).\n if (event.type === 'trace:trait:validate') {\n const data = (event as Extract<Event, { readonly type: 'trace:trait:validate' }>).data\n const metaProjection = projectJsonValue(data)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'trait:validate',\n label: 'trait:validate',\n meta: metaProjection.value,\n })\n }\n\n // trace:module:traits: final traits snapshot must be exportable and slim in light tier (digest/count).\n if (event.type === 'trace:module:traits') {\n const data: any = (event as any).data\n const metaInput = isLightLike\n ? {\n digest: data?.digest,\n count: data?.count,\n }\n : {\n digest: data?.digest,\n count: data?.count,\n traits: data?.traits,\n provenanceIndex: data?.provenanceIndex,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:module:traits:conflict: conflict details must be exportable; avoid relying on truncated lifecycle:error messages.\n if (event.type === 'trace:module:traits:conflict') {\n const data: any = (event as any).data\n const metaInput = isLightLike\n ? {\n conflictCount: data?.conflictCount,\n traitIds: data?.traitIds,\n }\n : {\n conflictCount: data?.conflictCount,\n conflicts: data?.conflicts,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:module:descriptor: keep key anchors even in light tier (avoid data being fully trimmed).\n if (event.type === 'trace:module:descriptor') {\n const data: any = (event as any).data\n const metaInput = isLightLike\n ? {\n id: data?.id,\n traits: data?.traits,\n source: data?.source,\n }\n : { data }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:effectop: keep slim op meta and prefer EffectOp.meta.moduleId when present.\n if (event.type === 'trace:effectop') {\n const data: any = (event as any).data\n const opMeta: any = data?.meta\n const opKind = (data?.kind ?? 'service') as RuntimeDebugEventKind\n const label = typeof data?.name === 'string' ? data.name : 'effectop'\n const moduleId2 = typeof opMeta?.moduleId === 'string' ? opMeta.moduleId : moduleId\n const txnId2 = typeof opMeta?.txnId === 'string' && opMeta.txnId.length > 0 ? opMeta.txnId : base.txnId\n const txnSeq2 =\n typeof opMeta?.txnSeq === 'number' && Number.isFinite(opMeta.txnSeq) && opMeta.txnSeq >= 0\n ? Math.floor(opMeta.txnSeq)\n : base.txnSeq\n\n const metaInput = isLightLike\n ? {\n id: data?.id,\n kind: data?.kind,\n name: data?.name,\n meta: opMeta,\n }\n : {\n id: data?.id,\n kind: data?.kind,\n name: data?.name,\n payload: data?.payload,\n meta: opMeta,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n moduleId: moduleId2,\n txnId: txnId2,\n txnSeq: txnSeq2,\n kind: opKind,\n label,\n meta: metaProjection.value,\n })\n }\n\n // Other trace:* events: categorize as devtools and trim meta by tier.\n const metaProjection = projectJsonValue(\n isLightLike\n ? {\n data: undefined,\n }\n : {\n data: (event as any).data,\n },\n )\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n }\n}\n","import { Cause } from 'effect'\n\nexport type DowngradeReason = 'non_serializable' | 'oversized' | 'unknown'\n\nexport interface SerializableErrorSummary {\n readonly message: string\n readonly name?: string\n readonly code?: string\n readonly hint?: string\n}\n\nexport interface ErrorSummaryResult {\n readonly errorSummary: SerializableErrorSummary\n readonly downgrade?: DowngradeReason\n}\n\nconst truncate = (value: string, maxLen: number): { readonly value: string; readonly truncated: boolean } => {\n if (value.length <= maxLen) return { value, truncated: false }\n return { value: value.slice(0, maxLen), truncated: true }\n}\n\nconst safeStringify = (value: unknown): { readonly ok: true; readonly json: string } | { readonly ok: false } => {\n try {\n return { ok: true, json: JSON.stringify(value) }\n } catch {\n return { ok: false }\n }\n}\n\nconst getMessageFromUnknown = (cause: unknown): string => {\n if (typeof cause === 'string') return cause\n if (typeof cause === 'number' || typeof cause === 'boolean' || typeof cause === 'bigint') return String(cause)\n if (cause instanceof Error) return cause.message || cause.name || 'Error'\n if (cause && typeof cause === 'object' && 'message' in (cause as any) && typeof (cause as any).message === 'string') {\n return (cause as any).message as string\n }\n\n // Try Effect Cause pretty (best-effort). This may include more details than needed,\n // so callers MUST still treat it as an untrusted/oversized string and truncate.\n try {\n const pretty = Cause.pretty(cause as Cause.Cause<unknown>, { renderErrorCause: true })\n if (typeof pretty === 'string' && pretty.length > 0) return pretty\n } catch {\n // ignore\n }\n\n return 'Unknown error'\n}\n\nexport const toSerializableErrorSummary = (\n cause: unknown,\n options?: {\n readonly maxMessageLength?: number\n },\n): ErrorSummaryResult => {\n const maxMessageLength = options?.maxMessageLength ?? 256\n\n const messageRaw = getMessageFromUnknown(cause)\n const { value: message, truncated } = truncate(messageRaw, maxMessageLength)\n\n const summary: { message: string; name?: string; code?: string; hint?: string } = {\n message,\n }\n\n if (cause instanceof Error) {\n if (cause.name && cause.name !== 'Error') summary.name = cause.name\n const anyCause = cause as any\n if (typeof anyCause.code === 'string' && anyCause.code.length > 0) summary.code = anyCause.code\n else if (typeof anyCause.code === 'number' && Number.isFinite(anyCause.code)) summary.code = String(anyCause.code)\n if (typeof anyCause.hint === 'string' && anyCause.hint.length > 0) summary.hint = anyCause.hint\n return {\n errorSummary: summary,\n downgrade: truncated ? 'oversized' : undefined,\n }\n }\n\n if (cause && typeof cause === 'object') {\n const anyCause = cause as any\n if (typeof anyCause.name === 'string' && anyCause.name.length > 0) summary.name = anyCause.name\n if (typeof anyCause.code === 'string' && anyCause.code.length > 0) summary.code = anyCause.code\n if (typeof anyCause.hint === 'string' && anyCause.hint.length > 0) summary.hint = anyCause.hint\n }\n\n // If the original cause isn't JSON-serializable, mark it explicitly.\n const stringifyResult = safeStringify(cause)\n if (!stringifyResult.ok) {\n return {\n errorSummary: summary,\n downgrade: 'non_serializable',\n }\n }\n\n if (truncated) {\n return {\n errorSummary: summary,\n downgrade: 'oversized',\n }\n }\n\n if (message === 'Unknown error') {\n return {\n errorSummary: summary,\n downgrade: 'unknown',\n }\n }\n\n return { errorSummary: summary }\n}\n","export type LogicUnitIdKind = 'explicit' | 'derived'\n\nexport type LogicUnitSource = {\n readonly file: string\n readonly line: number\n readonly column: number\n}\n\nexport type LogicUnitMeta = {\n /**\n * Default id (from module.logic(build, { id })):\n * - Used for id resolution during the mount phase (priority: mount explicit > default id > derived id).\n */\n readonly id?: string\n readonly kind?: string\n readonly name?: string\n readonly source?: LogicUnitSource\n readonly moduleId?: string\n\n /**\n * Resolved id (the final logicUnitId after mounting):\n * - Computed during the mount phase by Module.withLogic/withLogics.\n * - Serves as a stable provenance anchor (aligned with specs/022-module).\n */\n readonly resolvedId?: string\n readonly resolvedIdKind?: LogicUnitIdKind\n readonly resolvedKind?: string\n readonly resolvedName?: string\n readonly resolvedSource?: LogicUnitSource\n}\n\nexport const LOGIC_UNIT_META = Symbol.for('logix.module.logic.meta')\n\nexport const getLogicUnitMeta = (logic: unknown): LogicUnitMeta | undefined => {\n if (!logic || (typeof logic !== 'object' && typeof logic !== 'function')) {\n return undefined\n }\n return (logic as any)[LOGIC_UNIT_META] as LogicUnitMeta | undefined\n}\n\nexport const attachLogicUnitMeta = <L extends object>(logic: L, meta: LogicUnitMeta): L => {\n try {\n Object.defineProperty(logic, LOGIC_UNIT_META, {\n value: meta,\n enumerable: false,\n configurable: true,\n })\n } catch {\n // best-effort: if the underlying object is non-extensible, we still return it.\n }\n return logic\n}\n\nexport const updateLogicUnitMeta = <L extends object>(logic: L, patch: Partial<LogicUnitMeta>): L => {\n const prev = getLogicUnitMeta(logic)\n return attachLogicUnitMeta(logic, { ...(prev ?? {}), ...patch })\n}\n","import { Context, Effect, Layer } from 'effect'\nimport type { TraitConvergeRequestedMode } from '../../state-trait/model.js'\nimport type { ReadQueryStrictGateConfig } from './ReadQuery.js'\nimport { getGlobalHostScheduler, type HostScheduler } from './HostScheduler.js'\nimport { makeRuntimeStore, type RuntimeStore } from './RuntimeStore.js'\nimport { makeTickScheduler, type TickScheduler, type TickSchedulerConfig } from './TickScheduler.js'\nimport { makeDeclarativeLinkRuntime, type DeclarativeLinkRuntime } from './DeclarativeLinkRuntime.js'\n\n// Unified runtime env detection, avoiding bundlers inlining NODE_ENV at build time.\nexport const getNodeEnv = (): string | undefined => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const env = (globalThis as any)?.process?.env\n return typeof env?.NODE_ENV === 'string' ? env.NODE_ENV : undefined\n } catch {\n return undefined\n }\n}\n\nexport const isDevEnv = (): boolean => getNodeEnv() !== 'production'\n\nexport type StateTransactionInstrumentation = 'full' | 'light'\n\n/**\n * getDefaultStateTxnInstrumentation:\n * - Currently chooses default instrumentation by NODE_ENV:\n * - dev / test: full (keep patches and snapshots for debugging).\n * - production: light (keep minimal semantics to reduce overhead).\n * - May evolve with finer-grained overrides in Runtime.make / Module.make.\n */\nexport const getDefaultStateTxnInstrumentation = (): StateTransactionInstrumentation => (isDevEnv() ? 'full' : 'light')\n\n/**\n * Runtime-level StateTransaction config Service:\n * - Provided at the app layer by Logix.Runtime.make / AppRuntime.makeApp.\n * - ModuleRuntime.make can read runtime-level defaults from Env.\n *\n * Notes:\n * - instrumentation is only a runtime-level default.\n * - Explicit instrumentation in ModuleImpl / ModuleRuntimeOptions has higher priority.\n */\nexport interface StateTransactionRuntimeConfig {\n readonly instrumentation?: StateTransactionInstrumentation\n /**\n * StateTrait derived converge budget (ms):\n * - Exceeding the budget triggers a soft degrade (freeze derived fields, preserve base writes and 0/1 commit semantics).\n * - Default is 200ms (aligned with the 007 spec threshold).\n */\n readonly traitConvergeBudgetMs?: number\n /**\n * Auto-mode decision budget (ms):\n * - Only used during the decision phase when requestedMode=\"auto\".\n * - Exceeding the budget must immediately fall back to full (and record evidence).\n */\n readonly traitConvergeDecisionBudgetMs?: number\n /**\n * StateTrait converge scheduling strategy:\n * - full: full topo execution (current default; safest).\n * - dirty: minimal triggering based on dirtyPaths + deps in the txn window (requires accurate deps).\n */\n readonly traitConvergeMode?: TraitConvergeRequestedMode\n /**\n * 043: Trait converge time-slicing (explicit opt-in). Disabled by default.\n */\n readonly traitConvergeTimeSlicing?: TraitConvergeTimeSlicingPatch\n /**\n * 060: Txn Lanes (priority scheduling for transaction follow-up work). Enabled by default since 062.\n */\n readonly txnLanes?: TxnLanesPatch\n /**\n * Runtime-level per-module overrides (hotfix path):\n * - Only affects converge behavior for the specified moduleId.\n * - Lower priority than Provider overrides.\n */\n readonly traitConvergeOverridesByModuleId?: Readonly<Record<string, StateTransactionTraitConvergeOverrides>>\n /**\n * 060: Txn Lanes runtime_module overrides (hotfix / gradual tuning).\n * - Only affects the specified moduleId.\n * - Lower priority than Provider overrides.\n */\n readonly txnLanesOverridesByModuleId?: Readonly<Record<string, TxnLanesPatch>>\n}\n\nclass StateTransactionConfigTagImpl extends Context.Tag('@logixjs/core/StateTransactionRuntimeConfig')<\n StateTransactionConfigTagImpl,\n StateTransactionRuntimeConfig\n>() {}\n\nexport const StateTransactionConfigTag = StateTransactionConfigTagImpl\n\nexport type ReadQueryStrictGateRuntimeConfig = ReadQueryStrictGateConfig\n\nclass ReadQueryStrictGateConfigTagImpl extends Context.Tag('@logixjs/core/ReadQueryStrictGateRuntimeConfig')<\n ReadQueryStrictGateConfigTagImpl,\n ReadQueryStrictGateRuntimeConfig\n>() {}\n\nexport const ReadQueryStrictGateConfigTag = ReadQueryStrictGateConfigTagImpl\n\nexport type ReplayMode = 'live' | 'replay'\n\nexport interface ReplayModeConfig {\n readonly mode: ReplayMode\n}\n\nclass ReplayModeConfigTagImpl extends Context.Tag('@logixjs/core/ReplayModeConfig')<\n ReplayModeConfigTagImpl,\n ReplayModeConfig\n>() {}\n\nexport const ReplayModeConfigTag = ReplayModeConfigTagImpl\n\nexport const replayModeLayer = (mode: ReplayMode): Layer.Layer<ReplayModeConfigTagImpl, never, never> =>\n Layer.succeed(ReplayModeConfigTag, { mode })\n\nexport interface StateTransactionTraitConvergeOverrides {\n readonly traitConvergeMode?: TraitConvergeRequestedMode\n readonly traitConvergeBudgetMs?: number\n readonly traitConvergeDecisionBudgetMs?: number\n readonly traitConvergeTimeSlicing?: TraitConvergeTimeSlicingPatch\n}\n\nexport interface TxnLanesPatch {\n /**\n * enabled: whether Txn Lanes is enabled (default on since 062).\n * - undefined: default enabled (when not explicitly configured)\n * - false: disabled (returns to baseline behavior)\n * - true: enabled (only affects scheduling of follow-up work outside the transaction; transactions remain synchronous)\n */\n readonly enabled?: boolean\n /**\n * overrideMode: runtime temporary override (for debugging/rollback/comparison).\n * - forced_off: forcibly disables Txn Lanes (returns to baseline behavior).\n * - forced_sync: forces fully synchronous execution (ignores non-urgent deferral and time-slicing; used for comparisons).\n *\n * Notes:\n * - Override precedence follows StateTransactionOverrides: provider > runtime_module > runtime_default > builtin.\n * - Overrides must be explainable by evidence (see 060 LaneEvidence reasons).\n */\n readonly overrideMode?: 'forced_off' | 'forced_sync'\n /** non-urgent work loop slice budget (ms). */\n readonly budgetMs?: number\n /** Non-urgent backlog coalescing window (ms). */\n readonly debounceMs?: number\n /** Max lag upper bound (ms): exceeding it triggers an explainable starvation protection (forced catch-up). */\n readonly maxLagMs?: number\n /** Whether to allow coalescing/canceling intermediate non-urgent work (must preserve eventual consistency). */\n readonly allowCoalesce?: boolean\n /**\n * Yield strategy for the non-urgent work loop (progressive enhancement).\n * - baseline: uses only time budget + hard upper bound\n * - inputPending: when supported by browsers, also consults `navigator.scheduling.isInputPending`\n */\n readonly yieldStrategy?: 'baseline' | 'inputPending'\n}\n\nexport interface TraitConvergeTimeSlicingPatch {\n /**\n * enabled:\n * - false/undefined: disabled (default)\n * - true: enables time-slicing (only affects computed/link explicitly marked as deferred)\n */\n readonly enabled?: boolean\n /**\n * debounceMs: coalescing interval (ms) for the deferral window; merges high-frequency inputs into one deferred flush.\n */\n readonly debounceMs?: number\n /**\n * maxLagMs: max lag upper bound (ms); exceeding it triggers an explainable forced flush (starvation protection).\n */\n readonly maxLagMs?: number\n}\n\n/**\n * Provider-scoped StateTransactionOverrides (delta overrides):\n * - Used to inject more local overrides into a Provider subtree on top of inherited global runtime config.\n * - Override precedence: provider > runtime_module > runtime_default > builtin.\n */\nexport interface StateTransactionOverrides {\n readonly traitConvergeMode?: TraitConvergeRequestedMode\n readonly traitConvergeBudgetMs?: number\n readonly traitConvergeDecisionBudgetMs?: number\n readonly traitConvergeTimeSlicing?: TraitConvergeTimeSlicingPatch\n readonly traitConvergeOverridesByModuleId?: Readonly<Record<string, StateTransactionTraitConvergeOverrides>>\n /** 060: Txn Lanes provider-level overrides (delta overrides). */\n readonly txnLanes?: TxnLanesPatch\n /** 060: Txn Lanes provider_module overrides (by moduleId). */\n readonly txnLanesOverridesByModuleId?: Readonly<Record<string, TxnLanesPatch>>\n}\n\nclass StateTransactionOverridesTagImpl extends Context.Tag('@logixjs/core/StateTransactionOverrides')<\n StateTransactionOverridesTagImpl,\n StateTransactionOverrides\n>() {}\n\nexport const StateTransactionOverridesTag = StateTransactionOverridesTagImpl\n\nexport type ConcurrencyLimit = number | 'unbounded'\n\nexport interface ConcurrencyPolicyPatch {\n readonly concurrencyLimit?: ConcurrencyLimit\n readonly losslessBackpressureCapacity?: number\n readonly allowUnbounded?: boolean\n readonly pressureWarningThreshold?: {\n readonly backlogCount?: number\n readonly backlogDurationMs?: number\n }\n readonly warningCooldownMs?: number\n}\n\n/**\n * Runtime-level ConcurrencyPolicy:\n * - Provided at the app layer by Logix.Runtime.make / AppRuntime.makeApp.\n * - ModuleRuntime merges sources via a resolver (builtin/runtime_module/provider, etc.).\n *\n * Notes:\n * - overridesByModuleId is used for runtime_module hot-switching (hotfix / gradual tuning) and is lower priority than provider overrides.\n */\nexport interface ConcurrencyPolicy extends ConcurrencyPolicyPatch {\n readonly overridesByModuleId?: Readonly<Record<string, ConcurrencyPolicyPatch>>\n}\n\nclass ConcurrencyPolicyTagImpl extends Context.Tag('@logixjs/core/ConcurrencyPolicy')<\n ConcurrencyPolicyTagImpl,\n ConcurrencyPolicy\n>() {}\n\nexport const ConcurrencyPolicyTag = ConcurrencyPolicyTagImpl\n\n/**\n * Provider-scoped ConcurrencyPolicyOverrides (delta overrides):\n * - Used to inject more local overrides into a Provider subtree on top of inherited global runtime config.\n * - Override precedence: provider > runtime_module > runtime_default > builtin.\n */\nexport interface ConcurrencyPolicyOverrides extends ConcurrencyPolicyPatch {\n readonly overridesByModuleId?: Readonly<Record<string, ConcurrencyPolicyPatch>>\n}\n\nclass ConcurrencyPolicyOverridesTagImpl extends Context.Tag('@logixjs/core/ConcurrencyPolicyOverrides')<\n ConcurrencyPolicyOverridesTagImpl,\n ConcurrencyPolicyOverrides\n>() {}\n\nexport const ConcurrencyPolicyOverridesTag = ConcurrencyPolicyOverridesTagImpl\n\n// ---- 073: TickScheduler + RuntimeStore (injectable runtime services) ----\n\nexport interface RuntimeStoreService extends RuntimeStore {}\n\nexport class RuntimeStoreTag extends Context.Tag('@logixjs/core/RuntimeStore')<RuntimeStoreTag, RuntimeStoreService>() {}\n\nexport const runtimeStoreLayer: Layer.Layer<any, never, never> = Layer.scoped(\n RuntimeStoreTag,\n Effect.acquireRelease(\n Effect.sync(() => makeRuntimeStore() as RuntimeStoreService),\n (store) => Effect.sync(() => store.dispose()),\n ),\n) as Layer.Layer<any, never, never>\n\nexport const runtimeStoreTestStubLayer = (store: RuntimeStoreService): Layer.Layer<any, never, never> =>\n Layer.succeed(RuntimeStoreTag, store) as Layer.Layer<any, never, never>\n\nexport interface HostSchedulerService extends HostScheduler {}\n\nexport class HostSchedulerTag extends Context.Tag('@logixjs/core/HostScheduler')<\n HostSchedulerTag,\n HostSchedulerService\n>() {}\n\nexport const hostSchedulerLayer: Layer.Layer<any, never, never> = Layer.succeed(\n HostSchedulerTag,\n getGlobalHostScheduler() as HostSchedulerService,\n) as Layer.Layer<any, never, never>\n\nexport const hostSchedulerTestStubLayer = (scheduler: HostSchedulerService): Layer.Layer<any, never, never> =>\n Layer.succeed(HostSchedulerTag, scheduler) as Layer.Layer<any, never, never>\n\nexport interface DeclarativeLinkRuntimeService extends DeclarativeLinkRuntime {}\n\nexport class DeclarativeLinkRuntimeTag extends Context.Tag('@logixjs/core/DeclarativeLinkRuntime')<\n DeclarativeLinkRuntimeTag,\n DeclarativeLinkRuntimeService\n>() {}\n\nexport const declarativeLinkRuntimeLayer: Layer.Layer<any, never, never> = Layer.succeed(\n DeclarativeLinkRuntimeTag,\n makeDeclarativeLinkRuntime() as DeclarativeLinkRuntimeService,\n) as Layer.Layer<any, never, never>\n\nexport const declarativeLinkRuntimeTestStubLayer = (\n runtime: DeclarativeLinkRuntimeService,\n): Layer.Layer<any, never, never> => Layer.succeed(DeclarativeLinkRuntimeTag, runtime) as Layer.Layer<any, never, never>\n\nexport interface TickSchedulerService extends TickScheduler {}\n\nexport class TickSchedulerTag extends Context.Tag('@logixjs/core/TickScheduler')<TickSchedulerTag, TickSchedulerService>() {}\n\nexport const tickSchedulerLayer = (config?: TickSchedulerConfig): Layer.Layer<any, never, never> =>\n Layer.effect(\n TickSchedulerTag,\n Effect.gen(function* () {\n const store = yield* RuntimeStoreTag\n const declarativeLinkRuntime = yield* DeclarativeLinkRuntimeTag\n const hostScheduler = yield* HostSchedulerTag\n return makeTickScheduler({ runtimeStore: store, declarativeLinkRuntime, hostScheduler, config }) as TickSchedulerService\n }),\n ) as Layer.Layer<any, never, never>\n\nexport const tickSchedulerTestStubLayer = (scheduler: TickSchedulerService): Layer.Layer<any, never, never> =>\n Layer.succeed(TickSchedulerTag, scheduler) as Layer.Layer<any, never, never>\n","export type Cancel = () => void\n\nexport type HostScheduler = {\n readonly nowMs: () => number\n readonly scheduleMicrotask: (cb: () => void) => void\n readonly scheduleMacrotask: (cb: () => void) => Cancel\n readonly scheduleAnimationFrame: (cb: () => void) => Cancel\n readonly scheduleTimeout: (ms: number, cb: () => void) => Cancel\n}\n\nconst noopCancel: Cancel = () => {}\n\nconst safeNowMs = (): number => {\n const perf = (globalThis as any).performance as { now?: () => number } | undefined\n if (perf && typeof perf.now === 'function') {\n try {\n const v = perf.now()\n if (typeof v === 'number' && Number.isFinite(v)) return v\n } catch {\n // fallthrough\n }\n }\n\n return Date.now()\n}\n\nconst safeQueueMicrotask = (cb: () => void): void => {\n const qm = (globalThis as any).queueMicrotask as ((run: () => void) => void) | undefined\n if (typeof qm === 'function') {\n try {\n qm(cb)\n return\n } catch {\n // fallthrough\n }\n }\n\n // Promise job fallback (still a microtask boundary).\n try {\n Promise.resolve().then(cb)\n } catch {\n // last resort\n setTimeout(cb, 0)\n }\n}\n\nconst safeSetTimeout = (ms: number, cb: () => void): Cancel => {\n const id = setTimeout(cb, ms)\n return () => {\n try {\n clearTimeout(id)\n } catch {\n // best-effort\n }\n }\n}\n\nconst makeMessageChannelMacrotask = (): ((cb: () => void) => Cancel) | undefined => {\n const MC = (globalThis as any).MessageChannel as { new (): MessageChannel } | undefined\n if (typeof MC !== 'function') return undefined\n\n let channel: MessageChannel\n try {\n channel = new MC()\n } catch {\n return undefined\n }\n\n type Task = { canceled: boolean; cb: () => void }\n const queue: Array<Task> = []\n let scheduled = false\n\n const flush = (): void => {\n scheduled = false\n const tasks = queue.splice(0, queue.length)\n for (const t of tasks) {\n if (t.canceled) continue\n try {\n t.cb()\n } catch {\n // best-effort\n }\n }\n }\n\n try {\n channel.port1.onmessage = flush\n } catch {\n return undefined\n }\n\n const schedule = (cb: () => void): Cancel => {\n const task: Task = { canceled: false, cb }\n queue.push(task)\n if (!scheduled) {\n scheduled = true\n try {\n channel.port2.postMessage(undefined)\n } catch {\n scheduled = false\n // fallback to timeout if postMessage fails\n return safeSetTimeout(0, cb)\n }\n }\n return () => {\n task.canceled = true\n }\n }\n\n return schedule\n}\n\nconst makeSetImmediateMacrotask = (): ((cb: () => void) => Cancel) | undefined => {\n const si = (globalThis as any).setImmediate as ((run: () => void) => any) | undefined\n const ci = (globalThis as any).clearImmediate as ((id: any) => void) | undefined\n if (typeof si !== 'function') return undefined\n\n return (cb) => {\n let id: any\n try {\n id = si(cb)\n } catch {\n return safeSetTimeout(0, cb)\n }\n\n return () => {\n if (typeof ci !== 'function') return\n try {\n ci(id)\n } catch {\n // best-effort\n }\n }\n }\n}\n\nconst makeRaf = (): ((cb: () => void) => Cancel) | undefined => {\n const raf = (globalThis as any).requestAnimationFrame as ((run: () => void) => number) | undefined\n const cancel = (globalThis as any).cancelAnimationFrame as ((id: number) => void) | undefined\n if (typeof raf !== 'function') return undefined\n\n return (cb) => {\n let id: number\n try {\n id = raf(cb)\n } catch {\n return noopCancel\n }\n\n return () => {\n if (typeof cancel !== 'function') return\n try {\n cancel(id)\n } catch {\n // best-effort\n }\n }\n }\n}\n\nexport const makeDefaultHostScheduler = (): HostScheduler => {\n const macrotask =\n makeSetImmediateMacrotask() ??\n makeMessageChannelMacrotask() ??\n ((cb: () => void) => safeSetTimeout(0, cb))\n\n const raf = makeRaf()\n\n return {\n nowMs: safeNowMs,\n scheduleMicrotask: safeQueueMicrotask,\n scheduleMacrotask: macrotask,\n scheduleAnimationFrame: (cb) => raf?.(cb) ?? macrotask(cb),\n scheduleTimeout: safeSetTimeout,\n }\n}\n\nlet globalHostScheduler: HostScheduler | undefined\n\nexport const getGlobalHostScheduler = (): HostScheduler => {\n globalHostScheduler ??= makeDefaultHostScheduler()\n return globalHostScheduler\n}\n\nexport const __unsafeSetGlobalHostSchedulerForTests = (next: HostScheduler | undefined): void => {\n globalHostScheduler = next\n}\n\nexport type DeterministicHostScheduler = HostScheduler & {\n readonly flushMicrotasks: (options?: { readonly max?: number }) => number\n readonly flushOneMacrotask: () => boolean\n readonly flushAll: (options?: { readonly maxTurns?: number }) => { readonly turns: number; readonly ran: number }\n readonly getQueueSize: () => { readonly microtasks: number; readonly macrotasks: number }\n}\n\nexport const makeDeterministicHostScheduler = (): DeterministicHostScheduler => {\n const microtasks: Array<() => void> = []\n const macrotasks: Array<{ canceled: boolean; cb: () => void }> = []\n\n const flushMicrotasks = (options?: { readonly max?: number }): number => {\n const max = options?.max ?? 10_000\n let ran = 0\n while (microtasks.length > 0 && ran < max) {\n const cb = microtasks.shift()!\n ran += 1\n try {\n cb()\n } catch {\n // best-effort\n }\n }\n return ran\n }\n\n const flushOneMacrotask = (): boolean => {\n const t = macrotasks.shift()\n if (!t) return false\n if (t.canceled) return true\n try {\n t.cb()\n } catch {\n // best-effort\n }\n return true\n }\n\n const flushAll = (options?: { readonly maxTurns?: number }): { turns: number; ran: number } => {\n const maxTurns = options?.maxTurns ?? 10_000\n let turns = 0\n let ran = 0\n\n while (turns < maxTurns) {\n const before = microtasks.length + macrotasks.length\n ran += flushMicrotasks()\n if (microtasks.length > 0) {\n turns += 1\n continue\n }\n if (flushOneMacrotask()) {\n turns += 1\n continue\n }\n const after = microtasks.length + macrotasks.length\n if (after === 0 || after === before) break\n turns += 1\n }\n\n return { turns, ran }\n }\n\n return {\n nowMs: safeNowMs,\n scheduleMicrotask: (cb) => {\n microtasks.push(cb)\n },\n scheduleMacrotask: (cb) => {\n const task = { canceled: false, cb }\n macrotasks.push(task)\n return () => {\n task.canceled = true\n }\n },\n scheduleAnimationFrame: (cb) => {\n const task = { canceled: false, cb }\n macrotasks.push(task)\n return () => {\n task.canceled = true\n }\n },\n scheduleTimeout: (_ms, cb) => {\n const task = { canceled: false, cb }\n macrotasks.push(task)\n return () => {\n task.canceled = true\n }\n },\n flushMicrotasks,\n flushOneMacrotask,\n flushAll,\n getQueueSize: () => ({ microtasks: microtasks.length, macrotasks: macrotasks.length }),\n }\n}\n","import type { StateCommitMeta, StateCommitPriority } from './module.js'\n\nexport type ModuleInstanceKey = `${string}::${string}`\nexport type TopicKey = string\n\nexport type TopicKind = 'module' | 'readQuery'\n\nexport type TopicInfo =\n | { readonly kind: 'module'; readonly moduleInstanceKey: ModuleInstanceKey }\n | { readonly kind: 'readQuery'; readonly moduleInstanceKey: ModuleInstanceKey; readonly selectorId: string }\n\nexport const makeModuleInstanceKey = (moduleId: string, instanceId: string): ModuleInstanceKey =>\n `${moduleId}::${instanceId}`\n\nexport const makeReadQueryTopicKey = (moduleInstanceKey: ModuleInstanceKey, selectorId: string): TopicKey =>\n `${moduleInstanceKey}::rq:${selectorId}`\n\nexport const parseTopicKey = (topicKey: string): TopicInfo | undefined => {\n const idx = topicKey.indexOf('::')\n if (idx <= 0) return undefined\n\n const moduleId = topicKey.slice(0, idx)\n const rest = topicKey.slice(idx + 2)\n if (rest.length === 0) return undefined\n\n const idx2 = rest.indexOf('::')\n if (idx2 < 0) {\n return { kind: 'module', moduleInstanceKey: `${moduleId}::${rest}` }\n }\n\n const instanceId = rest.slice(0, idx2)\n const suffix = rest.slice(idx2 + 2)\n if (suffix.startsWith('rq:')) {\n const selectorId = suffix.slice('rq:'.length)\n if (selectorId.length === 0) return undefined\n return {\n kind: 'readQuery',\n moduleInstanceKey: `${moduleId}::${instanceId}`,\n selectorId,\n }\n }\n\n return { kind: 'module', moduleInstanceKey: `${moduleId}::${instanceId}` }\n}\n\nexport interface RuntimeStoreModuleCommit {\n readonly moduleId: string\n readonly instanceId: string\n readonly moduleInstanceKey: ModuleInstanceKey\n readonly state: unknown\n readonly meta: StateCommitMeta\n readonly opSeq?: number\n}\n\nexport interface RuntimeStorePendingDrain {\n readonly modules: ReadonlyMap<ModuleInstanceKey, RuntimeStoreModuleCommit>\n readonly dirtyTopics: ReadonlyMap<TopicKey, StateCommitPriority>\n}\n\nexport interface RuntimeStoreCommitResult {\n readonly changedTopics: ReadonlyMap<TopicKey, { readonly priority: StateCommitPriority; readonly listeners: ReadonlyArray<() => void> }>\n}\n\nexport interface RuntimeStore {\n // ---- React-facing sync snapshot APIs ----\n readonly getTickSeq: () => number\n readonly getModuleState: (moduleInstanceKey: ModuleInstanceKey) => unknown\n readonly getTopicVersion: (topicKey: TopicKey) => number\n readonly getTopicPriority: (topicKey: TopicKey) => StateCommitPriority\n readonly subscribeTopic: (topicKey: TopicKey, listener: () => void) => () => void\n readonly getTopicSubscriberCount: (topicKey: TopicKey) => number\n readonly getModuleSubscriberCount: (moduleInstanceKey: ModuleInstanceKey) => number\n\n // ---- Runtime integration ----\n readonly registerModuleInstance: (args: {\n readonly moduleId: string\n readonly instanceId: string\n readonly moduleInstanceKey: ModuleInstanceKey\n readonly initialState: unknown\n }) => void\n readonly unregisterModuleInstance: (moduleInstanceKey: ModuleInstanceKey) => void\n\n // ---- TickScheduler integration (internal) ----\n readonly commitTick: (args: {\n readonly tickSeq: number\n readonly accepted: RuntimeStorePendingDrain\n }) => RuntimeStoreCommitResult\n\n readonly dispose: () => void\n}\n\nexport const makeRuntimeStore = (): RuntimeStore => {\n let tickSeq = 0\n\n // ---- Committed snapshot (read by React) ----\n const moduleStates = new Map<ModuleInstanceKey, unknown>()\n const topicVersions = new Map<TopicKey, number>()\n const topicPriorities = new Map<TopicKey, StateCommitPriority>()\n\n // ---- Subscriptions ----\n const listenersByTopic = new Map<TopicKey, Set<() => void>>()\n const subscriberCountByModule = new Map<ModuleInstanceKey, number>()\n\n const getTopicVersion = (topicKey: TopicKey): number => topicVersions.get(topicKey) ?? 0\n const getTopicPriority = (topicKey: TopicKey): StateCommitPriority => topicPriorities.get(topicKey) ?? 'normal'\n\n const commitTopicBump = (topicKey: TopicKey, priority: StateCommitPriority): void => {\n const prev = topicVersions.get(topicKey) ?? 0\n topicVersions.set(topicKey, prev + 1)\n topicPriorities.set(topicKey, priority)\n }\n\n const subscribeTopic = (topicKey: TopicKey, listener: () => void): (() => void) => {\n const info = parseTopicKey(topicKey)\n const existing = listenersByTopic.get(topicKey)\n const set = existing ?? new Set<() => void>()\n const alreadyHas = set.has(listener)\n if (!alreadyHas) {\n set.add(listener)\n }\n if (!existing) {\n listenersByTopic.set(topicKey, set)\n }\n\n if (!alreadyHas && info) {\n const prev = subscriberCountByModule.get(info.moduleInstanceKey) ?? 0\n subscriberCountByModule.set(info.moduleInstanceKey, prev + 1)\n }\n\n return () => {\n const current = listenersByTopic.get(topicKey)\n if (!current) return\n const deleted = current.delete(listener)\n if (deleted && info) {\n const prev = subscriberCountByModule.get(info.moduleInstanceKey) ?? 0\n const next = prev - 1\n if (next <= 0) {\n subscriberCountByModule.delete(info.moduleInstanceKey)\n } else {\n subscriberCountByModule.set(info.moduleInstanceKey, next)\n }\n }\n if (current.size === 0) {\n listenersByTopic.delete(topicKey)\n }\n }\n }\n\n const getTopicSubscriberCount = (topicKey: TopicKey): number => listenersByTopic.get(topicKey)?.size ?? 0\n const getModuleSubscriberCount = (moduleInstanceKey: ModuleInstanceKey): number => subscriberCountByModule.get(moduleInstanceKey) ?? 0\n\n const registerModuleInstance = (args: {\n readonly moduleId: string\n readonly instanceId: string\n readonly moduleInstanceKey: ModuleInstanceKey\n readonly initialState: unknown\n }): void => {\n moduleStates.set(args.moduleInstanceKey, args.initialState)\n // Ensure the module topic exists with a stable baseline version/priority.\n if (!topicVersions.has(args.moduleInstanceKey)) {\n topicVersions.set(args.moduleInstanceKey, 0)\n topicPriorities.set(args.moduleInstanceKey, 'normal')\n }\n }\n\n const unregisterModuleInstance = (moduleInstanceKey: ModuleInstanceKey): void => {\n moduleStates.delete(moduleInstanceKey)\n // Keep topic versions by default (helps debugging). Subscribers are expected to detach on module destroy.\n }\n\n const commitTick = (args: { readonly tickSeq: number; readonly accepted: RuntimeStorePendingDrain }): RuntimeStoreCommitResult => {\n tickSeq = args.tickSeq\n\n for (const [key, commit] of args.accepted.modules) {\n moduleStates.set(key, commit.state)\n }\n\n const changedTopics = new Map<TopicKey, { readonly priority: StateCommitPriority; readonly listeners: ReadonlyArray<() => void> }>()\n\n for (const [topicKey, priority] of args.accepted.dirtyTopics) {\n commitTopicBump(topicKey, priority)\n const listeners = Array.from(listenersByTopic.get(topicKey) ?? [])\n if (listeners.length > 0) {\n changedTopics.set(topicKey, { priority, listeners })\n }\n }\n\n return { changedTopics }\n }\n\n const getModuleState = (moduleInstanceKey: ModuleInstanceKey): unknown => moduleStates.get(moduleInstanceKey)\n\n const dispose = (): void => {\n moduleStates.clear()\n topicVersions.clear()\n topicPriorities.clear()\n listenersByTopic.clear()\n subscriberCountByModule.clear()\n }\n\n return {\n getTickSeq: () => tickSeq,\n getModuleState,\n getTopicVersion,\n getTopicPriority,\n subscribeTopic,\n getTopicSubscriberCount,\n getModuleSubscriberCount,\n registerModuleInstance,\n unregisterModuleInstance,\n commitTick,\n dispose,\n }\n}\n","import { Effect, FiberRef } from 'effect'\nimport * as Debug from './DebugSink.js'\nimport * as DevtoolsHub from './DevtoolsHub.js'\nimport type { DeclarativeLinkRuntime } from './DeclarativeLinkRuntime.js'\nimport type { HostScheduler } from './HostScheduler.js'\nimport { makeJobQueue, type JobQueue } from './JobQueue.js'\nimport * as TaskRunner from './TaskRunner.js'\nimport {\n makeReadQueryTopicKey,\n type ModuleInstanceKey,\n type RuntimeStore,\n type RuntimeStoreModuleCommit,\n type RuntimeStorePendingDrain,\n} from './RuntimeStore.js'\nimport type { StateCommitPriority } from './module.js'\n\nexport type TickLane = 'urgent' | 'nonUrgent'\n\nexport type TickDegradeReason = 'budget_steps' | 'cycle_detected' | 'unknown'\n\nexport interface TickSchedulerConfig {\n /**\n * Fixpoint step cap:\n * - Steps count \"work acceptance units\" within a single tick, not time.\n * - Exceeding the budget triggers a soft degrade (stable=false), deferring nonUrgent backlog to the next tick.\n */\n readonly maxSteps?: number\n /**\n * Urgent safety cap:\n * - Even urgent work may be cut when the system appears to be in a cycle (avoid freezing).\n */\n readonly urgentStepCap?: number\n /**\n * Drain-round cap:\n * - Bounds the number of drain rounds while capturing concurrent commits before committing the tick snapshot.\n * - Exceeding the cap is treated as a cycle (stable=false, degradeReason=cycle_detected).\n */\n readonly maxDrainRounds?: number\n /**\n * Microtask starvation protection threshold:\n * - Counts consecutive ticks scheduled on microtask boundaries without yielding to host (best-effort).\n * - Exceeding the limit forces the next tick to start on a macrotask boundary.\n */\n readonly microtaskChainDepthLimit?: number\n /**\n * Optional degraded-tick telemetry (opt-in, sampled):\n * - Runs even when diagnostics=off (Devtools disabled).\n * - Intended for production health signals (frequency of stable=false / forced yield).\n */\n readonly telemetry?: TickSchedulerTelemetryConfig\n}\n\nexport interface TickSchedulerTelemetryEvent {\n readonly tickSeq: number\n readonly stable: boolean\n readonly degradeReason?: TickDegradeReason\n readonly forcedMacrotask?: boolean\n readonly scheduleReason?: TickScheduleReason\n readonly microtaskChainDepth?: number\n readonly deferredWorkCount?: number\n}\n\nexport interface TickSchedulerTelemetryConfig {\n /** Sample rate in [0, 1]. Default: 0 (disabled). */\n readonly sampleRate?: number\n /** Called for ticks that are degraded (stable=false) and/or started on a forced macrotask boundary. */\n readonly onTickDegraded?: (event: TickSchedulerTelemetryEvent) => void\n}\n\nexport interface TickScheduler {\n readonly getTickSeq: () => number\n readonly onModuleCommit: (commit: RuntimeStoreModuleCommit) => Effect.Effect<void, never, never>\n readonly onSelectorChanged: (args: {\n readonly moduleInstanceKey: ModuleInstanceKey\n readonly selectorId: string\n readonly priority: StateCommitPriority\n }) => void\n readonly flushNow: Effect.Effect<void, never, never>\n}\n\n// ---- Runtime.batch (sync boundary) ----\n\ntype BatchWaiter = { readonly resolve: () => void }\n\nlet batchDepth = 0\nconst batchWaiters = new Set<BatchWaiter>()\n\nexport const enterRuntimeBatch = (): void => {\n batchDepth += 1\n}\n\nexport const exitRuntimeBatch = (): void => {\n batchDepth = Math.max(0, batchDepth - 1)\n if (batchDepth !== 0) return\n const waiters = Array.from(batchWaiters)\n batchWaiters.clear()\n for (const w of waiters) {\n try {\n w.resolve()\n } catch {\n // best-effort\n }\n }\n}\n\nconst waitForBatchEndIfNeeded = (): Effect.Effect<void, never, never> =>\n batchDepth === 0\n ? Effect.void\n : Effect.async<void, never>((resume, signal) => {\n\n let done = false\n const cleanup = () => {\n if (done) return\n done = true\n batchWaiters.delete(waiter)\n try {\n signal.removeEventListener('abort', onAbort)\n } catch {\n // best-effort\n }\n }\n\n const onAbort = () => {\n cleanup()\n }\n\n const waiter: BatchWaiter = {\n resolve: () => {\n cleanup()\n resume(Effect.void)\n },\n }\n\n batchWaiters.add(waiter)\n try {\n signal.addEventListener('abort', onAbort, { once: true })\n } catch {\n // best-effort\n }\n })\n\n// ---- TickScheduler implementation ----\n\ntype TriggerKind = 'externalStore' | 'dispatch' | 'timer' | 'unknown'\n\ntype TickScheduleStartedAs = 'microtask' | 'macrotask' | 'batch' | 'unknown'\ntype TickScheduleReason = 'budget' | 'cycle_detected' | 'microtask_starvation' | 'unknown'\n\ntype TickSchedule = {\n readonly startedAs?: TickScheduleStartedAs\n readonly microtaskChainDepth?: number\n readonly forcedMacrotask?: boolean\n readonly reason?: TickScheduleReason\n}\n\nconst clampSampleRate = (sampleRate: number | undefined): number => {\n if (typeof sampleRate !== 'number' || !Number.isFinite(sampleRate)) return 0\n if (sampleRate <= 0) return 0\n if (sampleRate >= 1) return 1\n return sampleRate\n}\n\nconst shouldSampleTick = (tickSeq: number, sampleRate: number): boolean => {\n if (sampleRate <= 0) return false\n if (sampleRate >= 1) return true\n // Deterministic sampling: stable across runs, avoids Math.random() and keeps overhead minimal.\n const x = tickSeq >>> 0\n const h = Math.imul(x ^ 0x9e3779b9, 0x85ebca6b) >>> 0\n return h / 0xffffffff < sampleRate\n}\n\nconst toTriggerKind = (originKind: string | undefined): TriggerKind => {\n if (originKind === 'action') return 'dispatch'\n if (originKind === 'trait-external-store') return 'externalStore'\n if (originKind?.includes('timer')) return 'timer'\n return 'unknown'\n}\n\nconst toLane = (priority: StateCommitPriority): TickLane => (priority === 'low' ? 'nonUrgent' : 'urgent')\n\nconst maxPriority = (a: StateCommitPriority, b: StateCommitPriority): StateCommitPriority =>\n a === 'normal' || b === 'normal' ? 'normal' : 'low'\n\nconst mergeDrain = (base: RuntimeStorePendingDrain, next: RuntimeStorePendingDrain): RuntimeStorePendingDrain => {\n const modules = new Map(base.modules)\n for (const [k, commit] of next.modules) {\n const prev = modules.get(k)\n if (!prev) {\n modules.set(k, commit)\n } else {\n modules.set(k, {\n ...commit,\n meta: {\n ...commit.meta,\n priority: maxPriority(prev.meta.priority, commit.meta.priority),\n },\n })\n }\n }\n\n const dirtyTopics = new Map(base.dirtyTopics)\n for (const [k, p] of next.dirtyTopics) {\n const prev = dirtyTopics.get(k)\n dirtyTopics.set(k, prev ? maxPriority(prev, p) : p)\n }\n\n return { modules, dirtyTopics }\n}\n\nconst emptyDrain = (): RuntimeStorePendingDrain => ({ modules: new Map(), dirtyTopics: new Map() })\n\nexport const makeTickScheduler = (args: {\n readonly runtimeStore: RuntimeStore\n readonly queue?: JobQueue\n readonly hostScheduler: HostScheduler\n readonly config?: TickSchedulerConfig\n readonly declarativeLinkRuntime?: DeclarativeLinkRuntime\n}): TickScheduler => {\n const store = args.runtimeStore\n const hostScheduler = args.hostScheduler\n const declarativeLinks = args.declarativeLinkRuntime\n const queue = args.queue ?? makeJobQueue()\n\n const config: Required<Pick<TickSchedulerConfig, 'maxSteps' | 'urgentStepCap' | 'maxDrainRounds' | 'microtaskChainDepthLimit'>> = {\n maxSteps: args.config?.maxSteps ?? 64,\n urgentStepCap: args.config?.urgentStepCap ?? 512,\n maxDrainRounds: args.config?.maxDrainRounds ?? 8,\n microtaskChainDepthLimit: args.config?.microtaskChainDepthLimit ?? 32,\n }\n const telemetry = args.config?.telemetry\n const telemetrySampleRate = clampSampleRate(telemetry?.sampleRate)\n\n let tickSeq = 0\n let scheduled = false\n let microtaskChainDepth = 0\n let nextForcedReason: TickScheduleReason | undefined\n\n let coalescedModules = 0\n let coalescedTopics = 0\n\n const yieldMicrotask = Effect.async<void, never>((resume) => {\n hostScheduler.scheduleMicrotask(() => resume(Effect.void))\n })\n const yieldMacrotask = Effect.async<void, never>((resume, signal) => {\n const cancel = hostScheduler.scheduleMacrotask(() => resume(Effect.void))\n try {\n signal.addEventListener(\n 'abort',\n () => {\n cancel()\n },\n { once: true },\n )\n } catch {\n // best-effort\n }\n })\n\n const scheduleTick = (): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n if (scheduled) return\n scheduled = true\n\n const waitedForBatch = batchDepth > 0\n\n const forcedReason = nextForcedReason\n nextForcedReason = undefined\n\n const shouldYieldForStarvation =\n forcedReason == null && microtaskChainDepth >= Math.max(1, config.microtaskChainDepthLimit)\n\n const reason: TickScheduleReason | undefined = forcedReason ?? (shouldYieldForStarvation ? 'microtask_starvation' : undefined)\n const boundary: 'microtask' | 'macrotask' = reason ? 'macrotask' : 'microtask'\n const startedAs: TickScheduleStartedAs = waitedForBatch ? 'batch' : boundary\n const depthAtSchedule = microtaskChainDepth\n\n yield* Effect.forkDaemon(\n Effect.locally(TaskRunner.inSyncTransactionFiber, false)(\n Effect.gen(function* () {\n try {\n yield* waitForBatchEndIfNeeded()\n if (boundary === 'microtask') {\n yield* yieldMicrotask\n microtaskChainDepth += 1\n } else {\n yield* yieldMacrotask\n microtaskChainDepth = 0\n }\n\n const schedule: TickSchedule = {\n startedAs,\n microtaskChainDepth: boundary === 'macrotask' ? depthAtSchedule : microtaskChainDepth,\n ...(boundary === 'macrotask' ? { forcedMacrotask: true, reason: reason ?? 'unknown' } : {}),\n }\n\n const outcome = yield* flushTick(schedule)\n if (!outcome.stable) {\n nextForcedReason =\n outcome.degradeReason === 'budget_steps'\n ? 'budget'\n : outcome.degradeReason === 'cycle_detected'\n ? 'cycle_detected'\n : 'unknown'\n }\n } finally {\n scheduled = false\n // If something was re-queued or arrived after commit, schedule the next tick (best-effort).\n if (queue.hasPending()) {\n yield* scheduleTick()\n } else {\n // Reset chain depth when the system becomes idle (avoid forcing a macrotask on the next unrelated tick).\n microtaskChainDepth = 0\n }\n }\n }),\n ),\n )\n })\n\n const flushTick = (schedule: TickSchedule): Effect.Effect<{ stable: boolean; degradeReason?: TickDegradeReason }, never, never> =>\n Effect.gen(function* () {\n if (!queue.hasPending()) {\n return { stable: true }\n }\n\n tickSeq += 1\n const currentTickSeq = tickSeq\n\n const diagnosticsLevel = yield* FiberRef.get(Debug.currentDiagnosticsLevel)\n const shouldEmitTrace = DevtoolsHub.isDevtoolsEnabled() && diagnosticsLevel !== 'off'\n\n const captured: {\n drainRounds: number\n stable: boolean\n degradeReason?: TickDegradeReason\n deferred?: RuntimeStorePendingDrain\n accepted: RuntimeStorePendingDrain\n } = {\n drainRounds: 0,\n stable: true,\n accepted: emptyDrain(),\n }\n\n // Fixpoint capture: drain -> apply declarative links -> drain (bounded by maxDrainRounds).\n while (captured.drainRounds < config.maxDrainRounds) {\n const drained = queue.drain()\n if (!drained) break\n captured.drainRounds += 1\n captured.accepted = mergeDrain(captured.accepted, drained)\n\n if (declarativeLinks && drained.modules.size > 0) {\n const changedModuleInstanceKeys = Array.from(drained.modules.keys())\n yield* declarativeLinks.applyForSources({\n tickSeq: currentTickSeq,\n acceptedModules: captured.accepted.modules,\n changedModuleInstanceKeys,\n })\n }\n }\n\n if (queue.hasPending()) {\n captured.stable = false\n captured.degradeReason = 'cycle_detected'\n }\n\n // Budget enforcement (defer nonUrgent only; urgent may be cut only in cycle safety-break).\n const urgentModules: Array<RuntimeStoreModuleCommit> = []\n const nonUrgentModules: Array<RuntimeStoreModuleCommit> = []\n\n for (const commit of captured.accepted.modules.values()) {\n if (toLane(commit.meta.priority) === 'urgent') {\n urgentModules.push(commit)\n } else {\n nonUrgentModules.push(commit)\n }\n }\n\n const urgentCapExceeded = urgentModules.length > config.urgentStepCap\n const urgentAccepted = urgentCapExceeded ? urgentModules.slice(0, config.urgentStepCap) : urgentModules\n const urgentDeferred = urgentCapExceeded ? urgentModules.slice(config.urgentStepCap) : []\n\n const nonUrgentBudget = Math.max(0, config.maxSteps)\n const nonUrgentAccepted = urgentCapExceeded ? [] : nonUrgentModules.slice(0, nonUrgentBudget)\n const nonUrgentDeferred = urgentCapExceeded ? nonUrgentModules : nonUrgentModules.slice(nonUrgentBudget)\n\n if (urgentCapExceeded) {\n captured.stable = false\n captured.degradeReason = 'cycle_detected'\n } else if (nonUrgentDeferred.length > 0) {\n captured.stable = false\n captured.degradeReason = captured.degradeReason ?? 'budget_steps'\n }\n\n const acceptedModules = new Map<ModuleInstanceKey, RuntimeStoreModuleCommit>()\n const deferredModules = new Map<ModuleInstanceKey, RuntimeStoreModuleCommit>()\n\n for (const c of urgentAccepted) acceptedModules.set(c.moduleInstanceKey, c)\n for (const c of nonUrgentAccepted) acceptedModules.set(c.moduleInstanceKey, c)\n\n for (const c of urgentDeferred) deferredModules.set(c.moduleInstanceKey, c)\n for (const c of nonUrgentDeferred) deferredModules.set(c.moduleInstanceKey, c)\n\n const acceptedTopics = new Map<string, StateCommitPriority>()\n const deferredTopics = new Map<string, StateCommitPriority>()\n\n for (const [topicKey, priority] of captured.accepted.dirtyTopics) {\n const info = storeTopicToModuleInstanceKey(topicKey)\n if (!info) continue\n if (acceptedModules.has(info)) {\n acceptedTopics.set(topicKey, priority)\n } else if (deferredModules.has(info)) {\n deferredTopics.set(topicKey, priority)\n } else {\n // Conservative default: treat unknown topics as accepted.\n acceptedTopics.set(topicKey, priority)\n }\n }\n\n const acceptedDrain: RuntimeStorePendingDrain = {\n modules: acceptedModules,\n dirtyTopics: acceptedTopics,\n }\n\n const deferredDrain: RuntimeStorePendingDrain | undefined =\n deferredModules.size > 0 || deferredTopics.size > 0\n ? {\n modules: deferredModules,\n dirtyTopics: deferredTopics,\n }\n : undefined\n\n captured.deferred = deferredDrain\n\n let startedAtMs: number | undefined\n let triggerSummary: any | undefined\n let anchor: any | undefined\n let backlog: any | undefined\n let result: any | undefined\n\n if (shouldEmitTrace) {\n startedAtMs = Date.now()\n\n triggerSummary = (() => {\n const triggers = Array.from(captured.accepted.modules.values())\n const counts = new Map<TriggerKind, number>()\n let primary: any = undefined\n for (const t of triggers) {\n const kind = toTriggerKind(t.meta.originKind)\n counts.set(kind, (counts.get(kind) ?? 0) + 1)\n if (!primary) {\n primary = {\n kind,\n moduleId: t.moduleId,\n instanceId: t.instanceId,\n fieldPath: kind === 'externalStore' ? t.meta.originName : undefined,\n actionTag: kind === 'dispatch' ? t.meta.originName : undefined,\n }\n }\n }\n return {\n total: triggers.length,\n kinds: Array.from(counts.entries()).map(([kind, count]) => ({ kind, count })),\n primary,\n coalescedCount: {\n modules: coalescedModules,\n topics: coalescedTopics,\n },\n }\n })()\n\n anchor = (() => {\n const first = captured.accepted.modules.values().next().value as RuntimeStoreModuleCommit | undefined\n if (!first) return undefined\n return {\n moduleId: first.moduleId,\n instanceId: first.instanceId,\n txnSeq: first.meta.txnSeq,\n txnId: first.meta.txnId,\n ...(typeof first.opSeq === 'number' ? { opSeq: first.opSeq } : null),\n }\n })()\n\n backlog = (() => {\n const deferredWork = captured.deferred\n if (!deferredWork) return undefined\n const pendingDeferredWork = deferredWork.modules.size + deferredWork.dirtyTopics.size\n\n const deferredModulesList = Array.from(deferredWork.modules.values())\n const pendingExternalInputs = deferredModulesList.filter((m) => toTriggerKind(m.meta.originKind) === 'externalStore').length\n\n const primaryDeferred =\n deferredModulesList.find((m) => toTriggerKind(m.meta.originKind) === 'externalStore') ?? deferredModulesList[0]\n const kind = primaryDeferred ? toTriggerKind(primaryDeferred.meta.originKind) : 'unknown'\n\n const deferredPrimary =\n primaryDeferred != null\n ? {\n kind: kind === 'externalStore' ? ('externalStore' as const) : ('unknown' as const),\n moduleId: primaryDeferred.moduleId,\n instanceId: primaryDeferred.instanceId,\n fieldPath: kind === 'externalStore' ? primaryDeferred.meta.originName : undefined,\n storeId: undefined,\n }\n : undefined\n\n return {\n pendingExternalInputs,\n pendingDeferredWork,\n deferredPrimary,\n }\n })()\n\n result = {\n stable: captured.stable,\n ...(captured.stable ? null : { degradeReason: captured.degradeReason ?? 'unknown' }),\n } as const\n }\n\n if (shouldEmitTrace && schedule.forcedMacrotask && schedule.reason === 'microtask_starvation') {\n yield* Debug.record({\n type: 'warn:microtask-starvation',\n moduleId: anchor?.moduleId,\n instanceId: anchor?.instanceId,\n tickSeq: currentTickSeq,\n microtaskChainDepth: schedule.microtaskChainDepth,\n })\n }\n\n if (shouldEmitTrace) {\n yield* Debug.record({\n type: 'trace:tick',\n moduleId: anchor?.moduleId,\n instanceId: anchor?.instanceId,\n data: {\n tickSeq: currentTickSeq,\n phase: 'start',\n timestampMs: startedAtMs!,\n schedule,\n triggerSummary,\n anchors: anchor,\n budget: {\n maxSteps: config.maxSteps,\n elapsedMs: 0,\n steps: 0,\n txnCount: acceptedModules.size,\n },\n },\n })\n }\n\n if (!captured.stable && shouldEmitTrace) {\n yield* Debug.record({\n type: 'trace:tick',\n moduleId: anchor?.moduleId,\n instanceId: anchor?.instanceId,\n data: {\n tickSeq: currentTickSeq,\n phase: 'budgetExceeded',\n timestampMs: Date.now(),\n schedule,\n triggerSummary,\n anchors: anchor,\n budget: {\n maxSteps: config.maxSteps,\n elapsedMs: Math.max(0, Date.now() - startedAtMs!),\n steps: config.maxSteps,\n txnCount: acceptedModules.size,\n },\n backlog,\n result,\n },\n })\n }\n\n // Requeue deferred backlog before committing the tick, so the next tick can pick it up.\n if (deferredDrain) {\n queue.requeue(deferredDrain)\n }\n\n const committed = store.commitTick({\n tickSeq: currentTickSeq,\n accepted: acceptedDrain,\n })\n\n // Notify changed topics after committing the snapshot token.\n for (const { listeners } of committed.changedTopics.values()) {\n for (const listener of listeners) {\n try {\n listener()\n } catch {\n // best-effort: never let a subscriber break the tick\n }\n }\n }\n\n if (!captured.stable && shouldEmitTrace && backlog?.deferredPrimary) {\n const primary = backlog.deferredPrimary\n if (primary.kind === 'externalStore') {\n const moduleInstanceKey =\n primary.moduleId && primary.instanceId ? (`${primary.moduleId}::${primary.instanceId}` as ModuleInstanceKey) : undefined\n if (moduleInstanceKey && store.getModuleSubscriberCount(moduleInstanceKey) > 0) {\n yield* Debug.record({\n type: 'warn:priority-inversion',\n moduleId: primary.moduleId,\n instanceId: primary.instanceId,\n tickSeq: currentTickSeq,\n reason: 'deferredBacklog',\n })\n }\n }\n }\n\n if (shouldEmitTrace) {\n yield* Debug.record({\n type: 'trace:tick',\n moduleId: anchor?.moduleId,\n instanceId: anchor?.instanceId,\n data: {\n tickSeq: currentTickSeq,\n phase: 'settled',\n timestampMs: Date.now(),\n schedule,\n triggerSummary,\n anchors: anchor,\n budget: {\n maxSteps: config.maxSteps,\n elapsedMs: Math.max(0, Date.now() - startedAtMs!),\n steps: acceptedModules.size,\n txnCount: acceptedModules.size,\n },\n backlog,\n result,\n },\n })\n }\n\n if (telemetry?.onTickDegraded && (schedule.forcedMacrotask || !captured.stable) && shouldSampleTick(currentTickSeq, telemetrySampleRate)) {\n try {\n telemetry.onTickDegraded({\n tickSeq: currentTickSeq,\n stable: captured.stable,\n degradeReason: captured.stable ? undefined : (captured.degradeReason ?? 'unknown'),\n forcedMacrotask: schedule.forcedMacrotask,\n scheduleReason: schedule.reason,\n microtaskChainDepth: schedule.microtaskChainDepth,\n deferredWorkCount: deferredDrain ? deferredDrain.modules.size + deferredDrain.dirtyTopics.size : 0,\n })\n } catch {\n // best-effort: never let user telemetry break the tick\n }\n }\n coalescedModules = 0\n coalescedTopics = 0\n\n return { stable: captured.stable, degradeReason: captured.degradeReason }\n })\n\n const flushNow: TickScheduler['flushNow'] = flushTick({ startedAs: 'unknown' }).pipe(Effect.asVoid)\n\n const storeTopicToModuleInstanceKey = (topicKey: string): ModuleInstanceKey | undefined => {\n const idx = topicKey.indexOf('::rq:')\n if (idx > 0) {\n return topicKey.slice(0, idx) as ModuleInstanceKey\n }\n if (topicKey.includes('::')) {\n return topicKey as ModuleInstanceKey\n }\n return undefined\n }\n\n const onSelectorChanged: TickScheduler['onSelectorChanged'] = ({ moduleInstanceKey, selectorId, priority }) => {\n const coalesced = queue.markTopicDirty(makeReadQueryTopicKey(moduleInstanceKey, selectorId), priority)\n if (coalesced) coalescedTopics += 1\n }\n\n const onModuleCommit: TickScheduler['onModuleCommit'] = (commit) =>\n Effect.gen(function* () {\n const coalescedCommit = queue.enqueueModuleCommit(commit)\n if (coalescedCommit) coalescedModules += 1\n const coalescedTopic = queue.markTopicDirty(commit.moduleInstanceKey, commit.meta.priority)\n if (coalescedTopic) coalescedTopics += 1\n yield* scheduleTick()\n })\n\n return {\n getTickSeq: () => tickSeq,\n onModuleCommit,\n onSelectorChanged,\n flushNow,\n }\n}\n","import { Effect, FiberRef } from 'effect'\nimport type { JsonValue } from '../../observability/jsonValue.js'\nimport type { EvidencePackage, EvidencePackageSource } from '../../observability/evidence.js'\nimport { exportEvidencePackage, OBSERVABILITY_PROTOCOL_VERSION } from '../../observability/evidence.js'\nimport type { ConvergeStaticIrExport } from '../../state-trait/converge-ir.js'\nimport type { ConvergeStaticIrCollector } from './ConvergeStaticIrCollector.js'\nimport {\n currentDiagnosticsLevel,\n clearRuntimeDebugEventSeq,\n toRuntimeDebugEventRef,\n type Event,\n type RuntimeDebugEventRef,\n type Sink,\n} from './DebugSink.js'\nimport { getGlobalHostScheduler } from './HostScheduler.js'\n\n/**\n * DevtoolsHub:\n * - Process/page-level Debug event aggregator (global singleton).\n *\n * Note: this hub is only appended to Debug sinks when devtoolsHubLayer is explicitly enabled.\n * The Snapshot API is always available (returns empty snapshots when disabled).\n *\n * Performance:\n * - Devtools Debug events can be extremely dense in hot paths (EffectOp / Trait / StateTxn, etc.).\n * - The previous implementation copied ringBuffer and Maps per event to build an \"immutable snapshot\" (O(bufferSize)).\n * - The current implementation lets Snapshot reference internal Map/Array directly (read-only convention) and batches\n * subscriber notifications in microtasks, avoiding per-event copies and reducing main-thread interference.\n */\n\nexport interface DevtoolsSnapshot {\n /**\n * SnapshotToken:\n * - Monotonic snapshot change token (a subscription-safe source of truth).\n * - Any externally visible change must advance the token.\n * - If the token does not change, externally visible snapshot fields must not change (avoid tearing / missed updates).\n */\n readonly snapshotToken: SnapshotToken\n readonly instances: ReadonlyMap<string, number>\n readonly events: ReadonlyArray<RuntimeDebugEventRef>\n readonly latestStates: ReadonlyMap<string, JsonValue>\n readonly latestTraitSummaries: ReadonlyMap<string, JsonValue>\n /**\n * exportBudget:\n * - Tracks \"degrade counts\" caused by export boundaries (JsonValue projection/trimming), for explainability.\n * - Counts are cumulative (may differ from the ring buffer window); clearDevtoolsEvents resets them.\n */\n readonly exportBudget: {\n readonly dropped: number\n readonly oversized: number\n }\n}\n\nexport interface DevtoolsHubOptions {\n readonly bufferSize?: number\n}\n\nexport type SnapshotToken = number\n\n// ---- Global mutable state (singleton) ----\n\nconst instances = new Map<string, number>()\nconst latestStates = new Map<string, JsonValue>()\nconst latestTraitSummaries = new Map<string, JsonValue>()\nconst instanceLabels = new Map<string, string>()\nconst convergeStaticIrByDigest = new Map<string, ConvergeStaticIrExport>()\nconst liveInstanceKeys = new Set<string>()\n\nconst exportBudget = {\n dropped: 0,\n oversized: 0,\n}\n\nlet lastRunTs = 0\nlet lastRunTsSeq = 0\n\nconst nextRunId = (): string => {\n const ts = Date.now()\n if (ts === lastRunTs) {\n lastRunTsSeq += 1\n } else {\n lastRunTs = ts\n lastRunTsSeq = 0\n }\n\n return lastRunTsSeq === 0 ? `run-${ts}` : `run-${ts}.${lastRunTsSeq}`\n}\n\nlet currentRunId = nextRunId()\nlet nextSeq = 1\n\nlet bufferSize = 500\nconst ringBuffer: RuntimeDebugEventRef[] = []\nconst ringBufferSeq: number[] = []\n\nlet snapshotToken: SnapshotToken = 0\n\nconst ensureRingBufferSize = (): void => {\n if (bufferSize <= 0) {\n ringBuffer.length = 0\n ringBufferSeq.length = 0\n return\n }\n\n if (ringBuffer.length <= bufferSize) return\n const excess = ringBuffer.length - bufferSize\n ringBuffer.splice(0, excess)\n ringBufferSeq.splice(0, excess)\n}\n\nconst trimRingBufferIfNeeded = (): void => {\n if (bufferSize <= 0) {\n ringBuffer.length = 0\n ringBufferSeq.length = 0\n return\n }\n\n // Small windows keep a strict upper bound to avoid \"size=5 but events.length briefly > 5\" surprises.\n // Large windows allow short bursts + batch trimming to avoid linear shift() costs under sustained load.\n if (bufferSize <= 64) {\n ensureRingBufferSize()\n return\n }\n\n const slack = Math.min(1024, Math.floor(bufferSize / 2))\n const threshold = bufferSize + Math.max(1, slack)\n if (ringBuffer.length <= threshold) return\n\n const excess = ringBuffer.length - bufferSize\n ringBuffer.splice(0, excess)\n ringBufferSeq.splice(0, excess)\n}\n\n// Snapshot references internal structures directly (read-only convention) to avoid copy costs in hot paths.\nconst currentSnapshot: DevtoolsSnapshot = {\n snapshotToken,\n instances,\n events: ringBuffer,\n latestStates,\n latestTraitSummaries,\n exportBudget,\n}\n\nconst listeners = new Set<() => void>()\n\nlet notifyScheduled = false\nconst scheduleNotify = () => {\n if (listeners.size === 0) return\n if (notifyScheduled) return\n notifyScheduled = true\n getGlobalHostScheduler().scheduleMicrotask(() => {\n notifyScheduled = false\n for (const listener of listeners) {\n listener()\n }\n })\n}\n\nlet devtoolsEnabled = false\n\nconst bumpSnapshotToken = (): void => {\n snapshotToken += 1\n ;(currentSnapshot as any).snapshotToken = snapshotToken\n}\n\nconst markSnapshotChanged = (): void => {\n bumpSnapshotToken()\n scheduleNotify()\n}\n\nexport const configureDevtoolsHub = (options?: DevtoolsHubOptions) => {\n devtoolsEnabled = true\n if (typeof options?.bufferSize === 'number' && Number.isFinite(options.bufferSize)) {\n const next = Math.floor(options.bufferSize)\n const nextBufferSize = next >= 0 ? next : 0\n if (nextBufferSize !== bufferSize) {\n bufferSize = nextBufferSize\n ensureRingBufferSize()\n markSnapshotChanged()\n }\n }\n}\n\nexport const isDevtoolsEnabled = (): boolean => devtoolsEnabled\n\n// ---- Snapshot public helpers ----\n\nexport const getDevtoolsSnapshot = (): DevtoolsSnapshot => currentSnapshot\nexport const getDevtoolsSnapshotToken = (): SnapshotToken => snapshotToken\n\nexport const subscribeDevtoolsSnapshot = (listener: () => void): (() => void) => {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport const getDevtoolsRunId = (): string => currentRunId\n\nexport const setDevtoolsRunId = (runId: string): void => {\n if (typeof runId !== 'string' || runId.length === 0) return\n if (runId !== currentRunId) {\n currentRunId = runId\n markSnapshotChanged()\n }\n}\n\nexport const startDevtoolsRun = (runId?: string): string => {\n currentRunId = typeof runId === 'string' && runId.length > 0 ? runId : nextRunId()\n nextSeq = 1\n clearRuntimeDebugEventSeq()\n clearDevtoolsEvents()\n return currentRunId\n}\n\nexport const clearDevtoolsEvents = (): void => {\n ringBuffer.length = 0\n ringBufferSeq.length = 0\n exportBudget.dropped = 0\n exportBudget.oversized = 0\n markSnapshotChanged()\n}\n\nexport const setInstanceLabel = (instanceId: string, label: string): void => {\n instanceLabels.set(instanceId, label)\n markSnapshotChanged()\n}\n\nexport const getInstanceLabel = (instanceId: string): string | undefined => instanceLabels.get(instanceId)\n\nconst registerConvergeStaticIr = (ir: ConvergeStaticIrExport): void => {\n convergeStaticIrByDigest.set(ir.staticIrDigest, ir)\n}\n\nexport const devtoolsHubConvergeStaticIrCollector: ConvergeStaticIrCollector = {\n register: registerConvergeStaticIr,\n}\n\nexport const exportDevtoolsEvidencePackage = (options?: {\n readonly runId?: string\n readonly source?: EvidencePackageSource\n readonly protocolVersion?: string\n}): EvidencePackage => {\n const protocolVersion = options?.protocolVersion ?? OBSERVABILITY_PROTOCOL_VERSION\n const runId = options?.runId ?? currentRunId\n const source = options?.source ?? { host: 'unknown' }\n\n const events = ringBuffer.map((payload, i) => ({\n protocolVersion,\n runId,\n seq: ringBufferSeq[i] ?? i + 1,\n timestamp: payload.timestamp,\n type: 'debug:event',\n payload: payload as unknown as JsonValue,\n }))\n\n const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\n // In full diagnostics: de-duplicate by staticIrDigest and export matching ConvergeStaticIR (for offline explanation/replay).\n const convergeDigests = new Set<string>()\n let sawFullConverge = false\n\n for (const ref of ringBuffer) {\n if (ref.kind !== 'trait:converge') continue\n const meta = ref.meta\n if (!isRecord(meta)) continue\n\n const digest = meta.staticIrDigest\n if (typeof digest === 'string' && digest.length > 0) {\n convergeDigests.add(digest)\n }\n\n const dirty = meta.dirty\n if (isRecord(dirty) && typeof dirty.rootCount === 'number') {\n sawFullConverge = true\n }\n }\n\n let summary: JsonValue | undefined\n if (sawFullConverge && convergeDigests.size > 0) {\n const staticIrByDigest: Record<string, JsonValue> = {}\n for (const digest of convergeDigests) {\n const ir = convergeStaticIrByDigest.get(digest)\n if (ir) {\n staticIrByDigest[digest] = ir as unknown as JsonValue\n }\n }\n if (Object.keys(staticIrByDigest).length > 0) {\n summary = { converge: { staticIrByDigest } } as unknown as JsonValue\n }\n }\n\n return exportEvidencePackage({\n protocolVersion,\n runId,\n source,\n events,\n summary,\n })\n}\n\n// ---- Hub Sink ----\n\nexport const devtoolsHubSink: Sink = {\n record: (event: Event) =>\n Effect.gen(function* () {\n // NOTE: the hub is a global singleton, but whether events are exportable/written to the buffer is controlled by FiberRef,\n // enabling different perf baselines/diagnostics tiers across scopes within the same process.\n const level = yield* FiberRef.get(currentDiagnosticsLevel)\n\n let changed = false\n\n // trace:instanceLabel: set a human-readable label for a runtime instance.\n if (event.type === 'trace:instanceLabel') {\n const instanceId = (event as any).instanceId as string | undefined\n const data = (event as any).data\n const label = data && typeof data === 'object' && 'label' in data ? String((data as any).label) : undefined\n if (instanceId && label) {\n instanceLabels.set(instanceId, label)\n changed = true\n }\n }\n\n // Instance counters: maintain active instance counts by runtimeLabel::moduleId.\n if (event.type === 'module:init' || event.type === 'module:destroy') {\n const moduleId = (event as any).moduleId ?? 'unknown'\n const runtimeLabel = (event as any).runtimeLabel ?? 'unknown'\n const instanceId = (event as any).instanceId as string | undefined\n const key = `${runtimeLabel}::${moduleId}`\n const prev = instances.get(key) ?? 0\n if (event.type === 'module:init') {\n instances.set(key, prev + 1)\n changed = true\n if (instanceId) {\n const instanceKey = `${runtimeLabel}::${moduleId}::${instanceId}`\n liveInstanceKeys.add(instanceKey)\n // If instanceId is reused, ensure derived caches do not carry leftovers from the previous lifetime.\n if (latestStates.delete(instanceKey)) changed = true\n if (latestTraitSummaries.delete(instanceKey)) changed = true\n }\n } else {\n const next = prev - 1\n if (next <= 0) {\n if (instances.delete(key)) changed = true\n } else {\n instances.set(key, next)\n changed = true\n }\n\n if (instanceId) {\n const instanceKey = `${runtimeLabel}::${moduleId}::${instanceId}`\n liveInstanceKeys.delete(instanceKey)\n if (latestStates.delete(instanceKey)) changed = true\n if (latestTraitSummaries.delete(instanceKey)) changed = true\n if (instanceLabels.delete(instanceId)) changed = true\n changed = true\n }\n }\n }\n\n let exportBudgetChanged = false\n const ref = toRuntimeDebugEventRef(event, {\n diagnosticsLevel: level,\n resolveConvergeStaticIr: (staticIrDigest) => convergeStaticIrByDigest.get(staticIrDigest),\n onMetaProjection: ({ stats }) => {\n if (stats.dropped !== 0 || stats.oversized !== 0) {\n exportBudgetChanged = true\n }\n exportBudget.dropped += stats.dropped\n exportBudget.oversized += stats.oversized\n },\n })\n if (exportBudgetChanged) {\n changed = true\n }\n if (!ref) {\n // off tier: do not write ring buffer / latestStates, but keep minimal counters/labels (including module:destroy cleanup).\n if (changed) {\n markSnapshotChanged()\n }\n return\n }\n\n // latestStates / latestTraitSummaries: record latest snapshots by runtimeLabel::moduleId::instanceId.\n if (ref.kind === 'state' && ref.label === 'state:update') {\n const runtimeLabel = ref.runtimeLabel ?? 'unknown'\n const key = `${runtimeLabel}::${ref.moduleId}::${ref.instanceId}`\n\n // Late/replayed events after module:destroy: allow entering the window for replay, but do not rebuild latest* caches.\n if (liveInstanceKeys.has(key)) {\n if (ref.meta && typeof ref.meta === 'object' && !Array.isArray(ref.meta)) {\n const anyMeta = ref.meta as any\n if ('state' in anyMeta) {\n latestStates.set(key, anyMeta.state as JsonValue)\n changed = true\n }\n if ('traitSummary' in anyMeta && anyMeta.traitSummary !== undefined) {\n latestTraitSummaries.set(key, anyMeta.traitSummary as JsonValue)\n changed = true\n }\n }\n }\n }\n\n // ring buffer: keep the most recent bufferSize RuntimeDebugEventRefs.\n if (bufferSize > 0) {\n const seq = nextSeq++\n ringBuffer.push(ref)\n ringBufferSeq.push(seq)\n trimRingBufferIfNeeded()\n changed = true\n }\n\n if (changed) {\n markSnapshotChanged()\n }\n }),\n}\n","import { Cause, Effect, Fiber, FiberRef, Ref, Stream } from 'effect'\nimport * as Debug from './DebugSink.js'\nimport { isDevEnv } from './env.js'\nimport type * as Logic from './LogicMiddleware.js'\nimport type { AnyModuleShape, LogicEffect } from './module.js'\nimport type { RuntimeInternalsResolvedConcurrencyPolicy } from './RuntimeInternals.js'\nimport type { StateTxnOrigin } from './StateTransaction.js'\n\n/**\n * Prevents calling run*Task inside a \"synchronous transaction execution fiber\" (it would deadlock the txnQueue).\n *\n * - ModuleRuntime locally marks it as true while executing each transaction (dispatch/source-refresh/devtools/...).\n * - run*Task checks the flag on start: when true, it emits diagnostics only in dev/test and then no-ops.\n */\nexport const inSyncTransactionFiber = FiberRef.unsafeMake(false)\n\n/**\n * Force source.refresh:\n * - Default: when snapshot keyHash is unchanged and a non-idle snapshot already exists, refresh SHOULD be a no-op\n * (avoid redundant IO/writeback).\n * - Exception: explicit refresh (manual refresh) / invalidation-driven refresh needs to \"re-fetch even with the same keyHash\".\n *\n * Note: use a FiberRef to locally pass \"whether this refresh is forced\", avoiding expanding the source refresh handler signature.\n */\nexport const forceSourceRefresh = FiberRef.unsafeMake(false)\n\n/**\n * Synchronous transaction window (process-level) marker:\n * - Used as a hard guard in \"non-Effect API\" entry points (e.g. Promise/async functions).\n * - FiberRef cannot reliably read the \"current fiber\" in such entry points, so we need a synchronous callstack-level marker.\n *\n * Note: if a transaction body incorrectly crosses async boundaries, this marker will be held longer; that is a severe violation.\n */\nlet inSyncTransactionGlobalDepth = 0\n\nexport const enterSyncTransaction = (): void => {\n inSyncTransactionGlobalDepth += 1\n}\n\nexport const exitSyncTransaction = (): void => {\n inSyncTransactionGlobalDepth = Math.max(0, inSyncTransactionGlobalDepth - 1)\n}\n\nexport const isInSyncTransaction = (): boolean => inSyncTransactionGlobalDepth > 0\n\nexport type TaskRunnerMode =\n | 'task' // sequential\n | 'parallel'\n | 'latest'\n | 'exhaust'\n\nexport type TaskStatus = 'idle' | 'pending' | 'running' | 'success' | 'failure' | 'interrupted'\n\nexport interface TaskExecution {\n readonly taskId: number\n readonly status: TaskStatus\n readonly acceptedAt: number\n readonly startedAt?: number\n readonly endedAt?: number\n}\n\nexport interface TaskRunnerOrigins {\n readonly pending?: StateTxnOrigin\n readonly success?: StateTxnOrigin\n readonly failure?: StateTxnOrigin\n}\n\ntype TaskHandler<Payload, Sh extends AnyModuleShape, R> =\n | LogicEffect<Sh, R, void, never>\n | ((payload: Payload) => LogicEffect<Sh, R, void, never>)\n\ntype TaskEffect<Payload, Sh extends AnyModuleShape, R, A, E> =\n | LogicEffect<Sh, R, A, E>\n | ((payload: Payload) => LogicEffect<Sh, R, A, E>)\n\nexport interface TaskRunnerConfig<Payload, Sh extends AnyModuleShape, R, A = void, E = never> {\n /**\n * Optional: trigger source name (e.g. actionTag / fieldPath), used as the default pending origin.name.\n * - BoundApiRuntime may fill this in for onAction(\"xxx\") / traits.source.refresh(\"field\"), etc.\n * - Other callers are not required to provide it.\n */\n readonly triggerName?: string\n\n /**\n * pending: synchronous state writes (loading=true / clearing errors, etc.), always a separate transaction entry.\n * - Only executed for tasks that are accepted and actually started (ignored triggers in runExhaustTask do not run pending).\n */\n readonly pending?: TaskHandler<Payload, Sh, R>\n\n /**\n * effect: real IO / async work (must run outside the transaction window).\n */\n readonly effect: TaskEffect<Payload, Sh, R, A, E>\n\n /**\n * success: success writeback (separate transaction entry).\n */\n readonly success?: (result: A, payload: Payload) => LogicEffect<Sh, R, void, never>\n\n /**\n * failure: failure writeback (separate transaction entry).\n *\n * Note: takes a Cause to preserve defect/interrupt semantics; interrupts do not trigger failure writeback by default.\n */\n readonly failure?: (cause: Cause.Cause<E>, payload: Payload) => LogicEffect<Sh, R, void, never>\n\n /**\n * origin: optional override for the three transaction origins.\n * - Default: pending.kind=\"task:pending\"; success/failure.kind=\"service-callback\".\n */\n readonly origin?: TaskRunnerOrigins\n\n /**\n * priority: reserved for future debugging/sorting; does not change transaction boundaries or concurrency semantics.\n */\n readonly priority?: number\n}\n\nexport interface TaskRunnerRuntime {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly runWithStateTransaction: (\n origin: StateTxnOrigin,\n body: () => Effect.Effect<void, never, any>,\n ) => Effect.Effect<void, never, any>\n readonly resolveConcurrencyPolicy?: () => Effect.Effect<RuntimeInternalsResolvedConcurrencyPolicy, never, any>\n}\n\nconst resolve = <Payload, Sh extends AnyModuleShape, R, A, E>(\n eff: TaskEffect<Payload, Sh, R, A, E> | TaskHandler<Payload, Sh, R>,\n payload: Payload,\n): any => (typeof eff === 'function' ? (eff as any)(payload) : eff)\n\nconst defaultOrigins = (triggerName: string | undefined): Required<TaskRunnerOrigins> => ({\n pending: {\n kind: 'task:pending',\n name: triggerName,\n },\n success: {\n kind: 'service-callback',\n name: 'task:success',\n },\n failure: {\n kind: 'service-callback',\n name: 'task:failure',\n },\n})\n\nexport const shouldNoopInSyncTransactionFiber = (options: {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly code: string\n readonly severity: 'error' | 'warning' | 'info'\n readonly message: string\n readonly hint?: string\n readonly actionTag?: string\n readonly kind?: string\n}): Effect.Effect<boolean> =>\n Effect.gen(function* () {\n const inTxn = yield* FiberRef.get(inSyncTransactionFiber)\n if (!inTxn) {\n return false\n }\n // Always no-op regardless of env (otherwise we may deadlock); diagnostics are emitted only in dev/test.\n if (isDevEnv()) {\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: options.moduleId,\n instanceId: options.instanceId,\n code: options.code,\n severity: options.severity,\n message: options.message,\n hint: options.hint,\n actionTag: options.actionTag,\n kind: options.kind,\n })\n }\n return true\n })\n\nconst resolveConcurrencyLimit = (runtime: TaskRunnerRuntime): Effect.Effect<number | 'unbounded', never, any> =>\n runtime.resolveConcurrencyPolicy\n ? runtime.resolveConcurrencyPolicy().pipe(Effect.map((p) => p.concurrencyLimit))\n : Effect.succeed(16)\n\nconst runTaskLifecycle = <Payload, Sh extends AnyModuleShape, R, A, E>(\n payload: Payload,\n runtime: TaskRunnerRuntime,\n config: TaskRunnerConfig<Payload, Sh, R, A, E>,\n getCanWriteBack?: Effect.Effect<boolean>,\n): Effect.Effect<void, never, Logic.Env<Sh, R>> =>\n Effect.gen(function* () {\n const noop = yield* shouldNoopInSyncTransactionFiber({\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n code: 'logic::invalid_usage',\n severity: 'error',\n message: 'run*Task is not allowed inside a synchronous StateTransaction body (it may deadlock the txnQueue).',\n hint:\n 'Call run*Task from the run section of a watcher (e.g. $.onAction/$.onState/$.on); ' +\n 'do not call it directly inside a reducer / trait.run / synchronous transaction body. For long-lived flows, use a multi-entry pattern (pending → IO → writeback).',\n kind: 'run_task_in_transaction',\n })\n if (noop) {\n return\n }\n\n const defaults = defaultOrigins(config.triggerName)\n const origins: Required<TaskRunnerOrigins> = {\n pending: config.origin?.pending ?? defaults.pending,\n success: config.origin?.success ?? defaults.success,\n failure: config.origin?.failure ?? defaults.failure,\n }\n\n // 1) pending: separate transaction entry; once started it should not be interrupted by runLatest.\n const pending = config.pending\n if (pending) {\n yield* Effect.uninterruptible(\n runtime.runWithStateTransaction(origins.pending, () => Effect.asVoid(resolve(pending, payload))),\n )\n }\n\n // 2) IO: runs outside the transaction window.\n const io = resolve(config.effect, payload) as Effect.Effect<A, E, Logic.Env<Sh, R>>\n const exit = yield* Effect.exit(io)\n\n // 3) writeback: use the guard to confirm it's still the current task (runLatestTask).\n if (getCanWriteBack) {\n const ok = yield* getCanWriteBack\n if (!ok) {\n return\n }\n }\n\n if (exit._tag === 'Success') {\n const success = config.success\n if (success) {\n yield* runtime.runWithStateTransaction(origins.success, () => Effect.asVoid(success(exit.value, payload)))\n }\n return\n }\n\n // Failure: interruptions do not trigger failure writeback (e.g. runLatestTask cancellation, Scope ending).\n const cause = exit.cause as Cause.Cause<E>\n if (Cause.isInterrupted(cause)) {\n return\n }\n\n const failure = config.failure\n if (failure) {\n yield* runtime.runWithStateTransaction(origins.failure, () => Effect.asVoid(failure(cause, payload)))\n }\n }).pipe(\n // Watchers must not crash as a whole due to a single task failure: swallow errors, but keep them diagnosable.\n Effect.catchAllCause((cause) =>\n Debug.record({\n type: 'diagnostic',\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n code: 'task_runner::unhandled_failure',\n severity: 'error',\n message: 'TaskRunner encountered an unhandled failure (pending/IO/writeback).',\n hint: 'Add a failure writeback for this task or handle errors explicitly upstream; avoid fire-and-forget swallowing errors.',\n actionTag: config.triggerName,\n kind: 'task_runner_unhandled_failure',\n trigger: {\n kind: 'task',\n name: config.triggerName,\n },\n }).pipe(Effect.zipRight(Effect.logError('TaskRunner error', cause))),\n ),\n ) as Effect.Effect<void, never, Logic.Env<Sh, R>>\n\n/**\n * makeTaskRunner:\n * - Reuses FlowRuntime concurrency semantics (sequential/parallel/latest/exhaust).\n * - Splits a single trigger into: pending (separate txn) → IO → success/failure (separate txn).\n */\nexport const makeTaskRunner = <Payload, Sh extends AnyModuleShape, R, A = void, E = never>(\n stream: Stream.Stream<Payload>,\n mode: TaskRunnerMode,\n runtime: TaskRunnerRuntime,\n config: TaskRunnerConfig<Payload, Sh, R, A, E>,\n): Effect.Effect<void, never, Logic.Env<Sh, R>> => {\n if (mode === 'latest') {\n return Effect.gen(function* () {\n const taskIdRef = yield* Ref.make(0)\n const currentFiberRef = yield* Ref.make<Fiber.RuntimeFiber<void, never> | undefined>(undefined)\n\n const start = (payload: Payload) =>\n Effect.gen(function* () {\n const taskId = yield* Ref.updateAndGet(taskIdRef, (n) => n + 1)\n\n const prev = yield* Ref.get(currentFiberRef)\n if (prev) {\n // Do not wait for the old fiber to fully end (avoid blocking new triggers); writeback is guarded by taskId.\n yield* Fiber.interruptFork(prev)\n }\n\n const canWriteBack = Ref.get(taskIdRef).pipe(Effect.map((current) => current === taskId))\n\n const fiber = yield* Effect.fork(\n runTaskLifecycle<Payload, Sh, R, A, E>(payload, runtime, config, canWriteBack),\n )\n\n yield* Ref.set(currentFiberRef, fiber)\n })\n\n return yield* Stream.runForEach(stream, start)\n })\n }\n\n if (mode === 'exhaust') {\n return Effect.gen(function* () {\n const concurrency = yield* resolveConcurrencyLimit(runtime)\n const busyRef = yield* Ref.make(false)\n\n const mapper = (payload: Payload) =>\n Effect.gen(function* () {\n const acquired = yield* Ref.modify(busyRef, (busy) =>\n busy ? ([false, busy] as const) : ([true, true] as const),\n )\n if (!acquired) {\n // Ignore trigger: no pending transaction is produced.\n return\n }\n try {\n yield* runTaskLifecycle<Payload, Sh, R, A, E>(payload, runtime, config)\n } finally {\n yield* Ref.set(busyRef, false)\n }\n })\n\n return yield* Stream.runDrain(stream.pipe(Stream.mapEffect(mapper, { concurrency })))\n }) as Effect.Effect<void, never, Logic.Env<Sh, R>>\n }\n\n if (mode === 'parallel') {\n return Effect.gen(function* () {\n const concurrency = yield* resolveConcurrencyLimit(runtime)\n\n return yield* Stream.runDrain(\n stream.pipe(\n Stream.mapEffect((payload) => runTaskLifecycle<Payload, Sh, R, A, E>(payload, runtime, config), {\n concurrency,\n }),\n ),\n )\n }) as Effect.Effect<void, never, Logic.Env<Sh, R>>\n }\n\n // mode === \"task\"(sequential)\n return Stream.runForEach(stream, (payload) =>\n runTaskLifecycle<Payload, Sh, R, A, E>(payload, runtime, config),\n ) as Effect.Effect<void, never, Logic.Env<Sh, R>>\n}\n","import { Effect } from 'effect'\nimport type { ReadQueryCompiled } from './ReadQuery.js'\nimport type { DeclarativeLinkIR, DeclarativeLinkNodeId } from './DeclarativeLinkIR.js'\nimport type { ModuleInstanceKey, RuntimeStoreModuleCommit } from './RuntimeStore.js'\n\nexport interface ModuleAsSourceLink {\n readonly id: string\n readonly sourceModuleInstanceKey: ModuleInstanceKey\n readonly readQuery: ReadQueryCompiled<any, any>\n readonly computeValue: (snapshot: unknown) => unknown\n readonly equalsValue: (a: unknown, b: unknown) => boolean\n readonly applyValue: (next: unknown) => Effect.Effect<void, never, never>\n}\n\nexport interface DeclarativeLinkRegistration {\n readonly linkId: string\n readonly ir: DeclarativeLinkIR\n readonly readNodes: ReadonlyArray<{\n readonly nodeId: DeclarativeLinkNodeId\n readonly moduleInstanceKey: ModuleInstanceKey\n readonly readQuery: ReadQueryCompiled<any, any>\n }>\n readonly dispatchNodes: ReadonlyArray<{\n readonly nodeId: DeclarativeLinkNodeId\n readonly dispatch: (payload: unknown) => Effect.Effect<void, never, never>\n }>\n}\n\nexport interface DeclarativeLinkRuntime {\n readonly registerModuleAsSourceLink: (link: ModuleAsSourceLink) => () => void\n readonly registerDeclarativeLink: (link: DeclarativeLinkRegistration) => () => void\n readonly applyForSources: (args: {\n readonly tickSeq: number\n readonly acceptedModules: ReadonlyMap<ModuleInstanceKey, RuntimeStoreModuleCommit>\n readonly changedModuleInstanceKeys: ReadonlyArray<ModuleInstanceKey>\n }) => Effect.Effect<{ readonly scheduled: boolean }, never, never>\n}\n\ntype StoredModuleAsSourceLink = ModuleAsSourceLink & {\n hasValue: boolean\n lastValue: unknown\n}\n\ntype StoredDeclarativeLink = DeclarativeLinkRegistration & {\n readonly readNodeById: ReadonlyMap<string, { readonly nodeId: DeclarativeLinkNodeId; readonly moduleInstanceKey: ModuleInstanceKey; readonly readQuery: ReadQueryCompiled<any, any> }>\n readonly dispatchNodeById: ReadonlyMap<string, { readonly nodeId: DeclarativeLinkNodeId; readonly dispatch: (payload: unknown) => Effect.Effect<void, never, never> }>\n readonly dispatchTargetsByReadNode: ReadonlyMap<string, ReadonlyArray<DeclarativeLinkNodeId>>\n readonly readNodeState: Map<string, { hasValue: boolean; lastValue: unknown }>\n}\n\nexport const makeDeclarativeLinkRuntime = (): DeclarativeLinkRuntime => {\n const moduleAsSourceById = new Map<string, StoredModuleAsSourceLink>()\n const moduleAsSourceIdsBySource = new Map<ModuleInstanceKey, Set<string>>()\n\n const declarativeById = new Map<string, StoredDeclarativeLink>()\n const declarativeReadNodesBySource = new Map<ModuleInstanceKey, Array<{ readonly linkId: string; readonly nodeId: DeclarativeLinkNodeId }>>()\n\n const registerModuleAsSourceLink: DeclarativeLinkRuntime['registerModuleAsSourceLink'] = (link) => {\n const stored: StoredModuleAsSourceLink = {\n ...link,\n hasValue: false,\n lastValue: undefined,\n }\n\n moduleAsSourceById.set(link.id, stored)\n const set = moduleAsSourceIdsBySource.get(link.sourceModuleInstanceKey) ?? new Set<string>()\n set.add(link.id)\n moduleAsSourceIdsBySource.set(link.sourceModuleInstanceKey, set)\n\n return () => {\n moduleAsSourceById.delete(link.id)\n const current = moduleAsSourceIdsBySource.get(link.sourceModuleInstanceKey)\n if (!current) return\n current.delete(link.id)\n if (current.size === 0) {\n moduleAsSourceIdsBySource.delete(link.sourceModuleInstanceKey)\n }\n }\n }\n\n const registerDeclarativeLink: DeclarativeLinkRuntime['registerDeclarativeLink'] = (link) => {\n const readNodeById = new Map<string, { readonly nodeId: DeclarativeLinkNodeId; readonly moduleInstanceKey: ModuleInstanceKey; readonly readQuery: ReadQueryCompiled<any, any> }>()\n for (const n of link.readNodes) {\n readNodeById.set(n.nodeId, n)\n }\n\n const dispatchNodeById = new Map<\n string,\n { readonly nodeId: DeclarativeLinkNodeId; readonly dispatch: (payload: unknown) => Effect.Effect<void, never, never> }\n >()\n for (const n of link.dispatchNodes) {\n dispatchNodeById.set(n.nodeId, n)\n }\n\n // V1 constraint: dispatch must have at most one incoming edge, interpreted as \"payload flow\".\n const incomingByDispatch = new Map<string, number>()\n for (const e of link.ir.edges) {\n const to = e.to\n const isDispatch = dispatchNodeById.has(to)\n if (!isDispatch) continue\n incomingByDispatch.set(to, (incomingByDispatch.get(to) ?? 0) + 1)\n const count = incomingByDispatch.get(to) ?? 0\n if (count > 1) {\n throw new Error(\n `[DeclarativeLinkRuntime] Invalid DeclarativeLinkIR: dispatch node has multiple incoming edges (linkId=${link.linkId}, nodeId=${to}).`,\n )\n }\n }\n\n const dispatchTargetsByReadNode = new Map<string, Array<DeclarativeLinkNodeId>>()\n for (const e of link.ir.edges) {\n const from = e.from\n const to = e.to\n if (!readNodeById.has(from)) continue\n if (!dispatchNodeById.has(to)) continue\n const list = dispatchTargetsByReadNode.get(from) ?? []\n list.push(to)\n dispatchTargetsByReadNode.set(from, list)\n }\n\n const stored: StoredDeclarativeLink = {\n ...link,\n readNodeById,\n dispatchNodeById,\n dispatchTargetsByReadNode,\n readNodeState: new Map(),\n }\n\n declarativeById.set(link.linkId, stored)\n\n for (const n of link.readNodes) {\n const list = declarativeReadNodesBySource.get(n.moduleInstanceKey) ?? []\n list.push({ linkId: link.linkId, nodeId: n.nodeId })\n declarativeReadNodesBySource.set(n.moduleInstanceKey, list)\n }\n\n return () => {\n declarativeById.delete(link.linkId)\n for (const n of link.readNodes) {\n const list = declarativeReadNodesBySource.get(n.moduleInstanceKey)\n if (!list) continue\n const next = list.filter((x) => !(x.linkId === link.linkId && x.nodeId === n.nodeId))\n if (next.length === 0) {\n declarativeReadNodesBySource.delete(n.moduleInstanceKey)\n } else {\n declarativeReadNodesBySource.set(n.moduleInstanceKey, next)\n }\n }\n }\n }\n\n const applyForSources: DeclarativeLinkRuntime['applyForSources'] = (args) =>\n Effect.gen(function* () {\n let scheduled = false\n\n // ---- Module-as-Source edges (module readQuery -> externalStore trait writeback) ----\n for (const sourceKey of args.changedModuleInstanceKeys) {\n const ids = moduleAsSourceIdsBySource.get(sourceKey)\n if (!ids || ids.size === 0) continue\n const commit = args.acceptedModules.get(sourceKey)\n if (!commit) continue\n\n for (const id of ids) {\n const link = moduleAsSourceById.get(id)\n if (!link) continue\n\n let selected: unknown\n try {\n selected = link.readQuery.select(commit.state as any)\n } catch {\n continue\n }\n\n const nextValue = link.computeValue(selected)\n if (link.hasValue && link.equalsValue(link.lastValue, nextValue)) {\n continue\n }\n\n link.hasValue = true\n link.lastValue = nextValue\n scheduled = true\n yield* link.applyValue(nextValue)\n }\n }\n\n // ---- DeclarativeLinkIR edges (module readQuery -> dispatch) ----\n for (const sourceKey of args.changedModuleInstanceKeys) {\n const refs = declarativeReadNodesBySource.get(sourceKey)\n if (!refs || refs.length === 0) continue\n const commit = args.acceptedModules.get(sourceKey)\n if (!commit) continue\n\n for (const ref of refs) {\n const link = declarativeById.get(ref.linkId)\n if (!link) continue\n const readNode = link.readNodeById.get(ref.nodeId)\n if (!readNode) continue\n\n let value: unknown\n try {\n value = readNode.readQuery.select(commit.state as any)\n } catch {\n continue\n }\n\n const state = link.readNodeState.get(ref.nodeId) ?? { hasValue: false, lastValue: undefined }\n const changed = !state.hasValue || !Object.is(state.lastValue, value)\n if (!changed) continue\n\n state.hasValue = true\n state.lastValue = value\n link.readNodeState.set(ref.nodeId, state)\n\n const targets = link.dispatchTargetsByReadNode.get(ref.nodeId) ?? []\n for (const dispatchNodeId of targets) {\n const node = link.dispatchNodeById.get(dispatchNodeId)\n if (!node) continue\n scheduled = true\n yield* node.dispatch(value)\n }\n }\n }\n\n return { scheduled } as const\n })\n\n return {\n registerModuleAsSourceLink,\n registerDeclarativeLink,\n applyForSources,\n }\n}\n","import { FiberRef } from 'effect'\n\nexport type TxnOriginOverride = {\n readonly kind: string\n readonly name?: string\n}\n\nexport const currentTxnOriginOverride = FiberRef.unsafeMake<TxnOriginOverride | undefined>(undefined)\n\n","import { isDevEnv } from './env.js'\nimport type { RuntimeInternals } from './RuntimeInternals.js'\n\nconst RUNTIME_INTERNALS = Symbol.for('@logixjs/core/runtimeInternals')\nconst BOUND_INTERNALS = Symbol.for('@logixjs/core/boundInternals')\nconst MODULE_TRAITS_PROGRAM = Symbol.for('@logixjs/core/moduleTraitsProgram')\n\nconst defineHidden = (target: object, key: symbol, value: unknown): void => {\n Object.defineProperty(target, key, {\n value,\n enumerable: false,\n configurable: true,\n writable: false,\n })\n}\n\nexport const setRuntimeInternals = (runtime: object, internals: RuntimeInternals): void => {\n defineHidden(runtime, RUNTIME_INTERNALS, internals)\n}\n\nexport const setBoundInternals = (bound: object, internals: RuntimeInternals): void => {\n defineHidden(bound, BOUND_INTERNALS, internals)\n}\n\n/**\n * ModuleTraitsProgram(StateTraitProgram):\n * - Attaches a traits Program to a module definition object (used by TraitLifecycle/Debug).\n * - Uses Symbol + non-enumerable properties to avoid spreading `.__*` magic fields.\n *\n * Note: this is a \"module-definition-side\" internal slot, not RuntimeInternals (instance-level); the semantics differ.\n */\nexport const setModuleTraitsProgram = (module: object, program: unknown): void => {\n defineHidden(module, MODULE_TRAITS_PROGRAM, program)\n}\n\nexport const getModuleTraitsProgram = (module: unknown): unknown | undefined => {\n if (!module) return undefined\n if (typeof module !== 'object' && typeof module !== 'function') return undefined\n return (module as any)[MODULE_TRAITS_PROGRAM] as unknown | undefined\n}\n\nconst formatScope = (moduleId: unknown, instanceId: unknown): string => {\n const m = typeof moduleId === 'string' && moduleId.length > 0 ? moduleId : 'unknown'\n const i = typeof instanceId === 'string' && instanceId.length > 0 ? instanceId : 'unknown'\n return `moduleId=${m}, instanceId=${i}`\n}\n\nexport const getRuntimeInternals = (runtime: object): RuntimeInternals => {\n const scope = runtime as { readonly moduleId?: unknown; readonly instanceId?: unknown }\n const internals = (runtime as any)[RUNTIME_INTERNALS] as RuntimeInternals | undefined\n if (!internals) {\n const msg = isDevEnv()\n ? [\n '[MissingRuntimeInternals] Runtime internals not installed on ModuleRuntime instance.',\n `scope: ${formatScope(scope.moduleId, scope.instanceId)}`,\n 'fix:',\n '- Ensure ModuleRuntime.make calls internalHooks.installInternalHooks (020 foundation).',\n '- If you created a mock runtime for tests, attach internals or avoid calling internal-only APIs.',\n ].join('\\n')\n : 'Runtime internals not installed'\n throw new Error(msg)\n }\n\n const runtimeInstanceId = scope.instanceId\n if (\n typeof runtimeInstanceId === 'string' &&\n runtimeInstanceId.length > 0 &&\n runtimeInstanceId !== internals.instanceId\n ) {\n throw new Error(\n isDevEnv()\n ? [\n '[InconsistentRuntimeInternals] Runtime internals instanceId mismatch.',\n `runtime: ${formatScope(scope.moduleId, runtimeInstanceId)}`,\n `internals: ${formatScope(internals.moduleId, internals.instanceId)}`,\n ].join('\\n')\n : 'Runtime internals mismatch',\n )\n }\n\n return internals\n}\n\nexport const getBoundInternals = (bound: object): RuntimeInternals => {\n const internals = (bound as any)[BOUND_INTERNALS] as RuntimeInternals | undefined\n if (!internals) {\n const msg = isDevEnv()\n ? [\n '[MissingBoundInternals] Bound internals not installed on Bound API instance.',\n 'fix:',\n '- Ensure BoundApiRuntime attaches internals (020 foundation).',\n '- If you created a mock bound for tests, attach internals or avoid calling internal-only APIs.',\n ].join('\\n')\n : 'Bound internals not installed'\n throw new Error(msg)\n }\n\n return internals\n}\n","import { Context, Deferred } from 'effect'\n\nexport interface RootContext {\n context: Context.Context<any> | undefined\n readonly ready: Deferred.Deferred<Context.Context<any>, never>\n readonly appId?: string\n readonly appModuleIds?: ReadonlyArray<string>\n}\n\nclass RootContextTagImpl extends Context.Tag('@logixjs/core/RootContext')<RootContextTagImpl, RootContext>() {}\n\nexport const RootContextTag = RootContextTagImpl\n","// Internal EffectOp API (for internal implementation code).\n//\n// Goal:\n// - Internal modules must never import root public submodules (e.g. `../EffectOp`).\n// - This file hosts the shared implementation; public `src/EffectOp.ts` delegates to it.\n\nimport { Effect, Option } from 'effect'\nimport * as Core from './runtime/core/EffectOpCore.js'\nimport { RunSessionTag } from './observability/runSession.js'\n\nexport type EffectOp<Out = unknown, Err = unknown, Env = unknown> = Core.EffectOp<Out, Err, Env>\n\nexport type OperationPolicy = Core.OperationPolicy\n\nexport type OperationRejected = Core.OperationRejected\n\nexport type OperationError<E> = Core.OperationError<E>\n\nexport type Middleware = Core.Middleware\n\nexport type MiddlewareStack = Core.MiddlewareStack\n\nexport const composeMiddleware = Core.composeMiddleware\n\nexport const makeOperationRejected = Core.makeOperationRejected\n\n/**\n * Generate a stable id for identifying an EffectOp.\n * - Uses a monotonic sequence by default to avoid non-replayability from randomness/time.\n * - If meta.instanceId is available, prefer deriving `${instanceId}::o${opSeq}`.\n */\nlet nextGlobalOpSeq = 0\n\nconst nextOpSeq = (): number => {\n nextGlobalOpSeq += 1\n return nextGlobalOpSeq\n}\n\nconst makeId = (instanceId: string | undefined, opSeq: number): string =>\n instanceId ? `${instanceId}::o${opSeq}` : `o${opSeq}`\n\n/**\n * EffectOp.make:\n * - Create an EffectOp with basic meta.\n * - Generates a stable id by default (based on `instanceId` + monotonic `opSeq`); callers may override externally.\n */\nexport const make = <A, E, R>(params: {\n readonly kind: EffectOp['kind']\n readonly name: string\n readonly effect: Effect.Effect<A, E, R>\n readonly payload?: unknown\n readonly meta?: EffectOp['meta']\n readonly id?: string\n}): EffectOp<A, E, R> => ({\n ...(params.id\n ? { id: params.id, meta: params.meta }\n : (() => {\n const meta: any = params.meta ?? {}\n const instanceId: string | undefined = meta.instanceId\n const opSeq: number =\n typeof meta.opSeq === 'number' && Number.isFinite(meta.opSeq) ? Math.floor(meta.opSeq) : nextOpSeq()\n return {\n id: makeId(instanceId, opSeq),\n meta: meta.opSeq === opSeq ? meta : { ...meta, opSeq },\n }\n })()),\n kind: params.kind,\n name: params.name,\n payload: params.payload,\n effect: params.effect,\n})\n\n/**\n * EffectOp.makeInRunSession:\n * - Allocate a stable `opSeq` within a RunSession scope (per-session + per-instance).\n * - If RunSession is missing from Env, fall back to a process-wide monotonic sequence (no process-wide Map).\n */\nexport const makeInRunSession = <A, E, R>(params: {\n readonly kind: EffectOp['kind']\n readonly name: string\n readonly effect: Effect.Effect<A, E, R>\n readonly payload?: unknown\n readonly meta?: EffectOp['meta']\n readonly id?: string\n}): Effect.Effect<EffectOp<A, E, R>, never, any> =>\n Effect.gen(function* () {\n if (params.id) {\n return {\n id: params.id,\n kind: params.kind,\n name: params.name,\n payload: params.payload,\n meta: params.meta,\n effect: params.effect,\n } satisfies EffectOp<A, E, R>\n }\n\n const meta: any = params.meta ?? {}\n const instanceId: string | undefined = meta.instanceId\n\n let opSeq: number\n if (typeof meta.opSeq === 'number' && Number.isFinite(meta.opSeq)) {\n opSeq = Math.floor(meta.opSeq)\n } else {\n const sessionOpt = yield* Effect.serviceOption(RunSessionTag)\n if (Option.isSome(sessionOpt)) {\n const key = instanceId ?? 'global'\n opSeq = sessionOpt.value.local.nextSeq('opSeq', key)\n } else {\n opSeq = nextOpSeq()\n }\n }\n\n return {\n id: makeId(instanceId, opSeq),\n kind: params.kind,\n name: params.name,\n payload: params.payload,\n meta: meta.opSeq === opSeq ? meta : { ...meta, opSeq },\n effect: params.effect,\n } satisfies EffectOp<A, E, R>\n })\n\n/**\n * EffectOp.withMeta:\n * - Append or override meta fields on an existing EffectOp.\n * - Does not change the effect itself.\n */\nexport const withMeta = <A, E, R>(\n op: EffectOp<A, E, R>,\n meta: Partial<NonNullable<EffectOp['meta']>>,\n): EffectOp<A, E, R> => ({\n ...op,\n meta: { ...(op.meta ?? {}), ...meta },\n})\n\n/**\n * EffectOp.run:\n * - Execute an EffectOp using the given MiddlewareStack.\n * - If the stack is empty, return op.effect directly.\n */\nexport const run = <A, E, R>(op: EffectOp<A, E, R>, stack: MiddlewareStack): Effect.Effect<A, E, R> =>\n Core.runWithMiddleware(op, stack)\n","import { Context, Layer } from 'effect'\nimport type { JsonValue } from './jsonValue.js'\nimport type { EvidencePackage, EvidencePackageSource, ObservationEnvelope } from './evidence.js'\nimport { exportEvidencePackage, OBSERVABILITY_PROTOCOL_VERSION } from './evidence.js'\n\nexport type RunId = string\n\nexport interface RunSessionLocalState {\n /**\n * once: a de-dup key set for \"emit only once\" behavior (must be isolated per session to avoid cross-session pollution).\n * Returns true if it's the first occurrence, false if the key has been seen before.\n */\n readonly once: (key: string) => boolean\n\n /**\n * seq: allocate monotonic sequences by key (e.g. opSeq/eventSeq), must be isolated per session.\n */\n readonly nextSeq: (namespace: string, key: string) => number\n\n /** Tests/reset only: clear this session's local state. */\n readonly clear: () => void\n}\n\nexport interface RunSession {\n readonly runId: RunId\n readonly source: EvidencePackageSource\n readonly startedAt: number\n readonly local: RunSessionLocalState\n}\n\nclass RunSessionTagImpl extends Context.Tag('@logixjs/core/RunSession')<RunSessionTagImpl, RunSession>() {}\n\nexport const RunSessionTag = RunSessionTagImpl\n\nexport interface EvidenceSink {\n readonly record: (type: string, payload: JsonValue, options?: { readonly timestamp?: number }) => void\n readonly export: (options?: {\n readonly protocolVersion?: string\n readonly createdAt?: number\n readonly summary?: JsonValue\n readonly maxEvents?: number\n }) => EvidencePackage\n readonly clear: () => void\n}\n\nconst NEXT_RUN_SEQ_KEY = Symbol.for('@logixjs/core/runSession/nextRunSeq')\nlet fallbackNextRunSeq = 0\n\nconst nextRunSeq = (): number => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const g: any = globalThis as any\n const prev = typeof g[NEXT_RUN_SEQ_KEY] === 'number' ? (g[NEXT_RUN_SEQ_KEY] as number) : 0\n const next = prev + 1\n g[NEXT_RUN_SEQ_KEY] = next\n return next\n } catch {\n fallbackNextRunSeq += 1\n return fallbackNextRunSeq\n }\n}\n\nconst makeRunId = (startedAt: number): RunId => `run-${startedAt}.${nextRunSeq()}`\n\nexport const makeRunSessionLocalState = (): RunSessionLocalState => {\n const onceKeys = new Set<string>()\n const seqByNamespace = new Map<string, Map<string, number>>()\n\n return {\n once: (key) => {\n if (onceKeys.has(key)) return false\n onceKeys.add(key)\n return true\n },\n nextSeq: (namespace, key) => {\n const byKey = seqByNamespace.get(namespace) ?? new Map<string, number>()\n if (!seqByNamespace.has(namespace)) seqByNamespace.set(namespace, byKey)\n const prev = byKey.get(key) ?? 0\n const next = prev + 1\n byKey.set(key, next)\n return next\n },\n clear: () => {\n onceKeys.clear()\n seqByNamespace.clear()\n },\n }\n}\n\nexport const makeRunSession = (options?: {\n readonly runId?: RunId\n readonly source?: EvidencePackageSource\n readonly startedAt?: number\n readonly local?: RunSessionLocalState\n}): RunSession => {\n const startedAt = options?.startedAt ?? Date.now()\n return {\n runId: options?.runId ?? makeRunId(startedAt),\n source: options?.source ?? { host: 'unknown' },\n startedAt,\n local: options?.local ?? makeRunSessionLocalState(),\n }\n}\n\nexport const makeEvidenceSink = (session: RunSession): EvidenceSink => {\n const events: ObservationEnvelope[] = []\n let nextSeq = 1\n\n return {\n record: (type, payload, options) => {\n events.push({\n protocolVersion: OBSERVABILITY_PROTOCOL_VERSION,\n runId: session.runId,\n seq: nextSeq++,\n timestamp: options?.timestamp ?? Date.now(),\n type,\n payload,\n })\n },\n export: (options) => {\n const protocolVersion = options?.protocolVersion ?? OBSERVABILITY_PROTOCOL_VERSION\n const maxEvents = options?.maxEvents\n\n const selected =\n typeof maxEvents === 'number' && Number.isFinite(maxEvents) && maxEvents > 0\n ? events.slice(Math.max(0, events.length - Math.floor(maxEvents)))\n : events.slice()\n\n return exportEvidencePackage({\n protocolVersion,\n runId: session.runId,\n source: session.source,\n createdAt: options?.createdAt,\n events: selected,\n summary: options?.summary,\n })\n },\n clear: () => {\n events.length = 0\n nextSeq = 1\n },\n }\n}\n\nexport const runSessionLayer = (session?: RunSession): Layer.Layer<RunSessionTagImpl, never, never> =>\n Layer.succeed(RunSessionTag, session ?? makeRunSession()) as Layer.Layer<RunSessionTagImpl, never, never>\n"],"mappings":"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","names":["import_effect","record","out","limit","isPlainRecord","payload","isRecord","asNonEmptyString","payload","args","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","isRecord","asNonEmptyString","call","runSeq","runId","observe","payload","tickSeq","asNonEmptyString","isRecord","asNonEmptyString"]}