@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.
- package/README.md +219 -0
- package/dist/_shared/bytes.d.ts +18 -0
- package/dist/_shared/bytes.d.ts.map +1 -0
- package/dist/_shared/bytes.js +17 -0
- package/dist/_shared/cache-stats.d.ts +146 -0
- package/dist/_shared/cache-stats.d.ts.map +1 -0
- package/dist/_shared/cache-stats.js +162 -0
- package/dist/_shared/exports-resolver.d.ts +76 -0
- package/dist/_shared/exports-resolver.d.ts.map +1 -0
- package/dist/_shared/exports-resolver.js +284 -0
- package/dist/_shared/install-phase.d.ts +47 -0
- package/dist/_shared/install-phase.d.ts.map +1 -0
- package/dist/_shared/install-phase.js +1 -0
- package/dist/_shared/real-node-imports.d.ts +38 -0
- package/dist/_shared/real-node-imports.d.ts.map +1 -0
- package/dist/_shared/real-node-imports.js +46 -0
- package/dist/_shared/retry.d.ts +93 -0
- package/dist/_shared/retry.d.ts.map +1 -0
- package/dist/_shared/retry.js +161 -0
- package/dist/_shared/session-id.d.ts +39 -0
- package/dist/_shared/session-id.d.ts.map +1 -0
- package/dist/_shared/session-id.js +127 -0
- package/dist/_shared/session-router.d.ts +104 -0
- package/dist/_shared/session-router.d.ts.map +1 -0
- package/dist/_shared/session-router.js +165 -0
- package/dist/_shared/w7-frame.d.ts +93 -0
- package/dist/_shared/w7-frame.d.ts.map +1 -0
- package/dist/_shared/w7-frame.js +402 -0
- package/dist/auth/index.d.ts +16 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +15 -0
- package/dist/auth/middleware.d.ts +85 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +150 -0
- package/dist/auth/token.d.ts +96 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +226 -0
- package/dist/auth/types.d.ts +141 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +114 -0
- package/dist/bindings/d1.d.ts +102 -0
- package/dist/bindings/d1.d.ts.map +1 -0
- package/dist/bindings/d1.js +549 -0
- package/dist/bindings/kv.d.ts +82 -0
- package/dist/bindings/kv.d.ts.map +1 -0
- package/dist/bindings/kv.js +290 -0
- package/dist/bindings/r2.d.ts +137 -0
- package/dist/bindings/r2.d.ts.map +1 -0
- package/dist/bindings/r2.js +379 -0
- package/dist/cirrus-npm-cjs.generated.d.ts +17 -0
- package/dist/cirrus-npm-cjs.generated.d.ts.map +1 -0
- package/dist/cirrus-npm-cjs.generated.js +41 -0
- package/dist/cirrus-plugin-react.generated.d.ts +34 -0
- package/dist/cirrus-plugin-react.generated.d.ts.map +1 -0
- package/dist/cirrus-plugin-react.generated.js +33 -0
- package/dist/constants.d.ts +34 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +116 -0
- package/dist/esbuild-wasm-bundle.generated.d.ts +41 -0
- package/dist/esbuild-wasm-bundle.generated.d.ts.map +1 -0
- package/dist/esbuild-wasm-bundle.generated.js +40 -0
- package/dist/facets/cirrus-real.d.ts +147 -0
- package/dist/facets/cirrus-real.d.ts.map +1 -0
- package/dist/facets/cirrus-real.js +981 -0
- package/dist/facets/inner-do-registry.d.ts +41 -0
- package/dist/facets/inner-do-registry.d.ts.map +1 -0
- package/dist/facets/inner-do-registry.js +51 -0
- package/dist/facets/manager.d.ts +314 -0
- package/dist/facets/manager.d.ts.map +1 -0
- package/dist/facets/manager.js +2681 -0
- package/dist/facets/process.d.ts +318 -0
- package/dist/facets/process.d.ts.map +1 -0
- package/dist/facets/process.js +567 -0
- package/dist/facets/real-vite-fs-shim.d.ts +151 -0
- package/dist/facets/real-vite-fs-shim.d.ts.map +1 -0
- package/dist/facets/real-vite-fs-shim.js +1279 -0
- package/dist/facets/real-vite-hmr.d.ts +142 -0
- package/dist/facets/real-vite-hmr.d.ts.map +1 -0
- package/dist/facets/real-vite-hmr.js +476 -0
- package/dist/facets/vite-dev-server.d.ts +293 -0
- package/dist/facets/vite-dev-server.d.ts.map +1 -0
- package/dist/facets/vite-dev-server.js +2580 -0
- package/dist/facets/wasm-swap-registry.d.ts +261 -0
- package/dist/facets/wasm-swap-registry.d.ts.map +1 -0
- package/dist/facets/wasm-swap-registry.js +551 -0
- package/dist/facets/ws-terminal.d.ts +107 -0
- package/dist/facets/ws-terminal.d.ts.map +1 -0
- package/dist/facets/ws-terminal.js +207 -0
- package/dist/git/commands.d.ts +13 -0
- package/dist/git/commands.d.ts.map +1 -0
- package/dist/git/commands.js +633 -0
- package/dist/git/network-facet.d.ts +61 -0
- package/dist/git/network-facet.d.ts.map +1 -0
- package/dist/git/network-facet.js +700 -0
- package/dist/git-bundle.generated.d.ts +16 -0
- package/dist/git-bundle.generated.d.ts.map +1 -0
- package/dist/git-bundle.generated.js +15 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/loaders/child-process/spawn-facet.d.ts +90 -0
- package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -0
- package/dist/loaders/child-process/spawn-facet.js +103 -0
- package/dist/loaders/child-process/spawn-pool.d.ts +110 -0
- package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -0
- package/dist/loaders/child-process/spawn-pool.js +161 -0
- package/dist/loaders/fanout-pool.d.ts +195 -0
- package/dist/loaders/fanout-pool.d.ts.map +1 -0
- package/dist/loaders/fanout-pool.js +326 -0
- package/dist/loaders/generated-workers.d.ts +26 -0
- package/dist/loaders/generated-workers.d.ts.map +1 -0
- package/dist/loaders/generated-workers.js +25 -0
- package/dist/loaders/index.d.ts +15 -0
- package/dist/loaders/index.d.ts.map +1 -0
- package/dist/loaders/index.js +13 -0
- package/dist/loaders/loader-pool.d.ts +273 -0
- package/dist/loaders/loader-pool.d.ts.map +1 -0
- package/dist/loaders/loader-pool.js +624 -0
- package/dist/loaders/npm-resolve-preamble.d.ts +34 -0
- package/dist/loaders/npm-resolve-preamble.d.ts.map +1 -0
- package/dist/loaders/npm-resolve-preamble.js +237 -0
- package/dist/loaders/pre-bundle-preamble.d.ts +41 -0
- package/dist/loaders/pre-bundle-preamble.d.ts.map +1 -0
- package/dist/loaders/pre-bundle-preamble.js +114 -0
- package/dist/loaders/vendor/codegen.d.ts +24 -0
- package/dist/loaders/vendor/codegen.d.ts.map +1 -0
- package/dist/loaders/vendor/codegen.js +44 -0
- package/dist/loaders/vendor/errors.d.ts +24 -0
- package/dist/loaders/vendor/errors.d.ts.map +1 -0
- package/dist/loaders/vendor/errors.js +46 -0
- package/dist/loaders/vendor/index.d.ts +16 -0
- package/dist/loaders/vendor/index.d.ts.map +1 -0
- package/dist/loaders/vendor/index.js +11 -0
- package/dist/loaders/vendor/pool.d.ts +88 -0
- package/dist/loaders/vendor/pool.d.ts.map +1 -0
- package/dist/loaders/vendor/pool.js +353 -0
- package/dist/loaders/vendor/primitives.d.ts +11 -0
- package/dist/loaders/vendor/primitives.d.ts.map +1 -0
- package/dist/loaders/vendor/primitives.js +33 -0
- package/dist/loaders/vendor/serialize.d.ts +3 -0
- package/dist/loaders/vendor/serialize.d.ts.map +1 -0
- package/dist/loaders/vendor/serialize.js +25 -0
- package/dist/loaders/vendor/types.d.ts +60 -0
- package/dist/loaders/vendor/types.d.ts.map +1 -0
- package/dist/loaders/vendor/types.js +4 -0
- package/dist/npm/cache.d.ts +136 -0
- package/dist/npm/cache.d.ts.map +1 -0
- package/dist/npm/cache.js +429 -0
- package/dist/npm/install-batch-facet.d.ts +129 -0
- package/dist/npm/install-batch-facet.d.ts.map +1 -0
- package/dist/npm/install-batch-facet.js +598 -0
- package/dist/npm/install-facet.d.ts +29 -0
- package/dist/npm/install-facet.d.ts.map +1 -0
- package/dist/npm/install-facet.js +9 -0
- package/dist/npm/installer.d.ts +239 -0
- package/dist/npm/installer.d.ts.map +1 -0
- package/dist/npm/installer.js +2022 -0
- package/dist/npm/npx-install.d.ts +74 -0
- package/dist/npm/npx-install.d.ts.map +1 -0
- package/dist/npm/npx-install.js +302 -0
- package/dist/npm/pre-bundle-facet.d.ts +168 -0
- package/dist/npm/pre-bundle-facet.d.ts.map +1 -0
- package/dist/npm/pre-bundle-facet.js +653 -0
- package/dist/npm/r2-cache.d.ts +286 -0
- package/dist/npm/r2-cache.d.ts.map +1 -0
- package/dist/npm/r2-cache.js +506 -0
- package/dist/npm/resolve-facet.d.ts +202 -0
- package/dist/npm/resolve-facet.d.ts.map +1 -0
- package/dist/npm/resolve-facet.js +833 -0
- package/dist/npm/resolve-one-facet.d.ts +204 -0
- package/dist/npm/resolve-one-facet.d.ts.map +1 -0
- package/dist/npm/resolve-one-facet.js +437 -0
- package/dist/npm/resolver.d.ts +109 -0
- package/dist/npm/resolver.d.ts.map +1 -0
- package/dist/npm/resolver.js +899 -0
- package/dist/npm/tarball-stream.d.ts +85 -0
- package/dist/npm/tarball-stream.d.ts.map +1 -0
- package/dist/npm/tarball-stream.js +205 -0
- package/dist/npm/tarball.d.ts +51 -0
- package/dist/npm/tarball.d.ts.map +1 -0
- package/dist/npm/tarball.js +185 -0
- package/dist/observability/diag-counters.d.ts +292 -0
- package/dist/observability/diag-counters.d.ts.map +1 -0
- package/dist/observability/diag-counters.js +302 -0
- package/dist/observability/heap-estimate.d.ts +166 -0
- package/dist/observability/heap-estimate.d.ts.map +1 -0
- package/dist/observability/heap-estimate.js +192 -0
- package/dist/observability/heavy-alloc-coord.d.ts +95 -0
- package/dist/observability/heavy-alloc-coord.d.ts.map +1 -0
- package/dist/observability/heavy-alloc-coord.js +149 -0
- package/dist/observability/oom-classify.d.ts +56 -0
- package/dist/observability/oom-classify.d.ts.map +1 -0
- package/dist/observability/oom-classify.js +118 -0
- package/dist/observability/oom-discriminator.d.ts +192 -0
- package/dist/observability/oom-discriminator.d.ts.map +1 -0
- package/dist/observability/oom-discriminator.js +233 -0
- package/dist/real-vite-bundle.generated.d.ts +46 -0
- package/dist/real-vite-bundle.generated.d.ts.map +1 -0
- package/dist/real-vite-bundle.generated.js +53 -0
- package/dist/replica/routing.d.ts +171 -0
- package/dist/replica/routing.d.ts.map +1 -0
- package/dist/replica/routing.js +288 -0
- package/dist/replica/suspension.d.ts +36 -0
- package/dist/replica/suspension.d.ts.map +1 -0
- package/dist/replica/suspension.js +49 -0
- package/dist/router/index.d.ts +156 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +220 -0
- package/dist/runtime/assets-loader.d.ts +71 -0
- package/dist/runtime/assets-loader.d.ts.map +1 -0
- package/dist/runtime/assets-loader.js +128 -0
- package/dist/runtime/barrel-detect.d.ts +46 -0
- package/dist/runtime/barrel-detect.d.ts.map +1 -0
- package/dist/runtime/barrel-detect.js +73 -0
- package/dist/runtime/barrel-synthesizer.d.ts +181 -0
- package/dist/runtime/barrel-synthesizer.d.ts.map +1 -0
- package/dist/runtime/barrel-synthesizer.js +541 -0
- package/dist/runtime/bun-repl.d.ts +46 -0
- package/dist/runtime/bun-repl.d.ts.map +1 -0
- package/dist/runtime/bun-repl.js +326 -0
- package/dist/runtime/bun-runner.d.ts +66 -0
- package/dist/runtime/bun-runner.d.ts.map +1 -0
- package/dist/runtime/bun-runner.js +219 -0
- package/dist/runtime/clang-runner.d.ts +38 -0
- package/dist/runtime/clang-runner.d.ts.map +1 -0
- package/dist/runtime/clang-runner.js +1033 -0
- package/dist/runtime/comment-strip.d.ts +37 -0
- package/dist/runtime/comment-strip.d.ts.map +1 -0
- package/dist/runtime/comment-strip.js +74 -0
- package/dist/runtime/esbuild-service.d.ts +201 -0
- package/dist/runtime/esbuild-service.d.ts.map +1 -0
- package/dist/runtime/esbuild-service.js +1444 -0
- package/dist/runtime/esbuild-wasm-bytes.d.ts +87 -0
- package/dist/runtime/esbuild-wasm-bytes.d.ts.map +1 -0
- package/dist/runtime/esbuild-wasm-bytes.js +131 -0
- package/dist/runtime/framework-detect.d.ts +71 -0
- package/dist/runtime/framework-detect.d.ts.map +1 -0
- package/dist/runtime/framework-detect.js +178 -0
- package/dist/runtime/long-running-handle.d.ts +133 -0
- package/dist/runtime/long-running-handle.d.ts.map +1 -0
- package/dist/runtime/long-running-handle.js +192 -0
- package/dist/runtime/node-repl.d.ts +36 -0
- package/dist/runtime/node-repl.d.ts.map +1 -0
- package/dist/runtime/node-repl.js +293 -0
- package/dist/runtime/node-runner.d.ts +111 -0
- package/dist/runtime/node-runner.d.ts.map +1 -0
- package/dist/runtime/node-runner.js +194 -0
- package/dist/runtime/node-shims.d.ts +24 -0
- package/dist/runtime/node-shims.d.ts.map +1 -0
- package/dist/runtime/node-shims.js +3019 -0
- package/dist/runtime/package-manager.d.ts +118 -0
- package/dist/runtime/package-manager.d.ts.map +1 -0
- package/dist/runtime/package-manager.js +420 -0
- package/dist/runtime/port-registry.d.ts +80 -0
- package/dist/runtime/port-registry.d.ts.map +1 -0
- package/dist/runtime/port-registry.js +166 -0
- package/dist/runtime/process-logs-api.d.ts +102 -0
- package/dist/runtime/process-logs-api.d.ts.map +1 -0
- package/dist/runtime/process-logs-api.js +253 -0
- package/dist/runtime/process-logs.d.ts +311 -0
- package/dist/runtime/process-logs.d.ts.map +1 -0
- package/dist/runtime/process-logs.js +656 -0
- package/dist/runtime/process-table.d.ts +65 -0
- package/dist/runtime/process-table.d.ts.map +1 -0
- package/dist/runtime/process-table.js +107 -0
- package/dist/runtime/project-detect.d.ts +21 -0
- package/dist/runtime/project-detect.d.ts.map +1 -0
- package/dist/runtime/project-detect.js +46 -0
- package/dist/runtime/python-repl.d.ts +66 -0
- package/dist/runtime/python-repl.d.ts.map +1 -0
- package/dist/runtime/python-repl.js +563 -0
- package/dist/runtime/python-runner.d.ts +50 -0
- package/dist/runtime/python-runner.d.ts.map +1 -0
- package/dist/runtime/python-runner.js +870 -0
- package/dist/runtime/repl-session.d.ts +160 -0
- package/dist/runtime/repl-session.d.ts.map +1 -0
- package/dist/runtime/repl-session.js +393 -0
- package/dist/runtime/require-resolver.d.ts +52 -0
- package/dist/runtime/require-resolver.d.ts.map +1 -0
- package/dist/runtime/require-resolver.js +690 -0
- package/dist/runtime/router-basename.d.ts +36 -0
- package/dist/runtime/router-basename.d.ts.map +1 -0
- package/dist/runtime/router-basename.js +310 -0
- package/dist/runtime/ruby-repl.d.ts +43 -0
- package/dist/runtime/ruby-repl.d.ts.map +1 -0
- package/dist/runtime/ruby-repl.js +229 -0
- package/dist/runtime/ruby-runner.d.ts +62 -0
- package/dist/runtime/ruby-runner.d.ts.map +1 -0
- package/dist/runtime/ruby-runner.js +737 -0
- package/dist/runtime/runtime-catalog.d.ts +99 -0
- package/dist/runtime/runtime-catalog.d.ts.map +1 -0
- package/dist/runtime/runtime-catalog.js +183 -0
- package/dist/runtime/runtime-registry.d.ts +136 -0
- package/dist/runtime/runtime-registry.d.ts.map +1 -0
- package/dist/runtime/runtime-registry.js +318 -0
- package/dist/runtime/streams.d.ts +13 -0
- package/dist/runtime/streams.d.ts.map +1 -0
- package/dist/runtime/streams.js +402 -0
- package/dist/runtime/wasi-instance.d.ts +190 -0
- package/dist/runtime/wasi-instance.d.ts.map +1 -0
- package/dist/runtime/wasi-instance.js +2044 -0
- package/dist/runtime/wasm-runner.d.ts +117 -0
- package/dist/runtime/wasm-runner.d.ts.map +1 -0
- package/dist/runtime/wasm-runner.js +705 -0
- package/dist/session/bindings.d.ts +168 -0
- package/dist/session/bindings.d.ts.map +1 -0
- package/dist/session/bindings.js +524 -0
- package/dist/session/ctx-exports.d.ts +16 -0
- package/dist/session/ctx-exports.d.ts.map +1 -0
- package/dist/session/ctx-exports.js +22 -0
- package/dist/session/diag.d.ts +62 -0
- package/dist/session/diag.d.ts.map +1 -0
- package/dist/session/diag.js +118 -0
- package/dist/session/fs-watch.d.ts +132 -0
- package/dist/session/fs-watch.d.ts.map +1 -0
- package/dist/session/fs-watch.js +255 -0
- package/dist/session/helpers.d.ts +150 -0
- package/dist/session/helpers.d.ts.map +1 -0
- package/dist/session/helpers.js +472 -0
- package/dist/session/hibernation.d.ts +145 -0
- package/dist/session/hibernation.d.ts.map +1 -0
- package/dist/session/hibernation.js +385 -0
- package/dist/session/init-phases.d.ts +87 -0
- package/dist/session/init-phases.d.ts.map +1 -0
- package/dist/session/init-phases.js +137 -0
- package/dist/session/init.d.ts +46 -0
- package/dist/session/init.d.ts.map +1 -0
- package/dist/session/init.js +3579 -0
- package/dist/session/keys.d.ts +56 -0
- package/dist/session/keys.d.ts.map +1 -0
- package/dist/session/keys.js +55 -0
- package/dist/session/nimbus-session.d.ts +434 -0
- package/dist/session/nimbus-session.d.ts.map +1 -0
- package/dist/session/nimbus-session.js +1084 -0
- package/dist/session/programmatic.d.ts +105 -0
- package/dist/session/programmatic.d.ts.map +1 -0
- package/dist/session/programmatic.js +326 -0
- package/dist/session/replica-routes.d.ts +68 -0
- package/dist/session/replica-routes.d.ts.map +1 -0
- package/dist/session/replica-routes.js +77 -0
- package/dist/session/routes.d.ts +29 -0
- package/dist/session/routes.d.ts.map +1 -0
- package/dist/session/routes.js +1331 -0
- package/dist/session/rpc.d.ts +323 -0
- package/dist/session/rpc.d.ts.map +1 -0
- package/dist/session/rpc.js +808 -0
- package/dist/session/state-store.d.ts +210 -0
- package/dist/session/state-store.d.ts.map +1 -0
- package/dist/session/state-store.js +459 -0
- package/dist/session/supervisor-rpc.d.ts +269 -0
- package/dist/session/supervisor-rpc.d.ts.map +1 -0
- package/dist/session/supervisor-rpc.js +437 -0
- package/dist/session/ws-hibernation-config.d.ts +64 -0
- package/dist/session/ws-hibernation-config.d.ts.map +1 -0
- package/dist/session/ws-hibernation-config.js +89 -0
- package/dist/session/ws.d.ts +95 -0
- package/dist/session/ws.d.ts.map +1 -0
- package/dist/session/ws.js +395 -0
- package/dist/shell/features.d.ts +410 -0
- package/dist/shell/features.d.ts.map +1 -0
- package/dist/shell/features.js +1885 -0
- package/dist/shell/unix-commands.d.ts +15 -0
- package/dist/shell/unix-commands.d.ts.map +1 -0
- package/dist/shell/unix-commands.js +3703 -0
- package/dist/stubs/lifo-ui.d.ts +10 -0
- package/dist/stubs/lifo-ui.d.ts.map +1 -0
- package/dist/stubs/lifo-ui.js +1 -0
- package/dist/tailwind-play.generated.d.ts +19 -0
- package/dist/tailwind-play.generated.d.ts.map +1 -0
- package/dist/tailwind-play.generated.js +18 -0
- package/dist/vfs/dev-provider.d.ts +64 -0
- package/dist/vfs/dev-provider.d.ts.map +1 -0
- package/dist/vfs/dev-provider.js +191 -0
- package/dist/vfs/events.d.ts +51 -0
- package/dist/vfs/events.d.ts.map +1 -0
- package/dist/vfs/events.js +127 -0
- package/dist/vfs/path.d.ts +30 -0
- package/dist/vfs/path.d.ts.map +1 -0
- package/dist/vfs/path.js +41 -0
- package/dist/vfs/seed-project.d.ts +62 -0
- package/dist/vfs/seed-project.d.ts.map +1 -0
- package/dist/vfs/seed-project.js +1045 -0
- package/dist/vfs/sqlite-vfs.d.ts +435 -0
- package/dist/vfs/sqlite-vfs.d.ts.map +1 -0
- package/dist/vfs/sqlite-vfs.js +1670 -0
- package/dist/vfs/symlink-registry.d.ts +64 -0
- package/dist/vfs/symlink-registry.d.ts.map +1 -0
- package/dist/vfs/symlink-registry.js +137 -0
- package/dist/wrangler/nimbus-wrangler.d.ts +157 -0
- package/dist/wrangler/nimbus-wrangler.d.ts.map +1 -0
- package/dist/wrangler/nimbus-wrangler.js +931 -0
- package/package.json +77 -0
- package/public/_assets/cirrus-plugin-react.bundle.js +70740 -0
- package/public/_assets/esbuild-0.24.2.wasm +0 -0
- package/public/_assets/real-vite-bundle.js +101478 -0
- package/public/_assets/rollup.wasm +0 -0
- package/public/favicon.svg +8 -0
- package/public/index.html +565 -0
- package/public/s/index.html +2379 -0
- package/scripts/bundle-esbuild-wasm.mjs +244 -0
- package/scripts/bundle-facet-workers.mjs +137 -0
- package/scripts/bundle-git.mjs +118 -0
- package/scripts/bundle-npm-cjs.mjs +363 -0
- package/scripts/bundle-plugin-react.mjs +480 -0
- package/scripts/bundle-real-vite.mjs +959 -0
- package/scripts/bundle-runtime.mjs +600 -0
- package/scripts/bundle-tailwind-play.mjs +130 -0
- package/scripts/patch-lifo-ui.mjs +131 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* package-manager.ts — `nimbus install <runtime>` shell verb.
|
|
3
|
+
*
|
|
4
|
+
* Implements True-OS Wave-3's package-manager surface per
|
|
5
|
+
* /workspace/.seal-internal/2026-05-10-true-os/plan.md §2.
|
|
6
|
+
*
|
|
7
|
+
* Subcommands (all under `nimbus install`):
|
|
8
|
+
*
|
|
9
|
+
* nimbus install <name> install latest of <name>
|
|
10
|
+
* nimbus install <name>@<version> install specific version
|
|
11
|
+
* nimbus install --list show installed runtimes
|
|
12
|
+
* nimbus install --available show catalog of installables
|
|
13
|
+
* nimbus install --reinstall <name> force refetch
|
|
14
|
+
* nimbus uninstall <name> remove installed runtime
|
|
15
|
+
*
|
|
16
|
+
* Per-user-VFS layout (decision D-install-1 (a) baked):
|
|
17
|
+
*
|
|
18
|
+
* ~/.nimbus/runtimes/<name>/<version>/
|
|
19
|
+
* manifest.json
|
|
20
|
+
* bin/<entry>
|
|
21
|
+
* share/<name>/...
|
|
22
|
+
* LICENSE
|
|
23
|
+
*
|
|
24
|
+
* Survives DO eviction (SqliteFS-backed). Boot-time rehydration reads
|
|
25
|
+
* every `~/.nimbus/runtimes/STAR/STAR/manifest.json` and re-registers
|
|
26
|
+
* each `entrypoints[].binName` as a shell command pointing at the
|
|
27
|
+
* named runner factory.
|
|
28
|
+
*
|
|
29
|
+
* Anti-reqs (inherited from plan §8.1):
|
|
30
|
+
* - NO setTimeout / NO retry / NO defensive-catch in dispatch path.
|
|
31
|
+
* - Errors throw + bubble up to the user as a single diagnostic line.
|
|
32
|
+
*/
|
|
33
|
+
import { type RuntimeCatalogEnv, type RuntimeManifest } from './runtime-catalog.js';
|
|
34
|
+
import type { SqliteVFS } from '../vfs/sqlite-vfs.js';
|
|
35
|
+
/** Minimal shell-registry shape we depend on. */
|
|
36
|
+
export interface MinShellRegistry {
|
|
37
|
+
register(name: string, handler: (ctx: any) => Promise<number>): void;
|
|
38
|
+
unregister?(name: string): void;
|
|
39
|
+
resolve?(name: string): any;
|
|
40
|
+
}
|
|
41
|
+
/** Runner-factory contract. Each registered runner produces a shell-
|
|
42
|
+
* command handler given the manifest + the installed root dir. The
|
|
43
|
+
* package manager invokes the factory at install-time + at boot-time
|
|
44
|
+
* rehydration. */
|
|
45
|
+
export type RunnerFactory = (manifest: RuntimeManifest, installRoot: string, binName: string, binKind: string | undefined) => (ctx: any) => Promise<number>;
|
|
46
|
+
export declare function registerRunnerFactory(key: string, factory: RunnerFactory): void;
|
|
47
|
+
export declare function getRegisteredRunners(): string[];
|
|
48
|
+
export interface RuntimeInstallSummary {
|
|
49
|
+
spec: string;
|
|
50
|
+
exitCode: number;
|
|
51
|
+
stdout: string;
|
|
52
|
+
stderr: string;
|
|
53
|
+
}
|
|
54
|
+
export interface RuntimeSummary {
|
|
55
|
+
name: string;
|
|
56
|
+
version: string;
|
|
57
|
+
root: string;
|
|
58
|
+
bins: string[];
|
|
59
|
+
sizeBytes: number;
|
|
60
|
+
license: string;
|
|
61
|
+
}
|
|
62
|
+
/** Compute the per-user install root for (name, version). Uses
|
|
63
|
+
* `process.env.HOME` if present; falls back to `/home/user`. */
|
|
64
|
+
export declare function installRoot(homeDir: string, name: string, version: string): string;
|
|
65
|
+
/** Read all installed manifests off SqliteFS. Used by both `--list`
|
|
66
|
+
* and boot-time rehydration. */
|
|
67
|
+
export declare function listInstalledManifests(vfs: SqliteVFS, homeDir: string): Array<{
|
|
68
|
+
root: string;
|
|
69
|
+
manifest: RuntimeManifest;
|
|
70
|
+
}>;
|
|
71
|
+
/**
|
|
72
|
+
* Re-register every installed runtime's entrypoints in the shell
|
|
73
|
+
* registry. Call once at session-init time after all runner factories
|
|
74
|
+
* are registered (init.ts:registerRunnerFactory blocks).
|
|
75
|
+
*/
|
|
76
|
+
export declare function rehydrateInstalledRuntimes(vfs: SqliteVFS, registry: MinShellRegistry, homeDir: string): {
|
|
77
|
+
count: number;
|
|
78
|
+
bins: string[];
|
|
79
|
+
};
|
|
80
|
+
export declare function listInstalledRuntimes(vfs: SqliteVFS, homeDir: string): RuntimeSummary[];
|
|
81
|
+
export declare function listAvailableRuntimes(env: RuntimeCatalogEnv): Promise<Array<{
|
|
82
|
+
name: string;
|
|
83
|
+
defaultVersion: string;
|
|
84
|
+
versions: Array<{
|
|
85
|
+
version: string;
|
|
86
|
+
sizeBytes: number;
|
|
87
|
+
license: string;
|
|
88
|
+
}>;
|
|
89
|
+
}>>;
|
|
90
|
+
export declare function installRuntimeProgrammatic(deps: {
|
|
91
|
+
env: RuntimeCatalogEnv;
|
|
92
|
+
vfs: SqliteVFS;
|
|
93
|
+
registry: MinShellRegistry;
|
|
94
|
+
getHome(): string;
|
|
95
|
+
}, spec: string, opts?: {
|
|
96
|
+
force?: boolean;
|
|
97
|
+
}): Promise<RuntimeInstallSummary>;
|
|
98
|
+
export declare function ensureRuntimesProgrammatic(deps: {
|
|
99
|
+
env: RuntimeCatalogEnv;
|
|
100
|
+
vfs: SqliteVFS;
|
|
101
|
+
registry: MinShellRegistry;
|
|
102
|
+
getHome(): string;
|
|
103
|
+
}, specs: string[], opts?: {
|
|
104
|
+
force?: boolean;
|
|
105
|
+
}): Promise<RuntimeInstallSummary[]>;
|
|
106
|
+
/**
|
|
107
|
+
* Build the shell-command handler that implements `nimbus install …`,
|
|
108
|
+
* `nimbus uninstall …`. Registered under the name `nimbus`.
|
|
109
|
+
*/
|
|
110
|
+
export declare function makeNimbusVerbHandler(deps: {
|
|
111
|
+
env: RuntimeCatalogEnv;
|
|
112
|
+
vfs: SqliteVFS;
|
|
113
|
+
registry: MinShellRegistry;
|
|
114
|
+
/** Returns `process.env.HOME` for the session. Computed by the
|
|
115
|
+
* caller (init.ts) from the shell env. */
|
|
116
|
+
getHome(): string;
|
|
117
|
+
}): (ctx: any) => Promise<number>;
|
|
118
|
+
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/runtime/package-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* package-manager.ts — `nimbus install <runtime>` shell verb.
|
|
3
|
+
*
|
|
4
|
+
* Implements True-OS Wave-3's package-manager surface per
|
|
5
|
+
* /workspace/.seal-internal/2026-05-10-true-os/plan.md §2.
|
|
6
|
+
*
|
|
7
|
+
* Subcommands (all under `nimbus install`):
|
|
8
|
+
*
|
|
9
|
+
* nimbus install <name> install latest of <name>
|
|
10
|
+
* nimbus install <name>@<version> install specific version
|
|
11
|
+
* nimbus install --list show installed runtimes
|
|
12
|
+
* nimbus install --available show catalog of installables
|
|
13
|
+
* nimbus install --reinstall <name> force refetch
|
|
14
|
+
* nimbus uninstall <name> remove installed runtime
|
|
15
|
+
*
|
|
16
|
+
* Per-user-VFS layout (decision D-install-1 (a) baked):
|
|
17
|
+
*
|
|
18
|
+
* ~/.nimbus/runtimes/<name>/<version>/
|
|
19
|
+
* manifest.json
|
|
20
|
+
* bin/<entry>
|
|
21
|
+
* share/<name>/...
|
|
22
|
+
* LICENSE
|
|
23
|
+
*
|
|
24
|
+
* Survives DO eviction (SqliteFS-backed). Boot-time rehydration reads
|
|
25
|
+
* every `~/.nimbus/runtimes/STAR/STAR/manifest.json` and re-registers
|
|
26
|
+
* each `entrypoints[].binName` as a shell command pointing at the
|
|
27
|
+
* named runner factory.
|
|
28
|
+
*
|
|
29
|
+
* Anti-reqs (inherited from plan §8.1):
|
|
30
|
+
* - NO setTimeout / NO retry / NO defensive-catch in dispatch path.
|
|
31
|
+
* - Errors throw + bubble up to the user as a single diagnostic line.
|
|
32
|
+
*/
|
|
33
|
+
import { fetchCatalog, fetchManifest, fetchBlob } from './runtime-catalog.js';
|
|
34
|
+
/** Map of runner-key → factory. Populated by init.ts before install. */
|
|
35
|
+
const runnerFactories = {};
|
|
36
|
+
export function registerRunnerFactory(key, factory) {
|
|
37
|
+
runnerFactories[key] = factory;
|
|
38
|
+
}
|
|
39
|
+
export function getRegisteredRunners() {
|
|
40
|
+
return Object.keys(runnerFactories);
|
|
41
|
+
}
|
|
42
|
+
/** Compute the per-user install root for (name, version). Uses
|
|
43
|
+
* `process.env.HOME` if present; falls back to `/home/user`. */
|
|
44
|
+
export function installRoot(homeDir, name, version) {
|
|
45
|
+
// Strip leading slash so SqliteFS sees a relative-looking VFS path,
|
|
46
|
+
// matching the convention used elsewhere in src/session/init.ts.
|
|
47
|
+
const home = homeDir.replace(/^\/+/, '').replace(/\/+$/, '');
|
|
48
|
+
return `${home}/.nimbus/runtimes/${name}/${version}`;
|
|
49
|
+
}
|
|
50
|
+
/** Read all installed manifests off SqliteFS. Used by both `--list`
|
|
51
|
+
* and boot-time rehydration. */
|
|
52
|
+
export function listInstalledManifests(vfs, homeDir) {
|
|
53
|
+
const home = homeDir.replace(/^\/+/, '').replace(/\/+$/, '');
|
|
54
|
+
const runtimesRoot = `${home}/.nimbus/runtimes`;
|
|
55
|
+
const out = [];
|
|
56
|
+
if (!vfs.exists(runtimesRoot))
|
|
57
|
+
return out;
|
|
58
|
+
// Each entry under runtimesRoot is a <name>; each entry under that
|
|
59
|
+
// is a <version>; each <version> dir has a manifest.json.
|
|
60
|
+
for (const nameEntry of vfs.readdir(runtimesRoot)) {
|
|
61
|
+
if (nameEntry.type !== 'directory')
|
|
62
|
+
continue;
|
|
63
|
+
const nameDir = `${runtimesRoot}/${nameEntry.name}`;
|
|
64
|
+
for (const verEntry of vfs.readdir(nameDir)) {
|
|
65
|
+
if (verEntry.type !== 'directory')
|
|
66
|
+
continue;
|
|
67
|
+
const verDir = `${nameDir}/${verEntry.name}`;
|
|
68
|
+
const manifestPath = `${verDir}/manifest.json`;
|
|
69
|
+
if (!vfs.exists(manifestPath))
|
|
70
|
+
continue;
|
|
71
|
+
try {
|
|
72
|
+
const manifest = JSON.parse(vfs.readFileString(manifestPath));
|
|
73
|
+
out.push({ root: verDir, manifest });
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Malformed manifest — skip silently. Surfacing via stderr
|
|
77
|
+
// would require a ctx we don't have at boot-time rehydration.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Re-register every installed runtime's entrypoints in the shell
|
|
85
|
+
* registry. Call once at session-init time after all runner factories
|
|
86
|
+
* are registered (init.ts:registerRunnerFactory blocks).
|
|
87
|
+
*/
|
|
88
|
+
export function rehydrateInstalledRuntimes(vfs, registry, homeDir) {
|
|
89
|
+
const bins = [];
|
|
90
|
+
for (const { root, manifest } of listInstalledManifests(vfs, homeDir)) {
|
|
91
|
+
for (const ep of manifest.entrypoints) {
|
|
92
|
+
const factory = runnerFactories[ep.runner];
|
|
93
|
+
if (!factory)
|
|
94
|
+
continue; // runner not registered yet — skip
|
|
95
|
+
const handler = factory(manifest, root, ep.binName, ep.kind);
|
|
96
|
+
registry.register(ep.binName, handler);
|
|
97
|
+
bins.push(ep.binName);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { count: bins.length, bins };
|
|
101
|
+
}
|
|
102
|
+
export function listInstalledRuntimes(vfs, homeDir) {
|
|
103
|
+
return listInstalledManifests(vfs, homeDir).map(({ root, manifest }) => ({
|
|
104
|
+
name: manifest.name,
|
|
105
|
+
version: manifest.version,
|
|
106
|
+
root,
|
|
107
|
+
bins: manifest.entrypoints.map((e) => e.binName),
|
|
108
|
+
sizeBytes: manifest.files.reduce((a, f) => a + f.size, 0),
|
|
109
|
+
license: manifest.license,
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
export async function listAvailableRuntimes(env) {
|
|
113
|
+
const catalog = await fetchCatalog(env);
|
|
114
|
+
return Object.entries(catalog.runtimes)
|
|
115
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
116
|
+
.map(([name, entry]) => ({
|
|
117
|
+
name,
|
|
118
|
+
defaultVersion: entry.default,
|
|
119
|
+
versions: Object.entries(entry.versions)
|
|
120
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
121
|
+
.map(([version, v]) => ({
|
|
122
|
+
version,
|
|
123
|
+
sizeBytes: v.size_bytes,
|
|
124
|
+
license: v.license,
|
|
125
|
+
})),
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
export async function installRuntimeProgrammatic(deps, spec, opts = {}) {
|
|
129
|
+
const stdout = [];
|
|
130
|
+
const stderr = [];
|
|
131
|
+
const ctx = {
|
|
132
|
+
args: [],
|
|
133
|
+
env: {},
|
|
134
|
+
cwd: deps.getHome(),
|
|
135
|
+
stdout: { write: (s) => stdout.push(String(s)) },
|
|
136
|
+
stderr: { write: (s) => stderr.push(String(s)) },
|
|
137
|
+
};
|
|
138
|
+
const args = opts.force ? ['--reinstall', spec] : [spec];
|
|
139
|
+
const exitCode = await runInstall(args, ctx, deps);
|
|
140
|
+
return {
|
|
141
|
+
spec,
|
|
142
|
+
exitCode,
|
|
143
|
+
stdout: stdout.join(''),
|
|
144
|
+
stderr: stderr.join(''),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
export async function ensureRuntimesProgrammatic(deps, specs, opts = {}) {
|
|
148
|
+
const results = [];
|
|
149
|
+
for (const spec of specs) {
|
|
150
|
+
results.push(await installRuntimeProgrammatic(deps, spec, opts));
|
|
151
|
+
}
|
|
152
|
+
return results;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Build the shell-command handler that implements `nimbus install …`,
|
|
156
|
+
* `nimbus uninstall …`. Registered under the name `nimbus`.
|
|
157
|
+
*/
|
|
158
|
+
export function makeNimbusVerbHandler(deps) {
|
|
159
|
+
const { env, vfs, registry, getHome } = deps;
|
|
160
|
+
return async function nimbus(ctx) {
|
|
161
|
+
const argv = ctx.args || [];
|
|
162
|
+
const verb = argv[0];
|
|
163
|
+
const rest = argv.slice(1);
|
|
164
|
+
if (verb === 'install') {
|
|
165
|
+
return runInstall(rest, ctx, { env, vfs, registry, getHome });
|
|
166
|
+
}
|
|
167
|
+
if (verb === 'uninstall') {
|
|
168
|
+
return runUninstall(rest, ctx, { vfs, registry, getHome });
|
|
169
|
+
}
|
|
170
|
+
// Unknown verb.
|
|
171
|
+
ctx.stderr.write(`nimbus: unknown subcommand '${verb || '(none)'}'\n`);
|
|
172
|
+
ctx.stderr.write(`usage: nimbus install <name>[@<version>] | nimbus install --list | nimbus install --available | nimbus uninstall <name>\n`);
|
|
173
|
+
return 2;
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// ── install ──────────────────────────────────────────────────────────
|
|
177
|
+
async function runInstall(args, ctx, deps) {
|
|
178
|
+
// Flag parsing.
|
|
179
|
+
const listOnly = args.includes('--list');
|
|
180
|
+
const availOnly = args.includes('--available');
|
|
181
|
+
const force = args.includes('--reinstall') || args.includes('--force');
|
|
182
|
+
const positional = args.filter((a) => !a.startsWith('--'));
|
|
183
|
+
if (listOnly)
|
|
184
|
+
return runList(ctx, deps);
|
|
185
|
+
if (availOnly)
|
|
186
|
+
return runAvailable(ctx, deps);
|
|
187
|
+
if (positional.length === 0) {
|
|
188
|
+
ctx.stderr.write('nimbus install: missing runtime name\n');
|
|
189
|
+
ctx.stderr.write('usage: nimbus install <name>[@<version>]\n');
|
|
190
|
+
return 2;
|
|
191
|
+
}
|
|
192
|
+
// Parse `<name>` or `<name>@<version>`.
|
|
193
|
+
const spec = positional[0];
|
|
194
|
+
const atIdx = spec.indexOf('@');
|
|
195
|
+
const name = atIdx >= 0 ? spec.slice(0, atIdx) : spec;
|
|
196
|
+
const versionOverride = atIdx >= 0 ? spec.slice(atIdx + 1) : null;
|
|
197
|
+
// Fetch catalog.
|
|
198
|
+
let catalog;
|
|
199
|
+
try {
|
|
200
|
+
catalog = await fetchCatalog(deps.env);
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
ctx.stderr.write(`nimbus install: ${e?.message || e}\n`);
|
|
204
|
+
return 1;
|
|
205
|
+
}
|
|
206
|
+
const runtimeEntry = catalog.runtimes[name];
|
|
207
|
+
if (!runtimeEntry) {
|
|
208
|
+
ctx.stderr.write(`nimbus install: '${name}' is not in catalog\n`);
|
|
209
|
+
ctx.stderr.write(`nimbus install: try 'nimbus install --available' to see installable runtimes\n`);
|
|
210
|
+
return 1;
|
|
211
|
+
}
|
|
212
|
+
const version = versionOverride || runtimeEntry.default;
|
|
213
|
+
const versionEntry = runtimeEntry.versions[version];
|
|
214
|
+
if (!versionEntry) {
|
|
215
|
+
ctx.stderr.write(`nimbus install: '${name}@${version}' not in catalog\n`);
|
|
216
|
+
return 1;
|
|
217
|
+
}
|
|
218
|
+
const home = deps.getHome();
|
|
219
|
+
const root = installRoot(home, name, version);
|
|
220
|
+
// Idempotent: if manifest already on disk + sha-equivalent, skip.
|
|
221
|
+
if (!force && deps.vfs.exists(`${root}/manifest.json`)) {
|
|
222
|
+
// We could re-verify all blob sha256s, but that's expensive. The
|
|
223
|
+
// manifest's presence implies the install completed; we trust it.
|
|
224
|
+
ctx.stdout.write(`[${name}] already installed at ${root} (use --reinstall to refetch)\n`);
|
|
225
|
+
// Still re-register bins in case the registry lost them — idempotent.
|
|
226
|
+
rehydrateInstalledRuntimes(deps.vfs, deps.registry, home);
|
|
227
|
+
return 0;
|
|
228
|
+
}
|
|
229
|
+
// Fetch manifest from R2.
|
|
230
|
+
ctx.stdout.write(`[${name}] fetching manifest...\n`);
|
|
231
|
+
let manifest;
|
|
232
|
+
try {
|
|
233
|
+
manifest = await fetchManifest(deps.env, versionEntry.manifest);
|
|
234
|
+
}
|
|
235
|
+
catch (e) {
|
|
236
|
+
ctx.stderr.write(`nimbus install: ${e?.message || e}\n`);
|
|
237
|
+
return 1;
|
|
238
|
+
}
|
|
239
|
+
// Pre-flight: budget check.
|
|
240
|
+
const totalBytes = manifest.files.reduce((a, f) => a + f.size, 0);
|
|
241
|
+
ctx.stdout.write(`[${name}] manifest: ${manifest.files.length} files, ${(totalBytes / 1024 / 1024).toFixed(1)} MiB\n`);
|
|
242
|
+
// Create install root.
|
|
243
|
+
deps.vfs.mkdir(root, { recursive: true });
|
|
244
|
+
// Write manifest.json first (so a partial install can be retried
|
|
245
|
+
// and the manifest is the source of truth).
|
|
246
|
+
deps.vfs.writeFile(`${root}/manifest.json`, JSON.stringify(manifest, null, 2));
|
|
247
|
+
// W2: bounded-parallel blob fetch (concurrency=3).
|
|
248
|
+
//
|
|
249
|
+
// Pre-W2 this was a serial for-loop awaiting fetchBlob one at a time.
|
|
250
|
+
// For multi-blob bundles (clang has 5 blobs with the two largest
|
|
251
|
+
// dominating wall-clock at ~31 MB + ~19 MB), overlap of network/L2
|
|
252
|
+
// reads cuts cold-install wall-clock by 30-50%. Concurrency capped
|
|
253
|
+
// at 3 to bound memory peak: worst-case clang holds 3 in-flight
|
|
254
|
+
// blobs ≈ ~50-60 MB; well under the DO's 128 MB cap. Memory peak
|
|
255
|
+
// is further bounded by sqlite-vfs.ts pendingWrites auto-flush at
|
|
256
|
+
// 500 chunks / ~32 MiB (`src/vfs/sqlite-vfs.ts:606`).
|
|
257
|
+
//
|
|
258
|
+
// mkdir-parent is hoisted OUT of the worker body so concurrent
|
|
259
|
+
// workers don't race against vfs.mkdir for the same parent. Each
|
|
260
|
+
// unique parent dir is created exactly once, synchronously, BEFORE
|
|
261
|
+
// any worker starts.
|
|
262
|
+
//
|
|
263
|
+
// Manifest-first invariant preserved: this loop runs AFTER the
|
|
264
|
+
// manifest.json write above. Partial-install detection unchanged.
|
|
265
|
+
//
|
|
266
|
+
// Progress UX: with parallel workers, lines arrive in completion
|
|
267
|
+
// order, not start order. The final "[name] installed at … (Y MiB)"
|
|
268
|
+
// line is still the authoritative completion signal.
|
|
269
|
+
const FETCH_CONCURRENCY = 3;
|
|
270
|
+
// Pre-compute + create all unique parent dirs sync. Avoids a
|
|
271
|
+
// mkdir race between workers and is faster than per-blob exists()
|
|
272
|
+
// checks.
|
|
273
|
+
const uniqueParents = new Set();
|
|
274
|
+
for (const f of manifest.files) {
|
|
275
|
+
const target = `${root}/${f.path}`;
|
|
276
|
+
const lastSlash = target.lastIndexOf('/');
|
|
277
|
+
if (lastSlash > 0) {
|
|
278
|
+
uniqueParents.add(target.slice(0, lastSlash));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
for (const parent of uniqueParents) {
|
|
282
|
+
if (!deps.vfs.exists(parent))
|
|
283
|
+
deps.vfs.mkdir(parent, { recursive: true });
|
|
284
|
+
}
|
|
285
|
+
// Hand-rolled worker pool: N workers consume indices off a shared
|
|
286
|
+
// cursor until the queue is empty. Avoids head-of-line blocking
|
|
287
|
+
// that chunked Promise.all suffers (a slow blob in batch i doesn't
|
|
288
|
+
// delay blob i+N from starting).
|
|
289
|
+
const files = manifest.files;
|
|
290
|
+
const total = files.length;
|
|
291
|
+
let nextIdx = 0;
|
|
292
|
+
let completed = 0;
|
|
293
|
+
const workers = Array.from({ length: Math.min(FETCH_CONCURRENCY, total) }, async () => {
|
|
294
|
+
while (true) {
|
|
295
|
+
const i = nextIdx++;
|
|
296
|
+
if (i >= total)
|
|
297
|
+
return;
|
|
298
|
+
const f = files[i];
|
|
299
|
+
const target = `${root}/${f.path}`;
|
|
300
|
+
const bytes = await fetchBlob(deps.env, f.content, f.sha256);
|
|
301
|
+
deps.vfs.writeFile(target, bytes);
|
|
302
|
+
completed++;
|
|
303
|
+
ctx.stdout.write(`[${name}] fetched ${f.path} (${(f.size / 1024 / 1024).toFixed(2)} MiB) ${completed}/${total}\n`);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
await Promise.all(workers);
|
|
307
|
+
// Register entrypoints.
|
|
308
|
+
for (const ep of manifest.entrypoints) {
|
|
309
|
+
const factory = runnerFactories[ep.runner];
|
|
310
|
+
if (!factory) {
|
|
311
|
+
ctx.stderr.write(`[${name}] warning: runner '${ep.runner}' not registered; bin '${ep.binName}' will not be invokable\n`);
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
const handler = factory(manifest, root, ep.binName, ep.kind);
|
|
315
|
+
deps.registry.register(ep.binName, handler);
|
|
316
|
+
}
|
|
317
|
+
ctx.stdout.write(`[${name}] installed at ${root} (${(totalBytes / 1024 / 1024).toFixed(1)} MiB)\n`);
|
|
318
|
+
return 0;
|
|
319
|
+
}
|
|
320
|
+
// ── --list ───────────────────────────────────────────────────────────
|
|
321
|
+
async function runList(ctx, deps) {
|
|
322
|
+
const home = deps.getHome();
|
|
323
|
+
const installed = listInstalledManifests(deps.vfs, home);
|
|
324
|
+
if (installed.length === 0) {
|
|
325
|
+
ctx.stdout.write('(no runtimes installed)\n');
|
|
326
|
+
return 0;
|
|
327
|
+
}
|
|
328
|
+
ctx.stdout.write(`installed runtimes (${installed.length}):\n`);
|
|
329
|
+
for (const { root, manifest } of installed) {
|
|
330
|
+
const totalBytes = manifest.files.reduce((a, f) => a + f.size, 0);
|
|
331
|
+
const bins = manifest.entrypoints.map((e) => e.binName).join(', ');
|
|
332
|
+
ctx.stdout.write(` ${manifest.name}@${manifest.version} ${(totalBytes / 1024 / 1024).toFixed(1)} MiB bins=[${bins}] ${root}\n`);
|
|
333
|
+
}
|
|
334
|
+
return 0;
|
|
335
|
+
}
|
|
336
|
+
// ── --available ──────────────────────────────────────────────────────
|
|
337
|
+
async function runAvailable(ctx, deps) {
|
|
338
|
+
let catalog;
|
|
339
|
+
try {
|
|
340
|
+
catalog = await fetchCatalog(deps.env);
|
|
341
|
+
}
|
|
342
|
+
catch (e) {
|
|
343
|
+
ctx.stderr.write(`nimbus install --available: ${e?.message || e}\n`);
|
|
344
|
+
return 1;
|
|
345
|
+
}
|
|
346
|
+
const names = Object.keys(catalog.runtimes).sort();
|
|
347
|
+
if (names.length === 0) {
|
|
348
|
+
ctx.stdout.write('(no runtimes in catalog)\n');
|
|
349
|
+
return 0;
|
|
350
|
+
}
|
|
351
|
+
ctx.stdout.write(`available runtimes (${names.length}):\n`);
|
|
352
|
+
for (const name of names) {
|
|
353
|
+
const r = catalog.runtimes[name];
|
|
354
|
+
const versions = Object.keys(r.versions);
|
|
355
|
+
ctx.stdout.write(` ${name} default=${r.default} versions=[${versions.join(', ')}]\n`);
|
|
356
|
+
for (const v of versions) {
|
|
357
|
+
const ve = r.versions[v];
|
|
358
|
+
ctx.stdout.write(` ${v} ${(ve.size_bytes / 1024 / 1024).toFixed(1)} MiB license=${ve.license}\n`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return 0;
|
|
362
|
+
}
|
|
363
|
+
// ── uninstall ────────────────────────────────────────────────────────
|
|
364
|
+
async function runUninstall(args, ctx, deps) {
|
|
365
|
+
if (args.length === 0 || args[0].startsWith('--')) {
|
|
366
|
+
ctx.stderr.write('nimbus uninstall: missing runtime name\n');
|
|
367
|
+
return 2;
|
|
368
|
+
}
|
|
369
|
+
const spec = args[0];
|
|
370
|
+
const atIdx = spec.indexOf('@');
|
|
371
|
+
const name = atIdx >= 0 ? spec.slice(0, atIdx) : spec;
|
|
372
|
+
const versionOverride = atIdx >= 0 ? spec.slice(atIdx + 1) : null;
|
|
373
|
+
const home = deps.getHome();
|
|
374
|
+
const installed = listInstalledManifests(deps.vfs, home);
|
|
375
|
+
const matches = installed.filter((x) => x.manifest.name === name && (!versionOverride || x.manifest.version === versionOverride));
|
|
376
|
+
if (matches.length === 0) {
|
|
377
|
+
ctx.stderr.write(`nimbus uninstall: '${name}' is not installed\n`);
|
|
378
|
+
return 1;
|
|
379
|
+
}
|
|
380
|
+
for (const m of matches) {
|
|
381
|
+
// Unregister bins.
|
|
382
|
+
for (const ep of m.manifest.entrypoints) {
|
|
383
|
+
// We don't have a guaranteed `unregister`; bins shadowing is OK
|
|
384
|
+
// because boot-rehydration only re-registers what's still on disk.
|
|
385
|
+
if (typeof deps.registry.unregister === 'function') {
|
|
386
|
+
deps.registry.unregister(ep.binName);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
// Recursive delete via VFS — readdir + unlink + rmdir.
|
|
390
|
+
rmrfVfs(deps.vfs, m.root);
|
|
391
|
+
ctx.stdout.write(`[${m.manifest.name}@${m.manifest.version}] uninstalled (removed ${m.root})\n`);
|
|
392
|
+
}
|
|
393
|
+
// Clean up empty parent dirs (~/.nimbus/runtimes/<name>/ if no
|
|
394
|
+
// versions left; runtimes/ if no runtimes left).
|
|
395
|
+
const runtimeDir = `${home.replace(/^\/+/, '').replace(/\/+$/, '')}/.nimbus/runtimes/${name}`;
|
|
396
|
+
cleanupEmpty(deps.vfs, runtimeDir);
|
|
397
|
+
cleanupEmpty(deps.vfs, `${home.replace(/^\/+/, '').replace(/\/+$/, '')}/.nimbus/runtimes`);
|
|
398
|
+
return 0;
|
|
399
|
+
}
|
|
400
|
+
function rmrfVfs(vfs, path) {
|
|
401
|
+
if (!vfs.exists(path))
|
|
402
|
+
return;
|
|
403
|
+
for (const entry of vfs.readdir(path)) {
|
|
404
|
+
const child = `${path}/${entry.name}`;
|
|
405
|
+
if (entry.type === 'directory') {
|
|
406
|
+
rmrfVfs(vfs, child);
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
vfs.unlink(child);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
vfs.rmdir(path);
|
|
413
|
+
}
|
|
414
|
+
function cleanupEmpty(vfs, path) {
|
|
415
|
+
if (!vfs.exists(path))
|
|
416
|
+
return;
|
|
417
|
+
if (vfs.readdir(path).length === 0) {
|
|
418
|
+
vfs.rmdir(path);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* port-registry.ts — Maps virtual ports to facet stubs.
|
|
3
|
+
*
|
|
4
|
+
* When a facet calls http.createServer().listen(3000), it notifies the
|
|
5
|
+
* supervisor via SupervisorRPC.registerPort(3000). The supervisor stores
|
|
6
|
+
* the facet stub here. When the DO receives a request to /port/3000/*,
|
|
7
|
+
* it looks up the facet and forwards the request.
|
|
8
|
+
*
|
|
9
|
+
* Transport (audit C2):
|
|
10
|
+
* The proxy forwards a real Request and returns a real Response.
|
|
11
|
+
* Workers RPC natively transfers Request/Response values between
|
|
12
|
+
* isolates with streaming bodies and flow control (they are NOT
|
|
13
|
+
* structured-cloneable — RPC has its own transfer mechanism for
|
|
14
|
+
* these types). Binary payloads (images, wasm, gzip, multipart
|
|
15
|
+
* uploads, audio/video) go through byte-for-byte with no UTF-8
|
|
16
|
+
* coercion or JSON envelope anywhere in the path.
|
|
17
|
+
*
|
|
18
|
+
* Facet contract for handleHttpRequest:
|
|
19
|
+
* async handleHttpRequest(request: Request): Promise<Response>
|
|
20
|
+
*
|
|
21
|
+
* where `request.url` is the inner URL the user's HTTP server
|
|
22
|
+
* expects (pathname + search, absolute against a synthetic origin),
|
|
23
|
+
* `request.method`/`headers` mirror the outer request, and
|
|
24
|
+
* `request.body` is a ReadableStream (or null for GET/HEAD) that
|
|
25
|
+
* the facet can consume once. The returned Response is returned
|
|
26
|
+
* to the outer fetch as-is; its body is streamed directly.
|
|
27
|
+
*/
|
|
28
|
+
export interface PortEntry {
|
|
29
|
+
port: number;
|
|
30
|
+
pid: number;
|
|
31
|
+
/**
|
|
32
|
+
* Facet stub exposing `handleHttpRequest(Request): Promise<Response>`.
|
|
33
|
+
* May be null when a facet has reserved a port but not yet wired up
|
|
34
|
+
* the request handler (see _rpcRegisterPort in nimbus-session.ts).
|
|
35
|
+
*/
|
|
36
|
+
facetStub: any;
|
|
37
|
+
registeredAt: number;
|
|
38
|
+
}
|
|
39
|
+
export declare class PortRegistry {
|
|
40
|
+
private ports;
|
|
41
|
+
/** Register a facet as listening on a port. */
|
|
42
|
+
register(port: number, pid: number, facetStub: any): void;
|
|
43
|
+
/** Unregister a port. */
|
|
44
|
+
unregister(port: number): boolean;
|
|
45
|
+
/** Unregister all ports owned by a specific PID. */
|
|
46
|
+
unregisterByPid(pid: number): number;
|
|
47
|
+
/** Look up a port entry. */
|
|
48
|
+
get(port: number): PortEntry | undefined;
|
|
49
|
+
/** Check if a port is registered. */
|
|
50
|
+
has(port: number): boolean;
|
|
51
|
+
/** Get all registered ports. */
|
|
52
|
+
getAll(): PortEntry[];
|
|
53
|
+
/**
|
|
54
|
+
* Forward an HTTP request to the facet owning a port.
|
|
55
|
+
*
|
|
56
|
+
* Returns null if no facet is listening on this port (or if a port
|
|
57
|
+
* is registered but its stub is not yet attached — see PortEntry).
|
|
58
|
+
*
|
|
59
|
+
* The Request passed to the facet has a rewritten URL whose pathname
|
|
60
|
+
* is the inner path (without the `/port/<n>` prefix) and whose origin
|
|
61
|
+
* matches the outer request, so user code reading `request.url`
|
|
62
|
+
* sees a URL shape consistent with "my server is running at this
|
|
63
|
+
* port". Headers and body are forwarded unchanged; the body is a
|
|
64
|
+
* ReadableStream so binary payloads aren't materialised in memory.
|
|
65
|
+
*
|
|
66
|
+
* Binary safety: both directions use structured-cloneable Request/
|
|
67
|
+
* Response values over Workers RPC. No UTF-8 round-trip anywhere.
|
|
68
|
+
* A user-facet serving a PNG will return the exact same bytes the
|
|
69
|
+
* client receives.
|
|
70
|
+
*/
|
|
71
|
+
routeRequest(port: number, request: Request, pathname: string): Promise<Response | null>;
|
|
72
|
+
get stats(): {
|
|
73
|
+
activePorts: number;
|
|
74
|
+
ports: {
|
|
75
|
+
port: number;
|
|
76
|
+
pid: number;
|
|
77
|
+
}[];
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=port-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-registry.d.ts","sourceRoot":"","sources":["../../src/runtime/port-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,SAAS,EAAE,GAAG,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAgC;IAE7C,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI;IAIzD,yBAAyB;IACzB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,oDAAoD;IACpD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAWpC,4BAA4B;IAC5B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIxC,qCAAqC;IACrC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,gCAAgC;IAChC,MAAM,IAAI,SAAS,EAAE;IAIrB;;;;;;;;;;;;;;;;;OAiBG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA8F9F,IAAI,KAAK;;;;;;MAKR;CACF"}
|