@logixjs/core 0.0.1

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 (345) hide show
  1. package/dist/Action-BkRHy2vg.d.cts +10 -0
  2. package/dist/Action-mqVvtEHt.d.ts +10 -0
  3. package/dist/Action.cjs +57 -0
  4. package/dist/Action.cjs.map +1 -0
  5. package/dist/Action.d.cts +2 -0
  6. package/dist/Action.d.ts +2 -0
  7. package/dist/Action.js +9 -0
  8. package/dist/Action.js.map +1 -0
  9. package/dist/Actions-AsQ07yTP.d.cts +22 -0
  10. package/dist/Actions-AsQ07yTP.d.ts +22 -0
  11. package/dist/Actions.cjs +19 -0
  12. package/dist/Actions.cjs.map +1 -0
  13. package/dist/Actions.d.cts +2 -0
  14. package/dist/Actions.d.ts +2 -0
  15. package/dist/Actions.js +2 -0
  16. package/dist/Actions.js.map +1 -0
  17. package/dist/Bound-BN1DQ_lM.d.ts +23 -0
  18. package/dist/Bound-BPIfH9SS.d.cts +23 -0
  19. package/dist/Bound.cjs +1532 -0
  20. package/dist/Bound.cjs.map +1 -0
  21. package/dist/Bound.d.cts +7 -0
  22. package/dist/Bound.d.ts +7 -0
  23. package/dist/Bound.js +25 -0
  24. package/dist/Bound.js.map +1 -0
  25. package/dist/Debug-B5q5Bkzx.d.ts +320 -0
  26. package/dist/Debug-Bq8Sqjcr.d.cts +320 -0
  27. package/dist/Debug.cjs +1821 -0
  28. package/dist/Debug.cjs.map +1 -0
  29. package/dist/Debug.d.cts +13 -0
  30. package/dist/Debug.d.ts +13 -0
  31. package/dist/Debug.js +76 -0
  32. package/dist/Debug.js.map +1 -0
  33. package/dist/EffectOp.cjs +169 -0
  34. package/dist/EffectOp.cjs.map +1 -0
  35. package/dist/EffectOp.d.cts +118 -0
  36. package/dist/EffectOp.d.ts +118 -0
  37. package/dist/EffectOp.js +28 -0
  38. package/dist/EffectOp.js.map +1 -0
  39. package/dist/Env-DuJ6JrU2.d.cts +10 -0
  40. package/dist/Env-DuJ6JrU2.d.ts +10 -0
  41. package/dist/Env.cjs +60 -0
  42. package/dist/Env.cjs.map +1 -0
  43. package/dist/Env.d.cts +1 -0
  44. package/dist/Env.d.ts +1 -0
  45. package/dist/Env.js +11 -0
  46. package/dist/Env.js.map +1 -0
  47. package/dist/Flow-1fZT8MpX.d.cts +152 -0
  48. package/dist/Flow-BhpjE22E.d.ts +152 -0
  49. package/dist/Flow.cjs +504 -0
  50. package/dist/Flow.cjs.map +1 -0
  51. package/dist/Flow.d.cts +8 -0
  52. package/dist/Flow.d.ts +8 -0
  53. package/dist/Flow.js +15 -0
  54. package/dist/Flow.js.map +1 -0
  55. package/dist/Handle-D8D1zPb_.d.cts +30 -0
  56. package/dist/Handle-D_cLW1Z3.d.ts +30 -0
  57. package/dist/Handle.cjs +42 -0
  58. package/dist/Handle.cjs.map +1 -0
  59. package/dist/Handle.d.cts +7 -0
  60. package/dist/Handle.d.ts +7 -0
  61. package/dist/Handle.js +10 -0
  62. package/dist/Handle.js.map +1 -0
  63. package/dist/Kernel-8kC-jOda.d.cts +171 -0
  64. package/dist/Kernel-CnGE1Fyk.d.ts +171 -0
  65. package/dist/Kernel.cjs +284 -0
  66. package/dist/Kernel.cjs.map +1 -0
  67. package/dist/Kernel.d.cts +14 -0
  68. package/dist/Kernel.d.ts +14 -0
  69. package/dist/Kernel.js +36 -0
  70. package/dist/Kernel.js.map +1 -0
  71. package/dist/Link-Db7975nU.d.ts +45 -0
  72. package/dist/Link-fX8x1eCK.d.cts +45 -0
  73. package/dist/Link.cjs +542 -0
  74. package/dist/Link.cjs.map +1 -0
  75. package/dist/Link.d.cts +7 -0
  76. package/dist/Link.d.ts +7 -0
  77. package/dist/Link.js +35 -0
  78. package/dist/Link.js.map +1 -0
  79. package/dist/Logic-BRjEMr-W.d.ts +38 -0
  80. package/dist/Logic-DRh4sDZj.d.cts +38 -0
  81. package/dist/Logic.cjs +37 -0
  82. package/dist/Logic.cjs.map +1 -0
  83. package/dist/Logic.d.cts +7 -0
  84. package/dist/Logic.d.ts +7 -0
  85. package/dist/Logic.js +10 -0
  86. package/dist/Logic.js.map +1 -0
  87. package/dist/MatchBuilder-0QOc-nlU.d.ts +14 -0
  88. package/dist/MatchBuilder-CJk5oCkR.d.cts +14 -0
  89. package/dist/MatchBuilder.cjs +85 -0
  90. package/dist/MatchBuilder.cjs.map +1 -0
  91. package/dist/MatchBuilder.d.cts +8 -0
  92. package/dist/MatchBuilder.d.ts +8 -0
  93. package/dist/MatchBuilder.js +11 -0
  94. package/dist/MatchBuilder.js.map +1 -0
  95. package/dist/Middleware.cjs +411 -0
  96. package/dist/Middleware.cjs.map +1 -0
  97. package/dist/Middleware.d.cts +88 -0
  98. package/dist/Middleware.d.ts +88 -0
  99. package/dist/Middleware.js +27 -0
  100. package/dist/Middleware.js.map +1 -0
  101. package/dist/Module-B_0xRDMR.d.cts +203 -0
  102. package/dist/Module-DnzluX2J.d.ts +203 -0
  103. package/dist/Module.cjs +13512 -0
  104. package/dist/Module.cjs.map +1 -0
  105. package/dist/Module.d.cts +8 -0
  106. package/dist/Module.d.ts +8 -0
  107. package/dist/Module.js +53 -0
  108. package/dist/Module.js.map +1 -0
  109. package/dist/ModuleTag-C8FHY_sY.d.ts +93 -0
  110. package/dist/ModuleTag-EGbgBMpZ.d.cts +93 -0
  111. package/dist/ModuleTag.cjs +12231 -0
  112. package/dist/ModuleTag.cjs.map +1 -0
  113. package/dist/ModuleTag.d.cts +8 -0
  114. package/dist/ModuleTag.d.ts +8 -0
  115. package/dist/ModuleTag.js +39 -0
  116. package/dist/ModuleTag.js.map +1 -0
  117. package/dist/Observability-COqEvp2C.d.cts +713 -0
  118. package/dist/Observability-cY4kLn0S.d.ts +713 -0
  119. package/dist/Observability.cjs +5865 -0
  120. package/dist/Observability.cjs.map +1 -0
  121. package/dist/Observability.d.cts +9 -0
  122. package/dist/Observability.d.ts +9 -0
  123. package/dist/Observability.js +41 -0
  124. package/dist/Observability.js.map +1 -0
  125. package/dist/Platform-C49Pv956.d.cts +21 -0
  126. package/dist/Platform-C49Pv956.d.ts +21 -0
  127. package/dist/Platform-CHX8o-U4.d.ts +51 -0
  128. package/dist/Platform-CVlv0xLQ.d.cts +51 -0
  129. package/dist/Platform.cjs +58 -0
  130. package/dist/Platform.cjs.map +1 -0
  131. package/dist/Platform.d.cts +4 -0
  132. package/dist/Platform.d.ts +4 -0
  133. package/dist/Platform.js +15 -0
  134. package/dist/Platform.js.map +1 -0
  135. package/dist/Process-CM9xbMdP.d.ts +92 -0
  136. package/dist/Process-mL8fHDSB.d.cts +92 -0
  137. package/dist/Process.cjs +575 -0
  138. package/dist/Process.cjs.map +1 -0
  139. package/dist/Process.d.cts +8 -0
  140. package/dist/Process.d.ts +8 -0
  141. package/dist/Process.js +42 -0
  142. package/dist/Process.js.map +1 -0
  143. package/dist/ReadQuery-BlMwhe-F.d.ts +30 -0
  144. package/dist/ReadQuery-CL5XlXts.d.cts +30 -0
  145. package/dist/ReadQuery-SinbStGF.d.cts +38 -0
  146. package/dist/ReadQuery-SinbStGF.d.ts +38 -0
  147. package/dist/ReadQuery.cjs +377 -0
  148. package/dist/ReadQuery.cjs.map +1 -0
  149. package/dist/ReadQuery.d.cts +2 -0
  150. package/dist/ReadQuery.d.ts +2 -0
  151. package/dist/ReadQuery.js +14 -0
  152. package/dist/ReadQuery.js.map +1 -0
  153. package/dist/Reflection-CQnKwPXj.d.ts +182 -0
  154. package/dist/Reflection-Kabo1mlU.d.cts +182 -0
  155. package/dist/Reflection.cjs +2954 -0
  156. package/dist/Reflection.cjs.map +1 -0
  157. package/dist/Reflection.d.cts +17 -0
  158. package/dist/Reflection.d.ts +17 -0
  159. package/dist/Reflection.js +40 -0
  160. package/dist/Reflection.js.map +1 -0
  161. package/dist/Resource-Dy1xD_DG.d.cts +75 -0
  162. package/dist/Resource-Dy1xD_DG.d.ts +75 -0
  163. package/dist/Resource.cjs +166 -0
  164. package/dist/Resource.cjs.map +1 -0
  165. package/dist/Resource.d.cts +3 -0
  166. package/dist/Resource.d.ts +3 -0
  167. package/dist/Resource.js +21 -0
  168. package/dist/Resource.js.map +1 -0
  169. package/dist/Root-7ADUMk4t.d.cts +29 -0
  170. package/dist/Root-7ADUMk4t.d.ts +29 -0
  171. package/dist/Root.cjs +125 -0
  172. package/dist/Root.cjs.map +1 -0
  173. package/dist/Root.d.cts +4 -0
  174. package/dist/Root.d.ts +4 -0
  175. package/dist/Root.js +12 -0
  176. package/dist/Root.js.map +1 -0
  177. package/dist/Runtime-B-aL-f29.d.cts +274 -0
  178. package/dist/Runtime-CtyzZG4i.d.ts +274 -0
  179. package/dist/Runtime.cjs +5740 -0
  180. package/dist/Runtime.cjs.map +1 -0
  181. package/dist/Runtime.d.cts +19 -0
  182. package/dist/Runtime.d.ts +19 -0
  183. package/dist/Runtime.js +62 -0
  184. package/dist/Runtime.js.map +1 -0
  185. package/dist/ScopeRegistry-D1owDNSm.d.cts +61 -0
  186. package/dist/ScopeRegistry-D1owDNSm.d.ts +61 -0
  187. package/dist/ScopeRegistry.cjs +152 -0
  188. package/dist/ScopeRegistry.cjs.map +1 -0
  189. package/dist/ScopeRegistry.d.cts +2 -0
  190. package/dist/ScopeRegistry.d.ts +2 -0
  191. package/dist/ScopeRegistry.js +16 -0
  192. package/dist/ScopeRegistry.js.map +1 -0
  193. package/dist/State-CU50R26M.d.cts +19 -0
  194. package/dist/State-CU50R26M.d.ts +19 -0
  195. package/dist/State.cjs +19 -0
  196. package/dist/State.cjs.map +1 -0
  197. package/dist/State.d.cts +2 -0
  198. package/dist/State.d.ts +2 -0
  199. package/dist/State.js +2 -0
  200. package/dist/State.js.map +1 -0
  201. package/dist/StateTrait-BGsZghTz.d.ts +122 -0
  202. package/dist/StateTrait-OWhbj12c.d.cts +122 -0
  203. package/dist/StateTrait.cjs +2737 -0
  204. package/dist/StateTrait.cjs.map +1 -0
  205. package/dist/StateTrait.d.cts +9 -0
  206. package/dist/StateTrait.d.ts +9 -0
  207. package/dist/StateTrait.js +39 -0
  208. package/dist/StateTrait.js.map +1 -0
  209. package/dist/TraitLifecycle-CwV5WPFX.d.cts +88 -0
  210. package/dist/TraitLifecycle-LdIWmKlg.d.ts +88 -0
  211. package/dist/TraitLifecycle.cjs +581 -0
  212. package/dist/TraitLifecycle.cjs.map +1 -0
  213. package/dist/TraitLifecycle.d.cts +8 -0
  214. package/dist/TraitLifecycle.d.ts +8 -0
  215. package/dist/TraitLifecycle.js +24 -0
  216. package/dist/TraitLifecycle.js.map +1 -0
  217. package/dist/action-DiMDD_0v.d.cts +35 -0
  218. package/dist/action-DiMDD_0v.d.ts +35 -0
  219. package/dist/chunk-24VULZ7A.js +76 -0
  220. package/dist/chunk-24VULZ7A.js.map +1 -0
  221. package/dist/chunk-3IYZ5IGG.js +17 -0
  222. package/dist/chunk-3IYZ5IGG.js.map +1 -0
  223. package/dist/chunk-3QMIVH35.js +43 -0
  224. package/dist/chunk-3QMIVH35.js.map +1 -0
  225. package/dist/chunk-3RMKLXHX.js +83 -0
  226. package/dist/chunk-3RMKLXHX.js.map +1 -0
  227. package/dist/chunk-3TMODYZV.js +111 -0
  228. package/dist/chunk-3TMODYZV.js.map +1 -0
  229. package/dist/chunk-3VG5TWQR.js +27 -0
  230. package/dist/chunk-3VG5TWQR.js.map +1 -0
  231. package/dist/chunk-4CQAV7YB.js +37 -0
  232. package/dist/chunk-4CQAV7YB.js.map +1 -0
  233. package/dist/chunk-4SO6JMZL.js +7 -0
  234. package/dist/chunk-4SO6JMZL.js.map +1 -0
  235. package/dist/chunk-66ALHVEX.js +40 -0
  236. package/dist/chunk-66ALHVEX.js.map +1 -0
  237. package/dist/chunk-76WT3HOR.js +397 -0
  238. package/dist/chunk-76WT3HOR.js.map +1 -0
  239. package/dist/chunk-ANLBCBDC.js +285 -0
  240. package/dist/chunk-ANLBCBDC.js.map +1 -0
  241. package/dist/chunk-AUIR5O6W.js +75 -0
  242. package/dist/chunk-AUIR5O6W.js.map +1 -0
  243. package/dist/chunk-BABLDP24.js +445 -0
  244. package/dist/chunk-BABLDP24.js.map +1 -0
  245. package/dist/chunk-BE3HW4FY.js +1099 -0
  246. package/dist/chunk-BE3HW4FY.js.map +1 -0
  247. package/dist/chunk-BZ2SHDN2.js +54 -0
  248. package/dist/chunk-BZ2SHDN2.js.map +1 -0
  249. package/dist/chunk-CW6T36TN.js +393 -0
  250. package/dist/chunk-CW6T36TN.js.map +1 -0
  251. package/dist/chunk-DFNM3WX2.js +632 -0
  252. package/dist/chunk-DFNM3WX2.js.map +1 -0
  253. package/dist/chunk-DMBALCE2.js +1034 -0
  254. package/dist/chunk-DMBALCE2.js.map +1 -0
  255. package/dist/chunk-EGK3KN7B.js +406 -0
  256. package/dist/chunk-EGK3KN7B.js.map +1 -0
  257. package/dist/chunk-EY4NZKDR.js +19 -0
  258. package/dist/chunk-EY4NZKDR.js.map +1 -0
  259. package/dist/chunk-G5ZBFPNU.js +23 -0
  260. package/dist/chunk-G5ZBFPNU.js.map +1 -0
  261. package/dist/chunk-GMPEOUP2.js +31 -0
  262. package/dist/chunk-GMPEOUP2.js.map +1 -0
  263. package/dist/chunk-IHVBV5C2.js +279 -0
  264. package/dist/chunk-IHVBV5C2.js.map +1 -0
  265. package/dist/chunk-IPF7E66P.js +23 -0
  266. package/dist/chunk-IPF7E66P.js.map +1 -0
  267. package/dist/chunk-JCXGZRMU.js +204 -0
  268. package/dist/chunk-JCXGZRMU.js.map +1 -0
  269. package/dist/chunk-JGIWG6SR.js +6359 -0
  270. package/dist/chunk-JGIWG6SR.js.map +1 -0
  271. package/dist/chunk-JWOYLO27.js +241 -0
  272. package/dist/chunk-JWOYLO27.js.map +1 -0
  273. package/dist/chunk-KIXAU3GM.js +137 -0
  274. package/dist/chunk-KIXAU3GM.js.map +1 -0
  275. package/dist/chunk-KL5ACTCT.js +8 -0
  276. package/dist/chunk-KL5ACTCT.js.map +1 -0
  277. package/dist/chunk-KP7MUZNX.js +83 -0
  278. package/dist/chunk-KP7MUZNX.js.map +1 -0
  279. package/dist/chunk-LEU6UA5J.js +1 -0
  280. package/dist/chunk-LEU6UA5J.js.map +1 -0
  281. package/dist/chunk-M2RGJPXX.js +35 -0
  282. package/dist/chunk-M2RGJPXX.js.map +1 -0
  283. package/dist/chunk-M3BFQ7HK.js +13 -0
  284. package/dist/chunk-M3BFQ7HK.js.map +1 -0
  285. package/dist/chunk-M3WTHJHJ.js +1051 -0
  286. package/dist/chunk-M3WTHJHJ.js.map +1 -0
  287. package/dist/chunk-M7IYCTJV.js +79 -0
  288. package/dist/chunk-M7IYCTJV.js.map +1 -0
  289. package/dist/chunk-NBD3KUOZ.js +838 -0
  290. package/dist/chunk-NBD3KUOZ.js.map +1 -0
  291. package/dist/chunk-NQZ2OSGR.js +151 -0
  292. package/dist/chunk-NQZ2OSGR.js.map +1 -0
  293. package/dist/chunk-NZJKFF45.js +106 -0
  294. package/dist/chunk-NZJKFF45.js.map +1 -0
  295. package/dist/chunk-OFADUJWJ.js +175 -0
  296. package/dist/chunk-OFADUJWJ.js.map +1 -0
  297. package/dist/chunk-OGWBVHB3.js +461 -0
  298. package/dist/chunk-OGWBVHB3.js.map +1 -0
  299. package/dist/chunk-PAYXCY6A.js +1696 -0
  300. package/dist/chunk-PAYXCY6A.js.map +1 -0
  301. package/dist/chunk-PYOE4VSI.js +1924 -0
  302. package/dist/chunk-PYOE4VSI.js.map +1 -0
  303. package/dist/chunk-PZ5AY32C.js +10 -0
  304. package/dist/chunk-PZ5AY32C.js.map +1 -0
  305. package/dist/chunk-QCHIQWAJ.js +21 -0
  306. package/dist/chunk-QCHIQWAJ.js.map +1 -0
  307. package/dist/chunk-QMM6O4CD.js +71 -0
  308. package/dist/chunk-QMM6O4CD.js.map +1 -0
  309. package/dist/chunk-RNFE3ML2.js +22 -0
  310. package/dist/chunk-RNFE3ML2.js.map +1 -0
  311. package/dist/chunk-TAAPQVZN.js +23 -0
  312. package/dist/chunk-TAAPQVZN.js.map +1 -0
  313. package/dist/chunk-THATMZXD.js +21 -0
  314. package/dist/chunk-THATMZXD.js.map +1 -0
  315. package/dist/chunk-TKZ7MEIA.js +27 -0
  316. package/dist/chunk-TKZ7MEIA.js.map +1 -0
  317. package/dist/chunk-TQOBJYDP.js +7 -0
  318. package/dist/chunk-TQOBJYDP.js.map +1 -0
  319. package/dist/chunk-VZB726PE.js +93 -0
  320. package/dist/chunk-VZB726PE.js.map +1 -0
  321. package/dist/chunk-W3TEWHLO.js +568 -0
  322. package/dist/chunk-W3TEWHLO.js.map +1 -0
  323. package/dist/chunk-YS3AZQ2G.js +52 -0
  324. package/dist/chunk-YS3AZQ2G.js.map +1 -0
  325. package/dist/chunk-ZDTRWK5F.js +40 -0
  326. package/dist/chunk-ZDTRWK5F.js.map +1 -0
  327. package/dist/chunk-ZFLHVFUC.js +192 -0
  328. package/dist/chunk-ZFLHVFUC.js.map +1 -0
  329. package/dist/chunk-ZFY7U2FR.js +133 -0
  330. package/dist/chunk-ZFY7U2FR.js.map +1 -0
  331. package/dist/chunk-ZGDVUPTM.js +270 -0
  332. package/dist/chunk-ZGDVUPTM.js.map +1 -0
  333. package/dist/index.cjs +19700 -0
  334. package/dist/index.cjs.map +1 -0
  335. package/dist/index.d.cts +195 -0
  336. package/dist/index.d.ts +195 -0
  337. package/dist/index.js +286 -0
  338. package/dist/index.js.map +1 -0
  339. package/dist/ir-BMP7yxJJ.d.cts +39 -0
  340. package/dist/ir-DUOz6H-5.d.ts +39 -0
  341. package/dist/module-B8CBqIZ_.d.cts +1191 -0
  342. package/dist/module-k7m3txak.d.ts +1191 -0
  343. package/dist/protocol-g_1897M2.d.cts +127 -0
  344. package/dist/protocol-g_1897M2.d.ts +127 -0
  345. package/package.json +162 -0
@@ -0,0 +1,241 @@
1
+ // src/internal/runtime/core/EffectOpCore.ts
2
+ import { Context, Effect, FiberRef } from "effect";
3
+ var currentLinkId = FiberRef.unsafeMake(void 0);
4
+ var makeOperationRejected = (params) => ({
5
+ _tag: "OperationRejected",
6
+ message: params.message,
7
+ kind: params.kind,
8
+ name: params.name,
9
+ linkId: params.linkId,
10
+ details: params.details
11
+ });
12
+ var EffectOpMiddlewareTag = class extends Context.Tag("Logix/EffectOpMiddleware")() {
13
+ };
14
+ var composeMiddleware = (stack) => {
15
+ return (op) => stack.reduceRight(
16
+ (eff, mw) => mw({ ...op, effect: eff }),
17
+ op.effect
18
+ );
19
+ };
20
+ var runWithMiddleware = (op, stack) => {
21
+ return Effect.gen(function* () {
22
+ const existing = yield* FiberRef.get(currentLinkId);
23
+ const metaLinkId = op.meta?.linkId;
24
+ const linkId = typeof metaLinkId === "string" && metaLinkId.length > 0 ? metaLinkId : existing ?? op.id;
25
+ const nextOp = {
26
+ ...op,
27
+ meta: {
28
+ ...op.meta ?? {},
29
+ linkId
30
+ }
31
+ };
32
+ const program = stack.length ? composeMiddleware(stack)(nextOp) : nextOp.effect;
33
+ return yield* Effect.locally(currentLinkId, linkId)(program);
34
+ });
35
+ };
36
+
37
+ // src/internal/observability/jsonValue.ts
38
+ var isJsonValue = (input) => {
39
+ const seen = /* @__PURE__ */ new WeakSet();
40
+ const loop = (value, depth) => {
41
+ if (depth > 64) return false;
42
+ if (value === null) return true;
43
+ switch (typeof value) {
44
+ case "string":
45
+ case "boolean":
46
+ return true;
47
+ case "number":
48
+ return Number.isFinite(value);
49
+ case "object": {
50
+ if (Array.isArray(value)) {
51
+ if (seen.has(value)) return false;
52
+ seen.add(value);
53
+ for (const item of value) {
54
+ if (!loop(item, depth + 1)) return false;
55
+ }
56
+ return true;
57
+ }
58
+ if (!isPlainRecord(value)) return false;
59
+ if (seen.has(value)) return false;
60
+ seen.add(value);
61
+ for (const v of Object.values(value)) {
62
+ if (!loop(v, depth + 1)) return false;
63
+ }
64
+ return true;
65
+ }
66
+ default:
67
+ return false;
68
+ }
69
+ };
70
+ return loop(input, 0);
71
+ };
72
+ var defaultOptions = {
73
+ maxDepth: 6,
74
+ maxObjectKeys: 32,
75
+ maxArrayLength: 32,
76
+ maxStringLength: 256,
77
+ maxJsonBytes: 4 * 1024,
78
+ oversizedPreviewBytes: 256
79
+ };
80
+ var truncateString = (value, maxLen, stats) => {
81
+ if (value.length <= maxLen) return value;
82
+ stats.oversized += 1;
83
+ return value.slice(0, maxLen);
84
+ };
85
+ var mergeDowngrade = (current, next) => {
86
+ if (!current) return next;
87
+ if (current === "non_serializable" || next === "non_serializable") return "non_serializable";
88
+ if (current === "oversized" || next === "oversized") return "oversized";
89
+ return "unknown";
90
+ };
91
+ function isPlainRecord(value) {
92
+ if (typeof value !== "object" || value === null) return false;
93
+ const proto = Object.getPrototypeOf(value);
94
+ return proto === Object.prototype || proto === null;
95
+ }
96
+ var asNumber = (value, stats) => {
97
+ if (Number.isFinite(value)) return value;
98
+ stats.nonSerializable += 1;
99
+ return String(value);
100
+ };
101
+ var toJsonValueInternal = (input, options, stats, seen, depth) => {
102
+ if (input === null) return null;
103
+ switch (typeof input) {
104
+ case "string":
105
+ return truncateString(input, options.maxStringLength, stats);
106
+ case "number":
107
+ return asNumber(input, stats);
108
+ case "boolean":
109
+ return input;
110
+ case "bigint":
111
+ stats.nonSerializable += 1;
112
+ return truncateString(input.toString(), options.maxStringLength, stats);
113
+ case "symbol":
114
+ stats.nonSerializable += 1;
115
+ return truncateString(input.toString(), options.maxStringLength, stats);
116
+ case "function":
117
+ stats.nonSerializable += 1;
118
+ return "[Function]";
119
+ case "undefined":
120
+ stats.dropped += 1;
121
+ return null;
122
+ }
123
+ if (depth >= options.maxDepth) {
124
+ stats.oversized += 1;
125
+ return "[Truncated]";
126
+ }
127
+ if (input instanceof Date) {
128
+ return input.toISOString();
129
+ }
130
+ if (input instanceof Error) {
131
+ stats.nonSerializable += 1;
132
+ return {
133
+ name: truncateString(input.name, options.maxStringLength, stats),
134
+ message: truncateString(input.message, options.maxStringLength, stats)
135
+ };
136
+ }
137
+ if (typeof input === "object") {
138
+ if (seen.has(input)) {
139
+ stats.nonSerializable += 1;
140
+ return "[Circular]";
141
+ }
142
+ seen.add(input);
143
+ }
144
+ if (Array.isArray(input)) {
145
+ const out2 = [];
146
+ const limit2 = Math.min(input.length, options.maxArrayLength);
147
+ for (let i = 0; i < limit2; i++) {
148
+ out2.push(toJsonValueInternal(input[i], options, stats, seen, depth + 1));
149
+ }
150
+ if (input.length > limit2) {
151
+ stats.oversized += 1;
152
+ out2.push(`[...${input.length - limit2} more]`);
153
+ }
154
+ return out2;
155
+ }
156
+ if (!isPlainRecord(input)) {
157
+ stats.nonSerializable += 1;
158
+ return truncateString(String(input), options.maxStringLength, stats);
159
+ }
160
+ const entries = Object.entries(input);
161
+ const limit = Math.min(entries.length, options.maxObjectKeys);
162
+ const out = {};
163
+ for (let i = 0; i < limit; i++) {
164
+ const [rawKey, rawValue] = entries[i];
165
+ const key = truncateString(rawKey, options.maxStringLength, stats);
166
+ if (rawValue === void 0) {
167
+ stats.dropped += 1;
168
+ continue;
169
+ }
170
+ out[key] = toJsonValueInternal(rawValue, options, stats, seen, depth + 1);
171
+ }
172
+ if (entries.length > limit) {
173
+ stats.oversized += 1;
174
+ out.__truncatedKeys = entries.length - limit;
175
+ }
176
+ return out;
177
+ };
178
+ var projectJsonValue = (input, options) => {
179
+ const resolved = { ...defaultOptions, ...options ?? {} };
180
+ const stats = { dropped: 0, oversized: 0, nonSerializable: 0 };
181
+ const seen = /* @__PURE__ */ new WeakSet();
182
+ let downgrade;
183
+ const value = toJsonValueInternal(input, resolved, stats, seen, 0);
184
+ if (stats.nonSerializable > 0) {
185
+ downgrade = mergeDowngrade(downgrade, "non_serializable");
186
+ }
187
+ if (stats.oversized > 0) {
188
+ downgrade = mergeDowngrade(downgrade, "oversized");
189
+ }
190
+ try {
191
+ const json = JSON.stringify(value);
192
+ if (json.length > resolved.maxJsonBytes) {
193
+ downgrade = mergeDowngrade(downgrade, "oversized");
194
+ const preview = json.slice(0, Math.min(resolved.oversizedPreviewBytes, resolved.maxJsonBytes));
195
+ return {
196
+ value: {
197
+ _tag: "oversized",
198
+ bytes: json.length,
199
+ preview
200
+ },
201
+ stats: {
202
+ dropped: stats.dropped,
203
+ oversized: stats.oversized + 1,
204
+ nonSerializable: stats.nonSerializable
205
+ },
206
+ downgrade
207
+ };
208
+ }
209
+ } catch {
210
+ downgrade = mergeDowngrade(downgrade, "non_serializable");
211
+ return {
212
+ value: "[Unserializable]",
213
+ stats: {
214
+ dropped: stats.dropped,
215
+ oversized: stats.oversized,
216
+ nonSerializable: stats.nonSerializable + 1
217
+ },
218
+ downgrade
219
+ };
220
+ }
221
+ return {
222
+ value,
223
+ stats: {
224
+ dropped: stats.dropped,
225
+ oversized: stats.oversized,
226
+ nonSerializable: stats.nonSerializable
227
+ },
228
+ downgrade
229
+ };
230
+ };
231
+
232
+ export {
233
+ isJsonValue,
234
+ projectJsonValue,
235
+ currentLinkId,
236
+ makeOperationRejected,
237
+ EffectOpMiddlewareTag,
238
+ composeMiddleware,
239
+ runWithMiddleware
240
+ };
241
+ //# sourceMappingURL=chunk-JWOYLO27.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/runtime/core/EffectOpCore.ts","../src/internal/observability/jsonValue.ts"],"sourcesContent":["// 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","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 entries = Object.entries(input)\n const limit = Math.min(entries.length, options.maxObjectKeys)\n const out: Record<string, JsonValue> = {}\n\n for (let i = 0; i < limit; i++) {\n const [rawKey, rawValue] = entries[i]!\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 (entries.length > limit) {\n stats.oversized += 1\n out.__truncatedKeys = entries.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"],"mappings":"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","names":["out","limit"]}
@@ -0,0 +1,137 @@
1
+ import {
2
+ build,
3
+ installSourceRefresh
4
+ } from "./chunk-PYOE4VSI.js";
5
+ import {
6
+ getAtPath
7
+ } from "./chunk-BABLDP24.js";
8
+ import {
9
+ exportStaticIr
10
+ } from "./chunk-ZFY7U2FR.js";
11
+ import {
12
+ getBoundInternals
13
+ } from "./chunk-3RMKLXHX.js";
14
+ import {
15
+ __export
16
+ } from "./chunk-PZ5AY32C.js";
17
+
18
+ // src/StateTrait.ts
19
+ var StateTrait_exports = {};
20
+ __export(StateTrait_exports, {
21
+ $root: () => $root,
22
+ build: () => build2,
23
+ computed: () => computed,
24
+ exportStaticIr: () => exportStaticIr2,
25
+ from: () => from,
26
+ install: () => install2,
27
+ link: () => link,
28
+ list: () => list,
29
+ node: () => node,
30
+ source: () => source
31
+ });
32
+
33
+ // src/internal/state-trait/install.ts
34
+ import { Effect } from "effect";
35
+ var buildEntryIndex = (entries) => {
36
+ const index = /* @__PURE__ */ new Map();
37
+ for (const entry of entries) {
38
+ const list2 = index.get(entry.fieldPath) ?? [];
39
+ list2.push(entry);
40
+ index.set(entry.fieldPath, list2);
41
+ }
42
+ return index;
43
+ };
44
+ var install = (bound, program) => {
45
+ try {
46
+ const internals = getBoundInternals(bound);
47
+ internals.traits.registerStateTraitProgram(program, {
48
+ bumpReason: "logic_installed"
49
+ });
50
+ } catch {
51
+ }
52
+ const entryIndex = buildEntryIndex(program.entries);
53
+ const installStep = (step) => {
54
+ if (!step.targetFieldPath) {
55
+ return Effect.void;
56
+ }
57
+ if (step.kind !== "source-refresh") {
58
+ return Effect.void;
59
+ }
60
+ const candidates = entryIndex.get(step.targetFieldPath);
61
+ if (!candidates || candidates.length === 0) {
62
+ return Effect.void;
63
+ }
64
+ const entry = candidates.find((e) => e.kind === "source");
65
+ if (!entry) {
66
+ return Effect.void;
67
+ }
68
+ return installSourceRefresh(bound, step, entry);
69
+ };
70
+ return Effect.forEach(program.plan.steps, (step) => installStep(step)).pipe(Effect.asVoid);
71
+ };
72
+
73
+ // src/StateTrait.ts
74
+ var $root = "$root";
75
+ var from = (_schema) => (spec) => spec;
76
+ var node = (spec) => ({
77
+ _tag: "StateTraitNode",
78
+ ...spec
79
+ });
80
+ var list = (spec) => ({
81
+ _tag: "StateTraitList",
82
+ ...spec
83
+ });
84
+ var computed = (input) => {
85
+ const derive = (state) => {
86
+ const args = input.deps.map((dep) => getAtPath(state, dep));
87
+ return input.get(...args);
88
+ };
89
+ return {
90
+ fieldPath: void 0,
91
+ kind: "computed",
92
+ meta: {
93
+ deps: input.deps,
94
+ derive,
95
+ equals: input.equals,
96
+ ...input.scheduling ? { scheduling: input.scheduling } : {}
97
+ }
98
+ };
99
+ };
100
+ var source = (input) => {
101
+ const key = (state) => {
102
+ const args = input.deps.map((dep) => getAtPath(state, dep));
103
+ return input.key(...args);
104
+ };
105
+ return {
106
+ fieldPath: void 0,
107
+ kind: "source",
108
+ meta: { ...input, key }
109
+ };
110
+ };
111
+ var link = (meta) => ({
112
+ fieldPath: void 0,
113
+ kind: "link",
114
+ meta: { ...meta, ...meta.scheduling ? { scheduling: meta.scheduling } : {} }
115
+ });
116
+ var build2 = (stateSchema, spec) => build(stateSchema, spec);
117
+ var install2 = (bound, program) => install(bound, program);
118
+ var exportStaticIr2 = (program, moduleId, options) => exportStaticIr({
119
+ program,
120
+ moduleId,
121
+ version: options?.version
122
+ });
123
+
124
+ export {
125
+ $root,
126
+ from,
127
+ node,
128
+ list,
129
+ computed,
130
+ source,
131
+ link,
132
+ build2 as build,
133
+ install2 as install,
134
+ exportStaticIr2 as exportStaticIr,
135
+ StateTrait_exports
136
+ };
137
+ //# sourceMappingURL=chunk-KIXAU3GM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/StateTrait.ts","../src/internal/state-trait/install.ts"],"sourcesContent":["// StateTrait namespace module (@logixjs/core/StateTrait):\n// - Provides a DSL for trait specs (from/node/list/computed/source/link).\n// - build: normalizes the spec and produces Program/Graph/Plan.\n// - install: installs a Program into the runtime (registers source.refresh, runs converge/validate in txn windows).\n\nimport type { Schema } from 'effect'\nimport { Effect } from 'effect'\nimport type { BoundApi } from './Bound.js'\nimport * as Model from './internal/state-trait/model.js'\nimport * as FieldPath from './internal/state-trait/field-path.js'\nimport * as RowId from './internal/state-trait/rowid.js'\nimport * as InternalBuild from './internal/state-trait/build.js'\nimport * as InternalInstall from './internal/state-trait/install.js'\nimport * as InternalIr from './internal/state-trait/ir.js'\n\n// Public type aliases.\nexport type StateTraitSpec<S> = Model.StateTraitSpec<S>\nexport type StateTraitEntry<S = unknown, P extends string = string> = Model.StateTraitEntry<S, P>\nexport type StateTraitProgram<S> = Model.StateTraitProgram<S>\nexport type StateTraitGraph = Model.StateTraitGraph\nexport type StateTraitPlan = Model.StateTraitPlan\nexport type StateTraitNode<Input = unknown, Ctx = unknown> = Model.StateTraitNode<Input, Ctx>\nexport type StateTraitList<Item = unknown> = Model.StateTraitList<Item>\nexport type CheckRule<Input = unknown, Ctx = unknown> = Model.CheckRule<Input, Ctx>\n\nexport type StateFieldPath<S> = FieldPath.StateFieldPath<S>\nexport type StateAtPath<S, P> = FieldPath.StateAtPath<S, P>\n\nexport const $root = '$root' as const\n\ntype DepsArgs<S extends object, Deps extends ReadonlyArray<StateFieldPath<S>>> = {\n readonly [K in keyof Deps]: StateAtPath<S, Deps[K]>\n}\n\n/**\n * StateTrait.from:\n * - Narrows available field paths based on the state Schema, adding type constraints to trait specs.\n * - At runtime this returns the raw spec object; normalization is handled by internal layers.\n */\nexport const from =\n <S extends object, I>(_schema: Schema.Schema<S, I>) =>\n (spec: StateTraitSpec<S>): StateTraitSpec<S> =>\n spec\n\nexport const node = <Input = unknown, Ctx = unknown>(\n spec: Omit<Model.StateTraitNode<Input, Ctx>, '_tag'>,\n): Model.StateTraitNode<Input, Ctx> => ({\n _tag: 'StateTraitNode',\n ...spec,\n})\n\nexport const list = <Item = unknown>(spec: Omit<Model.StateTraitList<Item>, '_tag'>): Model.StateTraitList<Item> => ({\n _tag: 'StateTraitList',\n ...spec,\n})\n\n/**\n * StateTrait.computed:\n * - Declares computed semantics for a field.\n * - Uses explicit deps as the single source of truth for dependencies (diagnostics / reverse-closure / incremental sched).\n */\nexport const computed = <\n S extends object,\n P extends StateFieldPath<S>,\n const Deps extends ReadonlyArray<StateFieldPath<S>>,\n>(input: {\n readonly deps: Deps\n readonly get: (...depsValues: DepsArgs<S, Deps>) => StateAtPath<S, P>\n readonly equals?: (prev: StateAtPath<S, P>, next: StateAtPath<S, P>) => boolean\n /**\n * 043: explicit converge time-slicing scheduling.\n * - unset: immediate (default behavior unchanged)\n * - deferred: can be postponed and merged into later windows (requires runtime time-slicing enabled)\n */\n readonly scheduling?: Model.TraitConvergeScheduling\n}): StateTraitEntry<S, P> => {\n const derive = (state: Readonly<S>): StateAtPath<S, P> => {\n const args = (input.deps as ReadonlyArray<string>).map((dep) => RowId.getAtPath(state as any, dep))\n return (input.get as any)(...args)\n }\n return {\n fieldPath: undefined as unknown as P,\n kind: 'computed',\n meta: {\n deps: input.deps,\n derive,\n equals: input.equals,\n ...(input.scheduling ? { scheduling: input.scheduling } : {}),\n },\n } as StateTraitEntry<S, P>\n}\n\n/**\n * StateTrait.source:\n * - Declares an external resource source for a field (Resource / Query integration is implemented in later phases).\n * - The kernel owns keyHash gating / concurrency / ReplayMode behavior.\n */\nexport const source = <\n S extends object,\n P extends StateFieldPath<S>,\n const Deps extends ReadonlyArray<StateFieldPath<S>>,\n>(input: {\n readonly resource: string\n readonly deps: Deps\n readonly key: (...depsValues: DepsArgs<S, Deps>) => unknown\n readonly triggers?: ReadonlyArray<'onMount' | 'onKeyChange' | 'manual'>\n readonly debounceMs?: number\n readonly concurrency?: 'switch' | 'exhaust-trailing'\n /**\n * Serializable metadata for Devtools/docs (whitelisted fields are extracted during build).\n */\n readonly meta?: Record<string, unknown>\n}): StateTraitEntry<S, P> => {\n const key = (state: Readonly<S>): unknown => {\n const args = (input.deps as ReadonlyArray<string>).map((dep) => RowId.getAtPath(state as any, dep))\n return (input.key as any)(...args)\n }\n return {\n fieldPath: undefined as unknown as P,\n kind: 'source',\n meta: { ...input, key },\n } as StateTraitEntry<S, P>\n}\n\n/**\n * StateTrait.link:\n * - Declares a linkage from another field into the target field.\n * - `meta.from` is also constrained by `StateFieldPath<S>`.\n */\nexport const link = <S extends object, P extends StateFieldPath<S>>(meta: {\n from: StateFieldPath<S>\n /**\n * 043: explicit converge time-slicing scheduling.\n * - unset: immediate (default behavior unchanged)\n * - deferred: can be postponed and merged into later windows (requires runtime time-slicing enabled)\n */\n scheduling?: Model.TraitConvergeScheduling\n}): StateTraitEntry<S, P> =>\n ({\n fieldPath: undefined as unknown as P,\n kind: 'link',\n meta: { ...meta, ...(meta.scheduling ? { scheduling: meta.scheduling } : {}) },\n }) as StateTraitEntry<S, P>\n\n/**\n * StateTrait.build:\n * - Normalizes the spec into an executable Program (including Graph/Plan).\n * - When DSL and build constraints differ, build is the final authority (e.g. requiring explicit deps).\n */\nexport const build = <S extends object>(\n stateSchema: Schema.Schema<S, any>,\n spec: StateTraitSpec<S>,\n): StateTraitProgram<S> => InternalBuild.build(stateSchema, spec)\n\n/**\n * StateTrait.install:\n * - Installs Program-defined behavior (computed/link/source/check, etc.) on top of a Bound API.\n * - Each PlanStep corresponds to a long-lived Effect mounted into the runtime Scope.\n */\nexport const install = <S extends object>(\n bound: BoundApi<any, any>,\n program: StateTraitProgram<S>,\n): Effect.Effect<void, never, any> => InternalInstall.install(bound, program)\n\n/**\n * StateTrait.exportStaticIr:\n * - Exports minimal Static IR (aligned with 009 canonical FieldPath constraints) for Devtools / Alignment Lab.\n * - The return value must be JSON-stringifiable (evidence packages / replay pipeline).\n */\nexport type StaticIr = InternalIr.StaticIr\n\nexport const exportStaticIr = (\n program: StateTraitProgram<any>,\n moduleId: string,\n options?: {\n readonly version?: string\n },\n): StaticIr =>\n InternalIr.exportStaticIr({\n program,\n moduleId,\n version: options?.version,\n })\n","import { Effect } from 'effect'\nimport type { BoundApi } from '../runtime/core/module.js'\nimport { getBoundInternals } from '../runtime/core/runtimeInternalsAccessor.js'\nimport * as SourceRuntime from './source.js'\nimport type {\n StateTraitProgram,\n StateTraitPlanStep,\n StateTraitEntry,\n TraitConvergeGenerationBumpReason,\n} from './model.js'\n\nconst buildEntryIndex = <S>(\n entries: ReadonlyArray<StateTraitEntry<S, string>>,\n): Map<string, Array<StateTraitEntry<S, string>>> => {\n const index = new Map<string, Array<StateTraitEntry<S, string>>>()\n for (const entry of entries) {\n const list = index.get(entry.fieldPath) ?? []\n list.push(entry)\n index.set(entry.fieldPath, list)\n }\n return index\n}\n\n/**\n * Install behaviors described by StateTraitProgram onto the given Bound API.\n *\n * - Phase 2 minimal implementation:\n * - Register watchers for computed fields: recompute target fields when State changes.\n * - Register watchers for link fields: sync target fields when source fields change.\n * - Reserve refresh entrypoints for source fields (no external calls yet).\n *\n * Notes:\n * - All watchers are installed via Bound API `$`, without directly depending on ModuleRuntime.\n * - Each PlanStep corresponds to a long-lived Effect and is mounted into the Runtime Scope via forkScoped.\n */\nexport const install = <S>(\n bound: BoundApi<any, any>,\n program: StateTraitProgram<S>,\n): Effect.Effect<void, never, any> => {\n // Register the program to Runtime first (the converge engine runs computed/link/check before txn commit).\n try {\n const internals = getBoundInternals(bound as any)\n ;(internals.traits.registerStateTraitProgram as any)(program, {\n bumpReason: 'logic_installed' as TraitConvergeGenerationBumpReason,\n })\n } catch {\n // no-op for legacy/mocked bound\n }\n\n const entryIndex = buildEntryIndex(program.entries as any)\n\n const installStep = (step: StateTraitPlanStep): Effect.Effect<void, never, any> => {\n if (!step.targetFieldPath) {\n return Effect.void\n }\n\n if (step.kind !== 'source-refresh') {\n // computed/link/check are handled by the runtime core within the transaction window; install keeps only source.refresh entrypoints.\n return Effect.void\n }\n\n const candidates = entryIndex.get(step.targetFieldPath)\n if (!candidates || candidates.length === 0) {\n // The plan references a missing spec: treat it as a build-time bug and ignore the step here.\n return Effect.void\n }\n\n const entry = candidates.find((e) => e.kind === 'source')\n\n if (!entry) {\n return Effect.void\n }\n\n return SourceRuntime.installSourceRefresh(bound, step, entry as any)\n }\n\n return Effect.forEach(program.plan.steps, (step) => installStep(step)).pipe(Effect.asVoid)\n}\n"],"mappings":"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","names":["build","exportStaticIr","install","list","build","install","exportStaticIr"]}
@@ -0,0 +1,8 @@
1
+ // src/internal/runtime/core/Platform.ts
2
+ import { Context } from "effect";
3
+ var Tag = Context.GenericTag("@logixjs/Platform");
4
+
5
+ export {
6
+ Tag
7
+ };
8
+ //# sourceMappingURL=chunk-KL5ACTCT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/runtime/core/Platform.ts"],"sourcesContent":["import { Context, Effect } from 'effect'\n\nexport interface Service {\n readonly lifecycle: {\n readonly onSuspend: (eff: Effect.Effect<void, never, any>) => Effect.Effect<void, never, any>\n readonly onResume: (eff: Effect.Effect<void, never, any>) => Effect.Effect<void, never, any>\n readonly onReset?: (eff: Effect.Effect<void, never, any>) => Effect.Effect<void, never, any>\n }\n\n /**\n * Platform signal broadcaster (for host integration and tests): triggers registered lifecycle handlers.\n *\n * Notes:\n * - The default implementation should be a safe no-op.\n * - Failure policy is decided by the platform implementation; the runtime should ensure \"do not terminate the instance by default\".\n */\n readonly emitSuspend: () => Effect.Effect<void, never, any>\n readonly emitResume: () => Effect.Effect<void, never, any>\n readonly emitReset: () => Effect.Effect<void, never, any>\n}\n\nexport const Tag = Context.GenericTag<Service>('@logixjs/Platform')\n"],"mappings":";AAAA,SAAS,eAAuB;AAqBzB,IAAM,MAAM,QAAQ,WAAoB,mBAAmB;","names":[]}
@@ -0,0 +1,83 @@
1
+ // src/internal/runtime/core/FullCutoverGate.ts
2
+ var CutoverCoverageMatrix = {
3
+ version: "v1",
4
+ requiredServiceIds: ["txnQueue", "operationRunner", "transaction", "dispatch"]
5
+ };
6
+ var expectedImplIdForKernel = (kernelId) => kernelId === "core" ? "builtin" : kernelId;
7
+ var parseFallbackServiceIds = (overridesApplied) => {
8
+ const out = /* @__PURE__ */ new Set();
9
+ for (const entry of overridesApplied) {
10
+ if (!entry.includes("(fallback=")) continue;
11
+ const colon = entry.indexOf(":");
12
+ if (colon < 0) continue;
13
+ const eq = entry.indexOf("=", colon + 1);
14
+ if (eq < 0) continue;
15
+ const serviceId = entry.slice(colon + 1, eq);
16
+ if (serviceId.length > 0) out.add(serviceId);
17
+ }
18
+ return Array.from(out).sort((a, b) => a.localeCompare(b));
19
+ };
20
+ var collectMissingServiceIds = (args) => {
21
+ const bindingByServiceId = /* @__PURE__ */ new Map();
22
+ for (const b of args.bindings) {
23
+ bindingByServiceId.set(b.serviceId, b);
24
+ }
25
+ const missing = [];
26
+ for (const serviceId of args.requiredServiceIds) {
27
+ const binding = bindingByServiceId.get(serviceId);
28
+ const implId = binding?.implId;
29
+ if (!implId || implId !== args.expectedImplId) {
30
+ missing.push(serviceId);
31
+ }
32
+ }
33
+ return missing;
34
+ };
35
+ var evaluateFullCutoverGate = (args) => {
36
+ const expectedImplId = expectedImplIdForKernel(args.requestedKernelId);
37
+ const matrix = args.coverageMatrix ?? CutoverCoverageMatrix;
38
+ const fallbackServiceIds = parseFallbackServiceIds(args.runtimeServicesEvidence.overridesApplied);
39
+ const missingServiceIds = collectMissingServiceIds({
40
+ expectedImplId,
41
+ requiredServiceIds: matrix.requiredServiceIds,
42
+ bindings: args.runtimeServicesEvidence.bindings
43
+ });
44
+ const fullyActivated = missingServiceIds.length === 0 && fallbackServiceIds.length === 0;
45
+ const verdict = args.mode === "fullCutover" ? fullyActivated ? "PASS" : "FAIL" : "PASS";
46
+ const moduleIdRaw = args.runtimeServicesEvidence.moduleId;
47
+ const moduleId = typeof moduleIdRaw === "string" && moduleIdRaw.length > 0 ? moduleIdRaw : "unknown";
48
+ const anchor = {
49
+ moduleId,
50
+ instanceId: args.runtimeServicesEvidence.instanceId,
51
+ txnSeq: 0
52
+ };
53
+ const level = args.diagnosticsLevel ?? "off";
54
+ return {
55
+ version: "v1",
56
+ mode: args.mode,
57
+ requestedKernelId: args.requestedKernelId,
58
+ verdict,
59
+ fullyActivated,
60
+ missingServiceIds,
61
+ fallbackServiceIds,
62
+ anchor,
63
+ ...level === "off" ? {} : {
64
+ details: {
65
+ expectedImplId,
66
+ bindings: args.runtimeServicesEvidence.bindings,
67
+ overridesApplied: args.runtimeServicesEvidence.overridesApplied
68
+ }
69
+ }
70
+ };
71
+ };
72
+
73
+ // src/internal/runtime/core/RuntimeServiceBuiltins.ts
74
+ import { Context } from "effect";
75
+ var RuntimeServiceBuiltinsTag = class extends Context.Tag("@logixjs/core/RuntimeServiceBuiltins")() {
76
+ };
77
+
78
+ export {
79
+ CutoverCoverageMatrix,
80
+ evaluateFullCutoverGate,
81
+ RuntimeServiceBuiltinsTag
82
+ };
83
+ //# sourceMappingURL=chunk-KP7MUZNX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/runtime/core/FullCutoverGate.ts","../src/internal/runtime/core/RuntimeServiceBuiltins.ts"],"sourcesContent":["import type { KernelId } from './KernelRef.js'\nimport type { RuntimeServiceBinding, RuntimeServicesEvidence } from './RuntimeKernel.js'\n\nexport interface CutoverCoverageMatrix {\n readonly version: 'v1'\n readonly requiredServiceIds: ReadonlyArray<string>\n}\n\nexport const CutoverCoverageMatrix = {\n version: 'v1',\n requiredServiceIds: ['txnQueue', 'operationRunner', 'transaction', 'dispatch'],\n} as const satisfies CutoverCoverageMatrix\n\nexport type FullCutoverGateMode = 'trial' | 'fullCutover'\n\nexport interface FullCutoverGateAnchor {\n readonly moduleId: string\n readonly instanceId: string\n /**\n * Convention: txnSeq=0 denotes assembly (a wiring-time failure anchor).\n * Full Cutover Gate is evaluated during assembly by default, so it does not depend on a real txn.\n */\n readonly txnSeq: number\n}\n\nexport type FullCutoverGateVerdict = 'PASS' | 'FAIL'\n\nexport interface FullCutoverGateResult {\n readonly version: 'v1'\n readonly mode: FullCutoverGateMode\n readonly requestedKernelId: KernelId\n readonly verdict: FullCutoverGateVerdict\n /**\n * fullyActivated: a stricter \"full cutover\" truth value.\n * - Requires every serviceId in the coverage matrix to be bound to the expected implId.\n * - Requires no fallback (any `fallback=` in overridesApplied means not fully activated).\n *\n * Note: in trial mode the verdict may be PASS while fullyActivated can still be false.\n */\n readonly fullyActivated: boolean\n readonly missingServiceIds: ReadonlyArray<string>\n readonly fallbackServiceIds: ReadonlyArray<string>\n readonly anchor: FullCutoverGateAnchor\n /**\n * When diagnostics=off, it must stay slim (avoid permanent overhead).\n * In light/full, additional explainable info is allowed (still must be serializable).\n */\n readonly details?: {\n readonly expectedImplId: string\n readonly bindings: ReadonlyArray<RuntimeServiceBinding>\n readonly overridesApplied: ReadonlyArray<string>\n }\n}\n\nconst expectedImplIdForKernel = (kernelId: KernelId): string => (kernelId === 'core' ? 'builtin' : kernelId)\n\nconst parseFallbackServiceIds = (overridesApplied: ReadonlyArray<string>): ReadonlyArray<string> => {\n const out = new Set<string>()\n for (const entry of overridesApplied) {\n if (!entry.includes('(fallback=')) continue\n const colon = entry.indexOf(':')\n if (colon < 0) continue\n const eq = entry.indexOf('=', colon + 1)\n if (eq < 0) continue\n const serviceId = entry.slice(colon + 1, eq)\n if (serviceId.length > 0) out.add(serviceId)\n }\n return Array.from(out).sort((a, b) => a.localeCompare(b))\n}\n\nconst collectMissingServiceIds = (args: {\n readonly expectedImplId: string\n readonly requiredServiceIds: ReadonlyArray<string>\n readonly bindings: ReadonlyArray<RuntimeServiceBinding>\n}): ReadonlyArray<string> => {\n const bindingByServiceId = new Map<string, RuntimeServiceBinding>()\n for (const b of args.bindings) {\n bindingByServiceId.set(b.serviceId, b)\n }\n\n const missing: string[] = []\n for (const serviceId of args.requiredServiceIds) {\n const binding = bindingByServiceId.get(serviceId)\n const implId = binding?.implId\n if (!implId || implId !== args.expectedImplId) {\n missing.push(serviceId)\n }\n }\n\n return missing\n}\n\nexport const evaluateFullCutoverGate = (args: {\n readonly mode: FullCutoverGateMode\n readonly requestedKernelId: KernelId\n readonly runtimeServicesEvidence: RuntimeServicesEvidence\n readonly coverageMatrix?: CutoverCoverageMatrix\n readonly diagnosticsLevel?: 'off' | 'light' | 'full' | 'sampled'\n}): FullCutoverGateResult => {\n const expectedImplId = expectedImplIdForKernel(args.requestedKernelId)\n const matrix = args.coverageMatrix ?? CutoverCoverageMatrix\n\n const fallbackServiceIds = parseFallbackServiceIds(args.runtimeServicesEvidence.overridesApplied)\n const missingServiceIds = collectMissingServiceIds({\n expectedImplId,\n requiredServiceIds: matrix.requiredServiceIds,\n bindings: args.runtimeServicesEvidence.bindings,\n })\n\n const fullyActivated = missingServiceIds.length === 0 && fallbackServiceIds.length === 0\n\n const verdict: FullCutoverGateVerdict = args.mode === 'fullCutover' ? (fullyActivated ? 'PASS' : 'FAIL') : 'PASS'\n\n const moduleIdRaw = args.runtimeServicesEvidence.moduleId\n const moduleId = typeof moduleIdRaw === 'string' && moduleIdRaw.length > 0 ? moduleIdRaw : 'unknown'\n\n const anchor: FullCutoverGateAnchor = {\n moduleId,\n instanceId: args.runtimeServicesEvidence.instanceId,\n txnSeq: 0,\n }\n\n const level = args.diagnosticsLevel ?? 'off'\n\n return {\n version: 'v1',\n mode: args.mode,\n requestedKernelId: args.requestedKernelId,\n verdict,\n fullyActivated,\n missingServiceIds,\n fallbackServiceIds,\n anchor,\n ...(level === 'off'\n ? {}\n : {\n details: {\n expectedImplId,\n bindings: args.runtimeServicesEvidence.bindings,\n overridesApplied: args.runtimeServicesEvidence.overridesApplied,\n },\n }),\n }\n}\n","import { Context, Effect } from 'effect'\n\nexport interface RuntimeServiceBuiltins {\n /**\n * Returns the make Effect of a builtin implementation (provided by ModuleRuntime during assembly, avoiding external code\n * capturing internal closures/state).\n * - For kernel implementors only (e.g. core-ng) to implement behavior-equivalent replacements or thin wrappers.\n * - Not an app-facing contract; must not be depended on from business Flow/Logic.\n */\n readonly getBuiltinMake: (serviceId: string) => Effect.Effect<unknown, never, any>\n}\n\nexport class RuntimeServiceBuiltinsTag extends Context.Tag('@logixjs/core/RuntimeServiceBuiltins')<\n RuntimeServiceBuiltinsTag,\n RuntimeServiceBuiltins\n>() {}\n"],"mappings":";AAQO,IAAM,wBAAwB;AAAA,EACnC,SAAS;AAAA,EACT,oBAAoB,CAAC,YAAY,mBAAmB,eAAe,UAAU;AAC/E;AA2CA,IAAM,0BAA0B,CAAC,aAAgC,aAAa,SAAS,YAAY;AAEnG,IAAM,0BAA0B,CAAC,qBAAmE;AAClG,QAAM,MAAM,oBAAI,IAAY;AAC5B,aAAW,SAAS,kBAAkB;AACpC,QAAI,CAAC,MAAM,SAAS,YAAY,EAAG;AACnC,UAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,QAAI,QAAQ,EAAG;AACf,UAAM,KAAK,MAAM,QAAQ,KAAK,QAAQ,CAAC;AACvC,QAAI,KAAK,EAAG;AACZ,UAAM,YAAY,MAAM,MAAM,QAAQ,GAAG,EAAE;AAC3C,QAAI,UAAU,SAAS,EAAG,KAAI,IAAI,SAAS;AAAA,EAC7C;AACA,SAAO,MAAM,KAAK,GAAG,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAC1D;AAEA,IAAM,2BAA2B,CAAC,SAIL;AAC3B,QAAM,qBAAqB,oBAAI,IAAmC;AAClE,aAAW,KAAK,KAAK,UAAU;AAC7B,uBAAmB,IAAI,EAAE,WAAW,CAAC;AAAA,EACvC;AAEA,QAAM,UAAoB,CAAC;AAC3B,aAAW,aAAa,KAAK,oBAAoB;AAC/C,UAAM,UAAU,mBAAmB,IAAI,SAAS;AAChD,UAAM,SAAS,SAAS;AACxB,QAAI,CAAC,UAAU,WAAW,KAAK,gBAAgB;AAC7C,cAAQ,KAAK,SAAS;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,0BAA0B,CAAC,SAMX;AAC3B,QAAM,iBAAiB,wBAAwB,KAAK,iBAAiB;AACrE,QAAM,SAAS,KAAK,kBAAkB;AAEtC,QAAM,qBAAqB,wBAAwB,KAAK,wBAAwB,gBAAgB;AAChG,QAAM,oBAAoB,yBAAyB;AAAA,IACjD;AAAA,IACA,oBAAoB,OAAO;AAAA,IAC3B,UAAU,KAAK,wBAAwB;AAAA,EACzC,CAAC;AAED,QAAM,iBAAiB,kBAAkB,WAAW,KAAK,mBAAmB,WAAW;AAEvF,QAAM,UAAkC,KAAK,SAAS,gBAAiB,iBAAiB,SAAS,SAAU;AAE3G,QAAM,cAAc,KAAK,wBAAwB;AACjD,QAAM,WAAW,OAAO,gBAAgB,YAAY,YAAY,SAAS,IAAI,cAAc;AAE3F,QAAM,SAAgC;AAAA,IACpC;AAAA,IACA,YAAY,KAAK,wBAAwB;AAAA,IACzC,QAAQ;AAAA,EACV;AAEA,QAAM,QAAQ,KAAK,oBAAoB;AAEvC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,KAAK;AAAA,IACX,mBAAmB,KAAK;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,UAAU,QACV,CAAC,IACD;AAAA,MACE,SAAS;AAAA,QACP;AAAA,QACA,UAAU,KAAK,wBAAwB;AAAA,QACvC,kBAAkB,KAAK,wBAAwB;AAAA,MACjD;AAAA,IACF;AAAA,EACN;AACF;;;AC/IA,SAAS,eAAuB;AAYzB,IAAM,4BAAN,cAAwC,QAAQ,IAAI,sCAAsC,EAG/F,EAAE;AAAC;","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-LEU6UA5J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,35 @@
1
+ import {
2
+ registerTrialRunArtifactExporter,
3
+ trialRun,
4
+ trialRunModule
5
+ } from "./chunk-M3WTHJHJ.js";
6
+ import {
7
+ OBSERVABILITY_PROTOCOL_VERSION,
8
+ exportEvidencePackage,
9
+ importEvidencePackage
10
+ } from "./chunk-M7IYCTJV.js";
11
+ import {
12
+ __export
13
+ } from "./chunk-PZ5AY32C.js";
14
+
15
+ // src/Observability.ts
16
+ var Observability_exports = {};
17
+ __export(Observability_exports, {
18
+ exportEvidencePackage: () => exportEvidencePackage2,
19
+ importEvidencePackage: () => importEvidencePackage2,
20
+ protocolVersion: () => protocolVersion,
21
+ registerTrialRunArtifactExporter: () => registerTrialRunArtifactExporter,
22
+ trialRun: () => trialRun,
23
+ trialRunModule: () => trialRunModule
24
+ });
25
+ var protocolVersion = OBSERVABILITY_PROTOCOL_VERSION;
26
+ var exportEvidencePackage2 = exportEvidencePackage;
27
+ var importEvidencePackage2 = importEvidencePackage;
28
+
29
+ export {
30
+ protocolVersion,
31
+ exportEvidencePackage2 as exportEvidencePackage,
32
+ importEvidencePackage2 as importEvidencePackage,
33
+ Observability_exports
34
+ };
35
+ //# sourceMappingURL=chunk-M2RGJPXX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Observability.ts"],"sourcesContent":["// Observability Protocol (@logixjs/core/Observability).\n\nimport * as Evidence from './internal/observability/evidence.js'\nexport * from './internal/observability/trialRun.js'\n\nexport type { JsonValue } from './internal/observability/jsonValue.js'\nexport type { ArtifactEnvelope, ArtifactKey, TrialRunArtifacts } from './internal/observability/artifacts/model.js'\nexport type {\n TrialRunArtifactExporter,\n TrialRunArtifactInspectionContext,\n} from './internal/observability/artifacts/exporter.js'\nexport { registerTrialRunArtifactExporter } from './internal/observability/artifacts/registry.js'\n\nexport const protocolVersion = Evidence.OBSERVABILITY_PROTOCOL_VERSION\n\nexport interface ObservationEnvelope extends Evidence.ObservationEnvelope {}\nexport interface EvidencePackageSource extends Evidence.EvidencePackageSource {}\nexport interface EvidencePackage extends Evidence.EvidencePackage {}\n\nexport const exportEvidencePackage = Evidence.exportEvidencePackage\nexport const importEvidencePackage = Evidence.importEvidencePackage\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,+BAAAA;AAAA,EAAA,6BAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAaO,IAAM,kBAA2B;AAMjC,IAAMC,yBAAiC;AACvC,IAAMC,yBAAiC;","names":["exportEvidencePackage","importEvidencePackage","exportEvidencePackage","importEvidencePackage"]}
@@ -0,0 +1,13 @@
1
+ // src/internal/runtime/core/ConvergeStaticIrCollector.ts
2
+ import { FiberRef, Layer } from "effect";
3
+ var currentConvergeStaticIrCollectors = FiberRef.unsafeMake([]);
4
+ var appendConvergeStaticIrCollectors = (collectors) => Layer.fiberRefLocallyScopedWith(currentConvergeStaticIrCollectors, (current) => [
5
+ ...current,
6
+ ...collectors
7
+ ]);
8
+
9
+ export {
10
+ currentConvergeStaticIrCollectors,
11
+ appendConvergeStaticIrCollectors
12
+ };
13
+ //# sourceMappingURL=chunk-M3BFQ7HK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/runtime/core/ConvergeStaticIrCollector.ts"],"sourcesContent":["import { FiberRef, Layer } from 'effect'\nimport type { ConvergeStaticIrExport } from '../../state-trait/converge-ir.js'\n\n/**\n * ConvergeStaticIrCollector:\n * - Consumer interface for collecting ConvergeStaticIrExport (de-duplicated/indexed by staticIrDigest); an internal injectable capability.\n * - Typical implementations: DevtoolsHub (process-level) / EvidenceCollector (RunSession-level).\n *\n * Notes:\n * - Uses FiberRef<ReadonlyArray<...>> to allow appending multiple collectors within the same scope (similar to Debug sinks).\n * - ModuleRuntime reads the FiberRef value during installation and captures it in a closure, avoiding Env lookup on hot paths.\n */\nexport interface ConvergeStaticIrCollector {\n readonly register: (ir: ConvergeStaticIrExport) => void\n}\n\nexport const currentConvergeStaticIrCollectors = FiberRef.unsafeMake<ReadonlyArray<ConvergeStaticIrCollector>>([])\n\nexport const appendConvergeStaticIrCollectors = (\n collectors: ReadonlyArray<ConvergeStaticIrCollector>,\n): Layer.Layer<any, never, never> =>\n Layer.fiberRefLocallyScopedWith(currentConvergeStaticIrCollectors, (current) => [\n ...current,\n ...collectors,\n ]) as Layer.Layer<any, never, never>\n"],"mappings":";AAAA,SAAS,UAAU,aAAa;AAgBzB,IAAM,oCAAoC,SAAS,WAAqD,CAAC,CAAC;AAE1G,IAAM,mCAAmC,CAC9C,eAEA,MAAM,0BAA0B,mCAAmC,CAAC,YAAY;AAAA,EAC9E,GAAG;AAAA,EACH,GAAG;AACL,CAAC;","names":[]}