@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,348 @@
1
+ import {
2
+ installOne
3
+ } from "./chunk-46FGVWRF.js";
4
+ import {
5
+ compileWorkflowStaticIrV1,
6
+ makeWorkflowError,
7
+ normalizeWorkflowDefV1,
8
+ validateWorkflowDefV1
9
+ } from "./chunk-CCKP5Z6F.js";
10
+ import {
11
+ __export
12
+ } from "./chunk-PZ5AY32C.js";
13
+
14
+ // src/Workflow.ts
15
+ var Workflow_exports = {};
16
+ __export(Workflow_exports, {
17
+ KernelPorts: () => KernelPorts,
18
+ call: () => call,
19
+ callById: () => callById,
20
+ compose: () => compose,
21
+ constValue: () => constValue,
22
+ delay: () => delay,
23
+ dispatch: () => dispatch,
24
+ forModule: () => forModule,
25
+ fragment: () => fragment,
26
+ fromJSON: () => fromJSON,
27
+ make: () => make,
28
+ merge: () => merge,
29
+ object: () => object,
30
+ onAction: () => onAction,
31
+ onInit: () => onInit,
32
+ onStart: () => onStart,
33
+ payload: () => payload,
34
+ payloadPath: () => payloadPath,
35
+ withPolicy: () => withPolicy
36
+ });
37
+ import { Context } from "effect";
38
+
39
+ // src/internal/serviceId.ts
40
+ var asNonEmptyString = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
41
+ var fromTag = (tag) => {
42
+ const anyTag = tag;
43
+ return asNonEmptyString(anyTag.key) ?? asNonEmptyString(anyTag.id) ?? asNonEmptyString(anyTag._id);
44
+ };
45
+
46
+ // src/Workflow.ts
47
+ var KernelSourceRefreshPortTagImpl = class extends Context.Tag("logix/kernel/sourceRefresh")() {
48
+ };
49
+ var KernelPorts = {
50
+ sourceRefresh: KernelSourceRefreshPortTagImpl
51
+ };
52
+ var forModule = (_module) => {
53
+ return {
54
+ onAction: (actionTag) => onAction(actionTag),
55
+ onStart,
56
+ onInit,
57
+ payload,
58
+ payloadPath,
59
+ constValue,
60
+ object,
61
+ merge,
62
+ dispatch: (args) => dispatch(args),
63
+ delay,
64
+ callById: (args) => callById(args),
65
+ call: (args) => call(args),
66
+ fragment: (fragmentId, steps) => fragment(fragmentId, steps),
67
+ withPolicy: (patch, part) => withPolicy(patch, part),
68
+ compose: (...parts) => compose(...parts),
69
+ make: (input) => make(input),
70
+ fromJSON: (def) => fromJSON(def)
71
+ };
72
+ };
73
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
74
+ var isReadonlyArray = (value) => Array.isArray(value);
75
+ var asNonEmptyString2 = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
76
+ var mergePolicy = (base, patch) => {
77
+ if (!base && !patch) return void 0;
78
+ return {
79
+ ...base ?? {},
80
+ ...patch ?? {}
81
+ };
82
+ };
83
+ var applyCallDefaults = (steps, patch) => {
84
+ const timeoutMsDefault = patch.timeoutMs;
85
+ const retryDefault = patch.retry;
86
+ const visit = (step) => {
87
+ if (step.kind !== "call") return step;
88
+ let changed = false;
89
+ const timeoutMs = step.timeoutMs ?? timeoutMsDefault;
90
+ if (timeoutMs !== step.timeoutMs) changed = true;
91
+ const retry = step.retry ?? retryDefault;
92
+ if (retry !== step.retry) changed = true;
93
+ const onSuccess = step.onSuccess.map(visit);
94
+ const onFailure = step.onFailure.map(visit);
95
+ if (onSuccess !== step.onSuccess) changed = true;
96
+ if (onFailure !== step.onFailure) changed = true;
97
+ if (!changed) return step;
98
+ return {
99
+ ...step,
100
+ ...timeoutMs !== void 0 ? { timeoutMs } : null,
101
+ ...retry !== void 0 ? { retry } : null,
102
+ onSuccess,
103
+ onFailure
104
+ };
105
+ };
106
+ return steps.map(visit);
107
+ };
108
+ var resolveStepsInput = (input) => {
109
+ if (Array.isArray(input)) {
110
+ return { steps: input };
111
+ }
112
+ if (isRecord(input) && Array.isArray(input.steps)) {
113
+ return input;
114
+ }
115
+ throw makeWorkflowError({
116
+ code: "WORKFLOW_INVALID_DEF",
117
+ message: 'Workflow.make: "steps" must be an array or a { steps, sources?, policy? } object.',
118
+ detail: { steps: input }
119
+ });
120
+ };
121
+ var recordSourcesForFragment = (sources, fragmentId, step) => {
122
+ sources[step.key] = { fragmentId };
123
+ if (step.kind !== "call") return;
124
+ for (const inner of step.onSuccess) recordSourcesForFragment(sources, fragmentId, inner);
125
+ for (const inner of step.onFailure) recordSourcesForFragment(sources, fragmentId, inner);
126
+ };
127
+ var onAction = (actionTag) => ({
128
+ kind: "action",
129
+ actionTag
130
+ });
131
+ var onStart = () => ({
132
+ kind: "lifecycle",
133
+ phase: "onStart"
134
+ });
135
+ var onInit = () => ({
136
+ kind: "lifecycle",
137
+ phase: "onInit"
138
+ });
139
+ var payload = () => ({ kind: "payload" });
140
+ var payloadPath = (pointer) => ({ kind: "payload.path", pointer });
141
+ var constValue = (value) => ({ kind: "const", value });
142
+ var object = (fields) => ({ kind: "object", fields });
143
+ var merge = (items) => ({ kind: "merge", items });
144
+ var dispatch = (args) => ({
145
+ kind: "dispatch",
146
+ key: args.key,
147
+ actionTag: args.actionTag,
148
+ ...args.payload ? { payload: args.payload } : null
149
+ });
150
+ var delay = (args) => ({
151
+ kind: "delay",
152
+ key: args.key,
153
+ ms: args.ms
154
+ });
155
+ var callById = (args) => ({
156
+ kind: "call",
157
+ key: args.key,
158
+ serviceId: args.serviceId,
159
+ ...args.input ? { input: args.input } : null,
160
+ ...args.timeoutMs !== void 0 ? { timeoutMs: args.timeoutMs } : null,
161
+ ...args.retry ? { retry: args.retry } : null,
162
+ onSuccess: args.onSuccess ?? [],
163
+ onFailure: args.onFailure ?? []
164
+ });
165
+ var call = (args) => {
166
+ const serviceId = fromTag(args.service);
167
+ if (!serviceId) {
168
+ throw makeWorkflowError({
169
+ code: "WORKFLOW_INVALID_SERVICE_ID",
170
+ message: "call(service): serviceId derived from tag must be a non-empty string (see 078 ServiceId contract).",
171
+ detail: { tag: String(args.service) }
172
+ });
173
+ }
174
+ return callById({
175
+ ...args,
176
+ serviceId
177
+ });
178
+ };
179
+ var fragment = (fragmentId, steps) => ({
180
+ fragmentId,
181
+ steps
182
+ });
183
+ var withPolicy = (patch, part) => {
184
+ let normalized;
185
+ if (isReadonlyArray(part)) {
186
+ normalized = { steps: part };
187
+ } else {
188
+ const partUnknown = part;
189
+ if (!isRecord(partUnknown) || !isReadonlyArray(partUnknown.steps)) {
190
+ throw makeWorkflowError({
191
+ code: "WORKFLOW_INVALID_DEF",
192
+ message: "withPolicy: invalid workflow part (expected steps[] / fragment / composeResult).",
193
+ detail: { part }
194
+ });
195
+ }
196
+ normalized = {
197
+ steps: part.steps,
198
+ ...part.sources ? { sources: part.sources } : null,
199
+ ...part.policy ? { policy: part.policy } : null
200
+ };
201
+ }
202
+ const steps = applyCallDefaults(normalized.steps, patch);
203
+ const patchPolicy = (() => {
204
+ const concurrency = patch.concurrency;
205
+ const priority = patch.priority;
206
+ return concurrency !== void 0 || priority !== void 0 ? { concurrency, priority } : void 0;
207
+ })();
208
+ const nextPolicy = mergePolicy(patchPolicy, normalized.policy);
209
+ return {
210
+ steps,
211
+ ...normalized.sources ? { sources: normalized.sources } : null,
212
+ ...nextPolicy ? { policy: nextPolicy } : null
213
+ };
214
+ };
215
+ var compose = (...parts) => {
216
+ const steps = [];
217
+ const sources = {};
218
+ let policy = void 0;
219
+ const ownersByKey = /* @__PURE__ */ new Map();
220
+ const recordOwner = (stepKey, fragmentId) => {
221
+ const list = ownersByKey.get(stepKey) ?? [];
222
+ list.push({ stepKey, ...fragmentId ? { fragmentId } : null });
223
+ ownersByKey.set(stepKey, list);
224
+ };
225
+ const recordOwners = (step, resolveFragmentId) => {
226
+ recordOwner(step.key, resolveFragmentId(step.key));
227
+ if (step.kind !== "call") return;
228
+ for (const inner of step.onSuccess) recordOwners(inner, resolveFragmentId);
229
+ for (const inner of step.onFailure) recordOwners(inner, resolveFragmentId);
230
+ };
231
+ for (const part of parts) {
232
+ if (isReadonlyArray(part)) {
233
+ steps.push(...part);
234
+ for (const step of part) recordOwners(step, () => void 0);
235
+ continue;
236
+ }
237
+ const partSteps = part.steps;
238
+ steps.push(...partSteps);
239
+ const partSources = part.sources;
240
+ if (partSources && typeof partSources === "object") {
241
+ for (const k of Object.keys(partSources).sort()) {
242
+ sources[k] = { ...partSources[k] };
243
+ }
244
+ }
245
+ const fragmentId = "fragmentId" in part ? part.fragmentId : void 0;
246
+ if (typeof fragmentId === "string" && fragmentId.length > 0) {
247
+ for (const step of partSteps) {
248
+ recordSourcesForFragment(sources, fragmentId, step);
249
+ }
250
+ }
251
+ const resolveFragmentIdForPart = (stepKey) => {
252
+ if (typeof fragmentId === "string" && fragmentId.length > 0) return fragmentId;
253
+ const fromSources = partSources?.[stepKey]?.fragmentId;
254
+ return typeof fromSources === "string" && fromSources.length > 0 ? fromSources : void 0;
255
+ };
256
+ for (const step of partSteps) recordOwners(step, resolveFragmentIdForPart);
257
+ policy = mergePolicy(policy, part.policy);
258
+ }
259
+ const finalSources = Object.keys(sources).length > 0 ? sources : void 0;
260
+ const duplicateKeys = Array.from(ownersByKey.entries()).filter(([, owners]) => owners.length > 1).map(([k]) => k).sort();
261
+ if (duplicateKeys.length > 0) {
262
+ const k = duplicateKeys[0];
263
+ throw makeWorkflowError({
264
+ code: "WORKFLOW_DUPLICATE_STEP_KEY",
265
+ message: `Duplicate stepKey "${k}" detected during composition.`,
266
+ source: { stepKey: k },
267
+ detail: { duplicateKey: k, owners: ownersByKey.get(k) ?? [] }
268
+ });
269
+ }
270
+ return {
271
+ steps,
272
+ ...finalSources ? { sources: finalSources } : null,
273
+ ...policy ? { policy } : null
274
+ };
275
+ };
276
+ var make = (input) => {
277
+ const localId = asNonEmptyString2(input.localId);
278
+ if (!localId) {
279
+ throw makeWorkflowError({
280
+ code: "WORKFLOW_INVALID_DEF",
281
+ message: "Workflow.make: localId must be a non-empty string.",
282
+ detail: { localId: input.localId }
283
+ });
284
+ }
285
+ const stepsInput = resolveStepsInput(input.steps);
286
+ const merged = mergePolicy(input.policy, stepsInput.policy);
287
+ const def = normalizeWorkflowDefV1({
288
+ astVersion: 1,
289
+ localId,
290
+ trigger: input.trigger,
291
+ ...merged ? { policy: merged } : null,
292
+ steps: stepsInput.steps,
293
+ ...stepsInput.sources ? { sources: stepsInput.sources } : null,
294
+ ...input.meta ? { meta: input.meta } : null
295
+ });
296
+ const staticIrCache = /* @__PURE__ */ new Map();
297
+ return {
298
+ _tag: "Workflow",
299
+ def,
300
+ toJSON: () => def,
301
+ validate: () => validateWorkflowDefV1(def),
302
+ exportStaticIr: (moduleId) => {
303
+ const cached = staticIrCache.get(moduleId);
304
+ if (cached) return cached;
305
+ const ir = compileWorkflowStaticIrV1({ moduleId, def });
306
+ staticIrCache.set(moduleId, ir);
307
+ return ir;
308
+ },
309
+ install: (moduleTag) => installOne({
310
+ moduleTag,
311
+ program: { _tag: "Workflow", def }
312
+ })
313
+ };
314
+ };
315
+ var fromJSON = (def) => make({
316
+ localId: def.localId,
317
+ trigger: def.trigger,
318
+ ...def.policy ? { policy: def.policy } : null,
319
+ steps: {
320
+ steps: def.steps,
321
+ ...def.sources ? { sources: def.sources } : null
322
+ },
323
+ ...def.meta ? { meta: def.meta } : null
324
+ });
325
+
326
+ export {
327
+ KernelPorts,
328
+ forModule,
329
+ onAction,
330
+ onStart,
331
+ onInit,
332
+ payload,
333
+ payloadPath,
334
+ constValue,
335
+ object,
336
+ merge,
337
+ dispatch,
338
+ delay,
339
+ callById,
340
+ call,
341
+ fragment,
342
+ withPolicy,
343
+ compose,
344
+ make,
345
+ fromJSON,
346
+ Workflow_exports
347
+ };
348
+ //# sourceMappingURL=chunk-GPBAZQ23.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Workflow.ts","../src/internal/serviceId.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"],"mappings":"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","names":["asNonEmptyString"]}
@@ -1,12 +1,10 @@
1
1
  import {
2
2
  OBSERVABILITY_PROTOCOL_VERSION,
3
- exportEvidencePackage
4
- } from "./chunk-M7IYCTJV.js";
5
- import {
6
3
  composeMiddleware,
4
+ exportEvidencePackage,
7
5
  makeOperationRejected,
8
6
  runWithMiddleware
9
- } from "./chunk-JWOYLO27.js";
7
+ } from "./chunk-WYJUJV4L.js";
10
8
 
11
9
  // src/internal/observability/runSession.ts
12
10
  import { Context, Layer } from "effect";
@@ -172,4 +170,4 @@ export {
172
170
  withMeta,
173
171
  run
174
172
  };
175
- //# sourceMappingURL=chunk-OFADUJWJ.js.map
173
+ //# sourceMappingURL=chunk-I4LCE5OY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/observability/runSession.ts","../src/internal/effect-op.ts"],"sourcesContent":["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","// 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"],"mappings":"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","names":["composeMiddleware","makeOperationRejected"]}
1
+ {"version":3,"sources":["../src/internal/observability/runSession.ts","../src/internal/effect-op.ts"],"sourcesContent":["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","// 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"],"mappings":"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","names":["composeMiddleware","makeOperationRejected"]}