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.
Files changed (333) hide show
  1. package/dist/browser/client.d.ts +593 -588
  2. package/dist/browser/client.js +215 -35
  3. package/dist/browser/client.js.map +1 -1
  4. package/dist/browser/inspector/client.js +109 -10
  5. package/dist/browser/inspector/client.js.map +1 -1
  6. package/dist/inspector.tar.gz +0 -0
  7. package/dist/tsup/actor/errors.cjs +2 -2
  8. package/dist/tsup/actor/errors.js +1 -1
  9. package/dist/tsup/{actor-router-consts-D29T1Z-K.d.cts → actor-router-consts-DU-1IdQj.d.cts} +1 -1
  10. package/dist/tsup/{actor-router-consts-D29T1Z-K.d.ts → actor-router-consts-DU-1IdQj.d.ts} +1 -1
  11. package/dist/tsup/chunk-2ELYUO6C.cjs +112 -0
  12. package/dist/tsup/chunk-2ELYUO6C.cjs.map +1 -0
  13. package/dist/tsup/chunk-2LY7RW3Y.cjs +2316 -0
  14. package/dist/tsup/chunk-2LY7RW3Y.cjs.map +1 -0
  15. package/dist/tsup/{chunk-L47L3ZWJ.cjs → chunk-6G7ZNM27.cjs} +11 -6
  16. package/dist/tsup/chunk-6G7ZNM27.cjs.map +1 -0
  17. package/dist/tsup/{chunk-LK36OGGO.cjs → chunk-A4KEUCB6.cjs} +84 -34
  18. package/dist/tsup/chunk-A4KEUCB6.cjs.map +1 -0
  19. package/dist/tsup/{chunk-7HTNH26M.js → chunk-AKUJ5OTO.js} +11 -6
  20. package/dist/tsup/chunk-AKUJ5OTO.js.map +1 -0
  21. package/dist/tsup/{chunk-ANKZ2FS6.js → chunk-C22JYHVT.js} +77 -27
  22. package/dist/tsup/chunk-C22JYHVT.js.map +1 -0
  23. package/dist/tsup/chunk-C4EB42ET.js +1459 -0
  24. package/dist/tsup/chunk-C4EB42ET.js.map +1 -0
  25. package/dist/tsup/chunk-CGGGBIDP.cjs +1459 -0
  26. package/dist/tsup/chunk-CGGGBIDP.cjs.map +1 -0
  27. package/dist/tsup/chunk-CMQPDBBR.cjs +1486 -0
  28. package/dist/tsup/chunk-CMQPDBBR.cjs.map +1 -0
  29. package/dist/tsup/{chunk-AQD4CBZ2.cjs → chunk-DH6UINWA.cjs} +4 -4
  30. package/dist/tsup/{chunk-AQD4CBZ2.cjs.map → chunk-DH6UINWA.cjs.map} +1 -1
  31. package/dist/tsup/chunk-DK46YYCJ.js +1486 -0
  32. package/dist/tsup/chunk-DK46YYCJ.js.map +1 -0
  33. package/dist/tsup/chunk-EGWXXBZV.js +2316 -0
  34. package/dist/tsup/chunk-EGWXXBZV.js.map +1 -0
  35. package/dist/tsup/{chunk-HBYEYBIC.js → chunk-EONWXYMN.js} +2 -2
  36. package/dist/tsup/{chunk-N4KRDJ56.js → chunk-GFGRBYO2.js} +35 -6
  37. package/dist/tsup/chunk-GFGRBYO2.js.map +1 -0
  38. package/dist/tsup/{chunk-TEUL4UYN.cjs → chunk-GUHXWPGB.cjs} +1515 -1479
  39. package/dist/tsup/chunk-GUHXWPGB.cjs.map +1 -0
  40. package/dist/tsup/{chunk-3B6PCYJB.cjs → chunk-HNE2AK6C.cjs} +2375 -3713
  41. package/dist/tsup/chunk-HNE2AK6C.cjs.map +1 -0
  42. package/dist/tsup/{chunk-5UEFNG7P.js → chunk-I5I6OALK.js} +2 -2
  43. package/dist/tsup/chunk-IHQAF2HV.cjs +23 -0
  44. package/dist/tsup/chunk-IHQAF2HV.cjs.map +1 -0
  45. package/dist/tsup/{chunk-UWAGLDT6.cjs → chunk-JJNZQDUN.cjs} +667 -2517
  46. package/dist/tsup/chunk-JJNZQDUN.cjs.map +1 -0
  47. package/dist/tsup/{chunk-M6H4XIF4.js → chunk-JJSPHLJN.js} +219 -287
  48. package/dist/tsup/chunk-JJSPHLJN.js.map +1 -0
  49. package/dist/tsup/chunk-JRKPV5NJ.js +481 -0
  50. package/dist/tsup/chunk-JRKPV5NJ.js.map +1 -0
  51. package/dist/tsup/{chunk-VKVNIQRQ.js → chunk-K7MVU5SI.js} +36 -41
  52. package/dist/tsup/chunk-K7MVU5SI.js.map +1 -0
  53. package/dist/tsup/{chunk-KJSYAUOM.js → chunk-MLK3GY6P.js} +43 -27
  54. package/dist/tsup/chunk-MLK3GY6P.js.map +1 -0
  55. package/dist/tsup/{chunk-4KSHPFXF.cjs → chunk-MPLMTJY5.cjs} +123 -23
  56. package/dist/tsup/chunk-MPLMTJY5.cjs.map +1 -0
  57. package/dist/tsup/{chunk-UDMRZR6A.js → chunk-PQWI44WD.js} +1755 -3093
  58. package/dist/tsup/chunk-PQWI44WD.js.map +1 -0
  59. package/dist/tsup/{chunk-SR3KQE7Q.cjs → chunk-SQFCIDCG.cjs} +35 -6
  60. package/dist/tsup/chunk-SQFCIDCG.cjs.map +1 -0
  61. package/dist/tsup/{chunk-3GTO6H3E.js → chunk-SVHJSM2E.js} +110 -24
  62. package/dist/tsup/chunk-SVHJSM2E.js.map +1 -0
  63. package/dist/tsup/chunk-T5KYKM6R.js +49 -0
  64. package/dist/tsup/chunk-T5KYKM6R.js.map +1 -0
  65. package/dist/tsup/{chunk-GXRVSSVD.cjs → chunk-TJ7DKW6F.cjs} +123 -37
  66. package/dist/tsup/chunk-TJ7DKW6F.cjs.map +1 -0
  67. package/dist/tsup/chunk-UQZRMTM3.js +23 -0
  68. package/dist/tsup/chunk-UQZRMTM3.js.map +1 -0
  69. package/dist/tsup/{chunk-QPADHLDU.cjs → chunk-V3JSZR5P.cjs} +3 -3
  70. package/dist/tsup/{chunk-QPADHLDU.cjs.map → chunk-V3JSZR5P.cjs.map} +1 -1
  71. package/dist/tsup/{chunk-HKOSZKKZ.cjs → chunk-VBR35EQF.cjs} +271 -339
  72. package/dist/tsup/chunk-VBR35EQF.cjs.map +1 -0
  73. package/dist/tsup/{chunk-DZXDUGLL.js → chunk-VWYO36X4.js} +117 -17
  74. package/dist/tsup/chunk-VWYO36X4.js.map +1 -0
  75. package/dist/tsup/{chunk-I6PL6QIY.js → chunk-WW27B6DM.js} +1452 -1416
  76. package/dist/tsup/chunk-WW27B6DM.js.map +1 -0
  77. package/dist/tsup/chunk-YAE3MEJM.cjs +49 -0
  78. package/dist/tsup/chunk-YAE3MEJM.cjs.map +1 -0
  79. package/dist/tsup/{chunk-KTWY3K6Z.js → chunk-YGYGANCA.js} +473 -2323
  80. package/dist/tsup/chunk-YGYGANCA.js.map +1 -0
  81. package/dist/tsup/chunk-YZJWZBY5.cjs +481 -0
  82. package/dist/tsup/chunk-YZJWZBY5.cjs.map +1 -0
  83. package/dist/tsup/{chunk-ZFY5J2EP.cjs → chunk-ZZLJ5TSM.cjs} +39 -44
  84. package/dist/tsup/chunk-ZZLJ5TSM.cjs.map +1 -0
  85. package/dist/tsup/client/mod.cjs +10 -7
  86. package/dist/tsup/client/mod.cjs.map +1 -1
  87. package/dist/tsup/client/mod.d.cts +6 -6
  88. package/dist/tsup/client/mod.d.ts +6 -6
  89. package/dist/tsup/client/mod.js +11 -8
  90. package/dist/tsup/common/log.cjs +3 -3
  91. package/dist/tsup/common/log.js +2 -2
  92. package/dist/tsup/common/websocket.cjs +4 -4
  93. package/dist/tsup/common/websocket.js +3 -3
  94. package/dist/tsup/{config-Qj-zLJPc.d.ts → config-C2Wwnc69.d.ts} +142 -208
  95. package/dist/tsup/{config-BiNoIHRs.d.ts → config-DROwzBLT.d.cts} +82 -6
  96. package/dist/tsup/{config-BiNoIHRs.d.cts → config-DROwzBLT.d.ts} +82 -6
  97. package/dist/tsup/{config-iPj5l1bL.d.cts → config-ehT-_3BB.d.cts} +142 -208
  98. package/dist/tsup/{context-DzvH1PBK.d.cts → context-DGMJuAyc.d.ts} +16 -3
  99. package/dist/tsup/{context-CQCMuHND.d.ts → context-Dpp2RJbW.d.cts} +16 -3
  100. package/dist/tsup/db/drizzle/mod.cjs +3 -3
  101. package/dist/tsup/db/drizzle/mod.d.cts +1 -1
  102. package/dist/tsup/db/drizzle/mod.d.ts +1 -1
  103. package/dist/tsup/db/drizzle/mod.js +2 -2
  104. package/dist/tsup/db/mod.cjs +3 -3
  105. package/dist/tsup/db/mod.d.cts +1 -1
  106. package/dist/tsup/db/mod.d.ts +1 -1
  107. package/dist/tsup/db/mod.js +2 -2
  108. package/dist/tsup/{driver-Jo8v-kbU.d.ts → driver-CYZP9QYo.d.ts} +1 -1
  109. package/dist/tsup/{driver-iV8J-WMv.d.cts → driver-CoTFpipv.d.cts} +1 -1
  110. package/dist/tsup/driver-helpers/mod.cjs +7 -5
  111. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  112. package/dist/tsup/driver-helpers/mod.d.cts +17 -18
  113. package/dist/tsup/driver-helpers/mod.d.ts +17 -18
  114. package/dist/tsup/driver-helpers/mod.js +11 -9
  115. package/dist/tsup/driver-test-suite/mod.cjs +1275 -228
  116. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  117. package/dist/tsup/driver-test-suite/mod.d.cts +6 -5
  118. package/dist/tsup/driver-test-suite/mod.d.ts +6 -5
  119. package/dist/tsup/driver-test-suite/mod.js +1581 -534
  120. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  121. package/dist/tsup/inspector/mod.cjs +4 -4
  122. package/dist/tsup/inspector/mod.js +3 -3
  123. package/dist/tsup/mod.cjs +15 -9
  124. package/dist/tsup/mod.cjs.map +1 -1
  125. package/dist/tsup/mod.d.cts +9 -9
  126. package/dist/tsup/mod.d.ts +9 -9
  127. package/dist/tsup/mod.js +19 -13
  128. package/dist/tsup/sandbox/client.cjs +28 -0
  129. package/dist/tsup/sandbox/client.cjs.map +1 -0
  130. package/dist/tsup/sandbox/client.d.cts +88 -0
  131. package/dist/tsup/sandbox/client.d.ts +88 -0
  132. package/dist/tsup/sandbox/client.js +28 -0
  133. package/dist/tsup/sandbox/client.js.map +1 -0
  134. package/dist/tsup/sandbox/index.cjs +761 -0
  135. package/dist/tsup/sandbox/index.cjs.map +1 -0
  136. package/dist/tsup/sandbox/index.d.cts +120 -0
  137. package/dist/tsup/sandbox/index.d.ts +120 -0
  138. package/dist/tsup/sandbox/index.js +761 -0
  139. package/dist/tsup/sandbox/index.js.map +1 -0
  140. package/dist/tsup/sandbox/providers/computesdk.cjs +3 -0
  141. package/dist/tsup/sandbox/providers/computesdk.cjs.map +1 -0
  142. package/dist/tsup/sandbox/providers/computesdk.d.cts +7 -0
  143. package/dist/tsup/sandbox/providers/computesdk.d.ts +7 -0
  144. package/dist/tsup/sandbox/providers/computesdk.js +3 -0
  145. package/dist/tsup/sandbox/providers/computesdk.js.map +1 -0
  146. package/dist/tsup/sandbox/providers/daytona.cjs +3 -0
  147. package/dist/tsup/sandbox/providers/daytona.cjs.map +1 -0
  148. package/dist/tsup/sandbox/providers/daytona.d.cts +1 -0
  149. package/dist/tsup/sandbox/providers/daytona.d.ts +1 -0
  150. package/dist/tsup/sandbox/providers/daytona.js +3 -0
  151. package/dist/tsup/sandbox/providers/daytona.js.map +1 -0
  152. package/dist/tsup/sandbox/providers/docker.cjs +3 -0
  153. package/dist/tsup/sandbox/providers/docker.cjs.map +1 -0
  154. package/dist/tsup/sandbox/providers/docker.d.cts +1 -0
  155. package/dist/tsup/sandbox/providers/docker.d.ts +1 -0
  156. package/dist/tsup/sandbox/providers/docker.js +3 -0
  157. package/dist/tsup/sandbox/providers/docker.js.map +1 -0
  158. package/dist/tsup/sandbox/providers/e2b.cjs +3 -0
  159. package/dist/tsup/sandbox/providers/e2b.cjs.map +1 -0
  160. package/dist/tsup/sandbox/providers/e2b.d.cts +1 -0
  161. package/dist/tsup/sandbox/providers/e2b.d.ts +1 -0
  162. package/dist/tsup/sandbox/providers/e2b.js +3 -0
  163. package/dist/tsup/sandbox/providers/e2b.js.map +1 -0
  164. package/dist/tsup/sandbox/providers/local.cjs +3 -0
  165. package/dist/tsup/sandbox/providers/local.cjs.map +1 -0
  166. package/dist/tsup/sandbox/providers/local.d.cts +1 -0
  167. package/dist/tsup/sandbox/providers/local.d.ts +1 -0
  168. package/dist/tsup/sandbox/providers/local.js +3 -0
  169. package/dist/tsup/sandbox/providers/local.js.map +1 -0
  170. package/dist/tsup/sandbox/providers/modal.cjs +3 -0
  171. package/dist/tsup/sandbox/providers/modal.cjs.map +1 -0
  172. package/dist/tsup/sandbox/providers/modal.d.cts +1 -0
  173. package/dist/tsup/sandbox/providers/modal.d.ts +1 -0
  174. package/dist/tsup/sandbox/providers/modal.js +3 -0
  175. package/dist/tsup/sandbox/providers/modal.js.map +1 -0
  176. package/dist/tsup/sandbox/providers/vercel.cjs +3 -0
  177. package/dist/tsup/sandbox/providers/vercel.cjs.map +1 -0
  178. package/dist/tsup/sandbox/providers/vercel.d.cts +1 -0
  179. package/dist/tsup/sandbox/providers/vercel.d.ts +1 -0
  180. package/dist/tsup/sandbox/providers/vercel.js +3 -0
  181. package/dist/tsup/sandbox/providers/vercel.js.map +1 -0
  182. package/dist/tsup/serve-test-suite/mod.cjs +451 -327
  183. package/dist/tsup/serve-test-suite/mod.cjs.map +1 -1
  184. package/dist/tsup/serve-test-suite/mod.js +362 -238
  185. package/dist/tsup/serve-test-suite/mod.js.map +1 -1
  186. package/dist/tsup/test/mod.cjs +17 -14
  187. package/dist/tsup/test/mod.cjs.map +1 -1
  188. package/dist/tsup/test/mod.d.cts +4 -4
  189. package/dist/tsup/test/mod.d.ts +4 -4
  190. package/dist/tsup/test/mod.js +14 -11
  191. package/dist/tsup/test/mod.js.map +1 -1
  192. package/dist/tsup/utils.cjs +3 -3
  193. package/dist/tsup/utils.js +2 -2
  194. package/dist/tsup/workflow/mod.cjs +6 -6
  195. package/dist/tsup/workflow/mod.d.cts +13 -9
  196. package/dist/tsup/workflow/mod.d.ts +13 -9
  197. package/dist/tsup/workflow/mod.js +5 -5
  198. package/package.json +113 -14
  199. package/src/actor/config.ts +94 -88
  200. package/src/actor/conn/drivers/websocket.ts +2 -1
  201. package/src/actor/contexts/base/actor.ts +27 -4
  202. package/src/actor/database.ts +6 -1
  203. package/src/actor/driver.ts +27 -8
  204. package/src/actor/errors.ts +10 -5
  205. package/src/actor/instance/connection-manager.ts +4 -3
  206. package/src/actor/instance/kv.ts +52 -9
  207. package/src/actor/instance/mod.ts +135 -84
  208. package/src/actor/instance/queue-manager.ts +2 -5
  209. package/src/actor/instance/queue.ts +31 -29
  210. package/src/actor/instance/state-manager.ts +7 -1
  211. package/src/actor/instance/traces-driver.ts +34 -36
  212. package/src/actor/metrics.ts +137 -0
  213. package/src/actor/protocol/old.ts +9 -12
  214. package/src/actor/router-websocket-endpoints.ts +12 -6
  215. package/src/actor/router.ts +46 -9
  216. package/src/actor/schema.ts +14 -22
  217. package/src/client/actor-common.ts +65 -0
  218. package/src/client/actor-conn.ts +71 -9
  219. package/src/client/actor-handle.ts +22 -5
  220. package/src/client/client.ts +32 -6
  221. package/src/client/config.ts +18 -21
  222. package/src/client/mod.ts +1 -0
  223. package/src/client/queue.ts +8 -6
  224. package/src/common/inline-websocket-adapter.ts +8 -2
  225. package/src/common/router.ts +1 -4
  226. package/src/common/utils.ts +2 -5
  227. package/src/db/config.ts +10 -5
  228. package/src/db/drizzle/mod.ts +51 -41
  229. package/src/db/mod.ts +54 -29
  230. package/src/db/shared.ts +42 -8
  231. package/src/driver-helpers/mod.ts +2 -1
  232. package/src/driver-helpers/sqlite-pool.ts +42 -0
  233. package/src/driver-helpers/utils.ts +0 -20
  234. package/src/driver-test-suite/mod.ts +11 -1
  235. package/src/driver-test-suite/tests/access-control.ts +19 -12
  236. package/src/driver-test-suite/tests/action-features.ts +20 -8
  237. package/src/driver-test-suite/tests/actor-conn.ts +94 -8
  238. package/src/driver-test-suite/tests/actor-db-kv-stats.ts +282 -0
  239. package/src/driver-test-suite/tests/actor-db-raw.ts +6 -2
  240. package/src/driver-test-suite/tests/actor-db.ts +101 -31
  241. package/src/driver-test-suite/tests/actor-inspector.ts +174 -32
  242. package/src/driver-test-suite/tests/actor-kv.ts +79 -33
  243. package/src/driver-test-suite/tests/actor-lifecycle.ts +4 -12
  244. package/src/driver-test-suite/tests/actor-queue.ts +125 -17
  245. package/src/driver-test-suite/tests/actor-run.ts +59 -55
  246. package/src/driver-test-suite/tests/actor-sandbox.ts +78 -0
  247. package/src/driver-test-suite/tests/actor-schedule.ts +1 -4
  248. package/src/driver-test-suite/tests/actor-sleep.ts +111 -0
  249. package/src/driver-test-suite/tests/actor-workflow.ts +387 -3
  250. package/src/driver-test-suite/tests/conn-error-serialization.ts +3 -1
  251. package/src/driver-test-suite/tests/raw-websocket.ts +5 -1
  252. package/src/drivers/default.ts +1 -3
  253. package/src/drivers/engine/actor-driver.ts +94 -21
  254. package/src/drivers/engine/config.ts +4 -12
  255. package/src/drivers/engine/mod.ts +1 -5
  256. package/src/drivers/file-system/actor.ts +43 -8
  257. package/src/drivers/file-system/global-state.ts +180 -64
  258. package/src/drivers/file-system/kv-limits.ts +1 -1
  259. package/src/drivers/file-system/sqlite-runtime.ts +13 -4
  260. package/src/engine-process/mod.ts +5 -1
  261. package/src/inspector/actor-inspector.ts +47 -21
  262. package/src/inspector/config.ts +1 -4
  263. package/src/inspector/mod.browser.ts +2 -2
  264. package/src/inspector/mod.ts +4 -1
  265. package/src/inspector/serve-ui.ts +0 -1
  266. package/src/inspector/workflow-history-json.ts +309 -0
  267. package/src/manager/gateway.ts +6 -2
  268. package/src/manager/router.ts +3 -3
  269. package/src/registry/config/index.ts +65 -12
  270. package/src/registry/config/runner.ts +19 -4
  271. package/src/registry/index.ts +42 -89
  272. package/src/sandbox/actor/db.ts +36 -0
  273. package/src/sandbox/actor/index.ts +476 -0
  274. package/src/sandbox/actor/session.ts +350 -0
  275. package/src/sandbox/actor.test.ts +36 -0
  276. package/src/sandbox/client.test.ts +484 -0
  277. package/src/sandbox/client.ts +707 -0
  278. package/src/sandbox/config.ts +151 -0
  279. package/src/sandbox/index.ts +41 -0
  280. package/src/sandbox/providers/computesdk.ts +1 -0
  281. package/src/sandbox/providers/daytona.ts +1 -0
  282. package/src/sandbox/providers/docker.ts +1 -0
  283. package/src/sandbox/providers/e2b.ts +1 -0
  284. package/src/sandbox/providers/local.ts +1 -0
  285. package/src/sandbox/providers/modal.ts +1 -0
  286. package/src/sandbox/providers/vercel.ts +1 -0
  287. package/src/sandbox/session-persist-driver.ts +180 -0
  288. package/src/sandbox/types.ts +138 -0
  289. package/src/serverless/configure.ts +5 -3
  290. package/src/serverless/router.test.ts +17 -9
  291. package/src/serverless/router.ts +20 -13
  292. package/src/test/mod.ts +3 -4
  293. package/src/utils/endpoint-parser.test.ts +6 -2
  294. package/src/utils/endpoint-parser.ts +6 -2
  295. package/src/utils/env-vars.ts +0 -2
  296. package/src/utils/node.ts +1 -1
  297. package/src/utils/serve.ts +10 -5
  298. package/src/utils.ts +6 -1
  299. package/src/workflow/constants.ts +1 -2
  300. package/src/workflow/context.ts +42 -9
  301. package/src/workflow/driver.ts +57 -23
  302. package/src/workflow/inspector.ts +7 -13
  303. package/src/workflow/mod.ts +91 -4
  304. package/dist/tsup/chunk-3B6PCYJB.cjs.map +0 -1
  305. package/dist/tsup/chunk-3GTO6H3E.js.map +0 -1
  306. package/dist/tsup/chunk-4KSHPFXF.cjs.map +0 -1
  307. package/dist/tsup/chunk-6LJAZ5R4.cjs +0 -96
  308. package/dist/tsup/chunk-6LJAZ5R4.cjs.map +0 -1
  309. package/dist/tsup/chunk-7HTNH26M.js.map +0 -1
  310. package/dist/tsup/chunk-ANKZ2FS6.js.map +0 -1
  311. package/dist/tsup/chunk-DZXDUGLL.js.map +0 -1
  312. package/dist/tsup/chunk-GXRVSSVD.cjs.map +0 -1
  313. package/dist/tsup/chunk-H5TSEPN4.cjs +0 -645
  314. package/dist/tsup/chunk-H5TSEPN4.cjs.map +0 -1
  315. package/dist/tsup/chunk-HKOSZKKZ.cjs.map +0 -1
  316. package/dist/tsup/chunk-I6PL6QIY.js.map +0 -1
  317. package/dist/tsup/chunk-KJSYAUOM.js.map +0 -1
  318. package/dist/tsup/chunk-KTWY3K6Z.js.map +0 -1
  319. package/dist/tsup/chunk-L47L3ZWJ.cjs.map +0 -1
  320. package/dist/tsup/chunk-LK36OGGO.cjs.map +0 -1
  321. package/dist/tsup/chunk-M6H4XIF4.js.map +0 -1
  322. package/dist/tsup/chunk-N4KRDJ56.js.map +0 -1
  323. package/dist/tsup/chunk-SR3KQE7Q.cjs.map +0 -1
  324. package/dist/tsup/chunk-TEFYRRAK.js +0 -645
  325. package/dist/tsup/chunk-TEFYRRAK.js.map +0 -1
  326. package/dist/tsup/chunk-TEUL4UYN.cjs.map +0 -1
  327. package/dist/tsup/chunk-UDMRZR6A.js.map +0 -1
  328. package/dist/tsup/chunk-UWAGLDT6.cjs.map +0 -1
  329. package/dist/tsup/chunk-VKVNIQRQ.js.map +0 -1
  330. package/dist/tsup/chunk-ZFY5J2EP.cjs.map +0 -1
  331. package/src/db/sqlite-vfs.ts +0 -12
  332. /package/dist/tsup/{chunk-HBYEYBIC.js.map → chunk-EONWXYMN.js.map} +0 -0
  333. /package/dist/tsup/{chunk-5UEFNG7P.js.map → chunk-I5I6OALK.js.map} +0 -0
@@ -0,0 +1,707 @@
1
+ /**
2
+ * Client-side helpers for direct operations against a sandbox-agent server.
3
+ *
4
+ * The sandbox actor proxies all sandbox-agent SDK methods as Rivet Actor
5
+ * actions, which use JSON-based RPC serialization. This works well for
6
+ * structured data (sessions, processes, MCP config), but three categories of
7
+ * operations do not fit through JSON actions:
8
+ *
9
+ * 1. Binary filesystem I/O (readFsFile, writeFsFile, uploadFsBatch): raw
10
+ * binary payloads would require base64 encoding with ~33% size overhead.
11
+ * 2. WebSocket terminals (connectProcessTerminal,
12
+ * connectProcessTerminalWebSocket): bidirectional binary streams cannot be
13
+ * serialized through request-response JSON.
14
+ * 3. SSE log streaming (followProcessLogs): continuous event streams with
15
+ * callbacks cannot be proxied through one-shot JSON actions.
16
+ *
17
+ * These helpers let the client talk directly to the sandbox-agent HTTP API,
18
+ * bypassing the actor's JSON action layer. The sandbox URL is obtained via
19
+ * the actor's `getSandboxUrl` action. Sandbox providers already secure the
20
+ * connection between client and sandbox, so no additional authentication is
21
+ * needed on these direct endpoints.
22
+ */
23
+
24
+ const API_PREFIX = "/v1";
25
+
26
+ type FetchBody =
27
+ | Blob
28
+ | ArrayBuffer
29
+ | Uint8Array
30
+ | ReadableStream
31
+ | string;
32
+
33
+ type TerminalInput = string | ArrayBuffer | ArrayBufferView;
34
+ type WebSocketConstructor = typeof WebSocket;
35
+ type ProcessLogStream = "stdout" | "stderr" | "combined" | "pty";
36
+
37
+ export interface FsEntry {
38
+ entryType: "file" | "directory";
39
+ modified?: string | null;
40
+ name: string;
41
+ path: string;
42
+ size: number;
43
+ }
44
+
45
+ export interface FsStat {
46
+ entryType: "file" | "directory";
47
+ modified?: string | null;
48
+ path: string;
49
+ size: number;
50
+ }
51
+
52
+ export interface UploadBatchResponse {
53
+ paths: string[];
54
+ truncated: boolean;
55
+ }
56
+
57
+ export interface ProcessLogEntry {
58
+ data: string;
59
+ encoding: string;
60
+ sequence: number;
61
+ stream: ProcessLogStream;
62
+ timestampMs: number;
63
+ }
64
+
65
+ export interface FollowProcessLogsOptions {
66
+ stream?: ProcessLogStream;
67
+ tail?: number;
68
+ since?: number;
69
+ }
70
+
71
+ export interface TerminalExitStatus {
72
+ exitCode: number | null;
73
+ }
74
+
75
+ export interface TerminalConnectOptions {
76
+ protocols?: string | string[];
77
+ WebSocket?: WebSocketConstructor;
78
+ }
79
+
80
+ export interface TerminalSession {
81
+ onData(listener: (data: Uint8Array) => void): () => void;
82
+ onExit(listener: (status: TerminalExitStatus) => void): () => void;
83
+ onError(listener: (error: Error) => void): () => void;
84
+ onClose(listener: () => void): () => void;
85
+ sendInput(data: TerminalInput): void;
86
+ resize(cols: number, rows: number): void;
87
+ close(): void;
88
+ socket: WebSocket;
89
+ }
90
+
91
+ export async function uploadFile(
92
+ sandboxUrl: string,
93
+ path: string,
94
+ data: FetchBody,
95
+ ): Promise<void> {
96
+ const response = await fetchSandbox(
97
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/file`, { path }),
98
+ {
99
+ method: "PUT",
100
+ headers: {
101
+ "Content-Type": "application/octet-stream",
102
+ },
103
+ body: data,
104
+ },
105
+ );
106
+ await assertOk(response, "upload file");
107
+ }
108
+
109
+ export async function downloadFile(
110
+ sandboxUrl: string,
111
+ path: string,
112
+ ): Promise<ArrayBuffer> {
113
+ const response = await fetchSandbox(
114
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/file`, { path }),
115
+ {
116
+ method: "GET",
117
+ },
118
+ );
119
+ await assertOk(response, "download file");
120
+ return await response.arrayBuffer();
121
+ }
122
+
123
+ export async function uploadBatch(
124
+ sandboxUrl: string,
125
+ destinationPath: string,
126
+ tarData: Blob | ArrayBuffer | Uint8Array,
127
+ ): Promise<UploadBatchResponse> {
128
+ const response = await fetchSandbox(
129
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/upload-batch`, {
130
+ path: destinationPath,
131
+ }),
132
+ {
133
+ method: "POST",
134
+ headers: {
135
+ "Content-Type": "application/x-tar",
136
+ },
137
+ body: tarData,
138
+ },
139
+ );
140
+ await assertOk(response, "upload batch");
141
+ return (await response.json()) as UploadBatchResponse;
142
+ }
143
+
144
+ export async function listFiles(
145
+ sandboxUrl: string,
146
+ path: string,
147
+ ): Promise<FsEntry[]> {
148
+ const response = await fetchSandbox(
149
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/entries`, { path }),
150
+ {
151
+ method: "GET",
152
+ },
153
+ );
154
+ await assertOk(response, "list files");
155
+ return (await response.json()) as FsEntry[];
156
+ }
157
+
158
+ export async function statFile(
159
+ sandboxUrl: string,
160
+ path: string,
161
+ ): Promise<FsStat> {
162
+ const response = await fetchSandbox(
163
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/stat`, { path }),
164
+ {
165
+ method: "GET",
166
+ },
167
+ );
168
+ await assertOk(response, "stat file");
169
+ return (await response.json()) as FsStat;
170
+ }
171
+
172
+ export async function deleteFile(
173
+ sandboxUrl: string,
174
+ path: string,
175
+ ): Promise<void> {
176
+ const response = await fetchSandbox(
177
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/entry`, { path }),
178
+ {
179
+ method: "DELETE",
180
+ },
181
+ );
182
+ await assertOk(response, "delete file");
183
+ }
184
+
185
+ export async function mkdirFs(
186
+ sandboxUrl: string,
187
+ path: string,
188
+ ): Promise<void> {
189
+ const response = await fetchSandbox(
190
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/mkdir`, { path }),
191
+ {
192
+ method: "POST",
193
+ },
194
+ );
195
+ await assertOk(response, "mkdir");
196
+ }
197
+
198
+ export async function moveFile(
199
+ sandboxUrl: string,
200
+ from: string,
201
+ to: string,
202
+ overwrite = false,
203
+ ): Promise<void> {
204
+ const response = await fetchSandbox(
205
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/move`),
206
+ {
207
+ method: "POST",
208
+ headers: {
209
+ "Content-Type": "application/json",
210
+ },
211
+ body: JSON.stringify({
212
+ from,
213
+ to,
214
+ overwrite,
215
+ }),
216
+ },
217
+ );
218
+ await assertOk(response, "move file");
219
+ }
220
+
221
+ export function buildTerminalWebSocketUrl(
222
+ sandboxUrl: string,
223
+ processId: string,
224
+ ): string {
225
+ const url = new URL(
226
+ buildUrl(
227
+ sandboxUrl,
228
+ `${API_PREFIX}/processes/${encodeURIComponent(processId)}/terminal/ws`,
229
+ ),
230
+ );
231
+ if (url.protocol === "http:") {
232
+ url.protocol = "ws:";
233
+ } else if (url.protocol === "https:") {
234
+ url.protocol = "wss:";
235
+ }
236
+ return url.toString();
237
+ }
238
+
239
+ export function connectTerminal(
240
+ sandboxUrl: string,
241
+ processId: string,
242
+ options: TerminalConnectOptions = {},
243
+ ): TerminalSession {
244
+ const WebSocketCtor = options.WebSocket ?? getWebSocketCtor();
245
+ const socket = new WebSocketCtor(
246
+ buildTerminalWebSocketUrl(sandboxUrl, processId),
247
+ options.protocols,
248
+ );
249
+ socket.binaryType = "arraybuffer";
250
+ return new DirectTerminalSession(socket);
251
+ }
252
+
253
+ export async function followProcessLogs(
254
+ sandboxUrl: string,
255
+ processId: string,
256
+ listener: (entry: ProcessLogEntry) => void,
257
+ options: FollowProcessLogsOptions = {},
258
+ ): Promise<{ close: () => void; closed: Promise<void> }> {
259
+ const abortController = new AbortController();
260
+ const response = await fetchSandbox(
261
+ buildUrl(
262
+ sandboxUrl,
263
+ `${API_PREFIX}/processes/${encodeURIComponent(processId)}/logs`,
264
+ {
265
+ follow: true,
266
+ stream: options.stream,
267
+ tail: options.tail,
268
+ since: options.since,
269
+ },
270
+ ),
271
+ {
272
+ method: "GET",
273
+ headers: {
274
+ Accept: "text/event-stream",
275
+ },
276
+ signal: abortController.signal,
277
+ },
278
+ );
279
+ await assertOk(response, "follow process logs");
280
+ if (!response.body) {
281
+ abortController.abort();
282
+ throw new Error("SSE stream is not readable in this environment.");
283
+ }
284
+
285
+ const closed = consumeProcessLogSse(
286
+ response.body,
287
+ listener,
288
+ abortController.signal,
289
+ );
290
+ return {
291
+ close: () => abortController.abort(),
292
+ closed,
293
+ };
294
+ }
295
+
296
+ async function assertOk(response: Response, operation: string): Promise<void> {
297
+ if (!response.ok) {
298
+ const body = await response.text().catch(() => "");
299
+ throw new Error(
300
+ `Sandbox ${operation} failed (${response.status}): ${body}`,
301
+ );
302
+ }
303
+ }
304
+
305
+ class DirectTerminalSession implements TerminalSession {
306
+ readonly socket: WebSocket;
307
+
308
+ private readonly dataListeners = new Set<(data: Uint8Array) => void>();
309
+ private readonly exitListeners = new Set<
310
+ (status: TerminalExitStatus) => void
311
+ >();
312
+ private readonly errorListeners = new Set<(error: Error) => void>();
313
+ private readonly closeListeners = new Set<() => void>();
314
+ private closeSignalSent = false;
315
+
316
+ constructor(socket: WebSocket) {
317
+ this.socket = socket;
318
+ this.socket.addEventListener("message", (event) => {
319
+ void this.handleMessage(event.data);
320
+ });
321
+ this.socket.addEventListener("error", () => {
322
+ this.emitError(new Error("Terminal websocket connection failed."));
323
+ });
324
+ this.socket.addEventListener("close", () => {
325
+ for (const listener of this.closeListeners) {
326
+ listener();
327
+ }
328
+ });
329
+ }
330
+
331
+ onData(listener: (data: Uint8Array) => void): () => void {
332
+ this.dataListeners.add(listener);
333
+ return () => this.dataListeners.delete(listener);
334
+ }
335
+
336
+ onExit(listener: (status: TerminalExitStatus) => void): () => void {
337
+ this.exitListeners.add(listener);
338
+ return () => this.exitListeners.delete(listener);
339
+ }
340
+
341
+ onError(listener: (error: Error) => void): () => void {
342
+ this.errorListeners.add(listener);
343
+ return () => this.errorListeners.delete(listener);
344
+ }
345
+
346
+ onClose(listener: () => void): () => void {
347
+ this.closeListeners.add(listener);
348
+ return () => this.closeListeners.delete(listener);
349
+ }
350
+
351
+ sendInput(data: TerminalInput): void {
352
+ const payload = encodeTerminalInput(data);
353
+ this.sendFrame({
354
+ type: "input",
355
+ data: payload.data,
356
+ encoding: payload.encoding,
357
+ });
358
+ }
359
+
360
+ resize(cols: number, rows: number): void {
361
+ this.sendFrame({
362
+ type: "resize",
363
+ cols,
364
+ rows,
365
+ });
366
+ }
367
+
368
+ close(): void {
369
+ if (this.socket.readyState === 0) {
370
+ this.socket.addEventListener(
371
+ "open",
372
+ () => {
373
+ this.close();
374
+ },
375
+ { once: true },
376
+ );
377
+ return;
378
+ }
379
+
380
+ if (this.socket.readyState === 1) {
381
+ if (!this.closeSignalSent) {
382
+ this.closeSignalSent = true;
383
+ this.sendFrame({ type: "close" });
384
+ }
385
+ this.socket.close();
386
+ return;
387
+ }
388
+
389
+ if (this.socket.readyState !== 3) {
390
+ this.socket.close();
391
+ }
392
+ }
393
+
394
+ private async handleMessage(data: unknown): Promise<void> {
395
+ try {
396
+ if (typeof data === "string") {
397
+ const frame = parseTerminalServerFrame(data);
398
+ if (!frame) {
399
+ this.emitError(
400
+ new Error("Received invalid terminal control frame."),
401
+ );
402
+ return;
403
+ }
404
+
405
+ if (frame.type === "exit") {
406
+ for (const listener of this.exitListeners) {
407
+ listener({ exitCode: frame.exitCode ?? null });
408
+ }
409
+ return;
410
+ }
411
+
412
+ if (frame.type === "error") {
413
+ this.emitError(new Error(frame.message));
414
+ }
415
+ return;
416
+ }
417
+
418
+ const bytes = await decodeTerminalBytes(data);
419
+ if (!bytes) {
420
+ this.emitError(
421
+ new Error("Received unsupported terminal message payload."),
422
+ );
423
+ return;
424
+ }
425
+
426
+ for (const listener of this.dataListeners) {
427
+ listener(bytes);
428
+ }
429
+ } catch (error) {
430
+ this.emitError(
431
+ error instanceof Error ? error : new Error(String(error)),
432
+ );
433
+ }
434
+ }
435
+
436
+ private sendFrame(frame: {
437
+ type: "input";
438
+ data: string;
439
+ encoding?: string;
440
+ } | {
441
+ type: "resize";
442
+ cols: number;
443
+ rows: number;
444
+ } | {
445
+ type: "close";
446
+ }): void {
447
+ if (this.socket.readyState !== 1) {
448
+ return;
449
+ }
450
+ this.socket.send(JSON.stringify(frame));
451
+ }
452
+
453
+ private emitError(error: Error): void {
454
+ for (const listener of this.errorListeners) {
455
+ listener(error);
456
+ }
457
+ }
458
+ }
459
+
460
+ async function fetchSandbox(
461
+ input: string,
462
+ init: RequestInit & { body?: FetchBody },
463
+ ): Promise<Response> {
464
+ const requestInit = { ...init } as RequestInit & {
465
+ body?: unknown;
466
+ duplex?: "half";
467
+ };
468
+ requestInit.body = init.body;
469
+ if (isReadableStream(init.body)) {
470
+ requestInit.duplex = "half";
471
+ }
472
+ return await getFetch()(input, requestInit);
473
+ }
474
+
475
+ function getFetch(): typeof fetch {
476
+ if (!globalThis.fetch) {
477
+ throw new Error(
478
+ "Fetch API is not available; provide a global fetch implementation.",
479
+ );
480
+ }
481
+ return globalThis.fetch.bind(globalThis);
482
+ }
483
+
484
+ function getWebSocketCtor(): WebSocketConstructor {
485
+ if (!globalThis.WebSocket) {
486
+ throw new Error(
487
+ "WebSocket API is not available; provide a WebSocket implementation.",
488
+ );
489
+ }
490
+ return globalThis.WebSocket;
491
+ }
492
+
493
+ function buildUrl(
494
+ sandboxUrl: string,
495
+ pathname: string,
496
+ query?: Record<string, string | number | boolean | undefined>,
497
+ ): string {
498
+ const url = new URL(sandboxUrl);
499
+ const basePath = url.pathname.replace(/\/+$/, "");
500
+ const suffix = pathname.startsWith("/") ? pathname : `/${pathname}`;
501
+ url.pathname = `${basePath}${suffix}`.replace(/\/{2,}/g, "/");
502
+ if (query) {
503
+ for (const [key, value] of Object.entries(query)) {
504
+ if (value === undefined) {
505
+ continue;
506
+ }
507
+ url.searchParams.set(key, String(value));
508
+ }
509
+ }
510
+ return url.toString();
511
+ }
512
+
513
+ function parseTerminalServerFrame(payload: string):
514
+ | {
515
+ type: "ready";
516
+ processId: string;
517
+ }
518
+ | {
519
+ type: "exit";
520
+ exitCode?: number | null;
521
+ }
522
+ | {
523
+ type: "error";
524
+ message: string;
525
+ }
526
+ | null {
527
+ try {
528
+ const parsed = JSON.parse(payload) as Record<string, unknown>;
529
+ if (typeof parsed.type !== "string") {
530
+ return null;
531
+ }
532
+ if (
533
+ parsed.type === "ready" &&
534
+ typeof parsed.processId === "string"
535
+ ) {
536
+ return {
537
+ type: "ready",
538
+ processId: parsed.processId,
539
+ };
540
+ }
541
+ if (
542
+ parsed.type === "exit" &&
543
+ (parsed.exitCode === undefined ||
544
+ parsed.exitCode === null ||
545
+ typeof parsed.exitCode === "number")
546
+ ) {
547
+ return {
548
+ type: "exit",
549
+ exitCode: (parsed.exitCode as number | null | undefined) ?? null,
550
+ };
551
+ }
552
+ if (
553
+ parsed.type === "error" &&
554
+ typeof parsed.message === "string"
555
+ ) {
556
+ return {
557
+ type: "error",
558
+ message: parsed.message,
559
+ };
560
+ }
561
+ } catch {
562
+ return null;
563
+ }
564
+ return null;
565
+ }
566
+
567
+ function encodeTerminalInput(data: TerminalInput): {
568
+ data: string;
569
+ encoding?: string;
570
+ } {
571
+ if (typeof data === "string") {
572
+ return { data };
573
+ }
574
+ return {
575
+ data: bytesToBase64(encodeTerminalBytes(data)),
576
+ encoding: "base64",
577
+ };
578
+ }
579
+
580
+ function encodeTerminalBytes(data: ArrayBuffer | ArrayBufferView): Uint8Array {
581
+ if (data instanceof ArrayBuffer) {
582
+ return new Uint8Array(data);
583
+ }
584
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice();
585
+ }
586
+
587
+ async function decodeTerminalBytes(data: unknown): Promise<Uint8Array | null> {
588
+ if (data instanceof ArrayBuffer) {
589
+ return new Uint8Array(data);
590
+ }
591
+ if (ArrayBuffer.isView(data)) {
592
+ return new Uint8Array(
593
+ data.buffer,
594
+ data.byteOffset,
595
+ data.byteLength,
596
+ ).slice();
597
+ }
598
+ if (typeof Blob !== "undefined" && data instanceof Blob) {
599
+ return new Uint8Array(await data.arrayBuffer());
600
+ }
601
+ return null;
602
+ }
603
+
604
+ function bytesToBase64(bytes: Uint8Array): string {
605
+ const bufferCtor = (
606
+ globalThis as typeof globalThis & {
607
+ Buffer?: {
608
+ from(data: Uint8Array): { toString(encoding: "base64"): string };
609
+ };
610
+ }
611
+ ).Buffer;
612
+ if (bufferCtor) {
613
+ return bufferCtor.from(bytes).toString("base64");
614
+ }
615
+
616
+ let binary = "";
617
+ const chunkSize = 0x8000;
618
+ for (let index = 0; index < bytes.length; index += chunkSize) {
619
+ const chunk = bytes.subarray(index, index + chunkSize);
620
+ binary += String.fromCharCode(...chunk);
621
+ }
622
+ if (typeof btoa !== "function") {
623
+ throw new Error("No base64 encoder is available in this environment.");
624
+ }
625
+ return btoa(binary);
626
+ }
627
+
628
+ async function consumeProcessLogSse(
629
+ body: ReadableStream<Uint8Array>,
630
+ listener: (entry: ProcessLogEntry) => void,
631
+ signal: AbortSignal,
632
+ ): Promise<void> {
633
+ const reader = body.getReader();
634
+ const decoder = new TextDecoder();
635
+ let buffer = "";
636
+ try {
637
+ while (!signal.aborted) {
638
+ const { done, value } = await reader.read();
639
+ if (done) {
640
+ return;
641
+ }
642
+ buffer += decoder
643
+ .decode(value, { stream: true })
644
+ .replace(/\r\n/g, "\n");
645
+ let separatorIndex = buffer.indexOf("\n\n");
646
+ while (separatorIndex !== -1) {
647
+ const chunk = buffer.slice(0, separatorIndex);
648
+ buffer = buffer.slice(separatorIndex + 2);
649
+ const entry = parseProcessLogSseChunk(chunk);
650
+ if (entry) {
651
+ listener(entry);
652
+ }
653
+ separatorIndex = buffer.indexOf("\n\n");
654
+ }
655
+ }
656
+ } catch (error) {
657
+ if (signal.aborted || isAbortError(error)) {
658
+ return;
659
+ }
660
+ throw error;
661
+ } finally {
662
+ reader.releaseLock();
663
+ }
664
+ }
665
+
666
+ function parseProcessLogSseChunk(chunk: string): ProcessLogEntry | null {
667
+ if (!chunk.trim()) {
668
+ return null;
669
+ }
670
+
671
+ let eventName = "message";
672
+ const dataLines: string[] = [];
673
+ for (const line of chunk.split("\n")) {
674
+ if (!line || line.startsWith(":")) {
675
+ continue;
676
+ }
677
+ if (line.startsWith("event:")) {
678
+ eventName = line.slice(6).trim();
679
+ continue;
680
+ }
681
+ if (line.startsWith("data:")) {
682
+ dataLines.push(line.slice(5).trimStart());
683
+ }
684
+ }
685
+
686
+ if (eventName !== "log") {
687
+ return null;
688
+ }
689
+
690
+ const data = dataLines.join("\n");
691
+ if (!data.trim()) {
692
+ return null;
693
+ }
694
+
695
+ return JSON.parse(data) as ProcessLogEntry;
696
+ }
697
+
698
+ function isAbortError(error: unknown): boolean {
699
+ return error instanceof Error && error.name === "AbortError";
700
+ }
701
+
702
+ function isReadableStream(value: unknown): value is ReadableStream {
703
+ return (
704
+ typeof ReadableStream !== "undefined" &&
705
+ value instanceof ReadableStream
706
+ );
707
+ }