From f8b98f7dac72ee90eeb11c730084657c21e6c22c Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Sun, 12 Oct 2025 16:24:36 +0200 Subject: [PATCH] Add extract_document tool and improve artifacts tab scrolling - Add extract_document tool for extracting text from PDF/DOCX/XLSX/PPTX from URLs - CORS proxy support from settings for fetching documents - Proper error messages guiding users on CORS issues and manual file attachment - Add scroll-into-view for active artifact tabs - Export extract_document tool from web-ui package --- packages/web-ui/src/index.ts | 1 + packages/web-ui/src/prompts/tool-prompts.ts | 24 ++ .../web-ui/src/tools/artifacts/artifacts.ts | 12 +- packages/web-ui/src/tools/extract-document.ts | 250 ++++++++++++++++++ packages/web-ui/src/tools/index.ts | 1 + 5 files changed, 287 insertions(+), 1 deletion(-) create mode 100644 packages/web-ui/src/tools/extract-document.ts diff --git a/packages/web-ui/src/index.ts b/packages/web-ui/src/index.ts index 8187e0e0..46c465ea 100644 --- a/packages/web-ui/src/index.ts +++ b/packages/web-ui/src/index.ts @@ -84,6 +84,7 @@ export { ImageArtifact } from "./tools/artifacts/ImageArtifact.js"; export { MarkdownArtifact } from "./tools/artifacts/MarkdownArtifact.js"; export { SvgArtifact } from "./tools/artifacts/SvgArtifact.js"; export { TextArtifact } from "./tools/artifacts/TextArtifact.js"; +export { createExtractDocumentTool, extractDocumentTool } from "./tools/extract-document.js"; // Tools export { getToolRenderer, registerToolRenderer, renderTool } from "./tools/index.js"; export { createJavaScriptReplTool, javascriptReplTool } from "./tools/javascript-repl.js"; diff --git a/packages/web-ui/src/prompts/tool-prompts.ts b/packages/web-ui/src/prompts/tool-prompts.ts index 65bdc1a6..038b92e1 100644 --- a/packages/web-ui/src/prompts/tool-prompts.ts +++ b/packages/web-ui/src/prompts/tool-prompts.ts @@ -250,6 +250,30 @@ Downloadable Files (one-time downloads for the user - YOU cannot read these back - await returnDownloadableFile('analysis.json', {results: [...]}, 'application/json') - await returnDownloadableFile('chart.png', blob, 'image/png')`; +// ============================================================================ +// Extract Document Tool +// ============================================================================ + +export const EXTRACT_DOCUMENT_DESCRIPTION = `Extract plain text from documents on the web (PDF, DOCX, XLSX, PPTX). + +## Purpose +Use this when the user wants you to read a document at a URL. + +## Parameters +- url: URL of the document (PDF, DOCX, XLSX, or PPTX only) + +## Returns +Structured plain text with page/sheet/slide delimiters in XML-like format: +- PDFs: text... +- Word: text +- Excel: CSV data... +- PowerPoint: text...... + +## Important Notes +- Maximum file size: 50MB +- CORS restrictions may block some URLs - if this happens, the error will guide you to help the user configure a CORS proxy +- Format is automatically detected from file extension and Content-Type header`; + // ============================================================================ // Attachments Runtime Provider // ============================================================================ diff --git a/packages/web-ui/src/tools/artifacts/artifacts.ts b/packages/web-ui/src/tools/artifacts/artifacts.ts index ab1ab383..9f5e2e98 100644 --- a/packages/web-ui/src/tools/artifacts/artifacts.ts +++ b/packages/web-ui/src/tools/artifacts/artifacts.ts @@ -137,7 +137,8 @@ export class ArtifactsPanel extends LitElement { ext === "css" || ext === "scss" || ext === "sass" || - ext === "less" + ext === "less" || + ext === "sh" ) return "text"; // Everything else gets generic fallback @@ -218,6 +219,14 @@ export class ArtifactsPanel extends LitElement { }); this._activeFilename = filename; this.requestUpdate(); // Only for tab bar update + + // Scroll the active tab into view after render + requestAnimationFrame(() => { + const activeButton = this.querySelector(`button[data-filename="${filename}"]`); + if (activeButton) { + activeButton.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "center" }); + } + }); } // Open panel and focus an artifact tab by filename @@ -617,6 +626,7 @@ export class ArtifactsPanel extends LitElement { return html`