@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.
- package/README.md +37 -0
- package/dist/_shared/crypto.d.ts +15 -0
- package/dist/_shared/crypto.d.ts.map +1 -0
- package/dist/_shared/crypto.js +122 -0
- package/dist/facets/manager.d.ts +24 -0
- package/dist/facets/manager.d.ts.map +1 -1
- package/dist/facets/manager.js +279 -70
- package/dist/facets/process.d.ts +11 -2
- package/dist/facets/process.d.ts.map +1 -1
- package/dist/facets/process.js +187 -21
- package/dist/facets/vite-dev-server.d.ts +2 -0
- package/dist/facets/vite-dev-server.d.ts.map +1 -1
- package/dist/facets/vite-dev-server.js +39 -12
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/loaders/child-process/spawn-facet.d.ts +1 -3
- package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -1
- package/dist/loaders/child-process/spawn-facet.js +1 -12
- package/dist/loaders/child-process/spawn-pool.d.ts +1 -1
- package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -1
- package/dist/loaders/child-process/spawn-pool.js +1 -6
- package/dist/npm/installer.d.ts.map +1 -1
- package/dist/npm/installer.js +47 -27
- package/dist/npm/pre-bundle-facet.d.ts.map +1 -1
- package/dist/npm/pre-bundle-facet.js +2 -1
- package/dist/npm/resolve-one-facet.d.ts.map +1 -1
- package/dist/npm/resolve-one-facet.js +41 -13
- package/dist/npm/resolver.d.ts.map +1 -1
- package/dist/npm/resolver.js +70 -35
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +45 -21
- package/dist/router/remote-api.d.ts.map +1 -1
- package/dist/router/remote-api.js +29 -8
- package/dist/runtime/barrel-synthesizer.d.ts +7 -0
- package/dist/runtime/barrel-synthesizer.d.ts.map +1 -1
- package/dist/runtime/barrel-synthesizer.js +11 -0
- package/dist/runtime/clang-runner.d.ts.map +1 -1
- package/dist/runtime/clang-runner.js +1 -8
- package/dist/runtime/esbuild-service.d.ts +12 -5
- package/dist/runtime/esbuild-service.d.ts.map +1 -1
- package/dist/runtime/esbuild-service.js +28 -14
- package/dist/runtime/node-runner.d.ts +2 -0
- package/dist/runtime/node-runner.d.ts.map +1 -1
- package/dist/runtime/node-shims.d.ts +4 -2
- package/dist/runtime/node-shims.d.ts.map +1 -1
- package/dist/runtime/node-shims.js +404 -55
- package/dist/runtime/os-contracts.d.ts +128 -0
- package/dist/runtime/os-contracts.d.ts.map +1 -0
- package/dist/runtime/os-contracts.js +1 -0
- package/dist/runtime/package-manager.d.ts.map +1 -1
- package/dist/runtime/package-manager.js +32 -7
- package/dist/runtime/port-registry.d.ts +5 -0
- package/dist/runtime/port-registry.d.ts.map +1 -1
- package/dist/runtime/port-registry.js +22 -1
- package/dist/runtime/pyodide-runtime-assets.d.ts +19 -0
- package/dist/runtime/pyodide-runtime-assets.d.ts.map +1 -0
- package/dist/runtime/pyodide-runtime-assets.js +44 -0
- package/dist/runtime/python-repl.d.ts +3 -1
- package/dist/runtime/python-repl.d.ts.map +1 -1
- package/dist/runtime/python-repl.js +11 -29
- package/dist/runtime/python-runner.d.ts +8 -9
- package/dist/runtime/python-runner.d.ts.map +1 -1
- package/dist/runtime/python-runner.js +897 -61
- package/dist/runtime/python-socket-shim.d.ts +11 -0
- package/dist/runtime/python-socket-shim.d.ts.map +1 -0
- package/dist/runtime/python-socket-shim.js +526 -0
- package/dist/runtime/require-resolver.d.ts.map +1 -1
- package/dist/runtime/require-resolver.js +2 -11
- package/dist/runtime/ruby-gems.d.ts +25 -0
- package/dist/runtime/ruby-gems.d.ts.map +1 -0
- package/dist/runtime/ruby-gems.js +582 -0
- package/dist/runtime/ruby-runner.d.ts +2 -4
- package/dist/runtime/ruby-runner.d.ts.map +1 -1
- package/dist/runtime/ruby-runner.js +335 -34
- package/dist/runtime/runtime-catalog.d.ts +16 -4
- package/dist/runtime/runtime-catalog.d.ts.map +1 -1
- package/dist/runtime/runtime-catalog.js +21 -10
- package/dist/runtime/runtime-registry.d.ts +3 -0
- package/dist/runtime/runtime-registry.d.ts.map +1 -1
- package/dist/runtime/runtime-registry.js +4 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.d.ts +43 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.d.ts.map +1 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.js +224 -0
- package/dist/runtime/static-server.d.ts +3 -0
- package/dist/runtime/static-server.d.ts.map +1 -0
- package/dist/runtime/static-server.js +121 -0
- package/dist/runtime/vfs-snapshot.d.ts +57 -0
- package/dist/runtime/vfs-snapshot.d.ts.map +1 -0
- package/dist/runtime/vfs-snapshot.js +141 -0
- package/dist/runtime/virtual-socket-kernel.d.ts +16 -0
- package/dist/runtime/virtual-socket-kernel.d.ts.map +1 -0
- package/dist/runtime/virtual-socket-kernel.js +360 -0
- package/dist/runtime/wasi-instance.d.ts +6 -3
- package/dist/runtime/wasi-instance.d.ts.map +1 -1
- package/dist/runtime/wasm-runner.d.ts +1 -25
- package/dist/runtime/wasm-runner.d.ts.map +1 -1
- package/dist/runtime/wasm-runner.js +1 -160
- package/dist/session/agent.d.ts +43 -0
- package/dist/session/agent.d.ts.map +1 -0
- package/dist/session/agent.js +1252 -0
- package/dist/session/init.d.ts.map +1 -1
- package/dist/session/init.js +15 -16
- package/dist/session/nimbus-session.d.ts +13 -2
- package/dist/session/nimbus-session.d.ts.map +1 -1
- package/dist/session/nimbus-session.js +55 -7
- package/dist/session/programmatic.d.ts +10 -0
- package/dist/session/programmatic.d.ts.map +1 -1
- package/dist/session/programmatic.js +121 -0
- package/dist/session/routes.d.ts.map +1 -1
- package/dist/session/routes.js +19 -1
- package/dist/session/rpc.d.ts +11 -0
- package/dist/session/rpc.d.ts.map +1 -1
- package/dist/session/rpc.js +56 -43
- package/dist/session/supervisor-rpc.d.ts +15 -0
- package/dist/session/supervisor-rpc.d.ts.map +1 -1
- package/dist/session/supervisor-rpc.js +32 -0
- package/dist/session/ws.d.ts +4 -3
- package/dist/session/ws.d.ts.map +1 -1
- package/dist/session/ws.js +11 -1
- package/dist/shell/unix-commands.js +12 -16
- package/dist/vfs/path.d.ts +8 -4
- package/dist/vfs/path.d.ts.map +1 -1
- package/dist/vfs/path.js +16 -4
- package/dist/vfs/sqlite-vfs.d.ts +2 -0
- package/dist/vfs/sqlite-vfs.d.ts.map +1 -1
- package/dist/vfs/sqlite-vfs.js +11 -0
- package/dist/vfs/symlink-registry.d.ts +7 -1
- package/dist/vfs/symlink-registry.d.ts.map +1 -1
- package/dist/vfs/symlink-registry.js +16 -11
- package/package.json +4 -1
- package/public/index.html +240 -0
- package/public/s/index.html +1172 -146
- package/runtime-contracts/pyodide-workerd-adapter.json +18 -0
- package/scripts/bundle-runtime.mjs +99 -24
package/dist/session/rpc.js
CHANGED
|
@@ -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
|
-
|
|
33
|
+
function runtimeFs(self) {
|
|
33
34
|
self.ensureSqliteFs();
|
|
34
|
-
|
|
35
|
-
|
|
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.
|
|
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.
|
|
117
|
+
await runtimeFs(self).writeFile(path, content);
|
|
129
118
|
}
|
|
130
119
|
export async function _rpcStat(self, path) {
|
|
131
|
-
self.
|
|
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.
|
|
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.
|
|
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.
|
|
154
|
-
|
|
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.
|
|
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":"AAAA
|
|
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
|
}
|
package/dist/session/ws.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
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
|
-
*
|
|
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
|
*/
|
package/dist/session/ws.d.ts.map
CHANGED
|
@@ -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;;;;
|
|
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"}
|
package/dist/session/ws.js
CHANGED
|
@@ -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
|
-
*
|
|
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 {
|
|
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
|
|
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) => {
|
package/dist/vfs/path.d.ts
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 (
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
package/dist/vfs/path.d.ts.map
CHANGED
|
@@ -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 (
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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(/^\/+/, '');
|
package/dist/vfs/sqlite-vfs.d.ts
CHANGED
|
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,EAAE,eAAe,EAAqB,MAAM,aAAa,CAAC;AAyBjE,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,uFAAuF;AACvF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAYD,qBAAa,SAAS;IACpB,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,GAAG,CAAqB;IAChC,SAAgB,MAAM,EAAE,eAAe,CAAC;IAGxC,OAAO,CAAC,MAAM,CAA4B;IAC1C,qEAAqE;IACrE,OAAO,CAAC,QAAQ,CAAkC;IAIlD,OAAO,CAAC,KAAK,CAAiC;IAC9C,2DAA2D;IAC3D,OAAO,CAAC,WAAW,CAAK;IAiBxB,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,kBAAkB,CAAa;IAQvC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAAK;
|
|
1
|
+
{"version":3,"file":"sqlite-vfs.d.ts","sourceRoot":"","sources":["../../src/vfs/sqlite-vfs.ts"],"names":[],"mappings":"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"}
|
package/dist/vfs/sqlite-vfs.js
CHANGED
|
@@ -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
|
|
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;
|
|
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"}
|