@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/Debug.ts","../src/internal/runtime/core/DevtoolsHub.ts"],"sourcesContent":["import { Effect, Layer, Logger } from 'effect'\nimport type { AnyModuleShape, ModuleLike, ModuleRuntime, ModuleTag } from './internal/module.js'\nimport type { StateTraitProgram, StateTraitGraph, StateTraitPlan } from './StateTrait.js'\nimport * as Internal from './internal/runtime/core/DebugSink.js'\nimport * as DevtoolsHub from './internal/runtime/core/DevtoolsHub.js'\nimport * as ConvergeStaticIrCollector from './internal/runtime/core/ConvergeStaticIrCollector.js'\nimport * as ModuleTraitsRegistry from './internal/debug/ModuleTraitsRegistry.js'\nimport type * as ModuleTraits from './internal/runtime/core/ModuleTraits.js'\nimport { getModuleTraitsProgram, getRuntimeInternals } from './internal/runtime/core/runtimeInternalsAccessor.js'\nimport { getNodeEnv } from './internal/runtime/core/env.js'\nimport type { EvidencePackage, EvidencePackageSource } from './Observability.js'\n\n// Public Debug API: a namespace-shaped facade for debugging capabilities used by apps and platforms.\n// The event model and core Layers live in internal/runtime/core/DebugSink.ts; this module provides ergonomic entry points.\n\nexport type Event = Internal.Event\nexport interface Sink extends Internal.Sink {}\nexport interface RuntimeDebugEventRef extends Internal.RuntimeDebugEventRef {}\nexport type DiagnosticsLevel = Internal.DiagnosticsLevel\nexport type TraitConvergeDiagnosticsSamplingConfig = Internal.TraitConvergeDiagnosticsSamplingConfig\nexport type SnapshotToken = DevtoolsHub.SnapshotToken\n\nexport const toRuntimeDebugEventRef = Internal.toRuntimeDebugEventRef\n\nexport const internal = {\n currentDebugSinks: Internal.currentDebugSinks,\n currentRuntimeLabel: Internal.currentRuntimeLabel,\n currentDiagnosticsLevel: Internal.currentDiagnosticsLevel,\n currentTraitConvergeDiagnosticsSampling: Internal.currentTraitConvergeDiagnosticsSampling,\n toRuntimeDebugEventRef: Internal.toRuntimeDebugEventRef,\n}\n\nexport interface DevtoolsSnapshot extends DevtoolsHub.DevtoolsSnapshot {}\nexport interface DevtoolsHubOptions extends DevtoolsHub.DevtoolsHubOptions {\n readonly diagnosticsLevel?: DiagnosticsLevel\n readonly traitConvergeDiagnosticsSampling?: TraitConvergeDiagnosticsSamplingConfig\n}\n\nexport const getDevtoolsSnapshot = DevtoolsHub.getDevtoolsSnapshot\nexport const getDevtoolsSnapshotToken = DevtoolsHub.getDevtoolsSnapshotToken\nexport const subscribeDevtoolsSnapshot = DevtoolsHub.subscribeDevtoolsSnapshot\nexport const clearDevtoolsEvents = DevtoolsHub.clearDevtoolsEvents\nexport const getDevtoolsRunId = DevtoolsHub.getDevtoolsRunId\nexport const setDevtoolsRunId = DevtoolsHub.setDevtoolsRunId\nexport const startDevtoolsRun = DevtoolsHub.startDevtoolsRun\nexport const setInstanceLabel = DevtoolsHub.setInstanceLabel\nexport const getInstanceLabel = DevtoolsHub.getInstanceLabel\n\nexport const exportEvidencePackage = (options?: {\n readonly runId?: string\n readonly source?: EvidencePackageSource\n readonly protocolVersion?: string\n}): EvidencePackage => DevtoolsHub.exportDevtoolsEvidencePackage(options)\n\n/**\n * Diagnostics level for exportable events.\n *\n * Controls what DevtoolsHub exports (ring buffer / snapshots), without changing Debug.record's fallback semantics.\n */\nexport const diagnosticsLevel = (level: DiagnosticsLevel): Layer.Layer<any, never, never> =>\n Layer.fiberRefLocallyScopedWith(Internal.currentDiagnosticsLevel as any, () => level) as Layer.Layer<\n any,\n never,\n never\n >\n\nexport const traitConvergeDiagnosticsSampling = (\n config: TraitConvergeDiagnosticsSamplingConfig,\n): Layer.Layer<any, never, never> => Internal.traitConvergeDiagnosticsSampling(config)\n\n/**\n * Whether Devtools is enabled.\n *\n * Used by React/Devtools UI to decide if extra instrumentation should be active; turned on by devtoolsHubLayer.\n */\nexport const isDevtoolsEnabled = DevtoolsHub.isDevtoolsEnabled\n\n/**\n * A lightweight counter of active module runtimes.\n *\n * Derived from module:init / module:destroy events; suitable as a DevTools / Playground data source.\n */\nexport interface ModuleRuntimeCounter {\n readonly sink: Sink\n readonly getSnapshot: () => ReadonlyMap<string, number>\n}\n\n/**\n * A simple in-memory ring buffer for Debug events.\n *\n * No filtering/grouping; consumers can post-process snapshots (by moduleId/type/etc.).\n */\nexport interface RingBufferSink {\n readonly sink: Sink\n readonly getSnapshot: () => ReadonlyArray<Event>\n readonly clear: () => void\n}\n\n/**\n * Create a Debug sink that counts active instances per moduleId.\n *\n * Snapshots are exposed via getSnapshot(); bridging to UI (window/postMessage/etc.) is left to consumers.\n */\nexport const makeModuleRuntimeCounterSink = (): ModuleRuntimeCounter => {\n const counts = new Map<string, number>()\n\n const sink: Sink = {\n record: (event: Event) =>\n Effect.sync(() => {\n if (event.type === 'module:init') {\n const moduleId = event.moduleId ?? 'unknown'\n const runtimeLabel = 'runtimeLabel' in event && event.runtimeLabel ? event.runtimeLabel : 'unknown'\n const key = `${runtimeLabel}::${moduleId}`\n const prev = counts.get(key) ?? 0\n counts.set(key, prev + 1)\n return\n }\n if (event.type === 'module:destroy') {\n const moduleId = event.moduleId ?? 'unknown'\n const runtimeLabel = 'runtimeLabel' in event && event.runtimeLabel ? event.runtimeLabel : 'unknown'\n const key = `${runtimeLabel}::${moduleId}`\n const prev = counts.get(key) ?? 0\n const next = prev - 1\n if (next <= 0) {\n counts.delete(key)\n } else {\n counts.set(key, next)\n }\n }\n }),\n }\n\n const getSnapshot = (): ReadonlyMap<string, number> => new Map(counts)\n\n return { sink, getSnapshot }\n}\n\n/**\n * Create a ring-buffer Debug sink.\n *\n * Records the last N events in chronological order; a good foundation for event timelines.\n */\nexport const makeRingBufferSink = (capacity = 1000): RingBufferSink => {\n const buffer: Event[] = []\n\n const sink: Sink = {\n record: (event: Event) =>\n Effect.sync(() => {\n if (capacity <= 0) {\n return\n }\n if (buffer.length >= capacity) {\n buffer.shift()\n }\n buffer.push(event)\n }),\n }\n\n const getSnapshot = (): ReadonlyArray<Event> => buffer.slice()\n const clear = (): void => {\n buffer.length = 0\n }\n\n return { sink, getSnapshot, clear }\n}\n\n/**\n * Emit a Debug event to sinks attached to the current Fiber.\n *\n * If no sink is provided, the runtime chooses a safe fallback (browser console grouping; node preserves error-class events).\n */\nexport const record = Internal.record\n\n/**\n * A no-op Debug layer.\n *\n * Provides an empty sink set and drops all Debug events; useful for tests or explicitly disabling Debug.\n */\nexport const noopLayer = Internal.noopLayer as unknown as Layer.Layer<any, never, never>\n\n/**\n * Debug mode selector.\n *\n * - `auto`: infer dev/prod from NODE_ENV.\n * - `dev`: verbose diagnostics.\n * - `prod`: keep only high-value diagnostics/errors.\n * - `off`: disable sinks (benchmarks/special tests).\n */\nexport type DebugMode = 'auto' | 'dev' | 'prod' | 'off'\n\nexport interface DebugLayerOptions {\n readonly mode?: DebugMode\n /**\n * In dev mode, choose what to print to the browser console:\n * - default: diagnostic + lifecycle:error + trace:* (legacy behavior)\n * - diagnostic: diagnostic(warn/error) + lifecycle:error only (recommended for app dev with Devtools)\n */\n readonly devConsole?: 'default' | 'diagnostic'\n /**\n * Diagnostics level for exportable debug event refs (used by DevtoolsHub and debug sinks that normalize events).\n *\n * Equivalent to composing `Debug.diagnosticsLevel(level)` with `Debug.layer(...)`.\n */\n readonly diagnosticsLevel?: DiagnosticsLevel\n /**\n * Reserved for future use: enable high-noise action/state logs in dev.\n */\n readonly verboseActions?: boolean\n /**\n * Reserved for future use: emit key events into metrics in prod.\n */\n readonly enableMetrics?: boolean\n}\n\nconst resolveMode = (mode: DebugMode | undefined): DebugMode => {\n if (mode && mode !== 'auto') {\n return mode\n }\n\n const env = getNodeEnv()\n return env === 'production' ? 'prod' : 'dev'\n}\n\n/**\n * Public entry: compose a Debug layer based on the environment or an explicit mode.\n *\n * Default mode is `auto`: non-production → `dev`; production → `prod`.\n *\n * @example\n * ```ts\n * const runtime = Runtime.make(AppImpl, {\n * layer: Layer.mergeAll(Debug.layer(), businessLayer),\n * })\n * ```\n */\nexport const layer = (options?: DebugLayerOptions): Layer.Layer<any, never, never> => {\n const mode = resolveMode(options?.mode)\n const diagnostics = options?.diagnosticsLevel\n\n const sinks = (() => {\n switch (mode) {\n case 'off':\n return Internal.noopLayer as unknown as Layer.Layer<any, never, never>\n case 'prod':\n // Production: keep only high-value diagnostics/errors to avoid noisy logs.\n return Internal.errorOnlyLayer as unknown as Layer.Layer<any, never, never>\n case 'dev':\n case 'auto': {\n // Dev: enable browser-friendly Debug sink output by default.\n // Logger.pretty is intentionally opt-in by callers to avoid implicitly rewriting the logger.\n return options?.devConsole === 'diagnostic'\n ? (Internal.browserDiagnosticConsoleLayer as unknown as Layer.Layer<any, never, never>)\n : (Internal.browserConsoleLayer as unknown as Layer.Layer<any, never, never>)\n }\n }\n })()\n\n return diagnostics\n ? (Layer.mergeAll(sinks, diagnosticsLevel(diagnostics)) as Layer.Layer<any, never, never>)\n : sinks\n}\n\n/**\n * PrettyLoggerOptions: parameters of Effect.Logger.prettyLogger.\n */\nexport type PrettyLoggerOptions = Parameters<typeof Logger.prettyLogger>[0]\n\n/**\n * Replace the default Effect logger with a pretty logger (as a Layer).\n *\n * Equivalent to `Logger.replace(Logger.defaultLogger, Logger.prettyLogger(options))`.\n */\nexport const withPrettyLogger = (\n base: Layer.Layer<any, any, any>,\n options?: PrettyLoggerOptions,\n): Layer.Layer<any, any, any> =>\n Layer.merge(\n base,\n Logger.replace(Logger.defaultLogger, Logger.prettyLogger(options)) as unknown as Layer.Layer<any, any, any>,\n )\n\n/**\n * Replace Debug sinks with the provided sink set.\n *\n * Advanced: use either `Debug.layer` or `Debug.replace` in a scope, not both.\n */\nexport const replace = (sinks: ReadonlyArray<Sink>): Layer.Layer<any, never, never> =>\n Layer.locallyScoped(internal.currentDebugSinks, sinks as ReadonlyArray<Internal.Sink>) as Layer.Layer<\n any,\n never,\n never\n >\n\n/**\n * Append sinks to the current Fiber's sink set (without overriding existing sinks).\n */\nexport const appendSinks = (sinks: ReadonlyArray<Sink>): Layer.Layer<any, never, never> =>\n Layer.fiberRefLocallyScopedWith(Internal.currentDebugSinks, (current) => [\n ...current,\n ...(sinks as ReadonlyArray<Internal.Sink>),\n ]) as Layer.Layer<any, never, never>\n\n/**\n * Append the DevtoolsHub sink to aggregate Debug events into snapshots.\n *\n * Works by appending sinks; it does not override `Debug.layer` / `Debug.replace` / custom sinks.\n */\nexport function devtoolsHubLayer(options?: DevtoolsHubOptions): Layer.Layer<any, never, never>\nexport function devtoolsHubLayer(\n base: Layer.Layer<any, any, any>,\n options?: DevtoolsHubOptions,\n): Layer.Layer<any, never, any>\nexport function devtoolsHubLayer(\n baseOrOptions?: Layer.Layer<any, any, any> | DevtoolsHubOptions,\n maybeOptions?: DevtoolsHubOptions,\n): Layer.Layer<any, never, any> {\n // In effect v3, Layer values are objects tagged with `_op_layer`.\n const isLayerValue = (value: unknown): value is Layer.Layer<any, any, any> =>\n typeof value === 'object' && value !== null && '_op_layer' in (value as Record<string, unknown>)\n\n const hasBase = isLayerValue(baseOrOptions)\n const base = hasBase\n ? (baseOrOptions as Layer.Layer<any, any, any>)\n : (Layer.empty as unknown as Layer.Layer<any, any, any>)\n const options = hasBase ? maybeOptions : (baseOrOptions as DevtoolsHubOptions | undefined)\n\n DevtoolsHub.configureDevtoolsHub(options)\n const append = appendSinks([DevtoolsHub.devtoolsHubSink])\n const appendConvergeStaticIr = ConvergeStaticIrCollector.appendConvergeStaticIrCollectors([\n DevtoolsHub.devtoolsHubConvergeStaticIrCollector,\n ])\n const enableExportableDiagnostics = diagnosticsLevel(options?.diagnosticsLevel ?? 'light')\n const convergeSamplingLayer = options?.traitConvergeDiagnosticsSampling\n ? traitConvergeDiagnosticsSampling(options.traitConvergeDiagnosticsSampling)\n : (Layer.empty as unknown as Layer.Layer<any, never, never>)\n\n // FiberRef layers must build base sinks first, then append; provideMerge(append, base)\n // builds base first and then applies append's FiberRefs patch, avoiding overrides.\n return Layer.provideMerge(\n Layer.mergeAll(append, enableExportableDiagnostics, convergeSamplingLayer, appendConvergeStaticIr) as Layer.Layer<\n any,\n never,\n any\n >,\n base,\n ) as Layer.Layer<any, never, any>\n}\n\n/**\n * Attach a logical runtime label to Debug events within the current Fiber scope.\n *\n * DevTools can group events by this label.\n */\nexport const runtimeLabel = (label: string): Layer.Layer<any, never, never> =>\n Layer.fiberRefLocallyScopedWith(internal.currentRuntimeLabel as any, () => label) as Layer.Layer<any, never, never>\n\n/**\n * StateTrait debug view for Devtools/scripts.\n */\nexport interface ModuleTraitsDebug {\n readonly program?: StateTraitProgram<any>\n readonly graph?: StateTraitGraph\n readonly plan?: StateTraitPlan\n}\n\n/**\n * A minimal enumerable trait item from the finalized snapshot (023).\n */\nexport interface ModuleTraitsFinalItem {\n readonly traitId: string\n readonly name: string\n readonly description?: string\n readonly provenance: ModuleTraits.TraitProvenance\n}\n\n/**\n * Read the StateTrait program (if any) from a module definition and return a debug view.\n */\nexport const getModuleTraits = (\n module: ModuleTag<string, AnyModuleShape> | ModuleLike<string, AnyModuleShape, any>,\n): ModuleTraitsDebug => {\n const moduleTag = (module as any).tag ? (module as any).tag : module\n\n const program = getModuleTraitsProgram(moduleTag as any) as StateTraitProgram<any> | undefined\n\n if (!program) {\n return {}\n }\n\n return {\n program,\n graph: program.graph,\n plan: program.plan,\n }\n}\n\n/**\n * Get a module's StateTrait debug view by moduleId (registered at Module.make time).\n */\nexport const getModuleTraitsById = (moduleId: string): ModuleTraitsDebug | undefined => {\n const program = ModuleTraitsRegistry.getModuleProgramById(moduleId)\n if (!program) {\n return undefined\n }\n return {\n program,\n graph: program.graph,\n plan: program.plan,\n }\n}\n\n/**\n * Read the finalized traits snapshot (023) from a ModuleRuntime; undefined if not finalized.\n */\nexport const getModuleTraitsSnapshot = (\n runtime: ModuleRuntime<any, any>,\n): ModuleTraits.ModuleTraitsSnapshot | undefined => {\n try {\n const internals = getRuntimeInternals(runtime as any)\n return internals.traits.getModuleTraitsSnapshot()\n } catch {\n return undefined\n }\n}\n\n/**\n * Export a minimal, enumerable trait list from the finalized snapshot (023).\n *\n * Order is deterministic and matches the snapshot.\n */\nexport const getModuleFinalTraits = (runtime: ModuleRuntime<any, any>): ReadonlyArray<ModuleTraitsFinalItem> => {\n const snapshot = getModuleTraitsSnapshot(runtime)\n if (!snapshot) return []\n\n return snapshot.traits.map((t) => ({\n traitId: t.traitId,\n name: t.name,\n description: t.description,\n provenance: snapshot.provenanceIndex[t.traitId]!,\n }))\n}\n\n/**\n * Append a trace-only sink (handles `trace:*`) on top of the current Debug sinks.\n *\n * Default behavior logs trace events via logDebug; you can provide a handler to forward into ring buffers / bridges.\n *\n * @example\n * ```ts\n * const layer = Debug.traceLayer(\n * Debug.layer({ mode: 'dev' }),\n * (event) => Effect.logInfo({ traceEvent: event }),\n * )\n * ```\n */\nconst isLayer = (value: unknown): value is Layer.Layer<any, any, any> =>\n typeof value === 'object' && value !== null && '_op_layer' in (value as Record<string, unknown>)\n\nexport function traceLayer(onTrace?: (event: Event) => Effect.Effect<void>): Layer.Layer<any, never, never>\nexport function traceLayer(\n base: Layer.Layer<any, any, any>,\n onTrace?: (event: Event) => Effect.Effect<void>,\n): Layer.Layer<any, never, any>\nexport function traceLayer(\n baseOrHandler?: Layer.Layer<any, any, any> | ((event: Event) => Effect.Effect<void>),\n maybeOnTrace?: (event: Event) => Effect.Effect<void>,\n): Layer.Layer<any, never, any> {\n const hasBase = isLayer(baseOrHandler)\n const base = hasBase\n ? (baseOrHandler as Layer.Layer<any, any, any>)\n : (Layer.empty as unknown as Layer.Layer<any, any, any>)\n const onTrace = hasBase ? maybeOnTrace : (baseOrHandler as ((event: Event) => Effect.Effect<void>) | undefined)\n\n const traceSink: Sink = {\n record: (event: Event) =>\n typeof event.type === 'string' && event.type.startsWith('trace:')\n ? onTrace\n ? onTrace(event)\n : Effect.logDebug({ traceEvent: event })\n : Effect.void,\n }\n\n // Append the trace sink via FiberRef: extend the current Fiber's sink set.\n // Do not depend on DebugHub/Tag; use FiberRef.currentDebugSinks as the single source of truth.\n const appendTrace = Layer.fiberRefLocallyScopedWith(Internal.currentDebugSinks, (sinks) => [...sinks, traceSink])\n\n // Same as devtoolsHubLayer: build base first, then appendTrace updates FiberRef sinks.\n return Layer.provideMerge(appendTrace, base as Layer.Layer<any, any, any>) as Layer.Layer<any, never, any>\n}\n","import { Effect, FiberRef } from 'effect'\nimport type { JsonValue } from '../../observability/jsonValue.js'\nimport type { EvidencePackage, EvidencePackageSource } from '../../observability/evidence.js'\nimport { exportEvidencePackage, OBSERVABILITY_PROTOCOL_VERSION } from '../../observability/evidence.js'\nimport type { ConvergeStaticIrExport } from '../../state-trait/converge-ir.js'\nimport type { ConvergeStaticIrCollector } from './ConvergeStaticIrCollector.js'\nimport {\n currentDiagnosticsLevel,\n clearRuntimeDebugEventSeq,\n toRuntimeDebugEventRef,\n type Event,\n type RuntimeDebugEventRef,\n type Sink,\n} from './DebugSink.js'\n\n/**\n * DevtoolsHub:\n * - Process/page-level Debug event aggregator (global singleton).\n *\n * Note: this hub is only appended to Debug sinks when devtoolsHubLayer is explicitly enabled.\n * The Snapshot API is always available (returns empty snapshots when disabled).\n *\n * Performance:\n * - Devtools Debug events can be extremely dense in hot paths (EffectOp / Trait / StateTxn, etc.).\n * - The previous implementation copied ringBuffer and Maps per event to build an \"immutable snapshot\" (O(bufferSize)).\n * - The current implementation lets Snapshot reference internal Map/Array directly (read-only convention) and batches\n * subscriber notifications in microtasks, avoiding per-event copies and reducing main-thread interference.\n */\n\nexport interface DevtoolsSnapshot {\n /**\n * SnapshotToken:\n * - Monotonic snapshot change token (a subscription-safe source of truth).\n * - Any externally visible change must advance the token.\n * - If the token does not change, externally visible snapshot fields must not change (avoid tearing / missed updates).\n */\n readonly snapshotToken: SnapshotToken\n readonly instances: ReadonlyMap<string, number>\n readonly events: ReadonlyArray<RuntimeDebugEventRef>\n readonly latestStates: ReadonlyMap<string, JsonValue>\n readonly latestTraitSummaries: ReadonlyMap<string, JsonValue>\n /**\n * exportBudget:\n * - Tracks \"degrade counts\" caused by export boundaries (JsonValue projection/trimming), for explainability.\n * - Counts are cumulative (may differ from the ring buffer window); clearDevtoolsEvents resets them.\n */\n readonly exportBudget: {\n readonly dropped: number\n readonly oversized: number\n }\n}\n\nexport interface DevtoolsHubOptions {\n readonly bufferSize?: number\n}\n\nexport type SnapshotToken = number\n\n// ---- Global mutable state (singleton) ----\n\nconst instances = new Map<string, number>()\nconst latestStates = new Map<string, JsonValue>()\nconst latestTraitSummaries = new Map<string, JsonValue>()\nconst instanceLabels = new Map<string, string>()\nconst convergeStaticIrByDigest = new Map<string, ConvergeStaticIrExport>()\nconst liveInstanceKeys = new Set<string>()\n\nconst exportBudget = {\n dropped: 0,\n oversized: 0,\n}\n\nlet lastRunTs = 0\nlet lastRunTsSeq = 0\n\nconst nextRunId = (): string => {\n const ts = Date.now()\n if (ts === lastRunTs) {\n lastRunTsSeq += 1\n } else {\n lastRunTs = ts\n lastRunTsSeq = 0\n }\n\n return lastRunTsSeq === 0 ? `run-${ts}` : `run-${ts}.${lastRunTsSeq}`\n}\n\nlet currentRunId = nextRunId()\nlet nextSeq = 1\n\nlet bufferSize = 500\nconst ringBuffer: RuntimeDebugEventRef[] = []\nconst ringBufferSeq: number[] = []\n\nlet snapshotToken: SnapshotToken = 0\n\nconst ensureRingBufferSize = (): void => {\n if (bufferSize <= 0) {\n ringBuffer.length = 0\n ringBufferSeq.length = 0\n return\n }\n\n if (ringBuffer.length <= bufferSize) return\n const excess = ringBuffer.length - bufferSize\n ringBuffer.splice(0, excess)\n ringBufferSeq.splice(0, excess)\n}\n\nconst trimRingBufferIfNeeded = (): void => {\n if (bufferSize <= 0) {\n ringBuffer.length = 0\n ringBufferSeq.length = 0\n return\n }\n\n // Small windows keep a strict upper bound to avoid \"size=5 but events.length briefly > 5\" surprises.\n // Large windows allow short bursts + batch trimming to avoid linear shift() costs under sustained load.\n if (bufferSize <= 64) {\n ensureRingBufferSize()\n return\n }\n\n const slack = Math.min(1024, Math.floor(bufferSize / 2))\n const threshold = bufferSize + Math.max(1, slack)\n if (ringBuffer.length <= threshold) return\n\n const excess = ringBuffer.length - bufferSize\n ringBuffer.splice(0, excess)\n ringBufferSeq.splice(0, excess)\n}\n\n// Snapshot references internal structures directly (read-only convention) to avoid copy costs in hot paths.\nconst currentSnapshot: DevtoolsSnapshot = {\n snapshotToken,\n instances,\n events: ringBuffer,\n latestStates,\n latestTraitSummaries,\n exportBudget,\n}\n\nconst listeners = new Set<() => void>()\n\nlet notifyScheduled = false\nconst scheduleNotify = () => {\n if (notifyScheduled) return\n notifyScheduled = true\n queueMicrotask(() => {\n notifyScheduled = false\n for (const listener of listeners) {\n listener()\n }\n })\n}\n\nlet devtoolsEnabled = false\n\nconst bumpSnapshotToken = (): void => {\n snapshotToken += 1\n ;(currentSnapshot as any).snapshotToken = snapshotToken\n}\n\nconst markSnapshotChanged = (): void => {\n bumpSnapshotToken()\n scheduleNotify()\n}\n\nexport const configureDevtoolsHub = (options?: DevtoolsHubOptions) => {\n devtoolsEnabled = true\n if (typeof options?.bufferSize === 'number' && Number.isFinite(options.bufferSize)) {\n const next = Math.floor(options.bufferSize)\n const nextBufferSize = next >= 0 ? next : 0\n if (nextBufferSize !== bufferSize) {\n bufferSize = nextBufferSize\n ensureRingBufferSize()\n markSnapshotChanged()\n }\n }\n}\n\nexport const isDevtoolsEnabled = (): boolean => devtoolsEnabled\n\n// ---- Snapshot public helpers ----\n\nexport const getDevtoolsSnapshot = (): DevtoolsSnapshot => currentSnapshot\nexport const getDevtoolsSnapshotToken = (): SnapshotToken => snapshotToken\n\nexport const subscribeDevtoolsSnapshot = (listener: () => void): (() => void) => {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport const getDevtoolsRunId = (): string => currentRunId\n\nexport const setDevtoolsRunId = (runId: string): void => {\n if (typeof runId !== 'string' || runId.length === 0) return\n if (runId !== currentRunId) {\n currentRunId = runId\n markSnapshotChanged()\n }\n}\n\nexport const startDevtoolsRun = (runId?: string): string => {\n currentRunId = typeof runId === 'string' && runId.length > 0 ? runId : nextRunId()\n nextSeq = 1\n clearRuntimeDebugEventSeq()\n clearDevtoolsEvents()\n return currentRunId\n}\n\nexport const clearDevtoolsEvents = (): void => {\n ringBuffer.length = 0\n ringBufferSeq.length = 0\n exportBudget.dropped = 0\n exportBudget.oversized = 0\n markSnapshotChanged()\n}\n\nexport const setInstanceLabel = (instanceId: string, label: string): void => {\n instanceLabels.set(instanceId, label)\n markSnapshotChanged()\n}\n\nexport const getInstanceLabel = (instanceId: string): string | undefined => instanceLabels.get(instanceId)\n\nconst registerConvergeStaticIr = (ir: ConvergeStaticIrExport): void => {\n convergeStaticIrByDigest.set(ir.staticIrDigest, ir)\n}\n\nexport const devtoolsHubConvergeStaticIrCollector: ConvergeStaticIrCollector = {\n register: registerConvergeStaticIr,\n}\n\nexport const exportDevtoolsEvidencePackage = (options?: {\n readonly runId?: string\n readonly source?: EvidencePackageSource\n readonly protocolVersion?: string\n}): EvidencePackage => {\n const protocolVersion = options?.protocolVersion ?? OBSERVABILITY_PROTOCOL_VERSION\n const runId = options?.runId ?? currentRunId\n const source = options?.source ?? { host: 'unknown' }\n\n const events = ringBuffer.map((payload, i) => ({\n protocolVersion,\n runId,\n seq: ringBufferSeq[i] ?? i + 1,\n timestamp: payload.timestamp,\n type: 'debug:event',\n payload: payload as unknown as JsonValue,\n }))\n\n const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\n // In full diagnostics: de-duplicate by staticIrDigest and export matching ConvergeStaticIR (for offline explanation/replay).\n const convergeDigests = new Set<string>()\n let sawFullConverge = false\n\n for (const ref of ringBuffer) {\n if (ref.kind !== 'trait:converge') continue\n const meta = ref.meta\n if (!isRecord(meta)) continue\n\n const digest = meta.staticIrDigest\n if (typeof digest === 'string' && digest.length > 0) {\n convergeDigests.add(digest)\n }\n\n const dirty = meta.dirty\n if (isRecord(dirty) && typeof dirty.rootCount === 'number') {\n sawFullConverge = true\n }\n }\n\n let summary: JsonValue | undefined\n if (sawFullConverge && convergeDigests.size > 0) {\n const staticIrByDigest: Record<string, JsonValue> = {}\n for (const digest of convergeDigests) {\n const ir = convergeStaticIrByDigest.get(digest)\n if (ir) {\n staticIrByDigest[digest] = ir as unknown as JsonValue\n }\n }\n if (Object.keys(staticIrByDigest).length > 0) {\n summary = { converge: { staticIrByDigest } } as unknown as JsonValue\n }\n }\n\n return exportEvidencePackage({\n protocolVersion,\n runId,\n source,\n events,\n summary,\n })\n}\n\n// ---- Hub Sink ----\n\nexport const devtoolsHubSink: Sink = {\n record: (event: Event) =>\n Effect.gen(function* () {\n // NOTE: the hub is a global singleton, but whether events are exportable/written to the buffer is controlled by FiberRef,\n // enabling different perf baselines/diagnostics tiers across scopes within the same process.\n const level = yield* FiberRef.get(currentDiagnosticsLevel)\n\n let changed = false\n\n // trace:instanceLabel: set a human-readable label for a runtime instance.\n if (event.type === 'trace:instanceLabel') {\n const instanceId = (event as any).instanceId as string | undefined\n const data = (event as any).data\n const label = data && typeof data === 'object' && 'label' in data ? String((data as any).label) : undefined\n if (instanceId && label) {\n instanceLabels.set(instanceId, label)\n changed = true\n }\n }\n\n // Instance counters: maintain active instance counts by runtimeLabel::moduleId.\n if (event.type === 'module:init' || event.type === 'module:destroy') {\n const moduleId = (event as any).moduleId ?? 'unknown'\n const runtimeLabel = (event as any).runtimeLabel ?? 'unknown'\n const instanceId = (event as any).instanceId as string | undefined\n const key = `${runtimeLabel}::${moduleId}`\n const prev = instances.get(key) ?? 0\n if (event.type === 'module:init') {\n instances.set(key, prev + 1)\n changed = true\n if (instanceId) {\n const instanceKey = `${runtimeLabel}::${moduleId}::${instanceId}`\n liveInstanceKeys.add(instanceKey)\n // If instanceId is reused, ensure derived caches do not carry leftovers from the previous lifetime.\n if (latestStates.delete(instanceKey)) changed = true\n if (latestTraitSummaries.delete(instanceKey)) changed = true\n }\n } else {\n const next = prev - 1\n if (next <= 0) {\n if (instances.delete(key)) changed = true\n } else {\n instances.set(key, next)\n changed = true\n }\n\n if (instanceId) {\n const instanceKey = `${runtimeLabel}::${moduleId}::${instanceId}`\n liveInstanceKeys.delete(instanceKey)\n if (latestStates.delete(instanceKey)) changed = true\n if (latestTraitSummaries.delete(instanceKey)) changed = true\n if (instanceLabels.delete(instanceId)) changed = true\n changed = true\n }\n }\n }\n\n let exportBudgetChanged = false\n const ref = toRuntimeDebugEventRef(event, {\n diagnosticsLevel: level,\n resolveConvergeStaticIr: (staticIrDigest) => convergeStaticIrByDigest.get(staticIrDigest),\n onMetaProjection: ({ stats }) => {\n if (stats.dropped !== 0 || stats.oversized !== 0) {\n exportBudgetChanged = true\n }\n exportBudget.dropped += stats.dropped\n exportBudget.oversized += stats.oversized\n },\n })\n if (exportBudgetChanged) {\n changed = true\n }\n if (!ref) {\n // off tier: do not write ring buffer / latestStates, but keep minimal counters/labels (including module:destroy cleanup).\n if (changed) {\n markSnapshotChanged()\n }\n return\n }\n\n // latestStates / latestTraitSummaries: record latest snapshots by runtimeLabel::moduleId::instanceId.\n if (ref.kind === 'state' && ref.label === 'state:update') {\n const runtimeLabel = ref.runtimeLabel ?? 'unknown'\n const key = `${runtimeLabel}::${ref.moduleId}::${ref.instanceId}`\n\n // Late/replayed events after module:destroy: allow entering the window for replay, but do not rebuild latest* caches.\n if (liveInstanceKeys.has(key)) {\n if (ref.meta && typeof ref.meta === 'object' && !Array.isArray(ref.meta)) {\n const anyMeta = ref.meta as any\n if ('state' in anyMeta) {\n latestStates.set(key, anyMeta.state as JsonValue)\n changed = true\n }\n if ('traitSummary' in anyMeta && anyMeta.traitSummary !== undefined) {\n latestTraitSummaries.set(key, anyMeta.traitSummary as JsonValue)\n changed = true\n }\n }\n }\n }\n\n // ring buffer: keep the most recent bufferSize RuntimeDebugEventRefs.\n if (bufferSize > 0) {\n const seq = nextSeq++\n ringBuffer.push(ref)\n ringBufferSeq.push(seq)\n trimRingBufferIfNeeded()\n changed = true\n }\n\n if (changed) {\n markSnapshotChanged()\n }\n }),\n}\n"],"mappings":"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","names":["clearDevtoolsEvents","exportEvidencePackage","getDevtoolsRunId","getDevtoolsSnapshot","getDevtoolsSnapshotToken","getInstanceLabel","isDevtoolsEnabled","noopLayer","record","setDevtoolsRunId","setInstanceLabel","startDevtoolsRun","subscribeDevtoolsSnapshot","toRuntimeDebugEventRef","traitConvergeDiagnosticsSampling","Effect","runtimeLabel","toRuntimeDebugEventRef","getDevtoolsSnapshot","getDevtoolsSnapshotToken","subscribeDevtoolsSnapshot","clearDevtoolsEvents","getDevtoolsRunId","setDevtoolsRunId","startDevtoolsRun","setInstanceLabel","getInstanceLabel","exportEvidencePackage","traitConvergeDiagnosticsSampling","isDevtoolsEnabled","Effect","runtimeLabel","record","noopLayer"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// src/internal/action.ts
|
|
2
|
+
import { Schema } from "effect";
|
|
3
|
+
var isActionToken = (value) => typeof value === "function" && value._kind === "ActionToken" && typeof value.tag === "string" && Schema.isSchema(value.schema);
|
|
4
|
+
var make = (tag, schema, options) => {
|
|
5
|
+
const fn = ((...args) => ({
|
|
6
|
+
_tag: tag,
|
|
7
|
+
payload: args[0]
|
|
8
|
+
}));
|
|
9
|
+
fn._kind = "ActionToken";
|
|
10
|
+
fn.tag = tag;
|
|
11
|
+
fn.schema = schema;
|
|
12
|
+
if (options?.source) {
|
|
13
|
+
;
|
|
14
|
+
fn.source = options.source;
|
|
15
|
+
}
|
|
16
|
+
return fn;
|
|
17
|
+
};
|
|
18
|
+
var makeActions = (schemas, options) => {
|
|
19
|
+
const out = {};
|
|
20
|
+
const sources = options?.sources;
|
|
21
|
+
const defaultSource = options?.source;
|
|
22
|
+
for (const [key, schema] of Object.entries(schemas)) {
|
|
23
|
+
const source = sources?.[key] ?? defaultSource;
|
|
24
|
+
out[key] = make(key, schema, source ? { source } : void 0);
|
|
25
|
+
}
|
|
26
|
+
return out;
|
|
27
|
+
};
|
|
28
|
+
var normalizeActions = (defs) => {
|
|
29
|
+
const out = {};
|
|
30
|
+
for (const [key, def] of Object.entries(defs)) {
|
|
31
|
+
if (Schema.isSchema(def)) {
|
|
32
|
+
out[key] = make(key, def);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (isActionToken(def)) {
|
|
36
|
+
if (def.tag !== key) {
|
|
37
|
+
throw new Error(`[Logix.Action] actionTag MUST equal key: key="${key}", token.tag="${def.tag}"`);
|
|
38
|
+
}
|
|
39
|
+
out[key] = def;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`[Logix.Action] invalid action def for key "${key}"`);
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
isActionToken,
|
|
49
|
+
makeActions,
|
|
50
|
+
normalizeActions
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=chunk-YS3AZQ2G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/action.ts"],"sourcesContent":["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"],"mappings":";AAAA,SAAS,cAAc;AAoChB,IAAM,gBAAgB,CAAC,UAC5B,OAAO,UAAU,cAChB,MAAc,UAAU,iBACzB,OAAQ,MAAc,QAAQ,YAC9B,OAAO,SAAU,MAAc,MAAM;AAEhC,IAAM,OAAO,CAClB,KACA,QACA,YACuE;AACvE,QAAM,MAAM,IAAI,UAA+B;AAAA,IAC7C,MAAM;AAAA,IACN,SAAS,KAAK,CAAC;AAAA,EACjB;AAEC,EAAC,GAAW,QAAQ;AACpB,EAAC,GAAW,MAAM;AAClB,EAAC,GAAW,SAAS;AACtB,MAAI,SAAS,QAAQ;AACnB;AAAC,IAAC,GAAW,SAAS,QAAQ;AAAA,EAChC;AAEA,SAAO;AACT;AAEO,IAAM,cAAc,CACzB,SACA,YAMG;AACH,QAAM,MAAsC,CAAC;AAC7C,QAAM,UAAU,SAAS;AACzB,QAAM,gBAAgB,SAAS;AAC/B,aAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,UAAM,SAAS,UAAU,GAAG,KAAK;AACjC,QAAI,GAAG,IAAI,KAAK,KAAK,QAAQ,SAAS,EAAE,OAAO,IAAI,MAAS;AAAA,EAC9D;AACA,SAAO;AACT;AAaO,IAAM,mBAAmB,CAAuB,SAAuC;AAC5F,QAAM,MAAsC,CAAC;AAE7C,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC7C,QAAI,OAAO,SAAS,GAAG,GAAG;AACxB,UAAI,GAAG,IAAI,KAAK,KAAK,GAAG;AACxB;AAAA,IACF;AAEA,QAAI,cAAc,GAAG,GAAG;AACtB,UAAI,IAAI,QAAQ,KAAK;AACnB,cAAM,IAAI,MAAM,iDAAiD,GAAG,iBAAiB,IAAI,GAAG,GAAG;AAAA,MACjG;AACA,UAAI,GAAG,IAAI;AACX;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,8CAA8C,GAAG,GAAG;AAAA,EACtE;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Tag
|
|
3
|
+
} from "./chunk-KL5ACTCT.js";
|
|
4
|
+
import {
|
|
5
|
+
__export
|
|
6
|
+
} from "./chunk-PZ5AY32C.js";
|
|
7
|
+
|
|
8
|
+
// src/Platform.ts
|
|
9
|
+
var Platform_exports = {};
|
|
10
|
+
__export(Platform_exports, {
|
|
11
|
+
NoopPlatform: () => NoopPlatform,
|
|
12
|
+
NoopPlatformLayer: () => NoopPlatformLayer,
|
|
13
|
+
defaultLayer: () => defaultLayer,
|
|
14
|
+
tag: () => tag
|
|
15
|
+
});
|
|
16
|
+
import { Effect, Layer } from "effect";
|
|
17
|
+
var tag = Tag;
|
|
18
|
+
var NoopPlatform = class {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.lifecycle = {
|
|
21
|
+
onSuspend: (_eff) => Effect.void,
|
|
22
|
+
onResume: (_eff) => Effect.void,
|
|
23
|
+
onReset: (_eff) => Effect.void
|
|
24
|
+
};
|
|
25
|
+
this.emitSuspend = () => Effect.void;
|
|
26
|
+
this.emitResume = () => Effect.void;
|
|
27
|
+
this.emitReset = () => Effect.void;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var NoopPlatformLayer = Layer.succeed(tag, new NoopPlatform());
|
|
31
|
+
var defaultLayer = NoopPlatformLayer;
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
tag,
|
|
35
|
+
NoopPlatform,
|
|
36
|
+
NoopPlatformLayer,
|
|
37
|
+
defaultLayer,
|
|
38
|
+
Platform_exports
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=chunk-ZDTRWK5F.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Platform.ts"],"sourcesContent":["import { Effect, Layer } from 'effect'\nimport * as Internal from './internal/platform/Platform.js'\n\n/**\n * Platform.Service: platform service interface.\n */\nexport type Service = Internal.Service\n\n/**\n * Platform.tag: platform service Tag.\n */\nexport const tag = Internal.Tag\n\n/**\n * NoopPlatform:\n * - The core engine ships with a single no-op platform implementation by default.\n * - Real implementations are provided by platform adapters (React / Native, etc.).\n */\nexport class NoopPlatform implements Service {\n readonly lifecycle = {\n onSuspend: (_eff: Effect.Effect<void, never, any>) => Effect.void,\n onResume: (_eff: Effect.Effect<void, never, any>) => Effect.void,\n onReset: (_eff: Effect.Effect<void, never, any>) => Effect.void,\n }\n\n readonly emitSuspend = (): Effect.Effect<void, never, any> => Effect.void\n readonly emitResume = (): Effect.Effect<void, never, any> => Effect.void\n readonly emitReset = (): Effect.Effect<void, never, any> => Effect.void\n}\n\n/**\n * NoopPlatformLayer:\n * - Mounts NoopPlatform on Platform.tag.\n * - The default `@logixjs/core` layer; apps typically override it with a real platform implementation.\n */\nexport const NoopPlatformLayer = Layer.succeed(tag, new NoopPlatform())\n\n/**\n * defaultLayer:\n * - Currently equivalent to NoopPlatformLayer.\n * - Reserved for future upgrades; callers should depend on defaultLayer.\n */\nexport const defaultLayer = NoopPlatformLayer\n"],"mappings":";;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,QAAQ,aAAa;AAWvB,IAAM,MAAe;AAOrB,IAAM,eAAN,MAAsC;AAAA,EAAtC;AACL,SAAS,YAAY;AAAA,MACnB,WAAW,CAAC,SAA0C,OAAO;AAAA,MAC7D,UAAU,CAAC,SAA0C,OAAO;AAAA,MAC5D,SAAS,CAAC,SAA0C,OAAO;AAAA,IAC7D;AAEA,SAAS,cAAc,MAAuC,OAAO;AACrE,SAAS,aAAa,MAAuC,OAAO;AACpE,SAAS,YAAY,MAAuC,OAAO;AAAA;AACrE;AAOO,IAAM,oBAAoB,MAAM,QAAQ,KAAK,IAAI,aAAa,CAAC;AAO/D,IAAM,eAAe;","names":[]}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isDevEnv
|
|
3
|
+
} from "./chunk-3QMIVH35.js";
|
|
4
|
+
import {
|
|
5
|
+
record
|
|
6
|
+
} from "./chunk-DMBALCE2.js";
|
|
7
|
+
|
|
8
|
+
// src/internal/runtime/core/TaskRunner.ts
|
|
9
|
+
import { Cause, Effect, Fiber, FiberRef, Ref, Stream } from "effect";
|
|
10
|
+
var inSyncTransactionFiber = FiberRef.unsafeMake(false);
|
|
11
|
+
var forceSourceRefresh = FiberRef.unsafeMake(false);
|
|
12
|
+
var inSyncTransactionGlobalDepth = 0;
|
|
13
|
+
var enterSyncTransaction = () => {
|
|
14
|
+
inSyncTransactionGlobalDepth += 1;
|
|
15
|
+
};
|
|
16
|
+
var exitSyncTransaction = () => {
|
|
17
|
+
inSyncTransactionGlobalDepth = Math.max(0, inSyncTransactionGlobalDepth - 1);
|
|
18
|
+
};
|
|
19
|
+
var isInSyncTransaction = () => inSyncTransactionGlobalDepth > 0;
|
|
20
|
+
var resolve = (eff, payload) => typeof eff === "function" ? eff(payload) : eff;
|
|
21
|
+
var defaultOrigins = (triggerName) => ({
|
|
22
|
+
pending: {
|
|
23
|
+
kind: "task:pending",
|
|
24
|
+
name: triggerName
|
|
25
|
+
},
|
|
26
|
+
success: {
|
|
27
|
+
kind: "service-callback",
|
|
28
|
+
name: "task:success"
|
|
29
|
+
},
|
|
30
|
+
failure: {
|
|
31
|
+
kind: "service-callback",
|
|
32
|
+
name: "task:failure"
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
var shouldNoopInSyncTransactionFiber = (options) => Effect.gen(function* () {
|
|
36
|
+
const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
|
|
37
|
+
if (!inTxn) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
if (isDevEnv()) {
|
|
41
|
+
yield* record({
|
|
42
|
+
type: "diagnostic",
|
|
43
|
+
moduleId: options.moduleId,
|
|
44
|
+
instanceId: options.instanceId,
|
|
45
|
+
code: options.code,
|
|
46
|
+
severity: options.severity,
|
|
47
|
+
message: options.message,
|
|
48
|
+
hint: options.hint,
|
|
49
|
+
actionTag: options.actionTag,
|
|
50
|
+
kind: options.kind
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
});
|
|
55
|
+
var resolveConcurrencyLimit = (runtime) => runtime.resolveConcurrencyPolicy ? runtime.resolveConcurrencyPolicy().pipe(Effect.map((p) => p.concurrencyLimit)) : Effect.succeed(16);
|
|
56
|
+
var runTaskLifecycle = (payload, runtime, config, getCanWriteBack) => Effect.gen(function* () {
|
|
57
|
+
const noop = yield* shouldNoopInSyncTransactionFiber({
|
|
58
|
+
moduleId: runtime.moduleId,
|
|
59
|
+
instanceId: runtime.instanceId,
|
|
60
|
+
code: "logic::invalid_usage",
|
|
61
|
+
severity: "error",
|
|
62
|
+
message: "run*Task is not allowed inside a synchronous StateTransaction body (it may deadlock the txnQueue).",
|
|
63
|
+
hint: "Call run*Task from the run section of a watcher (e.g. $.onAction/$.onState/$.on); do not call it directly inside a reducer / trait.run / synchronous transaction body. For long-lived flows, use a multi-entry pattern (pending \u2192 IO \u2192 writeback).",
|
|
64
|
+
kind: "run_task_in_transaction"
|
|
65
|
+
});
|
|
66
|
+
if (noop) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const defaults = defaultOrigins(config.triggerName);
|
|
70
|
+
const origins = {
|
|
71
|
+
pending: config.origin?.pending ?? defaults.pending,
|
|
72
|
+
success: config.origin?.success ?? defaults.success,
|
|
73
|
+
failure: config.origin?.failure ?? defaults.failure
|
|
74
|
+
};
|
|
75
|
+
const pending = config.pending;
|
|
76
|
+
if (pending) {
|
|
77
|
+
yield* Effect.uninterruptible(
|
|
78
|
+
runtime.runWithStateTransaction(origins.pending, () => Effect.asVoid(resolve(pending, payload)))
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
const io = resolve(config.effect, payload);
|
|
82
|
+
const exit = yield* Effect.exit(io);
|
|
83
|
+
if (getCanWriteBack) {
|
|
84
|
+
const ok = yield* getCanWriteBack;
|
|
85
|
+
if (!ok) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (exit._tag === "Success") {
|
|
90
|
+
const success = config.success;
|
|
91
|
+
if (success) {
|
|
92
|
+
yield* runtime.runWithStateTransaction(origins.success, () => Effect.asVoid(success(exit.value, payload)));
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const cause = exit.cause;
|
|
97
|
+
if (Cause.isInterrupted(cause)) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const failure = config.failure;
|
|
101
|
+
if (failure) {
|
|
102
|
+
yield* runtime.runWithStateTransaction(origins.failure, () => Effect.asVoid(failure(cause, payload)));
|
|
103
|
+
}
|
|
104
|
+
}).pipe(
|
|
105
|
+
// Watchers must not crash as a whole due to a single task failure: swallow errors, but keep them diagnosable.
|
|
106
|
+
Effect.catchAllCause(
|
|
107
|
+
(cause) => record({
|
|
108
|
+
type: "diagnostic",
|
|
109
|
+
moduleId: runtime.moduleId,
|
|
110
|
+
instanceId: runtime.instanceId,
|
|
111
|
+
code: "task_runner::unhandled_failure",
|
|
112
|
+
severity: "error",
|
|
113
|
+
message: "TaskRunner encountered an unhandled failure (pending/IO/writeback).",
|
|
114
|
+
hint: "Add a failure writeback for this task or handle errors explicitly upstream; avoid fire-and-forget swallowing errors.",
|
|
115
|
+
actionTag: config.triggerName,
|
|
116
|
+
kind: "task_runner_unhandled_failure",
|
|
117
|
+
trigger: {
|
|
118
|
+
kind: "task",
|
|
119
|
+
name: config.triggerName
|
|
120
|
+
}
|
|
121
|
+
}).pipe(Effect.zipRight(Effect.logError("TaskRunner error", cause)))
|
|
122
|
+
)
|
|
123
|
+
);
|
|
124
|
+
var makeTaskRunner = (stream, mode, runtime, config) => {
|
|
125
|
+
if (mode === "latest") {
|
|
126
|
+
return Effect.gen(function* () {
|
|
127
|
+
const taskIdRef = yield* Ref.make(0);
|
|
128
|
+
const currentFiberRef = yield* Ref.make(void 0);
|
|
129
|
+
const start = (payload) => Effect.gen(function* () {
|
|
130
|
+
const taskId = yield* Ref.updateAndGet(taskIdRef, (n) => n + 1);
|
|
131
|
+
const prev = yield* Ref.get(currentFiberRef);
|
|
132
|
+
if (prev) {
|
|
133
|
+
yield* Fiber.interruptFork(prev);
|
|
134
|
+
}
|
|
135
|
+
const canWriteBack = Ref.get(taskIdRef).pipe(Effect.map((current) => current === taskId));
|
|
136
|
+
const fiber = yield* Effect.fork(
|
|
137
|
+
runTaskLifecycle(payload, runtime, config, canWriteBack)
|
|
138
|
+
);
|
|
139
|
+
yield* Ref.set(currentFiberRef, fiber);
|
|
140
|
+
});
|
|
141
|
+
return yield* Stream.runForEach(stream, start);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (mode === "exhaust") {
|
|
145
|
+
return Effect.gen(function* () {
|
|
146
|
+
const concurrency = yield* resolveConcurrencyLimit(runtime);
|
|
147
|
+
const busyRef = yield* Ref.make(false);
|
|
148
|
+
const mapper = (payload) => Effect.gen(function* () {
|
|
149
|
+
const acquired = yield* Ref.modify(
|
|
150
|
+
busyRef,
|
|
151
|
+
(busy) => busy ? [false, busy] : [true, true]
|
|
152
|
+
);
|
|
153
|
+
if (!acquired) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
yield* runTaskLifecycle(payload, runtime, config);
|
|
158
|
+
} finally {
|
|
159
|
+
yield* Ref.set(busyRef, false);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
return yield* Stream.runDrain(stream.pipe(Stream.mapEffect(mapper, { concurrency })));
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
if (mode === "parallel") {
|
|
166
|
+
return Effect.gen(function* () {
|
|
167
|
+
const concurrency = yield* resolveConcurrencyLimit(runtime);
|
|
168
|
+
return yield* Stream.runDrain(
|
|
169
|
+
stream.pipe(
|
|
170
|
+
Stream.mapEffect((payload) => runTaskLifecycle(payload, runtime, config), {
|
|
171
|
+
concurrency
|
|
172
|
+
})
|
|
173
|
+
)
|
|
174
|
+
);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return Stream.runForEach(
|
|
178
|
+
stream,
|
|
179
|
+
(payload) => runTaskLifecycle(payload, runtime, config)
|
|
180
|
+
);
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
export {
|
|
184
|
+
inSyncTransactionFiber,
|
|
185
|
+
forceSourceRefresh,
|
|
186
|
+
enterSyncTransaction,
|
|
187
|
+
exitSyncTransaction,
|
|
188
|
+
isInSyncTransaction,
|
|
189
|
+
shouldNoopInSyncTransactionFiber,
|
|
190
|
+
makeTaskRunner
|
|
191
|
+
};
|
|
192
|
+
//# sourceMappingURL=chunk-ZFLHVFUC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/runtime/core/TaskRunner.ts"],"sourcesContent":["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"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeFieldPath
|
|
3
|
+
} from "./chunk-IHVBV5C2.js";
|
|
4
|
+
import {
|
|
5
|
+
fnv1a32,
|
|
6
|
+
stableStringify
|
|
7
|
+
} from "./chunk-GMPEOUP2.js";
|
|
8
|
+
|
|
9
|
+
// src/internal/state-trait/ir.ts
|
|
10
|
+
var normalizeFieldPaths = (paths) => {
|
|
11
|
+
if (!paths || paths.length === 0) return [];
|
|
12
|
+
const out = [];
|
|
13
|
+
for (const path of paths) {
|
|
14
|
+
const normalized = normalizeFieldPath(path);
|
|
15
|
+
if (normalized) out.push(normalized);
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
};
|
|
19
|
+
var normalizeFieldPath2 = (path) => path ? normalizeFieldPath(path) : void 0;
|
|
20
|
+
var toNodeKind = (step) => {
|
|
21
|
+
switch (step.kind) {
|
|
22
|
+
case "computed-update":
|
|
23
|
+
return "computed";
|
|
24
|
+
case "link-propagate":
|
|
25
|
+
return "link";
|
|
26
|
+
case "source-refresh":
|
|
27
|
+
return "source";
|
|
28
|
+
case "check-validate":
|
|
29
|
+
return "check";
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
var findEntryForStep = (program, step) => {
|
|
33
|
+
const fieldPath = step.targetFieldPath;
|
|
34
|
+
if (!fieldPath) return void 0;
|
|
35
|
+
const kind = toNodeKind(step);
|
|
36
|
+
return program.entries.find(
|
|
37
|
+
(e) => e.fieldPath === fieldPath && (e.kind === kind || kind === "check" && e.kind === "check" || kind === "source" && e.kind === "source" || kind === "link" && e.kind === "link" || kind === "computed" && e.kind === "computed")
|
|
38
|
+
);
|
|
39
|
+
};
|
|
40
|
+
var getReadsForEntry = (entry) => {
|
|
41
|
+
if (!entry) return void 0;
|
|
42
|
+
if (entry.kind === "computed") {
|
|
43
|
+
return entry.meta.deps;
|
|
44
|
+
}
|
|
45
|
+
if (entry.kind === "source") {
|
|
46
|
+
return entry.meta.deps;
|
|
47
|
+
}
|
|
48
|
+
if (entry.kind === "link") {
|
|
49
|
+
const from = entry.meta.from;
|
|
50
|
+
return from ? [from] : [];
|
|
51
|
+
}
|
|
52
|
+
if (entry.kind === "check") {
|
|
53
|
+
const rules = entry.meta?.rules ?? {};
|
|
54
|
+
const out = [];
|
|
55
|
+
for (const name of Object.keys(rules)) {
|
|
56
|
+
const rule = rules[name];
|
|
57
|
+
const deps = rule?.deps;
|
|
58
|
+
if (deps) out.push(...deps);
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
return void 0;
|
|
63
|
+
};
|
|
64
|
+
var exportStaticIr = (params) => {
|
|
65
|
+
const moduleId = params.moduleId;
|
|
66
|
+
const version = params.version ?? "009";
|
|
67
|
+
const metaByField = /* @__PURE__ */ new Map();
|
|
68
|
+
for (const node of params.program.graph.nodes) {
|
|
69
|
+
const meta = node.meta;
|
|
70
|
+
if (!meta || typeof meta !== "object") continue;
|
|
71
|
+
const label = typeof meta.label === "string" ? meta.label : void 0;
|
|
72
|
+
const description = typeof meta.description === "string" ? meta.description : void 0;
|
|
73
|
+
const tags = Array.isArray(meta.tags) && meta.tags.every((t) => typeof t === "string") ? meta.tags : void 0;
|
|
74
|
+
const group = typeof meta.group === "string" ? meta.group : void 0;
|
|
75
|
+
const docsUrl = typeof meta.docsUrl === "string" ? meta.docsUrl : void 0;
|
|
76
|
+
const cacheGroup = typeof meta.cacheGroup === "string" ? meta.cacheGroup : void 0;
|
|
77
|
+
const annotationsRaw = meta.annotations;
|
|
78
|
+
const annotations = annotationsRaw && typeof annotationsRaw === "object" && !Array.isArray(annotationsRaw) ? annotationsRaw : void 0;
|
|
79
|
+
if (label || description || tags || group || docsUrl || cacheGroup || annotations) {
|
|
80
|
+
metaByField.set(node.id, {
|
|
81
|
+
label,
|
|
82
|
+
description,
|
|
83
|
+
tags,
|
|
84
|
+
group,
|
|
85
|
+
docsUrl,
|
|
86
|
+
cacheGroup,
|
|
87
|
+
annotations
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const nodes = params.program.plan.steps.map((step) => {
|
|
92
|
+
const kind = toNodeKind(step);
|
|
93
|
+
const entry = findEntryForStep(params.program, step);
|
|
94
|
+
const reads = normalizeFieldPaths(getReadsForEntry(entry));
|
|
95
|
+
const target = step.targetFieldPath;
|
|
96
|
+
const write = normalizeFieldPath2(target);
|
|
97
|
+
const writes = write ? [write] : [];
|
|
98
|
+
const meta = target ? metaByField.get(target) : void 0;
|
|
99
|
+
const base2 = {
|
|
100
|
+
nodeId: step.id,
|
|
101
|
+
kind,
|
|
102
|
+
reads,
|
|
103
|
+
writes: kind === "check" ? [] : writes,
|
|
104
|
+
meta
|
|
105
|
+
};
|
|
106
|
+
if (kind !== "check" && target && !write) {
|
|
107
|
+
return { ...base2, writesUnknown: true };
|
|
108
|
+
}
|
|
109
|
+
return base2;
|
|
110
|
+
});
|
|
111
|
+
const edges = params.program.graph.edges.map((edge) => ({
|
|
112
|
+
edgeId: edge.id,
|
|
113
|
+
from: edge.from,
|
|
114
|
+
to: edge.to,
|
|
115
|
+
kind: edge.kind
|
|
116
|
+
}));
|
|
117
|
+
const base = {
|
|
118
|
+
version,
|
|
119
|
+
moduleId,
|
|
120
|
+
nodes,
|
|
121
|
+
edges
|
|
122
|
+
};
|
|
123
|
+
const digest = `stir:${version}:${fnv1a32(stableStringify(base))}`;
|
|
124
|
+
return {
|
|
125
|
+
...base,
|
|
126
|
+
digest
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export {
|
|
131
|
+
exportStaticIr
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=chunk-ZFY7U2FR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/state-trait/ir.ts"],"sourcesContent":["import type { StateTraitEntry, StateTraitPlanStep, StateTraitProgram } from './model.js'\nimport * as CanonicalFieldPath from '../field-path.js'\nimport { fnv1a32, stableStringify } from '../digest.js'\n\nexport type FieldPath = CanonicalFieldPath.FieldPath\n\nexport interface StaticIrNode {\n readonly nodeId: string\n readonly kind: string\n readonly reads: ReadonlyArray<FieldPath>\n readonly writes: ReadonlyArray<FieldPath>\n readonly writesUnknown?: boolean\n readonly policy?: Record<string, unknown>\n readonly meta?: {\n readonly label?: string\n readonly description?: string\n readonly tags?: ReadonlyArray<string>\n readonly group?: string\n readonly docsUrl?: string\n readonly cacheGroup?: string\n readonly annotations?: Record<string, unknown>\n }\n}\n\nexport interface StaticIrEdge {\n readonly edgeId: string\n readonly from: string\n readonly to: string\n readonly kind: string\n}\n\nexport interface StaticIr {\n readonly version: string\n readonly moduleId: string\n /**\n * Stable digest (for drift detection / diffing): determined solely by the current export structure.\n */\n readonly digest: string\n readonly nodes: ReadonlyArray<StaticIrNode>\n readonly edges: ReadonlyArray<StaticIrEdge>\n readonly conflicts?: ReadonlyArray<unknown>\n}\n\nconst normalizeFieldPaths = (paths: ReadonlyArray<string> | undefined): ReadonlyArray<FieldPath> => {\n if (!paths || paths.length === 0) return []\n const out: Array<FieldPath> = []\n for (const path of paths) {\n const normalized = CanonicalFieldPath.normalizeFieldPath(path)\n if (normalized) out.push(normalized)\n }\n return out\n}\n\nconst normalizeFieldPath = (path: string | undefined): FieldPath | undefined =>\n path ? CanonicalFieldPath.normalizeFieldPath(path) : undefined\n\nconst toNodeKind = (step: StateTraitPlanStep): string => {\n switch (step.kind) {\n case 'computed-update':\n return 'computed'\n case 'link-propagate':\n return 'link'\n case 'source-refresh':\n return 'source'\n case 'check-validate':\n return 'check'\n }\n}\n\nconst findEntryForStep = (\n program: StateTraitProgram<any>,\n step: StateTraitPlanStep,\n): StateTraitEntry<any, string> | undefined => {\n const fieldPath = step.targetFieldPath\n if (!fieldPath) return undefined\n const kind = toNodeKind(step)\n return program.entries.find(\n (e) =>\n e.fieldPath === fieldPath &&\n (e.kind === kind ||\n (kind === 'check' && e.kind === 'check') ||\n (kind === 'source' && e.kind === 'source') ||\n (kind === 'link' && e.kind === 'link') ||\n (kind === 'computed' && e.kind === 'computed')),\n )\n}\n\nconst getReadsForEntry = (entry: StateTraitEntry<any, string> | undefined): ReadonlyArray<string> | undefined => {\n if (!entry) return undefined\n if (entry.kind === 'computed') {\n return (entry.meta as any).deps as ReadonlyArray<string> | undefined\n }\n if (entry.kind === 'source') {\n return (entry.meta as any).deps as ReadonlyArray<string> | undefined\n }\n if (entry.kind === 'link') {\n const from = (entry.meta as any).from as string | undefined\n return from ? [from] : []\n }\n if (entry.kind === 'check') {\n const rules = ((entry.meta as any)?.rules ?? {}) as Record<string, any>\n const out: Array<string> = []\n for (const name of Object.keys(rules)) {\n const rule = rules[name]\n const deps = rule?.deps as ReadonlyArray<string> | undefined\n if (deps) out.push(...deps)\n }\n return out\n }\n return undefined\n}\n\nexport const exportStaticIr = (params: {\n readonly program: StateTraitProgram<any>\n readonly moduleId: string\n readonly version?: string\n}): StaticIr => {\n const moduleId = params.moduleId\n const version = params.version ?? '009'\n\n const metaByField = new Map<\n string,\n {\n readonly label?: string\n readonly description?: string\n readonly tags?: ReadonlyArray<string>\n readonly group?: string\n readonly docsUrl?: string\n readonly cacheGroup?: string\n readonly annotations?: Record<string, unknown>\n }\n >()\n for (const node of params.program.graph.nodes) {\n const meta = node.meta as any\n if (!meta || typeof meta !== 'object') continue\n const label = typeof meta.label === 'string' ? meta.label : undefined\n const description = typeof meta.description === 'string' ? meta.description : undefined\n const tags =\n Array.isArray(meta.tags) && meta.tags.every((t: unknown) => typeof t === 'string')\n ? (meta.tags as ReadonlyArray<string>)\n : undefined\n const group = typeof meta.group === 'string' ? meta.group : undefined\n const docsUrl = typeof meta.docsUrl === 'string' ? meta.docsUrl : undefined\n const cacheGroup = typeof meta.cacheGroup === 'string' ? meta.cacheGroup : undefined\n\n const annotationsRaw = meta.annotations\n const annotations =\n annotationsRaw && typeof annotationsRaw === 'object' && !Array.isArray(annotationsRaw)\n ? (annotationsRaw as Record<string, unknown>)\n : undefined\n\n if (label || description || tags || group || docsUrl || cacheGroup || annotations) {\n metaByField.set(node.id, {\n label,\n description,\n tags,\n group,\n docsUrl,\n cacheGroup,\n annotations,\n })\n }\n }\n\n const nodes: Array<StaticIrNode> = params.program.plan.steps.map((step) => {\n const kind = toNodeKind(step)\n const entry = findEntryForStep(params.program, step)\n const reads = normalizeFieldPaths(getReadsForEntry(entry))\n\n const target = step.targetFieldPath\n const write = normalizeFieldPath(target)\n const writes = write ? [write] : []\n\n const meta = target ? metaByField.get(target) : undefined\n\n const base: StaticIrNode = {\n nodeId: step.id,\n kind,\n reads,\n writes: kind === 'check' ? [] : writes,\n meta,\n }\n\n if (kind !== 'check' && target && !write) {\n return { ...base, writesUnknown: true }\n }\n return base\n })\n\n const edges: Array<StaticIrEdge> = params.program.graph.edges.map((edge) => ({\n edgeId: edge.id,\n from: edge.from,\n to: edge.to,\n kind: edge.kind,\n }))\n\n const base = {\n version,\n moduleId,\n nodes,\n edges,\n } as const\n\n const digest = `stir:${version}:${fnv1a32(stableStringify(base))}`\n\n return {\n ...base,\n digest,\n }\n}\n"],"mappings":"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","names":["normalizeFieldPath","base"]}
|