@yu_robotics/remote-cli 1.6.111 → 1.6.113

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 (46) hide show
  1. package/dist/client/MessageHandler.d.ts +4 -0
  2. package/dist/client/MessageHandler.d.ts.map +1 -1
  3. package/dist/client/MessageHandler.js +113 -9
  4. package/dist/client/MessageHandler.js.map +1 -1
  5. package/dist/client/WebSocketClient.d.ts +5 -0
  6. package/dist/client/WebSocketClient.d.ts.map +1 -1
  7. package/dist/client/WebSocketClient.js +37 -3
  8. package/dist/client/WebSocketClient.js.map +1 -1
  9. package/dist/commands/files.d.ts +5 -0
  10. package/dist/commands/files.d.ts.map +1 -0
  11. package/dist/commands/files.js +30 -0
  12. package/dist/commands/files.js.map +1 -0
  13. package/dist/commands/start.d.ts.map +1 -1
  14. package/dist/commands/start.js +4 -1
  15. package/dist/commands/start.js.map +1 -1
  16. package/dist/commands/status.d.ts.map +1 -1
  17. package/dist/commands/status.js +4 -1
  18. package/dist/commands/status.js.map +1 -1
  19. package/dist/files/DeviceIdentity.d.ts +10 -0
  20. package/dist/files/DeviceIdentity.d.ts.map +1 -0
  21. package/dist/files/DeviceIdentity.js +82 -0
  22. package/dist/files/DeviceIdentity.js.map +1 -0
  23. package/dist/files/DocumentExtractor.d.ts +4 -0
  24. package/dist/files/DocumentExtractor.d.ts.map +1 -0
  25. package/dist/files/DocumentExtractor.js +59 -0
  26. package/dist/files/DocumentExtractor.js.map +1 -0
  27. package/dist/files/DocumentWorker.d.ts +3 -0
  28. package/dist/files/DocumentWorker.d.ts.map +1 -0
  29. package/dist/files/DocumentWorker.js +359 -0
  30. package/dist/files/DocumentWorker.js.map +1 -0
  31. package/dist/files/FileIO.d.ts +21 -0
  32. package/dist/files/FileIO.d.ts.map +1 -0
  33. package/dist/files/FileIO.js +134 -0
  34. package/dist/files/FileIO.js.map +1 -0
  35. package/dist/files/FileInbox.d.ts +60 -0
  36. package/dist/files/FileInbox.d.ts.map +1 -0
  37. package/dist/files/FileInbox.js +426 -0
  38. package/dist/files/FileInbox.js.map +1 -0
  39. package/dist/index.js +16 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/types/config.d.ts +3 -0
  42. package/dist/types/config.d.ts.map +1 -1
  43. package/dist/types/config.js.map +1 -1
  44. package/dist/types/index.d.ts +5 -3
  45. package/dist/types/index.d.ts.map +1 -1
  46. package/package.json +4 -1
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.parseDocument = parseDocument;
40
+ const worker_threads_1 = require("worker_threads");
41
+ const fs_1 = __importStar(require("fs"));
42
+ const path_1 = __importDefault(require("path"));
43
+ const url_1 = require("url");
44
+ const OUTPUT_BYTES = 2 * 1024 * 1024;
45
+ const XML_BYTES = 16 * 1024 * 1024;
46
+ const ZIP_BYTES = 40 * 1024 * 1024;
47
+ const LIMIT = Symbol('output limit');
48
+ class Output {
49
+ chunks = [];
50
+ bytes = 0;
51
+ add(value) {
52
+ const encoded = Buffer.from(value);
53
+ const remaining = OUTPUT_BYTES - this.bytes;
54
+ if (encoded.length > remaining) {
55
+ // Streaming decode avoids introducing a replacement character at the boundary.
56
+ this.chunks.push(new TextDecoder().decode(encoded.subarray(0, remaining), { stream: true }));
57
+ this.bytes = OUTPUT_BYTES;
58
+ throw LIMIT;
59
+ }
60
+ this.chunks.push(value);
61
+ this.bytes += encoded.length;
62
+ }
63
+ text() { return this.chunks.join(''); }
64
+ }
65
+ function parseXml(xml, handlers) {
66
+ if (/<!DOCTYPE|<!ENTITY/i.test(xml))
67
+ throw new Error('DTD and entity declarations are not supported.');
68
+ const parser = require('sax').parser(true, { strictEntities: true });
69
+ let depth = 0;
70
+ let nodes = 0;
71
+ parser.onopentag = (tag) => {
72
+ if (++depth > 100 || ++nodes > 300_000)
73
+ throw new Error('XML structure exceeds the parser limit.');
74
+ handlers.open?.(tag);
75
+ };
76
+ parser.onclosetag = (tag) => { handlers.close?.(tag); depth--; };
77
+ parser.ontext = (text) => handlers.text?.(text);
78
+ parser.oncdata = () => { throw new Error('CDATA is not supported in office documents.'); };
79
+ parser.write(xml).close();
80
+ }
81
+ async function zipEntries(data) {
82
+ const yauzl = require('yauzl');
83
+ const zip = await new Promise((resolve, reject) => yauzl.fromBuffer(data, { lazyEntries: true, validateEntrySizes: true, strictFileNames: true }, (error, value) => error ? reject(error) : resolve(value)));
84
+ const entries = new Map();
85
+ let expanded = 0;
86
+ await new Promise((resolve, reject) => {
87
+ zip.on('error', reject);
88
+ zip.on('end', resolve);
89
+ zip.on('entry', (entry) => {
90
+ expanded += entry.uncompressedSize;
91
+ if (entries.size >= 2_000 || expanded > ZIP_BYTES || entry.isEncrypted()
92
+ || entries.has(entry.fileName) || (entry.externalFileAttributes >>> 16 & 0o170000) === 0o120000) {
93
+ zip.close();
94
+ reject(new Error('Office archive is encrypted, duplicated, symlinked, or exceeds expansion limits.'));
95
+ return;
96
+ }
97
+ entries.set(entry.fileName, entry);
98
+ zip.readEntry();
99
+ });
100
+ zip.readEntry();
101
+ });
102
+ let readBytes = 0;
103
+ return {
104
+ names: [...entries.keys()], close: () => zip.close(),
105
+ async read(name) {
106
+ const entry = entries.get(name);
107
+ if (!entry || entry.uncompressedSize > XML_BYTES)
108
+ throw new Error('Required office XML is missing or exceeds 16 MiB.');
109
+ const stream = await new Promise((resolve, reject) => zip.openReadStream(entry, (error, value) => error ? reject(error) : resolve(value)));
110
+ const chunks = [];
111
+ let length = 0;
112
+ for await (const chunk of stream) {
113
+ length += chunk.length;
114
+ readBytes += chunk.length;
115
+ if (length > XML_BYTES || readBytes > ZIP_BYTES) {
116
+ stream.destroy();
117
+ throw new Error('Office archive exceeded the actual expansion limit.');
118
+ }
119
+ chunks.push(chunk);
120
+ }
121
+ return new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks));
122
+ },
123
+ };
124
+ }
125
+ async function office(data, kind) {
126
+ const zip = await zipEntries(data);
127
+ const output = new Output();
128
+ let partial = false;
129
+ let detail = '';
130
+ try {
131
+ if (zip.names.some(name => /vbaProject\.bin$/i.test(name)))
132
+ throw new Error('Macro-enabled office content is not supported.');
133
+ if (kind === '.docx') {
134
+ let inText = false;
135
+ parseXml(await zip.read('word/document.xml'), {
136
+ open: tag => { if (tag.name === 'w:t')
137
+ inText = true; if (tag.name === 'w:tab')
138
+ output.add('\t'); if (tag.name === 'w:br')
139
+ output.add('\n'); },
140
+ close: name => { if (name === 'w:t')
141
+ inText = false; if (name === 'w:p')
142
+ output.add('\n'); if (name === 'w:tc')
143
+ output.add('\t'); },
144
+ text: text => { if (inText)
145
+ output.add(text); },
146
+ });
147
+ partial = zip.names.some(name => /^word\/(header|footer|footnotes|endnotes|comments)/.test(name));
148
+ detail = 'DOCX main document text only; layout, images, headers, footers, comments and notes are not extracted.';
149
+ }
150
+ else {
151
+ const sheets = [];
152
+ parseXml(await zip.read('xl/workbook.xml'), { open: tag => {
153
+ if (tag.name.split(':').pop() === 'sheet')
154
+ sheets.push({ name: tag.attributes.name, id: tag.attributes['r:id'] });
155
+ } });
156
+ const targets = new Map();
157
+ parseXml(await zip.read('xl/_rels/workbook.xml.rels'), { open: tag => {
158
+ if (tag.attributes.TargetMode === 'External')
159
+ return;
160
+ const target = tag.attributes.Target;
161
+ if (typeof target === 'string') {
162
+ const normalized = target.startsWith('/xl/') ? target.slice(1) : path_1.default.posix.normalize(`xl/${target}`);
163
+ if (/^xl\/worksheets\/[a-zA-Z0-9_-]+\.xml$/.test(normalized))
164
+ targets.set(tag.attributes.Id, normalized);
165
+ }
166
+ } });
167
+ const shared = [];
168
+ let sharedText = '';
169
+ let inText = false;
170
+ let sharedBytes = 0;
171
+ if (zip.names.includes('xl/sharedStrings.xml'))
172
+ parseXml(await zip.read('xl/sharedStrings.xml'), {
173
+ open: tag => { const name = tag.name.split(':').pop(); if (name === 'si')
174
+ sharedText = ''; if (name === 't')
175
+ inText = true; },
176
+ close: tag => {
177
+ const name = tag.split(':').pop();
178
+ if (name === 't')
179
+ inText = false;
180
+ if (name === 'si') {
181
+ sharedBytes += Buffer.byteLength(sharedText);
182
+ if (sharedBytes > OUTPUT_BYTES || shared.length >= 50_000)
183
+ throw new Error('Spreadsheet shared strings exceed the parser limit.');
184
+ shared.push(sharedText);
185
+ }
186
+ },
187
+ text: text => { if (inText)
188
+ sharedText += text; },
189
+ });
190
+ let cells = 0;
191
+ if (sheets.length > 50)
192
+ partial = true;
193
+ for (const sheet of sheets.slice(0, 50)) {
194
+ const target = targets.get(sheet.id);
195
+ if (!target) {
196
+ partial = true;
197
+ continue;
198
+ }
199
+ output.add(`Sheet: ${JSON.stringify(sheet.name)}\n`);
200
+ let address = '';
201
+ let type = '';
202
+ let value = '';
203
+ let capture = false;
204
+ let formula = false;
205
+ parseXml(await zip.read(target), {
206
+ open: tag => {
207
+ const name = tag.name.split(':').pop();
208
+ if (name === 'c') {
209
+ address = tag.attributes.r ?? '?';
210
+ type = tag.attributes.t;
211
+ value = '';
212
+ formula = false;
213
+ }
214
+ if (name === 'v' || name === 't')
215
+ capture = true;
216
+ if (name === 'f')
217
+ formula = true;
218
+ },
219
+ text: text => { if (capture)
220
+ value += text; },
221
+ close: tag => {
222
+ const name = tag.split(':').pop();
223
+ if (name === 'v' || name === 't')
224
+ capture = false;
225
+ if (name === 'c') {
226
+ if (++cells > 10_000)
227
+ throw LIMIT;
228
+ const text = type === 's' ? shared[Number(value)] ?? '[unavailable shared string]' : value;
229
+ output.add(`${address}\t${text}${formula ? ' [cached formula value; not recalculated]' : ''}\n`);
230
+ }
231
+ },
232
+ });
233
+ }
234
+ detail = 'XLSX values with sheet names and cell addresses. Formulas use cached values only; external links, macros, charts and formatting are not evaluated.';
235
+ }
236
+ }
237
+ catch (error) {
238
+ if (error !== LIMIT)
239
+ throw error;
240
+ partial = true;
241
+ detail += ' Extraction stopped at the 2 MiB output or 10,000 cell limit.';
242
+ }
243
+ finally {
244
+ zip.close();
245
+ }
246
+ return { status: partial ? 'partial' : 'parsed', text: output.text(), detail: detail || 'Partial office text extraction.' };
247
+ }
248
+ async function pdf(data) {
249
+ // Native dynamic import is required for PDF.js ESM under the CommonJS build.
250
+ const nativeImport = new Function('url', 'return import(url)');
251
+ const pdfjs = await nativeImport((0, url_1.pathToFileURL)(require.resolve('pdfjs-dist/legacy/build/pdf.mjs')).href);
252
+ const task = pdfjs.getDocument({ data: new Uint8Array(data), isEvalSupported: false, disableFontFace: true,
253
+ useSystemFonts: false, disableAutoFetch: true, disableStream: true, useWorkerFetch: false });
254
+ // With no password callback, PDF.js rejects promptly with PasswordException.
255
+ const document = await task.promise;
256
+ const output = new Output();
257
+ let partial = document.numPages > 100;
258
+ let characters = 0;
259
+ try {
260
+ for (let index = 1; index <= Math.min(document.numPages, 100); index++) {
261
+ output.add(`Page ${index}\n`);
262
+ const page = await document.getPage(index);
263
+ const reader = page.streamTextContent().getReader();
264
+ try {
265
+ for (;;) {
266
+ const { value, done } = await reader.read();
267
+ if (done)
268
+ break;
269
+ for (const item of value.items)
270
+ if (typeof item.str === 'string') {
271
+ characters += item.str.trim().length;
272
+ output.add(item.str + (item.hasEOL ? '\n' : ' '));
273
+ }
274
+ }
275
+ }
276
+ finally {
277
+ await reader.cancel();
278
+ page.cleanup();
279
+ }
280
+ output.add('\n');
281
+ }
282
+ }
283
+ catch (error) {
284
+ if (error !== LIMIT)
285
+ throw error;
286
+ partial = true;
287
+ }
288
+ finally {
289
+ await document.destroy();
290
+ }
291
+ if (!characters)
292
+ return { status: 'unsupported', detail: 'No extractable PDF text was found. Scanned PDFs require OCR, which is not included.' };
293
+ return { status: partial ? 'partial' : 'parsed', text: output.text(), detail: `${partial ? 'Partial PDF extraction (100 pages / 2 MiB maximum).' : 'PDF text extracted with page numbers.'} Images, forms, annotations and layout are not interpreted.` };
294
+ }
295
+ async function parseDocument(filename, name) {
296
+ const handle = await fs_1.default.promises.open(filename, fs_1.constants.O_RDONLY | fs_1.constants.O_NOFOLLOW);
297
+ let data;
298
+ try {
299
+ const stat = await handle.stat();
300
+ if (!stat.isFile() || stat.size > 20 * 1024 * 1024)
301
+ throw new Error('Invalid parser input size.');
302
+ const buffer = Buffer.alloc(20 * 1024 * 1024 + 1);
303
+ let bytesRead = 0;
304
+ while (bytesRead < buffer.length) {
305
+ const chunk = await handle.read(buffer, bytesRead, buffer.length - bytesRead, bytesRead);
306
+ if (!chunk.bytesRead)
307
+ break;
308
+ bytesRead += chunk.bytesRead;
309
+ }
310
+ if (bytesRead > 20 * 1024 * 1024)
311
+ throw new Error('Invalid parser input size.');
312
+ data = buffer.subarray(0, bytesRead);
313
+ }
314
+ finally {
315
+ await handle.close();
316
+ }
317
+ const ext = path_1.default.extname(name).toLowerCase();
318
+ if (ext === '.pdf')
319
+ return pdf(data);
320
+ if (ext === '.docx' || ext === '.xlsx')
321
+ return office(data, ext);
322
+ const textTypes = new Set(['.txt', '.md', '.csv', '.json', '.jsonl', '.yaml', '.yml', '.log', '.xml', '.html', '.css', '.js', '.ts', '.py', '.c', '.cpp', '.h', '.rs', '.go', '.sh', '.toml', '.ini', '.sql']);
323
+ if (!textTypes.has(ext))
324
+ return { status: 'unsupported', detail: 'Original saved. No built-in parser for this file type; automatic archive extraction, OCR and legacy Office formats are not supported.' };
325
+ let partial = data.length > OUTPUT_BYTES;
326
+ const sample = data.subarray(0, OUTPUT_BYTES);
327
+ const encoding = sample[0] === 0xff && sample[1] === 0xfe ? 'utf-16le' : sample[0] === 0xfe && sample[1] === 0xff ? 'utf-16be' : 'utf-8';
328
+ const text = new TextDecoder(encoding, { fatal: true }).decode(sample, { stream: partial });
329
+ if (text.includes('\u0000'))
330
+ return { status: 'unsupported', detail: 'This file appears to contain binary data. Original saved without a text preview.' };
331
+ const output = new Output();
332
+ try {
333
+ output.add(text);
334
+ }
335
+ catch (error) {
336
+ if (error !== LIMIT)
337
+ throw error;
338
+ partial = true;
339
+ }
340
+ return { status: partial ? 'partial' : 'parsed', text: output.text(), detail: `${encoding} text${partial ? ' truncated to a bounded 2 MiB preview; the complete original is retained' : ' extracted'}.` };
341
+ }
342
+ if (!worker_threads_1.isMainThread && worker_threads_1.workerData?.kind === 'remote-cli-document') {
343
+ // These guards prevent parser-initiated network requests; this is not an OS sandbox.
344
+ const deny = () => { throw new Error('Document parser network access is disabled.'); };
345
+ for (const name of ['http', 'https']) {
346
+ const module = require(name);
347
+ module.request = deny;
348
+ module.get = deny;
349
+ }
350
+ const net = require('net');
351
+ net.connect = deny;
352
+ net.createConnection = deny;
353
+ net.Socket.prototype.connect = deny;
354
+ globalThis.fetch = async () => { throw new Error('Document parser network access is disabled.'); };
355
+ void parseDocument(worker_threads_1.workerData.filename, worker_threads_1.workerData.name).then(result => worker_threads_1.parentPort.postMessage(result), error => {
356
+ worker_threads_1.parentPort.postMessage({ error: error instanceof Error ? error.message.slice(0, 300) : 'Document parsing failed.' });
357
+ });
358
+ }
359
+ //# sourceMappingURL=DocumentWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentWorker.js","sourceRoot":"","sources":["../../src/files/DocumentWorker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Readable } from 'stream';
2
+ export declare const FILE_MAX_BYTES: number;
3
+ export declare const FILE_ID: RegExp;
4
+ export declare const FILE_TOTAL_MS = 120000;
5
+ export declare const FILE_IDLE_MS = 20000;
6
+ export declare function fileLimit(value?: number): number;
7
+ export declare function displayName(value: unknown): string;
8
+ /** Every directory and filename is owned and generated by this feature. */
9
+ export declare function privateDirectory(directory: string): Promise<void>;
10
+ export declare function atomicJson(filename: string, value: unknown): Promise<void>;
11
+ /** The limit applies to actual bytes, independent of headers and advertised size. */
12
+ export declare function saveStream(source: Readable, filename: string, maxBytes: number, signal: AbortSignal, expected?: {
13
+ size: number;
14
+ sha256: string;
15
+ }): Promise<{
16
+ size: number;
17
+ sha256: string;
18
+ }>;
19
+ export declare function readPrivateJson(filename: string): Promise<any>;
20
+ export declare function readOwnedFile(filename: string): Readable;
21
+ //# sourceMappingURL=FileIO.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileIO.d.ts","sourceRoot":"","sources":["../../src/files/FileIO.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAa,MAAM,QAAQ,CAAC;AAG7C,eAAO,MAAM,cAAc,QAAmB,CAAC;AAC/C,eAAO,MAAM,OAAO,QAAmB,CAAC;AACxC,eAAO,MAAM,aAAa,SAAU,CAAC;AACrC,eAAO,MAAM,YAAY,QAAS,CAAC;AAEnC,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAElD;AAED,2EAA2E;AAC3E,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhF;AAED,qFAAqF;AACrF,wBAAsB,UAAU,CAC9B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EACzE,QAAQ,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAyC3C;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAepE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAExD"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FILE_IDLE_MS = exports.FILE_TOTAL_MS = exports.FILE_ID = exports.FILE_MAX_BYTES = void 0;
7
+ exports.fileLimit = fileLimit;
8
+ exports.displayName = displayName;
9
+ exports.privateDirectory = privateDirectory;
10
+ exports.atomicJson = atomicJson;
11
+ exports.saveStream = saveStream;
12
+ exports.readPrivateJson = readPrivateJson;
13
+ exports.readOwnedFile = readOwnedFile;
14
+ const promises_1 = __importDefault(require("fs/promises"));
15
+ const fs_1 = require("fs");
16
+ const path_1 = __importDefault(require("path"));
17
+ const crypto_1 = require("crypto");
18
+ const stream_1 = require("stream");
19
+ const promises_2 = require("stream/promises");
20
+ exports.FILE_MAX_BYTES = 20 * 1024 * 1024;
21
+ exports.FILE_ID = /^[a-f0-9]{64}$/;
22
+ exports.FILE_TOTAL_MS = 120_000;
23
+ exports.FILE_IDLE_MS = 20_000;
24
+ function fileLimit(value) {
25
+ if (value === undefined)
26
+ return exports.FILE_MAX_BYTES;
27
+ if (!Number.isSafeInteger(value) || value <= 0 || value > exports.FILE_MAX_BYTES)
28
+ throw new Error('File limit must be between 1 byte and 20 MiB.');
29
+ return value;
30
+ }
31
+ function displayName(value) {
32
+ return typeof value === 'string' ? value.replace(/[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/g, '').slice(0, 200) || 'attachment' : 'attachment';
33
+ }
34
+ /** Every directory and filename is owned and generated by this feature. */
35
+ async function privateDirectory(directory) {
36
+ await promises_1.default.mkdir(directory, { recursive: true, mode: 0o700 });
37
+ const stat = await promises_1.default.lstat(directory);
38
+ if (!stat.isDirectory() || stat.isSymbolicLink() || await promises_1.default.realpath(directory) !== path_1.default.resolve(directory))
39
+ throw new Error('Unsafe attachment directory.');
40
+ if (process.getuid && stat.uid !== process.getuid())
41
+ throw new Error('Attachment directory belongs to another user.');
42
+ await promises_1.default.chmod(directory, 0o700);
43
+ }
44
+ async function atomicJson(filename, value) {
45
+ await privateDirectory(path_1.default.dirname(filename));
46
+ const temporary = `${filename}.${(0, crypto_1.randomUUID)()}.tmp`;
47
+ try {
48
+ await promises_1.default.writeFile(temporary, JSON.stringify(value), { flag: 'wx', mode: 0o600 });
49
+ await promises_1.default.rename(temporary, filename);
50
+ }
51
+ finally {
52
+ await promises_1.default.rm(temporary, { force: true });
53
+ }
54
+ }
55
+ /** The limit applies to actual bytes, independent of headers and advertised size. */
56
+ async function saveStream(source, filename, maxBytes, signal, expected) {
57
+ let size = 0;
58
+ const hash = (0, crypto_1.createHash)('sha256');
59
+ let idle;
60
+ const refresh = () => {
61
+ clearTimeout(idle);
62
+ idle = setTimeout(() => source.destroy(new Error('File download stalled.')), exports.FILE_IDLE_MS);
63
+ idle.unref();
64
+ };
65
+ const meter = new stream_1.Transform({
66
+ transform(chunk, _encoding, callback) {
67
+ size += chunk.length;
68
+ if (size > maxBytes) {
69
+ callback(new Error(`File exceeds the ${maxBytes / 1024 / 1024} MiB limit.`));
70
+ return;
71
+ }
72
+ hash.update(chunk);
73
+ refresh();
74
+ callback(null, chunk);
75
+ },
76
+ });
77
+ refresh();
78
+ // A network stream can fail while opening the destination, before pipeline owns it.
79
+ let sourceError;
80
+ const captureError = (error) => { sourceError = error; };
81
+ source.on('error', captureError);
82
+ let handle;
83
+ try {
84
+ handle = await promises_1.default.open(filename, fs_1.constants.O_CREAT | fs_1.constants.O_EXCL | fs_1.constants.O_WRONLY | fs_1.constants.O_NOFOLLOW, 0o600);
85
+ if (sourceError)
86
+ throw sourceError;
87
+ await (0, promises_2.pipeline)(source, meter, handle.createWriteStream(), { signal });
88
+ const sha256 = hash.digest('hex');
89
+ if (expected && (expected.size !== size || expected.sha256 !== sha256))
90
+ throw new Error('File integrity check failed (size or SHA-256 mismatch).');
91
+ return { size, sha256 };
92
+ }
93
+ catch (error) {
94
+ source.destroy();
95
+ if (handle)
96
+ await promises_1.default.rm(filename, { force: true });
97
+ throw error;
98
+ }
99
+ finally {
100
+ clearTimeout(idle);
101
+ await handle?.close().catch(() => { });
102
+ // Leave the error observer attached until destroy's deferred error has fired.
103
+ if (source.closed)
104
+ source.off('error', captureError);
105
+ else
106
+ source.once('close', () => source.off('error', captureError));
107
+ }
108
+ }
109
+ async function readPrivateJson(filename) {
110
+ const handle = await promises_1.default.open(filename, fs_1.constants.O_RDONLY | fs_1.constants.O_NOFOLLOW);
111
+ try {
112
+ const stat = await handle.stat();
113
+ if (!stat.isFile() || stat.size > 64 * 1024 || (process.getuid && stat.uid !== process.getuid()))
114
+ throw new Error('Unsafe attachment metadata.');
115
+ const data = Buffer.alloc(64 * 1024 + 1);
116
+ let bytesRead = 0;
117
+ while (bytesRead < data.length) {
118
+ const chunk = await handle.read(data, bytesRead, data.length - bytesRead, bytesRead);
119
+ if (!chunk.bytesRead)
120
+ break;
121
+ bytesRead += chunk.bytesRead;
122
+ }
123
+ if (bytesRead > 64 * 1024)
124
+ throw new Error('Attachment metadata exceeds its limit.');
125
+ return JSON.parse(data.subarray(0, bytesRead).toString('utf8'));
126
+ }
127
+ finally {
128
+ await handle.close();
129
+ }
130
+ }
131
+ function readOwnedFile(filename) {
132
+ return (0, fs_1.createReadStream)(filename, { fd: (0, fs_1.openSync)(filename, fs_1.constants.O_RDONLY | fs_1.constants.O_NOFOLLOW), autoClose: true });
133
+ }
134
+ //# sourceMappingURL=FileIO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileIO.js","sourceRoot":"","sources":["../../src/files/FileIO.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ export interface FileContext {
2
+ id: string;
3
+ workingDirectory: string;
4
+ delegationWorkspaceGeneration?: number;
5
+ }
6
+ export interface ExtractionResult {
7
+ status: 'parsed' | 'partial' | 'unsupported';
8
+ text?: string;
9
+ detail: string;
10
+ }
11
+ export interface FileInboxDependencies {
12
+ thread(id?: string): FileContext | undefined;
13
+ send(message: object): void;
14
+ extract(filename: string, name: string, signal: AbortSignal): Promise<ExtractionResult>;
15
+ }
16
+ /** Owns only opaque attachment directories; backend sandbox policies are unchanged. */
17
+ export declare class FileInbox {
18
+ private readonly root;
19
+ private readonly deps;
20
+ private readonly entries;
21
+ private readonly claims;
22
+ private readonly writes;
23
+ private loading?;
24
+ private downloads;
25
+ private stopped;
26
+ private sequence;
27
+ private readonly origin;
28
+ private readonly retentionDays;
29
+ constructor(root: string, serverUrl: string, deps: FileInboxDependencies, retentionDays?: number);
30
+ private directory;
31
+ private original;
32
+ initialize(): Promise<void>;
33
+ private pending;
34
+ private persist;
35
+ private assertContext;
36
+ /** Capture the real default thread synchronously, before any filesystem/network wait. */
37
+ accept(message: any): Promise<void>;
38
+ private admitted;
39
+ available(message: any): void;
40
+ private download;
41
+ private request;
42
+ private status;
43
+ failed(id: string, detail: string): Promise<void>;
44
+ private fail;
45
+ /** Reserve observed preceding uploads for this command, including queued commands. */
46
+ mark(): number;
47
+ claim(messageId: string, threadId: string, openId: string | undefined, explicit?: string[], beforeSequence?: number): void;
48
+ hasClaim(messageId: string): boolean;
49
+ prepare(messageId: string): Promise<string>;
50
+ release(messageId: string, restore?: boolean): void;
51
+ moveClaim(from: string, to: string): void;
52
+ deleteThread(threadId: string): Promise<void>;
53
+ cancelThread(threadId: string): void;
54
+ disconnect(): void;
55
+ list(threadId: string, openId: string | undefined, clear?: boolean): Promise<string>;
56
+ private cleanup;
57
+ private remove;
58
+ destroy(): Promise<void>;
59
+ }
60
+ //# sourceMappingURL=FileInbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileInbox.d.ts","sourceRoot":"","sources":["../../src/files/FileInbox.ts"],"names":[],"mappings":"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"}