ai-agent-test 0.6.2 → 0.7.1
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/SYSTEM.md +4 -0
- package/TODOs.md +3 -3
- package/bin/ai +40 -3
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +11 -0
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/doc_retrieval.d.ts +35 -0
- package/dist/tools/doc_retrieval.d.ts.map +1 -0
- package/dist/tools/doc_retrieval.js +281 -0
- package/dist/tools/doc_retrieval.js.map +1 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +14 -3
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/index.d.ts +35 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/internet_search.d.ts +1 -1
- package/dist/tools/internet_search.d.ts.map +1 -1
- package/dist/tools/internet_search.js +26 -197
- package/dist/tools/internet_search.js.map +1 -1
- package/dist/tools/web_retrieval.d.ts +29 -0
- package/dist/tools/web_retrieval.d.ts.map +1 -0
- package/dist/tools/web_retrieval.js +230 -0
- package/dist/tools/web_retrieval.js.map +1 -0
- package/package.json +1 -1
package/SYSTEM.md
CHANGED
|
@@ -9,6 +9,7 @@ And read existing code and files enough before making changes, to avoid duplicat
|
|
|
9
9
|
2. When user says "commit" - Perform both `git add`, `git commit`, AND `git push` (no confirmation needed)
|
|
10
10
|
3. If you need more information to complete the task, ask the user a follow-up question using the `ask_user_followup` tool. You can call this multiple times if needed. You can use this tool to break loop if the agent falls into a loop with the same tool calling.
|
|
11
11
|
4. OUTPUT FORMAT: You are communicating through a raw, unformatted terminal interface. You must output absolute plain text only. Never use asterisks, underscores, or backticks. For emphasis, use ALL CAPS. For lists, use a standard dash (-) followed by a single space.
|
|
12
|
+
5. ALWAYS RE-READ FILES BEFORE EDITING - If you have previously read a file in this session, you MUST RE-READ it immediately before making ANY edits. The user may have manually modified files during the session, and you must not overwrite their changes. Run a fresh read() call before every edit() or write() operation.
|
|
12
13
|
|
|
13
14
|
## GIT BEST PRACTICES:
|
|
14
15
|
|
|
@@ -22,6 +23,9 @@ And read existing code and files enough before making changes, to avoid duplicat
|
|
|
22
23
|
- You can use built-in git commands using bash tools.
|
|
23
24
|
- Use `gh` (GitHub CLI) for GitHub operations
|
|
24
25
|
- Run `compilation_check` before committing to catch errors (e.g., `npx tsc --noEmit`, `npm run lint`)
|
|
26
|
+
- Use `doc_retrieval` for library, framework, database, API, and platform documentation questions. It can discover official docs on its own, but you can pass explicit URLs or preferred domains when they are already known.
|
|
27
|
+
- Prefer `doc_retrieval` over `internet_search` when the task needs reference docs or latest technical usage details. Use `internet_search` for broader web research, news, or non-documentation sources.
|
|
28
|
+
- If documentation output is missing key details, call `doc_retrieval` again with a higher `maxReadBodyLength`, or set it to `0` to disable truncation.
|
|
25
29
|
|
|
26
30
|
## METADATA:
|
|
27
31
|
|
package/TODOs.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
- [ ] concat ~/.ai/SYSTEM.md and project's .ai/SYSTEM.md to ai-agent's system prompt.
|
|
2
|
-
- [
|
|
3
|
-
- [ ] improve loop with testing tools so the agent can complete tasks in better shape.
|
|
1
|
+
- 1. [ ] concat ~/.ai/SYSTEM.md and project's .ai/SYSTEM.md to ai-agent's system prompt.
|
|
2
|
+
- 2. [x] add doc retrival tool. To get latest lib info so the agent can solve tasks more effectively. Not just library, it can be doc for technologies like postgres. so approach should be broader not just like npm library. and check internet_search tool if you can extract logic and have shared code. also improve SYSTEM.md once it's done.
|
|
3
|
+
- 3. [ ] improve loop with testing tools so the agent can complete tasks in better shape.
|
package/bin/ai
CHANGED
|
@@ -3,9 +3,44 @@
|
|
|
3
3
|
// Pass command-line arguments to the main module first
|
|
4
4
|
import { argv } from "process"
|
|
5
5
|
|
|
6
|
-
//
|
|
7
|
-
if (argv[2] === "models"
|
|
8
|
-
|
|
6
|
+
// Handle models command
|
|
7
|
+
if (argv[2] === "models") {
|
|
8
|
+
const subCommand = argv[3]
|
|
9
|
+
|
|
10
|
+
if (subCommand === "ls") {
|
|
11
|
+
// List all models
|
|
12
|
+
import("fs").then(({ readFileSync }) => {
|
|
13
|
+
import("os").then(({ homedir }) => {
|
|
14
|
+
import("path").then(({ join }) => {
|
|
15
|
+
try {
|
|
16
|
+
const modelsFile = join(homedir(), ".ai", "models.json")
|
|
17
|
+
const fileContent = readFileSync(modelsFile, "utf-8")
|
|
18
|
+
const models = JSON.parse(fileContent)
|
|
19
|
+
|
|
20
|
+
if (!Array.isArray(models) || models.length === 0) {
|
|
21
|
+
console.log("No models found in ~/.ai/models.json")
|
|
22
|
+
process.exit(1)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const displayPath = modelsFile.replace(homedir(), "~")
|
|
26
|
+
console.log(`Available models (${displayPath}):`)
|
|
27
|
+
models.forEach((model, index) => {
|
|
28
|
+
console.log(
|
|
29
|
+
`${index}. ${model.modelName} (${model.modelApiType})`,
|
|
30
|
+
)
|
|
31
|
+
})
|
|
32
|
+
process.exit(0)
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.error(`Failed to load models: ${error.message}`)
|
|
35
|
+
process.exit(1)
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
} else if (subCommand) {
|
|
41
|
+
// Set AI_MODEL_INDEX environment variable
|
|
42
|
+
process.env.AI_MODEL_INDEX = subCommand
|
|
43
|
+
}
|
|
9
44
|
}
|
|
10
45
|
|
|
11
46
|
// Load config after setting model index
|
|
@@ -38,6 +73,7 @@ if (argv[2] === "--help") {
|
|
|
38
73
|
Usage: ai [options] [model-index]
|
|
39
74
|
|
|
40
75
|
Commands:
|
|
76
|
+
models ls List all available models
|
|
41
77
|
models <idx> Run with model at index <idx> from config
|
|
42
78
|
sessions ls List last 20 sessions
|
|
43
79
|
sessions <idx> Load and restart from session <idx>
|
|
@@ -50,6 +86,7 @@ Arguments:
|
|
|
50
86
|
|
|
51
87
|
Examples:
|
|
52
88
|
ai # Run with default model
|
|
89
|
+
ai models ls # List all available models
|
|
53
90
|
ai models 1 # Run with second model in config
|
|
54
91
|
ai sessions ls # List last 20 sessions
|
|
55
92
|
ai sessions 2 # Load and restart from session 2
|
package/dist/tools/bash.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,QAAQ;;;;;;qCAiBhB;QACD,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB;
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,QAAQ;;;;;;qCAiBhB;QACD,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB;CAuHF,CAAA"}
|
package/dist/tools/bash.js
CHANGED
|
@@ -58,6 +58,17 @@ export const bashTool = {
|
|
|
58
58
|
}
|
|
59
59
|
else {
|
|
60
60
|
console.error(chalk.red(`[TOOL - bash] ⚠️ Command failed with code ${code}`));
|
|
61
|
+
// Print stderr output for visibility
|
|
62
|
+
if (stderrOutput.trim()) {
|
|
63
|
+
const lines = stderrOutput.trim().split("\n");
|
|
64
|
+
console.error(chalk.red(`[TOOL - bash] Stderr preview: ${lines[0]}...`));
|
|
65
|
+
if (lines.length > 1) {
|
|
66
|
+
console.error(chalk.red(`[TOOL - bash] ${lines[1]}...`));
|
|
67
|
+
if (lines.length > 2) {
|
|
68
|
+
console.error(chalk.red(`[TOOL - bash] and ${lines.length - 2} more line(s)`));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
61
72
|
resolve({
|
|
62
73
|
success: false,
|
|
63
74
|
error: `Command failed with code ${code}`,
|
package/dist/tools/bash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,WAAW,EAAE;;KAEV;IACH,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC3D,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CACP,8FAA8F,CAC/F;KACJ,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EACd,OAAO,EACP,OAAO,GAIR,EAAE,EAAE;QACH,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,+CAA+C,OAAO,OAAO,OAAO,EAAE,CACvE,CACF,CAAA;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;gBAC7C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAQ;aACvC,CAAC,CAAA;YAEF,IAAI,UAAU,GAAG,KAAK,CAAA;YACtB,IAAI,SAAS,GAA0B,IAAI,CAAA;YAC3C,MAAM,YAAY,GAAG,GAAG,EAAE;gBACxB,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,UAAU,GAAG,IAAI,CAAA;oBACjB,IAAI,SAAS,EAAE,CAAC;wBACd,YAAY,CAAC,SAAS,CAAC,CAAA;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC,CAAA;YAED,IAAI,MAAM,GAAG,EAAE,CAAA;YACf,IAAI,YAAY,GAAG,EAAE,CAAA;YAErB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACzC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;YAC3B,CAAC,CAAC,CAAA;YAEF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACzC,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;YACjC,CAAC,CAAC,CAAA;YAEF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;gBAC1C,YAAY,EAAE,CAAA;gBACd,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,+CAA+C;oBAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;oBACvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACrB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,iCAAiC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAC5D,CAAA;wBACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;4BACxD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACrB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CACT,qBAAqB,KAAK,CAAC,MAAM,GAAG,CAAC,eAAe,CACrD,CACF,CAAA;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,OAAO,CAAC;wBACN,OAAO,EAAE,IAAI;wBACb,MAAM,EAAE,WAAW,MAAM,mCAAmC;qBAC7D,CAAC,CAAA;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAC/D,CAAA;oBACD,OAAO,CAAC;wBACN,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,4BAA4B,IAAI,EAAE;wBACzC,MAAM,EAAE,YAAY,IAAI,SAAS;qBAClC,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC,CAAC,CAAA;YAEF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;gBACnC,YAAY,EAAE,CAAA;gBACd,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,oCAAoC,KAAK,CAAC,OAAO,EAAE,CAAC,CAC/D,CAAA;gBACD,OAAO,CAAC;oBACN,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,KAAK,CAAC,OAAO;oBACpB,MAAM,EAAE,SAAS;iBAClB,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;YAEF,cAAc;YACd,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,OAAO,GAAG,IAAI,CAAA;gBAChC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC1B,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;wBACnC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;wBACvB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,4CAA4C,OAAO,UAAU,CAC9D,CACF,CAAA;wBACD,OAAO,CAAC;4BACN,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,2BAA2B,OAAO,UAAU;4BACnD,MAAM,EAAE,wCAAwC;yBACjD,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC,EAAE,SAAS,CAAC,CAAA;YACf,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAA"}
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const docRetrieval: {
|
|
3
|
+
description: string;
|
|
4
|
+
inputSchema: z.ZodObject<{
|
|
5
|
+
query: z.ZodString;
|
|
6
|
+
urls: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
7
|
+
preferredDomains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
8
|
+
maxResults: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
9
|
+
maxReadBodyLength: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
execute: ({ query, urls, preferredDomains, maxResults, maxReadBodyLength, }: {
|
|
12
|
+
query: string;
|
|
13
|
+
urls?: string[];
|
|
14
|
+
preferredDomains?: string[];
|
|
15
|
+
maxResults?: number;
|
|
16
|
+
maxReadBodyLength?: number;
|
|
17
|
+
}) => Promise<{
|
|
18
|
+
success: boolean;
|
|
19
|
+
error: string;
|
|
20
|
+
output?: never;
|
|
21
|
+
metadata?: never;
|
|
22
|
+
} | {
|
|
23
|
+
success: boolean;
|
|
24
|
+
output: string;
|
|
25
|
+
metadata: {
|
|
26
|
+
maxResults: number;
|
|
27
|
+
maxReadBodyLength: number;
|
|
28
|
+
preferredDomains: string[];
|
|
29
|
+
searchQueries: string[];
|
|
30
|
+
resultCount: number;
|
|
31
|
+
};
|
|
32
|
+
error?: never;
|
|
33
|
+
}>;
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=doc_retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc_retrieval.d.ts","sourceRoot":"","sources":["../../src/tools/doc_retrieval.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAkQvB,eAAO,MAAM,YAAY;;;;;;;;;iFAuCpB;QACD,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;QAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAC3B;;;;;;;;;;;;;;;;;CAqHF,CAAA"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { assert } from "console";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { searchWeb, tryFetchExtractedPageContent, } from "./web_retrieval.js";
|
|
5
|
+
const DOC_HOST_BONUS = new Set([
|
|
6
|
+
"developer.mozilla.org",
|
|
7
|
+
"docs.github.com",
|
|
8
|
+
"docs.python.org",
|
|
9
|
+
]);
|
|
10
|
+
const LOW_SIGNAL_HOST_PENALTIES = new Set([
|
|
11
|
+
"dev.to",
|
|
12
|
+
"medium.com",
|
|
13
|
+
"hashnode.com",
|
|
14
|
+
"reddit.com",
|
|
15
|
+
"stackoverflow.com",
|
|
16
|
+
"geeksforgeeks.org",
|
|
17
|
+
]);
|
|
18
|
+
const KNOWN_DOC_DOMAINS = [
|
|
19
|
+
{ match: /\bpostgres(?:ql)?\b/i, domains: ["postgresql.org"] },
|
|
20
|
+
{ match: /\breact\b/i, domains: ["react.dev"] },
|
|
21
|
+
{ match: /\bnext(?:\.js|js)?\b/i, domains: ["nextjs.org"] },
|
|
22
|
+
{ match: /\bnode(?:\.js|js)?\b/i, domains: ["nodejs.org"] },
|
|
23
|
+
{ match: /\btypescript\b/i, domains: ["typescriptlang.org"] },
|
|
24
|
+
{ match: /\bjavascript\b|\bmdn\b/i, domains: ["developer.mozilla.org"] },
|
|
25
|
+
{ match: /\bprisma\b/i, domains: ["prisma.io"] },
|
|
26
|
+
{ match: /\btailwind\b/i, domains: ["tailwindcss.com"] },
|
|
27
|
+
{ match: /\bvite\b/i, domains: ["vite.dev"] },
|
|
28
|
+
{ match: /\bopenai\b/i, domains: ["platform.openai.com"] },
|
|
29
|
+
{ match: /\banthropic\b|\bclaude\b/i, domains: ["docs.anthropic.com"] },
|
|
30
|
+
];
|
|
31
|
+
function uniqueStrings(values) {
|
|
32
|
+
return [...new Set(values.filter(Boolean))];
|
|
33
|
+
}
|
|
34
|
+
function normalizeDomain(value) {
|
|
35
|
+
return value
|
|
36
|
+
.trim()
|
|
37
|
+
.replace(/^https?:\/\//, "")
|
|
38
|
+
.replace(/^www\./, "")
|
|
39
|
+
.replace(/\/.*$/, "")
|
|
40
|
+
.toLowerCase();
|
|
41
|
+
}
|
|
42
|
+
function normalizeUrl(url) {
|
|
43
|
+
return url.replace(/[),.;!?]+$/, "");
|
|
44
|
+
}
|
|
45
|
+
function extractUrls(text) {
|
|
46
|
+
const matches = text.match(/https?:\/\/[^\s]+/g) || [];
|
|
47
|
+
return uniqueStrings(matches.map(normalizeUrl));
|
|
48
|
+
}
|
|
49
|
+
function getHostname(url) {
|
|
50
|
+
return new URL(url).hostname.replace(/^www\./, "").toLowerCase();
|
|
51
|
+
}
|
|
52
|
+
function getPathname(url) {
|
|
53
|
+
return new URL(url).pathname.toLowerCase();
|
|
54
|
+
}
|
|
55
|
+
function inferDocDomains(query) {
|
|
56
|
+
const domains = [];
|
|
57
|
+
for (const candidate of KNOWN_DOC_DOMAINS) {
|
|
58
|
+
if (candidate.match.test(query)) {
|
|
59
|
+
domains.push(...candidate.domains);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return uniqueStrings(domains);
|
|
63
|
+
}
|
|
64
|
+
function buildSearchQueries({ query, preferredDomains, }) {
|
|
65
|
+
const queries = [`${query} official documentation`, `${query} docs`];
|
|
66
|
+
for (const domain of preferredDomains.slice(0, 4)) {
|
|
67
|
+
queries.push(`site:${domain} ${query}`);
|
|
68
|
+
}
|
|
69
|
+
return uniqueStrings(queries);
|
|
70
|
+
}
|
|
71
|
+
function scoreSearchResult({ result, preferredDomains, }) {
|
|
72
|
+
const reasons = [];
|
|
73
|
+
let score = 0;
|
|
74
|
+
try {
|
|
75
|
+
const hostname = getHostname(result.url);
|
|
76
|
+
const pathname = getPathname(result.url);
|
|
77
|
+
const titleAndDescription = `${result.title} ${result.description || ""}`.toLowerCase();
|
|
78
|
+
if (preferredDomains.some((domain) => hostname === domain || hostname.endsWith(`.${domain}`))) {
|
|
79
|
+
score += 45;
|
|
80
|
+
reasons.push("preferred domain");
|
|
81
|
+
}
|
|
82
|
+
if (hostname.startsWith("docs.")) {
|
|
83
|
+
score += 18;
|
|
84
|
+
reasons.push("docs subdomain");
|
|
85
|
+
}
|
|
86
|
+
if (DOC_HOST_BONUS.has(hostname)) {
|
|
87
|
+
score += 25;
|
|
88
|
+
reasons.push("trusted documentation host");
|
|
89
|
+
}
|
|
90
|
+
if (/(\/docs?\/|\/reference\/|\/api\/|\/guide\/|\/manual\/|\/learn\/)/.test(pathname)) {
|
|
91
|
+
score += 14;
|
|
92
|
+
reasons.push("documentation path");
|
|
93
|
+
}
|
|
94
|
+
if (/(docs|documentation|reference|guide|manual)/.test(titleAndDescription)) {
|
|
95
|
+
score += 10;
|
|
96
|
+
reasons.push("documentation title");
|
|
97
|
+
}
|
|
98
|
+
if (/(blog|news|release notes)/.test(titleAndDescription) ||
|
|
99
|
+
pathname.includes("/blog/")) {
|
|
100
|
+
score -= 10;
|
|
101
|
+
reasons.push("blog-like result");
|
|
102
|
+
}
|
|
103
|
+
if (LOW_SIGNAL_HOST_PENALTIES.has(hostname)) {
|
|
104
|
+
score -= 25;
|
|
105
|
+
reasons.push("low-signal host");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
score -= 100;
|
|
110
|
+
reasons.push("invalid url");
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
...result,
|
|
114
|
+
score,
|
|
115
|
+
reasons,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function dedupeResults(results) {
|
|
119
|
+
const seen = new Set();
|
|
120
|
+
const deduped = [];
|
|
121
|
+
for (const result of results) {
|
|
122
|
+
const normalizedUrl = normalizeUrl(result.url);
|
|
123
|
+
if (seen.has(normalizedUrl)) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
seen.add(normalizedUrl);
|
|
127
|
+
deduped.push({
|
|
128
|
+
...result,
|
|
129
|
+
url: normalizedUrl,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return deduped;
|
|
133
|
+
}
|
|
134
|
+
async function resolveCandidateUrls({ query, explicitUrls, preferredDomains, maxResults, apiKey, }) {
|
|
135
|
+
const explicitResults = explicitUrls.map((url) => ({
|
|
136
|
+
url,
|
|
137
|
+
title: url,
|
|
138
|
+
description: "Explicit URL from request",
|
|
139
|
+
}));
|
|
140
|
+
const needsSearch = explicitResults.length < maxResults;
|
|
141
|
+
const searchQueries = needsSearch
|
|
142
|
+
? buildSearchQueries({ query, preferredDomains })
|
|
143
|
+
: [];
|
|
144
|
+
const discoveredResults = needsSearch
|
|
145
|
+
? (await Promise.all(searchQueries.slice(0, 5).map((searchQuery) => searchWeb({
|
|
146
|
+
query: searchQuery,
|
|
147
|
+
count: Math.min(3, maxResults),
|
|
148
|
+
apiKey,
|
|
149
|
+
}).catch(() => [])))).flat()
|
|
150
|
+
: [];
|
|
151
|
+
const rankedResults = dedupeResults([
|
|
152
|
+
...explicitResults,
|
|
153
|
+
...discoveredResults,
|
|
154
|
+
])
|
|
155
|
+
.map((result) => scoreSearchResult({
|
|
156
|
+
result,
|
|
157
|
+
preferredDomains,
|
|
158
|
+
}))
|
|
159
|
+
.sort((left, right) => right.score - left.score)
|
|
160
|
+
.slice(0, maxResults);
|
|
161
|
+
return {
|
|
162
|
+
rankedResults,
|
|
163
|
+
searchQueries,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export const docRetrieval = {
|
|
167
|
+
description: "Retrieve documentation pages for libraries, frameworks, platforms, databases, and other technologies. This tool can discover official docs automatically, prefers authoritative sources, and reads more content per page than general internet search. Set maxReadBodyLength to 0 to disable truncation.",
|
|
168
|
+
inputSchema: z.object({
|
|
169
|
+
query: z
|
|
170
|
+
.string()
|
|
171
|
+
.describe("The documentation question or topic to research."),
|
|
172
|
+
urls: z
|
|
173
|
+
.array(z.string().url())
|
|
174
|
+
.optional()
|
|
175
|
+
.describe("Optional documentation URLs to fetch directly before searching."),
|
|
176
|
+
preferredDomains: z
|
|
177
|
+
.array(z.string())
|
|
178
|
+
.optional()
|
|
179
|
+
.describe("Optional preferred domains such as react.dev or postgresql.org."),
|
|
180
|
+
maxResults: z
|
|
181
|
+
.number()
|
|
182
|
+
.max(5)
|
|
183
|
+
.default(3)
|
|
184
|
+
.optional()
|
|
185
|
+
.describe("Maximum number of documentation pages to return."),
|
|
186
|
+
maxReadBodyLength: z
|
|
187
|
+
.number()
|
|
188
|
+
.default(12000)
|
|
189
|
+
.optional()
|
|
190
|
+
.describe("Approximate characters to return from each page after extraction. Use 0 for no truncation."),
|
|
191
|
+
}),
|
|
192
|
+
execute: async ({ query, urls = [], preferredDomains = [], maxResults = 3, maxReadBodyLength = 12000, }) => {
|
|
193
|
+
const explicitUrls = uniqueStrings([...urls, ...extractUrls(query)]);
|
|
194
|
+
const resolvedDomains = uniqueStrings([
|
|
195
|
+
...preferredDomains.map(normalizeDomain),
|
|
196
|
+
...inferDocDomains(query),
|
|
197
|
+
]);
|
|
198
|
+
const needsSearch = explicitUrls.length < maxResults;
|
|
199
|
+
const apiKey = process.env.BRAVE_API_KEY || "";
|
|
200
|
+
if (needsSearch) {
|
|
201
|
+
assert(apiKey, "BRAVE_API_KEY environment variable is required when doc retrieval needs web search");
|
|
202
|
+
}
|
|
203
|
+
console.log(chalk.yellow(`\n[TOOL - doc_retrieval] Query: ${query}`));
|
|
204
|
+
if (resolvedDomains.length > 0) {
|
|
205
|
+
console.log(chalk.green(`[TOOL - doc_retrieval] Preferred domains: ${resolvedDomains.join(", ")}`));
|
|
206
|
+
}
|
|
207
|
+
const { rankedResults, searchQueries } = await resolveCandidateUrls({
|
|
208
|
+
query,
|
|
209
|
+
explicitUrls,
|
|
210
|
+
preferredDomains: resolvedDomains,
|
|
211
|
+
maxResults,
|
|
212
|
+
apiKey,
|
|
213
|
+
});
|
|
214
|
+
if (rankedResults.length === 0) {
|
|
215
|
+
return {
|
|
216
|
+
success: false,
|
|
217
|
+
error: "No documentation results found",
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
const documents = await Promise.all(rankedResults.map(async (result, index) => {
|
|
221
|
+
console.log(chalk.green(`[TOOL - doc_retrieval] Result ${index + 1}: ${result.title} - ${result.url}`));
|
|
222
|
+
const pageResult = await tryFetchExtractedPageContent(maxReadBodyLength
|
|
223
|
+
? {
|
|
224
|
+
url: result.url,
|
|
225
|
+
maxLength: maxReadBodyLength,
|
|
226
|
+
}
|
|
227
|
+
: {
|
|
228
|
+
url: result.url,
|
|
229
|
+
});
|
|
230
|
+
if (pageResult.success) {
|
|
231
|
+
return {
|
|
232
|
+
...result,
|
|
233
|
+
content: pageResult.content,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
...result,
|
|
238
|
+
error: pageResult.error,
|
|
239
|
+
};
|
|
240
|
+
}));
|
|
241
|
+
const successfulDocuments = documents.filter((document) => document.content);
|
|
242
|
+
if (successfulDocuments.length === 0) {
|
|
243
|
+
return {
|
|
244
|
+
success: false,
|
|
245
|
+
error: "Unable to fetch any documentation pages",
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
const output = documents
|
|
249
|
+
.map((document, index) => [
|
|
250
|
+
`## Doc ${index + 1}: ${document.title}`,
|
|
251
|
+
`URL: ${document.url}`,
|
|
252
|
+
`Score: ${document.score}`,
|
|
253
|
+
document.reasons.length > 0
|
|
254
|
+
? `Why selected: ${document.reasons.join(", ")}`
|
|
255
|
+
: "",
|
|
256
|
+
document.description ? `Summary: ${document.description}` : "",
|
|
257
|
+
"",
|
|
258
|
+
document.error
|
|
259
|
+
? `[fetch failed] ${document.error}`
|
|
260
|
+
: document.content || "",
|
|
261
|
+
]
|
|
262
|
+
.filter(Boolean)
|
|
263
|
+
.join("\n"))
|
|
264
|
+
.join("\n\n---\n\n");
|
|
265
|
+
const truncationNotice = maxReadBodyLength
|
|
266
|
+
? `[Content limited to about ${maxReadBodyLength} characters per page. Increase maxReadBodyLength or set it to 0 if needed.]`
|
|
267
|
+
: "[Content is not truncated.]";
|
|
268
|
+
return {
|
|
269
|
+
success: true,
|
|
270
|
+
output: `${output}\n\n${truncationNotice}`,
|
|
271
|
+
metadata: {
|
|
272
|
+
maxResults,
|
|
273
|
+
maxReadBodyLength,
|
|
274
|
+
preferredDomains: resolvedDomains,
|
|
275
|
+
searchQueries,
|
|
276
|
+
resultCount: successfulDocuments.length,
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
//# sourceMappingURL=doc_retrieval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc_retrieval.js","sourceRoot":"","sources":["../../src/tools/doc_retrieval.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/edit.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
export interface Edit {
|
|
3
3
|
oldText: string;
|
|
4
4
|
newText: string;
|
|
5
|
+
replaceAll?: boolean;
|
|
5
6
|
}
|
|
6
7
|
export declare const editTool: {
|
|
7
8
|
description: string;
|
|
@@ -10,6 +11,7 @@ export declare const editTool: {
|
|
|
10
11
|
edits: z.ZodArray<z.ZodObject<{
|
|
11
12
|
oldText: z.ZodString;
|
|
12
13
|
newText: z.ZodString;
|
|
14
|
+
replaceAll: z.ZodOptional<z.ZodBoolean>;
|
|
13
15
|
}, z.core.$strip>>;
|
|
14
16
|
}, z.core.$strip>;
|
|
15
17
|
execute: ({ path: filePath, edits, }: {
|
package/dist/tools/edit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;0CA2BhB;QACD,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,IAAI,EAAE,CAAA;KACd;;;;;;;;;;;;;;;CA+DF,CAAA"}
|
package/dist/tools/edit.js
CHANGED
|
@@ -12,8 +12,12 @@ export const editTool = {
|
|
|
12
12
|
.string()
|
|
13
13
|
.describe("The exact text for JS's `replace()` function"),
|
|
14
14
|
newText: z.string().describe("The new text to insert"),
|
|
15
|
+
replaceAll: z
|
|
16
|
+
.boolean()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("If true, replace all occurrences instead of just the first one"),
|
|
15
19
|
}))
|
|
16
|
-
.describe("Array of edits
|
|
20
|
+
.describe("Array of edits to apply. Use multiple edits in one call (oneshot) when modifying several parts of the file."),
|
|
17
21
|
}),
|
|
18
22
|
execute: async ({ path: filePath, edits, }) => {
|
|
19
23
|
console.log(chalk.yellow(`\n[TOOL - edit] Editing file: ${filePath} (edits: ${edits.length})`));
|
|
@@ -29,9 +33,16 @@ export const editTool = {
|
|
|
29
33
|
let editsApplied = 0;
|
|
30
34
|
for (const edit of edits) {
|
|
31
35
|
const existingContent = content;
|
|
32
|
-
|
|
33
|
-
if (
|
|
36
|
+
let newContent = content;
|
|
37
|
+
if (edit.replaceAll) {
|
|
38
|
+
newContent = content.replaceAll(edit.oldText, edit.newText);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
newContent = content.replace(edit.oldText, edit.newText);
|
|
42
|
+
}
|
|
43
|
+
if (newContent !== content) {
|
|
34
44
|
editsApplied++;
|
|
45
|
+
content = newContent;
|
|
35
46
|
}
|
|
36
47
|
else {
|
|
37
48
|
console.warn(chalk.yellow(`[TOOL - edit] ⚠️ oldText not found in file: ${edit.oldText.substring(0, 50)}...`));
|
package/dist/tools/edit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export declare const toolNames: {
|
|
|
3
3
|
readonly recordProgress: "record_progress";
|
|
4
4
|
readonly bash: "bash";
|
|
5
5
|
readonly internetSearch: "internet_search";
|
|
6
|
+
readonly docRetrieval: "doc_retrieval";
|
|
6
7
|
readonly read: "read";
|
|
7
8
|
readonly write: "write";
|
|
8
9
|
readonly edit: "edit";
|
|
@@ -55,6 +56,36 @@ export declare const tools: {
|
|
|
55
56
|
searchCount: number;
|
|
56
57
|
query: string;
|
|
57
58
|
maxReadBodyLength: number;
|
|
59
|
+
}) => Promise<{
|
|
60
|
+
success: boolean;
|
|
61
|
+
error: any;
|
|
62
|
+
output?: never;
|
|
63
|
+
metadata?: never;
|
|
64
|
+
} | {
|
|
65
|
+
success: boolean;
|
|
66
|
+
output: string;
|
|
67
|
+
metadata: {
|
|
68
|
+
maxReadBodyLength: number;
|
|
69
|
+
resultCount: number;
|
|
70
|
+
};
|
|
71
|
+
error?: never;
|
|
72
|
+
}>;
|
|
73
|
+
};
|
|
74
|
+
readonly doc_retrieval: {
|
|
75
|
+
description: string;
|
|
76
|
+
inputSchema: import("zod").ZodObject<{
|
|
77
|
+
query: import("zod").ZodString;
|
|
78
|
+
urls: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
79
|
+
preferredDomains: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
80
|
+
maxResults: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodNumber>>;
|
|
81
|
+
maxReadBodyLength: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodNumber>>;
|
|
82
|
+
}, import("zod/v4/core").$strip>;
|
|
83
|
+
execute: ({ query, urls, preferredDomains, maxResults, maxReadBodyLength, }: {
|
|
84
|
+
query: string;
|
|
85
|
+
urls?: string[];
|
|
86
|
+
preferredDomains?: string[];
|
|
87
|
+
maxResults?: number;
|
|
88
|
+
maxReadBodyLength?: number;
|
|
58
89
|
}) => Promise<{
|
|
59
90
|
success: boolean;
|
|
60
91
|
error: string;
|
|
@@ -64,7 +95,10 @@ export declare const tools: {
|
|
|
64
95
|
success: boolean;
|
|
65
96
|
output: string;
|
|
66
97
|
metadata: {
|
|
98
|
+
maxResults: number;
|
|
67
99
|
maxReadBodyLength: number;
|
|
100
|
+
preferredDomains: string[];
|
|
101
|
+
searchQueries: string[];
|
|
68
102
|
resultCount: number;
|
|
69
103
|
};
|
|
70
104
|
error?: never;
|
|
@@ -122,6 +156,7 @@ export declare const tools: {
|
|
|
122
156
|
edits: import("zod").ZodArray<import("zod").ZodObject<{
|
|
123
157
|
oldText: import("zod").ZodString;
|
|
124
158
|
newText: import("zod").ZodString;
|
|
159
|
+
replaceAll: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
125
160
|
}, import("zod/v4/core").$strip>>;
|
|
126
161
|
}, import("zod/v4/core").$strip>;
|
|
127
162
|
execute: ({ path: filePath, edits, }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,SAAS;;;;;;;;;;CAUZ,CAAA;AAEV,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAAL,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAWs9L,CAAC;4BAA+B,CAAC;sBAAyB,CAAC;6BAA8B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAV9iM,CAAC;iBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CASP,CAAA"}
|
package/dist/tools/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import { askUserFollowup } from "./ask_user_followup.js";
|
|
|
2
2
|
import { recordProgress } from "./record_progress.js";
|
|
3
3
|
import { bashTool } from "./bash.js";
|
|
4
4
|
import { internetSearch } from "./internet_search.js";
|
|
5
|
+
import { docRetrieval } from "./doc_retrieval.js";
|
|
5
6
|
import { readTool } from "./read.js";
|
|
6
7
|
import { writeTool } from "./write.js";
|
|
7
8
|
import { editTool } from "./edit.js";
|
|
@@ -11,6 +12,7 @@ export const toolNames = {
|
|
|
11
12
|
recordProgress: "record_progress",
|
|
12
13
|
bash: "bash",
|
|
13
14
|
internetSearch: "internet_search",
|
|
15
|
+
docRetrieval: "doc_retrieval",
|
|
14
16
|
read: "read",
|
|
15
17
|
write: "write",
|
|
16
18
|
edit: "edit",
|
|
@@ -21,6 +23,7 @@ export const tools = {
|
|
|
21
23
|
[toolNames.recordProgress]: recordProgress,
|
|
22
24
|
[toolNames.bash]: bashTool,
|
|
23
25
|
[toolNames.internetSearch]: internetSearch,
|
|
26
|
+
[toolNames.docRetrieval]: docRetrieval,
|
|
24
27
|
[toolNames.read]: readTool,
|
|
25
28
|
[toolNames.write]: writeTool,
|
|
26
29
|
[toolNames.edit]: editTool,
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAG7D,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,eAAe,EAAE,mBAAmB;IACpC,cAAc,EAAE,iBAAiB;IACjC,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,iBAAiB;IACjC,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,gBAAgB,EAAE,mBAAmB;CAC7B,CAAA;AAEV,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,eAAe;IAC5C,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,cAAc;IAC1C,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ;IAC1B,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,cAAc;IAC1C,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ;IAC1B,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,SAAS;IAC5B,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ;IAC1B,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,oBAAoB;CACxB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAG7D,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,eAAe,EAAE,mBAAmB;IACpC,cAAc,EAAE,iBAAiB;IACjC,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,iBAAiB;IACjC,YAAY,EAAE,eAAe;IAC7B,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,gBAAgB,EAAE,mBAAmB;CAC7B,CAAA;AAEV,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,eAAe;IAC5C,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,cAAc;IAC1C,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ;IAC1B,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,cAAc;IAC1C,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,YAAY;IACtC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ;IAC1B,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,SAAS;IAC5B,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ;IAC1B,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,oBAAoB;CACxB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internet_search.d.ts","sourceRoot":"","sources":["../../src/tools/internet_search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"internet_search.d.ts","sourceRoot":"","sources":["../../src/tools/internet_search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,cAAc;;;;;;;0DAwBtB;QACD,WAAW,EAAE,MAAM,CAAA;QACnB,KAAK,EAAE,MAAM,CAAA;QACb,iBAAiB,EAAE,MAAM,CAAA;KAC1B;;;;;;;;;;;;;;CA4FF,CAAA"}
|
|
@@ -1,182 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { JSDOM } from "jsdom";
|
|
3
2
|
import { assert } from "console";
|
|
4
3
|
import chalk from "chalk";
|
|
5
|
-
|
|
6
|
-
"article",
|
|
7
|
-
"main",
|
|
8
|
-
"[role='main']",
|
|
9
|
-
"#content",
|
|
10
|
-
".content",
|
|
11
|
-
".main-content",
|
|
12
|
-
".post-content",
|
|
13
|
-
".entry-content",
|
|
14
|
-
".article-content",
|
|
15
|
-
];
|
|
16
|
-
const NOISE_SELECTORS = [
|
|
17
|
-
"script",
|
|
18
|
-
"style",
|
|
19
|
-
"noscript",
|
|
20
|
-
"iframe",
|
|
21
|
-
"svg",
|
|
22
|
-
"canvas",
|
|
23
|
-
"form",
|
|
24
|
-
"nav",
|
|
25
|
-
"header",
|
|
26
|
-
"footer",
|
|
27
|
-
"aside",
|
|
28
|
-
"dialog",
|
|
29
|
-
"button",
|
|
30
|
-
"input",
|
|
31
|
-
"select",
|
|
32
|
-
"textarea",
|
|
33
|
-
"[role='banner']",
|
|
34
|
-
"[role='navigation']",
|
|
35
|
-
"[role='complementary']",
|
|
36
|
-
"[role='dialog']",
|
|
37
|
-
"[aria-hidden='true']",
|
|
38
|
-
"[hidden]",
|
|
39
|
-
".nav",
|
|
40
|
-
".navbar",
|
|
41
|
-
".menu",
|
|
42
|
-
".sidebar",
|
|
43
|
-
".footer",
|
|
44
|
-
".header",
|
|
45
|
-
".advertisement",
|
|
46
|
-
".ads",
|
|
47
|
-
".cookie",
|
|
48
|
-
".newsletter",
|
|
49
|
-
".share",
|
|
50
|
-
".social",
|
|
51
|
-
".popup",
|
|
52
|
-
".modal",
|
|
53
|
-
];
|
|
54
|
-
function collapseWhitespace(text) {
|
|
55
|
-
return text.replace(/\s+/g, " ").trim();
|
|
56
|
-
}
|
|
57
|
-
function cleanInlineText(text) {
|
|
58
|
-
return text
|
|
59
|
-
.replace(/[ \t]+/g, " ")
|
|
60
|
-
.replace(/\n{3,}/g, "\n\n")
|
|
61
|
-
.replace(/[ \t]+\n/g, "\n")
|
|
62
|
-
.replace(/\n[ \t]+/g, "\n")
|
|
63
|
-
.trim();
|
|
64
|
-
}
|
|
65
|
-
function removeNoise(root) {
|
|
66
|
-
for (const selector of NOISE_SELECTORS) {
|
|
67
|
-
root.querySelectorAll(selector).forEach((element) => element.remove());
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
function scoreContentCandidate(element) {
|
|
71
|
-
const textLength = collapseWhitespace(element.textContent || "").length;
|
|
72
|
-
const paragraphCount = element.querySelectorAll("p").length;
|
|
73
|
-
const headingCount = element.querySelectorAll("h1, h2, h3").length;
|
|
74
|
-
return textLength + paragraphCount * 120 + headingCount * 80;
|
|
75
|
-
}
|
|
76
|
-
function pickContentRoot(document) {
|
|
77
|
-
const candidates = CONTENT_CANDIDATE_SELECTORS.flatMap((selector) => Array.from(document.querySelectorAll(selector)));
|
|
78
|
-
const bestCandidate = candidates
|
|
79
|
-
.map((element) => ({ element, score: scoreContentCandidate(element) }))
|
|
80
|
-
.sort((left, right) => right.score - left.score)[0];
|
|
81
|
-
return bestCandidate?.element || document.body;
|
|
82
|
-
}
|
|
83
|
-
function renderNode(node) {
|
|
84
|
-
if (node.nodeType === node.TEXT_NODE) {
|
|
85
|
-
return collapseWhitespace(node.textContent || "");
|
|
86
|
-
}
|
|
87
|
-
if (!(node instanceof node.ownerDocument.defaultView.HTMLElement)) {
|
|
88
|
-
return "";
|
|
89
|
-
}
|
|
90
|
-
const element = node;
|
|
91
|
-
const tagName = element.tagName.toLowerCase();
|
|
92
|
-
const renderedChildren = Array.from(element.childNodes)
|
|
93
|
-
.map((child) => renderNode(child))
|
|
94
|
-
.join("");
|
|
95
|
-
if (tagName === "br") {
|
|
96
|
-
return "\n";
|
|
97
|
-
}
|
|
98
|
-
if (tagName === "hr") {
|
|
99
|
-
return "\n---\n\n";
|
|
100
|
-
}
|
|
101
|
-
if (tagName === "a") {
|
|
102
|
-
const text = collapseWhitespace(renderedChildren || element.textContent || "");
|
|
103
|
-
const href = element.getAttribute("href") || "";
|
|
104
|
-
if (!text) {
|
|
105
|
-
return "";
|
|
106
|
-
}
|
|
107
|
-
if (!href || href.startsWith("#")) {
|
|
108
|
-
return text;
|
|
109
|
-
}
|
|
110
|
-
return `[${text}](${href})`;
|
|
111
|
-
}
|
|
112
|
-
if (tagName === "code" &&
|
|
113
|
-
element.parentElement?.tagName.toLowerCase() !== "pre") {
|
|
114
|
-
const text = collapseWhitespace(element.textContent || "");
|
|
115
|
-
return text ? `\`${text}\`` : "";
|
|
116
|
-
}
|
|
117
|
-
if (tagName === "pre") {
|
|
118
|
-
const text = (element.textContent || "").trim();
|
|
119
|
-
return text ? `\n\n\`\`\`\n${text}\n\`\`\`\n\n` : "";
|
|
120
|
-
}
|
|
121
|
-
if (/^h[1-6]$/.test(tagName)) {
|
|
122
|
-
const level = Number(tagName[1]);
|
|
123
|
-
const text = collapseWhitespace(renderedChildren || element.textContent || "");
|
|
124
|
-
return text ? `\n\n${"#".repeat(level)} ${text}\n\n` : "";
|
|
125
|
-
}
|
|
126
|
-
if (tagName === "p") {
|
|
127
|
-
const text = cleanInlineText(renderedChildren);
|
|
128
|
-
return text ? `${text}\n\n` : "";
|
|
129
|
-
}
|
|
130
|
-
if (tagName === "blockquote") {
|
|
131
|
-
const text = cleanInlineText(renderedChildren);
|
|
132
|
-
return text
|
|
133
|
-
? `${text
|
|
134
|
-
.split("\n")
|
|
135
|
-
.map((line) => `> ${line}`)
|
|
136
|
-
.join("\n")}\n\n`
|
|
137
|
-
: "";
|
|
138
|
-
}
|
|
139
|
-
if (tagName === "li") {
|
|
140
|
-
const text = cleanInlineText(renderedChildren);
|
|
141
|
-
return text ? `- ${text}\n` : "";
|
|
142
|
-
}
|
|
143
|
-
if (tagName === "ul" || tagName === "ol") {
|
|
144
|
-
const text = cleanInlineText(renderedChildren);
|
|
145
|
-
return text ? `${text}\n` : "";
|
|
146
|
-
}
|
|
147
|
-
if (tagName === "table") {
|
|
148
|
-
const rows = Array.from(element.querySelectorAll("tr"))
|
|
149
|
-
.map((row) => Array.from(row.querySelectorAll("th, td"))
|
|
150
|
-
.map((cell) => collapseWhitespace(cell.textContent || ""))
|
|
151
|
-
.filter(Boolean)
|
|
152
|
-
.join(" | "))
|
|
153
|
-
.filter(Boolean);
|
|
154
|
-
return rows.length > 0 ? `${rows.join("\n")}\n\n` : "";
|
|
155
|
-
}
|
|
156
|
-
if (["section", "article", "main", "div"].includes(tagName)) {
|
|
157
|
-
const text = cleanInlineText(renderedChildren);
|
|
158
|
-
return text ? `${text}\n\n` : "";
|
|
159
|
-
}
|
|
160
|
-
return renderedChildren;
|
|
161
|
-
}
|
|
162
|
-
function extractMarkdownFromHtml(html, pageUrl) {
|
|
163
|
-
const dom = new JSDOM(html, { url: pageUrl });
|
|
164
|
-
const { document } = dom.window;
|
|
165
|
-
removeNoise(document);
|
|
166
|
-
const contentRoot = pickContentRoot(document);
|
|
167
|
-
removeNoise(contentRoot);
|
|
168
|
-
return cleanInlineText(renderNode(contentRoot));
|
|
169
|
-
}
|
|
170
|
-
function truncateContent(content, maxLength) {
|
|
171
|
-
if (content.length <= maxLength) {
|
|
172
|
-
return content;
|
|
173
|
-
}
|
|
174
|
-
const truncated = content.slice(0, maxLength);
|
|
175
|
-
const lastParagraphBreak = truncated.lastIndexOf("\n\n");
|
|
176
|
-
const lastSentenceBreak = Math.max(truncated.lastIndexOf(". "), truncated.lastIndexOf("! "), truncated.lastIndexOf("? "));
|
|
177
|
-
const cutIndex = Math.max(lastParagraphBreak, lastSentenceBreak);
|
|
178
|
-
return `${truncated.slice(0, cutIndex > maxLength * 0.6 ? cutIndex + 1 : maxLength).trim()}\n\n[truncated]`;
|
|
179
|
-
}
|
|
4
|
+
import { searchWeb, tryFetchExtractedPageContent } from "./web_retrieval.js";
|
|
180
5
|
export const internetSearch = {
|
|
181
6
|
description: "Search the internet. IMPORTANT: If the 'output' is truncated or missing key details, call this tool again with a significantly higher 'maxReadBodyLength' (e.g., 5000 or 10000) to see more content.",
|
|
182
7
|
inputSchema: z.object({
|
|
@@ -195,24 +20,22 @@ export const internetSearch = {
|
|
|
195
20
|
execute: async ({ searchCount, query, maxReadBodyLength, }) => {
|
|
196
21
|
const apiKey = process.env.BRAVE_API_KEY || "";
|
|
197
22
|
assert(apiKey, "BRAVE_API_KEY environment variable is required for internetSearch tool");
|
|
198
|
-
const url = `https://api.search.brave.com/res/v1/web/search?${new URLSearchParams({ q: query, count: searchCount.toString() })}`;
|
|
199
23
|
console.log(chalk.yellow(`\n[TOOL - internet_search] Search: ${query}`));
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
24
|
+
let results;
|
|
25
|
+
try {
|
|
26
|
+
results = await searchWeb({
|
|
27
|
+
query,
|
|
28
|
+
count: searchCount,
|
|
29
|
+
apiKey,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.log(chalk.red(`\n[TOOL - internet_search] ⚠️ ${error.message}`));
|
|
209
34
|
return {
|
|
210
35
|
success: false,
|
|
211
|
-
error:
|
|
36
|
+
error: error.message,
|
|
212
37
|
};
|
|
213
38
|
}
|
|
214
|
-
const data = await response.json();
|
|
215
|
-
const { results } = data.web || {};
|
|
216
39
|
if (!results || results.length === 0) {
|
|
217
40
|
console.log(chalk.red("[TOOL - internet_search] ⚠️ No search results found"));
|
|
218
41
|
return {
|
|
@@ -222,18 +45,24 @@ export const internetSearch = {
|
|
|
222
45
|
}
|
|
223
46
|
const contents = await Promise.all(results.map(async (result, index) => {
|
|
224
47
|
console.log(chalk.green(`[TOOL - internet_search] Result ${index + 1}: ${result.title} - ${result.url}`));
|
|
225
|
-
const
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
48
|
+
const pageResult = await tryFetchExtractedPageContent({
|
|
49
|
+
url: result.url,
|
|
50
|
+
maxLength: maxReadBodyLength,
|
|
51
|
+
});
|
|
52
|
+
if (!pageResult.success) {
|
|
53
|
+
console.log(chalk.red(`[TOOL - internet_search] ⚠️ Failed to fetch ${result.url}: ${pageResult.error}`));
|
|
54
|
+
return {
|
|
55
|
+
url: result.url,
|
|
56
|
+
title: result.title,
|
|
57
|
+
description: result.description,
|
|
58
|
+
content: `[fetch failed] ${pageResult.error}`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
232
61
|
return {
|
|
233
62
|
url: result.url,
|
|
234
63
|
title: result.title,
|
|
235
64
|
description: result.description,
|
|
236
|
-
content,
|
|
65
|
+
content: pageResult.content,
|
|
237
66
|
};
|
|
238
67
|
}));
|
|
239
68
|
const output = contents
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internet_search.js","sourceRoot":"","sources":["../../src/tools/internet_search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"internet_search.js","sourceRoot":"","sources":["../../src/tools/internet_search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface WebSearchResult {
|
|
2
|
+
url: string;
|
|
3
|
+
title: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
}
|
|
6
|
+
export type PageContentResult = {
|
|
7
|
+
success: true;
|
|
8
|
+
content: string;
|
|
9
|
+
} | {
|
|
10
|
+
success: false;
|
|
11
|
+
error: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function extractMarkdownFromHtml(html: string, pageUrl: string): string;
|
|
14
|
+
export declare function truncateContent(content: string, maxLength?: number): string;
|
|
15
|
+
export declare function searchWeb({ query, count, apiKey, }: {
|
|
16
|
+
query: string;
|
|
17
|
+
count: number;
|
|
18
|
+
apiKey: string;
|
|
19
|
+
}): Promise<WebSearchResult[]>;
|
|
20
|
+
export declare function fetchPageHtml(url: string): Promise<string>;
|
|
21
|
+
export declare function fetchExtractedPageContent({ url, maxLength, }: {
|
|
22
|
+
url: string;
|
|
23
|
+
maxLength?: number;
|
|
24
|
+
}): Promise<string>;
|
|
25
|
+
export declare function tryFetchExtractedPageContent(args: {
|
|
26
|
+
url: string;
|
|
27
|
+
maxLength?: number;
|
|
28
|
+
}): Promise<PageContentResult>;
|
|
29
|
+
//# sourceMappingURL=web_retrieval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web_retrieval.d.ts","sourceRoot":"","sources":["../../src/tools/web_retrieval.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,MAAM,iBAAiB,GACzB;IACE,OAAO,EAAE,IAAI,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB,GACD;IACE,OAAO,EAAE,KAAK,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAwML,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO7E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAe3E;AAED,wBAAsB,SAAS,CAAC,EAC9B,KAAK,EACL,KAAK,EACL,MAAM,GACP,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA2B7B;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUhE;AAED,wBAAsB,yBAAyB,CAAC,EAC9C,GAAG,EACH,SAAS,GACV,EAAE;IACD,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlB;AAED,wBAAsB,4BAA4B,CAAC,IAAI,EAAE;IACvD,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAa7B"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { JSDOM } from "jsdom";
|
|
2
|
+
const CONTENT_CANDIDATE_SELECTORS = [
|
|
3
|
+
"article",
|
|
4
|
+
"main",
|
|
5
|
+
"[role='main']",
|
|
6
|
+
"#content",
|
|
7
|
+
".content",
|
|
8
|
+
".main-content",
|
|
9
|
+
".post-content",
|
|
10
|
+
".entry-content",
|
|
11
|
+
".article-content",
|
|
12
|
+
];
|
|
13
|
+
const NOISE_SELECTORS = [
|
|
14
|
+
"script",
|
|
15
|
+
"style",
|
|
16
|
+
"noscript",
|
|
17
|
+
"iframe",
|
|
18
|
+
"svg",
|
|
19
|
+
"canvas",
|
|
20
|
+
"form",
|
|
21
|
+
"nav",
|
|
22
|
+
"header",
|
|
23
|
+
"footer",
|
|
24
|
+
"aside",
|
|
25
|
+
"dialog",
|
|
26
|
+
"button",
|
|
27
|
+
"input",
|
|
28
|
+
"select",
|
|
29
|
+
"textarea",
|
|
30
|
+
"[role='banner']",
|
|
31
|
+
"[role='navigation']",
|
|
32
|
+
"[role='complementary']",
|
|
33
|
+
"[role='dialog']",
|
|
34
|
+
"[aria-hidden='true']",
|
|
35
|
+
"[hidden]",
|
|
36
|
+
".nav",
|
|
37
|
+
".navbar",
|
|
38
|
+
".menu",
|
|
39
|
+
".sidebar",
|
|
40
|
+
".footer",
|
|
41
|
+
".header",
|
|
42
|
+
".advertisement",
|
|
43
|
+
".ads",
|
|
44
|
+
".cookie",
|
|
45
|
+
".newsletter",
|
|
46
|
+
".share",
|
|
47
|
+
".social",
|
|
48
|
+
".popup",
|
|
49
|
+
".modal",
|
|
50
|
+
];
|
|
51
|
+
const DEFAULT_PAGE_HEADERS = {
|
|
52
|
+
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
|
|
53
|
+
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
54
|
+
};
|
|
55
|
+
function collapseWhitespace(text) {
|
|
56
|
+
return text.replace(/\s+/g, " ").trim();
|
|
57
|
+
}
|
|
58
|
+
function cleanInlineText(text) {
|
|
59
|
+
return text
|
|
60
|
+
.replace(/[ \t]+/g, " ")
|
|
61
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
62
|
+
.replace(/[ \t]+\n/g, "\n")
|
|
63
|
+
.replace(/\n[ \t]+/g, "\n")
|
|
64
|
+
.trim();
|
|
65
|
+
}
|
|
66
|
+
function removeNoise(root) {
|
|
67
|
+
for (const selector of NOISE_SELECTORS) {
|
|
68
|
+
root.querySelectorAll(selector).forEach((element) => element.remove());
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function scoreContentCandidate(element) {
|
|
72
|
+
const textLength = collapseWhitespace(element.textContent || "").length;
|
|
73
|
+
const paragraphCount = element.querySelectorAll("p").length;
|
|
74
|
+
const headingCount = element.querySelectorAll("h1, h2, h3").length;
|
|
75
|
+
return textLength + paragraphCount * 120 + headingCount * 80;
|
|
76
|
+
}
|
|
77
|
+
function pickContentRoot(document) {
|
|
78
|
+
const candidates = CONTENT_CANDIDATE_SELECTORS.flatMap((selector) => Array.from(document.querySelectorAll(selector)));
|
|
79
|
+
const bestCandidate = candidates
|
|
80
|
+
.map((element) => ({ element, score: scoreContentCandidate(element) }))
|
|
81
|
+
.sort((left, right) => right.score - left.score)[0];
|
|
82
|
+
return bestCandidate?.element || document.body;
|
|
83
|
+
}
|
|
84
|
+
function renderNode(node) {
|
|
85
|
+
if (node.nodeType === node.TEXT_NODE) {
|
|
86
|
+
return collapseWhitespace(node.textContent || "");
|
|
87
|
+
}
|
|
88
|
+
if (!(node instanceof node.ownerDocument.defaultView.HTMLElement)) {
|
|
89
|
+
return "";
|
|
90
|
+
}
|
|
91
|
+
const element = node;
|
|
92
|
+
const tagName = element.tagName.toLowerCase();
|
|
93
|
+
const renderedChildren = Array.from(element.childNodes)
|
|
94
|
+
.map((child) => renderNode(child))
|
|
95
|
+
.join("");
|
|
96
|
+
if (tagName === "br") {
|
|
97
|
+
return "\n";
|
|
98
|
+
}
|
|
99
|
+
if (tagName === "hr") {
|
|
100
|
+
return "\n---\n\n";
|
|
101
|
+
}
|
|
102
|
+
if (tagName === "a") {
|
|
103
|
+
const text = collapseWhitespace(renderedChildren || element.textContent || "");
|
|
104
|
+
const href = element.getAttribute("href") || "";
|
|
105
|
+
if (!text) {
|
|
106
|
+
return "";
|
|
107
|
+
}
|
|
108
|
+
if (!href || href.startsWith("#")) {
|
|
109
|
+
return text;
|
|
110
|
+
}
|
|
111
|
+
return `[${text}](${href})`;
|
|
112
|
+
}
|
|
113
|
+
if (tagName === "code" &&
|
|
114
|
+
element.parentElement?.tagName.toLowerCase() !== "pre") {
|
|
115
|
+
const text = collapseWhitespace(element.textContent || "");
|
|
116
|
+
return text ? `\`${text}\`` : "";
|
|
117
|
+
}
|
|
118
|
+
if (tagName === "pre") {
|
|
119
|
+
const text = (element.textContent || "").trim();
|
|
120
|
+
return text ? `\n\n\`\`\`\n${text}\n\`\`\`\n\n` : "";
|
|
121
|
+
}
|
|
122
|
+
if (/^h[1-6]$/.test(tagName)) {
|
|
123
|
+
const level = Number(tagName[1]);
|
|
124
|
+
const text = collapseWhitespace(renderedChildren || element.textContent || "");
|
|
125
|
+
return text ? `\n\n${"#".repeat(level)} ${text}\n\n` : "";
|
|
126
|
+
}
|
|
127
|
+
if (tagName === "p") {
|
|
128
|
+
const text = cleanInlineText(renderedChildren);
|
|
129
|
+
return text ? `${text}\n\n` : "";
|
|
130
|
+
}
|
|
131
|
+
if (tagName === "blockquote") {
|
|
132
|
+
const text = cleanInlineText(renderedChildren);
|
|
133
|
+
return text
|
|
134
|
+
? `${text
|
|
135
|
+
.split("\n")
|
|
136
|
+
.map((line) => `> ${line}`)
|
|
137
|
+
.join("\n")}\n\n`
|
|
138
|
+
: "";
|
|
139
|
+
}
|
|
140
|
+
if (tagName === "li") {
|
|
141
|
+
const text = cleanInlineText(renderedChildren);
|
|
142
|
+
return text ? `- ${text}\n` : "";
|
|
143
|
+
}
|
|
144
|
+
if (tagName === "ul" || tagName === "ol") {
|
|
145
|
+
const text = cleanInlineText(renderedChildren);
|
|
146
|
+
return text ? `${text}\n` : "";
|
|
147
|
+
}
|
|
148
|
+
if (tagName === "table") {
|
|
149
|
+
const rows = Array.from(element.querySelectorAll("tr"))
|
|
150
|
+
.map((row) => Array.from(row.querySelectorAll("th, td"))
|
|
151
|
+
.map((cell) => collapseWhitespace(cell.textContent || ""))
|
|
152
|
+
.filter(Boolean)
|
|
153
|
+
.join(" | "))
|
|
154
|
+
.filter(Boolean);
|
|
155
|
+
return rows.length > 0 ? `${rows.join("\n")}\n\n` : "";
|
|
156
|
+
}
|
|
157
|
+
if (["section", "article", "main", "div"].includes(tagName)) {
|
|
158
|
+
const text = cleanInlineText(renderedChildren);
|
|
159
|
+
return text ? `${text}\n\n` : "";
|
|
160
|
+
}
|
|
161
|
+
return renderedChildren;
|
|
162
|
+
}
|
|
163
|
+
export function extractMarkdownFromHtml(html, pageUrl) {
|
|
164
|
+
const dom = new JSDOM(html, { url: pageUrl });
|
|
165
|
+
const { document } = dom.window;
|
|
166
|
+
removeNoise(document);
|
|
167
|
+
const contentRoot = pickContentRoot(document);
|
|
168
|
+
removeNoise(contentRoot);
|
|
169
|
+
return cleanInlineText(renderNode(contentRoot));
|
|
170
|
+
}
|
|
171
|
+
export function truncateContent(content, maxLength) {
|
|
172
|
+
if (!maxLength || content.length <= maxLength) {
|
|
173
|
+
return content;
|
|
174
|
+
}
|
|
175
|
+
const truncated = content.slice(0, maxLength);
|
|
176
|
+
const lastParagraphBreak = truncated.lastIndexOf("\n\n");
|
|
177
|
+
const lastSentenceBreak = Math.max(truncated.lastIndexOf(". "), truncated.lastIndexOf("! "), truncated.lastIndexOf("? "));
|
|
178
|
+
const cutIndex = Math.max(lastParagraphBreak, lastSentenceBreak);
|
|
179
|
+
return `${truncated.slice(0, cutIndex > maxLength * 0.6 ? cutIndex + 1 : maxLength).trim()}\n\n[truncated]`;
|
|
180
|
+
}
|
|
181
|
+
export async function searchWeb({ query, count, apiKey, }) {
|
|
182
|
+
const url = `https://api.search.brave.com/res/v1/web/search?${new URLSearchParams({ q: query, count: count.toString() })}`;
|
|
183
|
+
const response = await fetch(url, {
|
|
184
|
+
headers: {
|
|
185
|
+
Accept: "application/json",
|
|
186
|
+
"Accept-Encoding": "gzip",
|
|
187
|
+
"X-Subscription-Token": apiKey,
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
if (!response.ok) {
|
|
191
|
+
throw new Error(`Search API error: ${response.status} ${response.statusText}`);
|
|
192
|
+
}
|
|
193
|
+
const data = await response.json();
|
|
194
|
+
const results = data.web?.results;
|
|
195
|
+
if (!results || results.length === 0) {
|
|
196
|
+
return [];
|
|
197
|
+
}
|
|
198
|
+
return results.map((result) => ({
|
|
199
|
+
url: result.url,
|
|
200
|
+
title: result.title,
|
|
201
|
+
description: result.description,
|
|
202
|
+
}));
|
|
203
|
+
}
|
|
204
|
+
export async function fetchPageHtml(url) {
|
|
205
|
+
const response = await fetch(url, { headers: DEFAULT_PAGE_HEADERS });
|
|
206
|
+
if (!response.ok) {
|
|
207
|
+
throw new Error(`Page fetch error: ${response.status} ${response.statusText}`);
|
|
208
|
+
}
|
|
209
|
+
return response.text();
|
|
210
|
+
}
|
|
211
|
+
export async function fetchExtractedPageContent({ url, maxLength, }) {
|
|
212
|
+
const html = await fetchPageHtml(url);
|
|
213
|
+
return truncateContent(extractMarkdownFromHtml(html, url), maxLength);
|
|
214
|
+
}
|
|
215
|
+
export async function tryFetchExtractedPageContent(args) {
|
|
216
|
+
try {
|
|
217
|
+
const content = await fetchExtractedPageContent(args);
|
|
218
|
+
return {
|
|
219
|
+
success: true,
|
|
220
|
+
content,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
return {
|
|
225
|
+
success: false,
|
|
226
|
+
error: error.message,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=web_retrieval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web_retrieval.js","sourceRoot":"","sources":["../../src/tools/web_retrieval.ts"],"names":[],"mappings":"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"}
|