@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,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* repl-session.ts — substrate for interactive REPL sessions.
|
|
3
|
+
*
|
|
4
|
+
* Per /workspace/.seal-internal/2026-05-11-repl-plan/plan.md §§2-4:
|
|
5
|
+
* Layer 1: long-lived runtime via repeated execute() into a cached
|
|
6
|
+
* child-facet isolate (state persists on globalThis).
|
|
7
|
+
* Layer 2: stdin routing via WebSocketTerminal.attachRepl().
|
|
8
|
+
* Layer 3: prompt detection per-runtime — Pyodide uses sentinel-
|
|
9
|
+
* controlled sys.ps1; Bun/Node/Ruby use per-runtime regex.
|
|
10
|
+
*
|
|
11
|
+
* This file owns the runtime-agnostic plumbing. Per-runtime adapters
|
|
12
|
+
* live in src/runtime/<name>-repl.ts and implement the ReplAdapter
|
|
13
|
+
* interface declared below.
|
|
14
|
+
*/
|
|
15
|
+
import type { WebSocketTerminal } from '../facets/ws-terminal.js';
|
|
16
|
+
/**
|
|
17
|
+
* Per-runtime adapter contract. The shell-side ReplSession orchestrates
|
|
18
|
+
* input handling; the adapter wraps the actual runtime invocation.
|
|
19
|
+
*/
|
|
20
|
+
export interface ReplAdapter {
|
|
21
|
+
/** Called once when the session starts. Returns the banner to print
|
|
22
|
+
* before the first prompt. */
|
|
23
|
+
banner(): string;
|
|
24
|
+
/** Send a complete line of user input. Returns:
|
|
25
|
+
* - kind === 'output': normal eval result; resume reading at prompt.
|
|
26
|
+
* - kind === 'incomplete': need more input (multi-line block).
|
|
27
|
+
* - kind === 'exit': REPL should close with the given exit code.
|
|
28
|
+
* - kind === 'error': error message to display; resume at prompt.
|
|
29
|
+
*/
|
|
30
|
+
push(line: string): Promise<ReplPushResult>;
|
|
31
|
+
/** Called once on session close (exit() / Ctrl-D / shell teardown).
|
|
32
|
+
* Should free any cached pool / isolate. Idempotent. */
|
|
33
|
+
close(): Promise<void>;
|
|
34
|
+
/** Primary prompt (typically '>>> '). */
|
|
35
|
+
ps1: string;
|
|
36
|
+
/** Continuation prompt (typically '... '). */
|
|
37
|
+
ps2: string;
|
|
38
|
+
}
|
|
39
|
+
export type ReplPushResult = {
|
|
40
|
+
kind: 'output';
|
|
41
|
+
stdout: string;
|
|
42
|
+
stderr: string;
|
|
43
|
+
} | {
|
|
44
|
+
kind: 'incomplete';
|
|
45
|
+
} | {
|
|
46
|
+
kind: 'exit';
|
|
47
|
+
exitCode: number;
|
|
48
|
+
stdout?: string;
|
|
49
|
+
stderr?: string;
|
|
50
|
+
} | {
|
|
51
|
+
kind: 'error';
|
|
52
|
+
stderr: string;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Manages an interactive REPL session: stdin buffering with minimal
|
|
56
|
+
* readline UX (line-mode), output routing to the WS terminal, prompt
|
|
57
|
+
* rendering, and adapter dispatch.
|
|
58
|
+
*
|
|
59
|
+
* The shell creates a ReplSession when a runtime's `startRepl` hook
|
|
60
|
+
* fires; the session installs a `replCallback` on the WebSocketTerminal
|
|
61
|
+
* (via attachRepl()) and runs until the adapter signals 'exit' or the
|
|
62
|
+
* user presses Ctrl-D on an empty line.
|
|
63
|
+
*
|
|
64
|
+
* No setTimeout in the read loop — the session is driven entirely by
|
|
65
|
+
* keystroke arrival on the WS, with awaits gating the adapter's push().
|
|
66
|
+
*/
|
|
67
|
+
export declare class ReplSession {
|
|
68
|
+
private adapter;
|
|
69
|
+
private terminal;
|
|
70
|
+
private detachReplCb;
|
|
71
|
+
/**
|
|
72
|
+
* REPL-R7-1 (2026-05-12): optional reference to the lifo-sh Shell.
|
|
73
|
+
*
|
|
74
|
+
* Required when the REPL is launched from a multi-line WS frame
|
|
75
|
+
* (e.g. user pastes `python\nexit(7)`). lifo-sh's input handler
|
|
76
|
+
* (node_modules/@lifo-sh/core/dist/index-Djm2onjx.js:5855
|
|
77
|
+
* `handleInput`) splits the frame on \r\n and pushes lines AFTER
|
|
78
|
+
* the first into `shell.pasteQueue`, which is drained ONLY when
|
|
79
|
+
* the shell becomes idle (after executeLine returns). While our
|
|
80
|
+
* REPL is running, those pasteQueue lines sit there waiting and
|
|
81
|
+
* the REPL itself receives no input → user sees a hung `>>> `
|
|
82
|
+
* prompt that never responds.
|
|
83
|
+
*
|
|
84
|
+
* If `shell` is provided, ReplSession will, immediately after
|
|
85
|
+
* attaching its replCallback, drain shell.pasteQueue and feed the
|
|
86
|
+
* lines into the callback (suffixed with \r each — matches what
|
|
87
|
+
* the WS frame originally would have looked like). This makes the
|
|
88
|
+
* paste path work transparently for REPL launches.
|
|
89
|
+
*
|
|
90
|
+
* The shell reference is optional so existing adapters (bun, node,
|
|
91
|
+
* ruby) that haven't been updated keep working with their
|
|
92
|
+
* pre-fix behavior.
|
|
93
|
+
*/
|
|
94
|
+
private shellRef;
|
|
95
|
+
/** Current line buffer (chars typed since the last enter). */
|
|
96
|
+
private lineBuf;
|
|
97
|
+
/** Cursor position within lineBuf (0 = beginning). */
|
|
98
|
+
private cursorPos;
|
|
99
|
+
/** Accumulated lines for a multi-line block (e.g. inside def/class). */
|
|
100
|
+
private blockBuf;
|
|
101
|
+
/** True while the adapter is processing a push (block subsequent submits). */
|
|
102
|
+
private busy;
|
|
103
|
+
/** Per-session history ring (most recent first). Capped at 100. */
|
|
104
|
+
private history;
|
|
105
|
+
private historyIdx;
|
|
106
|
+
/** Resolves when close() has been called and the session ended. */
|
|
107
|
+
private closedResolve;
|
|
108
|
+
private closedPromise;
|
|
109
|
+
/** Exit code captured from adapter's last 'exit' return. */
|
|
110
|
+
private exitCode;
|
|
111
|
+
/**
|
|
112
|
+
* REPL-A1b (master plan §1 + user-evidence 2026-05-11): handleInput
|
|
113
|
+
* is invoked fire-and-forget per WS frame. Multiple WS frames arrive
|
|
114
|
+
* in quick succession during real REPL use (and during probes that
|
|
115
|
+
* send multiple lines without waiting for prompt). Without
|
|
116
|
+
* serialization, two concurrent handleInput coroutines both hit `\r`
|
|
117
|
+
* and call submitLine(); blockBuf accumulates wrong source; PyodideConsole
|
|
118
|
+
* gets `print("hi")\\nexit()` as a single 'single'-mode compile →
|
|
119
|
+
* "multiple statements found while compiling a single statement"
|
|
120
|
+
* SyntaxError.
|
|
121
|
+
*
|
|
122
|
+
* Fix: chain handleInput invocations through inputQueue. Each WS
|
|
123
|
+
* frame appends to queue; a single drain task processes the queue
|
|
124
|
+
* sequentially. submitLine's await is properly ordered relative to
|
|
125
|
+
* the next frame's chars.
|
|
126
|
+
*/
|
|
127
|
+
private inputQueue;
|
|
128
|
+
private draining;
|
|
129
|
+
constructor(adapter: ReplAdapter, terminal: WebSocketTerminal, shell?: any);
|
|
130
|
+
/** Run the session: prints banner, installs the input hook, returns
|
|
131
|
+
* a promise that resolves with the exit code when the session ends. */
|
|
132
|
+
run(): Promise<number>;
|
|
133
|
+
/**
|
|
134
|
+
* REPL-A1b: drain the input queue serially. Pulls data off
|
|
135
|
+
* inputQueue, runs handleInput, and reads any data that arrived
|
|
136
|
+
* during the await. Exits when queue is empty. Only ONE drainInput
|
|
137
|
+
* runs at a time (guarded by draining flag set in attachRepl
|
|
138
|
+
* callback).
|
|
139
|
+
*/
|
|
140
|
+
private drainInput;
|
|
141
|
+
/** Process an input chunk. May contain multiple characters (paste
|
|
142
|
+
* or rapid typing) — we iterate char-by-char to handle each
|
|
143
|
+
* control byte individually. */
|
|
144
|
+
private handleInput;
|
|
145
|
+
/** Submit the current line buffer to the adapter. */
|
|
146
|
+
private submitLine;
|
|
147
|
+
/** Map up-arrow → previous history entry. */
|
|
148
|
+
private historyUp;
|
|
149
|
+
/** Map down-arrow → next (newer) history entry. */
|
|
150
|
+
private historyDown;
|
|
151
|
+
/** Erase the current displayed line and replace with `text`. */
|
|
152
|
+
private replaceCurrentLine;
|
|
153
|
+
/** Normalize LF → CRLF for terminal display. The WS terminal does not
|
|
154
|
+
* do this automatically; raw \n leaves the cursor at column-0 of a
|
|
155
|
+
* new row WITHOUT carriage return (xterm convention). */
|
|
156
|
+
private normalizeNewlines;
|
|
157
|
+
/** Close the session: detach input hook, free adapter, resolve. */
|
|
158
|
+
private endSession;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=repl-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl-session.d.ts","sourceRoot":"","sources":["../../src/runtime/repl-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;mCAC+B;IAC/B,MAAM,IAAI,MAAM,CAAC;IACjB;;;;;OAKG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5C;6DACyD;IACzD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,YAAY,CAA6B;IACjD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,QAAQ,CAAa;IAE7B,8DAA8D;IAC9D,OAAO,CAAC,OAAO,CAAc;IAC7B,sDAAsD;IACtD,OAAO,CAAC,SAAS,CAAa;IAC9B,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAgB;IAChC,8EAA8E;IAC9E,OAAO,CAAC,IAAI,CAAkB;IAC9B,mEAAmE;IACnE,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAc;IAChC,mEAAmE;IACnE,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,aAAa,CAAgB;IACrC,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAa;IAC7B;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,GAAG;IAU1E;4EACwE;IAClE,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IAyD5B;;;;;;OAMG;YACW,UAAU;IASxB;;qCAEiC;YACnB,WAAW;IA6EzB,qDAAqD;YACvC,UAAU;IA8ExB,6CAA6C;IAC7C,OAAO,CAAC,SAAS;IAMjB,mDAAmD;IACnD,OAAO,CAAC,WAAW;IAUnB,gEAAgE;IAChE,OAAO,CAAC,kBAAkB;IAW1B;;8DAE0D;IAC1D,OAAO,CAAC,iBAAiB;IAIzB,mEAAmE;YACrD,UAAU;CAYzB"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* repl-session.ts — substrate for interactive REPL sessions.
|
|
3
|
+
*
|
|
4
|
+
* Per /workspace/.seal-internal/2026-05-11-repl-plan/plan.md §§2-4:
|
|
5
|
+
* Layer 1: long-lived runtime via repeated execute() into a cached
|
|
6
|
+
* child-facet isolate (state persists on globalThis).
|
|
7
|
+
* Layer 2: stdin routing via WebSocketTerminal.attachRepl().
|
|
8
|
+
* Layer 3: prompt detection per-runtime — Pyodide uses sentinel-
|
|
9
|
+
* controlled sys.ps1; Bun/Node/Ruby use per-runtime regex.
|
|
10
|
+
*
|
|
11
|
+
* This file owns the runtime-agnostic plumbing. Per-runtime adapters
|
|
12
|
+
* live in src/runtime/<name>-repl.ts and implement the ReplAdapter
|
|
13
|
+
* interface declared below.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Manages an interactive REPL session: stdin buffering with minimal
|
|
17
|
+
* readline UX (line-mode), output routing to the WS terminal, prompt
|
|
18
|
+
* rendering, and adapter dispatch.
|
|
19
|
+
*
|
|
20
|
+
* The shell creates a ReplSession when a runtime's `startRepl` hook
|
|
21
|
+
* fires; the session installs a `replCallback` on the WebSocketTerminal
|
|
22
|
+
* (via attachRepl()) and runs until the adapter signals 'exit' or the
|
|
23
|
+
* user presses Ctrl-D on an empty line.
|
|
24
|
+
*
|
|
25
|
+
* No setTimeout in the read loop — the session is driven entirely by
|
|
26
|
+
* keystroke arrival on the WS, with awaits gating the adapter's push().
|
|
27
|
+
*/
|
|
28
|
+
export class ReplSession {
|
|
29
|
+
adapter;
|
|
30
|
+
terminal;
|
|
31
|
+
detachReplCb = null;
|
|
32
|
+
/**
|
|
33
|
+
* REPL-R7-1 (2026-05-12): optional reference to the lifo-sh Shell.
|
|
34
|
+
*
|
|
35
|
+
* Required when the REPL is launched from a multi-line WS frame
|
|
36
|
+
* (e.g. user pastes `python\nexit(7)`). lifo-sh's input handler
|
|
37
|
+
* (node_modules/@lifo-sh/core/dist/index-Djm2onjx.js:5855
|
|
38
|
+
* `handleInput`) splits the frame on \r\n and pushes lines AFTER
|
|
39
|
+
* the first into `shell.pasteQueue`, which is drained ONLY when
|
|
40
|
+
* the shell becomes idle (after executeLine returns). While our
|
|
41
|
+
* REPL is running, those pasteQueue lines sit there waiting and
|
|
42
|
+
* the REPL itself receives no input → user sees a hung `>>> `
|
|
43
|
+
* prompt that never responds.
|
|
44
|
+
*
|
|
45
|
+
* If `shell` is provided, ReplSession will, immediately after
|
|
46
|
+
* attaching its replCallback, drain shell.pasteQueue and feed the
|
|
47
|
+
* lines into the callback (suffixed with \r each — matches what
|
|
48
|
+
* the WS frame originally would have looked like). This makes the
|
|
49
|
+
* paste path work transparently for REPL launches.
|
|
50
|
+
*
|
|
51
|
+
* The shell reference is optional so existing adapters (bun, node,
|
|
52
|
+
* ruby) that haven't been updated keep working with their
|
|
53
|
+
* pre-fix behavior.
|
|
54
|
+
*/
|
|
55
|
+
shellRef = null;
|
|
56
|
+
/** Current line buffer (chars typed since the last enter). */
|
|
57
|
+
lineBuf = '';
|
|
58
|
+
/** Cursor position within lineBuf (0 = beginning). */
|
|
59
|
+
cursorPos = 0;
|
|
60
|
+
/** Accumulated lines for a multi-line block (e.g. inside def/class). */
|
|
61
|
+
blockBuf = [];
|
|
62
|
+
/** True while the adapter is processing a push (block subsequent submits). */
|
|
63
|
+
busy = false;
|
|
64
|
+
/** Per-session history ring (most recent first). Capped at 100. */
|
|
65
|
+
history = [];
|
|
66
|
+
historyIdx = -1;
|
|
67
|
+
/** Resolves when close() has been called and the session ended. */
|
|
68
|
+
closedResolve = null;
|
|
69
|
+
closedPromise;
|
|
70
|
+
/** Exit code captured from adapter's last 'exit' return. */
|
|
71
|
+
exitCode = 0;
|
|
72
|
+
/**
|
|
73
|
+
* REPL-A1b (master plan §1 + user-evidence 2026-05-11): handleInput
|
|
74
|
+
* is invoked fire-and-forget per WS frame. Multiple WS frames arrive
|
|
75
|
+
* in quick succession during real REPL use (and during probes that
|
|
76
|
+
* send multiple lines without waiting for prompt). Without
|
|
77
|
+
* serialization, two concurrent handleInput coroutines both hit `\r`
|
|
78
|
+
* and call submitLine(); blockBuf accumulates wrong source; PyodideConsole
|
|
79
|
+
* gets `print("hi")\\nexit()` as a single 'single'-mode compile →
|
|
80
|
+
* "multiple statements found while compiling a single statement"
|
|
81
|
+
* SyntaxError.
|
|
82
|
+
*
|
|
83
|
+
* Fix: chain handleInput invocations through inputQueue. Each WS
|
|
84
|
+
* frame appends to queue; a single drain task processes the queue
|
|
85
|
+
* sequentially. submitLine's await is properly ordered relative to
|
|
86
|
+
* the next frame's chars.
|
|
87
|
+
*/
|
|
88
|
+
inputQueue = '';
|
|
89
|
+
draining = false;
|
|
90
|
+
constructor(adapter, terminal, shell) {
|
|
91
|
+
this.adapter = adapter;
|
|
92
|
+
this.terminal = terminal;
|
|
93
|
+
// REPL-R7-1: optional shell reference for pasteQueue drain.
|
|
94
|
+
this.shellRef = shell ?? null;
|
|
95
|
+
this.closedPromise = new Promise((resolve) => {
|
|
96
|
+
this.closedResolve = resolve;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/** Run the session: prints banner, installs the input hook, returns
|
|
100
|
+
* a promise that resolves with the exit code when the session ends. */
|
|
101
|
+
async run() {
|
|
102
|
+
// 1. Print banner from adapter.
|
|
103
|
+
const banner = this.adapter.banner();
|
|
104
|
+
if (banner)
|
|
105
|
+
this.terminal.write(banner);
|
|
106
|
+
if (banner && !banner.endsWith('\n'))
|
|
107
|
+
this.terminal.write('\r\n');
|
|
108
|
+
// 2. Print primary prompt.
|
|
109
|
+
this.terminal.write(this.adapter.ps1);
|
|
110
|
+
// 3. Install the input handler.
|
|
111
|
+
// REPL-A1b: per-frame data appended to inputQueue; single drain
|
|
112
|
+
// task ensures serial processing across multiple WS frames.
|
|
113
|
+
this.detachReplCb = this.terminal.attachRepl((data) => {
|
|
114
|
+
this.inputQueue += data;
|
|
115
|
+
if (!this.draining) {
|
|
116
|
+
this.draining = true;
|
|
117
|
+
void this.drainInput();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// REPL-R7-1: drain any input that the shell received in the SAME
|
|
121
|
+
// WS frame as the REPL-launching command (`python\nexit(7)` style
|
|
122
|
+
// pastes). Without this drain, those lines sit forever in
|
|
123
|
+
// shell.pasteQueue while the REPL hangs at `>>> `.
|
|
124
|
+
//
|
|
125
|
+
// Each pasteQueue entry is a single line (no \r/\n). We re-frame
|
|
126
|
+
// each into the replCallback as `line + \r` so handleInput
|
|
127
|
+
// processes it through the normal Enter-triggered submitLine
|
|
128
|
+
// path — same behavior as if the user had typed and pressed
|
|
129
|
+
// Enter for each line.
|
|
130
|
+
//
|
|
131
|
+
// Best-effort: if shellRef is null or pasteQueue is missing,
|
|
132
|
+
// skip silently. Mutate the queue (shift) so the shell doesn't
|
|
133
|
+
// try to re-process the same items when it drains its own queue
|
|
134
|
+
// after this REPL exits.
|
|
135
|
+
if (this.shellRef && Array.isArray(this.shellRef.pasteQueue)) {
|
|
136
|
+
const pq = this.shellRef.pasteQueue;
|
|
137
|
+
if (pq.length > 0) {
|
|
138
|
+
const drained = pq.splice(0).filter(line => line !== undefined && line !== null);
|
|
139
|
+
if (drained.length > 0) {
|
|
140
|
+
// Feed via inputQueue + draining (same path as a real WS
|
|
141
|
+
// frame). Each line ends with \r so handleInput's
|
|
142
|
+
// submitLine fires per line.
|
|
143
|
+
this.inputQueue += drained.join('\r') + '\r';
|
|
144
|
+
if (!this.draining) {
|
|
145
|
+
this.draining = true;
|
|
146
|
+
void this.drainInput();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// 4. Wait until close() is called.
|
|
152
|
+
await this.closedPromise;
|
|
153
|
+
return this.exitCode;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* REPL-A1b: drain the input queue serially. Pulls data off
|
|
157
|
+
* inputQueue, runs handleInput, and reads any data that arrived
|
|
158
|
+
* during the await. Exits when queue is empty. Only ONE drainInput
|
|
159
|
+
* runs at a time (guarded by draining flag set in attachRepl
|
|
160
|
+
* callback).
|
|
161
|
+
*/
|
|
162
|
+
async drainInput() {
|
|
163
|
+
while (this.inputQueue.length > 0) {
|
|
164
|
+
const chunk = this.inputQueue;
|
|
165
|
+
this.inputQueue = '';
|
|
166
|
+
await this.handleInput(chunk);
|
|
167
|
+
}
|
|
168
|
+
this.draining = false;
|
|
169
|
+
}
|
|
170
|
+
/** Process an input chunk. May contain multiple characters (paste
|
|
171
|
+
* or rapid typing) — we iterate char-by-char to handle each
|
|
172
|
+
* control byte individually. */
|
|
173
|
+
async handleInput(data) {
|
|
174
|
+
for (let i = 0; i < data.length; i++) {
|
|
175
|
+
const ch = data[i];
|
|
176
|
+
// CTRL-D (0x04): on empty line, close cleanly.
|
|
177
|
+
if (ch === '\x04') {
|
|
178
|
+
if (this.lineBuf.length === 0 && this.blockBuf.length === 0 && !this.busy) {
|
|
179
|
+
this.terminal.write('\r\n');
|
|
180
|
+
await this.endSession(0);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Non-empty line: ignore (matches CPython REPL behavior).
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
// CTRL-C (0x03): cancel current line / block.
|
|
187
|
+
if (ch === '\x03') {
|
|
188
|
+
if (this.busy) {
|
|
189
|
+
// Mid-execution: we can't actually interrupt the wasm runtime
|
|
190
|
+
// in v1 (no SIGINT plumbing). Buffer the cancel for after.
|
|
191
|
+
// For now: just display ^C and let the runtime finish.
|
|
192
|
+
this.terminal.write('^C\r\n');
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
// Idle: discard current buffer, reset, fresh prompt.
|
|
196
|
+
this.lineBuf = '';
|
|
197
|
+
this.cursorPos = 0;
|
|
198
|
+
this.blockBuf = [];
|
|
199
|
+
this.terminal.write('\r\nKeyboardInterrupt\r\n' + this.adapter.ps1);
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
// Enter (\r or \n): submit the line.
|
|
203
|
+
if (ch === '\r' || ch === '\n') {
|
|
204
|
+
await this.submitLine();
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
// Backspace (0x7f) or DEL (\b 0x08): delete char before cursor.
|
|
208
|
+
if (ch === '\x7f' || ch === '\b') {
|
|
209
|
+
if (this.cursorPos > 0) {
|
|
210
|
+
this.lineBuf =
|
|
211
|
+
this.lineBuf.slice(0, this.cursorPos - 1) +
|
|
212
|
+
this.lineBuf.slice(this.cursorPos);
|
|
213
|
+
this.cursorPos--;
|
|
214
|
+
// Repaint: move cursor back, write rest, clear trailing, restore.
|
|
215
|
+
this.terminal.write('\b' + this.lineBuf.slice(this.cursorPos) + ' \b');
|
|
216
|
+
// Cursor sits one past the rewritten chars; pull it back to position.
|
|
217
|
+
const tail = this.lineBuf.slice(this.cursorPos).length;
|
|
218
|
+
for (let k = 0; k < tail; k++)
|
|
219
|
+
this.terminal.write('\b');
|
|
220
|
+
}
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
// ANSI escape sequence (arrow keys, etc.). Buffer the full sequence
|
|
224
|
+
// by reading ahead. v1: only handle up/down arrows for history;
|
|
225
|
+
// left/right are deferred (minimal readline = no in-line editing).
|
|
226
|
+
if (ch === '\x1b' && i + 2 < data.length && data[i + 1] === '[') {
|
|
227
|
+
const code = data[i + 2];
|
|
228
|
+
if (code === 'A') {
|
|
229
|
+
this.historyUp();
|
|
230
|
+
i += 2;
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
if (code === 'B') {
|
|
234
|
+
this.historyDown();
|
|
235
|
+
i += 2;
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
// C/D (left/right) and others: ignore.
|
|
239
|
+
i += 2;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
// Printable char: append + echo.
|
|
243
|
+
if (ch >= ' ' && ch !== '\x7f') {
|
|
244
|
+
if (this.cursorPos === this.lineBuf.length) {
|
|
245
|
+
this.lineBuf += ch;
|
|
246
|
+
this.cursorPos++;
|
|
247
|
+
this.terminal.write(ch);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// Mid-line insert (rare without left-arrow editing in v1).
|
|
251
|
+
this.lineBuf =
|
|
252
|
+
this.lineBuf.slice(0, this.cursorPos) + ch + this.lineBuf.slice(this.cursorPos);
|
|
253
|
+
this.cursorPos++;
|
|
254
|
+
this.terminal.write(ch);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/** Submit the current line buffer to the adapter. */
|
|
260
|
+
async submitLine() {
|
|
261
|
+
this.terminal.write('\r\n');
|
|
262
|
+
const line = this.lineBuf;
|
|
263
|
+
this.lineBuf = '';
|
|
264
|
+
this.cursorPos = 0;
|
|
265
|
+
// Record in history (skip blank and duplicate-of-most-recent).
|
|
266
|
+
if (line.length > 0 && this.history[0] !== line) {
|
|
267
|
+
this.history.unshift(line);
|
|
268
|
+
if (this.history.length > 100)
|
|
269
|
+
this.history.length = 100;
|
|
270
|
+
}
|
|
271
|
+
this.historyIdx = -1;
|
|
272
|
+
// Accumulate block lines.
|
|
273
|
+
this.blockBuf.push(line);
|
|
274
|
+
const fullSource = this.blockBuf.join('\n');
|
|
275
|
+
this.busy = true;
|
|
276
|
+
let result;
|
|
277
|
+
try {
|
|
278
|
+
result = await this.adapter.push(fullSource);
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
result = {
|
|
282
|
+
kind: 'error',
|
|
283
|
+
stderr: `[repl] adapter threw: ${e?.message || e}\n`,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
this.busy = false;
|
|
287
|
+
// REPL-A1 (master plan §1): emit stdout, stderr, and the next-prompt
|
|
288
|
+
// as three discrete WS frames in deterministic order. Without
|
|
289
|
+
// flushNow() between them, the 5 ms coalescer in WebSocketTerminal
|
|
290
|
+
// joins them into one `{type:'output'}` payload — probes asserting
|
|
291
|
+
// frame ordering see false-RED, and xterm renders correctly only
|
|
292
|
+
// because string-order is preserved. flushNow() guarantees both
|
|
293
|
+
// are true: bytes-in-order AND frame-boundary-after-each-stream.
|
|
294
|
+
if (result.kind === 'output') {
|
|
295
|
+
if (result.stdout) {
|
|
296
|
+
this.terminal.write(this.normalizeNewlines(result.stdout));
|
|
297
|
+
this.terminal.flushNow();
|
|
298
|
+
}
|
|
299
|
+
if (result.stderr) {
|
|
300
|
+
this.terminal.write(this.normalizeNewlines(result.stderr));
|
|
301
|
+
this.terminal.flushNow();
|
|
302
|
+
}
|
|
303
|
+
this.blockBuf = [];
|
|
304
|
+
this.terminal.write(this.adapter.ps1);
|
|
305
|
+
this.terminal.flushNow();
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
if (result.kind === 'incomplete') {
|
|
309
|
+
this.terminal.write(this.adapter.ps2);
|
|
310
|
+
this.terminal.flushNow();
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (result.kind === 'error') {
|
|
314
|
+
if (result.stderr) {
|
|
315
|
+
this.terminal.write(this.normalizeNewlines(result.stderr));
|
|
316
|
+
this.terminal.flushNow();
|
|
317
|
+
}
|
|
318
|
+
this.blockBuf = [];
|
|
319
|
+
this.terminal.write(this.adapter.ps1);
|
|
320
|
+
this.terminal.flushNow();
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
if (result.kind === 'exit') {
|
|
324
|
+
if (result.stdout) {
|
|
325
|
+
this.terminal.write(this.normalizeNewlines(result.stdout));
|
|
326
|
+
this.terminal.flushNow();
|
|
327
|
+
}
|
|
328
|
+
if (result.stderr) {
|
|
329
|
+
this.terminal.write(this.normalizeNewlines(result.stderr));
|
|
330
|
+
this.terminal.flushNow();
|
|
331
|
+
}
|
|
332
|
+
await this.endSession(result.exitCode);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/** Map up-arrow → previous history entry. */
|
|
337
|
+
historyUp() {
|
|
338
|
+
if (this.history.length === 0)
|
|
339
|
+
return;
|
|
340
|
+
if (this.historyIdx < this.history.length - 1)
|
|
341
|
+
this.historyIdx++;
|
|
342
|
+
this.replaceCurrentLine(this.history[this.historyIdx]);
|
|
343
|
+
}
|
|
344
|
+
/** Map down-arrow → next (newer) history entry. */
|
|
345
|
+
historyDown() {
|
|
346
|
+
if (this.historyIdx <= 0) {
|
|
347
|
+
this.historyIdx = -1;
|
|
348
|
+
this.replaceCurrentLine('');
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
this.historyIdx--;
|
|
352
|
+
this.replaceCurrentLine(this.history[this.historyIdx]);
|
|
353
|
+
}
|
|
354
|
+
/** Erase the current displayed line and replace with `text`. */
|
|
355
|
+
replaceCurrentLine(text) {
|
|
356
|
+
// Erase current chars: backspace + space + backspace per char.
|
|
357
|
+
const oldLen = this.lineBuf.length;
|
|
358
|
+
for (let i = 0; i < this.cursorPos; i++)
|
|
359
|
+
this.terminal.write('\b');
|
|
360
|
+
for (let i = 0; i < oldLen; i++)
|
|
361
|
+
this.terminal.write(' ');
|
|
362
|
+
for (let i = 0; i < oldLen; i++)
|
|
363
|
+
this.terminal.write('\b');
|
|
364
|
+
this.lineBuf = text;
|
|
365
|
+
this.cursorPos = text.length;
|
|
366
|
+
this.terminal.write(text);
|
|
367
|
+
}
|
|
368
|
+
/** Normalize LF → CRLF for terminal display. The WS terminal does not
|
|
369
|
+
* do this automatically; raw \n leaves the cursor at column-0 of a
|
|
370
|
+
* new row WITHOUT carriage return (xterm convention). */
|
|
371
|
+
normalizeNewlines(s) {
|
|
372
|
+
return s.replace(/\r?\n/g, '\r\n');
|
|
373
|
+
}
|
|
374
|
+
/** Close the session: detach input hook, free adapter, resolve. */
|
|
375
|
+
async endSession(code) {
|
|
376
|
+
this.exitCode = code;
|
|
377
|
+
if (this.detachReplCb) {
|
|
378
|
+
try {
|
|
379
|
+
this.detachReplCb();
|
|
380
|
+
}
|
|
381
|
+
catch { /* fail-soft */ }
|
|
382
|
+
this.detachReplCb = null;
|
|
383
|
+
}
|
|
384
|
+
try {
|
|
385
|
+
await this.adapter.close();
|
|
386
|
+
}
|
|
387
|
+
catch { /* fail-soft */ }
|
|
388
|
+
if (this.closedResolve) {
|
|
389
|
+
this.closedResolve();
|
|
390
|
+
this.closedResolve = null;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* require-resolver.ts — Server-side dependency graph resolver for Nimbus.
|
|
3
|
+
*
|
|
4
|
+
* Runs on the supervisor (which has synchronous VFS access) to trace
|
|
5
|
+
* all require() calls and build a complete file bundle reachable from
|
|
6
|
+
* the entry point. The output is consumed by `facet-manager.ts`'s
|
|
7
|
+
* `buildPrefetchBundle` (W2.6a) to ship ONLY the reachable set into
|
|
8
|
+
* the dynamic-worker module (rather than every file in node_modules
|
|
9
|
+
* up to the legacy cap).
|
|
10
|
+
*
|
|
11
|
+
* Algorithm:
|
|
12
|
+
* 1. Parse `require('xxx')` / `require("xxx")` / ``require(`xxx`)``
|
|
13
|
+
* and `require.resolve('xxx')` calls from entry code via regex.
|
|
14
|
+
* 2. Resolve each via the SHARED `resolvePackageEntry` helper from
|
|
15
|
+
* src/_shared/exports-resolver.ts — same impl that node-shims
|
|
16
|
+
* and npm-resolver use, so prefetch and runtime always agree on
|
|
17
|
+
* which file `require('xyz')` means (W2.6a D6: no dual impls).
|
|
18
|
+
* 3. Read the resolved file, recursively parse ITS requires.
|
|
19
|
+
* 4. Return Record<string, string> of path → content.
|
|
20
|
+
*
|
|
21
|
+
* Limits (sub-agent §Q1 caveats — extended regex still misses dynamic
|
|
22
|
+
* requires like `require(variable)` and ESM `import` statements; greedy
|
|
23
|
+
* oversampling in facet-manager.ts:buildPrefetchBundle compensates).
|
|
24
|
+
*
|
|
25
|
+
* History: this file was ARC-A-P1 quarantined after W2 because the
|
|
26
|
+
* legacy `buildVfsBundle` walked every file in node_modules. W2.6a
|
|
27
|
+
* de-quarantines it as the primary content-bundle source.
|
|
28
|
+
*/
|
|
29
|
+
import type { SqliteVFS } from '../vfs/sqlite-vfs.js';
|
|
30
|
+
/**
|
|
31
|
+
* Result of a prefetch walk.
|
|
32
|
+
* - bundle: path → content for every reachable file.
|
|
33
|
+
* - visited: set of pkgDirs (e.g. 'home/user/app/node_modules/fastify')
|
|
34
|
+
* encountered during the walk. Caller uses this to drive
|
|
35
|
+
* greedy oversampling — every visited package gets its
|
|
36
|
+
* package.json + main file forced into the bundle, even
|
|
37
|
+
* if the dynamic-require they're behind wasn't caught by
|
|
38
|
+
* the regex.
|
|
39
|
+
* - truncated: true if MAX_FILES or MAX_BYTES fired.
|
|
40
|
+
*/
|
|
41
|
+
export interface PrefetchResult {
|
|
42
|
+
bundle: Record<string, string>;
|
|
43
|
+
visitedPkgDirs: Set<string>;
|
|
44
|
+
truncated: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve the complete dependency graph starting from entry code.
|
|
48
|
+
* Returns Record<path, content> + the set of package directories
|
|
49
|
+
* referenced (for greedy oversampling).
|
|
50
|
+
*/
|
|
51
|
+
export declare function prefetchForRequire(vfs: SqliteVFS, entryCode: string, cwd: string, entryFile?: string): PrefetchResult;
|
|
52
|
+
//# sourceMappingURL=require-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-resolver.d.ts","sourceRoot":"","sources":["../../src/runtime/require-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAsbtD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,GACjB,cAAc,CAoOhB"}
|