@kenkaiiii/ggcoder 4.3.231 → 4.3.232
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/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -1
- package/dist/config.js.map +1 -1
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +29 -0
- package/dist/config.test.js.map +1 -0
- package/dist/core/ideal-review.d.ts +20 -0
- package/dist/core/ideal-review.d.ts.map +1 -0
- package/dist/core/ideal-review.js +55 -0
- package/dist/core/ideal-review.js.map +1 -0
- package/dist/core/ideal-review.test.d.ts +2 -0
- package/dist/core/ideal-review.test.d.ts.map +1 -0
- package/dist/core/ideal-review.test.js +59 -0
- package/dist/core/ideal-review.test.js.map +1 -0
- package/dist/core/settings-manager.d.ts +1 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +2 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/tools/html-extract.d.ts +58 -0
- package/dist/tools/html-extract.d.ts.map +1 -0
- package/dist/tools/html-extract.js +130 -0
- package/dist/tools/html-extract.js.map +1 -0
- package/dist/tools/html-extract.test.d.ts +2 -0
- package/dist/tools/html-extract.test.d.ts.map +1 -0
- package/dist/tools/html-extract.test.js +60 -0
- package/dist/tools/html-extract.test.js.map +1 -0
- package/dist/tools/pdf-extract.d.ts +18 -0
- package/dist/tools/pdf-extract.d.ts.map +1 -0
- package/dist/tools/pdf-extract.js +43 -0
- package/dist/tools/pdf-extract.js.map +1 -0
- package/dist/tools/pdf-extract.test.d.ts +2 -0
- package/dist/tools/pdf-extract.test.d.ts.map +1 -0
- package/dist/tools/pdf-extract.test.js +15 -0
- package/dist/tools/pdf-extract.test.js.map +1 -0
- package/dist/tools/prompt-hints.d.ts.map +1 -1
- package/dist/tools/prompt-hints.js +2 -1
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +16 -1
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +357 -45
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-fetch.test.js +263 -2
- package/dist/tools/web-fetch.test.js.map +1 -1
- package/dist/tools/web-search.d.ts +14 -0
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +321 -35
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/web-search.test.js +144 -1
- package/dist/tools/web-search.test.js.map +1 -1
- package/dist/ui/App.d.ts +2 -0
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +54 -1
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/app-items.d.ts +14 -1
- package/dist/ui/app-items.d.ts.map +1 -1
- package/dist/ui/app-items.js +2 -0
- package/dist/ui/app-items.js.map +1 -1
- package/dist/ui/components/IdealHookMessage.d.ts +12 -0
- package/dist/ui/components/IdealHookMessage.d.ts.map +1 -0
- package/dist/ui/components/IdealHookMessage.js +24 -0
- package/dist/ui/components/IdealHookMessage.js.map +1 -0
- package/dist/ui/hooks/useAgentLoop.d.ts +2 -0
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +45 -1
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/render.d.ts +3 -0
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +2 -0
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/terminal-history.d.ts.map +1 -1
- package/dist/ui/terminal-history.js +8 -0
- package/dist/ui/terminal-history.js.map +1 -1
- package/dist/ui/transcript/TranscriptRenderer.d.ts.map +1 -1
- package/dist/ui/transcript/TranscriptRenderer.js +3 -0
- package/dist/ui/transcript/TranscriptRenderer.js.map +1 -1
- package/dist/ui/transcript/spacing.d.ts +2 -2
- package/dist/ui/transcript/spacing.d.ts.map +1 -1
- package/dist/ui/transcript/spacing.js +1 -0
- package/dist/ui/transcript/spacing.js.map +1 -1
- package/dist/ui/transcript/spacing.test.js +2 -0
- package/dist/ui/transcript/spacing.test.js.map +1 -1
- package/dist/ui/tui-history-parity.test.js +8 -0
- package/dist/ui/tui-history-parity.test.js.map +1 -1
- package/dist/utils/format.js +7 -0
- package/dist/utils/format.js.map +1 -1
- package/package.json +10 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { createWebFetchTool, htmlToCleanText } from "./web-fetch.js";
|
|
2
|
+
import { buildLlmsCandidates, createWebFetchTool, htmlToCleanText } from "./web-fetch.js";
|
|
3
3
|
const originalFetch = globalThis.fetch;
|
|
4
4
|
function context() {
|
|
5
5
|
return { signal: new AbortController().signal, toolCallId: "test" };
|
|
@@ -53,6 +53,15 @@ describe("htmlToCleanText", () => {
|
|
|
53
53
|
expect(result).not.toContain("Skip to search");
|
|
54
54
|
});
|
|
55
55
|
});
|
|
56
|
+
describe("buildLlmsCandidates", () => {
|
|
57
|
+
it("includes origin, docs subpath, and page markdown candidates", () => {
|
|
58
|
+
const candidates = buildLlmsCandidates("https://example.com/docs/guide/page.html?x=1", 10000);
|
|
59
|
+
const urls = candidates.map((candidate) => candidate.url);
|
|
60
|
+
expect(urls).toContain("https://example.com/llms.txt");
|
|
61
|
+
expect(urls).toContain("https://example.com/docs/llms.txt");
|
|
62
|
+
expect(urls).toContain("https://example.com/docs/guide/page.html.md?x=1");
|
|
63
|
+
});
|
|
64
|
+
});
|
|
56
65
|
describe("createWebFetchTool", () => {
|
|
57
66
|
it("returns sanitized HTML content from fetched pages", async () => {
|
|
58
67
|
const html = `
|
|
@@ -79,7 +88,60 @@ describe("createWebFetchTool", () => {
|
|
|
79
88
|
expect(result).not.toContain("Advertisement");
|
|
80
89
|
expect(result).not.toContain("Terms Privacy");
|
|
81
90
|
});
|
|
82
|
-
it("
|
|
91
|
+
it("returns markdown with a heading and fenced code by default", async () => {
|
|
92
|
+
const html = `
|
|
93
|
+
<html><head><title>Guide</title></head>
|
|
94
|
+
<body>
|
|
95
|
+
<article>
|
|
96
|
+
<h1>Setup Guide</h1>
|
|
97
|
+
<p>This is a sufficiently long introductory paragraph so the
|
|
98
|
+
Readability extractor treats the page as a genuine article and emits
|
|
99
|
+
structured markdown for the agent to consume in tests.</p>
|
|
100
|
+
<pre><code>npm install thing</code></pre>
|
|
101
|
+
<p>Another descriptive paragraph that adds enough body length to clear
|
|
102
|
+
the minimum article-length threshold comfortably during extraction.</p>
|
|
103
|
+
</article>
|
|
104
|
+
</body></html>
|
|
105
|
+
`;
|
|
106
|
+
globalThis.fetch = vi.fn(async () => new Response(html, { status: 200, headers: { "content-type": "text/html" } }));
|
|
107
|
+
const result = await createWebFetchTool().execute({ url: "https://example.com/guide", format: "markdown" }, context());
|
|
108
|
+
expect(result).toContain("# Guide");
|
|
109
|
+
expect(result).toContain("Setup Guide");
|
|
110
|
+
expect(result).toContain("```");
|
|
111
|
+
expect(result).toContain("npm install thing");
|
|
112
|
+
});
|
|
113
|
+
it("falls back to clean text when the extractor is unavailable", async () => {
|
|
114
|
+
const html = `<html><body><article><h1>Fallback</h1><p>Body content for fallback.</p></article></body></html>`;
|
|
115
|
+
globalThis.fetch = vi.fn(async () => new Response(html, { status: 200, headers: { "content-type": "text/html" } }));
|
|
116
|
+
// Force the markdown extractor to throw so the tool degrades to text.
|
|
117
|
+
const extract = await import("./html-extract.js");
|
|
118
|
+
const spy = vi
|
|
119
|
+
.spyOn(extract, "extractToMarkdown")
|
|
120
|
+
.mockRejectedValue(new extract.ExtractorUnavailable("stubbed missing"));
|
|
121
|
+
const result = await createWebFetchTool().execute({ url: "https://example.com/page", format: "markdown" }, context());
|
|
122
|
+
expect(spy).toHaveBeenCalled();
|
|
123
|
+
expect(result).toContain("Fallback");
|
|
124
|
+
expect(result).toContain("Body content for fallback.");
|
|
125
|
+
spy.mockRestore();
|
|
126
|
+
});
|
|
127
|
+
it("follows a safe same-host redirect and returns the final content", async () => {
|
|
128
|
+
const finalHtml = `<html><body><article><h1>Final Page</h1><p>Redirect target body.</p></article></body></html>`;
|
|
129
|
+
globalThis.fetch = vi
|
|
130
|
+
.fn()
|
|
131
|
+
.mockResolvedValueOnce(new Response(null, {
|
|
132
|
+
status: 301,
|
|
133
|
+
headers: { location: "https://example.com/final/" },
|
|
134
|
+
}))
|
|
135
|
+
.mockResolvedValueOnce(new Response(finalHtml, {
|
|
136
|
+
status: 200,
|
|
137
|
+
headers: { "content-type": "text/html" },
|
|
138
|
+
}));
|
|
139
|
+
const result = await createWebFetchTool().execute({ url: "https://example.com/redirect", format: "text" }, context());
|
|
140
|
+
expect(result).toContain("Final Page");
|
|
141
|
+
expect(result).toContain("Redirect target body.");
|
|
142
|
+
expect(result).not.toContain("Redirects are not followed");
|
|
143
|
+
});
|
|
144
|
+
it("blocks redirects to private/internal URLs", async () => {
|
|
83
145
|
globalThis.fetch = vi.fn(async () => new Response(null, {
|
|
84
146
|
status: 302,
|
|
85
147
|
headers: { location: "http://127.0.0.1:3000/secret" },
|
|
@@ -88,6 +150,15 @@ describe("createWebFetchTool", () => {
|
|
|
88
150
|
expect(result).toContain("Redirect blocked");
|
|
89
151
|
expect(globalThis.fetch).toHaveBeenCalledWith("https://example.com/redirect", expect.objectContaining({ redirect: "manual" }));
|
|
90
152
|
});
|
|
153
|
+
it("stops after too many redirects", async () => {
|
|
154
|
+
let hop = 0;
|
|
155
|
+
globalThis.fetch = vi.fn(async () => new Response(null, {
|
|
156
|
+
status: 302,
|
|
157
|
+
headers: { location: `https://example.com/hop${hop++}` },
|
|
158
|
+
}));
|
|
159
|
+
const result = await createWebFetchTool().execute({ url: "https://example.com/loop" }, context());
|
|
160
|
+
expect(result).toContain("too many redirects");
|
|
161
|
+
});
|
|
91
162
|
it("blocks private/internal URLs before fetching", async () => {
|
|
92
163
|
const fetchMock = vi.fn();
|
|
93
164
|
globalThis.fetch = fetchMock;
|
|
@@ -95,5 +166,195 @@ describe("createWebFetchTool", () => {
|
|
|
95
166
|
expect(result).toContain("URL blocked");
|
|
96
167
|
expect(fetchMock).not.toHaveBeenCalled();
|
|
97
168
|
});
|
|
169
|
+
it("fetches multiple URLs into ordered sections, reporting per-URL failures", async () => {
|
|
170
|
+
globalThis.fetch = vi.fn(async (input) => {
|
|
171
|
+
const url = String(input);
|
|
172
|
+
if (url.includes("page-a")) {
|
|
173
|
+
return new Response(`<html><body><article><h1>Alpha</h1><p>Alpha body.</p></article></body></html>`, { status: 200, headers: { "content-type": "text/html" } });
|
|
174
|
+
}
|
|
175
|
+
return new Response("not found", { status: 404, statusText: "Not Found" });
|
|
176
|
+
});
|
|
177
|
+
const result = (await createWebFetchTool().execute({
|
|
178
|
+
urls: ["https://example.com/page-a", "https://example.com/page-b"],
|
|
179
|
+
format: "text",
|
|
180
|
+
}, context()));
|
|
181
|
+
const idxA = result.indexOf("## https://example.com/page-a");
|
|
182
|
+
const idxB = result.indexOf("## https://example.com/page-b");
|
|
183
|
+
expect(idxA).toBeGreaterThanOrEqual(0);
|
|
184
|
+
expect(idxB).toBeGreaterThan(idxA);
|
|
185
|
+
expect(result).toContain("Alpha");
|
|
186
|
+
expect(result).toContain("HTTP 404");
|
|
187
|
+
});
|
|
188
|
+
it("reports a blocked private URL only within its own section", async () => {
|
|
189
|
+
globalThis.fetch = vi.fn(async () => new Response(`<html><body><article><h1>Public</h1><p>Public body text.</p></article></body></html>`, { status: 200, headers: { "content-type": "text/html" } }));
|
|
190
|
+
const result = await createWebFetchTool().execute({
|
|
191
|
+
urls: ["https://example.com/public", "http://127.0.0.1/secret"],
|
|
192
|
+
format: "text",
|
|
193
|
+
}, context());
|
|
194
|
+
expect(result).toContain("## http://127.0.0.1/secret");
|
|
195
|
+
expect(result).toContain("URL blocked");
|
|
196
|
+
expect(result).toContain("Public");
|
|
197
|
+
});
|
|
198
|
+
it("extracts text from a PDF response", async () => {
|
|
199
|
+
const { readFile } = await import("node:fs/promises");
|
|
200
|
+
const { fileURLToPath } = await import("node:url");
|
|
201
|
+
const fixturePath = fileURLToPath(new URL("./__fixtures__/sample.pdf", import.meta.url));
|
|
202
|
+
const bytes = await readFile(fixturePath);
|
|
203
|
+
globalThis.fetch = vi.fn(async () => new Response(bytes, {
|
|
204
|
+
status: 200,
|
|
205
|
+
headers: { "content-type": "application/pdf" },
|
|
206
|
+
}));
|
|
207
|
+
const result = await createWebFetchTool().execute({ url: "https://example.com/file.pdf" }, context());
|
|
208
|
+
expect(result).toContain("[PDF");
|
|
209
|
+
expect(result).toContain("Hello PDF World");
|
|
210
|
+
});
|
|
211
|
+
it("prefers a site's llms.txt for doc-ish pages and skips scraping the page", async () => {
|
|
212
|
+
const fetchMock = vi.fn(async (input) => {
|
|
213
|
+
const url = String(input);
|
|
214
|
+
if (url.endsWith("/llms.txt")) {
|
|
215
|
+
return new Response("# Docs Index\n\n" + "This is the curated llms.txt content. ".repeat(10), { status: 200, headers: { "content-type": "text/plain" } });
|
|
216
|
+
}
|
|
217
|
+
return new Response("<html><body>page</body></html>", {
|
|
218
|
+
status: 200,
|
|
219
|
+
headers: { "content-type": "text/html" },
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
globalThis.fetch = fetchMock;
|
|
223
|
+
const result = await createWebFetchTool().execute({ url: "https://docs.example.com/reference/api" }, context());
|
|
224
|
+
expect(result).toContain("[llms.txt for docs.example.com]");
|
|
225
|
+
expect(result).toContain("curated llms.txt content");
|
|
226
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
227
|
+
});
|
|
228
|
+
it("follows safe redirects while probing llms resources", async () => {
|
|
229
|
+
const fetchMock = vi.fn(async (input) => {
|
|
230
|
+
const url = String(input);
|
|
231
|
+
if (url === "https://docs.example.com/llms.txt") {
|
|
232
|
+
return new Response(null, {
|
|
233
|
+
status: 301,
|
|
234
|
+
headers: { location: "https://platform.example.com/docs/llms.txt" },
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
if (url === "https://platform.example.com/docs/llms.txt") {
|
|
238
|
+
return new Response("# Redirected Docs\n\n" + "Redirected llms content. ".repeat(10), {
|
|
239
|
+
status: 200,
|
|
240
|
+
headers: { "content-type": "text/plain" },
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
return new Response("not found", { status: 404 });
|
|
244
|
+
});
|
|
245
|
+
globalThis.fetch = fetchMock;
|
|
246
|
+
const result = await createWebFetchTool().execute({ url: "https://docs.example.com/reference/api" }, context());
|
|
247
|
+
expect(result).toContain("[llms.txt for docs.example.com]");
|
|
248
|
+
expect(result).toContain("Source: https://platform.example.com/docs/llms.txt");
|
|
249
|
+
expect(result).toContain("Redirected llms content");
|
|
250
|
+
});
|
|
251
|
+
it("prefers docs-subpath llms.txt when origin llms.txt is absent", async () => {
|
|
252
|
+
const fetchMock = vi.fn(async (input) => {
|
|
253
|
+
const url = String(input);
|
|
254
|
+
if (url === "https://example.com/llms.txt") {
|
|
255
|
+
return new Response("not found", { status: 404 });
|
|
256
|
+
}
|
|
257
|
+
if (url === "https://example.com/docs/llms.txt") {
|
|
258
|
+
return new Response("# Docs Root\n\n" + "Subpath llms content. ".repeat(10), {
|
|
259
|
+
status: 200,
|
|
260
|
+
headers: { "content-type": "text/plain" },
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
return new Response("not found", { status: 404 });
|
|
264
|
+
});
|
|
265
|
+
globalThis.fetch = fetchMock;
|
|
266
|
+
const result = await createWebFetchTool().execute({ url: "https://example.com/docs/guide/intro" }, context());
|
|
267
|
+
expect(result).toContain("[llms.txt for example.com]");
|
|
268
|
+
expect(result).toContain("Source: https://example.com/docs/llms.txt");
|
|
269
|
+
expect(result).toContain("Subpath llms content");
|
|
270
|
+
});
|
|
271
|
+
it("accepts markdown-looking llms body with octet-stream content type", async () => {
|
|
272
|
+
globalThis.fetch = vi.fn(async () => new Response("# Docs Index\n\n" + "- [Guide](./guide)\n- [API](./api)\n".repeat(8), {
|
|
273
|
+
status: 200,
|
|
274
|
+
headers: { "content-type": "application/octet-stream" },
|
|
275
|
+
}));
|
|
276
|
+
const result = await createWebFetchTool().execute({ url: "https://docs.example.com/api" }, context());
|
|
277
|
+
expect(result).toContain("[llms.txt for docs.example.com]");
|
|
278
|
+
expect(result).toContain("Docs Index");
|
|
279
|
+
});
|
|
280
|
+
it("rejects HTML error pages served with status 200", async () => {
|
|
281
|
+
const fetchMock = vi.fn(async (input) => {
|
|
282
|
+
const url = String(input);
|
|
283
|
+
if (url.includes("llms") || url.endsWith(".md")) {
|
|
284
|
+
return new Response("<!doctype html><html><head><title>404 Not Found</title></head><body>Missing</body></html>", {
|
|
285
|
+
status: 200,
|
|
286
|
+
headers: { "content-type": "text/html" },
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
return new Response(`<html><body><article><h1>Real Docs</h1><p>Scraped fallback content.</p></article></body></html>`, { status: 200, headers: { "content-type": "text/html" } });
|
|
290
|
+
});
|
|
291
|
+
globalThis.fetch = fetchMock;
|
|
292
|
+
const result = await createWebFetchTool().execute({ url: "https://docs.example.com/guide/page", format: "text" }, context());
|
|
293
|
+
expect(result).toContain("Real Docs");
|
|
294
|
+
expect(result).not.toContain("404 Not Found");
|
|
295
|
+
});
|
|
296
|
+
it("tries page URL .md when llms variants are absent", async () => {
|
|
297
|
+
const fetchMock = vi.fn(async (input) => {
|
|
298
|
+
const url = String(input);
|
|
299
|
+
if (url.endsWith("/reference/page.html.md")) {
|
|
300
|
+
return new Response("# Page Markdown\n\n" + "Specific markdown source. ".repeat(10), {
|
|
301
|
+
status: 200,
|
|
302
|
+
headers: { "content-type": "" },
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
if (url.includes("llms"))
|
|
306
|
+
return new Response("not found", { status: 404 });
|
|
307
|
+
return new Response("page", { status: 200 });
|
|
308
|
+
});
|
|
309
|
+
globalThis.fetch = fetchMock;
|
|
310
|
+
const result = await createWebFetchTool().execute({ url: "https://example.com/reference/page.html" }, context());
|
|
311
|
+
expect(result).toContain("[Markdown source for example.com/reference/page.html.md]");
|
|
312
|
+
expect(result).toContain("Specific markdown source");
|
|
313
|
+
});
|
|
314
|
+
it("uses preferred docs resources for multi-URL fetch sections", async () => {
|
|
315
|
+
const fetchMock = vi.fn(async (input) => {
|
|
316
|
+
const url = String(input);
|
|
317
|
+
if (url === "https://docs.a.com/llms.txt") {
|
|
318
|
+
return new Response("# A Docs\n\n" + "A llms content. ".repeat(10), {
|
|
319
|
+
status: 200,
|
|
320
|
+
headers: { "content-type": "text/plain" },
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
if (url === "https://docs.b.com/llms.txt") {
|
|
324
|
+
return new Response("# B Docs\n\n" + "B llms content. ".repeat(10), {
|
|
325
|
+
status: 200,
|
|
326
|
+
headers: { "content-type": "text/plain" },
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
return new Response("not found", { status: 404 });
|
|
330
|
+
});
|
|
331
|
+
globalThis.fetch = fetchMock;
|
|
332
|
+
const result = await createWebFetchTool().execute({ urls: ["https://docs.a.com/api", "https://docs.b.com/guide"] }, context());
|
|
333
|
+
expect(result).toContain("## https://docs.a.com/api");
|
|
334
|
+
expect(result).toContain("A llms content");
|
|
335
|
+
expect(result).toContain("## https://docs.b.com/guide");
|
|
336
|
+
expect(result).toContain("B llms content");
|
|
337
|
+
});
|
|
338
|
+
it("falls through to scraping when llms.txt is absent", async () => {
|
|
339
|
+
const fetchMock = vi.fn(async (input) => {
|
|
340
|
+
const url = String(input);
|
|
341
|
+
if (url.endsWith("/llms.txt")) {
|
|
342
|
+
return new Response("not found", { status: 404 });
|
|
343
|
+
}
|
|
344
|
+
return new Response(`<html><body><article><h1>Real Docs</h1><p>Scraped body content here.</p></article></body></html>`, { status: 200, headers: { "content-type": "text/html" } });
|
|
345
|
+
});
|
|
346
|
+
globalThis.fetch = fetchMock;
|
|
347
|
+
const result = await createWebFetchTool().execute({ url: "https://docs.example.com/guide/intro", format: "text" }, context());
|
|
348
|
+
expect(result).toContain("Real Docs");
|
|
349
|
+
expect(fetchMock).toHaveBeenCalledWith("https://docs.example.com/llms.txt", expect.anything());
|
|
350
|
+
expect(fetchMock).toHaveBeenCalledWith("https://docs.example.com/guide/intro", expect.anything());
|
|
351
|
+
});
|
|
352
|
+
it("skips the llms.txt probe when prefer_llms_txt is false", async () => {
|
|
353
|
+
const fetchMock = vi.fn(async () => new Response(`<html><body><article><h1>Direct</h1><p>Direct page body content.</p></article></body></html>`, { status: 200, headers: { "content-type": "text/html" } }));
|
|
354
|
+
globalThis.fetch = fetchMock;
|
|
355
|
+
const result = await createWebFetchTool().execute({ url: "https://docs.example.com/reference/api", prefer_llms_txt: false, format: "text" }, context());
|
|
356
|
+
expect(result).toContain("Direct");
|
|
357
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
358
|
+
});
|
|
98
359
|
});
|
|
99
360
|
//# sourceMappingURL=web-fetch.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.test.js","sourceRoot":"","sources":["../../src/tools/web-fetch.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"web-fetch.test.js","sourceRoot":"","sources":["../../src/tools/web-fetch.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { AgentTool } from "@kenkaiiii/gg-agent";
|
|
3
|
+
/**
|
|
4
|
+
* Normalize a domain to lowercase punycode hostname, defending against Unicode
|
|
5
|
+
* homograph spoofing. Returns null for un-parseable input.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeDomain(domain: string): string | null;
|
|
8
|
+
export declare function canonicalSearchResultUrl(rawURL: string): string | null;
|
|
3
9
|
export declare function isAdSearchResultUrl(rawURL: string): boolean;
|
|
4
10
|
declare const parameters: z.ZodObject<{
|
|
5
11
|
query: z.ZodString;
|
|
6
12
|
max_results: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
include_domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
14
|
+
exclude_domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
15
|
+
time_range: z.ZodOptional<z.ZodEnum<{
|
|
16
|
+
month: "month";
|
|
17
|
+
day: "day";
|
|
18
|
+
week: "week";
|
|
19
|
+
year: "year";
|
|
20
|
+
}>>;
|
|
7
21
|
}, z.core.$strip>;
|
|
8
22
|
export declare function createWebSearchTool(): AgentTool<typeof parameters>;
|
|
9
23
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAqDrD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ7D;AAiJD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqBtE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAkB3D;AA6cD,QAAA,MAAM,UAAU;;;;;;;;;;;iBAmBZ,CAAC;AAuBL,wBAAgB,mBAAmB,IAAI,SAAS,CAAC,OAAO,UAAU,CAAC,CAyClE"}
|