@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.
- package/dist/Action-BkRHy2vg.d.cts +10 -0
- package/dist/Action-mqVvtEHt.d.ts +10 -0
- package/dist/Action.cjs +57 -0
- package/dist/Action.cjs.map +1 -0
- package/dist/Action.d.cts +2 -0
- package/dist/Action.d.ts +2 -0
- package/dist/Action.js +9 -0
- package/dist/Action.js.map +1 -0
- package/dist/Actions-AsQ07yTP.d.cts +22 -0
- package/dist/Actions-AsQ07yTP.d.ts +22 -0
- package/dist/Actions.cjs +19 -0
- package/dist/Actions.cjs.map +1 -0
- package/dist/Actions.d.cts +2 -0
- package/dist/Actions.d.ts +2 -0
- package/dist/Actions.js +2 -0
- package/dist/Actions.js.map +1 -0
- package/dist/Bound-BN1DQ_lM.d.ts +23 -0
- package/dist/Bound-BPIfH9SS.d.cts +23 -0
- package/dist/Bound.cjs +1532 -0
- package/dist/Bound.cjs.map +1 -0
- package/dist/Bound.d.cts +7 -0
- package/dist/Bound.d.ts +7 -0
- package/dist/Bound.js +25 -0
- package/dist/Bound.js.map +1 -0
- package/dist/Debug-B5q5Bkzx.d.ts +320 -0
- package/dist/Debug-Bq8Sqjcr.d.cts +320 -0
- package/dist/Debug.cjs +1821 -0
- package/dist/Debug.cjs.map +1 -0
- package/dist/Debug.d.cts +13 -0
- package/dist/Debug.d.ts +13 -0
- package/dist/Debug.js +76 -0
- package/dist/Debug.js.map +1 -0
- package/dist/EffectOp.cjs +169 -0
- package/dist/EffectOp.cjs.map +1 -0
- package/dist/EffectOp.d.cts +118 -0
- package/dist/EffectOp.d.ts +118 -0
- package/dist/EffectOp.js +28 -0
- package/dist/EffectOp.js.map +1 -0
- package/dist/Env-DuJ6JrU2.d.cts +10 -0
- package/dist/Env-DuJ6JrU2.d.ts +10 -0
- package/dist/Env.cjs +60 -0
- package/dist/Env.cjs.map +1 -0
- package/dist/Env.d.cts +1 -0
- package/dist/Env.d.ts +1 -0
- package/dist/Env.js +11 -0
- package/dist/Env.js.map +1 -0
- package/dist/Flow-1fZT8MpX.d.cts +152 -0
- package/dist/Flow-BhpjE22E.d.ts +152 -0
- package/dist/Flow.cjs +504 -0
- package/dist/Flow.cjs.map +1 -0
- package/dist/Flow.d.cts +8 -0
- package/dist/Flow.d.ts +8 -0
- package/dist/Flow.js +15 -0
- package/dist/Flow.js.map +1 -0
- package/dist/Handle-D8D1zPb_.d.cts +30 -0
- package/dist/Handle-D_cLW1Z3.d.ts +30 -0
- package/dist/Handle.cjs +42 -0
- package/dist/Handle.cjs.map +1 -0
- package/dist/Handle.d.cts +7 -0
- package/dist/Handle.d.ts +7 -0
- package/dist/Handle.js +10 -0
- package/dist/Handle.js.map +1 -0
- package/dist/Kernel-8kC-jOda.d.cts +171 -0
- package/dist/Kernel-CnGE1Fyk.d.ts +171 -0
- package/dist/Kernel.cjs +284 -0
- package/dist/Kernel.cjs.map +1 -0
- package/dist/Kernel.d.cts +14 -0
- package/dist/Kernel.d.ts +14 -0
- package/dist/Kernel.js +36 -0
- package/dist/Kernel.js.map +1 -0
- package/dist/Link-Db7975nU.d.ts +45 -0
- package/dist/Link-fX8x1eCK.d.cts +45 -0
- package/dist/Link.cjs +542 -0
- package/dist/Link.cjs.map +1 -0
- package/dist/Link.d.cts +7 -0
- package/dist/Link.d.ts +7 -0
- package/dist/Link.js +35 -0
- package/dist/Link.js.map +1 -0
- package/dist/Logic-BRjEMr-W.d.ts +38 -0
- package/dist/Logic-DRh4sDZj.d.cts +38 -0
- package/dist/Logic.cjs +37 -0
- package/dist/Logic.cjs.map +1 -0
- package/dist/Logic.d.cts +7 -0
- package/dist/Logic.d.ts +7 -0
- package/dist/Logic.js +10 -0
- package/dist/Logic.js.map +1 -0
- package/dist/MatchBuilder-0QOc-nlU.d.ts +14 -0
- package/dist/MatchBuilder-CJk5oCkR.d.cts +14 -0
- package/dist/MatchBuilder.cjs +85 -0
- package/dist/MatchBuilder.cjs.map +1 -0
- package/dist/MatchBuilder.d.cts +8 -0
- package/dist/MatchBuilder.d.ts +8 -0
- package/dist/MatchBuilder.js +11 -0
- package/dist/MatchBuilder.js.map +1 -0
- package/dist/Middleware.cjs +411 -0
- package/dist/Middleware.cjs.map +1 -0
- package/dist/Middleware.d.cts +88 -0
- package/dist/Middleware.d.ts +88 -0
- package/dist/Middleware.js +27 -0
- package/dist/Middleware.js.map +1 -0
- package/dist/Module-B_0xRDMR.d.cts +203 -0
- package/dist/Module-DnzluX2J.d.ts +203 -0
- package/dist/Module.cjs +13512 -0
- package/dist/Module.cjs.map +1 -0
- package/dist/Module.d.cts +8 -0
- package/dist/Module.d.ts +8 -0
- package/dist/Module.js +53 -0
- package/dist/Module.js.map +1 -0
- package/dist/ModuleTag-C8FHY_sY.d.ts +93 -0
- package/dist/ModuleTag-EGbgBMpZ.d.cts +93 -0
- package/dist/ModuleTag.cjs +12231 -0
- package/dist/ModuleTag.cjs.map +1 -0
- package/dist/ModuleTag.d.cts +8 -0
- package/dist/ModuleTag.d.ts +8 -0
- package/dist/ModuleTag.js +39 -0
- package/dist/ModuleTag.js.map +1 -0
- package/dist/Observability-COqEvp2C.d.cts +713 -0
- package/dist/Observability-cY4kLn0S.d.ts +713 -0
- package/dist/Observability.cjs +5865 -0
- package/dist/Observability.cjs.map +1 -0
- package/dist/Observability.d.cts +9 -0
- package/dist/Observability.d.ts +9 -0
- package/dist/Observability.js +41 -0
- package/dist/Observability.js.map +1 -0
- package/dist/Platform-C49Pv956.d.cts +21 -0
- package/dist/Platform-C49Pv956.d.ts +21 -0
- package/dist/Platform-CHX8o-U4.d.ts +51 -0
- package/dist/Platform-CVlv0xLQ.d.cts +51 -0
- package/dist/Platform.cjs +58 -0
- package/dist/Platform.cjs.map +1 -0
- package/dist/Platform.d.cts +4 -0
- package/dist/Platform.d.ts +4 -0
- package/dist/Platform.js +15 -0
- package/dist/Platform.js.map +1 -0
- package/dist/Process-CM9xbMdP.d.ts +92 -0
- package/dist/Process-mL8fHDSB.d.cts +92 -0
- package/dist/Process.cjs +575 -0
- package/dist/Process.cjs.map +1 -0
- package/dist/Process.d.cts +8 -0
- package/dist/Process.d.ts +8 -0
- package/dist/Process.js +42 -0
- package/dist/Process.js.map +1 -0
- package/dist/ReadQuery-BlMwhe-F.d.ts +30 -0
- package/dist/ReadQuery-CL5XlXts.d.cts +30 -0
- package/dist/ReadQuery-SinbStGF.d.cts +38 -0
- package/dist/ReadQuery-SinbStGF.d.ts +38 -0
- package/dist/ReadQuery.cjs +377 -0
- package/dist/ReadQuery.cjs.map +1 -0
- package/dist/ReadQuery.d.cts +2 -0
- package/dist/ReadQuery.d.ts +2 -0
- package/dist/ReadQuery.js +14 -0
- package/dist/ReadQuery.js.map +1 -0
- package/dist/Reflection-CQnKwPXj.d.ts +182 -0
- package/dist/Reflection-Kabo1mlU.d.cts +182 -0
- package/dist/Reflection.cjs +2954 -0
- package/dist/Reflection.cjs.map +1 -0
- package/dist/Reflection.d.cts +17 -0
- package/dist/Reflection.d.ts +17 -0
- package/dist/Reflection.js +40 -0
- package/dist/Reflection.js.map +1 -0
- package/dist/Resource-Dy1xD_DG.d.cts +75 -0
- package/dist/Resource-Dy1xD_DG.d.ts +75 -0
- package/dist/Resource.cjs +166 -0
- package/dist/Resource.cjs.map +1 -0
- package/dist/Resource.d.cts +3 -0
- package/dist/Resource.d.ts +3 -0
- package/dist/Resource.js +21 -0
- package/dist/Resource.js.map +1 -0
- package/dist/Root-7ADUMk4t.d.cts +29 -0
- package/dist/Root-7ADUMk4t.d.ts +29 -0
- package/dist/Root.cjs +125 -0
- package/dist/Root.cjs.map +1 -0
- package/dist/Root.d.cts +4 -0
- package/dist/Root.d.ts +4 -0
- package/dist/Root.js +12 -0
- package/dist/Root.js.map +1 -0
- package/dist/Runtime-B-aL-f29.d.cts +274 -0
- package/dist/Runtime-CtyzZG4i.d.ts +274 -0
- package/dist/Runtime.cjs +5740 -0
- package/dist/Runtime.cjs.map +1 -0
- package/dist/Runtime.d.cts +19 -0
- package/dist/Runtime.d.ts +19 -0
- package/dist/Runtime.js +62 -0
- package/dist/Runtime.js.map +1 -0
- package/dist/ScopeRegistry-D1owDNSm.d.cts +61 -0
- package/dist/ScopeRegistry-D1owDNSm.d.ts +61 -0
- package/dist/ScopeRegistry.cjs +152 -0
- package/dist/ScopeRegistry.cjs.map +1 -0
- package/dist/ScopeRegistry.d.cts +2 -0
- package/dist/ScopeRegistry.d.ts +2 -0
- package/dist/ScopeRegistry.js +16 -0
- package/dist/ScopeRegistry.js.map +1 -0
- package/dist/State-CU50R26M.d.cts +19 -0
- package/dist/State-CU50R26M.d.ts +19 -0
- package/dist/State.cjs +19 -0
- package/dist/State.cjs.map +1 -0
- package/dist/State.d.cts +2 -0
- package/dist/State.d.ts +2 -0
- package/dist/State.js +2 -0
- package/dist/State.js.map +1 -0
- package/dist/StateTrait-BGsZghTz.d.ts +122 -0
- package/dist/StateTrait-OWhbj12c.d.cts +122 -0
- package/dist/StateTrait.cjs +2737 -0
- package/dist/StateTrait.cjs.map +1 -0
- package/dist/StateTrait.d.cts +9 -0
- package/dist/StateTrait.d.ts +9 -0
- package/dist/StateTrait.js +39 -0
- package/dist/StateTrait.js.map +1 -0
- package/dist/TraitLifecycle-CwV5WPFX.d.cts +88 -0
- package/dist/TraitLifecycle-LdIWmKlg.d.ts +88 -0
- package/dist/TraitLifecycle.cjs +581 -0
- package/dist/TraitLifecycle.cjs.map +1 -0
- package/dist/TraitLifecycle.d.cts +8 -0
- package/dist/TraitLifecycle.d.ts +8 -0
- package/dist/TraitLifecycle.js +24 -0
- package/dist/TraitLifecycle.js.map +1 -0
- package/dist/action-DiMDD_0v.d.cts +35 -0
- package/dist/action-DiMDD_0v.d.ts +35 -0
- package/dist/chunk-24VULZ7A.js +76 -0
- package/dist/chunk-24VULZ7A.js.map +1 -0
- package/dist/chunk-3IYZ5IGG.js +17 -0
- package/dist/chunk-3IYZ5IGG.js.map +1 -0
- package/dist/chunk-3QMIVH35.js +43 -0
- package/dist/chunk-3QMIVH35.js.map +1 -0
- package/dist/chunk-3RMKLXHX.js +83 -0
- package/dist/chunk-3RMKLXHX.js.map +1 -0
- package/dist/chunk-3TMODYZV.js +111 -0
- package/dist/chunk-3TMODYZV.js.map +1 -0
- package/dist/chunk-3VG5TWQR.js +27 -0
- package/dist/chunk-3VG5TWQR.js.map +1 -0
- package/dist/chunk-4CQAV7YB.js +37 -0
- package/dist/chunk-4CQAV7YB.js.map +1 -0
- package/dist/chunk-4SO6JMZL.js +7 -0
- package/dist/chunk-4SO6JMZL.js.map +1 -0
- package/dist/chunk-66ALHVEX.js +40 -0
- package/dist/chunk-66ALHVEX.js.map +1 -0
- package/dist/chunk-76WT3HOR.js +397 -0
- package/dist/chunk-76WT3HOR.js.map +1 -0
- package/dist/chunk-ANLBCBDC.js +285 -0
- package/dist/chunk-ANLBCBDC.js.map +1 -0
- package/dist/chunk-AUIR5O6W.js +75 -0
- package/dist/chunk-AUIR5O6W.js.map +1 -0
- package/dist/chunk-BABLDP24.js +445 -0
- package/dist/chunk-BABLDP24.js.map +1 -0
- package/dist/chunk-BE3HW4FY.js +1099 -0
- package/dist/chunk-BE3HW4FY.js.map +1 -0
- package/dist/chunk-BZ2SHDN2.js +54 -0
- package/dist/chunk-BZ2SHDN2.js.map +1 -0
- package/dist/chunk-CW6T36TN.js +393 -0
- package/dist/chunk-CW6T36TN.js.map +1 -0
- package/dist/chunk-DFNM3WX2.js +632 -0
- package/dist/chunk-DFNM3WX2.js.map +1 -0
- package/dist/chunk-DMBALCE2.js +1034 -0
- package/dist/chunk-DMBALCE2.js.map +1 -0
- package/dist/chunk-EGK3KN7B.js +406 -0
- package/dist/chunk-EGK3KN7B.js.map +1 -0
- package/dist/chunk-EY4NZKDR.js +19 -0
- package/dist/chunk-EY4NZKDR.js.map +1 -0
- package/dist/chunk-G5ZBFPNU.js +23 -0
- package/dist/chunk-G5ZBFPNU.js.map +1 -0
- package/dist/chunk-GMPEOUP2.js +31 -0
- package/dist/chunk-GMPEOUP2.js.map +1 -0
- package/dist/chunk-IHVBV5C2.js +279 -0
- package/dist/chunk-IHVBV5C2.js.map +1 -0
- package/dist/chunk-IPF7E66P.js +23 -0
- package/dist/chunk-IPF7E66P.js.map +1 -0
- package/dist/chunk-JCXGZRMU.js +204 -0
- package/dist/chunk-JCXGZRMU.js.map +1 -0
- package/dist/chunk-JGIWG6SR.js +6359 -0
- package/dist/chunk-JGIWG6SR.js.map +1 -0
- package/dist/chunk-JWOYLO27.js +241 -0
- package/dist/chunk-JWOYLO27.js.map +1 -0
- package/dist/chunk-KIXAU3GM.js +137 -0
- package/dist/chunk-KIXAU3GM.js.map +1 -0
- package/dist/chunk-KL5ACTCT.js +8 -0
- package/dist/chunk-KL5ACTCT.js.map +1 -0
- package/dist/chunk-KP7MUZNX.js +83 -0
- package/dist/chunk-KP7MUZNX.js.map +1 -0
- package/dist/chunk-LEU6UA5J.js +1 -0
- package/dist/chunk-LEU6UA5J.js.map +1 -0
- package/dist/chunk-M2RGJPXX.js +35 -0
- package/dist/chunk-M2RGJPXX.js.map +1 -0
- package/dist/chunk-M3BFQ7HK.js +13 -0
- package/dist/chunk-M3BFQ7HK.js.map +1 -0
- package/dist/chunk-M3WTHJHJ.js +1051 -0
- package/dist/chunk-M3WTHJHJ.js.map +1 -0
- package/dist/chunk-M7IYCTJV.js +79 -0
- package/dist/chunk-M7IYCTJV.js.map +1 -0
- package/dist/chunk-NBD3KUOZ.js +838 -0
- package/dist/chunk-NBD3KUOZ.js.map +1 -0
- package/dist/chunk-NQZ2OSGR.js +151 -0
- package/dist/chunk-NQZ2OSGR.js.map +1 -0
- package/dist/chunk-NZJKFF45.js +106 -0
- package/dist/chunk-NZJKFF45.js.map +1 -0
- package/dist/chunk-OFADUJWJ.js +175 -0
- package/dist/chunk-OFADUJWJ.js.map +1 -0
- package/dist/chunk-OGWBVHB3.js +461 -0
- package/dist/chunk-OGWBVHB3.js.map +1 -0
- package/dist/chunk-PAYXCY6A.js +1696 -0
- package/dist/chunk-PAYXCY6A.js.map +1 -0
- package/dist/chunk-PYOE4VSI.js +1924 -0
- package/dist/chunk-PYOE4VSI.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-QCHIQWAJ.js +21 -0
- package/dist/chunk-QCHIQWAJ.js.map +1 -0
- package/dist/chunk-QMM6O4CD.js +71 -0
- package/dist/chunk-QMM6O4CD.js.map +1 -0
- package/dist/chunk-RNFE3ML2.js +22 -0
- package/dist/chunk-RNFE3ML2.js.map +1 -0
- package/dist/chunk-TAAPQVZN.js +23 -0
- package/dist/chunk-TAAPQVZN.js.map +1 -0
- package/dist/chunk-THATMZXD.js +21 -0
- package/dist/chunk-THATMZXD.js.map +1 -0
- package/dist/chunk-TKZ7MEIA.js +27 -0
- package/dist/chunk-TKZ7MEIA.js.map +1 -0
- package/dist/chunk-TQOBJYDP.js +7 -0
- package/dist/chunk-TQOBJYDP.js.map +1 -0
- package/dist/chunk-VZB726PE.js +93 -0
- package/dist/chunk-VZB726PE.js.map +1 -0
- package/dist/chunk-W3TEWHLO.js +568 -0
- package/dist/chunk-W3TEWHLO.js.map +1 -0
- package/dist/chunk-YS3AZQ2G.js +52 -0
- package/dist/chunk-YS3AZQ2G.js.map +1 -0
- package/dist/chunk-ZDTRWK5F.js +40 -0
- package/dist/chunk-ZDTRWK5F.js.map +1 -0
- package/dist/chunk-ZFLHVFUC.js +192 -0
- package/dist/chunk-ZFLHVFUC.js.map +1 -0
- package/dist/chunk-ZFY7U2FR.js +133 -0
- package/dist/chunk-ZFY7U2FR.js.map +1 -0
- package/dist/chunk-ZGDVUPTM.js +270 -0
- package/dist/chunk-ZGDVUPTM.js.map +1 -0
- package/dist/index.cjs +19700 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +195 -0
- package/dist/index.d.ts +195 -0
- package/dist/index.js +286 -0
- package/dist/index.js.map +1 -0
- package/dist/ir-BMP7yxJJ.d.cts +39 -0
- package/dist/ir-DUOz6H-5.d.ts +39 -0
- package/dist/module-B8CBqIZ_.d.cts +1191 -0
- package/dist/module-k7m3txak.d.ts +1191 -0
- package/dist/protocol-g_1897M2.d.cts +127 -0
- package/dist/protocol-g_1897M2.d.ts +127 -0
- package/package.json +162 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Bound.ts","../src/internal/runtime/core/BoundApiRuntime.ts","../src/internal/action.ts","../src/internal/runtime/core/TaskRunner.ts","../src/internal/runtime/core/DebugSink.ts","../src/internal/observability/jsonValue.ts","../src/internal/runtime/core/errorSummary.ts","../src/internal/runtime/core/EffectOpCore.ts","../src/internal/runtime/core/env.ts","../src/internal/runtime/core/mutativePatches.ts","../src/internal/field-path.ts","../src/internal/runtime/core/FlowRuntime.ts","../src/internal/effect-op.ts","../src/internal/observability/runSession.ts","../src/internal/runtime/core/ReadQuery.ts","../src/internal/runtime/core/MatchBuilder.ts","../src/internal/runtime/core/Platform.ts","../src/internal/runtime/core/Lifecycle.ts","../src/internal/runtime/core/LogicDiagnostics.ts","../src/internal/root.ts","../src/internal/runtime/core/RootContext.ts","../src/internal/runtime/core/runtimeInternalsAccessor.ts"],"sourcesContent":["import type * as Logix from './internal/module.js'\nimport * as BoundApiRuntime from './internal/runtime/BoundApiRuntime.js'\n\n// ---------------------------------------------------------------------------\n// BoundApi: pre-bound accessors for a module shape + environment.\n// ---------------------------------------------------------------------------\n\n/**\n * Bound API factory: creates pre-bound accessors for a module shape + environment.\n *\n * - By default, resolves the current Logix.ModuleRuntime from `Logic.RuntimeTag`.\n * - Optionally accepts a `Logix.ModuleTag<Sh>` to explicitly choose the runtime (e.g. cross-module collaboration).\n *\n * Note: this is a type-only surface; the concrete implementation is injected by the runtime.\n * In this PoC, the runtime provides a placeholder value at compile-time boundaries.\n */\nexport type BoundApi<Sh extends Logix.AnyModuleShape, R = never> = Logix.BoundApi<Sh, R>\nexport type BoundApiPublic<Sh extends Logix.AnyModuleShape, R = never> = Logix.BoundApi<Sh, R>\n\nexport function make<Sh extends Logix.AnyModuleShape, R = never>(\n shape: Sh,\n runtime: Logix.ModuleRuntime<Logix.StateOf<Sh>, Logix.ActionOf<Sh>>,\n): BoundApiPublic<Sh, R> {\n return BoundApiRuntime.make(shape, runtime) as BoundApiPublic<Sh, R>\n}\n","import { Context, Effect, FiberRef, Option, Schema, Stream, SubscriptionRef } from 'effect'\nimport { create } from 'mutative'\nimport type * as Logix from './module.js'\nimport * as Logic from './LogicMiddleware.js'\nimport * as Action from '../../action.js'\nimport * as TaskRunner from './TaskRunner.js'\nimport { mutateWithPatchPaths } from './mutativePatches.js'\nimport * as FlowRuntime from './FlowRuntime.js'\nimport * as MatchBuilder from './MatchBuilder.js'\nimport * as Platform from './Platform.js'\nimport * as Lifecycle from './Lifecycle.js'\nimport * as Debug from './DebugSink.js'\nimport * as LogicDiagnostics from './LogicDiagnostics.js'\nimport { isDevEnv } from './env.js'\nimport { RunSessionTag } from '../../observability/runSession.js'\nimport * as Root from '../../root.js'\nimport type { RuntimeInternals } from './RuntimeInternals.js'\nimport type * as ModuleTraits from './ModuleTraits.js'\nimport { getRuntimeInternals, setBoundInternals } from './runtimeInternalsAccessor.js'\nimport type { AnyModuleShape, ModuleRuntime, StateOf, ActionOf } from './module.js'\n\n// Local IntentBuilder factory; equivalent to the old internal/dsl/LogicBuilder.makeIntentBuilderFactory.\nconst LogicBuilderFactory = <Sh extends AnyModuleShape, R = never>(\n runtime: ModuleRuntime<StateOf<Sh>, ActionOf<Sh>>,\n runtimeInternals: RuntimeInternals,\n) => {\n const flowApi = FlowRuntime.make<Sh, R>(runtime, runtimeInternals)\n\n return <T>(stream: Stream.Stream<T>, triggerName?: string): Logic.IntentBuilder<T, Sh, R> => {\n const runWithStateTransaction: TaskRunner.TaskRunnerRuntime['runWithStateTransaction'] = (origin, body) =>\n runtimeInternals.txn.runWithStateTransaction(origin as any, body)\n\n const taskRunnerRuntime: TaskRunner.TaskRunnerRuntime = {\n moduleId: runtime.moduleId,\n instanceId: runtimeInternals.instanceId,\n runWithStateTransaction,\n resolveConcurrencyPolicy: runtimeInternals.concurrency.resolveConcurrencyPolicy,\n }\n\n const builder = {\n debounce: (ms: number) =>\n LogicBuilderFactory<Sh, R>(runtime, runtimeInternals)(flowApi.debounce<T>(ms)(stream), triggerName),\n throttle: (ms: number) =>\n LogicBuilderFactory<Sh, R>(runtime, runtimeInternals)(flowApi.throttle<T>(ms)(stream), triggerName),\n filter: (predicate: (value: T) => boolean) =>\n LogicBuilderFactory<Sh, R>(runtime, runtimeInternals)(flowApi.filter(predicate)(stream), triggerName),\n map: <U>(f: (value: T) => U) =>\n LogicBuilderFactory<Sh, R>(runtime, runtimeInternals)(stream.pipe(Stream.map(f)), triggerName),\n run<A = void, E = never, R2 = unknown>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((p: T) => Logic.Of<Sh, R & R2, A, E>),\n options?: Logic.OperationOptions,\n ): Logic.Of<Sh, R & R2, void, E> {\n return flowApi.run<T, A, E, R2>(eff, options)(stream)\n },\n runLatest<A = void, E = never, R2 = unknown>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((p: T) => Logic.Of<Sh, R & R2, A, E>),\n options?: Logic.OperationOptions,\n ): Logic.Of<Sh, R & R2, void, E> {\n return flowApi.runLatest<T, A, E, R2>(eff, options)(stream)\n },\n runExhaust<A = void, E = never, R2 = unknown>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((p: T) => Logic.Of<Sh, R & R2, A, E>),\n options?: Logic.OperationOptions,\n ): Logic.Of<Sh, R & R2, void, E> {\n return flowApi.runExhaust<T, A, E, R2>(eff, options)(stream)\n },\n runParallel<A = void, E = never, R2 = unknown>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((p: T) => Logic.Of<Sh, R & R2, A, E>),\n options?: Logic.OperationOptions,\n ): Logic.Of<Sh, R & R2, void, E> {\n return flowApi.runParallel<T, A, E, R2>(eff, options)(stream)\n },\n runFork: <A = void, E = never, R2 = unknown>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((p: T) => Logic.Of<Sh, R & R2, A, E>),\n ): Logic.Of<Sh, R & R2, void, E> =>\n Effect.forkScoped(flowApi.run<T, A, E, R2>(eff)(stream)).pipe(Effect.asVoid) as Logic.Of<Sh, R & R2, void, E>,\n runParallelFork: <A = void, E = never, R2 = unknown>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((p: T) => Logic.Of<Sh, R & R2, A, E>),\n ): Logic.Of<Sh, R & R2, void, E> =>\n Effect.forkScoped(flowApi.runParallel<T, A, E, R2>(eff)(stream)).pipe(Effect.asVoid) as Logic.Of<\n Sh,\n R & R2,\n void,\n E\n >,\n runTask: <A = void, E = never, R2 = unknown>(\n config: TaskRunner.TaskRunnerConfig<T, Sh, R & R2, A, E>,\n ): Logic.Of<Sh, R & R2, void, never> =>\n TaskRunner.makeTaskRunner<T, Sh, R & R2, A, E>(stream, 'task', taskRunnerRuntime, {\n ...config,\n triggerName: config.triggerName ?? triggerName,\n }) as Logic.Of<Sh, R & R2, void, never>,\n runParallelTask: <A = void, E = never, R2 = unknown>(\n config: TaskRunner.TaskRunnerConfig<T, Sh, R & R2, A, E>,\n ): Logic.Of<Sh, R & R2, void, never> =>\n TaskRunner.makeTaskRunner<T, Sh, R & R2, A, E>(stream, 'parallel', taskRunnerRuntime, {\n ...config,\n triggerName: config.triggerName ?? triggerName,\n }) as Logic.Of<Sh, R & R2, void, never>,\n runLatestTask: <A = void, E = never, R2 = unknown>(\n config: TaskRunner.TaskRunnerConfig<T, Sh, R & R2, A, E>,\n ): Logic.Of<Sh, R & R2, void, never> =>\n TaskRunner.makeTaskRunner<T, Sh, R & R2, A, E>(stream, 'latest', taskRunnerRuntime, {\n ...config,\n triggerName: config.triggerName ?? triggerName,\n }) as Logic.Of<Sh, R & R2, void, never>,\n runExhaustTask: <A = void, E = never, R2 = unknown>(\n config: TaskRunner.TaskRunnerConfig<T, Sh, R & R2, A, E>,\n ): Logic.Of<Sh, R & R2, void, never> =>\n TaskRunner.makeTaskRunner<T, Sh, R & R2, A, E>(stream, 'exhaust', taskRunnerRuntime, {\n ...config,\n triggerName: config.triggerName ?? triggerName,\n }) as Logic.Of<Sh, R & R2, void, never>,\n toStream: () => stream,\n update: (\n reducer: (prev: StateOf<Sh>, payload: T) => StateOf<Sh> | Effect.Effect<StateOf<Sh>, any, any>,\n ): Logic.Of<Sh, R, void, never> =>\n Stream.runForEach(stream, (payload) =>\n taskRunnerRuntime.runWithStateTransaction(\n {\n kind: 'watcher:update',\n name: triggerName,\n },\n () =>\n Effect.gen(function* () {\n const prev = (yield* runtime.getState) as StateOf<Sh>\n const next = reducer(prev, payload)\n if (Effect.isEffect(next)) {\n const exit = yield* Effect.exit(next as Effect.Effect<StateOf<Sh>, any, any>)\n if (exit._tag === 'Failure') {\n yield* Effect.logError('Flow error', exit.cause)\n return\n }\n yield* runtime.setState(exit.value as StateOf<Sh>)\n return\n }\n yield* runtime.setState(next as StateOf<Sh>)\n }),\n ),\n ).pipe(Effect.catchAllCause((cause) => Effect.logError('Flow error', cause))) as Logic.Of<Sh, R, void, never>,\n mutate: (reducer: (draft: Logic.Draft<StateOf<Sh>>, payload: T) => void): Logic.Of<Sh, R, void, never> =>\n Stream.runForEach(stream, (payload) =>\n taskRunnerRuntime.runWithStateTransaction(\n {\n kind: 'watcher:mutate',\n name: triggerName,\n },\n () =>\n Effect.gen(function* () {\n const prev = (yield* runtime.getState) as StateOf<Sh>\n const recordPatch = runtimeInternals.txn.recordStatePatch\n const updateDraft = runtimeInternals.txn.updateDraft\n\n const { nextState, patchPaths } = mutateWithPatchPaths(prev as StateOf<Sh>, (draft) => {\n reducer(draft as Logic.Draft<StateOf<Sh>>, payload)\n })\n\n for (const path of patchPaths) {\n recordPatch(path, 'unknown')\n }\n\n updateDraft(nextState)\n }),\n ),\n ).pipe(Effect.catchAllCause((cause) => Effect.logError('Flow error', cause))) as Logic.Of<Sh, R, void, never>,\n } as Omit<Logic.IntentBuilder<T, Sh, R>, 'pipe'>\n\n const pipe: Logic.IntentBuilder<T, Sh, R>['pipe'] = function (this: unknown) {\n // eslint-disable-next-line prefer-rest-params\n const fns = arguments as unknown as ReadonlyArray<\n (self: Logic.IntentBuilder<T, Sh, R>) => Logic.IntentBuilder<T, Sh, R>\n >\n let acc: Logic.IntentBuilder<T, Sh, R> = builder as Logic.IntentBuilder<T, Sh, R>\n for (let i = 0; i < fns.length; i++) {\n acc = fns[i](acc)\n }\n return acc\n }\n\n return Object.assign(builder, { pipe }) as Logic.IntentBuilder<T, Sh, R>\n }\n}\nimport type { BoundApi } from './module.js'\n\n/**\n * BoundApi implementation: creates a pre-bound `$` for a given Store shape + runtime.\n *\n * Note: public types and entrypoint signatures live in api/BoundApi.ts; this file only hosts the implementation.\n */\nexport function make<Sh extends Logix.AnyModuleShape, R = never>(\n shape: Sh,\n runtime: Logix.ModuleRuntime<Logix.StateOf<Sh>, Logix.ActionOf<Sh>>,\n options?: {\n readonly getPhase?: () => 'setup' | 'run'\n readonly phaseService?: LogicDiagnostics.LogicPhaseService\n readonly moduleId?: string\n readonly logicUnit?: LogicDiagnostics.LogicUnitService\n },\n): BoundApi<Sh, R> {\n const runtimeInternals = getRuntimeInternals(runtime as any)\n\n const getPhase = options?.getPhase ?? (() => 'run')\n const getCurrentPhase = (): 'setup' | 'run' => {\n const phaseService = options?.phaseService\n const phase = phaseService?.current ?? getPhase()\n return phase === 'setup' ? 'setup' : 'run'\n }\n const guardRunOnly = (kind: string, api: string) => {\n const phaseService = options?.phaseService\n const phase = phaseService?.current ?? getPhase()\n if (phase === 'setup') {\n throw LogicDiagnostics.makeLogicPhaseError(kind, api, 'setup', options?.moduleId)\n }\n }\n const flowApi = FlowRuntime.make<Sh, R>(runtime, runtimeInternals)\n\n const makeIntentBuilder = (runtime_: Logix.ModuleRuntime<any, any>) =>\n LogicBuilderFactory<Sh, R>(runtime_, runtimeInternals)\n const withLifecycle = <A>(\n available: (manager: Lifecycle.LifecycleManager) => Effect.Effect<A, never, any>,\n missing: () => Effect.Effect<A, never, any>,\n ) =>\n Effect.serviceOption(Lifecycle.LifecycleContext).pipe(\n Effect.flatMap((maybe) =>\n Option.match(maybe, {\n onSome: available,\n onNone: missing,\n }),\n ),\n )\n const withPlatform = (invoke: (platform: Platform.Service) => Effect.Effect<void, never, any>) =>\n Effect.serviceOption(Platform.Tag).pipe(\n Effect.flatMap((maybe) =>\n Option.match(maybe, {\n onSome: invoke,\n onNone: () => Effect.void,\n }),\n ),\n )\n\n const emitSetupOnlyViolation = (api: string): Effect.Effect<void> =>\n Debug.record({\n type: 'diagnostic',\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n code: 'logic::invalid_phase',\n severity: 'error',\n message: `${api} is setup-only and is not allowed in run phase.`,\n hint:\n 'Move $.lifecycle.* calls to the synchronous part of Module.logic builder (before return) for registration; ' +\n 'for dynamic resource cleanup in the run phase, use Effect.acquireRelease / Scope finalizer instead of registering onDestroy late.',\n kind: 'lifecycle_in_run',\n })\n\n const createIntentBuilder = <T>(stream: Stream.Stream<T>, triggerName?: string) =>\n makeIntentBuilder(runtime)(stream, triggerName)\n\n const onceInRunSession = (key: string): Effect.Effect<boolean, never, any> =>\n Effect.serviceOption(RunSessionTag).pipe(\n Effect.map((maybe) => (Option.isSome(maybe) ? maybe.value.local.once(key) : true)),\n )\n\n let cachedDiagnosticsLevel: Debug.DiagnosticsLevel | undefined\n\n const isModuleLike = (\n value: unknown,\n ): value is {\n readonly _kind: 'ModuleDef' | 'Module'\n readonly id: string\n readonly tag: Context.Tag<any, Logix.ModuleRuntime<any, any>>\n readonly schemas?: Record<string, unknown>\n readonly meta?: Record<string, unknown>\n readonly dev?: { readonly source?: { readonly file: string; readonly line: number; readonly column: number } }\n } =>\n Boolean(\n value &&\n typeof value === 'object' &&\n ((value as any)._kind === 'ModuleDef' || (value as any)._kind === 'Module') &&\n 'tag' in (value as object) &&\n Context.isTag((value as any).tag),\n )\n\n const buildModuleHandle = (\n tag: Context.Tag<any, Logix.ModuleRuntime<any, any>>,\n rt: Logix.ModuleRuntime<any, any>,\n ): unknown => {\n const actionsProxy: Logix.ModuleHandle<any>['actions'] = new Proxy(\n {},\n {\n get: (_target, prop) => (payload: unknown) =>\n rt.dispatch({\n _tag: prop as string,\n payload,\n }),\n },\n ) as Logix.ModuleHandle<any>['actions']\n\n const handle: Logix.ModuleHandle<any> = {\n read: (selector) => Effect.map(rt.getState, selector),\n changes: rt.changes,\n dispatch: rt.dispatch,\n actions$: rt.actions$,\n actions: actionsProxy,\n }\n\n const EXTEND_HANDLE = Symbol.for('logix.module.handle.extend')\n const extend = (tag as any)?.[EXTEND_HANDLE] as\n | ((runtime: Logix.ModuleRuntime<any, any>, base: Logix.ModuleHandle<any>) => unknown)\n | undefined\n\n return typeof extend === 'function' ? (extend(rt, handle) ?? handle) : handle\n }\n\n const emitModuleDescriptorOnce = (\n module: {\n readonly id: string\n readonly tag: any\n readonly schemas?: Record<string, unknown>\n readonly meta?: Record<string, unknown>\n readonly dev?: { readonly source?: { readonly file: string; readonly line: number; readonly column: number } }\n },\n rt: Logix.ModuleRuntime<any, any>,\n ): Effect.Effect<void, never, any> =>\n Effect.gen(function* () {\n // Hot-path guard: never emit events when diagnostics are off.\n if (cachedDiagnosticsLevel === 'off') return\n\n const key = `module_descriptor:${String(rt.instanceId ?? 'unknown')}`\n const shouldEmit = yield* onceInRunSession(key)\n if (!shouldEmit) return\n\n const actionKeys = Object.keys((module.tag as any)?.shape?.actionMap ?? {})\n\n const internalSymbol = Symbol.for('logix.module.internal')\n const internal = (module as any)[internalSymbol] as { readonly mounted?: ReadonlyArray<any> } | undefined\n\n const logicUnits = (internal?.mounted ?? []).map((u: any) => ({\n kind: String(u?.kind ?? 'user'),\n id: String(u?.id ?? ''),\n derived: u?.derived ? true : undefined,\n name: typeof u?.name === 'string' ? u.name : undefined,\n }))\n\n const schemaKeys = module.schemas && typeof module.schemas === 'object' ? Object.keys(module.schemas) : undefined\n\n const meta = module.meta && typeof module.meta === 'object' ? module.meta : undefined\n\n const source = module.dev?.source\n\n const traitsSnapshot = runtimeInternals.traits.getModuleTraitsSnapshot()\n const traits = traitsSnapshot\n ? {\n digest: traitsSnapshot.digest,\n count: traitsSnapshot.traits.length,\n }\n : undefined\n\n const data = {\n id: module.id,\n moduleId: String(rt.moduleId),\n instanceId: String(rt.instanceId),\n actionKeys,\n logicUnits,\n schemaKeys,\n meta,\n source,\n traits,\n }\n\n yield* Debug.record({\n type: 'trace:module:descriptor',\n moduleId: rt.moduleId,\n instanceId: rt.instanceId,\n data,\n } as any)\n })\n\n /**\n * strict: resolve a Module runtime only from the current Effect environment.\n *\n * Notes:\n * - With multiple roots / instances, any process-wide registry cannot express the correct semantics.\n * - A missing provider is a wiring error: fail deterministically and provide actionable hints (more details in dev/test).\n */\n const resolveModuleRuntime = (\n tag: Context.Tag<any, Logix.ModuleRuntime<any, any>>,\n ): Effect.Effect<Logix.ModuleRuntime<any, any>, never, any> =>\n Effect.gen(function* () {\n const requestedModuleId = typeof (tag as any)?.id === 'string' ? ((tag as any).id as string) : undefined\n const fromModuleId = typeof options?.moduleId === 'string' ? options.moduleId : runtime.moduleId\n\n // self: always allow resolving the current ModuleRuntime (both Bound.make and runtime injection paths).\n if (requestedModuleId && requestedModuleId === runtime.moduleId) {\n return runtime as unknown as Logix.ModuleRuntime<any, any>\n }\n\n const fromImports = runtimeInternals.imports.get(tag as unknown as Context.Tag<any, any>)\n if (fromImports) {\n return fromImports as unknown as Logix.ModuleRuntime<any, any>\n }\n\n // Bound.make (no moduleId context): allow resolving from the current Effect env (useful for tests/scaffolding).\n if (typeof options?.moduleId !== 'string') {\n const fromEnv = yield* Effect.serviceOption(tag as any)\n if (Option.isSome(fromEnv)) {\n return fromEnv.value as unknown as Logix.ModuleRuntime<any, any>\n }\n }\n\n // 2) Not found: die immediately — this is a wiring error; guide the caller to fix the composition.\n const tokenId = requestedModuleId ?? '<unknown module id>'\n const fix: string[] = isDevEnv()\n ? [\n '- Provide the child implementation in the same scope (imports).',\n ` Example: ${fromModuleId ?? 'ParentModule'}.implement({ imports: [${requestedModuleId ?? 'ChildModule'}.impl], ... })`,\n '- If you intentionally want a root singleton, provide it at app root (Runtime.make(...,{ layer }) / root imports),',\n ' and use Root.resolve(ModuleTag) (instead of $.use) at the callsite.',\n ]\n : []\n\n const err = new Error(\n isDevEnv()\n ? [\n '[MissingModuleRuntimeError] Cannot resolve ModuleRuntime for ModuleTag.',\n '',\n `tokenId: ${tokenId}`,\n 'entrypoint: logic.$.use',\n 'mode: strict',\n `from: ${fromModuleId ?? '<unknown module id>'}`,\n `startScope: moduleId=${fromModuleId ?? '<unknown>'}, instanceId=${String(runtime.instanceId ?? '<unknown>')}`,\n '',\n 'fix:',\n ...fix,\n ].join('\\n')\n : '[MissingModuleRuntimeError] module runtime not found',\n )\n\n ;(err as any).tokenId = tokenId\n ;(err as any).entrypoint = 'logic.$.use'\n ;(err as any).mode = 'strict'\n ;(err as any).from = fromModuleId\n ;(err as any).startScope = {\n moduleId: fromModuleId,\n instanceId: String(runtime.instanceId ?? '<unknown>'),\n }\n ;(err as any).fix = fix\n\n err.name = 'MissingModuleRuntimeError'\n return yield* Effect.die(err)\n })\n\n const stateApi: BoundApi<Sh, R>['state'] = {\n read: runtime.getState,\n update: (f) =>\n Effect.gen(function* () {\n const inTxn = yield* FiberRef.get(TaskRunner.inSyncTransactionFiber)\n if (inTxn) {\n const prev = yield* runtime.getState\n return yield* runtime.setState(f(prev))\n }\n\n const body = () => Effect.flatMap(runtime.getState, (prev) => runtime.setState(f(prev)))\n\n return yield* runtimeInternals\n ? runtimeInternals.txn.runWithStateTransaction({ kind: 'state', name: 'update' } as any, body)\n : body()\n }),\n mutate: (f) =>\n Effect.gen(function* () {\n const recordPatch = runtimeInternals?.txn.recordStatePatch\n const updateDraft = runtimeInternals?.txn.updateDraft\n\n const inTxn = yield* FiberRef.get(TaskRunner.inSyncTransactionFiber)\n if (inTxn) {\n const prev = yield* runtime.getState\n const { nextState, patchPaths } = mutateWithPatchPaths(prev as Logix.StateOf<Sh>, (draft) => {\n f(draft as Logic.Draft<Logix.StateOf<Sh>>)\n })\n\n for (const path of patchPaths) {\n recordPatch?.(path, 'unknown')\n }\n\n updateDraft?.(nextState)\n return\n }\n\n const body = () =>\n Effect.gen(function* () {\n const prev = yield* runtime.getState\n const { nextState, patchPaths } = mutateWithPatchPaths(prev as Logix.StateOf<Sh>, (draft) => {\n f(draft as Logic.Draft<Logix.StateOf<Sh>>)\n })\n\n for (const path of patchPaths) {\n recordPatch?.(path, 'unknown')\n }\n\n updateDraft?.(nextState)\n })\n\n return yield* runtimeInternals\n ? runtimeInternals.txn.runWithStateTransaction({ kind: 'state', name: 'mutate' } as any, body)\n : body()\n }),\n ref: runtime.ref,\n }\n\n const actions = shape.actionMap as BoundApi<Sh, R>['actions']\n\n const dispatcherCache = new Map<string, (...args: any[]) => Effect.Effect<void, any, any>>()\n\n const hasAction = (key: string): boolean => Object.prototype.hasOwnProperty.call(actions as any, key)\n\n const dispatchers: BoundApi<Sh, R>['dispatchers'] = new Proxy({} as any, {\n get: (_target, prop) => {\n if (typeof prop !== 'string') return undefined\n if (!hasAction(prop)) return undefined\n\n const cached = dispatcherCache.get(prop)\n if (cached) return cached\n\n const token = (actions as any)[prop] as Action.AnyActionToken\n const fn = (...args: any[]) => runtime.dispatch((token as any)(...args))\n\n dispatcherCache.set(prop, fn)\n return fn\n },\n has: (_target, prop) => typeof prop === 'string' && hasAction(prop),\n ownKeys: () => Object.keys(actions as any),\n getOwnPropertyDescriptor: (_target, prop) => {\n if (typeof prop !== 'string') return undefined\n if (!hasAction(prop)) return undefined\n return { enumerable: true, configurable: true }\n },\n }) as unknown as BoundApi<Sh, R>['dispatchers']\n\n const dispatch: BoundApi<Sh, R>['dispatch'] = (...args: any[]) => {\n const [first, second] = args\n\n if (typeof first === 'string') {\n return runtime.dispatch({ _tag: first, payload: second } as Logix.ActionOf<Sh>)\n }\n\n if (Action.isActionToken(first)) {\n return runtime.dispatch((first as any)(second))\n }\n\n return runtime.dispatch(first as Logix.ActionOf<Sh>)\n }\n\n const matchApi = <V>(value: V): Logic.FluentMatch<V> => MatchBuilder.makeMatch(value)\n\n const matchTagApi = <V extends { _tag: string }>(value: V): Logic.FluentMatchTag<V> =>\n MatchBuilder.makeMatchTag(value)\n\n // Primary reducer registration: write into the reducer map via the runtime's internal registrar.\n const reducer: BoundApi<Sh, R>['reducer'] = (tag, fn) => {\n return Effect.sync(() => {\n runtimeInternals.txn.registerReducer(String(tag), fn as any)\n }) as any\n }\n\n const effect: BoundApi<Sh, R>['effect'] = (token, handler) =>\n Effect.gen(function* () {\n if (!Action.isActionToken(token)) {\n return yield* Effect.dieMessage('[BoundApi.effect] token must be an ActionToken')\n }\n\n const phase = getCurrentPhase()\n const logicUnit = options?.logicUnit\n\n yield* runtimeInternals.effects.registerEffect({\n actionTag: token.tag,\n handler: handler as any,\n phase,\n ...(logicUnit\n ? {\n logicUnit: {\n logicUnitId: logicUnit.logicUnitId,\n logicUnitLabel: logicUnit.logicUnitLabel,\n path: logicUnit.path,\n },\n }\n : {}),\n })\n }) as any\n\n const api: BoundApi<Sh, R> = {\n root: {\n resolve: (tag: any) => {\n guardRunOnly('root_resolve_in_setup', '$.root.resolve')\n return Root.resolve(tag, {\n entrypoint: 'logic.$.root.resolve',\n waitForReady: true,\n }) as any\n },\n },\n state: stateApi,\n actions,\n dispatchers,\n dispatch,\n flow: flowApi,\n match: matchApi,\n matchTag: matchTagApi,\n lifecycle: {\n onInitRequired: (eff: Logic.Of<Sh, R, void, never>) => {\n if (getCurrentPhase() === 'run') {\n return emitSetupOnlyViolation('$.lifecycle.onInitRequired') as any\n }\n runtimeInternals.lifecycle.registerInitRequired(eff as any)\n return Effect.void as any\n },\n onStart: (eff: Logic.Of<Sh, R, void, never>) => {\n if (getCurrentPhase() === 'run') {\n return emitSetupOnlyViolation('$.lifecycle.onStart') as any\n }\n runtimeInternals.lifecycle.registerStart(eff as any)\n return Effect.void as any\n },\n onInit: (eff: Logic.Of<Sh, R, void, never>) => {\n // Legacy alias: same semantics as onInitRequired (to reduce migration friction).\n if (getCurrentPhase() === 'run') {\n return emitSetupOnlyViolation('$.lifecycle.onInit') as any\n }\n runtimeInternals.lifecycle.registerInitRequired(eff as any)\n return Effect.void as any\n },\n onDestroy: (eff: Logic.Of<Sh, R, void, never>) => {\n if (getCurrentPhase() === 'run') {\n return emitSetupOnlyViolation('$.lifecycle.onDestroy') as any\n }\n runtimeInternals.lifecycle.registerDestroy(eff as any)\n return Effect.void as any\n },\n onError: (\n handler: (\n cause: import('effect').Cause.Cause<unknown>,\n context: Lifecycle.ErrorContext,\n ) => Effect.Effect<void, never, R>,\n ) => {\n if (getCurrentPhase() === 'run') {\n return emitSetupOnlyViolation('$.lifecycle.onError') as any\n }\n runtimeInternals.lifecycle.registerOnError(handler as any)\n return Effect.void as any\n },\n onSuspend: (eff: Logic.Of<Sh, R, void, never>) => {\n if (getCurrentPhase() === 'run') {\n return emitSetupOnlyViolation('$.lifecycle.onSuspend') as any\n }\n runtimeInternals.lifecycle.registerPlatformSuspend(Effect.asVoid(eff as Effect.Effect<void, never, any>))\n return Effect.void as any\n },\n onResume: (eff: Logic.Of<Sh, R, void, never>) => {\n if (getCurrentPhase() === 'run') {\n return emitSetupOnlyViolation('$.lifecycle.onResume') as any\n }\n runtimeInternals.lifecycle.registerPlatformResume(Effect.asVoid(eff as Effect.Effect<void, never, any>))\n return Effect.void as any\n },\n onReset: (eff: Logic.Of<Sh, R, void, never>) => {\n if (getCurrentPhase() === 'run') {\n return emitSetupOnlyViolation('$.lifecycle.onReset') as any\n }\n runtimeInternals.lifecycle.registerPlatformReset(Effect.asVoid(eff as Effect.Effect<void, never, any>))\n return Effect.void as any\n },\n },\n traits: {\n declare: (traits: ModuleTraits.TraitSpec) => {\n if (getCurrentPhase() === 'run') {\n throw LogicDiagnostics.makeLogicPhaseError(\n 'traits_declare_in_run',\n '$.traits.declare',\n 'run',\n options?.moduleId,\n )\n }\n\n if (!traits || typeof traits !== 'object') {\n throw new Error('[InvalidTraitsDeclaration] $.traits.declare expects an object.')\n }\n\n const logicUnit = options?.logicUnit ?? {\n logicUnitId: 'unknown',\n logicUnitIdKind: 'derived' as const,\n logicUnitLabel: 'logicUnit:unknown',\n path: undefined as string | undefined,\n }\n\n runtimeInternals.traits.registerModuleTraitsContribution({\n traits,\n provenance: {\n originType: 'logicUnit',\n originId: logicUnit.logicUnitId,\n originIdKind: logicUnit.logicUnitIdKind,\n originLabel: logicUnit.logicUnitLabel,\n path: logicUnit.path,\n },\n })\n },\n source: {\n refresh: (fieldPath: string, options?: { readonly force?: boolean }) =>\n Effect.gen(function* () {\n const handler = runtimeInternals.traits.getSourceRefreshHandler(fieldPath) as\n | ((state: Logix.StateOf<Sh>) => Effect.Effect<void, never, any>)\n | undefined\n if (!handler) {\n // If no refresh handler is registered, treat it as a no-op to avoid throwing when StateTraitProgram is not installed.\n return yield* Effect.void\n }\n\n const force = options?.force === true\n const runHandler = (state: Logix.StateOf<Sh>) =>\n force ? Effect.locally(TaskRunner.forceSourceRefresh, true)(handler(state)) : handler(state)\n\n // Never call enqueueTransaction inside the transaction window (it can deadlock):\n // - Run the handler inside the current transaction so it writes to the draft via bound.state.mutate.\n // - The outer transaction window is responsible for commit + debug aggregation.\n const inTxn = yield* FiberRef.get(TaskRunner.inSyncTransactionFiber)\n if (inTxn) {\n const state = (yield* runtime.getState) as Logix.StateOf<Sh>\n return yield* runHandler(state)\n }\n\n // Treat one source-refresh as a dedicated transaction entry.\n return yield* runtimeInternals.txn.runWithStateTransaction(\n {\n kind: 'source-refresh',\n name: fieldPath,\n } as any,\n () =>\n Effect.gen(function* () {\n const state = (yield* runtime.getState) as Logix.StateOf<Sh>\n return yield* runHandler(state)\n }),\n )\n }),\n },\n },\n reducer,\n effect,\n use: new Proxy(() => {}, {\n apply: (_target, _thisArg, [arg]) => {\n guardRunOnly('use_in_setup', '$.use')\n if (isModuleLike(arg)) {\n const domain = arg\n const tag = domain.tag as unknown as Context.Tag<any, Logix.ModuleRuntime<any, any>>\n\n const resolveAndBuild = resolveModuleRuntime(tag).pipe(Effect.map((rt) => buildModuleHandle(tag, rt)))\n\n const resolveWithDescriptor = resolveModuleRuntime(tag).pipe(\n Effect.tap((rt) => emitModuleDescriptorOnce(domain, rt)),\n Effect.map((rt) => buildModuleHandle(tag, rt)),\n )\n\n const detectAndSelect = FiberRef.get(Debug.currentDiagnosticsLevel).pipe(\n Effect.tap((level) => {\n cachedDiagnosticsLevel = level\n }),\n Effect.flatMap((level) => (level === 'off' ? resolveAndBuild : resolveWithDescriptor)),\n )\n\n // 022 perf gate: when diagnostics are off, $.use(module) and $.use(module.tag) must be equivalent with zero extra overhead.\n // Constraint: Effect is a value (reusable), so we must one-time cache at execution time instead of branching at construction time.\n return Effect.suspend(() => {\n if (cachedDiagnosticsLevel === 'off') {\n return resolveAndBuild\n }\n\n if (cachedDiagnosticsLevel !== undefined) {\n return resolveWithDescriptor\n }\n\n return detectAndSelect\n }) as unknown as Logic.Of<Sh, R, any, never>\n }\n if (Context.isTag(arg)) {\n const candidate = arg as { _kind?: unknown }\n\n // Module: return a read-only ModuleHandle view.\n if (candidate._kind === 'ModuleTag') {\n return resolveModuleRuntime(arg as any).pipe(\n Effect.map((rt: Logix.ModuleRuntime<any, any>) => buildModuleHandle(arg as any, rt)),\n ) as unknown as Logic.Of<Sh, R, any, never>\n }\n\n // Regular service tag: read the service from Env.\n return arg as unknown as Logic.Of<Sh, R, any, never>\n }\n return Effect.die('BoundApi.use: unsupported argument') as unknown as Logic.Of<Sh, R, any, never>\n },\n }) as unknown as BoundApi<Sh, R>['use'],\n onAction: new Proxy(() => {}, {\n apply: (_target, _thisArg, args) => {\n guardRunOnly('use_in_setup', '$.onAction')\n const arg = args[0]\n if (Action.isActionToken(arg)) {\n const tag = arg.tag\n return createIntentBuilder(\n runtime.actions$.pipe(\n Stream.filter((a: any) => a._tag === tag || a.type === tag),\n Stream.map((a: any) => a.payload),\n ),\n tag,\n )\n }\n if (typeof arg === 'function') {\n return createIntentBuilder(runtime.actions$.pipe(Stream.filter(arg)))\n }\n if (typeof arg === 'string') {\n return createIntentBuilder(\n runtime.actions$.pipe(Stream.filter((a: any) => a._tag === arg || a.type === arg)),\n arg,\n )\n }\n if (typeof arg === 'object' && arg !== null) {\n if ('_tag' in arg) {\n return createIntentBuilder(\n runtime.actions$.pipe(Stream.filter((a: any) => a._tag === (arg as any)._tag)),\n String((arg as any)._tag),\n )\n }\n if (Schema.isSchema(arg)) {\n return createIntentBuilder(\n runtime.actions$.pipe(\n Stream.filter((a: any) => {\n const result = Schema.decodeUnknownSync(arg as Schema.Schema<any, any, never>)(a)\n return !!result\n }),\n ),\n )\n }\n }\n return createIntentBuilder(runtime.actions$)\n },\n get: (_target, prop) => {\n guardRunOnly('use_in_setup', '$.onAction')\n if (typeof prop === 'string') {\n return createIntentBuilder(\n runtime.actions$.pipe(Stream.filter((a: any) => a._tag === prop || a.type === prop)),\n prop,\n )\n }\n return undefined\n },\n }) as unknown as BoundApi<Sh, R>['onAction'],\n onState: (selector: (s: Logix.StateOf<Sh>) => any) => {\n guardRunOnly('use_in_setup', '$.onState')\n return createIntentBuilder(runtime.changes(selector))\n },\n on: (stream: Stream.Stream<any>) => {\n guardRunOnly('use_in_setup', '$.on')\n return createIntentBuilder(stream)\n },\n } as any\n\n setBoundInternals(api as any, runtimeInternals)\n\n return api\n}\n","import { Schema } from 'effect'\n\ntype ActionArgs<P> = [P] extends [void] ? [] | [P] : [P]\ntype ActionFn<P, Out> = (...args: ActionArgs<P>) => Out\n\ntype DevSource = {\n readonly file: string\n readonly line: number\n readonly column: number\n}\n\nexport type ActionValue<Tag extends string, Payload> = Payload extends void\n ? {\n readonly _tag: Tag\n readonly payload?: Payload\n }\n : {\n readonly _tag: Tag\n readonly payload: Payload\n }\n\nexport type ActionCreator<Tag extends string, Payload> = ActionFn<Payload, ActionValue<Tag, Payload>>\n\nexport type ActionToken<\n Tag extends string,\n Payload,\n PayloadSchema extends Schema.Schema<any, any, any> = Schema.Schema<any, any, any>,\n> = ActionCreator<Tag, Payload> & {\n readonly _kind: 'ActionToken'\n readonly tag: Tag\n readonly schema: PayloadSchema\n readonly source?: DevSource\n}\n\nexport type AnyActionToken = ActionToken<string, any, Schema.Schema<any, any, any>>\n\nexport const isActionToken = (value: unknown): value is AnyActionToken =>\n typeof value === 'function' &&\n (value as any)._kind === 'ActionToken' &&\n typeof (value as any).tag === 'string' &&\n Schema.isSchema((value as any).schema)\n\nexport const make = <Tag extends string, PayloadSchema extends Schema.Schema<any, any, any>>(\n tag: Tag,\n schema: PayloadSchema,\n options?: { readonly source?: DevSource },\n): ActionToken<Tag, Schema.Schema.Type<PayloadSchema>, PayloadSchema> => {\n const fn = ((...args: readonly [unknown?]) => ({\n _tag: tag,\n payload: args[0],\n })) as unknown as ActionToken<Tag, Schema.Schema.Type<PayloadSchema>, PayloadSchema>\n\n ;(fn as any)._kind = 'ActionToken'\n ;(fn as any).tag = tag\n ;(fn as any).schema = schema\n if (options?.source) {\n ;(fn as any).source = options.source\n }\n\n return fn\n}\n\nexport const makeActions = <M extends Record<string, Schema.Schema<any, any, any>>>(\n schemas: M,\n options?: {\n readonly source?: DevSource\n readonly sources?: Partial<Record<Extract<keyof M, string>, DevSource>>\n },\n): {\n readonly [K in keyof M]: ActionToken<Extract<K, string>, Schema.Schema.Type<M[K]>, M[K]>\n} => {\n const out: Record<string, AnyActionToken> = {}\n const sources = options?.sources as Record<string, DevSource | undefined> | undefined\n const defaultSource = options?.source\n for (const [key, schema] of Object.entries(schemas)) {\n const source = sources?.[key] ?? defaultSource\n out[key] = make(key, schema, source ? { source } : undefined)\n }\n return out as any\n}\n\nexport type ActionDef = Schema.Schema<any, any, any> | AnyActionToken\nexport type ActionDefs = Record<string, ActionDef>\n\nexport type NormalizedActionTokens<M extends ActionDefs> = {\n readonly [K in keyof M]: M[K] extends Schema.Schema<any, any, any>\n ? ActionToken<Extract<K, string>, Schema.Schema.Type<M[K]>, M[K]>\n : M[K] extends ActionToken<any, infer P, infer S>\n ? ActionToken<Extract<K, string>, P, S>\n : never\n}\n\nexport const normalizeActions = <M extends ActionDefs>(defs: M): NormalizedActionTokens<M> => {\n const out: Record<string, AnyActionToken> = {}\n\n for (const [key, def] of Object.entries(defs)) {\n if (Schema.isSchema(def)) {\n out[key] = make(key, def)\n continue\n }\n\n if (isActionToken(def)) {\n if (def.tag !== key) {\n throw new Error(`[Logix.Action] actionTag MUST equal key: key=\"${key}\", token.tag=\"${def.tag}\"`)\n }\n out[key] = def\n continue\n }\n\n throw new Error(`[Logix.Action] invalid action def for key \"${key}\"`)\n }\n\n return out as any\n}\n","import { Cause, Effect, Fiber, FiberRef, Ref, Stream } from 'effect'\nimport * as Debug from './DebugSink.js'\nimport { isDevEnv } from './env.js'\nimport type * as Logic from './LogicMiddleware.js'\nimport type { AnyModuleShape } from './module.js'\nimport type { RuntimeInternalsResolvedConcurrencyPolicy } from './RuntimeInternals.js'\nimport type { StateTxnOrigin } from './StateTransaction.js'\n\n/**\n * Prevents calling run*Task inside a \"synchronous transaction execution fiber\" (it would deadlock the txnQueue).\n *\n * - ModuleRuntime locally marks it as true while executing each transaction (dispatch/source-refresh/devtools/...).\n * - run*Task checks the flag on start: when true, it emits diagnostics only in dev/test and then no-ops.\n */\nexport const inSyncTransactionFiber = FiberRef.unsafeMake(false)\n\n/**\n * Force source.refresh:\n * - Default: when snapshot keyHash is unchanged and a non-idle snapshot already exists, refresh SHOULD be a no-op\n * (avoid redundant IO/writeback).\n * - Exception: explicit refresh (manual refresh) / invalidation-driven refresh needs to \"re-fetch even with the same keyHash\".\n *\n * Note: use a FiberRef to locally pass \"whether this refresh is forced\", avoiding expanding the source refresh handler signature.\n */\nexport const forceSourceRefresh = FiberRef.unsafeMake(false)\n\n/**\n * Synchronous transaction window (process-level) marker:\n * - Used as a hard guard in \"non-Effect API\" entry points (e.g. Promise/async functions).\n * - FiberRef cannot reliably read the \"current fiber\" in such entry points, so we need a synchronous callstack-level marker.\n *\n * Note: if a transaction body incorrectly crosses async boundaries, this marker will be held longer; that is a severe violation.\n */\nlet inSyncTransactionGlobalDepth = 0\n\nexport const enterSyncTransaction = (): void => {\n inSyncTransactionGlobalDepth += 1\n}\n\nexport const exitSyncTransaction = (): void => {\n inSyncTransactionGlobalDepth = Math.max(0, inSyncTransactionGlobalDepth - 1)\n}\n\nexport const isInSyncTransaction = (): boolean => inSyncTransactionGlobalDepth > 0\n\nexport type TaskRunnerMode =\n | 'task' // sequential\n | 'parallel'\n | 'latest'\n | 'exhaust'\n\nexport type TaskStatus = 'idle' | 'pending' | 'running' | 'success' | 'failure' | 'interrupted'\n\nexport interface TaskExecution {\n readonly taskId: number\n readonly status: TaskStatus\n readonly acceptedAt: number\n readonly startedAt?: number\n readonly endedAt?: number\n}\n\nexport interface TaskRunnerOrigins {\n readonly pending?: StateTxnOrigin\n readonly success?: StateTxnOrigin\n readonly failure?: StateTxnOrigin\n}\n\ntype TaskHandler<Payload, Sh extends AnyModuleShape, R> =\n | Logic.Of<Sh, R, void, never>\n | ((payload: Payload) => Logic.Of<Sh, R, void, never>)\n\ntype TaskEffect<Payload, Sh extends AnyModuleShape, R, A, E> =\n | Logic.Of<Sh, R, A, E>\n | ((payload: Payload) => Logic.Of<Sh, R, A, E>)\n\nexport interface TaskRunnerConfig<Payload, Sh extends AnyModuleShape, R, A = void, E = never> {\n /**\n * Optional: trigger source name (e.g. actionTag / fieldPath), used as the default pending origin.name.\n * - BoundApiRuntime may fill this in for onAction(\"xxx\") / traits.source.refresh(\"field\"), etc.\n * - Other callers are not required to provide it.\n */\n readonly triggerName?: string\n\n /**\n * pending: synchronous state writes (loading=true / clearing errors, etc.), always a separate transaction entry.\n * - Only executed for tasks that are accepted and actually started (ignored triggers in runExhaustTask do not run pending).\n */\n readonly pending?: TaskHandler<Payload, Sh, R>\n\n /**\n * effect: real IO / async work (must run outside the transaction window).\n */\n readonly effect: TaskEffect<Payload, Sh, R, A, E>\n\n /**\n * success: success writeback (separate transaction entry).\n */\n readonly success?: (result: A, payload: Payload) => Logic.Of<Sh, R, void, never>\n\n /**\n * failure: failure writeback (separate transaction entry).\n *\n * Note: takes a Cause to preserve defect/interrupt semantics; interrupts do not trigger failure writeback by default.\n */\n readonly failure?: (cause: Cause.Cause<E>, payload: Payload) => Logic.Of<Sh, R, void, never>\n\n /**\n * origin: optional override for the three transaction origins.\n * - Default: pending.kind=\"task:pending\"; success/failure.kind=\"service-callback\".\n */\n readonly origin?: TaskRunnerOrigins\n\n /**\n * priority: reserved for future debugging/sorting; does not change transaction boundaries or concurrency semantics.\n */\n readonly priority?: number\n}\n\nexport interface TaskRunnerRuntime {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly runWithStateTransaction: (\n origin: StateTxnOrigin,\n body: () => Effect.Effect<void, never, any>,\n ) => Effect.Effect<void, never, any>\n readonly resolveConcurrencyPolicy?: () => Effect.Effect<RuntimeInternalsResolvedConcurrencyPolicy, never, any>\n}\n\nconst resolve = <Payload, Sh extends AnyModuleShape, R, A, E>(\n eff: TaskEffect<Payload, Sh, R, A, E> | TaskHandler<Payload, Sh, R>,\n payload: Payload,\n): any => (typeof eff === 'function' ? (eff as any)(payload) : eff)\n\nconst defaultOrigins = (triggerName: string | undefined): Required<TaskRunnerOrigins> => ({\n pending: {\n kind: 'task:pending',\n name: triggerName,\n },\n success: {\n kind: 'service-callback',\n name: 'task:success',\n },\n failure: {\n kind: 'service-callback',\n name: 'task:failure',\n },\n})\n\nexport const shouldNoopInSyncTransactionFiber = (options: {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly code: string\n readonly severity: 'error' | 'warning' | 'info'\n readonly message: string\n readonly hint?: string\n readonly actionTag?: string\n readonly kind?: string\n}): Effect.Effect<boolean> =>\n Effect.gen(function* () {\n const inTxn = yield* FiberRef.get(inSyncTransactionFiber)\n if (!inTxn) {\n return false\n }\n // Always no-op regardless of env (otherwise we may deadlock); diagnostics are emitted only in dev/test.\n if (isDevEnv()) {\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: options.moduleId,\n instanceId: options.instanceId,\n code: options.code,\n severity: options.severity,\n message: options.message,\n hint: options.hint,\n actionTag: options.actionTag,\n kind: options.kind,\n })\n }\n return true\n })\n\nconst resolveConcurrencyLimit = (runtime: TaskRunnerRuntime): Effect.Effect<number | 'unbounded', never, any> =>\n runtime.resolveConcurrencyPolicy\n ? runtime.resolveConcurrencyPolicy().pipe(Effect.map((p) => p.concurrencyLimit))\n : Effect.succeed(16)\n\nconst runTaskLifecycle = <Payload, Sh extends AnyModuleShape, R, A, E>(\n payload: Payload,\n runtime: TaskRunnerRuntime,\n config: TaskRunnerConfig<Payload, Sh, R, A, E>,\n getCanWriteBack?: Effect.Effect<boolean>,\n): Effect.Effect<void, never, Logic.Env<Sh, R>> =>\n Effect.gen(function* () {\n const noop = yield* shouldNoopInSyncTransactionFiber({\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n code: 'logic::invalid_usage',\n severity: 'error',\n message: 'run*Task is not allowed inside a synchronous StateTransaction body (it may deadlock the txnQueue).',\n hint:\n 'Call run*Task from the run section of a watcher (e.g. $.onAction/$.onState/$.on); ' +\n 'do not call it directly inside a reducer / trait.run / synchronous transaction body. For long-lived flows, use a multi-entry pattern (pending → IO → writeback).',\n kind: 'run_task_in_transaction',\n })\n if (noop) {\n return\n }\n\n const defaults = defaultOrigins(config.triggerName)\n const origins: Required<TaskRunnerOrigins> = {\n pending: config.origin?.pending ?? defaults.pending,\n success: config.origin?.success ?? defaults.success,\n failure: config.origin?.failure ?? defaults.failure,\n }\n\n // 1) pending: separate transaction entry; once started it should not be interrupted by runLatest.\n const pending = config.pending\n if (pending) {\n yield* Effect.uninterruptible(\n runtime.runWithStateTransaction(origins.pending, () => Effect.asVoid(resolve(pending, payload))),\n )\n }\n\n // 2) IO: runs outside the transaction window.\n const io = resolve(config.effect, payload) as Effect.Effect<A, E, Logic.Env<Sh, R>>\n const exit = yield* Effect.exit(io)\n\n // 3) writeback: use the guard to confirm it's still the current task (runLatestTask).\n if (getCanWriteBack) {\n const ok = yield* getCanWriteBack\n if (!ok) {\n return\n }\n }\n\n if (exit._tag === 'Success') {\n const success = config.success\n if (success) {\n yield* runtime.runWithStateTransaction(origins.success, () => Effect.asVoid(success(exit.value, payload)))\n }\n return\n }\n\n // Failure: interruptions do not trigger failure writeback (e.g. runLatestTask cancellation, Scope ending).\n const cause = exit.cause as Cause.Cause<E>\n if (Cause.isInterrupted(cause)) {\n return\n }\n\n const failure = config.failure\n if (failure) {\n yield* runtime.runWithStateTransaction(origins.failure, () => Effect.asVoid(failure(cause, payload)))\n }\n }).pipe(\n // Watchers must not crash as a whole due to a single task failure: swallow errors, but keep them diagnosable.\n Effect.catchAllCause((cause) =>\n Debug.record({\n type: 'diagnostic',\n moduleId: runtime.moduleId,\n instanceId: runtime.instanceId,\n code: 'task_runner::unhandled_failure',\n severity: 'error',\n message: 'TaskRunner encountered an unhandled failure (pending/IO/writeback).',\n hint: 'Add a failure writeback for this task or handle errors explicitly upstream; avoid fire-and-forget swallowing errors.',\n actionTag: config.triggerName,\n kind: 'task_runner_unhandled_failure',\n trigger: {\n kind: 'task',\n name: config.triggerName,\n },\n }).pipe(Effect.zipRight(Effect.logError('TaskRunner error', cause))),\n ),\n ) as Effect.Effect<void, never, Logic.Env<Sh, R>>\n\n/**\n * makeTaskRunner:\n * - Reuses FlowRuntime concurrency semantics (sequential/parallel/latest/exhaust).\n * - Splits a single trigger into: pending (separate txn) → IO → success/failure (separate txn).\n */\nexport const makeTaskRunner = <Payload, Sh extends AnyModuleShape, R, A = void, E = never>(\n stream: Stream.Stream<Payload>,\n mode: TaskRunnerMode,\n runtime: TaskRunnerRuntime,\n config: TaskRunnerConfig<Payload, Sh, R, A, E>,\n): Effect.Effect<void, never, Logic.Env<Sh, R>> => {\n if (mode === 'latest') {\n return Effect.gen(function* () {\n const taskIdRef = yield* Ref.make(0)\n const currentFiberRef = yield* Ref.make<Fiber.RuntimeFiber<void, never> | undefined>(undefined)\n\n const start = (payload: Payload) =>\n Effect.gen(function* () {\n const taskId = yield* Ref.updateAndGet(taskIdRef, (n) => n + 1)\n\n const prev = yield* Ref.get(currentFiberRef)\n if (prev) {\n // Do not wait for the old fiber to fully end (avoid blocking new triggers); writeback is guarded by taskId.\n yield* Fiber.interruptFork(prev)\n }\n\n const canWriteBack = Ref.get(taskIdRef).pipe(Effect.map((current) => current === taskId))\n\n const fiber = yield* Effect.fork(\n runTaskLifecycle<Payload, Sh, R, A, E>(payload, runtime, config, canWriteBack),\n )\n\n yield* Ref.set(currentFiberRef, fiber)\n })\n\n return yield* Stream.runForEach(stream, start)\n })\n }\n\n if (mode === 'exhaust') {\n return Effect.gen(function* () {\n const concurrency = yield* resolveConcurrencyLimit(runtime)\n const busyRef = yield* Ref.make(false)\n\n const mapper = (payload: Payload) =>\n Effect.gen(function* () {\n const acquired = yield* Ref.modify(busyRef, (busy) =>\n busy ? ([false, busy] as const) : ([true, true] as const),\n )\n if (!acquired) {\n // Ignore trigger: no pending transaction is produced.\n return\n }\n try {\n yield* runTaskLifecycle<Payload, Sh, R, A, E>(payload, runtime, config)\n } finally {\n yield* Ref.set(busyRef, false)\n }\n })\n\n return yield* Stream.runDrain(stream.pipe(Stream.mapEffect(mapper, { concurrency })))\n }) as Effect.Effect<void, never, Logic.Env<Sh, R>>\n }\n\n if (mode === 'parallel') {\n return Effect.gen(function* () {\n const concurrency = yield* resolveConcurrencyLimit(runtime)\n\n return yield* Stream.runDrain(\n stream.pipe(\n Stream.mapEffect((payload) => runTaskLifecycle<Payload, Sh, R, A, E>(payload, runtime, config), {\n concurrency,\n }),\n ),\n )\n }) as Effect.Effect<void, never, Logic.Env<Sh, R>>\n }\n\n // mode === \"task\"(sequential)\n return Stream.runForEach(stream, (payload) =>\n runTaskLifecycle<Payload, Sh, R, A, E>(payload, runtime, config),\n ) as Effect.Effect<void, never, Logic.Env<Sh, R>>\n}\n","import { Cause, Effect, FiberRef, Layer, Logger } from 'effect'\nimport {\n projectJsonValue,\n type DowngradeReason as JsonDowngradeReason,\n type JsonValue,\n type JsonValueProjectionStats,\n} from '../../observability/jsonValue.js'\nimport type * as ReplayLog from './ReplayLog.js'\nimport {\n toSerializableErrorSummary,\n type DowngradeReason as ErrorDowngradeReason,\n type SerializableErrorSummary,\n} from './errorSummary.js'\nimport * as EffectOpCore from './EffectOpCore.js'\nimport type * as ProcessProtocol from './process/protocol.js'\nimport type { ConvergeStaticIrExport } from '../../state-trait/converge-ir.js'\n\nexport interface TriggerRef {\n readonly kind: string\n readonly name?: string\n readonly details?: unknown\n}\n\ntype TraceEventType = `trace:${string}`\ntype GenericTraceEventType = Exclude<\n TraceEventType,\n 'trace:trait:converge' | 'trace:trait:check' | 'trace:trait:validate'\n>\n\n/**\n * ReplayEventRef:\n * - Replay event structure referenced from Debug events.\n * - Based on ReplayLog.Event, enriched with txn/trigger association fields for Devtools aggregation and explanation.\n */\nexport type ReplayEventRef = ReplayLog.ReplayLogEvent & {\n readonly txnId?: string\n readonly trigger?: TriggerRef\n}\n\nexport type Event =\n | {\n readonly type: 'module:init'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'module:destroy'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'lifecycle:phase'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly phase: 'init' | 'run' | 'destroy' | 'platform'\n readonly name: string\n readonly payload?: unknown\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'action:dispatch'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly action: unknown\n readonly actionTag?: string\n readonly unknownAction?: boolean\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'state:update'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly state: unknown\n readonly txnSeq?: number\n readonly txnId?: string\n /**\n * Optional: Static IR digest aligned with FieldPathId/StepId (for consumer-side reverse-mapping & alignment).\n * - When missing or mismatched, consumers must not attempt to reverse-map rootIds -> rootPaths (avoid wrong UI).\n * - Allowed to be omitted on near-zero-cost diagnostics=off paths.\n */\n readonly staticIrDigest?: string\n /**\n * Optional: the affected scope aggregated by this commit (field-level dirty-set).\n * - Populated by Runtime at commit time;\n * - Must stay slim and serializable;\n * - Devtools can use it to explain \"why converge/validate ran / why it degraded to full\".\n */\n readonly dirtySet?: unknown\n /**\n * Optional: patch count aggregated by this commit (from StateTransaction).\n * - Populated by Runtime only on transaction paths.\n * - Devtools can use it as a lightweight transaction summary metric.\n */\n readonly patchCount?: number\n /**\n * Optional: whether patch records were truncated (bounded) under full instrumentation.\n */\n readonly patchesTruncated?: boolean\n /**\n * Optional: truncation reason code (stable enum).\n */\n readonly patchesTruncatedReason?: 'max_patches'\n /**\n * Optional: commit mode (normal/batched/low-priority, etc).\n * - Populated by Runtime;\n * - Default is chosen by the caller (typically \"normal\").\n */\n readonly commitMode?: string\n /**\n * Optional: external visibility priority (normal/low).\n * - Populated by Runtime.\n * - Mainly used by React external subscription scheduling (avoid unnecessary renders).\n */\n readonly priority?: string\n /**\n * Optional: transaction origin kind (origin.kind) that triggered this state commit:\n * - e.g. \"action\" / \"source-refresh\" / \"service-callback\" / \"devtools\".\n * - Populated by Runtime only on StateTransaction-based paths.\n * - Devtools can distinguish app transactions vs devtools time-travel operations.\n */\n readonly originKind?: string\n /**\n * Optional: transaction origin name (origin.name) that triggered this state commit:\n * - e.g. action dispatch / fieldPath / task:success/task:failure, etc.\n * - Populated by Runtime only on StateTransaction-based paths.\n */\n readonly originName?: string\n /**\n * Reserved: Trait converge summary (for Devtools window-level stats / TopN costs / degrade reasons, etc.).\n * - Phase 2: field slot only; structure is not fixed.\n * - Later phases will align with the Trait/Replay event model into an explainable structure.\n */\n readonly traitSummary?: unknown\n /**\n * Reserved: replay event associated with this transaction (re-emit source of truth from ReplayLog).\n * - Phase 2: field slot only.\n * - Later phases will align with ReplayLog.Event structure.\n */\n readonly replayEvent?: ReplayEventRef\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type:\n | 'process:start'\n | 'process:stop'\n | 'process:restart'\n | 'process:trigger'\n | 'process:dispatch'\n | 'process:error'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly identity: ProcessProtocol.ProcessInstanceIdentity\n readonly severity: 'info' | 'warning' | 'error'\n readonly eventSeq: number\n readonly timestampMs: number\n readonly trigger?: ProcessProtocol.ProcessTrigger\n readonly dispatch?: {\n readonly moduleId: string\n readonly instanceId: string\n readonly actionId: string\n }\n readonly error?: ProcessProtocol.SerializableErrorSummary\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'lifecycle:error'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly cause: unknown\n readonly phase?: 'init' | 'run' | 'destroy' | 'platform'\n readonly hook?: 'initRequired' | 'start' | 'destroy' | 'suspend' | 'resume' | 'reset' | 'unknown'\n readonly taskId?: string\n readonly opSeq?: number\n readonly origin?: string\n readonly txnSeq?: number\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'diagnostic'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly code: string\n readonly severity: 'error' | 'warning' | 'info'\n readonly message: string\n readonly hint?: string\n readonly actionTag?: string\n readonly kind?: string\n readonly txnSeq?: number\n readonly txnId?: string\n readonly trigger?: TriggerRef\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n /**\n * trace:* events:\n * - Extension hook for runtime tracing / Playground / Alignment Lab.\n * - Only the type prefix and moduleId are standardized; payload shape is defined by higher layers (e.g. spanId/attributes in data).\n */\n | {\n readonly type: 'trace:trait:converge'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data: JsonValue\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'trace:trait:check'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data: JsonValue\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'trace:trait:validate'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data: JsonValue\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: GenericTraceEventType\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data?: unknown\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n\nexport interface Sink {\n readonly record: (event: Event) => Effect.Effect<void>\n}\nexport const currentDebugSinks = FiberRef.unsafeMake<ReadonlyArray<Sink>>([])\nexport const currentRuntimeLabel = FiberRef.unsafeMake<string | undefined>(undefined)\nexport const currentTxnId = FiberRef.unsafeMake<string | undefined>(undefined)\nexport const currentOpSeq = FiberRef.unsafeMake<number | undefined>(undefined)\nexport type DiagnosticsLevel = 'off' | 'light' | 'sampled' | 'full'\nexport const currentDiagnosticsLevel = FiberRef.unsafeMake<DiagnosticsLevel>('off')\n\nexport const diagnosticsLevel = (level: DiagnosticsLevel): Layer.Layer<any, never, never> =>\n Layer.fiberRefLocallyScopedWith(currentDiagnosticsLevel as any, () => level) as Layer.Layer<any, never, never>\n\nexport interface TraitConvergeDiagnosticsSamplingConfig {\n /**\n * Sample once every N txns (deterministic, based on stable txnSeq).\n * - 1: sample every txn (timing granularity similar to full, while keeping payload slim)\n */\n readonly sampleEveryN: number\n /**\n * Max number of TopK hotspots to output (recommended ≤ 3).\n */\n readonly topK: number\n}\n\nexport const currentTraitConvergeDiagnosticsSampling = FiberRef.unsafeMake<TraitConvergeDiagnosticsSamplingConfig>({\n sampleEveryN: 32,\n topK: 3,\n})\n\nexport const traitConvergeDiagnosticsSampling = (\n config: TraitConvergeDiagnosticsSamplingConfig,\n): Layer.Layer<any, never, never> =>\n Layer.fiberRefLocallyScopedWith(currentTraitConvergeDiagnosticsSampling as any, () => config) as Layer.Layer<\n any,\n never,\n never\n >\n\nexport const appendSinks = (sinks: ReadonlyArray<Sink>): Layer.Layer<any, never, never> =>\n Layer.fiberRefLocallyScopedWith(currentDebugSinks, (current) => [...current, ...sinks]) as Layer.Layer<\n any,\n never,\n never\n >\n\nexport type RuntimeDebugEventKind =\n | 'action'\n | 'state'\n | 'service'\n | 'process'\n | 'trait-computed'\n | 'trait-link'\n | 'trait-source'\n | 'lifecycle'\n | 'react-render'\n | 'devtools'\n | 'diagnostic'\n | (string & {})\n\nexport interface RuntimeDebugEventRef {\n readonly eventId: string\n readonly eventSeq: number\n readonly moduleId: string\n readonly instanceId: string\n readonly runtimeLabel?: string\n readonly txnSeq: number\n readonly txnId?: string\n /**\n * linkId:\n * - Current operation chain id (shared by boundary ops in the same chain).\n * - Created by Runtime at the boundary root and propagated via FiberRef across nested/cross-module chains.\n */\n readonly linkId?: string\n readonly timestamp: number\n readonly kind: RuntimeDebugEventKind\n readonly label: string\n readonly meta?: JsonValue\n readonly errorSummary?: SerializableErrorSummary\n readonly downgrade?: {\n readonly reason?: 'non_serializable' | 'oversized' | 'unknown'\n }\n}\n\nexport type TxnLaneEvidenceReason =\n | 'disabled'\n | 'forced_off'\n | 'forced_sync'\n | 'queued_non_urgent'\n | 'preempted_by_urgent'\n | 'budget_yield'\n | 'coalesced'\n | 'canceled'\n | 'max_lag_forced'\n | 'starvation_protection'\n\nexport type TxnLaneNonUrgentYieldReason = 'none' | 'input_pending' | 'budget_exceeded' | 'forced_frame_yield'\n\nexport type TxnLaneEvidence = {\n readonly anchor: {\n readonly moduleId: string\n readonly instanceId: string\n readonly txnSeq: number\n readonly opSeq?: number\n }\n readonly lane: 'urgent' | 'nonUrgent'\n readonly kind: string\n readonly policy: {\n readonly enabled: boolean\n readonly overrideMode?: 'forced_off' | 'forced_sync'\n readonly configScope: 'provider' | 'runtime_module' | 'runtime_default' | 'builtin'\n readonly budgetMs: number\n readonly debounceMs: number\n readonly maxLagMs: number\n readonly allowCoalesce: boolean\n readonly yieldStrategy?: 'baseline' | 'inputPending'\n readonly queueMode?: 'fifo' | 'lanes'\n }\n readonly backlog: {\n readonly pendingCount: number\n readonly ageMs?: number\n readonly coalescedCount?: number\n readonly canceledCount?: number\n }\n readonly budget?: {\n readonly budgetMs?: number\n readonly sliceDurationMs?: number\n readonly yieldCount?: number\n readonly yielded?: boolean\n readonly yieldReason?: TxnLaneNonUrgentYieldReason\n }\n readonly starvation?: {\n readonly triggered?: boolean\n readonly reason?: string\n }\n readonly reasons: ReadonlyArray<TxnLaneEvidenceReason>\n}\n\nlet nextGlobalEventSeq = 0\n\nexport const clearRuntimeDebugEventSeq = (): void => {\n nextGlobalEventSeq = 0\n}\n\nconst nextEventSeq = (): number => {\n nextGlobalEventSeq += 1\n return nextGlobalEventSeq\n}\n\nconst makeEventId = (instanceId: string, eventSeq: number): string => `${instanceId}::e${eventSeq}`\n\ntype DowngradeReason = JsonDowngradeReason | ErrorDowngradeReason\n\nconst mergeDowngrade = (\n current: DowngradeReason | undefined,\n next: DowngradeReason | undefined,\n): DowngradeReason | undefined => {\n if (!current) return next\n if (!next) return current\n if (current === 'non_serializable' || next === 'non_serializable') return 'non_serializable'\n if (current === 'oversized' || next === 'oversized') return 'oversized'\n return 'unknown'\n}\n\n// In browsers, to reduce duplicated noise caused by React StrictMode, etc.,\n// de-duplicate lifecycle:error and diagnostic events: print the same moduleId+payload only once.\nconst browserLifecycleSeen = new Set<string>()\nconst browserDiagnosticSeen = new Set<string>()\n\n// Align trace:react-render events with the most recent state:update txn (UI-only association).\nconst lastTxnByInstance = new Map<string, { readonly txnId: string; readonly txnSeq: number }>()\n\n// trace:react-render / trace:react-selector may enter the sink before state:update (reordering due to concurrency/scheduling).\n// To provide usable txn anchors in Devtools/UI, we allow a one-time backfill for refs missing txn fields.\nconst pendingTxnAlignmentByInstance = new Map<string, Array<RuntimeDebugEventRef>>()\n\nconst enqueuePendingTxnAlignment = (instanceId: string, ref: RuntimeDebugEventRef): void => {\n const list = pendingTxnAlignmentByInstance.get(instanceId)\n if (!list) {\n pendingTxnAlignmentByInstance.set(instanceId, [ref])\n return\n }\n list.push(ref)\n if (list.length > 64) {\n list.shift()\n }\n}\n\nconst backfillPendingTxnAlignment = (\n instanceId: string,\n txn: { readonly txnId: string; readonly txnSeq: number },\n): void => {\n const pending = pendingTxnAlignmentByInstance.get(instanceId)\n if (!pending || pending.length === 0) {\n pendingTxnAlignmentByInstance.delete(instanceId)\n return\n }\n\n for (const ref of pending) {\n const anyRef: any = ref as any\n if (anyRef.txnId == null) {\n anyRef.txnId = txn.txnId\n }\n if (typeof anyRef.txnSeq !== 'number' || anyRef.txnSeq <= 0) {\n anyRef.txnSeq = txn.txnSeq\n }\n }\n\n pendingTxnAlignmentByInstance.delete(instanceId)\n}\n\nconst lifecycleErrorLog = (event: Extract<Event, { readonly type: 'lifecycle:error' }>) => {\n const moduleId = event.moduleId ?? 'unknown'\n const causePretty = (() => {\n try {\n return Cause.pretty(event.cause as Cause.Cause<unknown>, {\n renderErrorCause: true,\n })\n } catch {\n try {\n return JSON.stringify(event.cause, null, 2)\n } catch {\n return String(event.cause)\n }\n }\n })()\n\n const message = `[Logix][module=${moduleId}] lifecycle:error\\n${causePretty}`\n\n return Effect.logError(message).pipe(\n Effect.annotateLogs({\n 'logix.moduleId': moduleId,\n 'logix.event': 'lifecycle:error',\n 'logix.cause': causePretty,\n }),\n )\n}\n\nconst diagnosticLog = (event: Extract<Event, { readonly type: 'diagnostic' }>) => {\n const moduleId = event.moduleId ?? 'unknown'\n const header = `[Logix][module=${moduleId}] diagnostic(${event.severity})`\n const detail = `code=${event.code} message=${event.message}${\n event.actionTag ? ` action=${event.actionTag}` : ''\n }${event.hint ? `\\nhint: ${event.hint}` : ''}`\n const msg = `${header}\\n${detail}`\n\n const base =\n event.severity === 'warning'\n ? Effect.logWarning(msg)\n : event.severity === 'info'\n ? Effect.logInfo(msg)\n : Effect.logError(msg)\n\n const annotations: Record<string, unknown> = {\n 'logix.moduleId': moduleId,\n 'logix.event': `diagnostic(${event.severity})`,\n 'logix.diagnostic.code': event.code,\n 'logix.diagnostic.message': event.message,\n }\n if (event.hint) {\n annotations['logix.diagnostic.hint'] = event.hint\n }\n if (event.actionTag) {\n annotations['logix.diagnostic.actionTag'] = event.actionTag\n }\n\n return base.pipe(Effect.annotateLogs(annotations))\n}\n\n/**\n * Default Layer composition based on FiberRef.currentDebugSinks:\n * - Uses Layer.locallyScoped to inject Debug sinks via FiberRef state.\n * - Avoids misusing FiberRef as a Context.Tag.\n */\nexport const noopLayer = Layer.locallyScoped(currentDebugSinks, [])\n\n/**\n * errorOnlyLayer:\n * - Default DebugSink implementation that only cares about lifecycle:error events.\n * - Suitable as a \"minimum observability\" layer so fatal errors don't silently disappear.\n * - Other events (module:init/destroy, action:dispatch, state:update) are not recorded by default.\n */\nconst errorOnlySink: Sink = {\n record: (event: Event) =>\n event.type === 'lifecycle:error'\n ? lifecycleErrorLog(event)\n : event.type === 'diagnostic' && event.severity !== 'info'\n ? diagnosticLog(event)\n : Effect.void,\n}\n\nexport const errorOnlyLayer = Layer.locallyScoped(currentDebugSinks, [errorOnlySink])\n\nexport const isErrorOnlyOnlySinks = (sinks: ReadonlyArray<Sink>): boolean => sinks.length === 1 && sinks[0] === errorOnlySink\n\n/**\n * consoleLayer:\n * - Full debug layer that logs all Debug events via Effect logs (logfmt / structured).\n * - Suitable as an observability layer for general environments (Node / tests).\n */\nconst consoleSink: Sink = {\n record: (event: Event) =>\n event.type === 'lifecycle:error'\n ? lifecycleErrorLog(event)\n : event.type === 'diagnostic'\n ? diagnosticLog(event)\n : Effect.logDebug({ debugEvent: event }),\n}\n\nexport const consoleLayer = Layer.locallyScoped(currentDebugSinks, [consoleSink])\n\nconst isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'\n\n// Shared browser console rendering logic used by the default DebugSink and browserConsoleLayer.\nconst renderBrowserConsoleEvent = (event: Event): Effect.Effect<void> => {\n // trace:* events: shown as separate groups in browsers for Playground / DevTools observation.\n if (typeof (event as any).type === 'string' && (event as any).type.startsWith('trace:')) {\n const moduleId = (event as any).moduleId ?? 'unknown'\n const type = (event as any).type\n\n return Effect.sync(() => {\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n '%c[Logix]%c trace %c' + moduleId + '%c ' + String(type),\n 'color:#6b7280;font-weight:bold', // tag\n 'color:#3b82f6', // label\n 'color:#9ca3af', // module id\n 'color:#6b7280', // type\n )\n // eslint-disable-next-line no-console\n console.log(event)\n // eslint-disable-next-line no-console\n console.groupEnd()\n })\n }\n\n if (event.type === 'lifecycle:error') {\n const moduleId = event.moduleId ?? 'unknown'\n const causePretty = (() => {\n try {\n return Cause.pretty(event.cause as Cause.Cause<unknown>, { renderErrorCause: true })\n } catch {\n try {\n return JSON.stringify(event.cause, null, 2)\n } catch {\n return String(event.cause)\n }\n }\n })()\n\n const key = `${moduleId}|${causePretty}`\n if (browserLifecycleSeen.has(key)) {\n return Effect.void\n }\n browserLifecycleSeen.add(key)\n\n return Effect.sync(() => {\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n '%c[Logix]%c lifecycle:error %c' + moduleId,\n 'color:#ef4444;font-weight:bold', // tag\n 'color:#ef4444', // label\n 'color:#9ca3af', // module id\n )\n // eslint-disable-next-line no-console\n console.error(causePretty)\n // eslint-disable-next-line no-console\n console.groupEnd()\n })\n }\n\n if (event.type === 'diagnostic') {\n const moduleId = event.moduleId ?? 'unknown'\n const detail = `code=${event.code} message=${event.message}${\n event.actionTag ? ` action=${event.actionTag}` : ''\n }${event.hint ? `\\nhint: ${event.hint}` : ''}`\n\n const color =\n event.severity === 'warning' ? 'color:#d97706' : event.severity === 'info' ? 'color:#3b82f6' : 'color:#ef4444'\n\n const label =\n event.severity === 'warning'\n ? 'diagnostic(warning)'\n : event.severity === 'info'\n ? 'diagnostic(info)'\n : 'diagnostic(error)'\n\n const key = `${moduleId}|${event.code}|${event.message}`\n if (browserDiagnosticSeen.has(key)) {\n return Effect.void\n }\n browserDiagnosticSeen.add(key)\n\n return Effect.sync(() => {\n // eslint-disable-next-line no-console\n console.groupCollapsed(\n '%c[Logix]%c ' + label + '%c module=' + moduleId,\n 'color:#6b7280;font-weight:bold',\n color,\n 'color:#9ca3af',\n )\n if (event.severity === 'warning') {\n // eslint-disable-next-line no-console\n console.warn(detail)\n } else if (event.severity === 'info') {\n // eslint-disable-next-line no-console\n console.info(detail)\n } else {\n // eslint-disable-next-line no-console\n console.error(detail)\n }\n // eslint-disable-next-line no-console\n console.groupEnd()\n })\n }\n\n // Other events are not printed to the browser console by default to avoid being too noisy during development.\n // For internal debug events, use a custom Debug sink or use consoleLayer in Node.\n return Effect.void\n}\n\n/**\n * Browser console debug layer:\n * - In browsers, uses console.groupCollapsed + colored labels to simulate pretty logger grouping.\n * - In non-browser environments, falls back to consoleLayer's Effect logging implementation.\n */\nconst browserConsoleSink: Sink = {\n record: (event: Event) => {\n if (!isBrowser) {\n // Non-browser: fall back to consoleLayer behavior (Effect.log*).\n return event.type === 'lifecycle:error'\n ? lifecycleErrorLog(event)\n : event.type === 'diagnostic'\n ? diagnosticLog(event)\n : Effect.logDebug({ debugEvent: event })\n }\n\n return renderBrowserConsoleEvent(event)\n },\n}\n\nexport const browserConsoleLayer = Layer.locallyScoped(currentDebugSinks, [browserConsoleSink])\n\n/**\n * Browser diagnostic-only debug layer:\n * - In browsers, prints only lifecycle:error + diagnostic(warning/error) via console.groupCollapsed.\n * - Drops trace:* and other high-frequency events from the browser console (use DevtoolsHub instead).\n * - In non-browser environments, behaves like errorOnlySink (Effect.log*).\n */\nconst browserDiagnosticConsoleSink: Sink = {\n record: (event: Event) => {\n if (!isBrowser) {\n return event.type === 'lifecycle:error'\n ? lifecycleErrorLog(event)\n : event.type === 'diagnostic' && event.severity !== 'info'\n ? diagnosticLog(event)\n : Effect.void\n }\n\n return event.type === 'lifecycle:error' || (event.type === 'diagnostic' && event.severity !== 'info')\n ? renderBrowserConsoleEvent(event)\n : Effect.void\n },\n}\n\nexport const browserDiagnosticConsoleLayer = Layer.locallyScoped(currentDebugSinks, [browserDiagnosticConsoleSink])\n\n/**\n * Browser-friendly Logger layer: replaces the default logger with Effect's pretty logger (browser mode).\n * - Avoids hand-written console styles; reuses Effect's colored/grouped formatting.\n * - Safely degrades to the default logger in server environments.\n */\nexport const browserPrettyLoggerLayer = Logger.replace(\n Logger.defaultLogger,\n Logger.prettyLogger({ mode: 'browser', colors: true }),\n)\n\n/**\n * defaultLayer:\n * - Public default layer; currently equivalent to errorOnlyLayer.\n * - Records lifecycle:error only, avoiding a large volume of action/state logs by default.\n */\nexport const defaultLayer = errorOnlyLayer\n\nexport const record = (event: Event) =>\n Effect.gen(function* () {\n const sinks = yield* FiberRef.get(currentDebugSinks)\n\n // Fast path: production default installs errorOnlyLayer (sinks=1).\n // Avoid paying diagnostics FiberRef + enrichment costs for high-frequency events that are always dropped by errorOnly.\n if (isErrorOnlyOnlySinks(sinks)) {\n if (event.type === 'lifecycle:error') {\n yield* lifecycleErrorLog(event)\n return\n }\n if (event.type === 'diagnostic') {\n if (event.severity !== 'info') {\n yield* diagnosticLog(event)\n } else {\n yield* Effect.void\n }\n return\n }\n yield* Effect.void\n return\n }\n\n // Fast path: when no sinks are installed, only a small subset of events are ever surfaced.\n // Avoid paying per-event FiberRef + enrichment costs for high-frequency events like state:update.\n if (sinks.length === 0) {\n if (isBrowser) {\n if (event.type === 'lifecycle:error' || event.type === 'diagnostic') {\n yield* renderBrowserConsoleEvent(event)\n return\n }\n yield* Effect.void\n return\n }\n\n if (event.type === 'lifecycle:error') {\n yield* lifecycleErrorLog(event)\n return\n }\n if (event.type === 'diagnostic') {\n yield* diagnosticLog(event)\n return\n }\n yield* Effect.void\n return\n }\n\n const enriched = event as Event\n\n const diagnosticsLevel = yield* FiberRef.get(currentDiagnosticsLevel)\n\n // Enrich Debug.Event with basic fields (enabled only when diagnosticsLevel!=off):\n // - timestamp: for Devtools/Timeline/Overview time aggregation; avoids UI-side \"first observed time\" distortion.\n // - runtimeLabel: from FiberRef for grouping by runtime (injected only when not already provided by the event).\n let now: number | undefined\n const getNow = (): number => {\n if (now === undefined) now = Date.now()\n return now\n }\n\n // diagnostics=off: keep near-zero cost; do not add timestamp for high-frequency events (avoid extra Date.now()).\n // Low-frequency events (lifecycle:error/diagnostic) may still get timestamp for easier debugging.\n if (\n enriched.timestamp === undefined &&\n (diagnosticsLevel !== 'off' || enriched.type === 'lifecycle:error' || enriched.type === 'diagnostic')\n ) {\n ;(enriched as any).timestamp = getNow()\n }\n if (diagnosticsLevel !== 'off' && enriched.runtimeLabel === undefined) {\n const runtimeLabel = yield* FiberRef.get(currentRuntimeLabel)\n if (runtimeLabel) {\n ;(enriched as any).runtimeLabel = runtimeLabel\n }\n }\n\n if (enriched.type === 'diagnostic' && (enriched as any).txnId === undefined) {\n const txnId = yield* FiberRef.get(currentTxnId)\n if (txnId) {\n ;(enriched as any).txnId = txnId\n }\n }\n // linkId is meaningful only for EffectOp events: avoid extra FiberRef reads on high-frequency events (state:update, etc.).\n if (\n diagnosticsLevel !== 'off' &&\n (enriched as any).type === 'trace:effectop' &&\n (enriched as any).linkId === undefined\n ) {\n const linkId = yield* FiberRef.get(EffectOpCore.currentLinkId)\n if (linkId) {\n ;(enriched as any).linkId = linkId\n }\n }\n\n if (sinks.length === 1) {\n yield* sinks[0]!.record(enriched)\n return\n }\n\n yield* Effect.forEach(sinks, (sink) => sink.record(enriched), { discard: true })\n })\n\n/**\n * Normalizes internal Debug.Event into RuntimeDebugEventRef:\n * - Allows Devtools / Runtime to consume Debug events uniformly.\n * - Does not change DebugSink behavior; provides a structured view only.\n */\nexport const toRuntimeDebugEventRef = (\n event: Event,\n options?: {\n readonly diagnosticsLevel?: DiagnosticsLevel\n readonly eventSeq?: number\n readonly resolveConvergeStaticIr?: (staticIrDigest: string) => ConvergeStaticIrExport | undefined\n readonly onMetaProjection?: (projection: {\n readonly stats: JsonValueProjectionStats\n readonly downgrade?: JsonDowngradeReason\n }) => void\n },\n): RuntimeDebugEventRef | undefined => {\n const diagnosticsLevel = options?.diagnosticsLevel ?? 'full'\n if (diagnosticsLevel === 'off') {\n return undefined\n }\n\n const isLightLike = diagnosticsLevel === 'light' || diagnosticsLevel === 'sampled'\n\n const timestamp =\n typeof event.timestamp === 'number' && Number.isFinite(event.timestamp) ? event.timestamp : Date.now()\n\n const moduleIdRaw = (event as any).moduleId\n const moduleId = typeof moduleIdRaw === 'string' && moduleIdRaw.length > 0 ? moduleIdRaw : 'unknown'\n\n const instanceIdRaw = (event as any).instanceId\n const instanceId = typeof instanceIdRaw === 'string' && instanceIdRaw.length > 0 ? instanceIdRaw : 'unknown'\n\n const runtimeLabelRaw = (event as any).runtimeLabel\n const runtimeLabel = typeof runtimeLabelRaw === 'string' && runtimeLabelRaw.length > 0 ? runtimeLabelRaw : undefined\n\n const txnSeqRaw = (event as any).txnSeq\n const txnSeq =\n typeof txnSeqRaw === 'number' && Number.isFinite(txnSeqRaw) && txnSeqRaw >= 0 ? Math.floor(txnSeqRaw) : 0\n\n const txnIdRaw = (event as any).txnId\n const txnId =\n typeof txnIdRaw === 'string' && txnIdRaw.length > 0\n ? txnIdRaw\n : txnSeq > 0\n ? `${instanceId}::t${txnSeq}`\n : undefined\n\n const linkId = (() => {\n const linkIdRaw = (event as any).linkId\n if (typeof linkIdRaw === 'string' && linkIdRaw.length > 0) return linkIdRaw\n\n // trace:*: allow fallback extraction from data.meta.linkId (avoid UI diving into deep meta).\n if (typeof (event as any).type !== 'string' || !(event as any).type.startsWith('trace:')) {\n return undefined\n }\n\n const data: any = (event as any).data\n const meta: any = data?.meta\n const linkIdFromMeta = meta?.linkId\n if (typeof linkIdFromMeta === 'string' && linkIdFromMeta.length > 0) return linkIdFromMeta\n\n return undefined\n })()\n\n const eventSeqRaw = options?.eventSeq\n const eventSeq =\n typeof eventSeqRaw === 'number' && Number.isFinite(eventSeqRaw) && eventSeqRaw > 0\n ? Math.floor(eventSeqRaw)\n : nextEventSeq()\n const eventId = makeEventId(instanceId, eventSeq)\n\n const base = {\n eventId,\n eventSeq,\n moduleId,\n instanceId,\n runtimeLabel,\n txnSeq,\n txnId,\n linkId,\n timestamp,\n } as const\n\n let downgrade: DowngradeReason | undefined\n\n const withDowngrade = (ref: Omit<RuntimeDebugEventRef, 'downgrade'>): RuntimeDebugEventRef => {\n if (!downgrade) return ref\n return { ...ref, downgrade: { reason: downgrade } }\n }\n\n switch (event.type) {\n case 'module:init':\n return withDowngrade({\n ...base,\n kind: 'lifecycle',\n label: 'module:init',\n })\n case 'module:destroy':\n return withDowngrade({\n ...base,\n kind: 'lifecycle',\n label: 'module:destroy',\n })\n case 'lifecycle:phase': {\n const e = event as Extract<Event, { readonly type: 'lifecycle:phase' }>\n const metaInput = isLightLike\n ? { type: 'lifecycle:phase', phase: e.phase, name: e.name }\n : { type: 'lifecycle:phase', phase: e.phase, name: e.name, payload: e.payload }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n return withDowngrade({\n ...base,\n kind: 'lifecycle',\n label: e.name,\n meta: metaProjection.value,\n })\n }\n case 'action:dispatch': {\n const action: any = (event as any).action\n const actionTagRaw = (event as any).actionTag\n const tag = typeof actionTagRaw === 'string' && actionTagRaw.length > 0 ? actionTagRaw : (action?._tag ?? action?.type)\n const label = String(tag ?? 'action:dispatch')\n const labelNormalized = label.length > 0 ? label : 'unknown'\n const unknownAction = (event as any).unknownAction === true ? true : undefined\n const metaInput = isLightLike\n ? { actionTag: labelNormalized, ...(unknownAction ? { unknownAction: true } : {}) }\n : { action, ...(unknownAction ? { unknownAction: true } : {}) }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n if (unknownAction) {\n downgrade = mergeDowngrade(downgrade, 'unknown')\n }\n return withDowngrade({\n ...base,\n kind: 'action',\n label: labelNormalized,\n meta: metaProjection.value,\n })\n }\n case 'state:update': {\n const e = event as Extract<Event, { readonly type: 'state:update' }>\n\n const resolveDirtySetRootPaths = (): ReadonlyArray<JsonValue> | undefined => {\n const resolve = options?.resolveConvergeStaticIr\n if (!resolve) return undefined\n\n const digest = e.staticIrDigest\n if (typeof digest !== 'string' || digest.length === 0) return undefined\n\n const dirtySet = e.dirtySet as any\n if (!dirtySet || typeof dirtySet !== 'object' || Array.isArray(dirtySet)) return undefined\n\n const rootIds = dirtySet.rootIds\n if (!Array.isArray(rootIds) || rootIds.length === 0) return undefined\n\n const ir = resolve(digest) as ConvergeStaticIrExport | undefined\n const fieldPaths = (ir as any)?.fieldPaths as unknown\n if (!Array.isArray(fieldPaths) || fieldPaths.length === 0) return undefined\n\n const out: Array<JsonValue> = []\n for (const rawId of rootIds) {\n if (typeof rawId !== 'number' || !Number.isFinite(rawId)) continue\n const id = Math.floor(rawId)\n if (id < 0) continue\n const path = (fieldPaths as any)[id] as unknown\n if (!Array.isArray(path) || path.length === 0) continue\n if (!path.every((seg) => typeof seg === 'string' && seg.length > 0)) continue\n out.push(path as any)\n }\n\n return out.length > 0 ? out : undefined\n }\n\n const dirtySetWithRootPaths = (() => {\n const rootPaths = resolveDirtySetRootPaths()\n if (!rootPaths) return e.dirtySet\n const dirtySet = e.dirtySet as any\n if (!dirtySet || typeof dirtySet !== 'object' || Array.isArray(dirtySet)) return e.dirtySet\n return { ...dirtySet, rootPaths }\n })()\n\n const metaInput = isLightLike\n ? {\n state: e.state,\n dirtySet: dirtySetWithRootPaths,\n patchCount: e.patchCount,\n patchesTruncated: e.patchesTruncated,\n patchesTruncatedReason: e.patchesTruncatedReason,\n staticIrDigest: e.staticIrDigest,\n commitMode: e.commitMode,\n priority: e.priority,\n originKind: e.originKind,\n originName: e.originName,\n }\n : {\n state: e.state,\n dirtySet: dirtySetWithRootPaths,\n patchCount: e.patchCount,\n patchesTruncated: e.patchesTruncated,\n patchesTruncatedReason: e.patchesTruncatedReason,\n staticIrDigest: e.staticIrDigest,\n commitMode: e.commitMode,\n priority: e.priority,\n originKind: e.originKind,\n originName: e.originName,\n traitSummary: e.traitSummary,\n replayEvent: e.replayEvent,\n }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n if (txnId) {\n lastTxnByInstance.set(instanceId, { txnId, txnSeq })\n backfillPendingTxnAlignment(instanceId, { txnId, txnSeq })\n }\n return withDowngrade({\n ...base,\n kind: 'state',\n label: 'state:update',\n meta: metaProjection.value,\n })\n }\n case 'process:start':\n case 'process:stop':\n case 'process:restart':\n case 'process:trigger':\n case 'process:dispatch':\n case 'process:error': {\n const e = event as Extract<\n Event,\n {\n readonly type:\n | 'process:start'\n | 'process:stop'\n | 'process:restart'\n | 'process:trigger'\n | 'process:dispatch'\n | 'process:error'\n }\n >\n\n const ts2 = typeof e.timestampMs === 'number' && Number.isFinite(e.timestampMs) ? e.timestampMs : timestamp\n\n const metaInput = {\n identity: e.identity,\n severity: e.severity,\n eventSeq: e.eventSeq,\n timestampMs: e.timestampMs,\n trigger: e.trigger,\n dispatch: e.dispatch,\n error: e.error,\n }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n const errorSummary =\n e.type === 'process:error' || e.type === 'process:restart'\n ? (e.error as any as SerializableErrorSummary | undefined)\n : undefined\n\n return withDowngrade({\n ...base,\n timestamp: ts2,\n kind: 'process',\n label: e.type,\n meta: metaProjection.value,\n errorSummary,\n })\n }\n case 'lifecycle:error': {\n const e = event as Extract<Event, { readonly type: 'lifecycle:error' }>\n const summary = toSerializableErrorSummary(e.cause)\n downgrade = mergeDowngrade(downgrade, summary.downgrade)\n const metaInput = isLightLike\n ? { type: 'lifecycle:error', phase: e.phase, name: e.hook }\n : {\n type: 'lifecycle:error',\n phase: e.phase,\n name: e.hook,\n hook: e.hook,\n taskId: e.taskId,\n origin: e.origin,\n txnSeq: e.txnSeq,\n opSeq: e.opSeq,\n }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n return withDowngrade({\n ...base,\n kind: 'lifecycle',\n label: 'lifecycle:error',\n meta: metaProjection.value,\n errorSummary: summary.errorSummary,\n })\n }\n case 'diagnostic': {\n const e = event as Extract<Event, { readonly type: 'diagnostic' }>\n const metaInput = {\n code: e.code,\n severity: e.severity,\n message: e.message,\n hint: e.hint,\n actionTag: e.actionTag,\n kind: e.kind,\n trigger: e.trigger,\n }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n return withDowngrade({\n ...base,\n kind: 'diagnostic',\n label: e.code,\n meta: metaProjection.value,\n })\n }\n default: {\n if (typeof event.type !== 'string' || !event.type.startsWith('trace:')) {\n return undefined\n }\n\n // trace:txn-lane: slim evidence for Txn Lanes (lane/backlog/reasons), used for Devtools summary and offline export.\n if (event.type === 'trace:txn-lane') {\n const data: any = (event as any).data\n const evidence = data?.evidence ?? data\n\n const metaProjection = projectJsonValue(evidence)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n const label =\n typeof evidence?.kind === 'string' && evidence.kind.length > 0 ? String(evidence.kind) : 'txn-lane'\n\n return withDowngrade({\n ...base,\n kind: 'txn-lane',\n label,\n meta: metaProjection.value,\n })\n }\n\n // trace:react-render / trace:react-selector: keep slim meta only (field trimming is handled by JsonValue projection).\n if (event.type === 'trace:react-render' || event.type === 'trace:react-selector') {\n const data: any = (event as any).data\n const metaProjection = projectJsonValue(\n isLightLike\n ? {\n componentLabel: data?.componentLabel,\n selectorKey: data?.selectorKey,\n fieldPaths: data?.fieldPaths,\n selectorId: data?.selectorId,\n lane: data?.lane,\n producer: data?.producer,\n fallbackReason: data?.fallbackReason,\n readsDigest: data?.readsDigest,\n equalsKind: data?.equalsKind,\n strictModePhase: data?.strictModePhase,\n }\n : {\n componentLabel: data?.componentLabel,\n selectorKey: data?.selectorKey,\n fieldPaths: data?.fieldPaths,\n selectorId: data?.selectorId,\n lane: data?.lane,\n producer: data?.producer,\n fallbackReason: data?.fallbackReason,\n readsDigest: data?.readsDigest,\n equalsKind: data?.equalsKind,\n strictModePhase: data?.strictModePhase,\n meta: data?.meta,\n },\n )\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n const label =\n typeof data?.componentLabel === 'string' && data.componentLabel.length > 0\n ? data.componentLabel\n : event.type === 'trace:react-selector'\n ? 'react-selector'\n : 'react-render'\n const last = lastTxnByInstance.get(instanceId)\n const txnSeqFromMeta =\n typeof data?.meta?.txnSeq === 'number' && Number.isFinite(data.meta.txnSeq) && data.meta.txnSeq >= 0\n ? Math.floor(data.meta.txnSeq)\n : undefined\n const txnIdFromMeta =\n typeof data?.meta?.txnId === 'string' && data.meta.txnId.length > 0 ? data.meta.txnId : undefined\n const txnIdAligned = txnIdFromMeta ?? base.txnId ?? last?.txnId\n const txnSeqAligned = txnSeqFromMeta ?? (base.txnSeq > 0 ? base.txnSeq : (last?.txnSeq ?? base.txnSeq))\n const ref = withDowngrade({\n ...base,\n txnId: txnIdAligned,\n txnSeq: txnSeqAligned,\n kind: event.type === 'trace:react-selector' ? 'react-selector' : 'react-render',\n label,\n meta: metaProjection.value,\n })\n\n if (instanceId !== 'unknown' && (ref.txnId == null || ref.txnSeq <= 0)) {\n enqueuePendingTxnAlignment(instanceId, ref)\n }\n\n return ref\n }\n\n // trace:selector:eval: SelectorGraph evaluation evidence within commit (used for txn→selector→render causal chain).\n if (event.type === 'trace:selector:eval') {\n const data: any = (event as any).data\n const metaInput = {\n selectorId: data?.selectorId,\n lane: data?.lane,\n producer: data?.producer,\n fallbackReason: data?.fallbackReason,\n readsDigest: data?.readsDigest,\n equalsKind: data?.equalsKind,\n changed: data?.changed,\n evalMs: data?.evalMs,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:exec-vm: Exec VM hit/miss evidence (049). In light tier we keep minimal summary fields.\n if (event.type === 'trace:exec-vm') {\n const data: any = (event as any).data\n const metaInput = {\n version: data?.version,\n stage: data?.stage,\n hit: data?.hit,\n reasonCode: data?.reasonCode ?? data?.reason,\n reasonDetail: data?.reasonDetail,\n execIrVersion: data?.execIrVersion,\n execIrHash: data?.execIrHash,\n serviceId: data?.serviceId,\n implId: data?.implId,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:trait:converge: converge evidence must be exportable (JsonValue hard gate) and trims heavy fields in light tier.\n if (event.type === 'trace:trait:converge') {\n const resolveDirtyRootPaths = (args: {\n readonly staticIrDigest: unknown\n readonly rootIds: unknown\n }): ReadonlyArray<JsonValue> | undefined => {\n const resolve = options?.resolveConvergeStaticIr\n if (!resolve) return undefined\n const digest = args.staticIrDigest\n if (typeof digest !== 'string' || digest.length === 0) return undefined\n\n const rootIds = args.rootIds\n if (!Array.isArray(rootIds) || rootIds.length === 0) return undefined\n\n const ir = resolve(digest) as ConvergeStaticIrExport | undefined\n const fieldPaths = (ir as any)?.fieldPaths as unknown\n if (!Array.isArray(fieldPaths) || fieldPaths.length === 0) return undefined\n\n const out: Array<JsonValue> = []\n for (const id of rootIds) {\n if (typeof id !== 'number' || !Number.isFinite(id)) continue\n const idx = Math.floor(id)\n if (idx < 0 || idx >= fieldPaths.length) continue\n const path = fieldPaths[idx]\n if (Array.isArray(path)) {\n out.push(path as any)\n }\n }\n\n return out.length > 0 ? out : undefined\n }\n\n const enrichDirtyRootPaths = (value: JsonValue): JsonValue => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n\n const anyValue = value as any\n const dirty = anyValue.dirty\n if (!dirty || typeof dirty !== 'object' || Array.isArray(dirty)) return value\n\n const dirtyRootPaths = resolveDirtyRootPaths({\n staticIrDigest: anyValue.staticIrDigest,\n rootIds: dirty?.rootIds,\n })\n if (!dirtyRootPaths) return value\n\n return {\n ...anyValue,\n dirty: {\n ...(dirty as any),\n rootPaths: dirtyRootPaths,\n },\n } as JsonValue\n }\n\n const stripHeavyLight = (value: JsonValue): JsonValue => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n\n const anyValue = value as any\n const dirty = anyValue.dirty\n const dirtyRootPaths = resolveDirtyRootPaths({\n staticIrDigest: anyValue.staticIrDigest,\n rootIds: dirty?.rootIds,\n })\n const dirtySlim =\n dirty && typeof dirty === 'object' && !Array.isArray(dirty)\n ? {\n dirtyAll: (dirty as any).dirtyAll,\n ...(typeof (dirty as any).reason === 'string' ? { reason: (dirty as any).reason } : null),\n ...(Array.isArray((dirty as any).rootIds) ? { rootIds: (dirty as any).rootIds } : null),\n ...(typeof (dirty as any).rootIdsTruncated === 'boolean'\n ? { rootIdsTruncated: (dirty as any).rootIdsTruncated }\n : null),\n ...(dirtyRootPaths ? { rootPaths: dirtyRootPaths } : null),\n }\n : undefined\n\n const { top3, dirtyRoots, ...rest } = anyValue\n return (dirtySlim ? { ...rest, dirty: dirtySlim } : rest) as JsonValue\n }\n\n const stripHeavySampled = (value: JsonValue): JsonValue => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n\n const anyValue = value as any\n const dirty = anyValue.dirty\n const dirtySlim =\n dirty && typeof dirty === 'object' && !Array.isArray(dirty)\n ? {\n dirtyAll: (dirty as any).dirtyAll,\n ...(typeof (dirty as any).reason === 'string' ? { reason: (dirty as any).reason } : null),\n }\n : undefined\n\n const { dirtyRoots, ...rest } = anyValue\n return (dirtySlim ? { ...rest, dirty: dirtySlim } : rest) as JsonValue\n }\n\n const data = (event as Extract<Event, { readonly type: 'trace:trait:converge' }>).data\n const metaInput =\n diagnosticsLevel === 'light'\n ? stripHeavyLight(data)\n : diagnosticsLevel === 'sampled'\n ? stripHeavySampled(data)\n : enrichDirtyRootPaths(data)\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'trait:converge',\n label: 'trait:converge',\n meta: metaProjection.value,\n })\n }\n\n // trace:trait:check: validation diagnostics must be exportable and stay slim in light tier (keep key fields).\n if (event.type === 'trace:trait:check') {\n const stripHeavy = (value: JsonValue): JsonValue => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n const anyValue = value as any\n const degraded = anyValue.degraded\n const degradedSlim =\n degraded && typeof degraded === 'object' && !Array.isArray(degraded)\n ? { kind: (degraded as any).kind }\n : undefined\n\n const { degraded: _degraded, ...rest } = anyValue\n return (degradedSlim ? { ...rest, degraded: degradedSlim } : rest) as JsonValue\n }\n\n const data = (event as Extract<Event, { readonly type: 'trace:trait:check' }>).data\n const metaInput = isLightLike ? stripHeavy(data) : data\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'trait:check',\n label: 'trait:check',\n meta: metaProjection.value,\n })\n }\n\n // trace:trait:validate: validation decision summary must be exportable and slim in light tier (no heavy fields by default).\n if (event.type === 'trace:trait:validate') {\n const data = (event as Extract<Event, { readonly type: 'trace:trait:validate' }>).data\n const metaProjection = projectJsonValue(data)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'trait:validate',\n label: 'trait:validate',\n meta: metaProjection.value,\n })\n }\n\n // trace:module:traits: final traits snapshot must be exportable and slim in light tier (digest/count).\n if (event.type === 'trace:module:traits') {\n const data: any = (event as any).data\n const metaInput = isLightLike\n ? {\n digest: data?.digest,\n count: data?.count,\n }\n : {\n digest: data?.digest,\n count: data?.count,\n traits: data?.traits,\n provenanceIndex: data?.provenanceIndex,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:module:traits:conflict: conflict details must be exportable; avoid relying on truncated lifecycle:error messages.\n if (event.type === 'trace:module:traits:conflict') {\n const data: any = (event as any).data\n const metaInput = isLightLike\n ? {\n conflictCount: data?.conflictCount,\n traitIds: data?.traitIds,\n }\n : {\n conflictCount: data?.conflictCount,\n conflicts: data?.conflicts,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:module:descriptor: keep key anchors even in light tier (avoid data being fully trimmed).\n if (event.type === 'trace:module:descriptor') {\n const data: any = (event as any).data\n const metaInput = isLightLike\n ? {\n id: data?.id,\n traits: data?.traits,\n source: data?.source,\n }\n : { data }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:effectop: keep slim op meta and prefer EffectOp.meta.moduleId when present.\n if (event.type === 'trace:effectop') {\n const data: any = (event as any).data\n const opMeta: any = data?.meta\n const opKind = (data?.kind ?? 'service') as RuntimeDebugEventKind\n const label = typeof data?.name === 'string' ? data.name : 'effectop'\n const moduleId2 = typeof opMeta?.moduleId === 'string' ? opMeta.moduleId : moduleId\n const txnId2 = typeof opMeta?.txnId === 'string' && opMeta.txnId.length > 0 ? opMeta.txnId : base.txnId\n const txnSeq2 =\n typeof opMeta?.txnSeq === 'number' && Number.isFinite(opMeta.txnSeq) && opMeta.txnSeq >= 0\n ? Math.floor(opMeta.txnSeq)\n : base.txnSeq\n\n const metaInput = isLightLike\n ? {\n id: data?.id,\n kind: data?.kind,\n name: data?.name,\n meta: opMeta,\n }\n : {\n id: data?.id,\n kind: data?.kind,\n name: data?.name,\n payload: data?.payload,\n meta: opMeta,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n moduleId: moduleId2,\n txnId: txnId2,\n txnSeq: txnSeq2,\n kind: opKind,\n label,\n meta: metaProjection.value,\n })\n }\n\n // Other trace:* events: categorize as devtools and trim meta by tier.\n const metaProjection = projectJsonValue(\n isLightLike\n ? {\n data: undefined,\n }\n : {\n data: (event as any).data,\n },\n )\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n }\n}\n","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","import { Cause } from 'effect'\n\nexport type DowngradeReason = 'non_serializable' | 'oversized' | 'unknown'\n\nexport interface SerializableErrorSummary {\n readonly message: string\n readonly name?: string\n readonly code?: string\n readonly hint?: string\n}\n\nexport interface ErrorSummaryResult {\n readonly errorSummary: SerializableErrorSummary\n readonly downgrade?: DowngradeReason\n}\n\nconst truncate = (value: string, maxLen: number): { readonly value: string; readonly truncated: boolean } => {\n if (value.length <= maxLen) return { value, truncated: false }\n return { value: value.slice(0, maxLen), truncated: true }\n}\n\nconst safeStringify = (value: unknown): { readonly ok: true; readonly json: string } | { readonly ok: false } => {\n try {\n return { ok: true, json: JSON.stringify(value) }\n } catch {\n return { ok: false }\n }\n}\n\nconst getMessageFromUnknown = (cause: unknown): string => {\n if (typeof cause === 'string') return cause\n if (typeof cause === 'number' || typeof cause === 'boolean' || typeof cause === 'bigint') return String(cause)\n if (cause instanceof Error) return cause.message || cause.name || 'Error'\n if (cause && typeof cause === 'object' && 'message' in (cause as any) && typeof (cause as any).message === 'string') {\n return (cause as any).message as string\n }\n\n // Try Effect Cause pretty (best-effort). This may include more details than needed,\n // so callers MUST still treat it as an untrusted/oversized string and truncate.\n try {\n const pretty = Cause.pretty(cause as Cause.Cause<unknown>, { renderErrorCause: true })\n if (typeof pretty === 'string' && pretty.length > 0) return pretty\n } catch {\n // ignore\n }\n\n return 'Unknown error'\n}\n\nexport const toSerializableErrorSummary = (\n cause: unknown,\n options?: {\n readonly maxMessageLength?: number\n },\n): ErrorSummaryResult => {\n const maxMessageLength = options?.maxMessageLength ?? 256\n\n const messageRaw = getMessageFromUnknown(cause)\n const { value: message, truncated } = truncate(messageRaw, maxMessageLength)\n\n const summary: { message: string; name?: string; code?: string; hint?: string } = {\n message,\n }\n\n if (cause instanceof Error) {\n if (cause.name && cause.name !== 'Error') summary.name = cause.name\n const anyCause = cause as any\n if (typeof anyCause.code === 'string' && anyCause.code.length > 0) summary.code = anyCause.code\n else if (typeof anyCause.code === 'number' && Number.isFinite(anyCause.code)) summary.code = String(anyCause.code)\n if (typeof anyCause.hint === 'string' && anyCause.hint.length > 0) summary.hint = anyCause.hint\n return {\n errorSummary: summary,\n downgrade: truncated ? 'oversized' : undefined,\n }\n }\n\n if (cause && typeof cause === 'object') {\n const anyCause = cause as any\n if (typeof anyCause.name === 'string' && anyCause.name.length > 0) summary.name = anyCause.name\n if (typeof anyCause.code === 'string' && anyCause.code.length > 0) summary.code = anyCause.code\n if (typeof anyCause.hint === 'string' && anyCause.hint.length > 0) summary.hint = anyCause.hint\n }\n\n // If the original cause isn't JSON-serializable, mark it explicitly.\n const stringifyResult = safeStringify(cause)\n if (!stringifyResult.ok) {\n return {\n errorSummary: summary,\n downgrade: 'non_serializable',\n }\n }\n\n if (truncated) {\n return {\n errorSummary: summary,\n downgrade: 'oversized',\n }\n }\n\n if (message === 'Unknown error') {\n return {\n errorSummary: summary,\n downgrade: 'unknown',\n }\n }\n\n return { errorSummary: summary }\n}\n","// EffectOp core model and middleware composition logic.\n// For higher-level Runtime / Devtools integration, see:\n// specs/000-module-traits-runtime/references/effectop-and-middleware.md\n\nimport { Context, Effect, FiberRef } from 'effect'\n\n/**\n * currentLinkId:\n * - Stores the current operation chain id (linkId) in a FiberRef.\n * - Used to correlate multiple boundary ops within the same chain (can be shared across modules via the same FiberRef).\n */\nexport const currentLinkId = FiberRef.unsafeMake<string | undefined>(undefined)\n\n/**\n * OperationPolicy:\n * - Local policy markers (intent only; no rule logic attached).\n *\n * Constraints (enforced by Runtime/middleware together):\n * - Only observation-only capabilities (Observer) may be disabled; global guards must not be disabled.\n */\nexport interface OperationPolicy {\n readonly disableObservers?: boolean\n}\n\n/**\n * OperationRejected:\n * - Unified failure result when a guard rejects execution.\n * - Semantics: explicit failure with no business side effects (rejection must happen before user code executes).\n */\nexport interface OperationRejected {\n readonly _tag: 'OperationRejected'\n readonly message: string\n readonly kind?: EffectOp['kind']\n readonly name?: string\n readonly linkId?: string\n readonly details?: unknown\n}\n\n/**\n * OperationError:\n * - Any boundary operation executed via EffectOp may be explicitly rejected by Guard middleware.\n * - Therefore, the middleware error channel must allow OperationRejected to be added.\n */\nexport type OperationError<E> = E | OperationRejected\n\nexport const makeOperationRejected = (params: {\n readonly message: string\n readonly kind?: EffectOp['kind']\n readonly name?: string\n readonly linkId?: string\n readonly details?: unknown\n}): OperationRejected => ({\n _tag: 'OperationRejected',\n message: params.message,\n kind: params.kind,\n name: params.name,\n linkId: params.linkId,\n details: params.details,\n})\n\n/**\n * EffectOp: a unified representation of an Effect execution at an \"observable boundary\".\n *\n * - Out / Err / Env are the generic parameters of the underlying Effect.\n * - meta carries structured context needed by Devtools / Middleware.\n */\nexport interface EffectOp<Out = unknown, Err = unknown, Env = unknown> {\n readonly id: string\n readonly kind:\n | 'action'\n | 'flow'\n | 'state'\n | 'service'\n | 'lifecycle'\n | 'trait-computed'\n | 'trait-link'\n | 'trait-source'\n | 'devtools'\n readonly name: string\n readonly payload?: unknown\n readonly meta?: {\n /**\n * linkId:\n * - Operation chain id: multiple boundary ops in the same chain must share it.\n * - Runtime ensures this field is populated on all boundary ops.\n */\n linkId?: string\n moduleId?: string\n instanceId?: string\n runtimeLabel?: string\n txnId?: string\n txnSeq?: number\n opSeq?: number\n fieldPath?: string\n deps?: ReadonlyArray<string>\n from?: string\n to?: string\n traitNodeId?: string\n stepId?: string\n resourceId?: string\n key?: unknown\n trace?: ReadonlyArray<string>\n tags?: ReadonlyArray<string>\n policy?: OperationPolicy\n // Reserved extension slot for middleware/devtools to attach extra information.\n readonly [k: string]: unknown\n }\n readonly effect: Effect.Effect<Out, Err, Env>\n}\n\n/**\n * Middleware: the general middleware model for observing / wrapping / guarding EffectOps.\n */\nexport type Middleware = <A, E, R>(op: EffectOp<A, E, R>) => Effect.Effect<A, OperationError<E>, R>\n\nexport type MiddlewareStack = ReadonlyArray<Middleware>\n\n/**\n * EffectOpMiddlewareEnv:\n * - A Service in Effect Env that carries the current Runtime's MiddlewareStack.\n * - Injected by Runtime.ts when constructing a ManagedRuntime.\n * - Runtime code (e.g. StateTrait.install) uses this Service to decide which MiddlewareStack to use.\n */\nexport interface EffectOpMiddlewareEnv {\n readonly stack: MiddlewareStack\n}\n\nexport class EffectOpMiddlewareTag extends Context.Tag('Logix/EffectOpMiddleware')<\n EffectOpMiddlewareTag,\n EffectOpMiddlewareEnv\n>() {}\n\n/**\n * composeMiddleware:\n * - Composes Middleware from \"outer to inner\" in declaration order:\n * - stack = [mw1, mw2] => mw1 -> mw2 -> effect -> mw2 -> mw1\n * - Matches the reduceRight example in the reference docs.\n */\nexport const composeMiddleware = (stack: MiddlewareStack): Middleware => {\n return <A, E, R>(op: EffectOp<A, E, R>): Effect.Effect<A, OperationError<E>, R> =>\n stack.reduceRight<Effect.Effect<A, OperationError<E>, R>>(\n (eff, mw) => mw({ ...op, effect: eff } as any) as any,\n op.effect as Effect.Effect<A, OperationError<E>, R>,\n )\n}\n\n/**\n * runWithMiddleware:\n * - Executes a given EffectOp with a MiddlewareStack according to the composition rules.\n * - If the stack is empty, returns op.effect directly.\n */\nexport const runWithMiddleware = <A, E, R>(op: EffectOp<A, E, R>, stack: MiddlewareStack): Effect.Effect<A, E, R> => {\n return Effect.gen(function* () {\n const existing = yield* FiberRef.get(currentLinkId)\n const metaLinkId = (op.meta as any)?.linkId\n const linkId = typeof metaLinkId === 'string' && metaLinkId.length > 0 ? metaLinkId : (existing ?? op.id)\n\n const nextOp: EffectOp<A, E, R> = {\n ...op,\n meta: {\n ...(op.meta ?? {}),\n linkId,\n },\n }\n\n const program = stack.length ? composeMiddleware(stack)(nextOp) : nextOp.effect\n\n // linkId is created at the boundary root and reused for nested ops (the FiberRef is the global single source of truth).\n // NOTE: middleware may explicitly reject with OperationRejected.\n return yield* Effect.locally(currentLinkId, linkId)(program as any)\n }) as Effect.Effect<A, E, R>\n}\n","import { Context, Layer } from 'effect'\nimport type { TraitConvergeRequestedMode } from '../../state-trait/model.js'\nimport type { ReadQueryStrictGateConfig } from './ReadQuery.js'\n\n// Unified runtime env detection, avoiding bundlers inlining NODE_ENV at build time.\nexport const getNodeEnv = (): string | undefined => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const env = (globalThis as any)?.process?.env\n return typeof env?.NODE_ENV === 'string' ? env.NODE_ENV : undefined\n } catch {\n return undefined\n }\n}\n\nexport const isDevEnv = (): boolean => getNodeEnv() !== 'production'\n\nexport type StateTransactionInstrumentation = 'full' | 'light'\n\n/**\n * getDefaultStateTxnInstrumentation:\n * - Currently chooses default instrumentation by NODE_ENV:\n * - dev / test: full (keep patches and snapshots for debugging).\n * - production: light (keep minimal semantics to reduce overhead).\n * - May evolve with finer-grained overrides in Runtime.make / Module.make.\n */\nexport const getDefaultStateTxnInstrumentation = (): StateTransactionInstrumentation => (isDevEnv() ? 'full' : 'light')\n\n/**\n * Runtime-level StateTransaction config Service:\n * - Provided at the app layer by Logix.Runtime.make / AppRuntime.makeApp.\n * - ModuleRuntime.make can read runtime-level defaults from Env.\n *\n * Notes:\n * - instrumentation is only a runtime-level default.\n * - Explicit instrumentation in ModuleImpl / ModuleRuntimeOptions has higher priority.\n */\nexport interface StateTransactionRuntimeConfig {\n readonly instrumentation?: StateTransactionInstrumentation\n /**\n * StateTrait derived converge budget (ms):\n * - Exceeding the budget triggers a soft degrade (freeze derived fields, preserve base writes and 0/1 commit semantics).\n * - Default is 200ms (aligned with the 007 spec threshold).\n */\n readonly traitConvergeBudgetMs?: number\n /**\n * Auto-mode decision budget (ms):\n * - Only used during the decision phase when requestedMode=\"auto\".\n * - Exceeding the budget must immediately fall back to full (and record evidence).\n */\n readonly traitConvergeDecisionBudgetMs?: number\n /**\n * StateTrait converge scheduling strategy:\n * - full: full topo execution (current default; safest).\n * - dirty: minimal triggering based on dirtyPaths + deps in the txn window (requires accurate deps).\n */\n readonly traitConvergeMode?: TraitConvergeRequestedMode\n /**\n * 043: Trait converge time-slicing (explicit opt-in). Disabled by default.\n */\n readonly traitConvergeTimeSlicing?: TraitConvergeTimeSlicingPatch\n /**\n * 060: Txn Lanes (priority scheduling for transaction follow-up work). Enabled by default since 062.\n */\n readonly txnLanes?: TxnLanesPatch\n /**\n * Runtime-level per-module overrides (hotfix path):\n * - Only affects converge behavior for the specified moduleId.\n * - Lower priority than Provider overrides.\n */\n readonly traitConvergeOverridesByModuleId?: Readonly<Record<string, StateTransactionTraitConvergeOverrides>>\n /**\n * 060: Txn Lanes runtime_module overrides (hotfix / gradual tuning).\n * - Only affects the specified moduleId.\n * - Lower priority than Provider overrides.\n */\n readonly txnLanesOverridesByModuleId?: Readonly<Record<string, TxnLanesPatch>>\n}\n\nclass StateTransactionConfigTagImpl extends Context.Tag('@logixjs/core/StateTransactionRuntimeConfig')<\n StateTransactionConfigTagImpl,\n StateTransactionRuntimeConfig\n>() {}\n\nexport const StateTransactionConfigTag = StateTransactionConfigTagImpl\n\nexport type ReadQueryStrictGateRuntimeConfig = ReadQueryStrictGateConfig\n\nclass ReadQueryStrictGateConfigTagImpl extends Context.Tag('@logixjs/core/ReadQueryStrictGateRuntimeConfig')<\n ReadQueryStrictGateConfigTagImpl,\n ReadQueryStrictGateRuntimeConfig\n>() {}\n\nexport const ReadQueryStrictGateConfigTag = ReadQueryStrictGateConfigTagImpl\n\nexport type ReplayMode = 'live' | 'replay'\n\nexport interface ReplayModeConfig {\n readonly mode: ReplayMode\n}\n\nclass ReplayModeConfigTagImpl extends Context.Tag('@logixjs/core/ReplayModeConfig')<\n ReplayModeConfigTagImpl,\n ReplayModeConfig\n>() {}\n\nexport const ReplayModeConfigTag = ReplayModeConfigTagImpl\n\nexport const replayModeLayer = (mode: ReplayMode): Layer.Layer<ReplayModeConfigTagImpl, never, never> =>\n Layer.succeed(ReplayModeConfigTag, { mode })\n\nexport interface StateTransactionTraitConvergeOverrides {\n readonly traitConvergeMode?: TraitConvergeRequestedMode\n readonly traitConvergeBudgetMs?: number\n readonly traitConvergeDecisionBudgetMs?: number\n readonly traitConvergeTimeSlicing?: TraitConvergeTimeSlicingPatch\n}\n\nexport interface TxnLanesPatch {\n /**\n * enabled: whether Txn Lanes is enabled (default on since 062).\n * - undefined: default enabled (when not explicitly configured)\n * - false: disabled (returns to baseline behavior)\n * - true: enabled (only affects scheduling of follow-up work outside the transaction; transactions remain synchronous)\n */\n readonly enabled?: boolean\n /**\n * overrideMode: runtime temporary override (for debugging/rollback/comparison).\n * - forced_off: forcibly disables Txn Lanes (returns to baseline behavior).\n * - forced_sync: forces fully synchronous execution (ignores non-urgent deferral and time-slicing; used for comparisons).\n *\n * Notes:\n * - Override precedence follows StateTransactionOverrides: provider > runtime_module > runtime_default > builtin.\n * - Overrides must be explainable by evidence (see 060 LaneEvidence reasons).\n */\n readonly overrideMode?: 'forced_off' | 'forced_sync'\n /** non-urgent work loop slice budget (ms). */\n readonly budgetMs?: number\n /** Non-urgent backlog coalescing window (ms). */\n readonly debounceMs?: number\n /** Max lag upper bound (ms): exceeding it triggers an explainable starvation protection (forced catch-up). */\n readonly maxLagMs?: number\n /** Whether to allow coalescing/canceling intermediate non-urgent work (must preserve eventual consistency). */\n readonly allowCoalesce?: boolean\n /**\n * Yield strategy for the non-urgent work loop (progressive enhancement).\n * - baseline: uses only time budget + hard upper bound\n * - inputPending: when supported by browsers, also consults `navigator.scheduling.isInputPending`\n */\n readonly yieldStrategy?: 'baseline' | 'inputPending'\n}\n\nexport interface TraitConvergeTimeSlicingPatch {\n /**\n * enabled:\n * - false/undefined: disabled (default)\n * - true: enables time-slicing (only affects computed/link explicitly marked as deferred)\n */\n readonly enabled?: boolean\n /**\n * debounceMs: coalescing interval (ms) for the deferral window; merges high-frequency inputs into one deferred flush.\n */\n readonly debounceMs?: number\n /**\n * maxLagMs: max lag upper bound (ms); exceeding it triggers an explainable forced flush (starvation protection).\n */\n readonly maxLagMs?: number\n}\n\n/**\n * Provider-scoped StateTransactionOverrides (delta overrides):\n * - Used to inject more local overrides into a Provider subtree on top of inherited global runtime config.\n * - Override precedence: provider > runtime_module > runtime_default > builtin.\n */\nexport interface StateTransactionOverrides {\n readonly traitConvergeMode?: TraitConvergeRequestedMode\n readonly traitConvergeBudgetMs?: number\n readonly traitConvergeDecisionBudgetMs?: number\n readonly traitConvergeTimeSlicing?: TraitConvergeTimeSlicingPatch\n readonly traitConvergeOverridesByModuleId?: Readonly<Record<string, StateTransactionTraitConvergeOverrides>>\n /** 060: Txn Lanes provider-level overrides (delta overrides). */\n readonly txnLanes?: TxnLanesPatch\n /** 060: Txn Lanes provider_module overrides (by moduleId). */\n readonly txnLanesOverridesByModuleId?: Readonly<Record<string, TxnLanesPatch>>\n}\n\nclass StateTransactionOverridesTagImpl extends Context.Tag('@logixjs/core/StateTransactionOverrides')<\n StateTransactionOverridesTagImpl,\n StateTransactionOverrides\n>() {}\n\nexport const StateTransactionOverridesTag = StateTransactionOverridesTagImpl\n\nexport type ConcurrencyLimit = number | 'unbounded'\n\nexport interface ConcurrencyPolicyPatch {\n readonly concurrencyLimit?: ConcurrencyLimit\n readonly losslessBackpressureCapacity?: number\n readonly allowUnbounded?: boolean\n readonly pressureWarningThreshold?: {\n readonly backlogCount?: number\n readonly backlogDurationMs?: number\n }\n readonly warningCooldownMs?: number\n}\n\n/**\n * Runtime-level ConcurrencyPolicy:\n * - Provided at the app layer by Logix.Runtime.make / AppRuntime.makeApp.\n * - ModuleRuntime merges sources via a resolver (builtin/runtime_module/provider, etc.).\n *\n * Notes:\n * - overridesByModuleId is used for runtime_module hot-switching (hotfix / gradual tuning) and is lower priority than provider overrides.\n */\nexport interface ConcurrencyPolicy extends ConcurrencyPolicyPatch {\n readonly overridesByModuleId?: Readonly<Record<string, ConcurrencyPolicyPatch>>\n}\n\nclass ConcurrencyPolicyTagImpl extends Context.Tag('@logixjs/core/ConcurrencyPolicy')<\n ConcurrencyPolicyTagImpl,\n ConcurrencyPolicy\n>() {}\n\nexport const ConcurrencyPolicyTag = ConcurrencyPolicyTagImpl\n\n/**\n * Provider-scoped ConcurrencyPolicyOverrides (delta overrides):\n * - Used to inject more local overrides into a Provider subtree on top of inherited global runtime config.\n * - Override precedence: provider > runtime_module > runtime_default > builtin.\n */\nexport interface ConcurrencyPolicyOverrides extends ConcurrencyPolicyPatch {\n readonly overridesByModuleId?: Readonly<Record<string, ConcurrencyPolicyPatch>>\n}\n\nclass ConcurrencyPolicyOverridesTagImpl extends Context.Tag('@logixjs/core/ConcurrencyPolicyOverrides')<\n ConcurrencyPolicyOverridesTagImpl,\n ConcurrencyPolicyOverrides\n>() {}\n\nexport const ConcurrencyPolicyOverridesTag = ConcurrencyPolicyOverridesTagImpl\n","import { create, type Patches } from 'mutative'\nimport type { FieldPath } from '../../field-path.js'\nimport { isFieldPathSegment } from '../../field-path.js'\n\nexport type PatchPath = FieldPath\n\nexport const mutateWithoutPatches = <S>(base: S, mutator: (draft: S) => void): S => {\n return create(base, mutator as any) as unknown as S\n}\n\nconst toPatchFieldPath = (path: unknown): PatchPath | '*' | undefined => {\n if (typeof path === 'string') {\n const trimmed = path.trim()\n return trimmed.length > 0 ? '*' : undefined\n }\n\n if (!Array.isArray(path)) return undefined\n\n const parts: Array<string> = []\n for (const seg of path) {\n if (typeof seg === 'string') {\n if (isFieldPathSegment(seg)) parts.push(seg)\n continue\n }\n }\n\n if (parts.length === 0) return '*'\n return parts\n}\n\nexport const mutateWithPatchPaths = <S>(\n base: S,\n mutator: (draft: S) => void,\n): { readonly nextState: S; readonly patchPaths: ReadonlyArray<PatchPath | '*'> } => {\n const out = create(base, mutator as any, {\n enablePatches: {\n pathAsArray: true,\n arrayLengthAssignment: false,\n },\n }) as unknown\n\n if (!Array.isArray(out)) {\n return { nextState: out as S, patchPaths: [] }\n }\n\n const nextState = out[0] as S\n const patches = (out[1] ?? []) as Patches<{ pathAsArray: true; arrayLengthAssignment: false }>\n\n const dedup = new Map<string, PatchPath | '*'>()\n for (const patch of patches) {\n const p = toPatchFieldPath((patch as any)?.path)\n if (!p) continue\n const key = p === '*' ? '*' : JSON.stringify(p)\n if (!dedup.has(key)) dedup.set(key, p)\n }\n\n return {\n nextState,\n patchPaths: Array.from(dedup.values()),\n }\n}\n","export type FieldPath = ReadonlyArray<string>\nexport type FieldPathId = number\n\nexport type DirtyAllReason = 'unknownWrite' | 'customMutation' | 'nonTrackablePatch' | 'fallbackPolicy'\n\nexport type PatchReason =\n | 'reducer'\n | 'trait-computed'\n | 'trait-link'\n | 'source-refresh'\n | 'devtools'\n | 'perf'\n | 'unknown'\n\nexport const normalizePatchReason = (reason: unknown): PatchReason => {\n switch (reason) {\n case 'reducer':\n case 'trait-computed':\n case 'trait-link':\n case 'source-refresh':\n case 'devtools':\n case 'perf':\n case 'unknown':\n return reason\n default:\n return typeof reason === 'string' && reason.startsWith('source:') ? 'source-refresh' : 'unknown'\n }\n}\n\nexport interface DirtySet {\n readonly dirtyAll: boolean\n /**\n * When dirtyAll=true, a stable reason code must be provided; when dirtyAll=false, it should be omitted.\n */\n readonly reason?: DirtyAllReason\n /**\n * FieldPathId (Static IR table index).\n * - When dirtyAll=true, must be an empty array;\n * - When dirtyAll=false, roots are deduped / prefix-free / stably sorted.\n */\n readonly rootIds: ReadonlyArray<FieldPathId>\n readonly rootCount: number\n readonly keySize: number\n readonly keyHash: number\n /**\n * Optional: mark when the output is TopK-truncated (light/full).\n * Note: truncation does not affect the definition of keyHash/keySize/rootCount (they still refer to full roots).\n */\n readonly rootIdsTruncated?: boolean\n}\n\ninterface FieldPathTrieNode {\n id?: FieldPathId\n children: Map<string, FieldPathTrieNode>\n}\n\nexport interface FieldPathIdRegistry {\n readonly fieldPaths: ReadonlyArray<FieldPath>\n readonly root: FieldPathTrieNode\n /**\n * Fast path: direct lookup for common string inputs (e.g. 'a.b').\n *\n * Note: This map is only safe for \"dot-separated\" paths. If a schema key itself contains '.',\n * it is ambiguous with nested paths and should not rely on string-path APIs.\n */\n readonly pathStringToId?: ReadonlyMap<string, FieldPathId>\n}\n\nexport const isFieldPathSegment = (seg: string): boolean => {\n if (!seg) return false\n if (seg === '*') return false\n if (/^\\d+$/.test(seg)) return false\n if (seg.includes('[') || seg.includes(']')) return false\n return true\n}\n\nexport const normalizeFieldPath = (input: string | FieldPath): FieldPath | undefined => {\n if (typeof input === 'string') {\n const segs = splitSegments(input)\n if (!segs || segs.length === 0) return undefined\n const normalized = segs.filter(isFieldPathSegment)\n return normalized.length > 0 ? normalized : undefined\n }\n\n if (input.length === 0) return undefined\n\n let needsFilter = false\n for (const seg of input) {\n if (!isFieldPathSegment(seg)) {\n needsFilter = true\n break\n }\n }\n\n if (!needsFilter) return input\n\n const normalized = input.filter(isFieldPathSegment)\n return normalized.length > 0 ? normalized : undefined\n}\n\nexport const compareFieldPath = (a: FieldPath, b: FieldPath): number => {\n const len = Math.min(a.length, b.length)\n for (let i = 0; i < len; i++) {\n const as = a[i]!\n const bs = b[i]!\n if (as === bs) continue\n return as < bs ? -1 : 1\n }\n return a.length - b.length\n}\n\nexport const isPrefixOf = (prefix: FieldPath, full: FieldPath): boolean => {\n if (prefix.length > full.length) return false\n for (let i = 0; i < prefix.length; i++) {\n if (prefix[i] !== full[i]) return false\n }\n return true\n}\n\nexport const toKey = (path: FieldPath): string => JSON.stringify(path)\n\nexport const toPathString = (path: FieldPath): string => path.join('.')\n\nexport const canonicalizeRoots = (roots: Iterable<FieldPath>): ReadonlyArray<FieldPath> => {\n const byKey = new Map<string, FieldPath>()\n for (const root of roots) {\n const key = toKey(root)\n if (!byKey.has(key)) byKey.set(key, root)\n }\n\n const sorted = Array.from(byKey.values()).sort(compareFieldPath)\n const out: Array<FieldPath> = []\n for (const next of sorted) {\n const prev = out[out.length - 1]\n if (prev && isPrefixOf(prev, next)) {\n continue\n }\n out.push(next)\n }\n return out\n}\n\nexport const canonicalizeRootsFast = (roots: Iterable<FieldPath>): ReadonlyArray<FieldPath> => {\n const sorted = Array.from(roots).sort(compareFieldPath)\n const out: Array<FieldPath> = []\n for (const next of sorted) {\n const prev = out[out.length - 1]\n if (prev && isPrefixOf(prev, next)) continue\n out.push(next)\n }\n return out\n}\n\nexport const makeFieldPathIdRegistry = (fieldPaths: ReadonlyArray<FieldPath>): FieldPathIdRegistry => {\n const root: FieldPathTrieNode = { children: new Map() }\n const pathStringToId = new Map<string, FieldPathId>()\n const ambiguousPathStrings = new Set<string>()\n\n for (let id = 0; id < fieldPaths.length; id++) {\n const path = fieldPaths[id]!\n let node = root\n for (const seg of path) {\n const children = node.children\n let next = children.get(seg)\n if (!next) {\n next = { children: new Map() }\n children.set(seg, next)\n }\n node = next\n }\n node.id = id\n\n if (path.length > 0 && path.some((seg) => seg.includes('.'))) {\n const key = path.join('.')\n ambiguousPathStrings.add(key)\n pathStringToId.delete(key)\n }\n\n if (path.length > 0 && path.every((seg) => !seg.includes('.') && !seg.includes('[') && !seg.includes(']'))) {\n const key = path.join('.')\n if (ambiguousPathStrings.has(key)) continue\n if (pathStringToId.has(key)) {\n ambiguousPathStrings.add(key)\n pathStringToId.delete(key)\n continue\n }\n pathStringToId.set(key, id)\n }\n }\n\n return { fieldPaths, root, pathStringToId }\n}\n\nexport const getFieldPathId = (registry: FieldPathIdRegistry, path: FieldPath): FieldPathId | undefined => {\n let node = registry.root\n for (const seg of path) {\n const next = node.children.get(seg)\n if (!next) return undefined\n node = next\n }\n return node.id\n}\n\nexport const getFieldPathIdFromString = (registry: FieldPathIdRegistry, path: string): FieldPathId | undefined => {\n if (!path || path === '*') return undefined\n const normalized = normalizeFieldPath(path)\n if (!normalized) return undefined\n return getFieldPathId(registry, normalized)\n}\n\nexport const hashFieldPathIds = (ids: ReadonlyArray<number>): number => {\n // FNV-1a (32-bit)\n let hash = 2166136261 >>> 0\n for (const id of ids) {\n hash ^= id >>> 0\n hash = Math.imul(hash, 16777619)\n }\n return hash >>> 0\n}\n\nexport const dirtyPathsToRootIds = (options: {\n readonly dirtyPaths?: Iterable<string | FieldPath | FieldPathId>\n readonly registry: FieldPathIdRegistry\n readonly dirtyAllReason?: DirtyAllReason\n}): DirtySet => {\n if (options.dirtyAllReason) {\n return {\n dirtyAll: true,\n reason: options.dirtyAllReason,\n rootIds: [],\n rootCount: 0,\n keySize: 0,\n keyHash: 0,\n }\n }\n\n let sawStar = false\n let hasInvalid = false\n let missing = false\n\n const ids: Array<number> = []\n for (const raw of options.dirtyPaths ?? []) {\n if (raw === '*') {\n sawStar = true\n continue\n }\n\n if (typeof raw === 'number') {\n if (!Number.isFinite(raw)) {\n hasInvalid = true\n continue\n }\n const id = Math.floor(raw)\n if (id < 0) {\n hasInvalid = true\n continue\n }\n if (!options.registry.fieldPaths[id]) {\n missing = true\n continue\n }\n ids.push(id)\n continue\n }\n\n if (typeof raw === 'string') {\n const direct = options.registry.pathStringToId?.get(raw)\n if (direct != null) {\n ids.push(direct)\n continue\n }\n\n // String path is treated as dot-separated boundary input only.\n // If it cannot be mapped directly, it is considered ambiguous/unmappable.\n missing = true\n continue\n }\n\n const normalized = normalizeFieldPath(raw)\n if (!normalized) {\n hasInvalid = true\n continue\n }\n\n const id = getFieldPathId(options.registry, normalized)\n if (id == null) {\n missing = true\n continue\n }\n ids.push(id)\n }\n\n if (hasInvalid) {\n return {\n dirtyAll: true,\n reason: 'nonTrackablePatch',\n rootIds: [],\n rootCount: 0,\n keySize: 0,\n keyHash: 0,\n }\n }\n\n if (missing) {\n return {\n dirtyAll: true,\n reason: 'fallbackPolicy',\n rootIds: [],\n rootCount: 0,\n keySize: 0,\n keyHash: 0,\n }\n }\n\n // Any non-trackable write must explicitly degrade (do not \"ignore *\" when roots exist).\n if (sawStar) {\n return {\n dirtyAll: true,\n reason: 'unknownWrite',\n rootIds: [],\n rootCount: 0,\n keySize: 0,\n keyHash: 0,\n }\n }\n\n const fieldPathsById = options.registry.fieldPaths\n ids.sort((a, b) => {\n const ap = fieldPathsById[a]\n const bp = fieldPathsById[b]\n if (!ap || !bp) return a - b\n const cmp = compareFieldPath(ap, bp)\n return cmp !== 0 ? cmp : a - b\n })\n\n const rootIds: Array<number> = []\n let prev: FieldPath | undefined\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i]!\n const path = fieldPathsById[id]\n if (!path) continue\n if (prev && isPrefixOf(prev, path)) continue\n rootIds.push(id)\n prev = path\n }\n\n const hasSpecific = rootIds.length > 0\n\n if (!hasSpecific) {\n return {\n dirtyAll: true,\n reason: 'unknownWrite',\n rootIds: [],\n rootCount: 0,\n keySize: 0,\n keyHash: 0,\n }\n }\n\n rootIds.sort((a, b) => a - b)\n\n const keyHash = hashFieldPathIds(rootIds)\n return {\n dirtyAll: false,\n rootIds,\n rootCount: rootIds.length,\n keySize: rootIds.length,\n keyHash,\n }\n}\n\nconst splitSegments = (path: string): Array<string> | undefined => {\n if (!path) return undefined\n if (path === '*') return undefined\n\n const parts = path.split('.').filter((p) => p.length > 0)\n const segs: Array<string> = []\n\n for (const part of parts) {\n if (!part) continue\n if (part === '*') {\n return undefined\n }\n if (part.endsWith('[]')) {\n const base = part.slice(0, -2)\n if (base) segs.push(base)\n continue\n }\n const bracket = /^(.+)\\[(\\d+)\\]$/.exec(part)\n if (bracket) {\n segs.push(bracket[1]!)\n continue\n }\n if (/^\\d+$/.test(part)) {\n continue\n }\n if (part.includes('[') || part.includes(']')) {\n return undefined\n }\n segs.push(part)\n }\n\n return segs\n}\n","import { Effect, Stream, Ref, Option } from 'effect'\nimport type { AnyModuleShape, ModuleRuntime, StateOf, ActionOf, ModuleShape } from './module.js'\nimport type * as Logic from './LogicMiddleware.js'\nimport * as EffectOp from '../../effect-op.js'\nimport * as EffectOpCore from './EffectOpCore.js'\nimport { RunSessionTag } from '../../observability/runSession.js'\nimport type { RuntimeInternals } from './RuntimeInternals.js'\nimport * as Debug from './DebugSink.js'\nimport * as ReadQuery from './ReadQuery.js'\n\nconst getMiddlewareStack = (): Effect.Effect<EffectOp.MiddlewareStack, never, any> =>\n Effect.serviceOption(EffectOpCore.EffectOpMiddlewareTag).pipe(\n Effect.map((maybe) => (Option.isSome(maybe) ? maybe.value.stack : [])),\n )\n\nconst getRuntimeScope = (runtime: unknown): { readonly moduleId?: string; readonly instanceId?: string } => {\n if (!runtime) return {}\n if (typeof runtime !== 'object' && typeof runtime !== 'function') return {}\n const scope = runtime as { readonly moduleId?: unknown; readonly instanceId?: unknown }\n return {\n moduleId: typeof scope.moduleId === 'string' ? scope.moduleId : undefined,\n instanceId: typeof scope.instanceId === 'string' ? scope.instanceId : undefined,\n }\n}\n\nexport interface Api<Sh extends ModuleShape<any, any>, R = never> {\n readonly fromAction: <T extends ActionOf<Sh>>(predicate: (a: ActionOf<Sh>) => a is T) => Stream.Stream<T>\n\n readonly fromState: {\n <V>(selector: (s: StateOf<Sh>) => V): Stream.Stream<V>\n <V>(query: ReadQuery.ReadQuery<StateOf<Sh>, V>): Stream.Stream<V>\n }\n\n readonly debounce: <V>(ms: number) => (stream: Stream.Stream<V>) => Stream.Stream<V>\n\n readonly throttle: <V>(ms: number) => (stream: Stream.Stream<V>) => Stream.Stream<V>\n\n readonly filter: <V>(predicate: (value: V) => boolean) => (stream: Stream.Stream<V>) => Stream.Stream<V>\n\n readonly run: <V, A = void, E = never, R2 = unknown>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((payload: V) => Logic.Of<Sh, R & R2, A, E>),\n options?: Logic.OperationOptions,\n ) => (stream: Stream.Stream<V>) => Effect.Effect<void, E, Logic.Env<Sh, R & R2>>\n\n readonly runParallel: <V, A = void, E = never, R2 = unknown>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((payload: V) => Logic.Of<Sh, R & R2, A, E>),\n options?: Logic.OperationOptions,\n ) => (stream: Stream.Stream<V>) => Effect.Effect<void, E, Logic.Env<Sh, R & R2>>\n\n readonly runLatest: <V, A = void, E = never, R2 = unknown>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((payload: V) => Logic.Of<Sh, R & R2, A, E>),\n options?: Logic.OperationOptions,\n ) => (stream: Stream.Stream<V>) => Effect.Effect<void, E, Logic.Env<Sh, R & R2>>\n\n readonly runExhaust: <V, A = void, E = never, R2 = unknown>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((payload: V) => Logic.Of<Sh, R & R2, A, E>),\n options?: Logic.OperationOptions,\n ) => (stream: Stream.Stream<V>) => Effect.Effect<void, E, Logic.Env<Sh, R & R2>>\n}\n\nconst resolveEffect = <T, Sh extends AnyModuleShape, R, A, E>(\n eff: Logic.Of<Sh, R, A, E> | ((payload: T) => Logic.Of<Sh, R, A, E>),\n payload: T,\n): Logic.Of<Sh, R, A, E> => (typeof eff === 'function' ? (eff as (p: T) => Logic.Of<Sh, R, A, E>)(payload) : eff)\n\nexport const make = <Sh extends AnyModuleShape, R = never>(\n runtime: ModuleRuntime<StateOf<Sh>, ActionOf<Sh>>,\n runtimeInternals?: RuntimeInternals,\n): Api<Sh, R> => {\n const scope = getRuntimeScope(runtime)\n const resolveConcurrencyLimit = (): Effect.Effect<number | 'unbounded', never, any> =>\n runtimeInternals\n ? runtimeInternals.concurrency.resolveConcurrencyPolicy().pipe(Effect.map((p) => p.concurrencyLimit))\n : Effect.succeed(16)\n\n const runAsFlowOp = <A, E, R2, V>(\n name: string,\n payload: V,\n eff: Effect.Effect<A, E, Logic.Env<Sh, R & R2>>,\n options?: Logic.OperationOptions,\n ): Effect.Effect<A, E, Logic.Env<Sh, R & R2>> =>\n Effect.gen(function* () {\n const stack = yield* getMiddlewareStack()\n const meta: any = {\n ...(options?.meta ?? {}),\n policy: options?.policy,\n tags: options?.tags,\n trace: options?.trace,\n moduleId: scope.moduleId,\n instanceId: scope.instanceId,\n }\n\n if (!(typeof meta.opSeq === 'number' && Number.isFinite(meta.opSeq))) {\n const sessionOpt = yield* Effect.serviceOption(RunSessionTag)\n if (Option.isSome(sessionOpt)) {\n const key = meta.instanceId ?? 'global'\n meta.opSeq = sessionOpt.value.local.nextSeq('opSeq', key)\n }\n }\n\n const op = EffectOp.make<A, E, any>({\n kind: 'flow',\n name,\n payload,\n effect: eff as any,\n meta,\n })\n return yield* EffectOp.run(op, stack)\n }) as any\n\n const runEffect =\n <T, A, E, R2>(eff: Logic.Of<Sh, R & R2, A, E> | ((payload: T) => Logic.Of<Sh, R & R2, A, E>)) =>\n (payload: T) =>\n resolveEffect<T, Sh, R & R2, A, E>(eff, payload)\n\n const runStreamSequential =\n <T, A, E, R2>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((payload: T) => Logic.Of<Sh, R & R2, A, E>),\n options?: Logic.OperationOptions,\n ) =>\n (stream: Stream.Stream<T>): Effect.Effect<void, E, Logic.Env<Sh, R & R2>> =>\n Stream.runForEach(stream, (payload) =>\n runAsFlowOp<A, E, R2, T>('flow.run', payload, runEffect<T, A, E, R2>(eff)(payload), options),\n )\n\n const runStreamParallel =\n <T, A, E, R2>(\n eff: Logic.Of<Sh, R & R2, A, E> | ((payload: T) => Logic.Of<Sh, R & R2, A, E>),\n options?: Logic.OperationOptions,\n ) =>\n (stream: Stream.Stream<T>): Effect.Effect<void, E, Logic.Env<Sh, R & R2>> =>\n Effect.gen(function* () {\n const concurrency = yield* resolveConcurrencyLimit()\n\n return yield* Stream.runDrain(\n stream.pipe(\n Stream.mapEffect(\n (payload) =>\n runAsFlowOp<A, E, R2, T>('flow.runParallel', payload, runEffect<T, A, E, R2>(eff)(payload), options),\n { concurrency },\n ),\n ),\n ).pipe(\n Effect.catchAllCause((cause) =>\n Debug.record({\n type: 'diagnostic',\n moduleId: scope.moduleId,\n instanceId: scope.instanceId,\n code: 'flow::unhandled_failure',\n severity: 'error',\n message: 'Flow watcher (runParallel) failed with an unhandled error.',\n hint: 'Handle errors explicitly inside the watcher (catch/catchAll) or write back via TaskRunner failure; avoid silent failures.',\n kind: 'flow_unhandled_failure',\n trigger: {\n kind: 'flow',\n name: 'runParallel',\n },\n }).pipe(Effect.zipRight(Effect.failCause(cause))),\n ),\n )\n }) as any\n\n return {\n fromAction: <T extends ActionOf<Sh>>(predicate: (a: ActionOf<Sh>) => a is T) =>\n runtime.actions$.pipe(Stream.filter(predicate)),\n\n fromState: <V>(selectorOrQuery: ((s: StateOf<Sh>) => V) | ReadQuery.ReadQuery<StateOf<Sh>, V>) =>\n runtime.changes(ReadQuery.isReadQuery(selectorOrQuery) ? selectorOrQuery.select : selectorOrQuery),\n\n debounce: (ms: number) => (stream) => Stream.debounce(stream, ms),\n\n throttle: (ms: number) => (stream) =>\n Stream.throttle(stream, {\n cost: () => 1,\n units: 1,\n duration: ms,\n strategy: 'enforce',\n }),\n\n filter: (predicate: (value: any) => boolean) => (stream) => Stream.filter(stream, predicate),\n\n run: (eff, options) => (stream) => runStreamSequential<any, any, any, any>(eff, options)(stream),\n\n runParallel: (eff, options) => (stream) => runStreamParallel<any, any, any, any>(eff, options)(stream),\n\n runLatest: (eff, options) => (stream) =>\n Stream.runDrain(\n Stream.map(stream, (payload) =>\n runAsFlowOp<any, any, any, any>(\n 'flow.runLatest',\n payload,\n runEffect<any, any, any, any>(eff)(payload),\n options,\n ),\n ).pipe(\n Stream.flatMap((effect) => Stream.fromEffect(effect), {\n switch: true,\n }),\n ),\n ),\n\n runExhaust: (eff, options) => (stream) =>\n Effect.gen(function* () {\n const concurrency = yield* resolveConcurrencyLimit()\n const busyRef = yield* Ref.make(false)\n const mapper = (payload: any) =>\n Effect.gen(function* () {\n const acquired = yield* Ref.modify(busyRef, (busy) =>\n busy ? ([false, busy] as const) : ([true, true] as const),\n )\n if (!acquired) {\n return\n }\n try {\n yield* runAsFlowOp<any, any, any, any>(\n 'flow.runExhaust',\n payload,\n runEffect<any, any, any, any>(eff)(payload),\n options,\n )\n } finally {\n yield* Ref.set(busyRef, false)\n }\n })\n\n return yield* Stream.runDrain(stream.pipe(Stream.mapEffect(mapper, { concurrency })))\n }),\n }\n}\n","// Internal EffectOp API (for internal implementation code).\n//\n// Goal:\n// - Internal modules must never import root public submodules (e.g. `../EffectOp`).\n// - This file hosts the shared implementation; public `src/EffectOp.ts` delegates to it.\n\nimport { Effect, Option } from 'effect'\nimport * as Core from './runtime/core/EffectOpCore.js'\nimport { RunSessionTag } from './observability/runSession.js'\n\nexport type EffectOp<Out = unknown, Err = unknown, Env = unknown> = Core.EffectOp<Out, Err, Env>\n\nexport type OperationPolicy = Core.OperationPolicy\n\nexport type OperationRejected = Core.OperationRejected\n\nexport type OperationError<E> = Core.OperationError<E>\n\nexport type Middleware = Core.Middleware\n\nexport type MiddlewareStack = Core.MiddlewareStack\n\nexport const composeMiddleware = Core.composeMiddleware\n\nexport const makeOperationRejected = Core.makeOperationRejected\n\n/**\n * Generate a stable id for identifying an EffectOp.\n * - Uses a monotonic sequence by default to avoid non-replayability from randomness/time.\n * - If meta.instanceId is available, prefer deriving `${instanceId}::o${opSeq}`.\n */\nlet nextGlobalOpSeq = 0\n\nconst nextOpSeq = (): number => {\n nextGlobalOpSeq += 1\n return nextGlobalOpSeq\n}\n\nconst makeId = (instanceId: string | undefined, opSeq: number): string =>\n instanceId ? `${instanceId}::o${opSeq}` : `o${opSeq}`\n\n/**\n * EffectOp.make:\n * - Create an EffectOp with basic meta.\n * - Generates a stable id by default (based on `instanceId` + monotonic `opSeq`); callers may override externally.\n */\nexport const make = <A, E, R>(params: {\n readonly kind: EffectOp['kind']\n readonly name: string\n readonly effect: Effect.Effect<A, E, R>\n readonly payload?: unknown\n readonly meta?: EffectOp['meta']\n readonly id?: string\n}): EffectOp<A, E, R> => ({\n ...(params.id\n ? { id: params.id, meta: params.meta }\n : (() => {\n const meta: any = params.meta ?? {}\n const instanceId: string | undefined = meta.instanceId\n const opSeq: number =\n typeof meta.opSeq === 'number' && Number.isFinite(meta.opSeq) ? Math.floor(meta.opSeq) : nextOpSeq()\n return {\n id: makeId(instanceId, opSeq),\n meta: meta.opSeq === opSeq ? meta : { ...meta, opSeq },\n }\n })()),\n kind: params.kind,\n name: params.name,\n payload: params.payload,\n effect: params.effect,\n})\n\n/**\n * EffectOp.makeInRunSession:\n * - Allocate a stable `opSeq` within a RunSession scope (per-session + per-instance).\n * - If RunSession is missing from Env, fall back to a process-wide monotonic sequence (no process-wide Map).\n */\nexport const makeInRunSession = <A, E, R>(params: {\n readonly kind: EffectOp['kind']\n readonly name: string\n readonly effect: Effect.Effect<A, E, R>\n readonly payload?: unknown\n readonly meta?: EffectOp['meta']\n readonly id?: string\n}): Effect.Effect<EffectOp<A, E, R>, never, any> =>\n Effect.gen(function* () {\n if (params.id) {\n return {\n id: params.id,\n kind: params.kind,\n name: params.name,\n payload: params.payload,\n meta: params.meta,\n effect: params.effect,\n } satisfies EffectOp<A, E, R>\n }\n\n const meta: any = params.meta ?? {}\n const instanceId: string | undefined = meta.instanceId\n\n let opSeq: number\n if (typeof meta.opSeq === 'number' && Number.isFinite(meta.opSeq)) {\n opSeq = Math.floor(meta.opSeq)\n } else {\n const sessionOpt = yield* Effect.serviceOption(RunSessionTag)\n if (Option.isSome(sessionOpt)) {\n const key = instanceId ?? 'global'\n opSeq = sessionOpt.value.local.nextSeq('opSeq', key)\n } else {\n opSeq = nextOpSeq()\n }\n }\n\n return {\n id: makeId(instanceId, opSeq),\n kind: params.kind,\n name: params.name,\n payload: params.payload,\n meta: meta.opSeq === opSeq ? meta : { ...meta, opSeq },\n effect: params.effect,\n } satisfies EffectOp<A, E, R>\n })\n\n/**\n * EffectOp.withMeta:\n * - Append or override meta fields on an existing EffectOp.\n * - Does not change the effect itself.\n */\nexport const withMeta = <A, E, R>(\n op: EffectOp<A, E, R>,\n meta: Partial<NonNullable<EffectOp['meta']>>,\n): EffectOp<A, E, R> => ({\n ...op,\n meta: { ...(op.meta ?? {}), ...meta },\n})\n\n/**\n * EffectOp.run:\n * - Execute an EffectOp using the given MiddlewareStack.\n * - If the stack is empty, return op.effect directly.\n */\nexport const run = <A, E, R>(op: EffectOp<A, E, R>, stack: MiddlewareStack): Effect.Effect<A, E, R> =>\n Core.runWithMiddleware(op, stack)\n","import { Context, Layer } from 'effect'\nimport type { JsonValue } from './jsonValue.js'\nimport type { EvidencePackage, EvidencePackageSource, ObservationEnvelope } from './evidence.js'\nimport { exportEvidencePackage, OBSERVABILITY_PROTOCOL_VERSION } from './evidence.js'\n\nexport type RunId = string\n\nexport interface RunSessionLocalState {\n /**\n * once: a de-dup key set for \"emit only once\" behavior (must be isolated per session to avoid cross-session pollution).\n * Returns true if it's the first occurrence, false if the key has been seen before.\n */\n readonly once: (key: string) => boolean\n\n /**\n * seq: allocate monotonic sequences by key (e.g. opSeq/eventSeq), must be isolated per session.\n */\n readonly nextSeq: (namespace: string, key: string) => number\n\n /** Tests/reset only: clear this session's local state. */\n readonly clear: () => void\n}\n\nexport interface RunSession {\n readonly runId: RunId\n readonly source: EvidencePackageSource\n readonly startedAt: number\n readonly local: RunSessionLocalState\n}\n\nclass RunSessionTagImpl extends Context.Tag('@logixjs/core/RunSession')<RunSessionTagImpl, RunSession>() {}\n\nexport const RunSessionTag = RunSessionTagImpl\n\nexport interface EvidenceSink {\n readonly record: (type: string, payload: JsonValue, options?: { readonly timestamp?: number }) => void\n readonly export: (options?: {\n readonly protocolVersion?: string\n readonly createdAt?: number\n readonly summary?: JsonValue\n readonly maxEvents?: number\n }) => EvidencePackage\n readonly clear: () => void\n}\n\nconst NEXT_RUN_SEQ_KEY = Symbol.for('@logixjs/core/runSession/nextRunSeq')\nlet fallbackNextRunSeq = 0\n\nconst nextRunSeq = (): number => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const g: any = globalThis as any\n const prev = typeof g[NEXT_RUN_SEQ_KEY] === 'number' ? (g[NEXT_RUN_SEQ_KEY] as number) : 0\n const next = prev + 1\n g[NEXT_RUN_SEQ_KEY] = next\n return next\n } catch {\n fallbackNextRunSeq += 1\n return fallbackNextRunSeq\n }\n}\n\nconst makeRunId = (startedAt: number): RunId => `run-${startedAt}.${nextRunSeq()}`\n\nexport const makeRunSessionLocalState = (): RunSessionLocalState => {\n const onceKeys = new Set<string>()\n const seqByNamespace = new Map<string, Map<string, number>>()\n\n return {\n once: (key) => {\n if (onceKeys.has(key)) return false\n onceKeys.add(key)\n return true\n },\n nextSeq: (namespace, key) => {\n const byKey = seqByNamespace.get(namespace) ?? new Map<string, number>()\n if (!seqByNamespace.has(namespace)) seqByNamespace.set(namespace, byKey)\n const prev = byKey.get(key) ?? 0\n const next = prev + 1\n byKey.set(key, next)\n return next\n },\n clear: () => {\n onceKeys.clear()\n seqByNamespace.clear()\n },\n }\n}\n\nexport const makeRunSession = (options?: {\n readonly runId?: RunId\n readonly source?: EvidencePackageSource\n readonly startedAt?: number\n readonly local?: RunSessionLocalState\n}): RunSession => {\n const startedAt = options?.startedAt ?? Date.now()\n return {\n runId: options?.runId ?? makeRunId(startedAt),\n source: options?.source ?? { host: 'unknown' },\n startedAt,\n local: options?.local ?? makeRunSessionLocalState(),\n }\n}\n\nexport const makeEvidenceSink = (session: RunSession): EvidenceSink => {\n const events: ObservationEnvelope[] = []\n let nextSeq = 1\n\n return {\n record: (type, payload, options) => {\n events.push({\n protocolVersion: OBSERVABILITY_PROTOCOL_VERSION,\n runId: session.runId,\n seq: nextSeq++,\n timestamp: options?.timestamp ?? Date.now(),\n type,\n payload,\n })\n },\n export: (options) => {\n const protocolVersion = options?.protocolVersion ?? OBSERVABILITY_PROTOCOL_VERSION\n const maxEvents = options?.maxEvents\n\n const selected =\n typeof maxEvents === 'number' && Number.isFinite(maxEvents) && maxEvents > 0\n ? events.slice(Math.max(0, events.length - Math.floor(maxEvents)))\n : events.slice()\n\n return exportEvidencePackage({\n protocolVersion,\n runId: session.runId,\n source: session.source,\n createdAt: options?.createdAt,\n events: selected,\n summary: options?.summary,\n })\n },\n clear: () => {\n events.length = 0\n nextSeq = 1\n },\n }\n}\n\nexport const runSessionLayer = (session?: RunSession): Layer.Layer<RunSessionTagImpl, never, never> =>\n Layer.succeed(RunSessionTag, session ?? makeRunSession()) as Layer.Layer<RunSessionTagImpl, never, never>\n","import { fnv1a32, stableStringify } from '../../digest.js'\nimport type * as DebugSink from './DebugSink.js'\n\nexport type ReadLane = 'static' | 'dynamic'\n\nexport type ReadProducer = 'aot' | 'jit' | 'manual' | 'dynamic'\n\nexport type ReadQueryFallbackReason = 'missingDeps' | 'unsupportedSyntax' | 'unstableSelectorId'\n\nexport type EqualsKind = 'objectIs' | 'shallowStruct' | 'custom'\n\nexport interface ReadsDigest {\n readonly count: number\n readonly hash: number\n}\n\nexport interface ReadQueryStaticIr {\n readonly selectorId: string\n readonly debugKey?: string\n readonly lane: ReadLane\n readonly producer: ReadProducer\n readonly reads?: ReadonlyArray<string | number>\n readonly readsDigest?: ReadsDigest\n readonly fallbackReason?: ReadQueryFallbackReason\n readonly equalsKind: EqualsKind\n}\n\nexport interface ReadQuery<S, V> {\n readonly selectorId: string\n readonly debugKey?: string\n readonly reads: ReadonlyArray<string | number>\n readonly select: (state: S) => V\n readonly equalsKind: EqualsKind\n readonly equals?: (previous: V, next: V) => boolean\n}\n\nexport interface ReadQueryCompiled<S, V> extends ReadQuery<S, V> {\n readonly lane: ReadLane\n readonly producer: ReadProducer\n readonly readsDigest?: ReadsDigest\n readonly fallbackReason?: ReadQueryFallbackReason\n readonly staticIr: ReadQueryStaticIr\n}\n\nexport type ReadQueryInput<S, V> = ((state: S) => V) | ReadQuery<S, V>\n\nexport function isReadQuery<S, V>(input: ReadQueryInput<S, V>): input is ReadQuery<S, V>\nexport function isReadQuery(input: unknown): input is ReadQuery<any, any>\nexport function isReadQuery(input: unknown): input is ReadQuery<any, any> {\n if (!input || (typeof input !== 'object' && typeof input !== 'function')) return false\n const maybe = input as any\n return typeof maybe.selectorId === 'string' && typeof maybe.select === 'function' && Array.isArray(maybe.reads)\n}\n\nconst normalizeReads = (reads: ReadonlyArray<string | number>): ReadonlyArray<string | number> => {\n const unique: Array<string | number> = []\n const seen = new Set<string>()\n for (const r of reads) {\n const key = typeof r === 'number' ? `n:${r}` : `s:${r}`\n if (seen.has(key)) continue\n seen.add(key)\n unique.push(r)\n }\n return unique.slice().sort((a, b) => String(a).localeCompare(String(b)))\n}\n\nconst toHash32Number = (hex: string): number => Number.parseInt(hex, 16)\n\nconst makeReadsDigest = (reads: ReadonlyArray<string | number>): ReadsDigest => {\n const normalized = normalizeReads(reads)\n return {\n count: normalized.length,\n hash: toHash32Number(fnv1a32(stableStringify(normalized))),\n }\n}\n\nconst computeSelectorId = (value: unknown): string => `rq_${fnv1a32(stableStringify(value))}`\n\nlet nextUnstableSelectorSeq = 0\nconst unstableSelectorIdByFn = new WeakMap<Function, string>()\n\nconst computeUnstableSelectorId = (selector: Function): string => {\n const existing = unstableSelectorIdByFn.get(selector)\n if (existing) return existing\n nextUnstableSelectorSeq += 1\n const selectorId = `rq_u${nextUnstableSelectorSeq}`\n unstableSelectorIdByFn.set(selector, selectorId)\n return selectorId\n}\n\nconst unwrapParens = (input: string): string => {\n const trimmed = input.trim()\n if (trimmed.startsWith('(') && trimmed.endsWith(')')) {\n const inner = trimmed.slice(1, -1).trim()\n // Only unwrap the outermost pair of parentheses to avoid accidentally breaking syntax.\n if (!inner.startsWith('(') || !inner.endsWith(')')) {\n return inner\n }\n }\n return trimmed\n}\n\nconst extractArrow = (source: string): { readonly param: string; readonly body: string } | undefined => {\n const idx = source.indexOf('=>')\n if (idx < 0) return undefined\n const left = source.slice(0, idx).trim()\n const right = source.slice(idx + 2).trim()\n\n const paramRaw = unwrapParens(left)\n if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(paramRaw)) return undefined\n\n // block body: { return expr }\n if (right.startsWith('{')) {\n const m = right.match(/^\\{\\s*return\\s+(.+?);?\\s*\\}\\s*$/s)\n if (!m) return undefined\n return { param: paramRaw, body: m[1]?.trim() ?? '' }\n }\n\n return { param: paramRaw, body: right }\n}\n\nconst extractFunctionReturn = (source: string): { readonly param: string; readonly body: string } | undefined => {\n const trimmed = source.trim()\n const m = trimmed.match(\n /^function\\s*(?:[A-Za-z_$][A-Za-z0-9_$]*\\s*)?\\(\\s*([A-Za-z_$][A-Za-z0-9_$]*)\\s*\\)\\s*\\{\\s*return\\s+(.+?);?\\s*\\}\\s*$/s,\n )\n if (!m) return undefined\n\n const param = m[1]?.trim() ?? ''\n if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(param)) return undefined\n\n const body = m[2]?.trim() ?? ''\n if (body.length === 0) return undefined\n\n return { param, body }\n}\n\ntype ParsedSelector =\n | { readonly kind: 'path'; readonly path: string }\n | { readonly kind: 'struct'; readonly entries: ReadonlyArray<readonly [string, string]> }\n\nconst tryParseSelectorSource = (source: string): ParsedSelector | undefined => {\n const arrowOrFn = extractArrow(source) ?? extractFunctionReturn(source)\n if (!arrowOrFn) return undefined\n\n const expr = unwrapParens(arrowOrFn.body).trim().replace(/;$/, '').trim()\n\n // path: s.a.b\n {\n const re = new RegExp(`^${arrowOrFn.param}\\\\.([A-Za-z0-9_$]+(?:\\\\.[A-Za-z0-9_$]+)*)$`)\n const m = expr.match(re)\n if (m) {\n return { kind: 'path', path: m[1] }\n }\n }\n\n // struct: ({ a: s.a, b: s.b })\n if (expr.startsWith('{') && expr.endsWith('}')) {\n const inner = expr.slice(1, -1).trim()\n if (inner.length === 0) return { kind: 'struct', entries: [] }\n\n const parts = inner\n .split(',')\n .map((p) => p.trim())\n .filter((p) => p.length > 0)\n\n const entries: Array<readonly [string, string]> = []\n\n for (const part of parts) {\n const idx = part.indexOf(':')\n if (idx < 0) return undefined\n const key = part.slice(0, idx).trim()\n const value = part.slice(idx + 1).trim()\n\n if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) return undefined\n\n const re = new RegExp(`^${arrowOrFn.param}\\\\.([A-Za-z0-9_$]+(?:\\\\.[A-Za-z0-9_$]+)*)$`)\n const m = value.match(re)\n if (!m) return undefined\n entries.push([key, m[1]] as const)\n }\n\n // Sort entries to ensure a stable selectorId.\n entries.sort((a, b) => a[0].localeCompare(b[0]))\n return { kind: 'struct', entries }\n }\n\n return undefined\n}\n\ntype ReadQueryStaticTemplate = {\n readonly selectorId: string\n readonly reads: ReadonlyArray<string | number>\n readonly readsDigest: ReadsDigest\n readonly equalsKind: EqualsKind\n}\n\nconst READ_QUERY_TEMPLATE_CACHE_MAX = 2048\nconst readQueryTemplateByFn = new WeakMap<Function, ReadQueryStaticTemplate>()\nconst readQueryTemplateBySource = new Map<string, ReadQueryStaticTemplate>()\n\nconst lruGet = <K, V>(map: Map<K, V>, key: K): V | undefined => {\n const value = map.get(key)\n if (value === undefined) return undefined\n map.delete(key)\n map.set(key, value)\n return value\n}\n\nconst lruSet = <K, V>(map: Map<K, V>, key: K, value: V, maxSize: number) => {\n if (map.has(key)) map.delete(key)\n map.set(key, value)\n if (map.size <= maxSize) return\n const oldestKey = map.keys().next().value as K | undefined\n if (oldestKey !== undefined) {\n map.delete(oldestKey)\n }\n}\n\nconst safeToString = (fn: Function): string => {\n try {\n return fn.toString()\n } catch {\n return ''\n }\n}\n\nexport const make = <S, V>(spec: ReadQuery<S, V>): ReadQuery<S, V> => spec\n\nexport const compile = <S, V>(input: ReadQueryInput<S, V>): ReadQueryCompiled<S, V> => {\n if (isReadQuery(input)) {\n const reads = normalizeReads(input.reads)\n const readsDigest = reads.length > 0 ? makeReadsDigest(reads) : undefined\n\n const equalsKind = input.equalsKind\n const staticIr: ReadQueryStaticIr = {\n selectorId: input.selectorId,\n debugKey: input.debugKey,\n lane: 'static',\n producer: 'manual',\n reads,\n readsDigest,\n equalsKind,\n }\n\n return {\n ...input,\n reads,\n lane: 'static',\n producer: 'manual',\n readsDigest,\n staticIr,\n }\n }\n\n const selector = input\n const debugKey =\n (typeof (selector as any)?.debugKey === 'string' && (selector as any).debugKey.length > 0\n ? (selector as any).debugKey\n : undefined) ??\n (typeof (selector as any).name === 'string' && (selector as any).name.length > 0\n ? (selector as any).name\n : undefined)\n\n const declaredReads: ReadonlyArray<string> | undefined = Array.isArray((selector as any)?.fieldPaths)\n ? ((selector as any).fieldPaths as ReadonlyArray<unknown>).filter((x): x is string => typeof x === 'string')\n : undefined\n\n if (declaredReads && declaredReads.length > 0) {\n const reads = normalizeReads(declaredReads)\n const readsDigest = makeReadsDigest(reads)\n const selectorId = computeSelectorId({ kind: 'reads', reads })\n\n const staticIr: ReadQueryStaticIr = {\n selectorId,\n debugKey,\n lane: 'static',\n producer: 'jit',\n reads,\n readsDigest,\n equalsKind: 'objectIs',\n }\n\n return {\n selectorId,\n debugKey,\n reads,\n select: selector as any,\n equalsKind: 'objectIs',\n lane: 'static',\n producer: 'jit',\n readsDigest,\n staticIr,\n }\n }\n\n const cachedByFn = readQueryTemplateByFn.get(selector as unknown as Function)\n if (cachedByFn) {\n const staticIr: ReadQueryStaticIr = {\n selectorId: cachedByFn.selectorId,\n debugKey,\n lane: 'static',\n producer: 'jit',\n reads: cachedByFn.reads,\n readsDigest: cachedByFn.readsDigest,\n equalsKind: cachedByFn.equalsKind,\n }\n\n return {\n selectorId: cachedByFn.selectorId,\n debugKey,\n reads: cachedByFn.reads,\n select: selector as any,\n equalsKind: cachedByFn.equalsKind,\n lane: 'static',\n producer: 'jit',\n readsDigest: cachedByFn.readsDigest,\n staticIr,\n }\n }\n\n const srcTrimmed = safeToString(selector as unknown as Function).trim()\n const cachedBySource = srcTrimmed.length > 0 ? lruGet(readQueryTemplateBySource, srcTrimmed) : undefined\n if (cachedBySource) {\n readQueryTemplateByFn.set(selector as unknown as Function, cachedBySource)\n const staticIr: ReadQueryStaticIr = {\n selectorId: cachedBySource.selectorId,\n debugKey,\n lane: 'static',\n producer: 'jit',\n reads: cachedBySource.reads,\n readsDigest: cachedBySource.readsDigest,\n equalsKind: cachedBySource.equalsKind,\n }\n\n return {\n selectorId: cachedBySource.selectorId,\n debugKey,\n reads: cachedBySource.reads,\n select: selector as any,\n equalsKind: cachedBySource.equalsKind,\n lane: 'static',\n producer: 'jit',\n readsDigest: cachedBySource.readsDigest,\n staticIr,\n }\n }\n\n const parsed = srcTrimmed.length > 0 ? tryParseSelectorSource(srcTrimmed) : undefined\n\n if (parsed?.kind === 'path') {\n const reads = [parsed.path]\n const readsDigest = makeReadsDigest(reads)\n const selectorId = computeSelectorId({ kind: 'path', path: parsed.path })\n const template: ReadQueryStaticTemplate = { selectorId, reads, readsDigest, equalsKind: 'objectIs' }\n readQueryTemplateByFn.set(selector as unknown as Function, template)\n lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX)\n\n const staticIr: ReadQueryStaticIr = {\n selectorId,\n debugKey,\n lane: 'static',\n producer: 'jit',\n reads,\n readsDigest,\n equalsKind: 'objectIs',\n }\n\n return {\n selectorId,\n debugKey,\n reads,\n select: selector as any,\n equalsKind: 'objectIs',\n lane: 'static',\n producer: 'jit',\n readsDigest,\n staticIr,\n }\n }\n\n if (parsed?.kind === 'struct') {\n const reads = normalizeReads(parsed.entries.map(([, path]) => path))\n const readsDigest = makeReadsDigest(reads)\n const selectorId = computeSelectorId({ kind: 'struct', entries: parsed.entries })\n const template: ReadQueryStaticTemplate = { selectorId, reads, readsDigest, equalsKind: 'shallowStruct' }\n readQueryTemplateByFn.set(selector as unknown as Function, template)\n lruSet(readQueryTemplateBySource, srcTrimmed, template, READ_QUERY_TEMPLATE_CACHE_MAX)\n\n const staticIr: ReadQueryStaticIr = {\n selectorId,\n debugKey,\n lane: 'static',\n producer: 'jit',\n reads,\n readsDigest,\n equalsKind: 'shallowStruct',\n }\n\n return {\n selectorId,\n debugKey,\n reads,\n select: selector as any,\n equalsKind: 'shallowStruct',\n lane: 'static',\n producer: 'jit',\n readsDigest,\n staticIr,\n }\n }\n\n // Dynamic lane fallback (no stable reads / unsupported subset)\n const baseFallbackReason: ReadQueryFallbackReason =\n srcTrimmed.includes('=>') || srcTrimmed.startsWith('function') ? 'unsupportedSyntax' : 'missingDeps'\n\n const lowDiscriminabilitySource = srcTrimmed.length === 0 || srcTrimmed.includes('[native code]')\n const fallbackReason: ReadQueryFallbackReason =\n !debugKey || lowDiscriminabilitySource ? 'unstableSelectorId' : baseFallbackReason\n\n const selectorId =\n fallbackReason === 'unstableSelectorId'\n ? computeUnstableSelectorId(selector as unknown as Function)\n : computeSelectorId({ kind: 'dynamic', debugKey, src: srcTrimmed })\n const staticIr: ReadQueryStaticIr = {\n selectorId,\n debugKey,\n lane: 'dynamic',\n producer: 'dynamic',\n fallbackReason,\n equalsKind: 'objectIs',\n }\n\n return {\n selectorId,\n debugKey,\n reads: [],\n select: selector as any,\n equalsKind: 'objectIs',\n lane: 'dynamic',\n producer: 'dynamic',\n fallbackReason,\n staticIr,\n }\n}\n\nexport interface ReadQueryStrictGateConfig {\n readonly mode: 'off' | 'warn' | 'error'\n readonly requireStatic?: {\n readonly selectorIds?: ReadonlyArray<string>\n readonly modules?: ReadonlyArray<string>\n }\n readonly denyFallbackReasons?: ReadonlyArray<ReadQueryFallbackReason>\n}\n\nexport interface ReadQueryStrictGateViolationDetails {\n readonly moduleId: string\n readonly instanceId: string\n readonly txnSeq: number\n readonly selectorId: string\n readonly debugKey?: string\n readonly fallbackReason: ReadQueryFallbackReason\n readonly rule: 'denyFallbackReason' | 'requireStatic:global' | 'requireStatic:selectorId' | 'requireStatic:module'\n}\n\nexport interface ReadQueryStrictGateError extends Error {\n readonly _tag: 'ReadQueryStrictGateError'\n readonly details: ReadQueryStrictGateViolationDetails\n}\n\nexport type ReadQueryStrictGateDiagnosticEvent = Extract<DebugSink.Event, { readonly type: 'diagnostic' }>\n\nexport type ReadQueryStrictGateDecision =\n | { readonly verdict: 'PASS' }\n | {\n readonly verdict: 'WARN'\n readonly diagnostic: ReadQueryStrictGateDiagnosticEvent\n readonly details: ReadQueryStrictGateViolationDetails\n }\n | {\n readonly verdict: 'FAIL'\n readonly diagnostic: ReadQueryStrictGateDiagnosticEvent\n readonly error: ReadQueryStrictGateError\n readonly details: ReadQueryStrictGateViolationDetails\n }\n\nconst filterNonEmpty = (values: ReadonlyArray<string> | undefined): ReadonlyArray<string> | undefined => {\n if (!values || values.length === 0) return undefined\n const next = values.map((v) => v.trim()).filter((v) => v.length > 0)\n return next.length > 0 ? next : undefined\n}\n\nconst makeStrictGateDiagnostic = (args: {\n readonly config: ReadQueryStrictGateConfig\n readonly details: ReadQueryStrictGateViolationDetails\n}): ReadQueryStrictGateDiagnosticEvent => {\n const severity = args.config.mode === 'warn' ? ('warning' as const) : ('error' as const)\n\n return {\n type: 'diagnostic',\n moduleId: args.details.moduleId,\n instanceId: args.details.instanceId,\n txnSeq: args.details.txnSeq,\n code: 'read_query::strict_gate',\n severity,\n message: `ReadQuery strict gate violated: selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`,\n hint:\n 'Fix: make the selector statically compilable (AOT/JIT) or pass an explicit ReadQuery; ' +\n 'or disable/narrow the gate via RuntimeOptions.readQuery.strictGate.requireStatic / denyFallbackReasons.',\n kind: 'read_query:strict_gate',\n trigger: {\n kind: 'read_query',\n name: 'strict_gate',\n details: args.details,\n },\n }\n}\n\nconst makeStrictGateError = (args: {\n readonly details: ReadQueryStrictGateViolationDetails\n}): ReadQueryStrictGateError =>\n Object.assign(\n new Error(\n `[ReadQueryStrictGateError] selector entered dynamic lane (selectorId=${args.details.selectorId}, reason=${args.details.fallbackReason}).`,\n ),\n {\n _tag: 'ReadQueryStrictGateError' as const,\n details: args.details,\n },\n ) as ReadQueryStrictGateError\n\nexport const evaluateStrictGate = (args: {\n readonly config: ReadQueryStrictGateConfig\n readonly moduleId: string\n readonly instanceId: string\n readonly txnSeq: number\n readonly compiled: ReadQueryCompiled<any, any>\n}): ReadQueryStrictGateDecision => {\n if (args.config.mode === 'off') {\n return { verdict: 'PASS' }\n }\n\n if (args.compiled.lane !== 'dynamic') {\n return { verdict: 'PASS' }\n }\n\n const fallbackReason = (args.compiled.fallbackReason ?? 'missingDeps') as ReadQueryFallbackReason\n\n const denyFallbackReasons = args.config.denyFallbackReasons\n const denied = !!denyFallbackReasons?.includes(fallbackReason)\n\n const selectorIds = filterNonEmpty(args.config.requireStatic?.selectorIds)\n const modules = filterNonEmpty(args.config.requireStatic?.modules)\n const hasCoverageFilter = !!selectorIds || !!modules\n\n const matchedSelectorId = !!selectorIds?.includes(args.compiled.selectorId)\n const matchedModule = !!modules?.includes(args.moduleId)\n const coveredByRequireStatic = !hasCoverageFilter || matchedSelectorId || matchedModule\n\n if (!denied && !coveredByRequireStatic) {\n return { verdict: 'PASS' }\n }\n\n const rule: ReadQueryStrictGateViolationDetails['rule'] = denied\n ? 'denyFallbackReason'\n : !hasCoverageFilter\n ? 'requireStatic:global'\n : matchedSelectorId\n ? 'requireStatic:selectorId'\n : 'requireStatic:module'\n\n const details: ReadQueryStrictGateViolationDetails = {\n moduleId: args.moduleId,\n instanceId: args.instanceId,\n txnSeq: args.txnSeq,\n selectorId: args.compiled.selectorId,\n debugKey: args.compiled.debugKey,\n fallbackReason,\n rule,\n }\n\n const diagnostic = makeStrictGateDiagnostic({ config: args.config, details })\n\n if (args.config.mode === 'warn') {\n return { verdict: 'WARN', diagnostic, details }\n }\n\n const error = makeStrictGateError({ details })\n return { verdict: 'FAIL', diagnostic, error, details }\n}\n","import { Effect } from 'effect'\n\nexport const makeMatch = <V>(value: V) => {\n let result: Effect.Effect<any, any, any> | undefined\n\n const chain = {\n with: <A>(predicate: (value: V) => boolean, handler: (value: V) => A) => {\n if (result) return chain\n if (predicate(value)) {\n result = handler(value) as any\n }\n return chain\n },\n otherwise: <A>(handler: (value: V) => A): A => {\n if (result) return result as A\n return handler(value)\n },\n exhaustive: () => {\n if (result) {\n return result\n }\n return Effect.dieMessage('[FluentMatch] Non-exhaustive match: no pattern matched value')\n },\n }\n\n return chain\n}\n\nexport const makeMatchTag = <V extends { _tag: string }>(value: V) => {\n let result: Effect.Effect<any, any, any> | undefined\n\n const chain = {\n with: <K extends V['_tag'], A>(t: K, handler: (value: Extract<V, { _tag: K }>) => A) => {\n if (result) return chain\n if (value._tag === t) {\n result = handler(value as Extract<V, { _tag: K }>) as any\n }\n return chain\n },\n otherwise: <A>(handler: (value: V) => A): A => {\n if (result) return result as A\n return handler(value)\n },\n exhaustive: () => {\n if (result) {\n return result\n }\n return Effect.dieMessage('[FluentMatchTag] Non-exhaustive match: no tag handler matched value')\n },\n }\n\n return chain\n}\n","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","import { Cause, Context, Effect, Ref } from 'effect'\nimport { toSerializableErrorSummary } from './errorSummary.js'\nimport * as Debug from './DebugSink.js'\n\nexport type Phase = 'init' | 'run' | 'destroy' | 'platform'\n\nexport type Hook = 'initRequired' | 'start' | 'destroy' | 'suspend' | 'resume' | 'reset' | 'unknown'\n\nexport type TaskKind = 'initRequired' | 'start' | 'destroy' | 'platformSuspend' | 'platformResume' | 'platformReset'\n\nexport interface ErrorContext {\n readonly phase: Phase\n readonly hook: Hook\n readonly moduleId: string\n readonly instanceId: string\n readonly taskId?: string\n readonly txnSeq?: number\n readonly opSeq?: number\n /**\n * For diagnostics only: an implementation-side marker indicating where the error originated,\n * e.g. \"logic.fork\" / \"initRequired\" / \"start\".\n *\n * Note: this field must be serializable and must not become a protocol anchor.\n */\n readonly origin?: string\n}\n\nexport interface ModuleRuntimeIdentity {\n readonly moduleId: string\n readonly instanceId: string\n readonly runtimeLabel?: string\n}\n\nexport type InstanceStatus = 'creating' | 'initializing' | 'ready' | 'failed' | 'terminating' | 'terminated'\n\nexport interface InitProgress {\n readonly total: number\n readonly completed: number\n readonly current?: number\n readonly startedAt?: number\n}\n\nexport type LifecycleOutcome =\n | { readonly status: 'success' }\n | {\n readonly status: 'failure'\n readonly error: import('./errorSummary.js').SerializableErrorSummary\n }\n\nexport interface LifecycleStatus {\n readonly identity: ModuleRuntimeIdentity\n readonly status: InstanceStatus\n readonly initOutcome?: LifecycleOutcome\n readonly initProgress?: InitProgress\n}\n\nexport interface TaskRef {\n readonly taskId: string\n readonly kind: TaskKind\n readonly order: number\n readonly name?: string\n readonly fatalOnFailure?: boolean\n}\n\nexport interface LifecycleTask extends TaskRef {\n readonly effect: Effect.Effect<void, never, any>\n}\n\nexport interface Budgets {\n /** Per-instance lifecycle event budget (aligned with specs/011 data-model; default ≤ 20). */\n readonly maxEventsPerInstance: number\n /** Per-event size budget (aligned with specs/011 data-model; default ≤ 4KB). */\n readonly maxEventBytes: number\n}\n\nexport interface LifecycleManager {\n readonly identity: ModuleRuntimeIdentity\n readonly budgets: Budgets\n\n readonly registerPlatformSuspend: (\n effect: Effect.Effect<void, never, any>,\n options?: { readonly name?: string },\n ) => void\n readonly registerPlatformResume: (\n effect: Effect.Effect<void, never, any>,\n options?: { readonly name?: string },\n ) => void\n readonly registerPlatformReset: (\n effect: Effect.Effect<void, never, any>,\n options?: { readonly name?: string },\n ) => void\n\n readonly registerInitRequired: (effect: Effect.Effect<void, never, any>, options?: { readonly name?: string }) => void\n readonly registerStart: (\n effect: Effect.Effect<void, never, any>,\n options?: { readonly name?: string; readonly fatalOnFailure?: boolean },\n ) => void\n readonly registerDestroy: (effect: Effect.Effect<void, never, any>, options?: { readonly name?: string }) => void\n readonly registerOnError: (\n handler: (cause: Cause.Cause<unknown>, context: ErrorContext) => Effect.Effect<void, never, any>,\n ) => void\n\n readonly getStatus: Effect.Effect<LifecycleStatus>\n readonly setStatus: (\n status: InstanceStatus,\n patch?: {\n readonly initOutcome?: LifecycleOutcome | undefined\n readonly initProgress?: InitProgress | undefined\n readonly runtimeLabel?: string | undefined\n },\n ) => Effect.Effect<void>\n\n readonly notifyError: (cause: Cause.Cause<unknown>, context: ErrorContext) => Effect.Effect<void, never, any>\n\n readonly runPlatformSuspend: Effect.Effect<void, never, any>\n readonly runPlatformResume: Effect.Effect<void, never, any>\n readonly runPlatformReset: Effect.Effect<void, never, any>\n\n readonly runInitRequired: Effect.Effect<void, unknown, any>\n readonly runStart: Effect.Effect<void, never, any>\n readonly runDestroy: Effect.Effect<void, never, any>\n\n /** Diagnostics only: whether any onError handler has been registered. */\n readonly hasOnErrorHandlers: Effect.Effect<boolean>\n\n /** Tests/diagnostics only: read a snapshot of registered tasks (immutable view). */\n readonly getTaskSnapshot: Effect.Effect<\n Readonly<{\n readonly initRequired: ReadonlyArray<TaskRef>\n readonly start: ReadonlyArray<TaskRef>\n readonly destroy: ReadonlyArray<TaskRef>\n readonly platformSuspend: ReadonlyArray<TaskRef>\n readonly platformResume: ReadonlyArray<TaskRef>\n readonly platformReset: ReadonlyArray<TaskRef>\n }>,\n never,\n never\n >\n}\n\nexport const LifecycleContext = Context.GenericTag<LifecycleManager>('@logixjs/LifecycleManager')\n\nconst safeRun = (label: string, eff: Effect.Effect<void, any, any>) =>\n eff.pipe(\n Effect.matchCauseEffect({\n onSuccess: () => Effect.void,\n onFailure: (cause) => Effect.logError(`[${label}] failed: ${Cause.pretty(cause)}`),\n }),\n )\n\nconst makeTaskId = (kind: TaskKind, order: number): string => `${kind}:${order}`\n\nexport const makeLifecycleManager = (identity: ModuleRuntimeIdentity): Effect.Effect<LifecycleManager> =>\n Effect.gen(function* () {\n const budgets: Budgets = {\n maxEventsPerInstance: 20,\n maxEventBytes: 4 * 1024,\n }\n\n const statusRef = yield* Ref.make<LifecycleStatus>({\n identity,\n status: 'creating',\n })\n\n const initRequired: LifecycleTask[] = []\n const start: LifecycleTask[] = []\n const destroy: LifecycleTask[] = []\n const platformSuspend: LifecycleTask[] = []\n const platformResume: LifecycleTask[] = []\n const platformReset: LifecycleTask[] = []\n const onErrorHandlers: Array<\n (cause: Cause.Cause<unknown>, context: ErrorContext) => Effect.Effect<void, never, any>\n > = []\n\n const getStatus: Effect.Effect<LifecycleStatus> = Ref.get(statusRef)\n\n const recordPhase = (phase: Phase, name: string, payload?: unknown): Effect.Effect<void, never, any> =>\n Debug.record({\n type: 'lifecycle:phase',\n moduleId: identity.moduleId,\n instanceId: identity.instanceId,\n phase,\n name,\n payload,\n })\n\n const setStatus = (\n status: InstanceStatus,\n patch?: {\n readonly initOutcome?: LifecycleOutcome | undefined\n readonly initProgress?: InitProgress | undefined\n readonly runtimeLabel?: string | undefined\n },\n ) =>\n Ref.update(statusRef, (prev) => ({\n ...prev,\n identity: {\n ...prev.identity,\n ...(patch?.runtimeLabel ? { runtimeLabel: patch.runtimeLabel } : null),\n },\n status,\n ...(patch?.initOutcome !== undefined ? { initOutcome: patch.initOutcome } : null),\n ...(patch?.initProgress !== undefined ? { initProgress: patch.initProgress } : null),\n }))\n\n const registerInitRequired = (effect: Effect.Effect<void, never, any>, options?: { readonly name?: string }) => {\n const order = initRequired.length\n initRequired.push({\n taskId: makeTaskId('initRequired', order),\n kind: 'initRequired',\n order,\n name: options?.name,\n effect,\n })\n }\n\n const registerStart = (\n effect: Effect.Effect<void, never, any>,\n options?: { readonly name?: string; readonly fatalOnFailure?: boolean },\n ) => {\n const order = start.length\n start.push({\n taskId: makeTaskId('start', order),\n kind: 'start',\n order,\n name: options?.name,\n fatalOnFailure: options?.fatalOnFailure,\n effect,\n })\n }\n\n const registerDestroy = (effect: Effect.Effect<void, never, any>, options?: { readonly name?: string }) => {\n const order = destroy.length\n destroy.push({\n taskId: makeTaskId('destroy', order),\n kind: 'destroy',\n order,\n name: options?.name,\n effect,\n })\n }\n\n const registerOnError = (\n handler: (cause: Cause.Cause<unknown>, context: ErrorContext) => Effect.Effect<void, never, any>,\n ) => {\n onErrorHandlers.push(handler)\n }\n\n const registerPlatformSuspend = (effect: Effect.Effect<void, never, any>, options?: { readonly name?: string }) => {\n const order = platformSuspend.length\n platformSuspend.push({\n taskId: makeTaskId('platformSuspend', order),\n kind: 'platformSuspend',\n order,\n name: options?.name,\n effect,\n })\n }\n\n const registerPlatformResume = (effect: Effect.Effect<void, never, any>, options?: { readonly name?: string }) => {\n const order = platformResume.length\n platformResume.push({\n taskId: makeTaskId('platformResume', order),\n kind: 'platformResume',\n order,\n name: options?.name,\n effect,\n })\n }\n\n const registerPlatformReset = (effect: Effect.Effect<void, never, any>, options?: { readonly name?: string }) => {\n const order = platformReset.length\n platformReset.push({\n taskId: makeTaskId('platformReset', order),\n kind: 'platformReset',\n order,\n name: options?.name,\n effect,\n })\n }\n\n const notifyError = (cause: Cause.Cause<unknown>, context: ErrorContext) => {\n // Interrupt/cancel should not be reported as an error.\n if (Cause.isInterrupted(cause)) {\n return Effect.void\n }\n\n return Debug.record({\n type: 'lifecycle:error',\n moduleId: context.moduleId,\n instanceId: context.instanceId,\n cause,\n phase: context.phase,\n hook: context.hook,\n taskId: context.taskId,\n txnSeq: context.txnSeq,\n opSeq: context.opSeq,\n origin: context.origin,\n }).pipe(\n Effect.zipRight(\n Effect.forEach(\n onErrorHandlers,\n (handler) =>\n handler(cause, context).pipe(\n Effect.catchAllCause((inner) => Effect.logError(`[lifecycle.onError] failed: ${Cause.pretty(inner)}`)),\n ),\n { discard: true },\n ),\n ),\n )\n }\n\n const runInitRequired: Effect.Effect<void, unknown, any> = Effect.gen(function* () {\n const total = initRequired.length\n if (total === 0) {\n yield* setStatus('ready', {\n initProgress: { total: 0, completed: 0 },\n initOutcome: { status: 'success' },\n })\n return\n }\n\n const startedAt = Date.now()\n yield* recordPhase('init', 'initRequired:start', { total })\n yield* setStatus('initializing', {\n initProgress: { total, completed: 0, current: 0, startedAt },\n })\n\n let completed = 0\n for (let i = 0; i < initRequired.length; i++) {\n yield* setStatus('initializing', {\n initProgress: { total, completed, current: i, startedAt },\n })\n\n const task = initRequired[i]\n const exit = yield* Effect.exit(task.effect)\n\n if (exit._tag === 'Success') {\n completed += 1\n yield* setStatus('initializing', {\n initProgress: { total, completed, current: i + 1, startedAt },\n })\n continue\n }\n\n const summary = toSerializableErrorSummary(exit.cause)\n yield* notifyError(exit.cause, {\n phase: 'init',\n hook: 'initRequired',\n moduleId: identity.moduleId,\n instanceId: identity.instanceId,\n taskId: task.taskId,\n origin: 'initRequired',\n })\n\n yield* setStatus('failed', {\n initProgress: { total, completed, current: i, startedAt },\n initOutcome: { status: 'failure', error: summary.errorSummary },\n })\n\n return yield* Effect.failCause(exit.cause)\n }\n\n yield* recordPhase('init', 'initRequired:success', { total })\n yield* setStatus('ready', {\n initProgress: { total, completed, current: total, startedAt },\n initOutcome: { status: 'success' },\n })\n })\n\n const runStart: Effect.Effect<void, never, any> = recordPhase('run', 'start:schedule', {\n total: start.length,\n }).pipe(\n Effect.zipRight(\n Effect.forEach(\n start,\n (task) =>\n Effect.forkScoped(\n task.effect.pipe(\n Effect.catchAllCause((cause) =>\n notifyError(cause, {\n phase: 'run',\n hook: 'start',\n moduleId: identity.moduleId,\n instanceId: identity.instanceId,\n taskId: task.taskId,\n origin: 'start',\n }),\n ),\n ),\n ).pipe(Effect.asVoid),\n { discard: true, concurrency: 'unbounded' },\n ),\n ),\n )\n\n const runDestroy: Effect.Effect<void, never, any> = Effect.gen(function* () {\n yield* recordPhase('destroy', 'destroy:start', { total: destroy.length })\n yield* setStatus('terminating')\n\n // destroy: run in reverse registration order (LIFO), best-effort (one failure does not block others).\n for (let i = destroy.length - 1; i >= 0; i--) {\n const task = destroy[i]\n yield* safeRun(\n 'lifecycle.onDestroy',\n task.effect.pipe(\n Effect.catchAllCause((cause) =>\n notifyError(cause, {\n phase: 'destroy',\n hook: 'destroy',\n moduleId: identity.moduleId,\n instanceId: identity.instanceId,\n taskId: task.taskId,\n origin: 'destroy',\n }),\n ),\n ),\n )\n }\n\n yield* setStatus('terminated')\n yield* recordPhase('destroy', 'destroy:done', { total: destroy.length })\n })\n\n const runPlatformSuspend: Effect.Effect<void, never, any> = Effect.gen(function* () {\n if (platformSuspend.length === 0) return\n\n yield* recordPhase('platform', 'signal:suspend', { total: platformSuspend.length })\n for (const task of platformSuspend) {\n yield* safeRun(\n 'lifecycle.onSuspend',\n task.effect.pipe(\n Effect.catchAllCause((cause) =>\n notifyError(cause, {\n phase: 'platform',\n hook: 'suspend',\n moduleId: identity.moduleId,\n instanceId: identity.instanceId,\n taskId: task.taskId,\n origin: 'platform.suspend',\n }),\n ),\n ),\n )\n }\n })\n\n const runPlatformResume: Effect.Effect<void, never, any> = Effect.gen(function* () {\n if (platformResume.length === 0) return\n\n yield* recordPhase('platform', 'signal:resume', { total: platformResume.length })\n for (const task of platformResume) {\n yield* safeRun(\n 'lifecycle.onResume',\n task.effect.pipe(\n Effect.catchAllCause((cause) =>\n notifyError(cause, {\n phase: 'platform',\n hook: 'resume',\n moduleId: identity.moduleId,\n instanceId: identity.instanceId,\n taskId: task.taskId,\n origin: 'platform.resume',\n }),\n ),\n ),\n )\n }\n })\n\n const runPlatformReset: Effect.Effect<void, never, any> = Effect.gen(function* () {\n if (platformReset.length === 0) return\n\n yield* recordPhase('platform', 'signal:reset', { total: platformReset.length })\n for (const task of platformReset) {\n yield* safeRun(\n 'lifecycle.onReset',\n task.effect.pipe(\n Effect.catchAllCause((cause) =>\n notifyError(cause, {\n phase: 'platform',\n hook: 'reset',\n moduleId: identity.moduleId,\n instanceId: identity.instanceId,\n taskId: task.taskId,\n origin: 'platform.reset',\n }),\n ),\n ),\n )\n }\n })\n\n const getTaskSnapshot: LifecycleManager['getTaskSnapshot'] = Effect.sync(() => ({\n initRequired: initRequired.map(({ effect: _eff, ...rest }) => rest),\n start: start.map(({ effect: _eff, ...rest }) => rest),\n destroy: destroy.map(({ effect: _eff, ...rest }) => rest),\n platformSuspend: platformSuspend.map(({ effect: _eff, ...rest }) => rest),\n platformResume: platformResume.map(({ effect: _eff, ...rest }) => rest),\n platformReset: platformReset.map(({ effect: _eff, ...rest }) => rest),\n }))\n\n const hasOnErrorHandlers: LifecycleManager['hasOnErrorHandlers'] = Effect.sync(() => onErrorHandlers.length > 0)\n\n return {\n identity,\n budgets,\n registerPlatformSuspend,\n registerPlatformResume,\n registerPlatformReset,\n registerInitRequired,\n registerStart,\n registerDestroy,\n registerOnError,\n getStatus,\n setStatus,\n notifyError,\n runPlatformSuspend,\n runPlatformResume,\n runPlatformReset,\n runInitRequired,\n runStart,\n runDestroy,\n hasOnErrorHandlers,\n getTaskSnapshot,\n }\n })\n","import { Cause, Context, Effect } from 'effect'\nimport * as Debug from './DebugSink.js'\nimport { isDevEnv } from './env.js'\n\nconst phaseDiagnosticsEnabled = (): boolean => isDevEnv()\n\n/**\n * Logic diagnostics:\n * - Currently focuses on initialization noise caused by missing Env services (\"Service not found\").\n *\n * Design intent:\n * - In recommended usage, Runtime / React layers provide Env correctly.\n * - In some startup timing windows, Logic may try to read services before Env is fully provided.\n * - Such errors often occur once, do not change final semantics, but pollute logs.\n *\n * Therefore we emit a warning diagnostic via Debug, explaining likely causes and investigation paths.\n * The real error semantics are still handled by lifecycle.onError / AppRuntime.onError.\n */\n\nconst SERVICE_NOT_FOUND_PREFIX = 'Service not found:'\n\n/**\n * If the Cause contains a `Service not found: ...` error, emit a warning diagnostic:\n * - code: logic::env_service_not_found\n * - message: the original error message\n * - hint: explains this is known startup timing noise and suggests what to check\n */\nexport const emitEnvServiceNotFoundDiagnosticIfNeeded = (\n cause: Cause.Cause<unknown>,\n moduleId?: string,\n): Effect.Effect<void> =>\n Effect.gen(function* () {\n let pretty: string\n try {\n pretty = Cause.pretty(cause, { renderErrorCause: true })\n } catch {\n return\n }\n\n if (!pretty.includes(SERVICE_NOT_FOUND_PREFIX)) {\n return\n }\n\n // 1) Warning diagnostic for the missing Env service itself\n yield* Debug.record({\n type: 'diagnostic',\n moduleId,\n code: 'logic::env_service_not_found',\n severity: 'warning',\n message: pretty,\n hint:\n 'Logic attempted to access an Env service before it was provided. This is a known initialization timing noise in Runtime/React integration. ' +\n \"If it happens once during early startup and everything works afterward, it's likely harmless; \" +\n 'if it persists or correlates with app issues, verify Runtime.make / RuntimeProvider.layer provides the service.',\n })\n\n // 2) In some cases (e.g. accessing Env too early during Logic setup), we also want to surface\n // logic::invalid_phase to suggest moving Env access to the run section.\n //\n // Because we cannot reliably determine the phase at this point, this is only a supplemental signal.\n // The real phase guard is still handled by LogicPhaseError + emitInvalidPhaseDiagnosticIfNeeded.\n yield* Debug.record({\n type: 'diagnostic',\n moduleId,\n code: 'logic::invalid_phase',\n severity: 'error',\n message: '$.use is not allowed before Env is fully ready.',\n hint:\n 'Avoid reading services during setup or before Env is ready; ' +\n 'move Env access to the Logic run section, or wrap init via $.lifecycle.onInitRequired.',\n kind: 'env_service_not_ready',\n })\n })\n\nexport interface LogicPhaseError extends Error {\n readonly _tag: 'LogicPhaseError'\n readonly kind: string\n readonly api?: string\n readonly phase: 'setup' | 'run'\n readonly moduleId?: string\n}\n\nexport interface LogicPhaseService {\n readonly current: 'setup' | 'run'\n}\n\nexport const LogicPhaseServiceTag = Context.GenericTag<LogicPhaseService>('@logixjs/LogicPhaseService')\n\n/**\n * LogicUnitService:\n * - Injected while executing each mounted logic unit (scope = the logic unit's setup/run fiber).\n * - Used for trait provenance and other \"bound to the current logic unit\" information (aligned with 022-module logicUnitId).\n *\n * Constraints:\n * - Read-only (must not mutate runtime state); only a provenance/diagnostics anchor.\n */\nexport interface LogicUnitService {\n readonly logicUnitId: string\n readonly logicUnitIdKind: 'explicit' | 'derived'\n readonly logicUnitLabel: string\n readonly path?: string\n}\n\nexport class LogicUnitServiceTag extends Context.Tag('@logixjs/LogicUnitService')<\n LogicUnitServiceTag,\n LogicUnitService\n>() {}\n\nexport const makeLogicPhaseError = (\n kind: string,\n api: string,\n phase: 'setup' | 'run',\n moduleId?: string,\n): LogicPhaseError =>\n Object.assign(new Error(`[LogicPhaseError] ${api} is not allowed in ${phase} phase (kind=${kind}).`), {\n _tag: 'LogicPhaseError',\n kind,\n api,\n phase,\n moduleId,\n }) as LogicPhaseError\n\n/**\n * Extracts LogicPhaseError from a Cause and emits it as a diagnostic:\n * - code: logic::invalid_phase\n * - kind: concrete violation kind (e.g. use_in_setup)\n */\nexport const emitInvalidPhaseDiagnosticIfNeeded = (\n cause: Cause.Cause<unknown>,\n moduleId?: string,\n): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (!phaseDiagnosticsEnabled()) {\n return\n }\n\n const allErrors = [...Cause.failures(cause), ...Cause.defects(cause)]\n\n for (const err of allErrors) {\n const logicErr = err as any\n if (logicErr && logicErr._tag === 'LogicPhaseError') {\n const phaseErr = logicErr as LogicPhaseError\n const hint =\n phaseErr.kind === 'use_in_setup' || phaseErr.kind === 'lifecycle_in_setup'\n ? 'The setup phase must not read Env/services or run long-lived logic; move the relevant calls to the run phase.'\n : phaseErr.kind === 'lifecycle_in_run'\n ? 'Do not register $.lifecycle.* in the run phase (setup-only). Move lifecycle registrations to the synchronous part of Module.logic builder (before return).'\n : phaseErr.kind === 'traits_in_run' || phaseErr.kind === 'traits_declare_in_run'\n ? 'Traits are frozen after setup; move $.traits.declare to LogicPlan.setup or the setup registration phase of Module.logic builder.'\n : 'Move logic to the run phase; keep setup for registrations only.'\n\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: phaseErr.moduleId ?? moduleId,\n code: 'logic::invalid_phase',\n severity: 'error',\n message: `${phaseErr.api ?? phaseErr.kind} is not allowed in ${phaseErr.phase} phase.`,\n hint,\n kind: phaseErr.kind,\n })\n\n // Return after the first LogicPhaseError match.\n return\n }\n }\n })\n","import { Context, Deferred, Effect, Layer } from 'effect'\nimport { isDevEnv } from './runtime/core/env.js'\nimport { RootContextTag, type RootContext } from './runtime/core/RootContext.js'\n\nexport type RootResolveEntrypoint = 'logic.root.resolve' | 'logic.$.root.resolve'\n\nexport interface RootResolveOptions {\n readonly entrypoint?: RootResolveEntrypoint\n /**\n * Whether to wait when RootContext is not ready yet:\n * - Default false: avoid misuse during layer/setup which can deadlock.\n * - `$.root.resolve` passes true in the run phase (run-only), allowing Env assembly to complete.\n */\n readonly waitForReady?: boolean\n}\n\nconst tagIdOf = (tag: Context.Tag<any, any>): string =>\n typeof (tag as any)?.id === 'string'\n ? String((tag as any).id)\n : typeof (tag as any)?.key === 'string'\n ? String((tag as any).key)\n : '<unknown tag>'\n\nconst makeMissingRootProviderError = (\n tag: Context.Tag<any, any>,\n entrypoint: RootResolveEntrypoint,\n extra?: string,\n): Error => {\n const dev = isDevEnv()\n const tokenId = tagIdOf(tag)\n const fix: string[] = dev\n ? [\n '- Provide it when creating the runtime tree (Logix.Runtime.make(...,{ layer }) / ManagedRuntime.make(Layer.mergeAll(...))).',\n \"- If you're in React and want the current runtime environment singleton, use useModule(ModuleTag).\",\n '- Do not rely on nested RuntimeProvider.layer to mock Root.resolve.',\n ]\n : []\n\n const message = dev\n ? [\n '[MissingRootProviderError] Cannot resolve Tag from root provider.',\n extra ? `\\n${extra}` : '',\n `tokenId: ${tokenId}`,\n `entrypoint: ${entrypoint}`,\n 'mode: global',\n 'startScope: root',\n '',\n 'fix:',\n ...fix,\n ]\n .filter((s) => s.length > 0)\n .join('\\n')\n : '[MissingRootProviderError] tag not found in root provider'\n\n const err = new Error(message)\n err.name = 'MissingRootProviderError'\n ;(err as any).tokenId = tokenId\n ;(err as any).entrypoint = entrypoint\n ;(err as any).mode = 'global'\n ;(err as any).startScope = { kind: 'root' }\n ;(err as any).fix = fix\n return err\n}\n\n/**\n * resolve\n *\n * Resolve a Tag explicitly from the root provider of the current Runtime tree (ServiceTag / ModuleTag).\n *\n * Semantics:\n * - Always reads rootContext; unaffected by nearer-scope Layer/Context overrides.\n * - For ModuleTag: expresses root singleton semantics only (not used for multi-instance selection).\n */\nexport const resolve = <Id, Svc>(\n tag: Context.Tag<Id, Svc>,\n options?: RootResolveOptions,\n): Effect.Effect<Svc, never, any> =>\n Effect.gen(function* () {\n const entrypoint: RootResolveEntrypoint = options?.entrypoint ?? 'logic.root.resolve'\n\n const root = yield* RootContextTag\n\n const rootContext = root.context ?? (options?.waitForReady ? yield* root.ready : undefined)\n\n if (!rootContext) {\n return yield* Effect.die(\n makeMissingRootProviderError(tag as Context.Tag<any, any>, entrypoint, 'reason: rootContextNotReady'),\n )\n }\n\n try {\n return Context.get(rootContext, tag as Context.Tag<any, any>) as Svc\n } catch {\n return yield* Effect.die(makeMissingRootProviderError(tag as Context.Tag<any, any>, entrypoint))\n }\n })\n\n/**\n * layerFromContext(tests/perf only)\n *\n * Provide a \"ready immediately\" RootContext for Root.resolve.\n * - `ready` is fulfilled immediately to avoid extra waits when waitForReady=true.\n */\nexport const layerFromContext = (context: Context.Context<any>): Layer.Layer<any, never, any> =>\n Layer.scoped(\n RootContextTag,\n Effect.gen(function* () {\n const ready = yield* Deferred.make<Context.Context<any>>()\n yield* Deferred.succeed(ready, context)\n const root: RootContext = { context, ready }\n return root\n }),\n )\n","import { Context, Deferred } from 'effect'\n\nexport interface RootContext {\n context: Context.Context<any> | undefined\n readonly ready: Deferred.Deferred<Context.Context<any>, never>\n readonly appId?: string\n readonly appModuleIds?: ReadonlyArray<string>\n}\n\nclass RootContextTagImpl extends Context.Tag('@logixjs/core/RootContext')<RootContextTagImpl, RootContext>() {}\n\nexport const RootContextTag = RootContextTagImpl\n","import { isDevEnv } from './env.js'\nimport type { RuntimeInternals } from './RuntimeInternals.js'\n\nconst RUNTIME_INTERNALS = Symbol.for('@logixjs/core/runtimeInternals')\nconst BOUND_INTERNALS = Symbol.for('@logixjs/core/boundInternals')\nconst MODULE_TRAITS_PROGRAM = Symbol.for('@logixjs/core/moduleTraitsProgram')\n\nconst defineHidden = (target: object, key: symbol, value: unknown): void => {\n Object.defineProperty(target, key, {\n value,\n enumerable: false,\n configurable: true,\n writable: false,\n })\n}\n\nexport const setRuntimeInternals = (runtime: object, internals: RuntimeInternals): void => {\n defineHidden(runtime, RUNTIME_INTERNALS, internals)\n}\n\nexport const setBoundInternals = (bound: object, internals: RuntimeInternals): void => {\n defineHidden(bound, BOUND_INTERNALS, internals)\n}\n\n/**\n * ModuleTraitsProgram(StateTraitProgram):\n * - Attaches a traits Program to a module definition object (used by TraitLifecycle/Debug).\n * - Uses Symbol + non-enumerable properties to avoid spreading `.__*` magic fields.\n *\n * Note: this is a \"module-definition-side\" internal slot, not RuntimeInternals (instance-level); the semantics differ.\n */\nexport const setModuleTraitsProgram = (module: object, program: unknown): void => {\n defineHidden(module, MODULE_TRAITS_PROGRAM, program)\n}\n\nexport const getModuleTraitsProgram = (module: unknown): unknown | undefined => {\n if (!module) return undefined\n if (typeof module !== 'object' && typeof module !== 'function') return undefined\n return (module as any)[MODULE_TRAITS_PROGRAM] as unknown | undefined\n}\n\nconst formatScope = (moduleId: unknown, instanceId: unknown): string => {\n const m = typeof moduleId === 'string' && moduleId.length > 0 ? moduleId : 'unknown'\n const i = typeof instanceId === 'string' && instanceId.length > 0 ? instanceId : 'unknown'\n return `moduleId=${m}, instanceId=${i}`\n}\n\nexport const getRuntimeInternals = (runtime: object): RuntimeInternals => {\n const scope = runtime as { readonly moduleId?: unknown; readonly instanceId?: unknown }\n const internals = (runtime as any)[RUNTIME_INTERNALS] as RuntimeInternals | undefined\n if (!internals) {\n const msg = isDevEnv()\n ? [\n '[MissingRuntimeInternals] Runtime internals not installed on ModuleRuntime instance.',\n `scope: ${formatScope(scope.moduleId, scope.instanceId)}`,\n 'fix:',\n '- Ensure ModuleRuntime.make calls internalHooks.installInternalHooks (020 foundation).',\n '- If you created a mock runtime for tests, attach internals or avoid calling internal-only APIs.',\n ].join('\\n')\n : 'Runtime internals not installed'\n throw new Error(msg)\n }\n\n const runtimeInstanceId = scope.instanceId\n if (\n typeof runtimeInstanceId === 'string' &&\n runtimeInstanceId.length > 0 &&\n runtimeInstanceId !== internals.instanceId\n ) {\n throw new Error(\n isDevEnv()\n ? [\n '[InconsistentRuntimeInternals] Runtime internals instanceId mismatch.',\n `runtime: ${formatScope(scope.moduleId, runtimeInstanceId)}`,\n `internals: ${formatScope(internals.moduleId, internals.instanceId)}`,\n ].join('\\n')\n : 'Runtime internals mismatch',\n )\n }\n\n return internals\n}\n\nexport const getBoundInternals = (bound: object): RuntimeInternals => {\n const internals = (bound as any)[BOUND_INTERNALS] as RuntimeInternals | undefined\n if (!internals) {\n const msg = isDevEnv()\n ? [\n '[MissingBoundInternals] Bound internals not installed on Bound API instance.',\n 'fix:',\n '- Ensure BoundApiRuntime attaches internals (020 foundation).',\n '- If you created a mock bound for tests, attach internals or avoid calling internal-only APIs.',\n ].join('\\n')\n : 'Bound internals not installed'\n throw new Error(msg)\n }\n\n return internals\n}\n"],"mappings":"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","names":["make","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","make","resolveConcurrencyLimit","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","resolve","make","api","module","resolve","options","make"]}
|