flow-agent-bridge 0.32.0 → 0.33.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.
- package/README.md +39 -0
- package/dist/api.d.ts +2 -0
- package/dist/api.js +31 -0
- package/dist/api.js.map +1 -1
- package/dist/bridge.js +26 -1
- package/dist/bridge.js.map +1 -1
- package/dist/huddle-context.d.ts +41 -0
- package/dist/huddle-context.js +190 -0
- package/dist/huddle-context.js.map +1 -0
- package/dist/huddle-replies.d.ts +17 -0
- package/dist/huddle-replies.js +39 -0
- package/dist/huddle-replies.js.map +1 -0
- package/dist/huddle-voice.d.ts +14 -1
- package/dist/huddle-voice.js +124 -9
- package/dist/huddle-voice.js.map +1 -1
- package/dist/runtime.d.ts +4 -0
- package/dist/runtime.js +10 -3
- package/dist/runtime.js.map +1 -1
- package/dist/shared-file-worker.d.ts +7 -0
- package/dist/shared-file-worker.js +93 -0
- package/dist/shared-file-worker.js.map +1 -0
- package/dist/shared-files.d.ts +11 -0
- package/dist/shared-files.js +52 -0
- package/dist/shared-files.js.map +1 -0
- package/package.json +9 -4
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parentPort, workerData } from 'node:worker_threads';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
const TEXT_LIMIT = 100_000;
|
|
6
|
+
/** Text extraction never executes macros, formulas, embedded scripts, or links. */
|
|
7
|
+
export async function extractSharedFile(input) {
|
|
8
|
+
const { filePath, name, mimeType } = input;
|
|
9
|
+
const data = await fs.readFile(filePath);
|
|
10
|
+
const extension = path.extname(name).toLowerCase();
|
|
11
|
+
const result = { name, path: filePath, text: '', images: [] };
|
|
12
|
+
if (['.png', '.jpg', '.jpeg', '.webp'].includes(extension)) {
|
|
13
|
+
const { loadImage } = await import('@napi-rs/canvas');
|
|
14
|
+
const image = await loadImage(data);
|
|
15
|
+
if (image.width * image.height > 25_000_000)
|
|
16
|
+
throw new Error('Image exceeds 25 megapixels');
|
|
17
|
+
result.images.push(filePath);
|
|
18
|
+
result.notice = 'Image supplied for visual inspection; no text extraction was performed.';
|
|
19
|
+
}
|
|
20
|
+
else if (extension === '.pdf') {
|
|
21
|
+
const { getDocument } = await import('pdfjs-dist/legacy/build/pdf.mjs');
|
|
22
|
+
const { createCanvas } = await import('@napi-rs/canvas');
|
|
23
|
+
const document = await getDocument({
|
|
24
|
+
data: new Uint8Array(data), isEvalSupported: false,
|
|
25
|
+
standardFontDataUrl: fileURLToPath(new URL('./standard_fonts/', import.meta.resolve('pdfjs-dist/package.json'))).replace(/\\/g, '/'),
|
|
26
|
+
}).promise;
|
|
27
|
+
try {
|
|
28
|
+
const pages = Math.min(document.numPages, 20);
|
|
29
|
+
for (let i = 1; i <= pages && result.text.length < TEXT_LIMIT; i++) {
|
|
30
|
+
const page = await document.getPage(i);
|
|
31
|
+
const content = await page.getTextContent();
|
|
32
|
+
result.text += `\n[Page ${i}]\n${content.items.map((item) => 'str' in item ? item.str : '').join(' ')}\n`;
|
|
33
|
+
if (i <= 4) {
|
|
34
|
+
const natural = page.getViewport({ scale: 1 });
|
|
35
|
+
const viewport = page.getViewport({ scale: Math.min(1.5, 1400 / Math.max(natural.width, natural.height)) });
|
|
36
|
+
const canvas = createCanvas(Math.ceil(viewport.width), Math.ceil(viewport.height));
|
|
37
|
+
await page.render({ canvasContext: canvas.getContext('2d'), viewport, canvas: canvas }).promise;
|
|
38
|
+
const imagePath = `${filePath}.page-${i}.png`;
|
|
39
|
+
await fs.writeFile(imagePath, canvas.toBuffer('image/png'), { mode: 0o600 });
|
|
40
|
+
result.images.push(imagePath);
|
|
41
|
+
}
|
|
42
|
+
page.cleanup();
|
|
43
|
+
}
|
|
44
|
+
result.notice = `PDF has ${document.numPages} pages. Text: first ${pages} pages (up to ${TEXT_LIMIT} characters). Visual previews: first ${Math.min(pages, 4)} pages only. Scanned pages require visual inspection; do not infer unseen pages.`;
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
await document.destroy();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else if (extension === '.docx') {
|
|
51
|
+
const mammoth = await import('mammoth');
|
|
52
|
+
result.text = (await mammoth.extractRawText({ buffer: data })).value;
|
|
53
|
+
result.notice = 'Document text only; embedded images and layout are not extracted.';
|
|
54
|
+
}
|
|
55
|
+
else if (extension === '.xlsx') {
|
|
56
|
+
const { default: ExcelJS } = await import('exceljs');
|
|
57
|
+
const workbook = new ExcelJS.Workbook();
|
|
58
|
+
await workbook.xlsx.load(data);
|
|
59
|
+
for (const sheet of workbook.worksheets.slice(0, 10)) {
|
|
60
|
+
result.text += `\n[Sheet ${sheet.name}]\n`;
|
|
61
|
+
sheet.eachRow((row, index) => {
|
|
62
|
+
if (index > 500 || result.text.length >= TEXT_LIMIT)
|
|
63
|
+
return;
|
|
64
|
+
const cells = [];
|
|
65
|
+
row.eachCell((cell, col) => { if (col <= 40)
|
|
66
|
+
cells.push(`${cell.address}: ${cell.text}`); });
|
|
67
|
+
result.text += `${cells.join(' | ')}\n`;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
result.notice = 'Values from up to 10 sheets, 500 rows and 40 columns per sheet. Formulas are not recalculated; charts/images are not extracted.';
|
|
71
|
+
}
|
|
72
|
+
else if (mimeType.startsWith('text/') || ['.txt', '.md', '.csv', '.json', '.yaml', '.yml', '.xml', '.html', '.js', '.ts', '.tsx', '.py', '.css', '.log', '.sql'].includes(extension)) {
|
|
73
|
+
if (data.includes(0))
|
|
74
|
+
throw new Error('This file is binary, not readable text');
|
|
75
|
+
result.text = data.toString('utf8');
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
throw new Error('Unsupported call format. Send text, PDF, PNG/JPEG/WebP, DOCX, or XLSX. Audio/video and legacy Office files are not decoded.');
|
|
79
|
+
}
|
|
80
|
+
if (result.text.length > TEXT_LIMIT)
|
|
81
|
+
result.notice = `${result.notice ?? ''} Text truncated at ${TEXT_LIMIT} characters.`.trim();
|
|
82
|
+
result.text = result.text.slice(0, TEXT_LIMIT);
|
|
83
|
+
if (result.text) {
|
|
84
|
+
const extracted = `${filePath}.extracted.txt`;
|
|
85
|
+
await fs.writeFile(extracted, result.text, { mode: 0o600 });
|
|
86
|
+
result.notice = `${result.notice ?? ''} Extracted text saved at ${extracted}.`.trim();
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
if (parentPort) {
|
|
91
|
+
void extractSharedFile(workerData).then((result) => parentPort.postMessage({ result }), (error) => parentPort.postMessage({ error: error instanceof Error ? error.message : 'Document could not be opened' }));
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=shared-file-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-file-worker.js","sourceRoot":"","sources":["../src/shared-file-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,UAAU,GAAG,OAAO,CAAC;AAC3B,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAEvC;IACC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,MAAM,MAAM,GAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAClF,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC5F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,GAAG,yEAAyE,CAAC;IAC5F,CAAC;SAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QAChC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QACxE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC;YACjC,IAAI,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,KAAK;YAClD,mBAAmB,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACrI,CAAC,CAAC,OAAO,CAAC;QACX,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC1G,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACX,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC5G,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;oBACnF,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAe,EAAE,CAAC,CAAC,OAAO,CAAC;oBAClH,MAAM,SAAS,GAAG,GAAG,QAAQ,SAAS,CAAC,MAAM,CAAC;oBAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC7E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAChC,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;YACD,MAAM,CAAC,MAAM,GAAG,WAAW,QAAQ,CAAC,QAAQ,uBAAuB,KAAK,iBAAiB,UAAU,wCAAwC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,kFAAkF,CAAC;QAClP,CAAC;gBAAS,CAAC;YAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IACzC,CAAC;SAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACrE,MAAM,CAAC,MAAM,GAAG,mEAAmE,CAAC;IACtF,CAAC;SAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAa,CAAC,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,IAAI,YAAY,KAAK,CAAC,IAAI,KAAK,CAAC;YAC3C,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBAC3B,IAAI,KAAK,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU;oBAAE,OAAO;gBAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7F,MAAM,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,MAAM,GAAG,iIAAiI,CAAC;IACpJ,CAAC;SAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACvL,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAChF,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,6HAA6H,CAAC,CAAC;IACjJ,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU;QAAE,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,sBAAsB,UAAU,cAAc,CAAC,IAAI,EAAE,CAAC;IACjI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC/C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,GAAG,QAAQ,gBAAgB,CAAC;QAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,4BAA4B,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC;IACxF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,IAAI,UAAU,EAAE,CAAC;IACf,KAAK,iBAAiB,CAAC,UAAU,CAAC,CAAC,IAAI,CACrC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAW,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,EAC/C,CAAC,KAAc,EAAE,EAAE,CAAC,UAAW,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,EAAE,CAAC,CAChI,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FileDTO } from '@flow/shared';
|
|
2
|
+
export declare const MAX_SHARED_FILE_BYTES: number;
|
|
3
|
+
export interface PreparedSharedFile {
|
|
4
|
+
name: string;
|
|
5
|
+
path: string;
|
|
6
|
+
text: string;
|
|
7
|
+
images: string[];
|
|
8
|
+
notice?: string;
|
|
9
|
+
}
|
|
10
|
+
/** A cancellable worker keeps malformed/expensive documents off the audio loop. */
|
|
11
|
+
export declare function prepareSharedFile(file: FileDTO, directory: string, download: (id: string, signal: AbortSignal) => Promise<Buffer>, signal: AbortSignal): Promise<PreparedSharedFile>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { existsSync, promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { Worker } from 'node:worker_threads';
|
|
4
|
+
import { attachmentFilename } from './attachments.js';
|
|
5
|
+
export const MAX_SHARED_FILE_BYTES = 20 * 1024 * 1024;
|
|
6
|
+
/** A cancellable worker keeps malformed/expensive documents off the audio loop. */
|
|
7
|
+
export async function prepareSharedFile(file, directory, download, signal) {
|
|
8
|
+
if (!/^[a-zA-Z0-9_-]{1,100}$/.test(file.id))
|
|
9
|
+
throw new Error('Invalid attachment identifier');
|
|
10
|
+
if (file.sizeBytes > MAX_SHARED_FILE_BYTES)
|
|
11
|
+
throw new Error('File exceeds the 20 MB call limit');
|
|
12
|
+
signal.throwIfAborted();
|
|
13
|
+
const data = await download(file.id, signal);
|
|
14
|
+
signal.throwIfAborted();
|
|
15
|
+
if (data.length > MAX_SHARED_FILE_BYTES)
|
|
16
|
+
throw new Error('File exceeds the 20 MB call limit');
|
|
17
|
+
const filePath = path.join(directory, attachmentFilename(file.id, file.name));
|
|
18
|
+
await fs.writeFile(filePath, data, { mode: 0o600 });
|
|
19
|
+
signal.throwIfAborted();
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
const adjacent = new URL('./shared-file-worker.js', import.meta.url);
|
|
22
|
+
// tsx development uses the built worker too: Node workers cannot load TS unaided.
|
|
23
|
+
const worker = new Worker(existsSync(adjacent) ? adjacent : new URL('../dist/shared-file-worker.js', import.meta.url), {
|
|
24
|
+
workerData: { filePath, name: file.name, mimeType: file.mimeType },
|
|
25
|
+
resourceLimits: { maxOldGenerationSizeMb: 192 },
|
|
26
|
+
});
|
|
27
|
+
let settled = false;
|
|
28
|
+
const finish = (error, result) => {
|
|
29
|
+
if (settled)
|
|
30
|
+
return;
|
|
31
|
+
settled = true;
|
|
32
|
+
clearTimeout(timer);
|
|
33
|
+
signal.removeEventListener('abort', abort);
|
|
34
|
+
// Wait for termination before the caller can remove its temporary directory.
|
|
35
|
+
void worker.terminate().finally(() => error ? reject(error) : resolve(result));
|
|
36
|
+
};
|
|
37
|
+
const abort = () => finish(new Error('File preparation cancelled'));
|
|
38
|
+
const timer = setTimeout(() => finish(new Error('Document took too long to open (20 seconds)')), 20_000);
|
|
39
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
40
|
+
if (signal.aborted)
|
|
41
|
+
abort();
|
|
42
|
+
worker.once('message', (message) => {
|
|
43
|
+
if (message.result)
|
|
44
|
+
finish(undefined, message.result);
|
|
45
|
+
else
|
|
46
|
+
finish(new Error(message.error ?? 'Could not read document'));
|
|
47
|
+
});
|
|
48
|
+
worker.once('error', (error) => finish(error));
|
|
49
|
+
worker.once('exit', () => finish(new Error('Document reader stopped unexpectedly')));
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=shared-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-files.js","sourceRoot":"","sources":["../src/shared-files.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flow-agent-bridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.33.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Flow agent bridge: joins a Flow workspace as a first-class AI agent and execs a coding-agent CLI (Claude Code, Codex) headlessly per conversation",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"bridge"
|
|
19
19
|
],
|
|
20
20
|
"engines": {
|
|
21
|
-
"node": ">=20"
|
|
21
|
+
"node": ">=20.16.0 <21 || >=22.3.0"
|
|
22
22
|
},
|
|
23
23
|
"bin": {
|
|
24
24
|
"flow-agent-bridge": "dist/index.js"
|
|
@@ -29,20 +29,25 @@
|
|
|
29
29
|
],
|
|
30
30
|
"scripts": {
|
|
31
31
|
"build": "tsc -p tsconfig.json",
|
|
32
|
-
"dev": "tsx src/index.ts",
|
|
33
|
-
"test": "vitest run",
|
|
32
|
+
"dev": "pnpm build && tsx src/index.ts",
|
|
33
|
+
"test": "pnpm build && vitest run",
|
|
34
34
|
"prepack": "pnpm build",
|
|
35
35
|
"pack:tarball": "pnpm pack"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@livekit/agents": "1.7.1",
|
|
39
39
|
"@livekit/rtc-node": "0.13.34",
|
|
40
|
+
"@napi-rs/canvas": "0.1.100",
|
|
41
|
+
"exceljs": "4.4.0",
|
|
42
|
+
"mammoth": "1.11.0",
|
|
43
|
+
"pdfjs-dist": "5.4.624",
|
|
40
44
|
"ws": "^8.18.0"
|
|
41
45
|
},
|
|
42
46
|
"devDependencies": {
|
|
43
47
|
"@flow/shared": "workspace:*",
|
|
44
48
|
"@types/node": "^22.10.0",
|
|
45
49
|
"@types/ws": "^8.5.13",
|
|
50
|
+
"jszip": "3.10.1",
|
|
46
51
|
"tsx": "^4.19.2",
|
|
47
52
|
"typescript": "^5.6.0",
|
|
48
53
|
"vitest": "^2.1.8"
|