@nimbus-sh/core 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/dist/_shared/ai-egress.d.ts +73 -0
- package/dist/_shared/ai-egress.d.ts.map +1 -0
- package/dist/_shared/ai-egress.js +88 -0
- package/dist/_shared/byte-stream.d.ts +59 -0
- package/dist/_shared/byte-stream.d.ts.map +1 -0
- package/dist/_shared/byte-stream.js +77 -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 +145 -0
- package/dist/_shared/cache-stats.d.ts.map +1 -0
- package/dist/_shared/cache-stats.js +161 -0
- package/dist/_shared/crypto.d.ts +17 -0
- package/dist/_shared/crypto.d.ts.map +1 -0
- package/dist/_shared/crypto.js +131 -0
- package/dist/_shared/esbuild-facet-shim.d.ts +21 -0
- package/dist/_shared/esbuild-facet-shim.d.ts.map +1 -0
- package/dist/_shared/esbuild-facet-shim.js +22 -0
- package/dist/_shared/exports-resolver.d.ts +74 -0
- package/dist/_shared/exports-resolver.d.ts.map +1 -0
- package/dist/_shared/exports-resolver.js +284 -0
- package/dist/_shared/facet-vfs-cursor.d.ts +48 -0
- package/dist/_shared/facet-vfs-cursor.d.ts.map +1 -0
- package/dist/_shared/facet-vfs-cursor.js +51 -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/lru-map.d.ts +25 -0
- package/dist/_shared/lru-map.d.ts.map +1 -0
- package/dist/_shared/lru-map.js +57 -0
- package/dist/_shared/real-node-imports.d.ts +43 -0
- package/dist/_shared/real-node-imports.d.ts.map +1 -0
- package/dist/_shared/real-node-imports.js +52 -0
- package/dist/_shared/retry.d.ts +92 -0
- package/dist/_shared/retry.d.ts.map +1 -0
- package/dist/_shared/retry.js +155 -0
- package/dist/_shared/rpc-dispose.d.ts +4 -0
- package/dist/_shared/rpc-dispose.d.ts.map +1 -0
- package/dist/_shared/rpc-dispose.js +30 -0
- package/dist/_shared/terminal.d.ts +2 -0
- package/dist/_shared/terminal.d.ts.map +1 -0
- package/dist/_shared/terminal.js +3 -0
- package/dist/_shared/typescript-specifiers.d.ts +58 -0
- package/dist/_shared/typescript-specifiers.d.ts.map +1 -0
- package/dist/_shared/typescript-specifiers.js +84 -0
- package/dist/_shared/untrusted-request.d.ts +34 -0
- package/dist/_shared/untrusted-request.d.ts.map +1 -0
- package/dist/_shared/untrusted-request.js +74 -0
- package/dist/_shared/vfs-write-ledger.d.ts +3 -0
- package/dist/_shared/vfs-write-ledger.d.ts.map +1 -0
- package/dist/_shared/vfs-write-ledger.js +439 -0
- package/dist/_shared/w7-frame.d.ts +79 -0
- package/dist/_shared/w7-frame.d.ts.map +1 -0
- package/dist/_shared/w7-frame.js +839 -0
- package/dist/_shared/weighted-credit-pool.d.ts +61 -0
- package/dist/_shared/weighted-credit-pool.d.ts.map +1 -0
- package/dist/_shared/weighted-credit-pool.js +196 -0
- package/dist/constants.d.ts +64 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +264 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/observability/diag-counters.d.ts +236 -0
- package/dist/observability/diag-counters.d.ts.map +1 -0
- package/dist/observability/diag-counters.js +195 -0
- package/dist/observability/heap-estimate.d.ts +225 -0
- package/dist/observability/heap-estimate.d.ts.map +1 -0
- package/dist/observability/heap-estimate.js +185 -0
- package/dist/observability/heavy-alloc-coord.d.ts +93 -0
- package/dist/observability/heavy-alloc-coord.d.ts.map +1 -0
- package/dist/observability/heavy-alloc-coord.js +181 -0
- package/dist/observability/oom-classify.d.ts +138 -0
- package/dist/observability/oom-classify.d.ts.map +1 -0
- package/dist/observability/oom-classify.js +261 -0
- package/dist/observability/oom-discriminator.d.ts +176 -0
- package/dist/observability/oom-discriminator.d.ts.map +1 -0
- package/dist/observability/oom-discriminator.js +272 -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 +139 -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/bash/preamble.d.ts +2 -0
- package/dist/runtime/bash/preamble.d.ts.map +1 -0
- package/dist/runtime/bash/preamble.js +1849 -0
- package/dist/runtime/bash/types.d.ts +433 -0
- package/dist/runtime/bash/types.d.ts.map +1 -0
- package/dist/runtime/bash/types.js +1 -0
- package/dist/runtime/bundle-profile.d.ts +14 -0
- package/dist/runtime/bundle-profile.d.ts.map +1 -0
- package/dist/runtime/bundle-profile.js +20 -0
- package/dist/runtime/cirrus-vite-config-rewriter.d.ts +2 -0
- package/dist/runtime/cirrus-vite-config-rewriter.d.ts.map +1 -0
- package/dist/runtime/cirrus-vite-config-rewriter.js +28 -0
- package/dist/runtime/cli-flags.d.ts +2 -0
- package/dist/runtime/cli-flags.d.ts.map +1 -0
- package/dist/runtime/cli-flags.js +11 -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/cpython-preamble.d.ts +32 -0
- package/dist/runtime/cpython-preamble.d.ts.map +1 -0
- package/dist/runtime/cpython-preamble.js +296 -0
- package/dist/runtime/esbuild-service.d.ts +242 -0
- package/dist/runtime/esbuild-service.d.ts.map +1 -0
- package/dist/runtime/esbuild-service.js +1452 -0
- package/dist/runtime/framework-detect.d.ts +70 -0
- package/dist/runtime/framework-detect.d.ts.map +1 -0
- package/dist/runtime/framework-detect.js +177 -0
- package/dist/runtime/import-meta-transform.d.ts +3 -0
- package/dist/runtime/import-meta-transform.d.ts.map +1 -0
- package/dist/runtime/import-meta-transform.js +15 -0
- package/dist/runtime/javascript-ast.d.ts +13 -0
- package/dist/runtime/javascript-ast.d.ts.map +1 -0
- package/dist/runtime/javascript-ast.js +57 -0
- package/dist/runtime/long-running-handle.d.ts +119 -0
- package/dist/runtime/long-running-handle.d.ts.map +1 -0
- package/dist/runtime/long-running-handle.js +169 -0
- package/dist/runtime/module-source-rewriter.d.ts +11 -0
- package/dist/runtime/module-source-rewriter.d.ts.map +1 -0
- package/dist/runtime/module-source-rewriter.js +61 -0
- package/dist/runtime/opentui-wasm-backend.d.ts +160 -0
- package/dist/runtime/opentui-wasm-backend.d.ts.map +1 -0
- package/dist/runtime/opentui-wasm-backend.js +416 -0
- package/dist/runtime/os-contracts.d.ts +436 -0
- package/dist/runtime/os-contracts.d.ts.map +1 -0
- package/dist/runtime/os-contracts.js +101 -0
- package/dist/runtime/port-registry.d.ts +100 -0
- package/dist/runtime/port-registry.d.ts.map +1 -0
- package/dist/runtime/port-registry.js +265 -0
- package/dist/runtime/process-input-routing.d.ts +33 -0
- package/dist/runtime/process-input-routing.d.ts.map +1 -0
- package/dist/runtime/process-input-routing.js +59 -0
- package/dist/runtime/process-input.d.ts +39 -0
- package/dist/runtime/process-input.d.ts.map +1 -0
- package/dist/runtime/process-input.js +117 -0
- package/dist/runtime/process-io-protocol.d.ts +90 -0
- package/dist/runtime/process-io-protocol.d.ts.map +1 -0
- package/dist/runtime/process-io-protocol.js +81 -0
- package/dist/runtime/process-logs.d.ts +352 -0
- package/dist/runtime/process-logs.d.ts.map +1 -0
- package/dist/runtime/process-logs.js +750 -0
- package/dist/runtime/process-table.d.ts +101 -0
- package/dist/runtime/process-table.d.ts.map +1 -0
- package/dist/runtime/process-table.js +175 -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-server-adapter.d.ts +33 -0
- package/dist/runtime/python-server-adapter.d.ts.map +1 -0
- package/dist/runtime/python-server-adapter.js +132 -0
- package/dist/runtime/require-resolver.d.ts +44 -0
- package/dist/runtime/require-resolver.d.ts.map +1 -0
- package/dist/runtime/require-resolver.js +698 -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-green-threads.d.ts +136 -0
- package/dist/runtime/ruby-green-threads.d.ts.map +1 -0
- package/dist/runtime/ruby-green-threads.js +904 -0
- package/dist/runtime/ruby-socket-shim.d.ts +2 -0
- package/dist/runtime/ruby-socket-shim.d.ts.map +1 -0
- package/dist/runtime/ruby-socket-shim.js +548 -0
- package/dist/runtime/session-process-supervisor.d.ts +156 -0
- package/dist/runtime/session-process-supervisor.d.ts.map +1 -0
- package/dist/runtime/session-process-supervisor.js +238 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.d.ts +70 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.d.ts.map +1 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.js +425 -0
- package/dist/runtime/streams.d.ts +13 -0
- package/dist/runtime/streams.d.ts.map +1 -0
- package/dist/runtime/streams.js +546 -0
- package/dist/runtime/undici-shim.d.ts +62 -0
- package/dist/runtime/undici-shim.d.ts.map +1 -0
- package/dist/runtime/undici-shim.js +516 -0
- package/dist/runtime/vfs-manifest.d.ts +63 -0
- package/dist/runtime/vfs-manifest.d.ts.map +1 -0
- package/dist/runtime/vfs-manifest.js +141 -0
- package/dist/runtime/vfs-snapshot.d.ts +75 -0
- package/dist/runtime/vfs-snapshot.d.ts.map +1 -0
- package/dist/runtime/vfs-snapshot.js +220 -0
- package/dist/runtime/virtual-socket-kernel.d.ts +252 -0
- package/dist/runtime/virtual-socket-kernel.d.ts.map +1 -0
- package/dist/runtime/virtual-socket-kernel.js +1143 -0
- package/dist/runtime/vite-config-parser.d.ts +13 -0
- package/dist/runtime/vite-config-parser.d.ts.map +1 -0
- package/dist/runtime/vite-config-parser.js +258 -0
- package/dist/runtime/wasi/types.d.ts +347 -0
- package/dist/runtime/wasi/types.d.ts.map +1 -0
- package/dist/runtime/wasi/types.js +1 -0
- package/dist/runtime/wasi-instance.d.ts +215 -0
- package/dist/runtime/wasi-instance.d.ts.map +1 -0
- package/dist/runtime/wasi-instance.generated.d.ts +14 -0
- package/dist/runtime/wasi-instance.generated.d.ts.map +1 -0
- package/dist/runtime/wasi-instance.generated.js +13 -0
- package/dist/runtime/wasi-instance.js +179 -0
- package/dist/runtime/wasi-threads.d.ts +169 -0
- package/dist/runtime/wasi-threads.d.ts.map +1 -0
- package/dist/runtime/wasi-threads.js +669 -0
- package/dist/runtime/wasm-memory.d.ts +84 -0
- package/dist/runtime/wasm-memory.d.ts.map +1 -0
- package/dist/runtime/wasm-memory.js +235 -0
- package/dist/shell/elevation-commands.d.ts +5 -0
- package/dist/shell/elevation-commands.d.ts.map +1 -0
- package/dist/shell/elevation-commands.js +109 -0
- package/dist/shell/exec-dispatch.d.ts +57 -0
- package/dist/shell/exec-dispatch.d.ts.map +1 -0
- package/dist/shell/exec-dispatch.js +181 -0
- package/dist/shell/features.d.ts +154 -0
- package/dist/shell/features.d.ts.map +1 -0
- package/dist/shell/features.js +792 -0
- package/dist/shell/shell-entrypoints.d.ts +55 -0
- package/dist/shell/shell-entrypoints.d.ts.map +1 -0
- package/dist/shell/shell-entrypoints.js +230 -0
- package/dist/shell/shell-invocation.d.ts +36 -0
- package/dist/shell/shell-invocation.d.ts.map +1 -0
- package/dist/shell/shell-invocation.js +148 -0
- package/dist/shell/unix-accounts.d.ts +27 -0
- package/dist/shell/unix-accounts.d.ts.map +1 -0
- package/dist/shell/unix-accounts.js +105 -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 +4702 -0
- package/dist/substrate/lifo/commands/archive/gunzip.d.ts +4 -0
- package/dist/substrate/lifo/commands/archive/gunzip.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/archive/gunzip.js +58 -0
- package/dist/substrate/lifo/commands/archive/gzip.d.ts +4 -0
- package/dist/substrate/lifo/commands/archive/gzip.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/archive/gzip.js +73 -0
- package/dist/substrate/lifo/commands/archive/tar.d.ts +4 -0
- package/dist/substrate/lifo/commands/archive/tar.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/archive/tar.js +158 -0
- package/dist/substrate/lifo/commands/archive/unzip.d.ts +4 -0
- package/dist/substrate/lifo/commands/archive/unzip.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/archive/unzip.js +114 -0
- package/dist/substrate/lifo/commands/archive/zip.d.ts +4 -0
- package/dist/substrate/lifo/commands/archive/zip.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/archive/zip.js +58 -0
- package/dist/substrate/lifo/commands/fs/basename.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/basename.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/basename.js +12 -0
- package/dist/substrate/lifo/commands/fs/cat.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/cat.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/cat.js +52 -0
- package/dist/substrate/lifo/commands/fs/chmod.d.ts +25 -0
- package/dist/substrate/lifo/commands/fs/chmod.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/chmod.js +97 -0
- package/dist/substrate/lifo/commands/fs/chown.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/chown.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/chown.js +41 -0
- package/dist/substrate/lifo/commands/fs/cp.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/cp.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/cp.js +29 -0
- package/dist/substrate/lifo/commands/fs/df.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/df.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/df.js +52 -0
- package/dist/substrate/lifo/commands/fs/dirname.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/dirname.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/dirname.js +12 -0
- package/dist/substrate/lifo/commands/fs/du.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/du.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/du.js +104 -0
- package/dist/substrate/lifo/commands/fs/file.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/file.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/file.js +84 -0
- package/dist/substrate/lifo/commands/fs/find.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/find.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/find.js +72 -0
- package/dist/substrate/lifo/commands/fs/ln.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/ln.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/ln.js +15 -0
- package/dist/substrate/lifo/commands/fs/ls.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/ls.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/ls.js +146 -0
- package/dist/substrate/lifo/commands/fs/mkdir.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/mkdir.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/mkdir.js +31 -0
- package/dist/substrate/lifo/commands/fs/mktemp.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/mktemp.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/mktemp.js +48 -0
- package/dist/substrate/lifo/commands/fs/mv.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/mv.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/mv.js +113 -0
- package/dist/substrate/lifo/commands/fs/realpath.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/realpath.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/realpath.js +27 -0
- package/dist/substrate/lifo/commands/fs/rm.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/rm.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/rm.js +48 -0
- package/dist/substrate/lifo/commands/fs/rmdir.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/rmdir.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/rmdir.js +44 -0
- package/dist/substrate/lifo/commands/fs/stat.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/stat.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/stat.js +35 -0
- package/dist/substrate/lifo/commands/fs/touch.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/touch.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/touch.js +26 -0
- package/dist/substrate/lifo/commands/fs/tree.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/tree.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/tree.js +69 -0
- package/dist/substrate/lifo/commands/index.d.ts +3 -0
- package/dist/substrate/lifo/commands/index.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/index.js +1 -0
- package/dist/substrate/lifo/commands/io/dd.d.ts +4 -0
- package/dist/substrate/lifo/commands/io/dd.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/io/dd.js +256 -0
- package/dist/substrate/lifo/commands/io/printf.d.ts +4 -0
- package/dist/substrate/lifo/commands/io/printf.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/io/printf.js +82 -0
- package/dist/substrate/lifo/commands/io/tee.d.ts +4 -0
- package/dist/substrate/lifo/commands/io/tee.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/io/tee.js +31 -0
- package/dist/substrate/lifo/commands/io/xargs.d.ts +4 -0
- package/dist/substrate/lifo/commands/io/xargs.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/io/xargs.js +44 -0
- package/dist/substrate/lifo/commands/io/yes.d.ts +4 -0
- package/dist/substrate/lifo/commands/io/yes.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/io/yes.js +10 -0
- package/dist/substrate/lifo/commands/net/curl.d.ts +6 -0
- package/dist/substrate/lifo/commands/net/curl.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/curl.js +617 -0
- package/dist/substrate/lifo/commands/net/dig.d.ts +4 -0
- package/dist/substrate/lifo/commands/net/dig.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/dig.js +77 -0
- package/dist/substrate/lifo/commands/net/forward.d.ts +14 -0
- package/dist/substrate/lifo/commands/net/forward.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/forward.js +80 -0
- package/dist/substrate/lifo/commands/net/host.d.ts +14 -0
- package/dist/substrate/lifo/commands/net/host.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/host.js +160 -0
- package/dist/substrate/lifo/commands/net/ifconfig.d.ts +8 -0
- package/dist/substrate/lifo/commands/net/ifconfig.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/ifconfig.js +120 -0
- package/dist/substrate/lifo/commands/net/ip.d.ts +14 -0
- package/dist/substrate/lifo/commands/net/ip.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/ip.js +508 -0
- package/dist/substrate/lifo/commands/net/netstat.d.ts +8 -0
- package/dist/substrate/lifo/commands/net/netstat.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/netstat.js +94 -0
- package/dist/substrate/lifo/commands/net/ping.d.ts +4 -0
- package/dist/substrate/lifo/commands/net/ping.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/ping.js +64 -0
- package/dist/substrate/lifo/commands/net/ports.d.ts +8 -0
- package/dist/substrate/lifo/commands/net/ports.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/ports.js +36 -0
- package/dist/substrate/lifo/commands/net/route.d.ts +8 -0
- package/dist/substrate/lifo/commands/net/route.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/route.js +128 -0
- package/dist/substrate/lifo/commands/net/tunnel-v2.d.ts +4 -0
- package/dist/substrate/lifo/commands/net/tunnel-v2.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/tunnel-v2.js +141 -0
- package/dist/substrate/lifo/commands/net/tunnel.d.ts +6 -0
- package/dist/substrate/lifo/commands/net/tunnel.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/tunnel.js +232 -0
- package/dist/substrate/lifo/commands/net/wget.d.ts +4 -0
- package/dist/substrate/lifo/commands/net/wget.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/wget.js +78 -0
- package/dist/substrate/lifo/commands/registry.d.ts +15 -0
- package/dist/substrate/lifo/commands/registry.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/registry.js +120 -0
- package/dist/substrate/lifo/commands/signal.d.ts +12 -0
- package/dist/substrate/lifo/commands/signal.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/signal.js +47 -0
- package/dist/substrate/lifo/commands/system/bc.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/bc.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/bc.js +243 -0
- package/dist/substrate/lifo/commands/system/cal.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/cal.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/cal.js +81 -0
- package/dist/substrate/lifo/commands/system/date.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/date.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/date.js +79 -0
- package/dist/substrate/lifo/commands/system/env.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/env.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/env.js +7 -0
- package/dist/substrate/lifo/commands/system/fastfetch.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/fastfetch.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/fastfetch.js +385 -0
- package/dist/substrate/lifo/commands/system/free.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/free.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/free.js +36 -0
- package/dist/substrate/lifo/commands/system/help.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/help.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/help.js +46 -0
- package/dist/substrate/lifo/commands/system/hostname.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/hostname.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/hostname.js +6 -0
- package/dist/substrate/lifo/commands/system/kill.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/kill.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/kill.js +76 -0
- package/dist/substrate/lifo/commands/system/lifo.d.ts +41 -0
- package/dist/substrate/lifo/commands/system/lifo.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/lifo.js +446 -0
- package/dist/substrate/lifo/commands/system/logout.d.ts +5 -0
- package/dist/substrate/lifo/commands/system/logout.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/logout.js +15 -0
- package/dist/substrate/lifo/commands/system/man.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/man.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/man.js +144 -0
- package/dist/substrate/lifo/commands/system/node.d.ts +6 -0
- package/dist/substrate/lifo/commands/system/node.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/node.js +1241 -0
- package/dist/substrate/lifo/commands/system/npm.d.ts +26 -0
- package/dist/substrate/lifo/commands/system/npm.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/npm.js +934 -0
- package/dist/substrate/lifo/commands/system/pkg.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/pkg.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/pkg.js +97 -0
- package/dist/substrate/lifo/commands/system/ps.d.ts +5 -0
- package/dist/substrate/lifo/commands/system/ps.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/ps.js +35 -0
- package/dist/substrate/lifo/commands/system/registry-schemas.d.ts +44 -0
- package/dist/substrate/lifo/commands/system/registry-schemas.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/registry-schemas.js +28 -0
- package/dist/substrate/lifo/commands/system/sha256sum.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/sha256sum.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/sha256sum.js +86 -0
- package/dist/substrate/lifo/commands/system/sl.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/sl.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/sl.js +204 -0
- package/dist/substrate/lifo/commands/system/sleep.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/sleep.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/sleep.js +27 -0
- package/dist/substrate/lifo/commands/system/stty.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/stty.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/stty.js +61 -0
- package/dist/substrate/lifo/commands/system/systemctl.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/systemctl.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/systemctl.js +164 -0
- package/dist/substrate/lifo/commands/system/top.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/top.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/top.js +38 -0
- package/dist/substrate/lifo/commands/system/uname.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/uname.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/uname.js +55 -0
- package/dist/substrate/lifo/commands/system/uptime.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/uptime.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/uptime.js +16 -0
- package/dist/substrate/lifo/commands/system/watch.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/watch.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/watch.js +53 -0
- package/dist/substrate/lifo/commands/system/which.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/which.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/which.js +45 -0
- package/dist/substrate/lifo/commands/system/whoami.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/whoami.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/whoami.js +6 -0
- package/dist/substrate/lifo/commands/text/awk.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/awk.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/awk.js +200 -0
- package/dist/substrate/lifo/commands/text/base64.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/base64.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/base64.js +102 -0
- package/dist/substrate/lifo/commands/text/cut.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/cut.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/cut.js +91 -0
- package/dist/substrate/lifo/commands/text/diff.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/diff.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/diff.js +292 -0
- package/dist/substrate/lifo/commands/text/grep.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/grep.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/grep.js +189 -0
- package/dist/substrate/lifo/commands/text/head.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/head.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/head.js +111 -0
- package/dist/substrate/lifo/commands/text/less.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/less.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/less.js +335 -0
- package/dist/substrate/lifo/commands/text/nano.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/nano.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/nano.js +510 -0
- package/dist/substrate/lifo/commands/text/nl.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/nl.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/nl.js +64 -0
- package/dist/substrate/lifo/commands/text/rev.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/rev.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/rev.js +41 -0
- package/dist/substrate/lifo/commands/text/sed.d.ts +21 -0
- package/dist/substrate/lifo/commands/text/sed.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/sed.js +248 -0
- package/dist/substrate/lifo/commands/text/seq.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/seq.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/seq.js +69 -0
- package/dist/substrate/lifo/commands/text/sort.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/sort.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/sort.js +90 -0
- package/dist/substrate/lifo/commands/text/strings.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/strings.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/strings.js +69 -0
- package/dist/substrate/lifo/commands/text/tac.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/tac.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/tac.js +32 -0
- package/dist/substrate/lifo/commands/text/tail.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/tail.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/tail.js +64 -0
- package/dist/substrate/lifo/commands/text/tr.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/tr.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/tr.js +180 -0
- package/dist/substrate/lifo/commands/text/uniq.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/uniq.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/uniq.js +82 -0
- package/dist/substrate/lifo/commands/text/wc.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/wc.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/wc.js +107 -0
- package/dist/substrate/lifo/commands/types.d.ts +49 -0
- package/dist/substrate/lifo/commands/types.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/types.js +1 -0
- package/dist/substrate/lifo/index.d.ts +67 -0
- package/dist/substrate/lifo/index.d.ts.map +1 -0
- package/dist/substrate/lifo/index.js +66 -0
- package/dist/substrate/lifo/kernel/ServiceManager.d.ts +51 -0
- package/dist/substrate/lifo/kernel/ServiceManager.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/ServiceManager.js +302 -0
- package/dist/substrate/lifo/kernel/index.d.ts +40 -0
- package/dist/substrate/lifo/kernel/index.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/index.js +170 -0
- package/dist/substrate/lifo/kernel/network/Bridge.d.ts +110 -0
- package/dist/substrate/lifo/kernel/network/Bridge.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/Bridge.js +278 -0
- package/dist/substrate/lifo/kernel/network/DNSResolver.d.ts +50 -0
- package/dist/substrate/lifo/kernel/network/DNSResolver.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/DNSResolver.js +135 -0
- package/dist/substrate/lifo/kernel/network/NetworkInterface.d.ts +83 -0
- package/dist/substrate/lifo/kernel/network/NetworkInterface.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/NetworkInterface.js +183 -0
- package/dist/substrate/lifo/kernel/network/NetworkNamespace.d.ts +98 -0
- package/dist/substrate/lifo/kernel/network/NetworkNamespace.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/NetworkNamespace.js +149 -0
- package/dist/substrate/lifo/kernel/network/NetworkStack.d.ts +178 -0
- package/dist/substrate/lifo/kernel/network/NetworkStack.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/NetworkStack.js +460 -0
- package/dist/substrate/lifo/kernel/network/PortBridge.d.ts +44 -0
- package/dist/substrate/lifo/kernel/network/PortBridge.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/PortBridge.js +158 -0
- package/dist/substrate/lifo/kernel/network/RoutingTable.d.ts +55 -0
- package/dist/substrate/lifo/kernel/network/RoutingTable.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/RoutingTable.js +167 -0
- package/dist/substrate/lifo/kernel/network/Socket.d.ts +65 -0
- package/dist/substrate/lifo/kernel/network/Socket.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/Socket.js +201 -0
- package/dist/substrate/lifo/kernel/network/index.d.ts +11 -0
- package/dist/substrate/lifo/kernel/network/index.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/index.js +9 -0
- package/dist/substrate/lifo/kernel/network/tunnel/BaseTunnel.d.ts +55 -0
- package/dist/substrate/lifo/kernel/network/tunnel/BaseTunnel.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/tunnel/BaseTunnel.js +88 -0
- package/dist/substrate/lifo/kernel/network/tunnel/VETHPair.d.ts +71 -0
- package/dist/substrate/lifo/kernel/network/tunnel/VETHPair.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/tunnel/VETHPair.js +191 -0
- package/dist/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.d.ts +89 -0
- package/dist/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.js +324 -0
- package/dist/substrate/lifo/kernel/network/types.d.ts +159 -0
- package/dist/substrate/lifo/kernel/network/types.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/types.js +5 -0
- package/dist/substrate/lifo/kernel/persistence/PersistenceManager.d.ts +12 -0
- package/dist/substrate/lifo/kernel/persistence/PersistenceManager.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/persistence/PersistenceManager.js +47 -0
- package/dist/substrate/lifo/kernel/persistence/backends.d.ts +15 -0
- package/dist/substrate/lifo/kernel/persistence/backends.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/persistence/backends.js +18 -0
- package/dist/substrate/lifo/kernel/persistence/index.d.ts +6 -0
- package/dist/substrate/lifo/kernel/persistence/index.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/persistence/index.js +3 -0
- package/dist/substrate/lifo/kernel/persistence/serializer.d.ts +21 -0
- package/dist/substrate/lifo/kernel/persistence/serializer.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/persistence/serializer.js +99 -0
- package/dist/substrate/lifo/kernel/samples.d.ts +3 -0
- package/dist/substrate/lifo/kernel/samples.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/samples.js +930 -0
- package/dist/substrate/lifo/kernel/storage/BlobStore.d.ts +22 -0
- package/dist/substrate/lifo/kernel/storage/BlobStore.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/storage/BlobStore.js +84 -0
- package/dist/substrate/lifo/kernel/storage/ContentStore.d.ts +54 -0
- package/dist/substrate/lifo/kernel/storage/ContentStore.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/storage/ContentStore.js +120 -0
- package/dist/substrate/lifo/kernel/storage/index.d.ts +6 -0
- package/dist/substrate/lifo/kernel/storage/index.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/storage/index.js +3 -0
- package/dist/substrate/lifo/kernel/unit-parser.d.ts +22 -0
- package/dist/substrate/lifo/kernel/unit-parser.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/unit-parser.js +80 -0
- package/dist/substrate/lifo/kernel/vfs/VFS.d.ts +99 -0
- package/dist/substrate/lifo/kernel/vfs/VFS.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/VFS.js +679 -0
- package/dist/substrate/lifo/kernel/vfs/index.d.ts +8 -0
- package/dist/substrate/lifo/kernel/vfs/index.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/index.js +5 -0
- package/dist/substrate/lifo/kernel/vfs/providers/DevProvider.d.ts +21 -0
- package/dist/substrate/lifo/kernel/vfs/providers/DevProvider.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/providers/DevProvider.js +137 -0
- package/dist/substrate/lifo/kernel/vfs/providers/NativeFsProvider.d.ts +63 -0
- package/dist/substrate/lifo/kernel/vfs/providers/NativeFsProvider.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/providers/NativeFsProvider.js +175 -0
- package/dist/substrate/lifo/kernel/vfs/providers/ProcProvider.d.ts +14 -0
- package/dist/substrate/lifo/kernel/vfs/providers/ProcProvider.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/providers/ProcProvider.js +126 -0
- package/dist/substrate/lifo/kernel/vfs/types.d.ts +117 -0
- package/dist/substrate/lifo/kernel/vfs/types.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/types.js +42 -0
- package/dist/substrate/lifo/node-compat/buffer.d.ts +44 -0
- package/dist/substrate/lifo/node-compat/buffer.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/buffer.js +331 -0
- package/dist/substrate/lifo/node-compat/child_process.d.ts +10 -0
- package/dist/substrate/lifo/node-compat/child_process.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/child_process.js +42 -0
- package/dist/substrate/lifo/node-compat/console.d.ts +21 -0
- package/dist/substrate/lifo/node-compat/console.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/console.js +68 -0
- package/dist/substrate/lifo/node-compat/crypto.d.ts +24 -0
- package/dist/substrate/lifo/node-compat/crypto.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/crypto.js +216 -0
- package/dist/substrate/lifo/node-compat/dns.d.ts +117 -0
- package/dist/substrate/lifo/node-compat/dns.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/dns.js +144 -0
- package/dist/substrate/lifo/node-compat/esbuild.d.ts +10 -0
- package/dist/substrate/lifo/node-compat/esbuild.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/esbuild.js +70 -0
- package/dist/substrate/lifo/node-compat/events.d.ts +19 -0
- package/dist/substrate/lifo/node-compat/events.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/events.js +83 -0
- package/dist/substrate/lifo/node-compat/fs.d.ts +195 -0
- package/dist/substrate/lifo/node-compat/fs.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/fs.js +624 -0
- package/dist/substrate/lifo/node-compat/http.d.ts +133 -0
- package/dist/substrate/lifo/node-compat/http.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/http.js +452 -0
- package/dist/substrate/lifo/node-compat/index.d.ts +20 -0
- package/dist/substrate/lifo/node-compat/index.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/index.js +291 -0
- package/dist/substrate/lifo/node-compat/module.d.ts +55 -0
- package/dist/substrate/lifo/node-compat/module.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/module.js +124 -0
- package/dist/substrate/lifo/node-compat/os.d.ts +39 -0
- package/dist/substrate/lifo/node-compat/os.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/os.js +45 -0
- package/dist/substrate/lifo/node-compat/path.d.ts +86 -0
- package/dist/substrate/lifo/node-compat/path.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/path.js +49 -0
- package/dist/substrate/lifo/node-compat/process.d.ts +127 -0
- package/dist/substrate/lifo/node-compat/process.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/process.js +173 -0
- package/dist/substrate/lifo/node-compat/readline.d.ts +85 -0
- package/dist/substrate/lifo/node-compat/readline.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/readline.js +205 -0
- package/dist/substrate/lifo/node-compat/rimraf.d.ts +30 -0
- package/dist/substrate/lifo/node-compat/rimraf.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/rimraf.js +63 -0
- package/dist/substrate/lifo/node-compat/stream.d.ts +36 -0
- package/dist/substrate/lifo/node-compat/stream.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/stream.js +90 -0
- package/dist/substrate/lifo/node-compat/string_decoder.d.ts +11 -0
- package/dist/substrate/lifo/node-compat/string_decoder.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/string_decoder.js +23 -0
- package/dist/substrate/lifo/node-compat/timers.d.ts +16 -0
- package/dist/substrate/lifo/node-compat/timers.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/timers.js +18 -0
- package/dist/substrate/lifo/node-compat/tty.d.ts +32 -0
- package/dist/substrate/lifo/node-compat/tty.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/tty.js +76 -0
- package/dist/substrate/lifo/node-compat/url.d.ts +37 -0
- package/dist/substrate/lifo/node-compat/url.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/url.js +65 -0
- package/dist/substrate/lifo/node-compat/util.d.ts +42 -0
- package/dist/substrate/lifo/node-compat/util.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/util.js +132 -0
- package/dist/substrate/lifo/node-compat/zlib.d.ts +66 -0
- package/dist/substrate/lifo/node-compat/zlib.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/zlib.js +80 -0
- package/dist/substrate/lifo/pkg/PackageManager.d.ts +19 -0
- package/dist/substrate/lifo/pkg/PackageManager.d.ts.map +1 -0
- package/dist/substrate/lifo/pkg/PackageManager.js +97 -0
- package/dist/substrate/lifo/pkg/lifo-dev.d.ts +38 -0
- package/dist/substrate/lifo/pkg/lifo-dev.d.ts.map +1 -0
- package/dist/substrate/lifo/pkg/lifo-dev.js +98 -0
- package/dist/substrate/lifo/pkg/lifo-runtime.d.ts +44 -0
- package/dist/substrate/lifo/pkg/lifo-runtime.d.ts.map +1 -0
- package/dist/substrate/lifo/pkg/lifo-runtime.js +372 -0
- package/dist/substrate/lifo/pkg/loader.d.ts +4 -0
- package/dist/substrate/lifo/pkg/loader.d.ts.map +1 -0
- package/dist/substrate/lifo/pkg/loader.js +24 -0
- package/dist/substrate/lifo/sandbox/HeadlessTerminal.d.ts +18 -0
- package/dist/substrate/lifo/sandbox/HeadlessTerminal.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/HeadlessTerminal.js +28 -0
- package/dist/substrate/lifo/sandbox/Sandbox.d.ts +59 -0
- package/dist/substrate/lifo/sandbox/Sandbox.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/Sandbox.js +234 -0
- package/dist/substrate/lifo/sandbox/SandboxCommands.d.ts +18 -0
- package/dist/substrate/lifo/sandbox/SandboxCommands.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/SandboxCommands.js +64 -0
- package/dist/substrate/lifo/sandbox/SandboxFs.d.ts +43 -0
- package/dist/substrate/lifo/sandbox/SandboxFs.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/SandboxFs.js +136 -0
- package/dist/substrate/lifo/sandbox/index.d.ts +3 -0
- package/dist/substrate/lifo/sandbox/index.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/index.js +1 -0
- package/dist/substrate/lifo/sandbox/types.d.ts +116 -0
- package/dist/substrate/lifo/sandbox/types.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/types.js +1 -0
- package/dist/substrate/lifo/shell/ProcessRegistry.d.ts +142 -0
- package/dist/substrate/lifo/shell/ProcessRegistry.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/ProcessRegistry.js +256 -0
- package/dist/substrate/lifo/shell/Shell.d.ts +170 -0
- package/dist/substrate/lifo/shell/Shell.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/Shell.js +1863 -0
- package/dist/substrate/lifo/shell/completer.d.ts +19 -0
- package/dist/substrate/lifo/shell/completer.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/completer.js +164 -0
- package/dist/substrate/lifo/shell/default-shell.d.ts +9 -0
- package/dist/substrate/lifo/shell/default-shell.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/default-shell.js +53 -0
- package/dist/substrate/lifo/shell/expander.d.ts +48 -0
- package/dist/substrate/lifo/shell/expander.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/expander.js +1204 -0
- package/dist/substrate/lifo/shell/history.d.ts +22 -0
- package/dist/substrate/lifo/shell/history.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/history.js +121 -0
- package/dist/substrate/lifo/shell/interpreter.d.ts +257 -0
- package/dist/substrate/lifo/shell/interpreter.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/interpreter.js +1490 -0
- package/dist/substrate/lifo/shell/jobs.d.ts +21 -0
- package/dist/substrate/lifo/shell/jobs.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/jobs.js +48 -0
- package/dist/substrate/lifo/shell/lexer.d.ts +13 -0
- package/dist/substrate/lifo/shell/lexer.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/lexer.js +614 -0
- package/dist/substrate/lifo/shell/parser.d.ts +7 -0
- package/dist/substrate/lifo/shell/parser.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/parser.js +573 -0
- package/dist/substrate/lifo/shell/pipe.d.ts +15 -0
- package/dist/substrate/lifo/shell/pipe.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/pipe.js +86 -0
- package/dist/substrate/lifo/shell/signals.d.ts +11 -0
- package/dist/substrate/lifo/shell/signals.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/signals.js +57 -0
- package/dist/substrate/lifo/shell/terminal-stdin.d.ts +28 -0
- package/dist/substrate/lifo/shell/terminal-stdin.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/terminal-stdin.js +100 -0
- package/dist/substrate/lifo/shell/test-builtin.d.ts +16 -0
- package/dist/substrate/lifo/shell/test-builtin.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/test-builtin.js +237 -0
- package/dist/substrate/lifo/shell/types.d.ts +140 -0
- package/dist/substrate/lifo/shell/types.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/types.js +25 -0
- package/dist/substrate/lifo/terminal/ITerminal.d.ts +10 -0
- package/dist/substrate/lifo/terminal/ITerminal.d.ts.map +1 -0
- package/dist/substrate/lifo/terminal/ITerminal.js +1 -0
- package/dist/substrate/lifo/utils/archive.d.ts +28 -0
- package/dist/substrate/lifo/utils/archive.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/archive.js +323 -0
- package/dist/substrate/lifo/utils/args.d.ts +18 -0
- package/dist/substrate/lifo/utils/args.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/args.js +73 -0
- package/dist/substrate/lifo/utils/colors.d.ts +27 -0
- package/dist/substrate/lifo/utils/colors.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/colors.js +26 -0
- package/dist/substrate/lifo/utils/encoding.d.ts +4 -0
- package/dist/substrate/lifo/utils/encoding.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/encoding.js +18 -0
- package/dist/substrate/lifo/utils/glob.d.ts +12 -0
- package/dist/substrate/lifo/utils/glob.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/glob.js +150 -0
- package/dist/substrate/lifo/utils/mime.d.ts +4 -0
- package/dist/substrate/lifo/utils/mime.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/mime.js +107 -0
- package/dist/substrate/lifo/utils/path.d.ts +12 -0
- package/dist/substrate/lifo/utils/path.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/path.js +82 -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 +46 -0
- package/dist/vfs/path.d.ts.map +1 -0
- package/dist/vfs/path.js +69 -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 +1054 -0
- package/dist/vfs/sqlite-vfs.d.ts +821 -0
- package/dist/vfs/sqlite-vfs.d.ts.map +1 -0
- package/dist/vfs/sqlite-vfs.js +4135 -0
- package/dist/vfs/symlink-registry.d.ts +60 -0
- package/dist/vfs/symlink-registry.d.ts.map +1 -0
- package/dist/vfs/symlink-registry.js +162 -0
- package/dist/workspace/nimbus-workspace.d.ts +94 -0
- package/dist/workspace/nimbus-workspace.d.ts.map +1 -0
- package/dist/workspace/nimbus-workspace.js +167 -0
- package/package.json +69 -0
- package/src/_shared/ai-egress.ts +91 -0
- package/src/_shared/byte-stream.ts +97 -0
- package/src/_shared/bytes.ts +19 -0
- package/src/_shared/cache-stats.ts +231 -0
- package/src/_shared/crypto.ts +184 -0
- package/src/_shared/esbuild-facet-shim.ts +22 -0
- package/src/_shared/exports-resolver.ts +308 -0
- package/src/_shared/facet-vfs-cursor.ts +58 -0
- package/src/_shared/install-phase.ts +56 -0
- package/src/_shared/lru-map.ts +59 -0
- package/src/_shared/real-node-imports.ts +53 -0
- package/src/_shared/retry.ts +202 -0
- package/src/_shared/rpc-dispose.ts +31 -0
- package/src/_shared/terminal.ts +3 -0
- package/src/_shared/typescript-specifiers.ts +86 -0
- package/src/_shared/untrusted-request.ts +75 -0
- package/src/_shared/vfs-write-ledger.ts +440 -0
- package/src/_shared/w7-frame.ts +1012 -0
- package/src/_shared/weighted-credit-pool.ts +244 -0
- package/src/constants.ts +285 -0
- package/src/index.ts +22 -0
- package/src/observability/diag-counters.ts +343 -0
- package/src/observability/heap-estimate.ts +331 -0
- package/src/observability/heavy-alloc-coord.ts +241 -0
- package/src/observability/oom-classify.ts +253 -0
- package/src/observability/oom-discriminator.ts +405 -0
- package/src/runtime/assets-loader.ts +189 -0
- package/src/runtime/barrel-detect.ts +69 -0
- package/src/runtime/bash/preamble.ts +1519 -0
- package/src/runtime/bash/types.ts +497 -0
- package/src/runtime/bundle-profile.ts +32 -0
- package/src/runtime/cirrus-vite-config-rewriter.ts +28 -0
- package/src/runtime/cli-flags.ts +11 -0
- package/src/runtime/comment-strip.ts +73 -0
- package/src/runtime/cpython-preamble.ts +298 -0
- package/src/runtime/esbuild-service.ts +1470 -0
- package/src/runtime/framework-detect.ts +245 -0
- package/src/runtime/import-meta-transform.ts +16 -0
- package/src/runtime/javascript-ast.ts +66 -0
- package/src/runtime/long-running-handle.ts +185 -0
- package/src/runtime/module-source-rewriter.ts +95 -0
- package/src/runtime/opentui-wasm-backend.ts +608 -0
- package/src/runtime/os-contracts.ts +529 -0
- package/src/runtime/port-registry.ts +298 -0
- package/src/runtime/process-input-routing.ts +92 -0
- package/src/runtime/process-input.ts +148 -0
- package/src/runtime/process-io-protocol.ts +97 -0
- package/src/runtime/process-logs.ts +882 -0
- package/src/runtime/process-table.ts +225 -0
- package/src/runtime/project-detect.ts +42 -0
- package/src/runtime/python-server-adapter.ts +133 -0
- package/src/runtime/require-resolver.ts +760 -0
- package/src/runtime/router-basename.ts +279 -0
- package/src/runtime/ruby-green-threads.ts +904 -0
- package/src/runtime/ruby-socket-shim.ts +548 -0
- package/src/runtime/session-process-supervisor.ts +323 -0
- package/src/runtime/sqlite-runtime-fs-bridge.ts +468 -0
- package/src/runtime/streams.ts +547 -0
- package/src/runtime/undici-shim.ts +517 -0
- package/src/runtime/vfs-manifest.ts +170 -0
- package/src/runtime/vfs-snapshot.ts +273 -0
- package/src/runtime/virtual-socket-kernel.ts +1370 -0
- package/src/runtime/vite-config-parser.ts +273 -0
- package/src/runtime/wasi/types.ts +448 -0
- package/src/runtime/wasi-instance.generated.ts +14 -0
- package/src/runtime/wasi-instance.ts +259 -0
- package/src/runtime/wasi-threads.ts +682 -0
- package/src/runtime/wasm-memory.ts +261 -0
- package/src/shell/elevation-commands.ts +117 -0
- package/src/shell/exec-dispatch.ts +201 -0
- package/src/shell/features.ts +870 -0
- package/src/shell/shell-entrypoints.ts +323 -0
- package/src/shell/shell-invocation.ts +181 -0
- package/src/shell/unix-accounts.ts +128 -0
- package/src/shell/unix-commands.ts +4335 -0
- package/src/substrate/lifo/UPSTREAM.md +14 -0
- package/src/substrate/lifo/commands/archive/gunzip.ts +63 -0
- package/src/substrate/lifo/commands/archive/gzip.ts +76 -0
- package/src/substrate/lifo/commands/archive/tar.ts +157 -0
- package/src/substrate/lifo/commands/archive/unzip.ts +112 -0
- package/src/substrate/lifo/commands/archive/zip.ts +70 -0
- package/src/substrate/lifo/commands/fs/basename.ts +16 -0
- package/src/substrate/lifo/commands/fs/cat.ts +54 -0
- package/src/substrate/lifo/commands/fs/chmod.ts +110 -0
- package/src/substrate/lifo/commands/fs/chown.ts +45 -0
- package/src/substrate/lifo/commands/fs/cp.ts +33 -0
- package/src/substrate/lifo/commands/fs/df.ts +56 -0
- package/src/substrate/lifo/commands/fs/dirname.ts +16 -0
- package/src/substrate/lifo/commands/fs/du.ts +100 -0
- package/src/substrate/lifo/commands/fs/file.ts +90 -0
- package/src/substrate/lifo/commands/fs/find.ts +76 -0
- package/src/substrate/lifo/commands/fs/ln.ts +19 -0
- package/src/substrate/lifo/commands/fs/ls.ts +164 -0
- package/src/substrate/lifo/commands/fs/mkdir.ts +37 -0
- package/src/substrate/lifo/commands/fs/mktemp.ts +56 -0
- package/src/substrate/lifo/commands/fs/mv.ts +111 -0
- package/src/substrate/lifo/commands/fs/realpath.ts +31 -0
- package/src/substrate/lifo/commands/fs/rm.ts +53 -0
- package/src/substrate/lifo/commands/fs/rmdir.ts +50 -0
- package/src/substrate/lifo/commands/fs/stat.ts +39 -0
- package/src/substrate/lifo/commands/fs/touch.ts +30 -0
- package/src/substrate/lifo/commands/fs/tree.ts +76 -0
- package/src/substrate/lifo/commands/index.ts +2 -0
- package/src/substrate/lifo/commands/io/dd.ts +289 -0
- package/src/substrate/lifo/commands/io/printf.ts +78 -0
- package/src/substrate/lifo/commands/io/tee.ts +37 -0
- package/src/substrate/lifo/commands/io/xargs.ts +49 -0
- package/src/substrate/lifo/commands/io/yes.ts +15 -0
- package/src/substrate/lifo/commands/net/curl.ts +739 -0
- package/src/substrate/lifo/commands/net/dig.ts +99 -0
- package/src/substrate/lifo/commands/net/forward.ts +90 -0
- package/src/substrate/lifo/commands/net/host.ts +182 -0
- package/src/substrate/lifo/commands/net/ifconfig.ts +139 -0
- package/src/substrate/lifo/commands/net/ip.ts +633 -0
- package/src/substrate/lifo/commands/net/netstat.ts +106 -0
- package/src/substrate/lifo/commands/net/ping.ts +74 -0
- package/src/substrate/lifo/commands/net/ports.ts +45 -0
- package/src/substrate/lifo/commands/net/route.ts +153 -0
- package/src/substrate/lifo/commands/net/tunnel-v2.ts +183 -0
- package/src/substrate/lifo/commands/net/tunnel.ts +272 -0
- package/src/substrate/lifo/commands/net/wget.ts +88 -0
- package/src/substrate/lifo/commands/registry.ts +141 -0
- package/src/substrate/lifo/commands/signal.ts +65 -0
- package/src/substrate/lifo/commands/system/bc.ts +265 -0
- package/src/substrate/lifo/commands/system/cal.ts +90 -0
- package/src/substrate/lifo/commands/system/date.ts +59 -0
- package/src/substrate/lifo/commands/system/env.ts +10 -0
- package/src/substrate/lifo/commands/system/fastfetch.ts +428 -0
- package/src/substrate/lifo/commands/system/free.ts +38 -0
- package/src/substrate/lifo/commands/system/help.ts +53 -0
- package/src/substrate/lifo/commands/system/hostname.ts +9 -0
- package/src/substrate/lifo/commands/system/kill.ts +89 -0
- package/src/substrate/lifo/commands/system/lifo.ts +525 -0
- package/src/substrate/lifo/commands/system/logout.ts +17 -0
- package/src/substrate/lifo/commands/system/man.ts +167 -0
- package/src/substrate/lifo/commands/system/node.ts +1305 -0
- package/src/substrate/lifo/commands/system/npm.ts +1078 -0
- package/src/substrate/lifo/commands/system/pkg.ts +111 -0
- package/src/substrate/lifo/commands/system/ps.ts +46 -0
- package/src/substrate/lifo/commands/system/registry-schemas.ts +33 -0
- package/src/substrate/lifo/commands/system/sha256sum.ts +89 -0
- package/src/substrate/lifo/commands/system/sl.ts +249 -0
- package/src/substrate/lifo/commands/system/sleep.ts +36 -0
- package/src/substrate/lifo/commands/system/stty.ts +69 -0
- package/src/substrate/lifo/commands/system/systemctl.ts +184 -0
- package/src/substrate/lifo/commands/system/top.ts +53 -0
- package/src/substrate/lifo/commands/system/uname.ts +59 -0
- package/src/substrate/lifo/commands/system/uptime.ts +19 -0
- package/src/substrate/lifo/commands/system/watch.ts +67 -0
- package/src/substrate/lifo/commands/system/which.ts +51 -0
- package/src/substrate/lifo/commands/system/whoami.ts +9 -0
- package/src/substrate/lifo/commands/text/awk.ts +210 -0
- package/src/substrate/lifo/commands/text/base64.ts +102 -0
- package/src/substrate/lifo/commands/text/cut.ts +92 -0
- package/src/substrate/lifo/commands/text/diff.ts +314 -0
- package/src/substrate/lifo/commands/text/grep.ts +170 -0
- package/src/substrate/lifo/commands/text/head.ts +95 -0
- package/src/substrate/lifo/commands/text/less.ts +335 -0
- package/src/substrate/lifo/commands/text/nano.ts +513 -0
- package/src/substrate/lifo/commands/text/nl.ts +74 -0
- package/src/substrate/lifo/commands/text/rev.ts +46 -0
- package/src/substrate/lifo/commands/text/sed.ts +297 -0
- package/src/substrate/lifo/commands/text/seq.ts +76 -0
- package/src/substrate/lifo/commands/text/sort.ts +88 -0
- package/src/substrate/lifo/commands/text/strings.ts +73 -0
- package/src/substrate/lifo/commands/text/tac.ts +37 -0
- package/src/substrate/lifo/commands/text/tail.ts +63 -0
- package/src/substrate/lifo/commands/text/tr.ts +192 -0
- package/src/substrate/lifo/commands/text/uniq.ts +77 -0
- package/src/substrate/lifo/commands/text/wc.ts +104 -0
- package/src/substrate/lifo/commands/types.ts +58 -0
- package/src/substrate/lifo/index.ts +173 -0
- package/src/substrate/lifo/kernel/ServiceManager.ts +371 -0
- package/src/substrate/lifo/kernel/index.ts +209 -0
- package/src/substrate/lifo/kernel/network/Bridge.ts +336 -0
- package/src/substrate/lifo/kernel/network/DNSResolver.ts +158 -0
- package/src/substrate/lifo/kernel/network/NetworkInterface.ts +235 -0
- package/src/substrate/lifo/kernel/network/NetworkNamespace.ts +182 -0
- package/src/substrate/lifo/kernel/network/NetworkStack.ts +590 -0
- package/src/substrate/lifo/kernel/network/PortBridge.ts +182 -0
- package/src/substrate/lifo/kernel/network/RoutingTable.ts +209 -0
- package/src/substrate/lifo/kernel/network/Socket.ts +245 -0
- package/src/substrate/lifo/kernel/network/index.ts +29 -0
- package/src/substrate/lifo/kernel/network/tunnel/BaseTunnel.ts +124 -0
- package/src/substrate/lifo/kernel/network/tunnel/VETHPair.ts +227 -0
- package/src/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.ts +387 -0
- package/src/substrate/lifo/kernel/network/types.ts +178 -0
- package/src/substrate/lifo/kernel/persistence/PersistenceManager.ts +50 -0
- package/src/substrate/lifo/kernel/persistence/backends.ts +36 -0
- package/src/substrate/lifo/kernel/persistence/index.ts +5 -0
- package/src/substrate/lifo/kernel/persistence/serializer.ts +127 -0
- package/src/substrate/lifo/kernel/samples.ts +966 -0
- package/src/substrate/lifo/kernel/storage/BlobStore.ts +114 -0
- package/src/substrate/lifo/kernel/storage/ContentStore.ts +150 -0
- package/src/substrate/lifo/kernel/storage/index.ts +5 -0
- package/src/substrate/lifo/kernel/unit-parser.ts +95 -0
- package/src/substrate/lifo/kernel/vfs/VFS.ts +768 -0
- package/src/substrate/lifo/kernel/vfs/index.ts +9 -0
- package/src/substrate/lifo/kernel/vfs/providers/DevProvider.ts +172 -0
- package/src/substrate/lifo/kernel/vfs/providers/NativeFsProvider.ts +198 -0
- package/src/substrate/lifo/kernel/vfs/providers/ProcProvider.ts +144 -0
- package/src/substrate/lifo/kernel/vfs/types.ts +145 -0
- package/src/substrate/lifo/node-compat/buffer.ts +357 -0
- package/src/substrate/lifo/node-compat/child_process.ts +52 -0
- package/src/substrate/lifo/node-compat/console.ts +70 -0
- package/src/substrate/lifo/node-compat/crypto.ts +186 -0
- package/src/substrate/lifo/node-compat/dns.ts +214 -0
- package/src/substrate/lifo/node-compat/esbuild.ts +85 -0
- package/src/substrate/lifo/node-compat/events.ts +94 -0
- package/src/substrate/lifo/node-compat/fs.ts +762 -0
- package/src/substrate/lifo/node-compat/http.ts +561 -0
- package/src/substrate/lifo/node-compat/index.ts +300 -0
- package/src/substrate/lifo/node-compat/module.ts +148 -0
- package/src/substrate/lifo/node-compat/os.ts +44 -0
- package/src/substrate/lifo/node-compat/path.ts +74 -0
- package/src/substrate/lifo/node-compat/process.ts +178 -0
- package/src/substrate/lifo/node-compat/readline.ts +244 -0
- package/src/substrate/lifo/node-compat/rimraf.ts +80 -0
- package/src/substrate/lifo/node-compat/stream.ts +98 -0
- package/src/substrate/lifo/node-compat/string_decoder.ts +26 -0
- package/src/substrate/lifo/node-compat/timers.ts +21 -0
- package/src/substrate/lifo/node-compat/tty.ts +83 -0
- package/src/substrate/lifo/node-compat/url.ts +76 -0
- package/src/substrate/lifo/node-compat/util.ts +133 -0
- package/src/substrate/lifo/node-compat/zlib.ts +94 -0
- package/src/substrate/lifo/pkg/PackageManager.ts +105 -0
- package/src/substrate/lifo/pkg/lifo-dev.ts +130 -0
- package/src/substrate/lifo/pkg/lifo-runtime.ts +473 -0
- package/src/substrate/lifo/pkg/loader.ts +33 -0
- package/src/substrate/lifo/platform-globals.d.ts +41 -0
- package/src/substrate/lifo/sandbox/HeadlessTerminal.ts +38 -0
- package/src/substrate/lifo/sandbox/Sandbox.ts +279 -0
- package/src/substrate/lifo/sandbox/SandboxCommands.ts +74 -0
- package/src/substrate/lifo/sandbox/SandboxFs.ts +160 -0
- package/src/substrate/lifo/sandbox/index.ts +8 -0
- package/src/substrate/lifo/sandbox/types.ts +117 -0
- package/src/substrate/lifo/shell/ProcessRegistry.ts +379 -0
- package/src/substrate/lifo/shell/Shell.ts +2048 -0
- package/src/substrate/lifo/shell/completer.ts +212 -0
- package/src/substrate/lifo/shell/default-shell.ts +63 -0
- package/src/substrate/lifo/shell/expander.ts +1349 -0
- package/src/substrate/lifo/shell/history.ts +138 -0
- package/src/substrate/lifo/shell/interpreter.ts +1754 -0
- package/src/substrate/lifo/shell/jobs.ts +64 -0
- package/src/substrate/lifo/shell/lexer.ts +698 -0
- package/src/substrate/lifo/shell/parser.ts +711 -0
- package/src/substrate/lifo/shell/pipe.ts +92 -0
- package/src/substrate/lifo/shell/signals.ts +70 -0
- package/src/substrate/lifo/shell/terminal-stdin.ts +109 -0
- package/src/substrate/lifo/shell/test-builtin.ts +316 -0
- package/src/substrate/lifo/shell/types.ts +166 -0
- package/src/substrate/lifo/terminal/ITerminal.ts +9 -0
- package/src/substrate/lifo/utils/archive.ts +389 -0
- package/src/substrate/lifo/utils/args.ts +89 -0
- package/src/substrate/lifo/utils/colors.ts +29 -0
- package/src/substrate/lifo/utils/encoding.ts +21 -0
- package/src/substrate/lifo/utils/glob.ts +172 -0
- package/src/substrate/lifo/utils/mime.ts +114 -0
- package/src/substrate/lifo/utils/path.ts +83 -0
- package/src/types/assets.d.ts +4 -0
- package/src/vfs/events.ts +134 -0
- package/src/vfs/path.ts +71 -0
- package/src/vfs/seed-project.ts +1094 -0
- package/src/vfs/sqlite-vfs.ts +5035 -0
- package/src/vfs/symlink-registry.ts +172 -0
- package/src/workspace/nimbus-workspace.ts +213 -0
|
@@ -0,0 +1,882 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProcessLogStore — per-PID ring buffer for facet stdout/stderr.
|
|
3
|
+
*
|
|
4
|
+
* Problem we solve:
|
|
5
|
+
* Facet stdout/stderr flows through `_rpcStdout`/`_rpcStderr` in
|
|
6
|
+
* NimbusSession. If the WebSocket terminal is attached, data reaches
|
|
7
|
+
* the user. If not — or if a process crashes synchronously before its
|
|
8
|
+
* output has been flushed through — the data is gone.
|
|
9
|
+
*
|
|
10
|
+
* What this does:
|
|
11
|
+
* - Buffer every stdout/stderr chunk in a fixed-byte ring, keyed by PID.
|
|
12
|
+
* - Split oversize chunks at 4 KB so no single write can swamp a PID's
|
|
13
|
+
* allotted 64 KB.
|
|
14
|
+
* - Tag binary chunks (null bytes / high non-printable ratio) as
|
|
15
|
+
* `{type: 'binary', size: N}` so replay shows `[N bytes of binary
|
|
16
|
+
* output]` instead of garbled terminal state.
|
|
17
|
+
* - Track process exit separately from the append stream so `logs` can
|
|
18
|
+
* print a clean footer and `_emitExitDump` can fire exactly once.
|
|
19
|
+
* - Retain logs for `retainAfterExitMs` (default 10 min) past exit —
|
|
20
|
+
* far longer than ProcessTable.reap's 60 s — so users have time to
|
|
21
|
+
* read a crash dump.
|
|
22
|
+
* - Provide pub-sub via `subscribe(pid, cb)` so `logs -f` is O(1) per
|
|
23
|
+
* chunk, not a poll loop.
|
|
24
|
+
*
|
|
25
|
+
* Non-goals:
|
|
26
|
+
* - Routing raw Uint8Array. RPC boundary already strings the data
|
|
27
|
+
* (SupervisorRPC.stdout(data: string)), so we store strings.
|
|
28
|
+
*
|
|
29
|
+
* Hibernation persistence:
|
|
30
|
+
* The store optionally accepts a `PersistAdapter` (set via
|
|
31
|
+
* `setPersist`). When set:
|
|
32
|
+
* - `append` / `markExit` mark the pid dirty in memory; the actual
|
|
33
|
+
* SQL write is batched into `flush()`. Callers schedule `flush()`
|
|
34
|
+
* from a debounced alarm OR a webSocketClose handler so writes
|
|
35
|
+
* don't run on the hot stdout path.
|
|
36
|
+
* - First read of a pid (`tail`/`all`/`subscribe`/`getExit`/`has`)
|
|
37
|
+
* lazily hydrates from the adapter. Subsequent reads stay in
|
|
38
|
+
* memory until eviction.
|
|
39
|
+
* - Eviction (per-pid byte cap, dropOlderThan, maxPids) cascades
|
|
40
|
+
* to the adapter on the next `flush()` — never inline, so eviction
|
|
41
|
+
* under load doesn't write-amplify.
|
|
42
|
+
* When NOT set: behaviour is byte-identical to pre-W9 (in-memory only).
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
export type LogStream = 'stdout' | 'stderr';
|
|
46
|
+
|
|
47
|
+
export interface LogChunk {
|
|
48
|
+
ts: number;
|
|
49
|
+
stream: LogStream;
|
|
50
|
+
/**
|
|
51
|
+
* `data` is the raw chunk content (ANSI escapes preserved). For
|
|
52
|
+
* binary-detected chunks it's a placeholder like
|
|
53
|
+
* `[237 bytes of binary output]\n`; the original bytes are dropped.
|
|
54
|
+
*/
|
|
55
|
+
data: string;
|
|
56
|
+
/** Set for chunks we flagged as binary — lets UI render differently. */
|
|
57
|
+
binary?: boolean;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface SequencedLogChunk extends LogChunk {
|
|
61
|
+
seq: number;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface ProcessLogReadOptions {
|
|
65
|
+
cursor?: number;
|
|
66
|
+
lines?: number;
|
|
67
|
+
bytes?: number;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface ProcessExitInfo {
|
|
71
|
+
code: number;
|
|
72
|
+
/** When the exit was recorded (ms epoch). */
|
|
73
|
+
at: number;
|
|
74
|
+
/** Optional synthetic reason, used by external-exit path (timeout/abort). */
|
|
75
|
+
reason?: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
interface PidState {
|
|
79
|
+
chunks: LogChunk[];
|
|
80
|
+
/** Total bytes of `data` across all chunks (for ring eviction). */
|
|
81
|
+
bytes: number;
|
|
82
|
+
exit: ProcessExitInfo | null;
|
|
83
|
+
/** Last touch (append, markExit) — used by dropOlderThan. */
|
|
84
|
+
lastActivity: number;
|
|
85
|
+
subscribers: Set<(c: LogChunk) => void>;
|
|
86
|
+
exitSubscribers: Set<(e: ProcessExitInfo) => void>;
|
|
87
|
+
/**
|
|
88
|
+
* W9: monotonic per-pid sequence. Each `append` increments by 1
|
|
89
|
+
* regardless of in-memory eviction; persisted alongside the chunk so
|
|
90
|
+
* after-hibernate hydrate restores chunks in append order. Resets only
|
|
91
|
+
* when the pid is fully dropped (dropPid / dropOlderThan / maxPids
|
|
92
|
+
* eviction) — same lifetime as the SQL row set for this pid.
|
|
93
|
+
*/
|
|
94
|
+
nextSeq: number;
|
|
95
|
+
/**
|
|
96
|
+
* W9: chunks not yet flushed to the persist adapter. Indexed by `seq`,
|
|
97
|
+
* not by chunks-array offset, because in-memory eviction may shift
|
|
98
|
+
* the chunks array out from under a pending flush. The flush path
|
|
99
|
+
* iterates this list and posts to `persistChunks`.
|
|
100
|
+
*/
|
|
101
|
+
dirtyChunks: { seq: number; chunk: LogChunk }[];
|
|
102
|
+
/** W9: set when `markExit` ran but exit not yet flushed. */
|
|
103
|
+
dirtyExit: boolean;
|
|
104
|
+
/** W9: hydrated from the adapter at least once this isolate-gen. */
|
|
105
|
+
hydrated: boolean;
|
|
106
|
+
/** W9: highest seq present in SQL after the last flush. Used by
|
|
107
|
+
* pruneBeforeSeq to tell the adapter how far to keep rows. */
|
|
108
|
+
flushedHighSeq: number;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* live in NimbusSession (production: ctx.storage.sql) and in test
|
|
113
|
+
* harnesses (functional probes: in-memory mock).
|
|
114
|
+
*
|
|
115
|
+
* Contract:
|
|
116
|
+
* - load(pid) is called at most once per pid per isolate-gen, before
|
|
117
|
+
* the first read for that pid. Returning `null` means "no row" —
|
|
118
|
+
* the store treats the pid as fresh. Returning `{ chunks: [], exit: null }`
|
|
119
|
+
* means "explicitly empty" (also fresh).
|
|
120
|
+
* - persistChunks / persistExit are called ONLY from `flush()`. Each
|
|
121
|
+
* call carries every NEW chunk since the last flush for that pid;
|
|
122
|
+
* the adapter MUST insert all of them in seq order.
|
|
123
|
+
* - dropPid removes ALL rows for the pid from BOTH tables. Called on
|
|
124
|
+
* dropOlderThan + maxPids eviction.
|
|
125
|
+
* - pruneBeforeSeq removes chunk rows below the given seq. Called
|
|
126
|
+
* inside flush after the per-pid byte cap is exceeded; the store
|
|
127
|
+
* computes the cutoff seq from its own ring state.
|
|
128
|
+
* - Adapters MUST be synchronous from the store's POV. Real SQL
|
|
129
|
+
* calls in the DO are synchronous (storage.sql.exec is blocking
|
|
130
|
+
* against the SQLite engine); KV is not used by W9.
|
|
131
|
+
*/
|
|
132
|
+
export interface PersistAdapter {
|
|
133
|
+
load(pid: number): { chunks: LogChunk[]; exit: ProcessExitInfo | null } | null;
|
|
134
|
+
persistChunks(pid: number, rows: { seq: number; chunk: LogChunk }[]): void;
|
|
135
|
+
persistExit(pid: number, info: ProcessExitInfo): void;
|
|
136
|
+
dropPid(pid: number): void;
|
|
137
|
+
pruneBeforeSeq(pid: number, seq: number): void;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export interface ProcessLogStoreOptions {
|
|
141
|
+
/** Per-PID ring cap in bytes. Default 64 KB. */
|
|
142
|
+
perPidBytes?: number;
|
|
143
|
+
/**
|
|
144
|
+
* Max chunk length in bytes. Writes longer than this are split into
|
|
145
|
+
* multiple chunks. Default 4 KB. Splitting may break a single ANSI
|
|
146
|
+
* escape sequence across chunks — tolerated because replay tools
|
|
147
|
+
* concatenate chunks before rendering.
|
|
148
|
+
*/
|
|
149
|
+
maxChunkBytes?: number;
|
|
150
|
+
/** Retention past process exit. Default 10 min. */
|
|
151
|
+
retainAfterExitMs?: number;
|
|
152
|
+
/**
|
|
153
|
+
* Global cap on the number of tracked PIDs. When `_getOrCreate`
|
|
154
|
+
* would push the count above this, the store evicts in this order
|
|
155
|
+
* of preference:
|
|
156
|
+
* 1. Oldest EXITED pid with zero subscribers.
|
|
157
|
+
* 2. Oldest pid by `lastActivity` (any state) with zero subscribers.
|
|
158
|
+
* 3. Fail silently — an edge case where every pid is actively
|
|
159
|
+
* subscribed; the new entry is still inserted and the cap is
|
|
160
|
+
* briefly exceeded.
|
|
161
|
+
* Default 500. Protects against a 1000-pid fork-bomb pinning
|
|
162
|
+
* ~50 MB of ring buffers for 10 minutes.
|
|
163
|
+
*/
|
|
164
|
+
maxPids?: number;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** Detect binary content — rough but good enough for "this is not text". */
|
|
168
|
+
function looksBinary(s: string): boolean {
|
|
169
|
+
if (s.length === 0) return false;
|
|
170
|
+
// Null byte is the strongest signal.
|
|
171
|
+
if (s.indexOf('\x00') !== -1) return true;
|
|
172
|
+
// Otherwise sample up to 512 chars for non-printable non-whitespace.
|
|
173
|
+
const sample = s.length > 512 ? s.substring(0, 512) : s;
|
|
174
|
+
let bad = 0;
|
|
175
|
+
for (let i = 0; i < sample.length; i++) {
|
|
176
|
+
const c = sample.charCodeAt(i);
|
|
177
|
+
// Allow tab (9), LF (10), CR (13), ESC (27 — ANSI), and >= 32.
|
|
178
|
+
if (c === 9 || c === 10 || c === 13 || c === 27 || c >= 32) continue;
|
|
179
|
+
bad++;
|
|
180
|
+
}
|
|
181
|
+
return bad / sample.length > 0.1;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Strip ANSI CSI escape sequences (colors, cursor, etc.) for --plain mode.
|
|
186
|
+
* Keeps the rest of the text intact.
|
|
187
|
+
*/
|
|
188
|
+
export function stripAnsi(s: string): string {
|
|
189
|
+
// Match CSI and OSC sequences.
|
|
190
|
+
return s
|
|
191
|
+
.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, '')
|
|
192
|
+
.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g, '')
|
|
193
|
+
.replace(/\x1b[=>()]/g, '');
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export class ProcessLogStore {
|
|
197
|
+
private readonly perPidBytes: number;
|
|
198
|
+
private readonly maxChunkBytes: number;
|
|
199
|
+
private readonly retainAfterExitMs: number;
|
|
200
|
+
private readonly maxPids: number;
|
|
201
|
+
private pids = new Map<number, PidState>();
|
|
202
|
+
/** Cumulative count of PIDs evicted by the cap. */
|
|
203
|
+
private _droppedPids = 0;
|
|
204
|
+
|
|
205
|
+
// ── W9 persistence state ────────────────────────────────────────────
|
|
206
|
+
/** Optional persistence backend. When null, store is in-memory only. */
|
|
207
|
+
private _persist: PersistAdapter | null = null;
|
|
208
|
+
/**
|
|
209
|
+
* Pids whose rows are dropped on next flush (eviction queue). Keyed by
|
|
210
|
+
* pid; value is `true` for "pid was evicted from memory; ask adapter to
|
|
211
|
+
* delete all rows". Distinct from dirtyChunks because the adapter call
|
|
212
|
+
* is dropPid, not persistChunks.
|
|
213
|
+
*/
|
|
214
|
+
private _dropQueue = new Set<number>();
|
|
215
|
+
/**
|
|
216
|
+
* Pids that need pruneBeforeSeq on next flush — keyed by pid → cutoff
|
|
217
|
+
* seq (delete all rows with seq < cutoff). Set whenever an in-memory
|
|
218
|
+
* `_evict` shifts the chunks array; the cutoff is the lowest seq that
|
|
219
|
+
* remains in memory.
|
|
220
|
+
*/
|
|
221
|
+
private _pruneQueue = new Map<number, number>();
|
|
222
|
+
/** Cumulative flushed-bytes counter (telemetry). */
|
|
223
|
+
private _flushedChunks = 0;
|
|
224
|
+
private _flushedBytes = 0;
|
|
225
|
+
private _flushCount = 0;
|
|
226
|
+
private _lastFlushAt = 0;
|
|
227
|
+
private _lastFlushDurationMs = 0;
|
|
228
|
+
/** Cumulative hydrate counters. */
|
|
229
|
+
private _hydratedPids = 0;
|
|
230
|
+
private _hydratedChunks = 0;
|
|
231
|
+
private _hydratedBytes = 0;
|
|
232
|
+
|
|
233
|
+
constructor(opts: ProcessLogStoreOptions = {}) {
|
|
234
|
+
this.perPidBytes = opts.perPidBytes ?? 64 * 1024;
|
|
235
|
+
this.maxChunkBytes = opts.maxChunkBytes ?? 4 * 1024;
|
|
236
|
+
this.retainAfterExitMs = opts.retainAfterExitMs ?? 10 * 60 * 1000;
|
|
237
|
+
this.maxPids = opts.maxPids ?? 500;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* W9: install a persistence adapter. Call once at NimbusSession init,
|
|
242
|
+
* after the SQL tables exist. Pre-existing in-memory state is NOT
|
|
243
|
+
* pushed to the adapter — only state mutated AFTER setPersist is
|
|
244
|
+
* subject to flush. This is fine in practice: NimbusSession sets the
|
|
245
|
+
* adapter in the constructor, before any append happens.
|
|
246
|
+
*/
|
|
247
|
+
setPersist(adapter: PersistAdapter): void {
|
|
248
|
+
this._persist = adapter;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// ── Instance-level broadcast hooks ──────────────────────────────────
|
|
252
|
+
/**
|
|
253
|
+
* Fire for EVERY appended chunk / recorded exit, across all pids, in
|
|
254
|
+
* addition to the per-pid `subscribe`/`subscribeExit` callbacks.
|
|
255
|
+
*
|
|
256
|
+
* This is the hibernation-safe fan-out seam for the process-terminal
|
|
257
|
+
* WebSockets: per-connection subscriptions are closures on ONE DO
|
|
258
|
+
* instance and silently vanish when the instance is reset or restarted
|
|
259
|
+
* (the accepted WebSocket itself survives via the hibernation API, so
|
|
260
|
+
* a surviving client would otherwise stream nothing forever). The DO
|
|
261
|
+
* wires one broadcast hook per instance that routes chunks to accepted
|
|
262
|
+
* sockets by their serialized attachment — state that survives resets.
|
|
263
|
+
*/
|
|
264
|
+
private _broadcastChunk: ((pid: number, chunk: LogChunk) => void) | null = null;
|
|
265
|
+
private _broadcastExit: ((pid: number, exit: ProcessExitInfo) => void) | null = null;
|
|
266
|
+
|
|
267
|
+
setBroadcast(
|
|
268
|
+
onChunk: (pid: number, chunk: LogChunk) => void,
|
|
269
|
+
onExit: (pid: number, exit: ProcessExitInfo) => void,
|
|
270
|
+
): void {
|
|
271
|
+
this._broadcastChunk = onChunk;
|
|
272
|
+
this._broadcastExit = onExit;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/** Is there ANY state for this pid (including exit-only)? */
|
|
276
|
+
has(pid: number): boolean {
|
|
277
|
+
if (this.pids.has(pid)) return true;
|
|
278
|
+
return this._maybeHydrateRead(pid) !== null;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/** Current buffered bytes for this PID (post-eviction). */
|
|
282
|
+
size(pid: number): number {
|
|
283
|
+
return this.pids.get(pid)?.bytes ?? 0;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
getExit(pid: number): ProcessExitInfo | null {
|
|
287
|
+
const s = this._maybeHydrateRead(pid);
|
|
288
|
+
return s?.exit ?? null;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* W9: read-side helper. If we have an adapter and the pid has any rows
|
|
293
|
+
* in SQL, lazy-create the in-memory state (which triggers hydrate).
|
|
294
|
+
* Returns the state or null. Performs at most one adapter `load` per
|
|
295
|
+
* pid per isolate-gen by routing through `_getOrCreate` → `_hydrate`,
|
|
296
|
+
* which is guarded by `state.hydrated`.
|
|
297
|
+
*/
|
|
298
|
+
private _maybeHydrateRead(pid: number): PidState | null {
|
|
299
|
+
let s = this.pids.get(pid) ?? null;
|
|
300
|
+
if (s) return s;
|
|
301
|
+
if (!this._persist) return null;
|
|
302
|
+
// _getOrCreate triggers _hydrate which calls load(). To avoid an
|
|
303
|
+
// extra load() just to decide whether to materialise, we always
|
|
304
|
+
// create and then check whether hydrate populated anything. If it
|
|
305
|
+
// didn't, drop the empty state to keep the maxPids cap clean.
|
|
306
|
+
s = this._getOrCreate(pid);
|
|
307
|
+
if (s.chunks.length === 0 && !s.exit) {
|
|
308
|
+
// Nothing came back from SQL — drop the empty state so we don't
|
|
309
|
+
// pin a cap slot for a pid that never existed.
|
|
310
|
+
this.pids.delete(pid);
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
return s;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Append a chunk. `data` may be huge or binary; we split / tag as
|
|
318
|
+
* needed. Notifies any `subscribe()`rs for this pid.
|
|
319
|
+
*/
|
|
320
|
+
append(pid: number, stream: LogStream, data: string): void {
|
|
321
|
+
if (!data) return;
|
|
322
|
+
const state = this._getOrCreate(pid);
|
|
323
|
+
|
|
324
|
+
// Binary detection on the raw incoming chunk (before splitting).
|
|
325
|
+
if (looksBinary(data)) {
|
|
326
|
+
const placeholder = `[${data.length} bytes of binary output]\n`;
|
|
327
|
+
const chunk: LogChunk = {
|
|
328
|
+
ts: Date.now(),
|
|
329
|
+
stream,
|
|
330
|
+
data: placeholder,
|
|
331
|
+
binary: true,
|
|
332
|
+
};
|
|
333
|
+
this._appendChunk(pid, state, chunk);
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Split oversize writes into multiple chunks.
|
|
338
|
+
let offset = 0;
|
|
339
|
+
while (offset < data.length) {
|
|
340
|
+
const slice = data.substring(offset, offset + this.maxChunkBytes);
|
|
341
|
+
const chunk: LogChunk = {
|
|
342
|
+
ts: Date.now(),
|
|
343
|
+
stream,
|
|
344
|
+
data: slice,
|
|
345
|
+
};
|
|
346
|
+
this._appendChunk(pid, state, chunk);
|
|
347
|
+
offset += slice.length;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/** W9: shared insert path — assigns a seq, marks dirty, evicts, fans out. */
|
|
352
|
+
private _appendChunk(pid: number, state: PidState, chunk: LogChunk): void {
|
|
353
|
+
const seq = state.nextSeq++;
|
|
354
|
+
state.chunks.push(chunk);
|
|
355
|
+
state.bytes += chunk.data.length;
|
|
356
|
+
state.lastActivity = chunk.ts;
|
|
357
|
+
if (this._persist) {
|
|
358
|
+
state.dirtyChunks.push({ seq, chunk });
|
|
359
|
+
}
|
|
360
|
+
this._evict(state, pid);
|
|
361
|
+
this._fanout(state, chunk);
|
|
362
|
+
if (this._broadcastChunk) {
|
|
363
|
+
try { this._broadcastChunk(pid, chunk); } catch { /* swallow broadcast errors */ }
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Return chunks with stable per-PID sequence numbers. `cursor` is an
|
|
369
|
+
* exclusive read position: pass the previous returned `cursor` to receive only
|
|
370
|
+
* newer chunks. If older chunks have been evicted, `truncated` is true
|
|
371
|
+
* and the response starts at the oldest retained chunk.
|
|
372
|
+
*/
|
|
373
|
+
read(
|
|
374
|
+
pid: number,
|
|
375
|
+
opts: ProcessLogReadOptions = {},
|
|
376
|
+
): { chunks: SequencedLogChunk[]; cursor: number; truncated: boolean } {
|
|
377
|
+
const state = this._maybeHydrateRead(pid);
|
|
378
|
+
if (!state) return { chunks: [], cursor: 0, truncated: false };
|
|
379
|
+
|
|
380
|
+
const firstSeq = state.nextSeq - state.chunks.length;
|
|
381
|
+
const cursor = Number.isFinite(opts.cursor) ? Number(opts.cursor) : null;
|
|
382
|
+
const start = cursor === null
|
|
383
|
+
? this._tailStartIndex(state, opts)
|
|
384
|
+
: Math.max(0, Math.floor(cursor) - firstSeq);
|
|
385
|
+
const truncated = cursor !== null && Math.floor(cursor) < firstSeq;
|
|
386
|
+
|
|
387
|
+
return {
|
|
388
|
+
chunks: state.chunks.slice(start).map((chunk, index) => ({
|
|
389
|
+
...chunk,
|
|
390
|
+
seq: firstSeq + start + index,
|
|
391
|
+
})),
|
|
392
|
+
cursor: state.nextSeq,
|
|
393
|
+
truncated,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/** Return the last N chunks (by line count) in chronological order. */
|
|
398
|
+
tail(pid: number, opts: Pick<ProcessLogReadOptions, 'lines' | 'bytes'> = {}): LogChunk[] {
|
|
399
|
+
const state = this._maybeHydrateRead(pid);
|
|
400
|
+
if (!state) return [];
|
|
401
|
+
if (opts.lines === undefined && opts.bytes === undefined) return [...state.chunks];
|
|
402
|
+
if (opts.lines === 0 || opts.bytes === 0) return [];
|
|
403
|
+
|
|
404
|
+
// Walk from newest → oldest, accumulate until we hit the limit.
|
|
405
|
+
const out: LogChunk[] = [];
|
|
406
|
+
let lines = 0;
|
|
407
|
+
let bytes = 0;
|
|
408
|
+
for (let i = state.chunks.length - 1; i >= 0; i--) {
|
|
409
|
+
const c = state.chunks[i];
|
|
410
|
+
out.unshift(c);
|
|
411
|
+
bytes += c.data.length;
|
|
412
|
+
if (opts.lines !== undefined) {
|
|
413
|
+
// Count \n in chunk + 1 if chunk doesn't end with \n but has content.
|
|
414
|
+
for (let j = 0; j < c.data.length; j++) if (c.data.charCodeAt(j) === 10) lines++;
|
|
415
|
+
if (lines >= opts.lines) break;
|
|
416
|
+
}
|
|
417
|
+
if (opts.bytes !== undefined && bytes >= opts.bytes) break;
|
|
418
|
+
}
|
|
419
|
+
return out;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
private _tailStartIndex(state: PidState, opts: Pick<ProcessLogReadOptions, 'lines' | 'bytes'>): number {
|
|
423
|
+
if (opts.lines === undefined && opts.bytes === undefined) return 0;
|
|
424
|
+
if (opts.lines === 0 || opts.bytes === 0) return state.chunks.length;
|
|
425
|
+
|
|
426
|
+
let lines = 0;
|
|
427
|
+
let bytes = 0;
|
|
428
|
+
for (let i = state.chunks.length - 1; i >= 0; i--) {
|
|
429
|
+
const chunk = state.chunks[i];
|
|
430
|
+
bytes += chunk.data.length;
|
|
431
|
+
if (opts.lines !== undefined) {
|
|
432
|
+
for (let j = 0; j < chunk.data.length; j++) {
|
|
433
|
+
if (chunk.data.charCodeAt(j) === 10) lines++;
|
|
434
|
+
}
|
|
435
|
+
if (lines >= opts.lines) return i;
|
|
436
|
+
}
|
|
437
|
+
if (opts.bytes !== undefined && bytes >= opts.bytes) return i;
|
|
438
|
+
}
|
|
439
|
+
return 0;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/** All chunks for a pid, chronological. */
|
|
443
|
+
all(pid: number): LogChunk[] {
|
|
444
|
+
const state = this._maybeHydrateRead(pid);
|
|
445
|
+
return state ? [...state.chunks] : [];
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* The chunks already buffered for a pid, without consulting the
|
|
450
|
+
* persistence adapter.
|
|
451
|
+
*
|
|
452
|
+
* For a pid whose whole life is inside the current request, a hydrate is a
|
|
453
|
+
* guaranteed miss — nothing has flushed it — and the miss is not free: the
|
|
454
|
+
* adapter's `load` bootstraps the W9 schema, so a session that never
|
|
455
|
+
* persists a process log still pays a durable DDL commit for the lookup.
|
|
456
|
+
* `all()` stays the right call for a pid that may predate this isolate.
|
|
457
|
+
*/
|
|
458
|
+
buffered(pid: number): LogChunk[] {
|
|
459
|
+
const state = this.pids.get(pid);
|
|
460
|
+
return state ? [...state.chunks] : [];
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/** Record exit. Idempotent: second call is ignored (preserves first). */
|
|
464
|
+
markExit(pid: number, code: number, reason?: string): void {
|
|
465
|
+
const state = this._getOrCreate(pid);
|
|
466
|
+
if (state.exit) return;
|
|
467
|
+
const info: ProcessExitInfo = { code, at: Date.now(), reason };
|
|
468
|
+
state.exit = info;
|
|
469
|
+
state.lastActivity = info.at;
|
|
470
|
+
if (this._persist) state.dirtyExit = true;
|
|
471
|
+
for (const cb of state.exitSubscribers) {
|
|
472
|
+
try { cb(info); } catch { /* swallow subscriber errors */ }
|
|
473
|
+
}
|
|
474
|
+
if (this._broadcastExit) {
|
|
475
|
+
try { this._broadcastExit(pid, info); } catch { /* swallow broadcast errors */ }
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* Subscribe to new chunks for this pid. Returns unsubscribe fn.
|
|
481
|
+
* Subscriber is called synchronously from within `append`.
|
|
482
|
+
* W9: also hydrates from SQL on first touch so a post-hibernate
|
|
483
|
+
* subscriber sees pre-hibernate context in the next backlog frame.
|
|
484
|
+
*/
|
|
485
|
+
subscribe(pid: number, cb: (c: LogChunk) => void): () => void {
|
|
486
|
+
const state = this._getOrCreate(pid);
|
|
487
|
+
state.subscribers.add(cb);
|
|
488
|
+
return () => { state.subscribers.delete(cb); };
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/** Subscribe to the exit event. Fires once. */
|
|
492
|
+
subscribeExit(pid: number, cb: (e: ProcessExitInfo) => void): () => void {
|
|
493
|
+
const state = this._getOrCreate(pid);
|
|
494
|
+
state.exitSubscribers.add(cb);
|
|
495
|
+
return () => { state.exitSubscribers.delete(cb); };
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Drop all state for any PID whose process exited more than `ageMs`
|
|
500
|
+
* ago. Returns the number of PIDs purged.
|
|
501
|
+
*
|
|
502
|
+
* Optional `isOrphan(pid)` callback identifies PIDs whose owning
|
|
503
|
+
* process vanished without a recorded exit (e.g., a long-running
|
|
504
|
+
* facet that hung and was GC'd). Such entries are dropped after a
|
|
505
|
+
* longer grace window so leaked buffers don't accumulate forever.
|
|
506
|
+
*/
|
|
507
|
+
dropOlderThan(
|
|
508
|
+
ageMs: number = this.retainAfterExitMs,
|
|
509
|
+
isOrphan?: (pid: number) => boolean,
|
|
510
|
+
): number {
|
|
511
|
+
const now = Date.now();
|
|
512
|
+
const cutoff = now - ageMs;
|
|
513
|
+
const orphanCutoff = now - ageMs * 3; // 30 min default for orphans
|
|
514
|
+
let dropped = 0;
|
|
515
|
+
for (const [pid, state] of this.pids) {
|
|
516
|
+
if (state.subscribers.size !== 0) continue;
|
|
517
|
+
if (state.exit && state.exit.at < cutoff) {
|
|
518
|
+
this.pids.delete(pid);
|
|
519
|
+
if (this._persist) this._dropQueue.add(pid);
|
|
520
|
+
dropped++;
|
|
521
|
+
continue;
|
|
522
|
+
}
|
|
523
|
+
// Orphan sweep: no exit recorded, no live subscribers, last
|
|
524
|
+
// activity older than the orphan cutoff, AND the process table
|
|
525
|
+
// confirms the process is gone.
|
|
526
|
+
if (
|
|
527
|
+
!state.exit &&
|
|
528
|
+
state.lastActivity < orphanCutoff &&
|
|
529
|
+
isOrphan?.(pid)
|
|
530
|
+
) {
|
|
531
|
+
this.pids.delete(pid);
|
|
532
|
+
if (this._persist) this._dropQueue.add(pid);
|
|
533
|
+
dropped++;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return dropped;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* W9: drain dirty buffers into the persist adapter. Synchronous from
|
|
541
|
+
* the store's POV (the adapter's calls are sync; the production
|
|
542
|
+
* adapter wraps them in `ctx.storage.transactionSync`). Idempotent —
|
|
543
|
+
* second call without new data is a no-op.
|
|
544
|
+
*
|
|
545
|
+
* Order of operations (matters for crash resilience):
|
|
546
|
+
* 1. dropPid for every pid in the drop queue (frees SQL space first).
|
|
547
|
+
* 2. pruneBeforeSeq for any pid with a queued cutoff.
|
|
548
|
+
* 3. persistChunks for every pid with dirty chunks.
|
|
549
|
+
* 4. persistExit for every pid with a dirty exit.
|
|
550
|
+
*
|
|
551
|
+
* Step 3 BEFORE step 4 is the key crash-resilience invariant: if the
|
|
552
|
+
* actor terminates between (3) and (4), the chunks are persisted but
|
|
553
|
+
* the exit is not — on next hydrate we'll see the chunks but no exit
|
|
554
|
+
* row, which is the same state we'd be in if the process were still
|
|
555
|
+
* running. The reverse (exit row but missing chunks) would surface a
|
|
556
|
+
* misleading "exited cleanly with no output" frame.
|
|
557
|
+
*/
|
|
558
|
+
flush(): void {
|
|
559
|
+
if (!this._persist) {
|
|
560
|
+
// No adapter — clear any dirty markers so the booleans stay sane.
|
|
561
|
+
this._dropQueue.clear();
|
|
562
|
+
this._pruneQueue.clear();
|
|
563
|
+
for (const state of this.pids.values()) {
|
|
564
|
+
state.dirtyChunks.length = 0;
|
|
565
|
+
state.dirtyExit = false;
|
|
566
|
+
}
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
const t0 = Date.now();
|
|
570
|
+
const adapter = this._persist;
|
|
571
|
+
|
|
572
|
+
// Step 1: drop evicted pids first — the SQL DELETE for them might
|
|
573
|
+
// free space the chunk INSERTs need under tight memory.
|
|
574
|
+
for (const pid of this._dropQueue) {
|
|
575
|
+
try { adapter.dropPid(pid); } catch { /* fail-soft */ }
|
|
576
|
+
}
|
|
577
|
+
this._dropQueue.clear();
|
|
578
|
+
|
|
579
|
+
// Step 2: prune over-capped chunks for still-resident pids.
|
|
580
|
+
for (const [pid, cutoff] of this._pruneQueue) {
|
|
581
|
+
try { adapter.pruneBeforeSeq(pid, cutoff); } catch { /* fail-soft */ }
|
|
582
|
+
}
|
|
583
|
+
this._pruneQueue.clear();
|
|
584
|
+
|
|
585
|
+
let chunkBytesFlushed = 0;
|
|
586
|
+
let chunksFlushedCount = 0;
|
|
587
|
+
|
|
588
|
+
// Step 3: persist new chunks (per-pid batch).
|
|
589
|
+
for (const [pid, state] of this.pids) {
|
|
590
|
+
if (state.dirtyChunks.length === 0) continue;
|
|
591
|
+
const rows = state.dirtyChunks;
|
|
592
|
+
try {
|
|
593
|
+
adapter.persistChunks(pid, rows);
|
|
594
|
+
for (const r of rows) {
|
|
595
|
+
chunkBytesFlushed += r.chunk.data.length;
|
|
596
|
+
if (r.seq > state.flushedHighSeq) state.flushedHighSeq = r.seq;
|
|
597
|
+
}
|
|
598
|
+
chunksFlushedCount += rows.length;
|
|
599
|
+
} catch { /* fail-soft — leave dirty for next flush */
|
|
600
|
+
continue;
|
|
601
|
+
}
|
|
602
|
+
state.dirtyChunks = [];
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
// Step 4: persist exits AFTER chunks (crash resilience).
|
|
606
|
+
for (const [pid, state] of this.pids) {
|
|
607
|
+
if (!state.dirtyExit || !state.exit) continue;
|
|
608
|
+
try {
|
|
609
|
+
adapter.persistExit(pid, state.exit);
|
|
610
|
+
state.dirtyExit = false;
|
|
611
|
+
} catch { /* fail-soft */ }
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
this._flushCount++;
|
|
615
|
+
this._lastFlushAt = t0;
|
|
616
|
+
this._lastFlushDurationMs = Date.now() - t0;
|
|
617
|
+
this._flushedChunks += chunksFlushedCount;
|
|
618
|
+
this._flushedBytes += chunkBytesFlushed;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* W9: counters for /api/_diag/memory hibernation telemetry. Cumulative
|
|
623
|
+
* since this isolate-gen started. Reset only when the store itself is
|
|
624
|
+
* reconstructed (i.e., on hibernation/wake).
|
|
625
|
+
*/
|
|
626
|
+
hibStats(): {
|
|
627
|
+
rehydratedPids: number;
|
|
628
|
+
rehydratedChunks: number;
|
|
629
|
+
rehydratedBytes: number;
|
|
630
|
+
flushedChunks: number;
|
|
631
|
+
flushedBytes: number;
|
|
632
|
+
flushCount: number;
|
|
633
|
+
lastFlushAt: number;
|
|
634
|
+
lastFlushDurationMs: number;
|
|
635
|
+
pendingDirtyPids: number;
|
|
636
|
+
pendingDropPids: number;
|
|
637
|
+
} {
|
|
638
|
+
let pendingDirtyPids = 0;
|
|
639
|
+
for (const state of this.pids.values()) {
|
|
640
|
+
if (state.dirtyChunks.length > 0 || state.dirtyExit) pendingDirtyPids++;
|
|
641
|
+
}
|
|
642
|
+
return {
|
|
643
|
+
rehydratedPids: this._hydratedPids,
|
|
644
|
+
rehydratedChunks: this._hydratedChunks,
|
|
645
|
+
rehydratedBytes: this._hydratedBytes,
|
|
646
|
+
flushedChunks: this._flushedChunks,
|
|
647
|
+
flushedBytes: this._flushedBytes,
|
|
648
|
+
flushCount: this._flushCount,
|
|
649
|
+
lastFlushAt: this._lastFlushAt,
|
|
650
|
+
lastFlushDurationMs: this._lastFlushDurationMs,
|
|
651
|
+
pendingDirtyPids,
|
|
652
|
+
pendingDropPids: this._dropQueue.size,
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
/** Introspection. Used by `ps -l` for LOGS column. */
|
|
657
|
+
snapshot(pid: number): { bytes: number; chunks: number; exit: ProcessExitInfo | null } | null {
|
|
658
|
+
const s = this._maybeHydrateRead(pid);
|
|
659
|
+
if (!s) return null;
|
|
660
|
+
return { bytes: s.bytes, chunks: s.chunks.length, exit: s.exit };
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// ── Private ──────────────────────────────────────────────────────────
|
|
664
|
+
|
|
665
|
+
private _getOrCreate(pid: number): PidState {
|
|
666
|
+
let s = this.pids.get(pid);
|
|
667
|
+
if (!s) {
|
|
668
|
+
// Enforce the global cap before inserting. A 1000-pid fork-bomb
|
|
669
|
+
// would otherwise pin ~50 MB of
|
|
670
|
+
// buffers for the full 10-min retention window, crowding the
|
|
671
|
+
// 128 MB DO isolate cap alongside npm install / git clone peaks.
|
|
672
|
+
if (this.pids.size >= this.maxPids) {
|
|
673
|
+
this._evictOnePid();
|
|
674
|
+
}
|
|
675
|
+
s = {
|
|
676
|
+
chunks: [],
|
|
677
|
+
bytes: 0,
|
|
678
|
+
exit: null,
|
|
679
|
+
lastActivity: Date.now(),
|
|
680
|
+
subscribers: new Set(),
|
|
681
|
+
exitSubscribers: new Set(),
|
|
682
|
+
nextSeq: 0,
|
|
683
|
+
dirtyChunks: [],
|
|
684
|
+
dirtyExit: false,
|
|
685
|
+
hydrated: false,
|
|
686
|
+
flushedHighSeq: -1,
|
|
687
|
+
};
|
|
688
|
+
this.pids.set(pid, s);
|
|
689
|
+
// W9: lazy hydrate the freshly-created state from persistent
|
|
690
|
+
// storage. If we have an adapter and rows exist for this pid
|
|
691
|
+
// (e.g., DO was hibernated and now woke), pull them into the
|
|
692
|
+
// ring before any caller can observe an empty ring.
|
|
693
|
+
this._hydrate(pid, s);
|
|
694
|
+
}
|
|
695
|
+
return s;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/**
|
|
699
|
+
* W9: pull rows from the persist adapter for this pid into the in-memory
|
|
700
|
+
* ring. Idempotent — guarded by `state.hydrated`. Bounded by
|
|
701
|
+
* `perPidBytes`: if SQL has more bytes than the in-memory cap, we keep
|
|
702
|
+
* only the newest rows that fit and queue a `pruneBeforeSeq` for the
|
|
703
|
+
* next flush so SQL converges.
|
|
704
|
+
*
|
|
705
|
+
* Called from `_getOrCreate` (covers append/tail/all/has/snapshot/
|
|
706
|
+
* subscribe — any first-touch read or write). Failures are swallowed:
|
|
707
|
+
* a broken adapter must not break the in-memory ring's correctness.
|
|
708
|
+
*/
|
|
709
|
+
private _hydrate(pid: number, state: PidState): void {
|
|
710
|
+
if (state.hydrated) return;
|
|
711
|
+
state.hydrated = true;
|
|
712
|
+
if (!this._persist) return;
|
|
713
|
+
let loaded: { chunks: LogChunk[]; exit: ProcessExitInfo | null } | null;
|
|
714
|
+
try {
|
|
715
|
+
loaded = this._persist.load(pid);
|
|
716
|
+
} catch {
|
|
717
|
+
return;
|
|
718
|
+
}
|
|
719
|
+
if (!loaded) return;
|
|
720
|
+
|
|
721
|
+
// Restore exit first so pid-existence checks are correct even if
|
|
722
|
+
// we drop chunks below.
|
|
723
|
+
if (loaded.exit) {
|
|
724
|
+
state.exit = loaded.exit;
|
|
725
|
+
state.lastActivity = loaded.exit.at;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
if (loaded.chunks.length === 0) return;
|
|
729
|
+
|
|
730
|
+
// Trim to perPidBytes from the newest end. Each persisted chunk has
|
|
731
|
+
// a `seq` (we appended it during `persistChunks`); fall back to
|
|
732
|
+
// index-based seq when a chunk lacks it (defensive).
|
|
733
|
+
const newest: LogChunk[] = [];
|
|
734
|
+
let bytes = 0;
|
|
735
|
+
let oldestKeptSeq = Number.POSITIVE_INFINITY;
|
|
736
|
+
let highestSeq = -1;
|
|
737
|
+
for (let i = loaded.chunks.length - 1; i >= 0; i--) {
|
|
738
|
+
const c = loaded.chunks[i];
|
|
739
|
+
const seq = (c as any).seq ?? i;
|
|
740
|
+
if (seq > highestSeq) highestSeq = seq;
|
|
741
|
+
const size = c.data.length;
|
|
742
|
+
if (bytes + size > this.perPidBytes && newest.length > 0) {
|
|
743
|
+
// Anything below this seq is overshoot — schedule a prune.
|
|
744
|
+
this._pruneQueue.set(pid, oldestKeptSeq);
|
|
745
|
+
break;
|
|
746
|
+
}
|
|
747
|
+
newest.unshift({ ts: c.ts, stream: c.stream, data: c.data, binary: c.binary });
|
|
748
|
+
bytes += size;
|
|
749
|
+
oldestKeptSeq = seq;
|
|
750
|
+
}
|
|
751
|
+
state.chunks = newest;
|
|
752
|
+
state.bytes = bytes;
|
|
753
|
+
state.nextSeq = highestSeq + 1;
|
|
754
|
+
state.flushedHighSeq = highestSeq;
|
|
755
|
+
if (loaded.chunks[loaded.chunks.length - 1]) {
|
|
756
|
+
state.lastActivity = Math.max(state.lastActivity, loaded.chunks[loaded.chunks.length - 1].ts);
|
|
757
|
+
}
|
|
758
|
+
this._hydratedPids++;
|
|
759
|
+
this._hydratedChunks += newest.length;
|
|
760
|
+
this._hydratedBytes += bytes;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
/**
|
|
764
|
+
* Evict one PID to make room when the map hits its global cap.
|
|
765
|
+
*
|
|
766
|
+
* Policy (in order of preference):
|
|
767
|
+
* 1. Oldest EXITED pid with zero subscribers — safe: nobody's
|
|
768
|
+
* reading, process is done, ring buffer is cold.
|
|
769
|
+
* 2. Oldest pid by `lastActivity` with zero subscribers — any
|
|
770
|
+
* state; covers the case where every exited pid has a live
|
|
771
|
+
* subscriber (log tab open).
|
|
772
|
+
* 3. Give up — an actively-subscribed long-running pid flood is
|
|
773
|
+
* degenerate; we'd rather let the map briefly exceed the cap
|
|
774
|
+
* than silently drop a subscribed stream.
|
|
775
|
+
*
|
|
776
|
+
* Map iteration order in JS is insertion order, so "oldest" here
|
|
777
|
+
* means "earliest inserted." That's a reasonable proxy for
|
|
778
|
+
* `lastActivity` for PIDs that haven't been written to recently.
|
|
779
|
+
* We still check `lastActivity` explicitly so active-write pids
|
|
780
|
+
* beat cold ones even if they were inserted earlier.
|
|
781
|
+
*/
|
|
782
|
+
private _evictOnePid(): void {
|
|
783
|
+
// Tier 1: oldest exited + no subscribers.
|
|
784
|
+
let bestPid: number | null = null;
|
|
785
|
+
let bestActivity = Infinity;
|
|
786
|
+
for (const [pid, state] of this.pids) {
|
|
787
|
+
if (state.exit && state.subscribers.size === 0 && state.exitSubscribers.size === 0) {
|
|
788
|
+
if (state.lastActivity < bestActivity) {
|
|
789
|
+
bestPid = pid;
|
|
790
|
+
bestActivity = state.lastActivity;
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
if (bestPid !== null) {
|
|
795
|
+
this.pids.delete(bestPid);
|
|
796
|
+
this._droppedPids++;
|
|
797
|
+
if (this._persist) this._dropQueue.add(bestPid);
|
|
798
|
+
return;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
// Tier 2: oldest by lastActivity with zero subscribers.
|
|
802
|
+
bestPid = null;
|
|
803
|
+
bestActivity = Infinity;
|
|
804
|
+
for (const [pid, state] of this.pids) {
|
|
805
|
+
if (state.subscribers.size === 0 && state.exitSubscribers.size === 0) {
|
|
806
|
+
if (state.lastActivity < bestActivity) {
|
|
807
|
+
bestPid = pid;
|
|
808
|
+
bestActivity = state.lastActivity;
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
if (bestPid !== null) {
|
|
813
|
+
this.pids.delete(bestPid);
|
|
814
|
+
this._droppedPids++;
|
|
815
|
+
if (this._persist) this._dropQueue.add(bestPid);
|
|
816
|
+
return;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
// Tier 3: every pid has a subscriber. Don't silently drop a
|
|
820
|
+
// subscribed stream — let the cap be briefly exceeded.
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
/** Diagnostics snapshot for /api/stats rollup. */
|
|
824
|
+
get stats() {
|
|
825
|
+
let running = 0;
|
|
826
|
+
let exited = 0;
|
|
827
|
+
let totalBytes = 0;
|
|
828
|
+
let subscribers = 0;
|
|
829
|
+
for (const state of this.pids.values()) {
|
|
830
|
+
if (state.exit) exited++;
|
|
831
|
+
else running++;
|
|
832
|
+
totalBytes += state.bytes;
|
|
833
|
+
subscribers += state.subscribers.size + state.exitSubscribers.size;
|
|
834
|
+
}
|
|
835
|
+
return {
|
|
836
|
+
totalPids: this.pids.size,
|
|
837
|
+
maxPids: this.maxPids,
|
|
838
|
+
runningPids: running,
|
|
839
|
+
exitedPids: exited,
|
|
840
|
+
totalBufferBytes: totalBytes,
|
|
841
|
+
subscribers,
|
|
842
|
+
droppedPids: this._droppedPids,
|
|
843
|
+
};
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
private _evict(state: PidState, pid?: number): void {
|
|
847
|
+
let droppedAny = false;
|
|
848
|
+
while (state.bytes > this.perPidBytes && state.chunks.length > 0) {
|
|
849
|
+
const dropped = state.chunks.shift()!;
|
|
850
|
+
state.bytes -= dropped.data.length;
|
|
851
|
+
droppedAny = true;
|
|
852
|
+
}
|
|
853
|
+
if (!droppedAny || pid === undefined || !this._persist) return;
|
|
854
|
+
|
|
855
|
+
// W9: cutoff = lowest in-memory seq. Any persisted seq below this is
|
|
856
|
+
// dead weight in SQL (and dead weight in the dirty queue if not yet
|
|
857
|
+
// flushed). Drop them from BOTH:
|
|
858
|
+
//
|
|
859
|
+
// 1. Queue a `pruneBeforeSeq(pid, cutoff)` so already-flushed rows
|
|
860
|
+
// below cutoff are deleted from SQL on next flush.
|
|
861
|
+
// 2. Drop entries from `dirtyChunks` whose seq is below cutoff —
|
|
862
|
+
// they were evicted from memory before they ever made it to SQL,
|
|
863
|
+
// no point persisting now.
|
|
864
|
+
//
|
|
865
|
+
// Without (2), a chatty process whose in-memory ring runs hot would
|
|
866
|
+
// still write every byte to SQL on the first flush, defeating the
|
|
867
|
+
// per-pid byte cap.
|
|
868
|
+
const cutoff = state.nextSeq - state.chunks.length;
|
|
869
|
+
const existing = this._pruneQueue.get(pid) ?? -1;
|
|
870
|
+
if (cutoff > existing) this._pruneQueue.set(pid, cutoff);
|
|
871
|
+
if (state.dirtyChunks.length > 0) {
|
|
872
|
+
state.dirtyChunks = state.dirtyChunks.filter((d) => d.seq >= cutoff);
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
private _fanout(state: PidState, chunk: LogChunk): void {
|
|
877
|
+
if (state.subscribers.size === 0) return;
|
|
878
|
+
for (const cb of state.subscribers) {
|
|
879
|
+
try { cb(chunk); } catch { /* swallow subscriber errors */ }
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
}
|