@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
|
+
* oom-classify.ts — discriminator for OOM-like errors at Nimbus
|
|
3
|
+
* boundaries. Tagged W5 (Lever 5 / J.1.1 in CF-INTERNAL-OPTIMIZATION-
|
|
4
|
+
* RESEARCH.md).
|
|
5
|
+
*
|
|
6
|
+
* Why this exists
|
|
7
|
+
* ───────────────
|
|
8
|
+
* Nimbus has at least four distinct "the work failed" failure modes
|
|
9
|
+
* that all surface today as either a thrown JS Error or a console
|
|
10
|
+
* line:
|
|
11
|
+
*
|
|
12
|
+
* 1. SQLITE_NOMEM at the storage layer (per-DO SQLite cap, post-
|
|
13
|
+
* STOR/SPEC: Address SQLITE_NOMEM issues).
|
|
14
|
+
* 2. Generic isolate OOM (`Durable Object's isolate exceeded its
|
|
15
|
+
* memory limit and was reset` per ~sha/DOGE Recommendations).
|
|
16
|
+
* 3. Structured-clone refusal (`Cannot deserialize cloned data`)
|
|
17
|
+
* between supervisor ↔ facet RPC (32 MiB cap).
|
|
18
|
+
* 4. RPC timeout (TimeoutError from facet-pool's per-task race).
|
|
19
|
+
*
|
|
20
|
+
* Plus a few platform-side terminations (subrequest cap, condemnation,
|
|
21
|
+
* hard eviction) that the user sees but Nimbus has no first-party
|
|
22
|
+
* signal for.
|
|
23
|
+
*
|
|
24
|
+
* Without a classifier, every recordFailure() call has to stringify-
|
|
25
|
+
* match its own error site. With this module, we pin the regex once
|
|
26
|
+
* and reuse it everywhere.
|
|
27
|
+
*
|
|
28
|
+
* Inputs we accept
|
|
29
|
+
* ────────────────
|
|
30
|
+
* The classifier accepts:
|
|
31
|
+
* - Error instances (read e.message)
|
|
32
|
+
* - plain strings (use directly — for stderr-line classification at
|
|
33
|
+
* facet-exit boundaries where we don't have an Error)
|
|
34
|
+
* - anything else (return 'unknown')
|
|
35
|
+
*
|
|
36
|
+
* Output values
|
|
37
|
+
* ─────────────
|
|
38
|
+
* Same set used by `DiagFailure.cause` in oom-discriminator.ts. Keep
|
|
39
|
+
* the union narrow and additive — adding a new value is fine, but
|
|
40
|
+
* never re-purpose an existing one.
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* Classify an error or message string into an OomCause. Returns
|
|
44
|
+
* 'unknown' when no signature matches — callers should still record
|
|
45
|
+
* the message via DiagFailure.message so a human can later widen the
|
|
46
|
+
* classifier rules.
|
|
47
|
+
*/
|
|
48
|
+
export function classifyError(input) {
|
|
49
|
+
const msg = readMessage(input);
|
|
50
|
+
if (msg.length === 0)
|
|
51
|
+
return 'unknown';
|
|
52
|
+
return classifyMessage(msg);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Variant for callers that already have the message string. Prefer
|
|
56
|
+
* classifyError() at boundaries; this is exposed for cases where the
|
|
57
|
+
* message has already been extracted (e.g. truncated / sanitised).
|
|
58
|
+
*/
|
|
59
|
+
export function classifyMessage(msg) {
|
|
60
|
+
// Use lower-case match for forgiveness; SQLITE_NOMEM is canonically
|
|
61
|
+
// upper but stderr can be either.
|
|
62
|
+
const m = msg.toLowerCase();
|
|
63
|
+
// SQLITE_NOMEM signals
|
|
64
|
+
if (m.includes('sqlite_nomem'))
|
|
65
|
+
return 'sqlite_nomem';
|
|
66
|
+
if (m.includes('out of memory'))
|
|
67
|
+
return 'sqlite_nomem';
|
|
68
|
+
if (m.includes('database or disk is full'))
|
|
69
|
+
return 'sqlite_nomem';
|
|
70
|
+
// Structured-clone refusal — a 32 MiB-cap cousin
|
|
71
|
+
if (m.includes('cannot deserialize cloned data'))
|
|
72
|
+
return 'clone_refused';
|
|
73
|
+
if (m.includes('could not be cloned'))
|
|
74
|
+
return 'clone_refused';
|
|
75
|
+
// RPC timeout (Nimbus's TimeoutError from facet-pool)
|
|
76
|
+
if (m.includes('timeouterror'))
|
|
77
|
+
return 'rpc_timeout';
|
|
78
|
+
if (/\btimed?\s*out\b/.test(m))
|
|
79
|
+
return 'rpc_timeout';
|
|
80
|
+
// Subrequest cap (Cloudflare platform)
|
|
81
|
+
if (m.includes('too many subrequests'))
|
|
82
|
+
return 'subrequest_cap';
|
|
83
|
+
// Generic DO isolate condemnation / eviction
|
|
84
|
+
if (m.includes('isolate exceeded its memory limit'))
|
|
85
|
+
return 'oom';
|
|
86
|
+
if (m.includes('memory limit') && m.includes('reset'))
|
|
87
|
+
return 'oom';
|
|
88
|
+
if (m.includes('worker exceeded memory'))
|
|
89
|
+
return 'oom';
|
|
90
|
+
if (m.includes('exceeded cpu'))
|
|
91
|
+
return 'oom';
|
|
92
|
+
// Explicit eviction (per CF research §A.1.2)
|
|
93
|
+
if (m.includes('condemned'))
|
|
94
|
+
return 'condemnation';
|
|
95
|
+
if (m.includes('hard evict'))
|
|
96
|
+
return 'hard_evict';
|
|
97
|
+
return 'unknown';
|
|
98
|
+
}
|
|
99
|
+
function readMessage(input) {
|
|
100
|
+
if (input == null)
|
|
101
|
+
return '';
|
|
102
|
+
if (typeof input === 'string')
|
|
103
|
+
return input;
|
|
104
|
+
if (input instanceof Error)
|
|
105
|
+
return input.message ?? '';
|
|
106
|
+
// Some thrown values are plain objects with .message
|
|
107
|
+
if (typeof input === 'object') {
|
|
108
|
+
const m = input.message;
|
|
109
|
+
if (typeof m === 'string')
|
|
110
|
+
return m;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
return String(input);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return '';
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* oom-discriminator.ts — singleton ring buffer for OOM / failure
|
|
3
|
+
* forensics + last-known-RPC-frame + last-known-facet-id +
|
|
4
|
+
* session-recovery-event ring, plus snapshot/rehydrate hooks for DO
|
|
5
|
+
* storage persistence.
|
|
6
|
+
*
|
|
7
|
+
* W5 (Lever 5 / J.1.1) — original module. Pairs with oom-classify.ts.
|
|
8
|
+
* C'.2 — added the recovery_event ring.
|
|
9
|
+
*
|
|
10
|
+
* Why singleton-per-isolate
|
|
11
|
+
* ─────────────────────────
|
|
12
|
+
* Same pattern as src/diag-counters.ts (q.v.). The supervisor bundle
|
|
13
|
+
* is the consumer; all writers (sqlite-vfs, facet-pool, facet-manager,
|
|
14
|
+
* supervisor-rpc, npm-installer, nimbus-session) live in the same
|
|
15
|
+
* isolate. globalThis-keyed storage avoids threading a handle through
|
|
16
|
+
* ~10 sites for what is essentially a process-local diagnostic.
|
|
17
|
+
*
|
|
18
|
+
* Two distinct rings
|
|
19
|
+
* ──────────────────
|
|
20
|
+
* - failures: things that failed (the original W5 ring).
|
|
21
|
+
* - recoveryEvents: lifecycle transitions of the session (C'.2). Cold
|
|
22
|
+
* isolate boot → 'cold' → 'hydrated' → 'active' → 'drained'. Plan §3
|
|
23
|
+
* Track B' makes the transitions explicit; this ring records each
|
|
24
|
+
* one so probes can assert "session reached 'hydrated' from SQL with
|
|
25
|
+
* N keys, no data loss".
|
|
26
|
+
*
|
|
27
|
+
* Bounded-size guarantees
|
|
28
|
+
* ───────────────────────
|
|
29
|
+
* - failures ring: 50 entries (RING_SIZE).
|
|
30
|
+
* - recoveryEvents ring: 50 entries (RECOVERY_RING_SIZE).
|
|
31
|
+
* - per-message cap: 200 chars (truncated at insert).
|
|
32
|
+
* - per-RPC-frame: single slot, one object.
|
|
33
|
+
* - per-facet-id: single slot, one object.
|
|
34
|
+
*
|
|
35
|
+
* Snapshot ≤40 KB even with both rings full. Verified by
|
|
36
|
+
* audit/probes/w5/functional/ring-persistence.mjs (failures) and
|
|
37
|
+
* audit/probes/c-prime/recovery-events/ (recovery — Phase 1 C'.2).
|
|
38
|
+
*/
|
|
39
|
+
import type { OomCause } from './oom-classify.js';
|
|
40
|
+
export interface RpcFrame {
|
|
41
|
+
method: string;
|
|
42
|
+
payloadBytes: number;
|
|
43
|
+
atMs: number;
|
|
44
|
+
}
|
|
45
|
+
export interface FacetId {
|
|
46
|
+
codeId: string;
|
|
47
|
+
slotIndex: number;
|
|
48
|
+
atMs: number;
|
|
49
|
+
}
|
|
50
|
+
export interface DiagFailure {
|
|
51
|
+
/** ms epoch */
|
|
52
|
+
at: number;
|
|
53
|
+
/** Lifecycle stage (e.g. 'install', 'resolve', 'rpc', 'facet', 'ws'). */
|
|
54
|
+
phase: string;
|
|
55
|
+
/** Discriminated cause. See oom-classify.ts. */
|
|
56
|
+
cause: OomCause;
|
|
57
|
+
/** Best-effort RSS estimate in bytes (peak observed). */
|
|
58
|
+
rssEstimateBytes: number;
|
|
59
|
+
/** process.memoryUsage().heapUsed if available; 0 in DO contexts. */
|
|
60
|
+
heapUsedBytes: number;
|
|
61
|
+
/** SqliteVFS LRU hot bytes at time of failure. */
|
|
62
|
+
lruBytes: number;
|
|
63
|
+
/** Sum of in-flight RPC payload bytes (best-effort). */
|
|
64
|
+
inFlightBytes: number;
|
|
65
|
+
/** Snapshot of the most recent RPC frame, if any. */
|
|
66
|
+
lastRpcFrame: RpcFrame | null;
|
|
67
|
+
/** Snapshot of the most recent facet dispatch, if any. */
|
|
68
|
+
lastFacetId: FacetId | null;
|
|
69
|
+
/** Optional facet exit code (when failure represents a facet termination). */
|
|
70
|
+
exitCode?: number;
|
|
71
|
+
/** Optional facet pid. */
|
|
72
|
+
pid?: number;
|
|
73
|
+
/** Free-form message; truncated to MESSAGE_CAP characters. */
|
|
74
|
+
message?: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Session lifecycle states for the C'.2 recovery_event ring.
|
|
78
|
+
*
|
|
79
|
+
* The state machine is owned by Track B' (plan §3.3). This module
|
|
80
|
+
* records transitions; it does not enforce them.
|
|
81
|
+
*
|
|
82
|
+
* State semantics:
|
|
83
|
+
* - 'cold' : fresh DO instance, no in-memory session state yet.
|
|
84
|
+
* - 'hydrated' : Phase R completed — SQL state read into in-memory cache.
|
|
85
|
+
* - 'active' : Phase B+W+O completed — kernel/shell/terminal wired.
|
|
86
|
+
* - 'drained' : webSocketError/Close fired; in-memory caches nulled,
|
|
87
|
+
* SQL state freshly persisted; awaiting next reconnect.
|
|
88
|
+
*
|
|
89
|
+
* Trigger labels: human-readable event that caused the transition.
|
|
90
|
+
* Examples: 'first-fetch', 'ws-upgrade', 'ws-close', 'ws-error',
|
|
91
|
+
* 'isolate-evicted', 'manual-test'.
|
|
92
|
+
*/
|
|
93
|
+
/** Session state union.
|
|
94
|
+
*
|
|
95
|
+
* The original four are the high-level lifecycle markers:
|
|
96
|
+
* cold — never inited
|
|
97
|
+
* hydrated — re-init complete (warm path; Phase O skipped)
|
|
98
|
+
* active — live shell processing input
|
|
99
|
+
* drained — webSocketError/Close fired; SQL freshly persisted
|
|
100
|
+
*
|
|
101
|
+
* The four [B'.4] additions are the fine-grained phases of
|
|
102
|
+
* initSession itself, recorded as the function progresses:
|
|
103
|
+
* rehydrate — Phase R: loading state from DO SQLite
|
|
104
|
+
* build — Phase B: constructing Kernel/Shell/registry
|
|
105
|
+
* wire — Phase W: attaching terminal, replaying scrollback
|
|
106
|
+
* online — Phase O: cold-start MOTD + starter hint (cold only;
|
|
107
|
+
* on warm re-init this phase is skipped and the
|
|
108
|
+
* initSession ends with 'hydrated' instead)
|
|
109
|
+
*
|
|
110
|
+
* The phase transitions are SUPPLEMENTAL to the high-level markers,
|
|
111
|
+
* not a replacement. Probes that look for the legacy `'hydrated'`
|
|
112
|
+
* marker continue to work; probes that want fine-grained debugging
|
|
113
|
+
* can grep for the phase states.
|
|
114
|
+
*/
|
|
115
|
+
export type SessionState = 'cold' | 'hydrated' | 'active' | 'drained' | 'rehydrate' | 'build' | 'wire' | 'online';
|
|
116
|
+
export interface DiagRecoveryEvent {
|
|
117
|
+
/** ms epoch */
|
|
118
|
+
at: number;
|
|
119
|
+
/** Source state. */
|
|
120
|
+
fromState: SessionState;
|
|
121
|
+
/** Destination state. */
|
|
122
|
+
toState: SessionState;
|
|
123
|
+
/** Human-readable trigger ('ws-close', 'isolate-evicted', etc.). */
|
|
124
|
+
trigger: string;
|
|
125
|
+
/** _w9IsolateGen at the time of the event. Lets a probe detect the
|
|
126
|
+
* difference between an in-isolate transition and a cross-isolate one
|
|
127
|
+
* (the latter implies workerd recycled the DO). */
|
|
128
|
+
isolateGen: number;
|
|
129
|
+
/** True when the transition could not preserve state that should
|
|
130
|
+
* have survived (e.g. SQL persist threw, snapshot was missing on
|
|
131
|
+
* hydrate, etc.). Probes assert this stays false under non-OOM
|
|
132
|
+
* scenarios. */
|
|
133
|
+
dataLoss: boolean;
|
|
134
|
+
/** Number of SQL keys/rows rehydrated on a hydrated transition.
|
|
135
|
+
* Zero when the transition is one that doesn't read SQL. */
|
|
136
|
+
snapshotKeysRehydrated: number;
|
|
137
|
+
/** Optional free-form notes (200 char cap). */
|
|
138
|
+
notes?: string;
|
|
139
|
+
}
|
|
140
|
+
/** Append a failure to the ring. Newest first. Capped at RING_SIZE. */
|
|
141
|
+
export declare function recordFailure(f: DiagFailure): void;
|
|
142
|
+
/** Read a snapshot of the ring. Newest first. Caller-side mutations
|
|
143
|
+
* do not affect the singleton. */
|
|
144
|
+
export declare function getFailures(): DiagFailure[];
|
|
145
|
+
/** Reset everything. Used by tests; safe in production but typically
|
|
146
|
+
* unnecessary. */
|
|
147
|
+
export declare function resetFailures(): void;
|
|
148
|
+
/** Record the current RPC frame (called at every RPC entry). Bounded
|
|
149
|
+
* to a single slot — the LATEST frame wins. */
|
|
150
|
+
export declare function setLastRpcFrame(method: string, payloadBytes: number): void;
|
|
151
|
+
export declare function getLastRpcFrame(): RpcFrame | null;
|
|
152
|
+
/** Record the most recent facet dispatch. */
|
|
153
|
+
export declare function setLastFacetId(codeId: string, slotIndex: number): void;
|
|
154
|
+
export declare function getLastFacetId(): FacetId | null;
|
|
155
|
+
/** Append a recovery event to the ring. Newest first. Capped at
|
|
156
|
+
* RECOVERY_RING_SIZE. */
|
|
157
|
+
export declare function recordRecoveryEvent(e: DiagRecoveryEvent): void;
|
|
158
|
+
/** Read a snapshot of the recovery ring. Newest first. */
|
|
159
|
+
export declare function getRecoveryEvents(): DiagRecoveryEvent[];
|
|
160
|
+
/** Reset the recovery ring. Tests + manual operator use only. */
|
|
161
|
+
export declare function resetRecoveryEvents(): void;
|
|
162
|
+
/**
|
|
163
|
+
* Build a JSON-serializable snapshot suitable for ctx.storage.put.
|
|
164
|
+
* Bounded ≤ 40 KB even with both rings full of MESSAGE_CAP-truncated
|
|
165
|
+
* messages. Schema version embedded so a future shape change can
|
|
166
|
+
* cleanly reject old snapshots.
|
|
167
|
+
*
|
|
168
|
+
* Schema versions:
|
|
169
|
+
* v = 1 → {failures, lastRpcFrame, lastFacetId} (pre-C'.2)
|
|
170
|
+
* v = 2 → v1 + {recoveryEvents} (C'.2)
|
|
171
|
+
*
|
|
172
|
+
* Rehydrate accepts v=1 (treats recoveryEvents as empty) and v=2.
|
|
173
|
+
*/
|
|
174
|
+
export interface DiagSnapshot {
|
|
175
|
+
/** Schema version. Bump when shape changes. */
|
|
176
|
+
v: number;
|
|
177
|
+
failures: DiagFailure[];
|
|
178
|
+
recoveryEvents: DiagRecoveryEvent[];
|
|
179
|
+
lastRpcFrame: RpcFrame | null;
|
|
180
|
+
lastFacetId: FacetId | null;
|
|
181
|
+
}
|
|
182
|
+
export declare function snapshotForStorage(): DiagSnapshot;
|
|
183
|
+
/**
|
|
184
|
+
* Restore from a snapshot. Garbage / null / wrong-shape input is
|
|
185
|
+
* silently ignored. Does NOT throw — constructor-time rehydration must
|
|
186
|
+
* never block DO startup.
|
|
187
|
+
*
|
|
188
|
+
* Accepts v=1 (pre-C'.2, no recoveryEvents field) and v=2. v=1
|
|
189
|
+
* snapshots rehydrate failures only; recoveryEvents starts empty.
|
|
190
|
+
*/
|
|
191
|
+
export declare function rehydrateFromStorage(blob: unknown): void;
|
|
192
|
+
//# sourceMappingURL=oom-discriminator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oom-discriminator.d.ts","sourceRoot":"","sources":["../../src/observability/oom-discriminator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* oom-discriminator.ts — singleton ring buffer for OOM / failure
|
|
3
|
+
* forensics + last-known-RPC-frame + last-known-facet-id +
|
|
4
|
+
* session-recovery-event ring, plus snapshot/rehydrate hooks for DO
|
|
5
|
+
* storage persistence.
|
|
6
|
+
*
|
|
7
|
+
* W5 (Lever 5 / J.1.1) — original module. Pairs with oom-classify.ts.
|
|
8
|
+
* C'.2 — added the recovery_event ring.
|
|
9
|
+
*
|
|
10
|
+
* Why singleton-per-isolate
|
|
11
|
+
* ─────────────────────────
|
|
12
|
+
* Same pattern as src/diag-counters.ts (q.v.). The supervisor bundle
|
|
13
|
+
* is the consumer; all writers (sqlite-vfs, facet-pool, facet-manager,
|
|
14
|
+
* supervisor-rpc, npm-installer, nimbus-session) live in the same
|
|
15
|
+
* isolate. globalThis-keyed storage avoids threading a handle through
|
|
16
|
+
* ~10 sites for what is essentially a process-local diagnostic.
|
|
17
|
+
*
|
|
18
|
+
* Two distinct rings
|
|
19
|
+
* ──────────────────
|
|
20
|
+
* - failures: things that failed (the original W5 ring).
|
|
21
|
+
* - recoveryEvents: lifecycle transitions of the session (C'.2). Cold
|
|
22
|
+
* isolate boot → 'cold' → 'hydrated' → 'active' → 'drained'. Plan §3
|
|
23
|
+
* Track B' makes the transitions explicit; this ring records each
|
|
24
|
+
* one so probes can assert "session reached 'hydrated' from SQL with
|
|
25
|
+
* N keys, no data loss".
|
|
26
|
+
*
|
|
27
|
+
* Bounded-size guarantees
|
|
28
|
+
* ───────────────────────
|
|
29
|
+
* - failures ring: 50 entries (RING_SIZE).
|
|
30
|
+
* - recoveryEvents ring: 50 entries (RECOVERY_RING_SIZE).
|
|
31
|
+
* - per-message cap: 200 chars (truncated at insert).
|
|
32
|
+
* - per-RPC-frame: single slot, one object.
|
|
33
|
+
* - per-facet-id: single slot, one object.
|
|
34
|
+
*
|
|
35
|
+
* Snapshot ≤40 KB even with both rings full. Verified by
|
|
36
|
+
* audit/probes/w5/functional/ring-persistence.mjs (failures) and
|
|
37
|
+
* audit/probes/c-prime/recovery-events/ (recovery — Phase 1 C'.2).
|
|
38
|
+
*/
|
|
39
|
+
const KEY = '__NIMBUS_W5_OOM_DISC__';
|
|
40
|
+
const RING_SIZE = 50;
|
|
41
|
+
const RECOVERY_RING_SIZE = 50;
|
|
42
|
+
const MESSAGE_CAP = 200;
|
|
43
|
+
function getState() {
|
|
44
|
+
const g = globalThis;
|
|
45
|
+
if (!g[KEY]) {
|
|
46
|
+
g[KEY] = {
|
|
47
|
+
failures: [],
|
|
48
|
+
recoveryEvents: [],
|
|
49
|
+
lastRpcFrame: null,
|
|
50
|
+
lastFacetId: null,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Defensive: older snapshots predating C'.2 have no recoveryEvents
|
|
54
|
+
// field. The rehydrate path adds the field on read; this guard is a
|
|
55
|
+
// belt-and-braces second line so any legacy state object on
|
|
56
|
+
// globalThis (e.g. from an in-process restart that beat the new
|
|
57
|
+
// module load) doesn't make the ring methods crash.
|
|
58
|
+
const s = g[KEY];
|
|
59
|
+
if (!Array.isArray(s.recoveryEvents))
|
|
60
|
+
s.recoveryEvents = [];
|
|
61
|
+
return s;
|
|
62
|
+
}
|
|
63
|
+
/** Append a failure to the ring. Newest first. Capped at RING_SIZE. */
|
|
64
|
+
export function recordFailure(f) {
|
|
65
|
+
const s = getState();
|
|
66
|
+
// Defensive copy + message cap.
|
|
67
|
+
const entry = {
|
|
68
|
+
at: Number(f.at) || Date.now(),
|
|
69
|
+
phase: String(f.phase ?? 'unknown'),
|
|
70
|
+
cause: f.cause ?? 'unknown',
|
|
71
|
+
rssEstimateBytes: Number(f.rssEstimateBytes) || 0,
|
|
72
|
+
heapUsedBytes: Number(f.heapUsedBytes) || 0,
|
|
73
|
+
lruBytes: Number(f.lruBytes) || 0,
|
|
74
|
+
inFlightBytes: Number(f.inFlightBytes) || 0,
|
|
75
|
+
lastRpcFrame: f.lastRpcFrame ?? s.lastRpcFrame,
|
|
76
|
+
lastFacetId: f.lastFacetId ?? s.lastFacetId,
|
|
77
|
+
};
|
|
78
|
+
if (typeof f.exitCode === 'number')
|
|
79
|
+
entry.exitCode = f.exitCode;
|
|
80
|
+
if (typeof f.pid === 'number')
|
|
81
|
+
entry.pid = f.pid;
|
|
82
|
+
if (f.message) {
|
|
83
|
+
const m = String(f.message);
|
|
84
|
+
entry.message = m.length > MESSAGE_CAP ? m.slice(0, MESSAGE_CAP) : m;
|
|
85
|
+
}
|
|
86
|
+
s.failures.unshift(entry);
|
|
87
|
+
if (s.failures.length > RING_SIZE)
|
|
88
|
+
s.failures.length = RING_SIZE;
|
|
89
|
+
}
|
|
90
|
+
/** Read a snapshot of the ring. Newest first. Caller-side mutations
|
|
91
|
+
* do not affect the singleton. */
|
|
92
|
+
export function getFailures() {
|
|
93
|
+
return getState().failures.slice(0);
|
|
94
|
+
}
|
|
95
|
+
/** Reset everything. Used by tests; safe in production but typically
|
|
96
|
+
* unnecessary. */
|
|
97
|
+
export function resetFailures() {
|
|
98
|
+
const s = getState();
|
|
99
|
+
s.failures.length = 0;
|
|
100
|
+
s.lastRpcFrame = null;
|
|
101
|
+
s.lastFacetId = null;
|
|
102
|
+
}
|
|
103
|
+
/** Record the current RPC frame (called at every RPC entry). Bounded
|
|
104
|
+
* to a single slot — the LATEST frame wins. */
|
|
105
|
+
export function setLastRpcFrame(method, payloadBytes) {
|
|
106
|
+
const s = getState();
|
|
107
|
+
s.lastRpcFrame = {
|
|
108
|
+
method: String(method),
|
|
109
|
+
payloadBytes: Number(payloadBytes) || 0,
|
|
110
|
+
atMs: Date.now(),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export function getLastRpcFrame() {
|
|
114
|
+
return getState().lastRpcFrame;
|
|
115
|
+
}
|
|
116
|
+
/** Record the most recent facet dispatch. */
|
|
117
|
+
export function setLastFacetId(codeId, slotIndex) {
|
|
118
|
+
const s = getState();
|
|
119
|
+
s.lastFacetId = {
|
|
120
|
+
codeId: String(codeId),
|
|
121
|
+
slotIndex: Number(slotIndex) || 0,
|
|
122
|
+
atMs: Date.now(),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export function getLastFacetId() {
|
|
126
|
+
return getState().lastFacetId;
|
|
127
|
+
}
|
|
128
|
+
// ── C'.2 recovery_event ring ────────────────────────────────────────────
|
|
129
|
+
//
|
|
130
|
+
// Track B' transitions call recordRecoveryEvent() at every state change.
|
|
131
|
+
// The ring is bounded at RECOVERY_RING_SIZE; the diag endpoint reads via
|
|
132
|
+
// getRecoveryEvents() (newest first). Probes use this ring to assert
|
|
133
|
+
// that recoveries are actually transparent — a green run shows entries
|
|
134
|
+
// for every reconnection but every entry has dataLoss === false.
|
|
135
|
+
/** Append a recovery event to the ring. Newest first. Capped at
|
|
136
|
+
* RECOVERY_RING_SIZE. */
|
|
137
|
+
export function recordRecoveryEvent(e) {
|
|
138
|
+
const s = getState();
|
|
139
|
+
// Defensive copy + notes cap. We intentionally do NOT validate the
|
|
140
|
+
// state-machine direction here (e.g. that 'drained' only follows
|
|
141
|
+
// 'active') — the state machine lives in Track B'; this ring is a
|
|
142
|
+
// recorder, not an enforcer. If a probe sees an impossible
|
|
143
|
+
// transition, that's a real bug in the state machine and the
|
|
144
|
+
// probe must fail.
|
|
145
|
+
const entry = {
|
|
146
|
+
at: Number(e.at) || Date.now(),
|
|
147
|
+
fromState: e.fromState,
|
|
148
|
+
toState: e.toState,
|
|
149
|
+
trigger: String(e.trigger ?? 'unknown'),
|
|
150
|
+
isolateGen: Number(e.isolateGen) || 0,
|
|
151
|
+
dataLoss: !!e.dataLoss,
|
|
152
|
+
snapshotKeysRehydrated: Number(e.snapshotKeysRehydrated) || 0,
|
|
153
|
+
};
|
|
154
|
+
if (e.notes) {
|
|
155
|
+
const n = String(e.notes);
|
|
156
|
+
entry.notes = n.length > MESSAGE_CAP ? n.slice(0, MESSAGE_CAP) : n;
|
|
157
|
+
}
|
|
158
|
+
s.recoveryEvents.unshift(entry);
|
|
159
|
+
if (s.recoveryEvents.length > RECOVERY_RING_SIZE) {
|
|
160
|
+
s.recoveryEvents.length = RECOVERY_RING_SIZE;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/** Read a snapshot of the recovery ring. Newest first. */
|
|
164
|
+
export function getRecoveryEvents() {
|
|
165
|
+
return getState().recoveryEvents.slice(0);
|
|
166
|
+
}
|
|
167
|
+
/** Reset the recovery ring. Tests + manual operator use only. */
|
|
168
|
+
export function resetRecoveryEvents() {
|
|
169
|
+
getState().recoveryEvents.length = 0;
|
|
170
|
+
}
|
|
171
|
+
export function snapshotForStorage() {
|
|
172
|
+
const s = getState();
|
|
173
|
+
return {
|
|
174
|
+
v: 2,
|
|
175
|
+
failures: s.failures.slice(0),
|
|
176
|
+
recoveryEvents: s.recoveryEvents.slice(0),
|
|
177
|
+
lastRpcFrame: s.lastRpcFrame,
|
|
178
|
+
lastFacetId: s.lastFacetId,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Restore from a snapshot. Garbage / null / wrong-shape input is
|
|
183
|
+
* silently ignored. Does NOT throw — constructor-time rehydration must
|
|
184
|
+
* never block DO startup.
|
|
185
|
+
*
|
|
186
|
+
* Accepts v=1 (pre-C'.2, no recoveryEvents field) and v=2. v=1
|
|
187
|
+
* snapshots rehydrate failures only; recoveryEvents starts empty.
|
|
188
|
+
*/
|
|
189
|
+
export function rehydrateFromStorage(blob) {
|
|
190
|
+
if (!blob || typeof blob !== 'object')
|
|
191
|
+
return;
|
|
192
|
+
const b = blob;
|
|
193
|
+
if (b.v !== 1 && b.v !== 2)
|
|
194
|
+
return;
|
|
195
|
+
if (!Array.isArray(b.failures))
|
|
196
|
+
return;
|
|
197
|
+
const s = getState();
|
|
198
|
+
s.failures.length = 0;
|
|
199
|
+
for (const f of b.failures) {
|
|
200
|
+
if (!f || typeof f !== 'object')
|
|
201
|
+
continue;
|
|
202
|
+
const entry = f;
|
|
203
|
+
if (typeof entry.at !== 'number' || typeof entry.phase !== 'string')
|
|
204
|
+
continue;
|
|
205
|
+
s.failures.push(entry);
|
|
206
|
+
if (s.failures.length >= RING_SIZE)
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
// v >= 2: recoveryEvents (skipped for v=1 by the shape-check below).
|
|
210
|
+
s.recoveryEvents.length = 0;
|
|
211
|
+
if (b.v === 2 && Array.isArray(b.recoveryEvents)) {
|
|
212
|
+
for (const e of b.recoveryEvents) {
|
|
213
|
+
if (!e || typeof e !== 'object')
|
|
214
|
+
continue;
|
|
215
|
+
const entry = e;
|
|
216
|
+
if (typeof entry.at !== 'number'
|
|
217
|
+
|| typeof entry.fromState !== 'string'
|
|
218
|
+
|| typeof entry.toState !== 'string')
|
|
219
|
+
continue;
|
|
220
|
+
s.recoveryEvents.push(entry);
|
|
221
|
+
if (s.recoveryEvents.length >= RECOVERY_RING_SIZE)
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (b.lastRpcFrame && typeof b.lastRpcFrame === 'object'
|
|
226
|
+
&& typeof b.lastRpcFrame.method === 'string') {
|
|
227
|
+
s.lastRpcFrame = b.lastRpcFrame;
|
|
228
|
+
}
|
|
229
|
+
if (b.lastFacetId && typeof b.lastFacetId === 'object'
|
|
230
|
+
&& typeof b.lastFacetId.codeId === 'string') {
|
|
231
|
+
s.lastFacetId = b.lastFacetId;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* real-vite-bundle.generated.ts — AUTO-GENERATED by scripts/bundle-real-vite.mjs
|
|
3
|
+
* DO NOT EDIT.
|
|
4
|
+
*
|
|
5
|
+
* Bundled Vite 6.4.2 with native-binding stubs (rolldown,
|
|
6
|
+
* lightningcss, etc.). Consumed by src/cirrus-real.ts at facet spawn time.
|
|
7
|
+
*
|
|
8
|
+
* [sdk-phase-1] The large strings (REAL_VITE_BUNDLE, ROLLUP_WASM_BASE64)
|
|
9
|
+
* now ship via the ASSETS binding rather than inline. Use the async
|
|
10
|
+
* getters below. Constants + browser-runtime mjs files remain inline
|
|
11
|
+
* since they're small enough to not warrant a network round-trip.
|
|
12
|
+
*/
|
|
13
|
+
import { type AssetsFetcher } from './runtime/assets-loader.js';
|
|
14
|
+
export declare const REAL_VITE_VERSION = "6.4.2";
|
|
15
|
+
/** Asset path for the bundled Vite source. Use {@link getRealViteBundle}. */
|
|
16
|
+
export declare const REAL_VITE_BUNDLE_PATH = "/_assets/real-vite-bundle.js";
|
|
17
|
+
/** Asset path for the rollup wasm bytes. Use {@link getRollupWasmBase64}. */
|
|
18
|
+
export declare const ROLLUP_WASM_PATH = "/_assets/rollup.wasm";
|
|
19
|
+
/**
|
|
20
|
+
* Fetch the bundled Vite JS from the ASSETS binding. Cached per-isolate.
|
|
21
|
+
*
|
|
22
|
+
* @param env Object exposing the `ASSETS` binding (Fetcher).
|
|
23
|
+
* @returns The Vite bundle as a UTF-8 string.
|
|
24
|
+
* @throws {NimbusAssetLoadError} when the binding is missing or fetch fails.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getRealViteBundle(env: {
|
|
27
|
+
ASSETS: AssetsFetcher;
|
|
28
|
+
}): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Fetch the rollup wasm bytes + base64-encode for the synthetic-fs
|
|
31
|
+
* pre-seed. Cached per-isolate; the base64 string ends up the same on
|
|
32
|
+
* every call.
|
|
33
|
+
*
|
|
34
|
+
* @returns base64-encoded rollup wasm bytes.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getRollupWasmBase64(env: {
|
|
37
|
+
ASSETS: AssetsFetcher;
|
|
38
|
+
}): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Vite's browser-side HMR runtime. Served to the browser at
|
|
41
|
+
* /@vite/client and /@vite/env during dev. Unlike the server
|
|
42
|
+
* bundle, these are tiny ESM files that run in-page — keep inline.
|
|
43
|
+
*/
|
|
44
|
+
export declare const VITE_CLIENT_MJS: string;
|
|
45
|
+
export declare const VITE_ENV_MJS: string;
|
|
46
|
+
//# sourceMappingURL=real-vite-bundle.generated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"real-vite-bundle.generated.d.ts","sourceRoot":"","sources":["../src/real-vite-bundle.generated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE/F,eAAO,MAAM,iBAAiB,UAAU,CAAC;AAEzC,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AAEpE,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AAEvD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjF;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAazF;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,MAAwniC,CAAC;AACvpiC,eAAO,MAAM,YAAY,EAAE,MAAgrB,CAAC"}
|