@nimbus-sh/worker 0.1.5 → 0.1.6

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 (135) hide show
  1. package/README.md +37 -0
  2. package/dist/_shared/crypto.d.ts +15 -0
  3. package/dist/_shared/crypto.d.ts.map +1 -0
  4. package/dist/_shared/crypto.js +122 -0
  5. package/dist/facets/manager.d.ts +24 -0
  6. package/dist/facets/manager.d.ts.map +1 -1
  7. package/dist/facets/manager.js +279 -70
  8. package/dist/facets/process.d.ts +11 -2
  9. package/dist/facets/process.d.ts.map +1 -1
  10. package/dist/facets/process.js +187 -21
  11. package/dist/facets/vite-dev-server.d.ts +2 -0
  12. package/dist/facets/vite-dev-server.d.ts.map +1 -1
  13. package/dist/facets/vite-dev-server.js +39 -12
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -0
  17. package/dist/loaders/child-process/spawn-facet.d.ts +1 -3
  18. package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -1
  19. package/dist/loaders/child-process/spawn-facet.js +1 -12
  20. package/dist/loaders/child-process/spawn-pool.d.ts +1 -1
  21. package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -1
  22. package/dist/loaders/child-process/spawn-pool.js +1 -6
  23. package/dist/npm/installer.d.ts.map +1 -1
  24. package/dist/npm/installer.js +47 -27
  25. package/dist/npm/pre-bundle-facet.d.ts.map +1 -1
  26. package/dist/npm/pre-bundle-facet.js +2 -1
  27. package/dist/npm/resolve-one-facet.d.ts.map +1 -1
  28. package/dist/npm/resolve-one-facet.js +41 -13
  29. package/dist/npm/resolver.d.ts.map +1 -1
  30. package/dist/npm/resolver.js +70 -35
  31. package/dist/router/index.d.ts.map +1 -1
  32. package/dist/router/index.js +45 -21
  33. package/dist/router/remote-api.d.ts.map +1 -1
  34. package/dist/router/remote-api.js +29 -8
  35. package/dist/runtime/barrel-synthesizer.d.ts +7 -0
  36. package/dist/runtime/barrel-synthesizer.d.ts.map +1 -1
  37. package/dist/runtime/barrel-synthesizer.js +11 -0
  38. package/dist/runtime/clang-runner.d.ts.map +1 -1
  39. package/dist/runtime/clang-runner.js +1 -8
  40. package/dist/runtime/esbuild-service.d.ts +12 -5
  41. package/dist/runtime/esbuild-service.d.ts.map +1 -1
  42. package/dist/runtime/esbuild-service.js +28 -14
  43. package/dist/runtime/node-runner.d.ts +2 -0
  44. package/dist/runtime/node-runner.d.ts.map +1 -1
  45. package/dist/runtime/node-shims.d.ts +4 -2
  46. package/dist/runtime/node-shims.d.ts.map +1 -1
  47. package/dist/runtime/node-shims.js +404 -55
  48. package/dist/runtime/os-contracts.d.ts +128 -0
  49. package/dist/runtime/os-contracts.d.ts.map +1 -0
  50. package/dist/runtime/os-contracts.js +1 -0
  51. package/dist/runtime/package-manager.d.ts.map +1 -1
  52. package/dist/runtime/package-manager.js +32 -7
  53. package/dist/runtime/port-registry.d.ts +5 -0
  54. package/dist/runtime/port-registry.d.ts.map +1 -1
  55. package/dist/runtime/port-registry.js +22 -1
  56. package/dist/runtime/pyodide-runtime-assets.d.ts +19 -0
  57. package/dist/runtime/pyodide-runtime-assets.d.ts.map +1 -0
  58. package/dist/runtime/pyodide-runtime-assets.js +44 -0
  59. package/dist/runtime/python-repl.d.ts +3 -1
  60. package/dist/runtime/python-repl.d.ts.map +1 -1
  61. package/dist/runtime/python-repl.js +11 -29
  62. package/dist/runtime/python-runner.d.ts +8 -9
  63. package/dist/runtime/python-runner.d.ts.map +1 -1
  64. package/dist/runtime/python-runner.js +897 -61
  65. package/dist/runtime/python-socket-shim.d.ts +11 -0
  66. package/dist/runtime/python-socket-shim.d.ts.map +1 -0
  67. package/dist/runtime/python-socket-shim.js +526 -0
  68. package/dist/runtime/require-resolver.d.ts.map +1 -1
  69. package/dist/runtime/require-resolver.js +2 -11
  70. package/dist/runtime/ruby-gems.d.ts +25 -0
  71. package/dist/runtime/ruby-gems.d.ts.map +1 -0
  72. package/dist/runtime/ruby-gems.js +582 -0
  73. package/dist/runtime/ruby-runner.d.ts +2 -4
  74. package/dist/runtime/ruby-runner.d.ts.map +1 -1
  75. package/dist/runtime/ruby-runner.js +335 -34
  76. package/dist/runtime/runtime-catalog.d.ts +16 -4
  77. package/dist/runtime/runtime-catalog.d.ts.map +1 -1
  78. package/dist/runtime/runtime-catalog.js +21 -10
  79. package/dist/runtime/runtime-registry.d.ts +3 -0
  80. package/dist/runtime/runtime-registry.d.ts.map +1 -1
  81. package/dist/runtime/runtime-registry.js +4 -0
  82. package/dist/runtime/sqlite-runtime-fs-bridge.d.ts +43 -0
  83. package/dist/runtime/sqlite-runtime-fs-bridge.d.ts.map +1 -0
  84. package/dist/runtime/sqlite-runtime-fs-bridge.js +224 -0
  85. package/dist/runtime/static-server.d.ts +3 -0
  86. package/dist/runtime/static-server.d.ts.map +1 -0
  87. package/dist/runtime/static-server.js +121 -0
  88. package/dist/runtime/vfs-snapshot.d.ts +57 -0
  89. package/dist/runtime/vfs-snapshot.d.ts.map +1 -0
  90. package/dist/runtime/vfs-snapshot.js +141 -0
  91. package/dist/runtime/virtual-socket-kernel.d.ts +16 -0
  92. package/dist/runtime/virtual-socket-kernel.d.ts.map +1 -0
  93. package/dist/runtime/virtual-socket-kernel.js +360 -0
  94. package/dist/runtime/wasi-instance.d.ts +6 -3
  95. package/dist/runtime/wasi-instance.d.ts.map +1 -1
  96. package/dist/runtime/wasm-runner.d.ts +1 -25
  97. package/dist/runtime/wasm-runner.d.ts.map +1 -1
  98. package/dist/runtime/wasm-runner.js +1 -160
  99. package/dist/session/agent.d.ts +43 -0
  100. package/dist/session/agent.d.ts.map +1 -0
  101. package/dist/session/agent.js +1252 -0
  102. package/dist/session/init.d.ts.map +1 -1
  103. package/dist/session/init.js +15 -16
  104. package/dist/session/nimbus-session.d.ts +13 -2
  105. package/dist/session/nimbus-session.d.ts.map +1 -1
  106. package/dist/session/nimbus-session.js +55 -7
  107. package/dist/session/programmatic.d.ts +10 -0
  108. package/dist/session/programmatic.d.ts.map +1 -1
  109. package/dist/session/programmatic.js +121 -0
  110. package/dist/session/routes.d.ts.map +1 -1
  111. package/dist/session/routes.js +19 -1
  112. package/dist/session/rpc.d.ts +11 -0
  113. package/dist/session/rpc.d.ts.map +1 -1
  114. package/dist/session/rpc.js +56 -43
  115. package/dist/session/supervisor-rpc.d.ts +15 -0
  116. package/dist/session/supervisor-rpc.d.ts.map +1 -1
  117. package/dist/session/supervisor-rpc.js +32 -0
  118. package/dist/session/ws.d.ts +4 -3
  119. package/dist/session/ws.d.ts.map +1 -1
  120. package/dist/session/ws.js +11 -1
  121. package/dist/shell/unix-commands.js +12 -16
  122. package/dist/vfs/path.d.ts +8 -4
  123. package/dist/vfs/path.d.ts.map +1 -1
  124. package/dist/vfs/path.js +16 -4
  125. package/dist/vfs/sqlite-vfs.d.ts +2 -0
  126. package/dist/vfs/sqlite-vfs.d.ts.map +1 -1
  127. package/dist/vfs/sqlite-vfs.js +11 -0
  128. package/dist/vfs/symlink-registry.d.ts +7 -1
  129. package/dist/vfs/symlink-registry.d.ts.map +1 -1
  130. package/dist/vfs/symlink-registry.js +16 -11
  131. package/package.json +4 -1
  132. package/public/index.html +240 -0
  133. package/public/s/index.html +1172 -146
  134. package/runtime-contracts/pyodide-workerd-adapter.json +18 -0
  135. package/scripts/bundle-runtime.mjs +99 -24
@@ -21,22 +21,25 @@
21
21
  * these ~3 sites would each need ctx threaded through; cast at boundary
22
22
  * is acceptable per plan §IX recommendation 1.
23
23
  */
24
- import { enc } from '../_shared/bytes.js';
24
+ import { enc, dec } from '../_shared/bytes.js';
25
25
  import { getInnerDoClass } from '../facets/inner-do-registry.js';
26
26
  import { NpmCache } from '../npm/cache.js';
27
27
  import { EsbuildService } from '../runtime/esbuild-service.js';
28
+ import { SqliteRuntimeFsBridge } from '../runtime/sqlite-runtime-fs-bridge.js';
28
29
  import { notifyTerminalEvent } from '../runtime/process-logs-api.js';
29
30
  import { NimbusLoaderPool } from '../loaders/loader-pool.js';
30
31
  import { recordFailure, getLastRpcFrame, getLastFacetId, } from '../observability/oom-discriminator.js';
31
32
  import { classifyError } from '../observability/oom-classify.js';
32
- export async function _rpcReadFile(self, path) {
33
+ function runtimeFs(self) {
33
34
  self.ensureSqliteFs();
34
- try {
35
- return self.sqliteFs.readFileString(path.replace(/^\/+/, ''));
36
- }
37
- catch {
38
- return null;
35
+ if (!self.runtimeFsBridge) {
36
+ self.runtimeFsBridge = new SqliteRuntimeFsBridge(self.sqliteFs);
39
37
  }
38
+ return self.runtimeFsBridge;
39
+ }
40
+ export async function _rpcReadFile(self, path) {
41
+ const bytes = await runtimeFs(self).readFile(path);
42
+ return bytes ? dec.decode(bytes) : null;
40
43
  }
41
44
  /**
42
45
  * Read a file as raw bytes (Uint8Array). Used by git network facet for
@@ -44,13 +47,7 @@ export async function _rpcReadFile(self, path) {
44
47
  * round-tripping through readFile (string) would corrupt bytes.
45
48
  */
46
49
  export async function _rpcReadFileBytes(self, path) {
47
- self.ensureSqliteFs();
48
- try {
49
- return self.sqliteFs.readFile(path.replace(/^\/+/, ''));
50
- }
51
- catch {
52
- return null;
53
- }
50
+ return runtimeFs(self).readFile(path);
54
51
  }
55
52
  /**
56
53
  * Phase-3 inner-DO fetch dispatcher. Called by NimbusDOStub.fetch()
@@ -111,47 +108,60 @@ export async function _rpcInnerDoFetch(self, req) {
111
108
  }
112
109
  }
113
110
  export async function _rpcWriteFile(self, path, content) {
114
- self.ensureSqliteFs();
115
- const p = path.replace(/^\/+/, '');
116
- const parts = p.split('/');
117
- for (let i = 1; i < parts.length; i++) {
118
- const dir = parts.slice(0, i).join('/');
119
- if (dir && !self.sqliteFs.exists(dir))
120
- self.sqliteFs.mkdir(dir, { recursive: true });
121
- }
122
111
  // binary-fs wave: SqliteVFS.writeFile already accepts string | Uint8Array
123
112
  // (sqlite-vfs.ts:937), so we forward the content shape unchanged. RPC
124
113
  // structured-clone preserves Uint8Array across the boundary; structured-
125
114
  // clone doesn't accept Buffer subclass instances, so fs.writeFileSync on
126
115
  // a Buffer flows through node-shims.ts:writeFileSync which stores it as
127
116
  // a plain Uint8Array on the cell — the shape that arrives here.
128
- self.sqliteFs.writeFile(p, content);
117
+ await runtimeFs(self).writeFile(path, content);
129
118
  }
130
119
  export async function _rpcStat(self, path) {
131
- self.ensureSqliteFs();
132
- try {
133
- return self.sqliteFs.stat(path.replace(/^\/+/, ''));
134
- }
135
- catch {
136
- return null;
137
- }
120
+ return runtimeFs(self).stat(path);
138
121
  }
139
122
  export async function _rpcReaddir(self, path) {
140
- self.ensureSqliteFs();
141
- try {
142
- return self.sqliteFs.readdir(path.replace(/^\/+/, ''));
143
- }
144
- catch {
145
- return [];
146
- }
123
+ return runtimeFs(self).readdir(path);
147
124
  }
148
125
  export async function _rpcExists(self, path) {
149
- self.ensureSqliteFs();
150
- return self.sqliteFs.exists(path.replace(/^\/+/, ''));
126
+ return (await runtimeFs(self).stat(path)) !== null;
151
127
  }
152
128
  export async function _rpcMkdir(self, path) {
153
- self.ensureSqliteFs();
154
- self.sqliteFs.mkdir(path.replace(/^\/+/, ''), { recursive: true });
129
+ await runtimeFs(self).mkdir(path, { recursive: true });
130
+ }
131
+ export async function _rpcRmdir(self, path) {
132
+ await runtimeFs(self).rmdir(path);
133
+ }
134
+ export async function _rpcRename(self, from, to) {
135
+ await runtimeFs(self).rename(from, to);
136
+ }
137
+ export async function _rpcReadlink(self, path) {
138
+ return runtimeFs(self).readlink(path);
139
+ }
140
+ export async function _rpcSymlink(self, target, path) {
141
+ await runtimeFs(self).symlink(target, path);
142
+ }
143
+ export async function _rpcFsRevision(self, path) {
144
+ void path;
145
+ return runtimeFs(self).revision();
146
+ }
147
+ export async function _rpcFsOpen(self, path, flags) {
148
+ return runtimeFs(self).open(path, flags || {});
149
+ }
150
+ export async function _rpcFsRead(self, handleId, offset, length) {
151
+ return runtimeFs(self).read(handleId, offset, length);
152
+ }
153
+ export async function _rpcFsWrite(self, handleId, offset, bytes) {
154
+ let data;
155
+ if (bytes instanceof Uint8Array)
156
+ data = bytes;
157
+ else if (bytes instanceof ArrayBuffer)
158
+ data = new Uint8Array(bytes);
159
+ else
160
+ data = new Uint8Array(bytes || []);
161
+ return runtimeFs(self).write(handleId, offset, data);
162
+ }
163
+ export async function _rpcFsClose(self, handleId) {
164
+ await runtimeFs(self).close(handleId);
155
165
  }
156
166
  /**
157
167
  * Called by CirrusHmrRPC.hmrSend. Runs in the DO's own context so
@@ -164,9 +174,8 @@ export async function _rpcHmrRelay(self, clientId, msg) {
164
174
  self.cirrusReal.hmr.relayToBrowser(clientId, msg);
165
175
  }
166
176
  export async function _rpcUnlink(self, path) {
167
- self.ensureSqliteFs();
168
177
  try {
169
- self.sqliteFs.unlink(path.replace(/^\/+/, ''));
178
+ await runtimeFs(self).unlink(path);
170
179
  }
171
180
  catch { }
172
181
  }
@@ -610,6 +619,10 @@ export async function _rpcCpStdinEnd(self, childPid) {
610
619
  const fpm = self._ensureFacetProcessManager();
611
620
  fpm.stdinEnd(childPid);
612
621
  }
622
+ export async function _rpcCpReadStdin(self, childPid, waitMs) {
623
+ const fpm = self._ensureFacetProcessManager();
624
+ return fpm.cpReadStdin(childPid, waitMs);
625
+ }
613
626
  export async function _rpcCpReadOutput(self, childPid, fd, sinceSeq, waitMs) {
614
627
  const fpm = self._ensureFacetProcessManager();
615
628
  return fpm.readOutput(childPid, fd, sinceSeq, waitMs);
@@ -16,6 +16,8 @@
16
16
  * exists(path) → boolean
17
17
  * mkdir(path) → void
18
18
  * unlink(path) → void
19
+ * fsOpen/fsRead/fsWrite/fsClose/readlink/symlink/rename/rmdir/fsRevision
20
+ * → shared RuntimeFsBridge operations
19
21
  * writeBatch(payload) → { inodes, chunks } (bulk atomic write)
20
22
  * stdout(data) → void (pushed to WebSocket + ring buffer)
21
23
  * stderr(data) → void
@@ -74,7 +76,16 @@ export declare class SupervisorRPC extends WorkerEntrypoint {
74
76
  }[]>;
75
77
  exists(path: string): Promise<boolean>;
76
78
  mkdir(path: string): Promise<void>;
79
+ rmdir(path: string): Promise<void>;
80
+ rename(from: string, to: string): Promise<void>;
77
81
  unlink(path: string): Promise<void>;
82
+ readlink(path: string): Promise<string | null>;
83
+ symlink(target: string, path: string): Promise<void>;
84
+ fsRevision(path?: string): Promise<number>;
85
+ fsOpen(path: string, flags: any): Promise<any>;
86
+ fsRead(handleId: number, offset: number | null, length: number): Promise<Uint8Array>;
87
+ fsWrite(handleId: number, offset: number | null, bytes: Uint8Array | ArrayBuffer | number[]): Promise<number>;
88
+ fsClose(handleId: number): Promise<void>;
78
89
  /**
79
90
  * Bulk-write all inodes + chunks in ONE transactionSync on the supervisor.
80
91
  * Used by facets that buffer writes locally (git clone/fetch/pull).
@@ -231,6 +242,10 @@ export declare class SupervisorRPC extends WorkerEntrypoint {
231
242
  ok: boolean;
232
243
  }>;
233
244
  cpStdinEnd(childPid: number): Promise<void>;
245
+ cpReadStdin(childPid: number, waitMs: number): Promise<{
246
+ data: string;
247
+ ended: boolean;
248
+ }>;
234
249
  cpReadOutput(childPid: number, fd: 1 | 2, sinceSeq: number, waitMs: number): Promise<{
235
250
  chunks: {
236
251
  seq: number;
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor-rpc.d.ts","sourceRoot":"","sources":["../../src/session/supervisor-rpc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"supervisor-rpc.d.ts","sourceRoot":"","sources":["../../src/session/supervisor-rpc.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,8 @@
16
16
  * exists(path) → boolean
17
17
  * mkdir(path) → void
18
18
  * unlink(path) → void
19
+ * fsOpen/fsRead/fsWrite/fsClose/readlink/symlink/rename/rmdir/fsRevision
20
+ * → shared RuntimeFsBridge operations
19
21
  * writeBatch(payload) → { inodes, chunks } (bulk atomic write)
20
22
  * stdout(data) → void (pushed to WebSocket + ring buffer)
21
23
  * stderr(data) → void
@@ -125,9 +127,36 @@ export class SupervisorRPC extends WorkerEntrypoint {
125
127
  async mkdir(path) {
126
128
  return this._getStub()._rpcMkdir(path);
127
129
  }
130
+ async rmdir(path) {
131
+ return this._getStub()._rpcRmdir(path);
132
+ }
133
+ async rename(from, to) {
134
+ return this._getStub()._rpcRename(from, to);
135
+ }
128
136
  async unlink(path) {
129
137
  return this._getStub()._rpcUnlink(path);
130
138
  }
139
+ async readlink(path) {
140
+ return this._getStub()._rpcReadlink(path);
141
+ }
142
+ async symlink(target, path) {
143
+ return this._getStub()._rpcSymlink(target, path);
144
+ }
145
+ async fsRevision(path) {
146
+ return this._getStub()._rpcFsRevision(path);
147
+ }
148
+ async fsOpen(path, flags) {
149
+ return this._getStub()._rpcFsOpen(path, flags);
150
+ }
151
+ async fsRead(handleId, offset, length) {
152
+ return this._getStub()._rpcFsRead(handleId, offset, length);
153
+ }
154
+ async fsWrite(handleId, offset, bytes) {
155
+ return this._getStub()._rpcFsWrite(handleId, offset, bytes);
156
+ }
157
+ async fsClose(handleId) {
158
+ return this._getStub()._rpcFsClose(handleId);
159
+ }
131
160
  /**
132
161
  * Bulk-write all inodes + chunks in ONE transactionSync on the supervisor.
133
162
  * Used by facets that buffer writes locally (git clone/fetch/pull).
@@ -407,6 +436,9 @@ export class SupervisorRPC extends WorkerEntrypoint {
407
436
  async cpStdinEnd(childPid) {
408
437
  return this._getStub()._rpcCpStdinEnd(childPid);
409
438
  }
439
+ async cpReadStdin(childPid, waitMs) {
440
+ return this._getStub()._rpcCpReadStdin(childPid, waitMs);
441
+ }
410
442
  async cpReadOutput(childPid, fd, sinceSeq, waitMs) {
411
443
  return this._getStub()._rpcCpReadOutput(childPid, fd, sinceSeq, waitMs);
412
444
  }
@@ -52,8 +52,8 @@ export interface WsHost {
52
52
  /** file-tree-watch (2026-05-15): per-WS fs-watch subscriptions.
53
53
  * Keyed on the live WebSocket; cleaned up unconditionally in
54
54
  * wsClose / wsError. See src/session/fs-watch.ts for the protocol
55
- * + lifecycle. Optional (undefined) until first subscribe so
56
- * memory stays at 0 for terminal-only sessions. */
55
+ * + lifecycle. Optional (undefined) until first subscribe so sessions
56
+ * that never open the file tree carry no watch state. */
57
57
  _fsWatchSubs?: Map<WebSocket, FsWatchSub[]>;
58
58
  processLogs: ProcessLogStore;
59
59
  wranglerAliasBannerShown: boolean;
@@ -75,7 +75,8 @@ export interface WsHost {
75
75
  /**
76
76
  * Classify a closing/erroring WebSocket by its serialized attachment.
77
77
  * Shell sockets carry `{kind:'shell'}` (set at the /ws upgrade site);
78
- * HMR sockets carry `{kind:'cirrus-hmr', clientId}` (set at :1240).
78
+ * watcher sockets carry `{kind:'fs-watch'}`; HMR sockets carry
79
+ * `{kind:'cirrus-hmr', clientId}` (set at :1240).
79
80
  * Any other (undefined/unknown) attachment falls back to 'shell' to
80
81
  * preserve pre-F1 behaviour for legacy accept sites.
81
82
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/session/ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAMH,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,mBAAmB,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACnD;;;;wDAIoD;IACpD,YAAY,CAAC,EAAE,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5C,WAAW,EAAE,eAAe,CAAC;IAC7B,wBAAwB,EAAE,OAAO,CAAC;IAClC,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,GAAG,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,OAAO,CAAC;IAChC,WAAW,EAAE,GAAG,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qEAAqE;IACrE,QAAQ,EAAE,OAAO,uCAAuC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9E,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACvC,eAAe,IAAI,IAAI,CAAC;CACzB;AAgDD;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAQzE;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkEzG;AAED,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,SAAS,EACb,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,OAAO,GAClB,OAAO,CAAC,IAAI,CAAC,CAoGf;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA4EtF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUlD"}
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/session/ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAMH,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,mBAAmB,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACnD;;;;8DAI0D;IAC1D,YAAY,CAAC,EAAE,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IAC5C,WAAW,EAAE,eAAe,CAAC;IAC7B,wBAAwB,EAAE,OAAO,CAAC;IAClC,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,GAAG,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,OAAO,CAAC;IAChC,WAAW,EAAE,GAAG,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qEAAqE;IACrE,QAAQ,EAAE,OAAO,uCAAuC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9E,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACvC,eAAe,IAAI,IAAI,CAAC;CACzB;AAgDD;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAQzE;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEzG;AAED,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,SAAS,EACb,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,OAAO,GAClB,OAAO,CAAC,IAAI,CAAC,CAuGf;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA+EtF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUlD"}
@@ -92,7 +92,8 @@ function snapshotShellState(self) {
92
92
  /**
93
93
  * Classify a closing/erroring WebSocket by its serialized attachment.
94
94
  * Shell sockets carry `{kind:'shell'}` (set at the /ws upgrade site);
95
- * HMR sockets carry `{kind:'cirrus-hmr', clientId}` (set at :1240).
95
+ * watcher sockets carry `{kind:'fs-watch'}`; HMR sockets carry
96
+ * `{kind:'cirrus-hmr', clientId}` (set at :1240).
96
97
  * Any other (undefined/unknown) attachment falls back to 'shell' to
97
98
  * preserve pre-F1 behaviour for legacy accept sites.
98
99
  */
@@ -163,6 +164,9 @@ export async function wsMessage(self, ws, message) {
163
164
  }
164
165
  return;
165
166
  }
167
+ if (attach?.kind === 'fs-watch') {
168
+ return;
169
+ }
166
170
  if (self.terminal)
167
171
  self.terminal.handleMessage(msg);
168
172
  // ── B'.1 snapshot ───────────────────────────────────────────────
@@ -199,6 +203,9 @@ export async function wsClose(self, ws, _code, _reason, _wasClean) {
199
203
  if (att.kind === 'process-logs') {
200
204
  return;
201
205
  }
206
+ if (att.kind === 'fs-watch') {
207
+ return;
208
+ }
202
209
  if (att.kind === 'cirrus-hmr') {
203
210
  // HMR socket closed. Detach from the bridge + drop from the map.
204
211
  // Do NOT touch shell/terminal/kernel — the user's terminal tab
@@ -301,6 +308,9 @@ export async function wsError(self, ws, _error) {
301
308
  if (att.kind === 'process-logs') {
302
309
  return;
303
310
  }
311
+ if (att.kind === 'fs-watch') {
312
+ return;
313
+ }
304
314
  if (att.kind === 'cirrus-hmr') {
305
315
  try {
306
316
  const clientId = att.clientId || self._cirrusHmrWsClients?.get(ws);
@@ -10,20 +10,8 @@
10
10
  * du, man/help, basename, dirname, printf, true, false, seq, sleep,
11
11
  * touch, stat, file, xxd, base64, sha256sum, id, hostname, realpath
12
12
  */
13
- import { SymlinkRegistry } from '../vfs/symlink-registry.js';
13
+ import { getSymlinkRegistry } from '../vfs/symlink-registry.js';
14
14
  import { enc } from '../_shared/bytes.js';
15
- /**
16
- * SHELL-FOLLOWUPS-4 (2026-05-11): per-vfs symlink registry singleton.
17
- * Cached on the VFS instance via a side property so `ln -s` + `readlink`
18
- * + `ls -la` share the same registry within a session.
19
- */
20
- function getSymlinkRegistry(vfs) {
21
- const v = vfs;
22
- if (!v.__nimbus_symlink_registry) {
23
- v.__nimbus_symlink_registry = new SymlinkRegistry(vfs);
24
- }
25
- return v.__nimbus_symlink_registry;
26
- }
27
15
  function isRuntimeInstallHintHandler(handler) {
28
16
  return !!handler && !!handler.__nimbusRuntimeInstallHint;
29
17
  }
@@ -118,8 +106,13 @@ const _CANONICAL_BIN_PATHS = {
118
106
  git: '/usr/bin/git',
119
107
  python: '/usr/bin/python3',
120
108
  python3: '/usr/bin/python3',
109
+ pip: '/usr/bin/pip',
110
+ pip3: '/usr/bin/pip3',
121
111
  ruby: '/usr/bin/ruby',
122
112
  ruby3: '/usr/bin/ruby',
113
+ gem: '/usr/bin/gem',
114
+ bundle: '/usr/bin/bundle',
115
+ bundler: '/usr/bin/bundler',
123
116
  sh: '/usr/bin/sh',
124
117
  bash: '/usr/bin/bash',
125
118
  // Framework CLIs
@@ -150,13 +143,14 @@ function _pathLookup(vfs, name, envPath) {
150
143
  }
151
144
  return null;
152
145
  }
153
- async function _registryResolved(registry, name) {
146
+ async function _registryResolved(registry, name, options = {}) {
154
147
  try {
155
148
  const resolved = typeof registry.resolve === 'function'
156
149
  ? await registry.resolve(name)
157
150
  : null;
158
- if (resolved && !isRuntimeInstallHintHandler(resolved))
151
+ if (resolved && (options.includeInstallHints || !isRuntimeInstallHintHandler(resolved))) {
159
152
  return resolved;
153
+ }
160
154
  }
161
155
  catch {
162
156
  // Registry misses are normal for unknown commands.
@@ -173,7 +167,9 @@ async function _whichLookup(vfs, registry, name, envPath) {
173
167
  const canonicalPath = _CANONICAL_BIN_PATHS[name];
174
168
  if (!canonicalPath)
175
169
  return null;
176
- return await _registryResolved(registry, name) ? canonicalPath : null;
170
+ return await _registryResolved(registry, name, { includeInstallHints: true })
171
+ ? canonicalPath
172
+ : null;
177
173
  }
178
174
  function mkWhich(vfs, registry) {
179
175
  return async (ctx) => {
@@ -7,10 +7,10 @@
7
7
  * before pop) that the others lacked — that safer behavior is the one
8
8
  * preserved here.
9
9
  *
10
- * Facet-isolate code-string copies (e.g. inside
11
- * generateGitNetworkFacetCode in git-network-facet.ts, and inside
12
- * node-shims.ts) cannot import this module and must keep their inline
13
- * implementations; those copies are documented as justified.
10
+ * Facet-isolate code-string copies (for example git-network-facet,
11
+ * pre-bundle-facet, and node-shims generated/runtime strings) cannot import
12
+ * this module and must keep their inline implementations; those copies are
13
+ * documented as justified.
14
14
  *
15
15
  * Semantics:
16
16
  * - Strip empty segments (collapses `//` runs)
@@ -25,6 +25,10 @@
25
25
  * normalizeVfsPath('../escape') -> 'escape' (bounded; doesn't go negative)
26
26
  */
27
27
  export declare function normalizeVfsPath(p: string): string;
28
+ /** Resolve a user path against a VFS cwd and return a canonical VFS key. */
29
+ export declare function resolveVfsPath(path: string, cwd: string): string;
30
+ /** Return the canonical VFS parent key, or an empty string for root-level paths. */
31
+ export declare function parentVfsPath(path: string): string;
28
32
  /** Strip leading slashes only — does not touch internal segments. */
29
33
  export declare function stripLeadingSlashes(p: string): string;
30
34
  //# sourceMappingURL=path.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/vfs/path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQlD;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAErD"}
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/vfs/path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQlD;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAErD"}
package/dist/vfs/path.js CHANGED
@@ -7,10 +7,10 @@
7
7
  * before pop) that the others lacked — that safer behavior is the one
8
8
  * preserved here.
9
9
  *
10
- * Facet-isolate code-string copies (e.g. inside
11
- * generateGitNetworkFacetCode in git-network-facet.ts, and inside
12
- * node-shims.ts) cannot import this module and must keep their inline
13
- * implementations; those copies are documented as justified.
10
+ * Facet-isolate code-string copies (for example git-network-facet,
11
+ * pre-bundle-facet, and node-shims generated/runtime strings) cannot import
12
+ * this module and must keep their inline implementations; those copies are
13
+ * documented as justified.
14
14
  *
15
15
  * Semantics:
16
16
  * - Strip empty segments (collapses `//` runs)
@@ -35,6 +35,18 @@ export function normalizeVfsPath(p) {
35
35
  }
36
36
  return out.join('/');
37
37
  }
38
+ /** Resolve a user path against a VFS cwd and return a canonical VFS key. */
39
+ export function resolveVfsPath(path, cwd) {
40
+ return path.startsWith('/')
41
+ ? normalizeVfsPath(path)
42
+ : normalizeVfsPath(`${cwd}/${path}`);
43
+ }
44
+ /** Return the canonical VFS parent key, or an empty string for root-level paths. */
45
+ export function parentVfsPath(path) {
46
+ const clean = normalizeVfsPath(path);
47
+ const idx = clean.lastIndexOf('/');
48
+ return idx > 0 ? clean.slice(0, idx) : '';
49
+ }
38
50
  /** Strip leading slashes only — does not touch internal segments. */
39
51
  export function stripLeadingSlashes(p) {
40
52
  return p.replace(/^\/+/, '');
@@ -82,6 +82,7 @@ export declare class SqliteVFS {
82
82
  private _totalFiles;
83
83
  private _totalDirs;
84
84
  private _usedBytes;
85
+ private _revision;
85
86
  private pendingWrites;
86
87
  /**
87
88
  * Sum of `data.length` across pendingWrites entries. Maintained
@@ -238,6 +239,7 @@ export declare class SqliteVFS {
238
239
  exists(path: string): boolean;
239
240
  isDirectory(path: string): boolean;
240
241
  isFile(path: string): boolean;
242
+ revision(): number;
241
243
  mkdir(path: string, options?: {
242
244
  recursive?: boolean;
243
245
  }): void;
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-vfs.d.ts","sourceRoot":"","sources":["../../src/vfs/sqlite-vfs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sqlite-vfs.d.ts","sourceRoot":"","sources":["../../src/vfs/sqlite-vfs.ts"],"names":[],"mappings":"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"}
@@ -88,6 +88,7 @@ export class SqliteVFS {
88
88
  _totalFiles = 0;
89
89
  _totalDirs = 0;
90
90
  _usedBytes = 0;
91
+ _revision = 0;
91
92
  // ── Deferred write queue (do86 pattern) ───────────────────────────────
92
93
  pendingWrites = new Map();
93
94
  /**
@@ -783,6 +784,9 @@ export class SqliteVFS {
783
784
  const inode = this.inodes.get(path);
784
785
  return inode !== undefined && !inode.isDir;
785
786
  }
787
+ revision() {
788
+ return this._revision;
789
+ }
786
790
  mkdir(path, options) {
787
791
  if (this.exists(path))
788
792
  return;
@@ -808,6 +812,7 @@ export class SqliteVFS {
808
812
  this.inodes.set(path, inode);
809
813
  this._addToChildrenIndex(pp, path);
810
814
  this._totalDirs++; // B3
815
+ this._revision++;
811
816
  this.events.emit('addDir', path);
812
817
  }
813
818
  writeFile(path, content) {
@@ -890,6 +895,7 @@ export class SqliteVFS {
890
895
  this.deferWrite(path, i, chunk);
891
896
  }
892
897
  }
898
+ this._revision++;
893
899
  this.events.emit(isNew ? 'add' : 'change', path);
894
900
  }
895
901
  readFile(path) {
@@ -1013,6 +1019,7 @@ export class SqliteVFS {
1013
1019
  }
1014
1020
  }
1015
1021
  this.inodes.delete(path);
1022
+ this._revision++;
1016
1023
  this.events.emit('unlink', path);
1017
1024
  }
1018
1025
  rmdir(path) {
@@ -1037,6 +1044,7 @@ export class SqliteVFS {
1037
1044
  }
1038
1045
  this.inodes.delete(np);
1039
1046
  this.children.delete(np); // Remove empty children set
1047
+ this._revision++;
1040
1048
  this.events.emit('unlinkDir', np);
1041
1049
  }
1042
1050
  rename(oldPath, newPath) {
@@ -1117,6 +1125,7 @@ export class SqliteVFS {
1117
1125
  this._addToChildrenIndex(ncpp, ncp);
1118
1126
  }
1119
1127
  }
1128
+ this._revision++;
1120
1129
  this.events.emit('rename', newPath, oldPath);
1121
1130
  }
1122
1131
  copyFile(src, dest) {
@@ -1509,6 +1518,8 @@ export class SqliteVFS {
1509
1518
  this._sqlWrites += inodeCount + chunkCount;
1510
1519
  this._batchWrites++;
1511
1520
  this._batchWriteRows += inodeCount + chunkCount;
1521
+ if (inodeCount > 0 || chunkCount > 0 || payload.deletePaths?.length)
1522
+ this._revision++;
1512
1523
  return { inodes: inodeCount, chunks: chunkCount };
1513
1524
  }
1514
1525
  /**
@@ -33,7 +33,7 @@ export declare class SymlinkRegistry {
33
33
  private load;
34
34
  /** Write the cache back to the registry file. */
35
35
  private flush;
36
- /** Normalize a path: strip leading slashes (VFS internal convention). */
36
+ /** Normalize a path to the VFS internal key convention. */
37
37
  private norm;
38
38
  /** Create or replace a symlink. Target is stored verbatim (can be
39
39
  * absolute or relative — interpretation happens at resolve time). */
@@ -61,4 +61,10 @@ export declare class SymlinkRegistry {
61
61
  target: string;
62
62
  }[];
63
63
  }
64
+ /**
65
+ * Return the session-wide registry for a VFS instance. The registry has an
66
+ * in-memory cache, so all runtime surfaces that share one SqliteVFS must also
67
+ * share the registry instance to avoid stale symlink reads.
68
+ */
69
+ export declare function getSymlinkRegistry(vfs: SqliteVFS): SymlinkRegistry;
64
70
  //# sourceMappingURL=symlink-registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"symlink-registry.d.ts","sourceRoot":"","sources":["../../src/vfs/symlink-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,KAAK,CAAoC;gBAErC,GAAG,EAAE,SAAS;IAI1B,wCAAwC;IACxC,OAAO,CAAC,IAAI;IAgBZ,iDAAiD;IACjD,OAAO,CAAC,KAAK;IASb,yEAAyE;IACzE,OAAO,CAAC,IAAI;IAIZ;0EACsE;IACtE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAM3C,oDAAoD;IACpD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOjC,wEAAwE;IACxE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKrC;;;;;;;;;OASG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAuB9C,2EAA2E;IAC3E,IAAI,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE;CAO3C"}
1
+ {"version":3,"file":"symlink-registry.d.ts","sourceRoot":"","sources":["../../src/vfs/symlink-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAKjD,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,KAAK,CAAoC;gBAErC,GAAG,EAAE,SAAS;IAI1B,wCAAwC;IACxC,OAAO,CAAC,IAAI;IAgBZ,iDAAiD;IACjD,OAAO,CAAC,KAAK;IASb,2DAA2D;IAC3D,OAAO,CAAC,IAAI;IAIZ;0EACsE;IACtE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAM3C,oDAAoD;IACpD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOjC,wEAAwE;IACxE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKrC;;;;;;;;;OASG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiB9C,2EAA2E;IAC3E,IAAI,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE;CAO3C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,SAAS,GAAG,eAAe,CAMlE"}