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,350 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session lifecycle management for the sandbox actor.
|
|
3
|
+
*
|
|
4
|
+
* Manages three concerns:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Subscription tracking** — which sandbox-agent sessions this actor is
|
|
7
|
+
* listening to for events and permission requests. Subscriptions are
|
|
8
|
+
* persisted in `state.subscribedSessionIds` so they survive sleep/wake.
|
|
9
|
+
*
|
|
10
|
+
* 2. **Active turn tracking** — detects when a session has an in-flight
|
|
11
|
+
* prompt turn by observing JSON-RPC envelopes on the event stream.
|
|
12
|
+
* A client `session/prompt` request starts a turn; the matching agent
|
|
13
|
+
* response (same JSON-RPC id) ends it. While any turn is active the
|
|
14
|
+
* actor prevents sleep.
|
|
15
|
+
*
|
|
16
|
+
* 3. **Idle timers** — if a turn appears stuck (no events for `warningAfterMs`),
|
|
17
|
+
* a warning is logged. After `staleAfterMs` the turn state is force-cleared
|
|
18
|
+
* so a missing terminal response cannot keep the actor awake forever.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import type { SessionPermissionRequest } from "sandbox-agent";
|
|
22
|
+
import type { SandboxActorConfig, SandboxActorOptionsRuntime } from "../config";
|
|
23
|
+
import type {
|
|
24
|
+
SandboxActionContext,
|
|
25
|
+
SandboxActorVars,
|
|
26
|
+
SandboxSessionEvent,
|
|
27
|
+
} from "../types";
|
|
28
|
+
|
|
29
|
+
// --- Prevent-sleep synchronization ---
|
|
30
|
+
|
|
31
|
+
export function syncPreventSleep<TConnParams>(
|
|
32
|
+
c: SandboxActionContext<TConnParams>,
|
|
33
|
+
): void {
|
|
34
|
+
c.setPreventSleep(
|
|
35
|
+
c.vars.activeHooks.size > 0 || c.vars.activeSessionIds.size > 0,
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// --- Session timer management ---
|
|
40
|
+
|
|
41
|
+
function clearTimerMap(
|
|
42
|
+
map: Map<string, ReturnType<typeof setTimeout>>,
|
|
43
|
+
sessionId: string,
|
|
44
|
+
): void {
|
|
45
|
+
const timeout = map.get(sessionId);
|
|
46
|
+
if (timeout) {
|
|
47
|
+
clearTimeout(timeout);
|
|
48
|
+
map.delete(sessionId);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function clearTimerMapAll(
|
|
53
|
+
map: Map<string, ReturnType<typeof setTimeout>>,
|
|
54
|
+
): void {
|
|
55
|
+
for (const timeout of map.values()) {
|
|
56
|
+
clearTimeout(timeout);
|
|
57
|
+
}
|
|
58
|
+
map.clear();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function clearSessionTimers(vars: SandboxActorVars, sessionId: string): void {
|
|
62
|
+
clearTimerMap(vars.warningTimeoutBySessionId, sessionId);
|
|
63
|
+
clearTimerMap(vars.staleTimeoutBySessionId, sessionId);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function clearAllSessionTimers(vars: SandboxActorVars): void {
|
|
67
|
+
clearTimerMapAll(vars.warningTimeoutBySessionId);
|
|
68
|
+
clearTimerMapAll(vars.staleTimeoutBySessionId);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Schedules warning and stale timeouts for a session based on the last
|
|
72
|
+
// event timestamp. If the session goes idle for too long, the stale
|
|
73
|
+
// timeout clears the active turn so the actor can sleep.
|
|
74
|
+
function scheduleSessionTimers<TConnParams>(
|
|
75
|
+
c: SandboxActionContext<TConnParams>,
|
|
76
|
+
options: SandboxActorOptionsRuntime,
|
|
77
|
+
sessionId: string,
|
|
78
|
+
): void {
|
|
79
|
+
clearSessionTimers(c.vars, sessionId);
|
|
80
|
+
|
|
81
|
+
const lastEventAt = c.vars.lastEventAtBySessionId.get(sessionId);
|
|
82
|
+
if (lastEventAt === undefined) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const warningDelay = Math.max(
|
|
87
|
+
0,
|
|
88
|
+
options.warningAfterMs - (Date.now() - lastEventAt),
|
|
89
|
+
);
|
|
90
|
+
c.vars.warningTimeoutBySessionId.set(
|
|
91
|
+
sessionId,
|
|
92
|
+
setTimeout(() => {
|
|
93
|
+
if (!c.vars.activeSessionIds.has(sessionId)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
c.log.warn({
|
|
98
|
+
msg: "sandbox actor turn is still active without new session events",
|
|
99
|
+
sessionId,
|
|
100
|
+
idleMs: Date.now() - lastEventAt,
|
|
101
|
+
});
|
|
102
|
+
}, warningDelay),
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
const staleDelay = Math.max(
|
|
106
|
+
0,
|
|
107
|
+
options.staleAfterMs - (Date.now() - lastEventAt),
|
|
108
|
+
);
|
|
109
|
+
c.vars.staleTimeoutBySessionId.set(
|
|
110
|
+
sessionId,
|
|
111
|
+
setTimeout(() => {
|
|
112
|
+
if (!c.vars.activeSessionIds.has(sessionId)) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
c.log.warn({
|
|
117
|
+
msg: "sandbox actor cleared stale active turn state after inactivity timeout",
|
|
118
|
+
sessionId,
|
|
119
|
+
idleMs: Date.now() - lastEventAt,
|
|
120
|
+
});
|
|
121
|
+
clearSessionActiveInMemory(c, sessionId);
|
|
122
|
+
syncPreventSleep(c);
|
|
123
|
+
}, staleDelay),
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// --- Session active-state tracking (in-memory only) ---
|
|
128
|
+
|
|
129
|
+
export function markSessionActiveInMemory<TConnParams>(
|
|
130
|
+
c: SandboxActionContext<TConnParams>,
|
|
131
|
+
options: SandboxActorOptionsRuntime,
|
|
132
|
+
sessionId: string,
|
|
133
|
+
requestId?: string,
|
|
134
|
+
): void {
|
|
135
|
+
c.vars.activeSessionIds.add(sessionId);
|
|
136
|
+
if (requestId) {
|
|
137
|
+
const requestIds =
|
|
138
|
+
c.vars.activePromptRequestIdsBySessionId.get(sessionId) ?? [];
|
|
139
|
+
if (!requestIds.includes(requestId)) {
|
|
140
|
+
requestIds.push(requestId);
|
|
141
|
+
c.vars.activePromptRequestIdsBySessionId.set(
|
|
142
|
+
sessionId,
|
|
143
|
+
requestIds,
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
c.vars.lastEventAtBySessionId.set(sessionId, Date.now());
|
|
149
|
+
scheduleSessionTimers(c, options, sessionId);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function clearSessionActiveInMemory<TConnParams>(
|
|
153
|
+
c: SandboxActionContext<TConnParams>,
|
|
154
|
+
sessionId: string,
|
|
155
|
+
requestId?: string,
|
|
156
|
+
): void {
|
|
157
|
+
if (requestId) {
|
|
158
|
+
const remaining =
|
|
159
|
+
(c.vars.activePromptRequestIdsBySessionId.get(sessionId) ?? []).filter(
|
|
160
|
+
(activeRequestId) => activeRequestId !== requestId,
|
|
161
|
+
);
|
|
162
|
+
if (remaining.length > 0) {
|
|
163
|
+
c.vars.activePromptRequestIdsBySessionId.set(
|
|
164
|
+
sessionId,
|
|
165
|
+
remaining,
|
|
166
|
+
);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
c.vars.activeSessionIds.delete(sessionId);
|
|
172
|
+
c.vars.activePromptRequestIdsBySessionId.delete(sessionId);
|
|
173
|
+
c.vars.lastEventAtBySessionId.delete(sessionId);
|
|
174
|
+
clearSessionTimers(c.vars, sessionId);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// --- Session subscription management ---
|
|
178
|
+
|
|
179
|
+
export function addSubscribedSession<TConnParams>(
|
|
180
|
+
c: SandboxActionContext<TConnParams>,
|
|
181
|
+
sessionId: string,
|
|
182
|
+
): void {
|
|
183
|
+
if (c.state.subscribedSessionIds.includes(sessionId)) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
c.state.subscribedSessionIds.push(sessionId);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function removeSubscribedSession<TConnParams>(
|
|
190
|
+
c: SandboxActionContext<TConnParams>,
|
|
191
|
+
sessionId: string,
|
|
192
|
+
): void {
|
|
193
|
+
clearSessionActiveInMemory(c, sessionId);
|
|
194
|
+
c.state.subscribedSessionIds = c.state.subscribedSessionIds.filter(
|
|
195
|
+
(id) => id !== sessionId,
|
|
196
|
+
);
|
|
197
|
+
syncPreventSleep(c);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function clearAllActiveSessions<TConnParams>(
|
|
201
|
+
c: SandboxActionContext<TConnParams>,
|
|
202
|
+
): void {
|
|
203
|
+
c.vars.activeSessionIds.clear();
|
|
204
|
+
c.vars.activePromptRequestIdsBySessionId.clear();
|
|
205
|
+
c.vars.lastEventAtBySessionId.clear();
|
|
206
|
+
clearAllSessionTimers(c.vars);
|
|
207
|
+
syncPreventSleep(c);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// --- Hook execution ---
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Wraps a user-provided callback (onSessionEvent, onPermissionRequest) with
|
|
214
|
+
* active-hook tracking and error isolation. The hook promise is added to
|
|
215
|
+
* `vars.activeHooks` so prevent-sleep stays accurate, and removed on
|
|
216
|
+
* completion. Errors are logged but do not crash the actor.
|
|
217
|
+
*/
|
|
218
|
+
function runHook<TConnParams>(
|
|
219
|
+
c: SandboxActionContext<TConnParams>,
|
|
220
|
+
sessionId: string,
|
|
221
|
+
name: "onSessionEvent" | "onPermissionRequest",
|
|
222
|
+
callback: () => void | Promise<void>,
|
|
223
|
+
): void {
|
|
224
|
+
const promise = Promise.resolve(callback())
|
|
225
|
+
.catch((error) => {
|
|
226
|
+
c.log.error({
|
|
227
|
+
msg: `sandbox actor ${name} hook failed`,
|
|
228
|
+
sessionId,
|
|
229
|
+
error,
|
|
230
|
+
});
|
|
231
|
+
})
|
|
232
|
+
.finally(() => {
|
|
233
|
+
c.vars.activeHooks.delete(promise);
|
|
234
|
+
syncPreventSleep(c);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
c.vars.activeHooks.add(promise);
|
|
238
|
+
syncPreventSleep(c);
|
|
239
|
+
|
|
240
|
+
c.waitUntil(promise);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// --- Turn tracking from session events ---
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Inspects raw JSON-RPC envelopes from the sandbox-agent event stream to
|
|
247
|
+
* detect prompt turn boundaries. A client-side `session/prompt` request
|
|
248
|
+
* marks the session active; the matching agent-side response (same
|
|
249
|
+
* JSON-RPC id) clears it. Any intermediate event refreshes the idle timer.
|
|
250
|
+
*/
|
|
251
|
+
export function trackSessionTurnFromEvent<TConnParams>(
|
|
252
|
+
c: SandboxActionContext<TConnParams>,
|
|
253
|
+
options: SandboxActorOptionsRuntime,
|
|
254
|
+
sessionId: string,
|
|
255
|
+
event: SandboxSessionEvent,
|
|
256
|
+
): void {
|
|
257
|
+
const payload = event.payload as Record<string, unknown> | null | undefined;
|
|
258
|
+
const method =
|
|
259
|
+
typeof payload?.method === "string" ? payload.method : null;
|
|
260
|
+
const rawId = payload?.id;
|
|
261
|
+
const id =
|
|
262
|
+
typeof rawId === "string"
|
|
263
|
+
? rawId
|
|
264
|
+
: typeof rawId === "number"
|
|
265
|
+
? String(rawId)
|
|
266
|
+
: null;
|
|
267
|
+
|
|
268
|
+
if (event.sender === "client" && method === "session/prompt") {
|
|
269
|
+
markSessionActiveInMemory(
|
|
270
|
+
c,
|
|
271
|
+
options,
|
|
272
|
+
sessionId,
|
|
273
|
+
id ?? `session-prompt:${event.id}`,
|
|
274
|
+
);
|
|
275
|
+
syncPreventSleep(c);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (!c.vars.activeSessionIds.has(sessionId)) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (event.sender === "agent" && id) {
|
|
284
|
+
const requestIds =
|
|
285
|
+
c.vars.activePromptRequestIdsBySessionId.get(sessionId) ?? [];
|
|
286
|
+
if (requestIds.length === 0 || requestIds.includes(id)) {
|
|
287
|
+
clearSessionActiveInMemory(c, sessionId, id);
|
|
288
|
+
syncPreventSleep(c);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Any other event from an active session refreshes the idle timer.
|
|
294
|
+
c.vars.lastEventAtBySessionId.set(sessionId, Date.now());
|
|
295
|
+
scheduleSessionTimers(c, options, sessionId);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// --- Session event subscriptions ---
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Subscribes to a session's event and permission streams on the live
|
|
302
|
+
* sandbox-agent connection. Tracks the unsubscribe callbacks so they
|
|
303
|
+
* can be cleaned up on teardown.
|
|
304
|
+
*/
|
|
305
|
+
export function subscribeToSession<TConnParams>(
|
|
306
|
+
c: SandboxActionContext<TConnParams>,
|
|
307
|
+
config: SandboxActorConfig<TConnParams>,
|
|
308
|
+
sessionId: string,
|
|
309
|
+
): void {
|
|
310
|
+
if (c.vars.unsubscribeBySessionId.has(sessionId)) {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
const client = c.vars.sandboxAgentClient;
|
|
315
|
+
if (!client) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
const options = config.options as SandboxActorOptionsRuntime;
|
|
320
|
+
|
|
321
|
+
const event = client.onSessionEvent(sessionId, (sessionEvent) => {
|
|
322
|
+
trackSessionTurnFromEvent(c, options, sessionId, sessionEvent);
|
|
323
|
+
|
|
324
|
+
if (!config.onSessionEvent) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
runHook(c, sessionId, "onSessionEvent", () =>
|
|
329
|
+
config.onSessionEvent!(c, sessionId, sessionEvent),
|
|
330
|
+
);
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
const permission = client.onPermissionRequest(
|
|
334
|
+
sessionId,
|
|
335
|
+
(request: SessionPermissionRequest) => {
|
|
336
|
+
markSessionActiveInMemory(c, options, sessionId);
|
|
337
|
+
syncPreventSleep(c);
|
|
338
|
+
|
|
339
|
+
if (!config.onPermissionRequest) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
runHook(c, sessionId, "onPermissionRequest", () =>
|
|
344
|
+
config.onPermissionRequest!(c, sessionId, request),
|
|
345
|
+
);
|
|
346
|
+
},
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
c.vars.unsubscribeBySessionId.set(sessionId, { event, permission });
|
|
350
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, test, vi } from "vitest";
|
|
2
|
+
import { setup } from "@/mod";
|
|
3
|
+
import { setupTest } from "@/test/mod";
|
|
4
|
+
import { sandboxActor } from "./index";
|
|
5
|
+
import type { SandboxProvider } from "sandbox-agent";
|
|
6
|
+
|
|
7
|
+
describe("sandbox actor direct URL access", () => {
|
|
8
|
+
test("getSandboxUrl provisions the sandbox without connecting the SDK", async (c) => {
|
|
9
|
+
const provider: SandboxProvider = {
|
|
10
|
+
name: "test",
|
|
11
|
+
create: vi.fn(async () => "sandbox-1"),
|
|
12
|
+
destroy: vi.fn(async () => {}),
|
|
13
|
+
getUrl: vi.fn(async (sandboxId) => `https://sandbox.example/${sandboxId}`),
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const registry = setup({
|
|
17
|
+
use: {
|
|
18
|
+
sandbox: sandboxActor({
|
|
19
|
+
provider,
|
|
20
|
+
}),
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
const { client } = await setupTest(c, registry);
|
|
24
|
+
const sandbox = client.sandbox.getOrCreate(["task-1"]);
|
|
25
|
+
|
|
26
|
+
const result = await sandbox.getSandboxUrl();
|
|
27
|
+
expect(result.url).toMatch(/^https:\/\/sandbox\.example\//);
|
|
28
|
+
expect(provider.create).toHaveBeenCalledTimes(1);
|
|
29
|
+
expect(provider.getUrl).toHaveBeenCalled();
|
|
30
|
+
|
|
31
|
+
await sandbox.destroy();
|
|
32
|
+
await expect(sandbox.getSandboxUrl()).rejects.toThrow(
|
|
33
|
+
"Internal error. Read the server logs for more details.",
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
});
|