staff-mcp 1.2.0 → 2.0.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 (133) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +178 -49
  3. package/README_zh.md +176 -47
  4. package/dist/src/data/HttpDataSession.d.ts +22 -0
  5. package/dist/src/data/HttpDataSession.js +925 -0
  6. package/dist/src/data/HttpDataSession.js.map +1 -0
  7. package/dist/src/data/node.d.ts +4 -0
  8. package/dist/src/data/node.js +93 -0
  9. package/dist/src/data/node.js.map +1 -0
  10. package/dist/src/data/types.d.ts +54 -0
  11. package/dist/src/data/types.js +2 -0
  12. package/dist/src/data/types.js.map +1 -0
  13. package/dist/src/data-stdio-docker.d.ts +10 -0
  14. package/dist/src/data-stdio-docker.js +140 -0
  15. package/dist/src/data-stdio-docker.js.map +1 -0
  16. package/dist/src/docker-proxy.d.ts +6 -1
  17. package/dist/src/docker-proxy.js +324 -147
  18. package/dist/src/docker-proxy.js.map +1 -1
  19. package/dist/src/extensions/apps.d.ts +12 -0
  20. package/dist/src/extensions/apps.js +85 -0
  21. package/dist/src/extensions/apps.js.map +1 -0
  22. package/dist/src/extensions/config.d.ts +27 -0
  23. package/dist/src/extensions/config.js +91 -0
  24. package/dist/src/extensions/config.js.map +1 -0
  25. package/dist/src/extensions/protocol.d.ts +35 -0
  26. package/dist/src/extensions/protocol.js +47 -0
  27. package/dist/src/extensions/protocol.js.map +1 -0
  28. package/dist/src/extensions/runtime.d.ts +16 -0
  29. package/dist/src/extensions/runtime.js +266 -0
  30. package/dist/src/extensions/runtime.js.map +1 -0
  31. package/dist/src/file-manager/extension.d.ts +21 -0
  32. package/dist/src/file-manager/extension.js +514 -0
  33. package/dist/src/file-manager/extension.js.map +1 -0
  34. package/dist/src/file-manager/file-core.d.ts +128 -0
  35. package/dist/src/file-manager/file-core.js +750 -0
  36. package/dist/src/file-manager/file-core.js.map +1 -0
  37. package/dist/src/file-manager/transfers.d.ts +423 -0
  38. package/dist/src/file-manager/transfers.js +540 -0
  39. package/dist/src/file-manager/transfers.js.map +1 -0
  40. package/dist/src/file-manager/ui/index.html +81 -0
  41. package/dist/src/index.js +289 -128
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/lsp/manager.d.ts +2 -0
  44. package/dist/src/lsp/manager.js +22 -10
  45. package/dist/src/lsp/manager.js.map +1 -1
  46. package/dist/src/reverse/SseTransport.d.ts +34 -0
  47. package/dist/src/reverse/SseTransport.js +215 -0
  48. package/dist/src/reverse/SseTransport.js.map +1 -0
  49. package/dist/src/reverse/http.d.ts +7 -0
  50. package/dist/src/reverse/http.js +85 -0
  51. package/dist/src/reverse/http.js.map +1 -0
  52. package/dist/src/server.d.ts +4 -2
  53. package/dist/src/server.js +80 -18
  54. package/dist/src/server.js.map +1 -1
  55. package/dist/src/terminal/extension.d.ts +4 -0
  56. package/dist/src/terminal/extension.js +108 -0
  57. package/dist/src/terminal/extension.js.map +1 -0
  58. package/dist/src/terminal/pty.d.ts +14 -0
  59. package/dist/src/terminal/pty.js +121 -0
  60. package/dist/src/terminal/pty.js.map +1 -0
  61. package/dist/src/terminal/session.d.ts +136 -0
  62. package/dist/src/terminal/session.js +422 -0
  63. package/dist/src/terminal/session.js.map +1 -0
  64. package/dist/src/terminal/ui/index.html +183 -0
  65. package/dist/src/tools/file-tools.d.ts +2 -1
  66. package/dist/src/tools/file-tools.js +19 -7
  67. package/dist/src/tools/file-tools.js.map +1 -1
  68. package/dist/src/tools/mcp-client-tools.js +244 -104
  69. package/dist/src/tools/mcp-client-tools.js.map +1 -1
  70. package/dist/src/tools/shell-tools.js +1 -1
  71. package/dist/src/tools/shell-tools.js.map +1 -1
  72. package/dist/src/tools/skills.js +26 -1
  73. package/dist/src/tools/skills.js.map +1 -1
  74. package/dist/src/tools/system-tools.d.ts +9 -3
  75. package/dist/src/tools/system-tools.js +31 -48
  76. package/dist/src/tools/system-tools.js.map +1 -1
  77. package/dist/src/transports/http.d.ts +16 -2
  78. package/dist/src/transports/http.js +261 -59
  79. package/dist/src/transports/http.js.map +1 -1
  80. package/dist/src/transports/reverse.d.ts +23 -19
  81. package/dist/src/transports/reverse.js +130 -74
  82. package/dist/src/transports/reverse.js.map +1 -1
  83. package/dist/src/transports/stdio.d.ts +6 -2
  84. package/dist/src/transports/stdio.js +131 -19
  85. package/dist/src/transports/stdio.js.map +1 -1
  86. package/dist/src/utils/proxy.d.ts +3 -3
  87. package/dist/src/utils/proxy.js +84 -62
  88. package/dist/src/utils/proxy.js.map +1 -1
  89. package/dist/src/utils/server-activity.d.ts +6 -0
  90. package/dist/src/utils/server-activity.js +46 -0
  91. package/dist/src/utils/server-activity.js.map +1 -0
  92. package/dist/src/utils/server-lifecycle.d.ts +5 -0
  93. package/dist/src/utils/server-lifecycle.js +51 -0
  94. package/dist/src/utils/server-lifecycle.js.map +1 -0
  95. package/docs/file-manager.md +179 -0
  96. package/docs/terminal.md +66 -0
  97. package/package.json +40 -19
  98. package/dist/src/transports/fte-lifecycle.d.ts +0 -13
  99. package/dist/src/transports/fte-lifecycle.js +0 -76
  100. package/dist/src/transports/fte-lifecycle.js.map +0 -1
  101. package/dist/tests/docker-proxy.test.d.ts +0 -1
  102. package/dist/tests/docker-proxy.test.js +0 -395
  103. package/dist/tests/docker-proxy.test.js.map +0 -1
  104. package/dist/tests/file-write-queue.test.d.ts +0 -1
  105. package/dist/tests/file-write-queue.test.js +0 -105
  106. package/dist/tests/file-write-queue.test.js.map +0 -1
  107. package/dist/tests/fte-lifecycle.test.d.ts +0 -1
  108. package/dist/tests/fte-lifecycle.test.js +0 -118
  109. package/dist/tests/fte-lifecycle.test.js.map +0 -1
  110. package/dist/tests/lsp-client.test.d.ts +0 -1
  111. package/dist/tests/lsp-client.test.js +0 -52
  112. package/dist/tests/lsp-client.test.js.map +0 -1
  113. package/dist/tests/package-info.test.d.ts +0 -1
  114. package/dist/tests/package-info.test.js +0 -54
  115. package/dist/tests/package-info.test.js.map +0 -1
  116. package/dist/tests/proxy-no-proxy.test.d.ts +0 -1
  117. package/dist/tests/proxy-no-proxy.test.js +0 -156
  118. package/dist/tests/proxy-no-proxy.test.js.map +0 -1
  119. package/dist/tests/proxy.test.d.ts +0 -1
  120. package/dist/tests/proxy.test.js +0 -89
  121. package/dist/tests/proxy.test.js.map +0 -1
  122. package/dist/tests/reverse-reconnect.test.d.ts +0 -1
  123. package/dist/tests/reverse-reconnect.test.js +0 -89
  124. package/dist/tests/reverse-reconnect.test.js.map +0 -1
  125. package/dist/tests/security.test.d.ts +0 -1
  126. package/dist/tests/security.test.js +0 -21
  127. package/dist/tests/security.test.js.map +0 -1
  128. package/dist/tests/shell-tools.test.d.ts +0 -1
  129. package/dist/tests/shell-tools.test.js +0 -113
  130. package/dist/tests/shell-tools.test.js.map +0 -1
  131. package/dist/tests/test_files/test.d.ts +0 -1
  132. package/dist/tests/test_files/test.js +0 -4
  133. package/dist/tests/test_files/test.js.map +0 -1
@@ -0,0 +1,514 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import { createHash } from 'node:crypto';
3
+ import { fileURLToPath } from 'node:url';
4
+ import path from 'node:path';
5
+ import { z } from 'zod';
6
+ import { ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ReadResourceRequestSchema, SubscribeRequestSchema, UnsubscribeRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
7
+ import { FileError, fileError, fail, mimeType, utf8, relativePath, } from './file-core.js';
8
+ import { TransferManager } from './transfers.js';
9
+ import { APPS, DATA, FILES, TERMINAL, parse as parseExtension, operationId, supports, } from '../extensions/protocol.js';
10
+ import { FILE_MANAGER } from '../extensions/apps.js';
11
+ const RESOURCE_LIMIT = 256 * 1024;
12
+ const pathField = z.string();
13
+ const rootPath = { rootId: z.string().default('main'), path: pathField };
14
+ const expected = z.string().min(1).optional();
15
+ const params = {
16
+ roots: z.object({}).strict(),
17
+ list: z
18
+ .object({
19
+ ...rootPath,
20
+ path: pathField.default(''),
21
+ cursor: z.string().optional(),
22
+ limit: z.number().int().min(1).max(500).default(100),
23
+ })
24
+ .strict(),
25
+ stat: z
26
+ .object({ ...rootPath, includeVersion: z.boolean().default(false) })
27
+ .strict(),
28
+ readText: z.object(rootPath).strict(),
29
+ saveText: z
30
+ .object({
31
+ ...rootPath,
32
+ text: z.string(),
33
+ expectedVersion: z.string().min(1),
34
+ })
35
+ .strict(),
36
+ createFile: z
37
+ .object({ ...rootPath, text: z.string().default('') })
38
+ .strict(),
39
+ mkdir: z.object(rootPath).strict(),
40
+ move: z
41
+ .object({
42
+ rootId: z.string(),
43
+ from: pathField,
44
+ to: pathField,
45
+ expectedVersion: expected,
46
+ })
47
+ .strict(),
48
+ delete: z
49
+ .object({
50
+ ...rootPath,
51
+ recursive: z.boolean().default(false),
52
+ expectedVersion: expected,
53
+ })
54
+ .strict(),
55
+ };
56
+ function parse(schema, data) {
57
+ const parsed = schema.safeParse(data ?? {});
58
+ if (!parsed.success)
59
+ throw new FileError('INVALID_PARAMS', parsed.error.issues
60
+ .map((issue) => `${issue.path.join('.') || 'params'}: ${issue.message}`)
61
+ .join('; '), -32602);
62
+ return parsed.data;
63
+ }
64
+ function rpc(error) {
65
+ if (error instanceof McpError)
66
+ return error;
67
+ const e = fileError(error);
68
+ return new McpError(e.rpcCode, e.message, { code: e.code });
69
+ }
70
+ export function resourceUri(rootId, file) {
71
+ relativePath(file);
72
+ return `staff-file://${rootId}/${file.split('/').map(encodeURIComponent).join('/')}`;
73
+ }
74
+ function resource(uri) {
75
+ const match = /^staff-file:\/\/([a-z0-9-]+)\/(.*)$/.exec(uri);
76
+ if (!match)
77
+ throw new FileError('INVALID_URI', 'Invalid staff file resource URI', -32602);
78
+ let components;
79
+ try {
80
+ components = match[2]
81
+ .split('/')
82
+ .map((component) => decodeURIComponent(component));
83
+ }
84
+ catch {
85
+ throw new FileError('INVALID_URI', 'Invalid URI encoding', -32602);
86
+ }
87
+ // Decode exactly once, per component: encoded separators cannot create new
88
+ // components. Double-encoded '%' names remain literal filesystem names.
89
+ if (components.some((component) => component.includes('/')))
90
+ throw new FileError('INVALID_URI', 'Encoded separators are not accepted', -32602);
91
+ const file = relativePath(components.join('/'));
92
+ if (resourceUri(match[1], file) !== uri)
93
+ throw new FileError('INVALID_URI', 'Resource URI must use canonical component encoding', -32602);
94
+ return { rootId: match[1], file };
95
+ }
96
+ /** One instance per physical transport generation; no negotiation or handles survive reconnect. */
97
+ export class FileManagerSession {
98
+ server;
99
+ transfers;
100
+ initialized = false;
101
+ closed = false;
102
+ negotiated = new Set();
103
+ constructor(core, server, runtimeDirectory, requireData) {
104
+ this.server = server;
105
+ this.transfers = new TransferManager(core, runtimeDirectory, () => {
106
+ this.requireExtension();
107
+ requireData();
108
+ });
109
+ }
110
+ initialize() {
111
+ if (this.closed || this.initialized)
112
+ return;
113
+ for (const extension of [APPS, FILES, TERMINAL, DATA]) {
114
+ if (supports(this.server, extension))
115
+ this.negotiated.add(extension);
116
+ }
117
+ this.initialized = true;
118
+ }
119
+ supports(extension) {
120
+ return (!this.closed && this.initialized && this.negotiated.has(extension));
121
+ }
122
+ requireExtension(extension = FILES) {
123
+ if (!this.supports(extension))
124
+ fail('CAPABILITY_UNAVAILABLE', 'Extension version 1 is unavailable on this initialized session');
125
+ }
126
+ close() {
127
+ this.closed = true;
128
+ this.initialized = false;
129
+ return this.transfers.close();
130
+ }
131
+ }
132
+ /** Standard MCP resources work without creating optional extension sessions. */
133
+ export function registerFileResources(server, core, readApp) {
134
+ const protocol = server.server;
135
+ const subscriptions = new Set();
136
+ let closed = false;
137
+ let initialized = false;
138
+ const previousInitialized = protocol.oninitialized;
139
+ protocol.oninitialized = () => {
140
+ initialized = true;
141
+ previousInitialized?.();
142
+ };
143
+ const guarded = (handler) => async (request, extra) => {
144
+ try {
145
+ if (extra?.signal?.aborted)
146
+ fail('STALE_CONNECTION', 'Request connection closed');
147
+ return await handler(request);
148
+ }
149
+ catch (e) {
150
+ throw rpc(e);
151
+ }
152
+ };
153
+ const notify = (rootId, changedPath) => {
154
+ if (closed || !initialized)
155
+ return;
156
+ for (const uri of subscriptions) {
157
+ const entry = resource(uri);
158
+ if (entry.rootId !== rootId)
159
+ continue;
160
+ if (entry.file === changedPath ||
161
+ entry.file.startsWith(`${changedPath}/`) ||
162
+ entry.file === '' ||
163
+ changedPath.startsWith(`${entry.file}/`))
164
+ void server.server.sendResourceUpdated({ uri }).catch(() => { });
165
+ }
166
+ };
167
+ protocol.setRequestHandler(ListResourcesRequestSchema, guarded(async (request) => {
168
+ const entries = [];
169
+ for (const root of core.roots().roots) {
170
+ entries.push({
171
+ uri: resourceUri(root.rootId, ''),
172
+ name: root.name,
173
+ mimeType: 'application/json',
174
+ });
175
+ let cursor;
176
+ do {
177
+ const listing = await core.list(root.rootId, '', cursor, 500);
178
+ for (const child of listing.entries) {
179
+ if (child.type === 'file')
180
+ entries.push({
181
+ uri: resourceUri(root.rootId, child.path),
182
+ name: `${root.name}/${child.name}`,
183
+ mimeType: mimeType(child.path),
184
+ });
185
+ }
186
+ cursor = listing.nextCursor;
187
+ } while (cursor);
188
+ }
189
+ const version = createHash('sha256')
190
+ .update(JSON.stringify(entries))
191
+ .digest('hex');
192
+ let offset = 0;
193
+ if (request.params?.cursor) {
194
+ try {
195
+ const cursor = JSON.parse(Buffer.from(request.params.cursor, 'base64url').toString('utf8'));
196
+ if (cursor.version !== version ||
197
+ !Number.isSafeInteger(cursor.offset) ||
198
+ cursor.offset < 0 ||
199
+ cursor.offset >= entries.length)
200
+ fail('INVALID_CURSOR', 'Resource list changed; refresh');
201
+ offset = cursor.offset;
202
+ }
203
+ catch {
204
+ fail('INVALID_CURSOR', 'Invalid resource cursor; refresh');
205
+ }
206
+ }
207
+ return {
208
+ resources: entries.slice(offset, offset + 100),
209
+ ...(offset + 100 < entries.length
210
+ ? {
211
+ nextCursor: Buffer.from(JSON.stringify({ version, offset: offset + 100 })).toString('base64url'),
212
+ }
213
+ : {}),
214
+ };
215
+ }));
216
+ protocol.setRequestHandler(ListResourceTemplatesRequestSchema, guarded(async (request) => {
217
+ if (request.params?.cursor)
218
+ fail('INVALID_CURSOR', 'Resource templates have no further pages');
219
+ return {
220
+ resourceTemplates: core.roots().roots.map((root) => ({
221
+ uriTemplate: `staff-file://${root.rootId}/{+path}`,
222
+ name: `${root.name} files`,
223
+ description: 'Actual root-relative files (256 KiB maximum) or directory manifests. Encode each path component once.',
224
+ })),
225
+ };
226
+ }));
227
+ protocol.setRequestHandler(ReadResourceRequestSchema, guarded(async (request) => {
228
+ const uri = request.params.uri;
229
+ const app = await readApp?.(uri);
230
+ if (app)
231
+ return app;
232
+ const entry = resource(uri);
233
+ const full = await core.resolve(entry.rootId, entry.file);
234
+ if ((await fs.lstat(full)).isDirectory()) {
235
+ const listing = await core.list(entry.rootId, entry.file);
236
+ const text = JSON.stringify({
237
+ rootId: entry.rootId,
238
+ path: entry.file,
239
+ ...listing,
240
+ });
241
+ if (Buffer.byteLength(text) > RESOURCE_LIMIT)
242
+ fail('TOO_LARGE', 'Resource limit is 256 KiB');
243
+ return {
244
+ contents: [{ uri, mimeType: 'application/json', text }],
245
+ };
246
+ }
247
+ const bytes = await core.readBytes(entry.rootId, entry.file, RESOURCE_LIMIT);
248
+ const type = mimeType(entry.file);
249
+ let text;
250
+ try {
251
+ text = utf8(bytes);
252
+ }
253
+ catch (e) {
254
+ if (!(e instanceof FileError && e.code === 'BINARY_FILE'))
255
+ throw e;
256
+ }
257
+ const textual = type.startsWith('text/') ||
258
+ ['application/json', 'image/svg+xml'].includes(type);
259
+ if (textual && text === undefined)
260
+ fail('BINARY_FILE', 'Text resource is not valid UTF-8');
261
+ const binary = type.startsWith('image/') && type !== 'image/svg+xml';
262
+ return {
263
+ contents: [
264
+ text !== undefined && !binary
265
+ ? {
266
+ uri,
267
+ mimeType: type === 'application/octet-stream'
268
+ ? 'text/plain'
269
+ : type,
270
+ text,
271
+ }
272
+ : {
273
+ uri,
274
+ mimeType: type,
275
+ blob: bytes.toString('base64'),
276
+ },
277
+ ],
278
+ };
279
+ }));
280
+ protocol.setRequestHandler(SubscribeRequestSchema, guarded(async (request) => {
281
+ const entry = resource(request.params.uri);
282
+ await core.resolve(entry.rootId, entry.file);
283
+ if (closed)
284
+ fail('STALE_CONNECTION', 'Resource subscription connection closed');
285
+ subscriptions.add(request.params.uri);
286
+ return {};
287
+ }));
288
+ protocol.setRequestHandler(UnsubscribeRequestSchema, guarded(async (request) => {
289
+ resource(request.params.uri);
290
+ subscriptions.delete(request.params.uri);
291
+ return {};
292
+ }));
293
+ const connect = server.connect.bind(server);
294
+ server.connect = async (transport) => {
295
+ closed = false;
296
+ initialized = false;
297
+ core.listeners.add(notify);
298
+ const cleanup = () => {
299
+ closed = true;
300
+ initialized = false;
301
+ subscriptions.clear();
302
+ core.listeners.delete(notify);
303
+ };
304
+ const previousClose = transport.onclose;
305
+ transport.onclose = () => {
306
+ cleanup();
307
+ previousClose?.();
308
+ };
309
+ try {
310
+ await connect(transport);
311
+ }
312
+ catch (error) {
313
+ cleanup();
314
+ throw error;
315
+ }
316
+ if (server.server.transport !== transport)
317
+ cleanup();
318
+ };
319
+ }
320
+ export function registerFileManager(server, core, runtimeDirectory) {
321
+ let session;
322
+ const protocol = server.server;
323
+ const previousInitialized = protocol.oninitialized;
324
+ protocol.oninitialized = () => {
325
+ session?.initialize();
326
+ previousInitialized?.();
327
+ };
328
+ function current() {
329
+ if (!session || session.closed)
330
+ fail('EXTENSION_NOT_NEGOTIATED', 'No initialized file-manager session');
331
+ return session;
332
+ }
333
+ function requireExtension(extension = FILES) {
334
+ current().requireExtension(extension);
335
+ }
336
+ const guarded = (handler) => async (request, extra) => {
337
+ try {
338
+ if (extra?.signal?.aborted)
339
+ fail('STALE_CONNECTION', 'Request connection closed');
340
+ return await handler(request);
341
+ }
342
+ catch (e) {
343
+ throw rpc(e);
344
+ }
345
+ };
346
+ async function extensionCall(method, input) {
347
+ requireExtension();
348
+ // Separate parse calls preserve the exact shape/types for every public method.
349
+ switch (method) {
350
+ case 'roots':
351
+ parse(params.roots, input);
352
+ return core.roots();
353
+ case 'list': {
354
+ const p = parse(params.list, input);
355
+ return core.list(p.rootId, p.path, p.cursor, p.limit);
356
+ }
357
+ case 'stat': {
358
+ const p = parse(params.stat, input);
359
+ return core.stat(p.rootId, p.path, p.includeVersion);
360
+ }
361
+ case 'readText': {
362
+ const p = parse(params.readText, input);
363
+ return core.readText(p.rootId, p.path);
364
+ }
365
+ case 'saveText': {
366
+ const p = parse(params.saveText, input);
367
+ return core.saveText(p.rootId, p.path, p.text, p.expectedVersion);
368
+ }
369
+ case 'createFile': {
370
+ const p = parse(params.createFile, input);
371
+ return core.createFile(p.rootId, p.path, p.text);
372
+ }
373
+ case 'mkdir': {
374
+ const p = parse(params.mkdir, input);
375
+ return core.mkdir(p.rootId, p.path);
376
+ }
377
+ case 'move': {
378
+ const p = parse(params.move, input);
379
+ return core.move(p.rootId, p.from, p.to, p.expectedVersion);
380
+ }
381
+ case 'delete': {
382
+ const p = parse(params.delete, input);
383
+ return core.delete(p.rootId, p.path, p.recursive, p.expectedVersion);
384
+ }
385
+ }
386
+ }
387
+ for (const method of Object.keys(params)) {
388
+ protocol.setRequestHandler(z.object({
389
+ method: z.literal(`${FILE_MANAGER}/${method}`),
390
+ params: z.unknown().optional(),
391
+ }), guarded(async (request) => extensionCall(method, request.params)));
392
+ }
393
+ const digest = z.string().regex(/^[a-f0-9]{64}$/);
394
+ const transferParams = {
395
+ roots: z.object({}).strict(),
396
+ resolve: z.object({ uri: z.string().min(1).max(8192) }).strict(),
397
+ stat: z
398
+ .object({
399
+ rootId: z.string().min(1),
400
+ path: z.string().min(1),
401
+ })
402
+ .strict(),
403
+ prepare: z
404
+ .object({
405
+ operationId,
406
+ mode: z.enum(['read', 'write']),
407
+ rootId: z.string().min(1),
408
+ path: z.string().min(1),
409
+ size: z
410
+ .number()
411
+ .int()
412
+ .nonnegative()
413
+ .safe()
414
+ .max(100 * 1024 * 1024)
415
+ .optional(),
416
+ sha256: digest.optional(),
417
+ overwrite: z.boolean().optional(),
418
+ expectedVersion: expected,
419
+ })
420
+ .strict(),
421
+ status: z.object({ operationId }).strict(),
422
+ commit: z
423
+ .object({
424
+ operationId,
425
+ transferId: z.string().min(1),
426
+ sha256: digest,
427
+ })
428
+ .strict(),
429
+ cancel: z.object({ operationId }).strict(),
430
+ release: z.object({ operationId }).strict(),
431
+ renew: z.object({ operationId }).strict(),
432
+ };
433
+ async function resolveUri(uri) {
434
+ let url;
435
+ let full;
436
+ try {
437
+ url = new URL(uri);
438
+ if (url.protocol !== 'file:' ||
439
+ (url.hostname && url.hostname !== 'localhost') ||
440
+ url.search ||
441
+ url.hash ||
442
+ url.username ||
443
+ url.password ||
444
+ url.port)
445
+ fail('INVALID_PARAMS', 'Expected a local file URI');
446
+ full = fileURLToPath(url);
447
+ }
448
+ catch {
449
+ return fail('INVALID_PARAMS', 'Expected a local file URI');
450
+ }
451
+ // Longest matching root is deterministic for overlapping allowed directories.
452
+ const roots = core
453
+ .roots()
454
+ .roots.map((root) => core.root(root.rootId))
455
+ .sort((a, b) => b.directory.length - a.directory.length);
456
+ for (const root of roots) {
457
+ const relative = path.relative(root.directory, full);
458
+ if (path.isAbsolute(relative) ||
459
+ relative === '..' ||
460
+ relative.startsWith(`..${path.sep}`))
461
+ continue;
462
+ const file = relative.split(path.sep).join('/');
463
+ // Resolve again through FileCore: no relaxation of symlink/private-area checks.
464
+ await core.resolve(root.rootId, file, { missing: true });
465
+ return { rootId: root.rootId, path: file };
466
+ }
467
+ return fail('OUTSIDE_ROOT', 'File URI is outside allowed roots');
468
+ }
469
+ for (const method of Object.keys(transferParams)) {
470
+ protocol.setRequestHandler(z.object({
471
+ method: z.literal(`${FILES}/v1/${method}`),
472
+ params: z.unknown().optional(),
473
+ }), guarded(async (request) => {
474
+ requireExtension();
475
+ const transfers = current().transfers;
476
+ switch (method) {
477
+ case 'roots':
478
+ parseExtension(transferParams.roots, request.params);
479
+ return core.roots();
480
+ case 'resolve':
481
+ return resolveUri(parseExtension(transferParams.resolve, request.params).uri);
482
+ case 'stat': {
483
+ const p = parseExtension(transferParams.stat, request.params);
484
+ const stat = await core.stat(p.rootId, p.path, true);
485
+ if (!stat.operations.read || stat.version === undefined)
486
+ fail('NOT_FILE', 'Expected a regular file');
487
+ return { version: stat.version };
488
+ }
489
+ case 'prepare':
490
+ return transfers.prepare(parseExtension(transferParams.prepare, request.params));
491
+ case 'status':
492
+ return transfers.status(parseExtension(transferParams.status, request.params).operationId);
493
+ case 'commit': {
494
+ const p = parseExtension(transferParams.commit, request.params);
495
+ return transfers.commit(p.operationId, p.transferId, p.sha256);
496
+ }
497
+ case 'renew':
498
+ return transfers.renew(parseExtension(transferParams.renew, request.params)
499
+ .operationId);
500
+ case 'cancel':
501
+ return transfers.release(parseExtension(transferParams.cancel, request.params).operationId);
502
+ case 'release':
503
+ return transfers.release(parseExtension(transferParams.release, request.params).operationId);
504
+ }
505
+ }));
506
+ }
507
+ return (requireData) => {
508
+ if (session && !session.closed)
509
+ throw new Error('Previous file-manager transport is still connected');
510
+ session = new FileManagerSession(core, server, runtimeDirectory, requireData);
511
+ return session;
512
+ };
513
+ }
514
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/file-manager/extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ export declare const TEXT_LIMIT: number;
2
+ export declare const FILE_LIMIT: number;
3
+ export declare const CHUNK_LIMIT: number;
4
+ export declare class FileError extends Error {
5
+ code: string;
6
+ rpcCode: number;
7
+ constructor(code: string, message: string, rpcCode?: number);
8
+ }
9
+ export declare function fail(code: string, message: string): never;
10
+ export declare function fileError(error: unknown): FileError;
11
+ export declare class Mutex {
12
+ private tail;
13
+ run<T>(fn: () => Promise<T>): Promise<T>;
14
+ }
15
+ export interface Root {
16
+ rootId: string;
17
+ name: string;
18
+ readOnly: boolean;
19
+ directory: string;
20
+ }
21
+ export interface Entry {
22
+ name: string;
23
+ path: string;
24
+ type: 'file' | 'directory' | 'symlink';
25
+ size: number;
26
+ mtime: string;
27
+ }
28
+ export declare function relativePath(value: string): string;
29
+ export declare function mimeType(file: string): string;
30
+ export declare function utf8(bytes: Uint8Array): string;
31
+ export declare function secureDirectory(directory: string): Promise<void>;
32
+ export declare class FileCore {
33
+ readonly mutex: Mutex;
34
+ private readonly changes;
35
+ private readonly publications;
36
+ private readonly privateDirectories;
37
+ readonly listeners: Set<(rootId: string, changedPath: string) => void>;
38
+ constructor(roots: Root[], privateDirectory?: string, shared?: FileCore, privateDirectoryAliases?: string[]);
39
+ private readonly rootMap;
40
+ roots(): {
41
+ roots: {
42
+ rootId: string;
43
+ name: string;
44
+ readOnly: boolean;
45
+ }[];
46
+ };
47
+ root(id: string, write?: boolean): Root;
48
+ resolve(rootId: string, input: string, options?: {
49
+ write?: boolean;
50
+ missing?: boolean;
51
+ allowLeafLink?: boolean;
52
+ }): Promise<string>;
53
+ private changed;
54
+ private notifyChanged;
55
+ private checkPrivate;
56
+ private protectRoots;
57
+ /** Standard tools retain their path and result contracts, but share the extension's lock. */
58
+ validateToolPath(full: string, missingParents?: boolean): Promise<string>;
59
+ withWriteLock<T>(task: () => Promise<T>): Promise<T>;
60
+ toolWrite<T>(full: string, task: () => Promise<T>, missingParents?: boolean): Promise<T>;
61
+ private hashFile;
62
+ private version;
63
+ stat(rootId: string, file: string, includeVersion?: boolean): Promise<{
64
+ readOnly: boolean;
65
+ mimeType: string;
66
+ operations: {
67
+ read: boolean;
68
+ write: boolean;
69
+ delete: boolean;
70
+ move: boolean;
71
+ };
72
+ version?: string | undefined;
73
+ path: string;
74
+ type: string;
75
+ size: number;
76
+ mtime: string;
77
+ }>;
78
+ list(rootId: string, file: string, cursor?: string, limit?: number): Promise<{
79
+ nextCursor?: string | undefined;
80
+ entries: Entry[];
81
+ }>;
82
+ readBytes(rootId: string, file: string, max?: number): Promise<Buffer<ArrayBuffer>>;
83
+ readText(rootId: string, file: string, max?: number): Promise<{
84
+ text: string;
85
+ encoding: string;
86
+ version: string;
87
+ size: number;
88
+ }>;
89
+ checkDestination(rootId: string, file: string, overwrite?: boolean, expectedVersion?: string): Promise<{
90
+ full: string;
91
+ exists: boolean;
92
+ mode: number | undefined;
93
+ }>;
94
+ private atomic;
95
+ saveText(rootId: string, file: string, text: string, expectedVersion: string): Promise<{
96
+ path: string;
97
+ version: string;
98
+ size: number;
99
+ }>;
100
+ createFile(rootId: string, file: string, text?: string): Promise<{
101
+ path: string;
102
+ version: string;
103
+ size: number;
104
+ }>;
105
+ commitUpload(rootId: string, file: string, source: string, overwrite: boolean, expectedVersion?: string, sourceVersion?: string): Promise<{
106
+ path: string;
107
+ version: string;
108
+ size: number;
109
+ }>;
110
+ mkdir(rootId: string, file: string): Promise<{
111
+ path: string;
112
+ version: string;
113
+ }>;
114
+ move(rootId: string, from: string, to: string, expectedVersion?: string): Promise<{
115
+ path: string;
116
+ version: string;
117
+ }>;
118
+ private validateTree;
119
+ delete(rootId: string, file: string, recursive?: boolean, expectedVersion?: string): Promise<{
120
+ deleted: boolean;
121
+ path: string;
122
+ }>;
123
+ snapshot(rootId: string, file: string, destination: string): Promise<{
124
+ name: string;
125
+ size: number;
126
+ version: string;
127
+ }>;
128
+ }