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,761 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildTerminalWebSocketUrl,
|
|
3
|
+
connectTerminal,
|
|
4
|
+
deleteFile,
|
|
5
|
+
downloadFile,
|
|
6
|
+
followProcessLogs,
|
|
7
|
+
listFiles,
|
|
8
|
+
mkdirFs,
|
|
9
|
+
moveFile,
|
|
10
|
+
statFile,
|
|
11
|
+
uploadBatch,
|
|
12
|
+
uploadFile
|
|
13
|
+
} from "../chunk-JRKPV5NJ.js";
|
|
14
|
+
import {
|
|
15
|
+
actor
|
|
16
|
+
} from "../chunk-UQZRMTM3.js";
|
|
17
|
+
import "../chunk-YGYGANCA.js";
|
|
18
|
+
import "../chunk-EONWXYMN.js";
|
|
19
|
+
import {
|
|
20
|
+
db
|
|
21
|
+
} from "../chunk-MLK3GY6P.js";
|
|
22
|
+
import "../chunk-GFGRBYO2.js";
|
|
23
|
+
import "../chunk-PQWI44WD.js";
|
|
24
|
+
import "../chunk-LXUQ667X.js";
|
|
25
|
+
import "../chunk-C22JYHVT.js";
|
|
26
|
+
import "../chunk-VWYO36X4.js";
|
|
27
|
+
import "../chunk-AKUJ5OTO.js";
|
|
28
|
+
import "../chunk-424PT5DM.js";
|
|
29
|
+
|
|
30
|
+
// src/sandbox/actor/index.ts
|
|
31
|
+
import { SandboxAgent } from "sandbox-agent";
|
|
32
|
+
|
|
33
|
+
// src/sandbox/config.ts
|
|
34
|
+
import { z } from "zod/v4";
|
|
35
|
+
var zFunction = () => z.custom((val) => typeof val === "function");
|
|
36
|
+
var SandboxProviderSchema = z.object({
|
|
37
|
+
name: z.string(),
|
|
38
|
+
create: zFunction(),
|
|
39
|
+
destroy: zFunction(),
|
|
40
|
+
getUrl: zFunction().optional(),
|
|
41
|
+
getFetch: zFunction().optional(),
|
|
42
|
+
ensureServer: zFunction().optional()
|
|
43
|
+
});
|
|
44
|
+
var SandboxActorOptionsSchema = z.object({
|
|
45
|
+
// Log if the actor still thinks a turn is active but no new session event
|
|
46
|
+
// has arrived for this long.
|
|
47
|
+
warningAfterMs: z.number().nonnegative().default(3e4),
|
|
48
|
+
// Clear active-turn state after this timeout so a missing terminal event
|
|
49
|
+
// cannot keep the actor awake forever.
|
|
50
|
+
staleAfterMs: z.number().positive().default(5 * 6e4)
|
|
51
|
+
}).strict().prefault(() => ({})).transform((value) => ({
|
|
52
|
+
...value,
|
|
53
|
+
warningAfterMs: Math.min(value.warningAfterMs, value.staleAfterMs)
|
|
54
|
+
}));
|
|
55
|
+
var SandboxActorConfigSchema = z.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
|
+
}).strict().refine(
|
|
65
|
+
(data) => data.provider !== void 0 !== (data.createProvider !== void 0),
|
|
66
|
+
{
|
|
67
|
+
message: "Sandbox actor config must define exactly one of 'provider' or 'createProvider'"
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// src/sandbox/session-persist-driver.ts
|
|
72
|
+
function parseCursor(cursor) {
|
|
73
|
+
if (!cursor) {
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
const value = Number(cursor);
|
|
77
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
return Math.floor(value);
|
|
81
|
+
}
|
|
82
|
+
function nextCursor(offset, limit, itemCount) {
|
|
83
|
+
if (itemCount < limit) {
|
|
84
|
+
return void 0;
|
|
85
|
+
}
|
|
86
|
+
return String(offset + itemCount);
|
|
87
|
+
}
|
|
88
|
+
var SqliteSessionPersistDriver = class {
|
|
89
|
+
#db;
|
|
90
|
+
#persistRawEvents;
|
|
91
|
+
constructor(db2, persistRawEvents) {
|
|
92
|
+
this.#db = db2;
|
|
93
|
+
this.#persistRawEvents = persistRawEvents;
|
|
94
|
+
}
|
|
95
|
+
async getSession(id) {
|
|
96
|
+
const rows = await this.#db.execute(
|
|
97
|
+
"SELECT record_json FROM sandbox_agent_sessions WHERE id = ? LIMIT 1",
|
|
98
|
+
id
|
|
99
|
+
);
|
|
100
|
+
const row = rows[0];
|
|
101
|
+
if (!row) {
|
|
102
|
+
return void 0;
|
|
103
|
+
}
|
|
104
|
+
return JSON.parse(row.record_json);
|
|
105
|
+
}
|
|
106
|
+
async listSessions(request = {}) {
|
|
107
|
+
const limit = request.limit ?? 50;
|
|
108
|
+
const offset = parseCursor(request.cursor);
|
|
109
|
+
const rows = await this.#db.execute(
|
|
110
|
+
`
|
|
111
|
+
SELECT record_json
|
|
112
|
+
FROM sandbox_agent_sessions
|
|
113
|
+
ORDER BY created_at DESC, id DESC
|
|
114
|
+
LIMIT ? OFFSET ?
|
|
115
|
+
`,
|
|
116
|
+
limit,
|
|
117
|
+
offset
|
|
118
|
+
);
|
|
119
|
+
return {
|
|
120
|
+
items: rows.map((row) => JSON.parse(row.record_json)),
|
|
121
|
+
nextCursor: nextCursor(offset, limit, rows.length)
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
async updateSession(session) {
|
|
125
|
+
await this.#db.execute(
|
|
126
|
+
`
|
|
127
|
+
INSERT INTO sandbox_agent_sessions (id, created_at, record_json)
|
|
128
|
+
VALUES (?, ?, ?)
|
|
129
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
130
|
+
created_at = excluded.created_at,
|
|
131
|
+
record_json = excluded.record_json
|
|
132
|
+
`,
|
|
133
|
+
session.id,
|
|
134
|
+
session.createdAt,
|
|
135
|
+
JSON.stringify(session)
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
async listEvents(request) {
|
|
139
|
+
const limit = request.limit ?? 200;
|
|
140
|
+
const offset = parseCursor(request.cursor);
|
|
141
|
+
const rows = await this.#db.execute(
|
|
142
|
+
`
|
|
143
|
+
SELECT
|
|
144
|
+
id,
|
|
145
|
+
event_index,
|
|
146
|
+
session_id,
|
|
147
|
+
created_at,
|
|
148
|
+
connection_id,
|
|
149
|
+
sender,
|
|
150
|
+
payload_json
|
|
151
|
+
FROM sandbox_agent_events
|
|
152
|
+
WHERE session_id = ?
|
|
153
|
+
ORDER BY event_index ASC
|
|
154
|
+
LIMIT ? OFFSET ?
|
|
155
|
+
`,
|
|
156
|
+
request.sessionId,
|
|
157
|
+
limit,
|
|
158
|
+
offset
|
|
159
|
+
);
|
|
160
|
+
return {
|
|
161
|
+
items: rows.map((row) => ({
|
|
162
|
+
id: row.id,
|
|
163
|
+
eventIndex: row.event_index,
|
|
164
|
+
sessionId: row.session_id,
|
|
165
|
+
createdAt: row.created_at,
|
|
166
|
+
connectionId: row.connection_id,
|
|
167
|
+
sender: row.sender,
|
|
168
|
+
payload: JSON.parse(row.payload_json)
|
|
169
|
+
})),
|
|
170
|
+
nextCursor: nextCursor(offset, limit, rows.length)
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
async insertEvent(_sessionId, event) {
|
|
174
|
+
const payload = JSON.stringify(event.payload);
|
|
175
|
+
await this.#db.execute(
|
|
176
|
+
`
|
|
177
|
+
INSERT INTO sandbox_agent_events (
|
|
178
|
+
id,
|
|
179
|
+
session_id,
|
|
180
|
+
event_index,
|
|
181
|
+
created_at,
|
|
182
|
+
connection_id,
|
|
183
|
+
sender,
|
|
184
|
+
payload_json,
|
|
185
|
+
raw_payload_json
|
|
186
|
+
)
|
|
187
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
188
|
+
ON CONFLICT(session_id, event_index) DO UPDATE SET
|
|
189
|
+
id = excluded.id,
|
|
190
|
+
created_at = excluded.created_at,
|
|
191
|
+
connection_id = excluded.connection_id,
|
|
192
|
+
sender = excluded.sender,
|
|
193
|
+
payload_json = excluded.payload_json,
|
|
194
|
+
raw_payload_json = excluded.raw_payload_json
|
|
195
|
+
`,
|
|
196
|
+
event.id,
|
|
197
|
+
event.sessionId,
|
|
198
|
+
event.eventIndex,
|
|
199
|
+
event.createdAt,
|
|
200
|
+
event.connectionId,
|
|
201
|
+
event.sender,
|
|
202
|
+
payload,
|
|
203
|
+
this.#persistRawEvents ? payload : null
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
// src/sandbox/types.ts
|
|
209
|
+
var SANDBOX_AGENT_HOOK_METHODS = [
|
|
210
|
+
"onSessionEvent",
|
|
211
|
+
"onPermissionRequest"
|
|
212
|
+
];
|
|
213
|
+
var SANDBOX_AGENT_ACTION_METHODS = [
|
|
214
|
+
"dispose",
|
|
215
|
+
"listSessions",
|
|
216
|
+
"getSession",
|
|
217
|
+
"getEvents",
|
|
218
|
+
"createSession",
|
|
219
|
+
"resumeSession",
|
|
220
|
+
"resumeOrCreateSession",
|
|
221
|
+
"destroySandbox",
|
|
222
|
+
"destroySession",
|
|
223
|
+
"setSessionMode",
|
|
224
|
+
"setSessionConfigOption",
|
|
225
|
+
"setSessionModel",
|
|
226
|
+
"setSessionThoughtLevel",
|
|
227
|
+
"getSessionConfigOptions",
|
|
228
|
+
"getSessionModes",
|
|
229
|
+
"rawSendSessionMethod",
|
|
230
|
+
"respondPermission",
|
|
231
|
+
"rawRespondPermission",
|
|
232
|
+
"getHealth",
|
|
233
|
+
"listAgents",
|
|
234
|
+
"getAgent",
|
|
235
|
+
"installAgent",
|
|
236
|
+
"listAcpServers",
|
|
237
|
+
"listFsEntries",
|
|
238
|
+
"readFsFile",
|
|
239
|
+
"writeFsFile",
|
|
240
|
+
"deleteFsEntry",
|
|
241
|
+
"mkdirFs",
|
|
242
|
+
"moveFs",
|
|
243
|
+
"statFs",
|
|
244
|
+
"uploadFsBatch",
|
|
245
|
+
"getMcpConfig",
|
|
246
|
+
"setMcpConfig",
|
|
247
|
+
"deleteMcpConfig",
|
|
248
|
+
"getSkillsConfig",
|
|
249
|
+
"setSkillsConfig",
|
|
250
|
+
"deleteSkillsConfig",
|
|
251
|
+
"getProcessConfig",
|
|
252
|
+
"setProcessConfig",
|
|
253
|
+
"createProcess",
|
|
254
|
+
"runProcess",
|
|
255
|
+
"listProcesses",
|
|
256
|
+
"getProcess",
|
|
257
|
+
"stopProcess",
|
|
258
|
+
"killProcess",
|
|
259
|
+
"deleteProcess",
|
|
260
|
+
"getProcessLogs",
|
|
261
|
+
"followProcessLogs",
|
|
262
|
+
"sendProcessInput",
|
|
263
|
+
"resizeProcessTerminal",
|
|
264
|
+
"buildProcessTerminalWebSocketUrl",
|
|
265
|
+
"connectProcessTerminalWebSocket",
|
|
266
|
+
"connectProcessTerminal"
|
|
267
|
+
];
|
|
268
|
+
|
|
269
|
+
// src/sandbox/actor/db.ts
|
|
270
|
+
async function migrateSandboxTables(db2) {
|
|
271
|
+
await db2.execute(`
|
|
272
|
+
DROP TABLE IF EXISTS sandbox_actor_meta;
|
|
273
|
+
DROP TABLE IF EXISTS sandbox_actor_sessions;
|
|
274
|
+
`);
|
|
275
|
+
await db2.execute(`
|
|
276
|
+
CREATE TABLE IF NOT EXISTS sandbox_agent_sessions (
|
|
277
|
+
id TEXT PRIMARY KEY,
|
|
278
|
+
created_at INTEGER NOT NULL,
|
|
279
|
+
record_json TEXT NOT NULL
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
CREATE TABLE IF NOT EXISTS sandbox_agent_events (
|
|
283
|
+
id TEXT PRIMARY KEY,
|
|
284
|
+
session_id TEXT NOT NULL,
|
|
285
|
+
event_index INTEGER NOT NULL,
|
|
286
|
+
created_at INTEGER NOT NULL,
|
|
287
|
+
connection_id TEXT NOT NULL,
|
|
288
|
+
sender TEXT NOT NULL,
|
|
289
|
+
payload_json TEXT NOT NULL,
|
|
290
|
+
raw_payload_json TEXT,
|
|
291
|
+
UNIQUE(session_id, event_index)
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
CREATE INDEX IF NOT EXISTS sandbox_agent_sessions_created_at_idx
|
|
295
|
+
ON sandbox_agent_sessions (created_at DESC);
|
|
296
|
+
|
|
297
|
+
CREATE INDEX IF NOT EXISTS sandbox_agent_events_session_event_index_idx
|
|
298
|
+
ON sandbox_agent_events (session_id, event_index ASC);
|
|
299
|
+
`);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// src/sandbox/actor/session.ts
|
|
303
|
+
function syncPreventSleep(c) {
|
|
304
|
+
c.setPreventSleep(
|
|
305
|
+
c.vars.activeHooks.size > 0 || c.vars.activeSessionIds.size > 0
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
function clearTimerMap(map, sessionId) {
|
|
309
|
+
const timeout = map.get(sessionId);
|
|
310
|
+
if (timeout) {
|
|
311
|
+
clearTimeout(timeout);
|
|
312
|
+
map.delete(sessionId);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
function clearTimerMapAll(map) {
|
|
316
|
+
for (const timeout of map.values()) {
|
|
317
|
+
clearTimeout(timeout);
|
|
318
|
+
}
|
|
319
|
+
map.clear();
|
|
320
|
+
}
|
|
321
|
+
function clearSessionTimers(vars, sessionId) {
|
|
322
|
+
clearTimerMap(vars.warningTimeoutBySessionId, sessionId);
|
|
323
|
+
clearTimerMap(vars.staleTimeoutBySessionId, sessionId);
|
|
324
|
+
}
|
|
325
|
+
function clearAllSessionTimers(vars) {
|
|
326
|
+
clearTimerMapAll(vars.warningTimeoutBySessionId);
|
|
327
|
+
clearTimerMapAll(vars.staleTimeoutBySessionId);
|
|
328
|
+
}
|
|
329
|
+
function scheduleSessionTimers(c, options, sessionId) {
|
|
330
|
+
clearSessionTimers(c.vars, sessionId);
|
|
331
|
+
const lastEventAt = c.vars.lastEventAtBySessionId.get(sessionId);
|
|
332
|
+
if (lastEventAt === void 0) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
const warningDelay = Math.max(
|
|
336
|
+
0,
|
|
337
|
+
options.warningAfterMs - (Date.now() - lastEventAt)
|
|
338
|
+
);
|
|
339
|
+
c.vars.warningTimeoutBySessionId.set(
|
|
340
|
+
sessionId,
|
|
341
|
+
setTimeout(() => {
|
|
342
|
+
if (!c.vars.activeSessionIds.has(sessionId)) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
c.log.warn({
|
|
346
|
+
msg: "sandbox actor turn is still active without new session events",
|
|
347
|
+
sessionId,
|
|
348
|
+
idleMs: Date.now() - lastEventAt
|
|
349
|
+
});
|
|
350
|
+
}, warningDelay)
|
|
351
|
+
);
|
|
352
|
+
const staleDelay = Math.max(
|
|
353
|
+
0,
|
|
354
|
+
options.staleAfterMs - (Date.now() - lastEventAt)
|
|
355
|
+
);
|
|
356
|
+
c.vars.staleTimeoutBySessionId.set(
|
|
357
|
+
sessionId,
|
|
358
|
+
setTimeout(() => {
|
|
359
|
+
if (!c.vars.activeSessionIds.has(sessionId)) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
c.log.warn({
|
|
363
|
+
msg: "sandbox actor cleared stale active turn state after inactivity timeout",
|
|
364
|
+
sessionId,
|
|
365
|
+
idleMs: Date.now() - lastEventAt
|
|
366
|
+
});
|
|
367
|
+
clearSessionActiveInMemory(c, sessionId);
|
|
368
|
+
syncPreventSleep(c);
|
|
369
|
+
}, staleDelay)
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
function markSessionActiveInMemory(c, options, sessionId, requestId) {
|
|
373
|
+
c.vars.activeSessionIds.add(sessionId);
|
|
374
|
+
if (requestId) {
|
|
375
|
+
const requestIds = c.vars.activePromptRequestIdsBySessionId.get(sessionId) ?? [];
|
|
376
|
+
if (!requestIds.includes(requestId)) {
|
|
377
|
+
requestIds.push(requestId);
|
|
378
|
+
c.vars.activePromptRequestIdsBySessionId.set(
|
|
379
|
+
sessionId,
|
|
380
|
+
requestIds
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
c.vars.lastEventAtBySessionId.set(sessionId, Date.now());
|
|
385
|
+
scheduleSessionTimers(c, options, sessionId);
|
|
386
|
+
}
|
|
387
|
+
function clearSessionActiveInMemory(c, sessionId, requestId) {
|
|
388
|
+
if (requestId) {
|
|
389
|
+
const remaining = (c.vars.activePromptRequestIdsBySessionId.get(sessionId) ?? []).filter(
|
|
390
|
+
(activeRequestId) => activeRequestId !== requestId
|
|
391
|
+
);
|
|
392
|
+
if (remaining.length > 0) {
|
|
393
|
+
c.vars.activePromptRequestIdsBySessionId.set(
|
|
394
|
+
sessionId,
|
|
395
|
+
remaining
|
|
396
|
+
);
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
c.vars.activeSessionIds.delete(sessionId);
|
|
401
|
+
c.vars.activePromptRequestIdsBySessionId.delete(sessionId);
|
|
402
|
+
c.vars.lastEventAtBySessionId.delete(sessionId);
|
|
403
|
+
clearSessionTimers(c.vars, sessionId);
|
|
404
|
+
}
|
|
405
|
+
function addSubscribedSession(c, sessionId) {
|
|
406
|
+
if (c.state.subscribedSessionIds.includes(sessionId)) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
c.state.subscribedSessionIds.push(sessionId);
|
|
410
|
+
}
|
|
411
|
+
function removeSubscribedSession(c, sessionId) {
|
|
412
|
+
clearSessionActiveInMemory(c, sessionId);
|
|
413
|
+
c.state.subscribedSessionIds = c.state.subscribedSessionIds.filter(
|
|
414
|
+
(id) => id !== sessionId
|
|
415
|
+
);
|
|
416
|
+
syncPreventSleep(c);
|
|
417
|
+
}
|
|
418
|
+
function clearAllActiveSessions(c) {
|
|
419
|
+
c.vars.activeSessionIds.clear();
|
|
420
|
+
c.vars.activePromptRequestIdsBySessionId.clear();
|
|
421
|
+
c.vars.lastEventAtBySessionId.clear();
|
|
422
|
+
clearAllSessionTimers(c.vars);
|
|
423
|
+
syncPreventSleep(c);
|
|
424
|
+
}
|
|
425
|
+
function runHook(c, sessionId, name, callback) {
|
|
426
|
+
const promise = Promise.resolve(callback()).catch((error) => {
|
|
427
|
+
c.log.error({
|
|
428
|
+
msg: `sandbox actor ${name} hook failed`,
|
|
429
|
+
sessionId,
|
|
430
|
+
error
|
|
431
|
+
});
|
|
432
|
+
}).finally(() => {
|
|
433
|
+
c.vars.activeHooks.delete(promise);
|
|
434
|
+
syncPreventSleep(c);
|
|
435
|
+
});
|
|
436
|
+
c.vars.activeHooks.add(promise);
|
|
437
|
+
syncPreventSleep(c);
|
|
438
|
+
c.waitUntil(promise);
|
|
439
|
+
}
|
|
440
|
+
function trackSessionTurnFromEvent(c, options, sessionId, event) {
|
|
441
|
+
const payload = event.payload;
|
|
442
|
+
const method = typeof (payload == null ? void 0 : payload.method) === "string" ? payload.method : null;
|
|
443
|
+
const rawId = payload == null ? void 0 : payload.id;
|
|
444
|
+
const id = typeof rawId === "string" ? rawId : typeof rawId === "number" ? String(rawId) : null;
|
|
445
|
+
if (event.sender === "client" && method === "session/prompt") {
|
|
446
|
+
markSessionActiveInMemory(
|
|
447
|
+
c,
|
|
448
|
+
options,
|
|
449
|
+
sessionId,
|
|
450
|
+
id ?? `session-prompt:${event.id}`
|
|
451
|
+
);
|
|
452
|
+
syncPreventSleep(c);
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
if (!c.vars.activeSessionIds.has(sessionId)) {
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
if (event.sender === "agent" && id) {
|
|
459
|
+
const requestIds = c.vars.activePromptRequestIdsBySessionId.get(sessionId) ?? [];
|
|
460
|
+
if (requestIds.length === 0 || requestIds.includes(id)) {
|
|
461
|
+
clearSessionActiveInMemory(c, sessionId, id);
|
|
462
|
+
syncPreventSleep(c);
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
c.vars.lastEventAtBySessionId.set(sessionId, Date.now());
|
|
467
|
+
scheduleSessionTimers(c, options, sessionId);
|
|
468
|
+
}
|
|
469
|
+
function subscribeToSession(c, config, sessionId) {
|
|
470
|
+
if (c.vars.unsubscribeBySessionId.has(sessionId)) {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
const client = c.vars.sandboxAgentClient;
|
|
474
|
+
if (!client) {
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
const options = config.options;
|
|
478
|
+
const event = client.onSessionEvent(sessionId, (sessionEvent) => {
|
|
479
|
+
trackSessionTurnFromEvent(c, options, sessionId, sessionEvent);
|
|
480
|
+
if (!config.onSessionEvent) {
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
runHook(
|
|
484
|
+
c,
|
|
485
|
+
sessionId,
|
|
486
|
+
"onSessionEvent",
|
|
487
|
+
() => config.onSessionEvent(c, sessionId, sessionEvent)
|
|
488
|
+
);
|
|
489
|
+
});
|
|
490
|
+
const permission = client.onPermissionRequest(
|
|
491
|
+
sessionId,
|
|
492
|
+
(request) => {
|
|
493
|
+
markSessionActiveInMemory(c, options, sessionId);
|
|
494
|
+
syncPreventSleep(c);
|
|
495
|
+
if (!config.onPermissionRequest) {
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
runHook(
|
|
499
|
+
c,
|
|
500
|
+
sessionId,
|
|
501
|
+
"onPermissionRequest",
|
|
502
|
+
() => config.onPermissionRequest(c, sessionId, request)
|
|
503
|
+
);
|
|
504
|
+
}
|
|
505
|
+
);
|
|
506
|
+
c.vars.unsubscribeBySessionId.set(sessionId, { event, permission });
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// src/sandbox/actor/index.ts
|
|
510
|
+
async function teardownAgentRuntime(vars) {
|
|
511
|
+
var _a, _b;
|
|
512
|
+
for (const subscription of vars.unsubscribeBySessionId.values()) {
|
|
513
|
+
(_a = subscription.event) == null ? void 0 : _a.call(subscription);
|
|
514
|
+
(_b = subscription.permission) == null ? void 0 : _b.call(subscription);
|
|
515
|
+
}
|
|
516
|
+
vars.unsubscribeBySessionId.clear();
|
|
517
|
+
clearAllSessionTimers(vars);
|
|
518
|
+
vars.activeHooks.clear();
|
|
519
|
+
if (vars.sandboxAgentClient) {
|
|
520
|
+
try {
|
|
521
|
+
await vars.sandboxAgentClient.dispose();
|
|
522
|
+
} finally {
|
|
523
|
+
vars.sandboxAgentClient = null;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
vars.provider = null;
|
|
527
|
+
}
|
|
528
|
+
async function resolveProvider(c, config) {
|
|
529
|
+
if (c.vars.provider) {
|
|
530
|
+
return c.vars.provider;
|
|
531
|
+
}
|
|
532
|
+
const provider = config.provider !== void 0 ? config.provider : await config.createProvider(c);
|
|
533
|
+
if (c.state.providerName && c.state.providerName !== provider.name) {
|
|
534
|
+
throw new Error(
|
|
535
|
+
`sandbox actor provider mismatch: expected ${c.state.providerName}, received ${provider.name}`
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
if (!c.state.providerName) {
|
|
539
|
+
c.state.providerName = provider.name;
|
|
540
|
+
}
|
|
541
|
+
c.vars.provider = provider;
|
|
542
|
+
return provider;
|
|
543
|
+
}
|
|
544
|
+
async function ensureAgent(c, config, persistRawEvents) {
|
|
545
|
+
if (c.vars.sandboxAgentClient) {
|
|
546
|
+
return c.vars.sandboxAgentClient;
|
|
547
|
+
}
|
|
548
|
+
const provider = await resolveProvider(c, config);
|
|
549
|
+
c.vars.sandboxAgentClient = await SandboxAgent.start({
|
|
550
|
+
sandbox: provider,
|
|
551
|
+
sandboxId: c.state.sandboxId ?? void 0,
|
|
552
|
+
persist: new SqliteSessionPersistDriver(c.db, persistRawEvents)
|
|
553
|
+
});
|
|
554
|
+
if (!c.state.sandboxId && c.vars.sandboxAgentClient.sandboxId) {
|
|
555
|
+
c.state.sandboxId = c.vars.sandboxAgentClient.sandboxId;
|
|
556
|
+
}
|
|
557
|
+
for (const sessionId of c.state.subscribedSessionIds) {
|
|
558
|
+
subscribeToSession(c, config, sessionId);
|
|
559
|
+
}
|
|
560
|
+
return c.vars.sandboxAgentClient;
|
|
561
|
+
}
|
|
562
|
+
var READ_ONLY_ACTIONS = /* @__PURE__ */ new Set([
|
|
563
|
+
"listSessions",
|
|
564
|
+
"getSession",
|
|
565
|
+
"getEvents"
|
|
566
|
+
]);
|
|
567
|
+
var SESSION_RETURNING_ACTIONS = /* @__PURE__ */ new Set([
|
|
568
|
+
"createSession",
|
|
569
|
+
"resumeSession",
|
|
570
|
+
"resumeOrCreateSession",
|
|
571
|
+
"getSession"
|
|
572
|
+
]);
|
|
573
|
+
var SESSION_SENDING_ACTIONS = /* @__PURE__ */ new Set([
|
|
574
|
+
"rawSendSessionMethod",
|
|
575
|
+
"respondPermission",
|
|
576
|
+
"rawRespondPermission"
|
|
577
|
+
]);
|
|
578
|
+
function isSessionLike(value) {
|
|
579
|
+
return typeof value === "object" && value !== null && "id" in value && typeof value.id === "string";
|
|
580
|
+
}
|
|
581
|
+
function buildProxyActions(config) {
|
|
582
|
+
const actions = {};
|
|
583
|
+
for (const actionName of SANDBOX_AGENT_ACTION_METHODS) {
|
|
584
|
+
actions[actionName] = async (c, ...args) => {
|
|
585
|
+
var _a, _b;
|
|
586
|
+
if (c.state.sandboxDestroyed) {
|
|
587
|
+
if (READ_ONLY_ACTIONS.has(actionName)) {
|
|
588
|
+
const persist = new SqliteSessionPersistDriver(
|
|
589
|
+
c.db,
|
|
590
|
+
config.persistRawEvents ?? false
|
|
591
|
+
);
|
|
592
|
+
if (actionName === "listSessions") {
|
|
593
|
+
return persist.listSessions(args[0]);
|
|
594
|
+
}
|
|
595
|
+
if (actionName === "getSession") {
|
|
596
|
+
return persist.getSession(args[0]);
|
|
597
|
+
}
|
|
598
|
+
if (actionName === "getEvents") {
|
|
599
|
+
return persist.listEvents(args[0]);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
throw new Error(
|
|
603
|
+
"sandbox has been destroyed; only read-only actions (listSessions, getSession, getEvents) are available"
|
|
604
|
+
);
|
|
605
|
+
}
|
|
606
|
+
const options = config.options;
|
|
607
|
+
if (SESSION_SENDING_ACTIONS.has(actionName) && typeof args[0] === "string") {
|
|
608
|
+
markSessionActiveInMemory(c, options, args[0]);
|
|
609
|
+
syncPreventSleep(c);
|
|
610
|
+
}
|
|
611
|
+
const agent = await ensureAgent(
|
|
612
|
+
c,
|
|
613
|
+
config,
|
|
614
|
+
config.persistRawEvents ?? false
|
|
615
|
+
);
|
|
616
|
+
const method = agent[actionName];
|
|
617
|
+
const result = await method.apply(agent, args);
|
|
618
|
+
if (actionName === "dispose") {
|
|
619
|
+
await teardownAgentRuntime(c.vars);
|
|
620
|
+
clearAllActiveSessions(c);
|
|
621
|
+
} else if (actionName === "destroySession" && isSessionLike(result)) {
|
|
622
|
+
const sub = c.vars.unsubscribeBySessionId.get(result.id);
|
|
623
|
+
(_a = sub == null ? void 0 : sub.event) == null ? void 0 : _a.call(sub);
|
|
624
|
+
(_b = sub == null ? void 0 : sub.permission) == null ? void 0 : _b.call(sub);
|
|
625
|
+
c.vars.unsubscribeBySessionId.delete(result.id);
|
|
626
|
+
removeSubscribedSession(c, result.id);
|
|
627
|
+
} else if (SESSION_RETURNING_ACTIONS.has(actionName) && isSessionLike(result)) {
|
|
628
|
+
addSubscribedSession(c, result.id);
|
|
629
|
+
subscribeToSession(c, config, result.id);
|
|
630
|
+
} else if (actionName === "listSessions" && result && typeof result === "object") {
|
|
631
|
+
const items = result.items;
|
|
632
|
+
if (Array.isArray(items)) {
|
|
633
|
+
for (const item of items) {
|
|
634
|
+
if (isSessionLike(item)) {
|
|
635
|
+
addSubscribedSession(c, item.id);
|
|
636
|
+
subscribeToSession(c, config, item.id);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
return result;
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
return actions;
|
|
645
|
+
}
|
|
646
|
+
function sandboxActor(config) {
|
|
647
|
+
const parsedConfig = SandboxActorConfigSchema.parse(
|
|
648
|
+
config
|
|
649
|
+
);
|
|
650
|
+
return actor({
|
|
651
|
+
createState: async () => ({
|
|
652
|
+
sandboxId: null,
|
|
653
|
+
providerName: null,
|
|
654
|
+
subscribedSessionIds: [],
|
|
655
|
+
sandboxDestroyed: false
|
|
656
|
+
}),
|
|
657
|
+
createVars: () => ({
|
|
658
|
+
sandboxAgentClient: null,
|
|
659
|
+
provider: null,
|
|
660
|
+
activeSessionIds: /* @__PURE__ */ new Set(),
|
|
661
|
+
activePromptRequestIdsBySessionId: /* @__PURE__ */ new Map(),
|
|
662
|
+
lastEventAtBySessionId: /* @__PURE__ */ new Map(),
|
|
663
|
+
unsubscribeBySessionId: /* @__PURE__ */ new Map(),
|
|
664
|
+
activeHooks: /* @__PURE__ */ new Set(),
|
|
665
|
+
warningTimeoutBySessionId: /* @__PURE__ */ new Map(),
|
|
666
|
+
staleTimeoutBySessionId: /* @__PURE__ */ new Map()
|
|
667
|
+
}),
|
|
668
|
+
db: db({
|
|
669
|
+
onMigrate: migrateSandboxTables
|
|
670
|
+
}),
|
|
671
|
+
onSleep: async (c) => {
|
|
672
|
+
await teardownAgentRuntime(c.vars);
|
|
673
|
+
},
|
|
674
|
+
onDestroy: async (c) => {
|
|
675
|
+
const sandboxContext = c;
|
|
676
|
+
clearAllActiveSessions(sandboxContext);
|
|
677
|
+
await teardownAgentRuntime(sandboxContext.vars);
|
|
678
|
+
if (sandboxContext.state.sandboxId) {
|
|
679
|
+
try {
|
|
680
|
+
const provider = await resolveProvider(
|
|
681
|
+
sandboxContext,
|
|
682
|
+
parsedConfig
|
|
683
|
+
);
|
|
684
|
+
await provider.destroy(sandboxContext.state.sandboxId);
|
|
685
|
+
} finally {
|
|
686
|
+
sandboxContext.state.sandboxId = null;
|
|
687
|
+
sandboxContext.state.providerName = null;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
sandboxContext.state.subscribedSessionIds = [];
|
|
691
|
+
},
|
|
692
|
+
onBeforeConnect: parsedConfig.onBeforeConnect,
|
|
693
|
+
actions: {
|
|
694
|
+
// Destroys the sandbox environment but keeps the actor alive so
|
|
695
|
+
// session transcripts remain accessible via read-only actions.
|
|
696
|
+
// If `destroyActor` is set in the config, the actor is also
|
|
697
|
+
// destroyed after the sandbox.
|
|
698
|
+
destroy: async (c) => {
|
|
699
|
+
if (c.state.sandboxDestroyed) {
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
702
|
+
clearAllActiveSessions(c);
|
|
703
|
+
await teardownAgentRuntime(c.vars);
|
|
704
|
+
if (c.state.sandboxId) {
|
|
705
|
+
const provider = await resolveProvider(c, parsedConfig);
|
|
706
|
+
await provider.destroy(c.state.sandboxId);
|
|
707
|
+
c.state.sandboxId = null;
|
|
708
|
+
}
|
|
709
|
+
c.state.sandboxDestroyed = true;
|
|
710
|
+
if (parsedConfig.destroyActor) {
|
|
711
|
+
c.destroy();
|
|
712
|
+
}
|
|
713
|
+
},
|
|
714
|
+
getSandboxUrl: async (c) => {
|
|
715
|
+
if (c.state.sandboxDestroyed) {
|
|
716
|
+
throw new Error("sandbox has been destroyed");
|
|
717
|
+
}
|
|
718
|
+
const provider = await resolveProvider(c, parsedConfig);
|
|
719
|
+
if (!c.state.sandboxId) {
|
|
720
|
+
const agent = await ensureAgent(
|
|
721
|
+
c,
|
|
722
|
+
parsedConfig,
|
|
723
|
+
parsedConfig.persistRawEvents ?? false
|
|
724
|
+
);
|
|
725
|
+
if (!c.state.sandboxId && agent.sandboxId) {
|
|
726
|
+
c.state.sandboxId = agent.sandboxId;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
if (!c.state.sandboxId) {
|
|
730
|
+
throw new Error("sandbox ID is not available");
|
|
731
|
+
}
|
|
732
|
+
if (!provider.getUrl) {
|
|
733
|
+
throw new Error(
|
|
734
|
+
`provider "${provider.name}" does not support getUrl; direct sandbox URL access is not available for this provider`
|
|
735
|
+
);
|
|
736
|
+
}
|
|
737
|
+
return { url: await provider.getUrl(c.state.sandboxId) };
|
|
738
|
+
},
|
|
739
|
+
...buildProxyActions(parsedConfig)
|
|
740
|
+
}
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
export {
|
|
744
|
+
SANDBOX_AGENT_ACTION_METHODS,
|
|
745
|
+
SANDBOX_AGENT_HOOK_METHODS,
|
|
746
|
+
SandboxActorConfigSchema,
|
|
747
|
+
SandboxActorOptionsSchema,
|
|
748
|
+
buildTerminalWebSocketUrl,
|
|
749
|
+
connectTerminal,
|
|
750
|
+
deleteFile,
|
|
751
|
+
downloadFile,
|
|
752
|
+
followProcessLogs,
|
|
753
|
+
listFiles,
|
|
754
|
+
mkdirFs,
|
|
755
|
+
moveFile,
|
|
756
|
+
sandboxActor,
|
|
757
|
+
statFile,
|
|
758
|
+
uploadBatch,
|
|
759
|
+
uploadFile
|
|
760
|
+
};
|
|
761
|
+
//# sourceMappingURL=index.js.map
|