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,481 @@
1
+ // src/sandbox/client.ts
2
+ var API_PREFIX = "/v1";
3
+ async function uploadFile(sandboxUrl, path, data) {
4
+ const response = await fetchSandbox(
5
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/file`, { path }),
6
+ {
7
+ method: "PUT",
8
+ headers: {
9
+ "Content-Type": "application/octet-stream"
10
+ },
11
+ body: data
12
+ }
13
+ );
14
+ await assertOk(response, "upload file");
15
+ }
16
+ async function downloadFile(sandboxUrl, path) {
17
+ const response = await fetchSandbox(
18
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/file`, { path }),
19
+ {
20
+ method: "GET"
21
+ }
22
+ );
23
+ await assertOk(response, "download file");
24
+ return await response.arrayBuffer();
25
+ }
26
+ async function uploadBatch(sandboxUrl, destinationPath, tarData) {
27
+ const response = await fetchSandbox(
28
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/upload-batch`, {
29
+ path: destinationPath
30
+ }),
31
+ {
32
+ method: "POST",
33
+ headers: {
34
+ "Content-Type": "application/x-tar"
35
+ },
36
+ body: tarData
37
+ }
38
+ );
39
+ await assertOk(response, "upload batch");
40
+ return await response.json();
41
+ }
42
+ async function listFiles(sandboxUrl, path) {
43
+ const response = await fetchSandbox(
44
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/entries`, { path }),
45
+ {
46
+ method: "GET"
47
+ }
48
+ );
49
+ await assertOk(response, "list files");
50
+ return await response.json();
51
+ }
52
+ async function statFile(sandboxUrl, path) {
53
+ const response = await fetchSandbox(
54
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/stat`, { path }),
55
+ {
56
+ method: "GET"
57
+ }
58
+ );
59
+ await assertOk(response, "stat file");
60
+ return await response.json();
61
+ }
62
+ async function deleteFile(sandboxUrl, path) {
63
+ const response = await fetchSandbox(
64
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/entry`, { path }),
65
+ {
66
+ method: "DELETE"
67
+ }
68
+ );
69
+ await assertOk(response, "delete file");
70
+ }
71
+ async function mkdirFs(sandboxUrl, path) {
72
+ const response = await fetchSandbox(
73
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/mkdir`, { path }),
74
+ {
75
+ method: "POST"
76
+ }
77
+ );
78
+ await assertOk(response, "mkdir");
79
+ }
80
+ async function moveFile(sandboxUrl, from, to, overwrite = false) {
81
+ const response = await fetchSandbox(
82
+ buildUrl(sandboxUrl, `${API_PREFIX}/fs/move`),
83
+ {
84
+ method: "POST",
85
+ headers: {
86
+ "Content-Type": "application/json"
87
+ },
88
+ body: JSON.stringify({
89
+ from,
90
+ to,
91
+ overwrite
92
+ })
93
+ }
94
+ );
95
+ await assertOk(response, "move file");
96
+ }
97
+ function buildTerminalWebSocketUrl(sandboxUrl, processId) {
98
+ const url = new URL(
99
+ buildUrl(
100
+ sandboxUrl,
101
+ `${API_PREFIX}/processes/${encodeURIComponent(processId)}/terminal/ws`
102
+ )
103
+ );
104
+ if (url.protocol === "http:") {
105
+ url.protocol = "ws:";
106
+ } else if (url.protocol === "https:") {
107
+ url.protocol = "wss:";
108
+ }
109
+ return url.toString();
110
+ }
111
+ function connectTerminal(sandboxUrl, processId, options = {}) {
112
+ const WebSocketCtor = options.WebSocket ?? getWebSocketCtor();
113
+ const socket = new WebSocketCtor(
114
+ buildTerminalWebSocketUrl(sandboxUrl, processId),
115
+ options.protocols
116
+ );
117
+ socket.binaryType = "arraybuffer";
118
+ return new DirectTerminalSession(socket);
119
+ }
120
+ async function followProcessLogs(sandboxUrl, processId, listener, options = {}) {
121
+ const abortController = new AbortController();
122
+ const response = await fetchSandbox(
123
+ buildUrl(
124
+ sandboxUrl,
125
+ `${API_PREFIX}/processes/${encodeURIComponent(processId)}/logs`,
126
+ {
127
+ follow: true,
128
+ stream: options.stream,
129
+ tail: options.tail,
130
+ since: options.since
131
+ }
132
+ ),
133
+ {
134
+ method: "GET",
135
+ headers: {
136
+ Accept: "text/event-stream"
137
+ },
138
+ signal: abortController.signal
139
+ }
140
+ );
141
+ await assertOk(response, "follow process logs");
142
+ if (!response.body) {
143
+ abortController.abort();
144
+ throw new Error("SSE stream is not readable in this environment.");
145
+ }
146
+ const closed = consumeProcessLogSse(
147
+ response.body,
148
+ listener,
149
+ abortController.signal
150
+ );
151
+ return {
152
+ close: () => abortController.abort(),
153
+ closed
154
+ };
155
+ }
156
+ async function assertOk(response, operation) {
157
+ if (!response.ok) {
158
+ const body = await response.text().catch(() => "");
159
+ throw new Error(
160
+ `Sandbox ${operation} failed (${response.status}): ${body}`
161
+ );
162
+ }
163
+ }
164
+ var DirectTerminalSession = class {
165
+ socket;
166
+ dataListeners = /* @__PURE__ */ new Set();
167
+ exitListeners = /* @__PURE__ */ new Set();
168
+ errorListeners = /* @__PURE__ */ new Set();
169
+ closeListeners = /* @__PURE__ */ new Set();
170
+ closeSignalSent = false;
171
+ constructor(socket) {
172
+ this.socket = socket;
173
+ this.socket.addEventListener("message", (event) => {
174
+ void this.handleMessage(event.data);
175
+ });
176
+ this.socket.addEventListener("error", () => {
177
+ this.emitError(new Error("Terminal websocket connection failed."));
178
+ });
179
+ this.socket.addEventListener("close", () => {
180
+ for (const listener of this.closeListeners) {
181
+ listener();
182
+ }
183
+ });
184
+ }
185
+ onData(listener) {
186
+ this.dataListeners.add(listener);
187
+ return () => this.dataListeners.delete(listener);
188
+ }
189
+ onExit(listener) {
190
+ this.exitListeners.add(listener);
191
+ return () => this.exitListeners.delete(listener);
192
+ }
193
+ onError(listener) {
194
+ this.errorListeners.add(listener);
195
+ return () => this.errorListeners.delete(listener);
196
+ }
197
+ onClose(listener) {
198
+ this.closeListeners.add(listener);
199
+ return () => this.closeListeners.delete(listener);
200
+ }
201
+ sendInput(data) {
202
+ const payload = encodeTerminalInput(data);
203
+ this.sendFrame({
204
+ type: "input",
205
+ data: payload.data,
206
+ encoding: payload.encoding
207
+ });
208
+ }
209
+ resize(cols, rows) {
210
+ this.sendFrame({
211
+ type: "resize",
212
+ cols,
213
+ rows
214
+ });
215
+ }
216
+ close() {
217
+ if (this.socket.readyState === 0) {
218
+ this.socket.addEventListener(
219
+ "open",
220
+ () => {
221
+ this.close();
222
+ },
223
+ { once: true }
224
+ );
225
+ return;
226
+ }
227
+ if (this.socket.readyState === 1) {
228
+ if (!this.closeSignalSent) {
229
+ this.closeSignalSent = true;
230
+ this.sendFrame({ type: "close" });
231
+ }
232
+ this.socket.close();
233
+ return;
234
+ }
235
+ if (this.socket.readyState !== 3) {
236
+ this.socket.close();
237
+ }
238
+ }
239
+ async handleMessage(data) {
240
+ try {
241
+ if (typeof data === "string") {
242
+ const frame = parseTerminalServerFrame(data);
243
+ if (!frame) {
244
+ this.emitError(
245
+ new Error("Received invalid terminal control frame.")
246
+ );
247
+ return;
248
+ }
249
+ if (frame.type === "exit") {
250
+ for (const listener of this.exitListeners) {
251
+ listener({ exitCode: frame.exitCode ?? null });
252
+ }
253
+ return;
254
+ }
255
+ if (frame.type === "error") {
256
+ this.emitError(new Error(frame.message));
257
+ }
258
+ return;
259
+ }
260
+ const bytes = await decodeTerminalBytes(data);
261
+ if (!bytes) {
262
+ this.emitError(
263
+ new Error("Received unsupported terminal message payload.")
264
+ );
265
+ return;
266
+ }
267
+ for (const listener of this.dataListeners) {
268
+ listener(bytes);
269
+ }
270
+ } catch (error) {
271
+ this.emitError(
272
+ error instanceof Error ? error : new Error(String(error))
273
+ );
274
+ }
275
+ }
276
+ sendFrame(frame) {
277
+ if (this.socket.readyState !== 1) {
278
+ return;
279
+ }
280
+ this.socket.send(JSON.stringify(frame));
281
+ }
282
+ emitError(error) {
283
+ for (const listener of this.errorListeners) {
284
+ listener(error);
285
+ }
286
+ }
287
+ };
288
+ async function fetchSandbox(input, init) {
289
+ const requestInit = { ...init };
290
+ requestInit.body = init.body;
291
+ if (isReadableStream(init.body)) {
292
+ requestInit.duplex = "half";
293
+ }
294
+ return await getFetch()(input, requestInit);
295
+ }
296
+ function getFetch() {
297
+ if (!globalThis.fetch) {
298
+ throw new Error(
299
+ "Fetch API is not available; provide a global fetch implementation."
300
+ );
301
+ }
302
+ return globalThis.fetch.bind(globalThis);
303
+ }
304
+ function getWebSocketCtor() {
305
+ if (!globalThis.WebSocket) {
306
+ throw new Error(
307
+ "WebSocket API is not available; provide a WebSocket implementation."
308
+ );
309
+ }
310
+ return globalThis.WebSocket;
311
+ }
312
+ function buildUrl(sandboxUrl, pathname, query) {
313
+ const url = new URL(sandboxUrl);
314
+ const basePath = url.pathname.replace(/\/+$/, "");
315
+ const suffix = pathname.startsWith("/") ? pathname : `/${pathname}`;
316
+ url.pathname = `${basePath}${suffix}`.replace(/\/{2,}/g, "/");
317
+ if (query) {
318
+ for (const [key, value] of Object.entries(query)) {
319
+ if (value === void 0) {
320
+ continue;
321
+ }
322
+ url.searchParams.set(key, String(value));
323
+ }
324
+ }
325
+ return url.toString();
326
+ }
327
+ function parseTerminalServerFrame(payload) {
328
+ try {
329
+ const parsed = JSON.parse(payload);
330
+ if (typeof parsed.type !== "string") {
331
+ return null;
332
+ }
333
+ if (parsed.type === "ready" && typeof parsed.processId === "string") {
334
+ return {
335
+ type: "ready",
336
+ processId: parsed.processId
337
+ };
338
+ }
339
+ if (parsed.type === "exit" && (parsed.exitCode === void 0 || parsed.exitCode === null || typeof parsed.exitCode === "number")) {
340
+ return {
341
+ type: "exit",
342
+ exitCode: parsed.exitCode ?? null
343
+ };
344
+ }
345
+ if (parsed.type === "error" && typeof parsed.message === "string") {
346
+ return {
347
+ type: "error",
348
+ message: parsed.message
349
+ };
350
+ }
351
+ } catch {
352
+ return null;
353
+ }
354
+ return null;
355
+ }
356
+ function encodeTerminalInput(data) {
357
+ if (typeof data === "string") {
358
+ return { data };
359
+ }
360
+ return {
361
+ data: bytesToBase64(encodeTerminalBytes(data)),
362
+ encoding: "base64"
363
+ };
364
+ }
365
+ function encodeTerminalBytes(data) {
366
+ if (data instanceof ArrayBuffer) {
367
+ return new Uint8Array(data);
368
+ }
369
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice();
370
+ }
371
+ async function decodeTerminalBytes(data) {
372
+ if (data instanceof ArrayBuffer) {
373
+ return new Uint8Array(data);
374
+ }
375
+ if (ArrayBuffer.isView(data)) {
376
+ return new Uint8Array(
377
+ data.buffer,
378
+ data.byteOffset,
379
+ data.byteLength
380
+ ).slice();
381
+ }
382
+ if (typeof Blob !== "undefined" && data instanceof Blob) {
383
+ return new Uint8Array(await data.arrayBuffer());
384
+ }
385
+ return null;
386
+ }
387
+ function bytesToBase64(bytes) {
388
+ const bufferCtor = globalThis.Buffer;
389
+ if (bufferCtor) {
390
+ return bufferCtor.from(bytes).toString("base64");
391
+ }
392
+ let binary = "";
393
+ const chunkSize = 32768;
394
+ for (let index = 0; index < bytes.length; index += chunkSize) {
395
+ const chunk = bytes.subarray(index, index + chunkSize);
396
+ binary += String.fromCharCode(...chunk);
397
+ }
398
+ if (typeof btoa !== "function") {
399
+ throw new Error("No base64 encoder is available in this environment.");
400
+ }
401
+ return btoa(binary);
402
+ }
403
+ async function consumeProcessLogSse(body, listener, signal) {
404
+ const reader = body.getReader();
405
+ const decoder = new TextDecoder();
406
+ let buffer = "";
407
+ try {
408
+ while (!signal.aborted) {
409
+ const { done, value } = await reader.read();
410
+ if (done) {
411
+ return;
412
+ }
413
+ buffer += decoder.decode(value, { stream: true }).replace(/\r\n/g, "\n");
414
+ let separatorIndex = buffer.indexOf("\n\n");
415
+ while (separatorIndex !== -1) {
416
+ const chunk = buffer.slice(0, separatorIndex);
417
+ buffer = buffer.slice(separatorIndex + 2);
418
+ const entry = parseProcessLogSseChunk(chunk);
419
+ if (entry) {
420
+ listener(entry);
421
+ }
422
+ separatorIndex = buffer.indexOf("\n\n");
423
+ }
424
+ }
425
+ } catch (error) {
426
+ if (signal.aborted || isAbortError(error)) {
427
+ return;
428
+ }
429
+ throw error;
430
+ } finally {
431
+ reader.releaseLock();
432
+ }
433
+ }
434
+ function parseProcessLogSseChunk(chunk) {
435
+ if (!chunk.trim()) {
436
+ return null;
437
+ }
438
+ let eventName = "message";
439
+ const dataLines = [];
440
+ for (const line of chunk.split("\n")) {
441
+ if (!line || line.startsWith(":")) {
442
+ continue;
443
+ }
444
+ if (line.startsWith("event:")) {
445
+ eventName = line.slice(6).trim();
446
+ continue;
447
+ }
448
+ if (line.startsWith("data:")) {
449
+ dataLines.push(line.slice(5).trimStart());
450
+ }
451
+ }
452
+ if (eventName !== "log") {
453
+ return null;
454
+ }
455
+ const data = dataLines.join("\n");
456
+ if (!data.trim()) {
457
+ return null;
458
+ }
459
+ return JSON.parse(data);
460
+ }
461
+ function isAbortError(error) {
462
+ return error instanceof Error && error.name === "AbortError";
463
+ }
464
+ function isReadableStream(value) {
465
+ return typeof ReadableStream !== "undefined" && value instanceof ReadableStream;
466
+ }
467
+
468
+ export {
469
+ uploadFile,
470
+ downloadFile,
471
+ uploadBatch,
472
+ listFiles,
473
+ statFile,
474
+ deleteFile,
475
+ mkdirFs,
476
+ moveFile,
477
+ buildTerminalWebSocketUrl,
478
+ connectTerminal,
479
+ followProcessLogs
480
+ };
481
+ //# sourceMappingURL=chunk-JRKPV5NJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/sandbox/client.ts"],"sourcesContent":["/**\n * Client-side helpers for direct operations against a sandbox-agent server.\n *\n * The sandbox actor proxies all sandbox-agent SDK methods as Rivet Actor\n * actions, which use JSON-based RPC serialization. This works well for\n * structured data (sessions, processes, MCP config), but three categories of\n * operations do not fit through JSON actions:\n *\n * 1. Binary filesystem I/O (readFsFile, writeFsFile, uploadFsBatch): raw\n * binary payloads would require base64 encoding with ~33% size overhead.\n * 2. WebSocket terminals (connectProcessTerminal,\n * connectProcessTerminalWebSocket): bidirectional binary streams cannot be\n * serialized through request-response JSON.\n * 3. SSE log streaming (followProcessLogs): continuous event streams with\n * callbacks cannot be proxied through one-shot JSON actions.\n *\n * These helpers let the client talk directly to the sandbox-agent HTTP API,\n * bypassing the actor's JSON action layer. The sandbox URL is obtained via\n * the actor's `getSandboxUrl` action. Sandbox providers already secure the\n * connection between client and sandbox, so no additional authentication is\n * needed on these direct endpoints.\n */\n\nconst API_PREFIX = \"/v1\";\n\ntype FetchBody =\n\t| Blob\n\t| ArrayBuffer\n\t| Uint8Array\n\t| ReadableStream\n\t| string;\n\ntype TerminalInput = string | ArrayBuffer | ArrayBufferView;\ntype WebSocketConstructor = typeof WebSocket;\ntype ProcessLogStream = \"stdout\" | \"stderr\" | \"combined\" | \"pty\";\n\nexport interface FsEntry {\n\tentryType: \"file\" | \"directory\";\n\tmodified?: string | null;\n\tname: string;\n\tpath: string;\n\tsize: number;\n}\n\nexport interface FsStat {\n\tentryType: \"file\" | \"directory\";\n\tmodified?: string | null;\n\tpath: string;\n\tsize: number;\n}\n\nexport interface UploadBatchResponse {\n\tpaths: string[];\n\ttruncated: boolean;\n}\n\nexport interface ProcessLogEntry {\n\tdata: string;\n\tencoding: string;\n\tsequence: number;\n\tstream: ProcessLogStream;\n\ttimestampMs: number;\n}\n\nexport interface FollowProcessLogsOptions {\n\tstream?: ProcessLogStream;\n\ttail?: number;\n\tsince?: number;\n}\n\nexport interface TerminalExitStatus {\n\texitCode: number | null;\n}\n\nexport interface TerminalConnectOptions {\n\tprotocols?: string | string[];\n\tWebSocket?: WebSocketConstructor;\n}\n\nexport interface TerminalSession {\n\tonData(listener: (data: Uint8Array) => void): () => void;\n\tonExit(listener: (status: TerminalExitStatus) => void): () => void;\n\tonError(listener: (error: Error) => void): () => void;\n\tonClose(listener: () => void): () => void;\n\tsendInput(data: TerminalInput): void;\n\tresize(cols: number, rows: number): void;\n\tclose(): void;\n\tsocket: WebSocket;\n}\n\nexport async function uploadFile(\n\tsandboxUrl: string,\n\tpath: string,\n\tdata: FetchBody,\n): Promise<void> {\n\tconst response = await fetchSandbox(\n\t\tbuildUrl(sandboxUrl, `${API_PREFIX}/fs/file`, { path }),\n\t\t{\n\t\t\tmethod: \"PUT\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/octet-stream\",\n\t\t\t},\n\t\t\tbody: data,\n\t\t},\n\t);\n\tawait assertOk(response, \"upload file\");\n}\n\nexport async function downloadFile(\n\tsandboxUrl: string,\n\tpath: string,\n): Promise<ArrayBuffer> {\n\tconst response = await fetchSandbox(\n\t\tbuildUrl(sandboxUrl, `${API_PREFIX}/fs/file`, { path }),\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t},\n\t);\n\tawait assertOk(response, \"download file\");\n\treturn await response.arrayBuffer();\n}\n\nexport async function uploadBatch(\n\tsandboxUrl: string,\n\tdestinationPath: string,\n\ttarData: Blob | ArrayBuffer | Uint8Array,\n): Promise<UploadBatchResponse> {\n\tconst response = await fetchSandbox(\n\t\tbuildUrl(sandboxUrl, `${API_PREFIX}/fs/upload-batch`, {\n\t\t\tpath: destinationPath,\n\t\t}),\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/x-tar\",\n\t\t\t},\n\t\t\tbody: tarData,\n\t\t},\n\t);\n\tawait assertOk(response, \"upload batch\");\n\treturn (await response.json()) as UploadBatchResponse;\n}\n\nexport async function listFiles(\n\tsandboxUrl: string,\n\tpath: string,\n): Promise<FsEntry[]> {\n\tconst response = await fetchSandbox(\n\t\tbuildUrl(sandboxUrl, `${API_PREFIX}/fs/entries`, { path }),\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t},\n\t);\n\tawait assertOk(response, \"list files\");\n\treturn (await response.json()) as FsEntry[];\n}\n\nexport async function statFile(\n\tsandboxUrl: string,\n\tpath: string,\n): Promise<FsStat> {\n\tconst response = await fetchSandbox(\n\t\tbuildUrl(sandboxUrl, `${API_PREFIX}/fs/stat`, { path }),\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t},\n\t);\n\tawait assertOk(response, \"stat file\");\n\treturn (await response.json()) as FsStat;\n}\n\nexport async function deleteFile(\n\tsandboxUrl: string,\n\tpath: string,\n): Promise<void> {\n\tconst response = await fetchSandbox(\n\t\tbuildUrl(sandboxUrl, `${API_PREFIX}/fs/entry`, { path }),\n\t\t{\n\t\t\tmethod: \"DELETE\",\n\t\t},\n\t);\n\tawait assertOk(response, \"delete file\");\n}\n\nexport async function mkdirFs(\n\tsandboxUrl: string,\n\tpath: string,\n): Promise<void> {\n\tconst response = await fetchSandbox(\n\t\tbuildUrl(sandboxUrl, `${API_PREFIX}/fs/mkdir`, { path }),\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t},\n\t);\n\tawait assertOk(response, \"mkdir\");\n}\n\nexport async function moveFile(\n\tsandboxUrl: string,\n\tfrom: string,\n\tto: string,\n\toverwrite = false,\n): Promise<void> {\n\tconst response = await fetchSandbox(\n\t\tbuildUrl(sandboxUrl, `${API_PREFIX}/fs/move`),\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tfrom,\n\t\t\t\tto,\n\t\t\t\toverwrite,\n\t\t\t}),\n\t\t},\n\t);\n\tawait assertOk(response, \"move file\");\n}\n\nexport function buildTerminalWebSocketUrl(\n\tsandboxUrl: string,\n\tprocessId: string,\n): string {\n\tconst url = new URL(\n\t\tbuildUrl(\n\t\t\tsandboxUrl,\n\t\t\t`${API_PREFIX}/processes/${encodeURIComponent(processId)}/terminal/ws`,\n\t\t),\n\t);\n\tif (url.protocol === \"http:\") {\n\t\turl.protocol = \"ws:\";\n\t} else if (url.protocol === \"https:\") {\n\t\turl.protocol = \"wss:\";\n\t}\n\treturn url.toString();\n}\n\nexport function connectTerminal(\n\tsandboxUrl: string,\n\tprocessId: string,\n\toptions: TerminalConnectOptions = {},\n): TerminalSession {\n\tconst WebSocketCtor = options.WebSocket ?? getWebSocketCtor();\n\tconst socket = new WebSocketCtor(\n\t\tbuildTerminalWebSocketUrl(sandboxUrl, processId),\n\t\toptions.protocols,\n\t);\n\tsocket.binaryType = \"arraybuffer\";\n\treturn new DirectTerminalSession(socket);\n}\n\nexport async function followProcessLogs(\n\tsandboxUrl: string,\n\tprocessId: string,\n\tlistener: (entry: ProcessLogEntry) => void,\n\toptions: FollowProcessLogsOptions = {},\n): Promise<{ close: () => void; closed: Promise<void> }> {\n\tconst abortController = new AbortController();\n\tconst response = await fetchSandbox(\n\t\tbuildUrl(\n\t\t\tsandboxUrl,\n\t\t\t`${API_PREFIX}/processes/${encodeURIComponent(processId)}/logs`,\n\t\t\t{\n\t\t\t\tfollow: true,\n\t\t\t\tstream: options.stream,\n\t\t\t\ttail: options.tail,\n\t\t\t\tsince: options.since,\n\t\t\t},\n\t\t),\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\theaders: {\n\t\t\t\tAccept: \"text/event-stream\",\n\t\t\t},\n\t\t\tsignal: abortController.signal,\n\t\t},\n\t);\n\tawait assertOk(response, \"follow process logs\");\n\tif (!response.body) {\n\t\tabortController.abort();\n\t\tthrow new Error(\"SSE stream is not readable in this environment.\");\n\t}\n\n\tconst closed = consumeProcessLogSse(\n\t\tresponse.body,\n\t\tlistener,\n\t\tabortController.signal,\n\t);\n\treturn {\n\t\tclose: () => abortController.abort(),\n\t\tclosed,\n\t};\n}\n\nasync function assertOk(response: Response, operation: string): Promise<void> {\n\tif (!response.ok) {\n\t\tconst body = await response.text().catch(() => \"\");\n\t\tthrow new Error(\n\t\t\t`Sandbox ${operation} failed (${response.status}): ${body}`,\n\t\t);\n\t}\n}\n\nclass DirectTerminalSession implements TerminalSession {\n\treadonly socket: WebSocket;\n\n\tprivate readonly dataListeners = new Set<(data: Uint8Array) => void>();\n\tprivate readonly exitListeners = new Set<\n\t\t(status: TerminalExitStatus) => void\n\t>();\n\tprivate readonly errorListeners = new Set<(error: Error) => void>();\n\tprivate readonly closeListeners = new Set<() => void>();\n\tprivate closeSignalSent = false;\n\n\tconstructor(socket: WebSocket) {\n\t\tthis.socket = socket;\n\t\tthis.socket.addEventListener(\"message\", (event) => {\n\t\t\tvoid this.handleMessage(event.data);\n\t\t});\n\t\tthis.socket.addEventListener(\"error\", () => {\n\t\t\tthis.emitError(new Error(\"Terminal websocket connection failed.\"));\n\t\t});\n\t\tthis.socket.addEventListener(\"close\", () => {\n\t\t\tfor (const listener of this.closeListeners) {\n\t\t\t\tlistener();\n\t\t\t}\n\t\t});\n\t}\n\n\tonData(listener: (data: Uint8Array) => void): () => void {\n\t\tthis.dataListeners.add(listener);\n\t\treturn () => this.dataListeners.delete(listener);\n\t}\n\n\tonExit(listener: (status: TerminalExitStatus) => void): () => void {\n\t\tthis.exitListeners.add(listener);\n\t\treturn () => this.exitListeners.delete(listener);\n\t}\n\n\tonError(listener: (error: Error) => void): () => void {\n\t\tthis.errorListeners.add(listener);\n\t\treturn () => this.errorListeners.delete(listener);\n\t}\n\n\tonClose(listener: () => void): () => void {\n\t\tthis.closeListeners.add(listener);\n\t\treturn () => this.closeListeners.delete(listener);\n\t}\n\n\tsendInput(data: TerminalInput): void {\n\t\tconst payload = encodeTerminalInput(data);\n\t\tthis.sendFrame({\n\t\t\ttype: \"input\",\n\t\t\tdata: payload.data,\n\t\t\tencoding: payload.encoding,\n\t\t});\n\t}\n\n\tresize(cols: number, rows: number): void {\n\t\tthis.sendFrame({\n\t\t\ttype: \"resize\",\n\t\t\tcols,\n\t\t\trows,\n\t\t});\n\t}\n\n\tclose(): void {\n\t\tif (this.socket.readyState === 0) {\n\t\t\tthis.socket.addEventListener(\n\t\t\t\t\"open\",\n\t\t\t\t() => {\n\t\t\t\t\tthis.close();\n\t\t\t\t},\n\t\t\t\t{ once: true },\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.socket.readyState === 1) {\n\t\t\tif (!this.closeSignalSent) {\n\t\t\t\tthis.closeSignalSent = true;\n\t\t\t\tthis.sendFrame({ type: \"close\" });\n\t\t\t}\n\t\t\tthis.socket.close();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.socket.readyState !== 3) {\n\t\t\tthis.socket.close();\n\t\t}\n\t}\n\n\tprivate async handleMessage(data: unknown): Promise<void> {\n\t\ttry {\n\t\t\tif (typeof data === \"string\") {\n\t\t\t\tconst frame = parseTerminalServerFrame(data);\n\t\t\t\tif (!frame) {\n\t\t\t\t\tthis.emitError(\n\t\t\t\t\t\tnew Error(\"Received invalid terminal control frame.\"),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (frame.type === \"exit\") {\n\t\t\t\t\tfor (const listener of this.exitListeners) {\n\t\t\t\t\t\tlistener({ exitCode: frame.exitCode ?? null });\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (frame.type === \"error\") {\n\t\t\t\t\tthis.emitError(new Error(frame.message));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst bytes = await decodeTerminalBytes(data);\n\t\t\tif (!bytes) {\n\t\t\t\tthis.emitError(\n\t\t\t\t\tnew Error(\"Received unsupported terminal message payload.\"),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (const listener of this.dataListeners) {\n\t\t\t\tlistener(bytes);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.emitError(\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate sendFrame(frame: {\n\t\ttype: \"input\";\n\t\tdata: string;\n\t\tencoding?: string;\n\t} | {\n\t\ttype: \"resize\";\n\t\tcols: number;\n\t\trows: number;\n\t} | {\n\t\ttype: \"close\";\n\t}): void {\n\t\tif (this.socket.readyState !== 1) {\n\t\t\treturn;\n\t\t}\n\t\tthis.socket.send(JSON.stringify(frame));\n\t}\n\n\tprivate emitError(error: Error): void {\n\t\tfor (const listener of this.errorListeners) {\n\t\t\tlistener(error);\n\t\t}\n\t}\n}\n\nasync function fetchSandbox(\n\tinput: string,\n\tinit: RequestInit & { body?: FetchBody },\n): Promise<Response> {\n\tconst requestInit = { ...init } as RequestInit & {\n\t\tbody?: unknown;\n\t\tduplex?: \"half\";\n\t};\n\trequestInit.body = init.body;\n\tif (isReadableStream(init.body)) {\n\t\trequestInit.duplex = \"half\";\n\t}\n\treturn await getFetch()(input, requestInit);\n}\n\nfunction getFetch(): typeof fetch {\n\tif (!globalThis.fetch) {\n\t\tthrow new Error(\n\t\t\t\"Fetch API is not available; provide a global fetch implementation.\",\n\t\t);\n\t}\n\treturn globalThis.fetch.bind(globalThis);\n}\n\nfunction getWebSocketCtor(): WebSocketConstructor {\n\tif (!globalThis.WebSocket) {\n\t\tthrow new Error(\n\t\t\t\"WebSocket API is not available; provide a WebSocket implementation.\",\n\t\t);\n\t}\n\treturn globalThis.WebSocket;\n}\n\nfunction buildUrl(\n\tsandboxUrl: string,\n\tpathname: string,\n\tquery?: Record<string, string | number | boolean | undefined>,\n): string {\n\tconst url = new URL(sandboxUrl);\n\tconst basePath = url.pathname.replace(/\\/+$/, \"\");\n\tconst suffix = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n\turl.pathname = `${basePath}${suffix}`.replace(/\\/{2,}/g, \"/\");\n\tif (query) {\n\t\tfor (const [key, value] of Object.entries(query)) {\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\turl.searchParams.set(key, String(value));\n\t\t}\n\t}\n\treturn url.toString();\n}\n\nfunction parseTerminalServerFrame(payload: string):\n\t| {\n\t\t\ttype: \"ready\";\n\t\t\tprocessId: string;\n\t }\n\t| {\n\t\t\ttype: \"exit\";\n\t\t\texitCode?: number | null;\n\t }\n\t| {\n\t\t\ttype: \"error\";\n\t\t\tmessage: string;\n\t }\n\t| null {\n\ttry {\n\t\tconst parsed = JSON.parse(payload) as Record<string, unknown>;\n\t\tif (typeof parsed.type !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\t\tif (\n\t\t\tparsed.type === \"ready\" &&\n\t\t\ttypeof parsed.processId === \"string\"\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttype: \"ready\",\n\t\t\t\tprocessId: parsed.processId,\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\tparsed.type === \"exit\" &&\n\t\t\t(parsed.exitCode === undefined ||\n\t\t\t\tparsed.exitCode === null ||\n\t\t\t\ttypeof parsed.exitCode === \"number\")\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttype: \"exit\",\n\t\t\t\texitCode: (parsed.exitCode as number | null | undefined) ?? null,\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\tparsed.type === \"error\" &&\n\t\t\ttypeof parsed.message === \"string\"\n\t\t) {\n\t\t\treturn {\n\t\t\t\ttype: \"error\",\n\t\t\t\tmessage: parsed.message,\n\t\t\t};\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n\treturn null;\n}\n\nfunction encodeTerminalInput(data: TerminalInput): {\n\tdata: string;\n\tencoding?: string;\n} {\n\tif (typeof data === \"string\") {\n\t\treturn { data };\n\t}\n\treturn {\n\t\tdata: bytesToBase64(encodeTerminalBytes(data)),\n\t\tencoding: \"base64\",\n\t};\n}\n\nfunction encodeTerminalBytes(data: ArrayBuffer | ArrayBufferView): Uint8Array {\n\tif (data instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(data);\n\t}\n\treturn new Uint8Array(data.buffer, data.byteOffset, data.byteLength).slice();\n}\n\nasync function decodeTerminalBytes(data: unknown): Promise<Uint8Array | null> {\n\tif (data instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(data);\n\t}\n\tif (ArrayBuffer.isView(data)) {\n\t\treturn new Uint8Array(\n\t\t\tdata.buffer,\n\t\t\tdata.byteOffset,\n\t\t\tdata.byteLength,\n\t\t).slice();\n\t}\n\tif (typeof Blob !== \"undefined\" && data instanceof Blob) {\n\t\treturn new Uint8Array(await data.arrayBuffer());\n\t}\n\treturn null;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n\tconst bufferCtor = (\n\t\tglobalThis as typeof globalThis & {\n\t\t\tBuffer?: {\n\t\t\t\tfrom(data: Uint8Array): { toString(encoding: \"base64\"): string };\n\t\t\t};\n\t\t}\n\t).Buffer;\n\tif (bufferCtor) {\n\t\treturn bufferCtor.from(bytes).toString(\"base64\");\n\t}\n\n\tlet binary = \"\";\n\tconst chunkSize = 0x8000;\n\tfor (let index = 0; index < bytes.length; index += chunkSize) {\n\t\tconst chunk = bytes.subarray(index, index + chunkSize);\n\t\tbinary += String.fromCharCode(...chunk);\n\t}\n\tif (typeof btoa !== \"function\") {\n\t\tthrow new Error(\"No base64 encoder is available in this environment.\");\n\t}\n\treturn btoa(binary);\n}\n\nasync function consumeProcessLogSse(\n\tbody: ReadableStream<Uint8Array>,\n\tlistener: (entry: ProcessLogEntry) => void,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tconst reader = body.getReader();\n\tconst decoder = new TextDecoder();\n\tlet buffer = \"\";\n\ttry {\n\t\twhile (!signal.aborted) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tbuffer += decoder\n\t\t\t\t.decode(value, { stream: true })\n\t\t\t\t.replace(/\\r\\n/g, \"\\n\");\n\t\t\tlet separatorIndex = buffer.indexOf(\"\\n\\n\");\n\t\t\twhile (separatorIndex !== -1) {\n\t\t\t\tconst chunk = buffer.slice(0, separatorIndex);\n\t\t\t\tbuffer = buffer.slice(separatorIndex + 2);\n\t\t\t\tconst entry = parseProcessLogSseChunk(chunk);\n\t\t\t\tif (entry) {\n\t\t\t\t\tlistener(entry);\n\t\t\t\t}\n\t\t\t\tseparatorIndex = buffer.indexOf(\"\\n\\n\");\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tif (signal.aborted || isAbortError(error)) {\n\t\t\treturn;\n\t\t}\n\t\tthrow error;\n\t} finally {\n\t\treader.releaseLock();\n\t}\n}\n\nfunction parseProcessLogSseChunk(chunk: string): ProcessLogEntry | null {\n\tif (!chunk.trim()) {\n\t\treturn null;\n\t}\n\n\tlet eventName = \"message\";\n\tconst dataLines: string[] = [];\n\tfor (const line of chunk.split(\"\\n\")) {\n\t\tif (!line || line.startsWith(\":\")) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"event:\")) {\n\t\t\teventName = line.slice(6).trim();\n\t\t\tcontinue;\n\t\t}\n\t\tif (line.startsWith(\"data:\")) {\n\t\t\tdataLines.push(line.slice(5).trimStart());\n\t\t}\n\t}\n\n\tif (eventName !== \"log\") {\n\t\treturn null;\n\t}\n\n\tconst data = dataLines.join(\"\\n\");\n\tif (!data.trim()) {\n\t\treturn null;\n\t}\n\n\treturn JSON.parse(data) as ProcessLogEntry;\n}\n\nfunction isAbortError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n\nfunction isReadableStream(value: unknown): value is ReadableStream {\n\treturn (\n\t\ttypeof ReadableStream !== \"undefined\" &&\n\t\tvalue instanceof ReadableStream\n\t);\n}\n"],"mappings":";AAuBA,IAAM,aAAa;AAmEnB,eAAsB,WACrB,YACA,MACA,MACgB;AAChB,QAAM,WAAW,MAAM;AAAA,IACtB,SAAS,YAAY,GAAG,UAAU,YAAY,EAAE,KAAK,CAAC;AAAA,IACtD;AAAA,MACC,QAAQ;AAAA,MACR,SAAS;AAAA,QACR,gBAAgB;AAAA,MACjB;AAAA,MACA,MAAM;AAAA,IACP;AAAA,EACD;AACA,QAAM,SAAS,UAAU,aAAa;AACvC;AAEA,eAAsB,aACrB,YACA,MACuB;AACvB,QAAM,WAAW,MAAM;AAAA,IACtB,SAAS,YAAY,GAAG,UAAU,YAAY,EAAE,KAAK,CAAC;AAAA,IACtD;AAAA,MACC,QAAQ;AAAA,IACT;AAAA,EACD;AACA,QAAM,SAAS,UAAU,eAAe;AACxC,SAAO,MAAM,SAAS,YAAY;AACnC;AAEA,eAAsB,YACrB,YACA,iBACA,SAC+B;AAC/B,QAAM,WAAW,MAAM;AAAA,IACtB,SAAS,YAAY,GAAG,UAAU,oBAAoB;AAAA,MACrD,MAAM;AAAA,IACP,CAAC;AAAA,IACD;AAAA,MACC,QAAQ;AAAA,MACR,SAAS;AAAA,QACR,gBAAgB;AAAA,MACjB;AAAA,MACA,MAAM;AAAA,IACP;AAAA,EACD;AACA,QAAM,SAAS,UAAU,cAAc;AACvC,SAAQ,MAAM,SAAS,KAAK;AAC7B;AAEA,eAAsB,UACrB,YACA,MACqB;AACrB,QAAM,WAAW,MAAM;AAAA,IACtB,SAAS,YAAY,GAAG,UAAU,eAAe,EAAE,KAAK,CAAC;AAAA,IACzD;AAAA,MACC,QAAQ;AAAA,IACT;AAAA,EACD;AACA,QAAM,SAAS,UAAU,YAAY;AACrC,SAAQ,MAAM,SAAS,KAAK;AAC7B;AAEA,eAAsB,SACrB,YACA,MACkB;AAClB,QAAM,WAAW,MAAM;AAAA,IACtB,SAAS,YAAY,GAAG,UAAU,YAAY,EAAE,KAAK,CAAC;AAAA,IACtD;AAAA,MACC,QAAQ;AAAA,IACT;AAAA,EACD;AACA,QAAM,SAAS,UAAU,WAAW;AACpC,SAAQ,MAAM,SAAS,KAAK;AAC7B;AAEA,eAAsB,WACrB,YACA,MACgB;AAChB,QAAM,WAAW,MAAM;AAAA,IACtB,SAAS,YAAY,GAAG,UAAU,aAAa,EAAE,KAAK,CAAC;AAAA,IACvD;AAAA,MACC,QAAQ;AAAA,IACT;AAAA,EACD;AACA,QAAM,SAAS,UAAU,aAAa;AACvC;AAEA,eAAsB,QACrB,YACA,MACgB;AAChB,QAAM,WAAW,MAAM;AAAA,IACtB,SAAS,YAAY,GAAG,UAAU,aAAa,EAAE,KAAK,CAAC;AAAA,IACvD;AAAA,MACC,QAAQ;AAAA,IACT;AAAA,EACD;AACA,QAAM,SAAS,UAAU,OAAO;AACjC;AAEA,eAAsB,SACrB,YACA,MACA,IACA,YAAY,OACI;AAChB,QAAM,WAAW,MAAM;AAAA,IACtB,SAAS,YAAY,GAAG,UAAU,UAAU;AAAA,IAC5C;AAAA,MACC,QAAQ;AAAA,MACR,SAAS;AAAA,QACR,gBAAgB;AAAA,MACjB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AACA,QAAM,SAAS,UAAU,WAAW;AACrC;AAEO,SAAS,0BACf,YACA,WACS;AACT,QAAM,MAAM,IAAI;AAAA,IACf;AAAA,MACC;AAAA,MACA,GAAG,UAAU,cAAc,mBAAmB,SAAS,CAAC;AAAA,IACzD;AAAA,EACD;AACA,MAAI,IAAI,aAAa,SAAS;AAC7B,QAAI,WAAW;AAAA,EAChB,WAAW,IAAI,aAAa,UAAU;AACrC,QAAI,WAAW;AAAA,EAChB;AACA,SAAO,IAAI,SAAS;AACrB;AAEO,SAAS,gBACf,YACA,WACA,UAAkC,CAAC,GACjB;AAClB,QAAM,gBAAgB,QAAQ,aAAa,iBAAiB;AAC5D,QAAM,SAAS,IAAI;AAAA,IAClB,0BAA0B,YAAY,SAAS;AAAA,IAC/C,QAAQ;AAAA,EACT;AACA,SAAO,aAAa;AACpB,SAAO,IAAI,sBAAsB,MAAM;AACxC;AAEA,eAAsB,kBACrB,YACA,WACA,UACA,UAAoC,CAAC,GACmB;AACxD,QAAM,kBAAkB,IAAI,gBAAgB;AAC5C,QAAM,WAAW,MAAM;AAAA,IACtB;AAAA,MACC;AAAA,MACA,GAAG,UAAU,cAAc,mBAAmB,SAAS,CAAC;AAAA,MACxD;AAAA,QACC,QAAQ;AAAA,QACR,QAAQ,QAAQ;AAAA,QAChB,MAAM,QAAQ;AAAA,QACd,OAAO,QAAQ;AAAA,MAChB;AAAA,IACD;AAAA,IACA;AAAA,MACC,QAAQ;AAAA,MACR,SAAS;AAAA,QACR,QAAQ;AAAA,MACT;AAAA,MACA,QAAQ,gBAAgB;AAAA,IACzB;AAAA,EACD;AACA,QAAM,SAAS,UAAU,qBAAqB;AAC9C,MAAI,CAAC,SAAS,MAAM;AACnB,oBAAgB,MAAM;AACtB,UAAM,IAAI,MAAM,iDAAiD;AAAA,EAClE;AAEA,QAAM,SAAS;AAAA,IACd,SAAS;AAAA,IACT;AAAA,IACA,gBAAgB;AAAA,EACjB;AACA,SAAO;AAAA,IACN,OAAO,MAAM,gBAAgB,MAAM;AAAA,IACnC;AAAA,EACD;AACD;AAEA,eAAe,SAAS,UAAoB,WAAkC;AAC7E,MAAI,CAAC,SAAS,IAAI;AACjB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,UAAM,IAAI;AAAA,MACT,WAAW,SAAS,YAAY,SAAS,MAAM,MAAM,IAAI;AAAA,IAC1D;AAAA,EACD;AACD;AAEA,IAAM,wBAAN,MAAuD;AAAA,EAC7C;AAAA,EAEQ,gBAAgB,oBAAI,IAAgC;AAAA,EACpD,gBAAgB,oBAAI,IAEnC;AAAA,EACe,iBAAiB,oBAAI,IAA4B;AAAA,EACjD,iBAAiB,oBAAI,IAAgB;AAAA,EAC9C,kBAAkB;AAAA,EAE1B,YAAY,QAAmB;AAC9B,SAAK,SAAS;AACd,SAAK,OAAO,iBAAiB,WAAW,CAAC,UAAU;AAClD,WAAK,KAAK,cAAc,MAAM,IAAI;AAAA,IACnC,CAAC;AACD,SAAK,OAAO,iBAAiB,SAAS,MAAM;AAC3C,WAAK,UAAU,IAAI,MAAM,uCAAuC,CAAC;AAAA,IAClE,CAAC;AACD,SAAK,OAAO,iBAAiB,SAAS,MAAM;AAC3C,iBAAW,YAAY,KAAK,gBAAgB;AAC3C,iBAAS;AAAA,MACV;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,OAAO,UAAkD;AACxD,SAAK,cAAc,IAAI,QAAQ;AAC/B,WAAO,MAAM,KAAK,cAAc,OAAO,QAAQ;AAAA,EAChD;AAAA,EAEA,OAAO,UAA4D;AAClE,SAAK,cAAc,IAAI,QAAQ;AAC/B,WAAO,MAAM,KAAK,cAAc,OAAO,QAAQ;AAAA,EAChD;AAAA,EAEA,QAAQ,UAA8C;AACrD,SAAK,eAAe,IAAI,QAAQ;AAChC,WAAO,MAAM,KAAK,eAAe,OAAO,QAAQ;AAAA,EACjD;AAAA,EAEA,QAAQ,UAAkC;AACzC,SAAK,eAAe,IAAI,QAAQ;AAChC,WAAO,MAAM,KAAK,eAAe,OAAO,QAAQ;AAAA,EACjD;AAAA,EAEA,UAAU,MAA2B;AACpC,UAAM,UAAU,oBAAoB,IAAI;AACxC,SAAK,UAAU;AAAA,MACd,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,OAAO,MAAc,MAAoB;AACxC,SAAK,UAAU;AAAA,MACd,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,QAAc;AACb,QAAI,KAAK,OAAO,eAAe,GAAG;AACjC,WAAK,OAAO;AAAA,QACX;AAAA,QACA,MAAM;AACL,eAAK,MAAM;AAAA,QACZ;AAAA,QACA,EAAE,MAAM,KAAK;AAAA,MACd;AACA;AAAA,IACD;AAEA,QAAI,KAAK,OAAO,eAAe,GAAG;AACjC,UAAI,CAAC,KAAK,iBAAiB;AAC1B,aAAK,kBAAkB;AACvB,aAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAAA,MACjC;AACA,WAAK,OAAO,MAAM;AAClB;AAAA,IACD;AAEA,QAAI,KAAK,OAAO,eAAe,GAAG;AACjC,WAAK,OAAO,MAAM;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,MAAc,cAAc,MAA8B;AACzD,QAAI;AACH,UAAI,OAAO,SAAS,UAAU;AAC7B,cAAM,QAAQ,yBAAyB,IAAI;AAC3C,YAAI,CAAC,OAAO;AACX,eAAK;AAAA,YACJ,IAAI,MAAM,0CAA0C;AAAA,UACrD;AACA;AAAA,QACD;AAEA,YAAI,MAAM,SAAS,QAAQ;AAC1B,qBAAW,YAAY,KAAK,eAAe;AAC1C,qBAAS,EAAE,UAAU,MAAM,YAAY,KAAK,CAAC;AAAA,UAC9C;AACA;AAAA,QACD;AAEA,YAAI,MAAM,SAAS,SAAS;AAC3B,eAAK,UAAU,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,QACxC;AACA;AAAA,MACD;AAEA,YAAM,QAAQ,MAAM,oBAAoB,IAAI;AAC5C,UAAI,CAAC,OAAO;AACX,aAAK;AAAA,UACJ,IAAI,MAAM,gDAAgD;AAAA,QAC3D;AACA;AAAA,MACD;AAEA,iBAAW,YAAY,KAAK,eAAe;AAC1C,iBAAS,KAAK;AAAA,MACf;AAAA,IACD,SAAS,OAAO;AACf,WAAK;AAAA,QACJ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MACzD;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,UAAU,OAUT;AACR,QAAI,KAAK,OAAO,eAAe,GAAG;AACjC;AAAA,IACD;AACA,SAAK,OAAO,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EACvC;AAAA,EAEQ,UAAU,OAAoB;AACrC,eAAW,YAAY,KAAK,gBAAgB;AAC3C,eAAS,KAAK;AAAA,IACf;AAAA,EACD;AACD;AAEA,eAAe,aACd,OACA,MACoB;AACpB,QAAM,cAAc,EAAE,GAAG,KAAK;AAI9B,cAAY,OAAO,KAAK;AACxB,MAAI,iBAAiB,KAAK,IAAI,GAAG;AAChC,gBAAY,SAAS;AAAA,EACtB;AACA,SAAO,MAAM,SAAS,EAAE,OAAO,WAAW;AAC3C;AAEA,SAAS,WAAyB;AACjC,MAAI,CAAC,WAAW,OAAO;AACtB,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,SAAO,WAAW,MAAM,KAAK,UAAU;AACxC;AAEA,SAAS,mBAAyC;AACjD,MAAI,CAAC,WAAW,WAAW;AAC1B,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,SAAO,WAAW;AACnB;AAEA,SAAS,SACR,YACA,UACA,OACS;AACT,QAAM,MAAM,IAAI,IAAI,UAAU;AAC9B,QAAM,WAAW,IAAI,SAAS,QAAQ,QAAQ,EAAE;AAChD,QAAM,SAAS,SAAS,WAAW,GAAG,IAAI,WAAW,IAAI,QAAQ;AACjE,MAAI,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,WAAW,GAAG;AAC5D,MAAI,OAAO;AACV,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,UAAI,UAAU,QAAW;AACxB;AAAA,MACD;AACA,UAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,IACxC;AAAA,EACD;AACA,SAAO,IAAI,SAAS;AACrB;AAEA,SAAS,yBAAyB,SAa1B;AACP,MAAI;AACH,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,OAAO,OAAO,SAAS,UAAU;AACpC,aAAO;AAAA,IACR;AACA,QACC,OAAO,SAAS,WAChB,OAAO,OAAO,cAAc,UAC3B;AACD,aAAO;AAAA,QACN,MAAM;AAAA,QACN,WAAW,OAAO;AAAA,MACnB;AAAA,IACD;AACA,QACC,OAAO,SAAS,WACf,OAAO,aAAa,UACpB,OAAO,aAAa,QACpB,OAAO,OAAO,aAAa,WAC3B;AACD,aAAO;AAAA,QACN,MAAM;AAAA,QACN,UAAW,OAAO,YAA0C;AAAA,MAC7D;AAAA,IACD;AACA,QACC,OAAO,SAAS,WAChB,OAAO,OAAO,YAAY,UACzB;AACD,aAAO;AAAA,QACN,MAAM;AAAA,QACN,SAAS,OAAO;AAAA,MACjB;AAAA,IACD;AAAA,EACD,QAAQ;AACP,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAEA,SAAS,oBAAoB,MAG3B;AACD,MAAI,OAAO,SAAS,UAAU;AAC7B,WAAO,EAAE,KAAK;AAAA,EACf;AACA,SAAO;AAAA,IACN,MAAM,cAAc,oBAAoB,IAAI,CAAC;AAAA,IAC7C,UAAU;AAAA,EACX;AACD;AAEA,SAAS,oBAAoB,MAAiD;AAC7E,MAAI,gBAAgB,aAAa;AAChC,WAAO,IAAI,WAAW,IAAI;AAAA,EAC3B;AACA,SAAO,IAAI,WAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU,EAAE,MAAM;AAC5E;AAEA,eAAe,oBAAoB,MAA2C;AAC7E,MAAI,gBAAgB,aAAa;AAChC,WAAO,IAAI,WAAW,IAAI;AAAA,EAC3B;AACA,MAAI,YAAY,OAAO,IAAI,GAAG;AAC7B,WAAO,IAAI;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACN,EAAE,MAAM;AAAA,EACT;AACA,MAAI,OAAO,SAAS,eAAe,gBAAgB,MAAM;AACxD,WAAO,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC;AAAA,EAC/C;AACA,SAAO;AACR;AAEA,SAAS,cAAc,OAA2B;AACjD,QAAM,aACL,WAKC;AACF,MAAI,YAAY;AACf,WAAO,WAAW,KAAK,KAAK,EAAE,SAAS,QAAQ;AAAA,EAChD;AAEA,MAAI,SAAS;AACb,QAAM,YAAY;AAClB,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,WAAW;AAC7D,UAAM,QAAQ,MAAM,SAAS,OAAO,QAAQ,SAAS;AACrD,cAAU,OAAO,aAAa,GAAG,KAAK;AAAA,EACvC;AACA,MAAI,OAAO,SAAS,YAAY;AAC/B,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACtE;AACA,SAAO,KAAK,MAAM;AACnB;AAEA,eAAe,qBACd,MACA,UACA,QACgB;AAChB,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AACb,MAAI;AACH,WAAO,CAAC,OAAO,SAAS;AACvB,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,MAAM;AACT;AAAA,MACD;AACA,gBAAU,QACR,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,EAC9B,QAAQ,SAAS,IAAI;AACvB,UAAI,iBAAiB,OAAO,QAAQ,MAAM;AAC1C,aAAO,mBAAmB,IAAI;AAC7B,cAAM,QAAQ,OAAO,MAAM,GAAG,cAAc;AAC5C,iBAAS,OAAO,MAAM,iBAAiB,CAAC;AACxC,cAAM,QAAQ,wBAAwB,KAAK;AAC3C,YAAI,OAAO;AACV,mBAAS,KAAK;AAAA,QACf;AACA,yBAAiB,OAAO,QAAQ,MAAM;AAAA,MACvC;AAAA,IACD;AAAA,EACD,SAAS,OAAO;AACf,QAAI,OAAO,WAAW,aAAa,KAAK,GAAG;AAC1C;AAAA,IACD;AACA,UAAM;AAAA,EACP,UAAE;AACD,WAAO,YAAY;AAAA,EACpB;AACD;AAEA,SAAS,wBAAwB,OAAuC;AACvE,MAAI,CAAC,MAAM,KAAK,GAAG;AAClB,WAAO;AAAA,EACR;AAEA,MAAI,YAAY;AAChB,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,MAAM,MAAM,IAAI,GAAG;AACrC,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,GAAG;AAClC;AAAA,IACD;AACA,QAAI,KAAK,WAAW,QAAQ,GAAG;AAC9B,kBAAY,KAAK,MAAM,CAAC,EAAE,KAAK;AAC/B;AAAA,IACD;AACA,QAAI,KAAK,WAAW,OAAO,GAAG;AAC7B,gBAAU,KAAK,KAAK,MAAM,CAAC,EAAE,UAAU,CAAC;AAAA,IACzC;AAAA,EACD;AAEA,MAAI,cAAc,OAAO;AACxB,WAAO;AAAA,EACR;AAEA,QAAM,OAAO,UAAU,KAAK,IAAI;AAChC,MAAI,CAAC,KAAK,KAAK,GAAG;AACjB,WAAO;AAAA,EACR;AAEA,SAAO,KAAK,MAAM,IAAI;AACvB;AAEA,SAAS,aAAa,OAAyB;AAC9C,SAAO,iBAAiB,SAAS,MAAM,SAAS;AACjD;AAEA,SAAS,iBAAiB,OAAyC;AAClE,SACC,OAAO,mBAAmB,eAC1B,iBAAiB;AAEnB;","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  AsyncMutex,
3
3
  createActorKvStore,
4
4
  toSqliteBindings
5
- } from "./chunk-N4KRDJ56.js";
5
+ } from "./chunk-GFGRBYO2.js";
6
6
  import {
7
7
  __export,
8
8
  __reExport
@@ -96,7 +96,7 @@ function defineConfig(config) {
96
96
  }
97
97
  function createProxyCallback(waDb, mutex, isClosed) {
98
98
  return async (sql, params, method) => {
99
- return mutex.run(async () => {
99
+ return await mutex.run(async () => {
100
100
  if (isClosed()) {
101
101
  throw new Error("database is closed");
102
102
  }
@@ -112,24 +112,20 @@ function createProxyCallback(waDb, mutex, isClosed) {
112
112
  });
113
113
  };
114
114
  }
115
- async function runInlineMigrations(waDb, mutex, migrations) {
116
- await mutex.run(
117
- () => waDb.exec(`
115
+ async function runInlineMigrations(waDb, migrations) {
116
+ await waDb.exec(`
118
117
  CREATE TABLE IF NOT EXISTS __drizzle_migrations (
119
118
  id INTEGER PRIMARY KEY AUTOINCREMENT,
120
119
  hash TEXT NOT NULL,
121
120
  created_at INTEGER
122
121
  )
123
- `)
124
- );
122
+ `);
125
123
  let lastCreatedAt = 0;
126
- await mutex.run(
127
- () => waDb.exec(
128
- "SELECT id, hash, created_at FROM __drizzle_migrations ORDER BY created_at DESC LIMIT 1",
129
- (row) => {
130
- lastCreatedAt = Number(row[2]) || 0;
131
- }
132
- )
124
+ await waDb.exec(
125
+ "SELECT id, hash, created_at FROM __drizzle_migrations ORDER BY created_at DESC LIMIT 1",
126
+ (row) => {
127
+ lastCreatedAt = Number(row[2]) || 0;
128
+ }
133
129
  );
134
130
  const journal = migrations.journal;
135
131
  if (!(journal == null ? void 0 : journal.entries)) return;
@@ -138,18 +134,15 @@ async function runInlineMigrations(waDb, mutex, migrations) {
138
134
  const migrationKey = `m${String(entry.idx).padStart(4, "0")}`;
139
135
  const sql = migrations.migrations[migrationKey];
140
136
  if (!sql) continue;
141
- await mutex.run(() => waDb.exec(sql));
142
- await mutex.run(
143
- () => waDb.run(
144
- "INSERT INTO __drizzle_migrations (hash, created_at) VALUES (?, ?)",
145
- [entry.tag, entry.when]
146
- )
137
+ await waDb.exec(sql);
138
+ await waDb.run(
139
+ "INSERT INTO __drizzle_migrations (hash, created_at) VALUES (?, ?)",
140
+ [entry.tag, entry.when]
147
141
  );
148
142
  }
149
143
  }
150
144
  function db(config) {
151
- let waDbInstance = null;
152
- const mutex = new AsyncMutex();
145
+ const clientToRawDb = /* @__PURE__ */ new WeakMap();
153
146
  return {
154
147
  createClient: async (ctx) => {
155
148
  if (!ctx.sqliteVfs) {
@@ -157,9 +150,9 @@ function db(config) {
157
150
  "SqliteVfs instance not provided in context. The driver must provide a sqliteVfs instance."
158
151
  );
159
152
  }
160
- const kvStore = createActorKvStore(ctx.kv);
153
+ const kvStore = createActorKvStore(ctx.kv, ctx.metrics);
161
154
  const waDb = await ctx.sqliteVfs.open(ctx.actorId, kvStore);
162
- waDbInstance = waDb;
155
+ const mutex = new AsyncMutex();
163
156
  let closed = false;
164
157
  const ensureOpen = () => {
165
158
  if (closed) {
@@ -168,19 +161,19 @@ function db(config) {
168
161
  };
169
162
  const callback = createProxyCallback(waDb, mutex, () => closed);
170
163
  const client = proxyDrizzle(callback, config);
171
- return Object.assign(client, {
164
+ const result = Object.assign(client, {
172
165
  execute: async (query, ...args) => {
173
- return mutex.run(async () => {
166
+ return await mutex.run(async () => {
174
167
  ensureOpen();
175
168
  if (args.length > 0) {
176
- const result = await waDb.query(
169
+ const result2 = await waDb.query(
177
170
  query,
178
171
  toSqliteBindings(args)
179
172
  );
180
- return result.rows.map((row) => {
173
+ return result2.rows.map((row) => {
181
174
  const obj = {};
182
- for (let i = 0; i < result.columns.length; i++) {
183
- obj[result.columns[i]] = row[i];
175
+ for (let i = 0; i < result2.columns.length; i++) {
176
+ obj[result2.columns[i]] = row[i];
184
177
  }
185
178
  return obj;
186
179
  });
@@ -204,22 +197,24 @@ function db(config) {
204
197
  });
205
198
  },
206
199
  close: async () => {
207
- await mutex.run(async () => {
208
- if (closed) {
209
- return;
210
- }
200
+ const shouldClose = await mutex.run(async () => {
201
+ if (closed) return false;
211
202
  closed = true;
212
- await waDb.close();
213
- waDbInstance = null;
203
+ return true;
214
204
  });
205
+ if (shouldClose) {
206
+ await waDb.close();
207
+ }
215
208
  }
216
209
  });
210
+ clientToRawDb.set(result, waDb);
211
+ return result;
217
212
  },
218
- onMigrate: async (_client) => {
219
- if ((config == null ? void 0 : config.migrations) && waDbInstance) {
213
+ onMigrate: async (client) => {
214
+ const waDb = clientToRawDb.get(client);
215
+ if ((config == null ? void 0 : config.migrations) && waDb) {
220
216
  await runInlineMigrations(
221
- waDbInstance,
222
- mutex,
217
+ waDb,
223
218
  config.migrations
224
219
  );
225
220
  }
@@ -254,4 +249,4 @@ export {
254
249
  db,
255
250
  mod_exports
256
251
  };
257
- //# sourceMappingURL=chunk-VKVNIQRQ.js.map
252
+ //# sourceMappingURL=chunk-K7MVU5SI.js.map