@graphrefly/ts 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions-types-CSC3NMDl.d.ts +657 -0
- package/dist/actions-types-wl9Mgkmr.d.cts +657 -0
- package/dist/adapters/index.cjs +5157 -2951
- package/dist/adapters/index.cjs.map +1 -1
- package/dist/adapters/index.d.cts +207 -70
- package/dist/adapters/index.d.ts +207 -70
- package/dist/adapters/index.js +3738 -1688
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/nestjs/microservices.cjs +841 -0
- package/dist/adapters/nestjs/microservices.cjs.map +1 -0
- package/dist/adapters/nestjs/microservices.d.cts +45 -0
- package/dist/adapters/nestjs/microservices.d.ts +45 -0
- package/dist/adapters/nestjs/microservices.js +206 -0
- package/dist/adapters/nestjs/microservices.js.map +1 -0
- package/dist/adapters/nestjs/native.cjs +1391 -0
- package/dist/adapters/nestjs/native.cjs.map +1 -0
- package/dist/adapters/nestjs/native.d.cts +111 -0
- package/dist/adapters/nestjs/native.d.ts +111 -0
- package/dist/adapters/nestjs/native.js +577 -0
- package/dist/adapters/nestjs/native.js.map +1 -0
- package/dist/adapters/nestjs/websockets.cjs +924 -0
- package/dist/adapters/nestjs/websockets.cjs.map +1 -0
- package/dist/adapters/nestjs/websockets.d.cts +47 -0
- package/dist/adapters/nestjs/websockets.d.ts +47 -0
- package/dist/adapters/nestjs/websockets.js +286 -0
- package/dist/adapters/nestjs/websockets.js.map +1 -0
- package/dist/adapters/nestjs.cjs +1085 -0
- package/dist/adapters/nestjs.cjs.map +1 -0
- package/dist/adapters/nestjs.d.cts +385 -0
- package/dist/adapters/nestjs.d.ts +385 -0
- package/dist/adapters/nestjs.js +112 -0
- package/dist/adapters/nestjs.js.map +1 -0
- package/dist/adapters/observe-storage.d.cts +3 -3
- package/dist/adapters/observe-storage.d.ts +3 -3
- package/dist/adapters/observe-storage.js +4 -4
- package/dist/adapters/react.cjs.map +1 -1
- package/dist/adapters/react.d.cts +2 -2
- package/dist/adapters/react.d.ts +2 -2
- package/dist/adapters/react.js +1 -1
- package/dist/adapters/solid.cjs.map +1 -1
- package/dist/adapters/solid.d.cts +2 -2
- package/dist/adapters/solid.d.ts +2 -2
- package/dist/adapters/solid.js +1 -1
- package/dist/adapters/svelte.cjs.map +1 -1
- package/dist/adapters/svelte.d.cts +2 -2
- package/dist/adapters/svelte.d.ts +2 -2
- package/dist/adapters/svelte.js +1 -1
- package/dist/adapters/vue.cjs.map +1 -1
- package/dist/adapters/vue.d.cts +2 -2
- package/dist/adapters/vue.d.ts +2 -2
- package/dist/adapters/vue.js +1 -1
- package/dist/{agent-runtime-DZTJ3C-p.d.cts → agent-runtime-types-core-CaXfKNtY.d.cts} +171 -320
- package/dist/{agent-runtime-BesGDZcB.d.ts → agent-runtime-types-core-hU299uIC.d.ts} +171 -320
- package/dist/agent-runtime-types-tool-BEpSINol.d.ts +695 -0
- package/dist/agent-runtime-types-tool-DninPEzk.d.cts +695 -0
- package/dist/agentic-memory-retention-BmGX368S.d.ts +14 -0
- package/dist/agentic-memory-retention-Ih1qhX9Z.d.cts +14 -0
- package/dist/{agentic-memory-BmRCvh0d.d.ts → agentic-memory-types-CVSUS6XR.d.ts} +13 -57
- package/dist/{agentic-memory-DfuVZ-lY.d.cts → agentic-memory-types-FnnYlVUs.d.cts} +13 -57
- package/dist/{capability-admission-g0mn9hpq.d.ts → capability-admission-BW2CziT6.d.ts} +3 -3
- package/dist/{capability-admission-B0BzqAm5.d.cts → capability-admission-lwSecxXs.d.cts} +3 -3
- package/dist/chunk-2KUAG2GZ.js +9693 -0
- package/dist/chunk-2KUAG2GZ.js.map +1 -0
- package/dist/chunk-2NJP6GO4.js +1320 -0
- package/dist/chunk-2NJP6GO4.js.map +1 -0
- package/dist/{chunk-YDSIVHRR.js → chunk-4NWSNI4K.js} +1598 -1584
- package/dist/chunk-4NWSNI4K.js.map +1 -0
- package/dist/{chunk-Z2ANQ6JW.js → chunk-4Q77MMJY.js} +2 -2
- package/dist/chunk-6E76H4OU.js +132 -0
- package/dist/chunk-6E76H4OU.js.map +1 -0
- package/dist/chunk-7GOTIIQ7.js +819 -0
- package/dist/chunk-7GOTIIQ7.js.map +1 -0
- package/dist/{chunk-IXZBUWSP.js → chunk-7HZRJMN6.js} +2 -2
- package/dist/{chunk-SS2A464I.js → chunk-CJIFGJQG.js} +3 -3
- package/dist/{chunk-V7CIJE4B.js → chunk-CX6B6PO2.js} +92 -9
- package/dist/chunk-CX6B6PO2.js.map +1 -0
- package/dist/{chunk-FBUU43PM.js → chunk-E4QCH32M.js} +448 -446
- package/dist/chunk-E4QCH32M.js.map +1 -0
- package/dist/{chunk-HKK2JD7Z.js → chunk-ECURQ3HD.js} +12 -125
- package/dist/chunk-ECURQ3HD.js.map +1 -0
- package/dist/{chunk-3JR3EDB2.js → chunk-EOKT4QFF.js} +121 -115
- package/dist/chunk-EOKT4QFF.js.map +1 -0
- package/dist/{chunk-K3FXTC3I.js → chunk-HJACH5PU.js} +3 -3
- package/dist/{chunk-GTPCOEOZ.js → chunk-IDMLXLLG.js} +3 -3
- package/dist/{chunk-DKP56CSW.js → chunk-JKAYLDQV.js} +2 -2
- package/dist/{chunk-4VLAQHZI.js → chunk-K7FB3JTD.js} +17 -1
- package/dist/chunk-K7FB3JTD.js.map +1 -0
- package/dist/{chunk-H75VXTGT.js → chunk-L6LDXRWE.js} +3 -3
- package/dist/{chunk-H75VXTGT.js.map → chunk-L6LDXRWE.js.map} +1 -1
- package/dist/{chunk-YXMZ2N6J.js → chunk-M7J6Z4IJ.js} +1071 -1025
- package/dist/chunk-M7J6Z4IJ.js.map +1 -0
- package/dist/chunk-MQEQMS7B.js +1009 -0
- package/dist/chunk-MQEQMS7B.js.map +1 -0
- package/dist/chunk-MTELVIYR.js +1421 -0
- package/dist/chunk-MTELVIYR.js.map +1 -0
- package/dist/{chunk-QFY4AFY4.js → chunk-PVC7WDKI.js} +58 -52
- package/dist/chunk-PVC7WDKI.js.map +1 -0
- package/dist/{chunk-VTHLCFN4.js → chunk-RAHNUYA5.js} +2 -2
- package/dist/{chunk-XKXWK2KP.js → chunk-SHZDP2MQ.js} +1157 -1021
- package/dist/chunk-SHZDP2MQ.js.map +1 -0
- package/dist/{chunk-CZNV3VXM.js → chunk-SIDJO2T4.js} +11 -11
- package/dist/chunk-STXRMPW4.js +4131 -0
- package/dist/chunk-STXRMPW4.js.map +1 -0
- package/dist/{chunk-2747WN4Y.js → chunk-TPND5MJS.js} +3 -3
- package/dist/chunk-TQPCAIQI.js +612 -0
- package/dist/chunk-TQPCAIQI.js.map +1 -0
- package/dist/{chunk-43BKLFZU.js → chunk-YDWBXXQZ.js} +10 -10
- package/dist/{chunk-6PHB5CJS.js → chunk-ZLFRB6FI.js} +2 -2
- package/dist/composition/index.cjs +1228 -1076
- package/dist/composition/index.cjs.map +1 -1
- package/dist/composition/index.d.cts +3 -3
- package/dist/composition/index.d.ts +3 -3
- package/dist/composition/index.js +4 -4
- package/dist/core/index.cjs +1198 -1046
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -2
- package/dist/cqrs/index.d.cts +3 -3
- package/dist/cqrs/index.d.ts +3 -3
- package/dist/cqrs/messaging.d.cts +4 -4
- package/dist/cqrs/messaging.d.ts +4 -4
- package/dist/cqrs/work-queue.d.cts +5 -5
- package/dist/cqrs/work-queue.d.ts +5 -5
- package/dist/data-structures/index.cjs +1226 -1074
- package/dist/data-structures/index.cjs.map +1 -1
- package/dist/data-structures/index.d.cts +8 -7
- package/dist/data-structures/index.d.ts +8 -7
- package/dist/data-structures/index.js +6 -5
- package/dist/{describe-BpyJuWkw.d.ts → describe-B_A5fbXH.d.ts} +1 -1
- package/dist/{describe-DYMw_l1C.d.cts → describe-CQRrkv-Q.d.cts} +1 -1
- package/dist/executors/tool-provider-adapters.cjs +3091 -0
- package/dist/executors/tool-provider-adapters.cjs.map +1 -0
- package/dist/executors/tool-provider-adapters.d.cts +174 -0
- package/dist/executors/tool-provider-adapters.d.ts +174 -0
- package/dist/executors/tool-provider-adapters.js +1336 -0
- package/dist/executors/tool-provider-adapters.js.map +1 -0
- package/dist/executors/tool-provider-runtime.cjs +5178 -0
- package/dist/executors/tool-provider-runtime.cjs.map +1 -0
- package/dist/executors/tool-provider-runtime.d.cts +17 -0
- package/dist/executors/tool-provider-runtime.d.ts +17 -0
- package/dist/executors/tool-provider-runtime.js +15 -0
- package/dist/executors/tool-provider-runtime.js.map +1 -0
- package/dist/executors/tool-provider.cjs +6392 -0
- package/dist/executors/tool-provider.cjs.map +1 -0
- package/dist/executors/tool-provider.d.cts +60 -0
- package/dist/executors/tool-provider.d.ts +60 -0
- package/dist/executors/tool-provider.js +89 -0
- package/dist/executors/tool-provider.js.map +1 -0
- package/dist/executors/work-queue.d.cts +6 -6
- package/dist/executors/work-queue.d.ts +6 -6
- package/dist/graph/index.cjs +1499 -1341
- package/dist/graph/index.cjs.map +1 -1
- package/dist/graph/index.d.cts +9 -8
- package/dist/graph/index.d.ts +9 -8
- package/dist/graph/index.js +23 -22
- package/dist/{graph-DCEWh4T2.d.cts → graph-CWK3HLPB.d.cts} +133 -131
- package/dist/{graph-D-1-SQeC.d.ts → graph-ho5sotHP.d.ts} +133 -131
- package/dist/{index-Bmxeu0nK.d.ts → index-CQWcE0Dw.d.ts} +18 -4
- package/dist/{index-72VZC0-E.d.cts → index-DHA1i67c.d.cts} +18 -4
- package/dist/index.cjs +3397 -3140
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -9
- package/dist/index.d.ts +12 -9
- package/dist/index.js +110 -109
- package/dist/inspection/boundary.d.cts +4 -4
- package/dist/inspection/boundary.d.ts +4 -4
- package/dist/measurements-C0mAvWU1.d.cts +164 -0
- package/dist/measurements-OMpCeBwh.d.ts +164 -0
- package/dist/messaging/index.cjs +57 -51
- package/dist/messaging/index.cjs.map +1 -1
- package/dist/messaging/index.d.cts +11 -276
- package/dist/messaging/index.d.ts +11 -276
- package/dist/messaging/index.js +1 -1
- package/dist/operators/index.cjs +1228 -1076
- package/dist/operators/index.cjs.map +1 -1
- package/dist/operators/index.d.cts +5 -5
- package/dist/operators/index.d.ts +5 -5
- package/dist/operators/index.js +5 -5
- package/dist/orchestration/index.cjs +8844 -6071
- package/dist/orchestration/index.cjs.map +1 -1
- package/dist/orchestration/index.d.cts +171 -224
- package/dist/orchestration/index.d.ts +171 -224
- package/dist/orchestration/index.js +42 -991
- package/dist/orchestration/index.js.map +1 -1
- package/dist/orchestration/messaging.d.cts +5 -8
- package/dist/orchestration/messaging.d.ts +5 -8
- package/dist/orchestration/work-queue.cjs +1243 -5
- package/dist/orchestration/work-queue.cjs.map +1 -1
- package/dist/orchestration/work-queue.d.cts +121 -10
- package/dist/orchestration/work-queue.d.ts +121 -10
- package/dist/orchestration/work-queue.js +1067 -4
- package/dist/orchestration/work-queue.js.map +1 -1
- package/dist/patterns/event-flow.cjs +6 -20
- package/dist/patterns/event-flow.cjs.map +1 -1
- package/dist/patterns/event-flow.d.cts +4 -4
- package/dist/patterns/event-flow.d.ts +4 -4
- package/dist/patterns/event-flow.js +2 -2
- package/dist/patterns/index.cjs +453 -465
- package/dist/patterns/index.cjs.map +1 -1
- package/dist/patterns/index.d.cts +6 -5
- package/dist/patterns/index.d.ts +6 -5
- package/dist/patterns/index.js +3 -3
- package/dist/process-types-C9uMYz3i.d.ts +200 -0
- package/dist/process-types-h3uRlzDc.d.cts +200 -0
- package/dist/{reactive-collection-DNV0-gFi.d.cts → reactive-collection-B9R0Bl1P.d.cts} +4 -34
- package/dist/{reactive-collection-BAmfrGjd.d.ts → reactive-collection-BXFrH0U2.d.ts} +4 -34
- package/dist/{reactive-collection-storage-BNEldDyi.d.cts → reactive-collection-storage-BLGv8Xp8.d.cts} +5 -5
- package/dist/{reactive-collection-storage-YZsAQsWK.d.ts → reactive-collection-storage-a4zD3665.d.ts} +5 -5
- package/dist/{reactive-map-DRD1LJ2H.d.cts → reactive-map-C_8sOfdS.d.cts} +3 -2
- package/dist/{reactive-map-EsDiCmJk.d.ts → reactive-map-jle5dnok.d.ts} +3 -2
- package/dist/render/index.d.cts +2 -2
- package/dist/render/index.d.ts +2 -2
- package/dist/scheduled-readiness-5rwQlyjV.d.ts +91 -0
- package/dist/scheduled-readiness-DpRY8jI0.d.cts +91 -0
- package/dist/semantic-memory-graph-C2ZUwIlq.d.ts +30 -0
- package/dist/semantic-memory-graph-DlZBD_Eu.d.cts +30 -0
- package/dist/{semantic-memory-graph-DKuNzuWw.d.cts → semantic-memory-graph-types-BvzdqmkY.d.cts} +2 -28
- package/dist/{semantic-memory-graph-uwbwJdhe.d.ts → semantic-memory-graph-types-Ci-OtahO.d.ts} +2 -28
- package/dist/solutions/index.cjs +6353 -6169
- package/dist/solutions/index.cjs.map +1 -1
- package/dist/solutions/index.d.cts +12 -10
- package/dist/solutions/index.d.ts +12 -10
- package/dist/solutions/index.js +5 -5
- package/dist/solutions/reactive-layout/browser/index.cjs +116 -108
- package/dist/solutions/reactive-layout/browser/index.cjs.map +1 -1
- package/dist/solutions/reactive-layout/browser/index.d.cts +4 -4
- package/dist/solutions/reactive-layout/browser/index.d.ts +4 -4
- package/dist/solutions/reactive-layout/browser/index.js +3 -3
- package/dist/solutions/reactive-layout/index.cjs +3578 -3350
- package/dist/solutions/reactive-layout/index.cjs.map +1 -1
- package/dist/solutions/reactive-layout/index.d.cts +32 -576
- package/dist/solutions/reactive-layout/index.d.ts +32 -576
- package/dist/solutions/reactive-layout/index.js +65 -5
- package/dist/solutions/reactive-layout/node-canvas/index.cjs +127 -117
- package/dist/solutions/reactive-layout/node-canvas/index.cjs.map +1 -1
- package/dist/solutions/reactive-layout/node-canvas/index.d.cts +4 -4
- package/dist/solutions/reactive-layout/node-canvas/index.d.ts +4 -4
- package/dist/solutions/reactive-layout/node-canvas/index.js +3 -3
- package/dist/solutions/reactive-layout/react-native/index.cjs +127 -117
- package/dist/solutions/reactive-layout/react-native/index.cjs.map +1 -1
- package/dist/solutions/reactive-layout/react-native/index.d.cts +4 -4
- package/dist/solutions/reactive-layout/react-native/index.d.ts +4 -4
- package/dist/solutions/reactive-layout/react-native/index.js +3 -3
- package/dist/solutions/reactive-layout/skia/index.cjs +127 -117
- package/dist/solutions/reactive-layout/skia/index.cjs.map +1 -1
- package/dist/solutions/reactive-layout/skia/index.d.cts +4 -4
- package/dist/solutions/reactive-layout/skia/index.d.ts +4 -4
- package/dist/solutions/reactive-layout/skia/index.js +3 -3
- package/dist/solutions/work-item/actions.cjs +1609 -1428
- package/dist/solutions/work-item/actions.cjs.map +1 -1
- package/dist/solutions/work-item/actions.d.cts +23 -184
- package/dist/solutions/work-item/actions.d.ts +23 -184
- package/dist/solutions/work-item/actions.js +1558 -934
- package/dist/solutions/work-item/actions.js.map +1 -1
- package/dist/solutions/work-item/scheduling.cjs +9181 -1838
- package/dist/solutions/work-item/scheduling.cjs.map +1 -1
- package/dist/solutions/work-item/scheduling.d.cts +1763 -328
- package/dist/solutions/work-item/scheduling.d.ts +1763 -328
- package/dist/solutions/work-item/scheduling.js +117 -3
- package/dist/solutions/work-item/work-queue.d.cts +7 -7
- package/dist/solutions/work-item/work-queue.d.ts +7 -7
- package/dist/sources/browser.cjs +1318 -1083
- package/dist/sources/browser.cjs.map +1 -1
- package/dist/sources/browser.d.cts +4 -4
- package/dist/sources/browser.d.ts +4 -4
- package/dist/sources/browser.js +4 -4
- package/dist/sources/index.cjs +1318 -1083
- package/dist/sources/index.cjs.map +1 -1
- package/dist/sources/index.d.cts +4 -4
- package/dist/sources/index.d.ts +4 -4
- package/dist/sources/index.js +4 -4
- package/dist/sources/node.d.cts +3 -3
- package/dist/sources/node.d.ts +3 -3
- package/dist/storage/browser.cjs +16 -0
- package/dist/storage/browser.cjs.map +1 -1
- package/dist/storage/browser.js +3 -3
- package/dist/storage/index.cjs +16 -0
- package/dist/storage/index.cjs.map +1 -1
- package/dist/storage/index.d.cts +5 -4
- package/dist/storage/index.d.ts +5 -4
- package/dist/storage/index.js +6 -6
- package/dist/storage/node.cjs +16 -0
- package/dist/storage/node.cjs.map +1 -1
- package/dist/storage/node.js +3 -3
- package/dist/{store-C-joM4gh.d.ts → store-BmtEs9mG.d.ts} +1 -1
- package/dist/{store-CNJwmT-h.d.cts → store-PAAsYvML.d.cts} +1 -1
- package/dist/types-BRNKoFHj.d.ts +357 -0
- package/dist/{types-CcPIn7sy.d.cts → types-BS6CyR-x.d.cts} +27 -108
- package/dist/types-BWK2ay3e.d.cts +457 -0
- package/dist/types-BXKSAoE1.d.cts +357 -0
- package/dist/types-BaPpZItj.d.ts +457 -0
- package/dist/types-BhveCMg5.d.cts +274 -0
- package/dist/{types-BsJvElYZ.d.ts → types-C9NOgNJw.d.ts} +27 -108
- package/dist/types-CTsQ8Ww4.d.ts +274 -0
- package/dist/types-DL_05n2M.d.ts +34 -0
- package/dist/types-XDoqxYO9.d.cts +34 -0
- package/dist/{work-item-runtime-C3M79vE9.d.ts → work-item-runtime-types-BqtWnSCS.d.ts} +3 -93
- package/dist/{work-item-runtime-qaVgsL0T.d.cts → work-item-runtime-types-CHO03AKh.d.cts} +3 -93
- package/dist/work-queue/index.cjs +957 -953
- package/dist/work-queue/index.cjs.map +1 -1
- package/dist/work-queue/index.d.cts +9 -357
- package/dist/work-queue/index.d.ts +9 -357
- package/dist/work-queue/index.js +957 -953
- package/dist/work-queue/index.js.map +1 -1
- package/package.json +603 -513
- package/dist/chunk-3JR3EDB2.js.map +0 -1
- package/dist/chunk-4VLAQHZI.js.map +0 -1
- package/dist/chunk-6XAIOL3X.js +0 -2407
- package/dist/chunk-6XAIOL3X.js.map +0 -1
- package/dist/chunk-FBUU43PM.js.map +0 -1
- package/dist/chunk-HKK2JD7Z.js.map +0 -1
- package/dist/chunk-PC3BTTBE.js +0 -3217
- package/dist/chunk-PC3BTTBE.js.map +0 -1
- package/dist/chunk-QFY4AFY4.js.map +0 -1
- package/dist/chunk-V7CIJE4B.js.map +0 -1
- package/dist/chunk-XKXWK2KP.js.map +0 -1
- package/dist/chunk-YDSIVHRR.js.map +0 -1
- package/dist/chunk-YXMZ2N6J.js.map +0 -1
- /package/dist/{chunk-Z2ANQ6JW.js.map → chunk-4Q77MMJY.js.map} +0 -0
- /package/dist/{chunk-IXZBUWSP.js.map → chunk-7HZRJMN6.js.map} +0 -0
- /package/dist/{chunk-SS2A464I.js.map → chunk-CJIFGJQG.js.map} +0 -0
- /package/dist/{chunk-K3FXTC3I.js.map → chunk-HJACH5PU.js.map} +0 -0
- /package/dist/{chunk-GTPCOEOZ.js.map → chunk-IDMLXLLG.js.map} +0 -0
- /package/dist/{chunk-DKP56CSW.js.map → chunk-JKAYLDQV.js.map} +0 -0
- /package/dist/{chunk-VTHLCFN4.js.map → chunk-RAHNUYA5.js.map} +0 -0
- /package/dist/{chunk-CZNV3VXM.js.map → chunk-SIDJO2T4.js.map} +0 -0
- /package/dist/{chunk-2747WN4Y.js.map → chunk-TPND5MJS.js.map} +0 -0
- /package/dist/{chunk-43BKLFZU.js.map → chunk-YDWBXXQZ.js.map} +0 -0
- /package/dist/{chunk-6PHB5CJS.js.map → chunk-ZLFRB6FI.js.map} +0 -0
package/dist/sources/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { c as DriverResult, g as HttpRequest, h as HttpResponse, y as SseDriverEvent, z as SseEvent, A as SseRequest, I as WebSocketDriverEvent, J as WebSocketEvent, M as WebSocketRequest, V as WebhookDriverEvent, X as WebhookEvent, Y as WebhookRegistration } from '../types-
|
|
2
|
-
export { A as AsyncSourceOpts, C as CronSchedule, E as EventListenerOptionsLike, a as EventTargetLike, F as FromCronOptions, b as FromEventOptions, N as NodeInput, P as PushRegister, c as PushUnsubscribe, S as SingleFromAnyOptions, T as TimerSourceOpts, e as empty, f as firstValueFrom, d as fromAny, g as fromAsyncIter, h as fromCron, i as fromEvent, j as fromHttp, k as fromHttpWithOptions, l as fromIter, n as fromPromise, o as fromPushNotification, p as fromSSE, q as fromSSEWithOptions, r as fromTimer, s as fromWebSocket, t as fromWebSocketWithOptions, u as fromWebhook, v as fromWebhookWithOptions, w as interval, x as matchesCron, y as never, z as of, B as parseCron, H as singleFromAny, I as throwError, J as timer } from '../index-
|
|
1
|
+
export { c as DriverResult, g as HttpRequest, h as HttpResponse, y as SseDriverEvent, z as SseEvent, A as SseRequest, I as WebSocketDriverEvent, J as WebSocketEvent, M as WebSocketRequest, V as WebhookDriverEvent, X as WebhookEvent, Y as WebhookRegistration } from '../types-BS6CyR-x.cjs';
|
|
2
|
+
export { A as AsyncSourceOpts, C as CronSchedule, E as EventListenerOptionsLike, a as EventTargetLike, F as FromCronOptions, b as FromEventOptions, N as NodeInput, P as PushRegister, c as PushUnsubscribe, S as SingleFromAnyOptions, T as TimerSourceOpts, e as empty, f as firstValueFrom, d as fromAny, g as fromAsyncIter, h as fromCron, i as fromEvent, j as fromHttp, k as fromHttpWithOptions, l as fromIter, n as fromPromise, o as fromPushNotification, p as fromSSE, q as fromSSEWithOptions, r as fromTimer, s as fromWebSocket, t as fromWebSocketWithOptions, u as fromWebhook, v as fromWebhookWithOptions, w as interval, x as matchesCron, y as never, z as of, B as parseCron, H as singleFromAny, I as throwError, J as timer } from '../index-DHA1i67c.cjs';
|
|
3
3
|
import '../messages-CAzUPPJM.cjs';
|
|
4
|
-
import '../graph-
|
|
4
|
+
import '../graph-CWK3HLPB.cjs';
|
|
5
5
|
import '../core/index.cjs';
|
|
6
6
|
import '../codec-BB7p8fJc.cjs';
|
|
7
|
-
import '../describe-
|
|
7
|
+
import '../describe-CQRrkv-Q.cjs';
|
package/dist/sources/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { c as DriverResult, g as HttpRequest, h as HttpResponse, y as SseDriverEvent, z as SseEvent, A as SseRequest, I as WebSocketDriverEvent, J as WebSocketEvent, M as WebSocketRequest, V as WebhookDriverEvent, X as WebhookEvent, Y as WebhookRegistration } from '../types-
|
|
2
|
-
export { A as AsyncSourceOpts, C as CronSchedule, E as EventListenerOptionsLike, a as EventTargetLike, F as FromCronOptions, b as FromEventOptions, N as NodeInput, P as PushRegister, c as PushUnsubscribe, S as SingleFromAnyOptions, T as TimerSourceOpts, e as empty, f as firstValueFrom, d as fromAny, g as fromAsyncIter, h as fromCron, i as fromEvent, j as fromHttp, k as fromHttpWithOptions, l as fromIter, n as fromPromise, o as fromPushNotification, p as fromSSE, q as fromSSEWithOptions, r as fromTimer, s as fromWebSocket, t as fromWebSocketWithOptions, u as fromWebhook, v as fromWebhookWithOptions, w as interval, x as matchesCron, y as never, z as of, B as parseCron, H as singleFromAny, I as throwError, J as timer } from '../index-
|
|
1
|
+
export { c as DriverResult, g as HttpRequest, h as HttpResponse, y as SseDriverEvent, z as SseEvent, A as SseRequest, I as WebSocketDriverEvent, J as WebSocketEvent, M as WebSocketRequest, V as WebhookDriverEvent, X as WebhookEvent, Y as WebhookRegistration } from '../types-C9NOgNJw.js';
|
|
2
|
+
export { A as AsyncSourceOpts, C as CronSchedule, E as EventListenerOptionsLike, a as EventTargetLike, F as FromCronOptions, b as FromEventOptions, N as NodeInput, P as PushRegister, c as PushUnsubscribe, S as SingleFromAnyOptions, T as TimerSourceOpts, e as empty, f as firstValueFrom, d as fromAny, g as fromAsyncIter, h as fromCron, i as fromEvent, j as fromHttp, k as fromHttpWithOptions, l as fromIter, n as fromPromise, o as fromPushNotification, p as fromSSE, q as fromSSEWithOptions, r as fromTimer, s as fromWebSocket, t as fromWebSocketWithOptions, u as fromWebhook, v as fromWebhookWithOptions, w as interval, x as matchesCron, y as never, z as of, B as parseCron, H as singleFromAny, I as throwError, J as timer } from '../index-CQWcE0Dw.js';
|
|
3
3
|
import '../messages-CAzUPPJM.js';
|
|
4
|
-
import '../graph-
|
|
4
|
+
import '../graph-ho5sotHP.js';
|
|
5
5
|
import '../core/index.js';
|
|
6
6
|
import '../codec-BB7p8fJc.js';
|
|
7
|
-
import '../describe-
|
|
7
|
+
import '../describe-B_A5fbXH.js';
|
package/dist/sources/index.js
CHANGED
|
@@ -26,12 +26,12 @@ import {
|
|
|
26
26
|
singleFromAny,
|
|
27
27
|
throwError,
|
|
28
28
|
timer
|
|
29
|
-
} from "../chunk-
|
|
30
|
-
import "../chunk-
|
|
31
|
-
import "../chunk-
|
|
29
|
+
} from "../chunk-CX6B6PO2.js";
|
|
30
|
+
import "../chunk-CJIFGJQG.js";
|
|
31
|
+
import "../chunk-SHZDP2MQ.js";
|
|
32
32
|
import "../chunk-WQIA3GFB.js";
|
|
33
33
|
import "../chunk-S6HXABGL.js";
|
|
34
|
-
import "../chunk-
|
|
34
|
+
import "../chunk-K7FB3JTD.js";
|
|
35
35
|
import "../chunk-DGUM43GV.js";
|
|
36
36
|
export {
|
|
37
37
|
empty,
|
package/dist/sources/node.d.cts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { i as LocalProcessDriver } from '../types-
|
|
2
|
-
import { L as Operator } from '../graph-
|
|
1
|
+
import { i as LocalProcessDriver } from '../types-BS6CyR-x.cjs';
|
|
2
|
+
import { L as Operator } from '../graph-CWK3HLPB.cjs';
|
|
3
3
|
import '../messages-CAzUPPJM.cjs';
|
|
4
4
|
import '../core/index.cjs';
|
|
5
5
|
import '../codec-BB7p8fJc.cjs';
|
|
6
|
-
import '../describe-
|
|
6
|
+
import '../describe-CQRrkv-Q.cjs';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Node-only source factories. Import from `@graphrefly/ts/sources/node`; the universal
|
package/dist/sources/node.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { i as LocalProcessDriver } from '../types-
|
|
2
|
-
import { L as Operator } from '../graph-
|
|
1
|
+
import { i as LocalProcessDriver } from '../types-C9NOgNJw.js';
|
|
2
|
+
import { L as Operator } from '../graph-ho5sotHP.js';
|
|
3
3
|
import '../messages-CAzUPPJM.js';
|
|
4
4
|
import '../core/index.js';
|
|
5
5
|
import '../codec-BB7p8fJc.js';
|
|
6
|
-
import '../describe-
|
|
6
|
+
import '../describe-B_A5fbXH.js';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Node-only source factories. Import from `@graphrefly/ts/sources/node`; the universal
|
package/dist/storage/browser.cjs
CHANGED
|
@@ -79,9 +79,16 @@ function sortedJsonValue(value, seen = /* @__PURE__ */ new Set(), path = "$", st
|
|
|
79
79
|
}
|
|
80
80
|
for (const key of Object.getOwnPropertyNames(value)) {
|
|
81
81
|
const isIndex = /^(0|[1-9]\d*)$/.test(key) && Number.isSafeInteger(Number(key)) && Number(key) < value.length;
|
|
82
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
83
|
+
if (descriptor !== void 0 && ("get" in descriptor || "set" in descriptor)) {
|
|
84
|
+
throw new TypeError(`stableJsonString: accessor property at ${path}.${key}`);
|
|
85
|
+
}
|
|
82
86
|
if (key !== "length" && !isIndex) {
|
|
83
87
|
throw new TypeError(`stableJsonString: non-index array property at ${path}.${key}`);
|
|
84
88
|
}
|
|
89
|
+
if (key !== "length" && descriptor !== void 0 && !descriptor.enumerable) {
|
|
90
|
+
throw new TypeError(`stableJsonString: non-enumerable array property at ${path}.${key}`);
|
|
91
|
+
}
|
|
85
92
|
}
|
|
86
93
|
const out2 = [];
|
|
87
94
|
for (let i = 0; i < value.length; i += 1) {
|
|
@@ -95,6 +102,15 @@ function sortedJsonValue(value, seen = /* @__PURE__ */ new Set(), path = "$", st
|
|
|
95
102
|
if (Object.getOwnPropertySymbols(value).length > 0) {
|
|
96
103
|
throw new TypeError(`stableJsonString: symbol-keyed properties at ${path}`);
|
|
97
104
|
}
|
|
105
|
+
for (const key of Object.getOwnPropertyNames(value)) {
|
|
106
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
107
|
+
if (descriptor !== void 0 && ("get" in descriptor || "set" in descriptor)) {
|
|
108
|
+
throw new TypeError(`stableJsonString: accessor property at ${path}.${key}`);
|
|
109
|
+
}
|
|
110
|
+
if (descriptor !== void 0 && !descriptor.enumerable) {
|
|
111
|
+
throw new TypeError(`stableJsonString: non-enumerable property at ${path}.${key}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
98
114
|
const out = /* @__PURE__ */ Object.create(null);
|
|
99
115
|
for (const key of Object.keys(value).sort()) {
|
|
100
116
|
out[key] = sortedJsonValue(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/browser.ts","../../src/storage/backend.ts","../../src/json/codec.ts","../../src/storage/kv.ts","../../src/storage/append-log.ts"],"sourcesContent":["/**\n * Browser-only passive storage backend (D103).\n *\n * Uses DOM IndexedDB to provide async byte storage, no graph methods.\n */\n\n/// <reference lib=\"dom\" />\n\nimport { type AppendLogStorageTier, appendLogStorage } from \"./append-log.js\";\nimport type { StorageBackend } from \"./backend.js\";\nimport type { Codec } from \"./codec.js\";\nimport { type KvStorageOptions, type KvStorageTier, kvStorage } from \"./kv.js\";\n\nexport type IndexedDbBackendSpec = {\n\tdbName: string;\n\tstoreName: string;\n\tversion?: number;\n};\n\nexport interface NamedIndexedDbBackend extends StorageBackend {\n\treadonly name: string;\n}\n\ntype IndexedDbError = DOMException | Error;\n\nconst KEY_SEPARATOR = \"\\u0000\";\n\nfunction isConstraintError(error: unknown): error is DOMException {\n\treturn error instanceof DOMException && error.name === \"ConstraintError\";\n}\n\nfunction validateKey(key: string): string {\n\tif (typeof key !== \"string\") {\n\t\tthrow new TypeError(\"indexedDbBackend: key must be a string\");\n\t}\n\tif (key.includes(KEY_SEPARATOR)) {\n\t\tthrow new TypeError(\"indexedDbBackend: key must not contain U+0000\");\n\t}\n\treturn key;\n}\n\nfunction validateListPrefix(prefix: string): string {\n\tif (typeof prefix !== \"string\") {\n\t\tthrow new TypeError(\"indexedDbBackend: list prefix must be a string\");\n\t}\n\tif (prefix.includes(KEY_SEPARATOR)) {\n\t\tthrow new TypeError(\"indexedDbBackend: list prefix must not contain U+0000\");\n\t}\n\treturn prefix;\n}\n\nfunction decodeStoredBytes(raw: unknown): Uint8Array | undefined {\n\tif (raw === undefined || raw === null) return undefined;\n\tif (raw instanceof Uint8Array) return Uint8Array.from(raw);\n\tif (raw instanceof ArrayBuffer) return new Uint8Array(raw.slice(0));\n\tthrow new TypeError(\"indexedDbBackend: malformed stored bytes\");\n}\n\nfunction normalizeKeys(prefix: string, raw: unknown[]): string[] {\n\tconst out: string[] = [];\n\tfor (const key of raw) {\n\t\tif (typeof key !== \"string\") {\n\t\t\tthrow new TypeError(\"indexedDbBackend: stored key must be a string\");\n\t\t}\n\t\tif (key.includes(KEY_SEPARATOR)) {\n\t\t\tthrow new TypeError(\"indexedDbBackend: malformed stored key\");\n\t\t}\n\t\tif (key.startsWith(prefix)) out.push(key);\n\t}\n\tout.sort();\n\treturn out;\n}\n\nfunction openDb(spec: IndexedDbBackendSpec, version = spec.version): Promise<IDBDatabase> {\n\treturn new Promise<IDBDatabase>((resolve, reject) => {\n\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\treject(new TypeError(\"indexedDbBackend: indexedDB is not available in this environment\"));\n\t\t\treturn;\n\t\t}\n\t\tconst req =\n\t\t\tversion === undefined ? indexedDB.open(spec.dbName) : indexedDB.open(spec.dbName, version);\n\t\treq.onupgradeneeded = () => {\n\t\t\tconst db = req.result;\n\t\t\tif (!db.objectStoreNames.contains(spec.storeName)) {\n\t\t\t\tdb.createObjectStore(spec.storeName);\n\t\t\t}\n\t\t};\n\t\treq.onblocked = () =>\n\t\t\treject(\n\t\t\t\tnew Error(\"indexedDbBackend: open blocked; close existing database connections and retry\"),\n\t\t\t);\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error ?? new TypeError(\"indexedDbBackend: open failed\"));\n\t});\n}\n\nfunction openDbWithStore(spec: IndexedDbBackendSpec): Promise<IDBDatabase> {\n\treturn openDb(spec).then((db) => {\n\t\tif (db.objectStoreNames.contains(spec.storeName)) return db;\n\t\tif (spec.version !== undefined) {\n\t\t\tdb.close();\n\t\t\tthrow new Error(\n\t\t\t\t`indexedDbBackend: object store \"${spec.storeName}\" is missing; bump the IndexedDB version to create it`,\n\t\t\t);\n\t\t}\n\t\tconst nextVersion = db.version + 1;\n\t\tdb.close();\n\t\treturn openDb(spec, nextVersion).then((upgraded) => {\n\t\t\tif (upgraded.objectStoreNames.contains(spec.storeName)) return upgraded;\n\t\t\tupgraded.close();\n\t\t\tthrow new Error(`indexedDbBackend: object store \"${spec.storeName}\" was not created`);\n\t\t});\n\t});\n}\n\nexport type IndexedDbKvOptions<T> = Omit<KvStorageOptions<T>, \"backend\">;\n\nexport interface IndexedDbAppendLogOptions<T> {\n\t/** Optional append-log key prefix. */\n\tprefix?: string;\n\t/** Optional payload codec before persistence. */\n\tcodec?: Codec<T>;\n}\n\n/**\n * Creates an IndexedDB backend for browser environments.\n *\n * All methods are async (`Promise`) and do not cross graph layer boundaries.\n */\nexport function indexedDbBackend(spec: IndexedDbBackendSpec): NamedIndexedDbBackend {\n\tlet dbCache: Promise<IDBDatabase> | undefined;\n\tconst db = (): Promise<IDBDatabase> => {\n\t\tif (dbCache !== undefined) return dbCache;\n\t\tconst attempt = openDbWithStore(spec);\n\t\tconst cached = attempt.catch((error) => {\n\t\t\tif (dbCache === cached) dbCache = undefined;\n\t\t\tthrow error;\n\t\t});\n\t\tdbCache = cached;\n\t\treturn dbCache;\n\t};\n\treturn {\n\t\tname: `idb:${spec.dbName}/${spec.storeName}`,\n\t\tget(key) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<Uint8Array | undefined>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readonly\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.get(key);\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tresolve(decodeStoredBytes(req.result));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: read failed\"));\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: read transaction aborted\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => {\n\t\t\t\t\t\t\t\t/* read resolved already; no-op */\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tput(key, value) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.put(value, key);\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: write failed\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => resolve();\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: write transaction aborted\"));\n\t\t\t\t\t\t\ttx.onerror = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: write transaction failed\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tputIfAbsent(key, value) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<boolean>((resolve, reject) => {\n\t\t\t\t\t\tlet requestOk = false;\n\t\t\t\t\t\tlet requestConflict = false;\n\t\t\t\t\t\tlet requestError: unknown;\n\t\t\t\t\t\tlet settled = false;\n\t\t\t\t\t\tconst settle = (fn: () => void): void => {\n\t\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\t\tfn();\n\t\t\t\t\t\t};\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.add(value, key);\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\trequestOk = true;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = (event) => {\n\t\t\t\t\t\t\t\tconst error = req.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\trequestConflict = true;\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\trequestError = error ?? new Error(\"indexedDbBackend: write-if-absent failed\");\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\ttx.oncomplete = () =>\n\t\t\t\t\t\t\t\tsettle(() => {\n\t\t\t\t\t\t\t\t\tif (requestConflict) {\n\t\t\t\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t\t\t\t} else if (requestOk) {\n\t\t\t\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent did not complete\"),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\ttx.onabort = () => {\n\t\t\t\t\t\t\t\tconst error = tx.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\tsettle(() => resolve(false));\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\ttx.error ??\n\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent transaction aborted\"),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\ttx.onerror = () => {\n\t\t\t\t\t\t\t\tconst error = tx.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\tsettle(() => resolve(false));\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\terror ??\n\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent transaction failed\"),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tsettle(() => reject(error as IndexedDbError));\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tdelete(key) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.delete(key);\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: delete failed\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => resolve();\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: delete transaction aborted\"));\n\t\t\t\t\t\t\ttx.onerror = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: delete transaction failed\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\tconst validatedPrefix = validateListPrefix(prefix);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<readonly string[]>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readonly\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.getAllKeys();\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tresolve(normalizeKeys(validatedPrefix, req.result));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: list failed\"));\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: list transaction aborted\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * Creates an IndexedDB-backed KV storage tier.\n */\nexport function indexedDbKv<T>(\n\tspec: IndexedDbBackendSpec,\n\topts: IndexedDbKvOptions<T> = {},\n): KvStorageTier<T> {\n\treturn kvStorage<T>({ backend: indexedDbBackend(spec), ...opts });\n}\n\n/**\n * Creates an IndexedDB-backed append-log storage tier.\n */\nexport function indexedDbAppendLog<T>(\n\tspec: IndexedDbBackendSpec,\n\topts: IndexedDbAppendLogOptions<T> = {},\n): AppendLogStorageTier<T> {\n\tconst kv = kvStorage<T>({\n\t\tbackend: indexedDbBackend(spec),\n\t\tcodec: opts.codec,\n\t});\n\treturn appendLogStorage<T>({ kv, prefix: opts.prefix ?? \"append-log\" });\n}\n","/**\n * Byte storage backends (D82): passive adapter-owned storage, no graph methods.\n */\n\nconst HEX_TABLE = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, \"0\"));\nconst NAMESPACE_SEPARATOR = \"\\u0000\";\n\nfunction cloneBytes(bytes: Uint8Array): Uint8Array {\n\treturn Uint8Array.from(bytes);\n}\n\nfunction encodeNamespacePrefix(namespace: string): string {\n\treturn namespace.length > 0 ? `${namespace}${NAMESPACE_SEPARATOR}` : \"\";\n}\n\nfunction encodeBytesToHex(bytes: Uint8Array): string {\n\tlet out = \"\";\n\tfor (const byte of bytes) out += HEX_TABLE[byte];\n\treturn out;\n}\n\nfunction decodeHexToBytes(raw: string): Uint8Array {\n\tif (raw.length % 2 !== 0 || !/^[0-9a-f]*$/i.test(raw)) {\n\t\tthrow new TypeError(\"webStorageBackend: malformed stored bytes\");\n\t}\n\tconst out = new Uint8Array(raw.length / 2);\n\tfor (let i = 0; i < raw.length; i += 2) {\n\t\tconst value = Number.parseInt(raw.slice(i, i + 2), 16);\n\t\tif (Number.isNaN(value)) throw new TypeError(\"webStorageBackend: malformed stored bytes\");\n\t\tout[i / 2] = value;\n\t}\n\treturn out;\n}\n\nfunction validateLogicalKey(label: string, key: string): string {\n\tif (typeof key !== \"string\") {\n\t\tthrow new TypeError(`${label}: key must be a string`);\n\t}\n\tif (key.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: key must not contain U+0000`);\n\t}\n\treturn key;\n}\n\nfunction validateListPrefix(label: string, prefix: string): string {\n\tif (typeof prefix !== \"string\") {\n\t\tthrow new TypeError(`${label}: list prefix must be a string`);\n\t}\n\tif (prefix.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: list prefix must not contain U+0000`);\n\t}\n\treturn prefix;\n}\n\nfunction validateNamespace(label: string, namespace: string): string {\n\tif (typeof namespace !== \"string\") {\n\t\tthrow new TypeError(`${label}: namespace must be a string`);\n\t}\n\tif (namespace.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: namespace must not contain U+0000`);\n\t}\n\treturn namespace;\n}\n\n/** Passive byte-addressed backend used by D82 storage binding tiers. */\nexport interface StorageBackend {\n\tget(key: string): undefined | Uint8Array | PromiseLike<undefined | Uint8Array>;\n\tput(key: string, value: Uint8Array): void | PromiseLike<void>;\n\tputIfAbsent?(key: string, value: Uint8Array): boolean | PromiseLike<boolean>;\n\tgetVersioned?(key: string): StorageVersionedRead | PromiseLike<StorageVersionedRead>;\n\tsetIfMatch?(\n\t\tkey: string,\n\t\tvalue: Uint8Array,\n\t\tgeneration: StorageGeneration,\n\t): boolean | PromiseLike<boolean>;\n\tdelete?(key: string): void | PromiseLike<void>;\n\tlist?(prefix?: string): readonly string[] | PromiseLike<readonly string[]>;\n}\n\n/** Passive D85 conditional-create capability for multi-writer storage helpers. */\nexport interface PutIfAbsentStorageBackend extends StorageBackend {\n\tputIfAbsent(key: string, value: Uint8Array): boolean | PromiseLike<boolean>;\n}\n\n/** Opaque D108 per-key generation token for passive storage versioned reads. */\nexport type StorageGeneration = unknown;\n\n/** D108 versioned byte read result with explicit present/absent observations. */\nexport type StorageVersionedRead =\n\t| {\n\t\t\treadonly kind: \"hit\";\n\t\t\treadonly value: Uint8Array;\n\t\t\treadonly generation: StorageGeneration;\n\t }\n\t| {\n\t\t\treadonly kind: \"miss\";\n\t\t\treadonly generation: StorageGeneration;\n\t };\n\n/** Passive D108 versioned read + generation-conditional set capability. */\nexport interface VersionedStorageBackend extends StorageBackend {\n\tgetVersioned(key: string): StorageVersionedRead | PromiseLike<StorageVersionedRead>;\n\tsetIfMatch(\n\t\tkey: string,\n\t\tvalue: Uint8Array,\n\t\tgeneration: StorageGeneration,\n\t): boolean | PromiseLike<boolean>;\n}\n\n/** Runtime guard for D85 conditional-create capable byte backends. */\nexport function hasStoragePutIfAbsent(\n\tbackend: StorageBackend,\n): backend is PutIfAbsentStorageBackend {\n\treturn typeof backend.putIfAbsent === \"function\";\n}\n\n/** Require D85 conditional-create support and produce a clear adapter error when absent. */\nexport function requireStoragePutIfAbsent(\n\tbackend: StorageBackend,\n\tlabel = \"storage backend\",\n): PutIfAbsentStorageBackend {\n\tif (!hasStoragePutIfAbsent(backend)) {\n\t\tthrow new Error(`${label}: backend does not support putIfAbsent`);\n\t}\n\treturn backend;\n}\n\n/** Runtime guard for D108 versioned byte backends. */\nexport function hasStorageVersioned(backend: StorageBackend): backend is VersionedStorageBackend {\n\treturn typeof backend.getVersioned === \"function\" && typeof backend.setIfMatch === \"function\";\n}\n\n/** Require D108 versioned support and produce a clear adapter error when absent. */\nexport function requireStorageVersioned(\n\tbackend: StorageBackend,\n\tlabel = \"storage backend\",\n): VersionedStorageBackend {\n\tif (!hasStorageVersioned(backend)) {\n\t\tthrow new Error(`${label}: backend does not support versioned get/set-if-match`);\n\t}\n\treturn backend;\n}\n\n/** Browser/storage-adapter shape for deterministic byte helpers (DOM-free for portability). */\nexport interface WebStorageLike {\n\treadonly length?: number;\n\tgetItem(key: string): string | null | undefined;\n\tsetItem(key: string, value: string): void;\n\tremoveItem(key: string): void;\n\tkey?(index: number): string | null | undefined;\n\tkeys?(): readonly string[];\n}\n\n/** Storage helper options for namespace isolation and logical-key prefixing. */\nexport interface StorageNamespaceOptions {\n\t/**\n\t * Optional namespace for logical keys.\n\t *\n\t * Namespace is part of key mapping only and is not returned from `list()`.\n\t */\n\tnamespace?: string;\n}\n\nfunction toStorageKey(namespace: string, key: string): string {\n\treturn `${encodeNamespacePrefix(namespace)}${key}`;\n}\n\nfunction enumerateStorageKeys(storage: WebStorageLike): readonly unknown[] {\n\tif (storage.keys) return [...storage.keys()];\n\tif (typeof storage.key === \"function\" && typeof storage.length === \"number\") {\n\t\tconst keys: string[] = [];\n\t\tfor (let i = 0; i < storage.length; i += 1) {\n\t\t\tconst key = storage.key(i);\n\t\t\tif (key !== null && key !== undefined) keys.push(key);\n\t\t}\n\t\treturn keys;\n\t}\n\tconst fallback = storage as unknown as Readonly<Record<string, unknown>>;\n\treturn Object.keys(fallback).filter((key) => typeof fallback[key] === \"string\");\n}\n\nfunction decodeStorageListKey(namespace: string, rawKey: unknown): string | undefined {\n\tif (typeof rawKey !== \"string\") {\n\t\tthrow new TypeError(\"webStorageBackend: stored key must be a string\");\n\t}\n\tconst prefix = encodeNamespacePrefix(namespace);\n\tif (!rawKey.startsWith(prefix)) return undefined;\n\tconst logical = rawKey.slice(prefix.length);\n\tif (logical.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(\"webStorageBackend: malformed stored key\");\n\t}\n\treturn logical;\n}\n\nfunction listByPrefix(namespace: string, prefix: string, raw: readonly unknown[]): string[] {\n\tconst out: string[] = [];\n\tfor (const key of raw) {\n\t\tconst logical = decodeStorageListKey(namespace, key);\n\t\tif (logical === undefined) continue;\n\t\tif (!logical.startsWith(prefix)) continue;\n\t\tout.push(logical);\n\t}\n\tout.sort();\n\treturn out;\n}\n\n/** Build a deterministic byte backend backed by a browser-like key/value store (D103/D82). */\nexport function webStorageBackend(\n\tstorage: WebStorageLike,\n\topts: StorageNamespaceOptions = {},\n): StorageBackend {\n\tconst namespace =\n\t\topts.namespace === undefined ? \"\" : validateNamespace(\"webStorageBackend\", opts.namespace);\n\treturn {\n\t\tget(key) {\n\t\t\tconst raw = storage.getItem(\n\t\t\t\ttoStorageKey(namespace, validateLogicalKey(\"webStorageBackend\", key)),\n\t\t\t);\n\t\t\tif (raw === null || raw === undefined) return undefined;\n\t\t\treturn decodeHexToBytes(raw);\n\t\t},\n\t\tput(key, value) {\n\t\t\tstorage.setItem(\n\t\t\t\ttoStorageKey(namespace, validateLogicalKey(\"webStorageBackend\", key)),\n\t\t\t\tencodeBytesToHex(cloneBytes(value)),\n\t\t\t);\n\t\t},\n\t\tdelete(key) {\n\t\t\tstorage.removeItem(toStorageKey(namespace, validateLogicalKey(\"webStorageBackend\", key)));\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\treturn listByPrefix(\n\t\t\t\tnamespace,\n\t\t\t\tvalidateListPrefix(\"webStorageBackend\", prefix),\n\t\t\t\tenumerateStorageKeys(storage),\n\t\t\t);\n\t\t},\n\t};\n}\n\n/** In-memory backend for tests, adapters, and lightweight local storage. */\nexport interface MemoryBackend extends StorageBackend {\n\treadonly entries: ReadonlyMap<string, Uint8Array>;\n\tclear(): void;\n}\n\nconst MEMORY_GENERATION = Symbol(\"graphrefly.memoryBackend.generation\");\n\ninterface MemoryGeneration {\n\treadonly [MEMORY_GENERATION]: readonly [epoch: number, key: string, version: number];\n}\n\nfunction memoryGeneration(epoch: number, key: string, version: number): MemoryGeneration {\n\treturn Object.freeze({ [MEMORY_GENERATION]: Object.freeze([epoch, key, version] as const) });\n}\n\nfunction readMemoryGeneration(\n\tgeneration: StorageGeneration,\n): readonly [epoch: number, key: string, version: number] | undefined {\n\tif (typeof generation !== \"object\" || generation === null) return undefined;\n\tconst maybe = generation as Partial<MemoryGeneration>;\n\tconst token = maybe[MEMORY_GENERATION];\n\tif (\n\t\tArray.isArray(token) &&\n\t\ttoken.length === 3 &&\n\t\ttypeof token[0] === \"number\" &&\n\t\ttypeof token[1] === \"string\" &&\n\t\ttypeof token[2] === \"number\"\n\t) {\n\t\treturn token as readonly [number, string, number];\n\t}\n\treturn undefined;\n}\n\n/** Create a byte-cloning in-memory backend. */\nexport function memoryBackend(\n\tinitial: Iterable<readonly [string, Uint8Array]> = [],\n): MemoryBackend {\n\tconst entries = new Map<string, Uint8Array>();\n\tconst versions = new Map<string, number>();\n\tlet epoch = 0;\n\tfor (const [key, value] of initial) {\n\t\tentries.set(validateLogicalKey(\"memoryBackend\", key), cloneBytes(value));\n\t}\n\tconst versionOf = (key: string): number => versions.get(key) ?? 0;\n\tconst bump = (key: string): void => {\n\t\tversions.set(key, versionOf(key) + 1);\n\t};\n\treturn {\n\t\tentries,\n\t\tget(key) {\n\t\t\tconst value = entries.get(validateLogicalKey(\"memoryBackend\", key));\n\t\t\treturn value === undefined ? undefined : cloneBytes(value);\n\t\t},\n\t\tput(key, value) {\n\t\t\tvalidateLogicalKey(\"memoryBackend\", key);\n\t\t\tentries.set(key, cloneBytes(value));\n\t\t\tbump(key);\n\t\t},\n\t\tputIfAbsent(key, value) {\n\t\t\tvalidateLogicalKey(\"memoryBackend\", key);\n\t\t\tif (entries.has(key)) return false;\n\t\t\tentries.set(key, cloneBytes(value));\n\t\t\tbump(key);\n\t\t\treturn true;\n\t\t},\n\t\tgetVersioned(key) {\n\t\t\tvalidateLogicalKey(\"memoryBackend\", key);\n\t\t\tconst value = entries.get(key);\n\t\t\tconst generation = memoryGeneration(epoch, key, versionOf(key));\n\t\t\tif (value === undefined) return { kind: \"miss\", generation };\n\t\t\treturn { kind: \"hit\", value: cloneBytes(value), generation };\n\t\t},\n\t\tsetIfMatch(key, value, generation) {\n\t\t\tvalidateLogicalKey(\"memoryBackend\", key);\n\t\t\tconst observed = readMemoryGeneration(generation);\n\t\t\tif (\n\t\t\t\tobserved === undefined ||\n\t\t\t\tobserved[0] !== epoch ||\n\t\t\t\tobserved[1] !== key ||\n\t\t\t\tobserved[2] !== versionOf(key)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tentries.set(key, cloneBytes(value));\n\t\t\tbump(key);\n\t\t\treturn true;\n\t\t},\n\t\tdelete(key) {\n\t\t\tvalidateLogicalKey(\"memoryBackend\", key);\n\t\t\tif (entries.delete(key)) bump(key);\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\tconst validatedPrefix = validateListPrefix(\"memoryBackend\", prefix);\n\t\t\treturn [...entries.keys()].filter((key) => key.startsWith(validatedPrefix)).sort();\n\t\t},\n\t\tclear() {\n\t\t\tentries.clear();\n\t\t\tversions.clear();\n\t\t\tepoch += 1;\n\t\t},\n\t};\n}\n","/**\n * Neutral JSON/encoding utilities (D96).\n *\n * Shared by graph checkpoints and storage bindings; neither layer owns the strict JSON\n * scanner/canonicalization contract.\n */\n\n/** Typed byte codec for D82 storage binding helpers and D96 shared JSON surfaces. */\nexport interface Codec<T> {\n\tencode(value: T): Uint8Array;\n\tdecode(bytes: Uint8Array): T;\n}\n\nexport type StrictJsonScalar = null | boolean | number | string;\nexport type StrictJsonValue =\n\t| StrictJsonScalar\n\t| readonly StrictJsonValue[]\n\t| { readonly [key: string]: StrictJsonValue };\nexport type StrictJsonObject = Readonly<Record<string, StrictJsonValue>>;\n\ntype JsonValue = StrictJsonValue;\n\nconst JS_MIN_NORMAL_NUMBER = 2 ** -1022;\n\nfunction assertStableJsonNumber(value: number, path: string): void {\n\tif (!Number.isFinite(value)) {\n\t\tthrow new TypeError(`stableJsonString: non-finite number at ${path}`);\n\t}\n}\n\nfunction assertStrictJsonNumber(value: number, path: string): void {\n\tassertStableJsonNumber(value, path);\n\tif (Object.is(value, -0)) {\n\t\tthrow new TypeError(`stableJsonString: non-canonical number at ${path}`);\n\t}\n\tconst abs = Math.abs(value);\n\tif (abs > 0 && abs < JS_MIN_NORMAL_NUMBER) {\n\t\tthrow new TypeError(`stableJsonString: subnormal number at ${path}`);\n\t}\n\tif (Number.isInteger(value) && !Number.isSafeInteger(value)) {\n\t\tthrow new TypeError(`stableJsonString: integer outside safe range at ${path}`);\n\t}\n}\n\nfunction sortedJsonValue(\n\tvalue: unknown,\n\tseen = new Set<object>(),\n\tpath = \"$\",\n\tstrictNumbers = false,\n): JsonValue {\n\tif (value === null) return null;\n\tif (typeof value === \"string\" || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\") {\n\t\tif (strictNumbers) assertStrictJsonNumber(value, path);\n\t\telse assertStableJsonNumber(value, path);\n\t\treturn value;\n\t}\n\tif (typeof value !== \"object\") {\n\t\tthrow new TypeError(`stableJsonString: value at ${path} is not JSON-encodable`);\n\t}\n\tif (seen.has(value)) throw new TypeError(`stableJsonString: circular reference at ${path}`);\n\tconst proto = Object.getPrototypeOf(value);\n\tif (!Array.isArray(value) && proto !== Object.prototype && proto !== null) {\n\t\tthrow new TypeError(`stableJsonString: non-plain object at ${path}`);\n\t}\n\tseen.add(value);\n\ttry {\n\t\tif (Array.isArray(value)) {\n\t\t\tif (Object.getOwnPropertySymbols(value).length > 0) {\n\t\t\t\tthrow new TypeError(`stableJsonString: symbol-keyed properties at ${path}`);\n\t\t\t}\n\t\t\tfor (const key of Object.getOwnPropertyNames(value)) {\n\t\t\t\tconst isIndex =\n\t\t\t\t\t/^(0|[1-9]\\d*)$/.test(key) &&\n\t\t\t\t\tNumber.isSafeInteger(Number(key)) &&\n\t\t\t\t\tNumber(key) < value.length;\n\t\t\t\tif (key !== \"length\" && !isIndex) {\n\t\t\t\t\tthrow new TypeError(`stableJsonString: non-index array property at ${path}.${key}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst out: JsonValue[] = [];\n\t\t\tfor (let i = 0; i < value.length; i += 1) {\n\t\t\t\tif (!(i in value)) {\n\t\t\t\t\tthrow new TypeError(`stableJsonString: sparse array hole at ${path}[${i}]`);\n\t\t\t\t}\n\t\t\t\tout.push(sortedJsonValue(value[i], seen, `${path}[${i}]`, strictNumbers));\n\t\t\t}\n\t\t\treturn out;\n\t\t}\n\t\tif (Object.getOwnPropertySymbols(value).length > 0) {\n\t\t\tthrow new TypeError(`stableJsonString: symbol-keyed properties at ${path}`);\n\t\t}\n\t\tconst out: Record<string, JsonValue> = Object.create(null);\n\t\tfor (const key of Object.keys(value as Record<string, unknown>).sort()) {\n\t\t\tout[key] = sortedJsonValue(\n\t\t\t\t(value as Record<string, unknown>)[key],\n\t\t\t\tseen,\n\t\t\t\t`${path}.${key}`,\n\t\t\t\tstrictNumbers,\n\t\t\t);\n\t\t}\n\t\treturn out;\n\t} finally {\n\t\tseen.delete(value);\n\t}\n}\n\n/** Stable JSON string: object keys sort by code-unit order for deterministic storage/checkpoint bytes. */\nexport function stableJsonString(value: unknown): string {\n\treturn JSON.stringify(sortedJsonValue(value));\n}\n\nfunction strictStableJsonString(value: unknown): string {\n\treturn JSON.stringify(sortedJsonValue(value, new Set<object>(), \"$\", true));\n}\n\n/** Build a JSON codec using stable object-key ordering. */\nexport function jsonCodecFor<T>(): Codec<T> {\n\tconst encoder = new TextEncoder();\n\tconst decoder = new TextDecoder();\n\treturn {\n\t\tencode(value: T): Uint8Array {\n\t\t\treturn encoder.encode(stableJsonString(value));\n\t\t},\n\t\tdecode(bytes: Uint8Array): T {\n\t\t\treturn JSON.parse(decoder.decode(bytes)) as T;\n\t\t},\n\t};\n}\n\n/** Default stable JSON codec for unknown values. */\nexport const jsonCodec: Codec<unknown> = jsonCodecFor<unknown>();\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n\tif (a.byteLength !== b.byteLength) return false;\n\tfor (let i = 0; i < a.byteLength; i += 1) {\n\t\tif (a[i] !== b[i]) return false;\n\t}\n\treturn true;\n}\n\nfunction hasUnpairedSurrogate(value: string): boolean {\n\tfor (let i = 0; i < value.length; i += 1) {\n\t\tconst code = value.charCodeAt(i);\n\t\tif (code >= 0xd800 && code <= 0xdbff) {\n\t\t\tconst next = value.charCodeAt(i + 1);\n\t\t\tif (next >= 0xdc00 && next <= 0xdfff) {\n\t\t\t\ti += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tif (code >= 0xdc00 && code <= 0xdfff) return true;\n\t}\n\treturn false;\n}\n\nfunction assertNoUnpairedSurrogates(value: unknown, seen = new Set<object>(), path = \"$\"): void {\n\tif (typeof value === \"string\") {\n\t\tif (hasUnpairedSurrogate(value)) {\n\t\t\tthrow new TypeError(`strictJsonCodec: unpaired surrogate at ${path}`);\n\t\t}\n\t\treturn;\n\t}\n\tif (value === null || typeof value !== \"object\") return;\n\tif (seen.has(value)) return;\n\tseen.add(value);\n\ttry {\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (let i = 0; i < value.length; i += 1) {\n\t\t\t\tassertNoUnpairedSurrogates(value[i], seen, `${path}[${i}]`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tfor (const key of Object.keys(value as Record<string, unknown>)) {\n\t\t\tif (hasUnpairedSurrogate(key)) {\n\t\t\t\tthrow new TypeError(`strictJsonCodec: unpaired surrogate at ${path}.${key}`);\n\t\t\t}\n\t\t\tassertNoUnpairedSurrogates((value as Record<string, unknown>)[key], seen, `${path}.${key}`);\n\t\t}\n\t} finally {\n\t\tseen.delete(value);\n\t}\n}\n\nfunction assertNoDuplicateJsonObjectKeys(text: string): void {\n\tlet index = 0;\n\n\tfunction fail(message: string): never {\n\t\tthrow new TypeError(`strictJsonCodec: ${message}`);\n\t}\n\n\tfunction skipWhitespace(): void {\n\t\twhile (/\\s/.test(text[index] ?? \"\")) index += 1;\n\t}\n\n\tfunction readJsonString(): string {\n\t\tconst start = index;\n\t\tindex += 1;\n\t\twhile (index < text.length) {\n\t\t\tconst ch = text[index];\n\t\t\tif (ch === '\"') {\n\t\t\t\tindex += 1;\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(text.slice(start, index)) as string;\n\t\t\t\t} catch {\n\t\t\t\t\tfail(\"malformed JSON string\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ch === \"\\\\\") {\n\t\t\t\tindex += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tindex += 1;\n\t\t}\n\t\tfail(\"unterminated JSON string\");\n\t}\n\n\tfunction consumeLiteral(literal: string): void {\n\t\tif (text.slice(index, index + literal.length) !== literal) {\n\t\t\tfail(`malformed JSON near byte ${index}`);\n\t\t}\n\t\tindex += literal.length;\n\t}\n\n\tfunction consumeNumber(): void {\n\t\tconst match = /^-?(0|[1-9]\\d*)(\\.\\d+)?([eE][+-]?\\d+)?/.exec(text.slice(index));\n\t\tif (!match) fail(`malformed JSON number near byte ${index}`);\n\t\tindex += match[0].length;\n\t}\n\n\tfunction parseValue(path: string): void {\n\t\tskipWhitespace();\n\t\tconst ch = text[index];\n\t\tif (ch === \"{\") {\n\t\t\tparseObject(path);\n\t\t\treturn;\n\t\t}\n\t\tif (ch === \"[\") {\n\t\t\tparseArray(path);\n\t\t\treturn;\n\t\t}\n\t\tif (ch === '\"') {\n\t\t\treadJsonString();\n\t\t\treturn;\n\t\t}\n\t\tif (ch === \"t\") {\n\t\t\tconsumeLiteral(\"true\");\n\t\t\treturn;\n\t\t}\n\t\tif (ch === \"f\") {\n\t\t\tconsumeLiteral(\"false\");\n\t\t\treturn;\n\t\t}\n\t\tif (ch === \"n\") {\n\t\t\tconsumeLiteral(\"null\");\n\t\t\treturn;\n\t\t}\n\t\tif (ch === \"-\" || (ch !== undefined && ch >= \"0\" && ch <= \"9\")) {\n\t\t\tconsumeNumber();\n\t\t\treturn;\n\t\t}\n\t\tfail(`malformed JSON near byte ${index}`);\n\t}\n\n\tfunction parseObject(path: string): void {\n\t\tconst keys = new Set<string>();\n\t\tindex += 1;\n\t\tskipWhitespace();\n\t\tif (text[index] === \"}\") {\n\t\t\tindex += 1;\n\t\t\treturn;\n\t\t}\n\t\twhile (index < text.length) {\n\t\t\tskipWhitespace();\n\t\t\tif (text[index] !== '\"') fail(`expected object key near byte ${index}`);\n\t\t\tconst key = readJsonString();\n\t\t\tif (keys.has(key)) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`strictJsonCodec: duplicate object key ${JSON.stringify(key)} at ${path}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tkeys.add(key);\n\t\t\tskipWhitespace();\n\t\t\tif (text[index] !== \":\") fail(`expected ':' after object key near byte ${index}`);\n\t\t\tindex += 1;\n\t\t\tparseValue(`${path}.${key}`);\n\t\t\tskipWhitespace();\n\t\t\tif (text[index] === \",\") {\n\t\t\t\tindex += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (text[index] === \"}\") {\n\t\t\t\tindex += 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfail(`expected ',' or '}' near byte ${index}`);\n\t\t}\n\t\tfail(\"unterminated JSON object\");\n\t}\n\n\tfunction parseArray(path: string): void {\n\t\tindex += 1;\n\t\tskipWhitespace();\n\t\tif (text[index] === \"]\") {\n\t\t\tindex += 1;\n\t\t\treturn;\n\t\t}\n\t\tlet item = 0;\n\t\twhile (index < text.length) {\n\t\t\tparseValue(`${path}[${item}]`);\n\t\t\titem += 1;\n\t\t\tskipWhitespace();\n\t\t\tif (text[index] === \",\") {\n\t\t\t\tindex += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (text[index] === \"]\") {\n\t\t\t\tindex += 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfail(`expected ',' or ']' near byte ${index}`);\n\t\t}\n\t\tfail(\"unterminated JSON array\");\n\t}\n\n\tparseValue(\"$\");\n\tskipWhitespace();\n\tif (index !== text.length) fail(`trailing JSON token near byte ${index}`);\n}\n\n/**\n * Build a strict canonical JSON codec (D84/D87/D96).\n * The strict surface rejects malformed UTF-8, duplicate object keys, non-canonical bytes,\n * unpaired surrogates, and values that cannot round-trip through stable JSON.\n */\nexport function strictJsonCodecFor<T>(): Codec<T> {\n\tconst encoder = new TextEncoder();\n\tconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\n\treturn {\n\t\tencode(value: T): Uint8Array {\n\t\t\tassertNoUnpairedSurrogates(value);\n\t\t\treturn encoder.encode(strictStableJsonString(value));\n\t\t},\n\t\tdecode(bytes: Uint8Array): T {\n\t\t\tconst text = decoder.decode(bytes);\n\t\t\tassertNoDuplicateJsonObjectKeys(text);\n\t\t\tconst decoded = JSON.parse(text) as unknown;\n\t\t\tassertNoUnpairedSurrogates(decoded);\n\t\t\tconst canonical = encoder.encode(strictStableJsonString(decoded));\n\t\t\tif (!bytesEqual(bytes, canonical)) {\n\t\t\t\tthrow new TypeError(\"strictJsonCodec: bytes are not canonical stable JSON\");\n\t\t\t}\n\t\t\treturn decoded as T;\n\t\t},\n\t};\n}\n\n/** Default strict canonical JSON codec for unknown values. */\nexport const strictJsonCodec: Codec<unknown> = strictJsonCodecFor<unknown>();\n\n/** D113 neutral helper for strict canonical JSON UTF-8 bytes. */\nexport function strictCanonicalJsonBytes(value: unknown): Uint8Array {\n\treturn strictJsonCodec.encode(value);\n}\n\n/** Validate and normalize a host value into strict canonical JSON data. */\nexport function assertStrictJsonValue(value: unknown, label = \"strictJsonValue\"): StrictJsonValue {\n\ttry {\n\t\treturn strictJsonCodec.decode(strictJsonCodec.encode(value)) as StrictJsonValue;\n\t} catch (cause) {\n\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\tthrow new TypeError(`${label}: value is not strict JSON compatible: ${message}`, { cause });\n\t}\n}\n\n/** Validate and normalize a host value into a strict canonical JSON object. */\nexport function assertStrictJsonObject(\n\tvalue: unknown,\n\tlabel = \"strictJsonObject\",\n): StrictJsonObject {\n\tconst normalized = assertStrictJsonValue(value, label);\n\tif (normalized === null || typeof normalized !== \"object\" || Array.isArray(normalized)) {\n\t\tthrow new TypeError(`${label}: value must be a strict JSON object`);\n\t}\n\treturn normalized as StrictJsonObject;\n}\n","import {\n\thasStoragePutIfAbsent,\n\thasStorageVersioned,\n\tmemoryBackend,\n\ttype StorageBackend,\n\ttype StorageGeneration,\n} from \"./backend.js\";\nimport type { Codec } from \"./codec.js\";\nimport { jsonCodecFor } from \"./codec.js\";\n\n/** Codec-backed key/value tier over a passive byte backend (D82). */\nexport interface KvStorageTier<T = unknown> {\n\tget(key: string): Promise<T | undefined>;\n\tset(key: string, value: T): Promise<void>;\n\tputIfAbsent?(key: string, value: T): Promise<boolean>;\n\tgetVersioned?(key: string): Promise<KvVersionedRead<T>>;\n\tsetIfMatch?(key: string, value: T, generation: StorageGeneration): Promise<boolean>;\n\tdelete(key: string): Promise<void>;\n\tlist(prefix?: string): Promise<readonly string[]>;\n}\n\n/** Typed D85 conditional-create capability over a KV tier. */\nexport interface PutIfAbsentKvStorageTier<T = unknown> extends KvStorageTier<T> {\n\tputIfAbsent(key: string, value: T): Promise<boolean>;\n}\n\n/** Opaque D108 per-key generation token for typed KV versioned reads. */\nexport type KvGeneration = StorageGeneration;\n\n/** D108 versioned typed read result with explicit present/absent observations. */\nexport type KvVersionedRead<T> =\n\t| {\n\t\t\treadonly kind: \"hit\";\n\t\t\treadonly value: T;\n\t\t\treadonly generation: KvGeneration;\n\t }\n\t| {\n\t\t\treadonly kind: \"miss\";\n\t\t\treadonly generation: KvGeneration;\n\t };\n\n/** Typed D108 versioned read + generation-conditional set capability over a KV tier. */\nexport interface VersionedKvStorageTier<T = unknown> extends KvStorageTier<T> {\n\tgetVersioned(key: string): Promise<KvVersionedRead<T>>;\n\tsetIfMatch(key: string, value: T, generation: KvGeneration): Promise<boolean>;\n}\n\n/** Runtime guard for typed KV tiers that expose D85 conditional create. */\nexport function hasKvPutIfAbsent<T>(tier: KvStorageTier<T>): tier is PutIfAbsentKvStorageTier<T> {\n\treturn typeof tier.putIfAbsent === \"function\";\n}\n\n/** Require D85 conditional-create support and produce a clear adapter error when absent. */\nexport function requireKvPutIfAbsent<T>(\n\ttier: KvStorageTier<T>,\n\tlabel = \"kvStorage\",\n): PutIfAbsentKvStorageTier<T> {\n\tif (!hasKvPutIfAbsent(tier)) {\n\t\tthrow new Error(`${label}: KV tier does not support putIfAbsent`);\n\t}\n\treturn tier;\n}\n\n/** Runtime guard for typed KV tiers that expose D108 versioned read/set-if-match. */\nexport function hasKvVersioned<T>(tier: KvStorageTier<T>): tier is VersionedKvStorageTier<T> {\n\treturn typeof tier.getVersioned === \"function\" && typeof tier.setIfMatch === \"function\";\n}\n\n/** Require D108 versioned KV support and produce a clear adapter error when absent. */\nexport function requireKvVersioned<T>(\n\ttier: KvStorageTier<T>,\n\tlabel = \"kvStorage\",\n): VersionedKvStorageTier<T> {\n\tif (!hasKvVersioned(tier)) {\n\t\tthrow new Error(`${label}: KV tier does not support versioned get/set-if-match`);\n\t}\n\treturn tier;\n}\n\n/** Options for wrapping a byte backend as a typed KV tier. */\nexport interface KvStorageOptions<T> {\n\tbackend: StorageBackend;\n\tcodec?: Codec<T>;\n}\n\nfunction defer<T>(fn: () => T | PromiseLike<T>): Promise<T> {\n\treturn Promise.resolve().then(fn);\n}\n\n/** Build a typed KV tier from a byte backend and codec. */\nexport function kvStorage<T = unknown>(opts: KvStorageOptions<T>): KvStorageTier<T> {\n\tconst codec = opts.codec ?? jsonCodecFor<T>();\n\tconst { backend } = opts;\n\tconst tier: KvStorageTier<T> = {\n\t\tget(key) {\n\t\t\treturn defer(() => backend.get(key)).then((bytes) =>\n\t\t\t\tbytes === undefined ? undefined : codec.decode(bytes),\n\t\t\t);\n\t\t},\n\t\tset(key, value) {\n\t\t\treturn defer(() => backend.put(key, codec.encode(value))).then(() => undefined);\n\t\t},\n\t\tdelete(key) {\n\t\t\treturn defer(() => backend.delete?.(key)).then(() => undefined);\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\treturn defer(() => {\n\t\t\t\tif (!backend.list) throw new Error(\"kvStorage.list: backend does not support listing\");\n\t\t\t\treturn backend.list(prefix);\n\t\t\t}).then((keys) => [...keys].sort());\n\t\t},\n\t};\n\tlet out = tier;\n\tif (hasStoragePutIfAbsent(backend)) {\n\t\tout = {\n\t\t\t...out,\n\t\t\tputIfAbsent(key, value) {\n\t\t\t\treturn defer(() => backend.putIfAbsent(key, codec.encode(value)));\n\t\t\t},\n\t\t};\n\t}\n\tif (hasStorageVersioned(backend)) {\n\t\tout = {\n\t\t\t...out,\n\t\t\tgetVersioned(key) {\n\t\t\t\treturn defer(() => backend.getVersioned(key)).then((result) => {\n\t\t\t\t\tif (result.kind === \"miss\") return { kind: \"miss\", generation: result.generation };\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"hit\",\n\t\t\t\t\t\tvalue: codec.decode(result.value),\n\t\t\t\t\t\tgeneration: result.generation,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t},\n\t\t\tsetIfMatch(key, value, generation) {\n\t\t\t\treturn defer(() => backend.setIfMatch(key, codec.encode(value), generation));\n\t\t\t},\n\t\t};\n\t}\n\treturn out;\n}\n\n/** Create an in-memory typed KV tier. */\nexport function memoryKv<T = unknown>(codec: Codec<T> = jsonCodecFor<T>()): KvStorageTier<T> {\n\treturn kvStorage({ backend: memoryBackend(), codec });\n}\n\n/** Create an in-memory typed KV tier preloaded from a record. */\nexport function dictKv<T = unknown>(\n\tentries: Record<string, T> = {},\n\tcodec: Codec<T> = jsonCodecFor<T>(),\n): KvStorageTier<T> {\n\tconst backend = memoryBackend();\n\tconst kv = kvStorage({ backend, codec });\n\tfor (const [key, value] of Object.entries(entries)) {\n\t\tbackend.put(key, codec.encode(value as T));\n\t}\n\treturn kv;\n}\n\n/** Convenience wrapper for deterministic prefix listing. */\nexport function listByPrefix<T>(tier: KvStorageTier<T>, prefix = \"\"): Promise<readonly string[]> {\n\treturn tier.list(prefix);\n}\n","import type { KvStorageTier } from \"./kv.js\";\nimport { memoryKv, requireKvPutIfAbsent } from \"./kv.js\";\n\nexport const APPEND_LOG_SEQ_PAD = 20;\n\n/** One append-log record with its storage key and monotonic sequence. */\nexport interface AppendLogEntry<T> {\n\treadonly key: string;\n\treadonly seq: number;\n\treadonly value: T;\n}\n\n/** Cursor and page-size options for append-log reads. */\nexport interface AppendLogReadOptions {\n\t/** Return entries with seq > after. */\n\tafter?: number;\n\tlimit?: number;\n}\n\n/** One bounded append-log page with the cursor for the next read. */\nexport interface AppendLogPage<T> {\n\treadonly entries: readonly AppendLogEntry<T>[];\n\treadonly nextAfter: number;\n\treadonly done: boolean;\n}\n\n/**\n * Append-only tier for durable event/change logs (D82), not graph restore replay.\n *\n * This first-cut helper serializes operations within one handle. Concurrent writers sharing the\n * same KV prefix need an external single-writer discipline or a future CAS-capable backend.\n */\nexport interface AppendLogStorageTier<T = unknown> {\n\tappend(value: T): Promise<AppendLogEntry<T>>;\n\tread(opts?: AppendLogReadOptions): Promise<readonly AppendLogEntry<T>[]>;\n\ttruncateAfter(seq: number): Promise<void>;\n\tsize(): Promise<number>;\n}\n\n/** D85 multi-writer append log; requires a passive conditional-create KV capability. */\nexport type MultiWriterAppendLogStorageTier<T = unknown> = AppendLogStorageTier<T>;\n\n/** Build the deterministic storage key for an append-log sequence number. */\nexport function appendLogKey(prefix: string, seq: number): string {\n\tif (!Number.isSafeInteger(seq) || seq < 0) {\n\t\tthrow new RangeError(`appendLogKey: seq must be a non-negative safe integer, got ${seq}`);\n\t}\n\treturn `${prefix}/${seq.toString().padStart(APPEND_LOG_SEQ_PAD, \"0\")}`;\n}\n\nfunction seqFromKey(prefix: string, key: string): number {\n\tconst head = `${prefix}/`;\n\tif (!key.startsWith(head)) throw new Error(`append log key outside prefix: ${key}`);\n\tconst raw = key.slice(head.length);\n\tif (!/^\\d+$/.test(raw)) {\n\t\tthrow new Error(`append log key has a non-numeric sequence: ${key}`);\n\t}\n\tif (raw.length !== APPEND_LOG_SEQ_PAD) {\n\t\tthrow new Error(`append log key sequence must be ${APPEND_LOG_SEQ_PAD} padded digits: ${key}`);\n\t}\n\tconst seq = Number(raw);\n\tif (!Number.isSafeInteger(seq)) {\n\t\tthrow new Error(`append log key sequence is outside the safe integer range: ${key}`);\n\t}\n\treturn seq;\n}\n\nfunction nextSeqFromKeys(prefix: string, keys: readonly string[]): number {\n\tif (keys.length === 0) return 0;\n\tconst next = Math.max(...keys.map((key) => seqFromKey(prefix, key))) + 1;\n\tif (!Number.isSafeInteger(next)) {\n\t\tthrow new RangeError(`append log next sequence is outside the safe integer range: ${prefix}`);\n\t}\n\treturn next;\n}\n\nfunction sizeFromKeys(prefix: string, keys: readonly string[]): number {\n\tfor (const key of keys) seqFromKey(prefix, key);\n\treturn keys.length;\n}\n\nfunction validateReadOptions(opts: AppendLogReadOptions): {\n\tafter: number;\n\tlimit: number;\n} {\n\tconst after = opts.after ?? -1;\n\tconst limit = opts.limit ?? Number.POSITIVE_INFINITY;\n\tif (!Number.isSafeInteger(after) || after < -1) {\n\t\tthrow new RangeError(\n\t\t\t`appendLogStorage.read: after must be an integer cursor >= -1, got ${after}`,\n\t\t);\n\t}\n\tif (limit !== Number.POSITIVE_INFINITY && (!Number.isSafeInteger(limit) || limit < 0)) {\n\t\tthrow new RangeError(\n\t\t\t`appendLogStorage.read: limit must be a non-negative safe integer or Infinity, got ${limit}`,\n\t\t);\n\t}\n\treturn { after, limit };\n}\n\nfunction validatePageLimit(limit: number): number {\n\tif (!Number.isSafeInteger(limit) || limit < 1) {\n\t\tthrow new RangeError(`readAppendLogPage: limit must be a positive safe integer, got ${limit}`);\n\t}\n\tif (limit >= Number.MAX_SAFE_INTEGER) {\n\t\tthrow new RangeError(\"readAppendLogPage: limit must leave room for one lookahead entry\");\n\t}\n\treturn limit;\n}\n\nfunction readAppendLogEntries<T>(\n\tkv: KvStorageTier<T>,\n\tprefix: string,\n\topts: AppendLogReadOptions,\n): Promise<readonly AppendLogEntry<T>[]> {\n\tconst { after, limit } = validateReadOptions(opts);\n\treturn kv.list(`${prefix}/`).then((listed) => {\n\t\tconst keys = listed\n\t\t\t.map((key) => ({ key, seq: seqFromKey(prefix, key) }))\n\t\t\t.filter(({ seq }) => seq > after)\n\t\t\t.sort((a, b) => a.seq - b.seq)\n\t\t\t.slice(0, limit);\n\t\treturn Promise.all(\n\t\t\tkeys.map(\n\t\t\t\t({ key, seq }): Promise<AppendLogEntry<T> | undefined> =>\n\t\t\t\t\tkv.get(key).then((value) => {\n\t\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\t\tthrow new Error(`append log listed key is missing: ${key}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { key, seq, value };\n\t\t\t\t\t}),\n\t\t\t),\n\t\t).then((entries) => {\n\t\t\tconst out: AppendLogEntry<T>[] = [];\n\t\t\tfor (const entry of entries) if (entry !== undefined) out.push(entry);\n\t\t\treturn out;\n\t\t});\n\t});\n}\n\n/** Read one ordered append-log page without assigning replay or restore semantics. */\nexport function readAppendLogPage<T>(\n\tlog: AppendLogStorageTier<T>,\n\topts: AppendLogReadOptions = {},\n): Promise<AppendLogPage<T>> {\n\tconst { after, limit } = validateReadOptions({ after: opts.after, limit: opts.limit ?? 100 });\n\tconst pageLimit = validatePageLimit(limit);\n\treturn log.read({ after, limit: pageLimit + 1 }).then((entries) => {\n\t\tconst visible = entries.slice(0, pageLimit);\n\t\tconst last = visible[visible.length - 1];\n\t\treturn {\n\t\t\tentries: visible,\n\t\t\tnextAfter: last?.seq ?? after,\n\t\t\tdone: entries.length <= pageLimit,\n\t\t};\n\t});\n}\n\nfunction deleteAppendLogEntriesAfter<T>(\n\tkv: KvStorageTier<T>,\n\tprefix: string,\n\tseq: number,\n): Promise<void> {\n\treturn kv\n\t\t.list(`${prefix}/`)\n\t\t.then((keys) =>\n\t\t\tPromise.all(keys.filter((key) => seqFromKey(prefix, key) > seq).map((key) => kv.delete(key))),\n\t\t)\n\t\t.then(() => kv.list(`${prefix}/`))\n\t\t.then(() => undefined);\n}\n\n/** Options for a typed append log over a KV tier. */\nexport interface AppendLogOptions<T> {\n\tkv: KvStorageTier<T>;\n\tprefix?: string;\n}\n\n/** Options for D85 multi-writer append logs over conditional-create capable KV. */\nexport interface MultiWriterAppendLogOptions<T> extends AppendLogOptions<T> {\n\t/** Bound retry work before refreshing the listed tail after another writer wins slots. */\n\tmaxAttempts?: number;\n}\n\n/**\n * Build a single-writer append-only log over a KV tier, serializing all operations in call order\n * for this handle. D85 multi-handle concurrent appends require multiWriterAppendLogStorage.\n */\nexport function appendLogStorage<T = unknown>(opts: AppendLogOptions<T>): AppendLogStorageTier<T> {\n\tconst { kv, prefix = \"event-log\" } = opts;\n\tlet tail: Promise<unknown> = Promise.resolve();\n\n\tfunction initNextSeq(): Promise<number> {\n\t\treturn kv.list(`${prefix}/`).then((keys) => {\n\t\t\treturn nextSeqFromKeys(prefix, keys);\n\t\t});\n\t}\n\n\tfunction enqueue<R>(task: () => Promise<R>): Promise<R> {\n\t\tconst run = tail.then(task, task);\n\t\ttail = run.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn run;\n\t}\n\n\treturn {\n\t\tappend(value) {\n\t\t\treturn enqueue(() =>\n\t\t\t\tinitNextSeq().then((seq) => {\n\t\t\t\t\tconst key = appendLogKey(prefix, seq);\n\t\t\t\t\treturn kv.set(key, value).then(() => {\n\t\t\t\t\t\treturn { key, seq, value };\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tread(opts = {}) {\n\t\t\treturn enqueue(() => readAppendLogEntries(kv, prefix, opts));\n\t\t},\n\t\ttruncateAfter(seq) {\n\t\t\treturn enqueue(() => deleteAppendLogEntriesAfter(kv, prefix, seq));\n\t\t},\n\t\tsize() {\n\t\t\treturn enqueue(() => kv.list(`${prefix}/`).then((keys) => sizeFromKeys(prefix, keys)));\n\t\t},\n\t};\n}\n\n/**\n * Build a D85 multi-writer append log over a conditional-create capable KV tier.\n *\n * Sequence allocation is passive storage work: each writer proposes a padded key and retries the\n * next key when another writer already created that slot. This does not provide general CAS,\n * locks, leases, transactions, unsafe truncation, WAL replay, or graph restore semantics.\n */\nexport function multiWriterAppendLogStorage<T = unknown>(\n\topts: MultiWriterAppendLogOptions<T>,\n): MultiWriterAppendLogStorageTier<T> {\n\tconst { kv, prefix = \"event-log\", maxAttempts = 1024 } = opts;\n\tconst capableKv = requireKvPutIfAbsent(kv, \"multiWriterAppendLogStorage\");\n\tlet tail: Promise<unknown> = Promise.resolve();\n\n\tif (!Number.isSafeInteger(maxAttempts) || maxAttempts < 1) {\n\t\tthrow new RangeError(\n\t\t\t`multiWriterAppendLogStorage: maxAttempts must be a positive safe integer, got ${maxAttempts}`,\n\t\t);\n\t}\n\n\tfunction initNextSeq(): Promise<number> {\n\t\treturn kv.list(`${prefix}/`).then((keys) => nextSeqFromKeys(prefix, keys));\n\t}\n\n\tfunction enqueue<R>(task: () => Promise<R>): Promise<R> {\n\t\tconst run = tail.then(task, task);\n\t\ttail = run.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn run;\n\t}\n\n\treturn {\n\t\tappend(value) {\n\t\t\treturn enqueue(() =>\n\t\t\t\tinitNextSeq().then((startSeq) => {\n\t\t\t\t\tlet seq = startSeq;\n\t\t\t\t\tlet attempt = 0;\n\t\t\t\t\tconst tryNext = (): Promise<AppendLogEntry<T>> => {\n\t\t\t\t\t\tif (attempt >= maxAttempts) {\n\t\t\t\t\t\t\treturn initNextSeq().then((refreshedSeq) => {\n\t\t\t\t\t\t\t\tseq = Math.max(seq, refreshedSeq);\n\t\t\t\t\t\t\t\tattempt = 0;\n\t\t\t\t\t\t\t\treturn tryNext();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tattempt += 1;\n\t\t\t\t\t\tconst key = appendLogKey(prefix, seq);\n\t\t\t\t\t\treturn capableKv.putIfAbsent(key, value).then((created) => {\n\t\t\t\t\t\t\tif (created) return { key, seq, value };\n\t\t\t\t\t\t\tseq += 1;\n\t\t\t\t\t\t\tif (!Number.isSafeInteger(seq)) {\n\t\t\t\t\t\t\t\tthrow new RangeError(\n\t\t\t\t\t\t\t\t\t`append log next sequence is outside the safe integer range: ${prefix}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn tryNext();\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t\treturn tryNext();\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tread(opts = {}) {\n\t\t\treturn enqueue(() => readAppendLogEntries(kv, prefix, opts));\n\t\t},\n\t\ttruncateAfter(seq) {\n\t\t\treturn enqueue(() => {\n\t\t\t\tif (!Number.isSafeInteger(seq) || seq < -1) {\n\t\t\t\t\tthrow new RangeError(\n\t\t\t\t\t\t`multiWriterAppendLogStorage.truncateAfter: seq must be an integer cursor >= -1, got ${seq}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"multiWriterAppendLogStorage.truncateAfter: unsupported without a stronger compaction capability\",\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t\tsize() {\n\t\t\treturn enqueue(() => kv.list(`${prefix}/`).then((keys) => sizeFromKeys(prefix, keys)));\n\t\t},\n\t};\n}\n\n/** Create an in-memory append log. */\nexport function memoryAppendLog<T = unknown>(prefix?: string): AppendLogStorageTier<T> {\n\treturn appendLogStorage({ kv: memoryKv<T>(), prefix });\n}\n\n/** Create an in-memory D85 multi-writer append log. */\nexport function memoryMultiWriterAppendLog<T = unknown>(\n\tprefix?: string,\n): MultiWriterAppendLogStorageTier<T> {\n\treturn multiWriterAppendLogStorage({ kv: memoryKv<T>(), prefix });\n}\n"],"mappings":"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","names":["out","opts"]}
|
|
1
|
+
{"version":3,"sources":["../../src/storage/browser.ts","../../src/storage/backend.ts","../../src/json/codec.ts","../../src/storage/kv.ts","../../src/storage/append-log.ts"],"sourcesContent":["/**\n * Browser-only passive storage backend (D103).\n *\n * Uses DOM IndexedDB to provide async byte storage, no graph methods.\n */\n\n/// <reference lib=\"dom\" />\n\nimport { type AppendLogStorageTier, appendLogStorage } from \"./append-log.js\";\nimport type { StorageBackend } from \"./backend.js\";\nimport type { Codec } from \"./codec.js\";\nimport { type KvStorageOptions, type KvStorageTier, kvStorage } from \"./kv.js\";\n\nexport type IndexedDbBackendSpec = {\n\tdbName: string;\n\tstoreName: string;\n\tversion?: number;\n};\n\nexport interface NamedIndexedDbBackend extends StorageBackend {\n\treadonly name: string;\n}\n\ntype IndexedDbError = DOMException | Error;\n\nconst KEY_SEPARATOR = \"\\u0000\";\n\nfunction isConstraintError(error: unknown): error is DOMException {\n\treturn error instanceof DOMException && error.name === \"ConstraintError\";\n}\n\nfunction validateKey(key: string): string {\n\tif (typeof key !== \"string\") {\n\t\tthrow new TypeError(\"indexedDbBackend: key must be a string\");\n\t}\n\tif (key.includes(KEY_SEPARATOR)) {\n\t\tthrow new TypeError(\"indexedDbBackend: key must not contain U+0000\");\n\t}\n\treturn key;\n}\n\nfunction validateListPrefix(prefix: string): string {\n\tif (typeof prefix !== \"string\") {\n\t\tthrow new TypeError(\"indexedDbBackend: list prefix must be a string\");\n\t}\n\tif (prefix.includes(KEY_SEPARATOR)) {\n\t\tthrow new TypeError(\"indexedDbBackend: list prefix must not contain U+0000\");\n\t}\n\treturn prefix;\n}\n\nfunction decodeStoredBytes(raw: unknown): Uint8Array | undefined {\n\tif (raw === undefined || raw === null) return undefined;\n\tif (raw instanceof Uint8Array) return Uint8Array.from(raw);\n\tif (raw instanceof ArrayBuffer) return new Uint8Array(raw.slice(0));\n\tthrow new TypeError(\"indexedDbBackend: malformed stored bytes\");\n}\n\nfunction normalizeKeys(prefix: string, raw: unknown[]): string[] {\n\tconst out: string[] = [];\n\tfor (const key of raw) {\n\t\tif (typeof key !== \"string\") {\n\t\t\tthrow new TypeError(\"indexedDbBackend: stored key must be a string\");\n\t\t}\n\t\tif (key.includes(KEY_SEPARATOR)) {\n\t\t\tthrow new TypeError(\"indexedDbBackend: malformed stored key\");\n\t\t}\n\t\tif (key.startsWith(prefix)) out.push(key);\n\t}\n\tout.sort();\n\treturn out;\n}\n\nfunction openDb(spec: IndexedDbBackendSpec, version = spec.version): Promise<IDBDatabase> {\n\treturn new Promise<IDBDatabase>((resolve, reject) => {\n\t\tif (typeof indexedDB === \"undefined\") {\n\t\t\treject(new TypeError(\"indexedDbBackend: indexedDB is not available in this environment\"));\n\t\t\treturn;\n\t\t}\n\t\tconst req =\n\t\t\tversion === undefined ? indexedDB.open(spec.dbName) : indexedDB.open(spec.dbName, version);\n\t\treq.onupgradeneeded = () => {\n\t\t\tconst db = req.result;\n\t\t\tif (!db.objectStoreNames.contains(spec.storeName)) {\n\t\t\t\tdb.createObjectStore(spec.storeName);\n\t\t\t}\n\t\t};\n\t\treq.onblocked = () =>\n\t\t\treject(\n\t\t\t\tnew Error(\"indexedDbBackend: open blocked; close existing database connections and retry\"),\n\t\t\t);\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error ?? new TypeError(\"indexedDbBackend: open failed\"));\n\t});\n}\n\nfunction openDbWithStore(spec: IndexedDbBackendSpec): Promise<IDBDatabase> {\n\treturn openDb(spec).then((db) => {\n\t\tif (db.objectStoreNames.contains(spec.storeName)) return db;\n\t\tif (spec.version !== undefined) {\n\t\t\tdb.close();\n\t\t\tthrow new Error(\n\t\t\t\t`indexedDbBackend: object store \"${spec.storeName}\" is missing; bump the IndexedDB version to create it`,\n\t\t\t);\n\t\t}\n\t\tconst nextVersion = db.version + 1;\n\t\tdb.close();\n\t\treturn openDb(spec, nextVersion).then((upgraded) => {\n\t\t\tif (upgraded.objectStoreNames.contains(spec.storeName)) return upgraded;\n\t\t\tupgraded.close();\n\t\t\tthrow new Error(`indexedDbBackend: object store \"${spec.storeName}\" was not created`);\n\t\t});\n\t});\n}\n\nexport type IndexedDbKvOptions<T> = Omit<KvStorageOptions<T>, \"backend\">;\n\nexport interface IndexedDbAppendLogOptions<T> {\n\t/** Optional append-log key prefix. */\n\tprefix?: string;\n\t/** Optional payload codec before persistence. */\n\tcodec?: Codec<T>;\n}\n\n/**\n * Creates an IndexedDB backend for browser environments.\n *\n * All methods are async (`Promise`) and do not cross graph layer boundaries.\n */\nexport function indexedDbBackend(spec: IndexedDbBackendSpec): NamedIndexedDbBackend {\n\tlet dbCache: Promise<IDBDatabase> | undefined;\n\tconst db = (): Promise<IDBDatabase> => {\n\t\tif (dbCache !== undefined) return dbCache;\n\t\tconst attempt = openDbWithStore(spec);\n\t\tconst cached = attempt.catch((error) => {\n\t\t\tif (dbCache === cached) dbCache = undefined;\n\t\t\tthrow error;\n\t\t});\n\t\tdbCache = cached;\n\t\treturn dbCache;\n\t};\n\treturn {\n\t\tname: `idb:${spec.dbName}/${spec.storeName}`,\n\t\tget(key) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<Uint8Array | undefined>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readonly\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.get(key);\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tresolve(decodeStoredBytes(req.result));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: read failed\"));\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: read transaction aborted\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => {\n\t\t\t\t\t\t\t\t/* read resolved already; no-op */\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tput(key, value) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.put(value, key);\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: write failed\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => resolve();\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: write transaction aborted\"));\n\t\t\t\t\t\t\ttx.onerror = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: write transaction failed\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tputIfAbsent(key, value) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<boolean>((resolve, reject) => {\n\t\t\t\t\t\tlet requestOk = false;\n\t\t\t\t\t\tlet requestConflict = false;\n\t\t\t\t\t\tlet requestError: unknown;\n\t\t\t\t\t\tlet settled = false;\n\t\t\t\t\t\tconst settle = (fn: () => void): void => {\n\t\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\t\tfn();\n\t\t\t\t\t\t};\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.add(value, key);\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\trequestOk = true;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = (event) => {\n\t\t\t\t\t\t\t\tconst error = req.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\trequestConflict = true;\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\trequestError = error ?? new Error(\"indexedDbBackend: write-if-absent failed\");\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\ttx.oncomplete = () =>\n\t\t\t\t\t\t\t\tsettle(() => {\n\t\t\t\t\t\t\t\t\tif (requestConflict) {\n\t\t\t\t\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t\t\t\t\t} else if (requestOk) {\n\t\t\t\t\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent did not complete\"),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\ttx.onabort = () => {\n\t\t\t\t\t\t\t\tconst error = tx.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\tsettle(() => resolve(false));\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\ttx.error ??\n\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent transaction aborted\"),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\ttx.onerror = () => {\n\t\t\t\t\t\t\t\tconst error = tx.error;\n\t\t\t\t\t\t\t\tif (isConstraintError(error)) {\n\t\t\t\t\t\t\t\t\tsettle(() => resolve(false));\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\trequestError ??\n\t\t\t\t\t\t\t\t\t\t\terror ??\n\t\t\t\t\t\t\t\t\t\t\tnew Error(\"indexedDbBackend: write-if-absent transaction failed\"),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tsettle(() => reject(error as IndexedDbError));\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tdelete(key) {\n\t\t\tvalidateKey(key);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readwrite\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.delete(key);\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: delete failed\"));\n\t\t\t\t\t\t\ttx.oncomplete = () => resolve();\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: delete transaction aborted\"));\n\t\t\t\t\t\t\ttx.onerror = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: delete transaction failed\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\tconst validatedPrefix = validateListPrefix(prefix);\n\t\t\treturn db().then(\n\t\t\t\t(database) =>\n\t\t\t\t\tnew Promise<readonly string[]>((resolve, reject) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst tx = database.transaction(spec.storeName, \"readonly\");\n\t\t\t\t\t\t\tconst store = tx.objectStore(spec.storeName);\n\t\t\t\t\t\t\tconst req = store.getAllKeys();\n\t\t\t\t\t\t\treq.onsuccess = () => {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tresolve(normalizeKeys(validatedPrefix, req.result));\n\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treq.onerror = () => reject(req.error ?? new Error(\"indexedDbBackend: list failed\"));\n\t\t\t\t\t\t\ttx.onabort = () =>\n\t\t\t\t\t\t\t\treject(tx.error ?? new Error(\"indexedDbBackend: list transaction aborted\"));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error as IndexedDbError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * Creates an IndexedDB-backed KV storage tier.\n */\nexport function indexedDbKv<T>(\n\tspec: IndexedDbBackendSpec,\n\topts: IndexedDbKvOptions<T> = {},\n): KvStorageTier<T> {\n\treturn kvStorage<T>({ backend: indexedDbBackend(spec), ...opts });\n}\n\n/**\n * Creates an IndexedDB-backed append-log storage tier.\n */\nexport function indexedDbAppendLog<T>(\n\tspec: IndexedDbBackendSpec,\n\topts: IndexedDbAppendLogOptions<T> = {},\n): AppendLogStorageTier<T> {\n\tconst kv = kvStorage<T>({\n\t\tbackend: indexedDbBackend(spec),\n\t\tcodec: opts.codec,\n\t});\n\treturn appendLogStorage<T>({ kv, prefix: opts.prefix ?? \"append-log\" });\n}\n","/**\n * Byte storage backends (D82): passive adapter-owned storage, no graph methods.\n */\n\nconst HEX_TABLE = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, \"0\"));\nconst NAMESPACE_SEPARATOR = \"\\u0000\";\n\nfunction cloneBytes(bytes: Uint8Array): Uint8Array {\n\treturn Uint8Array.from(bytes);\n}\n\nfunction encodeNamespacePrefix(namespace: string): string {\n\treturn namespace.length > 0 ? `${namespace}${NAMESPACE_SEPARATOR}` : \"\";\n}\n\nfunction encodeBytesToHex(bytes: Uint8Array): string {\n\tlet out = \"\";\n\tfor (const byte of bytes) out += HEX_TABLE[byte];\n\treturn out;\n}\n\nfunction decodeHexToBytes(raw: string): Uint8Array {\n\tif (raw.length % 2 !== 0 || !/^[0-9a-f]*$/i.test(raw)) {\n\t\tthrow new TypeError(\"webStorageBackend: malformed stored bytes\");\n\t}\n\tconst out = new Uint8Array(raw.length / 2);\n\tfor (let i = 0; i < raw.length; i += 2) {\n\t\tconst value = Number.parseInt(raw.slice(i, i + 2), 16);\n\t\tif (Number.isNaN(value)) throw new TypeError(\"webStorageBackend: malformed stored bytes\");\n\t\tout[i / 2] = value;\n\t}\n\treturn out;\n}\n\nfunction validateLogicalKey(label: string, key: string): string {\n\tif (typeof key !== \"string\") {\n\t\tthrow new TypeError(`${label}: key must be a string`);\n\t}\n\tif (key.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: key must not contain U+0000`);\n\t}\n\treturn key;\n}\n\nfunction validateListPrefix(label: string, prefix: string): string {\n\tif (typeof prefix !== \"string\") {\n\t\tthrow new TypeError(`${label}: list prefix must be a string`);\n\t}\n\tif (prefix.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: list prefix must not contain U+0000`);\n\t}\n\treturn prefix;\n}\n\nfunction validateNamespace(label: string, namespace: string): string {\n\tif (typeof namespace !== \"string\") {\n\t\tthrow new TypeError(`${label}: namespace must be a string`);\n\t}\n\tif (namespace.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(`${label}: namespace must not contain U+0000`);\n\t}\n\treturn namespace;\n}\n\n/** Passive byte-addressed backend used by D82 storage binding tiers. */\nexport interface StorageBackend {\n\tget(key: string): undefined | Uint8Array | PromiseLike<undefined | Uint8Array>;\n\tput(key: string, value: Uint8Array): void | PromiseLike<void>;\n\tputIfAbsent?(key: string, value: Uint8Array): boolean | PromiseLike<boolean>;\n\tgetVersioned?(key: string): StorageVersionedRead | PromiseLike<StorageVersionedRead>;\n\tsetIfMatch?(\n\t\tkey: string,\n\t\tvalue: Uint8Array,\n\t\tgeneration: StorageGeneration,\n\t): boolean | PromiseLike<boolean>;\n\tdelete?(key: string): void | PromiseLike<void>;\n\tlist?(prefix?: string): readonly string[] | PromiseLike<readonly string[]>;\n}\n\n/** Passive D85 conditional-create capability for multi-writer storage helpers. */\nexport interface PutIfAbsentStorageBackend extends StorageBackend {\n\tputIfAbsent(key: string, value: Uint8Array): boolean | PromiseLike<boolean>;\n}\n\n/** Opaque D108 per-key generation token for passive storage versioned reads. */\nexport type StorageGeneration = unknown;\n\n/** D108 versioned byte read result with explicit present/absent observations. */\nexport type StorageVersionedRead =\n\t| {\n\t\t\treadonly kind: \"hit\";\n\t\t\treadonly value: Uint8Array;\n\t\t\treadonly generation: StorageGeneration;\n\t }\n\t| {\n\t\t\treadonly kind: \"miss\";\n\t\t\treadonly generation: StorageGeneration;\n\t };\n\n/** Passive D108 versioned read + generation-conditional set capability. */\nexport interface VersionedStorageBackend extends StorageBackend {\n\tgetVersioned(key: string): StorageVersionedRead | PromiseLike<StorageVersionedRead>;\n\tsetIfMatch(\n\t\tkey: string,\n\t\tvalue: Uint8Array,\n\t\tgeneration: StorageGeneration,\n\t): boolean | PromiseLike<boolean>;\n}\n\n/** Runtime guard for D85 conditional-create capable byte backends. */\nexport function hasStoragePutIfAbsent(\n\tbackend: StorageBackend,\n): backend is PutIfAbsentStorageBackend {\n\treturn typeof backend.putIfAbsent === \"function\";\n}\n\n/** Require D85 conditional-create support and produce a clear adapter error when absent. */\nexport function requireStoragePutIfAbsent(\n\tbackend: StorageBackend,\n\tlabel = \"storage backend\",\n): PutIfAbsentStorageBackend {\n\tif (!hasStoragePutIfAbsent(backend)) {\n\t\tthrow new Error(`${label}: backend does not support putIfAbsent`);\n\t}\n\treturn backend;\n}\n\n/** Runtime guard for D108 versioned byte backends. */\nexport function hasStorageVersioned(backend: StorageBackend): backend is VersionedStorageBackend {\n\treturn typeof backend.getVersioned === \"function\" && typeof backend.setIfMatch === \"function\";\n}\n\n/** Require D108 versioned support and produce a clear adapter error when absent. */\nexport function requireStorageVersioned(\n\tbackend: StorageBackend,\n\tlabel = \"storage backend\",\n): VersionedStorageBackend {\n\tif (!hasStorageVersioned(backend)) {\n\t\tthrow new Error(`${label}: backend does not support versioned get/set-if-match`);\n\t}\n\treturn backend;\n}\n\n/** Browser/storage-adapter shape for deterministic byte helpers (DOM-free for portability). */\nexport interface WebStorageLike {\n\treadonly length?: number;\n\tgetItem(key: string): string | null | undefined;\n\tsetItem(key: string, value: string): void;\n\tremoveItem(key: string): void;\n\tkey?(index: number): string | null | undefined;\n\tkeys?(): readonly string[];\n}\n\n/** Storage helper options for namespace isolation and logical-key prefixing. */\nexport interface StorageNamespaceOptions {\n\t/**\n\t * Optional namespace for logical keys.\n\t *\n\t * Namespace is part of key mapping only and is not returned from `list()`.\n\t */\n\tnamespace?: string;\n}\n\nfunction toStorageKey(namespace: string, key: string): string {\n\treturn `${encodeNamespacePrefix(namespace)}${key}`;\n}\n\nfunction enumerateStorageKeys(storage: WebStorageLike): readonly unknown[] {\n\tif (storage.keys) return [...storage.keys()];\n\tif (typeof storage.key === \"function\" && typeof storage.length === \"number\") {\n\t\tconst keys: string[] = [];\n\t\tfor (let i = 0; i < storage.length; i += 1) {\n\t\t\tconst key = storage.key(i);\n\t\t\tif (key !== null && key !== undefined) keys.push(key);\n\t\t}\n\t\treturn keys;\n\t}\n\tconst fallback = storage as unknown as Readonly<Record<string, unknown>>;\n\treturn Object.keys(fallback).filter((key) => typeof fallback[key] === \"string\");\n}\n\nfunction decodeStorageListKey(namespace: string, rawKey: unknown): string | undefined {\n\tif (typeof rawKey !== \"string\") {\n\t\tthrow new TypeError(\"webStorageBackend: stored key must be a string\");\n\t}\n\tconst prefix = encodeNamespacePrefix(namespace);\n\tif (!rawKey.startsWith(prefix)) return undefined;\n\tconst logical = rawKey.slice(prefix.length);\n\tif (logical.includes(NAMESPACE_SEPARATOR)) {\n\t\tthrow new TypeError(\"webStorageBackend: malformed stored key\");\n\t}\n\treturn logical;\n}\n\nfunction listByPrefix(namespace: string, prefix: string, raw: readonly unknown[]): string[] {\n\tconst out: string[] = [];\n\tfor (const key of raw) {\n\t\tconst logical = decodeStorageListKey(namespace, key);\n\t\tif (logical === undefined) continue;\n\t\tif (!logical.startsWith(prefix)) continue;\n\t\tout.push(logical);\n\t}\n\tout.sort();\n\treturn out;\n}\n\n/** Build a deterministic byte backend backed by a browser-like key/value store (D103/D82). */\nexport function webStorageBackend(\n\tstorage: WebStorageLike,\n\topts: StorageNamespaceOptions = {},\n): StorageBackend {\n\tconst namespace =\n\t\topts.namespace === undefined ? \"\" : validateNamespace(\"webStorageBackend\", opts.namespace);\n\treturn {\n\t\tget(key) {\n\t\t\tconst raw = storage.getItem(\n\t\t\t\ttoStorageKey(namespace, validateLogicalKey(\"webStorageBackend\", key)),\n\t\t\t);\n\t\t\tif (raw === null || raw === undefined) return undefined;\n\t\t\treturn decodeHexToBytes(raw);\n\t\t},\n\t\tput(key, value) {\n\t\t\tstorage.setItem(\n\t\t\t\ttoStorageKey(namespace, validateLogicalKey(\"webStorageBackend\", key)),\n\t\t\t\tencodeBytesToHex(cloneBytes(value)),\n\t\t\t);\n\t\t},\n\t\tdelete(key) {\n\t\t\tstorage.removeItem(toStorageKey(namespace, validateLogicalKey(\"webStorageBackend\", key)));\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\treturn listByPrefix(\n\t\t\t\tnamespace,\n\t\t\t\tvalidateListPrefix(\"webStorageBackend\", prefix),\n\t\t\t\tenumerateStorageKeys(storage),\n\t\t\t);\n\t\t},\n\t};\n}\n\n/** In-memory backend for tests, adapters, and lightweight local storage. */\nexport interface MemoryBackend extends StorageBackend {\n\treadonly entries: ReadonlyMap<string, Uint8Array>;\n\tclear(): void;\n}\n\nconst MEMORY_GENERATION = Symbol(\"graphrefly.memoryBackend.generation\");\n\ninterface MemoryGeneration {\n\treadonly [MEMORY_GENERATION]: readonly [epoch: number, key: string, version: number];\n}\n\nfunction memoryGeneration(epoch: number, key: string, version: number): MemoryGeneration {\n\treturn Object.freeze({ [MEMORY_GENERATION]: Object.freeze([epoch, key, version] as const) });\n}\n\nfunction readMemoryGeneration(\n\tgeneration: StorageGeneration,\n): readonly [epoch: number, key: string, version: number] | undefined {\n\tif (typeof generation !== \"object\" || generation === null) return undefined;\n\tconst maybe = generation as Partial<MemoryGeneration>;\n\tconst token = maybe[MEMORY_GENERATION];\n\tif (\n\t\tArray.isArray(token) &&\n\t\ttoken.length === 3 &&\n\t\ttypeof token[0] === \"number\" &&\n\t\ttypeof token[1] === \"string\" &&\n\t\ttypeof token[2] === \"number\"\n\t) {\n\t\treturn token as readonly [number, string, number];\n\t}\n\treturn undefined;\n}\n\n/** Create a byte-cloning in-memory backend. */\nexport function memoryBackend(\n\tinitial: Iterable<readonly [string, Uint8Array]> = [],\n): MemoryBackend {\n\tconst entries = new Map<string, Uint8Array>();\n\tconst versions = new Map<string, number>();\n\tlet epoch = 0;\n\tfor (const [key, value] of initial) {\n\t\tentries.set(validateLogicalKey(\"memoryBackend\", key), cloneBytes(value));\n\t}\n\tconst versionOf = (key: string): number => versions.get(key) ?? 0;\n\tconst bump = (key: string): void => {\n\t\tversions.set(key, versionOf(key) + 1);\n\t};\n\treturn {\n\t\tentries,\n\t\tget(key) {\n\t\t\tconst value = entries.get(validateLogicalKey(\"memoryBackend\", key));\n\t\t\treturn value === undefined ? undefined : cloneBytes(value);\n\t\t},\n\t\tput(key, value) {\n\t\t\tvalidateLogicalKey(\"memoryBackend\", key);\n\t\t\tentries.set(key, cloneBytes(value));\n\t\t\tbump(key);\n\t\t},\n\t\tputIfAbsent(key, value) {\n\t\t\tvalidateLogicalKey(\"memoryBackend\", key);\n\t\t\tif (entries.has(key)) return false;\n\t\t\tentries.set(key, cloneBytes(value));\n\t\t\tbump(key);\n\t\t\treturn true;\n\t\t},\n\t\tgetVersioned(key) {\n\t\t\tvalidateLogicalKey(\"memoryBackend\", key);\n\t\t\tconst value = entries.get(key);\n\t\t\tconst generation = memoryGeneration(epoch, key, versionOf(key));\n\t\t\tif (value === undefined) return { kind: \"miss\", generation };\n\t\t\treturn { kind: \"hit\", value: cloneBytes(value), generation };\n\t\t},\n\t\tsetIfMatch(key, value, generation) {\n\t\t\tvalidateLogicalKey(\"memoryBackend\", key);\n\t\t\tconst observed = readMemoryGeneration(generation);\n\t\t\tif (\n\t\t\t\tobserved === undefined ||\n\t\t\t\tobserved[0] !== epoch ||\n\t\t\t\tobserved[1] !== key ||\n\t\t\t\tobserved[2] !== versionOf(key)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tentries.set(key, cloneBytes(value));\n\t\t\tbump(key);\n\t\t\treturn true;\n\t\t},\n\t\tdelete(key) {\n\t\t\tvalidateLogicalKey(\"memoryBackend\", key);\n\t\t\tif (entries.delete(key)) bump(key);\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\tconst validatedPrefix = validateListPrefix(\"memoryBackend\", prefix);\n\t\t\treturn [...entries.keys()].filter((key) => key.startsWith(validatedPrefix)).sort();\n\t\t},\n\t\tclear() {\n\t\t\tentries.clear();\n\t\t\tversions.clear();\n\t\t\tepoch += 1;\n\t\t},\n\t};\n}\n","/**\n * Neutral JSON/encoding utilities (D96).\n *\n * Shared by graph checkpoints and storage bindings; neither layer owns the strict JSON\n * scanner/canonicalization contract.\n */\n\n/** Typed byte codec for D82 storage binding helpers and D96 shared JSON surfaces. */\nexport interface Codec<T> {\n\tencode(value: T): Uint8Array;\n\tdecode(bytes: Uint8Array): T;\n}\n\nexport type StrictJsonScalar = null | boolean | number | string;\nexport type StrictJsonValue =\n\t| StrictJsonScalar\n\t| readonly StrictJsonValue[]\n\t| { readonly [key: string]: StrictJsonValue };\nexport type StrictJsonObject = Readonly<Record<string, StrictJsonValue>>;\n\ntype JsonValue = StrictJsonValue;\n\nconst JS_MIN_NORMAL_NUMBER = 2 ** -1022;\n\nfunction assertStableJsonNumber(value: number, path: string): void {\n\tif (!Number.isFinite(value)) {\n\t\tthrow new TypeError(`stableJsonString: non-finite number at ${path}`);\n\t}\n}\n\nfunction assertStrictJsonNumber(value: number, path: string): void {\n\tassertStableJsonNumber(value, path);\n\tif (Object.is(value, -0)) {\n\t\tthrow new TypeError(`stableJsonString: non-canonical number at ${path}`);\n\t}\n\tconst abs = Math.abs(value);\n\tif (abs > 0 && abs < JS_MIN_NORMAL_NUMBER) {\n\t\tthrow new TypeError(`stableJsonString: subnormal number at ${path}`);\n\t}\n\tif (Number.isInteger(value) && !Number.isSafeInteger(value)) {\n\t\tthrow new TypeError(`stableJsonString: integer outside safe range at ${path}`);\n\t}\n}\n\nfunction sortedJsonValue(\n\tvalue: unknown,\n\tseen = new Set<object>(),\n\tpath = \"$\",\n\tstrictNumbers = false,\n): JsonValue {\n\tif (value === null) return null;\n\tif (typeof value === \"string\" || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\") {\n\t\tif (strictNumbers) assertStrictJsonNumber(value, path);\n\t\telse assertStableJsonNumber(value, path);\n\t\treturn value;\n\t}\n\tif (typeof value !== \"object\") {\n\t\tthrow new TypeError(`stableJsonString: value at ${path} is not JSON-encodable`);\n\t}\n\tif (seen.has(value)) throw new TypeError(`stableJsonString: circular reference at ${path}`);\n\tconst proto = Object.getPrototypeOf(value);\n\tif (!Array.isArray(value) && proto !== Object.prototype && proto !== null) {\n\t\tthrow new TypeError(`stableJsonString: non-plain object at ${path}`);\n\t}\n\tseen.add(value);\n\ttry {\n\t\tif (Array.isArray(value)) {\n\t\t\tif (Object.getOwnPropertySymbols(value).length > 0) {\n\t\t\t\tthrow new TypeError(`stableJsonString: symbol-keyed properties at ${path}`);\n\t\t\t}\n\t\t\tfor (const key of Object.getOwnPropertyNames(value)) {\n\t\t\t\tconst isIndex =\n\t\t\t\t\t/^(0|[1-9]\\d*)$/.test(key) &&\n\t\t\t\t\tNumber.isSafeInteger(Number(key)) &&\n\t\t\t\t\tNumber(key) < value.length;\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\t\t\t\tif (descriptor !== undefined && (\"get\" in descriptor || \"set\" in descriptor)) {\n\t\t\t\t\tthrow new TypeError(`stableJsonString: accessor property at ${path}.${key}`);\n\t\t\t\t}\n\t\t\t\tif (key !== \"length\" && !isIndex) {\n\t\t\t\t\tthrow new TypeError(`stableJsonString: non-index array property at ${path}.${key}`);\n\t\t\t\t}\n\t\t\t\tif (key !== \"length\" && descriptor !== undefined && !descriptor.enumerable) {\n\t\t\t\t\tthrow new TypeError(`stableJsonString: non-enumerable array property at ${path}.${key}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst out: JsonValue[] = [];\n\t\t\tfor (let i = 0; i < value.length; i += 1) {\n\t\t\t\tif (!(i in value)) {\n\t\t\t\t\tthrow new TypeError(`stableJsonString: sparse array hole at ${path}[${i}]`);\n\t\t\t\t}\n\t\t\t\tout.push(sortedJsonValue(value[i], seen, `${path}[${i}]`, strictNumbers));\n\t\t\t}\n\t\t\treturn out;\n\t\t}\n\t\tif (Object.getOwnPropertySymbols(value).length > 0) {\n\t\t\tthrow new TypeError(`stableJsonString: symbol-keyed properties at ${path}`);\n\t\t}\n\t\tfor (const key of Object.getOwnPropertyNames(value)) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\t\t\tif (descriptor !== undefined && (\"get\" in descriptor || \"set\" in descriptor)) {\n\t\t\t\tthrow new TypeError(`stableJsonString: accessor property at ${path}.${key}`);\n\t\t\t}\n\t\t\tif (descriptor !== undefined && !descriptor.enumerable) {\n\t\t\t\tthrow new TypeError(`stableJsonString: non-enumerable property at ${path}.${key}`);\n\t\t\t}\n\t\t}\n\t\tconst out: Record<string, JsonValue> = Object.create(null);\n\t\tfor (const key of Object.keys(value as Record<string, unknown>).sort()) {\n\t\t\tout[key] = sortedJsonValue(\n\t\t\t\t(value as Record<string, unknown>)[key],\n\t\t\t\tseen,\n\t\t\t\t`${path}.${key}`,\n\t\t\t\tstrictNumbers,\n\t\t\t);\n\t\t}\n\t\treturn out;\n\t} finally {\n\t\tseen.delete(value);\n\t}\n}\n\n/** Stable JSON string: object keys sort by code-unit order for deterministic storage/checkpoint bytes. */\nexport function stableJsonString(value: unknown): string {\n\treturn JSON.stringify(sortedJsonValue(value));\n}\n\nfunction strictStableJsonString(value: unknown): string {\n\treturn JSON.stringify(sortedJsonValue(value, new Set<object>(), \"$\", true));\n}\n\n/** Build a JSON codec using stable object-key ordering. */\nexport function jsonCodecFor<T>(): Codec<T> {\n\tconst encoder = new TextEncoder();\n\tconst decoder = new TextDecoder();\n\treturn {\n\t\tencode(value: T): Uint8Array {\n\t\t\treturn encoder.encode(stableJsonString(value));\n\t\t},\n\t\tdecode(bytes: Uint8Array): T {\n\t\t\treturn JSON.parse(decoder.decode(bytes)) as T;\n\t\t},\n\t};\n}\n\n/** Default stable JSON codec for unknown values. */\nexport const jsonCodec: Codec<unknown> = jsonCodecFor<unknown>();\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n\tif (a.byteLength !== b.byteLength) return false;\n\tfor (let i = 0; i < a.byteLength; i += 1) {\n\t\tif (a[i] !== b[i]) return false;\n\t}\n\treturn true;\n}\n\nfunction hasUnpairedSurrogate(value: string): boolean {\n\tfor (let i = 0; i < value.length; i += 1) {\n\t\tconst code = value.charCodeAt(i);\n\t\tif (code >= 0xd800 && code <= 0xdbff) {\n\t\t\tconst next = value.charCodeAt(i + 1);\n\t\t\tif (next >= 0xdc00 && next <= 0xdfff) {\n\t\t\t\ti += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tif (code >= 0xdc00 && code <= 0xdfff) return true;\n\t}\n\treturn false;\n}\n\nfunction assertNoUnpairedSurrogates(value: unknown, seen = new Set<object>(), path = \"$\"): void {\n\tif (typeof value === \"string\") {\n\t\tif (hasUnpairedSurrogate(value)) {\n\t\t\tthrow new TypeError(`strictJsonCodec: unpaired surrogate at ${path}`);\n\t\t}\n\t\treturn;\n\t}\n\tif (value === null || typeof value !== \"object\") return;\n\tif (seen.has(value)) return;\n\tseen.add(value);\n\ttry {\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (let i = 0; i < value.length; i += 1) {\n\t\t\t\tassertNoUnpairedSurrogates(value[i], seen, `${path}[${i}]`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tfor (const key of Object.keys(value as Record<string, unknown>)) {\n\t\t\tif (hasUnpairedSurrogate(key)) {\n\t\t\t\tthrow new TypeError(`strictJsonCodec: unpaired surrogate at ${path}.${key}`);\n\t\t\t}\n\t\t\tassertNoUnpairedSurrogates((value as Record<string, unknown>)[key], seen, `${path}.${key}`);\n\t\t}\n\t} finally {\n\t\tseen.delete(value);\n\t}\n}\n\nfunction assertNoDuplicateJsonObjectKeys(text: string): void {\n\tlet index = 0;\n\n\tfunction fail(message: string): never {\n\t\tthrow new TypeError(`strictJsonCodec: ${message}`);\n\t}\n\n\tfunction skipWhitespace(): void {\n\t\twhile (/\\s/.test(text[index] ?? \"\")) index += 1;\n\t}\n\n\tfunction readJsonString(): string {\n\t\tconst start = index;\n\t\tindex += 1;\n\t\twhile (index < text.length) {\n\t\t\tconst ch = text[index];\n\t\t\tif (ch === '\"') {\n\t\t\t\tindex += 1;\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(text.slice(start, index)) as string;\n\t\t\t\t} catch {\n\t\t\t\t\tfail(\"malformed JSON string\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ch === \"\\\\\") {\n\t\t\t\tindex += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tindex += 1;\n\t\t}\n\t\tfail(\"unterminated JSON string\");\n\t}\n\n\tfunction consumeLiteral(literal: string): void {\n\t\tif (text.slice(index, index + literal.length) !== literal) {\n\t\t\tfail(`malformed JSON near byte ${index}`);\n\t\t}\n\t\tindex += literal.length;\n\t}\n\n\tfunction consumeNumber(): void {\n\t\tconst match = /^-?(0|[1-9]\\d*)(\\.\\d+)?([eE][+-]?\\d+)?/.exec(text.slice(index));\n\t\tif (!match) fail(`malformed JSON number near byte ${index}`);\n\t\tindex += match[0].length;\n\t}\n\n\tfunction parseValue(path: string): void {\n\t\tskipWhitespace();\n\t\tconst ch = text[index];\n\t\tif (ch === \"{\") {\n\t\t\tparseObject(path);\n\t\t\treturn;\n\t\t}\n\t\tif (ch === \"[\") {\n\t\t\tparseArray(path);\n\t\t\treturn;\n\t\t}\n\t\tif (ch === '\"') {\n\t\t\treadJsonString();\n\t\t\treturn;\n\t\t}\n\t\tif (ch === \"t\") {\n\t\t\tconsumeLiteral(\"true\");\n\t\t\treturn;\n\t\t}\n\t\tif (ch === \"f\") {\n\t\t\tconsumeLiteral(\"false\");\n\t\t\treturn;\n\t\t}\n\t\tif (ch === \"n\") {\n\t\t\tconsumeLiteral(\"null\");\n\t\t\treturn;\n\t\t}\n\t\tif (ch === \"-\" || (ch !== undefined && ch >= \"0\" && ch <= \"9\")) {\n\t\t\tconsumeNumber();\n\t\t\treturn;\n\t\t}\n\t\tfail(`malformed JSON near byte ${index}`);\n\t}\n\n\tfunction parseObject(path: string): void {\n\t\tconst keys = new Set<string>();\n\t\tindex += 1;\n\t\tskipWhitespace();\n\t\tif (text[index] === \"}\") {\n\t\t\tindex += 1;\n\t\t\treturn;\n\t\t}\n\t\twhile (index < text.length) {\n\t\t\tskipWhitespace();\n\t\t\tif (text[index] !== '\"') fail(`expected object key near byte ${index}`);\n\t\t\tconst key = readJsonString();\n\t\t\tif (keys.has(key)) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`strictJsonCodec: duplicate object key ${JSON.stringify(key)} at ${path}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tkeys.add(key);\n\t\t\tskipWhitespace();\n\t\t\tif (text[index] !== \":\") fail(`expected ':' after object key near byte ${index}`);\n\t\t\tindex += 1;\n\t\t\tparseValue(`${path}.${key}`);\n\t\t\tskipWhitespace();\n\t\t\tif (text[index] === \",\") {\n\t\t\t\tindex += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (text[index] === \"}\") {\n\t\t\t\tindex += 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfail(`expected ',' or '}' near byte ${index}`);\n\t\t}\n\t\tfail(\"unterminated JSON object\");\n\t}\n\n\tfunction parseArray(path: string): void {\n\t\tindex += 1;\n\t\tskipWhitespace();\n\t\tif (text[index] === \"]\") {\n\t\t\tindex += 1;\n\t\t\treturn;\n\t\t}\n\t\tlet item = 0;\n\t\twhile (index < text.length) {\n\t\t\tparseValue(`${path}[${item}]`);\n\t\t\titem += 1;\n\t\t\tskipWhitespace();\n\t\t\tif (text[index] === \",\") {\n\t\t\t\tindex += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (text[index] === \"]\") {\n\t\t\t\tindex += 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfail(`expected ',' or ']' near byte ${index}`);\n\t\t}\n\t\tfail(\"unterminated JSON array\");\n\t}\n\n\tparseValue(\"$\");\n\tskipWhitespace();\n\tif (index !== text.length) fail(`trailing JSON token near byte ${index}`);\n}\n\n/**\n * Build a strict canonical JSON codec (D84/D87/D96).\n * The strict surface rejects malformed UTF-8, duplicate object keys, non-canonical bytes,\n * unpaired surrogates, and values that cannot round-trip through stable JSON.\n */\nexport function strictJsonCodecFor<T>(): Codec<T> {\n\tconst encoder = new TextEncoder();\n\tconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\n\treturn {\n\t\tencode(value: T): Uint8Array {\n\t\t\tassertNoUnpairedSurrogates(value);\n\t\t\treturn encoder.encode(strictStableJsonString(value));\n\t\t},\n\t\tdecode(bytes: Uint8Array): T {\n\t\t\tconst text = decoder.decode(bytes);\n\t\t\tassertNoDuplicateJsonObjectKeys(text);\n\t\t\tconst decoded = JSON.parse(text) as unknown;\n\t\t\tassertNoUnpairedSurrogates(decoded);\n\t\t\tconst canonical = encoder.encode(strictStableJsonString(decoded));\n\t\t\tif (!bytesEqual(bytes, canonical)) {\n\t\t\t\tthrow new TypeError(\"strictJsonCodec: bytes are not canonical stable JSON\");\n\t\t\t}\n\t\t\treturn decoded as T;\n\t\t},\n\t};\n}\n\n/** Default strict canonical JSON codec for unknown values. */\nexport const strictJsonCodec: Codec<unknown> = strictJsonCodecFor<unknown>();\n\n/** D113 neutral helper for strict canonical JSON UTF-8 bytes. */\nexport function strictCanonicalJsonBytes(value: unknown): Uint8Array {\n\treturn strictJsonCodec.encode(value);\n}\n\n/** Validate and normalize a host value into strict canonical JSON data. */\nexport function assertStrictJsonValue(value: unknown, label = \"strictJsonValue\"): StrictJsonValue {\n\ttry {\n\t\treturn strictJsonCodec.decode(strictJsonCodec.encode(value)) as StrictJsonValue;\n\t} catch (cause) {\n\t\tconst message = cause instanceof Error ? cause.message : String(cause);\n\t\tthrow new TypeError(`${label}: value is not strict JSON compatible: ${message}`, { cause });\n\t}\n}\n\n/** Validate and normalize a host value into a strict canonical JSON object. */\nexport function assertStrictJsonObject(\n\tvalue: unknown,\n\tlabel = \"strictJsonObject\",\n): StrictJsonObject {\n\tconst normalized = assertStrictJsonValue(value, label);\n\tif (normalized === null || typeof normalized !== \"object\" || Array.isArray(normalized)) {\n\t\tthrow new TypeError(`${label}: value must be a strict JSON object`);\n\t}\n\treturn normalized as StrictJsonObject;\n}\n","import {\n\thasStoragePutIfAbsent,\n\thasStorageVersioned,\n\tmemoryBackend,\n\ttype StorageBackend,\n\ttype StorageGeneration,\n} from \"./backend.js\";\nimport type { Codec } from \"./codec.js\";\nimport { jsonCodecFor } from \"./codec.js\";\n\n/** Codec-backed key/value tier over a passive byte backend (D82). */\nexport interface KvStorageTier<T = unknown> {\n\tget(key: string): Promise<T | undefined>;\n\tset(key: string, value: T): Promise<void>;\n\tputIfAbsent?(key: string, value: T): Promise<boolean>;\n\tgetVersioned?(key: string): Promise<KvVersionedRead<T>>;\n\tsetIfMatch?(key: string, value: T, generation: StorageGeneration): Promise<boolean>;\n\tdelete(key: string): Promise<void>;\n\tlist(prefix?: string): Promise<readonly string[]>;\n}\n\n/** Typed D85 conditional-create capability over a KV tier. */\nexport interface PutIfAbsentKvStorageTier<T = unknown> extends KvStorageTier<T> {\n\tputIfAbsent(key: string, value: T): Promise<boolean>;\n}\n\n/** Opaque D108 per-key generation token for typed KV versioned reads. */\nexport type KvGeneration = StorageGeneration;\n\n/** D108 versioned typed read result with explicit present/absent observations. */\nexport type KvVersionedRead<T> =\n\t| {\n\t\t\treadonly kind: \"hit\";\n\t\t\treadonly value: T;\n\t\t\treadonly generation: KvGeneration;\n\t }\n\t| {\n\t\t\treadonly kind: \"miss\";\n\t\t\treadonly generation: KvGeneration;\n\t };\n\n/** Typed D108 versioned read + generation-conditional set capability over a KV tier. */\nexport interface VersionedKvStorageTier<T = unknown> extends KvStorageTier<T> {\n\tgetVersioned(key: string): Promise<KvVersionedRead<T>>;\n\tsetIfMatch(key: string, value: T, generation: KvGeneration): Promise<boolean>;\n}\n\n/** Runtime guard for typed KV tiers that expose D85 conditional create. */\nexport function hasKvPutIfAbsent<T>(tier: KvStorageTier<T>): tier is PutIfAbsentKvStorageTier<T> {\n\treturn typeof tier.putIfAbsent === \"function\";\n}\n\n/** Require D85 conditional-create support and produce a clear adapter error when absent. */\nexport function requireKvPutIfAbsent<T>(\n\ttier: KvStorageTier<T>,\n\tlabel = \"kvStorage\",\n): PutIfAbsentKvStorageTier<T> {\n\tif (!hasKvPutIfAbsent(tier)) {\n\t\tthrow new Error(`${label}: KV tier does not support putIfAbsent`);\n\t}\n\treturn tier;\n}\n\n/** Runtime guard for typed KV tiers that expose D108 versioned read/set-if-match. */\nexport function hasKvVersioned<T>(tier: KvStorageTier<T>): tier is VersionedKvStorageTier<T> {\n\treturn typeof tier.getVersioned === \"function\" && typeof tier.setIfMatch === \"function\";\n}\n\n/** Require D108 versioned KV support and produce a clear adapter error when absent. */\nexport function requireKvVersioned<T>(\n\ttier: KvStorageTier<T>,\n\tlabel = \"kvStorage\",\n): VersionedKvStorageTier<T> {\n\tif (!hasKvVersioned(tier)) {\n\t\tthrow new Error(`${label}: KV tier does not support versioned get/set-if-match`);\n\t}\n\treturn tier;\n}\n\n/** Options for wrapping a byte backend as a typed KV tier. */\nexport interface KvStorageOptions<T> {\n\tbackend: StorageBackend;\n\tcodec?: Codec<T>;\n}\n\nfunction defer<T>(fn: () => T | PromiseLike<T>): Promise<T> {\n\treturn Promise.resolve().then(fn);\n}\n\n/** Build a typed KV tier from a byte backend and codec. */\nexport function kvStorage<T = unknown>(opts: KvStorageOptions<T>): KvStorageTier<T> {\n\tconst codec = opts.codec ?? jsonCodecFor<T>();\n\tconst { backend } = opts;\n\tconst tier: KvStorageTier<T> = {\n\t\tget(key) {\n\t\t\treturn defer(() => backend.get(key)).then((bytes) =>\n\t\t\t\tbytes === undefined ? undefined : codec.decode(bytes),\n\t\t\t);\n\t\t},\n\t\tset(key, value) {\n\t\t\treturn defer(() => backend.put(key, codec.encode(value))).then(() => undefined);\n\t\t},\n\t\tdelete(key) {\n\t\t\treturn defer(() => backend.delete?.(key)).then(() => undefined);\n\t\t},\n\t\tlist(prefix = \"\") {\n\t\t\treturn defer(() => {\n\t\t\t\tif (!backend.list) throw new Error(\"kvStorage.list: backend does not support listing\");\n\t\t\t\treturn backend.list(prefix);\n\t\t\t}).then((keys) => [...keys].sort());\n\t\t},\n\t};\n\tlet out = tier;\n\tif (hasStoragePutIfAbsent(backend)) {\n\t\tout = {\n\t\t\t...out,\n\t\t\tputIfAbsent(key, value) {\n\t\t\t\treturn defer(() => backend.putIfAbsent(key, codec.encode(value)));\n\t\t\t},\n\t\t};\n\t}\n\tif (hasStorageVersioned(backend)) {\n\t\tout = {\n\t\t\t...out,\n\t\t\tgetVersioned(key) {\n\t\t\t\treturn defer(() => backend.getVersioned(key)).then((result) => {\n\t\t\t\t\tif (result.kind === \"miss\") return { kind: \"miss\", generation: result.generation };\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"hit\",\n\t\t\t\t\t\tvalue: codec.decode(result.value),\n\t\t\t\t\t\tgeneration: result.generation,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t},\n\t\t\tsetIfMatch(key, value, generation) {\n\t\t\t\treturn defer(() => backend.setIfMatch(key, codec.encode(value), generation));\n\t\t\t},\n\t\t};\n\t}\n\treturn out;\n}\n\n/** Create an in-memory typed KV tier. */\nexport function memoryKv<T = unknown>(codec: Codec<T> = jsonCodecFor<T>()): KvStorageTier<T> {\n\treturn kvStorage({ backend: memoryBackend(), codec });\n}\n\n/** Create an in-memory typed KV tier preloaded from a record. */\nexport function dictKv<T = unknown>(\n\tentries: Record<string, T> = {},\n\tcodec: Codec<T> = jsonCodecFor<T>(),\n): KvStorageTier<T> {\n\tconst backend = memoryBackend();\n\tconst kv = kvStorage({ backend, codec });\n\tfor (const [key, value] of Object.entries(entries)) {\n\t\tbackend.put(key, codec.encode(value as T));\n\t}\n\treturn kv;\n}\n\n/** Convenience wrapper for deterministic prefix listing. */\nexport function listByPrefix<T>(tier: KvStorageTier<T>, prefix = \"\"): Promise<readonly string[]> {\n\treturn tier.list(prefix);\n}\n","import type { KvStorageTier } from \"./kv.js\";\nimport { memoryKv, requireKvPutIfAbsent } from \"./kv.js\";\n\nexport const APPEND_LOG_SEQ_PAD = 20;\n\n/** One append-log record with its storage key and monotonic sequence. */\nexport interface AppendLogEntry<T> {\n\treadonly key: string;\n\treadonly seq: number;\n\treadonly value: T;\n}\n\n/** Cursor and page-size options for append-log reads. */\nexport interface AppendLogReadOptions {\n\t/** Return entries with seq > after. */\n\tafter?: number;\n\tlimit?: number;\n}\n\n/** One bounded append-log page with the cursor for the next read. */\nexport interface AppendLogPage<T> {\n\treadonly entries: readonly AppendLogEntry<T>[];\n\treadonly nextAfter: number;\n\treadonly done: boolean;\n}\n\n/**\n * Append-only tier for durable event/change logs (D82), not graph restore replay.\n *\n * This first-cut helper serializes operations within one handle. Concurrent writers sharing the\n * same KV prefix need an external single-writer discipline or a future CAS-capable backend.\n */\nexport interface AppendLogStorageTier<T = unknown> {\n\tappend(value: T): Promise<AppendLogEntry<T>>;\n\tread(opts?: AppendLogReadOptions): Promise<readonly AppendLogEntry<T>[]>;\n\ttruncateAfter(seq: number): Promise<void>;\n\tsize(): Promise<number>;\n}\n\n/** D85 multi-writer append log; requires a passive conditional-create KV capability. */\nexport type MultiWriterAppendLogStorageTier<T = unknown> = AppendLogStorageTier<T>;\n\n/** Build the deterministic storage key for an append-log sequence number. */\nexport function appendLogKey(prefix: string, seq: number): string {\n\tif (!Number.isSafeInteger(seq) || seq < 0) {\n\t\tthrow new RangeError(`appendLogKey: seq must be a non-negative safe integer, got ${seq}`);\n\t}\n\treturn `${prefix}/${seq.toString().padStart(APPEND_LOG_SEQ_PAD, \"0\")}`;\n}\n\nfunction seqFromKey(prefix: string, key: string): number {\n\tconst head = `${prefix}/`;\n\tif (!key.startsWith(head)) throw new Error(`append log key outside prefix: ${key}`);\n\tconst raw = key.slice(head.length);\n\tif (!/^\\d+$/.test(raw)) {\n\t\tthrow new Error(`append log key has a non-numeric sequence: ${key}`);\n\t}\n\tif (raw.length !== APPEND_LOG_SEQ_PAD) {\n\t\tthrow new Error(`append log key sequence must be ${APPEND_LOG_SEQ_PAD} padded digits: ${key}`);\n\t}\n\tconst seq = Number(raw);\n\tif (!Number.isSafeInteger(seq)) {\n\t\tthrow new Error(`append log key sequence is outside the safe integer range: ${key}`);\n\t}\n\treturn seq;\n}\n\nfunction nextSeqFromKeys(prefix: string, keys: readonly string[]): number {\n\tif (keys.length === 0) return 0;\n\tconst next = Math.max(...keys.map((key) => seqFromKey(prefix, key))) + 1;\n\tif (!Number.isSafeInteger(next)) {\n\t\tthrow new RangeError(`append log next sequence is outside the safe integer range: ${prefix}`);\n\t}\n\treturn next;\n}\n\nfunction sizeFromKeys(prefix: string, keys: readonly string[]): number {\n\tfor (const key of keys) seqFromKey(prefix, key);\n\treturn keys.length;\n}\n\nfunction validateReadOptions(opts: AppendLogReadOptions): {\n\tafter: number;\n\tlimit: number;\n} {\n\tconst after = opts.after ?? -1;\n\tconst limit = opts.limit ?? Number.POSITIVE_INFINITY;\n\tif (!Number.isSafeInteger(after) || after < -1) {\n\t\tthrow new RangeError(\n\t\t\t`appendLogStorage.read: after must be an integer cursor >= -1, got ${after}`,\n\t\t);\n\t}\n\tif (limit !== Number.POSITIVE_INFINITY && (!Number.isSafeInteger(limit) || limit < 0)) {\n\t\tthrow new RangeError(\n\t\t\t`appendLogStorage.read: limit must be a non-negative safe integer or Infinity, got ${limit}`,\n\t\t);\n\t}\n\treturn { after, limit };\n}\n\nfunction validatePageLimit(limit: number): number {\n\tif (!Number.isSafeInteger(limit) || limit < 1) {\n\t\tthrow new RangeError(`readAppendLogPage: limit must be a positive safe integer, got ${limit}`);\n\t}\n\tif (limit >= Number.MAX_SAFE_INTEGER) {\n\t\tthrow new RangeError(\"readAppendLogPage: limit must leave room for one lookahead entry\");\n\t}\n\treturn limit;\n}\n\nfunction readAppendLogEntries<T>(\n\tkv: KvStorageTier<T>,\n\tprefix: string,\n\topts: AppendLogReadOptions,\n): Promise<readonly AppendLogEntry<T>[]> {\n\tconst { after, limit } = validateReadOptions(opts);\n\treturn kv.list(`${prefix}/`).then((listed) => {\n\t\tconst keys = listed\n\t\t\t.map((key) => ({ key, seq: seqFromKey(prefix, key) }))\n\t\t\t.filter(({ seq }) => seq > after)\n\t\t\t.sort((a, b) => a.seq - b.seq)\n\t\t\t.slice(0, limit);\n\t\treturn Promise.all(\n\t\t\tkeys.map(\n\t\t\t\t({ key, seq }): Promise<AppendLogEntry<T> | undefined> =>\n\t\t\t\t\tkv.get(key).then((value) => {\n\t\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\t\tthrow new Error(`append log listed key is missing: ${key}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { key, seq, value };\n\t\t\t\t\t}),\n\t\t\t),\n\t\t).then((entries) => {\n\t\t\tconst out: AppendLogEntry<T>[] = [];\n\t\t\tfor (const entry of entries) if (entry !== undefined) out.push(entry);\n\t\t\treturn out;\n\t\t});\n\t});\n}\n\n/** Read one ordered append-log page without assigning replay or restore semantics. */\nexport function readAppendLogPage<T>(\n\tlog: AppendLogStorageTier<T>,\n\topts: AppendLogReadOptions = {},\n): Promise<AppendLogPage<T>> {\n\tconst { after, limit } = validateReadOptions({ after: opts.after, limit: opts.limit ?? 100 });\n\tconst pageLimit = validatePageLimit(limit);\n\treturn log.read({ after, limit: pageLimit + 1 }).then((entries) => {\n\t\tconst visible = entries.slice(0, pageLimit);\n\t\tconst last = visible[visible.length - 1];\n\t\treturn {\n\t\t\tentries: visible,\n\t\t\tnextAfter: last?.seq ?? after,\n\t\t\tdone: entries.length <= pageLimit,\n\t\t};\n\t});\n}\n\nfunction deleteAppendLogEntriesAfter<T>(\n\tkv: KvStorageTier<T>,\n\tprefix: string,\n\tseq: number,\n): Promise<void> {\n\treturn kv\n\t\t.list(`${prefix}/`)\n\t\t.then((keys) =>\n\t\t\tPromise.all(keys.filter((key) => seqFromKey(prefix, key) > seq).map((key) => kv.delete(key))),\n\t\t)\n\t\t.then(() => kv.list(`${prefix}/`))\n\t\t.then(() => undefined);\n}\n\n/** Options for a typed append log over a KV tier. */\nexport interface AppendLogOptions<T> {\n\tkv: KvStorageTier<T>;\n\tprefix?: string;\n}\n\n/** Options for D85 multi-writer append logs over conditional-create capable KV. */\nexport interface MultiWriterAppendLogOptions<T> extends AppendLogOptions<T> {\n\t/** Bound retry work before refreshing the listed tail after another writer wins slots. */\n\tmaxAttempts?: number;\n}\n\n/**\n * Build a single-writer append-only log over a KV tier, serializing all operations in call order\n * for this handle. D85 multi-handle concurrent appends require multiWriterAppendLogStorage.\n */\nexport function appendLogStorage<T = unknown>(opts: AppendLogOptions<T>): AppendLogStorageTier<T> {\n\tconst { kv, prefix = \"event-log\" } = opts;\n\tlet tail: Promise<unknown> = Promise.resolve();\n\n\tfunction initNextSeq(): Promise<number> {\n\t\treturn kv.list(`${prefix}/`).then((keys) => {\n\t\t\treturn nextSeqFromKeys(prefix, keys);\n\t\t});\n\t}\n\n\tfunction enqueue<R>(task: () => Promise<R>): Promise<R> {\n\t\tconst run = tail.then(task, task);\n\t\ttail = run.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn run;\n\t}\n\n\treturn {\n\t\tappend(value) {\n\t\t\treturn enqueue(() =>\n\t\t\t\tinitNextSeq().then((seq) => {\n\t\t\t\t\tconst key = appendLogKey(prefix, seq);\n\t\t\t\t\treturn kv.set(key, value).then(() => {\n\t\t\t\t\t\treturn { key, seq, value };\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tread(opts = {}) {\n\t\t\treturn enqueue(() => readAppendLogEntries(kv, prefix, opts));\n\t\t},\n\t\ttruncateAfter(seq) {\n\t\t\treturn enqueue(() => deleteAppendLogEntriesAfter(kv, prefix, seq));\n\t\t},\n\t\tsize() {\n\t\t\treturn enqueue(() => kv.list(`${prefix}/`).then((keys) => sizeFromKeys(prefix, keys)));\n\t\t},\n\t};\n}\n\n/**\n * Build a D85 multi-writer append log over a conditional-create capable KV tier.\n *\n * Sequence allocation is passive storage work: each writer proposes a padded key and retries the\n * next key when another writer already created that slot. This does not provide general CAS,\n * locks, leases, transactions, unsafe truncation, WAL replay, or graph restore semantics.\n */\nexport function multiWriterAppendLogStorage<T = unknown>(\n\topts: MultiWriterAppendLogOptions<T>,\n): MultiWriterAppendLogStorageTier<T> {\n\tconst { kv, prefix = \"event-log\", maxAttempts = 1024 } = opts;\n\tconst capableKv = requireKvPutIfAbsent(kv, \"multiWriterAppendLogStorage\");\n\tlet tail: Promise<unknown> = Promise.resolve();\n\n\tif (!Number.isSafeInteger(maxAttempts) || maxAttempts < 1) {\n\t\tthrow new RangeError(\n\t\t\t`multiWriterAppendLogStorage: maxAttempts must be a positive safe integer, got ${maxAttempts}`,\n\t\t);\n\t}\n\n\tfunction initNextSeq(): Promise<number> {\n\t\treturn kv.list(`${prefix}/`).then((keys) => nextSeqFromKeys(prefix, keys));\n\t}\n\n\tfunction enqueue<R>(task: () => Promise<R>): Promise<R> {\n\t\tconst run = tail.then(task, task);\n\t\ttail = run.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn run;\n\t}\n\n\treturn {\n\t\tappend(value) {\n\t\t\treturn enqueue(() =>\n\t\t\t\tinitNextSeq().then((startSeq) => {\n\t\t\t\t\tlet seq = startSeq;\n\t\t\t\t\tlet attempt = 0;\n\t\t\t\t\tconst tryNext = (): Promise<AppendLogEntry<T>> => {\n\t\t\t\t\t\tif (attempt >= maxAttempts) {\n\t\t\t\t\t\t\treturn initNextSeq().then((refreshedSeq) => {\n\t\t\t\t\t\t\t\tseq = Math.max(seq, refreshedSeq);\n\t\t\t\t\t\t\t\tattempt = 0;\n\t\t\t\t\t\t\t\treturn tryNext();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tattempt += 1;\n\t\t\t\t\t\tconst key = appendLogKey(prefix, seq);\n\t\t\t\t\t\treturn capableKv.putIfAbsent(key, value).then((created) => {\n\t\t\t\t\t\t\tif (created) return { key, seq, value };\n\t\t\t\t\t\t\tseq += 1;\n\t\t\t\t\t\t\tif (!Number.isSafeInteger(seq)) {\n\t\t\t\t\t\t\t\tthrow new RangeError(\n\t\t\t\t\t\t\t\t\t`append log next sequence is outside the safe integer range: ${prefix}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn tryNext();\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t\treturn tryNext();\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\tread(opts = {}) {\n\t\t\treturn enqueue(() => readAppendLogEntries(kv, prefix, opts));\n\t\t},\n\t\ttruncateAfter(seq) {\n\t\t\treturn enqueue(() => {\n\t\t\t\tif (!Number.isSafeInteger(seq) || seq < -1) {\n\t\t\t\t\tthrow new RangeError(\n\t\t\t\t\t\t`multiWriterAppendLogStorage.truncateAfter: seq must be an integer cursor >= -1, got ${seq}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"multiWriterAppendLogStorage.truncateAfter: unsupported without a stronger compaction capability\",\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t\tsize() {\n\t\t\treturn enqueue(() => kv.list(`${prefix}/`).then((keys) => sizeFromKeys(prefix, keys)));\n\t\t},\n\t};\n}\n\n/** Create an in-memory append log. */\nexport function memoryAppendLog<T = unknown>(prefix?: string): AppendLogStorageTier<T> {\n\treturn appendLogStorage({ kv: memoryKv<T>(), prefix });\n}\n\n/** Create an in-memory D85 multi-writer append log. */\nexport function memoryMultiWriterAppendLog<T = unknown>(\n\tprefix?: string,\n): MultiWriterAppendLogStorageTier<T> {\n\treturn multiWriterAppendLogStorage({ kv: memoryKv<T>(), prefix });\n}\n"],"mappings":"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","names":["out","opts"]}
|
package/dist/storage/browser.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
appendLogStorage
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-ZLFRB6FI.js";
|
|
4
4
|
import {
|
|
5
5
|
kvStorage
|
|
6
|
-
} from "../chunk-
|
|
7
|
-
import "../chunk-
|
|
6
|
+
} from "../chunk-JKAYLDQV.js";
|
|
7
|
+
import "../chunk-K7FB3JTD.js";
|
|
8
8
|
import "../chunk-DGUM43GV.js";
|
|
9
9
|
|
|
10
10
|
// src/storage/browser.ts
|
package/dist/storage/index.cjs
CHANGED
|
@@ -353,9 +353,16 @@ function sortedJsonValue(value, seen = /* @__PURE__ */ new Set(), path = "$", st
|
|
|
353
353
|
}
|
|
354
354
|
for (const key of Object.getOwnPropertyNames(value)) {
|
|
355
355
|
const isIndex = /^(0|[1-9]\d*)$/.test(key) && Number.isSafeInteger(Number(key)) && Number(key) < value.length;
|
|
356
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
357
|
+
if (descriptor !== void 0 && ("get" in descriptor || "set" in descriptor)) {
|
|
358
|
+
throw new TypeError(`stableJsonString: accessor property at ${path}.${key}`);
|
|
359
|
+
}
|
|
356
360
|
if (key !== "length" && !isIndex) {
|
|
357
361
|
throw new TypeError(`stableJsonString: non-index array property at ${path}.${key}`);
|
|
358
362
|
}
|
|
363
|
+
if (key !== "length" && descriptor !== void 0 && !descriptor.enumerable) {
|
|
364
|
+
throw new TypeError(`stableJsonString: non-enumerable array property at ${path}.${key}`);
|
|
365
|
+
}
|
|
359
366
|
}
|
|
360
367
|
const out2 = [];
|
|
361
368
|
for (let i = 0; i < value.length; i += 1) {
|
|
@@ -369,6 +376,15 @@ function sortedJsonValue(value, seen = /* @__PURE__ */ new Set(), path = "$", st
|
|
|
369
376
|
if (Object.getOwnPropertySymbols(value).length > 0) {
|
|
370
377
|
throw new TypeError(`stableJsonString: symbol-keyed properties at ${path}`);
|
|
371
378
|
}
|
|
379
|
+
for (const key of Object.getOwnPropertyNames(value)) {
|
|
380
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
381
|
+
if (descriptor !== void 0 && ("get" in descriptor || "set" in descriptor)) {
|
|
382
|
+
throw new TypeError(`stableJsonString: accessor property at ${path}.${key}`);
|
|
383
|
+
}
|
|
384
|
+
if (descriptor !== void 0 && !descriptor.enumerable) {
|
|
385
|
+
throw new TypeError(`stableJsonString: non-enumerable property at ${path}.${key}`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
372
388
|
const out = /* @__PURE__ */ Object.create(null);
|
|
373
389
|
for (const key of Object.keys(value).sort()) {
|
|
374
390
|
out[key] = sortedJsonValue(
|