rivetkit 2.1.4 → 2.1.6-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/client.d.ts +593 -588
- package/dist/browser/client.js +215 -35
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +109 -10
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/inspector.tar.gz +0 -0
- package/dist/tsup/actor/errors.cjs +2 -2
- package/dist/tsup/actor/errors.js +1 -1
- package/dist/tsup/{actor-router-consts-D29T1Z-K.d.cts → actor-router-consts-DU-1IdQj.d.cts} +1 -1
- package/dist/tsup/{actor-router-consts-D29T1Z-K.d.ts → actor-router-consts-DU-1IdQj.d.ts} +1 -1
- package/dist/tsup/chunk-2ELYUO6C.cjs +112 -0
- package/dist/tsup/chunk-2ELYUO6C.cjs.map +1 -0
- package/dist/tsup/chunk-2LY7RW3Y.cjs +2316 -0
- package/dist/tsup/chunk-2LY7RW3Y.cjs.map +1 -0
- package/dist/tsup/{chunk-L47L3ZWJ.cjs → chunk-6G7ZNM27.cjs} +11 -6
- package/dist/tsup/chunk-6G7ZNM27.cjs.map +1 -0
- package/dist/tsup/{chunk-LK36OGGO.cjs → chunk-A4KEUCB6.cjs} +84 -34
- package/dist/tsup/chunk-A4KEUCB6.cjs.map +1 -0
- package/dist/tsup/{chunk-7HTNH26M.js → chunk-AKUJ5OTO.js} +11 -6
- package/dist/tsup/chunk-AKUJ5OTO.js.map +1 -0
- package/dist/tsup/{chunk-ANKZ2FS6.js → chunk-C22JYHVT.js} +77 -27
- package/dist/tsup/chunk-C22JYHVT.js.map +1 -0
- package/dist/tsup/chunk-C4EB42ET.js +1459 -0
- package/dist/tsup/chunk-C4EB42ET.js.map +1 -0
- package/dist/tsup/chunk-CGGGBIDP.cjs +1459 -0
- package/dist/tsup/chunk-CGGGBIDP.cjs.map +1 -0
- package/dist/tsup/chunk-CMQPDBBR.cjs +1486 -0
- package/dist/tsup/chunk-CMQPDBBR.cjs.map +1 -0
- package/dist/tsup/{chunk-AQD4CBZ2.cjs → chunk-DH6UINWA.cjs} +4 -4
- package/dist/tsup/{chunk-AQD4CBZ2.cjs.map → chunk-DH6UINWA.cjs.map} +1 -1
- package/dist/tsup/chunk-DK46YYCJ.js +1486 -0
- package/dist/tsup/chunk-DK46YYCJ.js.map +1 -0
- package/dist/tsup/chunk-EGWXXBZV.js +2316 -0
- package/dist/tsup/chunk-EGWXXBZV.js.map +1 -0
- package/dist/tsup/{chunk-HBYEYBIC.js → chunk-EONWXYMN.js} +2 -2
- package/dist/tsup/{chunk-N4KRDJ56.js → chunk-GFGRBYO2.js} +35 -6
- package/dist/tsup/chunk-GFGRBYO2.js.map +1 -0
- package/dist/tsup/{chunk-TEUL4UYN.cjs → chunk-GUHXWPGB.cjs} +1515 -1479
- package/dist/tsup/chunk-GUHXWPGB.cjs.map +1 -0
- package/dist/tsup/{chunk-3B6PCYJB.cjs → chunk-HNE2AK6C.cjs} +2375 -3713
- package/dist/tsup/chunk-HNE2AK6C.cjs.map +1 -0
- package/dist/tsup/{chunk-5UEFNG7P.js → chunk-I5I6OALK.js} +2 -2
- package/dist/tsup/chunk-IHQAF2HV.cjs +23 -0
- package/dist/tsup/chunk-IHQAF2HV.cjs.map +1 -0
- package/dist/tsup/{chunk-UWAGLDT6.cjs → chunk-JJNZQDUN.cjs} +667 -2517
- package/dist/tsup/chunk-JJNZQDUN.cjs.map +1 -0
- package/dist/tsup/{chunk-M6H4XIF4.js → chunk-JJSPHLJN.js} +219 -287
- package/dist/tsup/chunk-JJSPHLJN.js.map +1 -0
- package/dist/tsup/chunk-JRKPV5NJ.js +481 -0
- package/dist/tsup/chunk-JRKPV5NJ.js.map +1 -0
- package/dist/tsup/{chunk-VKVNIQRQ.js → chunk-K7MVU5SI.js} +36 -41
- package/dist/tsup/chunk-K7MVU5SI.js.map +1 -0
- package/dist/tsup/{chunk-KJSYAUOM.js → chunk-MLK3GY6P.js} +43 -27
- package/dist/tsup/chunk-MLK3GY6P.js.map +1 -0
- package/dist/tsup/{chunk-4KSHPFXF.cjs → chunk-MPLMTJY5.cjs} +123 -23
- package/dist/tsup/chunk-MPLMTJY5.cjs.map +1 -0
- package/dist/tsup/{chunk-UDMRZR6A.js → chunk-PQWI44WD.js} +1755 -3093
- package/dist/tsup/chunk-PQWI44WD.js.map +1 -0
- package/dist/tsup/{chunk-SR3KQE7Q.cjs → chunk-SQFCIDCG.cjs} +35 -6
- package/dist/tsup/chunk-SQFCIDCG.cjs.map +1 -0
- package/dist/tsup/{chunk-3GTO6H3E.js → chunk-SVHJSM2E.js} +110 -24
- package/dist/tsup/chunk-SVHJSM2E.js.map +1 -0
- package/dist/tsup/chunk-T5KYKM6R.js +49 -0
- package/dist/tsup/chunk-T5KYKM6R.js.map +1 -0
- package/dist/tsup/{chunk-GXRVSSVD.cjs → chunk-TJ7DKW6F.cjs} +123 -37
- package/dist/tsup/chunk-TJ7DKW6F.cjs.map +1 -0
- package/dist/tsup/chunk-UQZRMTM3.js +23 -0
- package/dist/tsup/chunk-UQZRMTM3.js.map +1 -0
- package/dist/tsup/{chunk-QPADHLDU.cjs → chunk-V3JSZR5P.cjs} +3 -3
- package/dist/tsup/{chunk-QPADHLDU.cjs.map → chunk-V3JSZR5P.cjs.map} +1 -1
- package/dist/tsup/{chunk-HKOSZKKZ.cjs → chunk-VBR35EQF.cjs} +271 -339
- package/dist/tsup/chunk-VBR35EQF.cjs.map +1 -0
- package/dist/tsup/{chunk-DZXDUGLL.js → chunk-VWYO36X4.js} +117 -17
- package/dist/tsup/chunk-VWYO36X4.js.map +1 -0
- package/dist/tsup/{chunk-I6PL6QIY.js → chunk-WW27B6DM.js} +1452 -1416
- package/dist/tsup/chunk-WW27B6DM.js.map +1 -0
- package/dist/tsup/chunk-YAE3MEJM.cjs +49 -0
- package/dist/tsup/chunk-YAE3MEJM.cjs.map +1 -0
- package/dist/tsup/{chunk-KTWY3K6Z.js → chunk-YGYGANCA.js} +473 -2323
- package/dist/tsup/chunk-YGYGANCA.js.map +1 -0
- package/dist/tsup/chunk-YZJWZBY5.cjs +481 -0
- package/dist/tsup/chunk-YZJWZBY5.cjs.map +1 -0
- package/dist/tsup/{chunk-ZFY5J2EP.cjs → chunk-ZZLJ5TSM.cjs} +39 -44
- package/dist/tsup/chunk-ZZLJ5TSM.cjs.map +1 -0
- package/dist/tsup/client/mod.cjs +10 -7
- package/dist/tsup/client/mod.cjs.map +1 -1
- package/dist/tsup/client/mod.d.cts +6 -6
- package/dist/tsup/client/mod.d.ts +6 -6
- package/dist/tsup/client/mod.js +11 -8
- package/dist/tsup/common/log.cjs +3 -3
- package/dist/tsup/common/log.js +2 -2
- package/dist/tsup/common/websocket.cjs +4 -4
- package/dist/tsup/common/websocket.js +3 -3
- package/dist/tsup/{config-Qj-zLJPc.d.ts → config-C2Wwnc69.d.ts} +142 -208
- package/dist/tsup/{config-BiNoIHRs.d.ts → config-DROwzBLT.d.cts} +82 -6
- package/dist/tsup/{config-BiNoIHRs.d.cts → config-DROwzBLT.d.ts} +82 -6
- package/dist/tsup/{config-iPj5l1bL.d.cts → config-ehT-_3BB.d.cts} +142 -208
- package/dist/tsup/{context-DzvH1PBK.d.cts → context-DGMJuAyc.d.ts} +16 -3
- package/dist/tsup/{context-CQCMuHND.d.ts → context-Dpp2RJbW.d.cts} +16 -3
- package/dist/tsup/db/drizzle/mod.cjs +3 -3
- package/dist/tsup/db/drizzle/mod.d.cts +1 -1
- package/dist/tsup/db/drizzle/mod.d.ts +1 -1
- package/dist/tsup/db/drizzle/mod.js +2 -2
- package/dist/tsup/db/mod.cjs +3 -3
- package/dist/tsup/db/mod.d.cts +1 -1
- package/dist/tsup/db/mod.d.ts +1 -1
- package/dist/tsup/db/mod.js +2 -2
- package/dist/tsup/{driver-Jo8v-kbU.d.ts → driver-CYZP9QYo.d.ts} +1 -1
- package/dist/tsup/{driver-iV8J-WMv.d.cts → driver-CoTFpipv.d.cts} +1 -1
- package/dist/tsup/driver-helpers/mod.cjs +7 -5
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +17 -18
- package/dist/tsup/driver-helpers/mod.d.ts +17 -18
- package/dist/tsup/driver-helpers/mod.js +11 -9
- package/dist/tsup/driver-test-suite/mod.cjs +1275 -228
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +6 -5
- package/dist/tsup/driver-test-suite/mod.d.ts +6 -5
- package/dist/tsup/driver-test-suite/mod.js +1581 -534
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +4 -4
- package/dist/tsup/inspector/mod.js +3 -3
- package/dist/tsup/mod.cjs +15 -9
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +9 -9
- package/dist/tsup/mod.d.ts +9 -9
- package/dist/tsup/mod.js +19 -13
- package/dist/tsup/sandbox/client.cjs +28 -0
- package/dist/tsup/sandbox/client.cjs.map +1 -0
- package/dist/tsup/sandbox/client.d.cts +88 -0
- package/dist/tsup/sandbox/client.d.ts +88 -0
- package/dist/tsup/sandbox/client.js +28 -0
- package/dist/tsup/sandbox/client.js.map +1 -0
- package/dist/tsup/sandbox/index.cjs +761 -0
- package/dist/tsup/sandbox/index.cjs.map +1 -0
- package/dist/tsup/sandbox/index.d.cts +120 -0
- package/dist/tsup/sandbox/index.d.ts +120 -0
- package/dist/tsup/sandbox/index.js +761 -0
- package/dist/tsup/sandbox/index.js.map +1 -0
- package/dist/tsup/sandbox/providers/computesdk.cjs +3 -0
- package/dist/tsup/sandbox/providers/computesdk.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/computesdk.d.cts +7 -0
- package/dist/tsup/sandbox/providers/computesdk.d.ts +7 -0
- package/dist/tsup/sandbox/providers/computesdk.js +3 -0
- package/dist/tsup/sandbox/providers/computesdk.js.map +1 -0
- package/dist/tsup/sandbox/providers/daytona.cjs +3 -0
- package/dist/tsup/sandbox/providers/daytona.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/daytona.d.cts +1 -0
- package/dist/tsup/sandbox/providers/daytona.d.ts +1 -0
- package/dist/tsup/sandbox/providers/daytona.js +3 -0
- package/dist/tsup/sandbox/providers/daytona.js.map +1 -0
- package/dist/tsup/sandbox/providers/docker.cjs +3 -0
- package/dist/tsup/sandbox/providers/docker.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/docker.d.cts +1 -0
- package/dist/tsup/sandbox/providers/docker.d.ts +1 -0
- package/dist/tsup/sandbox/providers/docker.js +3 -0
- package/dist/tsup/sandbox/providers/docker.js.map +1 -0
- package/dist/tsup/sandbox/providers/e2b.cjs +3 -0
- package/dist/tsup/sandbox/providers/e2b.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/e2b.d.cts +1 -0
- package/dist/tsup/sandbox/providers/e2b.d.ts +1 -0
- package/dist/tsup/sandbox/providers/e2b.js +3 -0
- package/dist/tsup/sandbox/providers/e2b.js.map +1 -0
- package/dist/tsup/sandbox/providers/local.cjs +3 -0
- package/dist/tsup/sandbox/providers/local.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/local.d.cts +1 -0
- package/dist/tsup/sandbox/providers/local.d.ts +1 -0
- package/dist/tsup/sandbox/providers/local.js +3 -0
- package/dist/tsup/sandbox/providers/local.js.map +1 -0
- package/dist/tsup/sandbox/providers/modal.cjs +3 -0
- package/dist/tsup/sandbox/providers/modal.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/modal.d.cts +1 -0
- package/dist/tsup/sandbox/providers/modal.d.ts +1 -0
- package/dist/tsup/sandbox/providers/modal.js +3 -0
- package/dist/tsup/sandbox/providers/modal.js.map +1 -0
- package/dist/tsup/sandbox/providers/vercel.cjs +3 -0
- package/dist/tsup/sandbox/providers/vercel.cjs.map +1 -0
- package/dist/tsup/sandbox/providers/vercel.d.cts +1 -0
- package/dist/tsup/sandbox/providers/vercel.d.ts +1 -0
- package/dist/tsup/sandbox/providers/vercel.js +3 -0
- package/dist/tsup/sandbox/providers/vercel.js.map +1 -0
- package/dist/tsup/serve-test-suite/mod.cjs +451 -327
- package/dist/tsup/serve-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/serve-test-suite/mod.js +362 -238
- package/dist/tsup/serve-test-suite/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +17 -14
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +4 -4
- package/dist/tsup/test/mod.d.ts +4 -4
- package/dist/tsup/test/mod.js +14 -11
- package/dist/tsup/test/mod.js.map +1 -1
- package/dist/tsup/utils.cjs +3 -3
- package/dist/tsup/utils.js +2 -2
- package/dist/tsup/workflow/mod.cjs +6 -6
- package/dist/tsup/workflow/mod.d.cts +13 -9
- package/dist/tsup/workflow/mod.d.ts +13 -9
- package/dist/tsup/workflow/mod.js +5 -5
- package/package.json +113 -14
- package/src/actor/config.ts +94 -88
- package/src/actor/conn/drivers/websocket.ts +2 -1
- package/src/actor/contexts/base/actor.ts +27 -4
- package/src/actor/database.ts +6 -1
- package/src/actor/driver.ts +27 -8
- package/src/actor/errors.ts +10 -5
- package/src/actor/instance/connection-manager.ts +4 -3
- package/src/actor/instance/kv.ts +52 -9
- package/src/actor/instance/mod.ts +135 -84
- package/src/actor/instance/queue-manager.ts +2 -5
- package/src/actor/instance/queue.ts +31 -29
- package/src/actor/instance/state-manager.ts +7 -1
- package/src/actor/instance/traces-driver.ts +34 -36
- package/src/actor/metrics.ts +137 -0
- package/src/actor/protocol/old.ts +9 -12
- package/src/actor/router-websocket-endpoints.ts +12 -6
- package/src/actor/router.ts +46 -9
- package/src/actor/schema.ts +14 -22
- package/src/client/actor-common.ts +65 -0
- package/src/client/actor-conn.ts +71 -9
- package/src/client/actor-handle.ts +22 -5
- package/src/client/client.ts +32 -6
- package/src/client/config.ts +18 -21
- package/src/client/mod.ts +1 -0
- package/src/client/queue.ts +8 -6
- package/src/common/inline-websocket-adapter.ts +8 -2
- package/src/common/router.ts +1 -4
- package/src/common/utils.ts +2 -5
- package/src/db/config.ts +10 -5
- package/src/db/drizzle/mod.ts +51 -41
- package/src/db/mod.ts +54 -29
- package/src/db/shared.ts +42 -8
- package/src/driver-helpers/mod.ts +2 -1
- package/src/driver-helpers/sqlite-pool.ts +42 -0
- package/src/driver-helpers/utils.ts +0 -20
- package/src/driver-test-suite/mod.ts +11 -1
- package/src/driver-test-suite/tests/access-control.ts +19 -12
- package/src/driver-test-suite/tests/action-features.ts +20 -8
- package/src/driver-test-suite/tests/actor-conn.ts +94 -8
- package/src/driver-test-suite/tests/actor-db-kv-stats.ts +282 -0
- package/src/driver-test-suite/tests/actor-db-raw.ts +6 -2
- package/src/driver-test-suite/tests/actor-db.ts +101 -31
- package/src/driver-test-suite/tests/actor-inspector.ts +174 -32
- package/src/driver-test-suite/tests/actor-kv.ts +79 -33
- package/src/driver-test-suite/tests/actor-lifecycle.ts +4 -12
- package/src/driver-test-suite/tests/actor-queue.ts +125 -17
- package/src/driver-test-suite/tests/actor-run.ts +59 -55
- package/src/driver-test-suite/tests/actor-sandbox.ts +78 -0
- package/src/driver-test-suite/tests/actor-schedule.ts +1 -4
- package/src/driver-test-suite/tests/actor-sleep.ts +111 -0
- package/src/driver-test-suite/tests/actor-workflow.ts +387 -3
- package/src/driver-test-suite/tests/conn-error-serialization.ts +3 -1
- package/src/driver-test-suite/tests/raw-websocket.ts +5 -1
- package/src/drivers/default.ts +1 -3
- package/src/drivers/engine/actor-driver.ts +94 -21
- package/src/drivers/engine/config.ts +4 -12
- package/src/drivers/engine/mod.ts +1 -5
- package/src/drivers/file-system/actor.ts +43 -8
- package/src/drivers/file-system/global-state.ts +180 -64
- package/src/drivers/file-system/kv-limits.ts +1 -1
- package/src/drivers/file-system/sqlite-runtime.ts +13 -4
- package/src/engine-process/mod.ts +5 -1
- package/src/inspector/actor-inspector.ts +47 -21
- package/src/inspector/config.ts +1 -4
- package/src/inspector/mod.browser.ts +2 -2
- package/src/inspector/mod.ts +4 -1
- package/src/inspector/serve-ui.ts +0 -1
- package/src/inspector/workflow-history-json.ts +309 -0
- package/src/manager/gateway.ts +6 -2
- package/src/manager/router.ts +3 -3
- package/src/registry/config/index.ts +65 -12
- package/src/registry/config/runner.ts +19 -4
- package/src/registry/index.ts +42 -89
- package/src/sandbox/actor/db.ts +36 -0
- package/src/sandbox/actor/index.ts +476 -0
- package/src/sandbox/actor/session.ts +350 -0
- package/src/sandbox/actor.test.ts +36 -0
- package/src/sandbox/client.test.ts +484 -0
- package/src/sandbox/client.ts +707 -0
- package/src/sandbox/config.ts +151 -0
- package/src/sandbox/index.ts +41 -0
- package/src/sandbox/providers/computesdk.ts +1 -0
- package/src/sandbox/providers/daytona.ts +1 -0
- package/src/sandbox/providers/docker.ts +1 -0
- package/src/sandbox/providers/e2b.ts +1 -0
- package/src/sandbox/providers/local.ts +1 -0
- package/src/sandbox/providers/modal.ts +1 -0
- package/src/sandbox/providers/vercel.ts +1 -0
- package/src/sandbox/session-persist-driver.ts +180 -0
- package/src/sandbox/types.ts +138 -0
- package/src/serverless/configure.ts +5 -3
- package/src/serverless/router.test.ts +17 -9
- package/src/serverless/router.ts +20 -13
- package/src/test/mod.ts +3 -4
- package/src/utils/endpoint-parser.test.ts +6 -2
- package/src/utils/endpoint-parser.ts +6 -2
- package/src/utils/env-vars.ts +0 -2
- package/src/utils/node.ts +1 -1
- package/src/utils/serve.ts +10 -5
- package/src/utils.ts +6 -1
- package/src/workflow/constants.ts +1 -2
- package/src/workflow/context.ts +42 -9
- package/src/workflow/driver.ts +57 -23
- package/src/workflow/inspector.ts +7 -13
- package/src/workflow/mod.ts +91 -4
- package/dist/tsup/chunk-3B6PCYJB.cjs.map +0 -1
- package/dist/tsup/chunk-3GTO6H3E.js.map +0 -1
- package/dist/tsup/chunk-4KSHPFXF.cjs.map +0 -1
- package/dist/tsup/chunk-6LJAZ5R4.cjs +0 -96
- package/dist/tsup/chunk-6LJAZ5R4.cjs.map +0 -1
- package/dist/tsup/chunk-7HTNH26M.js.map +0 -1
- package/dist/tsup/chunk-ANKZ2FS6.js.map +0 -1
- package/dist/tsup/chunk-DZXDUGLL.js.map +0 -1
- package/dist/tsup/chunk-GXRVSSVD.cjs.map +0 -1
- package/dist/tsup/chunk-H5TSEPN4.cjs +0 -645
- package/dist/tsup/chunk-H5TSEPN4.cjs.map +0 -1
- package/dist/tsup/chunk-HKOSZKKZ.cjs.map +0 -1
- package/dist/tsup/chunk-I6PL6QIY.js.map +0 -1
- package/dist/tsup/chunk-KJSYAUOM.js.map +0 -1
- package/dist/tsup/chunk-KTWY3K6Z.js.map +0 -1
- package/dist/tsup/chunk-L47L3ZWJ.cjs.map +0 -1
- package/dist/tsup/chunk-LK36OGGO.cjs.map +0 -1
- package/dist/tsup/chunk-M6H4XIF4.js.map +0 -1
- package/dist/tsup/chunk-N4KRDJ56.js.map +0 -1
- package/dist/tsup/chunk-SR3KQE7Q.cjs.map +0 -1
- package/dist/tsup/chunk-TEFYRRAK.js +0 -645
- package/dist/tsup/chunk-TEFYRRAK.js.map +0 -1
- package/dist/tsup/chunk-TEUL4UYN.cjs.map +0 -1
- package/dist/tsup/chunk-UDMRZR6A.js.map +0 -1
- package/dist/tsup/chunk-UWAGLDT6.cjs.map +0 -1
- package/dist/tsup/chunk-VKVNIQRQ.js.map +0 -1
- package/dist/tsup/chunk-ZFY5J2EP.cjs.map +0 -1
- package/src/db/sqlite-vfs.ts +0 -12
- /package/dist/tsup/{chunk-HBYEYBIC.js.map → chunk-EONWXYMN.js.map} +0 -0
- /package/dist/tsup/{chunk-5UEFNG7P.js.map → chunk-I5I6OALK.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/common/inline-websocket-adapter.ts","../../src/drivers/file-system/mod.ts","../../src/drivers/file-system/actor.ts","../../src/drivers/file-system/global-state.ts","../../src/schemas/file-system-driver/versioned.ts","../schemas/file-system-driver/v1.ts","../schemas/file-system-driver/v2.ts","../schemas/file-system-driver/v3.ts","../../src/drivers/file-system/log.ts","../../src/drivers/file-system/utils.ts","../../src/drivers/file-system/sqlite-runtime.ts","../../src/drivers/file-system/kv-limits.ts","../../src/drivers/file-system/manager.ts"],"sourcesContent":["import { WSContext } from \"hono/ws\";\nimport type { UpgradeWebSocketArgs } from \"@/actor/router-websocket-endpoints\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { VirtualWebSocket } from \"@rivetkit/virtual-websocket\";\nimport { getLogger } from \"./log\";\n\nfunction logger() {\n\treturn getLogger(\"inline-websocket-adapter\");\n}\n\n/**\n * InlineWebSocketAdapter creates two linked WebSocket objects:\n * - clientWs: for the client/proxy side (returned from openWebSocket)\n * - actorWs: for the actor side (passed via wsContext.raw)\n *\n * Each side's send() triggers the OTHER side's message event.\n */\nexport class InlineWebSocketAdapter {\n\t#handler: UpgradeWebSocketArgs;\n\t#wsContext: WSContext;\n\t#readyState: 0 | 1 | 2 | 3 = 0;\n\n\t#clientWs: VirtualWebSocket;\n\t#actorWs: VirtualWebSocket;\n\n\tconstructor(handler: UpgradeWebSocketArgs) {\n\t\tthis.#handler = handler;\n\n\t\t// Create linked WebSocket pair\n\t\t// Client's send() -> handler.onMessage (for RPC) + Actor's message event (for raw WS)\n\t\t// Actor's send() -> Client's message event\n\t\tthis.#clientWs = new VirtualWebSocket({\n\t\t\tgetReadyState: () => this.#readyState,\n\t\t\tonSend: (data) => {\n\t\t\t\ttry {\n\t\t\t\t\t// Call handler.onMessage for protocol-based connections (RPC)\n\t\t\t\t\tthis.#handler.onMessage({ data }, this.#wsContext);\n\t\t\t\t\t// Also trigger message event on actor's websocket for raw websocket handlers\n\t\t\t\t\tthis.#actorWs.triggerMessage(data);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tthis.#handleError(err);\n\t\t\t\t\tthis.#close(1011, \"Internal error processing message\");\n\t\t\t\t}\n\t\t\t},\n\t\t\tonClose: (code, reason) => this.#close(code, reason),\n\t\t});\n\n\t\tthis.#actorWs = new VirtualWebSocket({\n\t\t\tgetReadyState: () => this.#readyState,\n\t\t\tonSend: (data) => this.#clientWs.triggerMessage(data),\n\t\t\tonClose: (code, reason) => this.#close(code, reason),\n\t\t});\n\n\t\t// Create WSContext with actorWs as raw\n\t\tthis.#wsContext = new WSContext({\n\t\t\traw: this.#actorWs,\n\t\t\tsend: (data: string | ArrayBuffer | Uint8Array) => {\n\t\t\t\tlogger().debug({ msg: \"WSContext.send called\" });\n\t\t\t\tthis.#clientWs.triggerMessage(data);\n\t\t\t},\n\t\t\tclose: (code?: number, reason?: string) => {\n\t\t\t\tlogger().debug({ msg: \"WSContext.close called\", code, reason });\n\t\t\t\tthis.#close(code || 1000, reason || \"\");\n\t\t\t},\n\t\t\treadyState: 1,\n\t\t});\n\n\t\t// Defer initialization to allow event listeners to be attached first\n\t\tsetTimeout(() => {\n\t\t\tthis.#initialize();\n\t\t}, 0);\n\t}\n\n\t/** Get the client-side WebSocket (for proxy/client code) */\n\tget clientWebSocket(): UniversalWebSocket {\n\t\treturn this.#clientWs;\n\t}\n\n\t/** Get the actor-side WebSocket (passed to actor via wsContext.raw) */\n\tget actorWebSocket(): UniversalWebSocket {\n\t\treturn this.#actorWs;\n\t}\n\n\tasync #initialize(): Promise<void> {\n\t\ttry {\n\t\t\tlogger().debug({ msg: \"websocket initializing\" });\n\n\t\t\tthis.#readyState = 1; // OPEN\n\n\t\t\tlogger().debug({ msg: \"calling handler.onOpen with WSContext\" });\n\t\t\tthis.#handler.onOpen(undefined, this.#wsContext);\n\n\t\t\t// Fire open event to both sides\n\t\t\tthis.#clientWs.triggerOpen();\n\t\t\tthis.#actorWs.triggerOpen();\n\t\t} catch (err) {\n\t\t\tthis.#handleError(err);\n\t\t\tthis.#close(1011, \"Internal error during initialization\");\n\t\t}\n\t}\n\n\t#handleError(err: unknown): void {\n\t\tlogger().error({\n\t\t\tmsg: \"error in websocket\",\n\t\t\terror: err,\n\t\t\terrorMessage: err instanceof Error ? err.message : String(err),\n\t\t\tstack: err instanceof Error ? err.stack : undefined,\n\t\t});\n\n\t\t// Call handler.onError\n\t\ttry {\n\t\t\tthis.#handler.onError(err, this.#wsContext);\n\t\t} catch (handlerErr) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"error in onError handler\",\n\t\t\t\terror: handlerErr,\n\t\t\t});\n\t\t}\n\n\t\t// Fire error event to both sides\n\t\tthis.#clientWs.triggerError(err);\n\t\tthis.#actorWs.triggerError(err);\n\t}\n\n\t#close(code: number, reason: string): void {\n\t\tif (this.#readyState === 3 || this.#readyState === 2) {\n\t\t\treturn;\n\t\t}\n\n\t\tlogger().debug({ msg: \"closing websocket\", code, reason });\n\n\t\tthis.#readyState = 2; // CLOSING\n\n\t\ttry {\n\t\t\tthis.#handler.onClose(\n\t\t\t\t{ code, reason, wasClean: true },\n\t\t\t\tthis.#wsContext,\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tlogger().error({ msg: \"error closing websocket\", error: err });\n\t\t} finally {\n\t\t\tthis.#readyState = 3; // CLOSED\n\n\t\t\t// Fire close event to both sides\n\t\t\tthis.#clientWs.triggerClose(code, reason);\n\t\t\tthis.#actorWs.triggerClose(code, reason);\n\t\t}\n\t}\n}\n\n/**\n * Creates an InlineWebSocketAdapter and returns the client-side WebSocket.\n * This is the main entry point for creating inline WebSocket connections.\n */\nexport function createInlineWebSocket(\n\thandler: UpgradeWebSocketArgs,\n): UniversalWebSocket {\n\tconst adapter = new InlineWebSocketAdapter(handler);\n\treturn adapter.clientWebSocket;\n}\n","import { z } from \"zod\";\nimport type { DriverConfig } from \"@/registry/config\";\nimport { importNodeDependencies } from \"@/utils/node\";\nimport { FileSystemActorDriver } from \"./actor\";\nimport {\n\ttype FileSystemDriverOptions,\n\tFileSystemGlobalState,\n} from \"./global-state\";\nimport { FileSystemManagerDriver } from \"./manager\";\n\nexport { FileSystemActorDriver } from \"./actor\";\nexport { FileSystemGlobalState } from \"./global-state\";\nexport { FileSystemManagerDriver } from \"./manager\";\nexport { getStoragePath } from \"./utils\";\n\nconst CreateFileSystemDriverOptionsSchema = z.object({\n\t/** Custom path for storage. */\n\tpath: z.string().optional(),\n\t/** Deprecated: file-system driver KV is now always SQLite-backed. */\n\tuseNativeSqlite: z.boolean().optional(),\n});\n\ntype CreateFileSystemDriverOptionsInput = z.input<\n\ttypeof CreateFileSystemDriverOptionsSchema\n>;\n\nexport function createFileSystemOrMemoryDriver(\n\tpersist: boolean = true,\n\toptions?: CreateFileSystemDriverOptionsInput,\n): DriverConfig {\n\timportNodeDependencies();\n\n\tif (options?.useNativeSqlite === false) {\n\t\tthrow new Error(\n\t\t\t\"File-system driver no longer supports non-SQLite KV storage. Remove useNativeSqlite: false.\",\n\t\t);\n\t}\n\n\tconst stateOptions: FileSystemDriverOptions = {\n\t\tpersist,\n\t\tcustomPath: options?.path,\n\t\tuseNativeSqlite: true,\n\t};\n\tconst state = new FileSystemGlobalState(stateOptions);\n\tconst driverConfig: DriverConfig = {\n\t\tname: persist ? \"file-system\" : \"memory\",\n\t\tdisplayName: persist ? \"File System\" : \"Memory\",\n\t\tmanager: (config) =>\n\t\t\tnew FileSystemManagerDriver(config, state, driverConfig),\n\t\tactor: (config, managerDriver, inlineClient) => {\n\t\t\tconst actorDriver = new FileSystemActorDriver(\n\t\t\t\tconfig,\n\t\t\t\tmanagerDriver,\n\t\t\t\tinlineClient,\n\t\t\t\tstate,\n\t\t\t);\n\n\t\t\tstate.onRunnerStart(config, inlineClient, actorDriver);\n\n\t\t\treturn actorDriver;\n\t\t},\n\t\tautoStartActorDriver: true,\n\t};\n\treturn driverConfig;\n}\n\nexport function createFileSystemDriver(\n\topts?: CreateFileSystemDriverOptionsInput,\n): DriverConfig {\n\tconst validatedOpts = opts\n\t\t? CreateFileSystemDriverOptionsSchema.parse(opts)\n\t\t: undefined;\n\treturn createFileSystemOrMemoryDriver(true, validatedOpts);\n}\n\nexport function createMemoryDriver(): DriverConfig {\n\treturn createFileSystemOrMemoryDriver(false);\n}\n","import type { AnyClient } from \"@/client/client\";\nimport type { RawDatabaseClient } from \"@/db/config\";\nimport type { ISqliteVfs } from \"@rivetkit/sqlite-vfs\";\nimport {\n\ttype ActorDriver,\n\ttype AnyActorInstance,\n\ttype ManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport { SqliteVfsPoolManager } from \"@/driver-helpers/sqlite-pool\";\nimport type { FileSystemGlobalState } from \"./global-state\";\nimport { RegistryConfig } from \"@/registry/config\";\n\nexport type ActorDriverContext = Record<never, never>;\n\n/**\n * File System implementation of the Actor Driver\n */\nexport class FileSystemActorDriver implements ActorDriver {\n\t#config: RegistryConfig;\n\t#managerDriver: ManagerDriver;\n\t#inlineClient: AnyClient;\n\t#state: FileSystemGlobalState;\n\t#sqlitePool: SqliteVfsPoolManager;\n\tstartSleep?: (actorId: string) => void;\n\n\tconstructor(\n\t\tconfig: RegistryConfig,\n\t\tmanagerDriver: ManagerDriver,\n\t\tinlineClient: AnyClient,\n\t\tstate: FileSystemGlobalState,\n\t) {\n\t\tthis.#config = config;\n\t\tthis.#managerDriver = managerDriver;\n\t\tthis.#inlineClient = inlineClient;\n\t\tthis.#state = state;\n\t\tthis.#sqlitePool = new SqliteVfsPoolManager(config);\n\n\t\tif (this.#state.persist) {\n\t\t\t// Only define startSleep when persistence is enabled. The actor runtime\n\t\t\t// checks for this property to determine whether the driver supports sleep.\n\t\t\tthis.startSleep = (actorId: string) => {\n\t\t\t\t// Spawns the sleepActor promise.\n\t\t\t\tthis.#state.sleepActor(actorId);\n\t\t\t};\n\t\t}\n\t}\n\n\tasync loadActor(actorId: string): Promise<AnyActorInstance> {\n\t\treturn this.#state.startActor(\n\t\t\tthis.#config,\n\t\t\tthis.#inlineClient,\n\t\t\tthis,\n\t\t\tactorId,\n\t\t);\n\t}\n\n\t/**\n\t * Get the current storage directory path\n\t */\n\tget storagePath(): string {\n\t\treturn this.#state.storagePath;\n\t}\n\n\tgetContext(_actorId: string): ActorDriverContext {\n\t\treturn {};\n\t}\n\n\tasync kvBatchPut(\n\t\tactorId: string,\n\t\tentries: [Uint8Array, Uint8Array][],\n\t): Promise<void> {\n\t\tawait this.#state.kvBatchPut(actorId, entries);\n\t}\n\n\tasync kvBatchGet(\n\t\tactorId: string,\n\t\tkeys: Uint8Array[],\n\t): Promise<(Uint8Array | null)[]> {\n\t\treturn await this.#state.kvBatchGet(actorId, keys);\n\t}\n\n\tasync kvBatchDelete(actorId: string, keys: Uint8Array[]): Promise<void> {\n\t\tawait this.#state.kvBatchDelete(actorId, keys);\n\t}\n\n\tasync kvDeleteRange(\n\t\tactorId: string,\n\t\tstart: Uint8Array,\n\t\tend: Uint8Array,\n\t): Promise<void> {\n\t\tawait this.#state.kvDeleteRange(actorId, start, end);\n\t}\n\n\tasync kvListPrefix(\n\t\tactorId: string,\n\t\tprefix: Uint8Array,\n\t\toptions?: {\n\t\t\treverse?: boolean;\n\t\t\tlimit?: number;\n\t\t},\n\t): Promise<[Uint8Array, Uint8Array][]> {\n\t\treturn await this.#state.kvListPrefix(actorId, prefix, options);\n\t}\n\n\tasync kvListRange(\n\t\tactorId: string,\n\t\tstart: Uint8Array,\n\t\tend: Uint8Array,\n\t\toptions?: {\n\t\t\treverse?: boolean;\n\t\t\tlimit?: number;\n\t\t},\n\t): Promise<[Uint8Array, Uint8Array][]> {\n\t\treturn await this.#state.kvListRange(actorId, start, end, options);\n\t}\n\n\tasync setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {\n\t\tawait this.#state.setActorAlarm(actor.id, timestamp);\n\t}\n\n\t/** Creates a SQLite VFS instance for creating KV-backed databases */\n\tasync createSqliteVfs(actorId: string): Promise<ISqliteVfs> {\n\t\treturn await this.#sqlitePool.acquire(actorId);\n\t}\n\n\tasync shutdownRunner(_immediate: boolean): Promise<void> {\n\t\tawait this.#sqlitePool.shutdown();\n\t}\n\n\tasync startDestroy(actorId: string): Promise<void> {\n\t\tawait this.#state.destroyActor(actorId);\n\t}\n\n\tasync onBeforeActorStart(actor: AnyActorInstance): Promise<void> {\n\t\tawait actor.cleanupPersistedConnections(\"file-system-driver.start\");\n\t}\n}\n","import invariant from \"invariant\";\nimport { lookupInRegistry } from \"@/actor/definition\";\nimport { ActorDuplicateKey } from \"@/actor/errors\";\nimport type { AnyActorInstance } from \"@/actor/instance/mod\";\nimport type { ActorKey } from \"@/actor/mod\";\nimport type { AnyClient } from \"@/client/client\";\nimport { type ActorDriver, getInitialActorKvState } from \"@/driver-helpers/mod\";\nimport type { RegistryConfig } from \"@/registry/config\";\nimport type * as schema from \"@/schemas/file-system-driver/mod\";\nimport {\n\tACTOR_ALARM_VERSIONED,\n\tACTOR_STATE_VERSIONED,\n\tCURRENT_VERSION as FILE_SYSTEM_DRIVER_CURRENT_VERSION,\n} from \"@/schemas/file-system-driver/versioned\";\nimport {\n\ttype LongTimeoutHandle,\n\tpromiseWithResolvers,\n\tsetLongTimeout,\n\tstringifyError,\n} from \"@/utils\";\nimport {\n\tgetNodeCrypto,\n\tgetNodeFs,\n\tgetNodeFsSync,\n\tgetNodePath,\n} from \"@/utils/node\";\nimport { logger } from \"./log\";\nimport {\n\tensureDirectoryExists,\n\tensureDirectoryExistsSync,\n\tgetStoragePath,\n} from \"./utils\";\nimport {\n\tcomputePrefixUpperBound,\n\tensureUint8Array,\n\tloadSqliteRuntime,\n\ttype SqliteRuntime,\n\ttype SqliteRuntimeDatabase,\n} from \"./sqlite-runtime\";\nimport {\n\testimateKvSize,\n\tvalidateKvEntries,\n\tvalidateKvKey,\n\tvalidateKvKeys,\n} from \"./kv-limits\";\n\nconst DEFAULT_LIST_LIMIT = 16_384;\n\n// Actor handler to track running instances\n\nfunction compareBytes(a: Uint8Array, b: Uint8Array): number {\n\tconst len = Math.min(a.length, b.length);\n\tfor (let i = 0; i < len; i++) {\n\t\tif (a[i] !== b[i]) {\n\t\t\treturn a[i] - b[i];\n\t\t}\n\t}\n\treturn a.length - b.length;\n}\n\nenum ActorLifecycleState {\n\tNONEXISTENT, // Entry exists but actor not yet created\n\tAWAKE, // Actor is running normally\n\tSTARTING_SLEEP, // Actor is being put to sleep\n\tSTARTING_DESTROY, // Actor is being destroyed\n\tDESTROYED, // Actor was destroyed, should not be recreated\n}\n\ninterface ActorEntry {\n\tid: string;\n\n\tstate?: schema.ActorState;\n\n\t/** Promise for loading the actor state. */\n\tloadPromise?: Promise<ActorEntry>;\n\n\tactor?: AnyActorInstance;\n\t/** Promise for starting the actor. */\n\tstartPromise?: ReturnType<typeof promiseWithResolvers<void>>;\n\t/** Promise for stopping the actor. */\n\tstopPromise?: PromiseWithResolvers<void>;\n\n\talarmTimeout?: LongTimeoutHandle;\n\t/** The timestamp currently scheduled for this actor's alarm (ms since epoch). */\n\talarmTimestamp?: number;\n\n\t/** Resolver for pending write operations that need to be notified when any write completes */\n\tpendingWriteResolver?: PromiseWithResolvers<void>;\n\n\tlifecycleState: ActorLifecycleState;\n\n\t// TODO: This might make sense to move in to actorstate, but we have a\n\t// single reader/writer so it's not an issue\n\t/** Generation of this actor when creating/destroying. */\n\tgeneration: string;\n}\n\nexport interface FileSystemDriverOptions {\n\t/** Whether to persist data to disk */\n\tpersist?: boolean;\n\t/** Custom path for storage */\n\tcustomPath?: string;\n\t/** Deprecated option retained for explicit migration to sqlite-only KV. */\n\tuseNativeSqlite?: boolean;\n}\n\n/**\n * Global state for the file system driver\n */\nexport class FileSystemGlobalState {\n\t#storagePath: string;\n\t#stateDir: string;\n\t#dbsDir: string;\n\t#alarmsDir: string;\n\n\t#persist: boolean;\n\t#sqliteRuntime: SqliteRuntime;\n\t#actorKvDatabases = new Map<string, SqliteRuntimeDatabase>();\n\n\t// IMPORTANT: Never delete from this map. Doing so will result in race\n\t// conditions since the actor generation will cease to be tracked\n\t// correctly. Always increment generation if a new actor is created.\n\t#actors = new Map<string, ActorEntry>();\n\n\t#actorCountOnStartup: number = 0;\n\n\t#runnerParams?: {\n\t\tconfig: RegistryConfig;\n\t\tinlineClient: AnyClient;\n\t\tactorDriver: ActorDriver;\n\t};\n\n\tget persist(): boolean {\n\t\treturn this.#persist;\n\t}\n\n\tget storagePath() {\n\t\treturn this.#storagePath;\n\t}\n\n\tget actorCountOnStartup() {\n\t\treturn this.#actorCountOnStartup;\n\t}\n\n\tconstructor(options: FileSystemDriverOptions = {}) {\n\t\tconst { persist = true, customPath, useNativeSqlite = true } = options;\n\t\tif (!useNativeSqlite) {\n\t\t\tthrow new Error(\n\t\t\t\t\"File-system driver no longer supports non-SQLite KV storage.\",\n\t\t\t);\n\t\t}\n\t\tthis.#persist = persist;\n\t\tthis.#sqliteRuntime = loadSqliteRuntime();\n\t\tthis.#storagePath = persist ? (customPath ?? getStoragePath()) : \"/tmp\";\n\t\tconst path = getNodePath();\n\t\tthis.#stateDir = path.join(this.#storagePath, \"state\");\n\t\tthis.#dbsDir = path.join(this.#storagePath, \"databases\");\n\t\tthis.#alarmsDir = path.join(this.#storagePath, \"alarms\");\n\n\t\tif (this.#persist) {\n\t\t\t// Ensure storage directories exist synchronously during initialization\n\t\t\tensureDirectoryExistsSync(this.#stateDir);\n\t\t\tensureDirectoryExistsSync(this.#dbsDir);\n\t\t\tensureDirectoryExistsSync(this.#alarmsDir);\n\n\t\t\ttry {\n\t\t\t\tconst fsSync = getNodeFsSync();\n\t\t\t\tconst actorIds = fsSync.readdirSync(this.#stateDir);\n\t\t\t\tthis.#actorCountOnStartup = actorIds.length;\n\t\t\t} catch (error) {\n\t\t\t\tlogger().error({ msg: \"failed to count actors\", error });\n\t\t\t}\n\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"file system driver ready\",\n\t\t\t\tdir: this.#storagePath,\n\t\t\t\tactorCount: this.#actorCountOnStartup,\n\t\t\t\tsqliteRuntime: this.#sqliteRuntime.kind,\n\t\t\t});\n\n\t\t\t// Cleanup stale temp files on startup\n\t\t\ttry {\n\t\t\t\tthis.#cleanupTempFilesSync();\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed to cleanup temp files\",\n\t\t\t\t\terror: err,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.#migrateLegacyKvToSqliteOnStartupSync();\n\t\t\t} catch (error) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed legacy kv startup migration\",\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} else {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"memory driver ready\",\n\t\t\t\tsqliteRuntime: this.#sqliteRuntime.kind,\n\t\t\t});\n\t\t}\n\t}\n\n\tgetActorStatePath(actorId: string): string {\n\t\treturn getNodePath().join(this.#stateDir, actorId);\n\t}\n\n\tgetActorDbPath(actorId: string): string {\n\t\treturn getNodePath().join(this.#dbsDir, `${actorId}.db`);\n\t}\n\n\tgetActorAlarmPath(actorId: string): string {\n\t\treturn getNodePath().join(this.#alarmsDir, actorId);\n\t}\n\n\t#getActorKvDatabasePath(actorId: string): string {\n\t\tif (this.#persist) {\n\t\t\treturn this.getActorDbPath(actorId);\n\t\t}\n\t\treturn \":memory:\";\n\t}\n\n\t#ensureActorKvTables(db: SqliteRuntimeDatabase): void {\n\t\tdb.exec(`\n\t\t\tCREATE TABLE IF NOT EXISTS kv (\n\t\t\t\tkey BLOB PRIMARY KEY NOT NULL,\n\t\t\t\tvalue BLOB NOT NULL\n\t\t\t)\n\t\t`);\n\t}\n\n\t#getOrCreateActorKvDatabase(actorId: string): SqliteRuntimeDatabase {\n\t\tconst existing = this.#actorKvDatabases.get(actorId);\n\t\tif (existing) {\n\t\t\treturn existing;\n\t\t}\n\n\t\tconst dbPath = this.#getActorKvDatabasePath(actorId);\n\t\tif (this.#persist) {\n\t\t\tconst path = getNodePath();\n\t\t\tensureDirectoryExistsSync(path.dirname(dbPath));\n\t\t}\n\n\t\tlet db: SqliteRuntimeDatabase;\n\t\ttry {\n\t\t\tdb = this.#sqliteRuntime.open(dbPath);\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`failed to open actor kv database for actor ${actorId} at ${dbPath}: ${error}`,\n\t\t\t);\n\t\t}\n\n\t\tthis.#ensureActorKvTables(db);\n\t\tthis.#actorKvDatabases.set(actorId, db);\n\t\treturn db;\n\t}\n\n\t#closeActorKvDatabase(actorId: string): void {\n\t\tconst db = this.#actorKvDatabases.get(actorId);\n\t\tif (!db) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tdb.close();\n\t\t} finally {\n\t\t\tthis.#actorKvDatabases.delete(actorId);\n\t\t}\n\t}\n\n\t#putKvEntriesInDb(\n\t\tdb: SqliteRuntimeDatabase,\n\t\tentries: [Uint8Array, Uint8Array][],\n\t): void {\n\t\tif (entries.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tdb.exec(\"BEGIN\");\n\t\ttry {\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tdb.run(\"INSERT OR REPLACE INTO kv (key, value) VALUES (?, ?)\", [\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue,\n\t\t\t\t]);\n\t\t\t}\n\t\t\tdb.exec(\"COMMIT\");\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\tdb.exec(\"ROLLBACK\");\n\t\t\t} catch {\n\t\t\t\t// Ignore rollback errors, original error is more actionable.\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t#isKvDbPopulated(db: SqliteRuntimeDatabase): boolean {\n\t\tconst row = db.get<{ count: number | bigint }>(\n\t\t\t\"SELECT COUNT(*) AS count FROM kv\",\n\t\t);\n\t\tconst count = row ? Number(row.count) : 0;\n\t\treturn count > 0;\n\t}\n\n\t#migrateLegacyKvToSqliteOnStartupSync(): void {\n\t\tconst fsSync = getNodeFsSync();\n\t\tif (!fsSync.existsSync(this.#stateDir)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst actorIds = fsSync\n\t\t\t.readdirSync(this.#stateDir)\n\t\t\t.filter((id) => !id.includes(\".tmp.\"));\n\n\t\tfor (const actorId of actorIds) {\n\t\t\tconst statePath = this.getActorStatePath(actorId);\n\t\t\tlet state: schema.ActorState;\n\t\t\ttry {\n\t\t\t\tconst stateBytes = fsSync.readFileSync(statePath);\n\t\t\t\tstate = ACTOR_STATE_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\tnew Uint8Array(stateBytes),\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"failed to parse actor state during startup migration\",\n\t\t\t\t\tactorId,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!state.kvStorage || state.kvStorage.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst dbPath = this.getActorDbPath(actorId);\n\t\t\tconst path = getNodePath();\n\t\t\tensureDirectoryExistsSync(path.dirname(dbPath));\n\t\t\tconst db = this.#sqliteRuntime.open(dbPath);\n\t\t\ttry {\n\t\t\t\tthis.#ensureActorKvTables(db);\n\t\t\t\tif (this.#isKvDbPopulated(db)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst legacyEntries = state.kvStorage.map((entry) => [\n\t\t\t\t\tnew Uint8Array(entry.key),\n\t\t\t\t\tnew Uint8Array(entry.value),\n\t\t\t\t]) as [Uint8Array, Uint8Array][];\n\t\t\t\tthis.#putKvEntriesInDb(db, legacyEntries);\n\n\t\t\t\tlogger().info({\n\t\t\t\t\tmsg: \"migrated legacy actor kv storage to sqlite\",\n\t\t\t\t\tactorId,\n\t\t\t\t\tentryCount: legacyEntries.length,\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tdb.close();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync *getActorsIterator(params: {\n\t\tcursor?: string;\n\t}): AsyncGenerator<schema.ActorState> {\n\t\tlet actorIds = Array.from(this.#actors.keys()).sort();\n\n\t\t// Check if state directory exists first\n\t\tconst fsSync = getNodeFsSync();\n\t\tif (fsSync.existsSync(this.#stateDir)) {\n\t\t\tactorIds = fsSync\n\t\t\t\t.readdirSync(this.#stateDir)\n\t\t\t\t.filter((id) => !id.includes(\".tmp\"))\n\t\t\t\t.sort();\n\t\t}\n\n\t\tconst startIndex = params.cursor\n\t\t\t? actorIds.indexOf(params.cursor) + 1\n\t\t\t: 0;\n\n\t\tfor (let i = startIndex; i < actorIds.length; i++) {\n\t\t\tconst actorId = actorIds[i];\n\t\t\tif (!actorId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst state = await this.loadActorStateOrError(actorId);\n\t\t\t\tyield state;\n\t\t\t} catch (error) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed to load actor state\",\n\t\t\t\t\tactorId,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Ensures an entry exists for this actor.\n\t *\n\t * Used for #createActor and #loadActor.\n\t */\n\t#upsertEntry(actorId: string): ActorEntry {\n\t\tlet entry = this.#actors.get(actorId);\n\t\tif (entry) {\n\t\t\treturn entry;\n\t\t}\n\n\t\tentry = {\n\t\t\tid: actorId,\n\t\t\tlifecycleState: ActorLifecycleState.NONEXISTENT,\n\t\t\tgeneration: crypto.randomUUID(),\n\t\t};\n\t\tthis.#actors.set(actorId, entry);\n\t\treturn entry;\n\t}\n\n\t/**\n\t * Creates a new actor and writes to file system.\n\t */\n\tasync createActor(\n\t\tactorId: string,\n\t\tname: string,\n\t\tkey: ActorKey,\n\t\tinput: unknown | undefined,\n\t): Promise<ActorEntry> {\n\t\t// TODO: Does not check if actor already exists on fs\n\n\t\tawait this.#waitForActorStop(actorId);\n\t\tlet entry = this.#upsertEntry(actorId);\n\n\t\t// Check if actor already exists (has state or is being stopped)\n\t\tif (entry.state) {\n\t\t\tthrow new ActorDuplicateKey(name, key);\n\t\t}\n\t\tif (this.isActorStopping(actorId)) {\n\t\t\tawait this.#waitForActorStop(actorId);\n\t\t\tentry = this.#upsertEntry(actorId);\n\t\t}\n\n\t\t// If actor was destroyed, reset to NONEXISTENT and increment generation\n\t\tif (entry.lifecycleState === ActorLifecycleState.DESTROYED) {\n\t\t\tentry.lifecycleState = ActorLifecycleState.NONEXISTENT;\n\t\t\tentry.generation = crypto.randomUUID();\n\t\t}\n\n\t\t// Initialize storage (runtime KV is stored in SQLite; state.kvStorage is legacy-only)\n\t\tconst initialKvState = getInitialActorKvState(input);\n\n\t\t// Initialize metadata\n\t\tawait this.#withActorWrite(actorId, async (lockedEntry) => {\n\t\t\tlockedEntry.state = {\n\t\t\t\tactorId,\n\t\t\t\tname,\n\t\t\t\tkey,\n\t\t\t\tcreatedAt: BigInt(Date.now()),\n\t\t\t\tkvStorage: [],\n\t\t\t\tstartTs: null,\n\t\t\t\tconnectableTs: null,\n\t\t\t\tsleepTs: null,\n\t\t\t\tdestroyTs: null,\n\t\t\t};\n\t\t\tlockedEntry.lifecycleState = ActorLifecycleState.AWAKE;\n\t\t\tif (this.#persist) {\n\t\t\t\tawait this.#performWrite(\n\t\t\t\t\tactorId,\n\t\t\t\t\tlockedEntry.generation,\n\t\t\t\t\tlockedEntry.state,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (initialKvState.length > 0) {\n\t\t\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\t\t\tthis.#putKvEntriesInDb(db, initialKvState);\n\t\t\t}\n\t\t});\n\n\t\treturn entry;\n\t}\n\n\t/**\n\t * Loads the actor from disk or returns the existing actor entry. This will return an entry even if the actor does not actually exist.\n\t */\n\tasync loadActor(actorId: string): Promise<ActorEntry> {\n\t\tconst entry = this.#upsertEntry(actorId);\n\n\t\t// Check if destroyed - don't load from disk\n\t\tif (entry.lifecycleState === ActorLifecycleState.DESTROYED) {\n\t\t\treturn entry;\n\t\t}\n\n\t\t// Check if already loaded\n\t\tif (entry.state) {\n\t\t\treturn entry;\n\t\t}\n\n\t\t// If not persisted, then don't load from FS\n\t\tif (!this.#persist) {\n\t\t\treturn entry;\n\t\t}\n\n\t\t// If state is currently being loaded, wait for it\n\t\tif (entry.loadPromise) {\n\t\t\tawait entry.loadPromise;\n\t\t\treturn entry;\n\t\t}\n\n\t\t// Start loading state\n\t\tentry.loadPromise = this.loadActorState(entry);\n\t\treturn entry.loadPromise;\n\t}\n\n\tprivate async loadActorState(entry: ActorEntry) {\n\t\tconst stateFilePath = this.getActorStatePath(entry.id);\n\n\t\t// Read & parse file\n\t\ttry {\n\t\t\tconst fs = getNodeFs();\n\t\t\tconst stateData = await fs.readFile(stateFilePath);\n\n\t\t\tconst loadedState =\n\t\t\t\tACTOR_STATE_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\tnew Uint8Array(stateData),\n\t\t\t\t);\n\n\t\t\t// Runtime reads/writes are SQLite-only; legacy kvStorage is for one-time startup migration.\n\t\t\tentry.state = {\n\t\t\t\t...loadedState,\n\t\t\t\tkvStorage: [],\n\t\t\t};\n\n\t\t\treturn entry;\n\t\t} catch (innerError: any) {\n\t\t\t// File does not exist, meaning the actor does not exist\n\t\t\tif (innerError.code === \"ENOENT\") {\n\t\t\t\tentry.loadPromise = undefined;\n\t\t\t\treturn entry;\n\t\t\t}\n\n\t\t\t// For other errors, throw\n\t\t\tconst error = new Error(\n\t\t\t\t`Failed to load actor state: ${innerError}`,\n\t\t\t);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync loadOrCreateActor(\n\t\tactorId: string,\n\t\tname: string,\n\t\tkey: ActorKey,\n\t\tinput: unknown | undefined,\n\t): Promise<ActorEntry> {\n\t\tawait this.#waitForActorStop(actorId);\n\n\t\t// Attempt to load actor\n\t\tconst entry = await this.loadActor(actorId);\n\n\t\t// If no state for this actor, then create & write state\n\t\tif (!entry.state) {\n\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\tawait this.#waitForActorStop(actorId);\n\t\t\t\treturn await this.loadOrCreateActor(actorId, name, key, input);\n\t\t\t}\n\n\t\t\t// If actor was destroyed, reset to NONEXISTENT and increment generation\n\t\t\tif (entry.lifecycleState === ActorLifecycleState.DESTROYED) {\n\t\t\t\tentry.lifecycleState = ActorLifecycleState.NONEXISTENT;\n\t\t\t\tentry.generation = crypto.randomUUID();\n\t\t\t}\n\n\t\t\t// Initialize storage (runtime KV is stored in SQLite; state.kvStorage is legacy-only)\n\t\t\tconst initialKvState = getInitialActorKvState(input);\n\n\t\t\tawait this.#withActorWrite(actorId, async (lockedEntry) => {\n\t\t\t\tlockedEntry.state = {\n\t\t\t\t\tactorId,\n\t\t\t\t\tname,\n\t\t\t\t\tkey: key as readonly string[],\n\t\t\t\t\tcreatedAt: BigInt(Date.now()),\n\t\t\t\t\tkvStorage: [],\n\t\t\t\t\tstartTs: null,\n\t\t\t\t\tconnectableTs: null,\n\t\t\t\t\tsleepTs: null,\n\t\t\t\t\tdestroyTs: null,\n\t\t\t\t};\n\t\t\t\tif (this.#persist) {\n\t\t\t\t\tawait this.#performWrite(\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tlockedEntry.generation,\n\t\t\t\t\t\tlockedEntry.state,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (initialKvState.length > 0) {\n\t\t\t\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\t\t\t\tthis.#putKvEntriesInDb(db, initialKvState);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn entry;\n\t}\n\n\tasync sleepActor(actorId: string) {\n\t\tinvariant(\n\t\t\tthis.#persist,\n\t\t\t\"cannot sleep actor with memory driver, must use file system driver\",\n\t\t);\n\n\t\t// Get the actor. We upsert it even though we're about to destroy it so we have a lock on flagging `destroying` as true.\n\t\tconst actor = this.#upsertEntry(actorId);\n\t\tinvariant(actor, `tried to sleep ${actorId}, does not exist`);\n\n\t\t// Check if already destroying\n\t\tif (this.isActorStopping(actorId)) {\n\t\t\treturn;\n\t\t}\n\t\tactor.lifecycleState = ActorLifecycleState.STARTING_SLEEP;\n\t\tactor.stopPromise = promiseWithResolvers((reason) =>\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"unhandled actor sleep stop promise rejection\",\n\t\t\t\treason,\n\t\t\t}),\n\t\t);\n\n\t\t// Wait for actor to fully start before stopping it to avoid race conditions\n\t\tif (actor.loadPromise) await actor.loadPromise.catch();\n\t\tif (actor.startPromise?.promise)\n\t\t\tawait actor.startPromise.promise.catch();\n\n\t\ttry {\n\t\t\t// Update state with sleep timestamp\n\t\t\tif (actor.state) {\n\t\t\t\tawait this.#withActorWrite(actorId, async (lockedEntry) => {\n\t\t\t\t\tif (!lockedEntry.state) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlockedEntry.state = {\n\t\t\t\t\t\t...lockedEntry.state,\n\t\t\t\t\t\tsleepTs: BigInt(Date.now()),\n\t\t\t\t\t};\n\t\t\t\t\tif (this.#persist) {\n\t\t\t\t\t\tawait this.#performWrite(\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\tlockedEntry.generation,\n\t\t\t\t\t\t\tlockedEntry.state,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Stop actor\n\t\t\tinvariant(actor.actor, \"actor should be loaded\");\n\t\t\tawait actor.actor.onStop(\"sleep\");\n\t\t} finally {\n\t\t\t// Ensure any pending KV writes finish before removing the entry.\n\t\t\tawait this.#withActorWrite(actorId, async () => { });\n\t\t\tthis.#closeActorKvDatabase(actorId);\n\t\t\tactor.stopPromise?.resolve();\n\t\t\tactor.stopPromise = undefined;\n\n\t\t\t// Remove from map after stop is complete\n\t\t\tthis.#actors.delete(actorId);\n\t\t}\n\t}\n\n\tasync destroyActor(actorId: string) {\n\t\t// Get the actor. We upsert it even though we're about to destroy it so we have a lock on flagging `destroying` as true.\n\t\tconst actor = this.#upsertEntry(actorId);\n\n\t\t// If actor is loaded, stop it first\n\t\t// Check if already destroying\n\t\tif (this.isActorStopping(actorId)) {\n\t\t\treturn;\n\t\t}\n\t\tactor.lifecycleState = ActorLifecycleState.STARTING_DESTROY;\n\t\tactor.stopPromise = promiseWithResolvers((reason) =>\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"unhandled actor destroy stop promise rejection\",\n\t\t\t\treason,\n\t\t\t}),\n\t\t);\n\n\t\t// Wait for actor to fully start before stopping it to avoid race conditions\n\t\tif (actor.loadPromise) await actor.loadPromise.catch();\n\t\tif (actor.startPromise?.promise)\n\t\t\tawait actor.startPromise.promise.catch();\n\n\t\ttry {\n\t\t\t// Update state with destroy timestamp\n\t\t\tif (actor.state) {\n\t\t\t\tawait this.#withActorWrite(actorId, async (lockedEntry) => {\n\t\t\t\t\tif (!lockedEntry.state) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlockedEntry.state = {\n\t\t\t\t\t\t...lockedEntry.state,\n\t\t\t\t\t\tdestroyTs: BigInt(Date.now()),\n\t\t\t\t\t};\n\t\t\t\t\tif (this.#persist) {\n\t\t\t\t\t\tawait this.#performWrite(\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\tlockedEntry.generation,\n\t\t\t\t\t\t\tlockedEntry.state,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Stop actor if it's running\n\t\t\tif (actor.actor) {\n\t\t\t\tawait actor.actor.onStop(\"destroy\");\n\t\t\t}\n\n\t\t\t// Ensure any pending KV writes finish before deleting files.\n\t\t\tawait this.#withActorWrite(actorId, async () => { });\n\t\t\tthis.#closeActorKvDatabase(actorId);\n\n\t\t\t// Clear alarm timeout if exists\n\t\t\tif (actor.alarmTimeout) {\n\t\t\t\tactor.alarmTimeout.abort();\n\t\t\t}\n\n\t\t\t// Delete persisted files if using file system driver\n\t\t\tif (this.#persist) {\n\t\t\t\tconst fs = getNodeFs();\n\n\t\t\t\t// Delete all actor files in parallel\n\t\t\t\tawait Promise.all([\n\t\t\t\t\t// Delete actor state file\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait fs.unlink(this.getActorStatePath(actorId));\n\t\t\t\t\t\t} catch (err: any) {\n\t\t\t\t\t\t\tif (err?.code !== \"ENOENT\") {\n\t\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\t\tmsg: \"failed to delete actor state file\",\n\t\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})(),\n\t\t\t\t\t// Delete actor database file\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait fs.unlink(this.getActorDbPath(actorId));\n\t\t\t\t\t\t} catch (err: any) {\n\t\t\t\t\t\t\tif (err?.code !== \"ENOENT\") {\n\t\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\t\tmsg: \"failed to delete actor database file\",\n\t\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})(),\n\t\t\t\t\t// Delete actor alarm file\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait fs.unlink(this.getActorAlarmPath(actorId));\n\t\t\t\t\t\t} catch (err: any) {\n\t\t\t\t\t\t\tif (err?.code !== \"ENOENT\") {\n\t\t\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\t\t\tmsg: \"failed to delete actor alarm file\",\n\t\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})(),\n\t\t\t\t]);\n\t\t\t}\n\t\t} finally {\n\t\t\t// Ensure any pending KV writes finish before clearing the entry.\n\t\t\tawait this.#withActorWrite(actorId, async () => { });\n\t\t\tactor.stopPromise?.resolve();\n\t\t\tactor.stopPromise = undefined;\n\n\t\t\t// Reset the entry\n\t\t\t//\n\t\t\t// Do not remove entry in order to avoid race condition with\n\t\t\t// destroying. Next actor creation will increment the generation.\n\t\t\tactor.state = undefined;\n\t\t\tactor.loadPromise = undefined;\n\t\t\tactor.actor = undefined;\n\t\t\tactor.startPromise = undefined;\n\t\t\tactor.alarmTimeout = undefined;\n\t\t\tactor.alarmTimeout = undefined;\n\t\t\tactor.pendingWriteResolver = undefined;\n\t\t\tactor.lifecycleState = ActorLifecycleState.DESTROYED;\n\t\t}\n\t}\n\n\t/**\n\t * Save actor state to disk.\n\t */\n\tasync writeActor(\n\t\tactorId: string,\n\t\tgeneration: string,\n\t\tstate: schema.ActorState,\n\t): Promise<void> {\n\t\tif (!this.#persist) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.#withActorWrite(actorId, async () => {\n\t\t\tawait this.#performWrite(actorId, generation, state);\n\t\t});\n\t}\n\n\tisGenerationCurrentAndNotDestroyed(\n\t\tactorId: string,\n\t\tgeneration: string,\n\t): boolean {\n\t\tconst entry = this.#upsertEntry(actorId);\n\t\tif (!entry) return false;\n\t\treturn (\n\t\t\tentry.generation === generation &&\n\t\t\tentry.lifecycleState !== ActorLifecycleState.STARTING_DESTROY\n\t\t);\n\t}\n\n\tisActorStopping(actorId: string) {\n\t\tconst entry = this.#upsertEntry(actorId);\n\t\tif (!entry) return false;\n\t\treturn (\n\t\t\tentry.lifecycleState === ActorLifecycleState.STARTING_SLEEP ||\n\t\t\tentry.lifecycleState === ActorLifecycleState.STARTING_DESTROY\n\t\t);\n\t}\n\n\tasync #waitForActorStop(actorId: string): Promise<void> {\n\t\twhile (true) {\n\t\t\tconst entry = this.#actors.get(actorId);\n\t\t\tif (!entry?.stopPromise) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait entry.stopPromise.promise;\n\t\t\t} catch {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #withActorWrite<T>(\n\t\tactorId: string,\n\t\tfn: (entry: ActorEntry) => Promise<T>,\n\t): Promise<T> {\n\t\tconst entry = this.#actors.get(actorId);\n\t\tinvariant(entry, \"actor entry does not exist\");\n\n\t\tconst previousWrite = entry.pendingWriteResolver;\n\t\tconst currentWrite = promiseWithResolvers<void>((reason) =>\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"unhandled kv write promise rejection\",\n\t\t\t\treason,\n\t\t\t}),\n\t\t);\n\t\tentry.pendingWriteResolver = currentWrite;\n\n\t\tif (previousWrite) {\n\t\t\ttry {\n\t\t\t\tawait previousWrite.promise;\n\t\t\t} catch {\n\t\t\t\t// Ignore failed previous writes so later writes can proceed.\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\treturn await fn(entry);\n\t\t} finally {\n\t\t\tcurrentWrite.resolve();\n\t\t\tif (entry.pendingWriteResolver === currentWrite) {\n\t\t\t\tentry.pendingWriteResolver = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #waitForPendingWrite(actorId: string): Promise<void> {\n\t\tconst entry = this.#actors.get(actorId);\n\t\tif (!entry?.pendingWriteResolver) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (entry.pendingWriteResolver) {\n\t\t\tconst pending = entry.pendingWriteResolver;\n\t\t\ttry {\n\t\t\t\tawait pending.promise;\n\t\t\t} catch {\n\t\t\t\t// Ignore write failures to avoid blocking reads forever.\n\t\t\t}\n\t\t}\n\t}\n\n\tasync setActorAlarm(actorId: string, timestamp: number) {\n\t\tconst entry = this.#actors.get(actorId);\n\t\tinvariant(entry, \"actor entry does not exist\");\n\n\t\t// Track generation of the actor when the write started to detect\n\t\t// destroy/create race condition\n\t\tconst writeGeneration = entry.generation;\n\t\tif (this.isActorStopping(actorId)) {\n\t\t\tlogger().info(\"skipping set alarm since actor stopping\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Persist alarm to disk\n\t\tif (this.#persist) {\n\t\t\tconst alarmPath = this.getActorAlarmPath(actorId);\n\t\t\tconst crypto = getNodeCrypto();\n\t\t\tconst tempPath = `${alarmPath}.tmp.${crypto.randomUUID()}`;\n\t\t\ttry {\n\t\t\t\tconst path = getNodePath();\n\t\t\t\tawait ensureDirectoryExists(path.dirname(alarmPath));\n\t\t\t\tconst alarmData: schema.ActorAlarm = {\n\t\t\t\t\tactorId,\n\t\t\t\t\ttimestamp: BigInt(timestamp),\n\t\t\t\t};\n\t\t\t\tconst data = ACTOR_ALARM_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\talarmData,\n\t\t\t\t\tFILE_SYSTEM_DRIVER_CURRENT_VERSION,\n\t\t\t\t);\n\t\t\t\tconst fs = getNodeFs();\n\t\t\t\tawait fs.writeFile(tempPath, data);\n\n\t\t\t\tif (\n\t\t\t\t\t!this.isGenerationCurrentAndNotDestroyed(\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\twriteGeneration,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tlogger().debug(\n\t\t\t\t\t\t\"skipping writing alarm since actor destroying or new generation\",\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tawait fs.rename(tempPath, alarmPath);\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tconst fs = getNodeFs();\n\t\t\t\t\tawait fs.unlink(tempPath);\n\t\t\t\t} catch { }\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed to write alarm\",\n\t\t\t\t\tactorId,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t\tthrow new Error(`Failed to write alarm: ${error}`);\n\t\t\t}\n\t\t}\n\n\t\t// Schedule timeout\n\t\tthis.#scheduleAlarmTimeout(actorId, timestamp);\n\t}\n\n\t/**\n\t * Perform the actual write operation with atomic writes\n\t */\n\tasync #performWrite(\n\t\tactorId: string,\n\t\tgeneration: string,\n\t\tstate: schema.ActorState,\n\t): Promise<void> {\n\t\tconst dataPath = this.getActorStatePath(actorId);\n\t\t// Generate unique temp filename to prevent any race conditions\n\t\tconst crypto = getNodeCrypto();\n\t\tconst tempPath = `${dataPath}.tmp.${crypto.randomUUID()}`;\n\n\t\ttry {\n\t\t\t// Create directory if needed\n\t\t\tconst path = getNodePath();\n\t\t\tawait ensureDirectoryExists(path.dirname(dataPath));\n\n\t\t\t// Convert to BARE types for serialization\n\t\t\tconst bareState: schema.ActorState = {\n\t\t\t\tactorId: state.actorId,\n\t\t\t\tname: state.name,\n\t\t\t\tkey: state.key,\n\t\t\t\tcreatedAt: state.createdAt,\n\t\t\t\tkvStorage: state.kvStorage,\n\t\t\t\tstartTs: state.startTs,\n\t\t\t\tconnectableTs: state.connectableTs,\n\t\t\t\tsleepTs: state.sleepTs,\n\t\t\t\tdestroyTs: state.destroyTs,\n\t\t\t};\n\n\t\t\t// Perform atomic write\n\t\t\tconst serializedState =\n\t\t\t\tACTOR_STATE_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\t\t\tbareState,\n\t\t\t\t\tFILE_SYSTEM_DRIVER_CURRENT_VERSION,\n\t\t\t\t);\n\t\t\tconst fs = getNodeFs();\n\t\t\tawait fs.writeFile(tempPath, serializedState);\n\n\t\t\tif (!this.isGenerationCurrentAndNotDestroyed(actorId, generation)) {\n\t\t\t\tlogger().debug(\n\t\t\t\t\t\"skipping writing alarm since actor destroying or new generation\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait fs.rename(tempPath, dataPath);\n\t\t} catch (error) {\n\t\t\t// Cleanup temp file on error\n\t\t\ttry {\n\t\t\t\tconst fs = getNodeFs();\n\t\t\t\tawait fs.unlink(tempPath);\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"failed to save actor state\",\n\t\t\t\tactorId,\n\t\t\t\terror,\n\t\t\t});\n\t\t\tthrow new Error(`Failed to save actor state: ${error}`);\n\t\t}\n\t}\n\n\t/**\n\t * Call this method after the actor driver has been initiated.\n\t *\n\t * This will trigger all initial alarms from the file system.\n\t *\n\t * This needs to be sync since DriverConfig.actor is sync\n\t */\n\tonRunnerStart(\n\t\tconfig: RegistryConfig,\n\t\tinlineClient: AnyClient,\n\t\tactorDriver: ActorDriver,\n\t) {\n\t\tif (this.#runnerParams) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Save runner params for future use\n\t\tthis.#runnerParams = {\n\t\t\tconfig: config,\n\t\t\tinlineClient,\n\t\t\tactorDriver,\n\t\t};\n\n\t\t// Load alarms from disk and schedule timeouts\n\t\ttry {\n\t\t\tthis.#loadAlarmsSync();\n\t\t} catch (err) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"failed to load alarms on startup\",\n\t\t\t\terror: err,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync startActor(\n\t\tconfig: RegistryConfig,\n\t\tinlineClient: AnyClient,\n\t\tactorDriver: ActorDriver,\n\t\tactorId: string,\n\t): Promise<AnyActorInstance> {\n\t\tawait this.#waitForActorStop(actorId);\n\n\t\t// Get the actor metadata\n\t\tlet entry = await this.loadActor(actorId);\n\t\tif (!entry.state) {\n\t\t\tthrow new Error(\n\t\t\t\t`Actor does not exist and cannot be started: \"${actorId}\"`,\n\t\t\t);\n\t\t}\n\n\t\t// Actor already starting\n\t\tif (entry.startPromise) {\n\t\t\tawait entry.startPromise.promise;\n\t\t\tinvariant(entry.actor, \"actor should have loaded\");\n\t\t\treturn entry.actor;\n\t\t}\n\n\t\t// Actor already loaded\n\t\tif (entry.actor) {\n\t\t\tif (entry.actor.isStopping || this.isActorStopping(actorId)) {\n\t\t\t\tawait this.#waitForActorStop(actorId);\n\t\t\t\tentry = await this.loadActor(actorId);\n\t\t\t\tif (!entry.state) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Actor does not exist and cannot be started: \"${actorId}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn entry.actor;\n\t\t\t}\n\t\t}\n\n\t\t// Create start promise\n\t\tentry.startPromise = promiseWithResolvers((reason) =>\n\t\t\tlogger().warn({\n\t\t\t\tmsg: \"unhandled actor start promise rejection\",\n\t\t\t\treason,\n\t\t\t}),\n\t\t);\n\n\t\ttry {\n\t\t\t// Create actor\n\t\t\tconst definition = lookupInRegistry(config, entry.state.name);\n\t\t\tentry.actor = await definition.instantiate();\n\t\t\tentry.lifecycleState = ActorLifecycleState.AWAKE;\n\n\t\t\t// Start actor\n\t\t\tawait entry.actor.start(\n\t\t\t\tactorDriver,\n\t\t\t\tinlineClient,\n\t\t\t\tactorId,\n\t\t\t\tentry.state.name,\n\t\t\t\tentry.state.key as string[],\n\t\t\t\t\"unknown\",\n\t\t\t);\n\n\t\t\t// Update state with start timestamp\n\t\t\t// NOTE: connectableTs is always in sync with startTs since actors become connectable immediately after starting\n\t\t\tconst now = BigInt(Date.now());\n\t\t\tawait this.#withActorWrite(actorId, async (lockedEntry) => {\n\t\t\t\tif (!lockedEntry.state) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Actor does not exist and cannot be started: \"${actorId}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tlockedEntry.state = {\n\t\t\t\t\t...lockedEntry.state,\n\t\t\t\t\tstartTs: now,\n\t\t\t\t\tconnectableTs: now,\n\t\t\t\t\tsleepTs: null, // Clear sleep timestamp when actor wakes up\n\t\t\t\t};\n\t\t\t\tif (this.#persist) {\n\t\t\t\t\tawait this.#performWrite(\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\tlockedEntry.generation,\n\t\t\t\t\t\tlockedEntry.state,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Finish\n\t\t\tentry.startPromise.resolve();\n\t\t\tentry.startPromise = undefined;\n\n\t\t\treturn entry.actor;\n\t\t} catch (innerError) {\n\t\t\tconst error = new Error(\n\t\t\t\t`Failed to start actor ${actorId}: ${innerError}`,\n\t\t\t\t{ cause: innerError },\n\t\t\t);\n\t\t\tentry.startPromise?.reject(error);\n\t\t\tentry.startPromise = undefined;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync loadActorStateOrError(actorId: string): Promise<schema.ActorState> {\n\t\tconst state = (await this.loadActor(actorId)).state;\n\t\tif (!state) throw new Error(`Actor does not exist: ${actorId}`);\n\t\treturn state;\n\t}\n\n\tgetActorOrError(actorId: string): ActorEntry {\n\t\tconst entry = this.#actors.get(actorId);\n\t\tif (!entry) throw new Error(`No entry for actor: ${actorId}`);\n\t\treturn entry;\n\t}\n\n\tasync createDatabase(actorId: string): Promise<string | undefined> {\n\t\treturn this.getActorDbPath(actorId);\n\t}\n\n\t/**\n\t * Load all persisted alarms from disk and schedule their timers.\n\t */\n\t#loadAlarmsSync(): void {\n\t\ttry {\n\t\t\tconst fsSync = getNodeFsSync();\n\t\t\tconst files = fsSync.existsSync(this.#alarmsDir)\n\t\t\t\t? fsSync.readdirSync(this.#alarmsDir)\n\t\t\t\t: [];\n\t\t\tfor (const file of files) {\n\t\t\t\t// Skip temp files\n\t\t\t\tif (file.includes(\".tmp.\")) continue;\n\t\t\t\tconst path = getNodePath();\n\t\t\t\tconst fullPath = path.join(this.#alarmsDir, file);\n\t\t\t\ttry {\n\t\t\t\t\tconst buf = fsSync.readFileSync(fullPath);\n\t\t\t\t\tconst alarmData =\n\t\t\t\t\t\tACTOR_ALARM_VERSIONED.deserializeWithEmbeddedVersion(\n\t\t\t\t\t\t\tnew Uint8Array(buf),\n\t\t\t\t\t\t);\n\t\t\t\t\tconst timestamp = Number(alarmData.timestamp);\n\t\t\t\t\tif (Number.isFinite(timestamp)) {\n\t\t\t\t\t\tthis.#scheduleAlarmTimeout(\n\t\t\t\t\t\t\talarmData.actorId,\n\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\tmsg: \"invalid alarm file contents\",\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: \"failed to read alarm file\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"failed to list alarms directory\",\n\t\t\t\terror: err,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Schedule an alarm timer for an actor without writing to disk.\n\t */\n\t#scheduleAlarmTimeout(actorId: string, timestamp: number) {\n\t\tconst entry = this.#upsertEntry(actorId);\n\n\t\t// If there's already an earlier alarm scheduled, do not override it.\n\t\tif (\n\t\t\tentry.alarmTimestamp !== undefined &&\n\t\t\ttimestamp >= entry.alarmTimestamp\n\t\t) {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"skipping alarm schedule (later than existing)\",\n\t\t\t\tactorId,\n\t\t\t\ttimestamp,\n\t\t\t\tcurrent: entry.alarmTimestamp,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tlogger().debug({ msg: \"scheduling alarm\", actorId, timestamp });\n\n\t\t// Cancel existing timeout and update the current scheduled timestamp\n\t\tentry.alarmTimeout?.abort();\n\t\tentry.alarmTimestamp = timestamp;\n\n\t\tconst delay = Math.max(0, timestamp - Date.now());\n\t\tentry.alarmTimeout = setLongTimeout(async () => {\n\t\t\t// Clear currently scheduled timestamp as this alarm is firing now\n\t\t\tentry.alarmTimestamp = undefined;\n\t\t\t// On trigger: remove persisted alarm file\n\t\t\tif (this.#persist) {\n\t\t\t\ttry {\n\t\t\t\t\tconst fs = getNodeFs();\n\t\t\t\t\tawait fs.unlink(this.getActorAlarmPath(actorId));\n\t\t\t\t} catch (err: any) {\n\t\t\t\t\tif (err?.code !== \"ENOENT\") {\n\t\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\t\tmsg: \"failed to remove alarm file\",\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tlogger().debug({ msg: \"triggering alarm\", actorId, timestamp });\n\n\t\t\t\t// Ensure actor state exists and start actor if needed\n\t\t\t\tconst loaded = await this.loadActor(actorId);\n\t\t\t\tif (!loaded.state)\n\t\t\t\t\tthrow new Error(`Actor does not exist: ${actorId}`);\n\n\t\t\t\t// Start actor if not already running\n\t\t\t\tconst runnerParams = this.#runnerParams;\n\t\t\t\tinvariant(runnerParams, \"missing runner params\");\n\t\t\t\tif (!loaded.actor) {\n\t\t\t\t\tawait this.startActor(\n\t\t\t\t\t\trunnerParams.config,\n\t\t\t\t\t\trunnerParams.inlineClient,\n\t\t\t\t\t\trunnerParams.actorDriver,\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tinvariant(loaded.actor, \"actor should be loaded after wake\");\n\t\t\t\tawait loaded.actor.onAlarm();\n\t\t\t} catch (err) {\n\t\t\t\tlogger().error({\n\t\t\t\t\tmsg: \"failed to handle alarm\",\n\t\t\t\t\tactorId,\n\t\t\t\t\terror: stringifyError(err),\n\t\t\t\t});\n\t\t\t}\n\t\t}, delay);\n\t}\n\n\t/**\n\t * Cleanup stale temp files on startup (synchronous)\n\t */\n\t#cleanupTempFilesSync(): void {\n\t\ttry {\n\t\t\tconst fsSync = getNodeFsSync();\n\t\t\tconst files = fsSync.readdirSync(this.#stateDir);\n\t\t\tconst tempFiles = files.filter((f) => f.includes(\".tmp.\"));\n\n\t\t\tconst oneHourAgo = Date.now() - 3600000; // 1 hour in ms\n\n\t\t\tfor (const tempFile of tempFiles) {\n\t\t\t\ttry {\n\t\t\t\t\tconst path = getNodePath();\n\t\t\t\t\tconst fullPath = path.join(this.#stateDir, tempFile);\n\t\t\t\t\tconst stat = fsSync.statSync(fullPath);\n\n\t\t\t\t\t// Remove if older than 1 hour\n\t\t\t\t\tif (stat.mtimeMs < oneHourAgo) {\n\t\t\t\t\t\tfsSync.unlinkSync(fullPath);\n\t\t\t\t\t\tlogger().info({\n\t\t\t\t\t\t\tmsg: \"cleaned up stale temp file\",\n\t\t\t\t\t\t\tfile: tempFile,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger().debug({\n\t\t\t\t\t\tmsg: \"failed to cleanup temp file\",\n\t\t\t\t\t\tfile: tempFile,\n\t\t\t\t\t\terror: err,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tlogger().error({\n\t\t\t\tmsg: \"failed to read actors directory for cleanup\",\n\t\t\t\terror: err,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Batch put KV entries for an actor.\n\t */\n\tasync kvBatchPut(\n\t\tactorId: string,\n\t\tentries: [Uint8Array, Uint8Array][],\n\t): Promise<void> {\n\t\tawait this.loadActor(actorId);\n\t\tawait this.#withActorWrite(actorId, async (entry) => {\n\t\t\tif (!entry.state) {\n\t\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Actor ${actorId} state not loaded`);\n\t\t\t}\n\n\t\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\t\tconst totalSize = estimateKvSize(db);\n\t\t\tvalidateKvEntries(entries, totalSize);\n\t\t\tthis.#putKvEntriesInDb(db, entries);\n\t\t});\n\t}\n\n\t/**\n\t * Batch get KV entries for an actor.\n\t */\n\tasync kvBatchGet(\n\t\tactorId: string,\n\t\tkeys: Uint8Array[],\n\t): Promise<(Uint8Array | null)[]> {\n\t\tconst entry = await this.loadActor(actorId);\n\t\tawait this.#waitForPendingWrite(actorId);\n\t\tif (!entry.state) {\n\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\tthrow new Error(`Actor ${actorId} is stopping`);\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Actor ${actorId} state not loaded`);\n\t\t\t}\n\t\t}\n\n\t\tvalidateKvKeys(keys);\n\n\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\tconst results: (Uint8Array | null)[] = [];\n\t\tfor (const key of keys) {\n\t\t\tconst row = db.get<{ value: Uint8Array | ArrayBuffer }>(\n\t\t\t\t\"SELECT value FROM kv WHERE key = ?\",\n\t\t\t\t[key],\n\t\t\t);\n\t\t\tif (!row) {\n\t\t\t\tresults.push(null);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tresults.push(ensureUint8Array(row.value, \"value\"));\n\t\t}\n\t\treturn results;\n\t}\n\n\t/**\n\t * Batch delete KV entries for an actor.\n\t */\n\tasync kvBatchDelete(actorId: string, keys: Uint8Array[]): Promise<void> {\n\t\tawait this.loadActor(actorId);\n\t\tawait this.#withActorWrite(actorId, async (entry) => {\n\t\t\tif (!entry.state) {\n\t\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Actor ${actorId} state not loaded`);\n\t\t\t}\n\n\t\t\tif (keys.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvalidateKvKeys(keys);\n\n\t\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\t\tdb.exec(\"BEGIN\");\n\t\t\ttry {\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\tdb.run(\"DELETE FROM kv WHERE key = ?\", [key]);\n\t\t\t\t}\n\t\t\t\tdb.exec(\"COMMIT\");\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tdb.exec(\"ROLLBACK\");\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore rollback errors, original error is more actionable.\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Delete KV entries in the half-open range [start, end).\n\t */\n\tasync kvDeleteRange(\n\t\tactorId: string,\n\t\tstart: Uint8Array,\n\t\tend: Uint8Array,\n\t): Promise<void> {\n\t\tawait this.loadActor(actorId);\n\t\tawait this.#withActorWrite(actorId, async (entry) => {\n\t\t\tif (!entry.state) {\n\t\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Actor ${actorId} state not loaded`);\n\t\t\t}\n\n\t\t\tvalidateKvKey(start, \"start key\");\n\t\t\tvalidateKvKey(end, \"end key\");\n\t\t\tif (compareBytes(start, end) >= 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\t\tdb.run(\"DELETE FROM kv WHERE key >= ? AND key < ?\", [start, end]);\n\t\t});\n\t}\n\n\t/**\n\t * List KV entries with a given prefix for an actor.\n\t */\n\tasync kvListPrefix(\n\t\tactorId: string,\n\t\tprefix: Uint8Array,\n\t\toptions?: {\n\t\t\treverse?: boolean;\n\t\t\tlimit?: number;\n\t\t},\n\t): Promise<[Uint8Array, Uint8Array][]> {\n\t\tconst entry = await this.loadActor(actorId);\n\t\tawait this.#waitForPendingWrite(actorId);\n\t\tif (!entry.state) {\n\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\tthrow new Error(`Actor ${actorId} is destroying`);\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Actor ${actorId} state not loaded`);\n\t\t\t}\n\t\t}\n\t\tvalidateKvKey(prefix, \"prefix key\");\n\n\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\tconst upperBound = computePrefixUpperBound(prefix);\n\t\tconst direction = options?.reverse ? \"DESC\" : \"ASC\";\n\t\tconst limit = options?.limit ?? DEFAULT_LIST_LIMIT;\n\t\tconst rows = upperBound\n\t\t\t? db.all<{\n\t\t\t\tkey: Uint8Array | ArrayBuffer;\n\t\t\t\tvalue: Uint8Array | ArrayBuffer;\n\t\t\t}>(\n\t\t\t\t`SELECT key, value FROM kv WHERE key >= ? AND key < ? ORDER BY key ${direction} LIMIT ?`,\n\t\t\t\t[prefix, upperBound, limit],\n\t\t\t)\n\t\t\t: db.all<{\n\t\t\t\tkey: Uint8Array | ArrayBuffer;\n\t\t\t\tvalue: Uint8Array | ArrayBuffer;\n\t\t\t}>(\n\t\t\t\t`SELECT key, value FROM kv WHERE key >= ? ORDER BY key ${direction} LIMIT ?`,\n\t\t\t\t[prefix, limit],\n\t\t\t);\n\n\t\treturn rows.map((row) => [\n\t\t\tensureUint8Array(row.key, \"key\"),\n\t\t\tensureUint8Array(row.value, \"value\"),\n\t\t]);\n\t}\n\n\t/**\n\t * List KV entries in the half-open range [start, end).\n\t */\n\tasync kvListRange(\n\t\tactorId: string,\n\t\tstart: Uint8Array,\n\t\tend: Uint8Array,\n\t\toptions?: {\n\t\t\treverse?: boolean;\n\t\t\tlimit?: number;\n\t\t},\n\t): Promise<[Uint8Array, Uint8Array][]> {\n\t\tconst entry = await this.loadActor(actorId);\n\t\tawait this.#waitForPendingWrite(actorId);\n\t\tif (!entry.state) {\n\t\t\tif (this.isActorStopping(actorId)) {\n\t\t\t\tthrow new Error(`Actor ${actorId} is destroying`);\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Actor ${actorId} state not loaded`);\n\t\t\t}\n\t\t}\n\t\tvalidateKvKey(start, \"start key\");\n\t\tvalidateKvKey(end, \"end key\");\n\t\tif (compareBytes(start, end) >= 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst db = this.#getOrCreateActorKvDatabase(actorId);\n\t\tconst direction = options?.reverse ? \"DESC\" : \"ASC\";\n\t\tconst limit = options?.limit ?? DEFAULT_LIST_LIMIT;\n\t\tconst rows = db.all<{\n\t\t\tkey: Uint8Array | ArrayBuffer;\n\t\t\tvalue: Uint8Array | ArrayBuffer;\n\t\t}>(\n\t\t\t`SELECT key, value FROM kv WHERE key >= ? AND key < ? ORDER BY key ${direction} LIMIT ?`,\n\t\t\t[start, end, limit],\n\t\t);\n\n\t\treturn rows.map((row) => [\n\t\t\tensureUint8Array(row.key, \"key\"),\n\t\t\tensureUint8Array(row.value, \"value\"),\n\t\t]);\n\t}\n}","import { createVersionedDataHandler } from \"vbare\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport * as v1 from \"../../../dist/schemas/file-system-driver/v1\";\nimport * as v2 from \"../../../dist/schemas/file-system-driver/v2\";\nimport * as v3 from \"../../../dist/schemas/file-system-driver/v3\";\n\nexport const CURRENT_VERSION = 3;\n\n// Converter from v1 to v2\nconst v1ToV2 = (v1State: v1.ActorState): v2.ActorState => {\n\t// Create a new kvStorage list with the legacy persist data\n\tconst kvStorage: v2.ActorKvEntry[] = [];\n\n\t// Store the legacy persist data under key [1]\n\tif (v1State.persistedData) {\n\t\t// Key [1] as Uint8Array\n\t\tconst key = new Uint8Array([1]);\n\t\tkvStorage.push({\n\t\t\tkey: bufferToArrayBuffer(key),\n\t\t\tvalue: v1State.persistedData,\n\t\t});\n\t}\n\n\treturn {\n\t\tactorId: v1State.actorId,\n\t\tname: v1State.name,\n\t\tkey: v1State.key,\n\t\tkvStorage,\n\t\tcreatedAt: v1State.createdAt,\n\t};\n};\n\n// Converter from v2 to v3\nconst v2ToV3 = (v2State: v2.ActorState): v3.ActorState => {\n\t// Migrate from v2 to v3 by adding the new optional timestamp fields\n\treturn {\n\t\tactorId: v2State.actorId,\n\t\tname: v2State.name,\n\t\tkey: v2State.key,\n\t\tkvStorage: v2State.kvStorage,\n\t\tcreatedAt: v2State.createdAt,\n\t\tstartTs: null,\n\t\tconnectableTs: null,\n\t\tsleepTs: null,\n\t\tdestroyTs: null,\n\t};\n};\n\n// Converter from v3 to v2\nconst v3ToV2 = (v3State: v3.ActorState): v2.ActorState => {\n\t// Downgrade from v3 to v2 by removing the timestamp fields\n\treturn {\n\t\tactorId: v3State.actorId,\n\t\tname: v3State.name,\n\t\tkey: v3State.key,\n\t\tkvStorage: v3State.kvStorage,\n\t\tcreatedAt: v3State.createdAt,\n\t};\n};\n\n// Converter from v2 to v1\nconst v2ToV1 = (v2State: v2.ActorState): v1.ActorState => {\n\t// Downgrade from v2 to v1 by converting kvStorage back to persistedData\n\t// Find the persist data entry (key [1])\n\tconst persistDataEntry = v2State.kvStorage.find((entry) => {\n\t\tconst key = new Uint8Array(entry.key);\n\t\treturn key.length === 1 && key[0] === 1;\n\t});\n\n\treturn {\n\t\tactorId: v2State.actorId,\n\t\tname: v2State.name,\n\t\tkey: v2State.key,\n\t\tpersistedData: persistDataEntry?.value || new ArrayBuffer(0),\n\t\tcreatedAt: v2State.createdAt,\n\t};\n};\n\nexport const ACTOR_STATE_VERSIONED = createVersionedDataHandler<v3.ActorState>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.decodeActorState(bytes);\n\t\t\tcase 2:\n\t\t\t\treturn v2.decodeActorState(bytes);\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeActorState(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.encodeActorState(data as v1.ActorState);\n\t\t\tcase 2:\n\t\t\t\treturn v2.encodeActorState(data as v2.ActorState);\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeActorState(data as v3.ActorState);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tdeserializeConverters: () => [v1ToV2, v2ToV3],\n\tserializeConverters: () => [v3ToV2, v2ToV1],\n});\n\nexport const ACTOR_ALARM_VERSIONED = createVersionedDataHandler<v3.ActorAlarm>({\n\tdeserializeVersion: (bytes, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.decodeActorAlarm(bytes);\n\t\t\tcase 2:\n\t\t\t\treturn v2.decodeActorAlarm(bytes);\n\t\t\tcase 3:\n\t\t\t\treturn v3.decodeActorAlarm(bytes);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tserializeVersion: (data, version) => {\n\t\tswitch (version) {\n\t\t\tcase 1:\n\t\t\t\treturn v1.encodeActorAlarm(data as v1.ActorAlarm);\n\t\t\tcase 2:\n\t\t\t\treturn v2.encodeActorAlarm(data as v2.ActorAlarm);\n\t\t\tcase 3:\n\t\t\t\treturn v3.encodeActorAlarm(data as v3.ActorAlarm);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown version ${version}`);\n\t\t}\n\t},\n\tdeserializeConverters: () => [],\n\tserializeConverters: () => [],\n});\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type u64 = bigint\nexport type uint = bigint\n\nfunction read0(bc: bare.ByteCursor): readonly string[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [bare.readString(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = bare.readString(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly string[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n bare.writeString(bc, x[i])\n }\n}\n\nexport type ActorState = {\n readonly actorId: string,\n readonly name: string,\n readonly key: readonly string[],\n readonly persistedData: ArrayBuffer,\n readonly createdAt: u64,\n}\n\nexport function readActorState(bc: bare.ByteCursor): ActorState {\n return {\n actorId: bare.readString(bc),\n name: bare.readString(bc),\n key: read0(bc),\n persistedData: bare.readData(bc),\n createdAt: bare.readU64(bc),\n }\n}\n\nexport function writeActorState(bc: bare.ByteCursor, x: ActorState): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.name)\n write0(bc, x.key)\n bare.writeData(bc, x.persistedData)\n bare.writeU64(bc, x.createdAt)\n}\n\nexport function encodeActorState(x: ActorState): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorState(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorState(bytes: Uint8Array): ActorState {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorState(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActorAlarm = {\n readonly actorId: string,\n readonly timestamp: uint,\n}\n\nexport function readActorAlarm(bc: bare.ByteCursor): ActorAlarm {\n return {\n actorId: bare.readString(bc),\n timestamp: bare.readUint(bc),\n }\n}\n\nexport function writeActorAlarm(bc: bare.ByteCursor, x: ActorAlarm): void {\n bare.writeString(bc, x.actorId)\n bare.writeUint(bc, x.timestamp)\n}\n\nexport function encodeActorAlarm(x: ActorAlarm): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorAlarm(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorAlarm(bytes: Uint8Array): ActorAlarm {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorAlarm(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type u64 = bigint\nexport type uint = bigint\n\nexport type ActorKvEntry = {\n readonly key: ArrayBuffer,\n readonly value: ArrayBuffer,\n}\n\nexport function readActorKvEntry(bc: bare.ByteCursor): ActorKvEntry {\n return {\n key: bare.readData(bc),\n value: bare.readData(bc),\n }\n}\n\nexport function writeActorKvEntry(bc: bare.ByteCursor, x: ActorKvEntry): void {\n bare.writeData(bc, x.key)\n bare.writeData(bc, x.value)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly string[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [bare.readString(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = bare.readString(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly string[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n bare.writeString(bc, x[i])\n }\n}\n\nfunction read1(bc: bare.ByteCursor): readonly ActorKvEntry[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readActorKvEntry(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readActorKvEntry(bc)\n }\n return result\n}\n\nfunction write1(bc: bare.ByteCursor, x: readonly ActorKvEntry[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeActorKvEntry(bc, x[i])\n }\n}\n\nexport type ActorState = {\n readonly actorId: string,\n readonly name: string,\n readonly key: readonly string[],\n readonly kvStorage: readonly ActorKvEntry[],\n readonly createdAt: u64,\n}\n\nexport function readActorState(bc: bare.ByteCursor): ActorState {\n return {\n actorId: bare.readString(bc),\n name: bare.readString(bc),\n key: read0(bc),\n kvStorage: read1(bc),\n createdAt: bare.readU64(bc),\n }\n}\n\nexport function writeActorState(bc: bare.ByteCursor, x: ActorState): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.name)\n write0(bc, x.key)\n write1(bc, x.kvStorage)\n bare.writeU64(bc, x.createdAt)\n}\n\nexport function encodeActorState(x: ActorState): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorState(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorState(bytes: Uint8Array): ActorState {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorState(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActorAlarm = {\n readonly actorId: string,\n readonly timestamp: uint,\n}\n\nexport function readActorAlarm(bc: bare.ByteCursor): ActorAlarm {\n return {\n actorId: bare.readString(bc),\n timestamp: bare.readUint(bc),\n }\n}\n\nexport function writeActorAlarm(bc: bare.ByteCursor, x: ActorAlarm): void {\n bare.writeString(bc, x.actorId)\n bare.writeUint(bc, x.timestamp)\n}\n\nexport function encodeActorAlarm(x: ActorAlarm): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorAlarm(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorAlarm(bytes: Uint8Array): ActorAlarm {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorAlarm(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","// @generated - post-processed by compile-bare.ts\nimport * as bare from \"@rivetkit/bare-ts\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type u64 = bigint\nexport type uint = bigint\n\nexport type ActorKvEntry = {\n readonly key: ArrayBuffer,\n readonly value: ArrayBuffer,\n}\n\nexport function readActorKvEntry(bc: bare.ByteCursor): ActorKvEntry {\n return {\n key: bare.readData(bc),\n value: bare.readData(bc),\n }\n}\n\nexport function writeActorKvEntry(bc: bare.ByteCursor, x: ActorKvEntry): void {\n bare.writeData(bc, x.key)\n bare.writeData(bc, x.value)\n}\n\nfunction read0(bc: bare.ByteCursor): readonly string[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [bare.readString(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = bare.readString(bc)\n }\n return result\n}\n\nfunction write0(bc: bare.ByteCursor, x: readonly string[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n bare.writeString(bc, x[i])\n }\n}\n\nfunction read1(bc: bare.ByteCursor): readonly ActorKvEntry[] {\n const len = bare.readUintSafe(bc)\n if (len === 0) { return [] }\n const result = [readActorKvEntry(bc)]\n for (let i = 1; i < len; i++) {\n result[i] = readActorKvEntry(bc)\n }\n return result\n}\n\nfunction write1(bc: bare.ByteCursor, x: readonly ActorKvEntry[]): void {\n bare.writeUintSafe(bc, x.length)\n for (let i = 0; i < x.length; i++) {\n writeActorKvEntry(bc, x[i])\n }\n}\n\nfunction read2(bc: bare.ByteCursor): u64 | null {\n return bare.readBool(bc)\n ? bare.readU64(bc)\n : null\n}\n\nfunction write2(bc: bare.ByteCursor, x: u64 | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeU64(bc, x)\n }\n}\n\nexport type ActorState = {\n readonly actorId: string,\n readonly name: string,\n readonly key: readonly string[],\n readonly kvStorage: readonly ActorKvEntry[],\n readonly createdAt: u64,\n readonly startTs: u64 | null,\n readonly connectableTs: u64 | null,\n readonly sleepTs: u64 | null,\n readonly destroyTs: u64 | null,\n}\n\nexport function readActorState(bc: bare.ByteCursor): ActorState {\n return {\n actorId: bare.readString(bc),\n name: bare.readString(bc),\n key: read0(bc),\n kvStorage: read1(bc),\n createdAt: bare.readU64(bc),\n startTs: read2(bc),\n connectableTs: read2(bc),\n sleepTs: read2(bc),\n destroyTs: read2(bc),\n }\n}\n\nexport function writeActorState(bc: bare.ByteCursor, x: ActorState): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.name)\n write0(bc, x.key)\n write1(bc, x.kvStorage)\n bare.writeU64(bc, x.createdAt)\n write2(bc, x.startTs)\n write2(bc, x.connectableTs)\n write2(bc, x.sleepTs)\n write2(bc, x.destroyTs)\n}\n\nexport function encodeActorState(x: ActorState): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorState(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorState(bytes: Uint8Array): ActorState {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorState(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActorAlarm = {\n readonly actorId: string,\n readonly timestamp: uint,\n}\n\nexport function readActorAlarm(bc: bare.ByteCursor): ActorAlarm {\n return {\n actorId: bare.readString(bc),\n timestamp: bare.readUint(bc),\n }\n}\n\nexport function writeActorAlarm(bc: bare.ByteCursor, x: ActorAlarm): void {\n bare.writeString(bc, x.actorId)\n bare.writeUint(bc, x.timestamp)\n}\n\nexport function encodeActorAlarm(x: ActorAlarm): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeActorAlarm(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeActorAlarm(bytes: Uint8Array): ActorAlarm {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readActorAlarm(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\n\nfunction assert(condition: boolean, message?: string): asserts condition {\n if (!condition) throw new Error(message ?? \"Assertion failed\")\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"driver-fs\");\n}\n","import type { ActorKey } from \"@/actor/mod\";\nimport {\n\tgetNodeCrypto,\n\tgetNodeFs,\n\tgetNodeFsSync,\n\tgetNodeOs,\n\tgetNodePath,\n} from \"@/utils/node\";\n\n/**\n * Generate a deterministic actor ID from name and key\n */\nexport function generateActorId(name: string, key: ActorKey): string {\n\t// Generate deterministic key string\n\tconst jsonString = JSON.stringify([name, key]);\n\n\t// Hash to ensure safe file system names\n\tconst crypto = getNodeCrypto();\n\tconst hash = crypto\n\t\t.createHash(\"sha256\")\n\t\t.update(jsonString)\n\t\t.digest(\"hex\")\n\t\t.substring(0, 16);\n\n\treturn hash;\n}\n\n/**\n * Create a hash for a path, normalizing it first\n */\nfunction createHashForPath(dirPath: string): string {\n\tconst path = getNodePath();\n\t// Normalize the path first\n\tconst normalizedPath = path.normalize(dirPath);\n\n\t// Extract the last path component for readability\n\tconst lastComponent = path.basename(normalizedPath);\n\n\t// Create SHA-256 hash\n\tconst crypto = getNodeCrypto();\n\tconst hash = crypto\n\t\t.createHash(\"sha256\")\n\t\t.update(normalizedPath)\n\t\t.digest(\"hex\")\n\t\t.substring(0, 8); // Take first 8 characters for brevity\n\n\treturn `${lastComponent}-${hash}`;\n}\n\n/**\n * Get the storage path for the current working directory or a specified path\n */\nexport function getStoragePath(): string {\n\tconst dataPath = getDataPath(\"rivetkit\");\n\tconst dirHash = createHashForPath(process.cwd());\n\tconst path = getNodePath();\n\treturn path.join(dataPath, dirHash);\n}\n\n/**\n * Check if a path exists\n */\nexport async function pathExists(path: string): Promise<boolean> {\n\ttry {\n\t\tconst fs = getNodeFs();\n\t\tawait fs.access(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Ensure a directory exists, creating it if necessary\n */\nexport async function ensureDirectoryExists(\n\tdirectoryPath: string,\n): Promise<void> {\n\tif (!(await pathExists(directoryPath))) {\n\t\tconst fs = getNodeFs();\n\t\tawait fs.mkdir(directoryPath, { recursive: true });\n\t}\n}\n\n/**\n * Ensure a directory exists synchronously - only used during initialization\n * All other operations use the async version\n */\nexport function ensureDirectoryExistsSync(directoryPath: string): void {\n\tconst fsSync = getNodeFsSync();\n\tif (!fsSync.existsSync(directoryPath)) {\n\t\tfsSync.mkdirSync(directoryPath, { recursive: true });\n\t}\n}\n\n/**\n * Returns platform-specific data directory\n */\nfunction getDataPath(appName: string): string {\n\tconst platform = process.platform;\n\tconst os = getNodeOs();\n\tconst homeDir = os.homedir();\n\tconst path = getNodePath();\n\n\tswitch (platform) {\n\t\tcase \"win32\":\n\t\t\treturn path.join(\n\t\t\t\tprocess.env.APPDATA || path.join(homeDir, \"AppData\", \"Roaming\"),\n\t\t\t\tappName,\n\t\t\t);\n\t\tcase \"darwin\":\n\t\t\treturn path.join(\n\t\t\t\thomeDir,\n\t\t\t\t\"Library\",\n\t\t\t\t\"Application Support\",\n\t\t\t\tappName,\n\t\t\t);\n\t\tdefault: // linux and others\n\t\t\treturn path.join(\n\t\t\t\tprocess.env.XDG_DATA_HOME ||\n\t\t\t\t\tpath.join(homeDir, \".local\", \"share\"),\n\t\t\t\tappName,\n\t\t\t);\n\t}\n}\n","import { getRequireFn } from \"@/utils/node\";\n\ntype SqliteRuntimeKind = \"bun\" | \"node\" | \"better-sqlite3\";\ntype SqliteDatabaseCtor = new (path: string) => SqliteRawDatabase;\n\ninterface SqliteStatement {\n\trun(...params: unknown[]): unknown;\n\tget<T = Record<string, unknown>>(...params: unknown[]): T | undefined;\n\tall<T = Record<string, unknown>>(...params: unknown[]): T[];\n}\n\ninterface SqliteRawDatabase {\n\texec(sql: string): unknown;\n\tclose(): unknown;\n\tprepare?(sql: string): SqliteStatement;\n\tquery?(sql: string): SqliteStatement;\n}\n\nexport interface SqliteRuntimeDatabase {\n\texec(sql: string): void;\n\trun(sql: string, params?: readonly unknown[]): void;\n\tget<T = Record<string, unknown>>(\n\t\tsql: string,\n\t\tparams?: readonly unknown[],\n\t): T | undefined;\n\tall<T = Record<string, unknown>>(\n\t\tsql: string,\n\t\tparams?: readonly unknown[],\n\t): T[];\n\tclose(): void;\n}\n\nexport interface SqliteRuntime {\n\tkind: SqliteRuntimeKind;\n\topen(path: string): SqliteRuntimeDatabase;\n}\n\nfunction normalizeParams(params: readonly unknown[] | undefined): unknown[] {\n\tif (!params || params.length === 0) {\n\t\treturn [];\n\t}\n\n\treturn params.map((value) => {\n\t\tif (value instanceof Uint8Array) {\n\t\t\treturn Buffer.from(value);\n\t\t}\n\t\treturn value;\n\t});\n}\n\nfunction createPreparedDatabaseAdapter(\n\trawDb: SqliteRawDatabase,\n\tprepare: (sql: string) => SqliteStatement,\n): SqliteRuntimeDatabase {\n\treturn {\n\t\texec: (sql) => {\n\t\t\trawDb.exec(sql);\n\t\t},\n\t\trun: (sql, params) => {\n\t\t\tconst stmt = prepare(sql);\n\t\t\tstmt.run(...normalizeParams(params));\n\t\t},\n\t\tget: <T = Record<string, unknown>>(\n\t\t\tsql: string,\n\t\t\tparams?: readonly unknown[],\n\t\t) => {\n\t\t\tconst stmt = prepare(sql);\n\t\t\treturn stmt.get<T>(...normalizeParams(params));\n\t\t},\n\t\tall: <T = Record<string, unknown>>(\n\t\t\tsql: string,\n\t\t\tparams?: readonly unknown[],\n\t\t) => {\n\t\t\tconst stmt = prepare(sql);\n\t\t\treturn stmt.all<T>(...normalizeParams(params));\n\t\t},\n\t\tclose: () => {\n\t\t\trawDb.close();\n\t\t},\n\t};\n}\n\nfunction configureSqliteRuntimeDatabase(\n\trawDb: SqliteRawDatabase,\n\tpath: string,\n): void {\n\t// Wait briefly when the database file is still being released by another\n\t// process during restarts to reduce transient \"database is locked\" failures.\n\trawDb.exec(\"PRAGMA busy_timeout = 5000\");\n\n\t// WAL improves concurrent read/write behavior for file-backed databases.\n\tif (path !== \":memory:\") {\n\t\trawDb.exec(\"PRAGMA journal_mode = WAL\");\n\t}\n}\n\nexport function loadSqliteRuntime(): SqliteRuntime {\n\tconst requireFn = getRequireFn();\n\tconst loadErrors: string[] = [];\n\n\ttry {\n\t\tconst bunSqlite = requireFn(/* webpackIgnore: true */ \"bun:sqlite\") as {\n\t\t\tDatabase?: SqliteDatabaseCtor;\n\t\t};\n\t\tconst BunDatabase = bunSqlite.Database;\n\t\tif (BunDatabase) {\n\t\t\treturn {\n\t\t\t\tkind: \"bun\",\n\t\t\t\topen: (path) => {\n\t\t\t\t\tconst rawDb = new BunDatabase(path);\n\t\t\t\t\tconfigureSqliteRuntimeDatabase(rawDb, path);\n\t\t\t\t\tconst query = rawDb.query?.bind(rawDb);\n\t\t\t\t\tif (!query)\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"bun:sqlite database missing query method\",\n\t\t\t\t\t\t);\n\t\t\t\t\treturn createPreparedDatabaseAdapter(rawDb, query);\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tloadErrors.push(`bun:sqlite unavailable: ${String(error)}`);\n\t}\n\n\ttry {\n\t\tconst nodeSqlite = requireFn(\n\t\t\t/* webpackIgnore: true */ \"node:sqlite\",\n\t\t) as {\n\t\t\tDatabaseSync?: SqliteDatabaseCtor;\n\t\t};\n\t\tconst NodeDatabaseSync = nodeSqlite.DatabaseSync;\n\t\tif (NodeDatabaseSync) {\n\t\t\treturn {\n\t\t\t\tkind: \"node\",\n\t\t\t\topen: (path) => {\n\t\t\t\t\tconst rawDb = new NodeDatabaseSync(path);\n\t\t\t\t\tconfigureSqliteRuntimeDatabase(rawDb, path);\n\t\t\t\t\tconst prepare = rawDb.prepare?.bind(rawDb);\n\t\t\t\t\tif (!prepare) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"node:sqlite DatabaseSync missing prepare method\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn createPreparedDatabaseAdapter(rawDb, prepare);\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tloadErrors.push(`node:sqlite unavailable: ${String(error)}`);\n\t}\n\n\ttry {\n\t\tconst betterSqlite3Module = requireFn(\n\t\t\t/* webpackIgnore: true */ \"better-sqlite3\",\n\t\t) as SqliteDatabaseCtor | { default?: SqliteDatabaseCtor };\n\t\tconst BetterSqlite3 =\n\t\t\ttypeof betterSqlite3Module === \"function\"\n\t\t\t\t? betterSqlite3Module\n\t\t\t\t: betterSqlite3Module.default;\n\t\tif (BetterSqlite3) {\n\t\t\treturn {\n\t\t\t\tkind: \"better-sqlite3\",\n\t\t\t\topen: (path) => {\n\t\t\t\t\tconst rawDb = new BetterSqlite3(path);\n\t\t\t\t\tconfigureSqliteRuntimeDatabase(rawDb, path);\n\t\t\t\t\tconst prepare = rawDb.prepare?.bind(rawDb);\n\t\t\t\t\tif (!prepare) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"better-sqlite3 database missing prepare method\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn createPreparedDatabaseAdapter(rawDb, prepare);\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tloadErrors.push(`better-sqlite3 unavailable: ${String(error)}`);\n\t\tthrow new Error(\n\t\t\t`No SQLite runtime available. Tried bun:sqlite, node:sqlite, and better-sqlite3. Install better-sqlite3 (e.g. \"pnpm add better-sqlite3\") if native runtimes are unavailable.\\n${loadErrors.join(\"\\n\")}`,\n\t\t);\n\t}\n\n\tthrow new Error(\n\t\t`No SQLite runtime available. Tried bun:sqlite, node:sqlite, and better-sqlite3.\\n${loadErrors.join(\"\\n\")}`,\n\t);\n}\n\nexport function computePrefixUpperBound(\n\tprefix: Uint8Array,\n): Uint8Array | undefined {\n\tif (prefix.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst upperBound = new Uint8Array(prefix);\n\tfor (let i = upperBound.length - 1; i >= 0; i--) {\n\t\tif (upperBound[i] !== 0xff) {\n\t\t\tupperBound[i] += 1;\n\t\t\treturn upperBound.slice(0, i + 1);\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function ensureUint8Array(\n\tvalue: unknown,\n\tfieldName: string,\n): Uint8Array {\n\tif (value instanceof Uint8Array) {\n\t\treturn value;\n\t}\n\tif (value instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(value);\n\t}\n\tif (ArrayBuffer.isView(value)) {\n\t\treturn new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n\t}\n\tthrow new Error(`SQLite row field \"${fieldName}\" is not binary data`);\n}\n","import type { SqliteRuntimeDatabase } from \"./sqlite-runtime\";\n\n// Keep these limits in sync with engine/packages/pegboard/src/actor_kv/mod.rs.\nconst KV_MAX_KEY_SIZE = 2 * 1024;\nconst KV_MAX_VALUE_SIZE = 128 * 1024;\nconst KV_MAX_KEYS = 128;\nconst KV_MAX_PUT_PAYLOAD_SIZE = 976 * 1024;\nconst KV_MAX_STORAGE_SIZE = 10 * 1024 * 1024 * 1024;\nconst KV_KEY_WRAPPER_OVERHEAD_SIZE = 2;\n\nexport function estimateKvSize(db: SqliteRuntimeDatabase): number {\n\tconst row = db.get<{ total: number | bigint | null }>(\n\t\t\"SELECT COALESCE(SUM(LENGTH(key) + LENGTH(value)), 0) AS total FROM kv\",\n\t);\n\treturn row ? Number(row.total ?? 0) : 0;\n}\n\nexport function validateKvKey(\n\tkey: Uint8Array,\n\tkeyLabel: \"key\" | \"prefix key\" | \"start key\" | \"end key\" = \"key\",\n): void {\n\tif (key.byteLength + KV_KEY_WRAPPER_OVERHEAD_SIZE > KV_MAX_KEY_SIZE) {\n\t\tthrow new Error(`${keyLabel} is too long (max 2048 bytes)`);\n\t}\n}\n\nexport function validateKvKeys(keys: Uint8Array[]): void {\n\tif (keys.length > KV_MAX_KEYS) {\n\t\tthrow new Error(\"a maximum of 128 keys is allowed\");\n\t}\n\n\tfor (const key of keys) {\n\t\tvalidateKvKey(key);\n\t}\n}\n\nexport function validateKvEntries(\n\tentries: [Uint8Array, Uint8Array][],\n\ttotalSize: number,\n): void {\n\tif (entries.length > KV_MAX_KEYS) {\n\t\tthrow new Error(\"A maximum of 128 key-value entries is allowed\");\n\t}\n\n\tlet payloadSize = 0;\n\tfor (const [key, value] of entries) {\n\t\tpayloadSize +=\n\t\t\tkey.byteLength + KV_KEY_WRAPPER_OVERHEAD_SIZE + value.byteLength;\n\t}\n\n\tif (payloadSize > KV_MAX_PUT_PAYLOAD_SIZE) {\n\t\tthrow new Error(\"total payload is too large (max 976 KiB)\");\n\t}\n\n\tconst storageRemaining = Math.max(0, KV_MAX_STORAGE_SIZE - totalSize);\n\tif (payloadSize > storageRemaining) {\n\t\tthrow new Error(\n\t\t\t`not enough space left in storage (${storageRemaining} bytes remaining, current payload is ${payloadSize} bytes)`,\n\t\t);\n\t}\n\n\tfor (const [key, value] of entries) {\n\t\tvalidateKvKey(key);\n\t\tif (value.byteLength > KV_MAX_VALUE_SIZE) {\n\t\t\tthrow new Error(\n\t\t\t\t`value is too large (max ${KV_MAX_VALUE_SIZE / 1024} KiB)`,\n\t\t\t);\n\t\t}\n\t}\n}\n","import type { Context as HonoContext } from \"hono\";\nimport invariant from \"invariant\";\nimport { ActorStopping } from \"@/actor/errors\";\nimport { type ActorRouter, createActorRouter } from \"@/actor/router\";\nimport { routeWebSocket } from \"@/actor/router-websocket-endpoints\";\nimport { createClientWithDriver } from \"@/client/client\";\nimport { ClientConfigSchema } from \"@/client/config\";\nimport { createInlineWebSocket } from \"@/common/inline-websocket-adapter\";\nimport { noopNext } from \"@/common/utils\";\nimport type {\n\tActorDriver,\n\tActorOutput,\n\tCreateInput,\n\tGetForIdInput,\n\tGetOrCreateWithKeyInput,\n\tGetWithKeyInput,\n\tListActorsInput,\n\tManagerDriver,\n} from \"@/driver-helpers/mod\";\nimport type { ManagerDisplayInformation } from \"@/manager/driver\";\nimport type { Encoding, UniversalWebSocket } from \"@/mod\";\nimport type { DriverConfig, RegistryConfig } from \"@/registry/config\";\nimport type * as schema from \"@/schemas/file-system-driver/mod\";\nimport type { GetUpgradeWebSocket } from \"@/utils\";\nimport type { FileSystemGlobalState } from \"./global-state\";\nimport { logger } from \"./log\";\nimport { generateActorId } from \"./utils\";\n\nexport class FileSystemManagerDriver implements ManagerDriver {\n\t#config: RegistryConfig;\n\t#state: FileSystemGlobalState;\n\t#driverConfig: DriverConfig;\n\t#getUpgradeWebSocket: GetUpgradeWebSocket | undefined;\n\n\t#actorDriver: ActorDriver;\n\t#actorRouter: ActorRouter;\n\n\tconstructor(\n\t\tconfig: RegistryConfig,\n\t\tstate: FileSystemGlobalState,\n\t\tdriverConfig: DriverConfig,\n\t) {\n\t\tthis.#config = config;\n\t\tthis.#state = state;\n\t\tthis.#driverConfig = driverConfig;\n\n\t\t// Actors run on the same node as the manager, so we create a dummy actor router that we route requests to\n\t\tconst inlineClient = createClientWithDriver(this);\n\n\t\tthis.#actorDriver = this.#driverConfig.actor(\n\t\t\tconfig,\n\t\t\tthis,\n\t\t\tinlineClient,\n\t\t);\n\t\tthis.#actorRouter = createActorRouter(\n\t\t\tthis.#config,\n\t\t\tthis.#actorDriver,\n\t\t\tundefined,\n\t\t\tconfig.test.enabled,\n\t\t);\n\t}\n\n\tasync sendRequest(\n\t\tactorId: string,\n\t\tactorRequest: Request,\n\t): Promise<Response> {\n\t\treturn await this.#actorRouter.fetch(actorRequest, {\n\t\t\tactorId,\n\t\t});\n\t}\n\n\tasync openWebSocket(\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<UniversalWebSocket> {\n\t\t// Normalize the path (add leading slash if needed) but preserve query params\n\t\tconst normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n\n\t\t// Create a fake request with the full URL including query parameters\n\t\tconst fakeUrl = `http://inline-actor${normalizedPath}`;\n\t\tconst fakeRequest = new Request(fakeUrl, {\n\t\t\tmethod: \"GET\",\n\t\t});\n\n\t\t// Extract just the pathname for routing (without query params)\n\t\tconst pathOnly = normalizedPath.split(\"?\")[0];\n\t\tconst { gatewayId, requestId } = createHibernatableRequestMetadata();\n\n\t\tconst wsHandler = await routeWebSocket(\n\t\t\tfakeRequest,\n\t\t\tpathOnly,\n\t\t\t{},\n\t\t\tthis.#config,\n\t\t\tthis.#actorDriver,\n\t\t\tactorId,\n\t\t\tencoding,\n\t\t\tparams,\n\t\t\tgatewayId,\n\t\t\trequestId,\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t);\n\t\treturn createInlineWebSocket(wsHandler);\n\t}\n\n\tasync proxyRequest(\n\t\tc: HonoContext,\n\t\tactorRequest: Request,\n\t\tactorId: string,\n\t): Promise<Response> {\n\t\treturn await this.#actorRouter.fetch(actorRequest, {\n\t\t\tactorId,\n\t\t});\n\t}\n\n\tasync proxyWebSocket(\n\t\tc: HonoContext,\n\t\tpath: string,\n\t\tactorId: string,\n\t\tencoding: Encoding,\n\t\tparams: unknown,\n\t): Promise<Response> {\n\t\tconst upgradeWebSocket = this.#getUpgradeWebSocket?.();\n\t\tinvariant(upgradeWebSocket, \"missing getUpgradeWebSocket\");\n\n\t\t// Handle raw WebSocket paths\n\t\tconst pathOnly = path.split(\"?\")[0];\n\t\tconst normalizedPath = pathOnly.startsWith(\"/\")\n\t\t\t? pathOnly\n\t\t\t: `/${pathOnly}`;\n\t\tconst { gatewayId, requestId } = createHibernatableRequestMetadata();\n\t\tconst wsHandler = await routeWebSocket(\n\t\t\t// TODO: Create new request with new path\n\t\t\tc.req.raw,\n\t\t\tnormalizedPath,\n\t\t\tc.req.header(),\n\t\t\tthis.#config,\n\t\t\tthis.#actorDriver,\n\t\t\tactorId,\n\t\t\tencoding,\n\t\t\tparams,\n\t\t\tgatewayId,\n\t\t\trequestId,\n\t\t\ttrue,\n\t\t\tfalse,\n\t\t);\n\t\treturn upgradeWebSocket(() => wsHandler)(c, noopNext());\n\t}\n\n\tasync buildGatewayUrl(actorId: string): Promise<string> {\n\t\tconst port = this.#config.managerPort ?? 6420;\n\t\treturn `http://127.0.0.1:${port}/gateway/${encodeURIComponent(actorId)}`;\n\t}\n\n\tasync getForId({\n\t\tactorId,\n\t}: GetForIdInput): Promise<ActorOutput | undefined> {\n\t\t// Validate the actor exists\n\t\tconst actor = await this.#state.loadActor(actorId);\n\t\tif (!actor.state) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this.#state.isActorStopping(actorId)) {\n\t\t\tthrow new ActorStopping(actorId);\n\t\t}\n\n\t\treturn actorStateToOutput(actor.state);\n\t}\n\n\tasync getWithKey({\n\t\tname,\n\t\tkey,\n\t}: GetWithKeyInput): Promise<ActorOutput | undefined> {\n\t\t// Generate the deterministic actor ID\n\t\tconst actorId = generateActorId(name, key);\n\n\t\t// Check if actor exists\n\t\tconst actor = await this.#state.loadActor(actorId);\n\t\tif (actor.state) {\n\t\t\treturn actorStateToOutput(actor.state);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tasync getOrCreateWithKey(\n\t\tinput: GetOrCreateWithKeyInput,\n\t): Promise<ActorOutput> {\n\t\t// Generate the deterministic actor ID\n\t\tconst actorId = generateActorId(input.name, input.key);\n\n\t\t// Use the atomic getOrCreateActor method\n\t\tawait this.#state.loadOrCreateActor(\n\t\t\tactorId,\n\t\t\tinput.name,\n\t\t\tinput.key,\n\t\t\tinput.input,\n\t\t);\n\n\t\t// Start the actor immediately so timestamps are set\n\t\tawait this.#actorDriver.loadActor(actorId);\n\n\t\t// Reload state to get updated timestamps\n\t\tconst state = await this.#state.loadActorStateOrError(actorId);\n\t\treturn actorStateToOutput(state);\n\t}\n\n\tasync createActor({ name, key, input }: CreateInput): Promise<ActorOutput> {\n\t\t// Generate the deterministic actor ID\n\t\tconst actorId = generateActorId(name, key);\n\n\t\tawait this.#state.createActor(actorId, name, key, input);\n\n\t\t// Start the actor immediately so timestamps are set\n\t\tawait this.#actorDriver.loadActor(actorId);\n\n\t\t// Reload state to get updated timestamps\n\t\tconst state = await this.#state.loadActorStateOrError(actorId);\n\t\treturn actorStateToOutput(state);\n\t}\n\n\tasync listActors({ name }: ListActorsInput): Promise<ActorOutput[]> {\n\t\tconst actors: ActorOutput[] = [];\n\t\tconst itr = this.#state.getActorsIterator({});\n\n\t\tfor await (const actor of itr) {\n\t\t\tif (actor.name === name) {\n\t\t\t\tactors.push(actorStateToOutput(actor));\n\t\t\t}\n\t\t}\n\n\t\t// Sort by create ts desc (most recent first)\n\t\tactors.sort((a, b) => {\n\t\t\tconst aTs = a.createTs ?? 0;\n\t\t\tconst bTs = b.createTs ?? 0;\n\t\t\treturn bTs - aTs;\n\t\t});\n\n\t\treturn actors;\n\t}\n\n\tasync kvGet(actorId: string, key: Uint8Array): Promise<string | null> {\n\t\tconst response = await this.#state.kvBatchGet(actorId, [key]);\n\t\treturn response[0] !== null\n\t\t\t? new TextDecoder().decode(response[0])\n\t\t\t: null;\n\t}\n\n\tdisplayInformation(): ManagerDisplayInformation {\n\t\treturn {\n\t\t\tproperties: {\n\t\t\t\t...(this.#state.persist\n\t\t\t\t\t? { Data: this.#state.storagePath }\n\t\t\t\t\t: {}),\n\t\t\t\tInstances: this.#state.actorCountOnStartup.toString(),\n\t\t\t},\n\t\t};\n\t}\n\n\textraStartupLog() {\n\t\treturn {\n\t\t\tinstances: this.#state.actorCountOnStartup,\n\t\t\tdata: this.#state.storagePath,\n\t\t};\n\t}\n\n\tsetGetUpgradeWebSocket(getUpgradeWebSocket: GetUpgradeWebSocket): void {\n\t\tthis.#getUpgradeWebSocket = getUpgradeWebSocket;\n\t}\n}\n\nfunction actorStateToOutput(state: schema.ActorState): ActorOutput {\n\treturn {\n\t\tactorId: state.actorId,\n\t\tname: state.name,\n\t\tkey: state.key as string[],\n\t\tcreateTs: Number(state.createdAt),\n\t\tstartTs: state.startTs !== null ? Number(state.startTs) : null,\n\t\tconnectableTs:\n\t\t\tstate.connectableTs !== null ? Number(state.connectableTs) : null,\n\t\tsleepTs: state.sleepTs !== null ? Number(state.sleepTs) : null,\n\t\tdestroyTs: state.destroyTs !== null ? Number(state.destroyTs) : null,\n\t};\n}\n\nfunction createHibernatableRequestMetadata(): {\n\tgatewayId: ArrayBuffer;\n\trequestId: ArrayBuffer;\n} {\n\tconst gatewayId = new Uint8Array(4);\n\tconst requestId = new Uint8Array(4);\n\tcrypto.getRandomValues(gatewayId);\n\tcrypto.getRandomValues(requestId);\n\treturn {\n\t\tgatewayId: gatewayId.buffer.slice(0),\n\t\trequestId: requestId.buffer.slice(0),\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,iBAAiB;AAG1B,SAAS,wBAAwB;AAGjC,SAAS,SAAS;AACjB,SAAO,UAAU,0BAA0B;AAC5C;AASO,IAAM,yBAAN,MAA6B;AAAA,EACnC;AAAA,EACA;AAAA,EACA,cAA6B;AAAA,EAE7B;AAAA,EACA;AAAA,EAEA,YAAY,SAA+B;AAC1C,SAAK,WAAW;AAKhB,SAAK,YAAY,IAAI,iBAAiB;AAAA,MACrC,eAAe,MAAM,KAAK;AAAA,MAC1B,QAAQ,CAAC,SAAS;AACjB,YAAI;AAEH,eAAK,SAAS,UAAU,EAAE,KAAK,GAAG,KAAK,UAAU;AAEjD,eAAK,SAAS,eAAe,IAAI;AAAA,QAClC,SAAS,KAAK;AACb,eAAK,aAAa,GAAG;AACrB,eAAK,OAAO,MAAM,mCAAmC;AAAA,QACtD;AAAA,MACD;AAAA,MACA,SAAS,CAAC,MAAM,WAAW,KAAK,OAAO,MAAM,MAAM;AAAA,IACpD,CAAC;AAED,SAAK,WAAW,IAAI,iBAAiB;AAAA,MACpC,eAAe,MAAM,KAAK;AAAA,MAC1B,QAAQ,CAAC,SAAS,KAAK,UAAU,eAAe,IAAI;AAAA,MACpD,SAAS,CAAC,MAAM,WAAW,KAAK,OAAO,MAAM,MAAM;AAAA,IACpD,CAAC;AAGD,SAAK,aAAa,IAAI,UAAU;AAAA,MAC/B,KAAK,KAAK;AAAA,MACV,MAAM,CAAC,SAA4C;AAClD,eAAO,EAAE,MAAM,EAAE,KAAK,wBAAwB,CAAC;AAC/C,aAAK,UAAU,eAAe,IAAI;AAAA,MACnC;AAAA,MACA,OAAO,CAAC,MAAe,WAAoB;AAC1C,eAAO,EAAE,MAAM,EAAE,KAAK,0BAA0B,MAAM,OAAO,CAAC;AAC9D,aAAK,OAAO,QAAQ,KAAM,UAAU,EAAE;AAAA,MACvC;AAAA,MACA,YAAY;AAAA,IACb,CAAC;AAGD,eAAW,MAAM;AAChB,WAAK,YAAY;AAAA,IAClB,GAAG,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,IAAI,kBAAsC;AACzC,WAAO,KAAK;AAAA,EACb;AAAA;AAAA,EAGA,IAAI,iBAAqC;AACxC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,cAA6B;AAClC,QAAI;AACH,aAAO,EAAE,MAAM,EAAE,KAAK,yBAAyB,CAAC;AAEhD,WAAK,cAAc;AAEnB,aAAO,EAAE,MAAM,EAAE,KAAK,wCAAwC,CAAC;AAC/D,WAAK,SAAS,OAAO,QAAW,KAAK,UAAU;AAG/C,WAAK,UAAU,YAAY;AAC3B,WAAK,SAAS,YAAY;AAAA,IAC3B,SAAS,KAAK;AACb,WAAK,aAAa,GAAG;AACrB,WAAK,OAAO,MAAM,sCAAsC;AAAA,IACzD;AAAA,EACD;AAAA,EAEA,aAAa,KAAoB;AAChC,WAAO,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,OAAO;AAAA,MACP,cAAc,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC7D,OAAO,eAAe,QAAQ,IAAI,QAAQ;AAAA,IAC3C,CAAC;AAGD,QAAI;AACH,WAAK,SAAS,QAAQ,KAAK,KAAK,UAAU;AAAA,IAC3C,SAAS,YAAY;AACpB,aAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,OAAO;AAAA,MACR,CAAC;AAAA,IACF;AAGA,SAAK,UAAU,aAAa,GAAG;AAC/B,SAAK,SAAS,aAAa,GAAG;AAAA,EAC/B;AAAA,EAEA,OAAO,MAAc,QAAsB;AAC1C,QAAI,KAAK,gBAAgB,KAAK,KAAK,gBAAgB,GAAG;AACrD;AAAA,IACD;AAEA,WAAO,EAAE,MAAM,EAAE,KAAK,qBAAqB,MAAM,OAAO,CAAC;AAEzD,SAAK,cAAc;AAEnB,QAAI;AACH,WAAK,SAAS;AAAA,QACb,EAAE,MAAM,QAAQ,UAAU,KAAK;AAAA,QAC/B,KAAK;AAAA,MACN;AAAA,IACD,SAAS,KAAK;AACb,aAAO,EAAE,MAAM,EAAE,KAAK,2BAA2B,OAAO,IAAI,CAAC;AAAA,IAC9D,UAAE;AACD,WAAK,cAAc;AAGnB,WAAK,UAAU,aAAa,MAAM,MAAM;AACxC,WAAK,SAAS,aAAa,MAAM,MAAM;AAAA,IACxC;AAAA,EACD;AACD;AAMO,SAAS,sBACf,SACqB;AACrB,QAAM,UAAU,IAAI,uBAAuB,OAAO;AAClD,SAAO,QAAQ;AAChB;;;AC/JA,SAAS,SAAS;;;ACiBX,IAAM,wBAAN,MAAmD;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACCA,SACA,eACA,cACA,OACC;AACD,SAAK,UAAUA;AACf,SAAK,iBAAiB;AACtB,SAAK,gBAAgB;AACrB,SAAK,SAAS;AACd,SAAK,cAAc,IAAI,qBAAqBA,OAAM;AAElD,QAAI,KAAK,OAAO,SAAS;AAGxB,WAAK,aAAa,CAAC,YAAoB;AAEtC,aAAK,OAAO,WAAW,OAAO;AAAA,MAC/B;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,UAAU,SAA4C;AAC3D,WAAO,KAAK,OAAO;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAsB;AACzB,WAAO,KAAK,OAAO;AAAA,EACpB;AAAA,EAEA,WAAW,UAAsC;AAChD,WAAO,CAAC;AAAA,EACT;AAAA,EAEA,MAAM,WACL,SACA,SACgB;AAChB,UAAM,KAAK,OAAO,WAAW,SAAS,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,WACL,SACA,MACiC;AACjC,WAAO,MAAM,KAAK,OAAO,WAAW,SAAS,IAAI;AAAA,EAClD;AAAA,EAEA,MAAM,cAAc,SAAiB,MAAmC;AACvE,UAAM,KAAK,OAAO,cAAc,SAAS,IAAI;AAAA,EAC9C;AAAA,EAEA,MAAM,cACL,SACA,OACA,KACgB;AAChB,UAAM,KAAK,OAAO,cAAc,SAAS,OAAO,GAAG;AAAA,EACpD;AAAA,EAEA,MAAM,aACL,SACA,QACA,SAIsC;AACtC,WAAO,MAAM,KAAK,OAAO,aAAa,SAAS,QAAQ,OAAO;AAAA,EAC/D;AAAA,EAEA,MAAM,YACL,SACA,OACA,KACA,SAIsC;AACtC,WAAO,MAAM,KAAK,OAAO,YAAY,SAAS,OAAO,KAAK,OAAO;AAAA,EAClE;AAAA,EAEA,MAAM,SAAS,OAAyB,WAAkC;AACzE,UAAM,KAAK,OAAO,cAAc,MAAM,IAAI,SAAS;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,gBAAgB,SAAsC;AAC3D,WAAO,MAAM,KAAK,YAAY,QAAQ,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,eAAe,YAAoC;AACxD,UAAM,KAAK,YAAY,SAAS;AAAA,EACjC;AAAA,EAEA,MAAM,aAAa,SAAgC;AAClD,UAAM,KAAK,OAAO,aAAa,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,mBAAmB,OAAwC;AAChE,UAAM,MAAM,4BAA4B,0BAA0B;AAAA,EACnE;AACD;;;ACxIA,OAAO,eAAe;;;ACAtB,SAAS,kCAAkC;;;ACC3C,YAAY,UAAU;AAEtB,IAAM,SAAyB,gBAAK,YAAO,CAAC,CAAC;AAK7C,SAAS,MAAM,IAAwC;AACnD,QAAM,MAAW,kBAAa,EAAE;AAChC,MAAI,QAAQ,GAAG;AAAE,WAAO,CAAC;AAAA,EAAE;AAC3B,QAAM,SAAS,CAAM,gBAAW,EAAE,CAAC;AACnC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC1B,WAAO,CAAC,IAAS,gBAAW,EAAE;AAAA,EAClC;AACA,SAAO;AACX;AAEA,SAAS,OAAO,IAAqB,GAA4B;AAC7D,EAAK,mBAAc,IAAI,EAAE,MAAM;AAC/B,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,IAAK,iBAAY,IAAI,EAAE,CAAC,CAAC;AAAA,EAC7B;AACJ;AAUO,SAAS,eAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,gBAAW,EAAE;AAAA,IAC3B,MAAW,gBAAW,EAAE;AAAA,IACxB,KAAK,MAAM,EAAE;AAAA,IACb,eAAoB,cAAS,EAAE;AAAA,IAC/B,WAAgB,aAAQ,EAAE;AAAA,EAC9B;AACJ;AAEO,SAAS,gBAAgB,IAAqB,GAAqB;AACtE,EAAK,iBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,iBAAY,IAAI,EAAE,IAAI;AAC3B,SAAO,IAAI,EAAE,GAAG;AAChB,EAAK,eAAU,IAAI,EAAE,aAAa;AAClC,EAAK,cAAS,IAAI,EAAE,SAAS;AACjC;AAEO,SAAS,iBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAW,OAAO,mBAAmB;AAAA,IACzC;AAAA,EACJ;AACA,kBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAAS,iBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,gBAAW,OAAO,MAAM;AAC5C,QAAM,SAAS,eAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,eAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;AAOO,SAAS,eAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,gBAAW,EAAE;AAAA,IAC3B,WAAgB,cAAS,EAAE;AAAA,EAC/B;AACJ;AAEO,SAAS,gBAAgB,IAAqB,GAAqB;AACtE,EAAK,iBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,eAAU,IAAI,EAAE,SAAS;AAClC;AAEO,SAAS,iBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAW,OAAO,mBAAmB;AAAA,IACzC;AAAA,EACJ;AACA,kBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAAS,iBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,gBAAW,OAAO,MAAM;AAC5C,QAAM,SAAS,eAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,eAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;;;ACrGA,YAAYC,WAAU;AAEtB,IAAMC,UAAyB,gBAAK,aAAO,CAAC,CAAC;AAUtC,SAAS,iBAAiB,IAAmC;AAChE,SAAO;AAAA,IACH,KAAU,eAAS,EAAE;AAAA,IACrB,OAAY,eAAS,EAAE;AAAA,EAC3B;AACJ;AAEO,SAAS,kBAAkB,IAAqB,GAAuB;AAC1E,EAAK,gBAAU,IAAI,EAAE,GAAG;AACxB,EAAK,gBAAU,IAAI,EAAE,KAAK;AAC9B;AAEA,SAASC,OAAM,IAAwC;AACnD,QAAM,MAAW,mBAAa,EAAE;AAChC,MAAI,QAAQ,GAAG;AAAE,WAAO,CAAC;AAAA,EAAE;AAC3B,QAAM,SAAS,CAAM,iBAAW,EAAE,CAAC;AACnC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC1B,WAAO,CAAC,IAAS,iBAAW,EAAE;AAAA,EAClC;AACA,SAAO;AACX;AAEA,SAASC,QAAO,IAAqB,GAA4B;AAC7D,EAAK,oBAAc,IAAI,EAAE,MAAM;AAC/B,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,IAAK,kBAAY,IAAI,EAAE,CAAC,CAAC;AAAA,EAC7B;AACJ;AAEA,SAAS,MAAM,IAA8C;AACzD,QAAM,MAAW,mBAAa,EAAE;AAChC,MAAI,QAAQ,GAAG;AAAE,WAAO,CAAC;AAAA,EAAE;AAC3B,QAAM,SAAS,CAAC,iBAAiB,EAAE,CAAC;AACpC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC1B,WAAO,CAAC,IAAI,iBAAiB,EAAE;AAAA,EACnC;AACA,SAAO;AACX;AAEA,SAAS,OAAO,IAAqB,GAAkC;AACnE,EAAK,oBAAc,IAAI,EAAE,MAAM;AAC/B,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,sBAAkB,IAAI,EAAE,CAAC,CAAC;AAAA,EAC9B;AACJ;AAUO,SAASC,gBAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,iBAAW,EAAE;AAAA,IAC3B,MAAW,iBAAW,EAAE;AAAA,IACxB,KAAKF,OAAM,EAAE;AAAA,IACb,WAAW,MAAM,EAAE;AAAA,IACnB,WAAgB,cAAQ,EAAE;AAAA,EAC9B;AACJ;AAEO,SAASG,iBAAgB,IAAqB,GAAqB;AACtE,EAAK,kBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,kBAAY,IAAI,EAAE,IAAI;AAC3B,EAAAF,QAAO,IAAI,EAAE,GAAG;AAChB,SAAO,IAAI,EAAE,SAAS;AACtB,EAAK,eAAS,IAAI,EAAE,SAAS;AACjC;AAEO,SAASG,kBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAWL,QAAO,mBAAmB;AAAA,IACzCA;AAAA,EACJ;AACA,EAAAI,iBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAASE,kBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,iBAAW,OAAON,OAAM;AAC5C,QAAM,SAASG,gBAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,gBAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;AAOO,SAASI,gBAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,iBAAW,EAAE;AAAA,IAC3B,WAAgB,eAAS,EAAE;AAAA,EAC/B;AACJ;AAEO,SAASC,iBAAgB,IAAqB,GAAqB;AACtE,EAAK,kBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,gBAAU,IAAI,EAAE,SAAS;AAClC;AAEO,SAASC,kBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAWT,QAAO,mBAAmB;AAAA,IACzCA;AAAA,EACJ;AACA,EAAAQ,iBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAASE,kBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,iBAAW,OAAOV,OAAM;AAC5C,QAAM,SAASO,gBAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,gBAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;;;ACvIA,YAAYI,WAAU;AAEtB,IAAMC,UAAyB,gBAAK,aAAO,CAAC,CAAC;AAUtC,SAASC,kBAAiB,IAAmC;AAChE,SAAO;AAAA,IACH,KAAU,eAAS,EAAE;AAAA,IACrB,OAAY,eAAS,EAAE;AAAA,EAC3B;AACJ;AAEO,SAASC,mBAAkB,IAAqB,GAAuB;AAC1E,EAAK,gBAAU,IAAI,EAAE,GAAG;AACxB,EAAK,gBAAU,IAAI,EAAE,KAAK;AAC9B;AAEA,SAASC,OAAM,IAAwC;AACnD,QAAM,MAAW,mBAAa,EAAE;AAChC,MAAI,QAAQ,GAAG;AAAE,WAAO,CAAC;AAAA,EAAE;AAC3B,QAAM,SAAS,CAAM,iBAAW,EAAE,CAAC;AACnC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC1B,WAAO,CAAC,IAAS,iBAAW,EAAE;AAAA,EAClC;AACA,SAAO;AACX;AAEA,SAASC,QAAO,IAAqB,GAA4B;AAC7D,EAAK,oBAAc,IAAI,EAAE,MAAM;AAC/B,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,IAAK,kBAAY,IAAI,EAAE,CAAC,CAAC;AAAA,EAC7B;AACJ;AAEA,SAASC,OAAM,IAA8C;AACzD,QAAM,MAAW,mBAAa,EAAE;AAChC,MAAI,QAAQ,GAAG;AAAE,WAAO,CAAC;AAAA,EAAE;AAC3B,QAAM,SAAS,CAACJ,kBAAiB,EAAE,CAAC;AACpC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC1B,WAAO,CAAC,IAAIA,kBAAiB,EAAE;AAAA,EACnC;AACA,SAAO;AACX;AAEA,SAASK,QAAO,IAAqB,GAAkC;AACnE,EAAK,oBAAc,IAAI,EAAE,MAAM;AAC/B,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAC/B,IAAAJ,mBAAkB,IAAI,EAAE,CAAC,CAAC;AAAA,EAC9B;AACJ;AAEA,SAAS,MAAM,IAAiC;AAC5C,SAAY,eAAS,EAAE,IACZ,cAAQ,EAAE,IACf;AACV;AAEA,SAAS,OAAO,IAAqB,GAAqB;AACtD,EAAK,gBAAU,IAAI,MAAM,IAAI;AAC7B,MAAI,MAAM,MAAM;AACZ,IAAK,eAAS,IAAI,CAAC;AAAA,EACvB;AACJ;AAcO,SAASK,gBAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,iBAAW,EAAE;AAAA,IAC3B,MAAW,iBAAW,EAAE;AAAA,IACxB,KAAKJ,OAAM,EAAE;AAAA,IACb,WAAWE,OAAM,EAAE;AAAA,IACnB,WAAgB,cAAQ,EAAE;AAAA,IAC1B,SAAS,MAAM,EAAE;AAAA,IACjB,eAAe,MAAM,EAAE;AAAA,IACvB,SAAS,MAAM,EAAE;AAAA,IACjB,WAAW,MAAM,EAAE;AAAA,EACvB;AACJ;AAEO,SAASG,iBAAgB,IAAqB,GAAqB;AACtE,EAAK,kBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,kBAAY,IAAI,EAAE,IAAI;AAC3B,EAAAJ,QAAO,IAAI,EAAE,GAAG;AAChB,EAAAE,QAAO,IAAI,EAAE,SAAS;AACtB,EAAK,eAAS,IAAI,EAAE,SAAS;AAC7B,SAAO,IAAI,EAAE,OAAO;AACpB,SAAO,IAAI,EAAE,aAAa;AAC1B,SAAO,IAAI,EAAE,OAAO;AACpB,SAAO,IAAI,EAAE,SAAS;AAC1B;AAEO,SAASG,kBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAWT,QAAO,mBAAmB;AAAA,IACzCA;AAAA,EACJ;AACA,EAAAQ,iBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAASE,kBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,iBAAW,OAAOV,OAAM;AAC5C,QAAM,SAASO,gBAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,gBAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;AAOO,SAASI,gBAAe,IAAiC;AAC5D,SAAO;AAAA,IACH,SAAc,iBAAW,EAAE;AAAA,IAC3B,WAAgB,eAAS,EAAE;AAAA,EAC/B;AACJ;AAEO,SAASC,iBAAgB,IAAqB,GAAqB;AACtE,EAAK,kBAAY,IAAI,EAAE,OAAO;AAC9B,EAAK,gBAAU,IAAI,EAAE,SAAS;AAClC;AAEO,SAASC,kBAAiB,GAA2B;AACxD,QAAM,KAAK,IAAS;AAAA,IAChB,IAAI,WAAWb,QAAO,mBAAmB;AAAA,IACzCA;AAAA,EACJ;AACA,EAAAY,iBAAgB,IAAI,CAAC;AACrB,SAAO,IAAI,WAAW,GAAG,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG,MAAM;AACvE;AAEO,SAASE,kBAAiB,OAA+B;AAC5D,QAAM,KAAK,IAAS,iBAAW,OAAOd,OAAM;AAC5C,QAAM,SAASW,gBAAe,EAAE;AAChC,MAAI,GAAG,SAAS,GAAG,KAAK,YAAY;AAChC,UAAM,IAAS,gBAAU,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AACA,SAAO;AACX;;;AH3JO,IAAM,kBAAkB;AAG/B,IAAM,SAAS,CAAC,YAA0C;AAEzD,QAAM,YAA+B,CAAC;AAGtC,MAAI,QAAQ,eAAe;AAE1B,UAAM,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC;AAC9B,cAAU,KAAK;AAAA,MACd,KAAK,oBAAoB,GAAG;AAAA,MAC5B,OAAO,QAAQ;AAAA,IAChB,CAAC;AAAA,EACF;AAEA,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,KAAK,QAAQ;AAAA,IACb;AAAA,IACA,WAAW,QAAQ;AAAA,EACpB;AACD;AAGA,IAAM,SAAS,CAAC,YAA0C;AAEzD,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,IACnB,SAAS;AAAA,IACT,eAAe;AAAA,IACf,SAAS;AAAA,IACT,WAAW;AAAA,EACZ;AACD;AAGA,IAAM,SAAS,CAAC,YAA0C;AAEzD,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,EACpB;AACD;AAGA,IAAM,SAAS,CAAC,YAA0C;AAGzD,QAAM,mBAAmB,QAAQ,UAAU,KAAK,CAAC,UAAU;AAC1D,UAAM,MAAM,IAAI,WAAW,MAAM,GAAG;AACpC,WAAO,IAAI,WAAW,KAAK,IAAI,CAAC,MAAM;AAAA,EACvC,CAAC;AAED,SAAO;AAAA,IACN,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,KAAK,QAAQ;AAAA,IACb,gBAAe,qDAAkB,UAAS,IAAI,YAAY,CAAC;AAAA,IAC3D,WAAW,QAAQ;AAAA,EACpB;AACD;AAEO,IAAM,wBAAwB,2BAA0C;AAAA,EAC9E,oBAAoB,CAAC,OAAO,YAAY;AACvC,YAAQ,SAAS;AAAA,MAChB,KAAK;AACJ,eAAU,iBAAiB,KAAK;AAAA,MACjC,KAAK;AACJ,eAAUI,kBAAiB,KAAK;AAAA,MACjC,KAAK;AACJ,eAAUA,kBAAiB,KAAK;AAAA,MACjC;AACC,cAAM,IAAI,MAAM,mBAAmB,OAAO,EAAE;AAAA,IAC9C;AAAA,EACD;AAAA,EACA,kBAAkB,CAAC,MAAM,YAAY;AACpC,YAAQ,SAAS;AAAA,MAChB,KAAK;AACJ,eAAU,iBAAiB,IAAqB;AAAA,MACjD,KAAK;AACJ,eAAUC,kBAAiB,IAAqB;AAAA,MACjD,KAAK;AACJ,eAAUA,kBAAiB,IAAqB;AAAA,MACjD;AACC,cAAM,IAAI,MAAM,mBAAmB,OAAO,EAAE;AAAA,IAC9C;AAAA,EACD;AAAA,EACA,uBAAuB,MAAM,CAAC,QAAQ,MAAM;AAAA,EAC5C,qBAAqB,MAAM,CAAC,QAAQ,MAAM;AAC3C,CAAC;AAEM,IAAM,wBAAwB,2BAA0C;AAAA,EAC9E,oBAAoB,CAAC,OAAO,YAAY;AACvC,YAAQ,SAAS;AAAA,MAChB,KAAK;AACJ,eAAU,iBAAiB,KAAK;AAAA,MACjC,KAAK;AACJ,eAAUC,kBAAiB,KAAK;AAAA,MACjC,KAAK;AACJ,eAAUA,kBAAiB,KAAK;AAAA,MACjC;AACC,cAAM,IAAI,MAAM,mBAAmB,OAAO,EAAE;AAAA,IAC9C;AAAA,EACD;AAAA,EACA,kBAAkB,CAAC,MAAM,YAAY;AACpC,YAAQ,SAAS;AAAA,MAChB,KAAK;AACJ,eAAU,iBAAiB,IAAqB;AAAA,MACjD,KAAK;AACJ,eAAUC,kBAAiB,IAAqB;AAAA,MACjD,KAAK;AACJ,eAAUA,kBAAiB,IAAqB;AAAA,MACjD;AACC,cAAM,IAAI,MAAM,mBAAmB,OAAO,EAAE;AAAA,IAC9C;AAAA,EACD;AAAA,EACA,uBAAuB,MAAM,CAAC;AAAA,EAC9B,qBAAqB,MAAM,CAAC;AAC7B,CAAC;;;AIpIM,SAASC,UAAS;AACxB,SAAO,UAAU,WAAW;AAC7B;;;ACQO,SAAS,gBAAgB,MAAc,KAAuB;AAEpE,QAAM,aAAa,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC;AAG7C,QAAMC,UAAS,cAAc;AAC7B,QAAM,OAAOA,QACX,WAAW,QAAQ,EACnB,OAAO,UAAU,EACjB,OAAO,KAAK,EACZ,UAAU,GAAG,EAAE;AAEjB,SAAO;AACR;AAKA,SAAS,kBAAkB,SAAyB;AACnD,QAAM,OAAO,YAAY;AAEzB,QAAM,iBAAiB,KAAK,UAAU,OAAO;AAG7C,QAAM,gBAAgB,KAAK,SAAS,cAAc;AAGlD,QAAMA,UAAS,cAAc;AAC7B,QAAM,OAAOA,QACX,WAAW,QAAQ,EACnB,OAAO,cAAc,EACrB,OAAO,KAAK,EACZ,UAAU,GAAG,CAAC;AAEhB,SAAO,GAAG,aAAa,IAAI,IAAI;AAChC;AAKO,SAAS,iBAAyB;AACxC,QAAM,WAAW,YAAY,UAAU;AACvC,QAAM,UAAU,kBAAkB,QAAQ,IAAI,CAAC;AAC/C,QAAM,OAAO,YAAY;AACzB,SAAO,KAAK,KAAK,UAAU,OAAO;AACnC;AAKA,eAAsB,WAAW,MAAgC;AAChE,MAAI;AACH,UAAM,KAAK,UAAU;AACrB,UAAM,GAAG,OAAO,IAAI;AACpB,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAKA,eAAsB,sBACrB,eACgB;AAChB,MAAI,CAAE,MAAM,WAAW,aAAa,GAAI;AACvC,UAAM,KAAK,UAAU;AACrB,UAAM,GAAG,MAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,EAClD;AACD;AAMO,SAAS,0BAA0B,eAA6B;AACtE,QAAM,SAAS,cAAc;AAC7B,MAAI,CAAC,OAAO,WAAW,aAAa,GAAG;AACtC,WAAO,UAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,EACpD;AACD;AAKA,SAAS,YAAY,SAAyB;AAC7C,QAAM,WAAW,QAAQ;AACzB,QAAM,KAAK,UAAU;AACrB,QAAM,UAAU,GAAG,QAAQ;AAC3B,QAAM,OAAO,YAAY;AAEzB,UAAQ,UAAU;AAAA,IACjB,KAAK;AACJ,aAAO,KAAK;AAAA,QACX,QAAQ,IAAI,WAAW,KAAK,KAAK,SAAS,WAAW,SAAS;AAAA,QAC9D;AAAA,MACD;AAAA,IACD,KAAK;AACJ,aAAO,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD;AACC,aAAO,KAAK;AAAA,QACX,QAAQ,IAAI,iBACX,KAAK,KAAK,SAAS,UAAU,OAAO;AAAA,QACrC;AAAA,MACD;AAAA,EACF;AACD;;;ACvFA,SAAS,gBAAgB,QAAmD;AAC3E,MAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AACnC,WAAO,CAAC;AAAA,EACT;AAEA,SAAO,OAAO,IAAI,CAAC,UAAU;AAC5B,QAAI,iBAAiB,YAAY;AAChC,aAAO,OAAO,KAAK,KAAK;AAAA,IACzB;AACA,WAAO;AAAA,EACR,CAAC;AACF;AAEA,SAAS,8BACR,OACA,SACwB;AACxB,SAAO;AAAA,IACN,MAAM,CAAC,QAAQ;AACd,YAAM,KAAK,GAAG;AAAA,IACf;AAAA,IACA,KAAK,CAAC,KAAK,WAAW;AACrB,YAAM,OAAO,QAAQ,GAAG;AACxB,WAAK,IAAI,GAAG,gBAAgB,MAAM,CAAC;AAAA,IACpC;AAAA,IACA,KAAK,CACJ,KACA,WACI;AACJ,YAAM,OAAO,QAAQ,GAAG;AACxB,aAAO,KAAK,IAAO,GAAG,gBAAgB,MAAM,CAAC;AAAA,IAC9C;AAAA,IACA,KAAK,CACJ,KACA,WACI;AACJ,YAAM,OAAO,QAAQ,GAAG;AACxB,aAAO,KAAK,IAAO,GAAG,gBAAgB,MAAM,CAAC;AAAA,IAC9C;AAAA,IACA,OAAO,MAAM;AACZ,YAAM,MAAM;AAAA,IACb;AAAA,EACD;AACD;AAEA,SAAS,+BACR,OACA,MACO;AAGP,QAAM,KAAK,4BAA4B;AAGvC,MAAI,SAAS,YAAY;AACxB,UAAM,KAAK,2BAA2B;AAAA,EACvC;AACD;AAEO,SAAS,oBAAmC;AAClD,QAAM,YAAY,aAAa;AAC/B,QAAM,aAAuB,CAAC;AAE9B,MAAI;AACH,UAAM,YAAY;AAAA;AAAA,MAAoC;AAAA,IAAY;AAGlE,UAAM,cAAc,UAAU;AAC9B,QAAI,aAAa;AAChB,aAAO;AAAA,QACN,MAAM;AAAA,QACN,MAAM,CAAC,SAAS;AA5GpB;AA6GK,gBAAM,QAAQ,IAAI,YAAY,IAAI;AAClC,yCAA+B,OAAO,IAAI;AAC1C,gBAAM,SAAQ,WAAM,UAAN,mBAAa,KAAK;AAChC,cAAI,CAAC;AACJ,kBAAM,IAAI;AAAA,cACT;AAAA,YACD;AACD,iBAAO,8BAA8B,OAAO,KAAK;AAAA,QAClD;AAAA,MACD;AAAA,IACD;AAAA,EACD,SAAS,OAAO;AACf,eAAW,KAAK,2BAA2B,OAAO,KAAK,CAAC,EAAE;AAAA,EAC3D;AAEA,MAAI;AACH,UAAM,aAAa;AAAA;AAAA,MACQ;AAAA,IAC3B;AAGA,UAAM,mBAAmB,WAAW;AACpC,QAAI,kBAAkB;AACrB,aAAO;AAAA,QACN,MAAM;AAAA,QACN,MAAM,CAAC,SAAS;AAtIpB;AAuIK,gBAAM,QAAQ,IAAI,iBAAiB,IAAI;AACvC,yCAA+B,OAAO,IAAI;AAC1C,gBAAM,WAAU,WAAM,YAAN,mBAAe,KAAK;AACpC,cAAI,CAAC,SAAS;AACb,kBAAM,IAAI;AAAA,cACT;AAAA,YACD;AAAA,UACD;AACA,iBAAO,8BAA8B,OAAO,OAAO;AAAA,QACpD;AAAA,MACD;AAAA,IACD;AAAA,EACD,SAAS,OAAO;AACf,eAAW,KAAK,4BAA4B,OAAO,KAAK,CAAC,EAAE;AAAA,EAC5D;AAEA,MAAI;AACH,UAAM,sBAAsB;AAAA;AAAA,MACD;AAAA,IAC3B;AACA,UAAM,gBACL,OAAO,wBAAwB,aAC5B,sBACA,oBAAoB;AACxB,QAAI,eAAe;AAClB,aAAO;AAAA,QACN,MAAM;AAAA,QACN,MAAM,CAAC,SAAS;AAlKpB;AAmKK,gBAAM,QAAQ,IAAI,cAAc,IAAI;AACpC,yCAA+B,OAAO,IAAI;AAC1C,gBAAM,WAAU,WAAM,YAAN,mBAAe,KAAK;AACpC,cAAI,CAAC,SAAS;AACb,kBAAM,IAAI;AAAA,cACT;AAAA,YACD;AAAA,UACD;AACA,iBAAO,8BAA8B,OAAO,OAAO;AAAA,QACpD;AAAA,MACD;AAAA,IACD;AAAA,EACD,SAAS,OAAO;AACf,eAAW,KAAK,+BAA+B,OAAO,KAAK,CAAC,EAAE;AAC9D,UAAM,IAAI;AAAA,MACT;AAAA,EAAgL,WAAW,KAAK,IAAI,CAAC;AAAA,IACtM;AAAA,EACD;AAEA,QAAM,IAAI;AAAA,IACT;AAAA,EAAoF,WAAW,KAAK,IAAI,CAAC;AAAA,EAC1G;AACD;AAEO,SAAS,wBACf,QACyB;AACzB,MAAI,OAAO,WAAW,GAAG;AACxB,WAAO;AAAA,EACR;AAEA,QAAM,aAAa,IAAI,WAAW,MAAM;AACxC,WAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,QAAI,WAAW,CAAC,MAAM,KAAM;AAC3B,iBAAW,CAAC,KAAK;AACjB,aAAO,WAAW,MAAM,GAAG,IAAI,CAAC;AAAA,IACjC;AAAA,EACD;AACA,SAAO;AACR;AAEO,SAAS,iBACf,OACA,WACa;AACb,MAAI,iBAAiB,YAAY;AAChC,WAAO;AAAA,EACR;AACA,MAAI,iBAAiB,aAAa;AACjC,WAAO,IAAI,WAAW,KAAK;AAAA,EAC5B;AACA,MAAI,YAAY,OAAO,KAAK,GAAG;AAC9B,WAAO,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EACvE;AACA,QAAM,IAAI,MAAM,qBAAqB,SAAS,sBAAsB;AACrE;;;ACvNA,IAAM,kBAAkB,IAAI;AAC5B,IAAM,oBAAoB,MAAM;AAChC,IAAM,cAAc;AACpB,IAAM,0BAA0B,MAAM;AACtC,IAAM,sBAAsB,KAAK,OAAO,OAAO;AAC/C,IAAM,+BAA+B;AAE9B,SAAS,eAAe,IAAmC;AACjE,QAAM,MAAM,GAAG;AAAA,IACd;AAAA,EACD;AACA,SAAO,MAAM,OAAO,IAAI,SAAS,CAAC,IAAI;AACvC;AAEO,SAAS,cACf,KACA,WAA2D,OACpD;AACP,MAAI,IAAI,aAAa,+BAA+B,iBAAiB;AACpE,UAAM,IAAI,MAAM,GAAG,QAAQ,+BAA+B;AAAA,EAC3D;AACD;AAEO,SAAS,eAAe,MAA0B;AACxD,MAAI,KAAK,SAAS,aAAa;AAC9B,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACnD;AAEA,aAAW,OAAO,MAAM;AACvB,kBAAc,GAAG;AAAA,EAClB;AACD;AAEO,SAAS,kBACf,SACA,WACO;AACP,MAAI,QAAQ,SAAS,aAAa;AACjC,UAAM,IAAI,MAAM,+CAA+C;AAAA,EAChE;AAEA,MAAI,cAAc;AAClB,aAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AACnC,mBACC,IAAI,aAAa,+BAA+B,MAAM;AAAA,EACxD;AAEA,MAAI,cAAc,yBAAyB;AAC1C,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC3D;AAEA,QAAM,mBAAmB,KAAK,IAAI,GAAG,sBAAsB,SAAS;AACpE,MAAI,cAAc,kBAAkB;AACnC,UAAM,IAAI;AAAA,MACT,qCAAqC,gBAAgB,wCAAwC,WAAW;AAAA,IACzG;AAAA,EACD;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AACnC,kBAAc,GAAG;AACjB,QAAI,MAAM,aAAa,mBAAmB;AACzC,YAAM,IAAI;AAAA,QACT,2BAA2B,oBAAoB,IAAI;AAAA,MACpD;AAAA,IACD;AAAA,EACD;AACD;;;ARvBA,IAAM,qBAAqB;AAI3B,SAAS,aAAa,GAAe,GAAuB;AAC3D,QAAM,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;AACvC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC7B,QAAI,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG;AAClB,aAAO,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,IAClB;AAAA,EACD;AACA,SAAO,EAAE,SAAS,EAAE;AACrB;AAmDO,IAAM,wBAAN,MAA4B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA,oBAAoB,oBAAI,IAAmC;AAAA;AAAA;AAAA;AAAA,EAK3D,UAAU,oBAAI,IAAwB;AAAA,EAEtC,uBAA+B;AAAA,EAE/B;AAAA,EAMA,IAAI,UAAmB;AACtB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,cAAc;AACjB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,sBAAsB;AACzB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,YAAY,UAAmC,CAAC,GAAG;AAClD,UAAM,EAAE,UAAU,MAAM,YAAY,kBAAkB,KAAK,IAAI;AAC/D,QAAI,CAAC,iBAAiB;AACrB,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AACA,SAAK,WAAW;AAChB,SAAK,iBAAiB,kBAAkB;AACxC,SAAK,eAAe,UAAW,cAAc,eAAe,IAAK;AACjE,UAAM,OAAO,YAAY;AACzB,SAAK,YAAY,KAAK,KAAK,KAAK,cAAc,OAAO;AACrD,SAAK,UAAU,KAAK,KAAK,KAAK,cAAc,WAAW;AACvD,SAAK,aAAa,KAAK,KAAK,KAAK,cAAc,QAAQ;AAEvD,QAAI,KAAK,UAAU;AAElB,gCAA0B,KAAK,SAAS;AACxC,gCAA0B,KAAK,OAAO;AACtC,gCAA0B,KAAK,UAAU;AAEzC,UAAI;AACH,cAAM,SAAS,cAAc;AAC7B,cAAM,WAAW,OAAO,YAAY,KAAK,SAAS;AAClD,aAAK,uBAAuB,SAAS;AAAA,MACtC,SAAS,OAAO;AACf,QAAAC,QAAO,EAAE,MAAM,EAAE,KAAK,0BAA0B,MAAM,CAAC;AAAA,MACxD;AAEA,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,KAAK,KAAK;AAAA,QACV,YAAY,KAAK;AAAA,QACjB,eAAe,KAAK,eAAe;AAAA,MACpC,CAAC;AAGD,UAAI;AACH,aAAK,sBAAsB;AAAA,MAC5B,SAAS,KAAK;AACb,QAAAA,QAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL,OAAO;AAAA,QACR,CAAC;AAAA,MACF;AAEA,UAAI;AACH,aAAK,sCAAsC;AAAA,MAC5C,SAAS,OAAO;AACf,QAAAA,QAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL;AAAA,QACD,CAAC;AACD,cAAM;AAAA,MACP;AAAA,IACD,OAAO;AACN,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,eAAe,KAAK,eAAe;AAAA,MACpC,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAEA,kBAAkB,SAAyB;AAC1C,WAAO,YAAY,EAAE,KAAK,KAAK,WAAW,OAAO;AAAA,EAClD;AAAA,EAEA,eAAe,SAAyB;AACvC,WAAO,YAAY,EAAE,KAAK,KAAK,SAAS,GAAG,OAAO,KAAK;AAAA,EACxD;AAAA,EAEA,kBAAkB,SAAyB;AAC1C,WAAO,YAAY,EAAE,KAAK,KAAK,YAAY,OAAO;AAAA,EACnD;AAAA,EAEA,wBAAwB,SAAyB;AAChD,QAAI,KAAK,UAAU;AAClB,aAAO,KAAK,eAAe,OAAO;AAAA,IACnC;AACA,WAAO;AAAA,EACR;AAAA,EAEA,qBAAqB,IAAiC;AACrD,OAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,GAKP;AAAA,EACF;AAAA,EAEA,4BAA4B,SAAwC;AACnE,UAAM,WAAW,KAAK,kBAAkB,IAAI,OAAO;AACnD,QAAI,UAAU;AACb,aAAO;AAAA,IACR;AAEA,UAAM,SAAS,KAAK,wBAAwB,OAAO;AACnD,QAAI,KAAK,UAAU;AAClB,YAAM,OAAO,YAAY;AACzB,gCAA0B,KAAK,QAAQ,MAAM,CAAC;AAAA,IAC/C;AAEA,QAAI;AACJ,QAAI;AACH,WAAK,KAAK,eAAe,KAAK,MAAM;AAAA,IACrC,SAAS,OAAO;AACf,YAAM,IAAI;AAAA,QACT,8CAA8C,OAAO,OAAO,MAAM,KAAK,KAAK;AAAA,MAC7E;AAAA,IACD;AAEA,SAAK,qBAAqB,EAAE;AAC5B,SAAK,kBAAkB,IAAI,SAAS,EAAE;AACtC,WAAO;AAAA,EACR;AAAA,EAEA,sBAAsB,SAAuB;AAC5C,UAAM,KAAK,KAAK,kBAAkB,IAAI,OAAO;AAC7C,QAAI,CAAC,IAAI;AACR;AAAA,IACD;AAEA,QAAI;AACH,SAAG,MAAM;AAAA,IACV,UAAE;AACD,WAAK,kBAAkB,OAAO,OAAO;AAAA,IACtC;AAAA,EACD;AAAA,EAEA,kBACC,IACA,SACO;AACP,QAAI,QAAQ,WAAW,GAAG;AACzB;AAAA,IACD;AAEA,OAAG,KAAK,OAAO;AACf,QAAI;AACH,iBAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AACnC,WAAG,IAAI,wDAAwD;AAAA,UAC9D;AAAA,UACA;AAAA,QACD,CAAC;AAAA,MACF;AACA,SAAG,KAAK,QAAQ;AAAA,IACjB,SAAS,OAAO;AACf,UAAI;AACH,WAAG,KAAK,UAAU;AAAA,MACnB,QAAQ;AAAA,MAER;AACA,YAAM;AAAA,IACP;AAAA,EACD;AAAA,EAEA,iBAAiB,IAAoC;AACpD,UAAM,MAAM,GAAG;AAAA,MACd;AAAA,IACD;AACA,UAAM,QAAQ,MAAM,OAAO,IAAI,KAAK,IAAI;AACxC,WAAO,QAAQ;AAAA,EAChB;AAAA,EAEA,wCAA8C;AAC7C,UAAM,SAAS,cAAc;AAC7B,QAAI,CAAC,OAAO,WAAW,KAAK,SAAS,GAAG;AACvC;AAAA,IACD;AAEA,UAAM,WAAW,OACf,YAAY,KAAK,SAAS,EAC1B,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,OAAO,CAAC;AAEtC,eAAW,WAAW,UAAU;AAC/B,YAAM,YAAY,KAAK,kBAAkB,OAAO;AAChD,UAAI;AACJ,UAAI;AACH,cAAM,aAAa,OAAO,aAAa,SAAS;AAChD,gBAAQ,sBAAsB;AAAA,UAC7B,IAAI,WAAW,UAAU;AAAA,QAC1B;AAAA,MACD,SAAS,OAAO;AACf,QAAAA,QAAO,EAAE,KAAK;AAAA,UACb,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACD,CAAC;AACD;AAAA,MACD;AAEA,UAAI,CAAC,MAAM,aAAa,MAAM,UAAU,WAAW,GAAG;AACrD;AAAA,MACD;AAEA,YAAM,SAAS,KAAK,eAAe,OAAO;AAC1C,YAAM,OAAO,YAAY;AACzB,gCAA0B,KAAK,QAAQ,MAAM,CAAC;AAC9C,YAAM,KAAK,KAAK,eAAe,KAAK,MAAM;AAC1C,UAAI;AACH,aAAK,qBAAqB,EAAE;AAC5B,YAAI,KAAK,iBAAiB,EAAE,GAAG;AAC9B;AAAA,QACD;AAEA,cAAM,gBAAgB,MAAM,UAAU,IAAI,CAAC,UAAU;AAAA,UACpD,IAAI,WAAW,MAAM,GAAG;AAAA,UACxB,IAAI,WAAW,MAAM,KAAK;AAAA,QAC3B,CAAC;AACD,aAAK,kBAAkB,IAAI,aAAa;AAExC,QAAAA,QAAO,EAAE,KAAK;AAAA,UACb,KAAK;AAAA,UACL;AAAA,UACA,YAAY,cAAc;AAAA,QAC3B,CAAC;AAAA,MACF,UAAE;AACD,WAAG,MAAM;AAAA,MACV;AAAA,IACD;AAAA,EACD;AAAA,EAEA,OAAO,kBAAkB,QAEa;AACrC,QAAI,WAAW,MAAM,KAAK,KAAK,QAAQ,KAAK,CAAC,EAAE,KAAK;AAGpD,UAAM,SAAS,cAAc;AAC7B,QAAI,OAAO,WAAW,KAAK,SAAS,GAAG;AACtC,iBAAW,OACT,YAAY,KAAK,SAAS,EAC1B,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,MAAM,CAAC,EACnC,KAAK;AAAA,IACR;AAEA,UAAM,aAAa,OAAO,SACvB,SAAS,QAAQ,OAAO,MAAM,IAAI,IAClC;AAEH,aAAS,IAAI,YAAY,IAAI,SAAS,QAAQ,KAAK;AAClD,YAAM,UAAU,SAAS,CAAC;AAC1B,UAAI,CAAC,SAAS;AACb;AAAA,MACD;AAEA,UAAI;AACH,cAAM,QAAQ,MAAM,KAAK,sBAAsB,OAAO;AACtD,cAAM;AAAA,MACP,SAAS,OAAO;AACf,QAAAA,QAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,SAA6B;AACzC,QAAI,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACpC,QAAI,OAAO;AACV,aAAO;AAAA,IACR;AAEA,YAAQ;AAAA,MACP,IAAI;AAAA,MACJ,gBAAgB;AAAA,MAChB,YAAY,OAAO,WAAW;AAAA,IAC/B;AACA,SAAK,QAAQ,IAAI,SAAS,KAAK;AAC/B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACL,SACA,MACA,KACA,OACsB;AAGtB,UAAM,KAAK,kBAAkB,OAAO;AACpC,QAAI,QAAQ,KAAK,aAAa,OAAO;AAGrC,QAAI,MAAM,OAAO;AAChB,YAAM,IAAI,kBAAkB,MAAM,GAAG;AAAA,IACtC;AACA,QAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC,YAAM,KAAK,kBAAkB,OAAO;AACpC,cAAQ,KAAK,aAAa,OAAO;AAAA,IAClC;AAGA,QAAI,MAAM,mBAAmB,mBAA+B;AAC3D,YAAM,iBAAiB;AACvB,YAAM,aAAa,OAAO,WAAW;AAAA,IACtC;AAGA,UAAM,iBAAiB,uBAAuB,KAAK;AAGnD,UAAM,KAAK,gBAAgB,SAAS,OAAO,gBAAgB;AAC1D,kBAAY,QAAQ;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,QAC5B,WAAW,CAAC;AAAA,QACZ,SAAS;AAAA,QACT,eAAe;AAAA,QACf,SAAS;AAAA,QACT,WAAW;AAAA,MACZ;AACA,kBAAY,iBAAiB;AAC7B,UAAI,KAAK,UAAU;AAClB,cAAM,KAAK;AAAA,UACV;AAAA,UACA,YAAY;AAAA,UACZ,YAAY;AAAA,QACb;AAAA,MACD;AACA,UAAI,eAAe,SAAS,GAAG;AAC9B,cAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,aAAK,kBAAkB,IAAI,cAAc;AAAA,MAC1C;AAAA,IACD,CAAC;AAED,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,SAAsC;AACrD,UAAM,QAAQ,KAAK,aAAa,OAAO;AAGvC,QAAI,MAAM,mBAAmB,mBAA+B;AAC3D,aAAO;AAAA,IACR;AAGA,QAAI,MAAM,OAAO;AAChB,aAAO;AAAA,IACR;AAGA,QAAI,CAAC,KAAK,UAAU;AACnB,aAAO;AAAA,IACR;AAGA,QAAI,MAAM,aAAa;AACtB,YAAM,MAAM;AACZ,aAAO;AAAA,IACR;AAGA,UAAM,cAAc,KAAK,eAAe,KAAK;AAC7C,WAAO,MAAM;AAAA,EACd;AAAA,EAEA,MAAc,eAAe,OAAmB;AAC/C,UAAM,gBAAgB,KAAK,kBAAkB,MAAM,EAAE;AAGrD,QAAI;AACH,YAAM,KAAK,UAAU;AACrB,YAAM,YAAY,MAAM,GAAG,SAAS,aAAa;AAEjD,YAAM,cACL,sBAAsB;AAAA,QACrB,IAAI,WAAW,SAAS;AAAA,MACzB;AAGD,YAAM,QAAQ;AAAA,QACb,GAAG;AAAA,QACH,WAAW,CAAC;AAAA,MACb;AAEA,aAAO;AAAA,IACR,SAAS,YAAiB;AAEzB,UAAI,WAAW,SAAS,UAAU;AACjC,cAAM,cAAc;AACpB,eAAO;AAAA,MACR;AAGA,YAAM,QAAQ,IAAI;AAAA,QACjB,+BAA+B,UAAU;AAAA,MAC1C;AACA,YAAM;AAAA,IACP;AAAA,EACD;AAAA,EAEA,MAAM,kBACL,SACA,MACA,KACA,OACsB;AACtB,UAAM,KAAK,kBAAkB,OAAO;AAGpC,UAAM,QAAQ,MAAM,KAAK,UAAU,OAAO;AAG1C,QAAI,CAAC,MAAM,OAAO;AACjB,UAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC,cAAM,KAAK,kBAAkB,OAAO;AACpC,eAAO,MAAM,KAAK,kBAAkB,SAAS,MAAM,KAAK,KAAK;AAAA,MAC9D;AAGA,UAAI,MAAM,mBAAmB,mBAA+B;AAC3D,cAAM,iBAAiB;AACvB,cAAM,aAAa,OAAO,WAAW;AAAA,MACtC;AAGA,YAAM,iBAAiB,uBAAuB,KAAK;AAEnD,YAAM,KAAK,gBAAgB,SAAS,OAAO,gBAAgB;AAC1D,oBAAY,QAAQ;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,UAC5B,WAAW,CAAC;AAAA,UACZ,SAAS;AAAA,UACT,eAAe;AAAA,UACf,SAAS;AAAA,UACT,WAAW;AAAA,QACZ;AACA,YAAI,KAAK,UAAU;AAClB,gBAAM,KAAK;AAAA,YACV;AAAA,YACA,YAAY;AAAA,YACZ,YAAY;AAAA,UACb;AAAA,QACD;AACA,YAAI,eAAe,SAAS,GAAG;AAC9B,gBAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,eAAK,kBAAkB,IAAI,cAAc;AAAA,QAC1C;AAAA,MACD,CAAC;AAAA,IACF;AACA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,WAAW,SAAiB;AAhmBnC;AAimBE;AAAA,MACC,KAAK;AAAA,MACL;AAAA,IACD;AAGA,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,cAAU,OAAO,kBAAkB,OAAO,kBAAkB;AAG5D,QAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC;AAAA,IACD;AACA,UAAM,iBAAiB;AACvB,UAAM,cAAc;AAAA,MAAqB,CAAC,WACzCA,QAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AAAA,IACF;AAGA,QAAI,MAAM,YAAa,OAAM,MAAM,YAAY,MAAM;AACrD,SAAI,WAAM,iBAAN,mBAAoB;AACvB,YAAM,MAAM,aAAa,QAAQ,MAAM;AAExC,QAAI;AAEH,UAAI,MAAM,OAAO;AAChB,cAAM,KAAK,gBAAgB,SAAS,OAAO,gBAAgB;AAC1D,cAAI,CAAC,YAAY,OAAO;AACvB;AAAA,UACD;AACA,sBAAY,QAAQ;AAAA,YACnB,GAAG,YAAY;AAAA,YACf,SAAS,OAAO,KAAK,IAAI,CAAC;AAAA,UAC3B;AACA,cAAI,KAAK,UAAU;AAClB,kBAAM,KAAK;AAAA,cACV;AAAA,cACA,YAAY;AAAA,cACZ,YAAY;AAAA,YACb;AAAA,UACD;AAAA,QACD,CAAC;AAAA,MACF;AAGA,gBAAU,MAAM,OAAO,wBAAwB;AAC/C,YAAM,MAAM,MAAM,OAAO,OAAO;AAAA,IACjC,UAAE;AAED,YAAM,KAAK,gBAAgB,SAAS,YAAY;AAAA,MAAE,CAAC;AACnD,WAAK,sBAAsB,OAAO;AAClC,kBAAM,gBAAN,mBAAmB;AACnB,YAAM,cAAc;AAGpB,WAAK,QAAQ,OAAO,OAAO;AAAA,IAC5B;AAAA,EACD;AAAA,EAEA,MAAM,aAAa,SAAiB;AA/pBrC;AAiqBE,UAAM,QAAQ,KAAK,aAAa,OAAO;AAIvC,QAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC;AAAA,IACD;AACA,UAAM,iBAAiB;AACvB,UAAM,cAAc;AAAA,MAAqB,CAAC,WACzCA,QAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AAAA,IACF;AAGA,QAAI,MAAM,YAAa,OAAM,MAAM,YAAY,MAAM;AACrD,SAAI,WAAM,iBAAN,mBAAoB;AACvB,YAAM,MAAM,aAAa,QAAQ,MAAM;AAExC,QAAI;AAEH,UAAI,MAAM,OAAO;AAChB,cAAM,KAAK,gBAAgB,SAAS,OAAO,gBAAgB;AAC1D,cAAI,CAAC,YAAY,OAAO;AACvB;AAAA,UACD;AACA,sBAAY,QAAQ;AAAA,YACnB,GAAG,YAAY;AAAA,YACf,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,UAC7B;AACA,cAAI,KAAK,UAAU;AAClB,kBAAM,KAAK;AAAA,cACV;AAAA,cACA,YAAY;AAAA,cACZ,YAAY;AAAA,YACb;AAAA,UACD;AAAA,QACD,CAAC;AAAA,MACF;AAGA,UAAI,MAAM,OAAO;AAChB,cAAM,MAAM,MAAM,OAAO,SAAS;AAAA,MACnC;AAGA,YAAM,KAAK,gBAAgB,SAAS,YAAY;AAAA,MAAE,CAAC;AACnD,WAAK,sBAAsB,OAAO;AAGlC,UAAI,MAAM,cAAc;AACvB,cAAM,aAAa,MAAM;AAAA,MAC1B;AAGA,UAAI,KAAK,UAAU;AAClB,cAAM,KAAK,UAAU;AAGrB,cAAM,QAAQ,IAAI;AAAA;AAAA,WAEhB,YAAY;AACZ,gBAAI;AACH,oBAAM,GAAG,OAAO,KAAK,kBAAkB,OAAO,CAAC;AAAA,YAChD,SAAS,KAAU;AAClB,mBAAI,2BAAK,UAAS,UAAU;AAC3B,gBAAAA,QAAO,EAAE,MAAM;AAAA,kBACd,KAAK;AAAA,kBACL;AAAA,kBACA,OAAO,eAAe,GAAG;AAAA,gBAC1B,CAAC;AAAA,cACF;AAAA,YACD;AAAA,UACD,GAAG;AAAA;AAAA,WAEF,YAAY;AACZ,gBAAI;AACH,oBAAM,GAAG,OAAO,KAAK,eAAe,OAAO,CAAC;AAAA,YAC7C,SAAS,KAAU;AAClB,mBAAI,2BAAK,UAAS,UAAU;AAC3B,gBAAAA,QAAO,EAAE,MAAM;AAAA,kBACd,KAAK;AAAA,kBACL;AAAA,kBACA,OAAO,eAAe,GAAG;AAAA,gBAC1B,CAAC;AAAA,cACF;AAAA,YACD;AAAA,UACD,GAAG;AAAA;AAAA,WAEF,YAAY;AACZ,gBAAI;AACH,oBAAM,GAAG,OAAO,KAAK,kBAAkB,OAAO,CAAC;AAAA,YAChD,SAAS,KAAU;AAClB,mBAAI,2BAAK,UAAS,UAAU;AAC3B,gBAAAA,QAAO,EAAE,MAAM;AAAA,kBACd,KAAK;AAAA,kBACL;AAAA,kBACA,OAAO,eAAe,GAAG;AAAA,gBAC1B,CAAC;AAAA,cACF;AAAA,YACD;AAAA,UACD,GAAG;AAAA,QACJ,CAAC;AAAA,MACF;AAAA,IACD,UAAE;AAED,YAAM,KAAK,gBAAgB,SAAS,YAAY;AAAA,MAAE,CAAC;AACnD,kBAAM,gBAAN,mBAAmB;AACnB,YAAM,cAAc;AAMpB,YAAM,QAAQ;AACd,YAAM,cAAc;AACpB,YAAM,QAAQ;AACd,YAAM,eAAe;AACrB,YAAM,eAAe;AACrB,YAAM,eAAe;AACrB,YAAM,uBAAuB;AAC7B,YAAM,iBAAiB;AAAA,IACxB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACL,SACA,YACA,OACgB;AAChB,QAAI,CAAC,KAAK,UAAU;AACnB;AAAA,IACD;AAEA,UAAM,KAAK,gBAAgB,SAAS,YAAY;AAC/C,YAAM,KAAK,cAAc,SAAS,YAAY,KAAK;AAAA,IACpD,CAAC;AAAA,EACF;AAAA,EAEA,mCACC,SACA,YACU;AACV,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,QAAI,CAAC,MAAO,QAAO;AACnB,WACC,MAAM,eAAe,cACrB,MAAM,mBAAmB;AAAA,EAE3B;AAAA,EAEA,gBAAgB,SAAiB;AAChC,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,QAAI,CAAC,MAAO,QAAO;AACnB,WACC,MAAM,mBAAmB,0BACzB,MAAM,mBAAmB;AAAA,EAE3B;AAAA,EAEA,MAAM,kBAAkB,SAAgC;AACvD,WAAO,MAAM;AACZ,YAAM,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACtC,UAAI,EAAC,+BAAO,cAAa;AACxB;AAAA,MACD;AACA,UAAI;AACH,cAAM,MAAM,YAAY;AAAA,MACzB,QAAQ;AACP;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,gBACL,SACA,IACa;AACb,UAAM,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACtC,cAAU,OAAO,4BAA4B;AAE7C,UAAM,gBAAgB,MAAM;AAC5B,UAAM,eAAe;AAAA,MAA2B,CAAC,WAChDA,QAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AAAA,IACF;AACA,UAAM,uBAAuB;AAE7B,QAAI,eAAe;AAClB,UAAI;AACH,cAAM,cAAc;AAAA,MACrB,QAAQ;AAAA,MAER;AAAA,IACD;AAEA,QAAI;AACH,aAAO,MAAM,GAAG,KAAK;AAAA,IACtB,UAAE;AACD,mBAAa,QAAQ;AACrB,UAAI,MAAM,yBAAyB,cAAc;AAChD,cAAM,uBAAuB;AAAA,MAC9B;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,qBAAqB,SAAgC;AAC1D,UAAM,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACtC,QAAI,EAAC,+BAAO,uBAAsB;AACjC;AAAA,IACD;AAEA,WAAO,MAAM,sBAAsB;AAClC,YAAM,UAAU,MAAM;AACtB,UAAI;AACH,cAAM,QAAQ;AAAA,MACf,QAAQ;AAAA,MAER;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,cAAc,SAAiB,WAAmB;AACvD,UAAM,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACtC,cAAU,OAAO,4BAA4B;AAI7C,UAAM,kBAAkB,MAAM;AAC9B,QAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC,MAAAA,QAAO,EAAE,KAAK,yCAAyC;AACvD;AAAA,IACD;AAGA,QAAI,KAAK,UAAU;AAClB,YAAM,YAAY,KAAK,kBAAkB,OAAO;AAChD,YAAMC,UAAS,cAAc;AAC7B,YAAM,WAAW,GAAG,SAAS,QAAQA,QAAO,WAAW,CAAC;AACxD,UAAI;AACH,cAAM,OAAO,YAAY;AACzB,cAAM,sBAAsB,KAAK,QAAQ,SAAS,CAAC;AACnD,cAAM,YAA+B;AAAA,UACpC;AAAA,UACA,WAAW,OAAO,SAAS;AAAA,QAC5B;AACA,cAAM,OAAO,sBAAsB;AAAA,UAClC;AAAA,UACA;AAAA,QACD;AACA,cAAM,KAAK,UAAU;AACrB,cAAM,GAAG,UAAU,UAAU,IAAI;AAEjC,YACC,CAAC,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACD,GACC;AACD,UAAAD,QAAO,EAAE;AAAA,YACR;AAAA,UACD;AACA;AAAA,QACD;AAEA,cAAM,GAAG,OAAO,UAAU,SAAS;AAAA,MACpC,SAAS,OAAO;AACf,YAAI;AACH,gBAAM,KAAK,UAAU;AACrB,gBAAM,GAAG,OAAO,QAAQ;AAAA,QACzB,QAAQ;AAAA,QAAE;AACV,QAAAA,QAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACD,CAAC;AACD,cAAM,IAAI,MAAM,0BAA0B,KAAK,EAAE;AAAA,MAClD;AAAA,IACD;AAGA,SAAK,sBAAsB,SAAS,SAAS;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACL,SACA,YACA,OACgB;AAChB,UAAM,WAAW,KAAK,kBAAkB,OAAO;AAE/C,UAAMC,UAAS,cAAc;AAC7B,UAAM,WAAW,GAAG,QAAQ,QAAQA,QAAO,WAAW,CAAC;AAEvD,QAAI;AAEH,YAAM,OAAO,YAAY;AACzB,YAAM,sBAAsB,KAAK,QAAQ,QAAQ,CAAC;AAGlD,YAAM,YAA+B;AAAA,QACpC,SAAS,MAAM;AAAA,QACf,MAAM,MAAM;AAAA,QACZ,KAAK,MAAM;AAAA,QACX,WAAW,MAAM;AAAA,QACjB,WAAW,MAAM;AAAA,QACjB,SAAS,MAAM;AAAA,QACf,eAAe,MAAM;AAAA,QACrB,SAAS,MAAM;AAAA,QACf,WAAW,MAAM;AAAA,MAClB;AAGA,YAAM,kBACL,sBAAsB;AAAA,QACrB;AAAA,QACA;AAAA,MACD;AACD,YAAM,KAAK,UAAU;AACrB,YAAM,GAAG,UAAU,UAAU,eAAe;AAE5C,UAAI,CAAC,KAAK,mCAAmC,SAAS,UAAU,GAAG;AAClE,QAAAD,QAAO,EAAE;AAAA,UACR;AAAA,QACD;AACA;AAAA,MACD;AAEA,YAAM,GAAG,OAAO,UAAU,QAAQ;AAAA,IACnC,SAAS,OAAO;AAEf,UAAI;AACH,cAAM,KAAK,UAAU;AACrB,cAAM,GAAG,OAAO,QAAQ;AAAA,MACzB,QAAQ;AAAA,MAER;AACA,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACD,CAAC;AACD,YAAM,IAAI,MAAM,+BAA+B,KAAK,EAAE;AAAA,IACvD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cACCE,SACA,cACA,aACC;AACD,QAAI,KAAK,eAAe;AACvB;AAAA,IACD;AAGA,SAAK,gBAAgB;AAAA,MACpB,QAAQA;AAAA,MACR;AAAA,MACA;AAAA,IACD;AAGA,QAAI;AACH,WAAK,gBAAgB;AAAA,IACtB,SAAS,KAAK;AACb,MAAAF,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,OAAO;AAAA,MACR,CAAC;AAAA,IACF;AAAA,EACD;AAAA,EAEA,MAAM,WACLE,SACA,cACA,aACA,SAC4B;AA3iC9B;AA4iCE,UAAM,KAAK,kBAAkB,OAAO;AAGpC,QAAI,QAAQ,MAAM,KAAK,UAAU,OAAO;AACxC,QAAI,CAAC,MAAM,OAAO;AACjB,YAAM,IAAI;AAAA,QACT,gDAAgD,OAAO;AAAA,MACxD;AAAA,IACD;AAGA,QAAI,MAAM,cAAc;AACvB,YAAM,MAAM,aAAa;AACzB,gBAAU,MAAM,OAAO,0BAA0B;AACjD,aAAO,MAAM;AAAA,IACd;AAGA,QAAI,MAAM,OAAO;AAChB,UAAI,MAAM,MAAM,cAAc,KAAK,gBAAgB,OAAO,GAAG;AAC5D,cAAM,KAAK,kBAAkB,OAAO;AACpC,gBAAQ,MAAM,KAAK,UAAU,OAAO;AACpC,YAAI,CAAC,MAAM,OAAO;AACjB,gBAAM,IAAI;AAAA,YACT,gDAAgD,OAAO;AAAA,UACxD;AAAA,QACD;AAAA,MACD,OAAO;AACN,eAAO,MAAM;AAAA,MACd;AAAA,IACD;AAGA,UAAM,eAAe;AAAA,MAAqB,CAAC,WAC1CF,QAAO,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL;AAAA,MACD,CAAC;AAAA,IACF;AAEA,QAAI;AAEH,YAAM,aAAa,iBAAiBE,SAAQ,MAAM,MAAM,IAAI;AAC5D,YAAM,QAAQ,MAAM,WAAW,YAAY;AAC3C,YAAM,iBAAiB;AAGvB,YAAM,MAAM,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,QACZ;AAAA,MACD;AAIA,YAAM,MAAM,OAAO,KAAK,IAAI,CAAC;AAC7B,YAAM,KAAK,gBAAgB,SAAS,OAAO,gBAAgB;AAC1D,YAAI,CAAC,YAAY,OAAO;AACvB,gBAAM,IAAI;AAAA,YACT,gDAAgD,OAAO;AAAA,UACxD;AAAA,QACD;AACA,oBAAY,QAAQ;AAAA,UACnB,GAAG,YAAY;AAAA,UACf,SAAS;AAAA,UACT,eAAe;AAAA,UACf,SAAS;AAAA;AAAA,QACV;AACA,YAAI,KAAK,UAAU;AAClB,gBAAM,KAAK;AAAA,YACV;AAAA,YACA,YAAY;AAAA,YACZ,YAAY;AAAA,UACb;AAAA,QACD;AAAA,MACD,CAAC;AAGD,YAAM,aAAa,QAAQ;AAC3B,YAAM,eAAe;AAErB,aAAO,MAAM;AAAA,IACd,SAAS,YAAY;AACpB,YAAM,QAAQ,IAAI;AAAA,QACjB,yBAAyB,OAAO,KAAK,UAAU;AAAA,QAC/C,EAAE,OAAO,WAAW;AAAA,MACrB;AACA,kBAAM,iBAAN,mBAAoB,OAAO;AAC3B,YAAM,eAAe;AACrB,YAAM;AAAA,IACP;AAAA,EACD;AAAA,EAEA,MAAM,sBAAsB,SAA6C;AACxE,UAAM,SAAS,MAAM,KAAK,UAAU,OAAO,GAAG;AAC9C,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,yBAAyB,OAAO,EAAE;AAC9D,WAAO;AAAA,EACR;AAAA,EAEA,gBAAgB,SAA6B;AAC5C,UAAM,QAAQ,KAAK,QAAQ,IAAI,OAAO;AACtC,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,uBAAuB,OAAO,EAAE;AAC5D,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,eAAe,SAA8C;AAClE,WAAO,KAAK,eAAe,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAwB;AACvB,QAAI;AACH,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAQ,OAAO,WAAW,KAAK,UAAU,IAC5C,OAAO,YAAY,KAAK,UAAU,IAClC,CAAC;AACJ,iBAAW,QAAQ,OAAO;AAEzB,YAAI,KAAK,SAAS,OAAO,EAAG;AAC5B,cAAM,OAAO,YAAY;AACzB,cAAM,WAAW,KAAK,KAAK,KAAK,YAAY,IAAI;AAChD,YAAI;AACH,gBAAM,MAAM,OAAO,aAAa,QAAQ;AACxC,gBAAM,YACL,sBAAsB;AAAA,YACrB,IAAI,WAAW,GAAG;AAAA,UACnB;AACD,gBAAM,YAAY,OAAO,UAAU,SAAS;AAC5C,cAAI,OAAO,SAAS,SAAS,GAAG;AAC/B,iBAAK;AAAA,cACJ,UAAU;AAAA,cACV;AAAA,YACD;AAAA,UACD,OAAO;AACN,YAAAF,QAAO,EAAE,MAAM;AAAA,cACd,KAAK;AAAA,cACL;AAAA,YACD,CAAC;AAAA,UACF;AAAA,QACD,SAAS,KAAK;AACb,UAAAA,QAAO,EAAE,MAAM;AAAA,YACd,KAAK;AAAA,YACL;AAAA,YACA,OAAO,eAAe,GAAG;AAAA,UAC1B,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD,SAAS,KAAK;AACb,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,OAAO;AAAA,MACR,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,SAAiB,WAAmB;AA/sC3D;AAgtCE,UAAM,QAAQ,KAAK,aAAa,OAAO;AAGvC,QACC,MAAM,mBAAmB,UACzB,aAAa,MAAM,gBAClB;AACD,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,SAAS,MAAM;AAAA,MAChB,CAAC;AACD;AAAA,IACD;AAEA,IAAAA,QAAO,EAAE,MAAM,EAAE,KAAK,oBAAoB,SAAS,UAAU,CAAC;AAG9D,gBAAM,iBAAN,mBAAoB;AACpB,UAAM,iBAAiB;AAEvB,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,KAAK,IAAI,CAAC;AAChD,UAAM,eAAe,eAAe,YAAY;AAE/C,YAAM,iBAAiB;AAEvB,UAAI,KAAK,UAAU;AAClB,YAAI;AACH,gBAAM,KAAK,UAAU;AACrB,gBAAM,GAAG,OAAO,KAAK,kBAAkB,OAAO,CAAC;AAAA,QAChD,SAAS,KAAU;AAClB,eAAI,2BAAK,UAAS,UAAU;AAC3B,YAAAA,QAAO,EAAE,MAAM;AAAA,cACd,KAAK;AAAA,cACL;AAAA,cACA,OAAO,eAAe,GAAG;AAAA,YAC1B,CAAC;AAAA,UACF;AAAA,QACD;AAAA,MACD;AAEA,UAAI;AACH,QAAAA,QAAO,EAAE,MAAM,EAAE,KAAK,oBAAoB,SAAS,UAAU,CAAC;AAG9D,cAAM,SAAS,MAAM,KAAK,UAAU,OAAO;AAC3C,YAAI,CAAC,OAAO;AACX,gBAAM,IAAI,MAAM,yBAAyB,OAAO,EAAE;AAGnD,cAAM,eAAe,KAAK;AAC1B,kBAAU,cAAc,uBAAuB;AAC/C,YAAI,CAAC,OAAO,OAAO;AAClB,gBAAM,KAAK;AAAA,YACV,aAAa;AAAA,YACb,aAAa;AAAA,YACb,aAAa;AAAA,YACb;AAAA,UACD;AAAA,QACD;AAEA,kBAAU,OAAO,OAAO,mCAAmC;AAC3D,cAAM,OAAO,MAAM,QAAQ;AAAA,MAC5B,SAAS,KAAK;AACb,QAAAA,QAAO,EAAE,MAAM;AAAA,UACd,KAAK;AAAA,UACL;AAAA,UACA,OAAO,eAAe,GAAG;AAAA,QAC1B,CAAC;AAAA,MACF;AAAA,IACD,GAAG,KAAK;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,wBAA8B;AAC7B,QAAI;AACH,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAQ,OAAO,YAAY,KAAK,SAAS;AAC/C,YAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC;AAEzD,YAAM,aAAa,KAAK,IAAI,IAAI;AAEhC,iBAAW,YAAY,WAAW;AACjC,YAAI;AACH,gBAAM,OAAO,YAAY;AACzB,gBAAM,WAAW,KAAK,KAAK,KAAK,WAAW,QAAQ;AACnD,gBAAM,OAAO,OAAO,SAAS,QAAQ;AAGrC,cAAI,KAAK,UAAU,YAAY;AAC9B,mBAAO,WAAW,QAAQ;AAC1B,YAAAA,QAAO,EAAE,KAAK;AAAA,cACb,KAAK;AAAA,cACL,MAAM;AAAA,YACP,CAAC;AAAA,UACF;AAAA,QACD,SAAS,KAAK;AACb,UAAAA,QAAO,EAAE,MAAM;AAAA,YACd,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,UACR,CAAC;AAAA,QACF;AAAA,MACD;AAAA,IACD,SAAS,KAAK;AACb,MAAAA,QAAO,EAAE,MAAM;AAAA,QACd,KAAK;AAAA,QACL,OAAO;AAAA,MACR,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACL,SACA,SACgB;AAChB,UAAM,KAAK,UAAU,OAAO;AAC5B,UAAM,KAAK,gBAAgB,SAAS,OAAO,UAAU;AACpD,UAAI,CAAC,MAAM,OAAO;AACjB,YAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC;AAAA,QACD;AACA,cAAM,IAAI,MAAM,SAAS,OAAO,mBAAmB;AAAA,MACpD;AAEA,YAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,YAAM,YAAY,eAAe,EAAE;AACnC,wBAAkB,SAAS,SAAS;AACpC,WAAK,kBAAkB,IAAI,OAAO;AAAA,IACnC,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACL,SACA,MACiC;AACjC,UAAM,QAAQ,MAAM,KAAK,UAAU,OAAO;AAC1C,UAAM,KAAK,qBAAqB,OAAO;AACvC,QAAI,CAAC,MAAM,OAAO;AACjB,UAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC,cAAM,IAAI,MAAM,SAAS,OAAO,cAAc;AAAA,MAC/C,OAAO;AACN,cAAM,IAAI,MAAM,SAAS,OAAO,mBAAmB;AAAA,MACpD;AAAA,IACD;AAEA,mBAAe,IAAI;AAEnB,UAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,UAAM,UAAiC,CAAC;AACxC,eAAW,OAAO,MAAM;AACvB,YAAM,MAAM,GAAG;AAAA,QACd;AAAA,QACA,CAAC,GAAG;AAAA,MACL;AACA,UAAI,CAAC,KAAK;AACT,gBAAQ,KAAK,IAAI;AACjB;AAAA,MACD;AACA,cAAQ,KAAK,iBAAiB,IAAI,OAAO,OAAO,CAAC;AAAA,IAClD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAiB,MAAmC;AACvE,UAAM,KAAK,UAAU,OAAO;AAC5B,UAAM,KAAK,gBAAgB,SAAS,OAAO,UAAU;AACpD,UAAI,CAAC,MAAM,OAAO;AACjB,YAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC;AAAA,QACD;AACA,cAAM,IAAI,MAAM,SAAS,OAAO,mBAAmB;AAAA,MACpD;AAEA,UAAI,KAAK,WAAW,GAAG;AACtB;AAAA,MACD;AACA,qBAAe,IAAI;AAEnB,YAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,SAAG,KAAK,OAAO;AACf,UAAI;AACH,mBAAW,OAAO,MAAM;AACvB,aAAG,IAAI,gCAAgC,CAAC,GAAG,CAAC;AAAA,QAC7C;AACA,WAAG,KAAK,QAAQ;AAAA,MACjB,SAAS,OAAO;AACf,YAAI;AACH,aAAG,KAAK,UAAU;AAAA,QACnB,QAAQ;AAAA,QAER;AACA,cAAM;AAAA,MACP;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACL,SACA,OACA,KACgB;AAChB,UAAM,KAAK,UAAU,OAAO;AAC5B,UAAM,KAAK,gBAAgB,SAAS,OAAO,UAAU;AACpD,UAAI,CAAC,MAAM,OAAO;AACjB,YAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC;AAAA,QACD;AACA,cAAM,IAAI,MAAM,SAAS,OAAO,mBAAmB;AAAA,MACpD;AAEA,oBAAc,OAAO,WAAW;AAChC,oBAAc,KAAK,SAAS;AAC5B,UAAI,aAAa,OAAO,GAAG,KAAK,GAAG;AAClC;AAAA,MACD;AAEA,YAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,SAAG,IAAI,6CAA6C,CAAC,OAAO,GAAG,CAAC;AAAA,IACjE,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACL,SACA,QACA,SAIsC;AACtC,UAAM,QAAQ,MAAM,KAAK,UAAU,OAAO;AAC1C,UAAM,KAAK,qBAAqB,OAAO;AACvC,QAAI,CAAC,MAAM,OAAO;AACjB,UAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC,cAAM,IAAI,MAAM,SAAS,OAAO,gBAAgB;AAAA,MACjD,OAAO;AACN,cAAM,IAAI,MAAM,SAAS,OAAO,mBAAmB;AAAA,MACpD;AAAA,IACD;AACA,kBAAc,QAAQ,YAAY;AAElC,UAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,UAAM,aAAa,wBAAwB,MAAM;AACjD,UAAM,aAAY,mCAAS,WAAU,SAAS;AAC9C,UAAM,SAAQ,mCAAS,UAAS;AAChC,UAAM,OAAO,aACV,GAAG;AAAA,MAIJ,qEAAqE,SAAS;AAAA,MAC9E,CAAC,QAAQ,YAAY,KAAK;AAAA,IAC3B,IACE,GAAG;AAAA,MAIJ,yDAAyD,SAAS;AAAA,MAClE,CAAC,QAAQ,KAAK;AAAA,IACf;AAED,WAAO,KAAK,IAAI,CAAC,QAAQ;AAAA,MACxB,iBAAiB,IAAI,KAAK,KAAK;AAAA,MAC/B,iBAAiB,IAAI,OAAO,OAAO;AAAA,IACpC,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACL,SACA,OACA,KACA,SAIsC;AACtC,UAAM,QAAQ,MAAM,KAAK,UAAU,OAAO;AAC1C,UAAM,KAAK,qBAAqB,OAAO;AACvC,QAAI,CAAC,MAAM,OAAO;AACjB,UAAI,KAAK,gBAAgB,OAAO,GAAG;AAClC,cAAM,IAAI,MAAM,SAAS,OAAO,gBAAgB;AAAA,MACjD,OAAO;AACN,cAAM,IAAI,MAAM,SAAS,OAAO,mBAAmB;AAAA,MACpD;AAAA,IACD;AACA,kBAAc,OAAO,WAAW;AAChC,kBAAc,KAAK,SAAS;AAC5B,QAAI,aAAa,OAAO,GAAG,KAAK,GAAG;AAClC,aAAO,CAAC;AAAA,IACT;AAEA,UAAM,KAAK,KAAK,4BAA4B,OAAO;AACnD,UAAM,aAAY,mCAAS,WAAU,SAAS;AAC9C,UAAM,SAAQ,mCAAS,UAAS;AAChC,UAAM,OAAO,GAAG;AAAA,MAIf,qEAAqE,SAAS;AAAA,MAC9E,CAAC,OAAO,KAAK,KAAK;AAAA,IACnB;AAEA,WAAO,KAAK,IAAI,CAAC,QAAQ;AAAA,MACxB,iBAAiB,IAAI,KAAK,KAAK;AAAA,MAC/B,iBAAiB,IAAI,OAAO,OAAO;AAAA,IACpC,CAAC;AAAA,EACF;AACD;;;ASvhDA,OAAOG,gBAAe;AA2Bf,IAAM,0BAAN,MAAuD;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA,YACCC,SACA,OACA,cACC;AACD,SAAK,UAAUA;AACf,SAAK,SAAS;AACd,SAAK,gBAAgB;AAGrB,UAAM,eAAe,uBAAuB,IAAI;AAEhD,SAAK,eAAe,KAAK,cAAc;AAAA,MACtCA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,SAAK,eAAe;AAAA,MACnB,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACAA,QAAO,KAAK;AAAA,IACb;AAAA,EACD;AAAA,EAEA,MAAM,YACL,SACA,cACoB;AACpB,WAAO,MAAM,KAAK,aAAa,MAAM,cAAc;AAAA,MAClD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,cACL,MACA,SACA,UACA,QAC8B;AAE9B,UAAM,iBAAiB,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AAG7D,UAAM,UAAU,sBAAsB,cAAc;AACpD,UAAM,cAAc,IAAI,QAAQ,SAAS;AAAA,MACxC,QAAQ;AAAA,IACT,CAAC;AAGD,UAAM,WAAW,eAAe,MAAM,GAAG,EAAE,CAAC;AAC5C,UAAM,EAAE,WAAW,UAAU,IAAI,kCAAkC;AAEnE,UAAM,YAAY,MAAM;AAAA,MACvB;AAAA,MACA;AAAA,MACA,CAAC;AAAA,MACD,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,WAAO,sBAAsB,SAAS;AAAA,EACvC;AAAA,EAEA,MAAM,aACL,GACA,cACA,SACoB;AACpB,WAAO,MAAM,KAAK,aAAa,MAAM,cAAc;AAAA,MAClD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,eACL,GACA,MACA,SACA,UACA,QACoB;AA3HtB;AA4HE,UAAM,oBAAmB,UAAK,yBAAL;AACzB,IAAAC,WAAU,kBAAkB,6BAA6B;AAGzD,UAAM,WAAW,KAAK,MAAM,GAAG,EAAE,CAAC;AAClC,UAAM,iBAAiB,SAAS,WAAW,GAAG,IAC3C,WACA,IAAI,QAAQ;AACf,UAAM,EAAE,WAAW,UAAU,IAAI,kCAAkC;AACnE,UAAM,YAAY,MAAM;AAAA;AAAA,MAEvB,EAAE,IAAI;AAAA,MACN;AAAA,MACA,EAAE,IAAI,OAAO;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,WAAO,iBAAiB,MAAM,SAAS,EAAE,GAAG,SAAS,CAAC;AAAA,EACvD;AAAA,EAEA,MAAM,gBAAgB,SAAkC;AACvD,UAAM,OAAO,KAAK,QAAQ,eAAe;AACzC,WAAO,oBAAoB,IAAI,YAAY,mBAAmB,OAAO,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,SAAS;AAAA,IACd;AAAA,EACD,GAAoD;AAEnD,UAAM,QAAQ,MAAM,KAAK,OAAO,UAAU,OAAO;AACjD,QAAI,CAAC,MAAM,OAAO;AACjB,aAAO;AAAA,IACR;AACA,QAAI,KAAK,OAAO,gBAAgB,OAAO,GAAG;AACzC,YAAM,IAAI,cAAc,OAAO;AAAA,IAChC;AAEA,WAAO,mBAAmB,MAAM,KAAK;AAAA,EACtC;AAAA,EAEA,MAAM,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,EACD,GAAsD;AAErD,UAAM,UAAU,gBAAgB,MAAM,GAAG;AAGzC,UAAM,QAAQ,MAAM,KAAK,OAAO,UAAU,OAAO;AACjD,QAAI,MAAM,OAAO;AAChB,aAAO,mBAAmB,MAAM,KAAK;AAAA,IACtC;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,mBACL,OACuB;AAEvB,UAAM,UAAU,gBAAgB,MAAM,MAAM,MAAM,GAAG;AAGrD,UAAM,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACP;AAGA,UAAM,KAAK,aAAa,UAAU,OAAO;AAGzC,UAAM,QAAQ,MAAM,KAAK,OAAO,sBAAsB,OAAO;AAC7D,WAAO,mBAAmB,KAAK;AAAA,EAChC;AAAA,EAEA,MAAM,YAAY,EAAE,MAAM,KAAK,MAAM,GAAsC;AAE1E,UAAM,UAAU,gBAAgB,MAAM,GAAG;AAEzC,UAAM,KAAK,OAAO,YAAY,SAAS,MAAM,KAAK,KAAK;AAGvD,UAAM,KAAK,aAAa,UAAU,OAAO;AAGzC,UAAM,QAAQ,MAAM,KAAK,OAAO,sBAAsB,OAAO;AAC7D,WAAO,mBAAmB,KAAK;AAAA,EAChC;AAAA,EAEA,MAAM,WAAW,EAAE,KAAK,GAA4C;AACnE,UAAM,SAAwB,CAAC;AAC/B,UAAM,MAAM,KAAK,OAAO,kBAAkB,CAAC,CAAC;AAE5C,qBAAiB,SAAS,KAAK;AAC9B,UAAI,MAAM,SAAS,MAAM;AACxB,eAAO,KAAK,mBAAmB,KAAK,CAAC;AAAA,MACtC;AAAA,IACD;AAGA,WAAO,KAAK,CAAC,GAAG,MAAM;AACrB,YAAM,MAAM,EAAE,YAAY;AAC1B,YAAM,MAAM,EAAE,YAAY;AAC1B,aAAO,MAAM;AAAA,IACd,CAAC;AAED,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,MAAM,SAAiB,KAAyC;AACrE,UAAM,WAAW,MAAM,KAAK,OAAO,WAAW,SAAS,CAAC,GAAG,CAAC;AAC5D,WAAO,SAAS,CAAC,MAAM,OACpB,IAAI,YAAY,EAAE,OAAO,SAAS,CAAC,CAAC,IACpC;AAAA,EACJ;AAAA,EAEA,qBAAgD;AAC/C,WAAO;AAAA,MACN,YAAY;AAAA,QACX,GAAI,KAAK,OAAO,UACb,EAAE,MAAM,KAAK,OAAO,YAAY,IAChC,CAAC;AAAA,QACJ,WAAW,KAAK,OAAO,oBAAoB,SAAS;AAAA,MACrD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,kBAAkB;AACjB,WAAO;AAAA,MACN,WAAW,KAAK,OAAO;AAAA,MACvB,MAAM,KAAK,OAAO;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,uBAAuB,qBAAgD;AACtE,SAAK,uBAAuB;AAAA,EAC7B;AACD;AAEA,SAAS,mBAAmB,OAAuC;AAClE,SAAO;AAAA,IACN,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,UAAU,OAAO,MAAM,SAAS;AAAA,IAChC,SAAS,MAAM,YAAY,OAAO,OAAO,MAAM,OAAO,IAAI;AAAA,IAC1D,eACC,MAAM,kBAAkB,OAAO,OAAO,MAAM,aAAa,IAAI;AAAA,IAC9D,SAAS,MAAM,YAAY,OAAO,OAAO,MAAM,OAAO,IAAI;AAAA,IAC1D,WAAW,MAAM,cAAc,OAAO,OAAO,MAAM,SAAS,IAAI;AAAA,EACjE;AACD;AAEA,SAAS,oCAGP;AACD,QAAM,YAAY,IAAI,WAAW,CAAC;AAClC,QAAM,YAAY,IAAI,WAAW,CAAC;AAClC,SAAO,gBAAgB,SAAS;AAChC,SAAO,gBAAgB,SAAS;AAChC,SAAO;AAAA,IACN,WAAW,UAAU,OAAO,MAAM,CAAC;AAAA,IACnC,WAAW,UAAU,OAAO,MAAM,CAAC;AAAA,EACpC;AACD;;;AX5RA,IAAM,sCAAsC,EAAE,OAAO;AAAA;AAAA,EAEpD,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,iBAAiB,EAAE,QAAQ,EAAE,SAAS;AACvC,CAAC;AAMM,SAAS,+BACf,UAAmB,MACnB,SACe;AACf,yBAAuB;AAEvB,OAAI,mCAAS,qBAAoB,OAAO;AACvC,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAEA,QAAM,eAAwC;AAAA,IAC7C;AAAA,IACA,YAAY,mCAAS;AAAA,IACrB,iBAAiB;AAAA,EAClB;AACA,QAAM,QAAQ,IAAI,sBAAsB,YAAY;AACpD,QAAM,eAA6B;AAAA,IAClC,MAAM,UAAU,gBAAgB;AAAA,IAChC,aAAa,UAAU,gBAAgB;AAAA,IACvC,SAAS,CAACC,YACT,IAAI,wBAAwBA,SAAQ,OAAO,YAAY;AAAA,IACxD,OAAO,CAACA,SAAQ,eAAe,iBAAiB;AAC/C,YAAM,cAAc,IAAI;AAAA,QACvBA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAEA,YAAM,cAAcA,SAAQ,cAAc,WAAW;AAErD,aAAO;AAAA,IACR;AAAA,IACA,sBAAsB;AAAA,EACvB;AACA,SAAO;AACR;AAEO,SAAS,uBACf,MACe;AACf,QAAM,gBAAgB,OACnB,oCAAoC,MAAM,IAAI,IAC9C;AACH,SAAO,+BAA+B,MAAM,aAAa;AAC1D;AAEO,SAAS,qBAAmC;AAClD,SAAO,+BAA+B,KAAK;AAC5C;","names":["config","bare","config","read0","write0","readActorState","writeActorState","encodeActorState","decodeActorState","readActorAlarm","writeActorAlarm","encodeActorAlarm","decodeActorAlarm","bare","config","readActorKvEntry","writeActorKvEntry","read0","write0","read1","write1","readActorState","writeActorState","encodeActorState","decodeActorState","readActorAlarm","writeActorAlarm","encodeActorAlarm","decodeActorAlarm","decodeActorState","encodeActorState","decodeActorAlarm","encodeActorAlarm","logger","crypto","logger","crypto","config","invariant","config","invariant","config"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
bufferToArrayBuffer,
|
|
3
3
|
toUint8Array
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VWYO36X4.js";
|
|
5
5
|
|
|
6
6
|
// dist/schemas/transport/v1.ts
|
|
7
7
|
import * as bare from "@rivetkit/bare-ts";
|
|
@@ -531,4 +531,4 @@ export {
|
|
|
531
531
|
encodeWorkflowHistoryTransport,
|
|
532
532
|
decodeWorkflowHistoryTransport
|
|
533
533
|
};
|
|
534
|
-
//# sourceMappingURL=chunk-
|
|
534
|
+
//# sourceMappingURL=chunk-EONWXYMN.js.map
|
|
@@ -11,30 +11,59 @@ function isSqliteBindingValue(value) {
|
|
|
11
11
|
function toSqliteBindings(args) {
|
|
12
12
|
for (const value of args) {
|
|
13
13
|
if (!isSqliteBindingValue(value)) {
|
|
14
|
-
throw new Error(
|
|
15
|
-
`unsupported sqlite binding type: ${typeof value}`
|
|
16
|
-
);
|
|
14
|
+
throw new Error(`unsupported sqlite binding type: ${typeof value}`);
|
|
17
15
|
}
|
|
18
16
|
}
|
|
19
17
|
return args;
|
|
20
18
|
}
|
|
21
|
-
function createActorKvStore(kv) {
|
|
19
|
+
function createActorKvStore(kv, metrics) {
|
|
22
20
|
return {
|
|
23
21
|
get: async (key) => {
|
|
22
|
+
const start = performance.now();
|
|
24
23
|
const results = await kv.batchGet([key]);
|
|
24
|
+
if (metrics) {
|
|
25
|
+
metrics.kvGet.calls++;
|
|
26
|
+
metrics.kvGet.keys++;
|
|
27
|
+
metrics.kvGet.totalMs += performance.now() - start;
|
|
28
|
+
}
|
|
25
29
|
return results[0] ?? null;
|
|
26
30
|
},
|
|
27
31
|
getBatch: async (keys) => {
|
|
28
|
-
|
|
32
|
+
const start = performance.now();
|
|
33
|
+
const results = await kv.batchGet(keys);
|
|
34
|
+
if (metrics) {
|
|
35
|
+
metrics.kvGetBatch.calls++;
|
|
36
|
+
metrics.kvGetBatch.keys += keys.length;
|
|
37
|
+
metrics.kvGetBatch.totalMs += performance.now() - start;
|
|
38
|
+
}
|
|
39
|
+
return results;
|
|
29
40
|
},
|
|
30
41
|
put: async (key, value) => {
|
|
42
|
+
const start = performance.now();
|
|
31
43
|
await kv.batchPut([[key, value]]);
|
|
44
|
+
if (metrics) {
|
|
45
|
+
metrics.kvPut.calls++;
|
|
46
|
+
metrics.kvPut.keys++;
|
|
47
|
+
metrics.kvPut.totalMs += performance.now() - start;
|
|
48
|
+
}
|
|
32
49
|
},
|
|
33
50
|
putBatch: async (entries) => {
|
|
51
|
+
const start = performance.now();
|
|
34
52
|
await kv.batchPut(entries);
|
|
53
|
+
if (metrics) {
|
|
54
|
+
metrics.kvPutBatch.calls++;
|
|
55
|
+
metrics.kvPutBatch.keys += entries.length;
|
|
56
|
+
metrics.kvPutBatch.totalMs += performance.now() - start;
|
|
57
|
+
}
|
|
35
58
|
},
|
|
36
59
|
deleteBatch: async (keys) => {
|
|
60
|
+
const start = performance.now();
|
|
37
61
|
await kv.batchDelete(keys);
|
|
62
|
+
if (metrics) {
|
|
63
|
+
metrics.kvDeleteBatch.calls++;
|
|
64
|
+
metrics.kvDeleteBatch.keys += keys.length;
|
|
65
|
+
metrics.kvDeleteBatch.totalMs += performance.now() - start;
|
|
66
|
+
}
|
|
38
67
|
}
|
|
39
68
|
};
|
|
40
69
|
}
|
|
@@ -69,4 +98,4 @@ export {
|
|
|
69
98
|
createActorKvStore,
|
|
70
99
|
AsyncMutex
|
|
71
100
|
};
|
|
72
|
-
//# sourceMappingURL=chunk-
|
|
101
|
+
//# sourceMappingURL=chunk-GFGRBYO2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/shared.ts"],"sourcesContent":["import type { DatabaseProviderContext } from \"./config\";\nimport type { IDatabase } from \"@rivetkit/sqlite-vfs\";\nimport type { KvVfsOptions } from \"@rivetkit/sqlite-vfs\";\nimport type { ActorMetrics } from \"@/actor/metrics\";\n\ntype ActorKvOperations = DatabaseProviderContext[\"kv\"];\ntype SqliteBindings = NonNullable<Parameters<IDatabase[\"run\"]>[1]>;\n\nfunction isSqliteBindingValue(value: unknown): boolean {\n\tif (\n\t\tvalue === null ||\n\t\ttypeof value === \"number\" ||\n\t\ttypeof value === \"string\" ||\n\t\ttypeof value === \"bigint\" ||\n\t\tvalue instanceof Uint8Array\n\t) {\n\t\treturn true;\n\t}\n\n\tif (Array.isArray(value)) {\n\t\treturn value.every((item) => typeof item === \"number\");\n\t}\n\n\treturn false;\n}\n\nexport function toSqliteBindings(args: unknown[]): SqliteBindings {\n\tfor (const value of args) {\n\t\tif (!isSqliteBindingValue(value)) {\n\t\t\tthrow new Error(`unsupported sqlite binding type: ${typeof value}`);\n\t\t}\n\t}\n\n\treturn args as SqliteBindings;\n}\n\n/**\n * Create a KV store wrapper that uses the actor driver's KV operations.\n * Tracks per-operation metrics when an ActorMetrics instance is provided.\n */\nexport function createActorKvStore(\n\tkv: ActorKvOperations,\n\tmetrics?: ActorMetrics,\n): KvVfsOptions {\n\treturn {\n\t\tget: async (key: Uint8Array) => {\n\t\t\tconst start = performance.now();\n\t\t\tconst results = await kv.batchGet([key]);\n\t\t\tif (metrics) {\n\t\t\t\tmetrics.kvGet.calls++;\n\t\t\t\tmetrics.kvGet.keys++;\n\t\t\t\tmetrics.kvGet.totalMs += performance.now() - start;\n\t\t\t}\n\t\t\treturn results[0] ?? null;\n\t\t},\n\t\tgetBatch: async (keys: Uint8Array[]) => {\n\t\t\tconst start = performance.now();\n\t\t\tconst results = await kv.batchGet(keys);\n\t\t\tif (metrics) {\n\t\t\t\tmetrics.kvGetBatch.calls++;\n\t\t\t\tmetrics.kvGetBatch.keys += keys.length;\n\t\t\t\tmetrics.kvGetBatch.totalMs += performance.now() - start;\n\t\t\t}\n\t\t\treturn results;\n\t\t},\n\t\tput: async (key: Uint8Array, value: Uint8Array) => {\n\t\t\tconst start = performance.now();\n\t\t\tawait kv.batchPut([[key, value]]);\n\t\t\tif (metrics) {\n\t\t\t\tmetrics.kvPut.calls++;\n\t\t\t\tmetrics.kvPut.keys++;\n\t\t\t\tmetrics.kvPut.totalMs += performance.now() - start;\n\t\t\t}\n\t\t},\n\t\tputBatch: async (entries: [Uint8Array, Uint8Array][]) => {\n\t\t\tconst start = performance.now();\n\t\t\tawait kv.batchPut(entries);\n\t\t\tif (metrics) {\n\t\t\t\tmetrics.kvPutBatch.calls++;\n\t\t\t\tmetrics.kvPutBatch.keys += entries.length;\n\t\t\t\tmetrics.kvPutBatch.totalMs += performance.now() - start;\n\t\t\t}\n\t\t},\n\t\tdeleteBatch: async (keys: Uint8Array[]) => {\n\t\t\tconst start = performance.now();\n\t\t\tawait kv.batchDelete(keys);\n\t\t\tif (metrics) {\n\t\t\t\tmetrics.kvDeleteBatch.calls++;\n\t\t\t\tmetrics.kvDeleteBatch.keys += keys.length;\n\t\t\t\tmetrics.kvDeleteBatch.totalMs += performance.now() - start;\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Serialize async operations on a shared non-reentrant resource.\n */\nexport class AsyncMutex {\n\t#locked = false;\n\t#waiting: (() => void)[] = [];\n\n\tasync acquire(): Promise<void> {\n\t\twhile (this.#locked) {\n\t\t\tawait new Promise<void>((resolve) => this.#waiting.push(resolve));\n\t\t}\n\t\tthis.#locked = true;\n\t}\n\n\trelease(): void {\n\t\tthis.#locked = false;\n\t\tconst next = this.#waiting.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t}\n\t}\n\n\tasync run<T>(fn: () => Promise<T>): Promise<T> {\n\t\tawait this.acquire();\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} finally {\n\t\t\tthis.release();\n\t\t}\n\t}\n}\n"],"mappings":";AAQA,SAAS,qBAAqB,OAAyB;AACtD,MACC,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,iBAAiB,YAChB;AACD,WAAO;AAAA,EACR;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,MAAM,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ;AAAA,EACtD;AAEA,SAAO;AACR;AAEO,SAAS,iBAAiB,MAAiC;AACjE,aAAW,SAAS,MAAM;AACzB,QAAI,CAAC,qBAAqB,KAAK,GAAG;AACjC,YAAM,IAAI,MAAM,oCAAoC,OAAO,KAAK,EAAE;AAAA,IACnE;AAAA,EACD;AAEA,SAAO;AACR;AAMO,SAAS,mBACf,IACA,SACe;AACf,SAAO;AAAA,IACN,KAAK,OAAO,QAAoB;AAC/B,YAAM,QAAQ,YAAY,IAAI;AAC9B,YAAM,UAAU,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC;AACvC,UAAI,SAAS;AACZ,gBAAQ,MAAM;AACd,gBAAQ,MAAM;AACd,gBAAQ,MAAM,WAAW,YAAY,IAAI,IAAI;AAAA,MAC9C;AACA,aAAO,QAAQ,CAAC,KAAK;AAAA,IACtB;AAAA,IACA,UAAU,OAAO,SAAuB;AACvC,YAAM,QAAQ,YAAY,IAAI;AAC9B,YAAM,UAAU,MAAM,GAAG,SAAS,IAAI;AACtC,UAAI,SAAS;AACZ,gBAAQ,WAAW;AACnB,gBAAQ,WAAW,QAAQ,KAAK;AAChC,gBAAQ,WAAW,WAAW,YAAY,IAAI,IAAI;AAAA,MACnD;AACA,aAAO;AAAA,IACR;AAAA,IACA,KAAK,OAAO,KAAiB,UAAsB;AAClD,YAAM,QAAQ,YAAY,IAAI;AAC9B,YAAM,GAAG,SAAS,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;AAChC,UAAI,SAAS;AACZ,gBAAQ,MAAM;AACd,gBAAQ,MAAM;AACd,gBAAQ,MAAM,WAAW,YAAY,IAAI,IAAI;AAAA,MAC9C;AAAA,IACD;AAAA,IACA,UAAU,OAAO,YAAwC;AACxD,YAAM,QAAQ,YAAY,IAAI;AAC9B,YAAM,GAAG,SAAS,OAAO;AACzB,UAAI,SAAS;AACZ,gBAAQ,WAAW;AACnB,gBAAQ,WAAW,QAAQ,QAAQ;AACnC,gBAAQ,WAAW,WAAW,YAAY,IAAI,IAAI;AAAA,MACnD;AAAA,IACD;AAAA,IACA,aAAa,OAAO,SAAuB;AAC1C,YAAM,QAAQ,YAAY,IAAI;AAC9B,YAAM,GAAG,YAAY,IAAI;AACzB,UAAI,SAAS;AACZ,gBAAQ,cAAc;AACtB,gBAAQ,cAAc,QAAQ,KAAK;AACnC,gBAAQ,cAAc,WAAW,YAAY,IAAI,IAAI;AAAA,MACtD;AAAA,IACD;AAAA,EACD;AACD;AAKO,IAAM,aAAN,MAAiB;AAAA,EACvB,UAAU;AAAA,EACV,WAA2B,CAAC;AAAA,EAE5B,MAAM,UAAyB;AAC9B,WAAO,KAAK,SAAS;AACpB,YAAM,IAAI,QAAc,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,IACjE;AACA,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,UAAgB;AACf,SAAK,UAAU;AACf,UAAM,OAAO,KAAK,SAAS,MAAM;AACjC,QAAI,MAAM;AACT,WAAK;AAAA,IACN;AAAA,EACD;AAAA,EAEA,MAAM,IAAO,IAAkC;AAC9C,UAAM,KAAK,QAAQ;AACnB,QAAI;AACH,aAAO,MAAM,GAAG;AAAA,IACjB,UAAE;AACD,WAAK,QAAQ;AAAA,IACd;AAAA,EACD;AACD;","names":[]}
|