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,151 @@
|
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
import type {
|
|
3
|
+
ActorContext,
|
|
4
|
+
BeforeConnectContext,
|
|
5
|
+
} from "@/actor/contexts";
|
|
6
|
+
import type { AnyDatabaseProvider } from "@/actor/database";
|
|
7
|
+
import type {
|
|
8
|
+
PermissionRequestListener,
|
|
9
|
+
SessionEventListener,
|
|
10
|
+
SandboxProvider,
|
|
11
|
+
} from "sandbox-agent";
|
|
12
|
+
import type {
|
|
13
|
+
SandboxActorVars,
|
|
14
|
+
SandboxActorState,
|
|
15
|
+
} from "./types";
|
|
16
|
+
|
|
17
|
+
const zFunction = <
|
|
18
|
+
T extends (...args: any[]) => any = (...args: unknown[]) => unknown,
|
|
19
|
+
>() => z.custom<T>((val) => typeof val === "function");
|
|
20
|
+
|
|
21
|
+
const SandboxProviderSchema = z.object({
|
|
22
|
+
name: z.string(),
|
|
23
|
+
create: zFunction<SandboxProvider["create"]>(),
|
|
24
|
+
destroy: zFunction<SandboxProvider["destroy"]>(),
|
|
25
|
+
getUrl: zFunction<NonNullable<SandboxProvider["getUrl"]>>().optional(),
|
|
26
|
+
getFetch: zFunction<NonNullable<SandboxProvider["getFetch"]>>().optional(),
|
|
27
|
+
ensureServer: zFunction<NonNullable<SandboxProvider["ensureServer"]>>().optional(),
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export const SandboxActorOptionsSchema = z
|
|
31
|
+
.object({
|
|
32
|
+
// Log if the actor still thinks a turn is active but no new session event
|
|
33
|
+
// has arrived for this long.
|
|
34
|
+
warningAfterMs: z.number().nonnegative().default(30_000),
|
|
35
|
+
// Clear active-turn state after this timeout so a missing terminal event
|
|
36
|
+
// cannot keep the actor awake forever.
|
|
37
|
+
staleAfterMs: z.number().positive().default(5 * 60_000),
|
|
38
|
+
})
|
|
39
|
+
.strict()
|
|
40
|
+
.prefault(() => ({}))
|
|
41
|
+
.transform((value) => ({
|
|
42
|
+
...value,
|
|
43
|
+
warningAfterMs: Math.min(value.warningAfterMs, value.staleAfterMs),
|
|
44
|
+
}));
|
|
45
|
+
|
|
46
|
+
export type SandboxActorOptions = z.input<typeof SandboxActorOptionsSchema>;
|
|
47
|
+
export type SandboxActorOptionsRuntime = z.infer<
|
|
48
|
+
typeof SandboxActorOptionsSchema
|
|
49
|
+
>;
|
|
50
|
+
|
|
51
|
+
// This schema validates the config at runtime. Generic callback types are
|
|
52
|
+
// defined separately below following the same pattern as ActorConfigSchema:
|
|
53
|
+
// infer from the schema, omit function keys, then intersect typed callbacks.
|
|
54
|
+
export const SandboxActorConfigSchema = z
|
|
55
|
+
.object({
|
|
56
|
+
provider: SandboxProviderSchema.optional(),
|
|
57
|
+
createProvider: zFunction().optional(),
|
|
58
|
+
persistRawEvents: z.boolean().optional(),
|
|
59
|
+
destroyActor: z.boolean().default(false),
|
|
60
|
+
options: SandboxActorOptionsSchema,
|
|
61
|
+
onBeforeConnect: zFunction().optional(),
|
|
62
|
+
onSessionEvent: zFunction().optional(),
|
|
63
|
+
onPermissionRequest: zFunction().optional(),
|
|
64
|
+
})
|
|
65
|
+
.strict()
|
|
66
|
+
.refine(
|
|
67
|
+
(data) =>
|
|
68
|
+
(data.provider !== undefined) !==
|
|
69
|
+
(data.createProvider !== undefined),
|
|
70
|
+
{
|
|
71
|
+
message:
|
|
72
|
+
"Sandbox actor config must define exactly one of 'provider' or 'createProvider'",
|
|
73
|
+
},
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// --- Typed config types (generic callbacks overlaid on the Zod schema) ---
|
|
77
|
+
|
|
78
|
+
type SandboxActorContext<TConnParams> = ActorContext<
|
|
79
|
+
SandboxActorState,
|
|
80
|
+
TConnParams,
|
|
81
|
+
undefined,
|
|
82
|
+
SandboxActorVars,
|
|
83
|
+
undefined,
|
|
84
|
+
AnyDatabaseProvider
|
|
85
|
+
>;
|
|
86
|
+
|
|
87
|
+
interface SandboxActorConfigCallbacks<TConnParams> {
|
|
88
|
+
onBeforeConnect?: (
|
|
89
|
+
c: BeforeConnectContext<
|
|
90
|
+
SandboxActorState,
|
|
91
|
+
SandboxActorVars,
|
|
92
|
+
undefined,
|
|
93
|
+
AnyDatabaseProvider
|
|
94
|
+
>,
|
|
95
|
+
params: TConnParams,
|
|
96
|
+
) => void | Promise<void>;
|
|
97
|
+
onSessionEvent?: (
|
|
98
|
+
c: SandboxActorContext<TConnParams>,
|
|
99
|
+
sessionId: string,
|
|
100
|
+
event: Parameters<SessionEventListener>[0],
|
|
101
|
+
) => void | Promise<void>;
|
|
102
|
+
onPermissionRequest?: (
|
|
103
|
+
c: SandboxActorContext<TConnParams>,
|
|
104
|
+
sessionId: string,
|
|
105
|
+
request: Parameters<PermissionRequestListener>[0],
|
|
106
|
+
) => void | Promise<void>;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
type SandboxActorProviderConfig<TConnParams> =
|
|
110
|
+
| {
|
|
111
|
+
provider: SandboxProvider;
|
|
112
|
+
createProvider?: never;
|
|
113
|
+
}
|
|
114
|
+
| {
|
|
115
|
+
provider?: never;
|
|
116
|
+
createProvider: (
|
|
117
|
+
c: SandboxActorContext<TConnParams>,
|
|
118
|
+
) => SandboxProvider | Promise<SandboxProvider>;
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
// Parsed config (after Zod defaults/transforms applied).
|
|
122
|
+
export type SandboxActorConfig<TConnParams = undefined> = Omit<
|
|
123
|
+
z.infer<typeof SandboxActorConfigSchema>,
|
|
124
|
+
| "provider"
|
|
125
|
+
| "createProvider"
|
|
126
|
+
| "onBeforeConnect"
|
|
127
|
+
| "onSessionEvent"
|
|
128
|
+
| "onPermissionRequest"
|
|
129
|
+
> &
|
|
130
|
+
SandboxActorConfigCallbacks<TConnParams> &
|
|
131
|
+
SandboxActorProviderConfig<TConnParams>;
|
|
132
|
+
|
|
133
|
+
// Input config (what users pass in before Zod transforms).
|
|
134
|
+
export type SandboxActorConfigInput<TConnParams = undefined> = Omit<
|
|
135
|
+
z.input<typeof SandboxActorConfigSchema>,
|
|
136
|
+
| "provider"
|
|
137
|
+
| "createProvider"
|
|
138
|
+
| "onBeforeConnect"
|
|
139
|
+
| "onSessionEvent"
|
|
140
|
+
| "onPermissionRequest"
|
|
141
|
+
> &
|
|
142
|
+
SandboxActorConfigCallbacks<TConnParams> &
|
|
143
|
+
SandboxActorProviderConfig<TConnParams>;
|
|
144
|
+
|
|
145
|
+
export type SandboxActorBeforeConnectContext<TConnParams = undefined> =
|
|
146
|
+
BeforeConnectContext<
|
|
147
|
+
SandboxActorState,
|
|
148
|
+
SandboxActorVars,
|
|
149
|
+
undefined,
|
|
150
|
+
AnyDatabaseProvider
|
|
151
|
+
>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export { sandboxActor } from "./actor/index";
|
|
2
|
+
export * from "./client";
|
|
3
|
+
export {
|
|
4
|
+
type SandboxActorBeforeConnectContext,
|
|
5
|
+
type SandboxActorConfig,
|
|
6
|
+
type SandboxActorConfigInput,
|
|
7
|
+
type SandboxActorOptions,
|
|
8
|
+
type SandboxActorOptionsRuntime,
|
|
9
|
+
SandboxActorConfigSchema,
|
|
10
|
+
SandboxActorOptionsSchema,
|
|
11
|
+
} from "./config";
|
|
12
|
+
export {
|
|
13
|
+
type SandboxActionContext,
|
|
14
|
+
type SandboxActorActions,
|
|
15
|
+
type SandboxActorProvider,
|
|
16
|
+
type SandboxActorVars,
|
|
17
|
+
type SandboxActorRuntime,
|
|
18
|
+
type SandboxActorState,
|
|
19
|
+
type SandboxSessionEvent,
|
|
20
|
+
SANDBOX_AGENT_ACTION_METHODS,
|
|
21
|
+
SANDBOX_AGENT_HOOK_METHODS,
|
|
22
|
+
} from "./types";
|
|
23
|
+
export type {
|
|
24
|
+
PermissionReply,
|
|
25
|
+
ProcessLogFollowQuery,
|
|
26
|
+
ProcessLogListener,
|
|
27
|
+
ProcessLogSubscription,
|
|
28
|
+
ProcessTerminalConnectOptions,
|
|
29
|
+
ProcessTerminalSession,
|
|
30
|
+
ProcessTerminalSessionOptions,
|
|
31
|
+
ProcessTerminalWebSocketUrlOptions,
|
|
32
|
+
SandboxAgent,
|
|
33
|
+
SandboxProvider,
|
|
34
|
+
Session,
|
|
35
|
+
SessionCreateRequest,
|
|
36
|
+
SessionEvent,
|
|
37
|
+
SessionPermissionRequest,
|
|
38
|
+
SessionRecord,
|
|
39
|
+
SessionResumeOrCreateRequest,
|
|
40
|
+
SessionSendOptions,
|
|
41
|
+
} from "sandbox-agent";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "sandbox-agent/computesdk";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "sandbox-agent/daytona";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "sandbox-agent/docker";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "sandbox-agent/e2b";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "sandbox-agent/local";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "sandbox-agent/modal";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "sandbox-agent/vercel";
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import type { RawAccess } from "@/db/config";
|
|
2
|
+
import type {
|
|
3
|
+
ListEventsRequest,
|
|
4
|
+
ListPage,
|
|
5
|
+
ListPageRequest,
|
|
6
|
+
SessionEvent,
|
|
7
|
+
SessionPersistDriver,
|
|
8
|
+
SessionRecord,
|
|
9
|
+
} from "sandbox-agent";
|
|
10
|
+
|
|
11
|
+
type PersistSessionRow = {
|
|
12
|
+
record_json: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type PersistEventRow = {
|
|
16
|
+
id: string;
|
|
17
|
+
event_index: number;
|
|
18
|
+
session_id: string;
|
|
19
|
+
created_at: number;
|
|
20
|
+
connection_id: string;
|
|
21
|
+
sender: SessionEvent["sender"];
|
|
22
|
+
payload_json: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
function parseCursor(cursor?: string): number {
|
|
26
|
+
if (!cursor) {
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const value = Number(cursor);
|
|
31
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return Math.floor(value);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function nextCursor(
|
|
39
|
+
offset: number,
|
|
40
|
+
limit: number,
|
|
41
|
+
itemCount: number,
|
|
42
|
+
): string | undefined {
|
|
43
|
+
if (itemCount < limit) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return String(offset + itemCount);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export class SqliteSessionPersistDriver implements SessionPersistDriver {
|
|
51
|
+
#db: RawAccess;
|
|
52
|
+
#persistRawEvents: boolean;
|
|
53
|
+
|
|
54
|
+
constructor(db: RawAccess, persistRawEvents: boolean) {
|
|
55
|
+
this.#db = db;
|
|
56
|
+
this.#persistRawEvents = persistRawEvents;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async getSession(id: string): Promise<SessionRecord | undefined> {
|
|
60
|
+
const rows = await this.#db.execute<PersistSessionRow>(
|
|
61
|
+
"SELECT record_json FROM sandbox_agent_sessions WHERE id = ? LIMIT 1",
|
|
62
|
+
id,
|
|
63
|
+
);
|
|
64
|
+
const row = rows[0];
|
|
65
|
+
if (!row) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
return JSON.parse(row.record_json) as SessionRecord;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async listSessions(
|
|
72
|
+
request: ListPageRequest = {},
|
|
73
|
+
): Promise<ListPage<SessionRecord>> {
|
|
74
|
+
const limit = request.limit ?? 50;
|
|
75
|
+
const offset = parseCursor(request.cursor);
|
|
76
|
+
const rows = await this.#db.execute<PersistSessionRow>(
|
|
77
|
+
`
|
|
78
|
+
SELECT record_json
|
|
79
|
+
FROM sandbox_agent_sessions
|
|
80
|
+
ORDER BY created_at DESC, id DESC
|
|
81
|
+
LIMIT ? OFFSET ?
|
|
82
|
+
`,
|
|
83
|
+
limit,
|
|
84
|
+
offset,
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
items: rows.map((row) => JSON.parse(row.record_json) as SessionRecord),
|
|
89
|
+
nextCursor: nextCursor(offset, limit, rows.length),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async updateSession(session: SessionRecord): Promise<void> {
|
|
94
|
+
await this.#db.execute(
|
|
95
|
+
`
|
|
96
|
+
INSERT INTO sandbox_agent_sessions (id, created_at, record_json)
|
|
97
|
+
VALUES (?, ?, ?)
|
|
98
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
99
|
+
created_at = excluded.created_at,
|
|
100
|
+
record_json = excluded.record_json
|
|
101
|
+
`,
|
|
102
|
+
session.id,
|
|
103
|
+
session.createdAt,
|
|
104
|
+
JSON.stringify(session),
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async listEvents(
|
|
109
|
+
request: ListEventsRequest,
|
|
110
|
+
): Promise<ListPage<SessionEvent>> {
|
|
111
|
+
const limit = request.limit ?? 200;
|
|
112
|
+
const offset = parseCursor(request.cursor);
|
|
113
|
+
const rows = await this.#db.execute<PersistEventRow>(
|
|
114
|
+
`
|
|
115
|
+
SELECT
|
|
116
|
+
id,
|
|
117
|
+
event_index,
|
|
118
|
+
session_id,
|
|
119
|
+
created_at,
|
|
120
|
+
connection_id,
|
|
121
|
+
sender,
|
|
122
|
+
payload_json
|
|
123
|
+
FROM sandbox_agent_events
|
|
124
|
+
WHERE session_id = ?
|
|
125
|
+
ORDER BY event_index ASC
|
|
126
|
+
LIMIT ? OFFSET ?
|
|
127
|
+
`,
|
|
128
|
+
request.sessionId,
|
|
129
|
+
limit,
|
|
130
|
+
offset,
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
items: rows.map((row) => ({
|
|
135
|
+
id: row.id,
|
|
136
|
+
eventIndex: row.event_index,
|
|
137
|
+
sessionId: row.session_id,
|
|
138
|
+
createdAt: row.created_at,
|
|
139
|
+
connectionId: row.connection_id,
|
|
140
|
+
sender: row.sender,
|
|
141
|
+
payload: JSON.parse(row.payload_json),
|
|
142
|
+
} satisfies SessionEvent)),
|
|
143
|
+
nextCursor: nextCursor(offset, limit, rows.length),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
async insertEvent(_sessionId: string, event: SessionEvent): Promise<void> {
|
|
148
|
+
const payload = JSON.stringify(event.payload);
|
|
149
|
+
await this.#db.execute(
|
|
150
|
+
`
|
|
151
|
+
INSERT INTO sandbox_agent_events (
|
|
152
|
+
id,
|
|
153
|
+
session_id,
|
|
154
|
+
event_index,
|
|
155
|
+
created_at,
|
|
156
|
+
connection_id,
|
|
157
|
+
sender,
|
|
158
|
+
payload_json,
|
|
159
|
+
raw_payload_json
|
|
160
|
+
)
|
|
161
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
162
|
+
ON CONFLICT(session_id, event_index) DO UPDATE SET
|
|
163
|
+
id = excluded.id,
|
|
164
|
+
created_at = excluded.created_at,
|
|
165
|
+
connection_id = excluded.connection_id,
|
|
166
|
+
sender = excluded.sender,
|
|
167
|
+
payload_json = excluded.payload_json,
|
|
168
|
+
raw_payload_json = excluded.raw_payload_json
|
|
169
|
+
`,
|
|
170
|
+
event.id,
|
|
171
|
+
event.sessionId,
|
|
172
|
+
event.eventIndex,
|
|
173
|
+
event.createdAt,
|
|
174
|
+
event.connectionId,
|
|
175
|
+
event.sender,
|
|
176
|
+
payload,
|
|
177
|
+
this.#persistRawEvents ? payload : null,
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { ActionContext } from "@/actor/contexts";
|
|
2
|
+
import type { DatabaseProvider } from "@/actor/database";
|
|
3
|
+
import type { RawAccess } from "@/db/config";
|
|
4
|
+
import type {
|
|
5
|
+
SandboxAgent,
|
|
6
|
+
SandboxProvider,
|
|
7
|
+
} from "sandbox-agent";
|
|
8
|
+
|
|
9
|
+
export type { SandboxProvider };
|
|
10
|
+
|
|
11
|
+
/** @deprecated Use `SandboxProvider` from `sandbox-agent` instead. */
|
|
12
|
+
export type SandboxActorProvider = SandboxProvider;
|
|
13
|
+
|
|
14
|
+
// Keep this split in lockstep with the sandbox-agent SDK. Hooks should match the
|
|
15
|
+
// SDK callback methods, and actions should match every other SDK instance
|
|
16
|
+
// method. Update these lists and the parity test together when sandbox-agent
|
|
17
|
+
// changes.
|
|
18
|
+
export const SANDBOX_AGENT_HOOK_METHODS = [
|
|
19
|
+
"onSessionEvent",
|
|
20
|
+
"onPermissionRequest",
|
|
21
|
+
] as const;
|
|
22
|
+
|
|
23
|
+
export type SandboxActorHookMethodName =
|
|
24
|
+
(typeof SANDBOX_AGENT_HOOK_METHODS)[number];
|
|
25
|
+
|
|
26
|
+
export const SANDBOX_AGENT_ACTION_METHODS = [
|
|
27
|
+
"dispose",
|
|
28
|
+
"listSessions",
|
|
29
|
+
"getSession",
|
|
30
|
+
"getEvents",
|
|
31
|
+
"createSession",
|
|
32
|
+
"resumeSession",
|
|
33
|
+
"resumeOrCreateSession",
|
|
34
|
+
"destroySandbox",
|
|
35
|
+
"destroySession",
|
|
36
|
+
"setSessionMode",
|
|
37
|
+
"setSessionConfigOption",
|
|
38
|
+
"setSessionModel",
|
|
39
|
+
"setSessionThoughtLevel",
|
|
40
|
+
"getSessionConfigOptions",
|
|
41
|
+
"getSessionModes",
|
|
42
|
+
"rawSendSessionMethod",
|
|
43
|
+
"respondPermission",
|
|
44
|
+
"rawRespondPermission",
|
|
45
|
+
"getHealth",
|
|
46
|
+
"listAgents",
|
|
47
|
+
"getAgent",
|
|
48
|
+
"installAgent",
|
|
49
|
+
"listAcpServers",
|
|
50
|
+
"listFsEntries",
|
|
51
|
+
"readFsFile",
|
|
52
|
+
"writeFsFile",
|
|
53
|
+
"deleteFsEntry",
|
|
54
|
+
"mkdirFs",
|
|
55
|
+
"moveFs",
|
|
56
|
+
"statFs",
|
|
57
|
+
"uploadFsBatch",
|
|
58
|
+
"getMcpConfig",
|
|
59
|
+
"setMcpConfig",
|
|
60
|
+
"deleteMcpConfig",
|
|
61
|
+
"getSkillsConfig",
|
|
62
|
+
"setSkillsConfig",
|
|
63
|
+
"deleteSkillsConfig",
|
|
64
|
+
"getProcessConfig",
|
|
65
|
+
"setProcessConfig",
|
|
66
|
+
"createProcess",
|
|
67
|
+
"runProcess",
|
|
68
|
+
"listProcesses",
|
|
69
|
+
"getProcess",
|
|
70
|
+
"stopProcess",
|
|
71
|
+
"killProcess",
|
|
72
|
+
"deleteProcess",
|
|
73
|
+
"getProcessLogs",
|
|
74
|
+
"followProcessLogs",
|
|
75
|
+
"sendProcessInput",
|
|
76
|
+
"resizeProcessTerminal",
|
|
77
|
+
"buildProcessTerminalWebSocketUrl",
|
|
78
|
+
"connectProcessTerminalWebSocket",
|
|
79
|
+
"connectProcessTerminal",
|
|
80
|
+
] as const;
|
|
81
|
+
|
|
82
|
+
export type SandboxAgentActionMethodName =
|
|
83
|
+
(typeof SANDBOX_AGENT_ACTION_METHODS)[number];
|
|
84
|
+
|
|
85
|
+
export type SandboxActorActions = Pick<
|
|
86
|
+
SandboxAgent,
|
|
87
|
+
SandboxAgentActionMethodName
|
|
88
|
+
>;
|
|
89
|
+
|
|
90
|
+
export type SandboxSessionEvent = Parameters<
|
|
91
|
+
Parameters<SandboxAgent["onSessionEvent"]>[1]
|
|
92
|
+
>[0];
|
|
93
|
+
|
|
94
|
+
export interface SandboxActorState {
|
|
95
|
+
sandboxId: string | null;
|
|
96
|
+
providerName: string | null;
|
|
97
|
+
/** Persisted so that on wake, the actor knows which sessions to
|
|
98
|
+
* re-subscribe to when reconnecting to the sandbox agent. Without
|
|
99
|
+
* this, event listeners would be lost after a sleep/wake cycle. */
|
|
100
|
+
subscribedSessionIds: string[];
|
|
101
|
+
sandboxDestroyed: boolean;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface SandboxActorVars {
|
|
105
|
+
sandboxAgentClient: SandboxAgent | null;
|
|
106
|
+
provider: SandboxProvider | null;
|
|
107
|
+
activeSessionIds: Set<string>;
|
|
108
|
+
activePromptRequestIdsBySessionId: Map<string, string[]>;
|
|
109
|
+
lastEventAtBySessionId: Map<string, number>;
|
|
110
|
+
unsubscribeBySessionId: Map<
|
|
111
|
+
string,
|
|
112
|
+
{
|
|
113
|
+
event?: () => void;
|
|
114
|
+
permission?: () => void;
|
|
115
|
+
}
|
|
116
|
+
>;
|
|
117
|
+
/** Tracks in-flight hook promises. Size is used instead of a counter
|
|
118
|
+
* to avoid increment/decrement mismatch bugs. */
|
|
119
|
+
activeHooks: Set<Promise<void>>;
|
|
120
|
+
warningTimeoutBySessionId: Map<string, ReturnType<typeof setTimeout>>;
|
|
121
|
+
staleTimeoutBySessionId: Map<string, ReturnType<typeof setTimeout>>;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** @deprecated Use `SandboxActorVars` instead. */
|
|
125
|
+
export type SandboxActorRuntime = SandboxActorVars;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Action context type used by the sandbox actor implementation for session
|
|
129
|
+
* management, proxy actions, and lifecycle hooks.
|
|
130
|
+
*/
|
|
131
|
+
export type SandboxActionContext<TConnParams = undefined> = ActionContext<
|
|
132
|
+
SandboxActorState,
|
|
133
|
+
TConnParams,
|
|
134
|
+
undefined,
|
|
135
|
+
SandboxActorVars,
|
|
136
|
+
undefined,
|
|
137
|
+
DatabaseProvider<RawAccess>
|
|
138
|
+
>;
|
|
@@ -49,15 +49,17 @@ export async function configureServerlessRunner(
|
|
|
49
49
|
serverless: {
|
|
50
50
|
url: customConfig.url,
|
|
51
51
|
headers: customConfig.headers ?? {},
|
|
52
|
-
max_runners: customConfig.maxRunners ??
|
|
52
|
+
max_runners: customConfig.maxRunners ?? 100_000,
|
|
53
53
|
min_runners: customConfig.minRunners ?? 0,
|
|
54
54
|
request_lifespan: customConfig.requestLifespan ?? 15 * 60,
|
|
55
55
|
runners_margin: customConfig.runnersMargin ?? 0,
|
|
56
56
|
slots_per_runner: customConfig.slotsPerRunner ?? 1,
|
|
57
|
-
metadata_poll_interval:
|
|
57
|
+
metadata_poll_interval:
|
|
58
|
+
customConfig.metadataPollInterval ?? 1000,
|
|
58
59
|
},
|
|
59
60
|
metadata: customConfig.metadata ?? {},
|
|
60
|
-
drain_on_version_upgrade:
|
|
61
|
+
drain_on_version_upgrade:
|
|
62
|
+
customConfig.drainOnVersionUpgrade ?? true,
|
|
61
63
|
metadataPollInterval: customConfig.metadataPollInterval ?? 1000,
|
|
62
64
|
};
|
|
63
65
|
await updateRunnerConfig(clientConfig, runnerName, {
|
|
@@ -78,9 +78,9 @@ describe("normalizeEndpointUrl", () => {
|
|
|
78
78
|
|
|
79
79
|
describe("regional endpoint normalization", () => {
|
|
80
80
|
test("normalizes api-us-west-1.rivet.dev to api.rivet.dev", () => {
|
|
81
|
-
expect(
|
|
82
|
-
"https://api.rivet.dev
|
|
83
|
-
);
|
|
81
|
+
expect(
|
|
82
|
+
normalizeEndpointUrl("https://api-us-west-1.rivet.dev"),
|
|
83
|
+
).toBe("https://api.rivet.dev/");
|
|
84
84
|
});
|
|
85
85
|
|
|
86
86
|
test("normalizes api-lax.staging.rivet.dev to api.staging.rivet.dev", () => {
|
|
@@ -102,14 +102,16 @@ describe("normalizeEndpointUrl", () => {
|
|
|
102
102
|
});
|
|
103
103
|
|
|
104
104
|
test("does not normalize non-rivet.dev domains", () => {
|
|
105
|
-
expect(
|
|
106
|
-
"https://api-us-west-1.example.com
|
|
107
|
-
);
|
|
105
|
+
expect(
|
|
106
|
+
normalizeEndpointUrl("https://api-us-west-1.example.com"),
|
|
107
|
+
).toBe("https://api-us-west-1.example.com/");
|
|
108
108
|
});
|
|
109
109
|
|
|
110
110
|
test("preserves path when normalizing regional endpoint", () => {
|
|
111
111
|
expect(
|
|
112
|
-
normalizeEndpointUrl(
|
|
112
|
+
normalizeEndpointUrl(
|
|
113
|
+
"https://api-us-west-1.rivet.dev/v1/actors",
|
|
114
|
+
),
|
|
113
115
|
).toBe("https://api.rivet.dev/v1/actors");
|
|
114
116
|
});
|
|
115
117
|
|
|
@@ -136,7 +138,10 @@ describe("endpointsMatch", () => {
|
|
|
136
138
|
|
|
137
139
|
test("matches URLs with paths ignoring trailing slash", () => {
|
|
138
140
|
expect(
|
|
139
|
-
endpointsMatch(
|
|
141
|
+
endpointsMatch(
|
|
142
|
+
"http://example.com/api/v1",
|
|
143
|
+
"http://example.com/api/v1/",
|
|
144
|
+
),
|
|
140
145
|
).toBe(true);
|
|
141
146
|
});
|
|
142
147
|
|
|
@@ -178,7 +183,10 @@ describe("endpointsMatch", () => {
|
|
|
178
183
|
|
|
179
184
|
test("does not match different paths", () => {
|
|
180
185
|
expect(
|
|
181
|
-
endpointsMatch(
|
|
186
|
+
endpointsMatch(
|
|
187
|
+
"http://example.com/api/v1",
|
|
188
|
+
"http://example.com/api/v2",
|
|
189
|
+
),
|
|
182
190
|
).toBe(false);
|
|
183
191
|
});
|
|
184
192
|
|
package/src/serverless/router.ts
CHANGED
|
@@ -38,7 +38,7 @@ export function buildServerlessRouter(
|
|
|
38
38
|
if (!parseResult.success) {
|
|
39
39
|
throw new InvalidRequest(
|
|
40
40
|
parseResult.error.issues[0]?.message ??
|
|
41
|
-
|
|
41
|
+
"invalid serverless start headers",
|
|
42
42
|
);
|
|
43
43
|
}
|
|
44
44
|
const { endpoint, token, totalSlots, runnerName, namespace } =
|
|
@@ -68,34 +68,41 @@ export function buildServerlessRouter(
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
const newConfig: RegistryConfig = {
|
|
71
|
+
const sharedConfig: RegistryConfig = {
|
|
73
72
|
...config,
|
|
74
|
-
endpoint
|
|
75
|
-
namespace
|
|
76
|
-
token: token,
|
|
73
|
+
endpoint,
|
|
74
|
+
namespace,
|
|
77
75
|
runner: {
|
|
78
76
|
...config.runner,
|
|
79
|
-
totalSlots
|
|
80
|
-
runnerName
|
|
81
|
-
// Not supported on serverless
|
|
82
|
-
runnerKey: undefined,
|
|
77
|
+
totalSlots,
|
|
78
|
+
runnerName,
|
|
83
79
|
},
|
|
84
80
|
};
|
|
81
|
+
const runnerConfig: RegistryConfig = {
|
|
82
|
+
...sharedConfig,
|
|
83
|
+
token,
|
|
84
|
+
};
|
|
85
|
+
const clientConfig: RegistryConfig = {
|
|
86
|
+
...sharedConfig,
|
|
87
|
+
// Preserve the configured application token for actor-to-actor
|
|
88
|
+
// calls. The start token is only needed for the runner
|
|
89
|
+
// connection and may not have gateway permissions.
|
|
90
|
+
token: config.token ?? token,
|
|
91
|
+
};
|
|
85
92
|
|
|
86
93
|
// Create manager driver on demand based on the properties provided
|
|
87
94
|
// by headers
|
|
88
95
|
//
|
|
89
|
-
// NOTE: This relies on the `
|
|
96
|
+
// NOTE: This relies on the `runnerConfig.runner.runnerName` to
|
|
90
97
|
// configure which runner to create actors on.
|
|
91
98
|
const managerDriver = new RemoteManagerDriver(
|
|
92
|
-
convertRegistryConfigToClientConfig(
|
|
99
|
+
convertRegistryConfigToClientConfig(clientConfig),
|
|
93
100
|
);
|
|
94
101
|
const client = createClientWithDriver(managerDriver);
|
|
95
102
|
|
|
96
103
|
// Create new actor driver with updated config
|
|
97
104
|
const actorDriver = driverConfig.actor(
|
|
98
|
-
|
|
105
|
+
runnerConfig,
|
|
99
106
|
managerDriver,
|
|
100
107
|
client,
|
|
101
108
|
);
|
package/src/test/mod.ts
CHANGED
|
@@ -23,10 +23,9 @@ export async function setupTest<A extends Registry<any>>(
|
|
|
23
23
|
registry.config.test = { ...registry.config.test, enabled: true };
|
|
24
24
|
|
|
25
25
|
// Create driver
|
|
26
|
-
const driver = createFileSystemOrMemoryDriver(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
);
|
|
26
|
+
const driver = createFileSystemOrMemoryDriver(true, {
|
|
27
|
+
path: `/tmp/rivetkit-test-${crypto.randomUUID()}`,
|
|
28
|
+
});
|
|
30
29
|
|
|
31
30
|
// Build driver config
|
|
32
31
|
// biome-ignore lint/style/useConst: Assigned later
|