@logixjs/core 0.0.1 → 1.0.0
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/LICENSE +201 -0
- package/dist/{Action-mqVvtEHt.d.ts → Action-DYl88bwj.d.ts} +1 -1
- package/dist/{Action-BkRHy2vg.d.cts → Action-DkxsI_DK.d.cts} +1 -1
- package/dist/Action.cjs.map +1 -1
- package/dist/Action.d.cts +1 -1
- package/dist/Action.d.ts +1 -1
- package/dist/Action.js +2 -2
- package/dist/{Actions-AsQ07yTP.d.cts → Actions-Dicm7jdc.d.cts} +2 -2
- package/dist/{Actions-AsQ07yTP.d.ts → Actions-Dicm7jdc.d.ts} +2 -2
- package/dist/Actions.cjs.map +1 -1
- package/dist/Actions.d.cts +1 -1
- package/dist/Actions.d.ts +1 -1
- package/dist/Actions.js +1 -1
- package/dist/{Bound-BN1DQ_lM.d.ts → Bound-1OJLzVIS.d.ts} +2 -2
- package/dist/{Bound-BPIfH9SS.d.cts → Bound-BMLrtQ1V.d.cts} +2 -2
- package/dist/Bound.cjs +1737 -399
- package/dist/Bound.cjs.map +1 -1
- package/dist/Bound.d.cts +5 -5
- package/dist/Bound.d.ts +5 -5
- package/dist/Bound.js +19 -17
- package/dist/{Debug-B5q5Bkzx.d.ts → Debug-DKrWP5H1.d.ts} +40 -22
- package/dist/{Debug-Bq8Sqjcr.d.cts → Debug-hIT44XsY.d.cts} +40 -22
- package/dist/Debug.cjs +1348 -318
- package/dist/Debug.cjs.map +1 -1
- package/dist/Debug.d.cts +12 -11
- package/dist/Debug.d.ts +12 -11
- package/dist/Debug.js +20 -11
- package/dist/EffectOp.cjs +15 -6
- package/dist/EffectOp.cjs.map +1 -1
- package/dist/EffectOp.js +3 -3
- package/dist/Env.cjs +772 -6
- package/dist/Env.cjs.map +1 -1
- package/dist/Env.js +5 -2
- package/dist/ExternalStore-DqJKKRJ4.d.ts +61 -0
- package/dist/ExternalStore-JC-gAgEI.d.cts +61 -0
- package/dist/ExternalStore.cjs +774 -0
- package/dist/ExternalStore.cjs.map +1 -0
- package/dist/ExternalStore.d.cts +8 -0
- package/dist/ExternalStore.d.ts +8 -0
- package/dist/ExternalStore.js +19 -0
- package/dist/ExternalStore.js.map +1 -0
- package/dist/{Flow-BhpjE22E.d.ts → Flow-CZmXRDqp.d.cts} +13 -4
- package/dist/{Flow-1fZT8MpX.d.cts → Flow-DIVDxz7R.d.ts} +13 -4
- package/dist/Flow.cjs +765 -148
- package/dist/Flow.cjs.map +1 -1
- package/dist/Flow.d.cts +6 -6
- package/dist/Flow.d.ts +6 -6
- package/dist/Flow.js +9 -8
- package/dist/{Handle-D_cLW1Z3.d.ts → Handle-Bo6cAFut.d.ts} +1 -1
- package/dist/{Handle-D8D1zPb_.d.cts → Handle-CfDvSqN7.d.cts} +1 -1
- package/dist/Handle.d.cts +5 -5
- package/dist/Handle.d.ts +5 -5
- package/dist/{Kernel-8kC-jOda.d.cts → Kernel-CuXBF9S_.d.cts} +16 -7
- package/dist/{Kernel-CnGE1Fyk.d.ts → Kernel-D9guNwRL.d.ts} +16 -7
- package/dist/Kernel.cjs +814 -26
- package/dist/Kernel.cjs.map +1 -1
- package/dist/Kernel.d.cts +13 -12
- package/dist/Kernel.d.ts +13 -12
- package/dist/Kernel.js +7 -4
- package/dist/{Link-Db7975nU.d.ts → Link-CUM0yUCH.d.ts} +10 -3
- package/dist/{Link-fX8x1eCK.d.cts → Link-NAfR6uGD.d.cts} +10 -3
- package/dist/Link.cjs +1294 -121
- package/dist/Link.cjs.map +1 -1
- package/dist/Link.d.cts +5 -5
- package/dist/Link.d.ts +5 -5
- package/dist/Link.js +37 -29
- package/dist/{Logic-DRh4sDZj.d.cts → Logic-09VQpIj3.d.cts} +7 -4
- package/dist/{Logic-BRjEMr-W.d.ts → Logic-DKg7ghGy.d.ts} +7 -4
- package/dist/Logic.cjs +2 -1
- package/dist/Logic.cjs.map +1 -1
- package/dist/Logic.d.cts +5 -5
- package/dist/Logic.d.ts +5 -5
- package/dist/Logic.js +1 -1
- package/dist/{MatchBuilder-CJk5oCkR.d.cts → MatchBuilder-CsW5jgrL.d.ts} +1 -1
- package/dist/{MatchBuilder-0QOc-nlU.d.ts → MatchBuilder-Dksk07F4.d.cts} +1 -1
- package/dist/MatchBuilder.cjs +2 -2
- package/dist/MatchBuilder.cjs.map +1 -1
- package/dist/MatchBuilder.d.cts +6 -6
- package/dist/MatchBuilder.d.ts +6 -6
- package/dist/MatchBuilder.js +2 -2
- package/dist/Middleware-D8tUDLv_.d.cts +100 -0
- package/dist/Middleware-DS7CbTTN.d.ts +100 -0
- package/dist/Middleware.cjs +678 -58
- package/dist/Middleware.cjs.map +1 -1
- package/dist/Middleware.d.cts +2 -86
- package/dist/Middleware.d.ts +2 -86
- package/dist/Middleware.js +15 -12
- package/dist/{Module-DnzluX2J.d.ts → Module-B_Cntyms.d.ts} +54 -25
- package/dist/{Module-B_0xRDMR.d.cts → Module-CmNOVXzf.d.cts} +54 -25
- package/dist/Module.cjs +9331 -3317
- package/dist/Module.cjs.map +1 -1
- package/dist/Module.d.cts +7 -6
- package/dist/Module.d.ts +7 -6
- package/dist/Module.js +39 -31
- package/dist/ModuleTag-CGho_InD.d.ts +113 -0
- package/dist/ModuleTag-CITb8L_G.d.cts +113 -0
- package/dist/ModuleTag.cjs +7248 -2847
- package/dist/ModuleTag.cjs.map +1 -1
- package/dist/ModuleTag.d.cts +6 -6
- package/dist/ModuleTag.d.ts +6 -6
- package/dist/ModuleTag.js +35 -29
- package/dist/Observability-Bdhnx2Dv.d.ts +385 -0
- package/dist/Observability-DXGAFBIT.d.cts +385 -0
- package/dist/Observability.cjs +5093 -1556
- package/dist/Observability.cjs.map +1 -1
- package/dist/Observability.d.cts +6 -7
- package/dist/Observability.d.ts +6 -7
- package/dist/Observability.js +28 -23
- package/dist/{Platform-CHX8o-U4.d.ts → Platform-B4s8tg6C.d.cts} +4 -5
- package/dist/{Platform-C49Pv956.d.cts → Platform-BV_0MW7g.d.cts} +5 -2
- package/dist/{Platform-C49Pv956.d.ts → Platform-BV_0MW7g.d.ts} +5 -2
- package/dist/{Platform-CVlv0xLQ.d.cts → Platform-W0Mefy_e.d.ts} +4 -5
- package/dist/Platform.cjs +2 -1
- package/dist/Platform.cjs.map +1 -1
- package/dist/Platform.d.cts +2 -3
- package/dist/Platform.d.ts +2 -3
- package/dist/Platform.js +2 -2
- package/dist/{Process-CM9xbMdP.d.ts → Process-CO8G7HO9.d.cts} +30 -5
- package/dist/{Process-mL8fHDSB.d.cts → Process-Cyf6VNDR.d.ts} +30 -5
- package/dist/Process.cjs +1288 -120
- package/dist/Process.cjs.map +1 -1
- package/dist/Process.d.cts +6 -6
- package/dist/Process.d.ts +6 -6
- package/dist/Process.js +34 -26
- package/dist/ReadQuery-C_or5nLC.d.ts +128 -0
- package/dist/ReadQuery-DXLzCE0E.d.cts +614 -0
- package/dist/ReadQuery-DXLzCE0E.d.ts +614 -0
- package/dist/ReadQuery-Yve1lmUo.d.cts +128 -0
- package/dist/ReadQuery.cjs +290 -5
- package/dist/ReadQuery.cjs.map +1 -1
- package/dist/ReadQuery.d.cts +3 -2
- package/dist/ReadQuery.d.ts +3 -2
- package/dist/ReadQuery.js +23 -5
- package/dist/{Reflection-CQnKwPXj.d.ts → Reflection-B2Xi1e4Q.d.ts} +89 -7
- package/dist/{Reflection-Kabo1mlU.d.cts → Reflection-DNB4V4_e.d.cts} +89 -7
- package/dist/Reflection.cjs +3227 -1617
- package/dist/Reflection.cjs.map +1 -1
- package/dist/Reflection.d.cts +17 -15
- package/dist/Reflection.d.ts +17 -15
- package/dist/Reflection.js +33 -25
- package/dist/{Resource-Dy1xD_DG.d.cts → Resource-pKvQQ4x5.d.cts} +3 -3
- package/dist/{Resource-Dy1xD_DG.d.ts → Resource-pKvQQ4x5.d.ts} +3 -3
- package/dist/Resource.cjs +781 -15
- package/dist/Resource.cjs.map +1 -1
- package/dist/Resource.d.cts +1 -1
- package/dist/Resource.d.ts +1 -1
- package/dist/Resource.js +6 -3
- package/dist/{Root-7ADUMk4t.d.cts → Root-CCVuFHB6.d.cts} +3 -3
- package/dist/{Root-7ADUMk4t.d.ts → Root-CCVuFHB6.d.ts} +3 -3
- package/dist/Root.cjs +786 -20
- package/dist/Root.cjs.map +1 -1
- package/dist/Root.d.cts +2 -2
- package/dist/Root.d.ts +2 -2
- package/dist/Root.js +7 -3
- package/dist/{Runtime-CtyzZG4i.d.ts → Runtime-CRmvwK4I.d.ts} +70 -14
- package/dist/{Runtime-B-aL-f29.d.cts → Runtime-C_wJM9mN.d.cts} +70 -14
- package/dist/Runtime.cjs +4942 -1601
- package/dist/Runtime.cjs.map +1 -1
- package/dist/Runtime.d.cts +17 -15
- package/dist/Runtime.d.ts +17 -15
- package/dist/Runtime.js +44 -32
- package/dist/{ScopeRegistry-D1owDNSm.d.cts → ScopeRegistry-BhYzqWri.d.cts} +6 -6
- package/dist/{ScopeRegistry-D1owDNSm.d.ts → ScopeRegistry-BhYzqWri.d.ts} +6 -6
- package/dist/ScopeRegistry.cjs +776 -10
- package/dist/ScopeRegistry.cjs.map +1 -1
- package/dist/ScopeRegistry.d.cts +1 -1
- package/dist/ScopeRegistry.d.ts +1 -1
- package/dist/ScopeRegistry.js +6 -3
- package/dist/{State-CU50R26M.d.cts → State-rNFsFPTl.d.cts} +2 -2
- package/dist/{State-CU50R26M.d.ts → State-rNFsFPTl.d.ts} +2 -2
- package/dist/State.cjs.map +1 -1
- package/dist/State.d.cts +1 -1
- package/dist/State.d.ts +1 -1
- package/dist/State.js +1 -1
- package/dist/{StateTrait-BGsZghTz.d.ts → StateTrait-CijdwNb6.d.ts} +25 -8
- package/dist/{StateTrait-OWhbj12c.d.cts → StateTrait-Dltto6PU.d.cts} +25 -8
- package/dist/StateTrait.cjs +1890 -528
- package/dist/StateTrait.cjs.map +1 -1
- package/dist/StateTrait.d.cts +9 -7
- package/dist/StateTrait.d.ts +9 -7
- package/dist/StateTrait.js +18 -14
- package/dist/{TraitLifecycle-CwV5WPFX.d.cts → TraitLifecycle-BKzDqzLu.d.cts} +2 -2
- package/dist/{TraitLifecycle-LdIWmKlg.d.ts → TraitLifecycle-Cvo94uDB.d.ts} +2 -2
- package/dist/TraitLifecycle.cjs +630 -67
- package/dist/TraitLifecycle.cjs.map +1 -1
- package/dist/TraitLifecycle.d.cts +6 -6
- package/dist/TraitLifecycle.d.ts +6 -6
- package/dist/TraitLifecycle.js +8 -7
- package/dist/Workflow-C_OWr4dV.d.ts +415 -0
- package/dist/Workflow-DmydkHO8.d.cts +415 -0
- package/dist/Workflow.cjs +3150 -0
- package/dist/Workflow.cjs.map +1 -0
- package/dist/Workflow.d.cts +7 -0
- package/dist/Workflow.d.ts +7 -0
- package/dist/Workflow.js +58 -0
- package/dist/Workflow.js.map +1 -0
- package/dist/{action-DiMDD_0v.d.cts → action-BQxjPFEw.d.cts} +5 -5
- package/dist/{action-DiMDD_0v.d.ts → action-BQxjPFEw.d.ts} +5 -5
- package/dist/chunk-2XRLXDWR.js +276 -0
- package/dist/chunk-2XRLXDWR.js.map +1 -0
- package/dist/chunk-3L6QGFMM.js +701 -0
- package/dist/chunk-3L6QGFMM.js.map +1 -0
- package/dist/{chunk-GMPEOUP2.js → chunk-4MZ7BT3R.js} +2 -2
- package/dist/chunk-4MZ7BT3R.js.map +1 -0
- package/dist/{chunk-3IYZ5IGG.js → chunk-5WKUGEBY.js} +2 -2
- package/dist/{chunk-3RMKLXHX.js → chunk-63ZQ5RIN.js} +2 -2
- package/dist/{chunk-M3WTHJHJ.js → chunk-67DIEA53.js} +385 -148
- package/dist/chunk-67DIEA53.js.map +1 -0
- package/dist/{chunk-YS3AZQ2G.js → chunk-6HFAW2MH.js} +1 -1
- package/dist/chunk-6HFAW2MH.js.map +1 -0
- package/dist/{chunk-EY4NZKDR.js → chunk-6Y2TKCNY.js} +2 -2
- package/dist/{chunk-76WT3HOR.js → chunk-6YZOXFPQ.js} +25 -24
- package/dist/chunk-6YZOXFPQ.js.map +1 -0
- package/dist/{chunk-G5ZBFPNU.js → chunk-A2RQOJC7.js} +2 -2
- package/dist/{chunk-AUIR5O6W.js → chunk-AFSB6NKM.js} +13 -19
- package/dist/chunk-AFSB6NKM.js.map +1 -0
- package/dist/{chunk-JCXGZRMU.js → chunk-AO4JEOKD.js} +22 -23
- package/dist/chunk-AO4JEOKD.js.map +1 -0
- package/dist/{chunk-TAAPQVZN.js → chunk-AYELIQXR.js} +2 -2
- package/dist/{chunk-QMM6O4CD.js → chunk-BLHZW7DG.js} +15 -3
- package/dist/{chunk-QMM6O4CD.js.map → chunk-BLHZW7DG.js.map} +1 -1
- package/dist/{chunk-TQOBJYDP.js → chunk-CD4N74YC.js} +1 -1
- package/dist/chunk-CD4N74YC.js.map +1 -0
- package/dist/{chunk-ANLBCBDC.js → chunk-CGE2HBTH.js} +11 -11
- package/dist/chunk-CGE2HBTH.js.map +1 -0
- package/dist/{chunk-OFADUJWJ.js → chunk-CYYSQMLO.js} +5 -5
- package/dist/chunk-CYYSQMLO.js.map +1 -0
- package/dist/{chunk-66ALHVEX.js → chunk-EB46EYI7.js} +3 -3
- package/dist/{chunk-NZJKFF45.js → chunk-EKCDHWRK.js} +4 -4
- package/dist/chunk-EKCDHWRK.js.map +1 -0
- package/dist/{chunk-BABLDP24.js → chunk-EPQFNJU3.js} +152 -7
- package/dist/chunk-EPQFNJU3.js.map +1 -0
- package/dist/{chunk-OGWBVHB3.js → chunk-ESR6HGOY.js} +73 -14
- package/dist/chunk-ESR6HGOY.js.map +1 -0
- package/dist/{chunk-NBD3KUOZ.js → chunk-F6RP62H3.js} +150 -98
- package/dist/chunk-F6RP62H3.js.map +1 -0
- package/dist/chunk-FBYW3QDI.js +252 -0
- package/dist/chunk-FBYW3QDI.js.map +1 -0
- package/dist/{chunk-IPF7E66P.js → chunk-FYAODKVP.js} +2 -2
- package/dist/chunk-GNEN7NKO.js +908 -0
- package/dist/chunk-GNEN7NKO.js.map +1 -0
- package/dist/chunk-GWSM4KLB.js +763 -0
- package/dist/chunk-GWSM4KLB.js.map +1 -0
- package/dist/{chunk-4SO6JMZL.js → chunk-HDMXCUZL.js} +1 -1
- package/dist/chunk-HDMXCUZL.js.map +1 -0
- package/dist/{chunk-ZFY7U2FR.js → chunk-HJM5Y5NU.js} +43 -3
- package/dist/chunk-HJM5Y5NU.js.map +1 -0
- package/dist/{chunk-ZGDVUPTM.js → chunk-IOZ3VKPK.js} +129 -68
- package/dist/chunk-IOZ3VKPK.js.map +1 -0
- package/dist/{chunk-PYOE4VSI.js → chunk-IVXSVHO4.js} +303 -247
- package/dist/chunk-IVXSVHO4.js.map +1 -0
- package/dist/chunk-J3CWXIPV.js +242 -0
- package/dist/chunk-J3CWXIPV.js.map +1 -0
- package/dist/chunk-K6JQW266.js +42 -0
- package/dist/chunk-K6JQW266.js.map +1 -0
- package/dist/chunk-KMZYQF6Q.js +202 -0
- package/dist/chunk-KMZYQF6Q.js.map +1 -0
- package/dist/{chunk-JWOYLO27.js → chunk-LPPZDFTD.js} +22 -12
- package/dist/chunk-LPPZDFTD.js.map +1 -0
- package/dist/{chunk-PAYXCY6A.js → chunk-MYB2B5WX.js} +997 -576
- package/dist/chunk-MYB2B5WX.js.map +1 -0
- package/dist/chunk-MYKNINNN.js +228 -0
- package/dist/chunk-MYKNINNN.js.map +1 -0
- package/dist/chunk-NSQIRMVF.js +27 -0
- package/dist/{chunk-QCHIQWAJ.js.map → chunk-NSQIRMVF.js.map} +1 -1
- package/dist/chunk-NUDBM4MM.js +30 -0
- package/dist/chunk-NUDBM4MM.js.map +1 -0
- package/dist/chunk-NZMWWDAY.js +23 -0
- package/dist/chunk-NZMWWDAY.js.map +1 -0
- package/dist/{chunk-RNFE3ML2.js → chunk-OCUV2Y25.js} +4 -3
- package/dist/chunk-OCUV2Y25.js.map +1 -0
- package/dist/chunk-P4ZJOQA7.js +271 -0
- package/dist/chunk-P4ZJOQA7.js.map +1 -0
- package/dist/chunk-P6C5EZ3D.js +342 -0
- package/dist/chunk-P6C5EZ3D.js.map +1 -0
- package/dist/{chunk-CW6T36TN.js → chunk-PBD7BJUN.js} +62 -4
- package/dist/chunk-PBD7BJUN.js.map +1 -0
- package/dist/chunk-PBIUCQY3.js +696 -0
- package/dist/chunk-PBIUCQY3.js.map +1 -0
- package/dist/chunk-PD6YECQH.js +845 -0
- package/dist/chunk-PD6YECQH.js.map +1 -0
- package/dist/{chunk-M7IYCTJV.js → chunk-R4LFQGP3.js} +2 -2
- package/dist/chunk-RHJIGDUE.js +21 -0
- package/dist/chunk-RHJIGDUE.js.map +1 -0
- package/dist/{chunk-KP7MUZNX.js → chunk-RLXO27MW.js} +30 -8
- package/dist/chunk-RLXO27MW.js.map +1 -0
- package/dist/{chunk-DFNM3WX2.js → chunk-S44BEV4B.js} +168 -45
- package/dist/chunk-S44BEV4B.js.map +1 -0
- package/dist/chunk-S4S5N4BJ.js +1461 -0
- package/dist/chunk-S4S5N4BJ.js.map +1 -0
- package/dist/{chunk-BZ2SHDN2.js → chunk-SGTRAXXX.js} +3 -3
- package/dist/chunk-SGTRAXXX.js.map +1 -0
- package/dist/{chunk-M2RGJPXX.js → chunk-SJAE5PB5.js} +3 -3
- package/dist/{chunk-JGIWG6SR.js → chunk-SNPNHU3H.js} +3937 -1776
- package/dist/chunk-SNPNHU3H.js.map +1 -0
- package/dist/{chunk-IHVBV5C2.js → chunk-SOOBFXRR.js} +94 -71
- package/dist/chunk-SOOBFXRR.js.map +1 -0
- package/dist/{chunk-ZDTRWK5F.js → chunk-TAHFWKS6.js} +2 -2
- package/dist/chunk-UEFFTVPY.js +9 -0
- package/dist/chunk-UEFFTVPY.js.map +1 -0
- package/dist/{chunk-24VULZ7A.js → chunk-UR5BXLBP.js} +3 -3
- package/dist/chunk-UR5BXLBP.js.map +1 -0
- package/dist/{chunk-DMBALCE2.js → chunk-V2SBGVDO.js} +471 -186
- package/dist/chunk-V2SBGVDO.js.map +1 -0
- package/dist/chunk-VJLWD47W.js +23 -0
- package/dist/chunk-VJLWD47W.js.map +1 -0
- package/dist/{chunk-4CQAV7YB.js → chunk-W647DX5Z.js} +2 -2
- package/dist/{chunk-THATMZXD.js → chunk-WFIIU3YZ.js} +2 -2
- package/dist/{chunk-THATMZXD.js.map → chunk-WFIIU3YZ.js.map} +1 -1
- package/dist/chunk-YZDJMAKL.js +82 -0
- package/dist/chunk-YZDJMAKL.js.map +1 -0
- package/dist/{chunk-3TMODYZV.js → chunk-Z5XH6VHY.js} +5 -5
- package/dist/chunk-Z5XH6VHY.js.map +1 -0
- package/dist/{chunk-BE3HW4FY.js → chunk-ZBBMZMA6.js} +377 -170
- package/dist/chunk-ZBBMZMA6.js.map +1 -0
- package/dist/index.cjs +21224 -11714
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +195 -49
- package/dist/index.d.ts +195 -49
- package/dist/index.js +150 -74
- package/dist/index.js.map +1 -1
- package/dist/{ir-BMP7yxJJ.d.cts → ir-BSosEwc8.d.cts} +1 -1
- package/dist/{ir-DUOz6H-5.d.ts → ir-D-uqwL_4.d.ts} +1 -1
- package/dist/{module-B8CBqIZ_.d.cts → module-Ds4tarcI.d.cts} +230 -140
- package/dist/{module-k7m3txak.d.ts → module-Zd1Gn-Nj.d.ts} +230 -140
- package/package.json +20 -4
- package/dist/ModuleTag-C8FHY_sY.d.ts +0 -93
- package/dist/ModuleTag-EGbgBMpZ.d.cts +0 -93
- package/dist/Observability-COqEvp2C.d.cts +0 -713
- package/dist/Observability-cY4kLn0S.d.ts +0 -713
- package/dist/ReadQuery-BlMwhe-F.d.ts +0 -30
- package/dist/ReadQuery-CL5XlXts.d.cts +0 -30
- package/dist/ReadQuery-SinbStGF.d.cts +0 -38
- package/dist/ReadQuery-SinbStGF.d.ts +0 -38
- package/dist/chunk-24VULZ7A.js.map +0 -1
- package/dist/chunk-3QMIVH35.js +0 -43
- package/dist/chunk-3QMIVH35.js.map +0 -1
- package/dist/chunk-3TMODYZV.js.map +0 -1
- package/dist/chunk-4SO6JMZL.js.map +0 -1
- package/dist/chunk-76WT3HOR.js.map +0 -1
- package/dist/chunk-ANLBCBDC.js.map +0 -1
- package/dist/chunk-AUIR5O6W.js.map +0 -1
- package/dist/chunk-BABLDP24.js.map +0 -1
- package/dist/chunk-BE3HW4FY.js.map +0 -1
- package/dist/chunk-BZ2SHDN2.js.map +0 -1
- package/dist/chunk-CW6T36TN.js.map +0 -1
- package/dist/chunk-DFNM3WX2.js.map +0 -1
- package/dist/chunk-DMBALCE2.js.map +0 -1
- package/dist/chunk-EGK3KN7B.js +0 -406
- package/dist/chunk-EGK3KN7B.js.map +0 -1
- package/dist/chunk-GMPEOUP2.js.map +0 -1
- package/dist/chunk-IHVBV5C2.js.map +0 -1
- package/dist/chunk-JCXGZRMU.js.map +0 -1
- package/dist/chunk-JGIWG6SR.js.map +0 -1
- package/dist/chunk-JWOYLO27.js.map +0 -1
- package/dist/chunk-KIXAU3GM.js +0 -137
- package/dist/chunk-KIXAU3GM.js.map +0 -1
- package/dist/chunk-KL5ACTCT.js +0 -8
- package/dist/chunk-KL5ACTCT.js.map +0 -1
- package/dist/chunk-KP7MUZNX.js.map +0 -1
- package/dist/chunk-M3BFQ7HK.js +0 -13
- package/dist/chunk-M3BFQ7HK.js.map +0 -1
- package/dist/chunk-M3WTHJHJ.js.map +0 -1
- package/dist/chunk-NBD3KUOZ.js.map +0 -1
- package/dist/chunk-NQZ2OSGR.js +0 -151
- package/dist/chunk-NQZ2OSGR.js.map +0 -1
- package/dist/chunk-NZJKFF45.js.map +0 -1
- package/dist/chunk-OFADUJWJ.js.map +0 -1
- package/dist/chunk-OGWBVHB3.js.map +0 -1
- package/dist/chunk-PAYXCY6A.js.map +0 -1
- package/dist/chunk-PYOE4VSI.js.map +0 -1
- package/dist/chunk-QCHIQWAJ.js +0 -21
- package/dist/chunk-RNFE3ML2.js.map +0 -1
- package/dist/chunk-TKZ7MEIA.js +0 -27
- package/dist/chunk-TKZ7MEIA.js.map +0 -1
- package/dist/chunk-TQOBJYDP.js.map +0 -1
- package/dist/chunk-VZB726PE.js +0 -93
- package/dist/chunk-VZB726PE.js.map +0 -1
- package/dist/chunk-W3TEWHLO.js +0 -568
- package/dist/chunk-W3TEWHLO.js.map +0 -1
- package/dist/chunk-YS3AZQ2G.js.map +0 -1
- package/dist/chunk-ZFLHVFUC.js +0 -192
- package/dist/chunk-ZFLHVFUC.js.map +0 -1
- package/dist/chunk-ZFY7U2FR.js.map +0 -1
- package/dist/chunk-ZGDVUPTM.js.map +0 -1
- package/dist/protocol-g_1897M2.d.cts +0 -127
- package/dist/protocol-g_1897M2.d.ts +0 -127
- /package/dist/{chunk-3IYZ5IGG.js.map → chunk-5WKUGEBY.js.map} +0 -0
- /package/dist/{chunk-3RMKLXHX.js.map → chunk-63ZQ5RIN.js.map} +0 -0
- /package/dist/{chunk-EY4NZKDR.js.map → chunk-6Y2TKCNY.js.map} +0 -0
- /package/dist/{chunk-G5ZBFPNU.js.map → chunk-A2RQOJC7.js.map} +0 -0
- /package/dist/{chunk-TAAPQVZN.js.map → chunk-AYELIQXR.js.map} +0 -0
- /package/dist/{chunk-66ALHVEX.js.map → chunk-EB46EYI7.js.map} +0 -0
- /package/dist/{chunk-IPF7E66P.js.map → chunk-FYAODKVP.js.map} +0 -0
- /package/dist/{chunk-M7IYCTJV.js.map → chunk-R4LFQGP3.js.map} +0 -0
- /package/dist/{chunk-M2RGJPXX.js.map → chunk-SJAE5PB5.js.map} +0 -0
- /package/dist/{chunk-ZDTRWK5F.js.map → chunk-TAHFWKS6.js.map} +0 -0
- /package/dist/{chunk-4CQAV7YB.js.map → chunk-W647DX5Z.js.map} +0 -0
package/dist/StateTrait.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/StateTrait.ts","../src/internal/state-trait/rowid.ts","../src/internal/state-trait/build.ts","../src/internal/state-trait/meta.ts","../src/internal/state-trait/model.ts","../src/internal/field-path.ts","../src/internal/digest.ts","../src/internal/state-trait/install.ts","../src/internal/runtime/core/env.ts","../src/internal/runtime/core/runtimeInternalsAccessor.ts","../src/internal/state-trait/source.ts","../src/internal/effect-op.ts","../src/internal/runtime/core/EffectOpCore.ts","../src/internal/observability/runSession.ts","../src/internal/observability/jsonValue.ts","../src/internal/resource.ts","../src/internal/runtime/core/DebugSink.ts","../src/internal/runtime/core/errorSummary.ts","../src/internal/runtime/core/TaskRunner.ts","../src/internal/runtime/core/ReplayLog.ts","../src/internal/state-trait/deps-trace.ts","../src/internal/state-trait/ir.ts"],"sourcesContent":["// StateTrait namespace module (@logixjs/core/StateTrait):\n// - Provides a DSL for trait specs (from/node/list/computed/source/link).\n// - build: normalizes the spec and produces Program/Graph/Plan.\n// - install: installs a Program into the runtime (registers source.refresh, runs converge/validate in txn windows).\n\nimport type { Schema } from 'effect'\nimport { Effect } from 'effect'\nimport type { BoundApi } from './Bound.js'\nimport * as Model from './internal/state-trait/model.js'\nimport * as FieldPath from './internal/state-trait/field-path.js'\nimport * as RowId from './internal/state-trait/rowid.js'\nimport * as InternalBuild from './internal/state-trait/build.js'\nimport * as InternalInstall from './internal/state-trait/install.js'\nimport * as InternalIr from './internal/state-trait/ir.js'\n\n// Public type aliases.\nexport type StateTraitSpec<S> = Model.StateTraitSpec<S>\nexport type StateTraitEntry<S = unknown, P extends string = string> = Model.StateTraitEntry<S, P>\nexport type StateTraitProgram<S> = Model.StateTraitProgram<S>\nexport type StateTraitGraph = Model.StateTraitGraph\nexport type StateTraitPlan = Model.StateTraitPlan\nexport type StateTraitNode<Input = unknown, Ctx = unknown> = Model.StateTraitNode<Input, Ctx>\nexport type StateTraitList<Item = unknown> = Model.StateTraitList<Item>\nexport type CheckRule<Input = unknown, Ctx = unknown> = Model.CheckRule<Input, Ctx>\n\nexport type StateFieldPath<S> = FieldPath.StateFieldPath<S>\nexport type StateAtPath<S, P> = FieldPath.StateAtPath<S, P>\n\nexport const $root = '$root' as const\n\ntype DepsArgs<S extends object, Deps extends ReadonlyArray<StateFieldPath<S>>> = {\n readonly [K in keyof Deps]: StateAtPath<S, Deps[K]>\n}\n\n/**\n * StateTrait.from:\n * - Narrows available field paths based on the state Schema, adding type constraints to trait specs.\n * - At runtime this returns the raw spec object; normalization is handled by internal layers.\n */\nexport const from =\n <S extends object, I>(_schema: Schema.Schema<S, I>) =>\n (spec: StateTraitSpec<S>): StateTraitSpec<S> =>\n spec\n\nexport const node = <Input = unknown, Ctx = unknown>(\n spec: Omit<Model.StateTraitNode<Input, Ctx>, '_tag'>,\n): Model.StateTraitNode<Input, Ctx> => ({\n _tag: 'StateTraitNode',\n ...spec,\n})\n\nexport const list = <Item = unknown>(spec: Omit<Model.StateTraitList<Item>, '_tag'>): Model.StateTraitList<Item> => ({\n _tag: 'StateTraitList',\n ...spec,\n})\n\n/**\n * StateTrait.computed:\n * - Declares computed semantics for a field.\n * - Uses explicit deps as the single source of truth for dependencies (diagnostics / reverse-closure / incremental sched).\n */\nexport const computed = <\n S extends object,\n P extends StateFieldPath<S>,\n const Deps extends ReadonlyArray<StateFieldPath<S>>,\n>(input: {\n readonly deps: Deps\n readonly get: (...depsValues: DepsArgs<S, Deps>) => StateAtPath<S, P>\n readonly equals?: (prev: StateAtPath<S, P>, next: StateAtPath<S, P>) => boolean\n /**\n * 043: explicit converge time-slicing scheduling.\n * - unset: immediate (default behavior unchanged)\n * - deferred: can be postponed and merged into later windows (requires runtime time-slicing enabled)\n */\n readonly scheduling?: Model.TraitConvergeScheduling\n}): StateTraitEntry<S, P> => {\n const derive = (state: Readonly<S>): StateAtPath<S, P> => {\n const args = (input.deps as ReadonlyArray<string>).map((dep) => RowId.getAtPath(state as any, dep))\n return (input.get as any)(...args)\n }\n return {\n fieldPath: undefined as unknown as P,\n kind: 'computed',\n meta: {\n deps: input.deps,\n derive,\n equals: input.equals,\n ...(input.scheduling ? { scheduling: input.scheduling } : {}),\n },\n } as StateTraitEntry<S, P>\n}\n\n/**\n * StateTrait.source:\n * - Declares an external resource source for a field (Resource / Query integration is implemented in later phases).\n * - The kernel owns keyHash gating / concurrency / ReplayMode behavior.\n */\nexport const source = <\n S extends object,\n P extends StateFieldPath<S>,\n const Deps extends ReadonlyArray<StateFieldPath<S>>,\n>(input: {\n readonly resource: string\n readonly deps: Deps\n readonly key: (...depsValues: DepsArgs<S, Deps>) => unknown\n readonly triggers?: ReadonlyArray<'onMount' | 'onKeyChange' | 'manual'>\n readonly debounceMs?: number\n readonly concurrency?: 'switch' | 'exhaust-trailing'\n /**\n * Serializable metadata for Devtools/docs (whitelisted fields are extracted during build).\n */\n readonly meta?: Record<string, unknown>\n}): StateTraitEntry<S, P> => {\n const key = (state: Readonly<S>): unknown => {\n const args = (input.deps as ReadonlyArray<string>).map((dep) => RowId.getAtPath(state as any, dep))\n return (input.key as any)(...args)\n }\n return {\n fieldPath: undefined as unknown as P,\n kind: 'source',\n meta: { ...input, key },\n } as StateTraitEntry<S, P>\n}\n\n/**\n * StateTrait.link:\n * - Declares a linkage from another field into the target field.\n * - `meta.from` is also constrained by `StateFieldPath<S>`.\n */\nexport const link = <S extends object, P extends StateFieldPath<S>>(meta: {\n from: StateFieldPath<S>\n /**\n * 043: explicit converge time-slicing scheduling.\n * - unset: immediate (default behavior unchanged)\n * - deferred: can be postponed and merged into later windows (requires runtime time-slicing enabled)\n */\n scheduling?: Model.TraitConvergeScheduling\n}): StateTraitEntry<S, P> =>\n ({\n fieldPath: undefined as unknown as P,\n kind: 'link',\n meta: { ...meta, ...(meta.scheduling ? { scheduling: meta.scheduling } : {}) },\n }) as StateTraitEntry<S, P>\n\n/**\n * StateTrait.build:\n * - Normalizes the spec into an executable Program (including Graph/Plan).\n * - When DSL and build constraints differ, build is the final authority (e.g. requiring explicit deps).\n */\nexport const build = <S extends object>(\n stateSchema: Schema.Schema<S, any>,\n spec: StateTraitSpec<S>,\n): StateTraitProgram<S> => InternalBuild.build(stateSchema, spec)\n\n/**\n * StateTrait.install:\n * - Installs Program-defined behavior (computed/link/source/check, etc.) on top of a Bound API.\n * - Each PlanStep corresponds to a long-lived Effect mounted into the runtime Scope.\n */\nexport const install = <S extends object>(\n bound: BoundApi<any, any>,\n program: StateTraitProgram<S>,\n): Effect.Effect<void, never, any> => InternalInstall.install(bound, program)\n\n/**\n * StateTrait.exportStaticIr:\n * - Exports minimal Static IR (aligned with 009 canonical FieldPath constraints) for Devtools / Alignment Lab.\n * - The return value must be JSON-stringifiable (evidence packages / replay pipeline).\n */\nexport type StaticIr = InternalIr.StaticIr\n\nexport const exportStaticIr = (\n program: StateTraitProgram<any>,\n moduleId: string,\n options?: {\n readonly version?: string\n },\n): StaticIr =>\n InternalIr.exportStaticIr({\n program,\n moduleId,\n version: options?.version,\n })\n","export type RowId = string\n\nexport interface ListConfig {\n readonly path: string\n readonly trackBy?: string\n}\n\nexport type ListRemovalListener = (rowId: RowId) => void\n\ntype Segment = string | number\n\nconst parseSegments = (path: string): ReadonlyArray<Segment> => {\n if (!path) return []\n return path.split('.').map((seg) => (/^[0-9]+$/.test(seg) ? Number(seg) : seg))\n}\n\nexport const getAtPath = (state: any, path: string): any => {\n if (!path || state == null) return state\n const segments = parseSegments(path)\n let current: any = state\n for (const seg of segments) {\n if (current == null) return undefined\n if (typeof seg === 'number') {\n current = Array.isArray(current) ? current[seg] : current[String(seg)]\n continue\n }\n current = current[seg]\n }\n return current\n}\n\nexport const setAtPathMutating = (draft: unknown, path: string, value: unknown): void => {\n if (!path) return\n const segments = parseSegments(path)\n if (segments.length === 0) return\n\n let current: any = draft\n for (let i = 0; i < segments.length - 1; i++) {\n const key = segments[i]!\n const nextKey = segments[i + 1]!\n\n const next = current?.[key as any]\n if (next == null || typeof next !== 'object') {\n current[key as any] = typeof nextKey === 'number' ? [] : {}\n }\n current = current[key as any]\n }\n\n const last = segments[segments.length - 1]!\n current[last as any] = value\n}\n\nexport const unsetAtPathMutating = (draft: unknown, path: string): void => {\n if (!path) return\n const segments = parseSegments(path)\n if (segments.length === 0) return\n\n let current: any = draft\n for (let i = 0; i < segments.length - 1; i++) {\n const key = segments[i]!\n const next = current?.[key as any]\n if (next == null || typeof next !== 'object') {\n return\n }\n current = next\n }\n\n const last = segments[segments.length - 1]!\n if (Array.isArray(current) && typeof last === 'number') {\n current[last] = undefined\n return\n }\n\n if (current && typeof current === 'object') {\n delete current[last as any]\n }\n}\n\nexport const joinPath = (prefix: string, suffix: string): string => {\n if (!prefix) return suffix\n if (!suffix) return prefix\n return `${prefix}.${suffix}`\n}\n\nexport interface ListItemFieldPath {\n readonly listPath: string\n readonly itemPath: string\n}\n\n/**\n * parseListItemFieldPath:\n * - Recognize a list.item field path like \"items[].profileResource\".\n * - Supports nested arrays: returns listPath/itemPath for the innermost list.\n */\nexport const parseListItemFieldPath = (fieldPath: string): ListItemFieldPath | undefined => {\n const raw = typeof fieldPath === 'string' ? fieldPath.trim() : ''\n if (!raw) return undefined\n\n const segments = raw.split('.').filter(Boolean)\n let lastListSeg = -1\n for (let i = 0; i < segments.length; i++) {\n if (segments[i]!.endsWith('[]')) lastListSeg = i\n }\n if (lastListSeg < 0) return undefined\n\n const strip = (seg: string): string => (seg.endsWith('[]') ? seg.slice(0, -2) : seg)\n\n const listPath = segments\n .slice(0, lastListSeg + 1)\n .map(strip)\n .join('.')\n\n const itemPath = segments\n .slice(lastListSeg + 1)\n .map(strip)\n .join('.')\n\n return { listPath, itemPath }\n}\n\nexport const toListItemValuePath = (listPath: string, index: number, itemPath: string): string =>\n itemPath ? `${listPath}.${index}.${itemPath}` : `${listPath}.${index}`\n\ntype ListState = {\n readonly listPath: string\n readonly parentRowId?: RowId\n readonly itemsRef: ReadonlyArray<unknown>\n readonly ids: ReadonlyArray<RowId>\n readonly indexById: ReadonlyMap<RowId, number>\n readonly trackBy?: string\n}\n\nconst readTrackBy = (item: unknown, trackBy: string): unknown => {\n if (!item || typeof item !== 'object') return undefined\n const segments = trackBy.split('.')\n let current: any = item\n for (const seg of segments) {\n if (current == null) return undefined\n current = current[seg as any]\n }\n return current\n}\n\nconst didReorderByReference = (prevItems: ReadonlyArray<unknown>, nextItems: ReadonlyArray<unknown>): boolean => {\n const buckets = new Map<unknown, Array<number>>()\n for (let i = 0; i < prevItems.length; i++) {\n const item = prevItems[i]\n const list = buckets.get(item) ?? []\n list.push(i)\n buckets.set(item, list)\n }\n\n for (let nextIndex = 0; nextIndex < nextItems.length; nextIndex++) {\n const item = nextItems[nextIndex]\n const q = buckets.get(item)\n if (!q || q.length === 0) continue\n const prevIndex = q.shift()!\n if (prevIndex !== nextIndex) {\n return true\n }\n }\n\n return false\n}\n\nconst hasStableTrackByKeys = (items: ReadonlyArray<unknown>, trackBy: string): boolean =>\n items.every((item) => readTrackBy(item, trackBy) !== undefined)\n\nconst isSameTrackBySequence = (\n prevItems: ReadonlyArray<unknown>,\n nextItems: ReadonlyArray<unknown>,\n trackBy: string,\n): boolean => {\n if (prevItems.length !== nextItems.length) return false\n for (let i = 0; i < prevItems.length; i++) {\n if (!Object.is(readTrackBy(prevItems[i], trackBy), readTrackBy(nextItems[i], trackBy))) {\n return false\n }\n }\n return true\n}\n\nconst reconcileIds = (\n prev: ListState | undefined,\n nextItems: ReadonlyArray<unknown>,\n trackBy?: string,\n makeRowId?: () => RowId,\n): { readonly ids: ReadonlyArray<RowId>; readonly removed: ReadonlyArray<RowId> } => {\n const nextRowId =\n makeRowId ??\n (() => {\n let rowSeq = 0\n return () => {\n rowSeq += 1\n return `r${rowSeq}`\n }\n })()\n\n if (!prev) {\n return {\n ids: nextItems.map(() => nextRowId()),\n removed: [],\n }\n }\n\n if (prev.itemsRef === nextItems) {\n return {\n ids: prev.ids,\n removed: [],\n }\n }\n\n // Important: keep RowId stable under \"non-structural changes\" (field updates / object clones only),\n // otherwise in-flight state and caches would be invalidated needlessly.\n const sameLength = prev.itemsRef.length === nextItems.length\n if (sameLength) {\n // trackBy case: if the key sequence is identical, we can reuse old ids;\n // otherwise we must reconcile by key (avoid misclassifying clone+reorder as \"no reorder\").\n if (trackBy) {\n const canUseKeys = hasStableTrackByKeys(prev.itemsRef, trackBy) && hasStableTrackByKeys(nextItems, trackBy)\n if (canUseKeys) {\n if (isSameTrackBySequence(prev.itemsRef, nextItems, trackBy)) {\n return {\n ids: prev.ids,\n removed: [],\n }\n }\n } else {\n // If trackBy keys are not available, fall back to reference-level detection (keep stability for \"cloned but not reordered\").\n if (!didReorderByReference(prev.itemsRef, nextItems)) {\n return {\n ids: prev.ids,\n removed: [],\n }\n }\n }\n } else if (!didReorderByReference(prev.itemsRef, nextItems)) {\n return {\n ids: prev.ids,\n removed: [],\n }\n }\n }\n\n const keyOf = (item: unknown): unknown => {\n if (!trackBy) return item\n const k = readTrackBy(item, trackBy)\n return k !== undefined ? k : item\n }\n\n const buckets = new Map<unknown, Array<RowId>>()\n for (let i = 0; i < prev.itemsRef.length; i++) {\n const key = keyOf(prev.itemsRef[i])\n const list = buckets.get(key) ?? []\n list.push(prev.ids[i]!)\n buckets.set(key, list)\n }\n\n const ids: Array<RowId> = []\n for (let i = 0; i < nextItems.length; i++) {\n const key = keyOf(nextItems[i])\n const list = buckets.get(key)\n if (list && list.length > 0) {\n ids.push(list.shift()!)\n } else {\n ids.push(nextRowId())\n }\n }\n\n const removed: Array<RowId> = []\n for (const list of buckets.values()) {\n removed.push(...list)\n }\n\n return { ids, removed }\n}\n\nconst buildIndexById = (ids: ReadonlyArray<RowId>): ReadonlyMap<RowId, number> => {\n const map = new Map<RowId, number>()\n for (let i = 0; i < ids.length; i++) {\n map.set(ids[i]!, i)\n }\n return map\n}\n\nexport class RowIdStore {\n private readonly lists = new Map<string, ListState>()\n private readonly removalListeners = new Map<string, Set<ListRemovalListener>>()\n private readonly rowIdIndex = new Map<\n RowId,\n { readonly key: string; readonly listPath: string; readonly index: number }\n >()\n private nextRowSeq = 0\n\n constructor(private readonly instanceId?: string) {}\n\n private listKey = (listPath: string, parentRowId?: RowId): string =>\n parentRowId ? `${listPath}@@${parentRowId}` : listPath\n\n private makeRowId = (): RowId => {\n this.nextRowSeq += 1\n return this.instanceId ? `${this.instanceId}::r${this.nextRowSeq}` : `r${this.nextRowSeq}`\n }\n\n private notifyRemoved(listPath: string, rowId: RowId): void {\n const listeners = this.removalListeners.get(listPath)\n if (!listeners || listeners.size === 0) return\n for (const fn of listeners) {\n try {\n fn(rowId)\n } catch {\n // listener failures should never break runtime behavior\n }\n }\n }\n\n private removeDescendants(parentRowId: RowId): void {\n const keys: Array<string> = []\n for (const [k, st] of this.lists.entries()) {\n if (st.parentRowId === parentRowId) keys.push(k)\n }\n\n for (const key of keys) {\n const st = this.lists.get(key)\n if (!st) continue\n this.lists.delete(key)\n for (let i = 0; i < st.ids.length; i++) {\n const rowId = st.ids[i]!\n this.rowIdIndex.delete(rowId)\n this.notifyRemoved(st.listPath, rowId)\n this.removeDescendants(rowId)\n }\n }\n }\n\n onRemoved(listPath: string, listener: ListRemovalListener): () => void {\n const set = this.removalListeners.get(listPath) ?? new Set<ListRemovalListener>()\n set.add(listener)\n this.removalListeners.set(listPath, set)\n return () => {\n const current = this.removalListeners.get(listPath)\n if (!current) return\n current.delete(listener)\n if (current.size === 0) this.removalListeners.delete(listPath)\n }\n }\n\n getRowId(listPath: string, index: number, parentRowId?: RowId): RowId | undefined {\n const state = this.lists.get(this.listKey(listPath, parentRowId))\n return state ? state.ids[index] : undefined\n }\n\n getIndex(listPath: string, rowId: RowId): number | undefined {\n const info = this.rowIdIndex.get(rowId)\n if (!info) return undefined\n if (info.listPath !== listPath) return undefined\n return info.index\n }\n\n /**\n * ensureList:\n * - Align RowID mapping for the given listPath with the current items.\n * - Returns the latest ids (index -> RowId).\n */\n ensureList(\n listPath: string,\n items: ReadonlyArray<unknown>,\n trackBy?: string,\n parentRowId?: RowId,\n ): ReadonlyArray<RowId> {\n const key = this.listKey(listPath, parentRowId)\n const prev = this.lists.get(key)\n const { ids, removed } = reconcileIds(prev, items, trackBy ?? prev?.trackBy, this.makeRowId)\n\n const next: ListState = {\n listPath,\n parentRowId,\n itemsRef: items,\n ids,\n indexById: buildIndexById(ids),\n trackBy: trackBy ?? prev?.trackBy,\n }\n this.lists.set(key, next)\n\n if (removed.length > 0) {\n for (const rowId of removed) {\n this.rowIdIndex.delete(rowId)\n this.notifyRemoved(listPath, rowId)\n this.removeDescendants(rowId)\n }\n }\n\n // Refresh the reverse rowId -> index mapping (index changes are allowed).\n for (let i = 0; i < ids.length; i++) {\n const rowId = ids[i]!\n this.rowIdIndex.set(rowId, { key, listPath, index: i })\n }\n\n return ids\n }\n\n /**\n * updateAll:\n * - After each commit, align RowID mappings for all known lists.\n * - configs come from list declarations in StateTraitProgram.spec (may include trackBy).\n */\n updateAll(state: unknown, configs: ReadonlyArray<ListConfig>): void {\n const cfgByPath = new Map<string, ListConfig>()\n const paths: Array<string> = []\n for (const cfg of configs) {\n if (!cfg || typeof cfg.path !== 'string') continue\n const p = cfg.path.trim()\n if (!p) continue\n cfgByPath.set(p, cfg)\n paths.push(p)\n }\n\n const pathSet = new Set(paths)\n\n const parentOf = (path: string): string | undefined => {\n const segments = path.split('.').filter(Boolean)\n let best: string | undefined\n for (let i = 1; i < segments.length; i++) {\n const prefix = segments.slice(0, i).join('.')\n if (pathSet.has(prefix)) best = prefix\n }\n return best\n }\n\n const parentByPath = new Map<string, string | undefined>()\n const suffixByPath = new Map<string, string>()\n const childrenByParent = new Map<string | undefined, Array<string>>()\n\n for (const path of paths) {\n const parent = parentOf(path)\n parentByPath.set(path, parent)\n const suffix = parent ? path.slice(parent.length + 1) : path\n suffixByPath.set(path, suffix)\n const list = childrenByParent.get(parent) ?? []\n list.push(path)\n childrenByParent.set(parent, list)\n }\n\n // roots first (and deterministic traversal)\n const roots = (childrenByParent.get(undefined) ?? []).slice().sort((a, b) => a.localeCompare(b))\n\n const visit = (listPath: string, parentRowId: RowId | undefined, listValue: unknown): void => {\n const cfg = cfgByPath.get(listPath)\n const items = Array.isArray(listValue) ? (listValue as ReadonlyArray<unknown>) : []\n const ids = this.ensureList(listPath, items, cfg?.trackBy, parentRowId)\n\n const children = (childrenByParent.get(listPath) ?? []).slice().sort((a, b) => a.localeCompare(b))\n if (children.length === 0) return\n\n for (let i = 0; i < items.length; i++) {\n const row = items[i]\n const rowId = ids[i]\n if (!rowId) continue\n for (const childPath of children) {\n const suffix = suffixByPath.get(childPath) ?? ''\n const childValue = suffix ? getAtPath(row as any, suffix) : undefined\n visit(childPath, rowId, childValue)\n }\n }\n }\n\n for (const root of roots) {\n const value = getAtPath(state as any, root)\n visit(root, undefined, value)\n }\n }\n}\n\nexport const collectListConfigs = (spec: Record<string, unknown>): ReadonlyArray<ListConfig> => {\n const configs: Array<ListConfig> = []\n for (const key in spec) {\n if (!Object.prototype.hasOwnProperty.call(spec, key)) continue\n const raw = spec[key]\n if (!raw || typeof raw !== 'object') continue\n const tag = (raw as any)._tag\n if (tag !== 'StateTraitList') continue\n const trackBy = (raw as any).identityHint?.trackBy\n configs.push({\n path: key,\n trackBy: typeof trackBy === 'string' ? trackBy : undefined,\n })\n }\n return configs\n}\n","import type { Schema } from 'effect'\nimport * as SchemaAST from 'effect/SchemaAST'\nimport {\n type StateTraitProgram,\n type StateTraitSpec,\n type StateTraitEntry,\n type StateTraitGraph,\n type StateTraitGraphEdge,\n type StateTraitGraphNode,\n type StateTraitField,\n type StateTraitFieldTrait,\n type StateTraitPlan,\n type StateTraitPlanStep,\n type StateTraitResource,\n type StateTraitSchemaPathRef,\n collectNodeMeta,\n normalizeSpec,\n} from './model.js'\nimport * as Meta from './meta.js'\nimport {\n compareFieldPath,\n getFieldPathId,\n makeFieldPathIdRegistry,\n normalizeFieldPath,\n type FieldPath,\n type FieldPathId,\n} from '../field-path.js'\nimport { fnv1a32, stableStringify } from '../digest.js'\nimport type { ConvergeStaticIrRegistry } from './converge-ir.js'\n\nconst nowPerf = (): number =>\n typeof globalThis.performance !== 'undefined' && typeof globalThis.performance.now === 'function'\n ? globalThis.performance.now()\n : Date.now()\n\ntype ConvergeWriter = Extract<StateTraitEntry<any, string>, { readonly kind: 'computed' | 'link' }>\n\nconst getConvergeWriterDeps = (entry: ConvergeWriter): ReadonlyArray<string> => {\n if (entry.kind === 'computed') {\n return ((entry.meta as any)?.deps ?? []) as ReadonlyArray<string>\n }\n return [entry.meta.from as string]\n}\n\nconst computeConvergeTopoOrder = (\n writers: ReadonlyArray<ConvergeWriter>,\n): { readonly order: ReadonlyArray<string>; readonly configError?: ConvergeStaticIrRegistry['configError'] } => {\n const writerByPath = new Map<string, ConvergeWriter>()\n for (const entry of writers) {\n const existing = writerByPath.get(entry.fieldPath)\n if (existing) {\n return {\n order: [],\n configError: {\n code: 'MULTIPLE_WRITERS',\n message: `[StateTrait.converge] Multiple writers for field \"${entry.fieldPath}\" (${existing.kind} + ${entry.kind}).`,\n fields: [entry.fieldPath],\n },\n }\n }\n writerByPath.set(entry.fieldPath, entry)\n }\n\n const nodes = new Set<string>()\n for (const entry of writers) {\n nodes.add(entry.fieldPath)\n }\n\n const indegree = new Map<string, number>()\n const forward = new Map<string, Array<string>>()\n\n for (const node of nodes) {\n indegree.set(node, 0)\n forward.set(node, [])\n }\n\n for (const entry of writers) {\n const to = entry.fieldPath\n const deps = getConvergeWriterDeps(entry)\n for (const dep of deps) {\n if (!nodes.has(dep)) continue\n forward.get(dep)!.push(to)\n indegree.set(to, (indegree.get(to) ?? 0) + 1)\n }\n }\n\n const queue: Array<string> = []\n for (const [node, deg] of indegree.entries()) {\n if (deg === 0) queue.push(node)\n }\n\n const order: Array<string> = []\n while (queue.length) {\n const n = queue.shift()!\n order.push(n)\n const outs = forward.get(n)!\n for (const to of outs) {\n const next = (indegree.get(to) ?? 0) - 1\n indegree.set(to, next)\n if (next === 0) queue.push(to)\n }\n }\n\n if (order.length !== nodes.size) {\n const remaining = Array.from(nodes).filter((n) => !order.includes(n))\n return {\n order: [],\n configError: {\n code: 'CYCLE_DETECTED',\n message: `[StateTrait.converge] Cycle detected in computed/link graph: ${remaining.join(', ')}`,\n fields: remaining,\n },\n }\n }\n\n return { order }\n}\n\nconst collectSchemaFieldPaths = (schema: Schema.Schema<any, any>): ReadonlyArray<FieldPath> => {\n const byKey = new Map<string, FieldPath>()\n\n const add = (path: FieldPath): void => {\n const normalized = normalizeFieldPath(path)\n if (!normalized) return\n byKey.set(JSON.stringify(normalized), normalized)\n }\n\n const visit = (ast: SchemaAST.AST, prefix: ReadonlyArray<string>, seen: Set<SchemaAST.AST>): void => {\n let current: SchemaAST.AST = ast\n\n // Unwrap Suspend/Refinement (recursive schema / branded schema).\n while (true) {\n if (SchemaAST.isSuspend(current)) {\n if (seen.has(current)) return\n seen.add(current)\n current = current.f()\n continue\n }\n if (SchemaAST.isRefinement(current)) {\n current = current.from\n continue\n }\n break\n }\n\n if (SchemaAST.isTransformation(current)) {\n visit(current.to, prefix, seen)\n visit(current.from, prefix, seen)\n return\n }\n\n if (SchemaAST.isUnion(current)) {\n for (const t of current.types) {\n visit(t, prefix, seen)\n }\n return\n }\n\n // Array / Tuple: indices do not enter the FieldPathId space; recurse into element types to support `items[0].name -> items.name`.\n if (SchemaAST.isTupleType(current)) {\n for (const e of current.elements) {\n visit(e.type, prefix, seen)\n }\n for (const r of current.rest) {\n visit(r.type, prefix, seen)\n }\n return\n }\n\n if (SchemaAST.isTypeLiteral(current)) {\n for (const ps of current.propertySignatures) {\n const seg = String(ps.name)\n if (!seg) continue\n const next = [...prefix, seg]\n add(next)\n visit(ps.type, next, seen)\n }\n // Index signature (Record<string, T>) can't be enumerated statically: avoid generating misaligned dynamic key paths.\n return\n }\n\n // Any / Unknown / Object / Declaration (open types): cannot enumerate nested paths; stop conservatively.\n }\n\n visit(schema.ast as unknown as SchemaAST.AST, [], new Set())\n return Array.from(byKey.values()).sort(compareFieldPath)\n}\n\nconst buildConvergeIr = (\n stateSchema: Schema.Schema<any, any>,\n entries: ReadonlyArray<StateTraitEntry<any, string>>,\n): ConvergeStaticIrRegistry => {\n const startedAt = nowPerf()\n const generation = 0\n\n const writers = entries.filter((e): e is ConvergeWriter => e.kind === 'computed' || e.kind === 'link')\n\n const writersKey = writers\n .map((entry) => `${entry.kind}:${entry.fieldPath}`)\n .sort()\n .join('|')\n\n const depsKey = writers\n .map((entry) => {\n const deps = getConvergeWriterDeps(entry).slice().sort().join(',')\n const scheduling = (entry.meta as any)?.scheduling === 'deferred' ? 'd' : 'i'\n return `${entry.kind}:${entry.fieldPath}@${scheduling}=>${deps}`\n })\n .sort()\n .join('|')\n\n const writerByPath = new Map<string, ConvergeWriter>()\n for (const entry of writers) {\n writerByPath.set(entry.fieldPath, entry)\n }\n\n const topo = writers.length > 0 ? computeConvergeTopoOrder(writers) : { order: [] as ReadonlyArray<string> }\n const stepsById: Array<ConvergeWriter> = topo.configError ? [] : topo.order.map((path) => writerByPath.get(path)!)\n\n const fieldPathTable = new Map<string, FieldPath>()\n const addPath = (path: FieldPath): void => {\n for (let i = 1; i <= path.length; i++) {\n const prefix = path.slice(0, i)\n const key = JSON.stringify(prefix)\n if (!fieldPathTable.has(key)) fieldPathTable.set(key, prefix)\n }\n }\n\n // 065: FieldPathId semantics must cover all enumerable field paths of stateSchema; otherwise reducer patchPaths can't map and will fall back to dirtyAll.\n for (const schemaPath of collectSchemaFieldPaths(stateSchema)) {\n addPath(schemaPath)\n }\n\n for (const entry of writers) {\n const out = normalizeFieldPath(entry.fieldPath)\n if (out) addPath(out)\n for (const dep of getConvergeWriterDeps(entry)) {\n const depPath = normalizeFieldPath(dep)\n if (depPath) addPath(depPath)\n }\n }\n\n const fieldPaths = Array.from(fieldPathTable.values()).sort(compareFieldPath)\n const fieldPathIdRegistry = makeFieldPathIdRegistry(fieldPaths)\n const fieldPathsKey = fnv1a32(stableStringify(fieldPaths))\n\n const stepOutFieldPathIdByStepId: Array<FieldPathId> = []\n const stepDepsFieldPathIdsByStepId: Array<ReadonlyArray<FieldPathId>> = []\n const stepSchedulingByStepId: Array<'immediate' | 'deferred'> = []\n\n for (const entry of stepsById) {\n const out = normalizeFieldPath(entry.fieldPath)\n const outId = out != null ? getFieldPathId(fieldPathIdRegistry, out) : undefined\n if (outId == null) {\n throw new Error(`[StateTrait.build] Failed to map converge output fieldPath \"${entry.fieldPath}\" to FieldPathId.`)\n }\n\n const depIds: Array<FieldPathId> = []\n for (const dep of getConvergeWriterDeps(entry)) {\n const depPath = normalizeFieldPath(dep)\n if (!depPath) continue\n const depId = getFieldPathId(fieldPathIdRegistry, depPath)\n if (depId != null) depIds.push(depId)\n }\n\n stepOutFieldPathIdByStepId.push(outId)\n stepDepsFieldPathIdsByStepId.push(depIds)\n stepSchedulingByStepId.push((entry.meta as any)?.scheduling === 'deferred' ? 'deferred' : 'immediate')\n }\n\n const topoOrder = stepsById.map((_, i) => i)\n const buildDurationMs = Math.max(0, nowPerf() - startedAt)\n\n return {\n generation,\n writersKey,\n depsKey,\n fieldPathsKey,\n fieldPaths,\n fieldPathIdRegistry,\n ...(topo.configError ? { configError: topo.configError } : null),\n stepsById,\n stepOutFieldPathIdByStepId,\n stepDepsFieldPathIdsByStepId,\n stepSchedulingByStepId,\n topoOrder,\n buildDurationMs,\n }\n}\n\n/**\n * Builds a normalized FieldTrait from a StateTraitEntry.\n *\n * - Currently uses explicit deps for computed/source and link edges; deeper dependency analysis is intentionally not performed.\n * - If we evolve explicit dependency declarations further, extend here.\n */\nconst toFieldTrait = (entry: StateTraitEntry<any, string>): StateTraitFieldTrait => {\n const deps: Array<string> = []\n\n if (entry.kind === 'computed') {\n const meta = entry.meta as any\n const list = meta.deps as ReadonlyArray<string> | undefined\n if (list) deps.push(...list)\n } else if (entry.kind === 'source') {\n const meta = entry.meta as any\n const list = meta.deps as ReadonlyArray<string> | undefined\n if (list) deps.push(...list)\n } else if (entry.kind === 'link') {\n deps.push(entry.meta.from as string)\n } else if (entry.kind === 'check') {\n const meta = entry.meta as any\n const rules = (meta?.rules ?? {}) as Record<string, any>\n for (const name of Object.keys(rules)) {\n const rule = rules[name]\n if (rule && typeof rule === 'object') {\n const list = rule.deps as ReadonlyArray<string> | undefined\n if (list) deps.push(...list)\n }\n }\n }\n\n return {\n fieldId: entry.fieldPath,\n kind: entry.kind,\n // Keep meta identical to Entry.meta at runtime so install can reuse it directly.\n meta: entry.meta as any,\n deps,\n }\n}\n\n/**\n * Builds Field / Node / Edge / Resource sets from normalized entries.\n */\nconst buildGraph = (\n entries: ReadonlyArray<StateTraitEntry<any, string>>,\n nodeMetaByFieldPath: ReadonlyMap<string, Meta.TraitMeta>,\n): {\n readonly graph: StateTraitGraph\n readonly plan: StateTraitPlan\n} => {\n const fieldMap = new Map<string, StateTraitField>()\n const nodes: Array<StateTraitGraphNode> = []\n const edges: Array<StateTraitGraphEdge> = []\n const resourcesById = new Map<string, StateTraitResource>()\n const planSteps: Array<StateTraitPlanStep> = []\n\n const ensureField = (fieldPath: string): StateTraitField => {\n let field = fieldMap.get(fieldPath)\n if (!field) {\n field = {\n id: fieldPath,\n path: fieldPath,\n traits: [],\n }\n fieldMap.set(fieldPath, field)\n }\n return field\n }\n\n for (const entry of entries) {\n const fieldPath = entry.fieldPath\n const field = ensureField(fieldPath)\n const trait = toFieldTrait(entry)\n\n ;(field.traits as Array<StateTraitFieldTrait>).push(trait)\n\n // Build Graph edges and Plan steps by kind.\n if (entry.kind === 'computed') {\n const stepId = `computed:${fieldPath}`\n planSteps.push({\n id: stepId,\n kind: 'computed-update',\n targetFieldPath: fieldPath,\n // Note: the current version does not statically analyze computed dependencies; sourceFieldPaths remains empty.\n })\n // If deps is explicitly declared, add Graph edges (for diagnostics / reverse-closure computation).\n const deps = (entry.meta as any).deps as ReadonlyArray<string> | undefined\n if (deps) {\n for (const dep of deps) {\n ensureField(dep)\n edges.push({\n id: `computed:${dep}->${fieldPath}`,\n from: dep,\n to: fieldPath,\n kind: 'computed',\n })\n }\n }\n } else if (entry.kind === 'link') {\n const from = entry.meta.from as string\n ensureField(from)\n\n const edgeId = `link:${from}->${fieldPath}`\n edges.push({\n id: edgeId,\n from,\n to: fieldPath,\n kind: 'link',\n })\n\n planSteps.push({\n id: `link:${fieldPath}`,\n kind: 'link-propagate',\n targetFieldPath: fieldPath,\n sourceFieldPaths: [from],\n debugInfo: {\n graphEdgeId: edgeId,\n },\n })\n } else if (entry.kind === 'source') {\n const resourceId = entry.meta.resource\n const resourceMeta = Meta.sanitize((entry.meta as any).meta)\n\n const existing = resourcesById.get(resourceId)\n if (existing) {\n const ownerFields = [...existing.ownerFields, fieldPath]\n let meta = existing.meta\n let metaOrigin = existing.metaOrigin\n let metaConflicts = existing.metaConflicts\n\n if (resourceMeta) {\n const merged = Meta.mergeCanonical(\n { meta, origin: metaOrigin, conflicts: metaConflicts },\n { origin: fieldPath, meta: resourceMeta },\n )\n meta = merged.meta\n metaOrigin = merged.origin\n metaConflicts = merged.conflicts\n }\n\n resourcesById.set(resourceId, {\n ...existing,\n ownerFields,\n meta,\n metaOrigin,\n metaConflicts,\n })\n } else {\n resourcesById.set(resourceId, {\n resourceId,\n // Use a simple identifier string for now; may evolve into a structured form based on key rules.\n keySelector: `StateTrait.source@${fieldPath}`,\n ownerFields: [fieldPath],\n meta: resourceMeta,\n metaOrigin: resourceMeta ? fieldPath : undefined,\n })\n }\n\n planSteps.push({\n id: `source:${fieldPath}`,\n kind: 'source-refresh',\n targetFieldPath: fieldPath,\n resourceId,\n keySelectorId: `StateTrait.source@${fieldPath}`,\n })\n\n const deps = (entry.meta as any).deps as ReadonlyArray<string> | undefined\n if (deps) {\n for (const dep of deps) {\n ensureField(dep)\n edges.push({\n id: `source-dep:${dep}->${fieldPath}`,\n from: dep,\n to: fieldPath,\n kind: 'source-dep',\n })\n }\n }\n } else if (entry.kind === 'check') {\n planSteps.push({\n id: `check:${fieldPath}`,\n kind: 'check-validate',\n targetFieldPath: fieldPath,\n })\n\n // If the rule explicitly declares deps, add Graph edges (for ReverseClosure scoped validate).\n if (trait.deps.length > 0) {\n for (const dep of trait.deps) {\n ensureField(dep)\n edges.push({\n id: `check-dep:${dep}->${fieldPath}`,\n from: dep,\n to: fieldPath,\n kind: 'check-dep',\n })\n }\n }\n }\n }\n\n for (const field of fieldMap.values()) {\n nodes.push({\n id: field.id,\n field,\n traits: field.traits,\n meta: nodeMetaByFieldPath.get(field.id),\n })\n }\n\n const graph: StateTraitGraph = {\n _tag: 'StateTraitGraph',\n nodes,\n edges,\n resources: Array.from(resourcesById.values()),\n }\n\n const plan: StateTraitPlan = {\n _tag: 'StateTraitPlan',\n steps: planSteps,\n }\n\n return { graph, plan }\n}\n\n/**\n * Performs a simple cycle detection for link edges.\n *\n * - Only considers edges with kind = 'link'; computed/source do not participate in the first version.\n * - On cycle detection, throws an error with path context to avoid infinite updates at runtime.\n */\nconst assertNoLinkCycles = (edges: ReadonlyArray<StateTraitGraphEdge>): void => {\n const adjacency = new Map<string, string[]>()\n\n for (const edge of edges) {\n if (edge.kind !== 'link') continue\n const list = adjacency.get(edge.from) ?? []\n list.push(edge.to)\n adjacency.set(edge.from, list)\n }\n\n const visited = new Set<string>()\n const stack = new Set<string>()\n\n const dfs = (node: string): void => {\n if (stack.has(node)) {\n throw new Error(\n `[StateTrait.build] link cycle detected at field \"${node}\". ` +\n 'Please check link traits for circular dependencies.',\n )\n }\n if (visited.has(node)) return\n visited.add(node)\n stack.add(node)\n\n const nexts = adjacency.get(node)\n if (nexts) {\n for (const to of nexts) {\n dfs(to)\n }\n }\n\n stack.delete(node)\n }\n\n for (const node of adjacency.keys()) {\n if (!visited.has(node)) {\n dfs(node)\n }\n }\n}\n\nconst collectSchemaPaths = (\n entries: ReadonlyArray<StateTraitEntry<any, string>>,\n): ReadonlyArray<StateTraitSchemaPathRef> => {\n const byKey = new Map<string, StateTraitSchemaPathRef>()\n\n const add = (ref: StateTraitSchemaPathRef): void => {\n if (!ref.path) return\n const k = `${ref.kind}|${ref.entryKind}|${ref.entryFieldPath}|${ref.ruleName ?? ''}|${ref.path}`\n byKey.set(k, ref)\n }\n\n const getCheckWritebackPath = (entry: Extract<StateTraitEntry<any, string>, { readonly kind: 'check' }>): string => {\n const wb = (entry.meta as any)?.writeback\n const p = wb && typeof wb === 'object' ? (wb as any).path : undefined\n const writebackPath = typeof p === 'string' && p.startsWith('errors.') ? p : undefined\n\n if (writebackPath) return writebackPath\n\n const fieldPath = entry.fieldPath\n if (fieldPath.endsWith('[]')) {\n return `errors.${fieldPath.slice(0, -2)}`\n }\n return `errors.${fieldPath}`\n }\n\n for (const entry of entries) {\n add({\n kind: 'fieldPath',\n entryKind: entry.kind,\n entryFieldPath: entry.fieldPath,\n path: entry.fieldPath,\n })\n\n if (entry.kind === 'computed' || entry.kind === 'source') {\n const deps = ((entry.meta as any)?.deps ?? []) as ReadonlyArray<string>\n for (const dep of deps) {\n add({\n kind: 'dep',\n entryKind: entry.kind,\n entryFieldPath: entry.fieldPath,\n path: dep,\n })\n }\n }\n\n if (entry.kind === 'link') {\n add({\n kind: 'link_from',\n entryKind: 'link',\n entryFieldPath: entry.fieldPath,\n path: entry.meta.from as string,\n })\n }\n\n if (entry.kind === 'check') {\n add({\n kind: 'check_writeback',\n entryKind: 'check',\n entryFieldPath: entry.fieldPath,\n path: getCheckWritebackPath(entry),\n })\n\n const rules = ((entry.meta as any)?.rules ?? {}) as Record<string, any>\n for (const name of Object.keys(rules)) {\n const rule = rules[name]\n if (!rule || typeof rule !== 'object') continue\n const deps = (rule.deps ?? []) as ReadonlyArray<string>\n for (const dep of deps) {\n add({\n kind: 'dep',\n entryKind: 'check',\n entryFieldPath: entry.fieldPath,\n ruleName: name,\n path: dep,\n })\n }\n }\n }\n }\n\n return Array.from(byKey.entries())\n .sort((a, b) => a[0].localeCompare(b[0]))\n .map(([, v]) => v)\n}\n\n/**\n * Builds a StateTraitProgram from the given stateSchema and trait spec.\n *\n * - Pure function: does not depend on external Env / global state.\n * - Current implementation focuses on:\n * - Normalizing Spec into entries.\n * - Building a lightweight Graph / Plan from entries.\n * - Running basic cycle detection for link edges.\n *\n * If we later need finer-grained dependency analysis (e.g. static analysis for computed/key),\n * evolve it inside this module without changing the public API surface.\n */\nexport const build = <S extends object>(\n stateSchema: Schema.Schema<S, any>,\n spec: StateTraitSpec<S>,\n): StateTraitProgram<S> => {\n const entries = normalizeSpec(spec) as ReadonlyArray<StateTraitEntry<S, string>>\n const nodeMetaByFieldPath = collectNodeMeta(spec)\n\n // Phase 4 (US2): require explicit deps (Graph/diagnostics/replay treat deps as the single dependency source of truth).\n for (const entry of entries) {\n if (entry.kind === 'computed') {\n const deps = (entry.meta as any).deps as ReadonlyArray<string> | undefined\n if (deps === undefined) {\n throw new Error(\n `[StateTrait.build] Missing explicit deps for computed \"${entry.fieldPath}\". ` +\n 'Please use StateTrait.computed({ deps: [...], get: ... }).',\n )\n }\n }\n if (entry.kind === 'source') {\n const deps = (entry.meta as any).deps as ReadonlyArray<string> | undefined\n if (deps === undefined) {\n throw new Error(\n `[StateTrait.build] Missing explicit deps for source \"${entry.fieldPath}\". ` +\n 'Please provide meta.deps for StateTrait.source({ deps: [...], ... }).',\n )\n }\n }\n if (entry.kind === 'check') {\n const rules = ((entry.meta as any)?.rules ?? {}) as Record<string, any>\n for (const name of Object.keys(rules)) {\n const rule = rules[name]\n if (typeof rule === 'function' || !rule || typeof rule !== 'object') {\n throw new Error(\n `[StateTrait.build] Missing explicit deps for check \"${entry.fieldPath}\" rule \"${name}\". ` +\n 'Please use { deps: [...], validate: ... } form.',\n )\n }\n if ((rule as any).deps === undefined) {\n throw new Error(\n `[StateTrait.build] Missing explicit deps for check \"${entry.fieldPath}\" rule \"${name}\". ` +\n 'Please provide deps: [...].',\n )\n }\n }\n }\n }\n\n const { graph, plan } = buildGraph(entries, nodeMetaByFieldPath)\n\n // Run a cycle check for link edges to avoid obvious configuration errors.\n assertNoLinkCycles(graph.edges)\n\n return {\n stateSchema,\n spec,\n entries: entries as ReadonlyArray<StateTraitEntry<any, string>>,\n graph,\n plan,\n convergeIr: buildConvergeIr(stateSchema as any, entries as ReadonlyArray<StateTraitEntry<any, string>>),\n schemaPaths: collectSchemaPaths(entries as ReadonlyArray<StateTraitEntry<any, string>>),\n }\n}\n","export type TraitMeta = Readonly<{\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 /**\n * Extension annotations: only accepts `x-*` keys (anchors for capabilities like Phantom Source / Drift Detection).\n *\n * Constraints:\n * - Must be serializable (JSON values).\n * - Must be slim (keep only a few key hints; don't stuff large objects).\n */\n readonly annotations?: Readonly<Record<string, JsonValue>>\n /**\n * Semantic hint: when the same entity (e.g. the same resourceId) has multiple inconsistent meta declarations,\n * the one with canonical=true becomes the \"display canonical\", and others are recorded as conflicts.\n */\n readonly canonical?: boolean\n}>\n\nexport type TraitMetaConflict = Readonly<{\n readonly origin: string\n readonly meta: TraitMeta\n}>\n\nexport type JsonPrimitive = string | number | boolean | null\nexport type JsonValue = JsonPrimitive | ReadonlyArray<JsonValue> | { readonly [key: string]: JsonValue }\n\nconst uniqSortedStrings = (input: ReadonlyArray<string>): ReadonlyArray<string> => {\n const set = new Set<string>()\n for (const item of input) {\n const v = item.trim()\n if (!v) continue\n set.add(v)\n }\n return Array.from(set).sort((a, b) => a.localeCompare(b))\n}\n\nconst isPlainRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst sanitizeJsonValue = (input: unknown, depth: number): JsonValue | undefined => {\n if (input === null) return null\n\n if (typeof input === 'string') return input\n if (typeof input === 'boolean') return input\n if (typeof input === 'number') {\n return Number.isFinite(input) ? input : undefined\n }\n\n if (depth >= 6) return undefined\n\n if (Array.isArray(input)) {\n const out: Array<JsonValue> = []\n for (const item of input) {\n const v = sanitizeJsonValue(item, depth + 1)\n if (v !== undefined) out.push(v)\n }\n return out\n }\n\n if (isPlainRecord(input)) {\n const keys = Object.keys(input).sort()\n const out: Record<string, JsonValue> = {}\n for (const key of keys) {\n const v = sanitizeJsonValue(input[key], depth + 1)\n if (v !== undefined) out[key] = v\n }\n return out\n }\n\n return undefined\n}\n\nexport const sanitize = (input: unknown): TraitMeta | undefined => {\n if (input === null || input === undefined) return undefined\n if (typeof input !== 'object' || Array.isArray(input)) return undefined\n\n const record = input as Record<string, unknown>\n const out: Record<string, unknown> = {}\n\n const pickString = (key: keyof TraitMeta): void => {\n const value = record[key as string]\n if (typeof value !== 'string') return\n const trimmed = value.trim()\n if (!trimmed) return\n out[key] = trimmed\n }\n\n pickString('label')\n pickString('description')\n pickString('group')\n pickString('docsUrl')\n pickString('cacheGroup')\n\n const canonical = record.canonical\n if (typeof canonical === 'boolean') {\n out.canonical = canonical\n }\n\n const tagsRaw = record.tags\n if (typeof tagsRaw === 'string') {\n const tags = uniqSortedStrings([tagsRaw])\n if (tags.length > 0) out.tags = tags\n } else if (Array.isArray(tagsRaw)) {\n const tags = uniqSortedStrings(tagsRaw.filter((x): x is string => typeof x === 'string'))\n if (tags.length > 0) out.tags = tags\n }\n\n const annotations: Record<string, JsonValue> = {}\n\n // legacy: allow passing `x-*` keys at the top-level (untyped input), then normalize into `annotations`.\n const annotationKeys = Object.keys(record)\n .filter((k) => k.startsWith('x-'))\n .sort((a, b) => a.localeCompare(b))\n for (const key of annotationKeys) {\n const v = sanitizeJsonValue(record[key], 0)\n if (v !== undefined) annotations[key] = v\n }\n\n // preferred: typed `annotations` field (only accepts `x-*` keys).\n const annotationsRaw = record.annotations\n if (isPlainRecord(annotationsRaw)) {\n const keys = Object.keys(annotationsRaw)\n .filter((k) => k.startsWith('x-'))\n .sort((a, b) => a.localeCompare(b))\n for (const key of keys) {\n const v = sanitizeJsonValue(annotationsRaw[key], 0)\n if (v !== undefined) annotations[key] = v\n }\n }\n\n if (Object.keys(annotations).length > 0) out.annotations = annotations\n\n return Object.keys(out).length > 0 ? (out as TraitMeta) : undefined\n}\n\nconst stableStringify = (meta: TraitMeta): string => {\n const out: Record<string, unknown> = {}\n const keys = Object.keys(meta).sort()\n for (const k of keys) {\n out[k] = (meta as any)[k]\n }\n return JSON.stringify(out)\n}\n\nexport const equals = (a: TraitMeta | undefined, b: TraitMeta | undefined): boolean => {\n if (a === b) return true\n if (!a || !b) return false\n return stableStringify(a) === stableStringify(b)\n}\n\nexport type CanonicalMergeInput = Readonly<{\n readonly meta?: TraitMeta\n readonly origin?: string\n readonly conflicts?: ReadonlyArray<TraitMetaConflict>\n}>\n\nexport type CanonicalMergeResult = Readonly<{\n readonly meta?: TraitMeta\n readonly origin?: string\n readonly conflicts?: ReadonlyArray<TraitMetaConflict>\n}>\n\nexport const mergeCanonical = (\n current: CanonicalMergeInput,\n incoming: Readonly<{ readonly origin: string; readonly meta: TraitMeta }>,\n): CanonicalMergeResult => {\n const existing = current.meta\n if (!existing) {\n return {\n meta: incoming.meta,\n origin: incoming.origin,\n conflicts: current.conflicts,\n }\n }\n\n if (equals(existing, incoming.meta)) {\n return current\n }\n\n const conflicts: Array<TraitMetaConflict> = [...((current.conflicts ?? []) as ReadonlyArray<TraitMetaConflict>)]\n\n const push = (conflict: TraitMetaConflict): void => {\n const exists = conflicts.some((c) => c.origin === conflict.origin && equals(c.meta, conflict.meta))\n if (!exists) conflicts.push(conflict)\n }\n\n const existingCanonical = existing.canonical === true\n const incomingCanonical = incoming.meta.canonical === true\n\n if (!existingCanonical && incomingCanonical) {\n push({\n origin: current.origin ?? 'unknown',\n meta: existing,\n })\n return {\n meta: incoming.meta,\n origin: incoming.origin,\n conflicts,\n }\n }\n\n push({\n origin: incoming.origin,\n meta: incoming.meta,\n })\n\n return {\n meta: existing,\n origin: current.origin ?? incoming.origin,\n conflicts,\n }\n}\n","import type { Schema } from 'effect'\nimport type { StateAtPath, StateFieldPath } from './field-path.js'\nimport type { DirtyAllReason } from '../field-path.js'\nimport * as Meta from './meta.js'\nimport type { ConvergeStaticIrRegistry } from './converge-ir.js'\nimport type { ConvergeExecIr } from './converge-exec-ir.js'\n\n// StateTrait core model.\n// Keep the field semantics aligned with data-model.md / references/state-trait-core.md.\n\n/**\n * StateTraitSpec<S>:\n * - The standard shape for the `traits` slot in a Module blueprint.\n * - Keys are constrained by StateFieldPath<S>; values are declarations for the corresponding scope (Entry / Node / List).\n */\nexport type StateTraitSpec<S> = S extends object\n ? {\n [Path in StateFieldPath<S> | '$root']?: StateTraitSpecValue<S, Path>\n }\n : never\n\nexport type StateTraitKind = 'computed' | 'source' | 'link' | 'check'\n\n/**\n * TraitConvergeScheduling:\n * - Scheduling semantics for converge/dirty-check (043): decides whether a step must converge within each transaction window.\n * - Default `immediate` (keeps legacy behavior); `deferred` takes effect only with explicit declaration + time-slicing enabled.\n */\nexport type TraitConvergeScheduling = 'immediate' | 'deferred'\n\nexport interface ComputedMeta<S, P> {\n /**\n * Explicit dependency field paths (required):\n *\n * - deps is the single source of truth for dependencies: Graph/ReverseClosure/incremental scheduling/perf optimizations rely on deps only.\n * - In the DSL, `StateTrait.computed({ deps, get })` uses deps-as-args; it does not expose `(state) => ...`.\n * - During build, `get(...depsValues)` is lowered into `derive(state)` for runtime execution, but the dependency read-set remains deps-based.\n * - In dev-mode, if actual reads in `derive(state)` disagree with deps, a `deps_mismatch` diagnostic warning is emitted.\n *\n * - For root scope: deps are StateFieldPath<State>.\n * - For list.item scope: deps are StateFieldPath<Item> (relative paths; build will prefix them).\n */\n readonly deps: ReadonlyArray<StateFieldPath<S>>\n readonly derive: (state: Readonly<S>) => StateAtPath<S, P>\n /**\n * Optional: equality predicate (used to skip no-op writebacks).\n */\n readonly equals?: (prev: StateAtPath<S, P>, next: StateAtPath<S, P>) => boolean\n /**\n * Converge scheduling (043): defaults to immediate.\n */\n readonly scheduling?: TraitConvergeScheduling\n}\n\nexport interface SourceMeta<S, P> {\n readonly deps: ReadonlyArray<StateFieldPath<S>>\n /**\n * Logical resource identifier (e.g. \"user/profile\").\n *\n * - In the StateTrait.source DSL, `resource` is stored here during build.\n * - data-model.md calls it resourceId; we keep the DSL naming here to avoid confusion.\n */\n readonly resource: string\n /**\n * Rule for computing the key required to access the resource.\n *\n * - deps is the single source of truth for dependencies: Graph/ReverseClosure/incremental scheduling/perf optimizations rely on deps only.\n * - In the DSL, `StateTrait.source({ deps, key })` uses deps-as-args; it does not expose `(state) => ...`.\n * - During build, `key(...depsValues)` is lowered into `key(state)` for runtime execution, but the dependency read-set remains deps-based.\n *\n * - Returning undefined means the resource is inactive under the current state (should be recycled to idle).\n */\n readonly key: (state: Readonly<S>) => unknown\n readonly triggers?: ReadonlyArray<'onMount' | 'onKeyChange' | 'manual'>\n readonly debounceMs?: number\n readonly concurrency?: 'switch' | 'exhaust-trailing'\n /**\n * Serializable metadata for devtools/docs (whitelisted fields).\n */\n readonly meta?: Meta.TraitMeta\n /**\n * Reserved: build may populate the field path this trait is attached to, for easier debugging.\n */\n readonly _fieldPath?: P\n}\n\nexport interface LinkMeta<S> {\n /**\n * Source field path (also constrained by StateFieldPath<S>).\n */\n readonly from: StateFieldPath<S>\n /**\n * Converge scheduling (043): defaults to immediate.\n */\n readonly scheduling?: TraitConvergeScheduling\n}\n\nexport type CheckRule<Input = unknown, Ctx = unknown> = {\n readonly deps: ReadonlyArray<string>\n /**\n * validateOn:\n * - Affects only auto validation phases (onChange/onBlur); submit/manual always run.\n * - Empty array disables auto validation (only submit/manual run).\n */\n readonly validateOn?: ReadonlyArray<'onChange' | 'onBlur'>\n readonly validate: (input: Input, ctx: Ctx) => unknown\n readonly meta?: Meta.TraitMeta\n}\n\nexport interface CheckMeta<Input = unknown, Ctx = unknown> {\n /**\n * Named rule set (used for deterministic merge and diagnostics display).\n */\n readonly rules: Readonly<Record<string, CheckRule<Input, Ctx>>>\n /**\n * Error-tree writeback (Phase 2: structure only; concrete writeback semantics land in later phases).\n */\n readonly writeback?: {\n readonly kind: 'errors'\n readonly path?: string\n }\n}\n\n/**\n * StateTraitEntry<S, P>:\n * - A single Trait configuration attached to a field path P.\n * - kind and meta always come together and are used to dispatch behavior during build/install.\n */\nexport type StateTraitEntry<S = unknown, P extends string = StateFieldPath<S>> =\n | {\n readonly fieldPath: P\n readonly kind: 'computed'\n readonly meta: ComputedMeta<S, P>\n }\n | {\n readonly fieldPath: P\n readonly kind: 'source'\n readonly meta: SourceMeta<S, P>\n }\n | {\n readonly fieldPath: P\n readonly kind: 'link'\n readonly meta: LinkMeta<S>\n }\n | {\n readonly fieldPath: P\n readonly kind: 'check'\n readonly meta: CheckMeta<unknown, unknown>\n }\n\nexport interface StateTraitNode<Input = unknown, Ctx = unknown> {\n readonly _tag: 'StateTraitNode'\n readonly computed?: StateTraitEntry<Input, any> | Readonly<Record<string, StateTraitEntry<Input, any>>>\n readonly source?: StateTraitEntry<Input, any> | Readonly<Record<string, StateTraitEntry<Input, any>>>\n readonly link?: StateTraitEntry<Input, any> | Readonly<Record<string, StateTraitEntry<Input, any>>>\n readonly check?: Readonly<Record<string, CheckRule<Input, Ctx>>>\n readonly meta?: Meta.TraitMeta\n}\n\nexport interface StateTraitList<Item = unknown> {\n readonly _tag: 'StateTraitList'\n readonly item?: StateTraitNode<Item, any>\n readonly list?: StateTraitNode<ReadonlyArray<Item>, any>\n readonly identityHint?: {\n readonly trackBy?: string\n }\n}\n\nexport type StateTraitSpecValue<S, P extends string> =\n | StateTraitEntry<S, P>\n | StateTraitNode<any, any>\n | StateTraitList<any>\n\n/**\n * StateTraitField:\n * - Represents a field node in State (whether or not traits are attached).\n * - Normalized from StateTraitSpec during build.\n */\nexport interface StateTraitField {\n readonly id: string\n readonly path: string\n readonly displayName?: string\n readonly valueType?: string\n readonly traits: ReadonlyArray<StateTraitFieldTrait>\n}\n\n/**\n * StateTraitFieldTrait:\n * - A structured description of a field trait (computed / source / link).\n * - meta matches StateTraitEntry.meta; deps is the set of field paths this trait depends on.\n */\nexport interface StateTraitFieldTrait {\n readonly fieldId: string\n readonly kind: StateTraitKind\n readonly meta:\n | ComputedMeta<unknown, string>\n | SourceMeta<unknown, string>\n | LinkMeta<unknown>\n | CheckMeta<unknown, unknown>\n readonly deps: ReadonlyArray<string>\n}\n\n/**\n * StateTraitResource:\n * - Describes the logical resource metadata that a source trait depends on.\n * - Concrete ResourceSpec implementation lives in the Resource namespace; this keeps only trait-perspective dependency info.\n */\nexport interface StateTraitResource {\n readonly resourceId: string\n readonly keySelector: string\n readonly keyExample?: unknown\n readonly ownerFields: ReadonlyArray<string>\n readonly meta?: Meta.TraitMeta\n readonly metaOrigin?: string\n readonly metaConflicts?: ReadonlyArray<Meta.TraitMetaConflict>\n}\n\n/**\n * Graph Node / Edge:\n * - Nodes typically correspond to fields.\n * - Edges represent dependencies between fields, or between fields and resources.\n */\nexport interface StateTraitGraphNode {\n readonly id: string\n readonly field: StateTraitField\n readonly traits: ReadonlyArray<StateTraitFieldTrait>\n readonly meta?: Meta.TraitMeta\n}\n\nexport interface StateTraitGraphEdge {\n readonly id: string\n readonly from: string\n readonly to: string\n readonly kind: 'computed' | 'link' | 'source-dep' | 'check-dep'\n}\n\n/**\n * StateTraitGraph:\n * - Structural view of the StateTrait engine: a graph of nodes and dependency edges.\n * - Used by Devtools / Studio / Runtime for structural analysis and visualization.\n */\nexport interface StateTraitGraph {\n readonly _tag: 'StateTraitGraph'\n readonly nodes: ReadonlyArray<StateTraitGraphNode>\n readonly edges: ReadonlyArray<StateTraitGraphEdge>\n readonly resources: ReadonlyArray<StateTraitResource>\n readonly meta?: {\n readonly moduleId?: string\n readonly version?: string\n }\n}\n\n/**\n * StateTraitPlanStep:\n * - The smallest instruction unit used by StateTrait.install / Runtime execution.\n * - Derived from the graph; used at runtime to install watchers or trigger external calls.\n */\nexport interface StateTraitPlanStep {\n readonly id: string\n readonly kind: 'computed-update' | 'link-propagate' | 'source-refresh' | 'check-validate'\n readonly targetFieldPath?: string\n readonly sourceFieldPaths?: ReadonlyArray<string>\n readonly resourceId?: string\n readonly keySelectorId?: string\n readonly debugInfo?: {\n readonly graphNodeId?: string\n readonly graphEdgeId?: string\n }\n}\n\n/**\n * StateTraitPlan:\n * - Execution plan summarizing all trait behaviors for a module.\n * - install mounts behaviors onto Bound API / EffectOp pipelines according to the plan.\n */\nexport interface StateTraitPlan {\n readonly _tag: 'StateTraitPlan'\n readonly moduleId?: string\n readonly steps: ReadonlyArray<StateTraitPlanStep>\n readonly meta?: Record<string, unknown>\n}\n\nexport type StateTraitSchemaPathKind = 'fieldPath' | 'dep' | 'link_from' | 'check_writeback'\n\nexport interface StateTraitSchemaPathRef {\n readonly kind: StateTraitSchemaPathKind\n readonly entryKind: StateTraitKind\n readonly entryFieldPath: string\n readonly path: string\n readonly ruleName?: string\n}\n\n/**\n * StateTraitProgram<S>:\n * - Program output of the StateTrait engine; the unified entrypoint for Runtime / Devtools.\n * - stateSchema and spec preserve original inputs; graph/plan are internal IR.\n */\nexport interface StateTraitProgram<S> {\n readonly stateSchema: Schema.Schema<S, any>\n readonly spec: StateTraitSpec<S>\n /**\n * Program.entries:\n * - Minimal rule set normalized from spec (including node/list/$root) during build.\n * - Phase 2 focuses on a readable/diagnosable structure; later phases add execution and converge semantics.\n */\n readonly entries: ReadonlyArray<StateTraitEntry<any, string>>\n readonly graph: StateTraitGraph\n readonly plan: StateTraitPlan\n readonly convergeIr?: ConvergeStaticIrRegistry\n readonly convergeExecIr?: ConvergeExecIr\n /**\n * schemaPaths:\n * - Path references that must exist in stateSchema, collected from entries during build; dev-only diagnostics (e.g. schema_mismatch).\n * - When diagnostics=off, validation can be skipped entirely to keep near-zero cost.\n */\n readonly schemaPaths?: ReadonlyArray<StateTraitSchemaPathRef>\n}\n\n/**\n * Build a normalized entry list from StateTraitSpec.\n *\n * - Phase 2: supports structural expansion of node/list/$root and fills/prefixes fieldPath/deps when necessary.\n * - Later phases may extend validation here (e.g. detecting duplicates, override rules, etc.).\n */\nexport const normalizeSpec = <S>(spec: StateTraitSpec<S>): ReadonlyArray<StateTraitEntry<any, string>> => {\n const entries: Array<StateTraitEntry<any, string>> = []\n\n const isNode = (value: unknown): value is StateTraitNode<any, any> =>\n typeof value === 'object' && value !== null && (value as any)._tag === 'StateTraitNode'\n\n const isList = (value: unknown): value is StateTraitList<any> =>\n typeof value === 'object' && value !== null && (value as any)._tag === 'StateTraitList'\n\n const joinPath = (prefix: string, suffix: string): string => {\n if (!prefix) return suffix\n if (!suffix) return prefix\n return `${prefix}.${suffix}`\n }\n\n const prefixDeps = (deps: ReadonlyArray<string> | undefined, prefix: string): ReadonlyArray<string> => {\n if (!deps || deps.length === 0) return []\n return deps.map((d) => (prefix ? joinPath(prefix, d) : d))\n }\n\n const normalizeEntry = (\n entry: StateTraitEntry<any, string>,\n fieldPath: string,\n depPrefix: string,\n ): StateTraitEntry<any, string> => {\n if (entry.kind === 'computed') {\n const meta = entry.meta as any\n const rawDeps = meta.deps as ReadonlyArray<string> | undefined\n const deps = rawDeps !== undefined ? prefixDeps(rawDeps, depPrefix) : undefined\n return {\n ...(entry as any),\n fieldPath,\n meta: { ...meta, deps },\n }\n }\n if (entry.kind === 'source') {\n const meta = entry.meta as any\n const rawDeps = meta.deps as ReadonlyArray<string> | undefined\n const deps = rawDeps !== undefined ? prefixDeps(rawDeps, depPrefix) : undefined\n return {\n ...(entry as any),\n fieldPath,\n meta: { ...meta, deps, _fieldPath: fieldPath },\n }\n }\n if (entry.kind === 'link') {\n const meta = entry.meta as any\n const from = prefixDeps([meta.from as string], depPrefix)[0] ?? meta.from\n return {\n ...(entry as any),\n fieldPath,\n meta: { ...meta, from },\n }\n }\n // check: Phase 2 adjusts fieldPath only; deps are still collected from meta.rules during build.\n return {\n ...(entry as any),\n fieldPath,\n }\n }\n\n const expandNode = (\n scopeId: string,\n joinPrefix: string,\n node: StateTraitNode<any, any>,\n options?: {\n /**\n * Prefix for check deps: default semantics for list-scope checks (deps are relative to a row item rather than the list root).\n *\n * - item scope: depsPrefix = `${listPath}[]` (matches joinPrefix).\n * - list scope: fieldPath = `${listPath}`, but depsPrefix should be `${listPath}[]`.\n */\n readonly checkDepsPrefix?: string\n },\n ): void => {\n const addEntry = (relativeTarget: string, raw: StateTraitEntry<any, string>): void => {\n const rel = (raw as any).fieldPath ?? relativeTarget\n const fieldPath = joinPrefix ? joinPath(joinPrefix, String(rel)) : String(rel)\n entries.push(normalizeEntry(raw, fieldPath, joinPrefix))\n }\n\n const expandMaybeRecord = (\n value: StateTraitEntry<any, any> | Readonly<Record<string, StateTraitEntry<any, any>>> | undefined,\n ): void => {\n if (!value) return\n if (typeof (value as any).kind === 'string') {\n addEntry('', value as any)\n return\n }\n const record = value as Readonly<Record<string, StateTraitEntry<any, any>>>\n for (const key in record) {\n if (!Object.prototype.hasOwnProperty.call(record, key)) continue\n const entry = record[key]\n if (!entry) continue\n addEntry(key, entry as any)\n }\n }\n\n expandMaybeRecord(node.computed)\n expandMaybeRecord(node.source)\n expandMaybeRecord(node.link)\n\n if (node.check) {\n const rules: Record<string, CheckRule<any, any>> = {}\n const checkDepsPrefix = options?.checkDepsPrefix ?? (joinPrefix.endsWith('[]') ? joinPrefix : '')\n\n const prefixCheckDeps = (deps: ReadonlyArray<string> | undefined): ReadonlyArray<string> => {\n if (!deps || deps.length === 0) return []\n return deps.map((d) => (d === '' ? scopeId : checkDepsPrefix ? joinPath(checkDepsPrefix, d) : d))\n }\n for (const name of Object.keys(node.check)) {\n const rule = (node.check as any)[name] as CheckRule<any, any>\n if (typeof rule === 'function') {\n rules[name] = rule\n continue\n }\n if (rule && typeof rule === 'object') {\n const meta = Meta.sanitize((rule as any).meta)\n rules[name] = {\n ...rule,\n deps: prefixCheckDeps(rule.deps),\n meta,\n }\n continue\n }\n // Invalid input: ignore (later phases may promote this into a build-time config error).\n }\n\n entries.push({\n fieldPath: scopeId,\n kind: 'check',\n meta: {\n rules,\n writeback: { kind: 'errors' },\n },\n } as StateTraitEntry<any, any>)\n }\n }\n\n for (const key in spec) {\n if (!Object.prototype.hasOwnProperty.call(spec, key)) continue\n const raw = spec[key as keyof typeof spec] as StateTraitSpecValue<S, any> | undefined\n if (!raw) continue\n\n if (isList(raw)) {\n const listPath = key\n if (raw.item) {\n expandNode(`${listPath}[]`, `${listPath}[]`, raw.item)\n }\n if (raw.list) {\n expandNode(listPath, listPath, raw.list, {\n checkDepsPrefix: `${listPath}[]`,\n })\n }\n continue\n }\n\n if (isNode(raw)) {\n if (key === '$root') {\n expandNode('$root', '', raw)\n } else {\n expandNode(key, key, raw)\n }\n continue\n }\n\n const entry = raw as any as StateTraitEntry<any, string>\n const fieldPath = (entry as any).fieldPath ?? key\n entries.push(normalizeEntry(entry, String(fieldPath), ''))\n }\n\n return entries\n}\n\n/**\n * collectNodeMeta:\n * - Extract StateTraitNode.meta (whitelisted fields) from StateTraitSpec for devtools structural display.\n * - meta is for diagnostics/display only and does not participate in runtime semantics.\n */\nexport const collectNodeMeta = <S>(spec: StateTraitSpec<S>): ReadonlyMap<string, Meta.TraitMeta> => {\n const out = new Map<string, Meta.TraitMeta>()\n\n const isNode = (value: unknown): value is StateTraitNode<any, any> =>\n typeof value === 'object' && value !== null && (value as any)._tag === 'StateTraitNode'\n\n const isList = (value: unknown): value is StateTraitList<any> =>\n typeof value === 'object' && value !== null && (value as any)._tag === 'StateTraitList'\n\n const add = (scopeId: string, node: StateTraitNode<any, any>): void => {\n const meta = Meta.sanitize(node.meta)\n if (meta) out.set(scopeId, meta)\n }\n\n for (const key in spec) {\n if (!Object.prototype.hasOwnProperty.call(spec, key)) continue\n const raw = spec[key as keyof typeof spec] as StateTraitSpecValue<S, any> | undefined\n if (!raw) continue\n\n if (isList(raw)) {\n const listPath = key\n if (raw.item) add(`${listPath}[]`, raw.item)\n if (raw.list) add(listPath, raw.list)\n continue\n }\n\n if (isNode(raw)) {\n if (key === '$root') add('$root', raw)\n else add(key, raw)\n continue\n }\n }\n\n return out\n}\n\n// ---- Converge (013) evidence model ----\n\nexport type TraitConvergeRequestedMode = 'auto' | 'full' | 'dirty'\nexport type TraitConvergeExecutedMode = 'full' | 'dirty'\nexport type TraitConvergeOutcome = 'Converged' | 'Noop' | 'Degraded'\n\nexport type TraitConvergeConfigScope = 'provider' | 'runtime_module' | 'runtime_default' | 'builtin'\n\nexport type TraitConvergeReason =\n | 'cold_start'\n | 'cache_hit'\n | 'cache_miss'\n | 'budget_cutoff'\n | 'near_full'\n | 'unknown_write'\n | 'dirty_all'\n | 'generation_bumped'\n | 'low_hit_rate_protection'\n | 'module_override'\n | 'time_slicing_immediate'\n | 'time_slicing_deferred'\n\nexport interface TraitConvergeStepStats {\n readonly totalSteps: number\n readonly executedSteps: number\n readonly skippedSteps: number\n readonly changedSteps: number\n readonly affectedSteps?: number\n}\n\nexport interface TraitConvergeDirtySummary {\n readonly dirtyAll: boolean\n readonly reason?: DirtyAllReason\n readonly rootCount?: number\n readonly rootIds?: ReadonlyArray<number>\n readonly rootIdsTruncated?: boolean\n}\n\nexport interface TraitConvergePlanCacheEvidence {\n readonly capacity: number\n readonly size: number\n readonly hits: number\n readonly misses: number\n readonly evicts: number\n readonly hit: boolean\n readonly keySize?: number\n readonly missReason?: 'cold_start' | 'generation_bumped' | 'not_cached' | 'unknown'\n readonly disabled?: boolean\n readonly disableReason?: 'low_hit_rate' | 'generation_thrash' | 'manual_override' | 'unknown'\n}\n\nexport type TraitConvergeGenerationBumpReason =\n | 'writers_changed'\n | 'deps_changed'\n | 'logic_installed'\n | 'logic_uninstalled'\n | 'imports_changed'\n | 'unknown'\n\nexport interface TraitConvergeGenerationEvidence {\n readonly generation: number\n readonly generationBumpCount?: number\n readonly lastBumpReason?: TraitConvergeGenerationBumpReason\n}\n\nexport interface TraitConvergeStaticIrEvidence {\n readonly fieldPathCount: number\n readonly stepCount: number\n readonly buildDurationMs?: number\n}\n\nexport interface TraitConvergeHotspot {\n readonly kind?: string\n readonly stepId: number\n readonly outFieldPathId?: number\n readonly durationMs: number\n readonly changed: boolean\n}\n\nexport interface TraitConvergeTimeSlicingSummary {\n readonly scope: 'all' | 'immediate' | 'deferred'\n readonly immediateStepCount: number\n readonly deferredStepCount: number\n}\n\nexport interface TraitConvergeDiagnosticsSamplingSummary {\n /**\n * Deterministic sampling: use stable txnSeq as an anchor and sample every N transactions.\n * - sampled=true means this invocation captured per-step timings and produced hotspots.\n */\n readonly strategy: 'txnSeq_interval'\n readonly sampleEveryN: number\n readonly topK: number\n readonly sampled: boolean\n}\n\nexport interface TraitConvergeDecisionSummary {\n readonly requestedMode: TraitConvergeRequestedMode\n readonly executedMode: TraitConvergeExecutedMode\n readonly outcome: TraitConvergeOutcome\n readonly configScope: TraitConvergeConfigScope\n readonly staticIrDigest: string\n readonly executionBudgetMs: number\n readonly executionDurationMs: number\n readonly decisionBudgetMs?: number\n readonly decisionDurationMs?: number\n readonly reasons: ReadonlyArray<TraitConvergeReason>\n readonly stepStats: TraitConvergeStepStats\n readonly dirty?: TraitConvergeDirtySummary\n readonly cache?: TraitConvergePlanCacheEvidence\n readonly generation?: TraitConvergeGenerationEvidence\n readonly staticIr?: TraitConvergeStaticIrEvidence\n readonly timeSlicing?: TraitConvergeTimeSlicingSummary\n readonly thresholds?: { readonly floorRatio?: number }\n readonly diagnosticsSampling?: TraitConvergeDiagnosticsSamplingSummary\n readonly top3?: ReadonlyArray<TraitConvergeHotspot>\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","/**\n * internal/digest:\n * - Minimal \"stable digest\" utilities for Runtime / Static IR / Traits, etc.\n * - Goal: stable output across runs/processes while staying lightweight (no extra dependencies).\n *\n * Note: stableStringify does not aim for full JSON equivalence; it only covers the subset needed by this repo:\n * - Stable key ordering (object fields sorted lexicographically).\n * - Non-finite numbers (NaN/±Infinity) degrade to null.\n * - Other non-representable values (undefined/function/symbol, etc.) degrade to null.\n * - undefined inside objects is not omitted; it is encoded as null (differs from JSON.stringify).\n */\n\nexport const stableStringify = (value: unknown): string => {\n if (value === null) return 'null'\n const t = typeof value\n if (t === 'string') return JSON.stringify(value)\n if (t === 'number') return Number.isFinite(value) ? String(value) : 'null'\n if (t === 'boolean') return value ? 'true' : 'false'\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`\n }\n\n if (t === 'object') {\n const record = value as Record<string, unknown>\n const keys = Object.keys(record).sort((a, b) => a.localeCompare(b))\n return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(record[k])}`).join(',')}}`\n }\n\n return 'null'\n}\n\n/**\n * fnv1a32:\n * - 32-bit FNV-1a hash (for short digests); outputs fixed 8-char hex.\n */\nexport const fnv1a32 = (input: string): string => {\n let hash = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i)\n hash = (hash * 0x01000193) >>> 0\n }\n return hash.toString(16).padStart(8, '0')\n}\n","import { Effect } from 'effect'\nimport type { BoundApi } from '../runtime/core/module.js'\nimport { getBoundInternals } from '../runtime/core/runtimeInternalsAccessor.js'\nimport * as SourceRuntime from './source.js'\nimport type {\n StateTraitProgram,\n StateTraitPlanStep,\n StateTraitEntry,\n TraitConvergeGenerationBumpReason,\n} from './model.js'\n\nconst buildEntryIndex = <S>(\n entries: ReadonlyArray<StateTraitEntry<S, string>>,\n): Map<string, Array<StateTraitEntry<S, string>>> => {\n const index = new Map<string, Array<StateTraitEntry<S, string>>>()\n for (const entry of entries) {\n const list = index.get(entry.fieldPath) ?? []\n list.push(entry)\n index.set(entry.fieldPath, list)\n }\n return index\n}\n\n/**\n * Install behaviors described by StateTraitProgram onto the given Bound API.\n *\n * - Phase 2 minimal implementation:\n * - Register watchers for computed fields: recompute target fields when State changes.\n * - Register watchers for link fields: sync target fields when source fields change.\n * - Reserve refresh entrypoints for source fields (no external calls yet).\n *\n * Notes:\n * - All watchers are installed via Bound API `$`, without directly depending on ModuleRuntime.\n * - Each PlanStep corresponds to a long-lived Effect and is mounted into the Runtime Scope via forkScoped.\n */\nexport const install = <S>(\n bound: BoundApi<any, any>,\n program: StateTraitProgram<S>,\n): Effect.Effect<void, never, any> => {\n // Register the program to Runtime first (the converge engine runs computed/link/check before txn commit).\n try {\n const internals = getBoundInternals(bound as any)\n ;(internals.traits.registerStateTraitProgram as any)(program, {\n bumpReason: 'logic_installed' as TraitConvergeGenerationBumpReason,\n })\n } catch {\n // no-op for legacy/mocked bound\n }\n\n const entryIndex = buildEntryIndex(program.entries as any)\n\n const installStep = (step: StateTraitPlanStep): Effect.Effect<void, never, any> => {\n if (!step.targetFieldPath) {\n return Effect.void\n }\n\n if (step.kind !== 'source-refresh') {\n // computed/link/check are handled by the runtime core within the transaction window; install keeps only source.refresh entrypoints.\n return Effect.void\n }\n\n const candidates = entryIndex.get(step.targetFieldPath)\n if (!candidates || candidates.length === 0) {\n // The plan references a missing spec: treat it as a build-time bug and ignore the step here.\n return Effect.void\n }\n\n const entry = candidates.find((e) => e.kind === 'source')\n\n if (!entry) {\n return Effect.void\n }\n\n return SourceRuntime.installSourceRefresh(bound, step, entry as any)\n }\n\n return Effect.forEach(program.plan.steps, (step) => installStep(step)).pipe(Effect.asVoid)\n}\n","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 { isDevEnv } from './env.js'\nimport type { RuntimeInternals } from './RuntimeInternals.js'\n\nconst RUNTIME_INTERNALS = Symbol.for('@logixjs/core/runtimeInternals')\nconst BOUND_INTERNALS = Symbol.for('@logixjs/core/boundInternals')\nconst MODULE_TRAITS_PROGRAM = Symbol.for('@logixjs/core/moduleTraitsProgram')\n\nconst defineHidden = (target: object, key: symbol, value: unknown): void => {\n Object.defineProperty(target, key, {\n value,\n enumerable: false,\n configurable: true,\n writable: false,\n })\n}\n\nexport const setRuntimeInternals = (runtime: object, internals: RuntimeInternals): void => {\n defineHidden(runtime, RUNTIME_INTERNALS, internals)\n}\n\nexport const setBoundInternals = (bound: object, internals: RuntimeInternals): void => {\n defineHidden(bound, BOUND_INTERNALS, internals)\n}\n\n/**\n * ModuleTraitsProgram(StateTraitProgram):\n * - Attaches a traits Program to a module definition object (used by TraitLifecycle/Debug).\n * - Uses Symbol + non-enumerable properties to avoid spreading `.__*` magic fields.\n *\n * Note: this is a \"module-definition-side\" internal slot, not RuntimeInternals (instance-level); the semantics differ.\n */\nexport const setModuleTraitsProgram = (module: object, program: unknown): void => {\n defineHidden(module, MODULE_TRAITS_PROGRAM, program)\n}\n\nexport const getModuleTraitsProgram = (module: unknown): unknown | undefined => {\n if (!module) return undefined\n if (typeof module !== 'object' && typeof module !== 'function') return undefined\n return (module as any)[MODULE_TRAITS_PROGRAM] as unknown | undefined\n}\n\nconst formatScope = (moduleId: unknown, instanceId: unknown): string => {\n const m = typeof moduleId === 'string' && moduleId.length > 0 ? moduleId : 'unknown'\n const i = typeof instanceId === 'string' && instanceId.length > 0 ? instanceId : 'unknown'\n return `moduleId=${m}, instanceId=${i}`\n}\n\nexport const getRuntimeInternals = (runtime: object): RuntimeInternals => {\n const scope = runtime as { readonly moduleId?: unknown; readonly instanceId?: unknown }\n const internals = (runtime as any)[RUNTIME_INTERNALS] as RuntimeInternals | undefined\n if (!internals) {\n const msg = isDevEnv()\n ? [\n '[MissingRuntimeInternals] Runtime internals not installed on ModuleRuntime instance.',\n `scope: ${formatScope(scope.moduleId, scope.instanceId)}`,\n 'fix:',\n '- Ensure ModuleRuntime.make calls internalHooks.installInternalHooks (020 foundation).',\n '- If you created a mock runtime for tests, attach internals or avoid calling internal-only APIs.',\n ].join('\\n')\n : 'Runtime internals not installed'\n throw new Error(msg)\n }\n\n const runtimeInstanceId = scope.instanceId\n if (\n typeof runtimeInstanceId === 'string' &&\n runtimeInstanceId.length > 0 &&\n runtimeInstanceId !== internals.instanceId\n ) {\n throw new Error(\n isDevEnv()\n ? [\n '[InconsistentRuntimeInternals] Runtime internals instanceId mismatch.',\n `runtime: ${formatScope(scope.moduleId, runtimeInstanceId)}`,\n `internals: ${formatScope(internals.moduleId, internals.instanceId)}`,\n ].join('\\n')\n : 'Runtime internals mismatch',\n )\n }\n\n return internals\n}\n\nexport const getBoundInternals = (bound: object): RuntimeInternals => {\n const internals = (bound as any)[BOUND_INTERNALS] as RuntimeInternals | undefined\n if (!internals) {\n const msg = isDevEnv()\n ? [\n '[MissingBoundInternals] Bound internals not installed on Bound API instance.',\n 'fix:',\n '- Ensure BoundApiRuntime attaches internals (020 foundation).',\n '- If you created a mock bound for tests, attach internals or avoid calling internal-only APIs.',\n ].join('\\n')\n : 'Bound internals not installed'\n throw new Error(msg)\n }\n\n return internals\n}\n","import { Effect, Fiber, FiberRef, Option } from 'effect'\nimport { create } from 'mutative'\nimport * as EffectOp from '../effect-op.js'\nimport { Snapshot, internal as ResourceInternal, keyHash as hashKey } from '../resource.js'\nimport * as EffectOpCore from '../runtime/core/EffectOpCore.js'\nimport * as Debug from '../runtime/core/DebugSink.js'\nimport * as TaskRunner from '../runtime/core/TaskRunner.js'\nimport { isDevEnv, ReplayModeConfigTag } from '../runtime/core/env.js'\nimport * as ReplayLog from '../runtime/core/ReplayLog.js'\nimport type { PatchReason } from '../runtime/core/StateTransaction.js'\nimport type { FieldPath, FieldPathId } from '../field-path.js'\nimport { normalizeFieldPath } from '../field-path.js'\nimport type { BoundApi } from '../runtime/core/module.js'\nimport { getBoundInternals } from '../runtime/core/runtimeInternalsAccessor.js'\nimport { RunSessionTag } from '../observability/runSession.js'\nimport * as DepsTrace from './deps-trace.js'\nimport * as RowId from './rowid.js'\nimport type { StateTraitEntry, StateTraitPlanStep, StateTraitProgram } from './model.js'\n\nexport interface SourceSyncContext<S> {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly getDraft: () => S\n readonly setDraft: (next: S) => void\n readonly recordPatch: (\n path: string | FieldPath | FieldPathId | undefined,\n reason: PatchReason,\n from?: unknown,\n to?: unknown,\n traitNodeId?: string,\n stepId?: number,\n ) => void\n}\n\nconst 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\nconst formatList = (items: ReadonlyArray<string>, limit = 10): string => {\n if (items.length === 0) return ''\n if (items.length <= limit) return items.join(', ')\n return `${items.slice(0, limit).join(', ')}, …(+${items.length - limit})`\n}\n\nconst emitDepsMismatch = (params: {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly kind: 'computed' | 'source'\n readonly fieldPath: string\n readonly diff: DepsTrace.DepsDiff\n}): Effect.Effect<void, never, any> =>\n Effect.gen(function* () {\n const key = `${params.instanceId ?? 'unknown'}::${params.kind}::${params.fieldPath}`\n const shouldEmit = yield* onceInRunSession(`deps_mismatch:${key}`)\n if (!shouldEmit) return\n\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: params.moduleId,\n instanceId: params.instanceId,\n code: 'state_trait::deps_mismatch',\n severity: 'warning',\n message:\n `[deps] ${params.kind} \"${params.fieldPath}\" declared=[${formatList(params.diff.declared)}] ` +\n `reads=[${formatList(params.diff.reads)}] missing=[${formatList(params.diff.missing)}] ` +\n `unused=[${formatList(params.diff.unused)}]`,\n hint:\n 'deps is the single source of truth for dependencies: incremental scheduling / reverse closures / performance optimizations rely on deps only. ' +\n 'Keep deps consistent with actual reads; if you really depend on the whole object, declare a coarser-grained dep (e.g. \"profile\") to cover sub-field reads.',\n kind: `deps_mismatch:${params.kind}`,\n })\n })\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 recordTraitPatch = (\n bound: BoundApi<any, any>,\n path: string,\n reason: PatchReason,\n from?: unknown,\n to?: unknown,\n traitNodeId?: string,\n): void => {\n const normalized = normalizeFieldPath(path) ?? []\n try {\n const internals = getBoundInternals(bound as any)\n internals.txn.recordStatePatch(normalized, reason, from, to, traitNodeId)\n } catch {\n // no-op for legacy/mocked bound\n }\n}\n\nconst recordReplayEvent = (bound: BoundApi<any, any>, event: ReplayLog.ReplayLogEvent): void => {\n try {\n const internals = getBoundInternals(bound as any)\n internals.txn.recordReplayEvent(event)\n } catch {\n // no-op for legacy/mocked bound\n }\n}\n\nconst getBoundScope = (bound: BoundApi<any, any>): { readonly moduleId?: string; readonly instanceId?: string } => {\n try {\n const internals = getBoundInternals(bound as any)\n return { moduleId: internals.moduleId, instanceId: internals.instanceId }\n } catch {\n return { moduleId: undefined, instanceId: undefined }\n }\n}\n\nconst setSnapshotInTxn = (\n bound: BoundApi<any, any>,\n fieldPath: string,\n next: unknown,\n reason: PatchReason,\n stepId: string,\n traitNodeId?: string,\n): Effect.Effect<boolean, never, any> =>\n Effect.gen(function* () {\n let wrote = false\n yield* bound.state.mutate((draft) => {\n const prev = RowId.getAtPath(draft, fieldPath)\n if (Object.is(prev, next)) return\n wrote = true\n RowId.setAtPathMutating(draft, fieldPath, next)\n recordTraitPatch(bound, fieldPath, reason, prev, next, traitNodeId)\n })\n return wrote\n })\n\nconst writebackIfCurrentKeyHash = (\n bound: BoundApi<any, any>,\n fieldPath: string,\n keyHash: string,\n next: unknown,\n reason: PatchReason,\n stepId: string,\n traitNodeId?: string,\n replayEvent?: ReplayLog.ReplayLogEvent,\n): Effect.Effect<boolean, never, any> =>\n Effect.gen(function* () {\n let wrote = false\n yield* bound.state.mutate((draft) => {\n const current = RowId.getAtPath(draft, fieldPath)\n const currentKeyHash = current && typeof current === 'object' ? (current as any).keyHash : undefined\n if (currentKeyHash !== keyHash) return\n\n const prev = current\n if (Object.is(prev, next)) return\n\n wrote = true\n RowId.setAtPathMutating(draft, fieldPath, next)\n if (replayEvent) {\n recordReplayEvent(bound, replayEvent)\n }\n recordTraitPatch(bound, fieldPath, reason, prev, next, traitNodeId)\n })\n return wrote\n })\n\n/**\n * syncIdleInTransaction:\n * - Synchronously evaluate all source.key(state) within the transaction window.\n * - If a key becomes empty (undefined), synchronously reset the field to an idle snapshot (avoid tearing).\n */\nexport const syncIdleInTransaction = <S extends object>(\n program: StateTraitProgram<S>,\n ctx: SourceSyncContext<S>,\n): Effect.Effect<void> =>\n Effect.sync(() => {\n const draft = ctx.getDraft() as any\n const updates: Array<{ readonly fieldPath: string; readonly prev: unknown }> = []\n\n for (const entry of program.entries) {\n if (entry.kind !== 'source') continue\n const fieldPath = entry.fieldPath\n const listItem = RowId.parseListItemFieldPath(fieldPath)\n\n if (listItem) {\n // list.item scope: evaluate key per row by index, and synchronously write back idle for inactive rows.\n const listValue = RowId.getAtPath(draft, listItem.listPath)\n const items: ReadonlyArray<unknown> = Array.isArray(listValue) ? listValue : []\n\n for (let index = 0; index < items.length; index++) {\n const item = items[index]\n\n let key: unknown\n try {\n key = (entry.meta as any).key(item)\n } catch {\n continue\n }\n\n if (key !== undefined) continue\n\n const concretePath = RowId.toListItemValuePath(listItem.listPath, index, listItem.itemPath)\n const prev = RowId.getAtPath(draft, concretePath)\n const prevStatus = prev && typeof prev === 'object' ? (prev as any).status : undefined\n if (prevStatus === 'idle') {\n const data = (prev as any)?.data\n const error = (prev as any)?.error\n if (data === undefined && error === undefined) {\n continue\n }\n }\n\n updates.push({ fieldPath: concretePath, prev })\n }\n\n continue\n }\n\n let key: unknown\n try {\n key = (entry.meta as any).key(draft)\n } catch {\n continue\n }\n\n if (key !== undefined) continue\n\n const prev = RowId.getAtPath(draft, fieldPath)\n const prevStatus = prev && typeof prev === 'object' ? (prev as any).status : undefined\n if (prevStatus === 'idle') {\n // Still ensure data/error are cleared.\n const data = (prev as any)?.data\n const error = (prev as any)?.error\n if (data === undefined && error === undefined) {\n continue\n }\n }\n\n updates.push({ fieldPath, prev })\n }\n\n if (updates.length === 0) return\n\n const reason: PatchReason = 'source-refresh'\n\n const nextDraft = create(draft, (next) => {\n for (const u of updates) {\n RowId.setAtPathMutating(next, u.fieldPath, Snapshot.idle())\n }\n })\n\n ctx.setDraft(nextDraft as S)\n\n for (const u of updates) {\n const normalized = normalizeFieldPath(u.fieldPath) ?? []\n ctx.recordPatch(normalized, reason, u.prev, Snapshot.idle(), `source:${u.fieldPath}:idle`)\n }\n })\n\n/**\n * installSourceRefresh:\n * - Register the refresh implementation for a single source field (ResourceSnapshot + keyHash gate + concurrency).\n */\nexport const installSourceRefresh = <S>(\n bound: BoundApi<any, any>,\n step: StateTraitPlanStep,\n entry: Extract<StateTraitEntry<S, string>, { readonly kind: 'source' }>,\n): Effect.Effect<void, never, any> => {\n if (!step.targetFieldPath) return Effect.void\n\n const fieldPath = step.targetFieldPath\n const resourceId = step.resourceId ?? entry.meta.resource\n const listItem = RowId.parseListItemFieldPath(fieldPath)\n\n let internals: ReturnType<typeof getBoundInternals> | undefined\n try {\n internals = getBoundInternals(bound as any)\n } catch {\n return Effect.void\n }\n\n const register = internals.traits.registerSourceRefresh\n\n const recordSnapshot = (\n replayMode: 'live' | 'replay',\n replayLog: ReplayLog.ReplayLogService | undefined,\n input:\n | ReplayLog.ReplayLogEvent\n | {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly fieldPath: string\n readonly keyHash?: string\n readonly concurrency?: string\n readonly phase: ReplayLog.ResourceSnapshotPhase\n readonly snapshot: unknown\n },\n ): Effect.Effect<void, never, any> => {\n if (!replayLog) return Effect.void\n if (replayMode !== 'live') return Effect.void\n const event: ReplayLog.ReplayLogEvent =\n input && typeof input === 'object' && (input as any)._tag === 'ResourceSnapshot'\n ? (input as ReplayLog.ReplayLogEvent)\n : {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: (input as any).fieldPath,\n keyHash: (input as any).keyHash,\n concurrency: (input as any).concurrency,\n phase: (input as any).phase,\n snapshot: (input as any).snapshot,\n timestamp: Date.now(),\n moduleId: (input as any).moduleId,\n instanceId: (input as any).instanceId,\n }\n return replayLog.record(event)\n }\n\n // list.item scope: in-flight gating by RowID (avoid writing to the wrong row under insert/remove/reorder).\n if (listItem) {\n const store = internals.traits.rowIdStore as RowId.RowIdStore | undefined\n if (!store) {\n return Effect.void\n }\n\n const listPath = listItem.listPath\n const itemPath = listItem.itemPath\n if (!itemPath) {\n // Never write the snapshot back to the whole item (it would overwrite business values).\n return Effect.void\n }\n\n const concurrency = (entry.meta as any).concurrency as 'switch' | 'exhaust-trailing' | undefined\n const mode = concurrency ?? 'switch'\n\n const inFlight = new Map<\n RowId.RowId,\n {\n readonly gen: number\n readonly fiber: Fiber.RuntimeFiber<void, never>\n readonly keyHash: string\n }\n >()\n const trailing = new Map<RowId.RowId, { readonly key: unknown; readonly keyHash: string }>()\n let gen = 0\n\n // When a row is removed: clear trailing/inFlight references to avoid wrong attribution or memory leaks.\n store.onRemoved(listPath, (rowId) => {\n trailing.delete(rowId)\n inFlight.delete(rowId)\n })\n\n const setSnapshotForRowInTxn = (\n rowId: RowId.RowId,\n next: unknown,\n reason: PatchReason,\n stepId: string,\n ): Effect.Effect<string | undefined, never, any> =>\n Effect.gen(function* () {\n let wrotePath: string | undefined\n yield* bound.state.mutate((draft) => {\n const index = store.getIndex(listPath, rowId)\n if (index === undefined) return\n const concretePath = RowId.toListItemValuePath(listPath, index, itemPath)\n const prev = RowId.getAtPath(draft, concretePath)\n if (Object.is(prev, next)) return\n wrotePath = concretePath\n RowId.setAtPathMutating(draft, concretePath, next)\n recordTraitPatch(bound, concretePath, reason, prev, next, step.debugInfo?.graphNodeId)\n })\n return wrotePath\n })\n\n const writebackIfCurrentKeyHashForRow = (\n rowId: RowId.RowId,\n keyHash: string,\n next: unknown,\n reason: PatchReason,\n stepId: string,\n phase?: ReplayLog.ResourceSnapshotPhase,\n ): Effect.Effect<string | undefined, never, any> =>\n Effect.gen(function* () {\n let wrotePath: string | undefined\n yield* bound.state.mutate((draft) => {\n const index = store.getIndex(listPath, rowId)\n if (index === undefined) return\n const concretePath = RowId.toListItemValuePath(listPath, index, itemPath)\n\n const current = RowId.getAtPath(draft, concretePath)\n const currentKeyHash = current && typeof current === 'object' ? (current as any).keyHash : undefined\n if (currentKeyHash !== keyHash) return\n\n const prev = current\n if (Object.is(prev, next)) return\n\n wrotePath = concretePath\n RowId.setAtPathMutating(draft, concretePath, next)\n if (phase) {\n const { moduleId, instanceId } = getBoundScope(bound)\n recordReplayEvent(bound, {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: concretePath,\n keyHash,\n concurrency: mode,\n phase,\n snapshot: next,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n })\n }\n recordTraitPatch(bound, concretePath, reason, prev, next, step.debugInfo?.graphNodeId)\n })\n return wrotePath\n })\n\n const startFetch = (\n rowId: RowId.RowId,\n key: unknown,\n keyHash: string,\n replayMode: 'live' | 'replay',\n replayLog: ReplayLog.ReplayLogService | undefined,\n ): Effect.Effect<void, never, any> =>\n Effect.gen(function* () {\n const { moduleId, instanceId } = getBoundScope(bound)\n\n const indexForLog = store.getIndex(listPath, rowId)\n const logFieldPath =\n indexForLog === undefined ? undefined : RowId.toListItemValuePath(listPath, indexForLog, itemPath)\n\n let loadingSnapshot: unknown = Snapshot.loading({ keyHash })\n if (replayMode === 'replay' && replayLog && logFieldPath) {\n const replayLoading = yield* replayLog.consumeNextResourceSnapshot({\n resourceId,\n fieldPath: logFieldPath,\n keyHash,\n phase: 'loading',\n })\n if (replayLoading) {\n loadingSnapshot = replayLoading.snapshot\n }\n }\n const wroteLoadingPath = yield* setSnapshotForRowInTxn(\n rowId,\n loadingSnapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:loading`,\n )\n if (wroteLoadingPath) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: wroteLoadingPath,\n keyHash,\n concurrency: mode,\n phase: 'loading',\n snapshot: loadingSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n\n const io = Effect.gen(function* () {\n if (replayMode === 'replay' && replayLog) {\n // Let loading commit become visible first, then replay the settled phase (preserve the async-resource timeline shape).\n yield* Effect.yieldNow()\n const consumePath = wroteLoadingPath ?? logFieldPath\n if (!consumePath) return yield* Effect.void\n\n const replayed = yield* replayLog.consumeNextResourceSnapshot({\n resourceId,\n fieldPath: consumePath,\n keyHash,\n })\n if (!replayed) return yield* Effect.void\n\n if (replayed.phase === 'success') {\n yield* writebackIfCurrentKeyHashForRow(\n rowId,\n keyHash,\n replayed.snapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:success`,\n 'success',\n )\n } else if (replayed.phase === 'error') {\n yield* writebackIfCurrentKeyHashForRow(\n rowId,\n keyHash,\n replayed.snapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:error`,\n 'error',\n )\n }\n\n return yield* Effect.void\n }\n\n const stack = yield* getMiddlewareStack()\n\n const registryOpt = yield* Effect.serviceOption(ResourceInternal.ResourceRegistryTag)\n const registry = Option.isSome(registryOpt) ? registryOpt.value : undefined\n const spec = registry?.specs.get(resourceId)\n\n if (!spec) {\n return yield* Effect.void\n }\n\n const loadEffect = (spec.load as any)(key) as Effect.Effect<any, any, any>\n\n const meta: any = {\n moduleId,\n instanceId,\n fieldPath,\n resourceId,\n key,\n keyHash,\n rowId,\n traitNodeId: step.debugInfo?.graphNodeId,\n stepId: step.id,\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 seqKey = instanceId ?? 'global'\n meta.opSeq = sessionOpt.value.local.nextSeq('opSeq', seqKey)\n }\n }\n\n const op = EffectOp.make<any, any, any>({\n kind: 'service',\n name: resourceId,\n effect: loadEffect,\n meta,\n })\n\n const exit = yield* Effect.exit(EffectOp.run(op, stack))\n\n if (exit._tag === 'Success') {\n const successSnapshot = Snapshot.success({ keyHash, data: exit.value })\n const wroteSuccessPath = yield* writebackIfCurrentKeyHashForRow(\n rowId,\n keyHash,\n successSnapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:success`,\n 'success',\n )\n if (wroteSuccessPath) {\n yield* recordSnapshot(replayMode, replayLog, {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: wroteSuccessPath,\n keyHash,\n concurrency: mode,\n phase: 'success',\n snapshot: successSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n })\n }\n } else {\n const errorSnapshot = Snapshot.error({ keyHash, error: exit.cause })\n const wroteErrorPath = yield* writebackIfCurrentKeyHashForRow(\n rowId,\n keyHash,\n errorSnapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:error`,\n 'error',\n )\n if (wroteErrorPath) {\n yield* recordSnapshot(replayMode, replayLog, {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: wroteErrorPath,\n keyHash,\n concurrency: mode,\n phase: 'error',\n snapshot: errorSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n })\n }\n }\n }).pipe(Effect.catchAllCause(() => Effect.void))\n\n // list.item: IO fibers must detach from the sync-transaction FiberRef; otherwise they'd be misclassified as \"in txn window\"\n // and block subsequent writeback entrypoints.\n const fiber = yield* Effect.forkScoped(Effect.locally(TaskRunner.inSyncTransactionFiber, false)(io))\n const myGen = (gen += 1)\n inFlight.set(rowId, { gen: myGen, fiber, keyHash })\n\n yield* Effect.forkScoped(\n Effect.locally(\n TaskRunner.inSyncTransactionFiber,\n false,\n )(\n Fiber.await(fiber).pipe(\n Effect.zipRight(\n Effect.sync(() => {\n const current = inFlight.get(rowId)\n if (current && current.gen === myGen) {\n inFlight.delete(rowId)\n }\n }),\n ),\n Effect.zipRight(\n mode === 'exhaust-trailing'\n ? Effect.gen(function* () {\n const next = trailing.get(rowId)\n trailing.delete(rowId)\n if (next) {\n yield* startFetch(rowId, next.key, next.keyHash, replayMode, replayLog)\n }\n })\n : Effect.void,\n ),\n Effect.catchAllCause(() => Effect.void),\n ),\n ),\n )\n })\n\n register(fieldPath, (state: any) =>\n Effect.gen(function* () {\n const { moduleId, instanceId } = getBoundScope(bound)\n const replayModeOpt = yield* Effect.serviceOption(ReplayModeConfigTag)\n const replayMode = Option.isSome(replayModeOpt) ? replayModeOpt.value.mode : 'live'\n const replayLogOpt = yield* Effect.serviceOption(ReplayLog.ReplayLog)\n const replayLog = Option.isSome(replayLogOpt) ? replayLogOpt.value : undefined\n const force = yield* FiberRef.get(TaskRunner.forceSourceRefresh)\n\n const listValue = RowId.getAtPath(state, listPath)\n const items: ReadonlyArray<unknown> = Array.isArray(listValue) ? listValue : []\n const ids = store.ensureList(listPath, items)\n\n // dev-mode: trace deps once for the first row (diagnostics only; does not affect execution semantics).\n const traceKey = `${instanceId ?? 'unknown'}::source::${fieldPath}`\n if (isDevEnv() && (yield* onceInRunSession(`deps_trace_settled:${traceKey}`))) {\n try {\n const sample = items[0]\n if (sample !== undefined) {\n const traced = DepsTrace.trace((s) => (entry.meta as any).key(s), sample as any)\n const prefixedReads = traced.reads.map((r) => (r ? `${listPath}[].${r}` : `${listPath}[]`))\n const diff = DepsTrace.diffDeps(((entry.meta as any).deps ?? []) as ReadonlyArray<string>, prefixedReads)\n if (diff) {\n yield* emitDepsMismatch({\n moduleId,\n instanceId,\n kind: 'source',\n fieldPath,\n diff,\n })\n }\n }\n } catch {\n // tracing failure should never break refresh flow\n }\n }\n\n for (let index = 0; index < items.length; index++) {\n const rowId = ids[index]\n if (!rowId) continue\n\n const concretePath = RowId.toListItemValuePath(listPath, index, itemPath)\n const prevSnapshot = RowId.getAtPath(state, concretePath) as any\n\n let key: unknown\n try {\n key = (entry.meta as any).key(items[index])\n } catch {\n key = undefined\n }\n\n const current = inFlight.get(rowId)\n\n if (key === undefined) {\n trailing.delete(rowId)\n inFlight.delete(rowId)\n\n // If it's already clean idle, avoid redundant writeback (prevents meaningless patches and UI jitter).\n if (\n prevSnapshot &&\n typeof prevSnapshot === 'object' &&\n prevSnapshot.status === 'idle' &&\n prevSnapshot.data === undefined &&\n prevSnapshot.error === undefined\n ) {\n continue\n }\n\n const idleSnapshot = Snapshot.idle()\n const wroteIdlePath = yield* setSnapshotForRowInTxn(\n rowId,\n idleSnapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:idle`,\n )\n if (wroteIdlePath) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: wroteIdlePath,\n keyHash: undefined,\n concurrency: mode,\n phase: 'idle',\n snapshot: idleSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n continue\n }\n\n const h = hashKey(key)\n\n // keyHash unchanged: avoid redundant refresh while keeping in-flight.\n if (!force && current && current.keyHash === h) {\n continue\n }\n\n // Not in-flight: if snapshot.keyHash already matches, treat it as already up-to-date (avoid full refresh and row jitter).\n const prevKeyHash =\n prevSnapshot && typeof prevSnapshot === 'object' ? (prevSnapshot as any).keyHash : undefined\n if (!force && !current && prevKeyHash === h) {\n continue\n }\n\n if (mode === 'exhaust-trailing' && current) {\n trailing.set(rowId, { key, keyHash: h })\n const loadingSnapshot = Snapshot.loading({ keyHash: h })\n const wroteLoadingPath = yield* setSnapshotForRowInTxn(\n rowId,\n loadingSnapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:loading`,\n )\n if (wroteLoadingPath) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: wroteLoadingPath,\n keyHash: h,\n concurrency: mode,\n phase: 'loading',\n snapshot: loadingSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n continue\n }\n\n if (mode === 'switch' && current) {\n // Do not rely on cancellation correctness: stale writebacks are dropped by the keyHash gate.\n trailing.delete(rowId)\n inFlight.delete(rowId)\n }\n\n yield* startFetch(rowId, key, h, replayMode, replayLog)\n }\n }),\n )\n\n return Effect.void\n }\n\n // in-flight state (per field)\n let inFlight:\n | {\n readonly gen: number\n readonly fiber: Fiber.RuntimeFiber<void, never>\n readonly keyHash: string\n }\n | undefined\n let gen = 0\n let trailing: { readonly key: unknown; readonly keyHash: string } | undefined\n\n const concurrency = (entry.meta as any).concurrency as 'switch' | 'exhaust-trailing' | undefined\n const mode = concurrency ?? 'switch'\n\n const startFetch = (\n key: unknown,\n keyHash: string,\n replayMode: 'live' | 'replay',\n replayLog: ReplayLog.ReplayLogService | undefined,\n ): Effect.Effect<void, never, any> =>\n Effect.gen(function* () {\n const { moduleId, instanceId } = getBoundScope(bound)\n\n // 1) pending: synchronously write a loading snapshot (within the current transaction window).\n let loadingSnapshot: unknown = Snapshot.loading({ keyHash })\n if (replayMode === 'replay' && replayLog) {\n const replayLoading = yield* replayLog.consumeNextResourceSnapshot({\n resourceId,\n fieldPath,\n keyHash,\n phase: 'loading',\n })\n if (replayLoading) {\n loadingSnapshot = replayLoading.snapshot\n }\n }\n const wroteLoading = yield* setSnapshotInTxn(\n bound,\n fieldPath,\n loadingSnapshot,\n 'source-refresh',\n `source:${fieldPath}:loading`,\n step.debugInfo?.graphNodeId,\n )\n if (wroteLoading) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash,\n concurrency: mode,\n phase: 'loading',\n snapshot: loadingSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n\n // 2) IO: run in a background fiber (avoid blocking the current transaction).\n const io = Effect.gen(function* () {\n if (replayMode === 'replay' && replayLog) {\n // Let loading commit become visible first, then replay the settled phase (preserve the async-resource timeline shape).\n yield* Effect.yieldNow()\n const replayed = yield* replayLog.consumeNextResourceSnapshot({\n resourceId,\n fieldPath,\n keyHash,\n })\n if (!replayed) return yield* Effect.void\n\n if (replayed.phase === 'success') {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash,\n concurrency: mode,\n phase: 'success',\n snapshot: replayed.snapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n yield* writebackIfCurrentKeyHash(\n bound,\n fieldPath,\n keyHash,\n replayed.snapshot,\n 'source-refresh',\n `source:${fieldPath}:success`,\n step.debugInfo?.graphNodeId,\n event,\n )\n } else if (replayed.phase === 'error') {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash,\n concurrency: mode,\n phase: 'error',\n snapshot: replayed.snapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n yield* writebackIfCurrentKeyHash(\n bound,\n fieldPath,\n keyHash,\n replayed.snapshot,\n 'source-refresh',\n `source:${fieldPath}:error`,\n step.debugInfo?.graphNodeId,\n event,\n )\n }\n\n return yield* Effect.void\n }\n\n const stack = yield* getMiddlewareStack()\n\n const registryOpt = yield* Effect.serviceOption(ResourceInternal.ResourceRegistryTag)\n const registry = Option.isSome(registryOpt) ? registryOpt.value : undefined\n const spec = registry?.specs.get(resourceId)\n\n if (!spec) {\n return yield* Effect.void\n }\n\n const loadEffect = (spec.load as any)(key) as Effect.Effect<any, any, any>\n\n const meta: any = {\n moduleId,\n instanceId,\n fieldPath,\n resourceId,\n key,\n keyHash,\n traitNodeId: step.debugInfo?.graphNodeId,\n stepId: step.id,\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 seqKey = instanceId ?? 'global'\n meta.opSeq = sessionOpt.value.local.nextSeq('opSeq', seqKey)\n }\n }\n\n const op = EffectOp.make<any, any, any>({\n kind: 'trait-source',\n name: resourceId,\n effect: loadEffect,\n meta,\n })\n\n const exit = yield* Effect.exit(EffectOp.run(op, stack))\n\n // 3) writeback: use a keyHash gate to prevent stale results from writing back onto a new key.\n if (exit._tag === 'Success') {\n const successSnapshot = Snapshot.success({ keyHash, data: exit.value })\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash,\n concurrency: mode,\n phase: 'success',\n snapshot: successSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n const wroteSuccess = yield* writebackIfCurrentKeyHash(\n bound,\n fieldPath,\n keyHash,\n successSnapshot,\n 'source-refresh',\n `source:${fieldPath}:success`,\n step.debugInfo?.graphNodeId,\n event,\n )\n if (wroteSuccess) {\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n } else {\n const errorSnapshot = Snapshot.error({ keyHash, error: exit.cause })\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash,\n concurrency: mode,\n phase: 'error',\n snapshot: errorSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n const wroteError = yield* writebackIfCurrentKeyHash(\n bound,\n fieldPath,\n keyHash,\n errorSnapshot,\n 'source-refresh',\n `source:${fieldPath}:error`,\n step.debugInfo?.graphNodeId,\n event,\n )\n if (wroteError) {\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n }\n }).pipe(Effect.catchAllCause(() => Effect.void))\n\n // Do not wait for IO completion: forkScoped into the runtime scope so unmount will interrupt automatically.\n const fiber = yield* Effect.forkScoped(Effect.locally(TaskRunner.inSyncTransactionFiber, false)(io))\n const myGen = (gen += 1)\n inFlight = { gen: myGen, fiber, keyHash }\n\n // After in-flight completes, clean up; in exhaust-trailing mode, run one trailing fetch if present.\n yield* Effect.forkScoped(\n Effect.locally(\n TaskRunner.inSyncTransactionFiber,\n false,\n )(\n Fiber.await(fiber).pipe(\n Effect.zipRight(\n Effect.sync(() => {\n if (inFlight && inFlight.gen === myGen) {\n inFlight = undefined\n }\n }),\n ),\n Effect.zipRight(\n mode === 'exhaust-trailing'\n ? Effect.gen(function* () {\n const next = trailing\n trailing = undefined\n if (next) {\n yield* startFetch(next.key, next.keyHash, replayMode, replayLog)\n }\n })\n : Effect.void,\n ),\n Effect.catchAllCause(() => Effect.void),\n ),\n ),\n )\n })\n\n register(fieldPath, (state: any) =>\n Effect.gen(function* () {\n const { moduleId, instanceId } = getBoundScope(bound)\n const replayModeOpt = yield* Effect.serviceOption(ReplayModeConfigTag)\n const replayMode = Option.isSome(replayModeOpt) ? replayModeOpt.value.mode : 'live'\n const replayLogOpt = yield* Effect.serviceOption(ReplayLog.ReplayLog)\n const replayLog = Option.isSome(replayLogOpt) ? replayLogOpt.value : undefined\n const force = yield* FiberRef.get(TaskRunner.forceSourceRefresh)\n\n let key: unknown\n try {\n key = (entry.meta as any).key(state)\n } catch {\n key = undefined\n }\n\n // dev-mode: detect mismatch between actual reads in keySelector and declared deps (diagnostics only; does not affect execution semantics).\n const traceKey = `${instanceId ?? 'unknown'}::source::${fieldPath}`\n if (isDevEnv() && (yield* onceInRunSession(`deps_trace_settled:${traceKey}`))) {\n try {\n const traced = DepsTrace.trace((s) => (entry.meta as any).key(s), state)\n const diff = DepsTrace.diffDeps(((entry.meta as any).deps ?? []) as ReadonlyArray<string>, traced.reads)\n if (diff) {\n yield* emitDepsMismatch({\n moduleId,\n instanceId,\n kind: 'source',\n fieldPath,\n diff,\n })\n }\n } catch {\n // tracing failure should never break refresh flow\n }\n }\n\n // Key becomes empty: synchronously clear to idle (and interrupt in-flight).\n if (key === undefined) {\n if (inFlight) {\n yield* Fiber.interruptFork(inFlight.fiber)\n inFlight = undefined\n }\n trailing = undefined\n\n const idleSnapshot = Snapshot.idle()\n const wroteIdle = yield* setSnapshotInTxn(\n bound,\n fieldPath,\n idleSnapshot,\n 'source-refresh',\n `source:${fieldPath}:idle`,\n step.debugInfo?.graphNodeId,\n )\n if (wroteIdle) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash: undefined,\n concurrency: mode,\n phase: 'idle',\n snapshot: idleSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n return\n }\n\n const h = hashKey(key)\n\n // Default semantics: when a non-idle snapshot already exists for the same keyHash, refresh should be a no-op when possible\n // (avoid duplicate IO/writeback). Explicit refresh/invalidate can bypass via force.\n if (!force) {\n if (inFlight && inFlight.keyHash === h) {\n return\n }\n\n const currentSnapshot = RowId.getAtPath(state, fieldPath) as any\n const currentKeyHash =\n currentSnapshot && typeof currentSnapshot === 'object' ? (currentSnapshot as any).keyHash : undefined\n const currentStatus =\n currentSnapshot && typeof currentSnapshot === 'object' ? (currentSnapshot as any).status : undefined\n if (currentStatus && currentStatus !== 'idle' && currentKeyHash === h) {\n return\n }\n }\n\n if (mode === 'exhaust-trailing' && inFlight) {\n // Busy: record trailing and update loading immediately; stale in-flight writebacks will be blocked by the keyHash gate.\n trailing = { key, keyHash: h }\n const loadingSnapshot = Snapshot.loading({ keyHash: h })\n const wroteLoading = yield* setSnapshotInTxn(\n bound,\n fieldPath,\n loadingSnapshot,\n 'source-refresh',\n `source:${fieldPath}:loading`,\n step.debugInfo?.graphNodeId,\n )\n if (wroteLoading) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash: h,\n concurrency: mode,\n phase: 'loading',\n snapshot: loadingSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n return\n }\n\n if (mode === 'switch' && inFlight) {\n yield* Fiber.interruptFork(inFlight.fiber)\n inFlight = undefined\n trailing = undefined\n }\n\n // start fetch (pending tx + fork IO)\n yield* startFetch(key, h, replayMode, replayLog)\n }),\n )\n\n return Effect.void\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","// 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 { 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","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 { Context, Layer } from 'effect'\nimport { isDevEnv } from './runtime/core/env.js'\n\nexport interface ResourceSpec<Key, Out, Err, Env> {\n readonly id: string\n readonly keySchema: import('effect').Schema.Schema<Key, any>\n readonly load: (key: Key) => import('effect').Effect.Effect<Out, Err, Env>\n readonly meta?: {\n readonly cacheGroup?: string\n readonly description?: string\n readonly [k: string]: unknown\n }\n}\n\nexport type AnyResourceSpec = ResourceSpec<any, any, any, any>\n\nexport type ResourceStatus = 'idle' | 'loading' | 'success' | 'error'\n\nexport interface ResourceSnapshot<Data = unknown, Err = unknown> {\n readonly status: ResourceStatus\n readonly keyHash?: string\n readonly data?: Data\n readonly error?: Err\n}\n\nconst stableStringify = (value: unknown): string => {\n const seen = new WeakSet<object>()\n const encode = (input: unknown): unknown => {\n if (input === null) return null\n if (typeof input === 'string' || typeof input === 'number' || typeof input === 'boolean') {\n return input\n }\n if (typeof input === 'bigint') return input.toString()\n if (typeof input === 'undefined') return '__undefined__'\n if (typeof input === 'symbol') return `__symbol__:${String(input)}`\n if (typeof input === 'function') return '__function__'\n\n if (Array.isArray(input)) {\n return input.map((v) => encode(v))\n }\n if (input instanceof Date) {\n return `__date__:${input.toISOString()}`\n }\n if (input instanceof Error) {\n return {\n _tag: 'Error',\n name: input.name,\n message: input.message,\n }\n }\n if (input && typeof input === 'object') {\n const obj = input as object\n if (seen.has(obj)) return '__cycle__'\n seen.add(obj)\n\n const record = input as Record<string, unknown>\n const keys = Object.keys(record).sort()\n const out: Record<string, unknown> = {}\n for (const k of keys) {\n out[k] = encode(record[k])\n }\n return out\n }\n return String(input)\n }\n\n try {\n return JSON.stringify(encode(value))\n } catch {\n return String(value)\n }\n}\n\nexport const keyHash = (key: unknown): string => stableStringify(key)\n\nexport const Snapshot = {\n idle: <Data = never, Err = never>(): ResourceSnapshot<Data, Err> => ({\n status: 'idle',\n keyHash: undefined,\n data: undefined,\n error: undefined,\n }),\n loading: <Data = never, Err = never>(params: { readonly keyHash: string }): ResourceSnapshot<Data, Err> => ({\n status: 'loading',\n keyHash: params.keyHash,\n data: undefined,\n error: undefined,\n }),\n success: <Data>(params: { readonly keyHash: string; readonly data: Data }): ResourceSnapshot<Data, never> => ({\n status: 'success',\n keyHash: params.keyHash,\n data: params.data,\n error: undefined,\n }),\n error: <Err>(params: { readonly keyHash: string; readonly error: Err }): ResourceSnapshot<never, Err> => ({\n status: 'error',\n keyHash: params.keyHash,\n data: undefined,\n error: params.error,\n }),\n} as const\n\nexport interface ResourceRegistry {\n readonly specs: ReadonlyMap<string, AnyResourceSpec>\n}\n\nexport class ResourceRegistryTag extends Context.Tag('@logixjs/core/ResourceRegistry')<\n ResourceRegistryTag,\n ResourceRegistry\n>() {}\n\nexport const internal = {\n ResourceRegistryTag,\n}\n\nexport type Spec<Key, Out, Err, Env> = ResourceSpec<Key, Out, Err, Env>\n\nexport const make = <Key, Out, Err, Env>(spec: ResourceSpec<Key, Out, Err, Env>): ResourceSpec<Key, Out, Err, Env> =>\n spec\n\nexport const layer = (specs: ReadonlyArray<AnyResourceSpec>): Layer.Layer<ResourceRegistryTag, never, never> =>\n Layer.succeed(\n ResourceRegistryTag,\n (() => {\n const map = new Map<string, AnyResourceSpec>()\n for (const spec of specs) {\n if (isDevEnv() && map.has(spec.id) && map.get(spec.id) !== spec) {\n throw new Error(`[Resource.layer] Duplicate resource id \"${spec.id}\" detected in the same runtime scope`)\n }\n map.set(spec.id, spec)\n }\n return { specs: map }\n })(),\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","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","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 { Context, Effect, Layer } from 'effect'\n\nexport type ResourceSnapshotPhase = 'idle' | 'loading' | 'success' | 'error'\n\nexport type ReplayLogEvent =\n | {\n readonly _tag: 'ResourceSnapshot'\n readonly resourceId: string\n readonly fieldPath: string\n readonly keyHash?: string\n /**\n * Optional: source concurrency policy (e.g. \"switch\" / \"exhaust-trailing\").\n * - Must remain slim & serializable.\n * - Used by Devtools/replay to explain why old results are dropped / why trailing happens.\n */\n readonly concurrency?: string\n readonly phase: ResourceSnapshotPhase\n readonly snapshot: unknown\n readonly timestamp: number\n readonly moduleId?: string\n readonly instanceId?: string\n }\n | {\n readonly _tag: 'InvalidateRequest'\n readonly timestamp: number\n readonly moduleId?: string\n readonly instanceId?: string\n readonly kind: 'resource' | 'query'\n readonly target: string\n readonly meta?: unknown\n }\n\nexport type ResourceSnapshotEvent = Extract<ReplayLogEvent, { readonly _tag: 'ResourceSnapshot' }>\n\nexport interface ReplayLogService {\n readonly record: (event: ReplayLogEvent) => Effect.Effect<void>\n readonly snapshot: Effect.Effect<ReadonlyArray<ReplayLogEvent>>\n readonly resetCursor: Effect.Effect<void>\n readonly consumeNext: (predicate: (event: ReplayLogEvent) => boolean) => Effect.Effect<ReplayLogEvent | undefined>\n readonly consumeNextResourceSnapshot: (params: {\n readonly resourceId: string\n readonly fieldPath: string\n readonly keyHash?: string\n readonly phase?: ResourceSnapshotPhase\n }) => Effect.Effect<ResourceSnapshotEvent | undefined>\n}\n\nexport class ReplayLog extends Context.Tag('@logixjs/core/ReplayLog')<ReplayLog, ReplayLogService>() {}\n\nexport const make = (initial?: ReadonlyArray<ReplayLogEvent>): ReplayLogService => {\n const events: Array<ReplayLogEvent> = initial ? Array.from(initial) : []\n let cursor = 0\n\n const consumeNext = (predicate: (event: ReplayLogEvent) => boolean): Effect.Effect<ReplayLogEvent | undefined> =>\n Effect.sync(() => {\n for (let i = cursor; i < events.length; i++) {\n const event = events[i]\n if (!predicate(event)) continue\n cursor = i + 1\n return event\n }\n return undefined\n })\n\n const consumeNextResourceSnapshot = (params: {\n readonly resourceId: string\n readonly fieldPath: string\n readonly keyHash?: string\n readonly phase?: ResourceSnapshotPhase\n }): Effect.Effect<ResourceSnapshotEvent | undefined> =>\n consumeNext((event): event is ResourceSnapshotEvent => {\n if (event._tag !== 'ResourceSnapshot') return false\n if (event.resourceId !== params.resourceId) return false\n if (event.fieldPath !== params.fieldPath) return false\n if (params.keyHash !== undefined && event.keyHash !== params.keyHash) {\n return false\n }\n if (params.phase !== undefined && event.phase !== params.phase) {\n return false\n }\n return true\n }).pipe(Effect.map((event) => event as ResourceSnapshotEvent | undefined))\n\n return {\n record: (event) => Effect.sync(() => events.push(event)),\n snapshot: Effect.sync(() => events.slice()),\n resetCursor: Effect.sync(() => {\n cursor = 0\n }),\n consumeNext,\n consumeNextResourceSnapshot,\n }\n}\n\nexport const layer = (initial?: ReadonlyArray<ReplayLogEvent>): Layer.Layer<ReplayLog, never, never> =>\n Layer.succeed(ReplayLog, make(initial))\n\nexport const record = (event: ReplayLogEvent): Effect.Effect<void, never, ReplayLog> =>\n Effect.gen(function* () {\n const log = yield* ReplayLog\n yield* log.record(event)\n })\n\nexport const snapshot: Effect.Effect<ReadonlyArray<ReplayLogEvent>, never, ReplayLog> = Effect.gen(function* () {\n const log = yield* ReplayLog\n return yield* log.snapshot\n})\n\nexport const resetCursor: Effect.Effect<void, never, ReplayLog> = Effect.gen(function* () {\n const log = yield* ReplayLog\n yield* log.resetCursor\n})\n\nexport const consumeNextResourceSnapshot = (params: {\n readonly resourceId: string\n readonly fieldPath: string\n readonly keyHash?: string\n readonly phase?: ResourceSnapshotPhase\n}): Effect.Effect<ResourceSnapshotEvent | undefined, never, ReplayLog> =>\n Effect.gen(function* () {\n const log = yield* ReplayLog\n return yield* log.consumeNextResourceSnapshot(params)\n })\n","export interface DepsTraceResult<T> {\n readonly value: T\n readonly reads: ReadonlyArray<string>\n}\n\nexport interface DepsDiff {\n readonly reads: ReadonlyArray<string>\n readonly declared: ReadonlyArray<string>\n readonly missing: ReadonlyArray<string>\n readonly unused: ReadonlyArray<string>\n}\n\nconst isTraceableObject = (value: unknown): value is object => {\n if (!value || typeof value !== 'object') return false\n if (Array.isArray(value)) return true\n if (value instanceof Date) return false\n if (value instanceof RegExp) return false\n if (value instanceof Error) return false\n if (value instanceof Map) return false\n if (value instanceof Set) return false\n if (value instanceof WeakMap) return false\n if (value instanceof WeakSet) return false\n return true\n}\n\nconst shouldIgnoreKey = (key: string): boolean => key === '__proto__' || key === 'prototype' || key === 'constructor'\n\nconst normalizeReads = (reads: ReadonlySet<string>): ReadonlyArray<string> => {\n const all = Array.from(reads).filter((p) => typeof p === 'string' && p.length > 0)\n all.sort()\n\n // Drop strict prefix paths (e.g. if both profile and profile.id are read, keep only the more specific profile.id).\n const isPrefix = (prefix: string, full: string): boolean => full !== prefix && full.startsWith(prefix + '.')\n\n const pruned: Array<string> = []\n for (const p of all) {\n let hasMoreSpecific = false\n for (const other of all) {\n if (isPrefix(p, other)) {\n hasMoreSpecific = true\n break\n }\n }\n if (!hasMoreSpecific) {\n pruned.push(p)\n }\n }\n\n pruned.sort()\n return pruned\n}\n\nconst covers = (declared: string, read: string): boolean => declared === read || read.startsWith(declared + '.')\n\nexport const diffDeps = (declared: ReadonlyArray<string>, reads: ReadonlyArray<string>): DepsDiff | undefined => {\n const declaredList = Array.from(new Set(declared)).filter((p) => typeof p === 'string' && p.length > 0)\n declaredList.sort()\n const readList = Array.from(new Set(reads)).filter((p) => typeof p === 'string' && p.length > 0)\n readList.sort()\n\n const missing = readList.filter((r) => declaredList.every((d) => !covers(d, r)))\n const unused = declaredList.filter((d) => readList.every((r) => !covers(d, r)))\n\n if (missing.length === 0 && unused.length === 0) return undefined\n\n return {\n reads: readList,\n declared: declaredList,\n missing,\n unused,\n }\n}\n\nexport const trace = <T>(fn: (state: any) => T, state: unknown): DepsTraceResult<T> => {\n if (!isTraceableObject(state)) {\n return { value: fn(state as any), reads: [] }\n }\n\n const reads = new Set<string>()\n\n // per-trace caches to preserve reference identity within the traced call.\n const proxyCache = new WeakMap<object, Map<string, any>>()\n const proxyToTarget = new WeakMap<object, object>()\n\n const wrap = (value: unknown, path: string): unknown => {\n if (!isTraceableObject(value)) return value\n return getProxy(value as any, path)\n }\n\n const unwrap = <V>(value: V): V => {\n if (value && (typeof value === 'object' || typeof value === 'function')) {\n const target = proxyToTarget.get(value as any)\n if (target) return target as any as V\n }\n return value\n }\n\n const getProxy = (target: object, basePath: string): any => {\n let byPath = proxyCache.get(target)\n if (!byPath) {\n byPath = new Map()\n proxyCache.set(target, byPath)\n }\n\n const cached = byPath.get(basePath)\n if (cached) return cached\n\n const record = (path: string) => {\n if (path) reads.add(path)\n }\n\n const proxy = new Proxy(target as any, {\n get: (t, prop, receiver) => {\n if (typeof prop === 'symbol') {\n return Reflect.get(t, prop, receiver)\n }\n const key = String(prop)\n if (shouldIgnoreKey(key)) {\n return Reflect.get(t, prop, receiver)\n }\n\n const nextPath = basePath ? `${basePath}.${key}` : key\n record(nextPath)\n\n const value = Reflect.get(t, prop, receiver) as unknown\n return wrap(value, nextPath)\n },\n has: (t, prop) => {\n if (typeof prop === 'symbol') return Reflect.has(t, prop)\n const key = String(prop)\n if (!shouldIgnoreKey(key)) {\n const nextPath = basePath ? `${basePath}.${key}` : key\n record(nextPath)\n }\n return Reflect.has(t, prop)\n },\n ownKeys: (t) => {\n if (basePath) record(basePath)\n return Reflect.ownKeys(t)\n },\n getOwnPropertyDescriptor: (t, prop) => {\n if (typeof prop === 'symbol') {\n return Reflect.getOwnPropertyDescriptor(t, prop)\n }\n const key = String(prop)\n if (!shouldIgnoreKey(key)) {\n const nextPath = basePath ? `${basePath}.${key}` : key\n record(nextPath)\n }\n return Reflect.getOwnPropertyDescriptor(t, prop)\n },\n set: () => {\n throw new Error(\n '[deps-trace] Attempted to mutate state during deps tracing (state is readonly in dev-mode diagnostics).',\n )\n },\n defineProperty: () => {\n throw new Error(\n '[deps-trace] Attempted to define property on state during deps tracing (state is readonly in dev-mode diagnostics).',\n )\n },\n deleteProperty: () => {\n throw new Error(\n '[deps-trace] Attempted to delete property on state during deps tracing (state is readonly in dev-mode diagnostics).',\n )\n },\n })\n\n byPath.set(basePath, proxy)\n proxyToTarget.set(proxy, target)\n return proxy\n }\n\n const root = getProxy(state as any, '')\n const value = unwrap(fn(root))\n\n return {\n value,\n reads: normalizeReads(reads),\n }\n}\n","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":["build","exportStaticIr","install","record","from","node","record","normalized","node","stableStringify","record","node","stableStringify","list","from","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","stableStringify","record","import_effect","import_effect","import_effect","import_effect","value","record","from","keyHash","concurrency","mode","inFlight","trailing","gen","keyHash","startFetch","list","normalizeFieldPath","from","node","base","stableStringify","build","install","exportStaticIr"]}
|
|
1
|
+
{"version":3,"sources":["../src/StateTrait.ts","../src/internal/field-path.ts","../src/internal/state-trait/rowid.ts","../src/internal/state-trait/build.ts","../src/internal/state-trait/meta.ts","../src/internal/state-trait/model.ts","../src/internal/digest.ts","../src/internal/state-trait/converge-ir.ts","../src/internal/state-trait/install.ts","../src/internal/runtime/core/env.ts","../src/internal/runtime/core/HostScheduler.ts","../src/internal/runtime/core/RuntimeStore.ts","../src/internal/runtime/core/TickScheduler.ts","../src/internal/runtime/core/DebugSink.record.ts","../src/internal/observability/jsonValue.ts","../src/internal/runtime/core/errorSummary.ts","../src/internal/runtime/core/EffectOpCore.ts","../src/internal/runtime/core/TaskRunner.ts","../src/internal/runtime/core/ModeRunner.ts","../src/internal/runtime/core/LatestFiberSlot.ts","../src/internal/runtime/core/DeclarativeLinkRuntime.ts","../src/internal/runtime/core/runtimeInternalsAccessor.ts","../src/internal/state-trait/source.impl.ts","../src/internal/effect-op.ts","../src/internal/observability/runSession.ts","../src/internal/resource.ts","../src/internal/runtime/core/ReplayLog.ts","../src/internal/state-trait/deps-trace.ts","../src/internal/state-trait/external-store.ts","../src/internal/external-store-descriptor.ts","../src/internal/state-trait/meta-diagnostics.ts","../src/internal/state-trait/converge-diagnostics.ts","../src/internal/state-trait/ir.ts"],"sourcesContent":["// StateTrait namespace module (@logixjs/core/StateTrait):\n// - Provides a DSL for trait specs (from/node/list/computed/source/link).\n// - build: normalizes the spec and produces Program/Graph/Plan.\n// - install: installs a Program into the runtime (registers source.refresh, runs converge/validate in txn windows).\n\nimport type { Schema } from 'effect'\nimport { Effect } from 'effect'\nimport type { BoundApi } from './Bound.js'\nimport type { ExternalStore as ExternalStoreType } from './ExternalStore.js'\nimport * as Model from './internal/state-trait/model.js'\nimport type { TraitMeta as TraitMetaInternal } from './internal/state-trait/meta.js'\nimport * as FieldPath from './internal/state-trait/field-path.js'\nimport * as RowId from './internal/state-trait/rowid.js'\nimport * as InternalBuild from './internal/state-trait/build.js'\nimport * as InternalInstall from './internal/state-trait/install.js'\nimport * as InternalIr from './internal/state-trait/ir.js'\n\n// Public type aliases.\nexport type StateTraitSpec<S> = Model.StateTraitSpec<S>\nexport type StateTraitEntry<S = unknown, P extends string = string> = Model.StateTraitEntry<S, P>\nexport type StateTraitProgram<S> = Model.StateTraitProgram<S>\nexport type StateTraitGraph = Model.StateTraitGraph\nexport type StateTraitPlan = Model.StateTraitPlan\nexport type StateTraitNode<Input = unknown, Ctx = unknown> = Model.StateTraitNode<Input, Ctx>\nexport type StateTraitList<Item = unknown> = Model.StateTraitList<Item>\nexport type CheckRule<Input = unknown, Ctx = unknown> = Model.CheckRule<Input, Ctx>\nexport type TraitMeta = TraitMetaInternal\n\nexport type StateFieldPath<S> = FieldPath.StateFieldPath<S>\nexport type StateAtPath<S, P> = FieldPath.StateAtPath<S, P>\n\nexport const $root = '$root' as const\n\ntype DepsArgs<S extends object, Deps extends ReadonlyArray<StateFieldPath<S>>> = {\n readonly [K in keyof Deps]: StateAtPath<S, Deps[K]>\n}\n\n/**\n * StateTrait.from:\n * - Narrows available field paths based on the state Schema, adding type constraints to trait specs.\n * - At runtime this returns the raw spec object; normalization is handled by internal layers.\n */\nexport const from =\n <S extends object>(_schema: Schema.Schema<S>) =>\n (spec: StateTraitSpec<S>): StateTraitSpec<S> =>\n spec\n\nexport const node = <Input = unknown, Ctx = unknown>(\n spec: Omit<Model.StateTraitNode<Input, Ctx>, '_tag'>,\n): Model.StateTraitNode<Input, Ctx> => ({\n _tag: 'StateTraitNode',\n ...spec,\n})\n\nexport const list = <Item = unknown>(spec: Omit<Model.StateTraitList<Item>, '_tag'>): Model.StateTraitList<Item> => ({\n _tag: 'StateTraitList',\n ...spec,\n})\n\n/**\n * StateTrait.computed:\n * - Declares computed semantics for a field.\n * - Uses explicit deps as the single source of truth for dependencies (diagnostics / reverse-closure / incremental sched).\n */\nexport const computed = <\n S extends object,\n P extends StateFieldPath<S>,\n const Deps extends ReadonlyArray<StateFieldPath<S>>,\n>(input: {\n readonly deps: Deps\n readonly get: (...depsValues: DepsArgs<S, Deps>) => StateAtPath<S, P>\n readonly equals?: (prev: StateAtPath<S, P>, next: StateAtPath<S, P>) => boolean\n /**\n * 043: explicit converge time-slicing scheduling.\n * - unset: immediate (default behavior unchanged)\n * - deferred: can be postponed and merged into later windows (requires runtime time-slicing enabled)\n */\n readonly scheduling?: Model.TraitConvergeScheduling\n}): StateTraitEntry<S, P> => {\n const derive = (state: Readonly<S>): StateAtPath<S, P> => {\n const args = (input.deps as ReadonlyArray<string>).map((dep) => RowId.getAtPath(state as any, dep))\n return (input.get as any)(...args)\n }\n return {\n fieldPath: undefined as unknown as P,\n kind: 'computed',\n meta: {\n deps: input.deps,\n derive,\n equals: input.equals,\n ...(input.scheduling ? { scheduling: input.scheduling } : {}),\n },\n } as StateTraitEntry<S, P>\n}\n\n/**\n * StateTrait.source:\n * - Declares an external resource source for a field (Resource / Query integration is implemented in later phases).\n * - The kernel owns keyHash gating / concurrency / ReplayMode behavior.\n */\nexport const source = <\n S extends object,\n P extends StateFieldPath<S>,\n const Deps extends ReadonlyArray<StateFieldPath<S>>,\n>(input: {\n readonly resource: string\n readonly deps: Deps\n readonly key: (...depsValues: DepsArgs<S, Deps>) => unknown\n readonly triggers?: ReadonlyArray<'onMount' | 'onKeyChange' | 'manual'>\n readonly debounceMs?: number\n readonly concurrency?: 'switch' | 'exhaust-trailing'\n /**\n * Serializable metadata for Devtools/docs (whitelisted fields are extracted during build).\n */\n readonly meta?: TraitMeta\n}): StateTraitEntry<S, P> => {\n const key = (state: Readonly<S>): unknown => {\n const args = (input.deps as ReadonlyArray<string>).map((dep) => RowId.getAtPath(state as any, dep))\n return (input.key as any)(...args)\n }\n return {\n fieldPath: undefined as unknown as P,\n kind: 'source',\n meta: { ...input, key },\n } as StateTraitEntry<S, P>\n}\n\n/**\n * StateTrait.externalStore:\n * - Declares that a field is written back from an ExternalStore (external input or Module-as-Source).\n * - The field is treated as external-owned: do not write to it from reducers/computed/link/source; use separate fields + derived traits.\n */\nexport const externalStore = <S extends object, P extends StateFieldPath<S>, T = StateAtPath<S, P>>(input: {\n readonly store: ExternalStoreType<T>\n readonly select?: (snapshot: T) => StateAtPath<S, P>\n readonly equals?: (prev: StateAtPath<S, P>, next: StateAtPath<S, P>) => boolean\n readonly coalesceWindowMs?: number\n readonly priority?: Model.TraitLane\n readonly meta?: TraitMeta\n}): StateTraitEntry<S, P> =>\n ({\n fieldPath: undefined as unknown as P,\n kind: 'externalStore',\n meta: input as any,\n }) as StateTraitEntry<S, P>\n\n/**\n * StateTrait.link:\n * - Declares a linkage from another field into the target field.\n * - `meta.from` is also constrained by `StateFieldPath<S>`.\n */\nexport const link = <S extends object, P extends StateFieldPath<S>>(meta: {\n from: StateFieldPath<S>\n /**\n * 043: explicit converge time-slicing scheduling.\n * - unset: immediate (default behavior unchanged)\n * - deferred: can be postponed and merged into later windows (requires runtime time-slicing enabled)\n */\n scheduling?: Model.TraitConvergeScheduling\n}): StateTraitEntry<S, P> =>\n ({\n fieldPath: undefined as unknown as P,\n kind: 'link',\n meta: { ...meta, ...(meta.scheduling ? { scheduling: meta.scheduling } : {}) },\n }) as StateTraitEntry<S, P>\n\n/**\n * StateTrait.build:\n * - Normalizes the spec into an executable Program (including Graph/Plan).\n * - When DSL and build constraints differ, build is the final authority (e.g. requiring explicit deps).\n */\nexport const build = <S extends object>(\n stateSchema: Schema.Schema<S>,\n spec: StateTraitSpec<S>,\n): StateTraitProgram<S> => InternalBuild.build(stateSchema, spec)\n\n/**\n * StateTrait.install:\n * - Installs Program-defined behavior (computed/link/source/check, etc.) on top of a Bound API.\n * - Each PlanStep corresponds to a long-lived Effect mounted into the runtime Scope.\n */\nexport const install = <S extends object>(\n bound: BoundApi<any, any>,\n program: StateTraitProgram<S>,\n): Effect.Effect<void, never, any> => InternalInstall.install(bound, program)\n\n/**\n * StateTrait.exportStaticIr:\n * - Exports minimal Static IR (aligned with 009 canonical FieldPath constraints) for Devtools / Alignment Lab.\n * - The return value must be JSON-stringifiable (evidence packages / replay pipeline).\n */\nexport type StaticIr = InternalIr.StaticIr\n\nexport const exportStaticIr = (\n program: StateTraitProgram<any>,\n moduleId: string,\n options?: {\n readonly version?: string\n },\n): StaticIr =>\n InternalIr.exportStaticIr({\n program,\n moduleId,\n version: options?.version,\n })\n","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 | 'trait-external-store'\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 'trait-external-store':\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 => {\n let key = ''\n for (let i = 0; i < path.length; i++) {\n if (i > 0) key += '|'\n const seg = path[i]!\n key += seg.length\n key += ':'\n key += seg\n }\n return key\n}\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\nconst makeDirtyAllSet = (reason: DirtyAllReason): DirtySet => ({\n dirtyAll: true,\n reason,\n rootIds: [],\n rootCount: 0,\n keySize: 0,\n keyHash: 0,\n})\n\nconst buildSpecificDirtySetFromIds = (\n ids: ReadonlyArray<number>,\n fieldPathsById: ReadonlyArray<FieldPath>,\n): DirtySet => {\n const sorted = Array.from(ids)\n sorted.sort((a, b) => {\n const ap = fieldPathsById[a]\n const bp = fieldPathsById[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 < sorted.length; i++) {\n const id = sorted[i]!\n const path = fieldPathsById[id]!\n if (prev && isPrefixOf(prev, path)) continue\n rootIds.push(id)\n prev = path\n }\n\n if (rootIds.length === 0) {\n return makeDirtyAllSet('unknownWrite')\n }\n\n rootIds.sort((a, b) => a - b)\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 buildSpecificDirtySetFromIdsShallowFast = (ids: ReadonlyArray<number>): DirtySet => {\n // Fast path: if all dirty paths are single-segment (no structural prefixes possible),\n // roots are just the unique ids in numeric order.\n const sorted = Array.from(ids)\n sorted.sort((a, b) => a - b)\n\n const rootIds: Array<number> = []\n let prev: number | undefined\n for (let i = 0; i < sorted.length; i++) {\n const id = sorted[i]!\n if (prev === id) continue\n rootIds.push(id)\n prev = id\n }\n\n if (rootIds.length === 0) {\n return makeDirtyAllSet('unknownWrite')\n }\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\nexport const dirtyPathIdsToRootIds = (options: {\n readonly dirtyPathIds?: Iterable<FieldPathId>\n readonly registry: FieldPathIdRegistry\n readonly dirtyAllReason?: DirtyAllReason\n}): DirtySet => {\n if (options.dirtyAllReason) {\n return makeDirtyAllSet(options.dirtyAllReason)\n }\n\n let hasInvalid = false\n let missing = false\n let allShallow = true\n const ids: Array<number> = []\n\n for (const raw of options.dirtyPathIds ?? []) {\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 const fieldPath = options.registry.fieldPaths[id]\n if (!fieldPath) {\n missing = true\n continue\n }\n if (allShallow && fieldPath.length !== 1) {\n allShallow = false\n }\n ids.push(id)\n }\n\n if (hasInvalid) {\n return makeDirtyAllSet('nonTrackablePatch')\n }\n\n if (missing) {\n return makeDirtyAllSet('fallbackPolicy')\n }\n\n if (allShallow) {\n return buildSpecificDirtySetFromIdsShallowFast(ids)\n }\n\n return buildSpecificDirtySetFromIds(ids, options.registry.fieldPaths)\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 makeDirtyAllSet(options.dirtyAllReason)\n }\n\n let sawStar = false\n let hasInvalid = false\n let missing = false\n let allShallow = true\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 const fieldPath = options.registry.fieldPaths[id]\n if (!fieldPath) {\n missing = true\n continue\n }\n if (allShallow && fieldPath.length !== 1) {\n allShallow = false\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 if (allShallow && options.registry.fieldPaths[direct]?.length !== 1) {\n allShallow = false\n }\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 if (allShallow && options.registry.fieldPaths[id]?.length !== 1) {\n allShallow = false\n }\n ids.push(id)\n }\n\n if (hasInvalid) {\n return makeDirtyAllSet('nonTrackablePatch')\n }\n\n if (missing) {\n return makeDirtyAllSet('fallbackPolicy')\n }\n\n // Any non-trackable write must explicitly degrade (do not \"ignore *\" when roots exist).\n if (sawStar) {\n return makeDirtyAllSet('unknownWrite')\n }\n\n if (allShallow) {\n return buildSpecificDirtySetFromIdsShallowFast(ids)\n }\n\n return buildSpecificDirtySetFromIds(ids, options.registry.fieldPaths)\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 { normalizeFieldPath, type FieldPath, type FieldPathIdRegistry } from '../field-path.js'\nimport type { TxnDirtyEvidenceSnapshot } from '../runtime/core/StateTransaction.js'\n\nexport type RowId = string\n\nexport interface ListConfig {\n readonly path: string\n readonly trackBy?: string\n}\n\nexport type ListRemovalListener = (rowId: RowId) => void\n\ntype Segment = string | number\n\nconst parseSegments = (path: string): ReadonlyArray<Segment> => {\n if (!path) return []\n return path.split('.').map((seg) => (/^[0-9]+$/.test(seg) ? Number(seg) : seg))\n}\n\nconst isPrefixPath = (prefix: ReadonlyArray<string>, full: ReadonlyArray<string>): 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\nconst overlapsPath = (a: ReadonlyArray<string>, b: ReadonlyArray<string>): boolean => isPrefixPath(a, b) || isPrefixPath(b, a)\n\nexport const getAtPath = (state: any, path: string): any => {\n if (!path || state == null) return state\n const segments = parseSegments(path)\n let current: any = state\n for (const seg of segments) {\n if (current == null) return undefined\n if (typeof seg === 'number') {\n current = Array.isArray(current) ? current[seg] : current[String(seg)]\n continue\n }\n current = current[seg]\n }\n return current\n}\n\nexport const setAtPathMutating = (draft: unknown, path: string, value: unknown): void => {\n if (!path) return\n const segments = parseSegments(path)\n if (segments.length === 0) return\n\n let current: any = draft\n for (let i = 0; i < segments.length - 1; i++) {\n const key = segments[i]!\n const nextKey = segments[i + 1]!\n\n const next = current?.[key as any]\n if (next == null || typeof next !== 'object') {\n current[key as any] = typeof nextKey === 'number' ? [] : {}\n }\n current = current[key as any]\n }\n\n const last = segments[segments.length - 1]!\n current[last as any] = value\n}\n\nexport const unsetAtPathMutating = (draft: unknown, path: string): void => {\n if (!path) return\n const segments = parseSegments(path)\n if (segments.length === 0) return\n\n let current: any = draft\n for (let i = 0; i < segments.length - 1; i++) {\n const key = segments[i]!\n const next = current?.[key as any]\n if (next == null || typeof next !== 'object') {\n return\n }\n current = next\n }\n\n const last = segments[segments.length - 1]!\n if (Array.isArray(current) && typeof last === 'number') {\n // Keep arrays sparse (holes) rather than dense-undefined: improves perf in common \"sparse rows\" trees.\n delete current[last]\n return\n }\n\n if (current && typeof current === 'object') {\n delete current[last as any]\n }\n}\n\nexport const joinPath = (prefix: string, suffix: string): string => {\n if (!prefix) return suffix\n if (!suffix) return prefix\n return `${prefix}.${suffix}`\n}\n\nexport interface ListItemFieldPath {\n readonly listPath: string\n readonly itemPath: string\n}\n\n/**\n * parseListItemFieldPath:\n * - Recognize a list.item field path like \"items[].profileResource\".\n * - Supports nested arrays: returns listPath/itemPath for the innermost list.\n */\nexport const parseListItemFieldPath = (fieldPath: string): ListItemFieldPath | undefined => {\n const raw = typeof fieldPath === 'string' ? fieldPath.trim() : ''\n if (!raw) return undefined\n\n const segments = raw.split('.').filter(Boolean)\n let lastListSeg = -1\n for (let i = 0; i < segments.length; i++) {\n if (segments[i]!.endsWith('[]')) lastListSeg = i\n }\n if (lastListSeg < 0) return undefined\n\n const strip = (seg: string): string => (seg.endsWith('[]') ? seg.slice(0, -2) : seg)\n\n const listPath = segments\n .slice(0, lastListSeg + 1)\n .map(strip)\n .join('.')\n\n const itemPath = segments\n .slice(lastListSeg + 1)\n .map(strip)\n .join('.')\n\n return { listPath, itemPath }\n}\n\nexport const toListItemValuePath = (listPath: string, index: number, itemPath: string): string =>\n itemPath ? `${listPath}.${index}.${itemPath}` : `${listPath}.${index}`\n\ntype ListState = {\n readonly listPath: string\n readonly parentRowId?: RowId\n readonly itemsRef: ReadonlyArray<unknown>\n readonly ids: ReadonlyArray<RowId>\n readonly indexById: ReadonlyMap<RowId, number>\n readonly trackBy?: string\n}\n\nconst readTrackBy = (item: unknown, trackBy: string): unknown => {\n if (!item || typeof item !== 'object') return undefined\n const segments = trackBy.split('.')\n let current: any = item\n for (const seg of segments) {\n if (current == null) return undefined\n current = current[seg as any]\n }\n return current\n}\n\nconst didReorderByReference = (prevItems: ReadonlyArray<unknown>, nextItems: ReadonlyArray<unknown>): boolean => {\n const buckets = new Map<unknown, Array<number>>()\n for (let i = 0; i < prevItems.length; i++) {\n const item = prevItems[i]\n const list = buckets.get(item) ?? []\n list.push(i)\n buckets.set(item, list)\n }\n\n for (let nextIndex = 0; nextIndex < nextItems.length; nextIndex++) {\n const item = nextItems[nextIndex]\n const q = buckets.get(item)\n if (!q || q.length === 0) continue\n const prevIndex = q.shift()!\n if (prevIndex !== nextIndex) {\n return true\n }\n }\n\n return false\n}\n\nconst hasStableTrackByKeys = (items: ReadonlyArray<unknown>, trackBy: string): boolean =>\n items.every((item) => readTrackBy(item, trackBy) !== undefined)\n\nconst isSameTrackBySequence = (\n prevItems: ReadonlyArray<unknown>,\n nextItems: ReadonlyArray<unknown>,\n trackBy: string,\n): boolean => {\n if (prevItems.length !== nextItems.length) return false\n for (let i = 0; i < prevItems.length; i++) {\n if (!Object.is(readTrackBy(prevItems[i], trackBy), readTrackBy(nextItems[i], trackBy))) {\n return false\n }\n }\n return true\n}\n\nconst reconcileIds = (\n prev: ListState | undefined,\n nextItems: ReadonlyArray<unknown>,\n trackBy?: string,\n makeRowId?: () => RowId,\n): { readonly ids: ReadonlyArray<RowId>; readonly removed: ReadonlyArray<RowId> } => {\n const nextRowId =\n makeRowId ??\n (() => {\n let rowSeq = 0\n return () => {\n rowSeq += 1\n return `r${rowSeq}`\n }\n })()\n\n if (!prev) {\n return {\n ids: nextItems.map(() => nextRowId()),\n removed: [],\n }\n }\n\n if (prev.itemsRef === nextItems) {\n return {\n ids: prev.ids,\n removed: [],\n }\n }\n\n // Important: keep RowId stable under \"non-structural changes\" (field updates / object clones only),\n // otherwise in-flight state and caches would be invalidated needlessly.\n const sameLength = prev.itemsRef.length === nextItems.length\n if (sameLength) {\n // trackBy case: if the key sequence is identical, we can reuse old ids;\n // otherwise we must reconcile by key (avoid misclassifying clone+reorder as \"no reorder\").\n if (trackBy) {\n const canUseKeys = hasStableTrackByKeys(prev.itemsRef, trackBy) && hasStableTrackByKeys(nextItems, trackBy)\n if (canUseKeys) {\n if (isSameTrackBySequence(prev.itemsRef, nextItems, trackBy)) {\n return {\n ids: prev.ids,\n removed: [],\n }\n }\n } else {\n // If trackBy keys are not available, fall back to reference-level detection (keep stability for \"cloned but not reordered\").\n if (!didReorderByReference(prev.itemsRef, nextItems)) {\n return {\n ids: prev.ids,\n removed: [],\n }\n }\n }\n } else if (!didReorderByReference(prev.itemsRef, nextItems)) {\n return {\n ids: prev.ids,\n removed: [],\n }\n }\n }\n\n const keyOf = (item: unknown): unknown => {\n if (!trackBy) return item\n const k = readTrackBy(item, trackBy)\n return k !== undefined ? k : item\n }\n\n const buckets = new Map<unknown, Array<RowId>>()\n for (let i = 0; i < prev.itemsRef.length; i++) {\n const key = keyOf(prev.itemsRef[i])\n const list = buckets.get(key) ?? []\n list.push(prev.ids[i]!)\n buckets.set(key, list)\n }\n\n const ids: Array<RowId> = []\n for (let i = 0; i < nextItems.length; i++) {\n const key = keyOf(nextItems[i])\n const list = buckets.get(key)\n if (list && list.length > 0) {\n ids.push(list.shift()!)\n } else {\n ids.push(nextRowId())\n }\n }\n\n const removed: Array<RowId> = []\n for (const list of buckets.values()) {\n removed.push(...list)\n }\n\n return { ids, removed }\n}\n\nconst buildIndexById = (ids: ReadonlyArray<RowId>): ReadonlyMap<RowId, number> => {\n const map = new Map<RowId, number>()\n for (let i = 0; i < ids.length; i++) {\n map.set(ids[i]!, i)\n }\n return map\n}\n\nexport class RowIdStore {\n private readonly lists = new Map<string, ListState>()\n private readonly removalListeners = new Map<string, Set<ListRemovalListener>>()\n private readonly rowIdIndex = new Map<\n RowId,\n { readonly key: string; readonly listPath: string; readonly index: number }\n >()\n private nextRowSeq = 0\n\n constructor(private readonly instanceId?: string) {}\n\n private listKey = (listPath: string, parentRowId?: RowId): string =>\n parentRowId ? `${listPath}@@${parentRowId}` : listPath\n\n private makeRowId = (): RowId => {\n this.nextRowSeq += 1\n return this.instanceId ? `${this.instanceId}::r${this.nextRowSeq}` : `r${this.nextRowSeq}`\n }\n\n private notifyRemoved(listPath: string, rowId: RowId): void {\n const listeners = this.removalListeners.get(listPath)\n if (!listeners || listeners.size === 0) return\n for (const fn of listeners) {\n try {\n fn(rowId)\n } catch {\n // listener failures should never break runtime behavior\n }\n }\n }\n\n private removeDescendants(parentRowId: RowId): void {\n const keys: Array<string> = []\n for (const [k, st] of this.lists.entries()) {\n if (st.parentRowId === parentRowId) keys.push(k)\n }\n\n for (const key of keys) {\n const st = this.lists.get(key)\n if (!st) continue\n this.lists.delete(key)\n for (let i = 0; i < st.ids.length; i++) {\n const rowId = st.ids[i]!\n this.rowIdIndex.delete(rowId)\n this.notifyRemoved(st.listPath, rowId)\n this.removeDescendants(rowId)\n }\n }\n }\n\n onRemoved(listPath: string, listener: ListRemovalListener): () => void {\n const set = this.removalListeners.get(listPath) ?? new Set<ListRemovalListener>()\n set.add(listener)\n this.removalListeners.set(listPath, set)\n return () => {\n const current = this.removalListeners.get(listPath)\n if (!current) return\n current.delete(listener)\n if (current.size === 0) this.removalListeners.delete(listPath)\n }\n }\n\n getRowId(listPath: string, index: number, parentRowId?: RowId): RowId | undefined {\n const state = this.lists.get(this.listKey(listPath, parentRowId))\n return state ? state.ids[index] : undefined\n }\n\n getIndex(listPath: string, rowId: RowId): number | undefined {\n const info = this.rowIdIndex.get(rowId)\n if (!info) return undefined\n if (info.listPath !== listPath) return undefined\n return info.index\n }\n\n /**\n * ensureList:\n * - Align RowID mapping for the given listPath with the current items.\n * - Returns the latest ids (index -> RowId).\n */\n ensureList(\n listPath: string,\n items: ReadonlyArray<unknown>,\n trackBy?: string,\n parentRowId?: RowId,\n ): ReadonlyArray<RowId> {\n const key = this.listKey(listPath, parentRowId)\n const prev = this.lists.get(key)\n const { ids, removed } = reconcileIds(prev, items, trackBy ?? prev?.trackBy, this.makeRowId)\n\n const next: ListState = {\n listPath,\n parentRowId,\n itemsRef: items,\n ids,\n indexById: buildIndexById(ids),\n trackBy: trackBy ?? prev?.trackBy,\n }\n this.lists.set(key, next)\n\n if (removed.length > 0) {\n for (const rowId of removed) {\n this.rowIdIndex.delete(rowId)\n this.notifyRemoved(listPath, rowId)\n this.removeDescendants(rowId)\n }\n }\n\n // Refresh the reverse rowId -> index mapping (index changes are allowed).\n for (let i = 0; i < ids.length; i++) {\n const rowId = ids[i]!\n this.rowIdIndex.set(rowId, { key, listPath, index: i })\n }\n\n return ids\n }\n\n /**\n * updateAll:\n * - After each commit, align RowID mappings for all known lists.\n * - configs come from list declarations in StateTraitProgram.spec (may include trackBy).\n */\n updateAll(state: unknown, configs: ReadonlyArray<ListConfig>): void {\n const cfgByPath = new Map<string, ListConfig>()\n const paths: Array<string> = []\n for (const cfg of configs) {\n if (!cfg || typeof cfg.path !== 'string') continue\n const p = cfg.path.trim()\n if (!p) continue\n cfgByPath.set(p, cfg)\n paths.push(p)\n }\n\n const pathSet = new Set(paths)\n\n const parentOf = (path: string): string | undefined => {\n const segments = path.split('.').filter(Boolean)\n let best: string | undefined\n for (let i = 1; i < segments.length; i++) {\n const prefix = segments.slice(0, i).join('.')\n if (pathSet.has(prefix)) best = prefix\n }\n return best\n }\n\n const parentByPath = new Map<string, string | undefined>()\n const suffixByPath = new Map<string, string>()\n const childrenByParent = new Map<string | undefined, Array<string>>()\n\n for (const path of paths) {\n const parent = parentOf(path)\n parentByPath.set(path, parent)\n const suffix = parent ? path.slice(parent.length + 1) : path\n suffixByPath.set(path, suffix)\n const list = childrenByParent.get(parent) ?? []\n list.push(path)\n childrenByParent.set(parent, list)\n }\n\n // roots first (and deterministic traversal)\n const roots = (childrenByParent.get(undefined) ?? []).slice().sort()\n\n const visit = (listPath: string, parentRowId: RowId | undefined, listValue: unknown): void => {\n const cfg = cfgByPath.get(listPath)\n const items = Array.isArray(listValue) ? (listValue as ReadonlyArray<unknown>) : []\n const ids = this.ensureList(listPath, items, cfg?.trackBy, parentRowId)\n\n const children = (childrenByParent.get(listPath) ?? []).slice().sort()\n if (children.length === 0) return\n\n for (let i = 0; i < items.length; i++) {\n const row = items[i]\n const rowId = ids[i]\n if (!rowId) continue\n for (const childPath of children) {\n const suffix = suffixByPath.get(childPath) ?? ''\n const childValue = suffix ? getAtPath(row as any, suffix) : undefined\n visit(childPath, rowId, childValue)\n }\n }\n }\n\n for (const root of roots) {\n const value = getAtPath(state as any, root)\n visit(root, undefined, value)\n }\n }\n}\n\nexport const collectListConfigs = (spec: Record<string, unknown>): ReadonlyArray<ListConfig> => {\n const configs: Array<ListConfig> = []\n for (const key in spec) {\n if (!Object.prototype.hasOwnProperty.call(spec, key)) continue\n const raw = spec[key]\n if (!raw || typeof raw !== 'object') continue\n const tag = (raw as any)._tag\n if (tag !== 'StateTraitList') continue\n const trackBy = (raw as any).identityHint?.trackBy\n configs.push({\n path: key,\n trackBy: typeof trackBy === 'string' ? trackBy : undefined,\n })\n }\n return configs\n}\n\ntype ListConfigDirtyMatchPlan = {\n readonly fallbackToDirtyAll: boolean\n readonly listPaths: ReadonlyArray<FieldPath>\n readonly listPathsByRootKey: ReadonlyMap<string, ReadonlyArray<FieldPath>>\n /**\n * trackByPathsByListPath:\n * - key: normalized listPath (by reference)\n * - value: normalized full field path for the list item trackBy field (listPath + trackBy segments)\n *\n * Used to decide when RowId mappings must be reconciled even if the list root itself is not dirty:\n * - changing trackBy values can change row identity, which impacts in-flight gates and nested list bindings.\n */\n readonly trackByPathsByListPath: ReadonlyMap<FieldPath, FieldPath>\n}\n\nconst listConfigDirtyMatchPlanCache = new WeakMap<ReadonlyArray<ListConfig>, ListConfigDirtyMatchPlan>()\n\nconst getPathRootKey = (path: ReadonlyArray<string>): string => path[0] ?? ''\n\nconst isRedundantDirtyRoot = (existingDirtyRoots: ReadonlyArray<FieldPath>, dirtyRoot: FieldPath): boolean => {\n for (const existing of existingDirtyRoots) {\n if (isPrefixPath(existing, dirtyRoot)) {\n return true\n }\n }\n return false\n}\n\nconst upsertDirtyRoot = (existingDirtyRoots: Array<FieldPath>, dirtyRoot: FieldPath): void => {\n if (isRedundantDirtyRoot(existingDirtyRoots, dirtyRoot)) {\n return\n }\n\n let nextLength = 0\n for (let i = 0; i < existingDirtyRoots.length; i++) {\n const existing = existingDirtyRoots[i]!\n if (isPrefixPath(dirtyRoot, existing)) {\n continue\n }\n existingDirtyRoots[nextLength] = existing\n nextLength += 1\n }\n existingDirtyRoots.length = nextLength\n existingDirtyRoots.push(dirtyRoot)\n}\n\nconst buildListConfigDirtyMatchPlan = (listConfigs: ReadonlyArray<ListConfig>): ListConfigDirtyMatchPlan => {\n const listPaths: Array<FieldPath> = []\n const listPathsByRootKey = new Map<string, Array<FieldPath>>()\n const trackByPathsByListPath = new Map<FieldPath, FieldPath>()\n const seen = new Set<string>()\n\n for (const cfg of listConfigs) {\n const rawPath = typeof cfg.path === 'string' ? cfg.path.trim() : ''\n if (!rawPath) continue\n\n const normalized = normalizeFieldPath(rawPath)\n if (!normalized || normalized.length === 0) {\n // Conservative fallback: unknown list path encoding must not skip RowID alignment.\n return {\n fallbackToDirtyAll: true,\n listPaths: [],\n listPathsByRootKey: new Map(),\n trackByPathsByListPath: new Map(),\n }\n }\n\n const dedupeKey = JSON.stringify(normalized)\n if (seen.has(dedupeKey)) continue\n seen.add(dedupeKey)\n listPaths.push(normalized)\n\n const rootKey = getPathRootKey(normalized)\n const bucket = listPathsByRootKey.get(rootKey)\n if (bucket) {\n bucket.push(normalized)\n } else {\n listPathsByRootKey.set(rootKey, [normalized])\n }\n\n const trackBy = typeof cfg.trackBy === 'string' ? cfg.trackBy.trim() : ''\n if (trackBy) {\n const trackByNormalized = normalizeFieldPath(`${rawPath}.${trackBy}`)\n if (!trackByNormalized || trackByNormalized.length === 0) {\n // Conservative fallback: unknown trackBy encoding must not skip RowID alignment.\n return {\n fallbackToDirtyAll: true,\n listPaths: [],\n listPathsByRootKey: new Map(),\n trackByPathsByListPath: new Map(),\n }\n }\n trackByPathsByListPath.set(normalized, trackByNormalized)\n }\n }\n\n return {\n fallbackToDirtyAll: false,\n listPaths,\n listPathsByRootKey,\n trackByPathsByListPath,\n }\n}\n\nconst getListConfigDirtyMatchPlan = (listConfigs: ReadonlyArray<ListConfig>): ListConfigDirtyMatchPlan => {\n // Runtime keeps listConfigs identity stable between trait program rebuilds; cache keying by array reference is effective on hot commits.\n const cached = listConfigDirtyMatchPlanCache.get(listConfigs)\n if (cached) return cached\n\n const next = buildListConfigDirtyMatchPlan(listConfigs)\n listConfigDirtyMatchPlanCache.set(listConfigs, next)\n return next\n}\n\nexport const shouldReconcileListConfigsByDirtyEvidence = (args: {\n readonly dirty: TxnDirtyEvidenceSnapshot\n readonly listConfigs: ReadonlyArray<ListConfig>\n readonly fieldPathIdRegistry?: FieldPathIdRegistry\n}): boolean => {\n const { dirty, listConfigs, fieldPathIdRegistry } = args\n if (listConfigs.length === 0) return false\n if (dirty.dirtyAll) return true\n if (dirty.dirtyPathIds.length === 0) return false\n if (!fieldPathIdRegistry) return true\n\n const plan = getListConfigDirtyMatchPlan(listConfigs)\n if (plan.fallbackToDirtyAll) return true\n if (plan.listPaths.length === 0) return false\n\n const fieldPaths = fieldPathIdRegistry.fieldPaths\n const dirtyRootsToProcessByRoot = new Map<string, Array<FieldPath>>()\n\n for (const rawId of dirty.dirtyPathIds) {\n if (!Number.isFinite(rawId)) {\n // Conservative fallback: non-finite evidence must not skip RowID alignment.\n return true\n }\n const id = Math.floor(rawId)\n if (id < 0) return true\n\n const dirtyPath: FieldPath | undefined = fieldPaths[id]\n if (!dirtyPath) {\n // Conservative fallback: unknown pathId must not accidentally skip RowID alignment.\n return true\n }\n\n const rootKey = getPathRootKey(dirtyPath)\n const existing = dirtyRootsToProcessByRoot.get(rootKey)\n if (existing) {\n upsertDirtyRoot(existing, dirtyPath)\n continue\n }\n dirtyRootsToProcessByRoot.set(rootKey, [dirtyPath])\n }\n\n for (const [rootKey, dirtyRootsForRoot] of dirtyRootsToProcessByRoot) {\n const candidates = plan.listPathsByRootKey.get(rootKey)\n if (!candidates || candidates.length === 0) {\n continue\n }\n\n for (const dirtyRoot of dirtyRootsForRoot) {\n for (const listPath of candidates) {\n // 1) Structural changes: when the dirty root is at/above the list path (prefix),\n // we must reconcile because insert/remove/reorder in parent lists affects nested list bindings too.\n if (isPrefixPath(dirtyRoot, listPath)) {\n return true\n }\n\n // 2) TrackBy changes: even if the list root is not dirty, changing trackBy values can change row identity.\n const trackByPath = plan.trackByPathsByListPath.get(listPath)\n if (trackByPath && overlapsPath(dirtyRoot, trackByPath)) {\n return true\n }\n\n // 3) No trackBy: keep legacy behavior.\n // For reference-based identity, we must keep RowIdStore's itemsRef aligned even for nested field updates,\n // otherwise later structural changes (insert/remove/reorder) can churn RowIds and break in-flight writebacks.\n if (!trackByPath && overlapsPath(dirtyRoot, listPath)) {\n return true\n }\n }\n }\n }\n\n return false\n}\n","import type { Schema } from 'effect'\nimport * as SchemaAST from 'effect/SchemaAST'\nimport {\n type StateTraitProgram,\n type StateTraitSpec,\n type StateTraitEntry,\n type StateTraitGraph,\n type StateTraitGraphEdge,\n type StateTraitGraphNode,\n type StateTraitField,\n type StateTraitFieldTrait,\n type StateTraitKind,\n type StateTraitPlan,\n type StateTraitPlanStep,\n type StateTraitResource,\n type StateTraitSchemaPathRef,\n collectNodeMeta,\n normalizeSpec,\n} from './model.js'\nimport * as Meta from './meta.js'\nimport {\n compareFieldPath,\n getFieldPathId,\n makeFieldPathIdRegistry,\n normalizeFieldPath,\n type FieldPath,\n type FieldPathId,\n} from '../field-path.js'\nimport { fnv1a32, stableStringify } from '../digest.js'\nimport { getConvergeStaticIrDigest, type ConvergeStaticIrRegistry } from './converge-ir.js'\n\nconst nowPerf = (): number =>\n typeof globalThis.performance !== 'undefined' && typeof globalThis.performance.now === 'function'\n ? globalThis.performance.now()\n : Date.now()\n\ntype ConvergeWriter = Extract<StateTraitEntry<any, string>, { readonly kind: 'computed' | 'link' }>\n\nconst collectMultipleWritersError = (\n entries: ReadonlyArray<StateTraitEntry<any, string>>,\n): ConvergeStaticIrRegistry['configError'] | undefined => {\n const kindsByFieldPath = new Map<string, Set<StateTraitKind>>()\n\n for (const entry of entries) {\n if (entry.kind !== 'computed' && entry.kind !== 'link' && entry.kind !== 'source' && entry.kind !== 'externalStore') {\n continue\n }\n const set = kindsByFieldPath.get(entry.fieldPath) ?? new Set<StateTraitKind>()\n set.add(entry.kind)\n kindsByFieldPath.set(entry.fieldPath, set)\n }\n\n const conflicts: Array<{ readonly fieldPath: string; readonly kinds: ReadonlyArray<StateTraitKind> }> = []\n for (const [fieldPath, kinds] of kindsByFieldPath.entries()) {\n if (kinds.size <= 1) continue\n conflicts.push({ fieldPath, kinds: Array.from(kinds).sort() })\n }\n\n if (conflicts.length === 0) return undefined\n\n conflicts.sort((a, b) => (a.fieldPath < b.fieldPath ? -1 : a.fieldPath > b.fieldPath ? 1 : 0))\n const fields = conflicts.map((c) => c.fieldPath)\n const primary = conflicts[0]!\n const kindSummary = primary.kinds.join(' + ')\n\n return {\n code: 'MULTIPLE_WRITERS',\n message:\n `[StateTrait.build] Multiple writers for field \"${primary.fieldPath}\" (${kindSummary}). ` +\n 'Only one of computed/link/source/externalStore can write a fieldPath.',\n fields,\n }\n}\n\nconst getConvergeWriterDeps = (entry: ConvergeWriter): ReadonlyArray<string> => {\n if (entry.kind === 'computed') {\n return ((entry.meta as any)?.deps ?? []) as ReadonlyArray<string>\n }\n return [entry.meta.from as string]\n}\n\nconst computeConvergeTopoOrder = (\n writers: ReadonlyArray<ConvergeWriter>,\n): { readonly order: ReadonlyArray<string>; readonly configError?: ConvergeStaticIrRegistry['configError'] } => {\n const writerByPath = new Map<string, ConvergeWriter>()\n for (const entry of writers) {\n const existing = writerByPath.get(entry.fieldPath)\n if (existing) {\n return {\n order: [],\n configError: {\n code: 'MULTIPLE_WRITERS',\n message: `[StateTrait.converge] Multiple writers for field \"${entry.fieldPath}\" (${existing.kind} + ${entry.kind}).`,\n fields: [entry.fieldPath],\n },\n }\n }\n writerByPath.set(entry.fieldPath, entry)\n }\n\n const nodes = new Set<string>()\n for (const entry of writers) {\n nodes.add(entry.fieldPath)\n }\n\n const indegree = new Map<string, number>()\n const forward = new Map<string, Array<string>>()\n\n for (const node of nodes) {\n indegree.set(node, 0)\n forward.set(node, [])\n }\n\n for (const entry of writers) {\n const to = entry.fieldPath\n const deps = getConvergeWriterDeps(entry)\n for (const dep of deps) {\n if (!nodes.has(dep)) continue\n forward.get(dep)!.push(to)\n indegree.set(to, (indegree.get(to) ?? 0) + 1)\n }\n }\n\n const queue: Array<string> = []\n for (const [node, deg] of indegree.entries()) {\n if (deg === 0) queue.push(node)\n }\n\n const order: Array<string> = []\n while (queue.length) {\n const n = queue.shift()!\n order.push(n)\n const outs = forward.get(n)!\n for (const to of outs) {\n const next = (indegree.get(to) ?? 0) - 1\n indegree.set(to, next)\n if (next === 0) queue.push(to)\n }\n }\n\n if (order.length !== nodes.size) {\n const remaining = Array.from(nodes).filter((n) => !order.includes(n))\n return {\n order: [],\n configError: {\n code: 'CYCLE_DETECTED',\n message: `[StateTrait.converge] Cycle detected in computed/link graph: ${remaining.join(', ')}`,\n fields: remaining,\n },\n }\n }\n\n return { order }\n}\n\nconst collectSchemaFieldPaths = (schema: Schema.Schema<any>): ReadonlyArray<FieldPath> => {\n const byKey = new Map<string, FieldPath>()\n\n const add = (path: FieldPath): void => {\n const normalized = normalizeFieldPath(path)\n if (!normalized) return\n byKey.set(JSON.stringify(normalized), normalized)\n }\n\n const visit = (ast: SchemaAST.AST, prefix: ReadonlyArray<string>, seen: Set<SchemaAST.AST>): void => {\n let current: SchemaAST.AST = SchemaAST.toType(ast)\n\n while (SchemaAST.isSuspend(current)) {\n if (seen.has(current)) return\n seen.add(current)\n current = SchemaAST.toType(current.thunk())\n }\n\n if (SchemaAST.isUnion(current)) {\n for (const t of current.types) {\n visit(t, prefix, seen)\n }\n return\n }\n\n // Array / Tuple: indices do not enter the FieldPathId space; recurse into element types to support `items[0].name -> items.name`.\n if (SchemaAST.isArrays(current)) {\n for (const e of current.elements) {\n visit(e, prefix, seen)\n }\n for (const r of current.rest) {\n visit(r, prefix, seen)\n }\n return\n }\n\n if (SchemaAST.isObjects(current)) {\n for (const ps of current.propertySignatures) {\n const seg = String(ps.name)\n if (!seg) continue\n const next = [...prefix, seg]\n add(next)\n visit(ps.type, next, seen)\n }\n // Index signature (Record<string, T>) can't be enumerated statically: avoid generating misaligned dynamic key paths.\n return\n }\n\n // Any / Unknown / Object / Declaration (open types): cannot enumerate nested paths; stop conservatively.\n }\n\n visit(schema.ast as unknown as SchemaAST.AST, [], new Set())\n return Array.from(byKey.values()).sort(compareFieldPath)\n}\n\nconst buildConvergeIr = (\n stateSchema: Schema.Schema<any>,\n entries: ReadonlyArray<StateTraitEntry<any, string>>,\n): ConvergeStaticIrRegistry => {\n const startedAt = nowPerf()\n const generation = 0\n\n const multipleWritersError = collectMultipleWritersError(entries)\n\n const writers = entries.filter((e): e is ConvergeWriter => e.kind === 'computed' || e.kind === 'link')\n\n const writersKey = writers\n .map((entry) => `${entry.kind}:${entry.fieldPath}`)\n .sort()\n .join('|')\n\n const depsKey = writers\n .map((entry) => {\n const deps = getConvergeWriterDeps(entry).slice().sort().join(',')\n const scheduling = (entry.meta as any)?.scheduling === 'deferred' ? 'd' : 'i'\n return `${entry.kind}:${entry.fieldPath}@${scheduling}=>${deps}`\n })\n .sort()\n .join('|')\n\n const writerByPath = new Map<string, ConvergeWriter>()\n for (const entry of writers) {\n writerByPath.set(entry.fieldPath, entry)\n }\n\n const topo = multipleWritersError\n ? { order: [] as ReadonlyArray<string> }\n : writers.length > 0\n ? computeConvergeTopoOrder(writers)\n : { order: [] as ReadonlyArray<string> }\n const stepsById: Array<ConvergeWriter> = topo.configError ? [] : topo.order.map((path) => writerByPath.get(path)!)\n\n const fieldPathTable = new Map<string, FieldPath>()\n const addPath = (path: FieldPath): void => {\n for (let i = 1; i <= path.length; i++) {\n const prefix = path.slice(0, i)\n const key = JSON.stringify(prefix)\n if (!fieldPathTable.has(key)) fieldPathTable.set(key, prefix)\n }\n }\n\n // 065: FieldPathId semantics must cover all enumerable field paths of stateSchema; otherwise reducer patchPaths can't map and will fall back to dirtyAll.\n for (const schemaPath of collectSchemaFieldPaths(stateSchema)) {\n addPath(schemaPath)\n }\n\n for (const entry of writers) {\n const out = normalizeFieldPath(entry.fieldPath)\n if (out) addPath(out)\n for (const dep of getConvergeWriterDeps(entry)) {\n const depPath = normalizeFieldPath(dep)\n if (depPath) addPath(depPath)\n }\n }\n\n const fieldPaths = Array.from(fieldPathTable.values()).sort(compareFieldPath)\n const fieldPathIdRegistry = makeFieldPathIdRegistry(fieldPaths)\n const fieldPathsKey = fnv1a32(stableStringify(fieldPaths))\n const staticIrDigest = getConvergeStaticIrDigest({\n writersKey,\n depsKey,\n fieldPathsKey,\n })\n\n const stepOutFieldPathIdByStepId: Array<FieldPathId> = []\n const stepDepsFieldPathIdsByStepId: Array<ReadonlyArray<FieldPathId>> = []\n const stepSchedulingByStepId: Array<'immediate' | 'deferred'> = []\n\n for (const entry of stepsById) {\n const out = normalizeFieldPath(entry.fieldPath)\n const outId = out != null ? getFieldPathId(fieldPathIdRegistry, out) : undefined\n if (outId == null) {\n throw new Error(`[StateTrait.build] Failed to map converge output fieldPath \"${entry.fieldPath}\" to FieldPathId.`)\n }\n\n const depIds: Array<FieldPathId> = []\n for (const dep of getConvergeWriterDeps(entry)) {\n const depPath = normalizeFieldPath(dep)\n if (!depPath) continue\n const depId = getFieldPathId(fieldPathIdRegistry, depPath)\n if (depId != null) depIds.push(depId)\n }\n\n stepOutFieldPathIdByStepId.push(outId)\n stepDepsFieldPathIdsByStepId.push(depIds)\n stepSchedulingByStepId.push((entry.meta as any)?.scheduling === 'deferred' ? 'deferred' : 'immediate')\n }\n\n const topoOrder = stepsById.map((_, i) => i)\n const buildDurationMs = Math.max(0, nowPerf() - startedAt)\n\n return {\n generation,\n writersKey,\n depsKey,\n fieldPathsKey,\n staticIrDigest,\n fieldPaths,\n fieldPathIdRegistry,\n ...(multipleWritersError ? { configError: multipleWritersError } : topo.configError ? { configError: topo.configError } : null),\n stepsById,\n stepOutFieldPathIdByStepId,\n stepDepsFieldPathIdsByStepId,\n stepSchedulingByStepId,\n topoOrder,\n buildDurationMs,\n }\n}\n\n/**\n * Builds a normalized FieldTrait from a StateTraitEntry.\n *\n * - Currently uses explicit deps for computed/source and link edges; deeper dependency analysis is intentionally not performed.\n * - If we evolve explicit dependency declarations further, extend here.\n */\nconst toFieldTrait = (entry: StateTraitEntry<any, string>): StateTraitFieldTrait => {\n const deps: Array<string> = []\n\n if (entry.kind === 'computed') {\n const meta = entry.meta as any\n const list = meta.deps as ReadonlyArray<string> | undefined\n if (list) deps.push(...list)\n } else if (entry.kind === 'source') {\n const meta = entry.meta as any\n const list = meta.deps as ReadonlyArray<string> | undefined\n if (list) deps.push(...list)\n } else if (entry.kind === 'link') {\n deps.push(entry.meta.from as string)\n } else if (entry.kind === 'check') {\n const meta = entry.meta as any\n const rules = (meta?.rules ?? {}) as Record<string, any>\n for (const name of Object.keys(rules)) {\n const rule = rules[name]\n if (rule && typeof rule === 'object') {\n const list = rule.deps as ReadonlyArray<string> | undefined\n if (list) deps.push(...list)\n }\n }\n }\n\n return {\n fieldId: entry.fieldPath,\n kind: entry.kind,\n // Keep meta identical to Entry.meta at runtime so install can reuse it directly.\n meta: entry.meta as any,\n deps,\n }\n}\n\n/**\n * Builds Field / Node / Edge / Resource sets from normalized entries.\n */\nconst buildGraph = (\n entries: ReadonlyArray<StateTraitEntry<any, string>>,\n nodeMetaByFieldPath: ReadonlyMap<string, Meta.TraitMeta>,\n): {\n readonly graph: StateTraitGraph\n readonly plan: StateTraitPlan\n} => {\n const fieldMap = new Map<string, StateTraitField>()\n const nodes: Array<StateTraitGraphNode> = []\n const edges: Array<StateTraitGraphEdge> = []\n const resourcesById = new Map<string, StateTraitResource>()\n const planSteps: Array<StateTraitPlanStep> = []\n\n const ensureField = (fieldPath: string): StateTraitField => {\n let field = fieldMap.get(fieldPath)\n if (!field) {\n field = {\n id: fieldPath,\n path: fieldPath,\n traits: [],\n }\n fieldMap.set(fieldPath, field)\n }\n return field\n }\n\n for (const entry of entries) {\n const fieldPath = entry.fieldPath\n const field = ensureField(fieldPath)\n const trait = toFieldTrait(entry)\n\n ;(field.traits as Array<StateTraitFieldTrait>).push(trait)\n\n // Build Graph edges and Plan steps by kind.\n if (entry.kind === 'computed') {\n const stepId = `computed:${fieldPath}`\n planSteps.push({\n id: stepId,\n kind: 'computed-update',\n targetFieldPath: fieldPath,\n // Note: the current version does not statically analyze computed dependencies; sourceFieldPaths remains empty.\n })\n // If deps is explicitly declared, add Graph edges (for diagnostics / reverse-closure computation).\n const deps = (entry.meta as any).deps as ReadonlyArray<string> | undefined\n if (deps) {\n for (const dep of deps) {\n ensureField(dep)\n edges.push({\n id: `computed:${dep}->${fieldPath}`,\n from: dep,\n to: fieldPath,\n kind: 'computed',\n })\n }\n }\n } else if (entry.kind === 'link') {\n const from = entry.meta.from as string\n ensureField(from)\n\n const edgeId = `link:${from}->${fieldPath}`\n edges.push({\n id: edgeId,\n from,\n to: fieldPath,\n kind: 'link',\n })\n\n planSteps.push({\n id: `link:${fieldPath}`,\n kind: 'link-propagate',\n targetFieldPath: fieldPath,\n sourceFieldPaths: [from],\n debugInfo: {\n graphEdgeId: edgeId,\n },\n })\n } else if (entry.kind === 'source') {\n const resourceId = entry.meta.resource\n const resourceMeta = Meta.sanitize((entry.meta as any).meta)\n\n const existing = resourcesById.get(resourceId)\n if (existing) {\n const ownerFields = [...existing.ownerFields, fieldPath]\n let meta = existing.meta\n let metaOrigin = existing.metaOrigin\n let metaConflicts = existing.metaConflicts\n\n if (resourceMeta) {\n const merged = Meta.mergeCanonical(\n { meta, origin: metaOrigin, conflicts: metaConflicts },\n { origin: fieldPath, meta: resourceMeta },\n )\n meta = merged.meta\n metaOrigin = merged.origin\n metaConflicts = merged.conflicts\n }\n\n resourcesById.set(resourceId, {\n ...existing,\n ownerFields,\n meta,\n metaOrigin,\n metaConflicts,\n })\n } else {\n resourcesById.set(resourceId, {\n resourceId,\n // Use a simple identifier string for now; may evolve into a structured form based on key rules.\n keySelector: `StateTrait.source@${fieldPath}`,\n ownerFields: [fieldPath],\n meta: resourceMeta,\n metaOrigin: resourceMeta ? fieldPath : undefined,\n })\n }\n\n planSteps.push({\n id: `source:${fieldPath}`,\n kind: 'source-refresh',\n targetFieldPath: fieldPath,\n resourceId,\n keySelectorId: `StateTrait.source@${fieldPath}`,\n })\n\n const deps = (entry.meta as any).deps as ReadonlyArray<string> | undefined\n if (deps) {\n for (const dep of deps) {\n ensureField(dep)\n edges.push({\n id: `source-dep:${dep}->${fieldPath}`,\n from: dep,\n to: fieldPath,\n kind: 'source-dep',\n })\n }\n }\n } else if (entry.kind === 'externalStore') {\n planSteps.push({\n id: `external-store:${fieldPath}`,\n kind: 'external-store-sync',\n targetFieldPath: fieldPath,\n })\n } else if (entry.kind === 'check') {\n planSteps.push({\n id: `check:${fieldPath}`,\n kind: 'check-validate',\n targetFieldPath: fieldPath,\n })\n\n // If the rule explicitly declares deps, add Graph edges (for ReverseClosure scoped validate).\n if (trait.deps.length > 0) {\n for (const dep of trait.deps) {\n ensureField(dep)\n edges.push({\n id: `check-dep:${dep}->${fieldPath}`,\n from: dep,\n to: fieldPath,\n kind: 'check-dep',\n })\n }\n }\n }\n }\n\n for (const field of fieldMap.values()) {\n nodes.push({\n id: field.id,\n field,\n traits: field.traits,\n meta: nodeMetaByFieldPath.get(field.id),\n })\n }\n\n const graph: StateTraitGraph = {\n _tag: 'StateTraitGraph',\n nodes,\n edges,\n resources: Array.from(resourcesById.values()),\n }\n\n const plan: StateTraitPlan = {\n _tag: 'StateTraitPlan',\n steps: planSteps,\n }\n\n return { graph, plan }\n}\n\n/**\n * Performs a simple cycle detection for link edges.\n *\n * - Only considers edges with kind = 'link'; computed/source do not participate in the first version.\n * - On cycle detection, throws an error with path context to avoid infinite updates at runtime.\n */\nconst assertNoLinkCycles = (edges: ReadonlyArray<StateTraitGraphEdge>): void => {\n const adjacency = new Map<string, string[]>()\n\n for (const edge of edges) {\n if (edge.kind !== 'link') continue\n const list = adjacency.get(edge.from) ?? []\n list.push(edge.to)\n adjacency.set(edge.from, list)\n }\n\n const visited = new Set<string>()\n const stack = new Set<string>()\n\n const dfs = (node: string): void => {\n if (stack.has(node)) {\n throw new Error(\n `[StateTrait.build] link cycle detected at field \"${node}\". ` +\n 'Please check link traits for circular dependencies.',\n )\n }\n if (visited.has(node)) return\n visited.add(node)\n stack.add(node)\n\n const nexts = adjacency.get(node)\n if (nexts) {\n for (const to of nexts) {\n dfs(to)\n }\n }\n\n stack.delete(node)\n }\n\n for (const node of adjacency.keys()) {\n if (!visited.has(node)) {\n dfs(node)\n }\n }\n}\n\nconst collectSchemaPaths = (\n entries: ReadonlyArray<StateTraitEntry<any, string>>,\n): ReadonlyArray<StateTraitSchemaPathRef> => {\n const byKey = new Map<string, StateTraitSchemaPathRef>()\n\n const add = (ref: StateTraitSchemaPathRef): void => {\n if (!ref.path) return\n const k = `${ref.kind}|${ref.entryKind}|${ref.entryFieldPath}|${ref.ruleName ?? ''}|${ref.path}`\n byKey.set(k, ref)\n }\n\n const getCheckWritebackPath = (entry: Extract<StateTraitEntry<any, string>, { readonly kind: 'check' }>): string => {\n const wb = (entry.meta as any)?.writeback\n const p = wb && typeof wb === 'object' ? (wb as any).path : undefined\n const writebackPath = typeof p === 'string' && p.startsWith('errors.') ? p : undefined\n\n if (writebackPath) return writebackPath\n\n const fieldPath = entry.fieldPath\n if (fieldPath.endsWith('[]')) {\n return `errors.${fieldPath.slice(0, -2)}`\n }\n return `errors.${fieldPath}`\n }\n\n for (const entry of entries) {\n add({\n kind: 'fieldPath',\n entryKind: entry.kind,\n entryFieldPath: entry.fieldPath,\n path: entry.fieldPath,\n })\n\n if (entry.kind === 'computed' || entry.kind === 'source') {\n const deps = ((entry.meta as any)?.deps ?? []) as ReadonlyArray<string>\n for (const dep of deps) {\n add({\n kind: 'dep',\n entryKind: entry.kind,\n entryFieldPath: entry.fieldPath,\n path: dep,\n })\n }\n }\n\n if (entry.kind === 'link') {\n add({\n kind: 'link_from',\n entryKind: 'link',\n entryFieldPath: entry.fieldPath,\n path: entry.meta.from as string,\n })\n }\n\n if (entry.kind === 'check') {\n add({\n kind: 'check_writeback',\n entryKind: 'check',\n entryFieldPath: entry.fieldPath,\n path: getCheckWritebackPath(entry),\n })\n\n const rules = ((entry.meta as any)?.rules ?? {}) as Record<string, any>\n for (const name of Object.keys(rules)) {\n const rule = rules[name]\n if (!rule || typeof rule !== 'object') continue\n const deps = (rule.deps ?? []) as ReadonlyArray<string>\n for (const dep of deps) {\n add({\n kind: 'dep',\n entryKind: 'check',\n entryFieldPath: entry.fieldPath,\n ruleName: name,\n path: dep,\n })\n }\n }\n }\n }\n\n return Array.from(byKey.entries())\n .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))\n .map(([, v]) => v)\n}\n\n/**\n * Builds a StateTraitProgram from the given stateSchema and trait spec.\n *\n * - Pure function: does not depend on external Env / global state.\n * - Current implementation focuses on:\n * - Normalizing Spec into entries.\n * - Building a lightweight Graph / Plan from entries.\n * - Running basic cycle detection for link edges.\n *\n * If we later need finer-grained dependency analysis (e.g. static analysis for computed/key),\n * evolve it inside this module without changing the public API surface.\n */\nexport const build = <S extends object>(\n stateSchema: Schema.Schema<S>,\n spec: StateTraitSpec<S>,\n): StateTraitProgram<S> => {\n const entries = normalizeSpec(spec) as ReadonlyArray<StateTraitEntry<S, string>>\n const nodeMetaByFieldPath = collectNodeMeta(spec)\n\n // Phase 4 (US2): require explicit deps (Graph/diagnostics/replay treat deps as the single dependency source of truth).\n for (const entry of entries) {\n if (entry.kind === 'computed') {\n const deps = (entry.meta as any).deps as ReadonlyArray<string> | undefined\n if (deps === undefined) {\n throw new Error(\n `[StateTrait.build] Missing explicit deps for computed \"${entry.fieldPath}\". ` +\n 'Please use StateTrait.computed({ deps: [...], get: ... }).',\n )\n }\n }\n if (entry.kind === 'source') {\n const deps = (entry.meta as any).deps as ReadonlyArray<string> | undefined\n if (deps === undefined) {\n throw new Error(\n `[StateTrait.build] Missing explicit deps for source \"${entry.fieldPath}\". ` +\n 'Please provide meta.deps for StateTrait.source({ deps: [...], ... }).',\n )\n }\n }\n if (entry.kind === 'check') {\n const rules = ((entry.meta as any)?.rules ?? {}) as Record<string, any>\n for (const name of Object.keys(rules)) {\n const rule = rules[name]\n if (typeof rule === 'function' || !rule || typeof rule !== 'object') {\n throw new Error(\n `[StateTrait.build] Missing explicit deps for check \"${entry.fieldPath}\" rule \"${name}\". ` +\n 'Please use { deps: [...], validate: ... } form.',\n )\n }\n if ((rule as any).deps === undefined) {\n throw new Error(\n `[StateTrait.build] Missing explicit deps for check \"${entry.fieldPath}\" rule \"${name}\". ` +\n 'Please provide deps: [...].',\n )\n }\n }\n }\n }\n\n const { graph, plan } = buildGraph(entries, nodeMetaByFieldPath)\n\n // Run a cycle check for link edges to avoid obvious configuration errors.\n assertNoLinkCycles(graph.edges)\n\n return {\n stateSchema,\n spec,\n entries: entries as ReadonlyArray<StateTraitEntry<any, string>>,\n graph,\n plan,\n convergeIr: buildConvergeIr(stateSchema as any, entries as ReadonlyArray<StateTraitEntry<any, string>>),\n schemaPaths: collectSchemaPaths(entries as ReadonlyArray<StateTraitEntry<any, string>>),\n }\n}\n","import type { JsonValue } from '../observability/jsonValue.js'\n\nexport type TraitMeta = Readonly<{\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 /**\n * Extension annotations: only accepts `x-*` keys (anchors for capabilities like Phantom Source / Drift Detection).\n *\n * Constraints:\n * - Must be serializable (JSON values).\n * - Must be slim (keep only a few key hints; don't stuff large objects).\n */\n readonly annotations?: Readonly<Record<string, JsonValue>>\n /**\n * Semantic hint: when the same entity (e.g. the same resourceId) has multiple inconsistent meta declarations,\n * the one with canonical=true becomes the \"display canonical\", and others are recorded as conflicts.\n */\n readonly canonical?: boolean\n}>\n\nexport type TraitMetaSanitizeReport = Readonly<{\n /**\n * invalidInput:\n * - Input was not a plain object (e.g. string/array/function/etc).\n */\n readonly invalidInput?: boolean\n /**\n * unknownKeys:\n * - Top-level keys that are ignored (not part of TraitMeta, and not `x-*` legacy annotations).\n */\n readonly unknownKeys?: ReadonlyArray<string>\n readonly unknownKeyCount?: number\n /**\n * droppedKeys:\n * - Known keys that exist but are dropped due to invalid value type (e.g. tags is not string/array).\n */\n readonly droppedKeys?: ReadonlyArray<string>\n /**\n * droppedTagItems:\n * - Number of non-string/empty tag items dropped during normalization.\n */\n readonly droppedTagItems?: number\n /**\n * annotations:\n * - Only accepts `x-*` keys; invalid keys/values are dropped.\n */\n readonly ignoredAnnotationKeys?: ReadonlyArray<string>\n readonly ignoredAnnotationKeyCount?: number\n readonly droppedAnnotationKeys?: ReadonlyArray<string>\n readonly droppedAnnotationKeyCount?: number\n readonly droppedAnnotationValues?: number\n readonly droppedAnnotationNonSerializable?: number\n readonly droppedAnnotationDepthExceeded?: number\n readonly droppedAnnotationNonFiniteNumber?: number\n}>\n\nexport type TraitMetaConflict = Readonly<{\n readonly origin: string\n readonly meta: TraitMeta\n}>\n\nconst uniqSortedStrings = (input: ReadonlyArray<string>): ReadonlyArray<string> => {\n const set = new Set<string>()\n for (const item of input) {\n const v = item.trim()\n if (!v) continue\n set.add(v)\n }\n return Array.from(set).sort()\n}\n\nconst isPlainRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\ntype SanitizeJsonValueStats = {\n dropped: number\n nonSerializable: number\n depthExceeded: number\n nonFiniteNumber: number\n}\n\nconst sanitizeJsonValue = (input: unknown, depth: number, stats: SanitizeJsonValueStats): JsonValue | undefined => {\n if (input === null) return null\n\n if (typeof input === 'string') return input\n if (typeof input === 'boolean') return input\n if (typeof input === 'number') {\n if (!Number.isFinite(input)) {\n stats.dropped += 1\n stats.nonSerializable += 1\n stats.nonFiniteNumber += 1\n return undefined\n }\n return input\n }\n\n if (depth >= 6) {\n stats.dropped += 1\n stats.depthExceeded += 1\n return undefined\n }\n\n if (Array.isArray(input)) {\n const out: Array<JsonValue> = []\n for (const item of input) {\n const v = sanitizeJsonValue(item, depth + 1, stats)\n if (v !== undefined) out.push(v)\n }\n return out\n }\n\n if (isPlainRecord(input)) {\n const keys = Object.keys(input).sort()\n const out: Record<string, JsonValue> = {}\n for (const key of keys) {\n const v = sanitizeJsonValue(input[key], depth + 1, stats)\n if (v !== undefined) out[key] = v\n }\n return out\n }\n\n stats.dropped += 1\n stats.nonSerializable += 1\n return undefined\n}\n\nconst pushSample = (target: Array<string>, value: string, limit: number): void => {\n if (target.length >= limit) return\n target.push(value)\n}\n\nexport const sanitizeWithReport = (input: unknown): Readonly<{\n readonly meta?: TraitMeta\n readonly report?: TraitMetaSanitizeReport\n}> => {\n if (input === null || input === undefined) return {}\n if (typeof input !== 'object' || Array.isArray(input)) {\n return { report: { invalidInput: true } }\n }\n\n const record = input as Record<string, unknown>\n const out: Record<string, unknown> = {}\n\n const reportUnknownKeys: Array<string> = []\n let unknownKeyCount = 0\n const reportDroppedKeys: Array<string> = []\n let droppedTagItems = 0\n\n const reportIgnoredAnnotationKeys: Array<string> = []\n let ignoredAnnotationKeyCount = 0\n const reportDroppedAnnotationKeys: Array<string> = []\n let droppedAnnotationKeyCount = 0\n const stats: SanitizeJsonValueStats = { dropped: 0, nonSerializable: 0, depthExceeded: 0, nonFiniteNumber: 0 }\n\n const allowed = new Set([\n 'label',\n 'description',\n 'group',\n 'docsUrl',\n 'cacheGroup',\n 'canonical',\n 'tags',\n 'annotations',\n ])\n\n for (const key of Object.keys(record)) {\n if (allowed.has(key) || key.startsWith('x-')) continue\n unknownKeyCount += 1\n pushSample(reportUnknownKeys, key, 8)\n }\n\n const pickString = (key: keyof TraitMeta): void => {\n const value = record[key as string]\n if (typeof value !== 'string') return\n const trimmed = value.trim()\n if (!trimmed) return\n out[key] = trimmed\n }\n\n pickString('label')\n pickString('description')\n pickString('group')\n pickString('docsUrl')\n pickString('cacheGroup')\n\n const canonical = record.canonical\n if (canonical !== undefined && canonical !== null && typeof canonical !== 'boolean') {\n pushSample(reportDroppedKeys, 'canonical', 8)\n } else if (typeof canonical === 'boolean') {\n out.canonical = canonical\n }\n\n const tagsRaw = record.tags\n if (typeof tagsRaw === 'string') {\n const tags = uniqSortedStrings([tagsRaw])\n if (tags.length > 0) out.tags = tags\n } else if (Array.isArray(tagsRaw)) {\n const raw = tagsRaw.filter((x): x is string => typeof x === 'string')\n droppedTagItems += tagsRaw.length - raw.length\n const tags = uniqSortedStrings(raw)\n if (tags.length > 0) out.tags = tags\n // count empty/whitespace tags dropped by uniqSortedStrings\n droppedTagItems += raw.length - tags.length\n } else if (tagsRaw !== undefined && tagsRaw !== null) {\n pushSample(reportDroppedKeys, 'tags', 8)\n }\n\n const annotations: Record<string, JsonValue> = {}\n\n // legacy: allow passing `x-*` keys at the top-level (untyped input), then normalize into `annotations`.\n const annotationKeys = Object.keys(record)\n .filter((k) => k.startsWith('x-'))\n .sort()\n for (const key of annotationKeys) {\n const v = sanitizeJsonValue(record[key], 0, stats)\n if (v !== undefined) {\n annotations[key] = v\n } else {\n droppedAnnotationKeyCount += 1\n pushSample(reportDroppedAnnotationKeys, key, 8)\n }\n }\n\n // preferred: typed `annotations` field (only accepts `x-*` keys).\n const annotationsRaw = record.annotations\n if (annotationsRaw !== undefined && annotationsRaw !== null && !isPlainRecord(annotationsRaw)) {\n pushSample(reportDroppedKeys, 'annotations', 8)\n } else if (isPlainRecord(annotationsRaw)) {\n const keys = Object.keys(annotationsRaw)\n .sort()\n for (const key of keys) {\n if (!key.startsWith('x-')) {\n ignoredAnnotationKeyCount += 1\n pushSample(reportIgnoredAnnotationKeys, key, 8)\n continue\n }\n\n const v = sanitizeJsonValue(annotationsRaw[key], 0, stats)\n if (v !== undefined) {\n annotations[key] = v\n } else {\n droppedAnnotationKeyCount += 1\n pushSample(reportDroppedAnnotationKeys, key, 8)\n }\n }\n }\n\n if (Object.keys(annotations).length > 0) out.annotations = annotations\n\n // Dropped keys for invalid string fields (only track invalid types; empty string is ignored as low-signal).\n for (const key of ['label', 'description', 'group', 'docsUrl', 'cacheGroup'] as const) {\n const value = record[key]\n if (value !== undefined && value !== null && typeof value !== 'string') {\n pushSample(reportDroppedKeys, key, 8)\n }\n }\n\n const meta = Object.keys(out).length > 0 ? (out as TraitMeta) : undefined\n\n const report: TraitMetaSanitizeReport | undefined = (() => {\n const hasUnknownKeys = unknownKeyCount > 0\n const hasDroppedKeys = reportDroppedKeys.length > 0\n const hasDroppedTagItems = droppedTagItems > 0\n const hasIgnoredAnnotationKeys = ignoredAnnotationKeyCount > 0\n const hasDroppedAnnotations = droppedAnnotationKeyCount > 0 || stats.dropped > 0\n\n if (\n !hasUnknownKeys &&\n !hasDroppedKeys &&\n !hasDroppedTagItems &&\n !hasIgnoredAnnotationKeys &&\n !hasDroppedAnnotations\n ) {\n return undefined\n }\n\n return {\n ...(hasUnknownKeys ? { unknownKeys: reportUnknownKeys, unknownKeyCount } : {}),\n ...(hasDroppedKeys ? { droppedKeys: uniqSortedStrings(reportDroppedKeys) } : {}),\n ...(hasDroppedTagItems ? { droppedTagItems } : {}),\n ...(hasIgnoredAnnotationKeys\n ? { ignoredAnnotationKeys: uniqSortedStrings(reportIgnoredAnnotationKeys), ignoredAnnotationKeyCount }\n : {}),\n ...(hasDroppedAnnotations\n ? {\n droppedAnnotationKeys: uniqSortedStrings(reportDroppedAnnotationKeys),\n droppedAnnotationKeyCount,\n droppedAnnotationValues: stats.dropped,\n droppedAnnotationNonSerializable: stats.nonSerializable,\n droppedAnnotationDepthExceeded: stats.depthExceeded,\n droppedAnnotationNonFiniteNumber: stats.nonFiniteNumber,\n }\n : {}),\n } satisfies TraitMetaSanitizeReport\n })()\n\n return report ? { meta, report } : { meta }\n}\n\nexport const sanitize = (input: unknown): TraitMeta | undefined => sanitizeWithReport(input).meta\n\nconst stableStringify = (meta: TraitMeta): string => {\n const out: Record<string, unknown> = {}\n const keys = Object.keys(meta).sort()\n for (const k of keys) {\n out[k] = (meta as any)[k]\n }\n return JSON.stringify(out)\n}\n\nexport const equals = (a: TraitMeta | undefined, b: TraitMeta | undefined): boolean => {\n if (a === b) return true\n if (!a || !b) return false\n return stableStringify(a) === stableStringify(b)\n}\n\nexport type CanonicalMergeInput = Readonly<{\n readonly meta?: TraitMeta\n readonly origin?: string\n readonly conflicts?: ReadonlyArray<TraitMetaConflict>\n}>\n\nexport type CanonicalMergeResult = Readonly<{\n readonly meta?: TraitMeta\n readonly origin?: string\n readonly conflicts?: ReadonlyArray<TraitMetaConflict>\n}>\n\nexport const mergeCanonical = (\n current: CanonicalMergeInput,\n incoming: Readonly<{ readonly origin: string; readonly meta: TraitMeta }>,\n): CanonicalMergeResult => {\n const existing = current.meta\n if (!existing) {\n return {\n meta: incoming.meta,\n origin: incoming.origin,\n conflicts: current.conflicts,\n }\n }\n\n if (equals(existing, incoming.meta)) {\n return current\n }\n\n const conflicts: Array<TraitMetaConflict> = [...((current.conflicts ?? []) as ReadonlyArray<TraitMetaConflict>)]\n\n const push = (conflict: TraitMetaConflict): void => {\n const exists = conflicts.some((c) => c.origin === conflict.origin && equals(c.meta, conflict.meta))\n if (!exists) conflicts.push(conflict)\n }\n\n const existingCanonical = existing.canonical === true\n const incomingCanonical = incoming.meta.canonical === true\n\n if (!existingCanonical && incomingCanonical) {\n push({\n origin: current.origin ?? 'unknown',\n meta: existing,\n })\n return {\n meta: incoming.meta,\n origin: incoming.origin,\n conflicts,\n }\n }\n\n push({\n origin: incoming.origin,\n meta: incoming.meta,\n })\n\n return {\n meta: existing,\n origin: current.origin ?? incoming.origin,\n conflicts,\n }\n}\n","import type { Schema } from 'effect'\nimport type { StateAtPath, StateFieldPath } from './field-path.js'\nimport type { DirtyAllReason } from '../field-path.js'\nimport * as Meta from './meta.js'\nimport type { ConvergeStaticIrRegistry } from './converge-ir.js'\nimport type { ConvergeExecIr } from './converge-exec-ir.js'\n\n// StateTrait core model.\n// Keep the field semantics aligned with data-model.md / references/state-trait-core.md.\n\n/**\n * StateTraitSpec<S>:\n * - The standard shape for the `traits` slot in a Module blueprint.\n * - Keys are constrained by StateFieldPath<S>; values are declarations for the corresponding scope (Entry / Node / List).\n */\nexport type StateTraitSpec<S> = S extends object\n ? {\n [Path in StateFieldPath<S> | '$root']?: StateTraitSpecValue<S, Path>\n }\n : never\n\nexport type StateTraitKind = 'computed' | 'source' | 'link' | 'externalStore' | 'check'\n\nexport type TraitLane = 'urgent' | 'nonUrgent'\n\n/**\n * TraitConvergeScheduling:\n * - Scheduling semantics for converge/dirty-check (043): decides whether a step must converge within each transaction window.\n * - Default `immediate` (keeps legacy behavior); `deferred` takes effect only with explicit declaration + time-slicing enabled.\n */\nexport type TraitConvergeScheduling = 'immediate' | 'deferred'\n\nexport interface ComputedMeta<S, P> {\n /**\n * Explicit dependency field paths (required):\n *\n * - deps is the single source of truth for dependencies: Graph/ReverseClosure/incremental scheduling/perf optimizations rely on deps only.\n * - In the DSL, `StateTrait.computed({ deps, get })` uses deps-as-args; it does not expose `(state) => ...`.\n * - During build, `get(...depsValues)` is lowered into `derive(state)` for runtime execution, but the dependency read-set remains deps-based.\n * - In dev-mode, if actual reads in `derive(state)` disagree with deps, a `deps_mismatch` diagnostic warning is emitted.\n *\n * - For root scope: deps are StateFieldPath<State>.\n * - For list.item scope: deps are StateFieldPath<Item> (relative paths; build will prefix them).\n */\n readonly deps: ReadonlyArray<StateFieldPath<S>>\n readonly derive: (state: Readonly<S>) => StateAtPath<S, P>\n /**\n * Optional: equality predicate (used to skip no-op writebacks).\n */\n readonly equals?: (prev: StateAtPath<S, P>, next: StateAtPath<S, P>) => boolean\n /**\n * Converge scheduling (043): defaults to immediate.\n */\n readonly scheduling?: TraitConvergeScheduling\n}\n\nexport interface SourceMeta<S, P> {\n readonly deps: ReadonlyArray<StateFieldPath<S>>\n /**\n * Logical resource identifier (e.g. \"user/profile\").\n *\n * - In the StateTrait.source DSL, `resource` is stored here during build.\n * - data-model.md calls it resourceId; we keep the DSL naming here to avoid confusion.\n */\n readonly resource: string\n /**\n * Rule for computing the key required to access the resource.\n *\n * - deps is the single source of truth for dependencies: Graph/ReverseClosure/incremental scheduling/perf optimizations rely on deps only.\n * - In the DSL, `StateTrait.source({ deps, key })` uses deps-as-args; it does not expose `(state) => ...`.\n * - During build, `key(...depsValues)` is lowered into `key(state)` for runtime execution, but the dependency read-set remains deps-based.\n *\n * - Returning undefined means the resource is inactive under the current state (should be recycled to idle).\n */\n readonly key: (state: Readonly<S>) => unknown\n readonly triggers?: ReadonlyArray<'onMount' | 'onKeyChange' | 'manual'>\n readonly debounceMs?: number\n readonly concurrency?: 'switch' | 'exhaust-trailing'\n /**\n * Serializable metadata for devtools/docs (whitelisted fields).\n */\n readonly meta?: Meta.TraitMeta\n /**\n * Reserved: build may populate the field path this trait is attached to, for easier debugging.\n */\n readonly _fieldPath?: P\n}\n\nexport interface LinkMeta<S> {\n /**\n * Source field path (also constrained by StateFieldPath<S>).\n */\n readonly from: StateFieldPath<S>\n /**\n * Converge scheduling (043): defaults to immediate.\n */\n readonly scheduling?: TraitConvergeScheduling\n}\n\nexport interface ExternalStoreLike<T> {\n readonly getSnapshot: () => T\n readonly getServerSnapshot?: () => T\n readonly subscribe: (listener: () => void) => () => void\n}\n\nexport interface ExternalStoreMeta<S, P, T = unknown> {\n readonly store: ExternalStoreLike<T>\n readonly select?: (snapshot: T) => StateAtPath<S, P>\n readonly equals?: (prev: StateAtPath<S, P>, next: StateAtPath<S, P>) => boolean\n readonly coalesceWindowMs?: number\n readonly priority?: TraitLane\n readonly meta?: Meta.TraitMeta\n readonly _fieldPath?: P\n}\n\nexport type CheckRule<Input = unknown, Ctx = unknown> = {\n readonly deps: ReadonlyArray<string>\n /**\n * validateOn:\n * - Affects only auto validation phases (onChange/onBlur); submit/manual always run.\n * - Empty array disables auto validation (only submit/manual run).\n */\n readonly validateOn?: ReadonlyArray<'onChange' | 'onBlur'>\n readonly validate: (input: Input, ctx: Ctx) => unknown\n readonly meta?: Meta.TraitMeta\n}\n\nexport interface CheckMeta<Input = unknown, Ctx = unknown> {\n /**\n * Named rule set (used for deterministic merge and diagnostics display).\n */\n readonly rules: Readonly<Record<string, CheckRule<Input, Ctx>>>\n /**\n * Error-tree writeback (Phase 2: structure only; concrete writeback semantics land in later phases).\n */\n readonly writeback?: {\n readonly kind: 'errors'\n readonly path?: string\n }\n}\n\n/**\n * StateTraitEntry<S, P>:\n * - A single Trait configuration attached to a field path P.\n * - kind and meta always come together and are used to dispatch behavior during build/install.\n */\nexport type StateTraitEntry<S = unknown, P extends string = StateFieldPath<S>> =\n | {\n readonly fieldPath: P\n readonly kind: 'computed'\n readonly meta: ComputedMeta<S, P>\n }\n | {\n readonly fieldPath: P\n readonly kind: 'source'\n readonly meta: SourceMeta<S, P>\n }\n | {\n readonly fieldPath: P\n readonly kind: 'link'\n readonly meta: LinkMeta<S>\n }\n | {\n readonly fieldPath: P\n readonly kind: 'externalStore'\n readonly meta: ExternalStoreMeta<S, P>\n }\n | {\n readonly fieldPath: P\n readonly kind: 'check'\n readonly meta: CheckMeta<unknown, unknown>\n }\n\nexport interface StateTraitNode<Input = unknown, Ctx = unknown> {\n readonly _tag: 'StateTraitNode'\n readonly computed?: StateTraitEntry<Input, any> | Readonly<Record<string, StateTraitEntry<Input, any>>>\n readonly source?: StateTraitEntry<Input, any> | Readonly<Record<string, StateTraitEntry<Input, any>>>\n readonly link?: StateTraitEntry<Input, any> | Readonly<Record<string, StateTraitEntry<Input, any>>>\n readonly externalStore?: StateTraitEntry<Input, any> | Readonly<Record<string, StateTraitEntry<Input, any>>>\n readonly check?: Readonly<Record<string, CheckRule<Input, Ctx>>>\n readonly meta?: Meta.TraitMeta\n}\n\nexport interface StateTraitList<Item = unknown> {\n readonly _tag: 'StateTraitList'\n readonly item?: StateTraitNode<Item, any>\n readonly list?: StateTraitNode<ReadonlyArray<Item>, any>\n readonly identityHint?: {\n readonly trackBy?: string\n }\n}\n\nexport type StateTraitSpecValue<S, P extends string> =\n | StateTraitEntry<S, P>\n | StateTraitNode<any, any>\n | StateTraitList<any>\n\n/**\n * StateTraitField:\n * - Represents a field node in State (whether or not traits are attached).\n * - Normalized from StateTraitSpec during build.\n */\nexport interface StateTraitField {\n readonly id: string\n readonly path: string\n readonly displayName?: string\n readonly valueType?: string\n readonly traits: ReadonlyArray<StateTraitFieldTrait>\n}\n\n/**\n * StateTraitFieldTrait:\n * - A structured description of a field trait (computed / source / link).\n * - meta matches StateTraitEntry.meta; deps is the set of field paths this trait depends on.\n */\nexport interface StateTraitFieldTrait {\n readonly fieldId: string\n readonly kind: StateTraitKind\n readonly meta:\n | ComputedMeta<unknown, string>\n | SourceMeta<unknown, string>\n | LinkMeta<unknown>\n | ExternalStoreMeta<unknown, string>\n | CheckMeta<unknown, unknown>\n readonly deps: ReadonlyArray<string>\n}\n\n/**\n * StateTraitResource:\n * - Describes the logical resource metadata that a source trait depends on.\n * - Concrete ResourceSpec implementation lives in the Resource namespace; this keeps only trait-perspective dependency info.\n */\nexport interface StateTraitResource {\n readonly resourceId: string\n readonly keySelector: string\n readonly keyExample?: unknown\n readonly ownerFields: ReadonlyArray<string>\n readonly meta?: Meta.TraitMeta\n readonly metaOrigin?: string\n readonly metaConflicts?: ReadonlyArray<Meta.TraitMetaConflict>\n}\n\n/**\n * Graph Node / Edge:\n * - Nodes typically correspond to fields.\n * - Edges represent dependencies between fields, or between fields and resources.\n */\nexport interface StateTraitGraphNode {\n readonly id: string\n readonly field: StateTraitField\n readonly traits: ReadonlyArray<StateTraitFieldTrait>\n readonly meta?: Meta.TraitMeta\n}\n\nexport interface StateTraitGraphEdge {\n readonly id: string\n readonly from: string\n readonly to: string\n readonly kind: 'computed' | 'link' | 'source-dep' | 'check-dep'\n}\n\n/**\n * StateTraitGraph:\n * - Structural view of the StateTrait engine: a graph of nodes and dependency edges.\n * - Used by Devtools / Studio / Runtime for structural analysis and visualization.\n */\nexport interface StateTraitGraph {\n readonly _tag: 'StateTraitGraph'\n readonly nodes: ReadonlyArray<StateTraitGraphNode>\n readonly edges: ReadonlyArray<StateTraitGraphEdge>\n readonly resources: ReadonlyArray<StateTraitResource>\n readonly meta?: {\n readonly moduleId?: string\n readonly version?: string\n }\n}\n\n/**\n * StateTraitPlanStep:\n * - The smallest instruction unit used by StateTrait.install / Runtime execution.\n * - Derived from the graph; used at runtime to install watchers or trigger external calls.\n */\nexport interface StateTraitPlanStep {\n readonly id: string\n readonly kind: 'computed-update' | 'link-propagate' | 'source-refresh' | 'external-store-sync' | 'check-validate'\n readonly targetFieldPath?: string\n readonly sourceFieldPaths?: ReadonlyArray<string>\n readonly resourceId?: string\n readonly keySelectorId?: string\n readonly debugInfo?: {\n readonly graphNodeId?: string\n readonly graphEdgeId?: string\n }\n}\n\n/**\n * StateTraitPlan:\n * - Execution plan summarizing all trait behaviors for a module.\n * - install mounts behaviors onto Bound API / EffectOp pipelines according to the plan.\n */\nexport interface StateTraitPlan {\n readonly _tag: 'StateTraitPlan'\n readonly moduleId?: string\n readonly steps: ReadonlyArray<StateTraitPlanStep>\n readonly meta?: Record<string, unknown>\n}\n\nexport type StateTraitSchemaPathKind = 'fieldPath' | 'dep' | 'link_from' | 'check_writeback'\n\nexport interface StateTraitSchemaPathRef {\n readonly kind: StateTraitSchemaPathKind\n readonly entryKind: StateTraitKind\n readonly entryFieldPath: string\n readonly path: string\n readonly ruleName?: string\n}\n\n/**\n * StateTraitProgram<S>:\n * - Program output of the StateTrait engine; the unified entrypoint for Runtime / Devtools.\n * - stateSchema and spec preserve original inputs; graph/plan are internal IR.\n */\nexport interface StateTraitProgram<S> {\n readonly stateSchema: Schema.Schema<S>\n readonly spec: StateTraitSpec<S>\n /**\n * Program.entries:\n * - Minimal rule set normalized from spec (including node/list/$root) during build.\n * - Phase 2 focuses on a readable/diagnosable structure; later phases add execution and converge semantics.\n */\n readonly entries: ReadonlyArray<StateTraitEntry<any, string>>\n readonly graph: StateTraitGraph\n readonly plan: StateTraitPlan\n readonly convergeIr?: ConvergeStaticIrRegistry\n readonly convergeExecIr?: ConvergeExecIr\n /**\n * schemaPaths:\n * - Path references that must exist in stateSchema, collected from entries during build; dev-only diagnostics (e.g. schema_mismatch).\n * - When diagnostics=off, validation can be skipped entirely to keep near-zero cost.\n */\n readonly schemaPaths?: ReadonlyArray<StateTraitSchemaPathRef>\n}\n\n/**\n * Build a normalized entry list from StateTraitSpec.\n *\n * - Phase 2: supports structural expansion of node/list/$root and fills/prefixes fieldPath/deps when necessary.\n * - Later phases may extend validation here (e.g. detecting duplicates, override rules, etc.).\n */\nexport const normalizeSpec = <S>(spec: StateTraitSpec<S>): ReadonlyArray<StateTraitEntry<any, string>> => {\n const entries: Array<StateTraitEntry<any, string>> = []\n\n const isNode = (value: unknown): value is StateTraitNode<any, any> =>\n typeof value === 'object' && value !== null && (value as any)._tag === 'StateTraitNode'\n\n const isList = (value: unknown): value is StateTraitList<any> =>\n typeof value === 'object' && value !== null && (value as any)._tag === 'StateTraitList'\n\n const joinPath = (prefix: string, suffix: string): string => {\n if (!prefix) return suffix\n if (!suffix) return prefix\n return `${prefix}.${suffix}`\n }\n\n const prefixDeps = (deps: ReadonlyArray<string> | undefined, prefix: string): ReadonlyArray<string> => {\n if (!deps || deps.length === 0) return []\n return deps.map((d) => (prefix ? joinPath(prefix, d) : d))\n }\n\n const normalizeEntry = (\n entry: StateTraitEntry<any, string>,\n fieldPath: string,\n depPrefix: string,\n ): StateTraitEntry<any, string> => {\n if (entry.kind === 'computed') {\n const meta = entry.meta as any\n const rawDeps = meta.deps as ReadonlyArray<string> | undefined\n const deps = rawDeps !== undefined ? prefixDeps(rawDeps, depPrefix) : undefined\n return {\n ...(entry as any),\n fieldPath,\n meta: { ...meta, deps },\n }\n }\n if (entry.kind === 'source') {\n const meta = entry.meta as any\n const rawDeps = meta.deps as ReadonlyArray<string> | undefined\n const deps = rawDeps !== undefined ? prefixDeps(rawDeps, depPrefix) : undefined\n return {\n ...(entry as any),\n fieldPath,\n meta: { ...meta, deps, _fieldPath: fieldPath },\n }\n }\n if (entry.kind === 'externalStore') {\n const meta = entry.meta as any\n return {\n ...(entry as any),\n fieldPath,\n meta: { ...meta, _fieldPath: fieldPath },\n }\n }\n if (entry.kind === 'link') {\n const meta = entry.meta as any\n const from = prefixDeps([meta.from as string], depPrefix)[0] ?? meta.from\n return {\n ...(entry as any),\n fieldPath,\n meta: { ...meta, from },\n }\n }\n // check: Phase 2 adjusts fieldPath only; deps are still collected from meta.rules during build.\n return {\n ...(entry as any),\n fieldPath,\n }\n }\n\n const expandNode = (\n scopeId: string,\n joinPrefix: string,\n node: StateTraitNode<any, any>,\n options?: {\n /**\n * Prefix for check deps: default semantics for list-scope checks (deps are relative to a row item rather than the list root).\n *\n * - item scope: depsPrefix = `${listPath}[]` (matches joinPrefix).\n * - list scope: fieldPath = `${listPath}`, but depsPrefix should be `${listPath}[]`.\n */\n readonly checkDepsPrefix?: string\n },\n ): void => {\n const addEntry = (relativeTarget: string, raw: StateTraitEntry<any, string>): void => {\n const rel = (raw as any).fieldPath ?? relativeTarget\n const fieldPath = joinPrefix ? joinPath(joinPrefix, String(rel)) : String(rel)\n entries.push(normalizeEntry(raw, fieldPath, joinPrefix))\n }\n\n const expandMaybeRecord = (\n value: StateTraitEntry<any, any> | Readonly<Record<string, StateTraitEntry<any, any>>> | undefined,\n ): void => {\n if (!value) return\n if (typeof (value as any).kind === 'string') {\n addEntry('', value as any)\n return\n }\n const record = value as Readonly<Record<string, StateTraitEntry<any, any>>>\n for (const key in record) {\n if (!Object.prototype.hasOwnProperty.call(record, key)) continue\n const entry = record[key]\n if (!entry) continue\n addEntry(key, entry as any)\n }\n }\n\n expandMaybeRecord(node.computed)\n expandMaybeRecord(node.source)\n expandMaybeRecord(node.link)\n expandMaybeRecord(node.externalStore)\n\n if (node.check) {\n const rules: Record<string, CheckRule<any, any>> = {}\n const checkDepsPrefix = options?.checkDepsPrefix ?? (joinPrefix.endsWith('[]') ? joinPrefix : '')\n\n const prefixCheckDeps = (deps: ReadonlyArray<string> | undefined): ReadonlyArray<string> => {\n if (!deps || deps.length === 0) return []\n return deps.map((d) => (d === '' ? scopeId : checkDepsPrefix ? joinPath(checkDepsPrefix, d) : d))\n }\n for (const name of Object.keys(node.check)) {\n const rule = (node.check as any)[name] as CheckRule<any, any>\n if (typeof rule === 'function') {\n rules[name] = rule\n continue\n }\n if (rule && typeof rule === 'object') {\n const meta = Meta.sanitize((rule as any).meta)\n rules[name] = {\n ...rule,\n deps: prefixCheckDeps(rule.deps),\n meta,\n }\n continue\n }\n // Invalid input: ignore (later phases may promote this into a build-time config error).\n }\n\n entries.push({\n fieldPath: scopeId,\n kind: 'check',\n meta: {\n rules,\n writeback: { kind: 'errors' },\n },\n } as StateTraitEntry<any, any>)\n }\n }\n\n for (const key in spec) {\n if (!Object.prototype.hasOwnProperty.call(spec, key)) continue\n const raw = spec[key as keyof typeof spec] as StateTraitSpecValue<S, any> | undefined\n if (!raw) continue\n\n if (isList(raw)) {\n const listPath = key\n if (raw.item) {\n expandNode(`${listPath}[]`, `${listPath}[]`, raw.item)\n }\n if (raw.list) {\n expandNode(listPath, listPath, raw.list, {\n checkDepsPrefix: `${listPath}[]`,\n })\n }\n continue\n }\n\n if (isNode(raw)) {\n if (key === '$root') {\n expandNode('$root', '', raw)\n } else {\n expandNode(key, key, raw)\n }\n continue\n }\n\n const entry = raw as any as StateTraitEntry<any, string>\n const fieldPath = (entry as any).fieldPath ?? key\n entries.push(normalizeEntry(entry, String(fieldPath), ''))\n }\n\n return entries\n}\n\n/**\n * collectNodeMeta:\n * - Extract StateTraitNode.meta (whitelisted fields) from StateTraitSpec for devtools structural display.\n * - meta is for diagnostics/display only and does not participate in runtime semantics.\n */\nexport const collectNodeMeta = <S>(spec: StateTraitSpec<S>): ReadonlyMap<string, Meta.TraitMeta> => {\n const out = new Map<string, Meta.TraitMeta>()\n\n const isNode = (value: unknown): value is StateTraitNode<any, any> =>\n typeof value === 'object' && value !== null && (value as any)._tag === 'StateTraitNode'\n\n const isList = (value: unknown): value is StateTraitList<any> =>\n typeof value === 'object' && value !== null && (value as any)._tag === 'StateTraitList'\n\n const add = (scopeId: string, node: StateTraitNode<any, any>): void => {\n const meta = Meta.sanitize(node.meta)\n if (meta) out.set(scopeId, meta)\n }\n\n for (const key in spec) {\n if (!Object.prototype.hasOwnProperty.call(spec, key)) continue\n const raw = spec[key as keyof typeof spec] as StateTraitSpecValue<S, any> | undefined\n if (!raw) continue\n\n if (isList(raw)) {\n const listPath = key\n if (raw.item) add(`${listPath}[]`, raw.item)\n if (raw.list) add(listPath, raw.list)\n continue\n }\n\n if (isNode(raw)) {\n if (key === '$root') add('$root', raw)\n else add(key, raw)\n continue\n }\n }\n\n return out\n}\n\n// ---- Converge (013) evidence model ----\n\nexport type TraitConvergeRequestedMode = 'auto' | 'full' | 'dirty'\nexport type TraitConvergeExecutedMode = 'full' | 'dirty'\nexport type TraitConvergeOutcome = 'Converged' | 'Noop' | 'Degraded'\n\nexport type TraitConvergeConfigScope = 'provider' | 'runtime_module' | 'runtime_default' | 'builtin'\n\nexport type TraitConvergeReason =\n | 'cold_start'\n | 'fast_full'\n | 'inline_dirty'\n | 'cache_hit'\n | 'cache_miss'\n | 'budget_cutoff'\n | 'near_full'\n | 'unknown_write'\n | 'dirty_all'\n | 'generation_bumped'\n | 'low_hit_rate_protection'\n | 'module_override'\n | 'time_slicing_immediate'\n | 'time_slicing_deferred'\n\nexport interface TraitConvergeStepStats {\n readonly totalSteps: number\n readonly executedSteps: number\n readonly skippedSteps: number\n readonly changedSteps: number\n readonly affectedSteps?: number\n}\n\nexport interface TraitConvergeDirtySummary {\n readonly dirtyAll: boolean\n readonly reason?: DirtyAllReason\n readonly rootCount?: number\n readonly rootIds?: ReadonlyArray<number>\n readonly rootIdsTruncated?: boolean\n}\n\nexport interface TraitConvergePlanCacheEvidence {\n readonly capacity: number\n readonly size: number\n readonly hits: number\n readonly misses: number\n readonly evicts: number\n readonly hit: boolean\n readonly keySize?: number\n readonly missReason?: 'cold_start' | 'generation_bumped' | 'not_cached' | 'unknown'\n readonly disabled?: boolean\n readonly disableReason?: 'low_hit_rate' | 'generation_thrash' | 'manual_override' | 'unknown'\n}\n\nexport type TraitConvergeGenerationBumpReason =\n | 'writers_changed'\n | 'deps_changed'\n | 'logic_installed'\n | 'logic_uninstalled'\n | 'imports_changed'\n | 'unknown'\n\nexport interface TraitConvergeGenerationEvidence {\n readonly generation: number\n readonly generationBumpCount?: number\n readonly lastBumpReason?: TraitConvergeGenerationBumpReason\n}\n\nexport interface TraitConvergeStaticIrEvidence {\n readonly fieldPathCount: number\n readonly stepCount: number\n readonly buildDurationMs?: number\n}\n\nexport interface TraitConvergeHotspot {\n readonly kind?: string\n readonly stepId: number\n readonly outFieldPathId?: number\n readonly durationMs: number\n readonly changed: boolean\n}\n\nexport interface TraitConvergeTimeSlicingSummary {\n readonly scope: 'all' | 'immediate' | 'deferred'\n readonly immediateStepCount: number\n readonly deferredStepCount: number\n}\n\nexport interface TraitConvergeDiagnosticsSamplingSummary {\n /**\n * Deterministic sampling: use stable txnSeq as an anchor and sample every N transactions.\n * - sampled=true means this invocation captured per-step timings and produced hotspots.\n */\n readonly strategy: 'txnSeq_interval'\n readonly sampleEveryN: number\n readonly topK: number\n readonly sampled: boolean\n}\n\nexport interface TraitConvergeDecisionSummary {\n readonly requestedMode: TraitConvergeRequestedMode\n readonly executedMode: TraitConvergeExecutedMode\n readonly outcome: TraitConvergeOutcome\n readonly configScope: TraitConvergeConfigScope\n readonly staticIrDigest: string\n readonly executionBudgetMs: number\n readonly executionDurationMs: number\n readonly decisionBudgetMs?: number\n readonly decisionDurationMs?: number\n readonly reasons: ReadonlyArray<TraitConvergeReason>\n readonly stepStats: TraitConvergeStepStats\n readonly dirty?: TraitConvergeDirtySummary\n readonly cache?: TraitConvergePlanCacheEvidence\n readonly generation?: TraitConvergeGenerationEvidence\n readonly staticIr?: TraitConvergeStaticIrEvidence\n readonly timeSlicing?: TraitConvergeTimeSlicingSummary\n readonly thresholds?: { readonly floorRatio?: number }\n readonly diagnosticsSampling?: TraitConvergeDiagnosticsSamplingSummary\n readonly top3?: ReadonlyArray<TraitConvergeHotspot>\n}\n","/**\n * internal/digest:\n * - Minimal \"stable digest\" utilities for Runtime / Static IR / Traits, etc.\n * - Goal: stable output across runs/processes while staying lightweight (no extra dependencies).\n *\n * Note: stableStringify does not aim for full JSON equivalence; it only covers the subset needed by this repo:\n * - Stable key ordering (object fields sorted lexicographically).\n * - Non-finite numbers (NaN/±Infinity) degrade to null.\n * - Other non-representable values (undefined/function/symbol, etc.) degrade to null.\n * - undefined inside objects is not omitted; it is encoded as null (differs from JSON.stringify).\n */\n\nexport const stableStringify = (value: unknown): string => {\n if (value === null) return 'null'\n const t = typeof value\n if (t === 'string') return JSON.stringify(value)\n if (t === 'number') return Number.isFinite(value) ? String(value) : 'null'\n if (t === 'boolean') return value ? 'true' : 'false'\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`\n }\n\n if (t === 'object') {\n const record = value as Record<string, unknown>\n const keys = Object.keys(record).sort()\n return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(record[k])}`).join(',')}}`\n }\n\n return 'null'\n}\n\n/**\n * fnv1a32:\n * - 32-bit FNV-1a hash (for short digests); outputs fixed 8-char hex.\n */\nexport const fnv1a32 = (input: string): string => {\n let hash = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i)\n hash = (hash * 0x01000193) >>> 0\n }\n return hash.toString(16).padStart(8, '0')\n}\n","import type { FieldPath, FieldPathId, FieldPathIdRegistry } from '../field-path.js'\nimport { fnv1a32, stableStringify } from '../digest.js'\nimport type { StateTraitEntry, TraitConvergeScheduling } from './model.js'\n\nexport type ConvergeStepId = number\n\n/**\n * ConvergeStaticIrRegistry:\n * - Converge-only static IR generated during build/load (stable within a generation).\n * - Hot paths prefer integer-backed structures; keep only the necessary tables for evidence export and explainability.\n */\nexport interface ConvergeStaticIrRegistry {\n readonly generation: number\n /**\n * writerKey/depsKey:\n * - Used to determine \"structural changes\" of Converge Static IR (bump generation++ and invalidate strictly).\n * - Does not include generation itself.\n */\n readonly writersKey: string\n readonly depsKey: string\n /**\n * fieldPathsKey:\n * - Incorporates FieldPathId semantics (fieldPaths table) into the stable definition of staticIrDigest;\n * - Precomputed at build time to avoid repeatedly stringifying large tables at runtime.\n */\n readonly fieldPathsKey: string\n /**\n * staticIrDigest:\n * - Stable digest for this converge IR shape;\n * - Computed on cold build/register paths and reused by hot runtime paths.\n */\n readonly staticIrDigest: string\n readonly fieldPaths: ReadonlyArray<FieldPath>\n readonly fieldPathIdRegistry: FieldPathIdRegistry\n readonly configError?: {\n readonly code: 'CYCLE_DETECTED' | 'MULTIPLE_WRITERS'\n readonly message: string\n readonly fields: ReadonlyArray<string>\n }\n\n /**\n * stepsById:\n * - StepId -> writer entry (currently computed/link only).\n * - Numbered by topo order by default (so topoOrder is usually 0..stepCount-1).\n */\n readonly stepsById: ReadonlyArray<StateTraitEntry<any, string>>\n\n readonly stepOutFieldPathIdByStepId: ReadonlyArray<FieldPathId>\n readonly stepDepsFieldPathIdsByStepId: ReadonlyArray<ReadonlyArray<FieldPathId>>\n readonly stepSchedulingByStepId: ReadonlyArray<TraitConvergeScheduling>\n\n readonly topoOrder: ReadonlyArray<ConvergeStepId>\n readonly buildDurationMs: number\n}\n\nexport interface ConvergeStaticIrExport {\n readonly staticIrDigest: string\n readonly moduleId: string\n readonly instanceId: string\n readonly generation: number\n readonly fieldPaths: ReadonlyArray<FieldPath>\n readonly stepOutFieldPathIdByStepId: ReadonlyArray<number>\n readonly stepSchedulingByStepId: ReadonlyArray<TraitConvergeScheduling>\n readonly topoOrder?: ReadonlyArray<number>\n readonly buildDurationMs?: number\n}\n\n/**\n * ConvergeStaticIr digest (stable definition):\n * - Depends on the converge graph structural keys (writersKey/depsKey) and the FieldPathId table key (fieldPathsKey);\n * - Must not depend on instanceId/time/randomness;\n * - Enables aligning Static IR and integer mappings across runs/processes.\n */\nexport const getConvergeStaticIrDigest = (\n ir: Pick<ConvergeStaticIrRegistry, 'writersKey' | 'depsKey' | 'fieldPathsKey'> & { readonly staticIrDigest?: string },\n): string => {\n if (typeof ir.staticIrDigest === 'string' && ir.staticIrDigest.length > 0) {\n return ir.staticIrDigest\n }\n const hash = fnv1a32(\n stableStringify({ writersKey: ir.writersKey, depsKey: ir.depsKey, fieldPathsKey: ir.fieldPathsKey }),\n )\n return `converge_ir_v2:${hash}`\n}\n\nexport const exportConvergeStaticIr = (options: {\n readonly ir: ConvergeStaticIrRegistry\n readonly moduleId: string\n readonly instanceId: string\n}): ConvergeStaticIrExport => ({\n staticIrDigest: getConvergeStaticIrDigest(options.ir),\n moduleId: options.moduleId,\n instanceId: options.instanceId,\n generation: options.ir.generation,\n fieldPaths: options.ir.fieldPaths,\n stepOutFieldPathIdByStepId: Array.from(options.ir.stepOutFieldPathIdByStepId),\n stepSchedulingByStepId: options.ir.stepSchedulingByStepId.slice(),\n topoOrder: options.ir.topoOrder.slice(),\n buildDurationMs: options.ir.buildDurationMs,\n})\n","import { Effect } from 'effect'\nimport type { BoundApi } from '../runtime/core/module.js'\nimport { getBoundInternals } from '../runtime/core/runtimeInternalsAccessor.js'\nimport * as SourceRuntime from './source.js'\nimport * as ExternalStoreRuntime from './external-store.js'\nimport * as MetaDiagnostics from './meta-diagnostics.js'\nimport type {\n StateTraitProgram,\n StateTraitPlanStep,\n StateTraitEntry,\n TraitConvergeGenerationBumpReason,\n} from './model.js'\n\nconst buildEntryIndex = <S>(\n entries: ReadonlyArray<StateTraitEntry<S, string>>,\n): Map<string, Array<StateTraitEntry<S, string>>> => {\n const index = new Map<string, Array<StateTraitEntry<S, string>>>()\n for (const entry of entries) {\n const list = index.get(entry.fieldPath) ?? []\n list.push(entry)\n index.set(entry.fieldPath, list)\n }\n return index\n}\n\n/**\n * Install behaviors described by StateTraitProgram onto the given Bound API.\n *\n * - Phase 2 minimal implementation:\n * - Register watchers for computed fields: recompute target fields when State changes.\n * - Register watchers for link fields: sync target fields when source fields change.\n * - Reserve refresh entrypoints for source fields (no external calls yet).\n *\n * Notes:\n * - All watchers are installed via Bound API `$`, without directly depending on ModuleRuntime.\n * - Each PlanStep corresponds to a long-lived Effect and is mounted into the Runtime Scope via forkScoped.\n */\nexport const install = <S>(\n bound: BoundApi<any, any>,\n program: StateTraitProgram<S>,\n): Effect.Effect<void, never, any> => {\n return Effect.gen(function* () {\n // Register the program to Runtime first (the converge engine runs computed/link/check before txn commit).\n let internals: any | undefined\n try {\n internals = getBoundInternals(bound as any)\n ;(internals.traits.registerStateTraitProgram as any)(program, {\n bumpReason: 'logic_installed' as TraitConvergeGenerationBumpReason,\n })\n } catch {\n // no-op for legacy/mocked bound\n }\n\n if (internals) {\n yield* MetaDiagnostics.emitMetaSanitizeDiagnostics(program as any, {\n moduleId: internals.moduleId,\n instanceId: internals.instanceId,\n })\n }\n\n const entryIndex = buildEntryIndex(program.entries as any)\n\n const installStep = (step: StateTraitPlanStep): Effect.Effect<void, never, any> => {\n if (!step.targetFieldPath) {\n return Effect.void\n }\n\n if (step.kind !== 'source-refresh' && step.kind !== 'external-store-sync') {\n // computed/link/check are handled by the runtime core within the transaction window; install keeps only source.refresh/externalStore sync entrypoints.\n return Effect.void\n }\n\n const candidates = entryIndex.get(step.targetFieldPath)\n if (!candidates || candidates.length === 0) {\n // The plan references a missing spec: treat it as a build-time bug and ignore the step here.\n return Effect.void\n }\n\n const entry =\n step.kind === 'source-refresh'\n ? candidates.find((e) => e.kind === 'source')\n : candidates.find((e) => e.kind === 'externalStore')\n\n if (!entry) {\n return Effect.void\n }\n\n return step.kind === 'source-refresh'\n ? SourceRuntime.installSourceRefresh(bound, step, entry as any)\n : ExternalStoreRuntime.installExternalStoreSync(bound, step, entry as any)\n }\n\n yield* Effect.forEach(program.plan.steps, (step) => installStep(step)).pipe(Effect.asVoid)\n }).pipe(Effect.asVoid)\n}\n","import { Effect, Layer, ServiceMap } from 'effect'\nimport type { TraitConvergeRequestedMode } from '../../state-trait/model.js'\nimport type { ReadQueryStrictGateConfig } from './ReadQuery.js'\nimport { getGlobalHostScheduler, type HostScheduler } from './HostScheduler.js'\nimport { makeRuntimeStore, type RuntimeStore } from './RuntimeStore.js'\nimport { makeTickScheduler, type TickScheduler, type TickSchedulerConfig } from './TickScheduler.js'\nimport { makeDeclarativeLinkRuntime, type DeclarativeLinkRuntime } from './DeclarativeLinkRuntime.js'\n\n// Unified runtime env detection, avoiding bundlers inlining NODE_ENV at build time.\nexport const getNodeEnv = (): string | undefined => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const env = (globalThis as any)?.process?.env\n return typeof env?.NODE_ENV === 'string' ? env.NODE_ENV : undefined\n } catch {\n return undefined\n }\n}\n\nexport const isDevEnv = (): boolean => getNodeEnv() !== 'production'\n\nexport type StateTransactionInstrumentation = 'full' | 'light'\n\n/**\n * getDefaultStateTxnInstrumentation:\n * - Currently chooses default instrumentation by NODE_ENV:\n * - dev / test: full (keep patches and snapshots for debugging).\n * - production: light (keep minimal semantics to reduce overhead).\n * - May evolve with finer-grained overrides in Runtime.make / Module.make.\n */\nexport const getDefaultStateTxnInstrumentation = (): StateTransactionInstrumentation => (isDevEnv() ? 'full' : 'light')\n\n/**\n * Runtime-level StateTransaction config Service:\n * - Provided at the app layer by Logix.Runtime.make / AppRuntime.makeApp.\n * - ModuleRuntime.make can read runtime-level defaults from Env.\n *\n * Notes:\n * - instrumentation is only a runtime-level default.\n * - Explicit instrumentation in ModuleImpl / ModuleRuntimeOptions has higher priority.\n */\nexport interface StateTransactionRuntimeConfig {\n readonly instrumentation?: StateTransactionInstrumentation\n /**\n * StateTrait derived converge budget (ms):\n * - Exceeding the budget triggers a soft degrade (freeze derived fields, preserve base writes and 0/1 commit semantics).\n * - Default is 200ms (aligned with the 007 spec threshold).\n */\n readonly traitConvergeBudgetMs?: number\n /**\n * Auto-mode decision budget (ms):\n * - Only used during the decision phase when requestedMode=\"auto\".\n * - Exceeding the budget must immediately fall back to full (and record evidence).\n */\n readonly traitConvergeDecisionBudgetMs?: number\n /**\n * StateTrait converge scheduling strategy:\n * - full: full topo execution (current default; safest).\n * - dirty: minimal triggering based on dirtyPaths + deps in the txn window (requires accurate deps).\n */\n readonly traitConvergeMode?: TraitConvergeRequestedMode\n /**\n * 043: Trait converge time-slicing (explicit opt-in). Disabled by default.\n */\n readonly traitConvergeTimeSlicing?: TraitConvergeTimeSlicingPatch\n /**\n * 060: Txn Lanes (priority scheduling for transaction follow-up work). Enabled by default since 062.\n */\n readonly txnLanes?: TxnLanesPatch\n /**\n * Runtime-level per-module overrides (hotfix path):\n * - Only affects converge behavior for the specified moduleId.\n * - Lower priority than Provider overrides.\n */\n readonly traitConvergeOverridesByModuleId?: Readonly<Record<string, StateTransactionTraitConvergeOverrides>>\n /**\n * 060: Txn Lanes runtime_module overrides (hotfix / gradual tuning).\n * - Only affects the specified moduleId.\n * - Lower priority than Provider overrides.\n */\n readonly txnLanesOverridesByModuleId?: Readonly<Record<string, TxnLanesPatch>>\n}\n\nclass StateTransactionConfigTagImpl extends ServiceMap.Service<\n StateTransactionConfigTagImpl,\n StateTransactionRuntimeConfig\n>()('@logixjs/core/StateTransactionRuntimeConfig') {}\n\nexport const StateTransactionConfigTag = StateTransactionConfigTagImpl\n\nexport type ReadQueryStrictGateRuntimeConfig = ReadQueryStrictGateConfig\n\nclass ReadQueryStrictGateConfigTagImpl extends ServiceMap.Service<\n ReadQueryStrictGateConfigTagImpl,\n ReadQueryStrictGateRuntimeConfig\n>()('@logixjs/core/ReadQueryStrictGateRuntimeConfig') {}\n\nexport const ReadQueryStrictGateConfigTag = ReadQueryStrictGateConfigTagImpl\n\nexport type ReplayMode = 'live' | 'replay'\n\nexport interface ReplayModeConfig {\n readonly mode: ReplayMode\n}\n\nclass ReplayModeConfigTagImpl extends ServiceMap.Service<\n ReplayModeConfigTagImpl,\n ReplayModeConfig\n>()('@logixjs/core/ReplayModeConfig') {}\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 ServiceMap.Service<\n StateTransactionOverridesTagImpl,\n StateTransactionOverrides\n>()('@logixjs/core/StateTransactionOverrides') {}\n\nexport const StateTransactionOverridesTag = StateTransactionOverridesTagImpl\n\nexport type SchedulingPolicyLimit = number | 'unbounded'\nexport type ConcurrencyLimit = SchedulingPolicyLimit\n\nexport interface SchedulingPolicySurfacePatch {\n readonly concurrencyLimit?: SchedulingPolicyLimit\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 unified scheduling policy surface:\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 SchedulingPolicySurface extends SchedulingPolicySurfacePatch {\n readonly overridesByModuleId?: Readonly<Record<string, SchedulingPolicySurfacePatch>>\n}\n\nclass SchedulingPolicySurfaceTagImpl extends ServiceMap.Service<\n SchedulingPolicySurfaceTagImpl,\n SchedulingPolicySurface\n>()('@logixjs/core/SchedulingPolicySurface') {}\n\nexport const SchedulingPolicySurfaceTag = SchedulingPolicySurfaceTagImpl\n\n/**\n * Provider-scoped SchedulingPolicySurfaceOverrides (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 SchedulingPolicySurfaceOverrides extends SchedulingPolicySurfacePatch {\n readonly overridesByModuleId?: Readonly<Record<string, SchedulingPolicySurfacePatch>>\n}\n\nclass SchedulingPolicySurfaceOverridesTagImpl extends ServiceMap.Service<\n SchedulingPolicySurfaceOverridesTagImpl,\n SchedulingPolicySurfaceOverrides\n>()('@logixjs/core/SchedulingPolicySurfaceOverrides') {}\n\nexport const SchedulingPolicySurfaceOverridesTag = SchedulingPolicySurfaceOverridesTagImpl\n\n/**\n * Legacy aliases:\n * - Keep old names as pure aliases to support migration without behavior drift.\n * - Canonical naming for new code should use SchedulingPolicySurface*.\n */\nexport type ConcurrencyPolicyPatch = SchedulingPolicySurfacePatch\nexport type ConcurrencyPolicy = SchedulingPolicySurface\nexport type ConcurrencyPolicyOverrides = SchedulingPolicySurfaceOverrides\n\nexport const ConcurrencyPolicyTag = SchedulingPolicySurfaceTag\nexport const ConcurrencyPolicyOverridesTag = SchedulingPolicySurfaceOverridesTag\n\n// ---- 073: TickScheduler + RuntimeStore (injectable runtime services) ----\n\nexport interface RuntimeStoreService extends RuntimeStore {}\n\nexport class RuntimeStoreTag extends ServiceMap.Service<RuntimeStoreTag, RuntimeStoreService>()('@logixjs/core/RuntimeStore') {}\n\nexport const runtimeStoreLayer: Layer.Layer<any, never, never> = Layer.effect(\n RuntimeStoreTag,\n Effect.acquireRelease(\n Effect.sync(() => makeRuntimeStore() as RuntimeStoreService),\n (store) => Effect.sync(() => store.dispose()),\n ),\n) as Layer.Layer<any, never, never>\n\nexport const runtimeStoreTestStubLayer = (store: RuntimeStoreService): Layer.Layer<any, never, never> =>\n Layer.succeed(RuntimeStoreTag, store) as Layer.Layer<any, never, never>\n\nexport interface HostSchedulerService extends HostScheduler {}\n\nexport class HostSchedulerTag extends ServiceMap.Service<\n HostSchedulerTag,\n HostSchedulerService\n>()('@logixjs/core/HostScheduler') {}\n\nexport const hostSchedulerLayer: Layer.Layer<any, never, never> = Layer.succeed(\n HostSchedulerTag,\n getGlobalHostScheduler() as HostSchedulerService,\n) as Layer.Layer<any, never, never>\n\nexport const hostSchedulerTestStubLayer = (scheduler: HostSchedulerService): Layer.Layer<any, never, never> =>\n Layer.succeed(HostSchedulerTag, scheduler) as Layer.Layer<any, never, never>\n\nexport interface DeclarativeLinkRuntimeService extends DeclarativeLinkRuntime {}\n\nexport class DeclarativeLinkRuntimeTag extends ServiceMap.Service<\n DeclarativeLinkRuntimeTag,\n DeclarativeLinkRuntimeService\n>()('@logixjs/core/DeclarativeLinkRuntime') {}\n\nexport const declarativeLinkRuntimeLayer: Layer.Layer<any, never, never> = Layer.succeed(\n DeclarativeLinkRuntimeTag,\n makeDeclarativeLinkRuntime() as DeclarativeLinkRuntimeService,\n) as Layer.Layer<any, never, never>\n\nexport const declarativeLinkRuntimeTestStubLayer = (\n runtime: DeclarativeLinkRuntimeService,\n): Layer.Layer<any, never, never> => Layer.succeed(DeclarativeLinkRuntimeTag, runtime) as Layer.Layer<any, never, never>\n\nexport interface TickSchedulerService extends TickScheduler {}\n\nexport class TickSchedulerTag extends ServiceMap.Service<TickSchedulerTag, TickSchedulerService>()('@logixjs/core/TickScheduler') {}\n\nexport const tickSchedulerLayer = (config?: TickSchedulerConfig): Layer.Layer<any, never, never> =>\n Layer.effect(\n TickSchedulerTag,\n Effect.gen(function* () {\n const store = yield* Effect.service(RuntimeStoreTag).pipe(Effect.orDie)\n const declarativeLinkRuntime = yield* Effect.service(DeclarativeLinkRuntimeTag).pipe(Effect.orDie)\n const hostScheduler = yield* Effect.service(HostSchedulerTag).pipe(Effect.orDie)\n return makeTickScheduler({ runtimeStore: store, declarativeLinkRuntime, hostScheduler, config }) as TickSchedulerService\n }),\n ) as Layer.Layer<any, never, never>\n\nexport const tickSchedulerTestStubLayer = (scheduler: TickSchedulerService): Layer.Layer<any, never, never> =>\n Layer.succeed(TickSchedulerTag, scheduler) as Layer.Layer<any, never, never>\n","export type Cancel = () => void\n\nexport type HostScheduler = {\n readonly nowMs: () => number\n readonly scheduleMicrotask: (cb: () => void) => void\n readonly scheduleMacrotask: (cb: () => void) => Cancel\n readonly scheduleAnimationFrame: (cb: () => void) => Cancel\n readonly scheduleTimeout: (ms: number, cb: () => void) => Cancel\n}\n\nconst noopCancel: Cancel = () => {}\n\nconst safeNowMs = (): number => {\n const perf = (globalThis as any).performance as { now?: () => number } | undefined\n if (perf && typeof perf.now === 'function') {\n try {\n const v = perf.now()\n if (typeof v === 'number' && Number.isFinite(v)) return v\n } catch {\n // fallthrough\n }\n }\n\n return Date.now()\n}\n\nconst safeQueueMicrotask = (cb: () => void): void => {\n const qm = (globalThis as any).queueMicrotask as ((run: () => void) => void) | undefined\n if (typeof qm === 'function') {\n try {\n qm(cb)\n return\n } catch {\n // fallthrough\n }\n }\n\n // Promise job fallback (still a microtask boundary).\n try {\n Promise.resolve().then(cb)\n } catch {\n // last resort\n setTimeout(cb, 0)\n }\n}\n\nconst safeSetTimeout = (ms: number, cb: () => void): Cancel => {\n const id = setTimeout(cb, ms)\n return () => {\n try {\n clearTimeout(id)\n } catch {\n // best-effort\n }\n }\n}\n\nconst makeMessageChannelMacrotask = (): ((cb: () => void) => Cancel) | undefined => {\n const MC = (globalThis as any).MessageChannel as { new (): MessageChannel } | undefined\n if (typeof MC !== 'function') return undefined\n\n let channel: MessageChannel\n try {\n channel = new MC()\n } catch {\n return undefined\n }\n\n type Task = { canceled: boolean; cb: () => void }\n const queue: Array<Task> = []\n let scheduled = false\n\n const flush = (): void => {\n scheduled = false\n const tasks = queue.splice(0, queue.length)\n for (const t of tasks) {\n if (t.canceled) continue\n try {\n t.cb()\n } catch {\n // best-effort\n }\n }\n }\n\n try {\n channel.port1.onmessage = flush\n } catch {\n return undefined\n }\n\n const schedule = (cb: () => void): Cancel => {\n const task: Task = { canceled: false, cb }\n queue.push(task)\n if (!scheduled) {\n scheduled = true\n try {\n channel.port2.postMessage(undefined)\n } catch {\n scheduled = false\n // fallback to timeout if postMessage fails\n return safeSetTimeout(0, cb)\n }\n }\n return () => {\n task.canceled = true\n }\n }\n\n return schedule\n}\n\nconst makeSetImmediateMacrotask = (): ((cb: () => void) => Cancel) | undefined => {\n const si = (globalThis as any).setImmediate as ((run: () => void) => any) | undefined\n const ci = (globalThis as any).clearImmediate as ((id: any) => void) | undefined\n if (typeof si !== 'function') return undefined\n\n return (cb) => {\n let id: any\n try {\n id = si(cb)\n } catch {\n return safeSetTimeout(0, cb)\n }\n\n return () => {\n if (typeof ci !== 'function') return\n try {\n ci(id)\n } catch {\n // best-effort\n }\n }\n }\n}\n\nconst makeRaf = (): ((cb: () => void) => Cancel) | undefined => {\n const raf = (globalThis as any).requestAnimationFrame as ((run: () => void) => number) | undefined\n const cancel = (globalThis as any).cancelAnimationFrame as ((id: number) => void) | undefined\n if (typeof raf !== 'function') return undefined\n\n return (cb) => {\n let id: number\n try {\n id = raf(cb)\n } catch {\n return noopCancel\n }\n\n return () => {\n if (typeof cancel !== 'function') return\n try {\n cancel(id)\n } catch {\n // best-effort\n }\n }\n }\n}\n\nexport const makeDefaultHostScheduler = (): HostScheduler => {\n const macrotask =\n makeSetImmediateMacrotask() ??\n makeMessageChannelMacrotask() ??\n ((cb: () => void) => safeSetTimeout(0, cb))\n\n const raf = makeRaf()\n\n return {\n nowMs: safeNowMs,\n scheduleMicrotask: safeQueueMicrotask,\n scheduleMacrotask: macrotask,\n scheduleAnimationFrame: (cb) => raf?.(cb) ?? macrotask(cb),\n scheduleTimeout: safeSetTimeout,\n }\n}\n\nlet globalHostScheduler: HostScheduler | undefined\n\nexport const getGlobalHostScheduler = (): HostScheduler => {\n globalHostScheduler ??= makeDefaultHostScheduler()\n return globalHostScheduler\n}\n\nexport const __unsafeSetGlobalHostSchedulerForTests = (next: HostScheduler | undefined): void => {\n globalHostScheduler = next\n}\n\nexport type DeterministicHostScheduler = HostScheduler & {\n readonly flushMicrotasks: (options?: { readonly max?: number }) => number\n readonly flushOneMacrotask: () => boolean\n readonly flushAll: (options?: { readonly maxTurns?: number }) => { readonly turns: number; readonly ran: number }\n readonly getQueueSize: () => { readonly microtasks: number; readonly macrotasks: number }\n}\n\nexport const makeDeterministicHostScheduler = (): DeterministicHostScheduler => {\n const microtasks: Array<() => void> = []\n const macrotasks: Array<{ canceled: boolean; cb: () => void }> = []\n\n const flushMicrotasks = (options?: { readonly max?: number }): number => {\n const max = options?.max ?? 10_000\n let ran = 0\n while (microtasks.length > 0 && ran < max) {\n const cb = microtasks.shift()!\n ran += 1\n try {\n cb()\n } catch {\n // best-effort\n }\n }\n return ran\n }\n\n const flushOneMacrotask = (): boolean => {\n const t = macrotasks.shift()\n if (!t) return false\n if (t.canceled) return true\n try {\n t.cb()\n } catch {\n // best-effort\n }\n return true\n }\n\n const flushAll = (options?: { readonly maxTurns?: number }): { turns: number; ran: number } => {\n const maxTurns = options?.maxTurns ?? 10_000\n let turns = 0\n let ran = 0\n\n while (turns < maxTurns) {\n const before = microtasks.length + macrotasks.length\n ran += flushMicrotasks()\n if (microtasks.length > 0) {\n turns += 1\n continue\n }\n if (flushOneMacrotask()) {\n turns += 1\n continue\n }\n const after = microtasks.length + macrotasks.length\n if (after === 0 || after === before) break\n turns += 1\n }\n\n return { turns, ran }\n }\n\n return {\n nowMs: safeNowMs,\n scheduleMicrotask: (cb) => {\n microtasks.push(cb)\n },\n scheduleMacrotask: (cb) => {\n const task = { canceled: false, cb }\n macrotasks.push(task)\n return () => {\n task.canceled = true\n }\n },\n scheduleAnimationFrame: (cb) => {\n const task = { canceled: false, cb }\n macrotasks.push(task)\n return () => {\n task.canceled = true\n }\n },\n scheduleTimeout: (_ms, cb) => {\n const task = { canceled: false, cb }\n macrotasks.push(task)\n return () => {\n task.canceled = true\n }\n },\n flushMicrotasks,\n flushOneMacrotask,\n flushAll,\n getQueueSize: () => ({ microtasks: microtasks.length, macrotasks: macrotasks.length }),\n }\n}\n","import type { StateCommitMeta, StateCommitPriority } from './module.js'\n\nexport type ModuleInstanceKey = `${string}::${string}`\nexport type TopicKey = string\n\nexport type TopicKind = 'module' | 'readQuery'\n\nexport type TopicInfo =\n | { readonly kind: 'module'; readonly moduleInstanceKey: ModuleInstanceKey }\n | { readonly kind: 'readQuery'; readonly moduleInstanceKey: ModuleInstanceKey; readonly selectorId: string }\n\nexport const makeModuleInstanceKey = (moduleId: string, instanceId: string): ModuleInstanceKey =>\n `${moduleId}::${instanceId}`\n\nexport const makeReadQueryTopicKey = (moduleInstanceKey: ModuleInstanceKey, selectorId: string): TopicKey =>\n `${moduleInstanceKey}::rq:${selectorId}`\n\nexport const parseTopicKey = (topicKey: string): TopicInfo | undefined => {\n const idx = topicKey.indexOf('::')\n if (idx <= 0) return undefined\n\n const moduleId = topicKey.slice(0, idx)\n const rest = topicKey.slice(idx + 2)\n if (rest.length === 0) return undefined\n\n const idx2 = rest.indexOf('::')\n if (idx2 < 0) {\n return { kind: 'module', moduleInstanceKey: `${moduleId}::${rest}` }\n }\n\n const instanceId = rest.slice(0, idx2)\n const suffix = rest.slice(idx2 + 2)\n if (suffix.startsWith('rq:')) {\n const selectorId = suffix.slice('rq:'.length)\n if (selectorId.length === 0) return undefined\n return {\n kind: 'readQuery',\n moduleInstanceKey: `${moduleId}::${instanceId}`,\n selectorId,\n }\n }\n\n return { kind: 'module', moduleInstanceKey: `${moduleId}::${instanceId}` }\n}\n\nexport interface RuntimeStoreModuleCommit {\n readonly moduleId: string\n readonly instanceId: string\n readonly moduleInstanceKey: ModuleInstanceKey\n readonly state: unknown\n readonly meta: StateCommitMeta\n readonly opSeq?: number\n readonly schedulingPolicy?: {\n readonly configScope: 'builtin' | 'runtime_default' | 'runtime_module' | 'provider'\n readonly concurrencyLimit: number | 'unbounded'\n readonly allowUnbounded: boolean\n readonly losslessBackpressureCapacity: number\n readonly pressureWarningThreshold: {\n readonly backlogCount: number\n readonly backlogDurationMs: number\n }\n readonly warningCooldownMs: number\n readonly resolvedAtTxnSeq: number\n }\n}\n\nexport interface RuntimeStorePendingDrain {\n readonly modules: ReadonlyMap<ModuleInstanceKey, RuntimeStoreModuleCommit>\n readonly dirtyTopics: ReadonlyMap<TopicKey, StateCommitPriority>\n}\n\nexport interface RuntimeStoreCommitResult {\n readonly changedTopicListeners: ReadonlyArray<() => void>\n}\n\nexport type RuntimeStoreListenerCallback = (listener: () => void) => void\n\ninterface TopicListenersState {\n readonly listeners: Set<() => void>\n snapshot: ReadonlyArray<() => void>\n}\n\nconst EMPTY_LISTENER_SNAPSHOT: ReadonlyArray<() => void> = []\n\nexport interface RuntimeStore {\n // ---- React-facing sync snapshot APIs ----\n readonly getTickSeq: () => number\n readonly getModuleState: (moduleInstanceKey: ModuleInstanceKey) => unknown\n readonly getTopicVersion: (topicKey: TopicKey) => number\n readonly getTopicPriority: (topicKey: TopicKey) => StateCommitPriority\n readonly subscribeTopic: (topicKey: TopicKey, listener: () => void) => () => void\n readonly getTopicSubscriberCount: (topicKey: TopicKey) => number\n readonly getModuleSubscriberCount: (moduleInstanceKey: ModuleInstanceKey) => number\n\n // ---- Runtime integration ----\n readonly registerModuleInstance: (args: {\n readonly moduleId: string\n readonly instanceId: string\n readonly moduleInstanceKey: ModuleInstanceKey\n readonly initialState: unknown\n }) => void\n readonly unregisterModuleInstance: (moduleInstanceKey: ModuleInstanceKey) => void\n\n // ---- TickScheduler integration (internal) ----\n readonly commitTick: (args: {\n readonly tickSeq: number\n readonly accepted: RuntimeStorePendingDrain\n readonly onListener?: RuntimeStoreListenerCallback\n }) => RuntimeStoreCommitResult\n\n readonly dispose: () => void\n}\n\nconst NO_CHANGED_TOPIC_LISTENERS: ReadonlyArray<() => void> = []\n\nexport const makeRuntimeStore = (): RuntimeStore => {\n let tickSeq = 0\n\n // ---- Committed snapshot (read by React) ----\n const moduleStates = new Map<ModuleInstanceKey, unknown>()\n const topicVersions = new Map<TopicKey, number>()\n const topicPriorities = new Map<TopicKey, StateCommitPriority>()\n\n // ---- Subscriptions ----\n const listenersByTopic = new Map<TopicKey, TopicListenersState>()\n const subscriberCountByModule = new Map<ModuleInstanceKey, number>()\n\n const getTopicVersion = (topicKey: TopicKey): number => topicVersions.get(topicKey) ?? 0\n const getTopicPriority = (topicKey: TopicKey): StateCommitPriority => topicPriorities.get(topicKey) ?? 'normal'\n\n const commitTopicBump = (topicKey: TopicKey, priority: StateCommitPriority): void => {\n const prev = topicVersions.get(topicKey) ?? 0\n topicVersions.set(topicKey, prev + 1)\n topicPriorities.set(topicKey, priority)\n }\n\n const refreshTopicSnapshot = (state: TopicListenersState): void => {\n state.snapshot = Array.from(state.listeners)\n }\n\n const subscribeTopic = (topicKey: TopicKey, listener: () => void): (() => void) => {\n const info = parseTopicKey(topicKey)\n const existing = listenersByTopic.get(topicKey)\n const state = existing ?? { listeners: new Set<() => void>(), snapshot: EMPTY_LISTENER_SNAPSHOT }\n const alreadyHas = state.listeners.has(listener)\n if (!alreadyHas) {\n state.listeners.add(listener)\n refreshTopicSnapshot(state)\n }\n if (!existing) {\n listenersByTopic.set(topicKey, state)\n }\n\n if (!alreadyHas && info) {\n const prev = subscriberCountByModule.get(info.moduleInstanceKey) ?? 0\n subscriberCountByModule.set(info.moduleInstanceKey, prev + 1)\n }\n\n return () => {\n const currentState = listenersByTopic.get(topicKey)\n if (!currentState) return\n const deleted = currentState.listeners.delete(listener)\n if (deleted && info) {\n const prev = subscriberCountByModule.get(info.moduleInstanceKey) ?? 0\n const next = prev - 1\n if (next <= 0) {\n subscriberCountByModule.delete(info.moduleInstanceKey)\n } else {\n subscriberCountByModule.set(info.moduleInstanceKey, next)\n }\n }\n if (currentState.listeners.size === 0) {\n listenersByTopic.delete(topicKey)\n } else if (deleted) {\n refreshTopicSnapshot(currentState)\n }\n }\n }\n\n const getTopicSubscriberCount = (topicKey: TopicKey): number => listenersByTopic.get(topicKey)?.listeners.size ?? 0\n const getModuleSubscriberCount = (moduleInstanceKey: ModuleInstanceKey): number => subscriberCountByModule.get(moduleInstanceKey) ?? 0\n\n const registerModuleInstance = (args: {\n readonly moduleId: string\n readonly instanceId: string\n readonly moduleInstanceKey: ModuleInstanceKey\n readonly initialState: unknown\n }): void => {\n moduleStates.set(args.moduleInstanceKey, args.initialState)\n // Ensure the module topic exists with a stable baseline version/priority.\n if (!topicVersions.has(args.moduleInstanceKey)) {\n topicVersions.set(args.moduleInstanceKey, 0)\n topicPriorities.set(args.moduleInstanceKey, 'normal')\n }\n }\n\n const unregisterModuleInstance = (moduleInstanceKey: ModuleInstanceKey): void => {\n moduleStates.delete(moduleInstanceKey)\n // Keep topic versions by default (helps debugging). Subscribers are expected to detach on module destroy.\n }\n\n const commitTick = (args: {\n readonly tickSeq: number\n readonly accepted: RuntimeStorePendingDrain\n readonly onListener?: RuntimeStoreListenerCallback\n }): RuntimeStoreCommitResult => {\n tickSeq = args.tickSeq\n\n for (const [key, commit] of args.accepted.modules) {\n moduleStates.set(key, commit.state)\n }\n\n if (args.accepted.dirtyTopics.size === 0) {\n return {\n changedTopicListeners: NO_CHANGED_TOPIC_LISTENERS,\n }\n }\n\n if (args.onListener) {\n let firstTopicListeners: ReadonlyArray<() => void> | undefined\n let secondTopicListeners: ReadonlyArray<() => void> | undefined\n let restTopicListeners: Array<ReadonlyArray<() => void>> | undefined\n\n for (const [topicKey, priority] of args.accepted.dirtyTopics) {\n commitTopicBump(topicKey, priority)\n const listeners = listenersByTopic.get(topicKey)?.snapshot ?? EMPTY_LISTENER_SNAPSHOT\n if (listeners.length === 0) {\n continue\n }\n if (!firstTopicListeners) {\n firstTopicListeners = listeners\n continue\n }\n if (!secondTopicListeners) {\n secondTopicListeners = listeners\n continue\n }\n if (!restTopicListeners) {\n restTopicListeners = []\n }\n restTopicListeners.push(listeners)\n }\n\n if (firstTopicListeners) {\n for (const listener of firstTopicListeners) {\n try {\n args.onListener(listener)\n } catch {\n // best-effort: never let listener callback break commit tick\n }\n }\n }\n\n if (secondTopicListeners) {\n for (const listener of secondTopicListeners) {\n try {\n args.onListener(listener)\n } catch {\n // best-effort: never let listener callback break commit tick\n }\n }\n }\n\n if (restTopicListeners) {\n for (const listeners of restTopicListeners) {\n for (const listener of listeners) {\n try {\n args.onListener(listener)\n } catch {\n // best-effort: never let listener callback break commit tick\n }\n }\n }\n }\n\n return {\n changedTopicListeners: NO_CHANGED_TOPIC_LISTENERS,\n }\n }\n\n let singleTopicListeners: ReadonlyArray<() => void> | undefined\n let flattenedTopicListeners: Array<() => void> | undefined\n\n for (const [topicKey, priority] of args.accepted.dirtyTopics) {\n commitTopicBump(topicKey, priority)\n const listeners = listenersByTopic.get(topicKey)?.snapshot ?? EMPTY_LISTENER_SNAPSHOT\n if (listeners.length === 0) {\n continue\n }\n if (flattenedTopicListeners) {\n for (const listener of listeners) {\n flattenedTopicListeners.push(listener)\n }\n continue\n }\n if (!singleTopicListeners) {\n singleTopicListeners = listeners\n continue\n }\n flattenedTopicListeners = Array.from(singleTopicListeners)\n for (const listener of listeners) {\n flattenedTopicListeners.push(listener)\n }\n }\n\n return {\n changedTopicListeners: flattenedTopicListeners ?? singleTopicListeners ?? NO_CHANGED_TOPIC_LISTENERS,\n }\n }\n\n const getModuleState = (moduleInstanceKey: ModuleInstanceKey): unknown => moduleStates.get(moduleInstanceKey)\n\n const dispose = (): void => {\n moduleStates.clear()\n topicVersions.clear()\n topicPriorities.clear()\n listenersByTopic.clear()\n subscriberCountByModule.clear()\n }\n\n return {\n getTickSeq: () => tickSeq,\n getModuleState,\n getTopicVersion,\n getTopicPriority,\n subscribeTopic,\n getTopicSubscriberCount,\n getModuleSubscriberCount,\n registerModuleInstance,\n unregisterModuleInstance,\n commitTick,\n dispose,\n }\n}\n","import { Effect } from 'effect'\nimport * as Debug from './DebugSink.js'\nimport type { DeclarativeLinkRuntime } from './DeclarativeLinkRuntime.js'\nimport type { HostScheduler } from './HostScheduler.js'\nimport { makeJobQueue, type JobQueue } from './JobQueue.js'\nimport * as TaskRunner from './TaskRunner.js'\nimport {\n makeReadQueryTopicKey,\n type ModuleInstanceKey,\n type RuntimeStore,\n type RuntimeStoreModuleCommit,\n type RuntimeStorePendingDrain,\n} from './RuntimeStore.js'\nimport type { StateCommitPriority } from './module.js'\n\nexport type TickLane = 'urgent' | 'nonUrgent'\n\nexport type TickDegradeReason = 'budget_steps' | 'cycle_detected' | 'unknown'\n\nexport interface TickSchedulerConfig {\n /**\n * Fixpoint step cap:\n * - Steps count \"work acceptance units\" within a single tick, not time.\n * - Exceeding the budget triggers a soft degrade (stable=false), deferring nonUrgent backlog to the next tick.\n */\n readonly maxSteps?: number\n /**\n * Urgent safety cap:\n * - Even urgent work may be cut when the system appears to be in a cycle (avoid freezing).\n */\n readonly urgentStepCap?: number\n /**\n * Drain-round cap:\n * - Bounds the number of drain rounds while capturing concurrent commits before committing the tick snapshot.\n * - Exceeding the cap is treated as a cycle (stable=false, degradeReason=cycle_detected).\n */\n readonly maxDrainRounds?: number\n /**\n * Microtask starvation protection threshold:\n * - Counts consecutive ticks scheduled on microtask boundaries without yielding to host (best-effort).\n * - Exceeding the limit forces the next tick to start on a macrotask boundary.\n */\n readonly microtaskChainDepthLimit?: number\n /**\n * Optional degraded-tick telemetry (opt-in, sampled):\n * - Runs even when diagnostics=off (Devtools disabled).\n * - Intended for production health signals (frequency of stable=false / forced yield).\n */\n readonly telemetry?: TickSchedulerTelemetryConfig\n}\n\nexport interface TickSchedulerTelemetryEvent {\n readonly tickSeq: number\n readonly stable: boolean\n readonly degradeReason?: TickDegradeReason\n readonly forcedMacrotask?: boolean\n readonly scheduleReason?: TickScheduleReason\n readonly microtaskChainDepth?: number\n readonly deferredWorkCount?: number\n}\n\nexport interface TickSchedulerTelemetryConfig {\n /** Sample rate in [0, 1]. Default: 0 (disabled). */\n readonly sampleRate?: number\n /** Called for ticks that are degraded (stable=false) and/or started on a forced macrotask boundary. */\n readonly onTickDegraded?: (event: TickSchedulerTelemetryEvent) => void\n}\n\nexport interface TickScheduler {\n readonly getTickSeq: () => number\n readonly onModuleCommit: (commit: RuntimeStoreModuleCommit) => Effect.Effect<void, never, never>\n readonly onSelectorChanged: (args: {\n readonly moduleInstanceKey: ModuleInstanceKey\n readonly selectorId: string\n readonly priority: StateCommitPriority\n }) => void\n readonly flushNow: Effect.Effect<void, never, never>\n}\n\n// ---- Runtime.batch (sync boundary) ----\n\ntype BatchWaiter = { readonly resolve: () => void }\n\nlet batchDepth = 0\nconst batchWaiters = new Set<BatchWaiter>()\n\nexport const enterRuntimeBatch = (): void => {\n batchDepth += 1\n}\n\nexport const exitRuntimeBatch = (): void => {\n batchDepth = Math.max(0, batchDepth - 1)\n if (batchDepth !== 0) return\n const waiters = Array.from(batchWaiters)\n batchWaiters.clear()\n for (const w of waiters) {\n try {\n w.resolve()\n } catch {\n // best-effort\n }\n }\n}\n\nconst waitForBatchEndIfNeeded = (): Effect.Effect<void, never, never> =>\n batchDepth === 0\n ? Effect.void\n : Effect.promise<void>((signal) =>\n new Promise<void>((resolve) => {\n\n let done = false\n const cleanup = () => {\n if (done) return\n done = true\n batchWaiters.delete(waiter)\n try {\n signal.removeEventListener('abort', onAbort)\n } catch {\n // best-effort\n }\n }\n\n const onAbort = () => {\n cleanup()\n }\n\n const waiter: BatchWaiter = {\n resolve: () => {\n cleanup()\n resolve()\n },\n }\n\n batchWaiters.add(waiter)\n try {\n signal.addEventListener('abort', onAbort, { once: true })\n } catch {\n // best-effort\n }\n }),\n )\n\n// ---- TickScheduler implementation ----\n\ntype TriggerKind = 'externalStore' | 'dispatch' | 'timer' | 'unknown'\n\ntype TickScheduleStartedAs = 'microtask' | 'macrotask' | 'batch' | 'unknown'\ntype TickScheduleReason = 'budget' | 'cycle_detected' | 'microtask_starvation' | 'unknown'\n\ntype TickSchedule = {\n readonly startedAs?: TickScheduleStartedAs\n readonly microtaskChainDepth?: number\n readonly forcedMacrotask?: boolean\n readonly reason?: TickScheduleReason\n}\n\ntype SchedulingDegradeState = {\n readonly tickSeq: number\n readonly reason: TickDegradeReason\n readonly moduleId: string\n readonly instanceId: string\n readonly txnSeq: number\n readonly txnId: string\n readonly opSeq: number\n readonly configScope: 'builtin' | 'runtime_default' | 'runtime_module' | 'provider'\n readonly limit: number | 'unbounded'\n readonly backlogCount: number\n}\n\ntype SchedulingAnchor = {\n readonly moduleId: string\n readonly instanceId: string\n readonly txnSeq: number\n readonly txnId: string\n readonly opSeq: number\n}\n\nconst toSchedulingAnchor = (commit: RuntimeStoreModuleCommit | undefined): SchedulingAnchor | undefined => {\n if (!commit) return undefined\n if (typeof commit.opSeq !== 'number') return undefined\n return {\n moduleId: commit.moduleId,\n instanceId: commit.instanceId,\n txnSeq: commit.meta.txnSeq,\n txnId: commit.meta.txnId,\n opSeq: commit.opSeq,\n }\n}\n\nconst toSchedulingResolvedTxnSeq = (commit: RuntimeStoreModuleCommit): number =>\n commit.schedulingPolicy?.resolvedAtTxnSeq ?? commit.meta.txnSeq\n\nconst toSchedulingResolvedOpSeq = (commit: RuntimeStoreModuleCommit): number =>\n typeof commit.opSeq === 'number' && Number.isFinite(commit.opSeq) ? commit.opSeq : -1\n\nconst pickNewerSchedulingCommit = (\n current: RuntimeStoreModuleCommit | undefined,\n candidate: RuntimeStoreModuleCommit,\n): RuntimeStoreModuleCommit => {\n if (!current) return candidate\n const currentTxnSeq = toSchedulingResolvedTxnSeq(current)\n const candidateTxnSeq = toSchedulingResolvedTxnSeq(candidate)\n if (candidateTxnSeq > currentTxnSeq) return candidate\n if (candidateTxnSeq < currentTxnSeq) return current\n return toSchedulingResolvedOpSeq(candidate) > toSchedulingResolvedOpSeq(current) ? candidate : current\n}\n\nconst clampSampleRate = (sampleRate: number | undefined): number => {\n if (typeof sampleRate !== 'number' || !Number.isFinite(sampleRate)) return 0\n if (sampleRate <= 0) return 0\n if (sampleRate >= 1) return 1\n return sampleRate\n}\n\nconst shouldSampleTick = (tickSeq: number, sampleRate: number): boolean => {\n if (sampleRate <= 0) return false\n if (sampleRate >= 1) return true\n // Deterministic sampling: stable across runs, avoids Math.random() and keeps overhead minimal.\n const x = tickSeq >>> 0\n const h = Math.imul(x ^ 0x9e3779b9, 0x85ebca6b) >>> 0\n return h / 0xffffffff < sampleRate\n}\n\nconst topicKeyResolutionCacheLimit = 1024\n\nconst toTriggerKind = (originKind: string | undefined): TriggerKind => {\n if (originKind === 'action') return 'dispatch'\n if (originKind === 'trait-external-store') return 'externalStore'\n if (originKind?.includes('timer')) return 'timer'\n return 'unknown'\n}\n\nconst toLane = (priority: StateCommitPriority): TickLane => (priority === 'low' ? 'nonUrgent' : 'urgent')\n\nconst maxPriority = (a: StateCommitPriority, b: StateCommitPriority): StateCommitPriority =>\n a === 'normal' || b === 'normal' ? 'normal' : 'low'\n\ntype MutablePendingDrain = {\n readonly modules: Map<ModuleInstanceKey, RuntimeStoreModuleCommit>\n readonly dirtyTopics: Map<string, StateCommitPriority>\n}\n\nconst mergeDrainInPlace = (base: MutablePendingDrain, next: RuntimeStorePendingDrain): void => {\n for (const [k, commit] of next.modules) {\n const prev = base.modules.get(k)\n if (!prev) {\n base.modules.set(k, commit)\n } else {\n const mergedPriority = maxPriority(prev.meta.priority, commit.meta.priority)\n if (mergedPriority === commit.meta.priority) {\n base.modules.set(k, commit)\n } else {\n base.modules.set(k, {\n ...commit,\n meta: {\n ...commit.meta,\n priority: mergedPriority,\n },\n })\n }\n }\n }\n\n for (const [k, p] of next.dirtyTopics) {\n const prev = base.dirtyTopics.get(k)\n if (!prev) {\n base.dirtyTopics.set(k, p)\n continue\n }\n const mergedPriority = maxPriority(prev, p)\n if (mergedPriority !== prev) {\n base.dirtyTopics.set(k, mergedPriority)\n }\n }\n}\n\nconst emptyDrain = (): MutablePendingDrain => ({ modules: new Map(), dirtyTopics: new Map() })\n\ntype BudgetPartitionResult = {\n readonly acceptedModules: Map<ModuleInstanceKey, RuntimeStoreModuleCommit>\n readonly deferredModules: Map<ModuleInstanceKey, RuntimeStoreModuleCommit>\n readonly urgentCapExceeded: boolean\n readonly deferredNonUrgentCount: number\n}\n\nconst partitionModulesForBudget = (args: {\n readonly modules: ReadonlyMap<ModuleInstanceKey, RuntimeStoreModuleCommit>\n readonly maxSteps: number\n readonly urgentStepCap: number\n}): BudgetPartitionResult => {\n let urgentCount = 0\n for (const commit of args.modules.values()) {\n if (toLane(commit.meta.priority) === 'urgent') {\n urgentCount += 1\n }\n }\n\n const urgentCap = Math.max(0, args.urgentStepCap)\n const urgentCapExceeded = urgentCount > urgentCap\n const nonUrgentBudget = Math.max(0, args.maxSteps)\n\n let acceptedUrgentCount = 0\n let deferredNonUrgentCount = 0\n\n const acceptedModules = new Map<ModuleInstanceKey, RuntimeStoreModuleCommit>()\n const deferredModules = new Map<ModuleInstanceKey, RuntimeStoreModuleCommit>()\n\n for (const commit of args.modules.values()) {\n if (toLane(commit.meta.priority) !== 'urgent') continue\n if (urgentCapExceeded && acceptedUrgentCount >= urgentCap) {\n deferredModules.set(commit.moduleInstanceKey, commit)\n continue\n }\n acceptedModules.set(commit.moduleInstanceKey, commit)\n acceptedUrgentCount += 1\n }\n\n if (urgentCapExceeded) {\n for (const commit of args.modules.values()) {\n if (toLane(commit.meta.priority) === 'urgent') continue\n deferredModules.set(commit.moduleInstanceKey, commit)\n deferredNonUrgentCount += 1\n }\n return {\n acceptedModules,\n deferredModules,\n urgentCapExceeded,\n deferredNonUrgentCount,\n }\n }\n\n let acceptedNonUrgentCount = 0\n for (const commit of args.modules.values()) {\n if (toLane(commit.meta.priority) === 'urgent') continue\n if (acceptedNonUrgentCount >= nonUrgentBudget) {\n deferredModules.set(commit.moduleInstanceKey, commit)\n deferredNonUrgentCount += 1\n continue\n }\n acceptedModules.set(commit.moduleInstanceKey, commit)\n acceptedNonUrgentCount += 1\n }\n\n return {\n acceptedModules,\n deferredModules,\n urgentCapExceeded,\n deferredNonUrgentCount,\n }\n}\n\nexport const makeTickScheduler = (args: {\n readonly runtimeStore: RuntimeStore\n readonly queue?: JobQueue\n readonly hostScheduler: HostScheduler\n readonly config?: TickSchedulerConfig\n readonly declarativeLinkRuntime?: DeclarativeLinkRuntime\n}): TickScheduler => {\n const store = args.runtimeStore\n const hostScheduler = args.hostScheduler\n const declarativeLinks = args.declarativeLinkRuntime\n const queue = args.queue ?? makeJobQueue()\n\n const config: Required<Pick<TickSchedulerConfig, 'maxSteps' | 'urgentStepCap' | 'maxDrainRounds' | 'microtaskChainDepthLimit'>> = {\n maxSteps: args.config?.maxSteps ?? 64,\n urgentStepCap: args.config?.urgentStepCap ?? 512,\n maxDrainRounds: args.config?.maxDrainRounds ?? 8,\n microtaskChainDepthLimit: args.config?.microtaskChainDepthLimit ?? 32,\n }\n const telemetry = args.config?.telemetry\n const telemetrySampleRate = clampSampleRate(telemetry?.sampleRate)\n\n let tickSeq = 0\n let scheduled = false\n let microtaskChainDepth = 0\n let nextForcedReason: TickScheduleReason | undefined\n let lastSchedulingDegrade: SchedulingDegradeState | undefined\n\n let coalescedModules = 0\n let coalescedTopics = 0\n const topicKeyToModuleInstanceKeyCache = new Map<string, ModuleInstanceKey | null>()\n\n const rememberTopicKeyResolution = (topicKey: string, moduleInstanceKey: ModuleInstanceKey | undefined): ModuleInstanceKey | undefined => {\n if (topicKeyToModuleInstanceKeyCache.has(topicKey)) {\n topicKeyToModuleInstanceKeyCache.delete(topicKey)\n } else if (topicKeyToModuleInstanceKeyCache.size >= topicKeyResolutionCacheLimit) {\n const oldestKey = topicKeyToModuleInstanceKeyCache.keys().next().value\n if (oldestKey !== undefined) {\n topicKeyToModuleInstanceKeyCache.delete(oldestKey)\n }\n }\n topicKeyToModuleInstanceKeyCache.set(topicKey, moduleInstanceKey ?? null)\n return moduleInstanceKey\n }\n\n const yieldMicrotask = Effect.promise<void>(() =>\n new Promise<void>((resolve) => {\n hostScheduler.scheduleMicrotask(resolve)\n }),\n )\n const yieldMacrotask = Effect.promise<void>((signal) =>\n new Promise<void>((resolve) => {\n const cancel = hostScheduler.scheduleMacrotask(resolve)\n try {\n signal.addEventListener(\n 'abort',\n () => {\n cancel()\n },\n { once: true },\n )\n } catch {\n // best-effort\n }\n }),\n )\n\n const scheduleTick = (): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n if (scheduled) return\n scheduled = true\n\n const waitedForBatch = batchDepth > 0\n\n const forcedReason = nextForcedReason\n nextForcedReason = undefined\n\n const shouldYieldForStarvation =\n forcedReason == null && microtaskChainDepth >= Math.max(1, config.microtaskChainDepthLimit)\n\n const reason: TickScheduleReason | undefined = forcedReason ?? (shouldYieldForStarvation ? 'microtask_starvation' : undefined)\n const boundary: 'microtask' | 'macrotask' = reason ? 'macrotask' : 'microtask'\n const startedAs: TickScheduleStartedAs = waitedForBatch ? 'batch' : boundary\n const depthAtSchedule = microtaskChainDepth\n\n yield* Effect.provideService(Effect.gen(function* () {\n try {\n yield* waitForBatchEndIfNeeded()\n if (boundary === 'microtask') {\n // Always yield at least one microtask tick boundary before flushing:\n // - Keeps tick→notify semantics stable (async flush window) even under Runtime.batch.\n // - Avoids \"denominatorZero\" artifacts in perf budgets when dispatch is synchronous (mr.actions.*).\n if (waitedForBatch) {\n microtaskChainDepth = 0\n }\n yield* yieldMicrotask\n if (!waitedForBatch) {\n microtaskChainDepth += 1\n }\n } else {\n yield* yieldMacrotask\n microtaskChainDepth = 0\n }\n \n const schedule: TickSchedule = {\n startedAs,\n microtaskChainDepth: boundary === 'macrotask' ? depthAtSchedule : microtaskChainDepth,\n ...(boundary === 'macrotask' ? { forcedMacrotask: true, reason: reason ?? 'unknown' } : {}),\n }\n \n const outcome = yield* flushTick(schedule)\n if (!outcome.stable) {\n nextForcedReason =\n outcome.degradeReason === 'budget_steps'\n ? 'budget'\n : outcome.degradeReason === 'cycle_detected'\n ? 'cycle_detected'\n : 'unknown'\n }\n } finally {\n scheduled = false\n // If something was re-queued or arrived after commit, schedule the next tick (best-effort).\n if (queue.hasPending()) {\n yield* scheduleTick()\n } else {\n // Reset chain depth when the system becomes idle (avoid forcing a macrotask on the next unrelated tick).\n microtaskChainDepth = 0\n }\n }\n }), TaskRunner.inSyncTransactionFiber, false).pipe(Effect.forkDetach({ startImmediately: true }))\n })\n\n const flushTick = (schedule: TickSchedule): Effect.Effect<{ stable: boolean; degradeReason?: TickDegradeReason }, never, never> =>\n Effect.gen(function* () {\n if (!queue.hasPending()) {\n return { stable: true }\n }\n\n tickSeq += 1\n const currentTickSeq = tickSeq\n\n const diagnosticsLevel = yield* Effect.service(Debug.currentDiagnosticsLevel).pipe(Effect.orDie)\n const traceMode = yield* Effect.service(Debug.currentTraceMode).pipe(Effect.orDie)\n const shouldEmitTrace = traceMode === 'on' && diagnosticsLevel !== 'off'\n const shouldEmitSchedulingDiagnostics = diagnosticsLevel !== 'off'\n\n const captured: {\n drainRounds: number\n stable: boolean\n degradeReason?: TickDegradeReason\n deferred?: RuntimeStorePendingDrain\n accepted: MutablePendingDrain\n } = {\n drainRounds: 0,\n stable: true,\n accepted: emptyDrain(),\n }\n\n // Fixpoint capture: drain -> apply declarative links -> drain (bounded by maxDrainRounds).\n while (captured.drainRounds < config.maxDrainRounds) {\n const drained = queue.drain()\n if (!drained) break\n captured.drainRounds += 1\n mergeDrainInPlace(captured.accepted, drained)\n\n if (declarativeLinks && drained.modules.size > 0) {\n const changedModuleInstanceKeys = Array.from(drained.modules.keys())\n yield* declarativeLinks.applyForSources({\n tickSeq: currentTickSeq,\n acceptedModules: captured.accepted.modules,\n changedModuleInstanceKeys,\n })\n }\n }\n\n if (queue.hasPending()) {\n captured.stable = false\n captured.degradeReason = 'cycle_detected'\n }\n\n // Budget enforcement (defer nonUrgent only; urgent may be cut only in cycle safety-break).\n //\n // Perf: fast-path the common case where a tick is far under both budgets:\n // - Avoid allocating new Maps in partitionModulesForBudget.\n // - Avoid re-walking dirtyTopics to split accepted/deferred topics.\n let acceptedModules: Map<ModuleInstanceKey, RuntimeStoreModuleCommit> = captured.accepted.modules\n let deferredModules: Map<ModuleInstanceKey, RuntimeStoreModuleCommit> | undefined = undefined\n let urgentCapExceeded = false\n let deferredNonUrgentCount = 0\n\n if (!(captured.accepted.modules.size <= config.maxSteps && captured.accepted.modules.size <= config.urgentStepCap)) {\n const partitioned = partitionModulesForBudget({\n modules: captured.accepted.modules,\n maxSteps: config.maxSteps,\n urgentStepCap: config.urgentStepCap,\n })\n acceptedModules = partitioned.acceptedModules\n deferredModules = partitioned.deferredModules\n urgentCapExceeded = partitioned.urgentCapExceeded\n deferredNonUrgentCount = partitioned.deferredNonUrgentCount\n }\n\n if (urgentCapExceeded) {\n captured.stable = false\n captured.degradeReason = 'cycle_detected'\n } else if (deferredNonUrgentCount > 0) {\n captured.stable = false\n captured.degradeReason = captured.degradeReason ?? 'budget_steps'\n }\n\n const canAcceptAllTopics = deferredModules == null || deferredModules.size === 0\n\n const acceptedDrain: RuntimeStorePendingDrain = (() => {\n if (canAcceptAllTopics) {\n // Even when we accept all module topics, we must ignore non-parsable topic keys.\n // Otherwise, arbitrary strings would become \"real\" topics in RuntimeStore and create silent drift.\n if (captured.accepted.dirtyTopics.size === 0) {\n return captured.accepted as unknown as RuntimeStorePendingDrain\n }\n\n let hasNonParsable = false\n for (const topicKey of captured.accepted.dirtyTopics.keys()) {\n if (!storeTopicToModuleInstanceKey(topicKey)) {\n hasNonParsable = true\n break\n }\n }\n\n if (!hasNonParsable) {\n return captured.accepted as unknown as RuntimeStorePendingDrain\n }\n\n const acceptedTopics = new Map<string, StateCommitPriority>()\n for (const [topicKey, priority] of captured.accepted.dirtyTopics) {\n const moduleInstanceKey = storeTopicToModuleInstanceKey(topicKey)\n if (!moduleInstanceKey) continue\n acceptedTopics.set(topicKey, priority)\n }\n\n return {\n modules: acceptedModules,\n dirtyTopics: acceptedTopics,\n } satisfies RuntimeStorePendingDrain\n }\n\n const acceptedTopics = new Map<string, StateCommitPriority>()\n const deferredTopics = new Map<string, StateCommitPriority>()\n\n for (const [topicKey, priority] of captured.accepted.dirtyTopics) {\n const moduleInstanceKey = storeTopicToModuleInstanceKey(topicKey)\n if (!moduleInstanceKey) continue\n if (acceptedModules.has(moduleInstanceKey)) {\n acceptedTopics.set(topicKey, priority)\n } else if (deferredModules && deferredModules.has(moduleInstanceKey)) {\n deferredTopics.set(topicKey, priority)\n } else {\n // Conservative default: treat unknown topics as accepted.\n acceptedTopics.set(topicKey, priority)\n }\n }\n\n return {\n modules: acceptedModules,\n dirtyTopics: acceptedTopics,\n } satisfies RuntimeStorePendingDrain\n })()\n\n const deferredDrain: RuntimeStorePendingDrain | undefined =\n canAcceptAllTopics || !deferredModules\n ? undefined\n : deferredModules.size > 0\n ? {\n modules: deferredModules,\n dirtyTopics: (() => {\n const deferredTopics = new Map<string, StateCommitPriority>()\n for (const [topicKey, priority] of captured.accepted.dirtyTopics) {\n const moduleInstanceKey = storeTopicToModuleInstanceKey(topicKey)\n if (!moduleInstanceKey) continue\n if (deferredModules.has(moduleInstanceKey)) {\n deferredTopics.set(topicKey, priority)\n }\n }\n return deferredTopics\n })(),\n }\n : undefined\n\n captured.deferred = deferredDrain\n\n const anchorCommitForScheduling = (() => {\n let selected: RuntimeStoreModuleCommit | undefined\n for (const commit of acceptedModules.values()) {\n selected = pickNewerSchedulingCommit(selected, commit)\n }\n if (deferredDrain) {\n for (const commit of deferredDrain.modules.values()) {\n selected = pickNewerSchedulingCommit(selected, commit)\n }\n }\n return selected\n })()\n\n const schedulingAnchor = toSchedulingAnchor(anchorCommitForScheduling)\n const schedulingPolicy = anchorCommitForScheduling?.schedulingPolicy\n const schedulingConfigScope = schedulingPolicy?.configScope ?? 'builtin'\n const schedulingLimit = schedulingPolicy?.concurrencyLimit ?? 16\n const schedulingThreshold = schedulingPolicy?.pressureWarningThreshold ?? {\n backlogCount: 1000,\n backlogDurationMs: 5000,\n }\n const schedulingCooldownMs = schedulingPolicy?.warningCooldownMs ?? 30_000\n const backlogCount = deferredDrain ? deferredDrain.modules.size + deferredDrain.dirtyTopics.size : 0\n\n if (!captured.stable && shouldEmitSchedulingDiagnostics && schedulingAnchor && !lastSchedulingDegrade) {\n const reason = captured.degradeReason ?? 'unknown'\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: schedulingAnchor.moduleId,\n instanceId: schedulingAnchor.instanceId,\n txnSeq: schedulingAnchor.txnSeq,\n txnId: schedulingAnchor.txnId,\n opSeq: schedulingAnchor.opSeq,\n code: 'scheduling::degrade',\n severity: 'warning',\n message: 'Scheduling degraded: tick execution deferred part of the backlog.',\n hint:\n 'Inspect reason/backlog and align queue/tick/concurrency knobs through the same scheduling policy surface.',\n kind: 'scheduling:degrade',\n trigger: {\n kind: 'tickScheduler',\n name: 'flushTick',\n details: {\n eventKind: 'degrade',\n reason,\n tickSeq: currentTickSeq,\n backlogCount,\n configScope: schedulingConfigScope,\n limit: schedulingLimit,\n threshold: schedulingThreshold,\n cooldownMs: schedulingCooldownMs,\n schedule: {\n startedAs: schedule.startedAs ?? 'unknown',\n forcedMacrotask: schedule.forcedMacrotask === true,\n reason: schedule.reason ?? 'unknown',\n microtaskChainDepth: schedule.microtaskChainDepth ?? 0,\n },\n },\n },\n })\n\n lastSchedulingDegrade = {\n tickSeq: currentTickSeq,\n reason,\n moduleId: schedulingAnchor.moduleId,\n instanceId: schedulingAnchor.instanceId,\n txnSeq: schedulingAnchor.txnSeq,\n txnId: schedulingAnchor.txnId,\n opSeq: schedulingAnchor.opSeq,\n configScope: schedulingConfigScope,\n limit: schedulingLimit,\n backlogCount,\n }\n } else if (captured.stable && lastSchedulingDegrade) {\n const previous = lastSchedulingDegrade\n if (shouldEmitSchedulingDiagnostics) {\n const recoverAnchor = schedulingAnchor ?? previous\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: recoverAnchor.moduleId,\n instanceId: recoverAnchor.instanceId,\n txnSeq: recoverAnchor.txnSeq,\n txnId: recoverAnchor.txnId,\n opSeq: recoverAnchor.opSeq,\n code: 'scheduling::recover',\n severity: 'info',\n message: 'Scheduling recovered: backlog/degrade condition cleared.',\n hint: 'No immediate action needed unless degrade/recover oscillates frequently.',\n kind: 'scheduling:recover',\n trigger: {\n kind: 'tickScheduler',\n name: 'flushTick',\n details: {\n eventKind: 'recover',\n tickSeq: currentTickSeq,\n fromTickSeq: previous.tickSeq,\n fromReason: previous.reason,\n previousBacklogCount: previous.backlogCount,\n configScope: previous.configScope,\n limit: previous.limit,\n schedule: {\n startedAs: schedule.startedAs ?? 'unknown',\n forcedMacrotask: schedule.forcedMacrotask === true,\n reason: schedule.reason ?? 'unknown',\n microtaskChainDepth: schedule.microtaskChainDepth ?? 0,\n },\n },\n },\n })\n }\n lastSchedulingDegrade = undefined\n }\n\n let startedAtMs: number | undefined\n let triggerSummary: any | undefined\n let anchor: any | undefined\n let backlog: any | undefined\n let result: any | undefined\n\n if (shouldEmitTrace) {\n startedAtMs = Date.now()\n\n let triggerTotal = 0\n let triggerPrimary: any = undefined\n let triggerAnchor: RuntimeStoreModuleCommit | undefined\n const triggerKindsOrder: TriggerKind[] = []\n let externalStoreCount = 0\n let dispatchCount = 0\n let timerCount = 0\n let unknownCount = 0\n\n for (const commit of captured.accepted.modules.values()) {\n if (!triggerAnchor) {\n triggerAnchor = commit\n }\n triggerTotal += 1\n\n const kind = toTriggerKind(commit.meta.originKind)\n if (!triggerPrimary) {\n triggerPrimary = {\n kind,\n moduleId: commit.moduleId,\n instanceId: commit.instanceId,\n fieldPath: kind === 'externalStore' ? commit.meta.originName : undefined,\n actionTag: kind === 'dispatch' ? commit.meta.originName : undefined,\n }\n }\n\n switch (kind) {\n case 'externalStore': {\n if (externalStoreCount === 0) triggerKindsOrder.push(kind)\n externalStoreCount += 1\n break\n }\n case 'dispatch': {\n if (dispatchCount === 0) triggerKindsOrder.push(kind)\n dispatchCount += 1\n break\n }\n case 'timer': {\n if (timerCount === 0) triggerKindsOrder.push(kind)\n timerCount += 1\n break\n }\n default: {\n if (unknownCount === 0) triggerKindsOrder.push(kind)\n unknownCount += 1\n break\n }\n }\n }\n\n const kinds: Array<{ kind: TriggerKind; count: number }> = []\n for (const kind of triggerKindsOrder) {\n switch (kind) {\n case 'externalStore':\n kinds.push({ kind, count: externalStoreCount })\n break\n case 'dispatch':\n kinds.push({ kind, count: dispatchCount })\n break\n case 'timer':\n kinds.push({ kind, count: timerCount })\n break\n default:\n kinds.push({ kind, count: unknownCount })\n break\n }\n }\n\n triggerSummary = {\n total: triggerTotal,\n kinds,\n primary: triggerPrimary,\n coalescedCount: {\n modules: coalescedModules,\n topics: coalescedTopics,\n },\n }\n\n if (triggerAnchor) {\n anchor = {\n moduleId: triggerAnchor.moduleId,\n instanceId: triggerAnchor.instanceId,\n txnSeq: triggerAnchor.meta.txnSeq,\n txnId: triggerAnchor.meta.txnId,\n ...(typeof triggerAnchor.opSeq === 'number' ? { opSeq: triggerAnchor.opSeq } : null),\n }\n }\n\n const deferredWork = captured.deferred\n if (deferredWork) {\n const pendingDeferredWork = deferredWork.modules.size + deferredWork.dirtyTopics.size\n let pendingExternalInputs = 0\n let firstDeferred: RuntimeStoreModuleCommit | undefined\n let firstExternalStoreDeferred: RuntimeStoreModuleCommit | undefined\n\n for (const deferred of deferredWork.modules.values()) {\n if (!firstDeferred) {\n firstDeferred = deferred\n }\n const kind = toTriggerKind(deferred.meta.originKind)\n if (kind === 'externalStore') {\n pendingExternalInputs += 1\n if (!firstExternalStoreDeferred) {\n firstExternalStoreDeferred = deferred\n }\n }\n }\n\n const primaryDeferred = firstExternalStoreDeferred ?? firstDeferred\n let deferredPrimary: any = undefined\n if (primaryDeferred) {\n const kind = toTriggerKind(primaryDeferred.meta.originKind)\n const isExternalStore = kind === 'externalStore'\n deferredPrimary = {\n kind: isExternalStore ? ('externalStore' as const) : ('unknown' as const),\n moduleId: primaryDeferred.moduleId,\n instanceId: primaryDeferred.instanceId,\n fieldPath: isExternalStore ? primaryDeferred.meta.originName : undefined,\n storeId: undefined,\n }\n }\n\n backlog = {\n pendingExternalInputs,\n pendingDeferredWork,\n deferredPrimary,\n }\n }\n\n result = {\n stable: captured.stable,\n ...(captured.stable ? null : { degradeReason: captured.degradeReason ?? 'unknown' }),\n } as const\n }\n\n if (shouldEmitTrace && schedule.forcedMacrotask && schedule.reason === 'microtask_starvation') {\n yield* Debug.record({\n type: 'warn:microtask-starvation',\n moduleId: anchor?.moduleId,\n instanceId: anchor?.instanceId,\n tickSeq: currentTickSeq,\n microtaskChainDepth: schedule.microtaskChainDepth,\n })\n }\n\n if (shouldEmitTrace) {\n yield* Debug.record({\n type: 'trace:tick',\n moduleId: anchor?.moduleId,\n instanceId: anchor?.instanceId,\n data: {\n tickSeq: currentTickSeq,\n phase: 'start',\n timestampMs: startedAtMs!,\n schedule,\n triggerSummary,\n anchors: anchor,\n budget: {\n maxSteps: config.maxSteps,\n elapsedMs: 0,\n steps: 0,\n txnCount: acceptedModules.size,\n },\n },\n })\n }\n\n if (!captured.stable && shouldEmitTrace) {\n yield* Debug.record({\n type: 'trace:tick',\n moduleId: anchor?.moduleId,\n instanceId: anchor?.instanceId,\n data: {\n tickSeq: currentTickSeq,\n phase: 'budgetExceeded',\n timestampMs: Date.now(),\n schedule,\n triggerSummary,\n anchors: anchor,\n budget: {\n maxSteps: config.maxSteps,\n elapsedMs: Math.max(0, Date.now() - startedAtMs!),\n steps: config.maxSteps,\n txnCount: acceptedModules.size,\n },\n backlog,\n result,\n },\n })\n }\n\n // Requeue deferred backlog before committing the tick, so the next tick can pick it up.\n if (deferredDrain) {\n queue.requeue(deferredDrain)\n }\n\n store.commitTick({\n tickSeq: currentTickSeq,\n accepted: acceptedDrain,\n onListener: (listener) => listener(),\n })\n\n if (!captured.stable && shouldEmitTrace && backlog?.deferredPrimary) {\n const primary = backlog.deferredPrimary\n if (primary.kind === 'externalStore') {\n const moduleInstanceKey =\n primary.moduleId && primary.instanceId ? (`${primary.moduleId}::${primary.instanceId}` as ModuleInstanceKey) : undefined\n if (moduleInstanceKey && store.getModuleSubscriberCount(moduleInstanceKey) > 0) {\n yield* Debug.record({\n type: 'warn:priority-inversion',\n moduleId: primary.moduleId,\n instanceId: primary.instanceId,\n tickSeq: currentTickSeq,\n reason: 'deferredBacklog',\n })\n }\n }\n }\n\n if (shouldEmitTrace) {\n yield* Debug.record({\n type: 'trace:tick',\n moduleId: anchor?.moduleId,\n instanceId: anchor?.instanceId,\n data: {\n tickSeq: currentTickSeq,\n phase: 'settled',\n timestampMs: Date.now(),\n schedule,\n triggerSummary,\n anchors: anchor,\n budget: {\n maxSteps: config.maxSteps,\n elapsedMs: Math.max(0, Date.now() - startedAtMs!),\n steps: acceptedModules.size,\n txnCount: acceptedModules.size,\n },\n backlog,\n result,\n },\n })\n }\n\n if (telemetry?.onTickDegraded && (schedule.forcedMacrotask || !captured.stable) && shouldSampleTick(currentTickSeq, telemetrySampleRate)) {\n try {\n telemetry.onTickDegraded({\n tickSeq: currentTickSeq,\n stable: captured.stable,\n degradeReason: captured.stable ? undefined : (captured.degradeReason ?? 'unknown'),\n forcedMacrotask: schedule.forcedMacrotask,\n scheduleReason: schedule.reason,\n microtaskChainDepth: schedule.microtaskChainDepth,\n deferredWorkCount: deferredDrain ? deferredDrain.modules.size + deferredDrain.dirtyTopics.size : 0,\n })\n } catch {\n // best-effort: never let user telemetry break the tick\n }\n }\n coalescedModules = 0\n coalescedTopics = 0\n\n return { stable: captured.stable, degradeReason: captured.degradeReason }\n })\n\n const flushNow: TickScheduler['flushNow'] = Effect.gen(function* () {\n const beforeTickSeq = tickSeq\n yield* flushTick({ startedAs: 'unknown' })\n\n if (tickSeq > beforeTickSeq) {\n return\n }\n\n if (!queue.hasPending() && !scheduled) {\n return\n }\n\n yield* Effect.yieldNow\n if (tickSeq > beforeTickSeq) {\n return\n }\n\n if (queue.hasPending()) {\n yield* flushTick({ startedAs: 'unknown' })\n }\n }).pipe(Effect.asVoid)\n\n const storeTopicToModuleInstanceKey = (topicKey: string): ModuleInstanceKey | undefined => {\n const cached = topicKeyToModuleInstanceKeyCache.get(topicKey)\n if (cached !== undefined) {\n return cached === null ? undefined : cached\n }\n\n const idx = topicKey.indexOf('::rq:')\n if (idx > 0) {\n return rememberTopicKeyResolution(topicKey, topicKey.slice(0, idx) as ModuleInstanceKey)\n }\n if (topicKey.includes('::')) {\n return rememberTopicKeyResolution(topicKey, topicKey as ModuleInstanceKey)\n }\n return rememberTopicKeyResolution(topicKey, undefined)\n }\n\n const onSelectorChanged: TickScheduler['onSelectorChanged'] = ({ moduleInstanceKey, selectorId, priority }) => {\n const coalesced = queue.markTopicDirty(makeReadQueryTopicKey(moduleInstanceKey, selectorId), priority)\n if (coalesced) coalescedTopics += 1\n }\n\n const onModuleCommit: TickScheduler['onModuleCommit'] = (commit) =>\n Effect.gen(function* () {\n const coalescedCommit = queue.enqueueModuleCommit(commit)\n if (coalescedCommit) coalescedModules += 1\n const coalescedTopic = queue.markTopicDirty(commit.moduleInstanceKey, commit.meta.priority)\n if (coalescedTopic) coalescedTopics += 1\n yield* scheduleTick()\n })\n\n return {\n getTickSeq: () => tickSeq,\n onModuleCommit,\n onSelectorChanged,\n flushNow,\n }\n}\n","import { Cause, Effect, Layer, Logger, Option, ServiceMap } 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'\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 budgetEnvelope?: ProcessProtocol.ProcessEvent['budgetEnvelope']\n readonly degrade?: ProcessProtocol.ProcessEvent['degrade']\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 opSeq?: number\n readonly trigger?: TriggerRef\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'warn:priority-inversion'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly tickSeq: number\n readonly reason: 'deferredBacklog' | 'subscribedNonUrgent'\n readonly selectorId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'warn:microtask-starvation'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly tickSeq: number\n readonly microtaskChainDepth?: number\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n /**\n * trace:* events:\n * - Extension hook for runtime tracing / Playground / Alignment Lab.\n * - Only the type prefix and moduleId are standardized; payload shape is defined by higher layers (e.g. spanId/attributes in data).\n */\n | {\n readonly type: 'trace:trait:converge'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data: JsonValue\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'trace:trait:check'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data: JsonValue\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: 'trace:trait:validate'\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data: JsonValue\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n | {\n readonly type: GenericTraceEventType\n readonly moduleId?: string\n readonly instanceId?: string\n readonly data?: unknown\n readonly txnSeq?: number\n readonly txnId?: string\n readonly runtimeLabel?: string\n readonly timestamp?: number\n }\n\nexport interface Sink {\n readonly record: (event: Event) => Effect.Effect<void>\n}\nexport const currentDebugSinks = ServiceMap.Reference<ReadonlyArray<Sink>>('@logixjs/core/Debug.currentDebugSinks', {\n defaultValue: () => [],\n})\nexport const currentRuntimeLabel = ServiceMap.Reference<string | undefined>('@logixjs/core/Debug.currentRuntimeLabel', {\n defaultValue: () => undefined,\n})\nexport const currentTxnId = ServiceMap.Reference<string | undefined>('@logixjs/core/Debug.currentTxnId', {\n defaultValue: () => undefined,\n})\nexport const currentOpSeq = ServiceMap.Reference<number | undefined>('@logixjs/core/Debug.currentOpSeq', {\n defaultValue: () => undefined,\n})\nexport type DiagnosticsLevel = 'off' | 'light' | 'sampled' | 'full'\nexport const currentDiagnosticsLevel = ServiceMap.Reference<DiagnosticsLevel>('@logixjs/core/Debug.currentDiagnosticsLevel', {\n defaultValue: () => 'off',\n})\n\nexport const diagnosticsLevel = (level: DiagnosticsLevel): Layer.Layer<any, never, never> =>\n Layer.succeed(currentDiagnosticsLevel, level) as Layer.Layer<any, never, never>\n\nexport type DiagnosticsMaterialization = 'eager' | 'lazy'\nexport const currentDiagnosticsMaterialization = ServiceMap.Reference<DiagnosticsMaterialization>(\n '@logixjs/core/Debug.currentDiagnosticsMaterialization',\n {\n defaultValue: () => 'eager',\n },\n)\n\nexport const diagnosticsMaterialization = (mode: DiagnosticsMaterialization): Layer.Layer<any, never, never> =>\n Layer.succeed(currentDiagnosticsMaterialization, mode) as Layer.Layer<any, never, never>\n\nexport type TraceMode = 'off' | 'on'\nexport const currentTraceMode = ServiceMap.Reference<TraceMode>('@logixjs/core/Debug.currentTraceMode', {\n defaultValue: () => 'on',\n})\n\nexport const traceMode = (mode: TraceMode): Layer.Layer<any, never, never> =>\n Layer.succeed(currentTraceMode, mode) 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 = ServiceMap.Reference<TraitConvergeDiagnosticsSamplingConfig>(\n '@logixjs/core/Debug.currentTraitConvergeDiagnosticsSampling',\n {\n defaultValue: () => ({\n sampleEveryN: 32,\n topK: 3,\n }),\n },\n)\n\nexport const traitConvergeDiagnosticsSampling = (\n config: TraitConvergeDiagnosticsSamplingConfig,\n): Layer.Layer<any, never, never> =>\n Layer.succeed(currentTraitConvergeDiagnosticsSampling, config) as Layer.Layer<any, never, never>\n\nexport const appendSinks = (sinks: ReadonlyArray<Sink>): Layer.Layer<any, never, never> =>\n Layer.effect(\n currentDebugSinks,\n Effect.gen(function* () {\n const current = yield* Effect.service(currentDebugSinks)\n return [...current, ...sinks]\n }),\n ) as Layer.Layer<any, never, never>\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' | 'budget_exceeded' | '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 | 'budget_exceeded'\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 if (current === 'budget_exceeded' || next === 'budget_exceeded') return 'budget_exceeded'\n return 'unknown'\n}\n\nconst stripDirtyRootPaths = (value: unknown): unknown => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n const { rootPaths, ...rest } = value as Record<string, unknown> & { readonly rootPaths?: unknown }\n return rest\n}\n\nconst stripTraitConvergeLegacyFields = (value: JsonValue): JsonValue => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n\n const anyValue = value as any\n const { dirtyRoots, ...rest } = anyValue\n const dirty = (rest as any).dirty\n if (!dirty || typeof dirty !== 'object' || Array.isArray(dirty)) {\n return rest as JsonValue\n }\n\n return {\n ...rest,\n dirty: stripDirtyRootPaths(dirty),\n } as JsonValue\n}\n\nconst stripTraitConvergeLight = (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 ...(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 }\n : undefined\n\n const { top3, dirtyRoots, ...rest } = anyValue\n return (dirtySlim ? { ...rest, dirty: dirtySlim } : rest) as JsonValue\n}\n\nconst stripTraitConvergeSampled = (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\nconst stripTraitCheckLight = (value: JsonValue): JsonValue => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n\n const anyValue = value as any\n const degraded = anyValue.degraded\n const degradedSlim =\n degraded && typeof degraded === 'object' && !Array.isArray(degraded) ? { kind: (degraded as any).kind } : undefined\n const summary = anyValue.summary\n let summarySlim: Record<string, number> | undefined\n if (summary && typeof summary === 'object' && !Array.isArray(summary)) {\n const candidate: Record<string, number> = {}\n let hasSummaryField = false\n if (typeof (summary as any).scannedRows === 'number') {\n candidate.scannedRows = (summary as any).scannedRows\n hasSummaryField = true\n }\n if (typeof (summary as any).affectedRows === 'number') {\n candidate.affectedRows = (summary as any).affectedRows\n hasSummaryField = true\n }\n if (typeof (summary as any).changedRows === 'number') {\n candidate.changedRows = (summary as any).changedRows\n hasSummaryField = true\n }\n if (hasSummaryField) {\n summarySlim = candidate\n }\n }\n\n const slim: Record<string, unknown> = {}\n if (typeof anyValue.ruleId === 'string') slim.ruleId = anyValue.ruleId\n if (Array.isArray(anyValue.scopeFieldPath)) slim.scopeFieldPath = anyValue.scopeFieldPath\n if (typeof anyValue.mode === 'string') slim.mode = anyValue.mode\n if (anyValue.trigger && typeof anyValue.trigger === 'object' && !Array.isArray(anyValue.trigger)) {\n slim.trigger = anyValue.trigger\n }\n if (typeof anyValue.rowIdMode === 'string') slim.rowIdMode = anyValue.rowIdMode\n if (summarySlim) slim.summary = summarySlim\n if (degradedSlim) slim.degraded = degradedSlim\n\n return slim as JsonValue\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 } 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.succeed(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.succeed(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.succeed(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>)\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.succeed(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.succeed(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 = Layer.effect(\n Logger.CurrentLoggers,\n Effect.gen(function* () {\n const current = yield* Effect.service(Logger.CurrentLoggers)\n return new Set(\n [...current].filter((logger) => logger !== Logger.defaultLogger).concat(Logger.consolePretty({ mode: 'browser', colors: true })),\n )\n }),\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* Effect.service(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' && event.severity !== 'info') {\n yield* diagnosticLog(event)\n }\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 }\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 }\n return\n }\n\n // Trace events are performance-sensitive and should be explicitly enabled.\n // Keep the check scoped to trace:* only so non-trace events stay on the fast path.\n if (typeof event.type === 'string' && event.type.startsWith('trace:')) {\n const mode = yield* Effect.service(currentTraceMode)\n if (mode === 'off') return\n }\n\n const enriched = event as Event\n\n const diagnosticsLevel = yield* Effect.service(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* Effect.service(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* Effect.service(currentTxnId)\n if (txnId) {\n ;(enriched as any).txnId = txnId\n }\n }\n\n if (\n diagnosticsLevel !== 'off' &&\n (enriched as any).type === 'trace:effectop' &&\n (enriched as any).linkId === undefined\n ) {\n const maybeLinkId = yield* Effect.serviceOption(EffectOpCore.currentLinkId)\n if (Option.isSome(maybeLinkId) && maybeLinkId.value) {\n ;(enriched as any).linkId = maybeLinkId.value\n }\n }\n\n if (sinks.length === 1) {\n yield* sinks[0]!.record(enriched)\n return\n }\n\n yield* Effect.forEach(sinks as ReadonlyArray<Sink>, (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 materialization?: DiagnosticsMaterialization\n readonly eventSeq?: number\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 const materialization = options?.materialization ?? 'eager'\n const isLazyMaterialization = materialization === 'lazy'\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 const dirtySetCanonical = stripDirtyRootPaths(e.dirtySet)\n const slimMetaInput: Record<string, unknown> = {}\n if (dirtySetCanonical !== undefined) slimMetaInput.dirtySet = dirtySetCanonical\n if (e.patchCount !== undefined) slimMetaInput.patchCount = e.patchCount\n if (e.patchesTruncated !== undefined) slimMetaInput.patchesTruncated = e.patchesTruncated\n if (e.patchesTruncatedReason !== undefined) slimMetaInput.patchesTruncatedReason = e.patchesTruncatedReason\n if (e.staticIrDigest !== undefined) slimMetaInput.staticIrDigest = e.staticIrDigest\n if (e.commitMode !== undefined) slimMetaInput.commitMode = e.commitMode\n if (e.priority !== undefined) slimMetaInput.priority = e.priority\n if (e.originKind !== undefined) slimMetaInput.originKind = e.originKind\n if (e.originName !== undefined) slimMetaInput.originName = e.originName\n\n const metaInput = isLightLike\n ? isLazyMaterialization\n ? slimMetaInput\n : { state: e.state, ...slimMetaInput }\n : isLazyMaterialization\n ? slimMetaInput\n : { state: e.state, ...slimMetaInput, traitSummary: e.traitSummary, replayEvent: e.replayEvent }\n\n const metaProjection = isLazyMaterialization\n ? {\n value: metaInput as unknown as JsonValue,\n stats: { dropped: 0, oversized: 0, nonSerializable: 0 } satisfies JsonValueProjectionStats,\n downgrade: undefined,\n }\n : 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 budgetEnvelope: (e as any).budgetEnvelope,\n degrade: (e as any).degrade,\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 processDegradeReason = (() => {\n const marker = (e as any).degrade\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) return undefined\n if ((marker as any).degraded !== true) return undefined\n const reason = (marker as any).reason\n if (reason === 'budget_exceeded') return 'budget_exceeded' as const\n if (reason === 'payload_oversized') return 'oversized' as const\n if (reason === 'payload_non_serializable') return 'non_serializable' as const\n return 'unknown' as const\n })()\n downgrade = mergeDowngrade(downgrade, processDegradeReason)\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 opSeq: e.opSeq,\n trigger: e.trigger,\n }\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n return withDowngrade({\n ...base,\n kind: 'diagnostic',\n label: e.code,\n meta: metaProjection.value,\n })\n }\n case 'warn:priority-inversion': {\n const e = event as Extract<Event, { readonly type: 'warn:priority-inversion' }>\n const metaInput = isLightLike\n ? {\n tickSeq: e.tickSeq,\n reason: e.reason,\n selectorId: e.selectorId,\n }\n : {\n tickSeq: e.tickSeq,\n reason: e.reason,\n selectorId: e.selectorId,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'diagnostic',\n label: e.type,\n meta: metaProjection.value,\n })\n }\n case 'warn:microtask-starvation': {\n const e = event as Extract<Event, { readonly type: 'warn:microtask-starvation' }>\n const metaInput = isLightLike\n ? {\n tickSeq: e.tickSeq,\n microtaskChainDepth: e.microtaskChainDepth,\n }\n : {\n tickSeq: e.tickSeq,\n microtaskChainDepth: e.microtaskChainDepth,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'diagnostic',\n label: e.type,\n meta: metaProjection.value,\n })\n }\n default: {\n if (typeof event.type !== 'string' || !event.type.startsWith('trace:')) {\n return undefined\n }\n\n // trace:devtools:ring-trim-policy: emit a stable slim payload for ring trim policy changes.\n if (event.type === 'trace:devtools:ring-trim-policy') {\n const data = (event as {\n readonly data?: {\n readonly mode?: unknown\n readonly threshold?: unknown\n readonly bufferSize?: unknown\n }\n }).data\n const metaInput = {\n mode: data?.mode,\n threshold: data?.threshold,\n bufferSize: data?.bufferSize,\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:tick: runtime tick evidence; keep Slim payload even in light tier.\n if (event.type === 'trace:tick') {\n const data: any = (event as any).data\n const metaInput = isLightLike\n ? {\n tickSeq: data?.tickSeq,\n phase: data?.phase,\n schedule: data?.schedule,\n triggerSummary: data?.triggerSummary,\n anchors: data?.anchors,\n budget: data?.budget,\n backlog: data?.backlog,\n result: data?.result,\n }\n : {\n data,\n }\n\n const metaProjection = projectJsonValue(metaInput)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n return withDowngrade({\n ...base,\n kind: 'devtools',\n label: event.type,\n meta: metaProjection.value,\n })\n }\n\n // trace:txn-lane: slim evidence for Txn Lanes (lane/backlog/reasons), used for Devtools summary and offline export.\n if (event.type === 'trace:txn-lane') {\n const data: any = (event as any).data\n const evidence = data?.evidence ?? data\n\n const metaProjection = projectJsonValue(evidence)\n options?.onMetaProjection?.({\n stats: metaProjection.stats,\n downgrade: metaProjection.downgrade,\n })\n downgrade = mergeDowngrade(downgrade, metaProjection.downgrade)\n\n const label =\n typeof evidence?.kind === 'string' && evidence.kind.length > 0 ? String(evidence.kind) : 'txn-lane'\n\n return withDowngrade({\n ...base,\n kind: 'txn-lane',\n label,\n meta: metaProjection.value,\n })\n }\n\n if (event.type === 'trace:txn-phase') {\n const data: any = (event as any).data\n const metaInput = isLightLike\n ? {\n kind: data?.kind,\n originKind: data?.originKind,\n originName: data?.originName,\n commitMode: data?.commitMode,\n priority: data?.priority,\n txnPreludeMs: data?.txnPreludeMs,\n queue: data?.queue\n ? {\n lane: data.queue.lane,\n contextLookupMs: data.queue.contextLookupMs,\n resolvePolicyMs: data.queue.resolvePolicyMs,\n backpressureMs: data.queue.backpressureMs,\n enqueueBookkeepingMs: data.queue.enqueueBookkeepingMs,\n queueWaitMs: data.queue.queueWaitMs,\n startHandoffMs: data.queue.startHandoffMs,\n startMode: data.queue.startMode,\n }\n : undefined,\n dispatchActionRecordMs: data?.dispatchActionRecordMs,\n dispatchActionCommitHubMs: data?.dispatchActionCommitHubMs,\n dispatchActionCount: data?.dispatchActionCount,\n bodyShellMs: data?.bodyShellMs,\n asyncEscapeGuardMs: data?.asyncEscapeGuardMs,\n traitConvergeMs: data?.traitConvergeMs,\n scopedValidateMs: data?.scopedValidateMs,\n sourceSyncMs: data?.sourceSyncMs,\n commit: data?.commit\n ? {\n totalMs: data.commit.totalMs,\n rowIdSyncMs: data.commit.rowIdSyncMs,\n publishCommitMs: data.commit.publishCommitMs,\n stateUpdateDebugRecordMs: data.commit.stateUpdateDebugRecordMs,\n onCommitBeforeStateUpdateMs: data.commit.onCommitBeforeStateUpdateMs,\n onCommitAfterStateUpdateMs: data.commit.onCommitAfterStateUpdateMs,\n }\n : undefined,\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: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 data = (event as Extract<Event, { readonly type: 'trace:trait:converge' }>).data\n const metaInput =\n diagnosticsLevel === 'light'\n ? stripTraitConvergeLight(data)\n : diagnosticsLevel === 'sampled'\n ? stripTraitConvergeSampled(data)\n : stripTraitConvergeLegacyFields(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 data = (event as Extract<Event, { readonly type: 'trace:trait:check' }>).data\n const metaInput = isLightLike ? stripTraitCheckLight(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 keys = Object.keys(input).sort()\n const limit = Math.min(keys.length, options.maxObjectKeys)\n const out: Record<string, JsonValue> = {}\n\n for (let i = 0; i < limit; i++) {\n const rawKey = keys[i]!\n const rawValue = (input as any)[rawKey]\n const key = truncateString(rawKey, options.maxStringLength, stats)\n if (rawValue === undefined) {\n stats.dropped += 1\n continue\n }\n out[key] = toJsonValueInternal(rawValue, options, stats, seen, depth + 1)\n }\n\n if (keys.length > limit) {\n stats.oversized += 1\n out.__truncatedKeys = keys.length - limit\n }\n\n return out\n}\n\nexport const projectJsonValue = (input: unknown, options?: JsonValueProjectOptions): JsonValueProjection => {\n const resolved: Required<JsonValueProjectOptions> = { ...defaultOptions, ...(options ?? {}) }\n const stats: MutableStats = { dropped: 0, oversized: 0, nonSerializable: 0 }\n const seen = new WeakSet<object>()\n\n let downgrade: DowngradeReason | undefined\n const value = toJsonValueInternal(input, resolved, stats, seen, 0)\n\n if (stats.nonSerializable > 0) {\n downgrade = mergeDowngrade(downgrade, 'non_serializable')\n }\n if (stats.oversized > 0) {\n downgrade = mergeDowngrade(downgrade, 'oversized')\n }\n\n // Hard gate: ensure JSON.stringify never throws and respect the max byte budget.\n try {\n const json = JSON.stringify(value)\n if (json.length > resolved.maxJsonBytes) {\n downgrade = mergeDowngrade(downgrade, 'oversized')\n const preview = json.slice(0, Math.min(resolved.oversizedPreviewBytes, resolved.maxJsonBytes))\n return {\n value: {\n _tag: 'oversized',\n bytes: json.length,\n preview,\n },\n stats: {\n dropped: stats.dropped,\n oversized: stats.oversized + 1,\n nonSerializable: stats.nonSerializable,\n },\n downgrade,\n }\n }\n } catch {\n downgrade = mergeDowngrade(downgrade, 'non_serializable')\n return {\n value: '[Unserializable]',\n stats: {\n dropped: stats.dropped,\n oversized: stats.oversized,\n nonSerializable: stats.nonSerializable + 1,\n },\n downgrade,\n }\n }\n\n return {\n value,\n stats: {\n dropped: stats.dropped,\n oversized: stats.oversized,\n nonSerializable: stats.nonSerializable,\n },\n downgrade,\n }\n}\n","import { 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>)\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 { Effect, ServiceMap } from 'effect'\n\nexport const currentLinkId = ServiceMap.Reference<string | undefined>('@logixjs/core/CurrentLinkId', {\n defaultValue: () => undefined,\n})\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\nconst composeMiddlewareCache = new WeakMap<MiddlewareStack, 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 ServiceMap.Service<\n EffectOpMiddlewareTag,\n EffectOpMiddlewareEnv\n>()('Logix/EffectOpMiddleware') {}\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 const cached = composeMiddlewareCache.get(stack)\n if (cached) {\n return cached\n }\n\n const composed: Middleware = <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 composeMiddlewareCache.set(stack, composed)\n return composed\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* Effect.service(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.provideService(program as any, currentLinkId, linkId)\n }) as Effect.Effect<A, E, R>\n}\n","import { Cause, Effect, ServiceMap, Stream } from 'effect'\nimport * as Debug from './DebugSink.js'\nimport { isDevEnv } from './env.js'\nimport type * as Logic from './LogicMiddleware.js'\nimport type { AnyModuleShape, LogicEffect } from './module.js'\nimport type { RuntimeInternalsResolvedConcurrencyPolicy } from './RuntimeInternals.js'\nimport type { StateTxnOrigin } from './StateTransaction.js'\nimport * as ModeRunner from './ModeRunner.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 = ServiceMap.Reference<boolean>('@logixjs/core/TaskRunner.inSyncTransactionFiber', {\n defaultValue: () => false,\n})\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 = ServiceMap.Reference<boolean>('@logixjs/core/TaskRunner.forceSourceRefresh', {\n defaultValue: () => false,\n})\n\nlet inSyncTransactionShadowDepth = 0\n\nexport const enterSyncTransactionShadow = (): void => {\n inSyncTransactionShadowDepth += 1\n}\n\nexport const exitSyncTransactionShadow = (): void => {\n inSyncTransactionShadowDepth = Math.max(0, inSyncTransactionShadowDepth - 1)\n}\n\nexport const isInSyncTransactionShadow = (): boolean => inSyncTransactionShadowDepth > 0\n\nexport const enterSyncTransaction = (): void => {\n enterSyncTransactionShadow()\n}\n\nexport const exitSyncTransaction = (): void => {\n exitSyncTransactionShadow()\n}\n\nexport const isInSyncTransaction = (): boolean => isInSyncTransactionShadow()\n\nexport type TaskRunnerMode = ModeRunner.ModeRunnerMode\n\nexport type TaskStatus = 'idle' | 'pending' | 'running' | 'success' | 'failure' | 'interrupted'\n\nexport interface TaskExecution {\n readonly taskId: number\n readonly status: TaskStatus\n readonly acceptedAt: number\n readonly startedAt?: number\n readonly endedAt?: number\n}\n\nexport interface TaskRunnerOrigins {\n readonly pending?: StateTxnOrigin\n readonly success?: StateTxnOrigin\n readonly failure?: StateTxnOrigin\n}\n\ntype TaskHandler<Payload, Sh extends AnyModuleShape, R> =\n | LogicEffect<Sh, R, void, never>\n | ((payload: Payload) => LogicEffect<Sh, R, void, never>)\n\ntype TaskEffect<Payload, Sh extends AnyModuleShape, R, A, E> =\n | LogicEffect<Sh, R, A, E>\n | ((payload: Payload) => LogicEffect<Sh, R, A, E>)\n\nexport interface TaskRunnerConfig<Payload, Sh extends AnyModuleShape, R, A = void, E = never> {\n /**\n * Optional: trigger source name (e.g. actionTag / fieldPath), used as the default pending origin.name.\n * - BoundApiRuntime may fill this in for onAction(\"xxx\") / traits.source.refresh(\"field\"), etc.\n * - Other callers are not required to provide it.\n */\n readonly triggerName?: string\n\n /**\n * pending: synchronous state writes (loading=true / clearing errors, etc.), always a separate transaction entry.\n * - Only executed for tasks that are accepted and actually started (ignored triggers in runExhaustTask do not run pending).\n */\n readonly pending?: TaskHandler<Payload, Sh, R>\n\n /**\n * effect: real IO / async work (must run outside the transaction window).\n */\n readonly effect: TaskEffect<Payload, Sh, R, A, E>\n\n /**\n * success: success writeback (separate transaction entry).\n */\n readonly success?: (result: A, payload: Payload) => LogicEffect<Sh, R, void, never>\n\n /**\n * failure: failure writeback (separate transaction entry).\n *\n * Note: takes a Cause to preserve defect/interrupt semantics; interrupts do not trigger failure writeback by default.\n */\n readonly failure?: (cause: Cause.Cause<E>, payload: Payload) => LogicEffect<Sh, R, void, never>\n\n /**\n * origin: optional override for the three transaction origins.\n * - Default: pending.kind=\"task:pending\"; success/failure.kind=\"service-callback\".\n */\n readonly origin?: TaskRunnerOrigins\n\n /**\n * priority: reserved for future debugging/sorting; does not change transaction boundaries or concurrency semantics.\n */\n readonly priority?: number\n}\n\nexport interface TaskRunnerRuntime {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly runWithStateTransaction: (\n origin: StateTxnOrigin,\n body: () => Effect.Effect<void, never, any>,\n ) => Effect.Effect<void, never, any>\n readonly resolveConcurrencyPolicy?: () => Effect.Effect<RuntimeInternalsResolvedConcurrencyPolicy, never, any>\n}\n\nconst resolve = <Payload, Sh extends AnyModuleShape, R, A, E>(\n eff: TaskEffect<Payload, Sh, R, A, E> | TaskHandler<Payload, Sh, R>,\n payload: Payload,\n): any => (typeof eff === 'function' ? (eff as any)(payload) : eff)\n\nconst defaultOrigins = (triggerName: string | undefined): Required<TaskRunnerOrigins> => ({\n pending: {\n kind: 'task:pending',\n name: triggerName,\n },\n success: {\n kind: 'service-callback',\n name: 'task:success',\n },\n failure: {\n kind: 'service-callback',\n name: 'task:failure',\n },\n})\n\nexport const shouldNoopInSyncTransactionFiber = (options: {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly code: string\n readonly severity: 'error' | 'warning' | 'info'\n readonly message: string\n readonly hint?: string\n readonly actionTag?: string\n readonly kind?: string\n}): Effect.Effect<boolean> =>\n Effect.gen(function* () {\n const inTxn = yield* Effect.service(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.hasInterruptsOnly(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.catchCause((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.flatMap(() => Effect.logError('TaskRunner error', cause)))),\n ) as Effect.Effect<void, never, Logic.Env<Sh, R>>\n\n/**\n * runTask:\n * - Uses shared ModeRunner semantics (task/parallel/latest/exhaust).\n * - Splits a single trigger into: pending (separate txn) → IO → success/failure (separate txn).\n */\nexport interface RunTaskConfig<Payload, Sh extends AnyModuleShape, R, A = void, E = never> {\n readonly stream: Stream.Stream<Payload>\n readonly mode?: TaskRunnerMode\n runtime: TaskRunnerRuntime,\n config: TaskRunnerConfig<Payload, Sh, R, A, E>\n}\n\nexport const runTask = <Payload, Sh extends AnyModuleShape, R, A = void, E = never>(\n args: RunTaskConfig<Payload, Sh, R, A, E>,\n): Effect.Effect<void, never, Logic.Env<Sh, R>> => {\n const mode = args.mode ?? 'task'\n const runtime = args.runtime\n const config = args.config\n\n return ModeRunner.runByMode<Payload, never, Logic.Env<Sh, R>>({\n stream: args.stream,\n mode,\n run: (payload) => runTaskLifecycle<Payload, Sh, R, A, E>(payload, runtime, config),\n runLatest: (payload, context) =>\n runTaskLifecycle<Payload, Sh, R, A, E>(payload, runtime, config, context.isCurrent),\n resolveConcurrencyLimit: resolveConcurrencyLimit(runtime),\n latest: {\n strategy: 'fiber-slot',\n // Keep TaskRunner behavior: triggers are acknowledged once started; no need to await final IO on stream completion.\n awaitLatestOnEnd: false,\n },\n }) as Effect.Effect<void, never, Logic.Env<Sh, R>>\n}\n\n/**\n * makeTaskRunner:\n * - Backward-compatible thin alias for runTask.\n * - Signature stays stable for existing Bound API callsites.\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 runTask<Payload, Sh, R, A, E>({\n stream,\n mode,\n runtime,\n config,\n })\n","import { Effect, Fiber, Ref, Stream } from 'effect'\nimport * as LatestFiberSlot from './LatestFiberSlot.js'\n\nconst EXHAUST_ACQUIRE_BUSY = [true, true] as const\nconst EXHAUST_REJECT_BUSY = [false, true] as const\n\nexport type ModeRunnerMode =\n | 'task' // sequential\n | 'parallel'\n | 'latest'\n | 'exhaust'\n\nexport type ModeRunnerLatestStrategy = 'switch' | 'fiber-slot'\n\nexport interface ModeRunnerLatestContext {\n readonly runId: number\n readonly isCurrent: Effect.Effect<boolean>\n}\n\nexport interface ModeRunnerConfig<Payload, E, R> {\n readonly stream: Stream.Stream<Payload>\n readonly mode: ModeRunnerMode\n readonly run: (payload: Payload) => Effect.Effect<void, E, R>\n readonly runLatest?: (payload: Payload, context: ModeRunnerLatestContext) => Effect.Effect<void, E, R>\n readonly resolveConcurrencyLimit: Effect.Effect<number | 'unbounded', never, any>\n readonly latest?: {\n readonly strategy?: ModeRunnerLatestStrategy\n readonly awaitLatestOnEnd?: boolean\n }\n}\n\ntype SwitchLatestState = {\n runningId: number\n nextId: number\n}\n\nconst beginSwitchLatestRun = (stateRef: Ref.Ref<SwitchLatestState>) =>\n Ref.modify(stateRef, (state) => {\n const runId = state.nextId + 1\n state.nextId = runId\n state.runningId = runId\n return [runId, state] as const\n })\n\nconst clearSwitchLatestIfCurrent = (stateRef: Ref.Ref<SwitchLatestState>, runId: number) =>\n Ref.update(stateRef, (state) => {\n if (state.runningId === runId) {\n state.runningId = 0\n }\n return state\n })\n\nconst runLatestSwitch = <Payload, E, R>(\n stream: Stream.Stream<Payload>,\n runLatest: (payload: Payload, context: ModeRunnerLatestContext) => Effect.Effect<void, E, R>,\n): Effect.Effect<void, E, R> =>\n Effect.gen(function* () {\n const stateRef = yield* Ref.make<SwitchLatestState>({\n runningId: 0,\n nextId: 0,\n })\n\n const makeEffect = (payload: Payload) =>\n Effect.gen(function* () {\n const runId = yield* beginSwitchLatestRun(stateRef)\n const isCurrent = Ref.get(stateRef).pipe(Effect.map((state) => state.runningId === runId))\n yield* runLatest(payload, { runId, isCurrent }).pipe(Effect.ensuring(clearSwitchLatestIfCurrent(stateRef, runId)))\n })\n\n return yield* Stream.runDrain(\n Stream.map(stream, makeEffect).pipe(Stream.switchMap((effect) => Stream.fromEffect(effect))),\n )\n })\n\nconst runLatestFiberSlot = <Payload, E, R>(\n stream: Stream.Stream<Payload>,\n runLatest: (payload: Payload, context: ModeRunnerLatestContext) => Effect.Effect<void, E, R>,\n awaitLatestOnEnd: boolean,\n): Effect.Effect<void, E, R> =>\n Effect.gen(function* () {\n const stateRef = yield* LatestFiberSlot.make<E>()\n\n const start = (payload: Payload) =>\n Effect.gen(function* () {\n const [prevFiber, prevRunningId, runId] = yield* LatestFiberSlot.beginRun(stateRef)\n\n if (prevFiber && prevRunningId !== 0) {\n // Do not wait for full shutdown of old work; stale writes are guarded by runId.\n yield* Fiber.interrupt(prevFiber)\n }\n\n const isCurrent = Ref.get(stateRef).pipe(Effect.map((state) => state.runningId === runId))\n const fiber = yield* Effect.forkChild(\n runLatest(payload, { runId, isCurrent }).pipe(Effect.ensuring(LatestFiberSlot.clearIfCurrent(stateRef, runId))),\n )\n yield* LatestFiberSlot.setFiberIfCurrent(stateRef, runId, fiber)\n })\n\n yield* Stream.runForEach(stream, start)\n\n if (!awaitLatestOnEnd) {\n return\n }\n\n const finalState = yield* Ref.get(stateRef)\n const finalFiber = finalState.runningId !== 0 ? finalState.fiber : undefined\n if (finalFiber) {\n yield* Fiber.join(finalFiber)\n }\n })\n\nconst runExhaust = <Payload, E, R>(\n stream: Stream.Stream<Payload>,\n run: (payload: Payload) => Effect.Effect<void, E, R>,\n resolveConcurrencyLimit: Effect.Effect<number | 'unbounded', never, any>,\n): Effect.Effect<void, E, R> =>\n Effect.gen(function* () {\n const concurrency = yield* resolveConcurrencyLimit\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 ? EXHAUST_REJECT_BUSY : EXHAUST_ACQUIRE_BUSY,\n )\n if (!acquired) {\n return\n }\n try {\n yield* run(payload)\n } finally {\n yield* Ref.set(busyRef, false)\n }\n })\n\n return yield* Stream.runDrain(stream.pipe(Stream.mapEffect(mapper, { concurrency })))\n })\n\nconst runParallel = <Payload, E, R>(\n stream: Stream.Stream<Payload>,\n run: (payload: Payload) => Effect.Effect<void, E, R>,\n resolveConcurrencyLimit: Effect.Effect<number | 'unbounded', never, any>,\n): Effect.Effect<void, E, R> =>\n Effect.gen(function* () {\n const concurrency = yield* resolveConcurrencyLimit\n return yield* Stream.runDrain(stream.pipe(Stream.mapEffect(run, { concurrency })))\n })\n\nexport const runByMode = <Payload, E, R>(config: ModeRunnerConfig<Payload, E, R>): Effect.Effect<void, E, R> => {\n const runLatest = config.runLatest ?? ((payload: Payload) => config.run(payload))\n if (config.mode === 'latest') {\n const strategy = config.latest?.strategy ?? 'switch'\n if (strategy === 'fiber-slot') {\n return runLatestFiberSlot(config.stream, runLatest, config.latest?.awaitLatestOnEnd ?? false)\n }\n return runLatestSwitch(config.stream, runLatest)\n }\n\n if (config.mode === 'exhaust') {\n return runExhaust(config.stream, config.run, config.resolveConcurrencyLimit)\n }\n\n if (config.mode === 'parallel') {\n return runParallel(config.stream, config.run, config.resolveConcurrencyLimit)\n }\n\n return Stream.runForEach(config.stream, config.run)\n}\n","import { Fiber, Ref } from 'effect'\n\nexport type LatestFiberSlotState<E = never> = {\n fiber: Fiber.Fiber<void, E> | undefined\n runningId: number\n nextId: number\n}\n\nexport const make = <E = never>() =>\n Ref.make<LatestFiberSlotState<E>>({\n fiber: undefined,\n runningId: 0,\n nextId: 0,\n })\n\nexport const beginRun = <E>(slotRef: Ref.Ref<LatestFiberSlotState<E>>) =>\n Ref.modify(slotRef, (state) => {\n const runId = state.nextId + 1\n const prevFiber = state.fiber\n const prevRunningId = state.runningId\n state.nextId = runId\n state.runningId = runId\n return [[prevFiber, prevRunningId, runId] as const, state] as const\n })\n\nexport const setFiberIfCurrent = <E>(\n slotRef: Ref.Ref<LatestFiberSlotState<E>>,\n runId: number,\n fiber: Fiber.Fiber<void, E>,\n) =>\n Ref.update(slotRef, (state) => {\n if (state.runningId === runId) {\n state.fiber = fiber\n }\n return state\n })\n\nexport const clearIfCurrent = <E>(slotRef: Ref.Ref<LatestFiberSlotState<E>>, runId: number) =>\n Ref.update(slotRef, (state) => {\n if (state.runningId === runId) {\n state.runningId = 0\n state.fiber = undefined\n }\n return state\n })\n","import { Effect } from 'effect'\nimport type { ReadQueryCompiled } from './ReadQuery.js'\nimport type { DeclarativeLinkIR, DeclarativeLinkNodeId } from './DeclarativeLinkIR.js'\nimport type { ModuleInstanceKey, RuntimeStoreModuleCommit } from './RuntimeStore.js'\n\nexport interface ModuleAsSourceLink {\n readonly id: string\n readonly sourceModuleInstanceKey: ModuleInstanceKey\n readonly readQuery: ReadQueryCompiled<any, any>\n readonly computeValue: (snapshot: unknown) => unknown\n readonly equalsValue: (a: unknown, b: unknown) => boolean\n readonly applyValue: (next: unknown) => Effect.Effect<void, never, never>\n}\n\nexport interface DeclarativeLinkRegistration {\n readonly linkId: string\n readonly ir: DeclarativeLinkIR\n readonly readNodes: ReadonlyArray<{\n readonly nodeId: DeclarativeLinkNodeId\n readonly moduleInstanceKey: ModuleInstanceKey\n readonly readQuery: ReadQueryCompiled<any, any>\n }>\n readonly dispatchNodes: ReadonlyArray<{\n readonly nodeId: DeclarativeLinkNodeId\n readonly dispatch: (payload: unknown) => Effect.Effect<void, never, never>\n }>\n}\n\nexport interface DeclarativeLinkRuntime {\n readonly registerModuleAsSourceLink: (link: ModuleAsSourceLink) => () => void\n readonly registerDeclarativeLink: (link: DeclarativeLinkRegistration) => () => void\n readonly applyForSources: (args: {\n readonly tickSeq: number\n readonly acceptedModules: ReadonlyMap<ModuleInstanceKey, RuntimeStoreModuleCommit>\n readonly changedModuleInstanceKeys: ReadonlyArray<ModuleInstanceKey>\n }) => Effect.Effect<{ readonly scheduled: boolean }, never, never>\n}\n\ntype StoredModuleAsSourceLink = ModuleAsSourceLink & {\n hasValue: boolean\n lastValue: unknown\n}\n\ntype StoredDeclarativeLink = DeclarativeLinkRegistration & {\n readonly readNodeById: ReadonlyMap<string, { readonly nodeId: DeclarativeLinkNodeId; readonly moduleInstanceKey: ModuleInstanceKey; readonly readQuery: ReadQueryCompiled<any, any> }>\n readonly dispatchNodeById: ReadonlyMap<string, { readonly nodeId: DeclarativeLinkNodeId; readonly dispatch: (payload: unknown) => Effect.Effect<void, never, never> }>\n readonly dispatchTargetsByReadNode: ReadonlyMap<string, ReadonlyArray<DeclarativeLinkNodeId>>\n readonly readNodeState: Map<string, { hasValue: boolean; lastValue: unknown }>\n}\n\nexport const makeDeclarativeLinkRuntime = (): DeclarativeLinkRuntime => {\n const moduleAsSourceById = new Map<string, StoredModuleAsSourceLink>()\n const moduleAsSourceIdsBySource = new Map<ModuleInstanceKey, Set<string>>()\n\n const declarativeById = new Map<string, StoredDeclarativeLink>()\n const declarativeReadNodesBySource = new Map<ModuleInstanceKey, Array<{ readonly linkId: string; readonly nodeId: DeclarativeLinkNodeId }>>()\n\n const registerModuleAsSourceLink: DeclarativeLinkRuntime['registerModuleAsSourceLink'] = (link) => {\n const stored: StoredModuleAsSourceLink = {\n ...link,\n hasValue: false,\n lastValue: undefined,\n }\n\n moduleAsSourceById.set(link.id, stored)\n const set = moduleAsSourceIdsBySource.get(link.sourceModuleInstanceKey) ?? new Set<string>()\n set.add(link.id)\n moduleAsSourceIdsBySource.set(link.sourceModuleInstanceKey, set)\n\n return () => {\n moduleAsSourceById.delete(link.id)\n const current = moduleAsSourceIdsBySource.get(link.sourceModuleInstanceKey)\n if (!current) return\n current.delete(link.id)\n if (current.size === 0) {\n moduleAsSourceIdsBySource.delete(link.sourceModuleInstanceKey)\n }\n }\n }\n\n const registerDeclarativeLink: DeclarativeLinkRuntime['registerDeclarativeLink'] = (link) => {\n const readNodeById = new Map<string, { readonly nodeId: DeclarativeLinkNodeId; readonly moduleInstanceKey: ModuleInstanceKey; readonly readQuery: ReadQueryCompiled<any, any> }>()\n for (const n of link.readNodes) {\n readNodeById.set(n.nodeId, n)\n }\n\n const dispatchNodeById = new Map<\n string,\n { readonly nodeId: DeclarativeLinkNodeId; readonly dispatch: (payload: unknown) => Effect.Effect<void, never, never> }\n >()\n for (const n of link.dispatchNodes) {\n dispatchNodeById.set(n.nodeId, n)\n }\n\n // V1 constraint: dispatch must have at most one incoming edge, interpreted as \"payload flow\".\n const incomingByDispatch = new Map<string, number>()\n for (const e of link.ir.edges) {\n const to = e.to\n const isDispatch = dispatchNodeById.has(to)\n if (!isDispatch) continue\n incomingByDispatch.set(to, (incomingByDispatch.get(to) ?? 0) + 1)\n const count = incomingByDispatch.get(to) ?? 0\n if (count > 1) {\n throw new Error(\n `[DeclarativeLinkRuntime] Invalid DeclarativeLinkIR: dispatch node has multiple incoming edges (linkId=${link.linkId}, nodeId=${to}).`,\n )\n }\n }\n\n const dispatchTargetsByReadNode = new Map<string, Array<DeclarativeLinkNodeId>>()\n for (const e of link.ir.edges) {\n const from = e.from\n const to = e.to\n if (!readNodeById.has(from)) continue\n if (!dispatchNodeById.has(to)) continue\n const list = dispatchTargetsByReadNode.get(from) ?? []\n list.push(to)\n dispatchTargetsByReadNode.set(from, list)\n }\n\n const stored: StoredDeclarativeLink = {\n ...link,\n readNodeById,\n dispatchNodeById,\n dispatchTargetsByReadNode,\n readNodeState: new Map(),\n }\n\n declarativeById.set(link.linkId, stored)\n\n for (const n of link.readNodes) {\n const list = declarativeReadNodesBySource.get(n.moduleInstanceKey) ?? []\n list.push({ linkId: link.linkId, nodeId: n.nodeId })\n declarativeReadNodesBySource.set(n.moduleInstanceKey, list)\n }\n\n return () => {\n declarativeById.delete(link.linkId)\n for (const n of link.readNodes) {\n const list = declarativeReadNodesBySource.get(n.moduleInstanceKey)\n if (!list) continue\n const next = list.filter((x) => !(x.linkId === link.linkId && x.nodeId === n.nodeId))\n if (next.length === 0) {\n declarativeReadNodesBySource.delete(n.moduleInstanceKey)\n } else {\n declarativeReadNodesBySource.set(n.moduleInstanceKey, next)\n }\n }\n }\n }\n\n const applyForSources: DeclarativeLinkRuntime['applyForSources'] = (args) =>\n Effect.gen(function* () {\n let scheduled = false\n\n // ---- Module-as-Source edges (module readQuery -> externalStore trait writeback) ----\n for (const sourceKey of args.changedModuleInstanceKeys) {\n const ids = moduleAsSourceIdsBySource.get(sourceKey)\n if (!ids || ids.size === 0) continue\n const commit = args.acceptedModules.get(sourceKey)\n if (!commit) continue\n\n for (const id of ids) {\n const link = moduleAsSourceById.get(id)\n if (!link) continue\n\n let selected: unknown\n try {\n selected = link.readQuery.select(commit.state as any)\n } catch {\n continue\n }\n\n const nextValue = link.computeValue(selected)\n if (link.hasValue && link.equalsValue(link.lastValue, nextValue)) {\n continue\n }\n\n link.hasValue = true\n link.lastValue = nextValue\n scheduled = true\n yield* link.applyValue(nextValue)\n }\n }\n\n // ---- DeclarativeLinkIR edges (module readQuery -> dispatch) ----\n for (const sourceKey of args.changedModuleInstanceKeys) {\n const refs = declarativeReadNodesBySource.get(sourceKey)\n if (!refs || refs.length === 0) continue\n const commit = args.acceptedModules.get(sourceKey)\n if (!commit) continue\n\n for (const ref of refs) {\n const link = declarativeById.get(ref.linkId)\n if (!link) continue\n const readNode = link.readNodeById.get(ref.nodeId)\n if (!readNode) continue\n\n let value: unknown\n try {\n value = readNode.readQuery.select(commit.state as any)\n } catch {\n continue\n }\n\n const state = link.readNodeState.get(ref.nodeId) ?? { hasValue: false, lastValue: undefined }\n const changed = !state.hasValue || !Object.is(state.lastValue, value)\n if (!changed) continue\n\n state.hasValue = true\n state.lastValue = value\n link.readNodeState.set(ref.nodeId, state)\n\n const targets = link.dispatchTargetsByReadNode.get(ref.nodeId) ?? []\n for (const dispatchNodeId of targets) {\n const node = link.dispatchNodeById.get(dispatchNodeId)\n if (!node) continue\n scheduled = true\n yield* node.dispatch(value)\n }\n }\n }\n\n return { scheduled } as const\n })\n\n return {\n registerModuleAsSourceLink,\n registerDeclarativeLink,\n applyForSources,\n }\n}\n","import { isDevEnv } from './env.js'\nimport type { RuntimeInternals } from './RuntimeInternals.js'\n\nconst RUNTIME_INTERNALS = Symbol.for('@logixjs/core/runtimeInternals')\nconst BOUND_INTERNALS = Symbol.for('@logixjs/core/boundInternals')\nconst MODULE_TRAITS_PROGRAM = Symbol.for('@logixjs/core/moduleTraitsProgram')\n\nconst defineHidden = (target: object, key: symbol, value: unknown): void => {\n Object.defineProperty(target, key, {\n value,\n enumerable: false,\n configurable: true,\n writable: false,\n })\n}\n\nexport const setRuntimeInternals = (runtime: object, internals: RuntimeInternals): void => {\n defineHidden(runtime, RUNTIME_INTERNALS, internals)\n}\n\nexport const setBoundInternals = (bound: object, internals: RuntimeInternals): void => {\n defineHidden(bound, BOUND_INTERNALS, internals)\n}\n\n/**\n * ModuleTraitsProgram(StateTraitProgram):\n * - Attaches a traits Program to a module definition object (used by TraitLifecycle/Debug).\n * - Uses Symbol + non-enumerable properties to avoid spreading `.__*` magic fields.\n *\n * Note: this is a \"module-definition-side\" internal slot, not RuntimeInternals (instance-level); the semantics differ.\n */\nexport const setModuleTraitsProgram = (module: object, program: unknown): void => {\n defineHidden(module, MODULE_TRAITS_PROGRAM, program)\n}\n\nexport const getModuleTraitsProgram = (module: unknown): unknown | undefined => {\n if (!module) return undefined\n if (typeof module !== 'object' && typeof module !== 'function') return undefined\n return (module as any)[MODULE_TRAITS_PROGRAM] as unknown | undefined\n}\n\nconst formatScope = (moduleId: unknown, instanceId: unknown): string => {\n const m = typeof moduleId === 'string' && moduleId.length > 0 ? moduleId : 'unknown'\n const i = typeof instanceId === 'string' && instanceId.length > 0 ? instanceId : 'unknown'\n return `moduleId=${m}, instanceId=${i}`\n}\n\nexport const getRuntimeInternals = (runtime: object): RuntimeInternals => {\n const scope = runtime as { readonly moduleId?: unknown; readonly instanceId?: unknown }\n const internals = (runtime as any)[RUNTIME_INTERNALS] as RuntimeInternals | undefined\n if (!internals) {\n const msg = isDevEnv()\n ? [\n '[MissingRuntimeInternals] Runtime internals not installed on ModuleRuntime instance.',\n `scope: ${formatScope(scope.moduleId, scope.instanceId)}`,\n 'fix:',\n '- Ensure ModuleRuntime.make calls internalHooks.installInternalHooks (020 foundation).',\n '- If you created a mock runtime for tests, attach internals or avoid calling internal-only APIs.',\n ].join('\\n')\n : 'Runtime internals not installed'\n throw new Error(msg)\n }\n\n const runtimeInstanceId = scope.instanceId\n if (\n typeof runtimeInstanceId === 'string' &&\n runtimeInstanceId.length > 0 &&\n runtimeInstanceId !== internals.instanceId\n ) {\n throw new Error(\n isDevEnv()\n ? [\n '[InconsistentRuntimeInternals] Runtime internals instanceId mismatch.',\n `runtime: ${formatScope(scope.moduleId, runtimeInstanceId)}`,\n `internals: ${formatScope(internals.moduleId, internals.instanceId)}`,\n ].join('\\n')\n : 'Runtime internals mismatch',\n )\n }\n\n return internals\n}\n\nexport const getBoundInternals = (bound: object): RuntimeInternals => {\n const internals = (bound as any)[BOUND_INTERNALS] as RuntimeInternals | undefined\n if (!internals) {\n const msg = isDevEnv()\n ? [\n '[MissingBoundInternals] Bound internals not installed on Bound API instance.',\n 'fix:',\n '- Ensure BoundApiRuntime attaches internals (020 foundation).',\n '- If you created a mock bound for tests, attach internals or avoid calling internal-only APIs.',\n ].join('\\n')\n : 'Bound internals not installed'\n throw new Error(msg)\n }\n\n return internals\n}\n","import { Effect, Fiber, Option } from 'effect'\nimport { create } from 'mutative'\nimport * as EffectOp from '../effect-op.js'\nimport { Snapshot, internal as ResourceInternal, keyHash as hashKey } from '../resource.js'\nimport * as EffectOpCore from '../runtime/core/EffectOpCore.js'\nimport * as Debug from '../runtime/core/DebugSink.js'\nimport * as TaskRunner from '../runtime/core/TaskRunner.js'\nimport { isDevEnv, ReplayModeConfigTag } from '../runtime/core/env.js'\nimport * as ReplayLog from '../runtime/core/ReplayLog.js'\nimport type { PatchReason } from '../runtime/core/StateTransaction.js'\nimport type { FieldPath, FieldPathId } from '../field-path.js'\nimport { normalizeFieldPath } from '../field-path.js'\nimport type { BoundApi } from '../runtime/core/module.js'\nimport { getBoundInternals } from '../runtime/core/runtimeInternalsAccessor.js'\nimport { RunSessionTag } from '../observability/runSession.js'\nimport type { RunSession } from '../observability/runSession.js'\nimport * as DepsTrace from './deps-trace.js'\nimport * as RowId from './rowid.js'\nimport type { StateTraitEntry, StateTraitPlanStep, StateTraitProgram } from './model.js'\nimport type { ServiceMap } from 'effect'\n\nexport interface SourceSyncContext<S> {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly getDraft: () => S\n readonly setDraft: (next: S) => void\n readonly recordPatch: (\n path: string | FieldPath | FieldPathId | undefined,\n reason: PatchReason,\n from?: unknown,\n to?: unknown,\n traitNodeId?: string,\n stepId?: number,\n ) => void\n}\n\nconst onceInRunSession = (key: string): Effect.Effect<boolean, never, any> =>\n Effect.serviceOption(RunSessionTag as unknown as ServiceMap.Key<any, RunSession>).pipe(\n Effect.map((maybe) => (Option.isSome(maybe) ? maybe.value.local.once(key) : true)),\n )\n\nconst formatList = (items: ReadonlyArray<string>, limit = 10): string => {\n if (items.length === 0) return ''\n if (items.length <= limit) return items.join(', ')\n return `${items.slice(0, limit).join(', ')}, …(+${items.length - limit})`\n}\n\nconst emitDepsMismatch = (params: {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly kind: 'computed' | 'source'\n readonly fieldPath: string\n readonly diff: DepsTrace.DepsDiff\n}): Effect.Effect<void, never, any> =>\n Effect.gen(function* () {\n const key = `${params.instanceId ?? 'unknown'}::${params.kind}::${params.fieldPath}`\n const shouldEmit = yield* onceInRunSession(`deps_mismatch:${key}`)\n if (!shouldEmit) return\n\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: params.moduleId,\n instanceId: params.instanceId,\n code: 'state_trait::deps_mismatch',\n severity: 'warning',\n message:\n `[deps] ${params.kind} \"${params.fieldPath}\" declared=[${formatList(params.diff.declared)}] ` +\n `reads=[${formatList(params.diff.reads)}] missing=[${formatList(params.diff.missing)}] ` +\n `unused=[${formatList(params.diff.unused)}]`,\n hint:\n 'deps is the single source of truth for dependencies: incremental scheduling / reverse closures / performance optimizations rely on deps only. ' +\n 'Keep deps consistent with actual reads; if you really depend on the whole object, declare a coarser-grained dep (e.g. \"profile\") to cover sub-field reads.',\n kind: `deps_mismatch:${params.kind}`,\n })\n })\n\nconst getMiddlewareStack = (): Effect.Effect<EffectOpCore.EffectOpMiddlewareEnv['stack'], never, any> =>\n Effect.serviceOption(\n EffectOpCore.EffectOpMiddlewareTag as unknown as ServiceMap.Key<any, EffectOpCore.EffectOpMiddlewareEnv>,\n ).pipe(\n Effect.map((maybe) => (Option.isSome(maybe) ? maybe.value.stack : [])),\n )\n\nconst recordTraitPatch = (\n bound: BoundApi<any, any>,\n path: string,\n reason: PatchReason,\n from?: unknown,\n to?: unknown,\n traitNodeId?: string,\n): void => {\n const normalized = normalizeFieldPath(path) ?? []\n try {\n const internals = getBoundInternals(bound as any)\n internals.txn.recordStatePatch(normalized, reason, from, to, traitNodeId)\n } catch {\n // no-op for legacy/mocked bound\n }\n}\n\nconst recordReplayEvent = (bound: BoundApi<any, any>, event: ReplayLog.ReplayLogEvent): void => {\n try {\n const internals = getBoundInternals(bound as any)\n internals.txn.recordReplayEvent(event)\n } catch {\n // no-op for legacy/mocked bound\n }\n}\n\nconst getBoundScope = (bound: BoundApi<any, any>): { readonly moduleId?: string; readonly instanceId?: string } => {\n try {\n const internals = getBoundInternals(bound as any)\n return { moduleId: internals.moduleId, instanceId: internals.instanceId }\n } catch {\n return { moduleId: undefined, instanceId: undefined }\n }\n}\n\nconst setSnapshotInTxn = (\n bound: BoundApi<any, any>,\n fieldPath: string,\n next: unknown,\n reason: PatchReason,\n stepId: string,\n traitNodeId?: string,\n): Effect.Effect<boolean, never, any> =>\n Effect.gen(function* () {\n let wrote = false\n yield* bound.state.mutate((draft) => {\n const prev = RowId.getAtPath(draft, fieldPath)\n if (Object.is(prev, next)) return\n wrote = true\n RowId.setAtPathMutating(draft, fieldPath, next)\n recordTraitPatch(bound, fieldPath, reason, prev, next, traitNodeId)\n })\n return wrote\n })\n\nconst writebackIfCurrentKeyHash = (\n bound: BoundApi<any, any>,\n fieldPath: string,\n keyHash: string,\n next: unknown,\n reason: PatchReason,\n stepId: string,\n traitNodeId?: string,\n replayEvent?: ReplayLog.ReplayLogEvent,\n): Effect.Effect<boolean, never, any> =>\n Effect.gen(function* () {\n let wrote = false\n yield* bound.state.mutate((draft) => {\n const current = RowId.getAtPath(draft, fieldPath)\n const currentKeyHash = current && typeof current === 'object' ? (current as any).keyHash : undefined\n if (currentKeyHash !== keyHash) return\n\n const prev = current\n if (Object.is(prev, next)) return\n\n wrote = true\n RowId.setAtPathMutating(draft, fieldPath, next)\n if (replayEvent) {\n recordReplayEvent(bound, replayEvent)\n }\n recordTraitPatch(bound, fieldPath, reason, prev, next, traitNodeId)\n })\n return wrote\n })\n\n/**\n * syncIdleInTransaction:\n * - Synchronously evaluate all source.key(state) within the transaction window.\n * - If a key becomes empty (undefined), synchronously reset the field to an idle snapshot (avoid tearing).\n */\nexport const syncIdleInTransaction = <S extends object>(\n program: StateTraitProgram<S>,\n ctx: SourceSyncContext<S>,\n): Effect.Effect<void> =>\n Effect.sync(() => {\n const draft = ctx.getDraft() as any\n const updates: Array<{ readonly fieldPath: string; readonly prev: unknown }> = []\n\n for (const entry of program.entries) {\n if (entry.kind !== 'source') continue\n const fieldPath = entry.fieldPath\n const listItem = RowId.parseListItemFieldPath(fieldPath)\n\n if (listItem) {\n // list.item scope: evaluate key per row by index, and synchronously write back idle for inactive rows.\n const listValue = RowId.getAtPath(draft, listItem.listPath)\n const items: ReadonlyArray<unknown> = Array.isArray(listValue) ? listValue : []\n\n for (let index = 0; index < items.length; index++) {\n const item = items[index]\n\n let key: unknown\n try {\n key = (entry.meta as any).key(item)\n } catch {\n continue\n }\n\n if (key !== undefined) continue\n\n const concretePath = RowId.toListItemValuePath(listItem.listPath, index, listItem.itemPath)\n const prev = RowId.getAtPath(draft, concretePath)\n const prevStatus = prev && typeof prev === 'object' ? (prev as any).status : undefined\n if (prevStatus === 'idle') {\n const data = (prev as any)?.data\n const error = (prev as any)?.error\n if (data === undefined && error === undefined) {\n continue\n }\n }\n\n updates.push({ fieldPath: concretePath, prev })\n }\n\n continue\n }\n\n let key: unknown\n try {\n key = (entry.meta as any).key(draft)\n } catch {\n continue\n }\n\n if (key !== undefined) continue\n\n const prev = RowId.getAtPath(draft, fieldPath)\n const prevStatus = prev && typeof prev === 'object' ? (prev as any).status : undefined\n if (prevStatus === 'idle') {\n // Still ensure data/error are cleared.\n const data = (prev as any)?.data\n const error = (prev as any)?.error\n if (data === undefined && error === undefined) {\n continue\n }\n }\n\n updates.push({ fieldPath, prev })\n }\n\n if (updates.length === 0) return\n\n const reason: PatchReason = 'source-refresh'\n\n const nextDraft = create(draft, (next) => {\n for (const u of updates) {\n RowId.setAtPathMutating(next, u.fieldPath, Snapshot.idle())\n }\n })\n\n ctx.setDraft(nextDraft as S)\n\n for (const u of updates) {\n const normalized = normalizeFieldPath(u.fieldPath) ?? []\n ctx.recordPatch(normalized, reason, u.prev, Snapshot.idle(), `source:${u.fieldPath}:idle`)\n }\n })\n\n/**\n * installSourceRefresh:\n * - Register the refresh implementation for a single source field (ResourceSnapshot + keyHash gate + concurrency).\n */\nexport const installSourceRefresh = <S>(\n bound: BoundApi<any, any>,\n step: StateTraitPlanStep,\n entry: Extract<StateTraitEntry<S, string>, { readonly kind: 'source' }>,\n): Effect.Effect<void, never, any> => {\n if (!step.targetFieldPath) return Effect.void\n\n const fieldPath = step.targetFieldPath\n const resourceId = step.resourceId ?? entry.meta.resource\n const listItem = RowId.parseListItemFieldPath(fieldPath)\n\n let internals: ReturnType<typeof getBoundInternals> | undefined\n try {\n internals = getBoundInternals(bound as any)\n } catch {\n return Effect.void\n }\n\n const register = internals.traits.registerSourceRefresh\n\n const recordSnapshot = (\n replayMode: 'live' | 'replay' | 'record',\n replayLog: ReplayLog.ReplayLogService | undefined,\n input:\n | ReplayLog.ReplayLogEvent\n | {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly fieldPath: string\n readonly keyHash?: string\n readonly concurrency?: string\n readonly phase: ReplayLog.ResourceSnapshotPhase\n readonly snapshot: unknown\n },\n ): Effect.Effect<void, never, any> => {\n if (!replayLog) return Effect.void\n if (replayMode !== 'live') return Effect.void\n const event: ReplayLog.ReplayLogEvent =\n input && typeof input === 'object' && (input as any)._tag === 'ResourceSnapshot'\n ? (input as ReplayLog.ReplayLogEvent)\n : {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: (input as any).fieldPath,\n keyHash: (input as any).keyHash,\n concurrency: (input as any).concurrency,\n phase: (input as any).phase,\n snapshot: (input as any).snapshot,\n timestamp: Date.now(),\n moduleId: (input as any).moduleId,\n instanceId: (input as any).instanceId,\n }\n return replayLog.record(event)\n }\n\n // list.item scope: in-flight gating by RowID (avoid writing to the wrong row under insert/remove/reorder).\n if (listItem) {\n const store = internals.traits.rowIdStore as RowId.RowIdStore | undefined\n if (!store) {\n return Effect.void\n }\n\n const listPath = listItem.listPath\n const itemPath = listItem.itemPath\n if (!itemPath) {\n // Never write the snapshot back to the whole item (it would overwrite business values).\n return Effect.void\n }\n\n const concurrency = (entry.meta as any).concurrency as 'switch' | 'exhaust-trailing' | undefined\n const mode = concurrency ?? 'switch'\n\n const inFlight = new Map<\n RowId.RowId,\n {\n readonly gen: number\n readonly fiber: Fiber.Fiber<void, never>\n readonly keyHash: string\n }\n >()\n const trailing = new Map<RowId.RowId, { readonly key: unknown; readonly keyHash: string }>()\n let gen = 0\n\n // When a row is removed: clear trailing/inFlight references to avoid wrong attribution or memory leaks.\n store.onRemoved(listPath, (rowId) => {\n trailing.delete(rowId)\n inFlight.delete(rowId)\n })\n\n const setSnapshotForRowInTxn = (\n rowId: RowId.RowId,\n next: unknown,\n reason: PatchReason,\n stepId: string,\n ): Effect.Effect<string | undefined, never, any> =>\n Effect.gen(function* () {\n let wrotePath: string | undefined\n yield* bound.state.mutate((draft) => {\n const index = store.getIndex(listPath, rowId)\n if (index === undefined) return\n const concretePath = RowId.toListItemValuePath(listPath, index, itemPath)\n const prev = RowId.getAtPath(draft, concretePath)\n if (Object.is(prev, next)) return\n wrotePath = concretePath\n RowId.setAtPathMutating(draft, concretePath, next)\n recordTraitPatch(bound, concretePath, reason, prev, next, step.debugInfo?.graphNodeId)\n })\n return wrotePath\n })\n\n const writebackIfCurrentKeyHashForRow = (\n rowId: RowId.RowId,\n keyHash: string,\n next: unknown,\n reason: PatchReason,\n stepId: string,\n phase?: ReplayLog.ResourceSnapshotPhase,\n ): Effect.Effect<string | undefined, never, any> =>\n Effect.gen(function* () {\n let wrotePath: string | undefined\n yield* bound.state.mutate((draft) => {\n const index = store.getIndex(listPath, rowId)\n if (index === undefined) return\n const concretePath = RowId.toListItemValuePath(listPath, index, itemPath)\n\n const current = RowId.getAtPath(draft, concretePath)\n const currentKeyHash = current && typeof current === 'object' ? (current as any).keyHash : undefined\n if (currentKeyHash !== keyHash) return\n\n const prev = current\n if (Object.is(prev, next)) return\n\n wrotePath = concretePath\n RowId.setAtPathMutating(draft, concretePath, next)\n if (phase) {\n const { moduleId, instanceId } = getBoundScope(bound)\n recordReplayEvent(bound, {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: concretePath,\n keyHash,\n concurrency: mode,\n phase,\n snapshot: next,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n })\n }\n recordTraitPatch(bound, concretePath, reason, prev, next, step.debugInfo?.graphNodeId)\n })\n return wrotePath\n })\n\n const startFetch = (\n rowId: RowId.RowId,\n key: unknown,\n keyHash: string,\n replayMode: 'live' | 'replay' | 'record',\n replayLog: ReplayLog.ReplayLogService | undefined,\n ): Effect.Effect<void, never, any> =>\n Effect.gen(function* () {\n const { moduleId, instanceId } = getBoundScope(bound)\n\n const indexForLog = store.getIndex(listPath, rowId)\n const logFieldPath =\n indexForLog === undefined ? undefined : RowId.toListItemValuePath(listPath, indexForLog, itemPath)\n\n let loadingSnapshot: unknown = Snapshot.loading({ keyHash })\n if (replayMode === 'replay' && replayLog && logFieldPath) {\n const replayLoading = yield* replayLog.consumeNextResourceSnapshot({\n resourceId,\n fieldPath: logFieldPath,\n keyHash,\n phase: 'loading',\n })\n if (replayLoading) {\n loadingSnapshot = replayLoading.snapshot\n }\n }\n const wroteLoadingPath = yield* setSnapshotForRowInTxn(\n rowId,\n loadingSnapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:loading`,\n )\n if (wroteLoadingPath) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: wroteLoadingPath,\n keyHash,\n concurrency: mode,\n phase: 'loading',\n snapshot: loadingSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n\n const io = Effect.gen(function* () {\n if (replayMode === 'replay' && replayLog) {\n // Let loading commit become visible first, then replay the settled phase (preserve the async-resource timeline shape).\n yield* Effect.yieldNow\n const consumePath = wroteLoadingPath ?? logFieldPath\n if (!consumePath) return yield* Effect.void\n\n const replayed = yield* replayLog.consumeNextResourceSnapshot({\n resourceId,\n fieldPath: consumePath,\n keyHash,\n })\n if (!replayed) return yield* Effect.void\n\n if (replayed.phase === 'success') {\n yield* writebackIfCurrentKeyHashForRow(\n rowId,\n keyHash,\n replayed.snapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:success`,\n 'success',\n )\n } else if (replayed.phase === 'error') {\n yield* writebackIfCurrentKeyHashForRow(\n rowId,\n keyHash,\n replayed.snapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:error`,\n 'error',\n )\n }\n\n return yield* Effect.void\n }\n\n const stack = yield* getMiddlewareStack()\n\n const registryOpt = yield* Effect.serviceOption(\n ResourceInternal.ResourceRegistryTag as unknown as ServiceMap.Key<any, { specs: Map<string, { load: (key: unknown) => Effect.Effect<any, any, any> }> }>,\n )\n const registry = Option.isSome(registryOpt) ? registryOpt.value : undefined\n const spec = registry?.specs.get(resourceId)\n\n if (!spec) {\n return yield* Effect.void\n }\n\n const loadEffect = (spec.load as any)(key) as Effect.Effect<any, any, any>\n\n const meta: any = {\n moduleId,\n instanceId,\n fieldPath,\n resourceId,\n key,\n keyHash,\n rowId,\n traitNodeId: step.debugInfo?.graphNodeId,\n stepId: step.id,\n }\n\n if (!(typeof meta.opSeq === 'number' && Number.isFinite(meta.opSeq))) {\n const sessionOpt = yield* Effect.serviceOption(RunSessionTag as unknown as ServiceMap.Key<any, RunSession>)\n if (Option.isSome(sessionOpt)) {\n const seqKey = instanceId ?? 'global'\n meta.opSeq = sessionOpt.value.local.nextSeq('opSeq', seqKey)\n }\n }\n\n const op = EffectOp.make<any, any, any>({\n kind: 'service',\n name: resourceId,\n effect: loadEffect,\n meta,\n })\n\n const exit = yield* Effect.exit(EffectOp.run(op, stack))\n\n if (exit._tag === 'Success') {\n const successSnapshot = Snapshot.success({ keyHash, data: exit.value })\n const wroteSuccessPath = yield* writebackIfCurrentKeyHashForRow(\n rowId,\n keyHash,\n successSnapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:success`,\n 'success',\n )\n if (wroteSuccessPath) {\n yield* recordSnapshot(replayMode, replayLog, {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: wroteSuccessPath,\n keyHash,\n concurrency: mode,\n phase: 'success',\n snapshot: successSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n })\n }\n } else {\n const errorSnapshot = Snapshot.error({ keyHash, error: exit.cause })\n const wroteErrorPath = yield* writebackIfCurrentKeyHashForRow(\n rowId,\n keyHash,\n errorSnapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:error`,\n 'error',\n )\n if (wroteErrorPath) {\n yield* recordSnapshot(replayMode, replayLog, {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: wroteErrorPath,\n keyHash,\n concurrency: mode,\n phase: 'error',\n snapshot: errorSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n })\n }\n }\n }).pipe(Effect.catchCause(() => Effect.void))\n\n // list.item: IO fibers must detach from the sync-transaction FiberRef; otherwise they'd be misclassified as \"in txn window\"\n // and block subsequent writeback entrypoints.\n const fiber = yield* Effect.forkScoped(Effect.provideService(io, TaskRunner.inSyncTransactionFiber, false))\n const myGen = (gen += 1)\n inFlight.set(rowId, { gen: myGen, fiber, keyHash })\n\n yield* Effect.forkScoped(\n Effect.provideService(Fiber.await(fiber).pipe(\n Effect.flatMap(() => Effect.sync(() => {\n const current = inFlight.get(rowId)\n if (current && current.gen === myGen) {\n inFlight.delete(rowId)\n }\n })),\n Effect.flatMap(() => mode === 'exhaust-trailing'\n ? Effect.gen(function* () {\n const next = trailing.get(rowId)\n trailing.delete(rowId)\n if (next) {\n yield* startFetch(rowId, next.key, next.keyHash, replayMode, replayLog)\n }\n })\n : Effect.void),\n Effect.catchCause(() => Effect.void),\n ), TaskRunner.inSyncTransactionFiber, false),\n )\n })\n\n register(fieldPath, (state: any) =>\n Effect.gen(function* () {\n const { moduleId, instanceId } = getBoundScope(bound)\n const replayModeOpt = yield* Effect.serviceOption(\n ReplayModeConfigTag as unknown as ServiceMap.Key<any, { mode: 'live' | 'record' | 'replay' }>,\n )\n const replayMode = Option.isSome(replayModeOpt) ? replayModeOpt.value.mode : 'live'\n const replayLogOpt = yield* Effect.serviceOption(ReplayLog.ReplayLog as unknown as ServiceMap.Key<any, ReplayLog.ReplayLogService>)\n const replayLog = Option.isSome(replayLogOpt) ? replayLogOpt.value : undefined\n const force = yield* Effect.service(TaskRunner.forceSourceRefresh).pipe(Effect.orDie)\n\n const listValue = RowId.getAtPath(state, listPath)\n const items: ReadonlyArray<unknown> = Array.isArray(listValue) ? listValue : []\n const ids = store.ensureList(listPath, items)\n\n // dev-mode: trace deps once for the first row (diagnostics only; does not affect execution semantics).\n const traceKey = `${instanceId ?? 'unknown'}::source::${fieldPath}`\n if (isDevEnv() && (yield* onceInRunSession(`deps_trace_settled:${traceKey}`))) {\n try {\n const sample = items[0]\n if (sample !== undefined) {\n const traced = DepsTrace.trace((s) => (entry.meta as any).key(s), sample as any)\n const prefixedReads = traced.reads.map((r) => (r ? `${listPath}[].${r}` : `${listPath}[]`))\n const diff = DepsTrace.diffDeps(((entry.meta as any).deps ?? []) as ReadonlyArray<string>, prefixedReads)\n if (diff) {\n yield* emitDepsMismatch({\n moduleId,\n instanceId,\n kind: 'source',\n fieldPath,\n diff,\n })\n }\n }\n } catch {\n // tracing failure should never break refresh flow\n }\n }\n\n for (let index = 0; index < items.length; index++) {\n const rowId = ids[index]\n if (!rowId) continue\n\n const concretePath = RowId.toListItemValuePath(listPath, index, itemPath)\n const prevSnapshot = RowId.getAtPath(state, concretePath) as any\n\n let key: unknown\n try {\n key = (entry.meta as any).key(items[index])\n } catch {\n key = undefined\n }\n\n const current = inFlight.get(rowId)\n\n if (key === undefined) {\n trailing.delete(rowId)\n inFlight.delete(rowId)\n\n // If it's already clean idle, avoid redundant writeback (prevents meaningless patches and UI jitter).\n if (\n prevSnapshot &&\n typeof prevSnapshot === 'object' &&\n prevSnapshot.status === 'idle' &&\n prevSnapshot.data === undefined &&\n prevSnapshot.error === undefined\n ) {\n continue\n }\n\n const idleSnapshot = Snapshot.idle()\n const wroteIdlePath = yield* setSnapshotForRowInTxn(\n rowId,\n idleSnapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:idle`,\n )\n if (wroteIdlePath) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: wroteIdlePath,\n keyHash: undefined,\n concurrency: mode,\n phase: 'idle',\n snapshot: idleSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n continue\n }\n\n const h = hashKey(key)\n\n // keyHash unchanged: avoid redundant refresh while keeping in-flight.\n if (!force && current && current.keyHash === h) {\n continue\n }\n\n // Not in-flight: if snapshot.keyHash already matches, treat it as already up-to-date (avoid full refresh and row jitter).\n const prevKeyHash =\n prevSnapshot && typeof prevSnapshot === 'object' ? (prevSnapshot as any).keyHash : undefined\n if (!force && !current && prevKeyHash === h) {\n continue\n }\n\n if (mode === 'exhaust-trailing' && current) {\n trailing.set(rowId, { key, keyHash: h })\n const loadingSnapshot = Snapshot.loading({ keyHash: h })\n const wroteLoadingPath = yield* setSnapshotForRowInTxn(\n rowId,\n loadingSnapshot,\n 'source-refresh',\n `source:${fieldPath}:${rowId}:loading`,\n )\n if (wroteLoadingPath) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath: wroteLoadingPath,\n keyHash: h,\n concurrency: mode,\n phase: 'loading',\n snapshot: loadingSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n continue\n }\n\n if (mode === 'switch' && current) {\n // Do not rely on cancellation correctness: stale writebacks are dropped by the keyHash gate.\n trailing.delete(rowId)\n inFlight.delete(rowId)\n }\n\n yield* startFetch(rowId, key, h, replayMode, replayLog)\n }\n }),\n )\n\n return Effect.void\n }\n\n // in-flight state (per field)\n let inFlight:\n | {\n readonly gen: number\n readonly fiber: Fiber.Fiber<void, never>\n readonly keyHash: string\n }\n | undefined\n let gen = 0\n let trailing: { readonly key: unknown; readonly keyHash: string } | undefined\n\n const concurrency = (entry.meta as any).concurrency as 'switch' | 'exhaust-trailing' | undefined\n const mode = concurrency ?? 'switch'\n\n const startFetch = (\n key: unknown,\n keyHash: string,\n replayMode: 'live' | 'replay' | 'record',\n replayLog: ReplayLog.ReplayLogService | undefined,\n ): Effect.Effect<void, never, any> =>\n Effect.gen(function* () {\n const { moduleId, instanceId } = getBoundScope(bound)\n\n // 1) pending: synchronously write a loading snapshot (within the current transaction window).\n let loadingSnapshot: unknown = Snapshot.loading({ keyHash })\n if (replayMode === 'replay' && replayLog) {\n const replayLoading = yield* replayLog.consumeNextResourceSnapshot({\n resourceId,\n fieldPath,\n keyHash,\n phase: 'loading',\n })\n if (replayLoading) {\n loadingSnapshot = replayLoading.snapshot\n }\n }\n const wroteLoading = yield* setSnapshotInTxn(\n bound,\n fieldPath,\n loadingSnapshot,\n 'source-refresh',\n `source:${fieldPath}:loading`,\n step.debugInfo?.graphNodeId,\n )\n if (wroteLoading) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash,\n concurrency: mode,\n phase: 'loading',\n snapshot: loadingSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n\n // 2) IO: run in a background fiber (avoid blocking the current transaction).\n const io = Effect.gen(function* () {\n if (replayMode === 'replay' && replayLog) {\n // Let loading commit become visible first, then replay the settled phase (preserve the async-resource timeline shape).\n yield* Effect.yieldNow\n const replayed = yield* replayLog.consumeNextResourceSnapshot({\n resourceId,\n fieldPath,\n keyHash,\n })\n if (!replayed) return yield* Effect.void\n\n if (replayed.phase === 'success') {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash,\n concurrency: mode,\n phase: 'success',\n snapshot: replayed.snapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n yield* writebackIfCurrentKeyHash(\n bound,\n fieldPath,\n keyHash,\n replayed.snapshot,\n 'source-refresh',\n `source:${fieldPath}:success`,\n step.debugInfo?.graphNodeId,\n event,\n )\n } else if (replayed.phase === 'error') {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash,\n concurrency: mode,\n phase: 'error',\n snapshot: replayed.snapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n yield* writebackIfCurrentKeyHash(\n bound,\n fieldPath,\n keyHash,\n replayed.snapshot,\n 'source-refresh',\n `source:${fieldPath}:error`,\n step.debugInfo?.graphNodeId,\n event,\n )\n }\n\n return yield* Effect.void\n }\n\n const stack = yield* getMiddlewareStack()\n\n const registryOpt = yield* Effect.serviceOption(ResourceInternal.ResourceRegistryTag)\n const registry = Option.isSome(registryOpt) ? registryOpt.value : undefined\n const spec = registry?.specs.get(resourceId)\n\n if (!spec) {\n return yield* Effect.void\n }\n\n const loadEffect = (spec.load as any)(key) as Effect.Effect<any, any, any>\n\n const meta: any = {\n moduleId,\n instanceId,\n fieldPath,\n resourceId,\n key,\n keyHash,\n traitNodeId: step.debugInfo?.graphNodeId,\n stepId: step.id,\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 seqKey = instanceId ?? 'global'\n meta.opSeq = sessionOpt.value.local.nextSeq('opSeq', seqKey)\n }\n }\n\n const op = EffectOp.make<any, any, any>({\n kind: 'trait-source',\n name: resourceId,\n effect: loadEffect,\n meta,\n })\n\n const exit = yield* Effect.exit(EffectOp.run(op, stack))\n\n // 3) writeback: use a keyHash gate to prevent stale results from writing back onto a new key.\n if (exit._tag === 'Success') {\n const successSnapshot = Snapshot.success({ keyHash, data: exit.value })\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash,\n concurrency: mode,\n phase: 'success',\n snapshot: successSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n const wroteSuccess = yield* writebackIfCurrentKeyHash(\n bound,\n fieldPath,\n keyHash,\n successSnapshot,\n 'source-refresh',\n `source:${fieldPath}:success`,\n step.debugInfo?.graphNodeId,\n event,\n )\n if (wroteSuccess) {\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n } else {\n const errorSnapshot = Snapshot.error({ keyHash, error: exit.cause })\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash,\n concurrency: mode,\n phase: 'error',\n snapshot: errorSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n const wroteError = yield* writebackIfCurrentKeyHash(\n bound,\n fieldPath,\n keyHash,\n errorSnapshot,\n 'source-refresh',\n `source:${fieldPath}:error`,\n step.debugInfo?.graphNodeId,\n event,\n )\n if (wroteError) {\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n }\n }).pipe(Effect.catchCause(() => Effect.void))\n\n // Do not wait for IO completion: forkScoped into the runtime scope so unmount will interrupt automatically.\n const fiber = yield* Effect.forkScoped(Effect.provideService(io, TaskRunner.inSyncTransactionFiber, false))\n const myGen = (gen += 1)\n inFlight = { gen: myGen, fiber, keyHash }\n\n // After in-flight completes, clean up; in exhaust-trailing mode, run one trailing fetch if present.\n yield* Effect.forkScoped(\n Effect.provideService(Fiber.await(fiber).pipe(\n Effect.flatMap(() => Effect.sync(() => {\n if (inFlight && inFlight.gen === myGen) {\n inFlight = undefined\n }\n })),\n Effect.flatMap(() => mode === 'exhaust-trailing'\n ? Effect.gen(function* () {\n const next = trailing\n trailing = undefined\n if (next) {\n yield* startFetch(next.key, next.keyHash, replayMode, replayLog)\n }\n })\n : Effect.void),\n Effect.catchCause(() => Effect.void),\n ), TaskRunner.inSyncTransactionFiber, false),\n )\n })\n\n register(fieldPath, (state: any) =>\n Effect.gen(function* () {\n const { moduleId, instanceId } = getBoundScope(bound)\n const replayModeOpt = yield* Effect.serviceOption(\n ReplayModeConfigTag as unknown as ServiceMap.Key<any, { mode: 'live' | 'record' | 'replay' }>,\n )\n const replayMode = Option.isSome(replayModeOpt) ? replayModeOpt.value.mode : 'live'\n const replayLogOpt = yield* Effect.serviceOption(ReplayLog.ReplayLog as unknown as ServiceMap.Key<any, ReplayLog.ReplayLogService>)\n const replayLog = Option.isSome(replayLogOpt) ? replayLogOpt.value : undefined\n const force = yield* Effect.service(TaskRunner.forceSourceRefresh).pipe(Effect.orDie)\n\n let key: unknown\n try {\n key = (entry.meta as any).key(state)\n } catch {\n key = undefined\n }\n\n // dev-mode: detect mismatch between actual reads in keySelector and declared deps (diagnostics only; does not affect execution semantics).\n const traceKey = `${instanceId ?? 'unknown'}::source::${fieldPath}`\n if (isDevEnv() && (yield* onceInRunSession(`deps_trace_settled:${traceKey}`))) {\n try {\n const traced = DepsTrace.trace((s) => (entry.meta as any).key(s), state)\n const diff = DepsTrace.diffDeps(((entry.meta as any).deps ?? []) as ReadonlyArray<string>, traced.reads)\n if (diff) {\n yield* emitDepsMismatch({\n moduleId,\n instanceId,\n kind: 'source',\n fieldPath,\n diff,\n })\n }\n } catch {\n // tracing failure should never break refresh flow\n }\n }\n\n // Key becomes empty: synchronously clear to idle (and interrupt in-flight).\n if (key === undefined) {\n if (inFlight) {\n yield* Fiber.interrupt(inFlight.fiber)\n inFlight = undefined\n }\n trailing = undefined\n\n const idleSnapshot = Snapshot.idle()\n const wroteIdle = yield* setSnapshotInTxn(\n bound,\n fieldPath,\n idleSnapshot,\n 'source-refresh',\n `source:${fieldPath}:idle`,\n step.debugInfo?.graphNodeId,\n )\n if (wroteIdle) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash: undefined,\n concurrency: mode,\n phase: 'idle',\n snapshot: idleSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n return\n }\n\n const h = hashKey(key)\n\n // Default semantics: when a non-idle snapshot already exists for the same keyHash, refresh should be a no-op when possible\n // (avoid duplicate IO/writeback). Explicit refresh/invalidate can bypass via force.\n if (!force) {\n if (inFlight && inFlight.keyHash === h) {\n return\n }\n\n const currentSnapshot = RowId.getAtPath(state, fieldPath) as any\n const currentKeyHash =\n currentSnapshot && typeof currentSnapshot === 'object' ? (currentSnapshot as any).keyHash : undefined\n const currentStatus =\n currentSnapshot && typeof currentSnapshot === 'object' ? (currentSnapshot as any).status : undefined\n if (currentStatus && currentStatus !== 'idle' && currentKeyHash === h) {\n return\n }\n }\n\n if (mode === 'exhaust-trailing' && inFlight) {\n // Busy: record trailing and update loading immediately; stale in-flight writebacks will be blocked by the keyHash gate.\n trailing = { key, keyHash: h }\n const loadingSnapshot = Snapshot.loading({ keyHash: h })\n const wroteLoading = yield* setSnapshotInTxn(\n bound,\n fieldPath,\n loadingSnapshot,\n 'source-refresh',\n `source:${fieldPath}:loading`,\n step.debugInfo?.graphNodeId,\n )\n if (wroteLoading) {\n const event: ReplayLog.ReplayLogEvent = {\n _tag: 'ResourceSnapshot',\n resourceId,\n fieldPath,\n keyHash: h,\n concurrency: mode,\n phase: 'loading',\n snapshot: loadingSnapshot,\n timestamp: Date.now(),\n moduleId,\n instanceId,\n }\n recordReplayEvent(bound, event)\n yield* recordSnapshot(replayMode, replayLog, event)\n }\n return\n }\n\n if (mode === 'switch' && inFlight) {\n yield* Fiber.interrupt(inFlight.fiber)\n inFlight = undefined\n trailing = undefined\n }\n\n // start fetch (pending tx + fork IO)\n yield* startFetch(key, h, replayMode, replayLog)\n }),\n )\n\n return Effect.void\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 { Layer, ServiceMap } 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 ServiceMap.Service<RunSessionTagImpl, RunSession>()('@logixjs/core/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 { Layer, ServiceMap } from 'effect'\nimport { isDevEnv } from './runtime/core/env.js'\n\nexport interface ResourceSpec<Key, Out, Err, Env> {\n readonly id: string\n readonly keySchema: import('effect').Schema.Schema<Key>\n readonly load: (key: Key) => import('effect').Effect.Effect<Out, Err, Env>\n readonly meta?: {\n readonly cacheGroup?: string\n readonly description?: string\n readonly [k: string]: unknown\n }\n}\n\nexport type AnyResourceSpec = ResourceSpec<any, any, any, any>\n\nexport type ResourceStatus = 'idle' | 'loading' | 'success' | 'error'\n\nexport interface ResourceSnapshot<Data = unknown, Err = unknown> {\n readonly status: ResourceStatus\n readonly keyHash?: string\n readonly data?: Data\n readonly error?: Err\n}\n\nconst stableStringify = (value: unknown): string => {\n const seen = new WeakSet<object>()\n const encode = (input: unknown): unknown => {\n if (input === null) return null\n if (typeof input === 'string' || typeof input === 'number' || typeof input === 'boolean') {\n return input\n }\n if (typeof input === 'bigint') return input.toString()\n if (typeof input === 'undefined') return '__undefined__'\n if (typeof input === 'symbol') return `__symbol__:${String(input)}`\n if (typeof input === 'function') return '__function__'\n\n if (Array.isArray(input)) {\n return input.map((v) => encode(v))\n }\n if (input instanceof Date) {\n return `__date__:${input.toISOString()}`\n }\n if (input instanceof Error) {\n return {\n _tag: 'Error',\n name: input.name,\n message: input.message,\n }\n }\n if (input && typeof input === 'object') {\n const obj = input as object\n if (seen.has(obj)) return '__cycle__'\n seen.add(obj)\n\n const record = input as Record<string, unknown>\n const keys = Object.keys(record).sort()\n const out: Record<string, unknown> = {}\n for (const k of keys) {\n out[k] = encode(record[k])\n }\n return out\n }\n return String(input)\n }\n\n try {\n return JSON.stringify(encode(value))\n } catch {\n return String(value)\n }\n}\n\nexport const keyHash = (key: unknown): string => stableStringify(key)\n\nexport const Snapshot = {\n idle: <Data = never, Err = never>(): ResourceSnapshot<Data, Err> => ({\n status: 'idle',\n keyHash: undefined,\n data: undefined,\n error: undefined,\n }),\n loading: <Data = never, Err = never>(params: { readonly keyHash: string }): ResourceSnapshot<Data, Err> => ({\n status: 'loading',\n keyHash: params.keyHash,\n data: undefined,\n error: undefined,\n }),\n success: <Data>(params: { readonly keyHash: string; readonly data: Data }): ResourceSnapshot<Data, never> => ({\n status: 'success',\n keyHash: params.keyHash,\n data: params.data,\n error: undefined,\n }),\n error: <Err>(params: { readonly keyHash: string; readonly error: Err }): ResourceSnapshot<never, Err> => ({\n status: 'error',\n keyHash: params.keyHash,\n data: undefined,\n error: params.error,\n }),\n} as const\n\nexport interface ResourceRegistry {\n readonly specs: ReadonlyMap<string, AnyResourceSpec>\n}\n\nexport class ResourceRegistryTag extends ServiceMap.Service<\n ResourceRegistryTag,\n ResourceRegistry\n>()('@logixjs/core/ResourceRegistry') {}\n\nexport const internal = {\n ResourceRegistryTag,\n}\n\nexport type Spec<Key, Out, Err, Env> = ResourceSpec<Key, Out, Err, Env>\n\nexport const make = <Key, Out, Err, Env>(spec: ResourceSpec<Key, Out, Err, Env>): ResourceSpec<Key, Out, Err, Env> =>\n spec\n\nexport const layer = (specs: ReadonlyArray<AnyResourceSpec>): Layer.Layer<ResourceRegistryTag, never, never> =>\n Layer.succeed(\n ResourceRegistryTag,\n (() => {\n const map = new Map<string, AnyResourceSpec>()\n for (const spec of specs) {\n if (isDevEnv() && map.has(spec.id) && map.get(spec.id) !== spec) {\n throw new Error(`[Resource.layer] Duplicate resource id \"${spec.id}\" detected in the same runtime scope`)\n }\n map.set(spec.id, spec)\n }\n return { specs: map }\n })(),\n )\n","import { Effect, Layer, ServiceMap } from 'effect'\n\nexport type ResourceSnapshotPhase = 'idle' | 'loading' | 'success' | 'error'\n\nexport type ReplayLogEvent =\n | {\n readonly _tag: 'ResourceSnapshot'\n readonly resourceId: string\n readonly fieldPath: string\n readonly keyHash?: string\n /**\n * Optional: source concurrency policy (e.g. \"switch\" / \"exhaust-trailing\").\n * - Must remain slim & serializable.\n * - Used by Devtools/replay to explain why old results are dropped / why trailing happens.\n */\n readonly concurrency?: string\n readonly phase: ResourceSnapshotPhase\n readonly snapshot: unknown\n readonly timestamp: number\n readonly moduleId?: string\n readonly instanceId?: string\n }\n | {\n readonly _tag: 'InvalidateRequest'\n readonly timestamp: number\n readonly moduleId?: string\n readonly instanceId?: string\n readonly kind: 'resource' | 'query'\n readonly target: string\n readonly meta?: unknown\n }\n\nexport type ResourceSnapshotEvent = Extract<ReplayLogEvent, { readonly _tag: 'ResourceSnapshot' }>\n\nexport interface ReplayLogService {\n readonly record: (event: ReplayLogEvent) => Effect.Effect<void>\n readonly snapshot: Effect.Effect<ReadonlyArray<ReplayLogEvent>>\n readonly resetCursor: Effect.Effect<void>\n readonly consumeNext: (predicate: (event: ReplayLogEvent) => boolean) => Effect.Effect<ReplayLogEvent | undefined>\n readonly consumeNextResourceSnapshot: (params: {\n readonly resourceId: string\n readonly fieldPath: string\n readonly keyHash?: string\n readonly phase?: ResourceSnapshotPhase\n }) => Effect.Effect<ResourceSnapshotEvent | undefined>\n}\n\nexport class ReplayLog extends ServiceMap.Service<ReplayLog, ReplayLogService>()('@logixjs/core/ReplayLog') {}\n\nexport const make = (initial?: ReadonlyArray<ReplayLogEvent>): ReplayLogService => {\n const events: Array<ReplayLogEvent> = initial ? Array.from(initial) : []\n let cursor = 0\n\n const consumeNext = (predicate: (event: ReplayLogEvent) => boolean): Effect.Effect<ReplayLogEvent | undefined> =>\n Effect.sync(() => {\n for (let i = cursor; i < events.length; i++) {\n const event = events[i]\n if (!predicate(event)) continue\n cursor = i + 1\n return event\n }\n return undefined\n })\n\n const consumeNextResourceSnapshot = (params: {\n readonly resourceId: string\n readonly fieldPath: string\n readonly keyHash?: string\n readonly phase?: ResourceSnapshotPhase\n }): Effect.Effect<ResourceSnapshotEvent | undefined> =>\n consumeNext((event): event is ResourceSnapshotEvent => {\n if (event._tag !== 'ResourceSnapshot') return false\n if (event.resourceId !== params.resourceId) return false\n if (event.fieldPath !== params.fieldPath) return false\n if (params.keyHash !== undefined && event.keyHash !== params.keyHash) {\n return false\n }\n if (params.phase !== undefined && event.phase !== params.phase) {\n return false\n }\n return true\n }).pipe(Effect.map((event) => event as ResourceSnapshotEvent | undefined))\n\n return {\n record: (event) => Effect.sync(() => events.push(event)),\n snapshot: Effect.sync(() => events.slice()),\n resetCursor: Effect.sync(() => {\n cursor = 0\n }),\n consumeNext,\n consumeNextResourceSnapshot,\n }\n}\n\nexport const layer = (initial?: ReadonlyArray<ReplayLogEvent>): Layer.Layer<ReplayLog, never, never> =>\n Layer.succeed(ReplayLog, make(initial))\n\nexport const record = (event: ReplayLogEvent): Effect.Effect<void, never, ReplayLog> =>\n Effect.gen(function* () {\n const log = yield* ReplayLog\n yield* log.record(event)\n })\n\nexport const snapshot: Effect.Effect<ReadonlyArray<ReplayLogEvent>, never, ReplayLog> = Effect.gen(function* () {\n const log = yield* ReplayLog\n return yield* log.snapshot\n})\n\nexport const resetCursor: Effect.Effect<void, never, ReplayLog> = Effect.gen(function* () {\n const log = yield* ReplayLog\n yield* log.resetCursor\n})\n\nexport const consumeNextResourceSnapshot = (params: {\n readonly resourceId: string\n readonly fieldPath: string\n readonly keyHash?: string\n readonly phase?: ResourceSnapshotPhase\n}): Effect.Effect<ResourceSnapshotEvent | undefined, never, ReplayLog> =>\n Effect.gen(function* () {\n const log = yield* ReplayLog\n return yield* log.consumeNextResourceSnapshot(params)\n })\n","export interface DepsTraceResult<T> {\n readonly value: T\n readonly reads: ReadonlyArray<string>\n}\n\nexport interface DepsDiff {\n readonly reads: ReadonlyArray<string>\n readonly declared: ReadonlyArray<string>\n readonly missing: ReadonlyArray<string>\n readonly unused: ReadonlyArray<string>\n}\n\nconst isTraceableObject = (value: unknown): value is object => {\n if (!value || typeof value !== 'object') return false\n if (Array.isArray(value)) return true\n if (value instanceof Date) return false\n if (value instanceof RegExp) return false\n if (value instanceof Error) return false\n if (value instanceof Map) return false\n if (value instanceof Set) return false\n if (value instanceof WeakMap) return false\n if (value instanceof WeakSet) return false\n return true\n}\n\nconst shouldIgnoreKey = (key: string): boolean => key === '__proto__' || key === 'prototype' || key === 'constructor'\n\nconst normalizeReads = (reads: ReadonlySet<string>): ReadonlyArray<string> => {\n const all = Array.from(reads).filter((p) => typeof p === 'string' && p.length > 0)\n all.sort()\n\n // Drop strict prefix paths (e.g. if both profile and profile.id are read, keep only the more specific profile.id).\n const isPrefix = (prefix: string, full: string): boolean => full !== prefix && full.startsWith(prefix + '.')\n\n const pruned: Array<string> = []\n for (const p of all) {\n let hasMoreSpecific = false\n for (const other of all) {\n if (isPrefix(p, other)) {\n hasMoreSpecific = true\n break\n }\n }\n if (!hasMoreSpecific) {\n pruned.push(p)\n }\n }\n\n pruned.sort()\n return pruned\n}\n\nconst covers = (declared: string, read: string): boolean => declared === read || read.startsWith(declared + '.')\n\nexport const diffDeps = (declared: ReadonlyArray<string>, reads: ReadonlyArray<string>): DepsDiff | undefined => {\n const declaredList = Array.from(new Set(declared)).filter((p) => typeof p === 'string' && p.length > 0)\n declaredList.sort()\n const readList = Array.from(new Set(reads)).filter((p) => typeof p === 'string' && p.length > 0)\n readList.sort()\n\n const missing = readList.filter((r) => declaredList.every((d) => !covers(d, r)))\n const unused = declaredList.filter((d) => readList.every((r) => !covers(d, r)))\n\n if (missing.length === 0 && unused.length === 0) return undefined\n\n return {\n reads: readList,\n declared: declaredList,\n missing,\n unused,\n }\n}\n\nexport const trace = <T>(fn: (state: any) => T, state: unknown): DepsTraceResult<T> => {\n if (!isTraceableObject(state)) {\n return { value: fn(state as any), reads: [] }\n }\n\n const reads = new Set<string>()\n\n // per-trace caches to preserve reference identity within the traced call.\n const proxyCache = new WeakMap<object, Map<string, any>>()\n const proxyToTarget = new WeakMap<object, object>()\n\n const wrap = (value: unknown, path: string): unknown => {\n if (!isTraceableObject(value)) return value\n return getProxy(value as any, path)\n }\n\n const unwrap = <V>(value: V): V => {\n if (value && (typeof value === 'object' || typeof value === 'function')) {\n const target = proxyToTarget.get(value as any)\n if (target) return target as any as V\n }\n return value\n }\n\n const getProxy = (target: object, basePath: string): any => {\n let byPath = proxyCache.get(target)\n if (!byPath) {\n byPath = new Map()\n proxyCache.set(target, byPath)\n }\n\n const cached = byPath.get(basePath)\n if (cached) return cached\n\n const record = (path: string) => {\n if (path) reads.add(path)\n }\n\n const proxy = new Proxy(target as any, {\n get: (t, prop, receiver) => {\n if (typeof prop === 'symbol') {\n return Reflect.get(t, prop, receiver)\n }\n const key = String(prop)\n if (shouldIgnoreKey(key)) {\n return Reflect.get(t, prop, receiver)\n }\n\n const nextPath = basePath ? `${basePath}.${key}` : key\n record(nextPath)\n\n const value = Reflect.get(t, prop, receiver) as unknown\n return wrap(value, nextPath)\n },\n has: (t, prop) => {\n if (typeof prop === 'symbol') return Reflect.has(t, prop)\n const key = String(prop)\n if (!shouldIgnoreKey(key)) {\n const nextPath = basePath ? `${basePath}.${key}` : key\n record(nextPath)\n }\n return Reflect.has(t, prop)\n },\n ownKeys: (t) => {\n if (basePath) record(basePath)\n return Reflect.ownKeys(t)\n },\n getOwnPropertyDescriptor: (t, prop) => {\n if (typeof prop === 'symbol') {\n return Reflect.getOwnPropertyDescriptor(t, prop)\n }\n const key = String(prop)\n if (!shouldIgnoreKey(key)) {\n const nextPath = basePath ? `${basePath}.${key}` : key\n record(nextPath)\n }\n return Reflect.getOwnPropertyDescriptor(t, prop)\n },\n set: () => {\n throw new Error(\n '[deps-trace] Attempted to mutate state during deps tracing (state is readonly in dev-mode diagnostics).',\n )\n },\n defineProperty: () => {\n throw new Error(\n '[deps-trace] Attempted to define property on state during deps tracing (state is readonly in dev-mode diagnostics).',\n )\n },\n deleteProperty: () => {\n throw new Error(\n '[deps-trace] Attempted to delete property on state during deps tracing (state is readonly in dev-mode diagnostics).',\n )\n },\n })\n\n byPath.set(basePath, proxy)\n proxyToTarget.set(proxy, target)\n return proxy\n }\n\n const root = getProxy(state as any, '')\n const value = unwrap(fn(root))\n\n return {\n value,\n reads: normalizeReads(reads),\n }\n}\n","import { Effect, Fiber, Option, ServiceMap, Stream } from 'effect'\nimport { create } from 'mutative'\nimport type { BoundApi } from '../runtime/core/module.js'\nimport { getBoundInternals } from '../runtime/core/runtimeInternalsAccessor.js'\nimport * as TaskRunner from '../runtime/core/TaskRunner.js'\nimport * as Debug from '../runtime/core/DebugSink.js'\nimport { getExternalStoreDescriptor } from '../external-store-descriptor.js'\nimport { normalizeFieldPath } from '../field-path.js'\nimport { DeclarativeLinkRuntimeTag } from '../runtime/core/env.js'\nimport type { DeclarativeLinkRuntimeService } from '../runtime/core/env.js'\nimport * as RowId from './rowid.js'\nimport type { StateTraitEntry, StateTraitPlanStep } from './model.js'\n\nconst isFn = (value: unknown): value is (...args: ReadonlyArray<any>) => unknown => typeof value === 'function'\n\ntype ExternalStoreEntry<S> = Extract<StateTraitEntry<S, string>, { readonly kind: 'externalStore' }>\n\ntype ExternalStoreLike = {\n readonly getSnapshot: () => unknown\n readonly subscribe: (listener: () => void) => (() => void) | undefined\n}\n\ntype ExternalStoreWritebackCommitPriority = 'normal' | 'low'\n\ntype ExternalStoreWritebackRequest = {\n readonly fieldPath: string\n readonly traitNodeId: string\n readonly normalizedPatchPath: ReadonlyArray<string>\n readonly nextValue: unknown\n readonly isEqual: (a: unknown, b: unknown) => boolean\n readonly commitPriority: ExternalStoreWritebackCommitPriority\n}\n\ntype ExternalStoreWritebackCoordinator = {\n readonly enqueue: (request: ExternalStoreWritebackRequest) => Effect.Effect<void, never, any>\n}\n\nconst writebackCoordinatorByInternals = new WeakMap<object, ExternalStoreWritebackCoordinator>()\n\nconst getOrCreateExternalStoreWritebackCoordinator = (args: {\n readonly internals: ReturnType<typeof getBoundInternals>\n readonly bound: BoundApi<any, any>\n readonly env: ServiceMap.ServiceMap<any>\n}): Effect.Effect<ExternalStoreWritebackCoordinator, never, any> =>\n Effect.gen(function* () {\n const cached = writebackCoordinatorByInternals.get(args.internals as any)\n if (cached) return cached\n\n let closed = false\n let inFlight = false\n let pendingWrites = new Map<string, ExternalStoreWritebackRequest>()\n\n const drainPendingWrites = (): ReadonlyArray<ExternalStoreWritebackRequest> => {\n if (pendingWrites.size === 0) return []\n const drained = pendingWrites\n pendingWrites = new Map()\n return Array.from(drained.values())\n }\n\n const applyWritebackBatch = (batch: ReadonlyArray<ExternalStoreWritebackRequest>): Effect.Effect<void, never, any> =>\n Effect.gen(function* () {\n if (batch.length === 0) return\n\n // Hot-path: single field writeback (most externalStore updates).\n // Avoid allocating per-batch/per-change arrays here: full diagnostics already has higher overhead.\n if (batch.length === 1) {\n const req = batch[0]!\n const prevState = (yield* args.bound.state.read) as any\n const prevValue = RowId.getAtPath(prevState as any, req.fieldPath)\n if (req.isEqual(prevValue, req.nextValue)) return\n\n const nextDraft = create(prevState, (draft) => {\n RowId.setAtPathMutating(draft as any, req.fieldPath, req.nextValue)\n })\n\n args.internals.txn.recordStatePatch(\n req.normalizedPatchPath,\n 'trait-external-store',\n prevValue,\n req.nextValue,\n req.traitNodeId,\n )\n args.internals.txn.updateDraft(nextDraft)\n return\n }\n\n const prevState = (yield* args.bound.state.read) as any\n\n const changes: Array<{\n readonly request: ExternalStoreWritebackRequest\n readonly prevValue: unknown\n }> = []\n\n for (let i = 0; i < batch.length; i++) {\n const req = batch[i]!\n const prevValue = RowId.getAtPath(prevState as any, req.fieldPath)\n if (req.isEqual(prevValue, req.nextValue)) continue\n changes.push({ request: req, prevValue })\n }\n\n if (changes.length === 0) return\n\n const nextDraft = create(prevState, (draft) => {\n for (let i = 0; i < changes.length; i++) {\n const { request } = changes[i]!\n RowId.setAtPathMutating(draft as any, request.fieldPath, request.nextValue)\n }\n })\n\n for (let i = 0; i < changes.length; i++) {\n const { request, prevValue } = changes[i]!\n args.internals.txn.recordStatePatch(\n request.normalizedPatchPath,\n 'trait-external-store',\n prevValue,\n request.nextValue,\n request.traitNodeId,\n )\n }\n\n args.internals.txn.updateDraft(nextDraft)\n })\n\n const coordinator: ExternalStoreWritebackCoordinator = {\n enqueue: (request) =>\n Effect.gen(function* () {\n if (closed) return\n\n pendingWrites.set(request.fieldPath, request)\n\n // Single-flusher: avoid an extra per-module fiber by letting the first caller drain the queue.\n if (inFlight) return\n inFlight = true\n\n try {\n while (true) {\n const batch = drainPendingWrites()\n if (batch.length === 0) return\n\n const commitPriority: ExternalStoreWritebackCommitPriority = batch.some((x) => x.commitPriority === 'normal')\n ? 'normal'\n : 'low'\n\n const originName = batch.length === 1 ? batch[0]!.fieldPath : 'externalStore:batched'\n\n yield* args.internals.txn\n .runWithStateTransaction(\n {\n kind: 'trait-external-store',\n name: originName,\n details: {\n stateCommit: {\n priority: commitPriority,\n },\n },\n },\n () => applyWritebackBatch(batch).pipe(Effect.asVoid),\n )\n .pipe(Effect.provide(args.env))\n }\n } finally {\n inFlight = false\n }\n }),\n }\n\n writebackCoordinatorByInternals.set(args.internals as any, coordinator)\n\n yield* Effect.addFinalizer(() =>\n Effect.sync(() => {\n closed = true\n pendingWrites.clear()\n }),\n )\n\n return coordinator\n })\n\nconst resolveStore = (entry: ExternalStoreEntry<any>): Effect.Effect<any, never, any> =>\n Effect.gen(function* () {\n const store = (entry.meta as any)?.store\n const descriptor = getExternalStoreDescriptor(store)\n\n if (descriptor?.kind === 'service') {\n const service = yield* Effect.service(descriptor.tag as ServiceMap.Key<any, unknown>).pipe(Effect.orDie)\n return descriptor.map(service)\n }\n\n return store\n })\n\nexport const installExternalStoreSync = <S>(\n bound: BoundApi<any, any>,\n step: StateTraitPlanStep,\n entry: ExternalStoreEntry<S>,\n): Effect.Effect<void, never, any> =>\n Effect.gen(function* () {\n const fieldPath = step.targetFieldPath\n if (!fieldPath) return\n\n const env = yield* Effect.services<any>()\n let internals: ReturnType<typeof getBoundInternals>\n try {\n internals = getBoundInternals(bound as any)\n } catch {\n return\n }\n\n const select = (entry.meta as any)?.select as ((snapshot: unknown) => unknown) | undefined\n const equals = (entry.meta as any)?.equals as ((a: unknown, b: unknown) => boolean) | undefined\n\n const computeValue = (snapshot: unknown): unknown => (isFn(select) ? select(snapshot) : snapshot)\n const isEqual = (a: unknown, b: unknown): boolean => (isFn(equals) ? equals(a, b) : Object.is(a, b))\n\n const traitLane = (entry.meta as any)?.priority as 'urgent' | 'nonUrgent' | undefined\n\n const rawStore = (entry.meta as any)?.store\n const rawDescriptor = getExternalStoreDescriptor(rawStore)\n\n const makeScopedDescriptorStore = (): Effect.Effect<ExternalStoreLike | undefined, never, any> =>\n Effect.gen(function* () {\n if (rawDescriptor?.kind === 'subscriptionRef') {\n let current = yield* Effect.provideService(rawDescriptor.ref.get as any, TaskRunner.inSyncTransactionFiber, false)\n const listeners = new Set<() => void>()\n\n const notify = (): void => {\n for (const listener of listeners) {\n listener()\n }\n }\n\n const fiber = yield* Effect.forkDetach(\n Effect.provideService(Stream.runForEach(rawDescriptor.ref.changes as Stream.Stream<unknown, never, never>, (value) =>\n Effect.sync(() => {\n current = value\n notify()\n }),\n ).pipe(Effect.catchCause(() => Effect.void)), TaskRunner.inSyncTransactionFiber, false),\n { startImmediately: true },\n )\n internals.lifecycle.registerDestroy(Fiber.interrupt(fiber).pipe(Effect.asVoid), { name: `externalStore:${fieldPath}:subscriptionRef` })\n\n return {\n getSnapshot: () => current,\n subscribe: (listener) => {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n }\n }\n\n if (rawDescriptor?.kind === 'stream') {\n let current = rawDescriptor.initial\n const listeners = new Set<() => void>()\n\n const notify = (): void => {\n for (const listener of listeners) {\n listener()\n }\n }\n\n const fiber = yield* Effect.forkDetach(\n Effect.provideService(Stream.runForEach(rawDescriptor.stream as Stream.Stream<unknown, any, any>, (value) =>\n Effect.sync(() => {\n current = value\n notify()\n }),\n ).pipe(Effect.catchCause(() => Effect.void)), TaskRunner.inSyncTransactionFiber, false),\n { startImmediately: true },\n )\n internals.lifecycle.registerDestroy(Fiber.interrupt(fiber).pipe(Effect.asVoid), { name: `externalStore:${fieldPath}:stream` })\n\n return {\n getSnapshot: () => current,\n subscribe: (listener) => {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n }\n }\n\n return undefined\n }) as Effect.Effect<ExternalStoreLike | undefined, never, any>\n\n if (rawDescriptor?.kind === 'module') {\n const linkRuntimeOpt = yield* Effect.serviceOption(\n DeclarativeLinkRuntimeTag as unknown as ServiceMap.Key<any, DeclarativeLinkRuntimeService>,\n )\n if (Option.isNone(linkRuntimeOpt)) {\n return yield* Effect.die(new Error('[StateTrait.externalStore] Missing DeclarativeLinkRuntime service (073).'))\n }\n\n const module = rawDescriptor.module\n\n const sourceRuntime = (() => {\n if (module && typeof module === 'object') {\n const moduleId = (module as any).moduleId\n const instanceId = (module as any).instanceId\n const getState = (module as any).getState\n if (typeof moduleId === 'string' && moduleId.length > 0 && typeof instanceId === 'string' && instanceId.length > 0 && getState) {\n return module as any\n }\n\n const tag = (module as any).tag\n if (tag && ServiceMap.isKey(tag)) {\n return internals.imports.get(tag as any)\n }\n\n if (ServiceMap.isKey(module as any)) {\n return internals.imports.get(module as any)\n }\n }\n return undefined\n })()\n\n if (!sourceRuntime) {\n return yield* Effect.die(new Error(`[StateTrait.externalStore] Module-as-Source store is unresolved for \"${fieldPath}\". ` +\n `Fix: include the source ModuleTag in module imports (moduleId=${rawDescriptor.moduleId}).`))\n }\n\n if (rawDescriptor.instanceId && rawDescriptor.instanceId !== sourceRuntime.instanceId) {\n return yield* Effect.die(new Error(`[StateTrait.externalStore] Module-as-Source instanceId mismatch for \"${fieldPath}\". ` +\n `descriptor.instanceId=${rawDescriptor.instanceId}, resolved.instanceId=${sourceRuntime.instanceId}`))\n }\n\n if (sourceRuntime.moduleId !== rawDescriptor.moduleId) {\n return yield* Effect.die(new Error(`[StateTrait.externalStore] Module-as-Source moduleId mismatch for \"${fieldPath}\". ` +\n `descriptor.moduleId=${rawDescriptor.moduleId}, resolved.moduleId=${sourceRuntime.moduleId}`))\n }\n\n const staticIr = rawDescriptor.readQuery.staticIr\n const isRecognizableStatic =\n staticIr.lane === 'static' && staticIr.readsDigest != null && staticIr.fallbackReason == null\n\n if (!isRecognizableStatic) {\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: internals.moduleId,\n instanceId: internals.instanceId,\n code: 'external_store::module_source_degraded',\n severity: 'warning',\n message:\n '[StateTrait.externalStore] Module-as-Source selector is not fully IR-recognizable; falling back to module-topic edge (may reduce perf).',\n hint:\n 'Fix: provide a static ReadQuery (ReadQuery.make) or annotate selector.fieldPaths to get a stable readsDigest; avoid dynamic lane.',\n kind: 'module_as_source_degraded',\n trigger: {\n kind: 'trait',\n name: 'externalStore.moduleSource',\n details: {\n sourceModuleId: rawDescriptor.moduleId,\n selectorId: staticIr.selectorId,\n lane: staticIr.lane,\n fallbackReason: staticIr.fallbackReason,\n readsDigest: staticIr.readsDigest,\n },\n },\n })\n }\n\n const moduleInstanceKey = `${sourceRuntime.moduleId}::${sourceRuntime.instanceId}` as any\n\n const writeValue = (nextValue: unknown): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n const inTxn = yield* Effect.service(TaskRunner.inSyncTransactionFiber).pipe(Effect.orDie)\n\n const body = Effect.gen(function* () {\n const prevState = (yield* bound.state.read) as any\n const prevValue = RowId.getAtPath(prevState as any, fieldPath)\n\n if (isEqual(prevValue, nextValue)) {\n return\n }\n\n const nextDraft = create(prevState, (draft) => {\n RowId.setAtPathMutating(draft as any, fieldPath, nextValue)\n })\n\n const normalized = normalizeFieldPath(fieldPath) ?? []\n internals.txn.recordStatePatch(normalized, 'trait-external-store', prevValue, nextValue, step.id)\n internals.txn.updateDraft(nextDraft)\n })\n\n if (inTxn) {\n return yield* body\n }\n\n const stateCommitPriority = traitLane === 'nonUrgent' ? 'low' : 'normal'\n return yield* internals.txn.runWithStateTransaction(\n {\n kind: 'trait-external-store',\n name: fieldPath,\n details: {\n stateCommit: {\n priority: stateCommitPriority,\n },\n },\n },\n () => body.pipe(Effect.asVoid),\n )\n }).pipe(Effect.provideServices(env))\n\n const unregister = linkRuntimeOpt.value.registerModuleAsSourceLink({\n id: `${internals.instanceId}::externalStore:${step.id}`,\n sourceModuleInstanceKey: moduleInstanceKey,\n readQuery: rawDescriptor.readQuery as any,\n computeValue,\n equalsValue: isEqual,\n applyValue: writeValue,\n })\n\n yield* Effect.addFinalizer(() =>\n Effect.sync(() => {\n unregister()\n }),\n )\n\n // Initial sync: read the current source snapshot and write it back immediately.\n const initialState = yield* (sourceRuntime.getState as Effect.Effect<unknown, never, never>)\n const initialSelected = rawDescriptor.readQuery.select(initialState as any)\n yield* writeValue(computeValue(initialSelected))\n\n return\n }\n\n const scopedDescriptorStore = yield* makeScopedDescriptorStore()\n const store = scopedDescriptorStore ?? (rawDescriptor?.kind === 'service' ? yield* resolveStore(entry) : rawStore)\n\n if (!store || typeof store !== 'object') {\n return yield* Effect.die(new Error(`[StateTrait.externalStore] Invalid store for \"${fieldPath}\". Expected { getSnapshot, subscribe }.`))\n }\n if (!isFn((store as any).getSnapshot) || !isFn((store as any).subscribe)) {\n return yield* Effect.die(new Error(`[StateTrait.externalStore] Invalid store for \"${fieldPath}\". Expected { getSnapshot, subscribe }.`))\n }\n\n let fused = false\n let fuseCause: unknown | undefined\n let fuseRecorded = false\n let pending = false\n let resume: (() => void) | undefined\n\n const recordFuseDiagnostic = Effect.gen(function* () {\n if (fuseRecorded) return\n fuseRecorded = true\n\n const errorMessage = (() => {\n if (fuseCause instanceof Error) return fuseCause.message\n if (typeof fuseCause === 'string') return fuseCause\n return 'unknown'\n })()\n\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: internals.moduleId,\n instanceId: internals.instanceId,\n code: 'external_store::snapshot_threw',\n severity: 'warning',\n message:\n `[StateTrait.externalStore] store.getSnapshot() threw; trait is fused and will stop syncing for \"${fieldPath}\".`,\n hint: 'Fix: ensure getSnapshot is synchronous and non-throwing; async resources should use StateTrait.source or ExternalStore.fromStream({ current/initial }).',\n kind: 'external_store_fused:get_snapshot',\n trigger: {\n kind: 'trait',\n name: 'externalStore.getSnapshot',\n details: {\n fieldPath,\n traitId: step.id,\n storeKind: rawDescriptor?.kind ?? 'raw',\n error: errorMessage,\n },\n },\n })\n })\n\n const signal = (): void => {\n if (fused) return\n if (resume) {\n const r = resume\n pending = false\n r()\n return\n }\n pending = true\n }\n\n const awaitSignal = (): Effect.Effect<void, never, never> => {\n if (pending) {\n pending = false\n return Effect.void\n }\n\n return Effect.promise<void>((signal) =>\n new Promise<void>((resolve) => {\n let done = false\n const r = () => {\n if (done) return\n done = true\n resume = undefined\n resolve()\n }\n\n resume = r\n\n signal.addEventListener(\n 'abort',\n () => {\n if (resume === r) {\n resume = undefined\n }\n },\n { once: true },\n )\n }),\n )\n }\n\n const getSnapshotOrFuse = (): unknown => {\n try {\n return (store as any).getSnapshot()\n } catch (err) {\n fused = true\n fuseCause = err\n return undefined\n }\n }\n\n const readSnapshotOrFuse = Effect.provideService(Effect.sync(getSnapshotOrFuse), TaskRunner.inSyncTransactionFiber, false)\n\n // T016: atomic init semantics (no missed updates between getSnapshot() and subscribe()).\n const before = yield* readSnapshotOrFuse\n if (fused) {\n yield* recordFuseDiagnostic\n return\n }\n\n const unsubscribe = (store as any).subscribe(signal) as (() => void) | undefined\n yield* Effect.addFinalizer(() =>\n Effect.sync(() => {\n try {\n unsubscribe?.()\n } catch {\n // best-effort\n }\n }),\n )\n\n const after = yield* readSnapshotOrFuse\n if (fused) {\n yield* recordFuseDiagnostic\n return\n }\n\n const coordinator = yield* getOrCreateExternalStoreWritebackCoordinator({ internals, bound, env })\n\n const normalizedPatchPath = normalizeFieldPath(fieldPath) ?? []\n const commitPriority: ExternalStoreWritebackCommitPriority = traitLane === 'nonUrgent' ? 'low' : 'normal'\n\n const writeValueSync = (nextValue: unknown): Effect.Effect<void, never, any> =>\n Effect.gen(function* () {\n const inTxn = yield* Effect.service(TaskRunner.inSyncTransactionFiber).pipe(Effect.orDie)\n\n const body = Effect.gen(function* () {\n const prevState = (yield* bound.state.read) as any\n const prevValue = RowId.getAtPath(prevState as any, fieldPath)\n\n if (isEqual(prevValue, nextValue)) {\n return\n }\n\n const nextDraft = create(prevState, (draft) => {\n RowId.setAtPathMutating(draft as any, fieldPath, nextValue)\n })\n\n internals.txn.recordStatePatch(normalizedPatchPath, 'trait-external-store', prevValue, nextValue, step.id)\n internals.txn.updateDraft(nextDraft)\n })\n\n if (inTxn) {\n return yield* body\n }\n\n return yield* internals.txn.runWithStateTransaction(\n {\n kind: 'trait-external-store',\n name: fieldPath,\n details: {\n stateCommit: {\n priority: commitPriority,\n },\n },\n },\n () => body.pipe(Effect.asVoid),\n )\n }).pipe(Effect.provideServices(env))\n\n const enqueueWriteValue = (nextValue: unknown): Effect.Effect<void, never, any> =>\n coordinator.enqueue({\n fieldPath,\n traitNodeId: step.id,\n normalizedPatchPath,\n nextValue,\n isEqual,\n commitPriority,\n })\n\n // Use the post-subscribe snapshot as the initial committed value to avoid missing an update between getSnapshot and subscribe.\n yield* writeValueSync(computeValue(after))\n\n if (!isEqual(before, after)) {\n signal()\n }\n\n // Long-lived sync loop: coalesce changes, pull latest snapshot, and write back in a txn.\n const fiber = yield* Effect.forkDetach(\n Effect.provideService(Effect.gen(function* () {\n while (true) {\n yield* awaitSignal()\n if (fused) return\n \n const snapshot = yield* readSnapshotOrFuse\n if (fused) {\n yield* recordFuseDiagnostic\n return\n }\n \n yield* enqueueWriteValue(computeValue(snapshot))\n }\n }), TaskRunner.inSyncTransactionFiber, false),\n { startImmediately: true },\n )\n internals.lifecycle.registerDestroy(Fiber.interrupt(fiber).pipe(Effect.asVoid), { name: `externalStore:${fieldPath}:writeback` })\n })\n","import type { ServiceMap, Stream } from 'effect'\nimport type * as LogixModule from './module.js'\nimport type { ReadQueryCompiled } from './runtime/core/ReadQuery.js'\n\nexport type ExternalStoreDescriptor =\n | {\n readonly kind: 'manual'\n readonly storeId: string\n }\n | {\n readonly kind: 'service'\n readonly storeId: string\n readonly tagId: string\n readonly tag: ServiceMap.Key<any, any>\n readonly map: (service: any) => {\n readonly getSnapshot: () => any\n readonly getServerSnapshot?: () => any\n readonly subscribe: (listener: () => void) => () => void\n }\n }\n | {\n readonly kind: 'subscriptionRef'\n readonly storeId: string\n readonly ref: LogixModule.ReadonlySubscriptionRef<any>\n }\n | {\n readonly kind: 'stream'\n readonly storeId: string\n readonly stream: Stream.Stream<any, any, any>\n readonly initial: unknown\n readonly initialHint: 'initial' | 'current'\n }\n | {\n readonly kind: 'module'\n readonly storeId: string\n readonly module: unknown\n readonly moduleId: string\n /**\n * Optional instance anchor when the caller passes a concrete ModuleRuntime handle.\n * - When omitted, the runtime resolves it from the module tag during install.\n */\n readonly instanceId?: string\n /**\n * Full compiled ReadQuery (includes select/equals); may carry non-serializable closures.\n * Static IR export MUST use `readQuery.staticIr` (JSON-friendly) and ignore non-serializable parts.\n */\n readonly readQuery: ReadQueryCompiled<any, any>\n }\n\nexport const EXTERNAL_STORE_DESCRIPTOR = Symbol.for('@logixjs/core/externalStoreDescriptor')\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 attachExternalStoreDescriptor = (store: object, descriptor: ExternalStoreDescriptor): void => {\n defineHidden(store, EXTERNAL_STORE_DESCRIPTOR, descriptor)\n}\n\nexport const getExternalStoreDescriptor = (store: unknown): ExternalStoreDescriptor | undefined => {\n if (!store || (typeof store !== 'object' && typeof store !== 'function')) return undefined\n return (store as any)[EXTERNAL_STORE_DESCRIPTOR] as ExternalStoreDescriptor | undefined\n}\n","import { Effect } from 'effect'\nimport * as Debug from '../runtime/core/DebugSink.js'\nimport { isDevEnv } from '../runtime/core/env.js'\nimport { onceInRunSession } from './converge-diagnostics.js'\nimport type { StateTraitProgram } from './model.js'\nimport * as Meta from './meta.js'\n\ntype MetaIssue = Readonly<{\n readonly origin: string\n readonly report: Meta.TraitMetaSanitizeReport\n}>\n\nconst formatList = (items: ReadonlyArray<string> | undefined, limit = 6): string | undefined => {\n if (!items || items.length === 0) return undefined\n if (items.length <= limit) return items.join(', ')\n return `${items.slice(0, limit).join(', ')}, …(+${items.length - limit})`\n}\n\nconst formatPart = (label: string, value: string | number | undefined): string | undefined => {\n if (value === undefined) return undefined\n return `${label}=${value}`\n}\n\nconst formatIssue = (issue: MetaIssue): string => {\n const r = issue.report\n\n const parts: Array<string> = []\n\n if (r.invalidInput) parts.push('invalidInput=true')\n\n const unknownKeys = formatList(r.unknownKeys, 6)\n if (unknownKeys) {\n parts.push(\n `unknownKeys=[${unknownKeys}]${typeof r.unknownKeyCount === 'number' && r.unknownKeyCount > r.unknownKeys!.length ? ` total=${r.unknownKeyCount}` : ''}`,\n )\n }\n\n const droppedKeys = formatList(r.droppedKeys, 6)\n if (droppedKeys) parts.push(`droppedKeys=[${droppedKeys}]`)\n\n if (typeof r.droppedTagItems === 'number' && r.droppedTagItems > 0) {\n parts.push(`droppedTagItems=${r.droppedTagItems}`)\n }\n\n const ignoredAnnotationKeys = formatList(r.ignoredAnnotationKeys, 6)\n if (ignoredAnnotationKeys) {\n parts.push(\n `ignoredAnnotationKeys=[${ignoredAnnotationKeys}]${\n typeof r.ignoredAnnotationKeyCount === 'number' && r.ignoredAnnotationKeyCount > r.ignoredAnnotationKeys!.length\n ? ` total=${r.ignoredAnnotationKeyCount}`\n : ''\n }`,\n )\n }\n\n const droppedAnnotationKeys = formatList(r.droppedAnnotationKeys, 6)\n if (droppedAnnotationKeys) {\n parts.push(\n `droppedAnnotationKeys=[${droppedAnnotationKeys}]${\n typeof r.droppedAnnotationKeyCount === 'number' && r.droppedAnnotationKeyCount > r.droppedAnnotationKeys!.length\n ? ` total=${r.droppedAnnotationKeyCount}`\n : ''\n }`,\n )\n }\n\n const droppedValues = formatPart('droppedAnnotationValues', r.droppedAnnotationValues)\n if (droppedValues) parts.push(droppedValues)\n\n const nonSerializable = formatPart('nonSerializable', r.droppedAnnotationNonSerializable)\n const depthExceeded = formatPart('depthExceeded', r.droppedAnnotationDepthExceeded)\n const nonFiniteNumber = formatPart('nonFiniteNumber', r.droppedAnnotationNonFiniteNumber)\n const reasons = [nonSerializable, depthExceeded, nonFiniteNumber].filter((x): x is string => x !== undefined)\n if (reasons.length > 0) parts.push(`reasons={${reasons.join(', ')}}`)\n\n return `[${issue.origin}] ${parts.join(' ')}`\n}\n\nconst collectNodeMetaIssues = (program: StateTraitProgram<any>): Array<MetaIssue> => {\n const spec: any = program.spec as any\n if (!spec || typeof spec !== 'object') return []\n\n const isNode = (value: unknown): value is { readonly _tag: 'StateTraitNode'; readonly meta?: unknown } =>\n typeof value === 'object' && value !== null && (value as any)._tag === 'StateTraitNode'\n\n const isList = (value: unknown): value is { readonly _tag: 'StateTraitList'; readonly item?: unknown; readonly list?: unknown } =>\n typeof value === 'object' && value !== null && (value as any)._tag === 'StateTraitList'\n\n const issues: Array<MetaIssue> = []\n\n const add = (origin: string, meta: unknown): void => {\n const { report } = Meta.sanitizeWithReport(meta)\n if (report) issues.push({ origin, report })\n }\n\n for (const key of Object.keys(spec)) {\n const raw = spec[key]\n if (!raw) continue\n\n if (isList(raw)) {\n if (raw.item && isNode(raw.item) && (raw.item as any).meta !== undefined) {\n add(`node:${key}[]`, (raw.item as any).meta)\n }\n if (raw.list && isNode(raw.list) && (raw.list as any).meta !== undefined) {\n add(`node:${key}`, (raw.list as any).meta)\n }\n continue\n }\n\n if (isNode(raw)) {\n if ((raw as any).meta === undefined) continue\n add(`node:${key === '$root' ? '$root' : key}`, (raw as any).meta)\n continue\n }\n }\n\n return issues\n}\n\nconst collectEntryMetaIssues = (program: StateTraitProgram<any>): Array<MetaIssue> => {\n const issues: Array<MetaIssue> = []\n\n for (const entry of program.entries) {\n if (entry.kind !== 'source' && entry.kind !== 'externalStore') continue\n const rawMeta = (entry.meta as any)?.meta\n if (rawMeta === undefined) continue\n\n const origin = entry.kind === 'source' ? `source:${entry.fieldPath}` : `externalStore:${entry.fieldPath}`\n const { report } = Meta.sanitizeWithReport(rawMeta)\n if (report) issues.push({ origin, report })\n }\n\n return issues\n}\n\nexport const emitMetaSanitizeDiagnostics = (\n program: StateTraitProgram<any>,\n ctx: Readonly<{ readonly moduleId?: string; readonly instanceId?: string }>,\n): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (!isDevEnv()) return\n\n const level = yield* Effect.service(Debug.currentDiagnosticsLevel).pipe(Effect.orDie)\n if (level === 'off') return\n\n const moduleId = ctx.moduleId ?? 'unknown'\n const shouldEmit = yield* onceInRunSession(`meta_sanitize:${moduleId}`)\n if (!shouldEmit) return\n\n const issues = [...collectNodeMetaIssues(program), ...collectEntryMetaIssues(program)]\n if (issues.length === 0) return\n\n const limit = level === 'light' || level === 'sampled' ? 8 : 24\n const lines = issues.slice(0, limit).map(formatIssue)\n if (issues.length > limit) {\n lines.push(`…(+${issues.length - limit})`)\n }\n\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: ctx.moduleId,\n instanceId: ctx.instanceId,\n code: 'state_trait::meta_sanitized',\n severity: 'warning',\n message: `[meta] TraitMeta contains non-exportable fields/values and will be sanitized (total ${issues.length}):\\n${lines.join('\\n')}`,\n hint:\n 'TraitMeta is export-only (Devtools/Static IR) and MUST be JsonValue. ' +\n 'Use `annotations` with `x-*` keys for extension hints; avoid closures/functions/Effect/Fiber/Tag/DOM/BigInt/circular refs. ' +\n 'See specs/016 and docs/ssot/platform/contracts/03-control-surface-manifest.md.',\n kind: 'meta_sanitized',\n })\n })\n","import { Effect, Option } from 'effect'\nimport * as SchemaAST from 'effect/SchemaAST'\nimport * as Debug from '../runtime/core/DebugSink.js'\nimport { isDevEnv } from '../runtime/core/env.js'\nimport { RunSessionTag } from '../observability/runSession.js'\nimport { normalizeFieldPath } from '../field-path.js'\nimport * as DepsTrace from './deps-trace.js'\nimport type { ConvergeContext } from './converge.types.js'\nimport type { StateTraitProgram, StateTraitSchemaPathRef } from './model.js'\n\nconst onceKeysFallback = new Set<string>()\n\nexport const onceInRunSession = (key: string): Effect.Effect<boolean> =>\n Effect.serviceOption(RunSessionTag).pipe(\n Effect.map((maybe) => {\n if (Option.isSome(maybe)) {\n return maybe.value.local.once(key)\n }\n if (onceKeysFallback.has(key)) return false\n onceKeysFallback.add(key)\n return true\n }),\n )\n\nconst formatList = (items: ReadonlyArray<string>, limit = 10): string => {\n if (items.length === 0) return ''\n if (items.length <= limit) return items.join(', ')\n return `${items.slice(0, limit).join(', ')}, …(+${items.length - limit})`\n}\n\nexport const emitDepsMismatch = (params: {\n readonly moduleId?: string\n readonly instanceId?: string\n readonly kind: 'computed' | 'source'\n readonly fieldPath: string\n readonly diff: DepsTrace.DepsDiff\n}): Effect.Effect<void> => {\n return Effect.gen(function* () {\n const key = `${params.moduleId ?? 'unknown'}::${params.instanceId ?? 'unknown'}::${params.kind}::${params.fieldPath}`\n const shouldEmit = yield* onceInRunSession(`deps_mismatch:${key}`)\n if (!shouldEmit) return\n\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: params.moduleId,\n instanceId: params.instanceId,\n code: 'state_trait::deps_mismatch',\n severity: 'warning',\n message:\n `[deps] ${params.kind} \"${params.fieldPath}\" declared=[${formatList(params.diff.declared)}] ` +\n `reads=[${formatList(params.diff.reads)}] missing=[${formatList(params.diff.missing)}] ` +\n `unused=[${formatList(params.diff.unused)}]`,\n hint:\n 'deps is the single source of truth for dependencies: incremental scheduling / reverse closures / performance optimizations rely on deps only. ' +\n 'Keep deps consistent with actual reads; if you really depend on the whole object, declare a coarser-grained dep (e.g. \"profile\") to cover sub-field reads.',\n kind: `deps_mismatch:${params.kind}`,\n })\n })\n}\n\nconst schemaHasPath = (\n ast: SchemaAST.AST,\n segments: ReadonlyArray<string>,\n seen: Set<SchemaAST.AST> = new Set(),\n): boolean => {\n if (segments.length === 0) return true\n\n let current = SchemaAST.toType(ast)\n\n while (SchemaAST.isSuspend(current)) {\n if (seen.has(current)) {\n return true\n }\n seen.add(current)\n current = SchemaAST.toType(current.thunk())\n }\n\n if (SchemaAST.isUnion(current)) {\n return current.types.some((t) => schemaHasPath(t, segments, seen))\n }\n\n if (SchemaAST.isArrays(current)) {\n const candidates: Array<SchemaAST.AST> = []\n for (const e of current.elements) candidates.push(e)\n for (const r of current.rest) candidates.push(r)\n if (candidates.length === 0) return true\n return candidates.some((t) => schemaHasPath(t, segments, seen))\n }\n\n if (SchemaAST.isObjects(current)) {\n const [head, ...tail] = segments\n\n for (const ps of current.propertySignatures) {\n if (String(ps.name) !== head) continue\n return schemaHasPath(ps.type, tail, seen)\n }\n\n // index signature: open objects like Record<string, T> allow any key\n for (const sig of current.indexSignatures) {\n const param = SchemaAST.toType(sig.parameter as unknown as SchemaAST.AST)\n const tag = (param as any)?._tag\n if (tag === 'String' || tag === 'TemplateLiteral') {\n return schemaHasPath(sig.type, tail, seen)\n }\n }\n\n return false\n }\n\n const tag = (current as any)?._tag\n if (tag === 'AnyKeyword' || tag === 'UnknownKeyword' || tag === 'ObjectKeyword' || tag === 'Declaration') {\n return true\n }\n\n return false\n}\n\nconst schemaHasFieldPath = (stateSchemaAst: SchemaAST.AST, path: string): boolean => {\n if (!path) return true\n if (path === '$root') return true\n\n const normalized = normalizeFieldPath(path)\n if (!normalized) return false\n\n const segs = normalized[0] === '$root' ? normalized.slice(1) : normalized\n return schemaHasPath(stateSchemaAst, segs)\n}\n\nconst formatSchemaMismatchLine = (ref: StateTraitSchemaPathRef): string => {\n if (ref.kind === 'fieldPath') {\n return `- ${ref.entryKind} \"${ref.entryFieldPath}\" fieldPath=\"${ref.path}\"`\n }\n if (ref.kind === 'dep') {\n const rule = ref.ruleName ? ` rule=\"${ref.ruleName}\"` : ''\n return `- ${ref.entryKind} \"${ref.entryFieldPath}\" deps=\"${ref.path}\"${rule}`\n }\n if (ref.kind === 'link_from') {\n return `- link \"${ref.entryFieldPath}\" from=\"${ref.path}\"`\n }\n if (ref.kind === 'check_writeback') {\n return `- check \"${ref.entryFieldPath}\" writeback=\"${ref.path}\"`\n }\n return `- ${ref.entryKind} \"${ref.entryFieldPath}\" path=\"${ref.path}\"`\n}\n\nexport const emitSchemaMismatch = <S extends object>(\n program: StateTraitProgram<S>,\n ctx: Pick<ConvergeContext<S>, 'moduleId' | 'instanceId'>,\n): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (!isDevEnv()) return\n\n const level = yield* Effect.service(Debug.currentDiagnosticsLevel).pipe(Effect.orDie)\n if (level === 'off') return\n\n const key = `${ctx.moduleId ?? 'unknown'}::${ctx.instanceId}`\n const shouldEmit = yield* onceInRunSession(`schema_mismatch:${key}`)\n if (!shouldEmit) return\n\n const refs = (program.schemaPaths ?? []) as ReadonlyArray<StateTraitSchemaPathRef>\n if (refs.length === 0) return\n\n const stateSchemaAst = program.stateSchema.ast as unknown as SchemaAST.AST\n\n const mismatches: Array<StateTraitSchemaPathRef> = []\n const seen = new Set<string>()\n\n for (const ref of refs) {\n if (schemaHasFieldPath(stateSchemaAst, ref.path)) continue\n const k = `${ref.kind}|${ref.entryKind}|${ref.entryFieldPath}|${ref.ruleName ?? ''}|${ref.path}`\n if (seen.has(k)) continue\n seen.add(k)\n mismatches.push(ref)\n }\n\n if (mismatches.length === 0) return\n\n const limit = level === 'light' ? 8 : 24\n const lines = mismatches.slice(0, limit).map(formatSchemaMismatchLine)\n if (mismatches.length > limit) {\n lines.push(`- …(+${mismatches.length - limit})`)\n }\n\n yield* Debug.record({\n type: 'diagnostic',\n moduleId: ctx.moduleId,\n instanceId: ctx.instanceId,\n code: 'state_trait::schema_mismatch',\n severity: 'warning',\n message: `[schema] The following paths are not declared in stateSchema (total ${mismatches.length}):\\n${lines.join('\\n')}`,\n hint: 'StateTrait writeback will create missing objects/fields. Declare all fieldPath/deps/link.from and errors.* writeback paths in stateSchema, or fix typos in trait paths.',\n kind: 'schema_mismatch',\n })\n })\n","import type { StateTraitEntry, StateTraitPlanStep, StateTraitProgram } from './model.js'\nimport * as CanonicalFieldPath from '../field-path.js'\nimport { fnv1a32, stableStringify } from '../digest.js'\nimport { getExternalStoreDescriptor } from '../external-store-descriptor.js'\nimport * as Meta from './meta.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 'external-store-sync':\n return 'externalStore'\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 === 'externalStore') {\n return []\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 externalStorePolicy = (): Record<string, unknown> | undefined => {\n if (kind !== 'externalStore') return undefined\n if (!entry || entry.kind !== 'externalStore') return undefined\n\n const descriptor = getExternalStoreDescriptor((entry.meta as any).store)\n const storeId = descriptor?.storeId\n\n const priorityRaw = (entry.meta as any)?.priority\n const lane = priorityRaw === 'nonUrgent' ? 'nonUrgent' : 'urgent'\n\n const meta = Meta.sanitize((entry.meta as any).meta)\n\n const source =\n descriptor?.kind === 'module'\n ? {\n kind: 'module',\n storeId,\n moduleId: descriptor.moduleId,\n ...(descriptor.instanceId ? { instanceKey: descriptor.instanceId } : {}),\n selectorId: descriptor.readQuery.staticIr.selectorId,\n readsDigest: descriptor.readQuery.staticIr.readsDigest,\n fallbackReason: descriptor.readQuery.staticIr.fallbackReason,\n }\n : descriptor\n ? { kind: 'external', storeId }\n : { kind: 'external', storeId: 'unknown' }\n\n const coalesceWindowMs = (entry.meta as any)?.coalesceWindowMs\n\n return {\n traitId: step.id,\n storeId: storeId ?? 'unknown',\n source,\n ownership: 'external-owned',\n lane,\n ...(typeof coalesceWindowMs === 'number' && Number.isFinite(coalesceWindowMs) && coalesceWindowMs > 0\n ? { coalesceWindowMs }\n : {}),\n ...(meta ? { meta } : {}),\n }\n }\n\n const base: StaticIrNode = {\n nodeId: step.id,\n kind,\n reads,\n writes: kind === 'check' ? [] : writes,\n ...(kind === 'externalStore' ? { policy: externalStorePolicy() } : {}),\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":["build","exportStaticIr","install","normalized","node","record","from","node","record","stableStringify","record","stableStringify","node","stableStringify","list","from","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","import_effect","link","from","list","node","import_effect","import_effect","import_effect","make","import_effect","stableStringify","record","import_effect","value","record","from","keyHash","concurrency","mode","inFlight","trailing","gen","keyHash","startFetch","make","import_effect","import_mutative","prevState","nextDraft","equals","snapshot","fiber","module","signal","import_effect","import_effect","SchemaAST","onceInRunSession","formatList","onceInRunSession","list","normalizeFieldPath","from","node","meta","source","base","stableStringify","build","install","exportStaticIr"]}
|