@nimbus-sh/worker 0.1.0

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 (408) hide show
  1. package/README.md +219 -0
  2. package/dist/_shared/bytes.d.ts +18 -0
  3. package/dist/_shared/bytes.d.ts.map +1 -0
  4. package/dist/_shared/bytes.js +17 -0
  5. package/dist/_shared/cache-stats.d.ts +146 -0
  6. package/dist/_shared/cache-stats.d.ts.map +1 -0
  7. package/dist/_shared/cache-stats.js +162 -0
  8. package/dist/_shared/exports-resolver.d.ts +76 -0
  9. package/dist/_shared/exports-resolver.d.ts.map +1 -0
  10. package/dist/_shared/exports-resolver.js +284 -0
  11. package/dist/_shared/install-phase.d.ts +47 -0
  12. package/dist/_shared/install-phase.d.ts.map +1 -0
  13. package/dist/_shared/install-phase.js +1 -0
  14. package/dist/_shared/real-node-imports.d.ts +38 -0
  15. package/dist/_shared/real-node-imports.d.ts.map +1 -0
  16. package/dist/_shared/real-node-imports.js +46 -0
  17. package/dist/_shared/retry.d.ts +93 -0
  18. package/dist/_shared/retry.d.ts.map +1 -0
  19. package/dist/_shared/retry.js +161 -0
  20. package/dist/_shared/session-id.d.ts +39 -0
  21. package/dist/_shared/session-id.d.ts.map +1 -0
  22. package/dist/_shared/session-id.js +127 -0
  23. package/dist/_shared/session-router.d.ts +104 -0
  24. package/dist/_shared/session-router.d.ts.map +1 -0
  25. package/dist/_shared/session-router.js +165 -0
  26. package/dist/_shared/w7-frame.d.ts +93 -0
  27. package/dist/_shared/w7-frame.d.ts.map +1 -0
  28. package/dist/_shared/w7-frame.js +402 -0
  29. package/dist/auth/index.d.ts +16 -0
  30. package/dist/auth/index.d.ts.map +1 -0
  31. package/dist/auth/index.js +15 -0
  32. package/dist/auth/middleware.d.ts +85 -0
  33. package/dist/auth/middleware.d.ts.map +1 -0
  34. package/dist/auth/middleware.js +150 -0
  35. package/dist/auth/token.d.ts +96 -0
  36. package/dist/auth/token.d.ts.map +1 -0
  37. package/dist/auth/token.js +226 -0
  38. package/dist/auth/types.d.ts +141 -0
  39. package/dist/auth/types.d.ts.map +1 -0
  40. package/dist/auth/types.js +114 -0
  41. package/dist/bindings/d1.d.ts +102 -0
  42. package/dist/bindings/d1.d.ts.map +1 -0
  43. package/dist/bindings/d1.js +549 -0
  44. package/dist/bindings/kv.d.ts +82 -0
  45. package/dist/bindings/kv.d.ts.map +1 -0
  46. package/dist/bindings/kv.js +290 -0
  47. package/dist/bindings/r2.d.ts +137 -0
  48. package/dist/bindings/r2.d.ts.map +1 -0
  49. package/dist/bindings/r2.js +379 -0
  50. package/dist/cirrus-npm-cjs.generated.d.ts +17 -0
  51. package/dist/cirrus-npm-cjs.generated.d.ts.map +1 -0
  52. package/dist/cirrus-npm-cjs.generated.js +41 -0
  53. package/dist/cirrus-plugin-react.generated.d.ts +34 -0
  54. package/dist/cirrus-plugin-react.generated.d.ts.map +1 -0
  55. package/dist/cirrus-plugin-react.generated.js +33 -0
  56. package/dist/constants.d.ts +34 -0
  57. package/dist/constants.d.ts.map +1 -0
  58. package/dist/constants.js +116 -0
  59. package/dist/esbuild-wasm-bundle.generated.d.ts +41 -0
  60. package/dist/esbuild-wasm-bundle.generated.d.ts.map +1 -0
  61. package/dist/esbuild-wasm-bundle.generated.js +40 -0
  62. package/dist/facets/cirrus-real.d.ts +147 -0
  63. package/dist/facets/cirrus-real.d.ts.map +1 -0
  64. package/dist/facets/cirrus-real.js +981 -0
  65. package/dist/facets/inner-do-registry.d.ts +41 -0
  66. package/dist/facets/inner-do-registry.d.ts.map +1 -0
  67. package/dist/facets/inner-do-registry.js +51 -0
  68. package/dist/facets/manager.d.ts +314 -0
  69. package/dist/facets/manager.d.ts.map +1 -0
  70. package/dist/facets/manager.js +2681 -0
  71. package/dist/facets/process.d.ts +318 -0
  72. package/dist/facets/process.d.ts.map +1 -0
  73. package/dist/facets/process.js +567 -0
  74. package/dist/facets/real-vite-fs-shim.d.ts +151 -0
  75. package/dist/facets/real-vite-fs-shim.d.ts.map +1 -0
  76. package/dist/facets/real-vite-fs-shim.js +1279 -0
  77. package/dist/facets/real-vite-hmr.d.ts +142 -0
  78. package/dist/facets/real-vite-hmr.d.ts.map +1 -0
  79. package/dist/facets/real-vite-hmr.js +476 -0
  80. package/dist/facets/vite-dev-server.d.ts +293 -0
  81. package/dist/facets/vite-dev-server.d.ts.map +1 -0
  82. package/dist/facets/vite-dev-server.js +2580 -0
  83. package/dist/facets/wasm-swap-registry.d.ts +261 -0
  84. package/dist/facets/wasm-swap-registry.d.ts.map +1 -0
  85. package/dist/facets/wasm-swap-registry.js +551 -0
  86. package/dist/facets/ws-terminal.d.ts +107 -0
  87. package/dist/facets/ws-terminal.d.ts.map +1 -0
  88. package/dist/facets/ws-terminal.js +207 -0
  89. package/dist/git/commands.d.ts +13 -0
  90. package/dist/git/commands.d.ts.map +1 -0
  91. package/dist/git/commands.js +633 -0
  92. package/dist/git/network-facet.d.ts +61 -0
  93. package/dist/git/network-facet.d.ts.map +1 -0
  94. package/dist/git/network-facet.js +700 -0
  95. package/dist/git-bundle.generated.d.ts +16 -0
  96. package/dist/git-bundle.generated.d.ts.map +1 -0
  97. package/dist/git-bundle.generated.js +15 -0
  98. package/dist/index.d.ts +41 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +73 -0
  101. package/dist/loaders/child-process/spawn-facet.d.ts +90 -0
  102. package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -0
  103. package/dist/loaders/child-process/spawn-facet.js +103 -0
  104. package/dist/loaders/child-process/spawn-pool.d.ts +110 -0
  105. package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -0
  106. package/dist/loaders/child-process/spawn-pool.js +161 -0
  107. package/dist/loaders/fanout-pool.d.ts +195 -0
  108. package/dist/loaders/fanout-pool.d.ts.map +1 -0
  109. package/dist/loaders/fanout-pool.js +326 -0
  110. package/dist/loaders/generated-workers.d.ts +26 -0
  111. package/dist/loaders/generated-workers.d.ts.map +1 -0
  112. package/dist/loaders/generated-workers.js +25 -0
  113. package/dist/loaders/index.d.ts +15 -0
  114. package/dist/loaders/index.d.ts.map +1 -0
  115. package/dist/loaders/index.js +13 -0
  116. package/dist/loaders/loader-pool.d.ts +273 -0
  117. package/dist/loaders/loader-pool.d.ts.map +1 -0
  118. package/dist/loaders/loader-pool.js +624 -0
  119. package/dist/loaders/npm-resolve-preamble.d.ts +34 -0
  120. package/dist/loaders/npm-resolve-preamble.d.ts.map +1 -0
  121. package/dist/loaders/npm-resolve-preamble.js +237 -0
  122. package/dist/loaders/pre-bundle-preamble.d.ts +41 -0
  123. package/dist/loaders/pre-bundle-preamble.d.ts.map +1 -0
  124. package/dist/loaders/pre-bundle-preamble.js +114 -0
  125. package/dist/loaders/vendor/codegen.d.ts +24 -0
  126. package/dist/loaders/vendor/codegen.d.ts.map +1 -0
  127. package/dist/loaders/vendor/codegen.js +44 -0
  128. package/dist/loaders/vendor/errors.d.ts +24 -0
  129. package/dist/loaders/vendor/errors.d.ts.map +1 -0
  130. package/dist/loaders/vendor/errors.js +46 -0
  131. package/dist/loaders/vendor/index.d.ts +16 -0
  132. package/dist/loaders/vendor/index.d.ts.map +1 -0
  133. package/dist/loaders/vendor/index.js +11 -0
  134. package/dist/loaders/vendor/pool.d.ts +88 -0
  135. package/dist/loaders/vendor/pool.d.ts.map +1 -0
  136. package/dist/loaders/vendor/pool.js +353 -0
  137. package/dist/loaders/vendor/primitives.d.ts +11 -0
  138. package/dist/loaders/vendor/primitives.d.ts.map +1 -0
  139. package/dist/loaders/vendor/primitives.js +33 -0
  140. package/dist/loaders/vendor/serialize.d.ts +3 -0
  141. package/dist/loaders/vendor/serialize.d.ts.map +1 -0
  142. package/dist/loaders/vendor/serialize.js +25 -0
  143. package/dist/loaders/vendor/types.d.ts +60 -0
  144. package/dist/loaders/vendor/types.d.ts.map +1 -0
  145. package/dist/loaders/vendor/types.js +4 -0
  146. package/dist/npm/cache.d.ts +136 -0
  147. package/dist/npm/cache.d.ts.map +1 -0
  148. package/dist/npm/cache.js +429 -0
  149. package/dist/npm/install-batch-facet.d.ts +129 -0
  150. package/dist/npm/install-batch-facet.d.ts.map +1 -0
  151. package/dist/npm/install-batch-facet.js +598 -0
  152. package/dist/npm/install-facet.d.ts +29 -0
  153. package/dist/npm/install-facet.d.ts.map +1 -0
  154. package/dist/npm/install-facet.js +9 -0
  155. package/dist/npm/installer.d.ts +239 -0
  156. package/dist/npm/installer.d.ts.map +1 -0
  157. package/dist/npm/installer.js +2022 -0
  158. package/dist/npm/npx-install.d.ts +74 -0
  159. package/dist/npm/npx-install.d.ts.map +1 -0
  160. package/dist/npm/npx-install.js +302 -0
  161. package/dist/npm/pre-bundle-facet.d.ts +168 -0
  162. package/dist/npm/pre-bundle-facet.d.ts.map +1 -0
  163. package/dist/npm/pre-bundle-facet.js +653 -0
  164. package/dist/npm/r2-cache.d.ts +286 -0
  165. package/dist/npm/r2-cache.d.ts.map +1 -0
  166. package/dist/npm/r2-cache.js +506 -0
  167. package/dist/npm/resolve-facet.d.ts +202 -0
  168. package/dist/npm/resolve-facet.d.ts.map +1 -0
  169. package/dist/npm/resolve-facet.js +833 -0
  170. package/dist/npm/resolve-one-facet.d.ts +204 -0
  171. package/dist/npm/resolve-one-facet.d.ts.map +1 -0
  172. package/dist/npm/resolve-one-facet.js +437 -0
  173. package/dist/npm/resolver.d.ts +109 -0
  174. package/dist/npm/resolver.d.ts.map +1 -0
  175. package/dist/npm/resolver.js +899 -0
  176. package/dist/npm/tarball-stream.d.ts +85 -0
  177. package/dist/npm/tarball-stream.d.ts.map +1 -0
  178. package/dist/npm/tarball-stream.js +205 -0
  179. package/dist/npm/tarball.d.ts +51 -0
  180. package/dist/npm/tarball.d.ts.map +1 -0
  181. package/dist/npm/tarball.js +185 -0
  182. package/dist/observability/diag-counters.d.ts +292 -0
  183. package/dist/observability/diag-counters.d.ts.map +1 -0
  184. package/dist/observability/diag-counters.js +302 -0
  185. package/dist/observability/heap-estimate.d.ts +166 -0
  186. package/dist/observability/heap-estimate.d.ts.map +1 -0
  187. package/dist/observability/heap-estimate.js +192 -0
  188. package/dist/observability/heavy-alloc-coord.d.ts +95 -0
  189. package/dist/observability/heavy-alloc-coord.d.ts.map +1 -0
  190. package/dist/observability/heavy-alloc-coord.js +149 -0
  191. package/dist/observability/oom-classify.d.ts +56 -0
  192. package/dist/observability/oom-classify.d.ts.map +1 -0
  193. package/dist/observability/oom-classify.js +118 -0
  194. package/dist/observability/oom-discriminator.d.ts +192 -0
  195. package/dist/observability/oom-discriminator.d.ts.map +1 -0
  196. package/dist/observability/oom-discriminator.js +233 -0
  197. package/dist/real-vite-bundle.generated.d.ts +46 -0
  198. package/dist/real-vite-bundle.generated.d.ts.map +1 -0
  199. package/dist/real-vite-bundle.generated.js +53 -0
  200. package/dist/replica/routing.d.ts +171 -0
  201. package/dist/replica/routing.d.ts.map +1 -0
  202. package/dist/replica/routing.js +288 -0
  203. package/dist/replica/suspension.d.ts +36 -0
  204. package/dist/replica/suspension.d.ts.map +1 -0
  205. package/dist/replica/suspension.js +49 -0
  206. package/dist/router/index.d.ts +156 -0
  207. package/dist/router/index.d.ts.map +1 -0
  208. package/dist/router/index.js +220 -0
  209. package/dist/runtime/assets-loader.d.ts +71 -0
  210. package/dist/runtime/assets-loader.d.ts.map +1 -0
  211. package/dist/runtime/assets-loader.js +128 -0
  212. package/dist/runtime/barrel-detect.d.ts +46 -0
  213. package/dist/runtime/barrel-detect.d.ts.map +1 -0
  214. package/dist/runtime/barrel-detect.js +73 -0
  215. package/dist/runtime/barrel-synthesizer.d.ts +181 -0
  216. package/dist/runtime/barrel-synthesizer.d.ts.map +1 -0
  217. package/dist/runtime/barrel-synthesizer.js +541 -0
  218. package/dist/runtime/bun-repl.d.ts +46 -0
  219. package/dist/runtime/bun-repl.d.ts.map +1 -0
  220. package/dist/runtime/bun-repl.js +326 -0
  221. package/dist/runtime/bun-runner.d.ts +66 -0
  222. package/dist/runtime/bun-runner.d.ts.map +1 -0
  223. package/dist/runtime/bun-runner.js +219 -0
  224. package/dist/runtime/clang-runner.d.ts +38 -0
  225. package/dist/runtime/clang-runner.d.ts.map +1 -0
  226. package/dist/runtime/clang-runner.js +1033 -0
  227. package/dist/runtime/comment-strip.d.ts +37 -0
  228. package/dist/runtime/comment-strip.d.ts.map +1 -0
  229. package/dist/runtime/comment-strip.js +74 -0
  230. package/dist/runtime/esbuild-service.d.ts +201 -0
  231. package/dist/runtime/esbuild-service.d.ts.map +1 -0
  232. package/dist/runtime/esbuild-service.js +1444 -0
  233. package/dist/runtime/esbuild-wasm-bytes.d.ts +87 -0
  234. package/dist/runtime/esbuild-wasm-bytes.d.ts.map +1 -0
  235. package/dist/runtime/esbuild-wasm-bytes.js +131 -0
  236. package/dist/runtime/framework-detect.d.ts +71 -0
  237. package/dist/runtime/framework-detect.d.ts.map +1 -0
  238. package/dist/runtime/framework-detect.js +178 -0
  239. package/dist/runtime/long-running-handle.d.ts +133 -0
  240. package/dist/runtime/long-running-handle.d.ts.map +1 -0
  241. package/dist/runtime/long-running-handle.js +192 -0
  242. package/dist/runtime/node-repl.d.ts +36 -0
  243. package/dist/runtime/node-repl.d.ts.map +1 -0
  244. package/dist/runtime/node-repl.js +293 -0
  245. package/dist/runtime/node-runner.d.ts +111 -0
  246. package/dist/runtime/node-runner.d.ts.map +1 -0
  247. package/dist/runtime/node-runner.js +194 -0
  248. package/dist/runtime/node-shims.d.ts +24 -0
  249. package/dist/runtime/node-shims.d.ts.map +1 -0
  250. package/dist/runtime/node-shims.js +3019 -0
  251. package/dist/runtime/package-manager.d.ts +118 -0
  252. package/dist/runtime/package-manager.d.ts.map +1 -0
  253. package/dist/runtime/package-manager.js +420 -0
  254. package/dist/runtime/port-registry.d.ts +80 -0
  255. package/dist/runtime/port-registry.d.ts.map +1 -0
  256. package/dist/runtime/port-registry.js +166 -0
  257. package/dist/runtime/process-logs-api.d.ts +102 -0
  258. package/dist/runtime/process-logs-api.d.ts.map +1 -0
  259. package/dist/runtime/process-logs-api.js +253 -0
  260. package/dist/runtime/process-logs.d.ts +311 -0
  261. package/dist/runtime/process-logs.d.ts.map +1 -0
  262. package/dist/runtime/process-logs.js +656 -0
  263. package/dist/runtime/process-table.d.ts +65 -0
  264. package/dist/runtime/process-table.d.ts.map +1 -0
  265. package/dist/runtime/process-table.js +107 -0
  266. package/dist/runtime/project-detect.d.ts +21 -0
  267. package/dist/runtime/project-detect.d.ts.map +1 -0
  268. package/dist/runtime/project-detect.js +46 -0
  269. package/dist/runtime/python-repl.d.ts +66 -0
  270. package/dist/runtime/python-repl.d.ts.map +1 -0
  271. package/dist/runtime/python-repl.js +563 -0
  272. package/dist/runtime/python-runner.d.ts +50 -0
  273. package/dist/runtime/python-runner.d.ts.map +1 -0
  274. package/dist/runtime/python-runner.js +870 -0
  275. package/dist/runtime/repl-session.d.ts +160 -0
  276. package/dist/runtime/repl-session.d.ts.map +1 -0
  277. package/dist/runtime/repl-session.js +393 -0
  278. package/dist/runtime/require-resolver.d.ts +52 -0
  279. package/dist/runtime/require-resolver.d.ts.map +1 -0
  280. package/dist/runtime/require-resolver.js +690 -0
  281. package/dist/runtime/router-basename.d.ts +36 -0
  282. package/dist/runtime/router-basename.d.ts.map +1 -0
  283. package/dist/runtime/router-basename.js +310 -0
  284. package/dist/runtime/ruby-repl.d.ts +43 -0
  285. package/dist/runtime/ruby-repl.d.ts.map +1 -0
  286. package/dist/runtime/ruby-repl.js +229 -0
  287. package/dist/runtime/ruby-runner.d.ts +62 -0
  288. package/dist/runtime/ruby-runner.d.ts.map +1 -0
  289. package/dist/runtime/ruby-runner.js +737 -0
  290. package/dist/runtime/runtime-catalog.d.ts +99 -0
  291. package/dist/runtime/runtime-catalog.d.ts.map +1 -0
  292. package/dist/runtime/runtime-catalog.js +183 -0
  293. package/dist/runtime/runtime-registry.d.ts +136 -0
  294. package/dist/runtime/runtime-registry.d.ts.map +1 -0
  295. package/dist/runtime/runtime-registry.js +318 -0
  296. package/dist/runtime/streams.d.ts +13 -0
  297. package/dist/runtime/streams.d.ts.map +1 -0
  298. package/dist/runtime/streams.js +402 -0
  299. package/dist/runtime/wasi-instance.d.ts +190 -0
  300. package/dist/runtime/wasi-instance.d.ts.map +1 -0
  301. package/dist/runtime/wasi-instance.js +2044 -0
  302. package/dist/runtime/wasm-runner.d.ts +117 -0
  303. package/dist/runtime/wasm-runner.d.ts.map +1 -0
  304. package/dist/runtime/wasm-runner.js +705 -0
  305. package/dist/session/bindings.d.ts +168 -0
  306. package/dist/session/bindings.d.ts.map +1 -0
  307. package/dist/session/bindings.js +524 -0
  308. package/dist/session/ctx-exports.d.ts +16 -0
  309. package/dist/session/ctx-exports.d.ts.map +1 -0
  310. package/dist/session/ctx-exports.js +22 -0
  311. package/dist/session/diag.d.ts +62 -0
  312. package/dist/session/diag.d.ts.map +1 -0
  313. package/dist/session/diag.js +118 -0
  314. package/dist/session/fs-watch.d.ts +132 -0
  315. package/dist/session/fs-watch.d.ts.map +1 -0
  316. package/dist/session/fs-watch.js +255 -0
  317. package/dist/session/helpers.d.ts +150 -0
  318. package/dist/session/helpers.d.ts.map +1 -0
  319. package/dist/session/helpers.js +472 -0
  320. package/dist/session/hibernation.d.ts +145 -0
  321. package/dist/session/hibernation.d.ts.map +1 -0
  322. package/dist/session/hibernation.js +385 -0
  323. package/dist/session/init-phases.d.ts +87 -0
  324. package/dist/session/init-phases.d.ts.map +1 -0
  325. package/dist/session/init-phases.js +137 -0
  326. package/dist/session/init.d.ts +46 -0
  327. package/dist/session/init.d.ts.map +1 -0
  328. package/dist/session/init.js +3579 -0
  329. package/dist/session/keys.d.ts +56 -0
  330. package/dist/session/keys.d.ts.map +1 -0
  331. package/dist/session/keys.js +55 -0
  332. package/dist/session/nimbus-session.d.ts +434 -0
  333. package/dist/session/nimbus-session.d.ts.map +1 -0
  334. package/dist/session/nimbus-session.js +1084 -0
  335. package/dist/session/programmatic.d.ts +105 -0
  336. package/dist/session/programmatic.d.ts.map +1 -0
  337. package/dist/session/programmatic.js +326 -0
  338. package/dist/session/replica-routes.d.ts +68 -0
  339. package/dist/session/replica-routes.d.ts.map +1 -0
  340. package/dist/session/replica-routes.js +77 -0
  341. package/dist/session/routes.d.ts +29 -0
  342. package/dist/session/routes.d.ts.map +1 -0
  343. package/dist/session/routes.js +1331 -0
  344. package/dist/session/rpc.d.ts +323 -0
  345. package/dist/session/rpc.d.ts.map +1 -0
  346. package/dist/session/rpc.js +808 -0
  347. package/dist/session/state-store.d.ts +210 -0
  348. package/dist/session/state-store.d.ts.map +1 -0
  349. package/dist/session/state-store.js +459 -0
  350. package/dist/session/supervisor-rpc.d.ts +269 -0
  351. package/dist/session/supervisor-rpc.d.ts.map +1 -0
  352. package/dist/session/supervisor-rpc.js +437 -0
  353. package/dist/session/ws-hibernation-config.d.ts +64 -0
  354. package/dist/session/ws-hibernation-config.d.ts.map +1 -0
  355. package/dist/session/ws-hibernation-config.js +89 -0
  356. package/dist/session/ws.d.ts +95 -0
  357. package/dist/session/ws.d.ts.map +1 -0
  358. package/dist/session/ws.js +395 -0
  359. package/dist/shell/features.d.ts +410 -0
  360. package/dist/shell/features.d.ts.map +1 -0
  361. package/dist/shell/features.js +1885 -0
  362. package/dist/shell/unix-commands.d.ts +15 -0
  363. package/dist/shell/unix-commands.d.ts.map +1 -0
  364. package/dist/shell/unix-commands.js +3703 -0
  365. package/dist/stubs/lifo-ui.d.ts +10 -0
  366. package/dist/stubs/lifo-ui.d.ts.map +1 -0
  367. package/dist/stubs/lifo-ui.js +1 -0
  368. package/dist/tailwind-play.generated.d.ts +19 -0
  369. package/dist/tailwind-play.generated.d.ts.map +1 -0
  370. package/dist/tailwind-play.generated.js +18 -0
  371. package/dist/vfs/dev-provider.d.ts +64 -0
  372. package/dist/vfs/dev-provider.d.ts.map +1 -0
  373. package/dist/vfs/dev-provider.js +191 -0
  374. package/dist/vfs/events.d.ts +51 -0
  375. package/dist/vfs/events.d.ts.map +1 -0
  376. package/dist/vfs/events.js +127 -0
  377. package/dist/vfs/path.d.ts +30 -0
  378. package/dist/vfs/path.d.ts.map +1 -0
  379. package/dist/vfs/path.js +41 -0
  380. package/dist/vfs/seed-project.d.ts +62 -0
  381. package/dist/vfs/seed-project.d.ts.map +1 -0
  382. package/dist/vfs/seed-project.js +1045 -0
  383. package/dist/vfs/sqlite-vfs.d.ts +435 -0
  384. package/dist/vfs/sqlite-vfs.d.ts.map +1 -0
  385. package/dist/vfs/sqlite-vfs.js +1670 -0
  386. package/dist/vfs/symlink-registry.d.ts +64 -0
  387. package/dist/vfs/symlink-registry.d.ts.map +1 -0
  388. package/dist/vfs/symlink-registry.js +137 -0
  389. package/dist/wrangler/nimbus-wrangler.d.ts +157 -0
  390. package/dist/wrangler/nimbus-wrangler.d.ts.map +1 -0
  391. package/dist/wrangler/nimbus-wrangler.js +931 -0
  392. package/package.json +77 -0
  393. package/public/_assets/cirrus-plugin-react.bundle.js +70740 -0
  394. package/public/_assets/esbuild-0.24.2.wasm +0 -0
  395. package/public/_assets/real-vite-bundle.js +101478 -0
  396. package/public/_assets/rollup.wasm +0 -0
  397. package/public/favicon.svg +8 -0
  398. package/public/index.html +565 -0
  399. package/public/s/index.html +2379 -0
  400. package/scripts/bundle-esbuild-wasm.mjs +244 -0
  401. package/scripts/bundle-facet-workers.mjs +137 -0
  402. package/scripts/bundle-git.mjs +118 -0
  403. package/scripts/bundle-npm-cjs.mjs +363 -0
  404. package/scripts/bundle-plugin-react.mjs +480 -0
  405. package/scripts/bundle-real-vite.mjs +959 -0
  406. package/scripts/bundle-runtime.mjs +600 -0
  407. package/scripts/bundle-tailwind-play.mjs +130 -0
  408. package/scripts/patch-lifo-ui.mjs +131 -0
@@ -0,0 +1,437 @@
1
+ /**
2
+ * supervisor-rpc.ts — WorkerEntrypoint for facet → supervisor IPC.
3
+ *
4
+ * Exported from index.ts. Facets receive `env.SUPERVISOR` service binding
5
+ * pointing to this class via ctx.exports loopback binding.
6
+ *
7
+ * Props: { doId: string, pid: number }
8
+ * doId — the supervisor DO's durable object ID (for routing)
9
+ * pid — the process ID (for stdout/stderr routing)
10
+ *
11
+ * Methods callable by facets via RPC:
12
+ * readFile(path) → string | null
13
+ * writeFile(path, content) → void
14
+ * stat(path) → { type, size, mtime, mode } | null
15
+ * readdir(path) → { name, type }[]
16
+ * exists(path) → boolean
17
+ * mkdir(path) → void
18
+ * unlink(path) → void
19
+ * writeBatch(payload) → { inodes, chunks } (bulk atomic write)
20
+ * stdout(data) → void (pushed to WebSocket + ring buffer)
21
+ * stderr(data) → void
22
+ * reportExit(code, tail?) → void (called from facet's finally block)
23
+ * prefetch(cwd, entryCode) → Record<string, string>
24
+ */
25
+ import { WorkerEntrypoint } from 'cloudflare:workers';
26
+ // W5: OOM discriminator — record last-known RPC frame on writeBatch entry
27
+ import { setLastRpcFrame } from '../observability/oom-discriminator.js';
28
+ // Phase 2 A'.2 — supervisor in-flight RPC payload byte tracking.
29
+ import { rpcPayloadStart, rpcPayloadEnd } from '../observability/diag-counters.js';
30
+ // W4: R2 cross-tenant npm cache (tarballs + packuments)
31
+ import { R2CacheClient, MAX_R2_TARBALL_BYTES } from '../npm/r2-cache.js';
32
+ import { r2TarballHit, r2TarballMiss, r2PackumentHit, r2PackumentMiss, r2TarballPutOk, r2TarballPutFail, r2PackumentPutOk, r2PackumentPutFail, } from '../observability/diag-counters.js';
33
+ /**
34
+ * Drain the per-call event list captured by R2CacheClient during this
35
+ * SupervisorRPC call.
36
+ *
37
+ * cache-obs-2 (the v2 fold-side flip):
38
+ * We RETURN the drained events to the facet so they propagate via
39
+ * the install-batch-facet result -> installer.ts fold -> DO
40
+ * singleton path. No recursion (return-value flow, not subrequest).
41
+ *
42
+ * The R2CacheClient instance lives only for the duration of one RPC
43
+ * call (constructed fresh in _r2()). Draining its event list at the
44
+ * end of the call is the natural lifecycle boundary.
45
+ */
46
+ function _drainCacheEvents(client) {
47
+ const drained = (client && Array.isArray(client._cacheEvents)) ? client._cacheEvents : [];
48
+ if (client && Array.isArray(client._cacheEvents))
49
+ client._cacheEvents = [];
50
+ return drained;
51
+ }
52
+ /**
53
+ * W5 Lever 5: estimate the byte-cost of a writeBatch payload so the
54
+ * /api/_diag/memory.rpc.lastFrame.payloadBytes field is meaningful.
55
+ * Counts chunk data bytes + per-inode header overhead. Fast (no copy).
56
+ */
57
+ function _estimateWriteBatchBytes(payload) {
58
+ if (!payload)
59
+ return 0;
60
+ let n = 0;
61
+ const chunks = payload.chunks ?? [];
62
+ for (const c of chunks) {
63
+ n += (c?.data?.length ?? c?.data?.byteLength ?? 0);
64
+ }
65
+ const inodes = payload.inodes ?? [];
66
+ for (const i of inodes)
67
+ n += 80 + (i?.path?.length ?? 0);
68
+ return n;
69
+ }
70
+ export class SupervisorRPC extends WorkerEntrypoint {
71
+ /**
72
+ * Cached supervisor DO stub. WorkerEntrypoint instances live for one
73
+ * facet invocation — caching inside the instance is correct per-facet
74
+ * scoping with no cross-invocation leak.
75
+ *
76
+ * Before this cache every method (readFile, writeFile, stdout, ...)
77
+ * called NIMBUS_SESSION.get(id) which mints a fresh RPC stub per call.
78
+ * During npm install / git clone that multiplies to tens of thousands
79
+ * of undisposed stubs per session, exhausting workerd's RPC queue
80
+ * (queueState != ACTIVE fatal). See CRASH-INVESTIGATION-V2.md.
81
+ */
82
+ _stubCache = null;
83
+ /**
84
+ * Get the supervisor DO stub for RPC routing.
85
+ * Uses doId from ctx.props to find the correct NimbusSession instance.
86
+ */
87
+ _getStub() {
88
+ if (this._stubCache)
89
+ return this._stubCache;
90
+ const doId = this.ctx.props?.doId;
91
+ if (!doId)
92
+ throw new Error('SupervisorRPC: missing doId in props');
93
+ const id = this.env.NIMBUS_SESSION.idFromString(doId);
94
+ this._stubCache = this.env.NIMBUS_SESSION.get(id);
95
+ return this._stubCache;
96
+ }
97
+ // ── Filesystem RPC ────────────────────────────────────────────────────
98
+ async readFile(path) {
99
+ return this._getStub()._rpcReadFile(path);
100
+ }
101
+ /**
102
+ * Read a file as raw bytes. Used by the git network facet for binary
103
+ * object/pack files where the text readFile would corrupt content.
104
+ */
105
+ async readFileBytes(path) {
106
+ return this._getStub()._rpcReadFileBytes(path);
107
+ }
108
+ async writeFile(path, content) {
109
+ // binary-fs wave: accept Uint8Array natively. Pre-fix this RPC was
110
+ // string-only, which forced node-shims.ts:writeFileSync to UTF-8-
111
+ // decode every Uint8Array write — mangling bytes ≥ 0x80 to U+FFFD
112
+ // and corrupting binary content. RPC structured-clone handles
113
+ // Uint8Array transparently; downstream _rpcWriteFile also accepts
114
+ // either shape. See /workspace/.seal-internal/2026-05-10-binary-fs/.
115
+ return this._getStub()._rpcWriteFile(path, content);
116
+ }
117
+ async stat(path) {
118
+ return this._getStub()._rpcStat(path);
119
+ }
120
+ async readdir(path) {
121
+ return this._getStub()._rpcReaddir(path);
122
+ }
123
+ async exists(path) {
124
+ return this._getStub()._rpcExists(path);
125
+ }
126
+ async mkdir(path) {
127
+ return this._getStub()._rpcMkdir(path);
128
+ }
129
+ async unlink(path) {
130
+ return this._getStub()._rpcUnlink(path);
131
+ }
132
+ /**
133
+ * Bulk-write all inodes + chunks in ONE transactionSync on the supervisor.
134
+ * Used by facets that buffer writes locally (git clone/fetch/pull).
135
+ *
136
+ * payload shape:
137
+ * {
138
+ * inodes: Array<{path, parentPath, isDir, size, mtime, mode, chunkCount}>,
139
+ * chunks: Array<{path, chunkId, data: Uint8Array}>,
140
+ * deletePaths?: string[]
141
+ * }
142
+ */
143
+ async writeBatch(payload) {
144
+ // W5 Lever 5: record the frame on entry so /api/_diag/memory has
145
+ // last-known-RPC context if the supervisor crashes mid-RPC.
146
+ // Phase 2 A'.2: bump the in-flight RPC payload counter so the
147
+ // supervisor's heap estimate accounts for the bytes claimed by
148
+ // this RPC for the duration of the await.
149
+ const payloadBytes = _estimateWriteBatchBytes(payload);
150
+ setLastRpcFrame('writeBatch', payloadBytes);
151
+ rpcPayloadStart(payloadBytes);
152
+ try {
153
+ return await this._getStub()._rpcWriteBatch(payload);
154
+ }
155
+ finally {
156
+ rpcPayloadEnd(payloadBytes);
157
+ }
158
+ }
159
+ /**
160
+ * W7 — Streaming bulk-write. Same semantics as writeBatch() but the
161
+ * argument is a ReadableStream<Uint8Array> in the W7 wire-protocol
162
+ * (see src/_shared/w7-frame.ts). Bypasses the 32 MiB structured-clone
163
+ * cap entirely; the byte stream traverses the RPC boundary with
164
+ * automatic flow control per Cloudflare RPC docs.
165
+ *
166
+ * Acceptance per audit/sections/MASTER-ROADMAP.md §W7:
167
+ * - Install of 5GB monorepo doesn't hit 32 MiB wall.
168
+ * - Peak heap reduction 48 MiB → 30 MiB on the facet side.
169
+ *
170
+ * The RPC frame itself does NOT pre-clone the stream — workerd
171
+ * transfers the byte stream's underlying-source ownership to the
172
+ * receiver. From the OOM-discriminator's perspective, payloadBytes
173
+ * is unknown up-front (-1 sentinel); it is the supervisor's
174
+ * decoder that observes the actual byte count.
175
+ */
176
+ async writeBatchStream(stream) {
177
+ // The streaming bytes flow with backpressure (W7_HIGHWATER_BYTES =
178
+ // 256 KiB per active encoder per src/_shared/w7-frame.ts:53). The
179
+ // supervisor-resident bound is the queue highwater, NOT the total
180
+ // payload — the LastRpcFrame surfaces -1 to mark "stream"; the
181
+ // RPC payload counter sees the bounded chunk-size estimate.
182
+ const STREAM_RESIDENT_BYTES = 256 * 1024;
183
+ setLastRpcFrame('writeBatchStream', -1);
184
+ rpcPayloadStart(STREAM_RESIDENT_BYTES);
185
+ try {
186
+ return await this._getStub()._rpcWriteBatchStream(stream);
187
+ }
188
+ finally {
189
+ rpcPayloadEnd(STREAM_RESIDENT_BYTES);
190
+ }
191
+ }
192
+ /**
193
+ * Bulk-write npm registry cache entries (resolved packument metadata)
194
+ * in ONE RPC. Used by the resolver-facet to flush a wave of resolved
195
+ * packages back to the supervisor without per-entry round-trips.
196
+ *
197
+ * `entries` is an array of RegistryCacheEntry from src/npm-cache.ts:
198
+ * { name, version, tarballUrl, integrity, depsJson, exportsJson,
199
+ * main, moduleField, binJson, fetchedAt }
200
+ *
201
+ * Returns { written, failed } — partial writes are tolerated; cache
202
+ * is best-effort (resolver correctness depends on the returned
203
+ * ResolvedPackage[], not on cache hits).
204
+ */
205
+ async putRegistryEntries(entries) {
206
+ // Phase 2 A'.2: track the inbound array's resident byte cost.
207
+ // Each registry entry is ~500 B (deps + integrity + tarballUrl);
208
+ // a wave of 100 entries is ~50 KiB. Bounded; counted in
209
+ // streamingBuffersBytes for visibility.
210
+ const REGISTRY_ENTRY_BYTES = 512;
211
+ const payloadBytes = (Array.isArray(entries) ? entries.length : 0) * REGISTRY_ENTRY_BYTES;
212
+ rpcPayloadStart(payloadBytes);
213
+ try {
214
+ return await this._getStub()._rpcPutRegistryEntries(entries);
215
+ }
216
+ finally {
217
+ rpcPayloadEnd(payloadBytes);
218
+ }
219
+ }
220
+ // ── R2-backed npm cache RPC [W4] ─────────────────────────────────────
221
+ //
222
+ // The R2 buckets are bindings on the SUPERVISOR worker (not the
223
+ // facet). The facet only sees what we hang on its `env: { SUPERVISOR }`
224
+ // injection (see src/facet-manager.ts:892 and similar). To expose R2
225
+ // to the facet without pinning a binding stub through the LOADER, we
226
+ // proxy reads/writes through these RPC methods.
227
+ //
228
+ // Counter increments live HERE (supervisor isolate, where diag-counters
229
+ // is module-scoped). The facet itself never sees the counter module.
230
+ //
231
+ // Graceful-degrade: if NPM_TARBALL_CACHE / NPM_PACKUMENT_CACHE bindings
232
+ // aren't configured (deploy without R2 buckets, or local dev), the
233
+ // R2CacheClient falls through to null returns / no-op writes; the
234
+ // facet sees null and uses its existing network-fetch path. No errors,
235
+ // no breakage. See audit/sections/W4-plan.md §8 risk #1.
236
+ /**
237
+ * Build a fresh R2CacheClient bound to this request's env. Cheap to
238
+ * instantiate; does no async work. Called from each R2 RPC method to
239
+ * avoid keeping the client in instance state (the WorkerEntrypoint
240
+ * lifecycle is per-invocation and we want a clean closure each time).
241
+ */
242
+ _r2() {
243
+ const tar = this.env?.NPM_TARBALL_CACHE ?? null;
244
+ const pkm = this.env?.NPM_PACKUMENT_CACHE ?? null;
245
+ return new R2CacheClient(tar, pkm);
246
+ }
247
+ /**
248
+ * Look up a tarball in the R2 cross-tenant cache. Returns
249
+ * { bytes, events } where:
250
+ * - bytes: Uint8Array on hit, null on miss/oversize/no-binding
251
+ * - events: L2/L3 hit/miss tuples captured during this lookup
252
+ *
253
+ * cache-obs-2: return-shape change from `Uint8Array | null` to
254
+ * `{ bytes, events }`. Facets propagate events into their result
255
+ * for installer.ts to fold into the DO singleton (mirroring the
256
+ * recordR2RaceCounters pattern). Without this enrichment the
257
+ * L2/L3 distinction is supervisor-side knowledge only.
258
+ *
259
+ * The caller is responsible for integrity-verifying bytes before
260
+ * unpacking — same posture as the network-fetch path. The events
261
+ * list is structured-clone-safe (plain objects + strings + numbers).
262
+ */
263
+ async getCachedTarball(name, version) {
264
+ const r2 = this._r2();
265
+ const bytes = await r2.getTarball(name, version);
266
+ const events = _drainCacheEvents(r2);
267
+ if (bytes && bytes.length > 0 && bytes.length <= MAX_R2_TARBALL_BYTES) {
268
+ r2TarballHit();
269
+ return { bytes, events };
270
+ }
271
+ r2TarballMiss();
272
+ return { bytes: null, events };
273
+ }
274
+ /**
275
+ * Store a tarball in the R2 cross-tenant cache. Best-effort: on R2
276
+ * write failure, returns false but the install pipeline continues
277
+ * unaffected. Caller passes the bytes already verified against the
278
+ * resolver's integrity hash.
279
+ */
280
+ async putCachedTarball(name, version, bytes) {
281
+ // L4 hits are captured FACET-SIDE in cache-obs-2 — the facet did
282
+ // the registry fetch, so it can push the L4 event directly into
283
+ // its own cacheStatEvents list before calling putCachedTarball.
284
+ // This RPC remains a one-way write (returns bool); the L4 event
285
+ // does NOT flow through this return path.
286
+ const r2 = this._r2();
287
+ const ok = await r2.putTarball(name, version, bytes);
288
+ if (ok)
289
+ r2TarballPutOk();
290
+ else
291
+ r2TarballPutFail();
292
+ return ok;
293
+ }
294
+ /**
295
+ * Look up a packument in the R2 cross-tenant cache. Returns
296
+ * { json, ageMs, expired } or null on miss / missing binding.
297
+ *
298
+ * Caller MUST honour the `expired` flag: only treat as a hot-path
299
+ * hit when expired === false. Stale data is returned only for
300
+ * stale-while-error fallback semantics.
301
+ */
302
+ /**
303
+ * Look up a packument in the R2 cross-tenant cache. Returns
304
+ * { cached, events } where:
305
+ * - cached: { json, ageMs, expired } on hit, null on miss/no-binding
306
+ * - events: L2/L3 hit/miss tuples captured during this lookup
307
+ *
308
+ * cache-obs-2: return-shape change from
309
+ * `{json, ageMs, expired} | null` to
310
+ * `{ cached: {json,ageMs,expired} | null, events: ... }`.
311
+ *
312
+ * Caller MUST honour the `cached.expired` flag the same as v1
313
+ * (only treat as hot-path hit when expired === false). Events are
314
+ * recorded regardless of expiration — an expired L2 hit is still
315
+ * recorded as 'hit' at the L2 tier; the staleness is a separate axis.
316
+ */
317
+ async getCachedPackument(name) {
318
+ const r2 = this._r2();
319
+ const cached = await r2.getPackument(name);
320
+ const events = _drainCacheEvents(r2);
321
+ if (cached && !cached.expired) {
322
+ r2PackumentHit();
323
+ return { cached, events };
324
+ }
325
+ if (cached && cached.expired) {
326
+ // Treat expired as a miss for hit-rate accounting; still return
327
+ // the data so callers can use it for stale-while-error.
328
+ r2PackumentMiss();
329
+ return { cached, events };
330
+ }
331
+ r2PackumentMiss();
332
+ return { cached: null, events };
333
+ }
334
+ /**
335
+ * Store a packument in the R2 cross-tenant cache with a TTL stamp.
336
+ * Best-effort. Returns true on success.
337
+ */
338
+ async putCachedPackument(name, json) {
339
+ // L4 hit captured facet-side (the facet did the registry fetch).
340
+ // This RPC is one-way write.
341
+ const r2 = this._r2();
342
+ const ok = await r2.putPackument(name, json);
343
+ if (ok)
344
+ r2PackumentPutOk();
345
+ else
346
+ r2PackumentPutFail();
347
+ return ok;
348
+ }
349
+ /**
350
+ * Admin: purge a single tarball from R2. Used in incident response.
351
+ */
352
+ async purgeCachedTarball(name, version) {
353
+ const r2 = this._r2();
354
+ return r2.deleteTarball(name, version);
355
+ }
356
+ /**
357
+ * Admin: purge a single packument from R2.
358
+ */
359
+ async purgeCachedPackument(name) {
360
+ const r2 = this._r2();
361
+ return r2.deletePackument(name);
362
+ }
363
+ // ── Process I/O ───────────────────────────────────────────────────────
364
+ async stdout(data) {
365
+ return this._getStub()._rpcStdout(this.ctx.props?.pid || 0, data);
366
+ }
367
+ async stderr(data) {
368
+ return this._getStub()._rpcStderr(this.ctx.props?.pid || 0, data);
369
+ }
370
+ /**
371
+ * Report process exit to the supervisor. Called from the facet's own
372
+ * `finally` block after I/O has drained. The supervisor uses this to
373
+ * stamp the log buffer and, for non-zero exits, emit a terminal dump.
374
+ *
375
+ * `tail` is an optional trailing stderr string — useful when the facet
376
+ * has error state it couldn't stream in-band (rare; main path drains
377
+ * via __pendingIO first).
378
+ */
379
+ async reportExit(code, tail) {
380
+ const pid = this.ctx.props?.pid || 0;
381
+ return this._getStub()._rpcReportExit(pid, code, tail || '');
382
+ }
383
+ // ── Prefetch ──────────────────────────────────────────────────────────
384
+ async prefetch(cwd, entryCode) {
385
+ return this._getStub()._rpcPrefetch(cwd, entryCode);
386
+ }
387
+ // ── Port registration ─────────────────────────────────────────────────
388
+ async registerPort(port) {
389
+ return this._getStub()._rpcRegisterPort(this.ctx.props?.pid || 0, port);
390
+ }
391
+ async unregisterPort(port) {
392
+ return this._getStub()._rpcUnregisterPort(port);
393
+ }
394
+ // ── Esbuild transform ─────────────────────────────────────────────────
395
+ async transform(code, loader) {
396
+ return this._getStub()._rpcTransform(code, loader);
397
+ }
398
+ // ── child_process [W8 Phase 1] ────────────────────────────────────────
399
+ //
400
+ // The parent facet's `child_process.spawn` shim (node-shims.ts) calls
401
+ // these methods. They delegate to NimbusSession._rpcCp* methods which
402
+ // route through the shared FacetProcessManager.
403
+ //
404
+ // Contract documented in audit/sections/W8-plan.md §2 / §8.5.
405
+ async cpSpawn(req) {
406
+ return this._getStub()._rpcCpSpawn(req);
407
+ }
408
+ async cpStdinWrite(childPid, data) {
409
+ return this._getStub()._rpcCpStdinWrite(childPid, data);
410
+ }
411
+ async cpStdinEnd(childPid) {
412
+ return this._getStub()._rpcCpStdinEnd(childPid);
413
+ }
414
+ async cpReadOutput(childPid, fd, sinceSeq, waitMs) {
415
+ return this._getStub()._rpcCpReadOutput(childPid, fd, sinceSeq, waitMs);
416
+ }
417
+ async cpDrainOutput(childPid) {
418
+ return this._getStub()._rpcCpDrainOutput(childPid);
419
+ }
420
+ async cpKill(childPid, signal) {
421
+ return this._getStub()._rpcCpKill(childPid, signal);
422
+ }
423
+ async cpWait(childPid, waitMs) {
424
+ return this._getStub()._rpcCpWait(childPid, waitMs);
425
+ }
426
+ /**
427
+ * arch-gaps gap #1: dispatch a single cp.spawn request inline using
428
+ * the existing pure-builtin / facet-direct logic, returning final
429
+ * stdout/stderr/exitCode (NOT streamed via hooks). Called from
430
+ * spawn-facet.ts:runSpawnInIsolate inside a fresh Worker Loader
431
+ * isolate to delegate the actual command execution back to the
432
+ * supervisor while keeping the dispatch envelope in a fresh isolate.
433
+ */
434
+ async cpDispatchInline(req, kind) {
435
+ return this._getStub()._rpcCpDispatchInline(req, kind);
436
+ }
437
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * ws-hibernation-config.ts — W9 (CF research §C.3 + §C.4) configuration
3
+ * for setWebSocketAutoResponse + setHibernatableWebSocketEventTimeout.
4
+ *
5
+ * Why a dedicated module:
6
+ * - NimbusSession's constructor is already crowded; the calls have
7
+ * specific failure modes (workerd version dependence, optional
8
+ * globals) that deserve isolation.
9
+ * - Unit-testable in Node by passing a mock ctx — the constructor
10
+ * itself can't be (it pulls cloudflare:workers).
11
+ *
12
+ * What this does, in order:
13
+ * 1. setWebSocketAutoResponse(WebSocketRequestResponsePair('ping','pong'))
14
+ * — vite HMR clients ping every 30s and idle xterm tabs ping per
15
+ * minute. Without auto-response, every ping wakes the actor from
16
+ * hibernation: ~2880 wakes/day per idle tab. After this, zero
17
+ * billable wakes for matched ping/pong frames. Auto-response config
18
+ * survives hibernation per the STOR/Durable Objects WebSocket
19
+ * Primer (wiki page id 1372566651).
20
+ * 2. setHibernatableWebSocketEventTimeout(5000) — bound a single
21
+ * hibernation message handler. Long-running work runs in facets
22
+ * with their own CPU budget; the supervisor's WS handlers should
23
+ * enqueue then return. 5 s recommended in CF research §C.3.
24
+ *
25
+ * Both calls are gated on try/catch:
26
+ * - workerd builds before mid-2024 don't expose either method.
27
+ * - WebSocketRequestResponsePair is a workerd global; absent in Node.
28
+ * Failure is reported honestly via the return value so /api/_diag/memory
29
+ * can show whether the runtime supported the configuration.
30
+ */
31
+ /**
32
+ * Recommended hibernation event timeout (ms). 5 s per CF research §C.3
33
+ * — long enough for the heaviest non-facet WS message handler observed
34
+ * in W5 telemetry (~120 ms p99 for a heavy autocomplete request), short
35
+ * enough to bound a runaway handler before it pins the actor.
36
+ */
37
+ export declare const NIMBUS_HIBERNATION_EVENT_TIMEOUT_MS = 5000;
38
+ /** Public ping/pong contract — clients send `ping`, receive `pong`. */
39
+ export declare const WS_AUTO_RESPONSE_REQUEST = "ping";
40
+ export declare const WS_AUTO_RESPONSE_RESPONSE = "pong";
41
+ export interface WsHibernationConfigResult {
42
+ /** True iff `setWebSocketAutoResponse` ran without throwing. */
43
+ autoResponseConfigured: boolean;
44
+ /**
45
+ * The timeout (in ms) we successfully set, or null if the call wasn't
46
+ * available / threw. Reported separately from autoResponseConfigured
47
+ * so a partial-support workerd shows the partial truth.
48
+ */
49
+ timeoutSetMs: number | null;
50
+ /** Optional error message — human-readable, never thrown. */
51
+ autoResponseError?: string;
52
+ timeoutError?: string;
53
+ }
54
+ /**
55
+ * Configure WS hibernation behaviours on a DurableObjectState. Idempotent
56
+ * — safe to call multiple times. Returns a result that NimbusSession
57
+ * surfaces via /api/_diag/memory under the `hib` key.
58
+ *
59
+ * The `ctx` parameter is structurally typed (anything with the right
60
+ * methods works) so this module stays Node-testable. In production the
61
+ * caller passes the real `this.ctx` from NimbusSession's constructor.
62
+ */
63
+ export declare function configureWsHibernation(ctx: any): WsHibernationConfigResult;
64
+ //# sourceMappingURL=ws-hibernation-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-hibernation-config.d.ts","sourceRoot":"","sources":["../../src/session/ws-hibernation-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC,OAAO,CAAC;AAExD,uEAAuE;AACvE,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAC/C,eAAO,MAAM,yBAAyB,SAAS,CAAC;AAEhD,MAAM,WAAW,yBAAyB;IACxC,gEAAgE;IAChE,sBAAsB,EAAE,OAAO,CAAC;IAChC;;;;OAIG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,GAAG,GACP,yBAAyB,CAqC3B"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * ws-hibernation-config.ts — W9 (CF research §C.3 + §C.4) configuration
3
+ * for setWebSocketAutoResponse + setHibernatableWebSocketEventTimeout.
4
+ *
5
+ * Why a dedicated module:
6
+ * - NimbusSession's constructor is already crowded; the calls have
7
+ * specific failure modes (workerd version dependence, optional
8
+ * globals) that deserve isolation.
9
+ * - Unit-testable in Node by passing a mock ctx — the constructor
10
+ * itself can't be (it pulls cloudflare:workers).
11
+ *
12
+ * What this does, in order:
13
+ * 1. setWebSocketAutoResponse(WebSocketRequestResponsePair('ping','pong'))
14
+ * — vite HMR clients ping every 30s and idle xterm tabs ping per
15
+ * minute. Without auto-response, every ping wakes the actor from
16
+ * hibernation: ~2880 wakes/day per idle tab. After this, zero
17
+ * billable wakes for matched ping/pong frames. Auto-response config
18
+ * survives hibernation per the STOR/Durable Objects WebSocket
19
+ * Primer (wiki page id 1372566651).
20
+ * 2. setHibernatableWebSocketEventTimeout(5000) — bound a single
21
+ * hibernation message handler. Long-running work runs in facets
22
+ * with their own CPU budget; the supervisor's WS handlers should
23
+ * enqueue then return. 5 s recommended in CF research §C.3.
24
+ *
25
+ * Both calls are gated on try/catch:
26
+ * - workerd builds before mid-2024 don't expose either method.
27
+ * - WebSocketRequestResponsePair is a workerd global; absent in Node.
28
+ * Failure is reported honestly via the return value so /api/_diag/memory
29
+ * can show whether the runtime supported the configuration.
30
+ */
31
+ /**
32
+ * Recommended hibernation event timeout (ms). 5 s per CF research §C.3
33
+ * — long enough for the heaviest non-facet WS message handler observed
34
+ * in W5 telemetry (~120 ms p99 for a heavy autocomplete request), short
35
+ * enough to bound a runaway handler before it pins the actor.
36
+ */
37
+ export const NIMBUS_HIBERNATION_EVENT_TIMEOUT_MS = 5000;
38
+ /** Public ping/pong contract — clients send `ping`, receive `pong`. */
39
+ export const WS_AUTO_RESPONSE_REQUEST = 'ping';
40
+ export const WS_AUTO_RESPONSE_RESPONSE = 'pong';
41
+ /**
42
+ * Configure WS hibernation behaviours on a DurableObjectState. Idempotent
43
+ * — safe to call multiple times. Returns a result that NimbusSession
44
+ * surfaces via /api/_diag/memory under the `hib` key.
45
+ *
46
+ * The `ctx` parameter is structurally typed (anything with the right
47
+ * methods works) so this module stays Node-testable. In production the
48
+ * caller passes the real `this.ctx` from NimbusSession's constructor.
49
+ */
50
+ export function configureWsHibernation(ctx) {
51
+ const result = {
52
+ autoResponseConfigured: false,
53
+ timeoutSetMs: null,
54
+ };
55
+ // Step 1: auto-response.
56
+ const Pair = globalThis.WebSocketRequestResponsePair;
57
+ if (typeof ctx?.setWebSocketAutoResponse === 'function' && typeof Pair === 'function') {
58
+ try {
59
+ const pair = new Pair(WS_AUTO_RESPONSE_REQUEST, WS_AUTO_RESPONSE_RESPONSE);
60
+ ctx.setWebSocketAutoResponse(pair);
61
+ result.autoResponseConfigured = true;
62
+ }
63
+ catch (e) {
64
+ result.autoResponseError = e?.message || String(e);
65
+ }
66
+ }
67
+ else if (typeof Pair !== 'function') {
68
+ result.autoResponseError = 'WebSocketRequestResponsePair global not available';
69
+ }
70
+ else {
71
+ result.autoResponseError = 'ctx.setWebSocketAutoResponse not available';
72
+ }
73
+ // Step 2: hibernation event timeout. Independent of auto-response —
74
+ // a workerd that lacks the global may still support the timeout
75
+ // method, and vice versa.
76
+ if (typeof ctx?.setHibernatableWebSocketEventTimeout === 'function') {
77
+ try {
78
+ ctx.setHibernatableWebSocketEventTimeout(NIMBUS_HIBERNATION_EVENT_TIMEOUT_MS);
79
+ result.timeoutSetMs = NIMBUS_HIBERNATION_EVENT_TIMEOUT_MS;
80
+ }
81
+ catch (e) {
82
+ result.timeoutError = e?.message || String(e);
83
+ }
84
+ }
85
+ else {
86
+ result.timeoutError = 'ctx.setHibernatableWebSocketEventTimeout not available';
87
+ }
88
+ return result;
89
+ }