rivetkit 2.1.5 → 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-PB5AEMKQ.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-TADUYCHF.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-GQGRQDRL.cjs → chunk-DH6UINWA.cjs} +4 -4
  30. package/dist/tsup/{chunk-GQGRQDRL.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-S662Y6ZU.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-IIJNPVPQ.cjs → chunk-GUHXWPGB.cjs} +1515 -1479
  39. package/dist/tsup/chunk-GUHXWPGB.cjs.map +1 -0
  40. package/dist/tsup/{chunk-TI5PXQGG.cjs → chunk-HNE2AK6C.cjs} +2375 -3713
  41. package/dist/tsup/chunk-HNE2AK6C.cjs.map +1 -0
  42. package/dist/tsup/{chunk-2OK7S6QF.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-U5SMSA27.cjs → chunk-JJNZQDUN.cjs} +667 -2517
  46. package/dist/tsup/chunk-JJNZQDUN.cjs.map +1 -0
  47. package/dist/tsup/{chunk-ZPWOYQHN.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-HYPIHCDT.cjs → chunk-MPLMTJY5.cjs} +123 -23
  56. package/dist/tsup/chunk-MPLMTJY5.cjs.map +1 -0
  57. package/dist/tsup/{chunk-MIX2KB6U.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-WY2SHWXQ.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-7WF2QSIC.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-JC6BEPE7.cjs → chunk-V3JSZR5P.cjs} +3 -3
  70. package/dist/tsup/{chunk-JC6BEPE7.cjs.map → chunk-V3JSZR5P.cjs.map} +1 -1
  71. package/dist/tsup/{chunk-OAXJWGMU.cjs → chunk-VBR35EQF.cjs} +271 -339
  72. package/dist/tsup/chunk-VBR35EQF.cjs.map +1 -0
  73. package/dist/tsup/{chunk-EIATSBYZ.js → chunk-VWYO36X4.js} +117 -17
  74. package/dist/tsup/chunk-VWYO36X4.js.map +1 -0
  75. package/dist/tsup/{chunk-JPXO2H55.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-SRIM3GHD.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 +114 -15
  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-6LJAZ5R4.cjs +0 -96
  305. package/dist/tsup/chunk-6LJAZ5R4.cjs.map +0 -1
  306. package/dist/tsup/chunk-7HTNH26M.js.map +0 -1
  307. package/dist/tsup/chunk-7WF2QSIC.cjs.map +0 -1
  308. package/dist/tsup/chunk-D2SPAJVT.cjs +0 -645
  309. package/dist/tsup/chunk-D2SPAJVT.cjs.map +0 -1
  310. package/dist/tsup/chunk-EIATSBYZ.js.map +0 -1
  311. package/dist/tsup/chunk-HYPIHCDT.cjs.map +0 -1
  312. package/dist/tsup/chunk-IIJNPVPQ.cjs.map +0 -1
  313. package/dist/tsup/chunk-JPXO2H55.js.map +0 -1
  314. package/dist/tsup/chunk-KJSYAUOM.js.map +0 -1
  315. package/dist/tsup/chunk-L47L3ZWJ.cjs.map +0 -1
  316. package/dist/tsup/chunk-MIX2KB6U.js.map +0 -1
  317. package/dist/tsup/chunk-N4KRDJ56.js.map +0 -1
  318. package/dist/tsup/chunk-OAXJWGMU.cjs.map +0 -1
  319. package/dist/tsup/chunk-PB5AEMKQ.cjs.map +0 -1
  320. package/dist/tsup/chunk-R5OQUSLN.js +0 -645
  321. package/dist/tsup/chunk-R5OQUSLN.js.map +0 -1
  322. package/dist/tsup/chunk-SR3KQE7Q.cjs.map +0 -1
  323. package/dist/tsup/chunk-SRIM3GHD.js.map +0 -1
  324. package/dist/tsup/chunk-TADUYCHF.js.map +0 -1
  325. package/dist/tsup/chunk-TI5PXQGG.cjs.map +0 -1
  326. package/dist/tsup/chunk-U5SMSA27.cjs.map +0 -1
  327. package/dist/tsup/chunk-VKVNIQRQ.js.map +0 -1
  328. package/dist/tsup/chunk-WY2SHWXQ.js.map +0 -1
  329. package/dist/tsup/chunk-ZFY5J2EP.cjs.map +0 -1
  330. package/dist/tsup/chunk-ZPWOYQHN.js.map +0 -1
  331. package/src/db/sqlite-vfs.ts +0 -12
  332. /package/dist/tsup/{chunk-S662Y6ZU.js.map → chunk-EONWXYMN.js.map} +0 -0
  333. /package/dist/tsup/{chunk-2OK7S6QF.js.map → chunk-I5I6OALK.js.map} +0 -0
@@ -0,0 +1,484 @@
1
+ import { createServer, type IncomingMessage, type ServerResponse } from "node:http";
2
+ import type { AddressInfo } from "node:net";
3
+ import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
4
+ import {
5
+ buildTerminalWebSocketUrl,
6
+ connectTerminal,
7
+ deleteFile,
8
+ downloadFile,
9
+ followProcessLogs,
10
+ listFiles,
11
+ mkdirFs,
12
+ moveFile,
13
+ statFile,
14
+ uploadBatch,
15
+ uploadFile,
16
+ } from "./client";
17
+
18
+ class MockWebSocket {
19
+ static instances: MockWebSocket[] = [];
20
+
21
+ readonly url: string;
22
+ readonly protocols?: string | string[];
23
+ readonly sent: unknown[] = [];
24
+ binaryType = "blob";
25
+ readyState = 1;
26
+
27
+ private readonly listeners = new Map<
28
+ string,
29
+ Array<{ listener: (event?: any) => void; once: boolean }>
30
+ >();
31
+
32
+ constructor(url: string, protocols?: string | string[]) {
33
+ this.url = url;
34
+ this.protocols = protocols;
35
+ MockWebSocket.instances.push(this);
36
+ }
37
+
38
+ addEventListener(
39
+ type: string,
40
+ listener: (event?: any) => void,
41
+ options?: EventListenerOptions & { once?: boolean },
42
+ ): void {
43
+ const entries = this.listeners.get(type) ?? [];
44
+ entries.push({
45
+ listener,
46
+ once: options?.once ?? false,
47
+ });
48
+ this.listeners.set(type, entries);
49
+ }
50
+
51
+ send(data: unknown): void {
52
+ this.sent.push(data);
53
+ }
54
+
55
+ close(): void {
56
+ this.readyState = 3;
57
+ this.emit("close");
58
+ }
59
+
60
+ emit(type: string, event?: any): void {
61
+ const entries = [...(this.listeners.get(type) ?? [])];
62
+ for (const entry of entries) {
63
+ entry.listener(event);
64
+ if (entry.once) {
65
+ const remaining = (this.listeners.get(type) ?? []).filter(
66
+ (candidate) => candidate !== entry,
67
+ );
68
+ this.listeners.set(type, remaining);
69
+ }
70
+ }
71
+ }
72
+ }
73
+
74
+ const originalFetch = globalThis.fetch;
75
+ const originalWebSocket = globalThis.WebSocket;
76
+
77
+ function setGlobalFetch(fetchImpl: typeof fetch): void {
78
+ Object.defineProperty(globalThis, "fetch", {
79
+ configurable: true,
80
+ writable: true,
81
+ value: fetchImpl,
82
+ });
83
+ }
84
+
85
+ function restoreGlobals(): void {
86
+ if (originalFetch) {
87
+ Object.defineProperty(globalThis, "fetch", {
88
+ configurable: true,
89
+ writable: true,
90
+ value: originalFetch,
91
+ });
92
+ } else {
93
+ delete (globalThis as { fetch?: typeof fetch }).fetch;
94
+ }
95
+
96
+ if (originalWebSocket) {
97
+ Object.defineProperty(globalThis, "WebSocket", {
98
+ configurable: true,
99
+ writable: true,
100
+ value: originalWebSocket,
101
+ });
102
+ } else {
103
+ delete (globalThis as { WebSocket?: typeof WebSocket }).WebSocket;
104
+ }
105
+ }
106
+
107
+ async function withSandboxServer(
108
+ handler: (
109
+ req: IncomingMessage,
110
+ res: ServerResponse,
111
+ body: string,
112
+ ) => void | Promise<void>,
113
+ run: (
114
+ baseUrl: string,
115
+ requests: Array<{ method: string; url: string; body: string }>,
116
+ ) => Promise<void>,
117
+ ): Promise<void> {
118
+ const requests: Array<{ method: string; url: string; body: string }> = [];
119
+ const server = createServer(async (req, res) => {
120
+ const chunks: Uint8Array[] = [];
121
+ for await (const chunk of req) {
122
+ chunks.push(
123
+ typeof chunk === "string" ? new TextEncoder().encode(chunk) : chunk,
124
+ );
125
+ }
126
+ const body = Buffer.concat(chunks).toString();
127
+ requests.push({
128
+ method: req.method ?? "GET",
129
+ url: req.url ?? "/",
130
+ body,
131
+ });
132
+ await handler(req, res, body);
133
+ });
134
+
135
+ await new Promise<void>((resolve) => {
136
+ server.listen(0, "127.0.0.1", () => resolve());
137
+ });
138
+
139
+ const port = (server.address() as AddressInfo).port;
140
+ try {
141
+ await run(`http://127.0.0.1:${port}/base`, requests);
142
+ } finally {
143
+ await new Promise<void>((resolve, reject) => {
144
+ server.close((error) => {
145
+ if (error) {
146
+ reject(error);
147
+ } else {
148
+ resolve();
149
+ }
150
+ });
151
+ });
152
+ }
153
+ }
154
+
155
+ describe("sandbox direct client helpers", () => {
156
+ beforeEach(() => {
157
+ MockWebSocket.instances = [];
158
+ });
159
+
160
+ afterEach(() => {
161
+ vi.restoreAllMocks();
162
+ restoreGlobals();
163
+ });
164
+
165
+ test("uploadFile and downloadFile use the raw file endpoint", async () => {
166
+ await withSandboxServer(
167
+ (req, res) => {
168
+ if (
169
+ req.method === "PUT" &&
170
+ req.url === "/base/v1/fs/file?path=%2Fworkspace%2Fa.txt"
171
+ ) {
172
+ res.writeHead(204);
173
+ res.end();
174
+ return;
175
+ }
176
+ if (
177
+ req.method === "GET" &&
178
+ req.url === "/base/v1/fs/file?path=%2Fworkspace%2Fa.txt"
179
+ ) {
180
+ res.writeHead(200);
181
+ res.end("hi");
182
+ return;
183
+ }
184
+ res.writeHead(404);
185
+ res.end();
186
+ },
187
+ async (baseUrl, requests) => {
188
+ await uploadFile(baseUrl, "/workspace/a.txt", "hello");
189
+ const downloaded = await downloadFile(baseUrl, "/workspace/a.txt");
190
+
191
+ expect(new TextDecoder().decode(downloaded)).toBe("hi");
192
+ expect(requests).toEqual([
193
+ {
194
+ method: "PUT",
195
+ url: "/base/v1/fs/file?path=%2Fworkspace%2Fa.txt",
196
+ body: "hello",
197
+ },
198
+ {
199
+ method: "GET",
200
+ url: "/base/v1/fs/file?path=%2Fworkspace%2Fa.txt",
201
+ body: "",
202
+ },
203
+ ]);
204
+ },
205
+ );
206
+ });
207
+
208
+ test("uploadBatch, listFiles, and statFile parse JSON responses", async () => {
209
+ await withSandboxServer(
210
+ (req, res) => {
211
+ if (
212
+ req.method === "POST" &&
213
+ req.url === "/base/v1/fs/upload-batch?path=%2Fworkspace"
214
+ ) {
215
+ res.writeHead(200, { "Content-Type": "application/json" });
216
+ res.end(
217
+ JSON.stringify({
218
+ paths: ["/workspace/a.txt"],
219
+ truncated: false,
220
+ }),
221
+ );
222
+ return;
223
+ }
224
+ if (
225
+ req.method === "GET" &&
226
+ req.url === "/base/v1/fs/entries?path=%2Fworkspace"
227
+ ) {
228
+ res.writeHead(200, { "Content-Type": "application/json" });
229
+ res.end(
230
+ JSON.stringify([
231
+ {
232
+ entryType: "file",
233
+ name: "a.txt",
234
+ path: "/workspace/a.txt",
235
+ size: 2,
236
+ },
237
+ ]),
238
+ );
239
+ return;
240
+ }
241
+ if (
242
+ req.method === "GET" &&
243
+ req.url === "/base/v1/fs/stat?path=%2Fworkspace%2Fa.txt"
244
+ ) {
245
+ res.writeHead(200, { "Content-Type": "application/json" });
246
+ res.end(
247
+ JSON.stringify({
248
+ entryType: "file",
249
+ path: "/workspace/a.txt",
250
+ size: 2,
251
+ }),
252
+ );
253
+ return;
254
+ }
255
+ res.writeHead(404);
256
+ res.end();
257
+ },
258
+ async (baseUrl, requests) => {
259
+ await expect(
260
+ uploadBatch(baseUrl, "/workspace", new Uint8Array([1, 2, 3])),
261
+ ).resolves.toEqual({
262
+ paths: ["/workspace/a.txt"],
263
+ truncated: false,
264
+ });
265
+ await expect(listFiles(baseUrl, "/workspace")).resolves.toEqual([
266
+ {
267
+ entryType: "file",
268
+ name: "a.txt",
269
+ path: "/workspace/a.txt",
270
+ size: 2,
271
+ },
272
+ ]);
273
+ await expect(
274
+ statFile(baseUrl, "/workspace/a.txt"),
275
+ ).resolves.toEqual({
276
+ entryType: "file",
277
+ path: "/workspace/a.txt",
278
+ size: 2,
279
+ });
280
+
281
+ expect(requests.map((request) => request.url)).toEqual([
282
+ "/base/v1/fs/upload-batch?path=%2Fworkspace",
283
+ "/base/v1/fs/entries?path=%2Fworkspace",
284
+ "/base/v1/fs/stat?path=%2Fworkspace%2Fa.txt",
285
+ ]);
286
+ },
287
+ );
288
+ });
289
+
290
+ test("deleteFile, mkdirFs, and moveFile use the expected HTTP methods", async () => {
291
+ await withSandboxServer(
292
+ (_req, res) => {
293
+ res.writeHead(204);
294
+ res.end();
295
+ },
296
+ async (baseUrl, requests) => {
297
+ await deleteFile(baseUrl, "/workspace/a.txt");
298
+ await mkdirFs(baseUrl, "/workspace/output");
299
+ await moveFile(
300
+ baseUrl,
301
+ "/workspace/a.txt",
302
+ "/workspace/output/a.txt",
303
+ true,
304
+ );
305
+
306
+ expect(requests).toEqual([
307
+ {
308
+ method: "DELETE",
309
+ url: "/base/v1/fs/entry?path=%2Fworkspace%2Fa.txt",
310
+ body: "",
311
+ },
312
+ {
313
+ method: "POST",
314
+ url: "/base/v1/fs/mkdir?path=%2Fworkspace%2Foutput",
315
+ body: "",
316
+ },
317
+ {
318
+ method: "POST",
319
+ url: "/base/v1/fs/move",
320
+ body: JSON.stringify({
321
+ from: "/workspace/a.txt",
322
+ to: "/workspace/output/a.txt",
323
+ overwrite: true,
324
+ }),
325
+ },
326
+ ]);
327
+ },
328
+ );
329
+ });
330
+
331
+ test("filesystem helpers surface response bodies in errors", async () => {
332
+ setGlobalFetch(
333
+ vi
334
+ .fn<typeof fetch>()
335
+ .mockResolvedValue(new Response("boom", { status: 500 })),
336
+ );
337
+
338
+ await expect(
339
+ uploadFile("https://sandbox.example", "/broken.txt", "x"),
340
+ ).rejects.toThrow("Sandbox upload file failed (500): boom");
341
+ });
342
+
343
+ test("terminal helpers build URLs and manage websocket frames", async () => {
344
+ Object.defineProperty(globalThis, "WebSocket", {
345
+ configurable: true,
346
+ writable: true,
347
+ value: MockWebSocket,
348
+ });
349
+
350
+ expect(
351
+ buildTerminalWebSocketUrl(
352
+ "https://sandbox.example/base",
353
+ "proc 1",
354
+ ),
355
+ ).toBe(
356
+ "wss://sandbox.example/base/v1/processes/proc%201/terminal/ws",
357
+ );
358
+
359
+ const session = connectTerminal(
360
+ "https://sandbox.example/base",
361
+ "proc 1",
362
+ );
363
+ const socket = MockWebSocket.instances[0];
364
+ expect(socket?.url).toBe(
365
+ "wss://sandbox.example/base/v1/processes/proc%201/terminal/ws",
366
+ );
367
+
368
+ const outputs: Uint8Array[] = [];
369
+ const exits: Array<{ exitCode: number | null }> = [];
370
+ const errors: string[] = [];
371
+ let closed = false;
372
+ session.onData((data) => outputs.push(data));
373
+ session.onExit((status) => exits.push(status));
374
+ session.onError((error) => errors.push(error.message));
375
+ session.onClose(() => {
376
+ closed = true;
377
+ });
378
+
379
+ session.sendInput("ls\n");
380
+ session.sendInput(new Uint8Array([1, 2]));
381
+ session.resize(80, 24);
382
+
383
+ socket?.emit("message", {
384
+ data: new TextEncoder().encode("hello").buffer,
385
+ });
386
+ socket?.emit("message", {
387
+ data: JSON.stringify({ type: "exit", exitCode: 7 }),
388
+ });
389
+ socket?.emit("message", {
390
+ data: JSON.stringify({ type: "error", message: "bad terminal" }),
391
+ });
392
+
393
+ await vi.waitFor(() => {
394
+ expect(outputs).toHaveLength(1);
395
+ expect(exits).toEqual([{ exitCode: 7 }]);
396
+ expect(errors).toContain("bad terminal");
397
+ });
398
+
399
+ session.close();
400
+
401
+ expect(new TextDecoder().decode(outputs[0])).toBe("hello");
402
+ expect(closed).toBe(true);
403
+ expect(socket?.sent).toEqual([
404
+ JSON.stringify({ type: "input", data: "ls\n" }),
405
+ JSON.stringify({
406
+ type: "input",
407
+ data: "AQI=",
408
+ encoding: "base64",
409
+ }),
410
+ JSON.stringify({ type: "resize", cols: 80, rows: 24 }),
411
+ JSON.stringify({ type: "close" }),
412
+ ]);
413
+ });
414
+
415
+ test("followProcessLogs parses log SSE events and closes cleanly", async () => {
416
+ const entries: Array<{ stream: string; data: string }> = [];
417
+ const fetchMock = vi.fn<typeof fetch>().mockImplementation(
418
+ async (_input, init) => {
419
+ const stream = new ReadableStream<Uint8Array>({
420
+ start(controller) {
421
+ controller.enqueue(
422
+ new TextEncoder().encode(
423
+ [
424
+ "event: log",
425
+ 'data: {"stream":"stdout","data":"line 1","encoding":"utf-8","sequence":1,"timestampMs":1}',
426
+ "",
427
+ "event: ping",
428
+ "data: ignored",
429
+ "",
430
+ ].join("\n"),
431
+ ),
432
+ );
433
+ init?.signal?.addEventListener("abort", () => {
434
+ controller.error(
435
+ new DOMException("aborted", "AbortError"),
436
+ );
437
+ });
438
+ },
439
+ });
440
+ return new Response(stream, {
441
+ status: 200,
442
+ headers: {
443
+ "Content-Type": "text/event-stream",
444
+ },
445
+ });
446
+ },
447
+ );
448
+ setGlobalFetch(fetchMock);
449
+
450
+ const subscription = await followProcessLogs(
451
+ "https://sandbox.example/base",
452
+ "proc-1",
453
+ (entry) => {
454
+ entries.push({
455
+ stream: entry.stream,
456
+ data: entry.data,
457
+ });
458
+ },
459
+ { stream: "stdout", tail: 5, since: 10 },
460
+ );
461
+
462
+ await vi.waitFor(() => {
463
+ expect(entries).toEqual([
464
+ {
465
+ stream: "stdout",
466
+ data: "line 1",
467
+ },
468
+ ]);
469
+ });
470
+
471
+ subscription.close();
472
+ await subscription.closed;
473
+
474
+ expect(fetchMock).toHaveBeenCalledWith(
475
+ "https://sandbox.example/base/v1/processes/proc-1/logs?follow=true&stream=stdout&tail=5&since=10",
476
+ expect.objectContaining({
477
+ method: "GET",
478
+ headers: {
479
+ Accept: "text/event-stream",
480
+ },
481
+ }),
482
+ );
483
+ });
484
+ });