@nimbus-sh/worker 0.7.0 → 0.9.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.
Files changed (102) hide show
  1. package/dist/facets/compose.d.ts +3 -0
  2. package/dist/facets/compose.d.ts.map +1 -1
  3. package/dist/facets/compose.js +1 -1
  4. package/dist/facets/manager.d.ts +26 -15
  5. package/dist/facets/manager.d.ts.map +1 -1
  6. package/dist/facets/manager.js +154 -112
  7. package/dist/facets/real-vite-hmr.d.ts +3 -1
  8. package/dist/facets/real-vite-hmr.d.ts.map +1 -1
  9. package/dist/facets/real-vite-hmr.js +18 -8
  10. package/dist/facets/ws-terminal.d.ts +9 -31
  11. package/dist/facets/ws-terminal.d.ts.map +1 -1
  12. package/dist/facets/ws-terminal.js +58 -51
  13. package/dist/hosted/commands.d.ts +12 -0
  14. package/dist/hosted/commands.d.ts.map +1 -0
  15. package/dist/hosted/commands.js +1647 -0
  16. package/dist/hosted/runtime.d.ts +135 -0
  17. package/dist/hosted/runtime.d.ts.map +1 -0
  18. package/dist/hosted/runtime.js +344 -0
  19. package/dist/hosted/services.d.ts +44 -0
  20. package/dist/hosted/services.d.ts.map +1 -0
  21. package/dist/hosted/services.js +522 -0
  22. package/dist/loaders/generated-workers.d.ts +1 -1
  23. package/dist/loaders/generated-workers.d.ts.map +1 -1
  24. package/dist/loaders/generated-workers.js +2 -2
  25. package/dist/node-shims-artifact.generated.js +3 -3
  26. package/dist/runtime/bash-repl.d.ts +6 -4
  27. package/dist/runtime/bash-repl.d.ts.map +1 -1
  28. package/dist/runtime/bash-repl.js +46 -7
  29. package/dist/runtime/bun-runner.js +1 -1
  30. package/dist/runtime/facet-loader-host.d.ts.map +1 -1
  31. package/dist/runtime/facet-loader-host.js +1 -3
  32. package/dist/runtime/node-runner.d.ts +1 -1
  33. package/dist/runtime/node-runner.d.ts.map +1 -1
  34. package/dist/runtime/node-runner.js +2 -2
  35. package/dist/runtime/node-shims.d.ts.map +1 -1
  36. package/dist/runtime/node-shims.js +14 -1
  37. package/dist/runtime/opencode-facet-runner.js +14 -14
  38. package/dist/runtime/package-manager.d.ts +35 -122
  39. package/dist/runtime/package-manager.d.ts.map +1 -1
  40. package/dist/runtime/package-manager.js +61 -596
  41. package/dist/runtime/process-logs-api.d.ts +1 -1
  42. package/dist/runtime/process-logs-api.d.ts.map +1 -1
  43. package/dist/runtime/process-logs-api.js +1 -1
  44. package/dist/runtime/python-repl.d.ts +6 -4
  45. package/dist/runtime/python-repl.d.ts.map +1 -1
  46. package/dist/runtime/python-repl.js +92 -67
  47. package/dist/runtime/repl-session.d.ts +9 -47
  48. package/dist/runtime/repl-session.d.ts.map +1 -1
  49. package/dist/runtime/repl-session.js +105 -105
  50. package/dist/runtime/ruby-repl.d.ts +3 -2
  51. package/dist/runtime/ruby-repl.d.ts.map +1 -1
  52. package/dist/runtime/ruby-repl.js +7 -6
  53. package/dist/runtime/runtime-catalog.d.ts +13 -0
  54. package/dist/runtime/runtime-catalog.d.ts.map +1 -1
  55. package/dist/runtime/runtime-catalog.js +88 -0
  56. package/dist/runtime/wasi/preamble.d.ts.map +1 -1
  57. package/dist/runtime/wasi/preamble.js +74 -56
  58. package/dist/runtime-catalog.generated.js +1 -1
  59. package/dist/session/agent.d.ts +1 -21
  60. package/dist/session/agent.d.ts.map +1 -1
  61. package/dist/session/ai.d.ts +5 -1
  62. package/dist/session/ai.d.ts.map +1 -1
  63. package/dist/session/ai.js +7 -0
  64. package/dist/session/hibernation.d.ts +2 -1
  65. package/dist/session/hibernation.d.ts.map +1 -1
  66. package/dist/session/hibernation.js +7 -4
  67. package/dist/session/init.d.ts +1 -36
  68. package/dist/session/init.d.ts.map +1 -1
  69. package/dist/session/init.js +18 -1773
  70. package/dist/session/loopback.d.ts +2 -29
  71. package/dist/session/loopback.d.ts.map +1 -1
  72. package/dist/session/loopback.js +3 -27
  73. package/dist/session/nimbus-session.d.ts +28 -34
  74. package/dist/session/nimbus-session.d.ts.map +1 -1
  75. package/dist/session/nimbus-session.js +78 -518
  76. package/dist/session/npm-install-port.d.ts +3 -1
  77. package/dist/session/npm-install-port.d.ts.map +1 -1
  78. package/dist/session/port-capability.d.ts.map +1 -1
  79. package/dist/session/port-capability.js +11 -1
  80. package/dist/session/programmatic.d.ts +5 -38
  81. package/dist/session/programmatic.d.ts.map +1 -1
  82. package/dist/session/programmatic.js +17 -49
  83. package/dist/session/rpc.d.ts +3 -43
  84. package/dist/session/rpc.d.ts.map +1 -1
  85. package/dist/session/rpc.js +8 -67
  86. package/dist/session/supervisor-op.d.ts +10 -5
  87. package/dist/session/supervisor-op.d.ts.map +1 -1
  88. package/dist/session/supervisor-op.js +21 -48
  89. package/dist/session/supervisor-rpc.d.ts +33 -16
  90. package/dist/session/supervisor-rpc.d.ts.map +1 -1
  91. package/dist/session/supervisor-rpc.js +49 -4
  92. package/dist/vfs/facet-resident-store.d.ts.map +1 -1
  93. package/dist/vfs/facet-resident-store.js +4 -2
  94. package/dist/workspace-host.d.ts +7 -0
  95. package/dist/workspace-host.d.ts.map +1 -0
  96. package/dist/workspace-host.js +5 -0
  97. package/dist/workspace.d.ts +2 -0
  98. package/dist/workspace.d.ts.map +1 -0
  99. package/dist/workspace.js +1 -0
  100. package/package.json +17 -12
  101. package/public/_assets/runtime/{node-shims-8f8c64edd2a1f0f5.js → node-shims-acaa037e6d26ec0d.js} +14 -1
  102. package/scripts/bundle-runtime.mjs +35 -8
@@ -108,7 +108,9 @@ export declare function registerHmrBridge(doId: string, holder: {
108
108
  * doId — the supervisor DO's id, used to find the right stub +
109
109
  * HmrBridge.
110
110
  */
111
- export declare class CirrusHmrRPC extends WorkerEntrypoint {
111
+ export declare class CirrusHmrRPC extends WorkerEntrypoint<object, {
112
+ doId?: string;
113
+ }> {
112
114
  private _bridge;
113
115
  private _stub;
114
116
  hmrSend(clientId: string | null, msg: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"real-vite-hmr.d.ts","sourceRoot":"","sources":["../../src/facets/real-vite-hmr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AASH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AActD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,SAAS;IACpB,2BAA2B;IAC3B,OAAO,CAAC,OAAO,CAAgC;IAC/C,kDAAkD;IAClD,OAAO,CAAC,OAAO,CAAiH;IAChI,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAA0C;IAC1D,oEAAoE;IAC7D,kBAAkB,UAAS;IAClC,OAAO,CAAC,OAAO,CAAK;IAEpB,wEAAwE;IACxE,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM;IAOnC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK9B,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAInD,6EAA6E;IAC7E,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAapD;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAIjE,OAAO,CAAC,IAAI;IAWZ;;;;OAIG;IACG,UAAU,CAAC,SAAS,GAAE,MAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAkB5D,2BAA2B;IAC3B,IAAI,IAAI,IAAI,MAAM,CAA8B;IAEhD,uDAAuD;IACvD,QAAQ,IAAI,IAAI;CAYjB;AAUD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;IAAE,GAAG,EAAE,SAAS,CAAA;CAAE,GAAG,IAAI,CAEhF;AAKD;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAa,SAAQ,gBAAgB;IAChD,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,KAAK;IAOP,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5D,YAAY,CAAC,SAAS,GAAE,MAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAO/D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CA2HjD;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CA0EvD"}
1
+ {"version":3,"file":"real-vite-hmr.d.ts","sourceRoot":"","sources":["../../src/facets/real-vite-hmr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AASH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAetD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,SAAS;IACpB,2BAA2B;IAC3B,OAAO,CAAC,OAAO,CAAgC;IAC/C,kDAAkD;IAClD,OAAO,CAAC,OAAO,CAAiH;IAChI,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAA0C;IAC1D,oEAAoE;IAC7D,kBAAkB,UAAS;IAClC,OAAO,CAAC,OAAO,CAAK;IAEpB,wEAAwE;IACxE,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM;IAOnC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK9B,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAInD,6EAA6E;IAC7E,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAapD;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAIjE,OAAO,CAAC,IAAI;IAWZ;;;;OAIG;IACG,UAAU,CAAC,SAAS,GAAE,MAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAkB5D,2BAA2B;IAC3B,IAAI,IAAI,IAAI,MAAM,CAA8B;IAEhD,uDAAuD;IACvD,QAAQ,IAAI,IAAI;CAYjB;AAUD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;IAAE,GAAG,EAAE,SAAS,CAAA;CAAE,GAAG,IAAI,CAEhF;AAKD;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAa,SAAQ,gBAAgB,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;IAC3E,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,KAAK;IAcP,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB5D,YAAY,CAAC,SAAS,GAAE,MAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAO/D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CA2HjD;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CA0EvD"}
@@ -42,6 +42,7 @@
42
42
  // All are emitted by the generators below.
43
43
  import { WorkerEntrypoint } from 'cloudflare:workers';
44
44
  import { disposeRpcResource, useRpcResource } from '@nimbus-sh/platform/rpc-dispose.js';
45
+ import { hostOpDispatch, hostNamespaceBinding } from '@nimbus-sh/fabric/host-dispatch.js';
45
46
  // CLN-3 (2026-05-11): supervisor-side debug gate. Mirrors the facet-side
46
47
  // `globalThis.__cirrusDebug` flag declared at cirrus-real.ts:160. When
47
48
  // `false` (default), the hot-path console.log calls in `HmrBridge`
@@ -230,23 +231,32 @@ export class CirrusHmrRPC extends WorkerEntrypoint {
230
231
  const doId = this.ctx.props?.doId;
231
232
  if (!doId)
232
233
  return null;
233
- const id = this.env.NIMBUS_SESSION.idFromString(doId);
234
- return this.env.NIMBUS_SESSION.get(id);
234
+ let stub = null;
235
+ try {
236
+ const binding = hostNamespaceBinding(this.env, 'CirrusHmrRPC');
237
+ stub = binding.get(binding.idFromString(doId));
238
+ return { stub, dispatch: hostOpDispatch(stub, 'CirrusHmrRPC') };
239
+ }
240
+ catch (error) {
241
+ disposeRpcResource(stub);
242
+ throw error;
243
+ }
235
244
  }
236
245
  async hmrSend(clientId, msg) {
237
- const stub = this._stub();
238
- if (!stub)
246
+ const resolved = this._stub();
247
+ if (!resolved)
239
248
  return;
240
- // Call the DO's own RPC method, which runs in the DO's context
241
- // and can legally call ws.send() on hibernatable sockets.
249
+ // The host's supervisorOp routes hmrRelay to its own RPC — running in
250
+ // the DO's context, it can legally call ws.send() on hibernatable
251
+ // sockets.
242
252
  try {
243
- await useRpcResource(stub._rpcHmrRelay(clientId, msg), () => undefined);
253
+ await useRpcResource(resolved.dispatch({ op: 'hmrRelay', args: [clientId, msg] }), () => undefined);
244
254
  }
245
255
  catch {
246
256
  /* socket gone */
247
257
  }
248
258
  finally {
249
- disposeRpcResource(stub);
259
+ disposeRpcResource(resolved.stub);
250
260
  }
251
261
  }
252
262
  async hmrNextEvent(timeoutMs = 25_000) {
@@ -1,28 +1,7 @@
1
- /**
2
- * WebSocket-backed terminal matching Nimbus's ITerminal interface.
3
- * HeadlessTerminal has: write, writeln, onData, sendData, cols, rows, focus, clear
4
- *
5
- * [B'.5] The `ws` ref is no longer readonly: a wsClose leaves the
6
- * Shell + this terminal alive in-memory; the next /ws upgrade calls
7
- * `attach(newWs, ...)` to swap in the new socket. The buffer/flush
8
- * timer state is preserved across the swap so any in-flight
9
- * coalescing continues seamlessly.
10
- */
11
1
  export declare class WebSocketTerminal {
12
- ws: WebSocket;
2
+ /** Null while the terminal is headless (composed before any attach). */
3
+ ws: WebSocket | null;
13
4
  private dataCallback;
14
- /**
15
- * REPL-W1: secondary input callback installed by interactive runtimes
16
- * (e.g. `python` no-args). When non-null, sendData() routes input to
17
- * this callback INSTEAD of the shell. Set via attachRepl(); cleared
18
- * by the disposer the attach call returns. Supports nesting (the
19
- * disposer restores the prior callback).
20
- *
21
- * §3 (Layer 2): the explicit handoff mirrors how `vim`/`less` swap
22
- * the parent shell's terminal handler. Auto-detect was rejected as
23
- * fragile. Additive only — when null, behavior is identical to pre-W1.
24
- */
25
- private replCallback;
26
5
  /**
27
6
  * editor/monaco (2026-05-13): Editor-pane file-system bridge.
28
7
  *
@@ -46,7 +25,7 @@ export declare class WebSocketTerminal {
46
25
  * into nimbus_terminal_scrollback. Single-frame granularity (not
47
26
  * per-write) keeps the row count bounded by the 5 ms flush cadence. */
48
27
  private onFlush;
49
- constructor(ws: WebSocket, onFlush?: (data: string) => void);
28
+ constructor(ws?: WebSocket | null, onFlush?: (data: string) => void);
50
29
  /**
51
30
  * [B'.5] Swap the underlying WebSocket on a warm rejoin. The Shell
52
31
  * keeps `terminal` as a stable instance reference (it stored
@@ -56,6 +35,11 @@ export declare class WebSocketTerminal {
56
35
  * self.ctx, but TypeScript-wise it's a fresh function value).
57
36
  */
58
37
  attach(ws: WebSocket, onFlush?: (data: string) => void): void;
38
+ /** Release the socket without ending the terminal's lifetime. */
39
+ detach(): void;
40
+ private replBinding;
41
+ private replTeardown;
42
+ disposeRepl(): Promise<void>;
59
43
  close(): void;
60
44
  get cols(): number;
61
45
  get rows(): number;
@@ -94,13 +78,7 @@ export declare class WebSocketTerminal {
94
78
  */
95
79
  onFs(cb: (msg: any, reply: (frame: any) => void) => void): void;
96
80
  sendData(data: string): void;
97
- /**
98
- * REPL-W1: install a runtime-side input handler. Returns a disposer
99
- * that restores the prior handler (supports nesting). Calling this
100
- * does NOT change the shell's dataCallback — it just shadows it
101
- * until the disposer runs.
102
- */
103
- attachRepl(cb: (data: string) => void): () => void;
81
+ attachRepl(input: (data: string) => void, dispose?: () => Promise<void>): () => void;
104
82
  focus(): void;
105
83
  clear(): void;
106
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ws-terminal.d.ts","sourceRoot":"","sources":["../../src/facets/ws-terminal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IACrB,EAAE,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,YAAY,CAAyC;IAC7D;;;;;;;;;;OAUG;IACH,OAAO,CAAC,YAAY,CAAyC;IAC7D;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,UAAU,CAAkE;IACpF,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAA8C;IAChE;;;4EAGwE;IACxE,OAAO,CAAC,OAAO,CAAkC;gBAErC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;IAK3D;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAK7D,KAAK,IAAI,IAAI;IAab,IAAI,IAAI,IAAI,MAAM,CAAuB;IACzC,IAAI,IAAI,IAAI,MAAM,CAAuB;IAEzC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAE3B;;;;;;;;;;OAUG;IACH,QAAQ,IAAI,IAAI;IAQhB,OAAO,CAAC,KAAK;IAeb,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAE9C,aAAa,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IA+C3J;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,IAAI;IAI/D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO5B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAWlD,KAAK,IAAI,IAAI;IACb,KAAK,IAAI,IAAI;CACd"}
1
+ {"version":3,"file":"ws-terminal.d.ts","sourceRoot":"","sources":["../../src/facets/ws-terminal.ts"],"names":[],"mappings":"AAQA,qBAAa,iBAAiB;IAC5B,wEAAwE;IACjE,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,YAAY,CAAyC;IAE7D;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,UAAU,CAAkE;IACpF,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAA8C;IAChE;;;4EAGwE;IACxE,OAAO,CAAC,OAAO,CAAkC;gBAErC,EAAE,GAAE,SAAS,GAAG,IAAW,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;IAKzE;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAK7D,iEAAiE;IACjE,MAAM,IAAI,IAAI;IAGd,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,YAAY,CAA8B;IAClD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB5B,KAAK,IAAI,IAAI;IAYb,IAAI,IAAI,IAAI,MAAM,CAAuB;IACzC,IAAI,IAAI,IAAI,MAAM,CAAuB;IAEzC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAE3B;;;;;;;;;;OAUG;IACH,QAAQ,IAAI,IAAI;IAQhB,OAAO,CAAC,KAAK;IAeb,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAE9C,aAAa,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IA+C3J;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,IAAI;IAG/D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI5B,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI;IAepF,KAAK,IAAI,IAAI;IACb,KAAK,IAAI,IAAI;CACd"}
@@ -1,28 +1,7 @@
1
- /**
2
- * WebSocket-backed terminal matching Nimbus's ITerminal interface.
3
- * HeadlessTerminal has: write, writeln, onData, sendData, cols, rows, focus, clear
4
- *
5
- * [B'.5] The `ws` ref is no longer readonly: a wsClose leaves the
6
- * Shell + this terminal alive in-memory; the next /ws upgrade calls
7
- * `attach(newWs, ...)` to swap in the new socket. The buffer/flush
8
- * timer state is preserved across the swap so any in-flight
9
- * coalescing continues seamlessly.
10
- */
11
1
  export class WebSocketTerminal {
2
+ /** Null while the terminal is headless (composed before any attach). */
12
3
  ws;
13
4
  dataCallback = null;
14
- /**
15
- * REPL-W1: secondary input callback installed by interactive runtimes
16
- * (e.g. `python` no-args). When non-null, sendData() routes input to
17
- * this callback INSTEAD of the shell. Set via attachRepl(); cleared
18
- * by the disposer the attach call returns. Supports nesting (the
19
- * disposer restores the prior callback).
20
- *
21
- * §3 (Layer 2): the explicit handoff mirrors how `vim`/`less` swap
22
- * the parent shell's terminal handler. Auto-detect was rejected as
23
- * fragile. Additive only — when null, behavior is identical to pre-W1.
24
- */
25
- replCallback = null;
26
5
  /**
27
6
  * editor/monaco (2026-05-13): Editor-pane file-system bridge.
28
7
  *
@@ -46,7 +25,7 @@ export class WebSocketTerminal {
46
25
  * into nimbus_terminal_scrollback. Single-frame granularity (not
47
26
  * per-write) keeps the row count bounded by the 5 ms flush cadence. */
48
27
  onFlush;
49
- constructor(ws, onFlush) {
28
+ constructor(ws = null, onFlush) {
50
29
  this.ws = ws;
51
30
  this.onFlush = onFlush ?? null;
52
31
  }
@@ -63,20 +42,51 @@ export class WebSocketTerminal {
63
42
  if (onFlush !== undefined)
64
43
  this.onFlush = onFlush;
65
44
  }
45
+ /** Release the socket without ending the terminal's lifetime. */
46
+ detach() {
47
+ this.ws = null;
48
+ }
49
+ replBinding = null;
50
+ replTeardown = null;
51
+ disposeRepl() {
52
+ if (this.replTeardown)
53
+ return this.replTeardown;
54
+ const first = this.replBinding;
55
+ if (!first)
56
+ return Promise.resolve();
57
+ this.replBinding = null;
58
+ this.replTeardown = Promise.resolve().then(async () => {
59
+ const errors = [];
60
+ let binding = first;
61
+ while (binding) {
62
+ const next = binding.previous;
63
+ try {
64
+ await binding.dispose?.();
65
+ }
66
+ catch (error) {
67
+ errors.push(error instanceof Error ? error : new Error(String(error)));
68
+ }
69
+ binding = next;
70
+ }
71
+ if (errors.length > 0)
72
+ throw new AggregateError(errors, 'REPL cleanup failed');
73
+ }).finally(() => { this.replTeardown = null; });
74
+ return this.replTeardown;
75
+ }
66
76
  close() {
67
- if (this.flushTimer) {
77
+ void this.disposeRepl().catch((error) => console.warn('[terminal] REPL cleanup failed', error));
78
+ if (this.flushTimer)
68
79
  clearTimeout(this.flushTimer);
69
- this.flushTimer = null;
70
- }
80
+ this.flushTimer = null;
71
81
  this.buffer = [];
72
82
  this.onFlush = null;
73
83
  this.dataCallback = null;
74
- this.replCallback = null;
75
84
  this.fsCallback = null;
76
85
  try {
77
- this.ws.close(1000, 'terminal closed');
86
+ this.ws?.close(1000, 'terminal closed');
78
87
  }
79
88
  catch { }
89
+ this.ws = null;
80
90
  }
81
91
  get cols() { return this._cols; }
82
92
  get rows() { return this._rows; }
@@ -112,7 +122,7 @@ export class WebSocketTerminal {
112
122
  const combined = this.buffer.join('');
113
123
  this.buffer = [];
114
124
  try {
115
- this.ws.send(JSON.stringify({ type: 'output', data: combined }));
125
+ this.ws?.send(JSON.stringify({ type: 'output', data: combined }));
116
126
  }
117
127
  catch { }
118
128
  // [B'.3] Tee to scrollback. Runs AFTER the WS send so a thrown
@@ -161,7 +171,7 @@ export class WebSocketTerminal {
161
171
  const merged = (reqId !== undefined && frame && typeof frame === 'object')
162
172
  ? { ...frame, reqId }
163
173
  : frame;
164
- this.ws.send(JSON.stringify(merged));
174
+ this.ws?.send(JSON.stringify(merged));
165
175
  }
166
176
  catch { }
167
177
  };
@@ -191,29 +201,26 @@ export class WebSocketTerminal {
191
201
  this.fsCallback = cb;
192
202
  }
193
203
  sendData(data) {
194
- // REPL-W1: replCallback takes priority when set. Restored by the
195
- // disposer attachRepl() returns.
196
- if (this.replCallback) {
197
- this.replCallback(data);
198
- return;
199
- }
200
- if (this.dataCallback)
201
- this.dataCallback(data);
204
+ if (this.replBinding)
205
+ this.replBinding.input(data);
206
+ else
207
+ this.dataCallback?.(data);
202
208
  }
203
- /**
204
- * REPL-W1: install a runtime-side input handler. Returns a disposer
205
- * that restores the prior handler (supports nesting). Calling this
206
- * does NOT change the shell's dataCallback — it just shadows it
207
- * until the disposer runs.
208
- */
209
- attachRepl(cb) {
210
- const prior = this.replCallback;
211
- this.replCallback = cb;
209
+ attachRepl(input, dispose) {
210
+ if (this.replTeardown)
211
+ throw new Error('Cannot attach a REPL while cleanup is running');
212
+ const binding = { input, dispose, previous: this.replBinding };
213
+ this.replBinding = binding;
212
214
  return () => {
213
- // Idempotent: only restore if we're still the current shadow.
214
- // If a nested attachRepl ran in between, the disposer chain
215
- // resolves bottom-up correctly.
216
- this.replCallback = prior;
215
+ if (this.replBinding === binding) {
216
+ this.replBinding = binding.previous;
217
+ return;
218
+ }
219
+ let current = this.replBinding;
220
+ while (current && current.previous !== binding)
221
+ current = current.previous;
222
+ if (current)
223
+ current.previous = binding.previous;
217
224
  };
218
225
  }
219
226
  focus() { }
@@ -0,0 +1,12 @@
1
+ import { NimbusWorkspace } from '@nimbus-sh/core/workspace';
2
+ import type { SessionInternal } from '../session/internal.js';
3
+ import type { RuntimeCatalogEnv } from '../runtime/runtime-catalog.js';
4
+ /** Internal runtime services; callers use composeHostedRuntime, not this recipe. */
5
+ export type RuntimeCommandHost = Pick<SessionInternal, '_emitShellExecDone' | '_setCpRegistry' | '_viteShimPid' | '_viteShimPort' | 'cirrusReal' | 'ensureFacetManager' | 'ensureNpmInstaller' | 'ensureSqliteFs' | 'esbuildService' | 'nimbusWrangler' | 'npmInstaller' | 'portRegistry' | 'processes' | 'sessionBasePath' | 'terminal' | 'viteBasePath' | 'viteDevServer' | 'wranglerAliasBannerShown'> & {
6
+ readonly ctx: DurableObjectState;
7
+ readonly env: RuntimeCatalogEnv;
8
+ routeLoopback: SessionInternal['routeLoopback'];
9
+ ensureGlobalPrefixDirs: SessionInternal['ensureGlobalPrefixDirs'];
10
+ };
11
+ export declare function registerHostedCommands(self: RuntimeCommandHost, workspace: NimbusWorkspace): Promise<void>;
12
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/hosted/commands.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAuB5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,oFAAoF;AACpF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,EACnD,oBAAoB,GAAG,gBAAgB,GAAG,cAAc,GAAG,eAAe,GAAG,YAAY,GAAG,oBAAoB,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,cAAc,GAAG,cAAc,GAAG,WAAW,GAAG,iBAAiB,GAAG,UAAU,GAAG,cAAc,GAAG,eAAe,GAAG,0BAA0B,CAClV,GAAG;IACF,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;IAChC,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IAChD,sBAAsB,EAAE,eAAe,CAAC,wBAAwB,CAAC,CAAC;CACnE,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA6qDhH"}