@nimbus-sh/worker 0.1.3 → 0.1.5

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.
@@ -41,6 +41,7 @@ export function makePythonRunnerFactory(deps) {
41
41
  const asmWasmVfs = findFile('share/pyodide/pyodide.asm.wasm');
42
42
  const asmJsVfs = findFile('share/pyodide/pyodide.asm.js');
43
43
  const stdlibVfs = findFile('share/pyodide/python_stdlib.zip');
44
+ let runtimePromise = null;
44
45
  return async function pythonBinHandler(ctx) {
45
46
  const argv = ctx.args || [];
46
47
  const cwd = ctx.cwd || '/home/user';
@@ -69,9 +70,6 @@ export function makePythonRunnerFactory(deps) {
69
70
  ctx.stderr.write(`${binName}: python_stdlib.zip missing\n`);
70
71
  return 127;
71
72
  }
72
- const asmWasmBytes = vfs.readFile(asmWasmVfs);
73
- const asmJsBytes = vfs.readFile(asmJsVfs);
74
- const stdlibBytes = vfs.readFile(stdlibVfs);
75
73
  // ── Parse argv ───────────────────────────────────────────────
76
74
  // Supported in v1:
77
75
  // python -c '<code>' run inline code, args[i+1..] in sys.argv
@@ -133,10 +131,24 @@ export function makePythonRunnerFactory(deps) {
133
131
  if (!userEnv.PYTHONUNBUFFERED)
134
132
  userEnv.PYTHONUNBUFFERED = '1';
135
133
  // ── Dispatch the facet ───────────────────────────────────────
136
- const result = await dispatchPythonFacet(facetMgr, {
137
- asmWasmBytes,
138
- asmJsBytes,
139
- stdlibBytes,
134
+ let runtime;
135
+ try {
136
+ if (!runtimePromise) {
137
+ runtimePromise = createPythonFacetRuntime(facetMgr, {
138
+ asmWasmVfs,
139
+ asmJsVfs,
140
+ stdlibVfs,
141
+ vfs,
142
+ });
143
+ }
144
+ runtime = await runtimePromise;
145
+ }
146
+ catch (e) {
147
+ runtimePromise = null;
148
+ ctx.stderr.write(`${binName}: python runtime warm-up failed: ${e?.message || e}\n`);
149
+ return 1;
150
+ }
151
+ const result = await dispatchPythonFacet(runtime, {
140
152
  userCode,
141
153
  pyArgv,
142
154
  userEnv,
@@ -234,70 +246,7 @@ function uint8ToBase64(u8) {
234
246
  }
235
247
  return btoa(s);
236
248
  }
237
- async function dispatchPythonFacet(facetMgr, args) {
238
- const toAB = (u8) => u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength);
239
- // pyodide.asm.js is INLINED into the preamble (1 MiB text source).
240
- // Workerd's CSP allows wasm code-gen AND JS top-level evaluation at
241
- // module-load time, but BLOCKS `new Function(src)` at request time.
242
- // The asm.js source declares `var _createPyodideModule = ...` at
243
- // module-top; spliced into the preamble it becomes a module-scope
244
- // binding we expose via `globalThis._createPyodideModule = ...`
245
- // right after.
246
- //
247
- // stdlib.zip stays in the context (base64) — it's data not code,
248
- // and the context blob is evaluated at module-load too.
249
- let asmJsSrc = new TextDecoder('utf-8').decode(args.asmJsBytes);
250
- // ── Source-patch the asm.js's "Cannot determine runtime environment" branch ──
251
- //
252
- // Even with our globalThis.process / WorkerGlobalScope / self / location
253
- // shims in place, the asm.js's pyodide_js_init() IIFE's env-detect (via
254
- // bn → vn) somehow lands d.IN_BROWSER_WEB_WORKER = false at request time
255
- // on workerd. Our supervisor-side mirror of the same logic returns
256
- // IN_BROWSER_WEB_WORKER = true with the same shims; the discrepancy
257
- // remains unidentified after P8-P17 of diagnostic instrumentation.
258
- //
259
- // Pragmatic v1 fix: source-patch the if-chain to ALWAYS take the
260
- // IN_BROWSER_WEB_WORKER branch (regardless of `d`). The branch's body
261
- // assigns `Fe` to a globalThis.importScripts-based loadScript helper.
262
- // We don't actually call Fe (Pyodide only invokes loadScript when
263
- // dynamic-loading a wasm sibling; our instantiateWasm override pre-
264
- // empts that). So the patch is functionally a no-op other than making
265
- // the throw unreachable.
266
- //
267
- // The patch target string is a literal in the minified asm.js — stable
268
- // across rebuilds because it's a unique identifier path.
269
- const PATCH_NEEDLE = 'else throw new Error("Cannot determine runtime environment")';
270
- const PATCH_REPLACE = '/* nimbus-patch: was: ' + PATCH_NEEDLE + ' */';
271
- if (asmJsSrc.includes(PATCH_NEEDLE)) {
272
- asmJsSrc = asmJsSrc.replace(PATCH_NEEDLE, PATCH_REPLACE);
273
- }
274
- // Also patch the if-chain head so we ALWAYS set Fe (force-take the
275
- // first branch — IN_BROWSER_MAIN_THREAD's loadScript path uses
276
- // `await import(t)` which works in workerd at module-load time).
277
- // The previous patch alone is insufficient because if NO branch matches,
278
- // Fe stays undefined → calling it would TypeError later.
279
- const HEAD_NEEDLE = 'if(d.IN_BROWSER_MAIN_THREAD)';
280
- const HEAD_REPLACE = 'if(true||d.IN_BROWSER_MAIN_THREAD)';
281
- if (asmJsSrc.includes(HEAD_NEEDLE)) {
282
- asmJsSrc = asmJsSrc.replace(HEAD_NEEDLE, HEAD_REPLACE);
283
- }
284
- const stdlibB64 = uint8ToBase64(args.stdlibBytes);
285
- // Build the preamble with stdlib bytes spliced in. The preamble runs
286
- // the entire Pyodide bootstrap at child-facet module-init time —
287
- // where workerd's CSP permits `new WebAssembly.Module(rawBytes)` (the
288
- // convertJsFunctionToWasm code path which is the v1 hang root).
289
- // Per-call __pyodideRun just executes runPython on the cached
290
- // Pyodide instance.
291
- const preamble = buildPyodidePreamble(asmJsSrc, stdlibB64);
292
- const { NimbusLoaderPool } = await import('../loaders/loader-pool.js');
293
- const env = facetMgr.env;
294
- const ctx = facetMgr.ctx;
295
- const pool = new NimbusLoaderPool(env, ctx, {
296
- tag: 'python-runner',
297
- concurrency: 1,
298
- omitSupervisor: true,
299
- preamble,
300
- });
249
+ async function dispatchPythonFacet(runtime, args) {
301
250
  // v2 simplification: stdlibB64 and asmWasmMod are now embedded in the
302
251
  // preamble (stdlib via base64 splice; wasm via __NIMBUS_WASM table set
303
252
  // by the loader-pool). The facet fn only needs the per-call inputs.
@@ -315,15 +264,12 @@ async function dispatchPythonFacet(facetMgr, args) {
315
264
  });
316
265
  };
317
266
  try {
318
- const result = await pool.submit(facetFn, {
267
+ const result = await runtime.pool.submit(facetFn, {
319
268
  userCode: args.userCode,
320
269
  pyArgv: args.pyArgv,
321
270
  userEnv: args.userEnv,
322
271
  progName: args.progName,
323
272
  }, {
324
- wasmModules: {
325
- 'pyodide.asm.wasm': toAB(args.asmWasmBytes),
326
- },
327
273
  timeoutMs: 300_000,
328
274
  });
329
275
  return {
@@ -342,6 +288,40 @@ async function dispatchPythonFacet(facetMgr, args) {
342
288
  };
343
289
  }
344
290
  }
291
+ async function createPythonFacetRuntime(facetMgr, args) {
292
+ const toAB = (u8) => u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength);
293
+ if (!args.asmWasmVfs || !args.asmJsVfs || !args.stdlibVfs) {
294
+ throw new Error('installed Pyodide manifest is missing required files');
295
+ }
296
+ const asmWasmBytes = args.vfs.readFile(args.asmWasmVfs);
297
+ const asmJsBytes = args.vfs.readFile(args.asmJsVfs);
298
+ const stdlibBytes = args.vfs.readFile(args.stdlibVfs);
299
+ let asmJsSrc = new TextDecoder('utf-8').decode(asmJsBytes);
300
+ const PATCH_NEEDLE = 'else throw new Error("Cannot determine runtime environment")';
301
+ const PATCH_REPLACE = '/* nimbus-patch: was: ' + PATCH_NEEDLE + ' */';
302
+ if (asmJsSrc.includes(PATCH_NEEDLE)) {
303
+ asmJsSrc = asmJsSrc.replace(PATCH_NEEDLE, PATCH_REPLACE);
304
+ }
305
+ const HEAD_NEEDLE = 'if(d.IN_BROWSER_MAIN_THREAD)';
306
+ const HEAD_REPLACE = 'if(true||d.IN_BROWSER_MAIN_THREAD)';
307
+ if (asmJsSrc.includes(HEAD_NEEDLE)) {
308
+ asmJsSrc = asmJsSrc.replace(HEAD_NEEDLE, HEAD_REPLACE);
309
+ }
310
+ const preamble = buildPyodidePreamble(asmJsSrc, uint8ToBase64(stdlibBytes));
311
+ const { NimbusLoaderPool } = await import('../loaders/loader-pool.js');
312
+ const env = facetMgr.env;
313
+ const ctx = facetMgr.ctx;
314
+ const pool = new NimbusLoaderPool(env, ctx, {
315
+ tag: 'python-runner',
316
+ concurrency: 1,
317
+ omitSupervisor: true,
318
+ preamble,
319
+ wasmModules: {
320
+ 'pyodide.asm.wasm': toAB(asmWasmBytes),
321
+ },
322
+ });
323
+ return { pool };
324
+ }
345
325
  /**
346
326
  * Compose the per-call preamble by splicing the pyodide.asm.js source
347
327
  * verbatim ahead of the __pyodideRun helper. Workerd compiles this
@@ -805,15 +785,34 @@ globalThis.__pyodideRun = async function __pyodideRun(args) {
805
785
  // overwrite sys.argv at request time via a tiny runPython prelude.
806
786
  // pyArgv is the user-visible argv (script name first, then args);
807
787
  // progName is the executable that prefixes errors.
788
+ const argv = [args.progName].concat((args.pyArgv || []).slice(0));
789
+ // If pyArgv already includes the script as [0], use it directly.
790
+ // Convention from the python-runner caller: pyArgv = [progName,
791
+ // ...args]. We set sys.argv = pyArgv with [0] = progName.
792
+ const effectiveArgv = (args.pyArgv && args.pyArgv.length > 0) ? args.pyArgv : argv;
793
+
794
+ let userGlobals = null;
795
+ try {
796
+ const dictCtor = pyodide.globals?.get?.('dict');
797
+ userGlobals = typeof dictCtor === 'function' ? dictCtor() : null;
798
+ if (userGlobals && typeof userGlobals.set === 'function') {
799
+ userGlobals.set('__name__', '__main__');
800
+ userGlobals.set('__package__', null);
801
+ const argv0 = effectiveArgv[0];
802
+ if (argv0 && argv0 !== '-c' && argv0 !== '-') {
803
+ userGlobals.set('__file__', argv0);
804
+ }
805
+ }
806
+ try { dictCtor?.destroy?.(); } catch {}
807
+ } catch {
808
+ userGlobals = null;
809
+ }
810
+
808
811
  try {
809
- const argv = [args.progName].concat((args.pyArgv || []).slice(0));
810
- // If pyArgv already includes the script as [0], use it directly.
811
- // Convention from the python-runner caller: pyArgv = [progName,
812
- // ...args]. We set sys.argv = pyArgv with [0] = progName.
813
- const effectiveArgv = (args.pyArgv && args.pyArgv.length > 0) ? args.pyArgv : argv;
814
812
  pyodide.runPython(
815
813
  'import sys\\nsys.argv = ' +
816
- JSON.stringify(effectiveArgv)
814
+ JSON.stringify(effectiveArgv),
815
+ userGlobals ? { globals: userGlobals } : undefined
817
816
  );
818
817
  } catch { /* best-effort */ }
819
818
 
@@ -824,7 +823,10 @@ globalThis.__pyodideRun = async function __pyodideRun(args) {
824
823
  let exitCode = 0;
825
824
  if (args.userCode) {
826
825
  try {
827
- pyodide.runPython(args.userCode);
826
+ pyodide.runPython(
827
+ args.userCode,
828
+ userGlobals ? { globals: userGlobals } : undefined
829
+ );
828
830
  // If runPython returned normally, exit code is 0 unless onExit
829
831
  // was invoked (which can happen if user called sys.exit but
830
832
  // Pyodide handled it via ExitStatus before throwing).
@@ -856,6 +858,8 @@ globalThis.__pyodideRun = async function __pyodideRun(args) {
856
858
  }
857
859
  }
858
860
 
861
+ try { userGlobals?.destroy?.(); } catch {}
862
+
859
863
  return {
860
864
  exitCode: exitCode,
861
865
  stdout: globalThis.__nimbusPyStdout.slice(stdoutStart).join(''),
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/session/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AA8DH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;;;;;;;GAQG;AACH,KAAK,QAAQ,GAAG,eAAe,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;CAAE,CAAC;AAG3E,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CA+7G/D"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/session/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AA+DH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;;;;;;;GAQG;AACH,KAAK,QAAQ,GAAG,eAAe,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;CAAE,CAAC;AAG3E,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAu+G/D"}
@@ -42,7 +42,7 @@ import { filterWranglerFlags, detectBundlerBin, checkNodeModulesGuard, detectUns
42
42
  import { HeredocHandler, LineEditorExtender, FdRedirectNormalizer, SubshellNormalizer, BraceExpander, DollarVarShim, BacktickNormalizer } from '../shell/features.js';
43
43
  import { registerUnixCommands } from '../shell/unix-commands.js';
44
44
  import { registerGitCommands } from '../git/commands.js';
45
- import { makeNimbusVerbHandler, rehydrateInstalledRuntimes, registerRunnerFactory, } from '../runtime/package-manager.js';
45
+ import { makeNimbusVerbHandler, createRuntimeCommandHintResolver, rehydrateInstalledRuntimes, registerRunnerFactory, } from '../runtime/package-manager.js';
46
46
  import { makeClangRunnerFactory } from '../runtime/clang-runner.js';
47
47
  import { makePythonRunnerFactory } from '../runtime/python-runner.js';
48
48
  import { makeRubyRunnerFactory } from '../runtime/ruby-runner.js';
@@ -531,6 +531,35 @@ export function initSession(self, ws) {
531
531
  vfs: sqliteFs,
532
532
  registry: pkgRegistry,
533
533
  getHome: nimbusGetHome,
534
+ warmRuntime: async (target, ctx) => {
535
+ if (target.name !== 'python')
536
+ return;
537
+ ctx.stdout.write('[python] warming runtime...\n');
538
+ const stdout = { write(_s) { } };
539
+ const stderrText = [];
540
+ const stderr = { write: (s) => { stderrText.push(String(s)); } };
541
+ const py = await registry.resolve('python');
542
+ if (py) {
543
+ const code = await py({
544
+ ...ctx,
545
+ args: ['-c', 'pass'],
546
+ vfs: ctx.vfs ?? sqliteFs,
547
+ signal: new AbortController().signal,
548
+ stdout,
549
+ stderr,
550
+ });
551
+ if (typeof code === 'number' && code !== 0) {
552
+ throw new Error(stderrText.join('').trim() || `python warm-up exited ${code}`);
553
+ }
554
+ }
555
+ const { warmPythonRepl } = await import('../runtime/python-repl.js');
556
+ await warmPythonRepl({
557
+ facetMgr,
558
+ vfs: sqliteFs,
559
+ installRoot: target.root,
560
+ });
561
+ ctx.stdout.write('[python] ready\n');
562
+ },
534
563
  }));
535
564
  // Rehydration runs here even though the shell hasn't been built
536
565
  // yet — that's fine: it accesses VFS + registry which are both
@@ -2466,6 +2495,7 @@ export function initSession(self, ws) {
2466
2495
  return false;
2467
2496
  }
2468
2497
  const upstreamResolve = registry.resolve.bind(registry);
2498
+ const runtimeCommandHint = createRuntimeCommandHintResolver(self.env);
2469
2499
  registry.resolve = async function nimbusBinFallbackResolve(name) {
2470
2500
  const upstream = await upstreamResolve(name);
2471
2501
  if (upstream)
@@ -2483,8 +2513,24 @@ export function initSession(self, ws) {
2483
2513
  // built yet (very early init), fall back to /home/user.
2484
2514
  const cwd = (self.shell?.cwd || '/home/user').replace(/^\/+/, '');
2485
2515
  const binShimPath = cwd + '/node_modules/.bin/' + name;
2486
- if (!sqliteFs.exists(binShimPath))
2487
- return undefined;
2516
+ if (!sqliteFs.exists(binShimPath)) {
2517
+ let hint = null;
2518
+ try {
2519
+ hint = await runtimeCommandHint(name);
2520
+ }
2521
+ catch {
2522
+ hint = null;
2523
+ }
2524
+ if (!hint)
2525
+ return undefined;
2526
+ const hintHandler = async (ctx) => {
2527
+ ctx.stderr.write(`${name}: command not found\n`);
2528
+ ctx.stderr.write(`hint: install it with: nimbus install ${hint.installSpec}\n`);
2529
+ return 127;
2530
+ };
2531
+ hintHandler.__nimbusRuntimeInstallHint = true;
2532
+ return hintHandler;
2533
+ }
2488
2534
  // Synthesised handler. Each resolve call recomputes (cwd can
2489
2535
  // change between invocations); we never cache under `name`.
2490
2536
  return async (ctx) => {
@@ -41,6 +41,7 @@ export { detectCloudflareWorkersProject } from '../runtime/project-detect.js';
41
41
  * the right boundary. See user-debug-transcript.txt lines 1-5.
42
42
  */
43
43
  export declare function renderMotdBanner(version: string): string;
44
+ export declare function renderWelcomeMarkdown(version: string): string;
44
45
  export declare class NimbusSession extends CloudflareDurableObject {
45
46
  sqliteFs: SqliteVFS | null;
46
47
  kernel: Kernel | null;
@@ -1 +1 @@
1
- {"version":3,"file":"nimbus-session.d.ts","sourceRoot":"","sources":["../../src/session/nimbus-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nimbus-session.d.ts","sourceRoot":"","sources":["../../src/session/nimbus-session.ts"],"names":[],"mappings":"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"}
@@ -119,6 +119,53 @@ export function renderMotdBanner(version) {
119
119
  bot +
120
120
  '\x1b[0m\r\n');
121
121
  }
122
+ export function renderWelcomeMarkdown(version) {
123
+ return `# Welcome to Nimbus v${version}
124
+
125
+ Cloud-native development environment on Cloudflare Workers.
126
+
127
+ ## Start Here
128
+
129
+ | Task | Command |
130
+ | --- | --- |
131
+ | Run JavaScript | \`node hello.js\` |
132
+ | Install npm packages | \`npm install <pkg>\` |
133
+ | Start the starter app | \`cd app && npm install && npm run dev\` |
134
+ | Run a Cloudflare Worker locally | \`nimbus-wrangler dev\` |
135
+
136
+ ## Install More Runtimes
137
+
138
+ Nimbus installs language runtimes on demand:
139
+
140
+ \`\`\`bash
141
+ nimbus install clang # then: clang hello.c -o hello && ./hello
142
+ nimbus install python # then: python -c 'print("hi")'
143
+ nimbus install ruby # then: ruby -e 'puts "hi"'
144
+ \`\`\`
145
+
146
+ \`python3\`, \`ruby3\`, and \`wasm-ld\` are command aliases. If an
147
+ installable command is missing, Nimbus prints the matching install command.
148
+
149
+ ## Interactive REPLs
150
+
151
+ | Runtime | REPL |
152
+ | --- | --- |
153
+ | Python | \`python\` or \`python3\` - Pyodide CPython 3.13 |
154
+ | Ruby | \`ruby\` or \`ruby3\` - ruby.wasm 3.3 |
155
+ | Node | \`node\` - workerd Node compatibility runtime |
156
+
157
+ ## System Commands
158
+
159
+ \`\`\`bash
160
+ nimbus install --list # show installed runtimes
161
+ nimbus install --available # show catalog
162
+ df # filesystem + cache stats
163
+ \`\`\`
164
+
165
+ The editor opens this file in Markdown preview mode by default. Use
166
+ \`Ctrl+P\` to open files and \`Ctrl+S\` to save edits.
167
+ `;
168
+ }
122
169
  export class NimbusSession extends CloudflareDurableObject {
123
170
  // this.ctx and this.env are provided by the DurableObject base class
124
171
  sqliteFs = null;
@@ -1020,29 +1067,8 @@ export class NimbusSession extends CloudflareDurableObject {
1020
1067
  ' return 0;\n' +
1021
1068
  '}\n');
1022
1069
  }
1023
- if (!fs.exists('home/user/welcome.txt')) {
1024
- fs.writeFile('home/user/welcome.txt', `Welcome to Nimbus v${NIMBUS_VERSION}!\n\n` +
1025
- 'Cloud-native dev environment on Cloudflare Workers.\n\n' +
1026
- 'JavaScript / TypeScript:\n' +
1027
- ' node hello.js — run in isolated dynamic worker\n' +
1028
- ' npm install <pkg> — install npm packages\n' +
1029
- ' vite — start dev server with HMR\n' +
1030
- ' nimbus-wrangler dev — run Cloudflare Worker locally\n' +
1031
- '\n' +
1032
- 'More languages (install on demand):\n' +
1033
- " nimbus install clang — then: clang hello.c -o hello && ./hello\n" +
1034
- " nimbus install python — then: python -c 'print(\"hi\")'\n" +
1035
- " nimbus install ruby — then: ruby -e 'puts \"hi\"'\n" +
1036
- '\n' +
1037
- 'Interactive REPLs (after install):\n' +
1038
- ' python — Pyodide CPython 3.13\n' +
1039
- ' ruby — ruby.wasm 3.3\n' +
1040
- ' node — bare REPL\n' +
1041
- '\n' +
1042
- 'System:\n' +
1043
- ' nimbus install --list — show installed runtimes\n' +
1044
- ' nimbus install --available — show catalog\n' +
1045
- ' df — filesystem + cache stats\n');
1070
+ if (!fs.exists('home/user/welcome.md')) {
1071
+ fs.writeFile('home/user/welcome.md', renderWelcomeMarkdown(NIMBUS_VERSION));
1046
1072
  }
1047
1073
  // ── Starter app (Vite + React + TS + Tailwind + Router) ──
1048
1074
  // Idempotent: guarded by shouldSeedProject() which checks both a
@@ -1 +1 @@
1
- {"version":3,"file":"unix-commands.d.ts","sourceRoot":"","sources":["../../src/shell/unix-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AA88FtD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,GAAG,EACb,GAAG,EAAE,SAAS,GACb,IAAI,CAoLN"}
1
+ {"version":3,"file":"unix-commands.d.ts","sourceRoot":"","sources":["../../src/shell/unix-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AA09FtD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,GAAG,EACb,GAAG,EAAE,SAAS,GACb,IAAI,CAoLN"}
@@ -24,6 +24,9 @@ function getSymlinkRegistry(vfs) {
24
24
  }
25
25
  return v.__nimbus_symlink_registry;
26
26
  }
27
+ function isRuntimeInstallHintHandler(handler) {
28
+ return !!handler && !!handler.__nimbusRuntimeInstallHint;
29
+ }
27
30
  // ── Helpers ─────────────────────────────────────────────────────────────
28
31
  function resolvePath(cwd, p) {
29
32
  if (p.startsWith('/'))
@@ -134,12 +137,7 @@ const _CANONICAL_BIN_PATHS = {
134
137
  // Self
135
138
  nimbus: '/usr/local/bin/nimbus',
136
139
  };
137
- /** Resolve a command name to a path via PATH-walk + canonical-bin
138
- * fallback. Returns null if not findable. Skip-canonical when the
139
- * caller knows the command is a shell builtin (no fallback). */
140
- function _whichLookup(vfs, name, envPath) {
141
- // 1. Real on-disk binary in $PATH (npm-installed node_modules/.bin,
142
- // user-placed scripts, etc.).
140
+ function _pathLookup(vfs, name, envPath) {
143
141
  const paths = (envPath || '/usr/local/bin:/usr/bin:/bin').split(':');
144
142
  for (const dir of paths) {
145
143
  if (!dir)
@@ -150,12 +148,33 @@ function _whichLookup(vfs, name, envPath) {
150
148
  return '/' + fp;
151
149
  }
152
150
  }
153
- // 2. Canonical-bin fallback for our facet-direct runtimes.
154
- if (_CANONICAL_BIN_PATHS[name]) {
155
- return _CANONICAL_BIN_PATHS[name];
151
+ return null;
152
+ }
153
+ async function _registryResolved(registry, name) {
154
+ try {
155
+ const resolved = typeof registry.resolve === 'function'
156
+ ? await registry.resolve(name)
157
+ : null;
158
+ if (resolved && !isRuntimeInstallHintHandler(resolved))
159
+ return resolved;
160
+ }
161
+ catch {
162
+ // Registry misses are normal for unknown commands.
156
163
  }
157
164
  return null;
158
165
  }
166
+ /** Resolve a command name to a path via PATH-walk + canonical-bin
167
+ * fallback. Returns null if not findable. Skip-canonical when the
168
+ * caller knows the command is a shell builtin (no fallback). */
169
+ async function _whichLookup(vfs, registry, name, envPath) {
170
+ const diskPath = _pathLookup(vfs, name, envPath);
171
+ if (diskPath)
172
+ return diskPath;
173
+ const canonicalPath = _CANONICAL_BIN_PATHS[name];
174
+ if (!canonicalPath)
175
+ return null;
176
+ return await _registryResolved(registry, name) ? canonicalPath : null;
177
+ }
159
178
  function mkWhich(vfs, registry) {
160
179
  return async (ctx) => {
161
180
  // Parse flags. Supports -a (show all matches), -s (silent — no
@@ -191,16 +210,10 @@ function mkWhich(vfs, registry) {
191
210
  let anyMissing = false;
192
211
  for (const name of names) {
193
212
  // Classify: is it a registry-resolvable command (shell builtin)?
194
- let isBuiltin = false;
195
- try {
196
- const resolved = typeof registry.resolve === 'function'
197
- ? await registry.resolve(name)
198
- : null;
199
- isBuiltin = !!resolved;
200
- }
201
- catch { /* registry unavailable; treat as not-builtin */ }
213
+ const resolved = await _registryResolved(registry, name);
214
+ const isBuiltin = !!resolved;
202
215
  // 1. PATH-walk + canonical-bin lookup.
203
- const path = _whichLookup(vfs, name, ctx.env.PATH || '');
216
+ const path = await _whichLookup(vfs, registry, name, ctx.env.PATH || '');
204
217
  let found = false;
205
218
  if (path) {
206
219
  if (!silent)
@@ -235,15 +248,15 @@ function mkWhich(vfs, registry) {
235
248
  * binaries on the virtual VFS; print just the binary path. With no
236
249
  * match, print just the name (matches `whereis` behavior on missing).
237
250
  */
238
- function mkWhereis(vfs) {
239
- return (ctx) => {
251
+ function mkWhereis(vfs, registry) {
252
+ return async (ctx) => {
240
253
  const names = ctx.args.filter(a => !a.startsWith('-'));
241
254
  if (names.length === 0) {
242
255
  ctx.stderr.write('Usage: whereis name [name ...]\n');
243
256
  return 1;
244
257
  }
245
258
  for (const name of names) {
246
- const path = _whichLookup(vfs, name, ctx.env.PATH || '');
259
+ const path = await _whichLookup(vfs, registry, name, ctx.env.PATH || '');
247
260
  if (path) {
248
261
  ctx.stdout.write(`${name}: ${path}\n`);
249
262
  }
@@ -290,36 +303,28 @@ function mkCommand(vfs, registry) {
290
303
  if (mode === '-v') {
291
304
  // Print path or builtin marker; exit 0 if found.
292
305
  const name = args[0];
293
- const path = _whichLookup(vfs, name, ctx.env.PATH || '');
306
+ const path = await _whichLookup(vfs, registry, name, ctx.env.PATH || '');
294
307
  if (path) {
295
308
  ctx.stdout.write(path + '\n');
296
309
  return 0;
297
310
  }
298
- try {
299
- const resolved = await registry.resolve(name);
300
- if (resolved) {
301
- ctx.stdout.write(name + '\n');
302
- return 0;
303
- }
311
+ if (await _registryResolved(registry, name)) {
312
+ ctx.stdout.write(name + '\n');
313
+ return 0;
304
314
  }
305
- catch { /* registry miss */ }
306
315
  return 1;
307
316
  }
308
317
  if (mode === '-V') {
309
318
  const name = args[0];
310
- const path = _whichLookup(vfs, name, ctx.env.PATH || '');
319
+ const path = await _whichLookup(vfs, registry, name, ctx.env.PATH || '');
311
320
  if (path) {
312
321
  ctx.stdout.write(`${name} is ${path}\n`);
313
322
  return 0;
314
323
  }
315
- try {
316
- const resolved = await registry.resolve(name);
317
- if (resolved) {
318
- ctx.stdout.write(`${name} is a shell builtin\n`);
319
- return 0;
320
- }
324
+ if (await _registryResolved(registry, name)) {
325
+ ctx.stdout.write(`${name} is a shell builtin\n`);
326
+ return 0;
321
327
  }
322
- catch { /* miss */ }
323
328
  ctx.stderr.write(`command: ${name}: not found\n`);
324
329
  return 1;
325
330
  }
@@ -368,7 +373,7 @@ function mkType(_vfs, registry) {
368
373
  for (const name of ctx.args) {
369
374
  try {
370
375
  const resolved = typeof registry.resolve === 'function' ? await registry.resolve(name) : null;
371
- if (resolved) {
376
+ if (resolved && !isRuntimeInstallHintHandler(resolved)) {
372
377
  ctx.stdout.write(`${name} is a shell builtin\n`);
373
378
  }
374
379
  else {
@@ -3517,7 +3522,7 @@ function wrap(fn) {
3517
3522
  }
3518
3523
  export function registerUnixCommands(registry, vfs) {
3519
3524
  registry.register('which', wrap(mkWhich(vfs, registry)));
3520
- registry.register('whereis', wrap(mkWhereis(vfs)));
3525
+ registry.register('whereis', wrap(mkWhereis(vfs, registry)));
3521
3526
  registry.register('command', wrap(mkCommand(vfs, registry)));
3522
3527
  registry.register('type', wrap(mkType(vfs, registry)));
3523
3528
  registry.register('env', wrap(mkEnv()));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nimbus-sh/worker",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Nimbus runtime package for Cloudflare Workers, re-exported publicly through @nimbus-sh/sdk/worker.",
5
5
  "keywords": [
6
6
  "cloudflare",