@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,36 @@
1
+ /**
2
+ * router-basename.ts — Auto-inject React Router `basename` for the /preview/
3
+ * base path so `<NavLink to="/docs">` lands at `/preview/docs` with no
4
+ * additional config in the user's source.
5
+ *
6
+ * Applied at VFS serve time inside vite-dev-server.ts `serveTransformed()`,
7
+ * BEFORE esbuild's TS/JSX transform (source is easier to regex on).
8
+ *
9
+ * Patterns handled:
10
+ * A. createBrowserRouter(routes) → inject { basename }
11
+ * B. createBrowserRouter(routes, { ... }) → merge if no basename
12
+ * C. <BrowserRouter ...> → add basename attr
13
+ * D. <BrowserRouter basename="x"> → leave alone
14
+ *
15
+ * Never overrides user-set values. Opt-out:
16
+ * - Explicit basename in source (per pattern)
17
+ * - Comment `// nimbus-no-basename` anywhere in the file
18
+ * - `nimbusInjectBasename: false` in vite.config.ts (plumbed by caller)
19
+ *
20
+ * Scope guard: only transforms likely router entry files (main.tsx, index.tsx,
21
+ * App.tsx, root.tsx, router.tsx). node_modules is excluded by the caller.
22
+ */
23
+ /**
24
+ * Should this VFS path be considered for router-basename injection?
25
+ * Fast filter before we pay for regex scans on the file body.
26
+ */
27
+ export declare function shouldProcessForRouter(vfsPath: string): boolean;
28
+ /**
29
+ * Inject a `basename` into React Router `createBrowserRouter` / <BrowserRouter>
30
+ * calls in the source, unless the user has set one or opted out.
31
+ *
32
+ * Returns the transformed source. Always safe — if no pattern matches,
33
+ * returns the input unchanged.
34
+ */
35
+ export declare function injectRouterBasename(src: string, basePath: string): string;
36
+ //# sourceMappingURL=router-basename.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-basename.d.ts","sourceRoot":"","sources":["../../src/runtime/router-basename.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AA6BH;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO/D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwE1E"}
@@ -0,0 +1,310 @@
1
+ /**
2
+ * router-basename.ts — Auto-inject React Router `basename` for the /preview/
3
+ * base path so `<NavLink to="/docs">` lands at `/preview/docs` with no
4
+ * additional config in the user's source.
5
+ *
6
+ * Applied at VFS serve time inside vite-dev-server.ts `serveTransformed()`,
7
+ * BEFORE esbuild's TS/JSX transform (source is easier to regex on).
8
+ *
9
+ * Patterns handled:
10
+ * A. createBrowserRouter(routes) → inject { basename }
11
+ * B. createBrowserRouter(routes, { ... }) → merge if no basename
12
+ * C. <BrowserRouter ...> → add basename attr
13
+ * D. <BrowserRouter basename="x"> → leave alone
14
+ *
15
+ * Never overrides user-set values. Opt-out:
16
+ * - Explicit basename in source (per pattern)
17
+ * - Comment `// nimbus-no-basename` anywhere in the file
18
+ * - `nimbusInjectBasename: false` in vite.config.ts (plumbed by caller)
19
+ *
20
+ * Scope guard: only transforms likely router entry files (main.tsx, index.tsx,
21
+ * App.tsx, root.tsx, router.tsx). node_modules is excluded by the caller.
22
+ */
23
+ /**
24
+ * Opt-out comment pattern. Matches a line-leading `//` comment containing the
25
+ * directive. Intentionally strict so that mere mentions of the directive in
26
+ * quoted strings, JSX text, or long-form comments do not accidentally disable
27
+ * injection (e.g., docstrings that reference the opt-out won't opt out).
28
+ *
29
+ * Examples that trigger opt-out:
30
+ * // nimbus-no-basename
31
+ * // nimbus-no-basename
32
+ * // nimbus-no-basename — disables auto-inject here
33
+ *
34
+ * Examples that DO NOT trigger (by design):
35
+ * const s = "// nimbus-no-basename"; // string literal
36
+ * // add the comment "// nimbus-no-basename" // quoted inside comment
37
+ */
38
+ const OPT_OUT_RE = /^[ \t]*\/\/[ \t]*nimbus-no-basename\b/m;
39
+ /** Files that are likely router entries. Path is the VFS path. */
40
+ const ENTRY_PATTERNS = [
41
+ /(?:^|\/)main\.(tsx|ts|jsx|js|mjs)$/i,
42
+ /(?:^|\/)index\.(tsx|ts|jsx|js|mjs)$/i,
43
+ /(?:^|\/)App\.(tsx|ts|jsx|js|mjs)$/i,
44
+ /(?:^|\/)root\.(tsx|ts|jsx|js|mjs)$/i,
45
+ /(?:^|\/)router(?:\.config)?\.(tsx|ts|jsx|js|mjs)$/i,
46
+ /(?:^|\/)routes\.(tsx|ts|jsx|js|mjs)$/i,
47
+ ];
48
+ /**
49
+ * Should this VFS path be considered for router-basename injection?
50
+ * Fast filter before we pay for regex scans on the file body.
51
+ */
52
+ export function shouldProcessForRouter(vfsPath) {
53
+ if (!vfsPath)
54
+ return false;
55
+ // Never touch vendored code — our seed/user code lives under src/, not node_modules.
56
+ if (vfsPath.includes('/node_modules/'))
57
+ return false;
58
+ if (vfsPath.startsWith('node_modules/'))
59
+ return false;
60
+ const normalized = '/' + vfsPath.replace(/^\/+/, '');
61
+ return ENTRY_PATTERNS.some((re) => re.test(normalized));
62
+ }
63
+ /**
64
+ * Inject a `basename` into React Router `createBrowserRouter` / <BrowserRouter>
65
+ * calls in the source, unless the user has set one or opted out.
66
+ *
67
+ * Returns the transformed source. Always safe — if no pattern matches,
68
+ * returns the input unchanged.
69
+ */
70
+ export function injectRouterBasename(src, basePath) {
71
+ // Fast short-circuits
72
+ if (!src || src.length === 0)
73
+ return src;
74
+ if (OPT_OUT_RE.test(src))
75
+ return src;
76
+ // Only scan further if the source MENTIONS the relevant router APIs.
77
+ // Using substring checks (not regex) to keep the fast path cheap.
78
+ const mentionsFactory = src.indexOf('createBrowserRouter') !== -1;
79
+ const mentionsComponent = src.indexOf('BrowserRouter') !== -1;
80
+ if (!mentionsFactory && !mentionsComponent)
81
+ return src;
82
+ const basenameLiteral = JSON.stringify(basePath);
83
+ let out = src;
84
+ // ── Pattern B first: createBrowserRouter(routes, { ...options })
85
+ // Handled first so Pattern A (single-arg) doesn't accidentally gobble the
86
+ // second-arg object. Non-greedy body match to stop at the first balanced-
87
+ // looking `}` — good enough for typical hand-written code.
88
+ //
89
+ // Matches:
90
+ // createBrowserRouter(routes, {})
91
+ // createBrowserRouter(routes, { future: { ... } })
92
+ // createBrowserRouter([...], {\n basename: '/x',\n})
93
+ //
94
+ // Multi-line safe because we use [\s\S].
95
+ out = out.replace(/\bcreateBrowserRouter\s*\(\s*([\s\S]*?)\s*,\s*\{([\s\S]*?)\}\s*\)/g, (match, routes, opts) => {
96
+ // Balance check: if `routes` contains unmatched parens, our regex ate too much.
97
+ if (!isBalanced(routes))
98
+ return match;
99
+ if (/\bbasename\s*:/.test(opts))
100
+ return match; // user set basename
101
+ // Trim opts to make formatting tidy; add leading space for readability.
102
+ const trimmedOpts = opts.replace(/^[\s,]*/, '').replace(/[\s,]*$/, '');
103
+ const body = trimmedOpts
104
+ ? `basename: ${basenameLiteral}, ${trimmedOpts}`
105
+ : `basename: ${basenameLiteral}`;
106
+ return `createBrowserRouter(${routes}, { ${body} })`;
107
+ });
108
+ // ── Pattern A: createBrowserRouter(routes) — single-arg form
109
+ // Must NOT match calls that already have a second arg (handled by B above).
110
+ // Detect "single arg" by looking at the char right after the first balanced-
111
+ // looking close — if it's `)`, no second arg.
112
+ //
113
+ // We implement this manually rather than with a clever regex: scan for
114
+ // `createBrowserRouter(`, find the matching close paren, and check whether
115
+ // a comma (at depth 0) exists between them.
116
+ out = scanAndReplaceCreateBrowserRouterSingleArg(out, basenameLiteral);
117
+ // ── Pattern C: <BrowserRouter ...> and <BrowserRouter />
118
+ // Adds `basename="/preview"` if not already present. Opening tag only.
119
+ //
120
+ // Matches (examples):
121
+ // <BrowserRouter> attrs="", end=">"
122
+ // <BrowserRouter /> attrs="", end=" />"
123
+ // <BrowserRouter window={w}> attrs=" window={w}", end=">"
124
+ // <BrowserRouter\n x={y}\n> attrs="\n x={y}\n", end=">"
125
+ //
126
+ // The regex keeps `attrs` non-empty only when real attribute chars
127
+ // exist; bare whitespace before `/>` ends up in `end` so we preserve
128
+ // the user's original whitespace style.
129
+ out = out.replace(/<BrowserRouter((?:\s+[^>\/\s][^>]*?)?)(\s*\/?\s*>)/g, (match, attrs, end) => {
130
+ if (attrs && /\bbasename\s*=/.test(attrs))
131
+ return match;
132
+ // Inject basename AFTER the attribute block (before `end`'s leading
133
+ // whitespace). `attrs` is either empty or starts with whitespace.
134
+ return `<BrowserRouter${attrs} basename=${basenameLiteral}${end}`;
135
+ });
136
+ return out;
137
+ }
138
+ // ── Helpers ─────────────────────────────────────────────────────────────
139
+ /** Check that parens + brackets + braces in `s` are balanced. */
140
+ function isBalanced(s) {
141
+ let p = 0, b = 0, c = 0;
142
+ for (let i = 0; i < s.length; i++) {
143
+ const ch = s[i];
144
+ if (ch === '(')
145
+ p++;
146
+ else if (ch === ')')
147
+ p--;
148
+ else if (ch === '[')
149
+ b++;
150
+ else if (ch === ']')
151
+ b--;
152
+ else if (ch === '{')
153
+ c++;
154
+ else if (ch === '}')
155
+ c--;
156
+ if (p < 0 || b < 0 || c < 0)
157
+ return false;
158
+ }
159
+ return p === 0 && b === 0 && c === 0;
160
+ }
161
+ /**
162
+ * Find every `createBrowserRouter(ARGS)` where ARGS at depth-0 contains no
163
+ * comma (i.e. exactly one argument), and replace with
164
+ * `createBrowserRouter(ARGS, { basename: "..." })`.
165
+ *
166
+ * Skips any call whose argument list has a second (or more) comma-separated
167
+ * top-level item, since Pattern B handled those.
168
+ */
169
+ function scanAndReplaceCreateBrowserRouterSingleArg(src, basenameLiteral) {
170
+ const needle = 'createBrowserRouter';
171
+ let out = '';
172
+ let i = 0;
173
+ while (i < src.length) {
174
+ const hit = src.indexOf(needle, i);
175
+ if (hit < 0) {
176
+ out += src.slice(i);
177
+ break;
178
+ }
179
+ // Ensure this is a standalone identifier (not "myCreateBrowserRouter" or
180
+ // "createBrowserRouterFoo"). Check the chars immediately before and after.
181
+ const before = hit > 0 ? src[hit - 1] : '';
182
+ const after = src[hit + needle.length];
183
+ const isIdentChar = (c) => /[\w$]/.test(c);
184
+ if (isIdentChar(before) || isIdentChar(after)) {
185
+ out += src.slice(i, hit + needle.length);
186
+ i = hit + needle.length;
187
+ continue;
188
+ }
189
+ // Skip optional whitespace, then require `(`.
190
+ let j = hit + needle.length;
191
+ while (j < src.length && /\s/.test(src[j]))
192
+ j++;
193
+ if (src[j] !== '(') {
194
+ out += src.slice(i, j);
195
+ i = j;
196
+ continue;
197
+ }
198
+ // Find matching `)` at depth 0 of this `(`, tracking nested parens,
199
+ // brackets, braces, and string/template-literal bodies. Also note if a
200
+ // depth-0 `,` exists (→ multi-arg form, skip; Pattern B handled it).
201
+ const parenStart = j;
202
+ let depthP = 1, depthB = 0, depthC = 0;
203
+ let hasTopLevelComma = false;
204
+ let k = parenStart + 1;
205
+ let strQuote = null;
206
+ let inLineComment = false;
207
+ let inBlockComment = false;
208
+ let inTemplate = false;
209
+ // Note: we skip template-literal interpolation depth tracking for simplicity.
210
+ // If a user embeds `createBrowserRouter(...)` inside a template literal, we
211
+ // just leave it alone (rare pattern).
212
+ while (k < src.length) {
213
+ const ch = src[k];
214
+ const nx = src[k + 1];
215
+ if (inLineComment) {
216
+ if (ch === '\n')
217
+ inLineComment = false;
218
+ k++;
219
+ continue;
220
+ }
221
+ if (inBlockComment) {
222
+ if (ch === '*' && nx === '/') {
223
+ inBlockComment = false;
224
+ k += 2;
225
+ continue;
226
+ }
227
+ k++;
228
+ continue;
229
+ }
230
+ if (strQuote) {
231
+ if (ch === '\\') {
232
+ k += 2;
233
+ continue;
234
+ }
235
+ if (ch === strQuote)
236
+ strQuote = null;
237
+ k++;
238
+ continue;
239
+ }
240
+ if (inTemplate) {
241
+ if (ch === '\\') {
242
+ k += 2;
243
+ continue;
244
+ }
245
+ if (ch === '`')
246
+ inTemplate = false;
247
+ k++;
248
+ continue;
249
+ }
250
+ if (ch === '/' && nx === '/') {
251
+ inLineComment = true;
252
+ k += 2;
253
+ continue;
254
+ }
255
+ if (ch === '/' && nx === '*') {
256
+ inBlockComment = true;
257
+ k += 2;
258
+ continue;
259
+ }
260
+ if (ch === '"' || ch === "'") {
261
+ strQuote = ch;
262
+ k++;
263
+ continue;
264
+ }
265
+ if (ch === '`') {
266
+ inTemplate = true;
267
+ k++;
268
+ continue;
269
+ }
270
+ if (ch === '(')
271
+ depthP++;
272
+ else if (ch === ')') {
273
+ depthP--;
274
+ if (depthP === 0 && depthB === 0 && depthC === 0)
275
+ break;
276
+ }
277
+ else if (ch === '[')
278
+ depthB++;
279
+ else if (ch === ']')
280
+ depthB--;
281
+ else if (ch === '{')
282
+ depthC++;
283
+ else if (ch === '}')
284
+ depthC--;
285
+ else if (ch === ',' && depthP === 1 && depthB === 0 && depthC === 0) {
286
+ hasTopLevelComma = true;
287
+ }
288
+ k++;
289
+ }
290
+ if (depthP !== 0) {
291
+ // Unbalanced — can't reason about this call. Emit as-is.
292
+ out += src.slice(i, k);
293
+ i = k;
294
+ continue;
295
+ }
296
+ const parenEnd = k; // index of the matching `)`
297
+ if (hasTopLevelComma) {
298
+ // Multi-arg — Pattern B already processed it (or refused to). Skip.
299
+ out += src.slice(i, parenEnd + 1);
300
+ i = parenEnd + 1;
301
+ continue;
302
+ }
303
+ // Single-arg form — inject `, { basename: "..." }` before the `)`.
304
+ out += src.slice(i, parenEnd);
305
+ out += `, { basename: ${basenameLiteral} }`;
306
+ out += ')';
307
+ i = parenEnd + 1;
308
+ }
309
+ return out;
310
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ruby-repl.ts — Ruby REPL adapter.
3
+ *
4
+ * Mirrors python-repl.ts pattern: a long-lived child-facet holds the
5
+ * Ruby VM (instantiated once at facet module-init via the ruby-runner
6
+ * preamble) and per-push calls go through __rubyRun with a generated
7
+ * line wrapper.
8
+ *
9
+ * Approach to result-handling + incomplete detection:
10
+ * - The wrapper Ruby code captures the LAST line as an expression
11
+ * where possible (via Kernel#eval at TOPLEVEL_BINDING) and writes
12
+ * `inspect`'d result to stdout if non-nil.
13
+ * - SyntaxError-incomplete detection: try Ripper.sexp(src); if nil,
14
+ * the source has an unterminated construct and we signal
15
+ * 'incomplete'. Ripper ships with ruby.wasm 2.9.x stdlib.
16
+ * Fallback: if Ripper is unavailable, parse the SyntaxError
17
+ * message for "unexpected end-of-input" / "unterminated" patterns.
18
+ * - SystemExit: rescue and return exit_code.
19
+ *
20
+ * Architecture aligned with master plan §1 A5 (~280 LOC).
21
+ *
22
+ * NOT supported in v1 (deferred):
23
+ * - Top-level Ractor / Fiber.yield at the REPL.
24
+ * - Ctrl-C mid-execution.
25
+ * - irb history pickling.
26
+ */
27
+ import type { SqliteVFS } from '../vfs/sqlite-vfs.js';
28
+ import type { FacetManager } from '../facets/manager.js';
29
+ import type { WebSocketTerminal } from '../facets/ws-terminal.js';
30
+ export interface RubyReplDeps {
31
+ facetMgr: FacetManager;
32
+ vfs: SqliteVFS;
33
+ terminal: WebSocketTerminal;
34
+ /** Per-user-VFS install dir for the ruby blob. */
35
+ installRoot: string;
36
+ }
37
+ /**
38
+ * Top-level wrapper: builds a Ruby REPL adapter, drives a ReplSession
39
+ * to completion, returns the exit code. Called from the ruby factory's
40
+ * wrapper in init.ts when `ruby` is invoked with no args.
41
+ */
42
+ export declare function runRubyRepl(deps: RubyReplDeps): Promise<number>;
43
+ //# sourceMappingURL=ruby-repl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruby-repl.d.ts","sourceRoot":"","sources":["../../src/runtime/ruby-repl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAMlE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;CACrB;AAuND;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAIrE"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * ruby-repl.ts — Ruby REPL adapter.
3
+ *
4
+ * Mirrors python-repl.ts pattern: a long-lived child-facet holds the
5
+ * Ruby VM (instantiated once at facet module-init via the ruby-runner
6
+ * preamble) and per-push calls go through __rubyRun with a generated
7
+ * line wrapper.
8
+ *
9
+ * Approach to result-handling + incomplete detection:
10
+ * - The wrapper Ruby code captures the LAST line as an expression
11
+ * where possible (via Kernel#eval at TOPLEVEL_BINDING) and writes
12
+ * `inspect`'d result to stdout if non-nil.
13
+ * - SyntaxError-incomplete detection: try Ripper.sexp(src); if nil,
14
+ * the source has an unterminated construct and we signal
15
+ * 'incomplete'. Ripper ships with ruby.wasm 2.9.x stdlib.
16
+ * Fallback: if Ripper is unavailable, parse the SyntaxError
17
+ * message for "unexpected end-of-input" / "unterminated" patterns.
18
+ * - SystemExit: rescue and return exit_code.
19
+ *
20
+ * Architecture aligned with master plan §1 A5 (~280 LOC).
21
+ *
22
+ * NOT supported in v1 (deferred):
23
+ * - Top-level Ractor / Fiber.yield at the REPL.
24
+ * - Ctrl-C mid-execution.
25
+ * - irb history pickling.
26
+ */
27
+ import { ReplSession } from './repl-session.js';
28
+ import { WASI_INSTANCE_PREAMBLE_SRC } from './wasi-instance.js';
29
+ import { RUBY_RUNNER_PREAMBLE_TAIL } from './ruby-runner.js';
30
+ class RubyReplAdapter {
31
+ pool = null;
32
+ deps;
33
+ wasmBytesAB = null;
34
+ ps1 = 'irb> ';
35
+ ps2 = 'irb* ';
36
+ constructor(deps) {
37
+ this.deps = deps;
38
+ }
39
+ banner() {
40
+ return ('Ruby 3.3.4 (Nimbus / ruby.wasm 2.9.x)\r\n' +
41
+ 'Type "exit" or press Ctrl-D to exit.\r\n');
42
+ }
43
+ async push(source) {
44
+ // Special-case exit literally for cheaper response.
45
+ const trimmed = source.trim();
46
+ if (trimmed === 'exit' || trimmed === 'quit' || trimmed === 'exit()') {
47
+ return { kind: 'exit', exitCode: 0 };
48
+ }
49
+ try {
50
+ await this.ensurePool();
51
+ }
52
+ catch (e) {
53
+ return { kind: 'error', stderr: `[ruby-repl] bootstrap failed: ${e?.message || e}\n` };
54
+ }
55
+ // Build the wrapper Ruby code. We:
56
+ // 1. Use Ripper.sexp(source) to test for incomplete input. nil → incomplete.
57
+ // 2. Wrap the eval in begin/rescue. Catch SystemExit, capture status.
58
+ // 3. eval(src, TOPLEVEL_BINDING) — preserves user-defined ivars/locals
59
+ // at the top-level binding across REPL submits.
60
+ // 4. If the eval returned a non-nil result, print "=> #{result.inspect}\n"
61
+ // mimicking irb's display convention.
62
+ //
63
+ // The src is encoded as base64 to avoid string-escape hazards on
64
+ // multi-line input (heredocs, embedded quotes, unicode).
65
+ // Pass source via a base64-encoded literal to avoid string-escape
66
+ // hazards on multi-line input. The driver:
67
+ // - Tries Ripper.sexp for incomplete-detection if available
68
+ // (ruby.wasm stdlib may not include ripper). Fall back to a
69
+ // SyntaxError-message heuristic.
70
+ // - eval(source, TOPLEVEL_BINDING) preserves user-defined vars
71
+ // across submits.
72
+ // - irb-style `=> result.inspect` for non-nil result.
73
+ // - SystemExit → exit with status.
74
+ // - Other exceptions → write to $stderr and continue.
75
+ const srcB64 = btoa(unescape(encodeURIComponent(source)));
76
+ const driver = [
77
+ 'require "base64"',
78
+ '__nimbus_src = Base64.decode64("' + srcB64 + '")',
79
+ '__nimbus_incomplete = false',
80
+ 'begin',
81
+ ' require "ripper"',
82
+ ' __nimbus_incomplete = true if Ripper.sexp(__nimbus_src).nil?',
83
+ 'rescue LoadError',
84
+ ' # ripper unavailable; rely on SyntaxError-message fallback',
85
+ 'end',
86
+ 'if __nimbus_incomplete',
87
+ ' $stdout.print "__NIMBUS_INCOMPLETE__"',
88
+ 'else',
89
+ ' begin',
90
+ ' __nimbus_result = eval(__nimbus_src, TOPLEVEL_BINDING)',
91
+ ' unless __nimbus_result.nil?',
92
+ ' $stdout.print "=> "',
93
+ ' $stdout.puts __nimbus_result.inspect',
94
+ ' end',
95
+ ' rescue SystemExit => __nimbus_se',
96
+ ' Kernel.exit(__nimbus_se.status)',
97
+ ' rescue SyntaxError => __nimbus_syn',
98
+ ' msg = __nimbus_syn.message.to_s',
99
+ ' if msg =~ /unexpected end-of-input|unterminated/',
100
+ ' $stdout.print "__NIMBUS_INCOMPLETE__"',
101
+ ' else',
102
+ ' $stderr.puts "SyntaxError: " + msg',
103
+ ' end',
104
+ ' rescue Exception => __nimbus_exc',
105
+ ' $stderr.puts __nimbus_exc.class.to_s + ": " + __nimbus_exc.message.to_s',
106
+ ' end',
107
+ 'end',
108
+ ].join('\n');
109
+ let result;
110
+ try {
111
+ result = await this.submitFacetFn(driver);
112
+ }
113
+ catch (e) {
114
+ return { kind: 'error', stderr: `[ruby-repl] dispatch failed: ${e?.message || e}\n` };
115
+ }
116
+ // Sentinel handling: if stdout ends with __NIMBUS_INCOMPLETE__ marker,
117
+ // signal incomplete.
118
+ if (result.stdout && result.stdout.includes('__NIMBUS_INCOMPLETE__')) {
119
+ return { kind: 'incomplete' };
120
+ }
121
+ // Non-zero exit code from Ruby = user called exit / process aborted.
122
+ if (result.exitCode !== 0 && result.exitCode !== undefined) {
123
+ return {
124
+ kind: 'exit',
125
+ exitCode: result.exitCode,
126
+ stdout: result.stdout,
127
+ stderr: result.stderr,
128
+ };
129
+ }
130
+ return { kind: 'output', stdout: result.stdout || '', stderr: result.stderr || '' };
131
+ }
132
+ async close() {
133
+ if (this.pool) {
134
+ try {
135
+ this.pool.dispose?.();
136
+ }
137
+ catch { /* fail-soft */ }
138
+ this.pool = null;
139
+ }
140
+ }
141
+ async ensurePool() {
142
+ if (this.pool)
143
+ return;
144
+ const { vfs, installRoot, facetMgr } = this.deps;
145
+ const wasmPath = `${installRoot}/share/ruby/ruby+stdlib.wasm`;
146
+ if (!vfs.exists(wasmPath)) {
147
+ throw new Error(`ruby+stdlib.wasm missing at ${wasmPath} (run 'nimbus install ruby')`);
148
+ }
149
+ const wasmBytes = vfs.readFile(wasmPath);
150
+ this.wasmBytesAB = toAB(wasmBytes);
151
+ // Compose the same preamble ruby-runner uses. WASI_INSTANCE_PREAMBLE_SRC
152
+ // + FinalizationRegistry shim + RUBY_RUNNER_PREAMBLE_TAIL.
153
+ const preamble = [
154
+ '// ── WASI shim preamble ──',
155
+ WASI_INSTANCE_PREAMBLE_SRC,
156
+ '',
157
+ '// ── FinalizationRegistry shim ──',
158
+ 'if (typeof globalThis.FinalizationRegistry === "undefined") {',
159
+ ' globalThis.FinalizationRegistry = class FinalizationRegistry {',
160
+ ' constructor(_cleanup) {}',
161
+ ' register(_target, _heldValue, _token) {}',
162
+ ' unregister(_token) {}',
163
+ ' };',
164
+ '}',
165
+ '',
166
+ RUBY_RUNNER_PREAMBLE_TAIL,
167
+ ].join('\n');
168
+ const { NimbusLoaderPool } = await import('../loaders/loader-pool.js');
169
+ const env = facetMgr.env;
170
+ const ctx = facetMgr.ctx;
171
+ this.pool = new NimbusLoaderPool(env, ctx, {
172
+ tag: 'ruby-repl',
173
+ concurrency: 1,
174
+ omitSupervisor: true,
175
+ preamble,
176
+ });
177
+ }
178
+ async submitFacetFn(userCode) {
179
+ const wasmModules = { 'ruby+stdlib.wasm': this.wasmBytesAB };
180
+ return await this.pool.submit(rubyReplStepFacetFn, { userCode }, {
181
+ wasmModules,
182
+ timeoutMs: 60_000,
183
+ });
184
+ }
185
+ }
186
+ /**
187
+ * Facet-side function. Self-contained — serialized via fn.toString();
188
+ * no closure captures, no class refs, no bare 'this' word.
189
+ *
190
+ * Calls globalThis.__rubyRun (installed by RUBY_RUNNER_PREAMBLE_TAIL)
191
+ * with the user code wrapped by the driver above.
192
+ */
193
+ function rubyReplStepFacetFn(args) {
194
+ const g = globalThis;
195
+ return (async function () {
196
+ const fn = g.__rubyRun;
197
+ if (typeof fn !== 'function') {
198
+ return {
199
+ stdout: '', stderr: '', exitCode: 127,
200
+ error: 'ruby-repl preamble missing: __rubyRun not in scope',
201
+ };
202
+ }
203
+ const r = await fn({
204
+ userCode: args.userCode,
205
+ rbArgv: ['ruby', '-e', args.userCode],
206
+ userEnv: { HOME: '/home/user' },
207
+ progName: 'ruby',
208
+ });
209
+ return {
210
+ stdout: r.stdout || '',
211
+ stderr: r.stderr || '',
212
+ exitCode: typeof r.exitCode === 'number' ? r.exitCode : 0,
213
+ error: r.error,
214
+ };
215
+ })();
216
+ }
217
+ function toAB(u8) {
218
+ return u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength);
219
+ }
220
+ /**
221
+ * Top-level wrapper: builds a Ruby REPL adapter, drives a ReplSession
222
+ * to completion, returns the exit code. Called from the ruby factory's
223
+ * wrapper in init.ts when `ruby` is invoked with no args.
224
+ */
225
+ export async function runRubyRepl(deps) {
226
+ const adapter = new RubyReplAdapter(deps);
227
+ const session = new ReplSession(adapter, deps.terminal);
228
+ return await session.run();
229
+ }