Files
clawdbot/apps/macos/Sources/Clawdis/Resources/WebChat/components/sandbox/AttachmentsRuntimeProvider.js
2025-12-06 05:01:28 +01:00

64 lines
2.4 KiB
JavaScript

import { ATTACHMENTS_RUNTIME_DESCRIPTION } from "../../prompts/prompts.js";
/**
* Attachments Runtime Provider
*
* OPTIONAL provider that provides file access APIs to sandboxed code.
* Only needed when attachments are present.
* Attachments are read-only snapshot data - no messaging needed.
*/
export class AttachmentsRuntimeProvider {
constructor(attachments) {
this.attachments = attachments;
}
getData() {
const attachmentsData = this.attachments.map((a) => ({
id: a.id,
fileName: a.fileName,
mimeType: a.mimeType,
size: a.size,
content: a.content,
extractedText: a.extractedText,
}));
return { attachments: attachmentsData };
}
getRuntime() {
// This function will be stringified, so no external references!
// These functions read directly from window.attachments
// Works both online AND offline (no messaging needed!)
return (_sandboxId) => {
window.listAttachments = () => (window.attachments || []).map((a) => ({
id: a.id,
fileName: a.fileName,
mimeType: a.mimeType,
size: a.size,
}));
window.readTextAttachment = (attachmentId) => {
const a = (window.attachments || []).find((x) => x.id === attachmentId);
if (!a)
throw new Error("Attachment not found: " + attachmentId);
if (a.extractedText)
return a.extractedText;
try {
return atob(a.content);
}
catch {
throw new Error("Failed to decode text content for: " + attachmentId);
}
};
window.readBinaryAttachment = (attachmentId) => {
const a = (window.attachments || []).find((x) => x.id === attachmentId);
if (!a)
throw new Error("Attachment not found: " + attachmentId);
const bin = atob(a.content);
const bytes = new Uint8Array(bin.length);
for (let i = 0; i < bin.length; i++)
bytes[i] = bin.charCodeAt(i);
return bytes;
};
};
}
getDescription() {
return ATTACHMENTS_RUNTIME_DESCRIPTION;
}
}
//# sourceMappingURL=AttachmentsRuntimeProvider.js.map