Alvin 4 kuukautta sitten
vanhempi
sitoutus
2efd890e66
3 muutettua tiedostoa jossa 18 lisäystä ja 6 poistoa
  1. 2 2
      package.json
  2. 5 1
      src/tools/smartfetch/tool.ts
  3. 11 3
      src/tools/smartfetch/utils.ts

+ 2 - 2
package.json

@@ -36,8 +36,8 @@
     "LICENSE"
   ],
   "scripts": {
-    "build:plugin": "bun build src/index.ts --outdir dist --target node --format esm --external @ast-grep/napi --external @opencode-ai/plugin --external @opencode-ai/sdk",
-    "build:cli": "bun build src/cli/index.ts --outdir dist/cli --target node --format esm --external @ast-grep/napi --external @opencode-ai/plugin --external @opencode-ai/sdk",
+    "build:plugin": "bun build src/index.ts --outdir dist --target node --format esm --external @ast-grep/napi --external @opencode-ai/plugin --external @opencode-ai/sdk --external jsdom",
+    "build:cli": "bun build src/cli/index.ts --outdir dist/cli --target node --format esm --external @ast-grep/napi --external @opencode-ai/plugin --external @opencode-ai/sdk --external jsdom",
     "build": "bun run build:plugin && bun run build:cli && tsc --emitDeclarationOnly && bun run generate-schema",
     "prepare": "bun run build",
     "contributors:add": "all-contributors add",

+ 5 - 1
src/tools/smartfetch/tool.ts

@@ -448,7 +448,11 @@ export function createWebfetchTool(
                     decodeBody(body.data, headerMetadata.charset, contentType);
                   const rawText = decoded.text;
                   const extracted = isHtmlLikeContentType(contentType)
-                    ? extractFromHtml(rawText, finalUrl, args.extract_main)
+                    ? await extractFromHtml(
+                        rawText,
+                        finalUrl,
+                        args.extract_main,
+                      )
                     : {
                         title: undefined,
                         rawContent: cleanFetchedText(rawText),

+ 11 - 3
src/tools/smartfetch/utils.ts

@@ -1,8 +1,15 @@
 import { Readability } from '@mozilla/readability';
-import { JSDOM } from 'jsdom';
 import TurndownService from 'turndown';
 import type { CachedFetch, ExtractedContent } from './types';
 
+let jsdomPromise: Promise<typeof import('jsdom')> | undefined;
+
+async function getJSDOM() {
+  jsdomPromise ??= import('jsdom');
+  const { JSDOM } = await jsdomPromise;
+  return JSDOM;
+}
+
 export function wordCount(text: string) {
   const trimmed = text.trim();
   if (!trimmed) return 0;
@@ -276,11 +283,12 @@ turndown.addRule('fenced-pre-code', {
   },
 });
 
-export function extractFromHtml(
+export async function extractFromHtml(
   html: string,
   finalUrl: string,
   extractMain: boolean,
-): ExtractedContent {
+): Promise<ExtractedContent> {
+  const JSDOM = await getJSDOM();
   const dom = new JSDOM(html, { url: finalUrl });
   const document = dom.window.document;
   const title = document.title || undefined;