@antaif3ng/til-work 0.1.0
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/README.md +573 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/agent.d.ts +78 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +372 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/compaction.d.ts +40 -0
- package/dist/core/compaction.d.ts.map +1 -0
- package/dist/core/compaction.js +228 -0
- package/dist/core/compaction.js.map +1 -0
- package/dist/core/config.d.ts +54 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +257 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/llm.d.ts +29 -0
- package/dist/core/llm.d.ts.map +1 -0
- package/dist/core/llm.js +553 -0
- package/dist/core/llm.js.map +1 -0
- package/dist/core/markdown.d.ts +20 -0
- package/dist/core/markdown.d.ts.map +1 -0
- package/dist/core/markdown.js +173 -0
- package/dist/core/markdown.js.map +1 -0
- package/dist/core/memory.d.ts +30 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +163 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/pricing.d.ts +21 -0
- package/dist/core/pricing.d.ts.map +1 -0
- package/dist/core/pricing.js +70 -0
- package/dist/core/pricing.js.map +1 -0
- package/dist/core/session-manager.d.ts +83 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +250 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/session.d.ts +76 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +270 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/skills.d.ts +49 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +232 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/system-prompt.d.ts +17 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +77 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/tool-permissions.d.ts +12 -0
- package/dist/core/tool-permissions.d.ts.map +1 -0
- package/dist/core/tool-permissions.js +71 -0
- package/dist/core/tool-permissions.js.map +1 -0
- package/dist/core/types.d.ts +157 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +21 -0
- package/dist/core/types.js.map +1 -0
- package/dist/extensions/builtin/mcp.d.ts +61 -0
- package/dist/extensions/builtin/mcp.d.ts.map +1 -0
- package/dist/extensions/builtin/mcp.js +407 -0
- package/dist/extensions/builtin/mcp.js.map +1 -0
- package/dist/extensions/index.d.ts +4 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +3 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/loader.d.ts +19 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +118 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/runner.d.ts +28 -0
- package/dist/extensions/runner.d.ts.map +1 -0
- package/dist/extensions/runner.js +77 -0
- package/dist/extensions/runner.js.map +1 -0
- package/dist/extensions/types.d.ts +84 -0
- package/dist/extensions/types.d.ts.map +1 -0
- package/dist/extensions/types.js +6 -0
- package/dist/extensions/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +5 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +355 -0
- package/dist/main.js.map +1 -0
- package/dist/modes/interactive.d.ts +6 -0
- package/dist/modes/interactive.d.ts.map +1 -0
- package/dist/modes/interactive.js +961 -0
- package/dist/modes/interactive.js.map +1 -0
- package/dist/modes/oneshot.d.ts +8 -0
- package/dist/modes/oneshot.d.ts.map +1 -0
- package/dist/modes/oneshot.js +71 -0
- package/dist/modes/oneshot.js.map +1 -0
- package/dist/tools/bash.d.ts +3 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +104 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +3 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +63 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/file-manager.d.ts +3 -0
- package/dist/tools/file-manager.d.ts.map +1 -0
- package/dist/tools/file-manager.js +85 -0
- package/dist/tools/file-manager.js.map +1 -0
- package/dist/tools/index.d.ts +17 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +42 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/read.d.ts +3 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +65 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/system-info.d.ts +3 -0
- package/dist/tools/system-info.d.ts.map +1 -0
- package/dist/tools/system-info.js +101 -0
- package/dist/tools/system-info.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +3 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +117 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +9 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +124 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write.d.ts +3 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +30 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/utils/autocomplete.d.ts +23 -0
- package/dist/utils/autocomplete.d.ts.map +1 -0
- package/dist/utils/autocomplete.js +191 -0
- package/dist/utils/autocomplete.js.map +1 -0
- package/dist/utils/file-processor.d.ts +19 -0
- package/dist/utils/file-processor.d.ts.map +1 -0
- package/dist/utils/file-processor.js +86 -0
- package/dist/utils/file-processor.js.map +1 -0
- package/dist/utils/path.d.ts +8 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +60 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/shell.d.ts +6 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +64 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/truncate.d.ts +12 -0
- package/dist/utils/truncate.d.ts.map +1 -0
- package/dist/utils/truncate.js +46 -0
- package/dist/utils/truncate.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access, readFile } from "node:fs/promises";
|
|
3
|
+
import { resolveToCwd } from "../utils/path.js";
|
|
4
|
+
import { MAX_BYTES, MAX_LINES, truncateHead } from "../utils/truncate.js";
|
|
5
|
+
export function createReadTool(cwd) {
|
|
6
|
+
return {
|
|
7
|
+
name: "read",
|
|
8
|
+
label: "Read",
|
|
9
|
+
description: `Read contents of a file. Output is truncated to ${MAX_LINES} lines or ${MAX_BYTES / 1024}KB. Use offset/limit for large files.`,
|
|
10
|
+
parameters: {
|
|
11
|
+
type: "object",
|
|
12
|
+
properties: {
|
|
13
|
+
path: { type: "string", description: "Path to the file to read (relative or absolute)" },
|
|
14
|
+
offset: { type: "number", description: "Line number to start reading from (1-indexed)" },
|
|
15
|
+
limit: { type: "number", description: "Maximum number of lines to read" },
|
|
16
|
+
},
|
|
17
|
+
required: ["path"],
|
|
18
|
+
},
|
|
19
|
+
execute: async (_toolCallId, params, signal) => {
|
|
20
|
+
const { path, offset, limit } = params;
|
|
21
|
+
const absolutePath = resolveToCwd(path, cwd);
|
|
22
|
+
if (signal?.aborted)
|
|
23
|
+
throw new Error("Operation aborted");
|
|
24
|
+
await access(absolutePath, constants.R_OK);
|
|
25
|
+
const buffer = await readFile(absolutePath);
|
|
26
|
+
const textContent = buffer.toString("utf-8");
|
|
27
|
+
const allLines = textContent.split("\n");
|
|
28
|
+
const totalFileLines = allLines.length;
|
|
29
|
+
const startLine = offset ? Math.max(0, offset - 1) : 0;
|
|
30
|
+
if (startLine >= allLines.length) {
|
|
31
|
+
throw new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`);
|
|
32
|
+
}
|
|
33
|
+
let selectedContent;
|
|
34
|
+
let userLimitedLines;
|
|
35
|
+
if (limit !== undefined) {
|
|
36
|
+
const endLine = Math.min(startLine + limit, allLines.length);
|
|
37
|
+
selectedContent = allLines.slice(startLine, endLine).join("\n");
|
|
38
|
+
userLimitedLines = endLine - startLine;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
selectedContent = allLines.slice(startLine).join("\n");
|
|
42
|
+
}
|
|
43
|
+
const truncation = truncateHead(selectedContent);
|
|
44
|
+
let outputText;
|
|
45
|
+
const startLineDisplay = startLine + 1;
|
|
46
|
+
if (truncation.truncated) {
|
|
47
|
+
const endLineDisplay = startLineDisplay + truncation.outputLines - 1;
|
|
48
|
+
const nextOffset = endLineDisplay + 1;
|
|
49
|
+
outputText = truncation.content;
|
|
50
|
+
outputText += `\n\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`;
|
|
51
|
+
}
|
|
52
|
+
else if (userLimitedLines !== undefined && startLine + userLimitedLines < allLines.length) {
|
|
53
|
+
const remaining = allLines.length - (startLine + userLimitedLines);
|
|
54
|
+
const nextOffset = startLine + userLimitedLines + 1;
|
|
55
|
+
outputText = truncation.content;
|
|
56
|
+
outputText += `\n\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
outputText = truncation.content;
|
|
60
|
+
}
|
|
61
|
+
return { content: [{ type: "text", text: outputText }] };
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-info.d.ts","sourceRoot":"","sources":["../../src/tools/system-info.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAoBlD,wBAAgB,oBAAoB,IAAI,SAAS,CAmFhD"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import * as os from "node:os";
|
|
2
|
+
function formatBytes(bytes) {
|
|
3
|
+
const gb = bytes / (1024 * 1024 * 1024);
|
|
4
|
+
if (gb >= 1)
|
|
5
|
+
return `${gb.toFixed(1)} GB`;
|
|
6
|
+
const mb = bytes / (1024 * 1024);
|
|
7
|
+
return `${mb.toFixed(0)} MB`;
|
|
8
|
+
}
|
|
9
|
+
function formatUptime(seconds) {
|
|
10
|
+
const days = Math.floor(seconds / 86400);
|
|
11
|
+
const hours = Math.floor((seconds % 86400) / 3600);
|
|
12
|
+
const minutes = Math.floor((seconds % 3600) / 60);
|
|
13
|
+
const parts = [];
|
|
14
|
+
if (days > 0)
|
|
15
|
+
parts.push(`${days}d`);
|
|
16
|
+
if (hours > 0)
|
|
17
|
+
parts.push(`${hours}h`);
|
|
18
|
+
parts.push(`${minutes}m`);
|
|
19
|
+
return parts.join(" ");
|
|
20
|
+
}
|
|
21
|
+
export function createSystemInfoTool() {
|
|
22
|
+
return {
|
|
23
|
+
name: "system_info",
|
|
24
|
+
label: "System Info",
|
|
25
|
+
description: "Get system information: OS, CPU, memory, disk usage, network interfaces, environment variables, and running processes overview.",
|
|
26
|
+
parameters: {
|
|
27
|
+
type: "object",
|
|
28
|
+
properties: {
|
|
29
|
+
category: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "Info category: 'all', 'os', 'cpu', 'memory', 'network', 'env'. Default: 'all'",
|
|
32
|
+
enum: ["all", "os", "cpu", "memory", "network", "env"],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
execute: async (_toolCallId, params) => {
|
|
37
|
+
const category = params.category || "all";
|
|
38
|
+
const sections = [];
|
|
39
|
+
if (category === "all" || category === "os") {
|
|
40
|
+
sections.push([
|
|
41
|
+
"## OS Information",
|
|
42
|
+
`Platform: ${os.platform()} (${os.arch()})`,
|
|
43
|
+
`OS Release: ${os.release()}`,
|
|
44
|
+
`Hostname: ${os.hostname()}`,
|
|
45
|
+
`Uptime: ${formatUptime(os.uptime())}`,
|
|
46
|
+
`Home Directory: ${os.homedir()}`,
|
|
47
|
+
`Temp Directory: ${os.tmpdir()}`,
|
|
48
|
+
`Shell: ${process.env.SHELL || "unknown"}`,
|
|
49
|
+
`Node.js: ${process.version}`,
|
|
50
|
+
`User: ${os.userInfo().username}`,
|
|
51
|
+
].join("\n"));
|
|
52
|
+
}
|
|
53
|
+
if (category === "all" || category === "cpu") {
|
|
54
|
+
const cpus = os.cpus();
|
|
55
|
+
sections.push([
|
|
56
|
+
"## CPU Information",
|
|
57
|
+
`Model: ${cpus[0]?.model || "unknown"}`,
|
|
58
|
+
`Cores: ${cpus.length}`,
|
|
59
|
+
`Load Average (1m/5m/15m): ${os.loadavg().map((l) => l.toFixed(2)).join(" / ")}`,
|
|
60
|
+
].join("\n"));
|
|
61
|
+
}
|
|
62
|
+
if (category === "all" || category === "memory") {
|
|
63
|
+
const totalMem = os.totalmem();
|
|
64
|
+
const freeMem = os.freemem();
|
|
65
|
+
const usedMem = totalMem - freeMem;
|
|
66
|
+
sections.push([
|
|
67
|
+
"## Memory",
|
|
68
|
+
`Total: ${formatBytes(totalMem)}`,
|
|
69
|
+
`Used: ${formatBytes(usedMem)} (${((usedMem / totalMem) * 100).toFixed(1)}%)`,
|
|
70
|
+
`Free: ${formatBytes(freeMem)}`,
|
|
71
|
+
].join("\n"));
|
|
72
|
+
}
|
|
73
|
+
if (category === "all" || category === "network") {
|
|
74
|
+
const interfaces = os.networkInterfaces();
|
|
75
|
+
const netLines = ["## Network Interfaces"];
|
|
76
|
+
for (const [name, addrs] of Object.entries(interfaces)) {
|
|
77
|
+
if (!addrs)
|
|
78
|
+
continue;
|
|
79
|
+
for (const addr of addrs) {
|
|
80
|
+
if (addr.internal)
|
|
81
|
+
continue;
|
|
82
|
+
netLines.push(`${name}: ${addr.address} (${addr.family})`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
sections.push(netLines.join("\n"));
|
|
86
|
+
}
|
|
87
|
+
if (category === "env") {
|
|
88
|
+
const envLines = ["## Environment Variables"];
|
|
89
|
+
const importantKeys = ["PATH", "HOME", "USER", "SHELL", "LANG", "TERM", "EDITOR", "NODE_ENV"];
|
|
90
|
+
for (const key of importantKeys) {
|
|
91
|
+
if (process.env[key]) {
|
|
92
|
+
envLines.push(`${key}: ${process.env[key]}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
sections.push(envLines.join("\n"));
|
|
96
|
+
}
|
|
97
|
+
return { content: [{ type: "text", text: sections.join("\n\n") }] };
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=system-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-info.js","sourceRoot":"","sources":["../../src/tools/system-info.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,wBAAgB,kBAAkB,IAAI,SAAS,CAyE9C"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
const MAX_CONTENT_LENGTH = 50000;
|
|
2
|
+
export function createWebFetchTool() {
|
|
3
|
+
return {
|
|
4
|
+
name: "web_fetch",
|
|
5
|
+
label: "Web Fetch",
|
|
6
|
+
description: "Fetch the content of a web page and return it as readable text. Use this after web_search to read the full content of a specific URL.",
|
|
7
|
+
parameters: {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
url: { type: "string", description: "The URL to fetch" },
|
|
11
|
+
max_length: { type: "number", description: "Maximum character length of returned content (default: 50000)" },
|
|
12
|
+
},
|
|
13
|
+
required: ["url"],
|
|
14
|
+
},
|
|
15
|
+
execute: async (_toolCallId, params, signal) => {
|
|
16
|
+
const { url, max_length } = params;
|
|
17
|
+
const maxLen = Math.min(max_length || MAX_CONTENT_LENGTH, MAX_CONTENT_LENGTH);
|
|
18
|
+
if (signal?.aborted)
|
|
19
|
+
throw new Error("Operation aborted");
|
|
20
|
+
try {
|
|
21
|
+
new URL(url);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return { content: [{ type: "text", text: `Invalid URL: ${url}` }] };
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const response = await fetch(url, {
|
|
28
|
+
headers: {
|
|
29
|
+
"User-Agent": "Mozilla/5.0 (compatible; TIL-CLI/0.1; +https://github.com/til-cli)",
|
|
30
|
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.5",
|
|
31
|
+
},
|
|
32
|
+
signal,
|
|
33
|
+
redirect: "follow",
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
return {
|
|
37
|
+
content: [{ type: "text", text: `HTTP error ${response.status}: ${response.statusText} for ${url}` }],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const contentType = response.headers.get("content-type") || "";
|
|
41
|
+
if (contentType.includes("application/json")) {
|
|
42
|
+
const json = await response.text();
|
|
43
|
+
const truncated = json.slice(0, maxLen);
|
|
44
|
+
return {
|
|
45
|
+
content: [{
|
|
46
|
+
type: "text",
|
|
47
|
+
text: truncated + (json.length > maxLen ? "\n\n[Content truncated]" : ""),
|
|
48
|
+
}],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const html = await response.text();
|
|
52
|
+
const text = htmlToText(html);
|
|
53
|
+
const truncated = text.slice(0, maxLen);
|
|
54
|
+
return {
|
|
55
|
+
content: [{
|
|
56
|
+
type: "text",
|
|
57
|
+
text: truncated + (text.length > maxLen ? "\n\n[Content truncated]" : ""),
|
|
58
|
+
}],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
return {
|
|
63
|
+
content: [{
|
|
64
|
+
type: "text",
|
|
65
|
+
text: `Failed to fetch ${url}: ${err.message}`,
|
|
66
|
+
}],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function htmlToText(html) {
|
|
73
|
+
let text = html;
|
|
74
|
+
// Remove script and style blocks
|
|
75
|
+
text = text.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "");
|
|
76
|
+
text = text.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, "");
|
|
77
|
+
text = text.replace(/<noscript[^>]*>[\s\S]*?<\/noscript>/gi, "");
|
|
78
|
+
// Extract title
|
|
79
|
+
const titleMatch = text.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
|
|
80
|
+
const title = titleMatch ? titleMatch[1].replace(/<[^>]*>/g, "").trim() : "";
|
|
81
|
+
// Convert headers to markdown-style
|
|
82
|
+
text = text.replace(/<h1[^>]*>([\s\S]*?)<\/h1>/gi, "\n# $1\n");
|
|
83
|
+
text = text.replace(/<h2[^>]*>([\s\S]*?)<\/h2>/gi, "\n## $1\n");
|
|
84
|
+
text = text.replace(/<h3[^>]*>([\s\S]*?)<\/h3>/gi, "\n### $1\n");
|
|
85
|
+
text = text.replace(/<h[4-6][^>]*>([\s\S]*?)<\/h[4-6]>/gi, "\n#### $1\n");
|
|
86
|
+
// Convert links: keep href visible
|
|
87
|
+
text = text.replace(/<a[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/gi, "$2 ($1)");
|
|
88
|
+
// Convert lists
|
|
89
|
+
text = text.replace(/<li[^>]*>/gi, "\n- ");
|
|
90
|
+
text = text.replace(/<\/li>/gi, "");
|
|
91
|
+
// Convert paragraphs and line breaks
|
|
92
|
+
text = text.replace(/<br\s*\/?>/gi, "\n");
|
|
93
|
+
text = text.replace(/<\/p>/gi, "\n\n");
|
|
94
|
+
text = text.replace(/<\/div>/gi, "\n");
|
|
95
|
+
text = text.replace(/<\/tr>/gi, "\n");
|
|
96
|
+
text = text.replace(/<td[^>]*>/gi, "\t");
|
|
97
|
+
text = text.replace(/<th[^>]*>/gi, "\t");
|
|
98
|
+
// Remove remaining HTML tags
|
|
99
|
+
text = text.replace(/<[^>]*>/g, "");
|
|
100
|
+
// Decode common HTML entities
|
|
101
|
+
text = text.replace(/&/g, "&");
|
|
102
|
+
text = text.replace(/</g, "<");
|
|
103
|
+
text = text.replace(/>/g, ">");
|
|
104
|
+
text = text.replace(/"/g, '"');
|
|
105
|
+
text = text.replace(/'/g, "'");
|
|
106
|
+
text = text.replace(/ /g, " ");
|
|
107
|
+
text = text.replace(/&#(\d+);/g, (_m, code) => String.fromCharCode(parseInt(code)));
|
|
108
|
+
// Collapse whitespace
|
|
109
|
+
text = text.replace(/[ \t]+/g, " ");
|
|
110
|
+
text = text.replace(/\n{3,}/g, "\n\n");
|
|
111
|
+
text = text.trim();
|
|
112
|
+
if (title) {
|
|
113
|
+
text = `# ${title}\n\n${text}`;
|
|
114
|
+
}
|
|
115
|
+
return text;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=web-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../src/tools/web-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AgentTool } from "../core/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Web search tool with multiple backend support:
|
|
4
|
+
* 1. Brave Search API (BRAVE_SEARCH_API_KEY) — recommended
|
|
5
|
+
* 2. Google Custom Search API (GOOGLE_SEARCH_API_KEY + GOOGLE_SEARCH_CX)
|
|
6
|
+
* 3. DuckDuckGo HTML scraping — zero-config fallback
|
|
7
|
+
*/
|
|
8
|
+
export declare function createWebSearchTool(): AgentTool;
|
|
9
|
+
//# sourceMappingURL=web-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,SAAS,CAiC/C"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web search tool with multiple backend support:
|
|
3
|
+
* 1. Brave Search API (BRAVE_SEARCH_API_KEY) — recommended
|
|
4
|
+
* 2. Google Custom Search API (GOOGLE_SEARCH_API_KEY + GOOGLE_SEARCH_CX)
|
|
5
|
+
* 3. DuckDuckGo HTML scraping — zero-config fallback
|
|
6
|
+
*/
|
|
7
|
+
export function createWebSearchTool() {
|
|
8
|
+
return {
|
|
9
|
+
name: "web_search",
|
|
10
|
+
label: "Web Search",
|
|
11
|
+
description: "Search the web for real-time information. Returns search results with titles, URLs, and snippets. Use this when you need up-to-date information or to verify facts.",
|
|
12
|
+
parameters: {
|
|
13
|
+
type: "object",
|
|
14
|
+
properties: {
|
|
15
|
+
query: { type: "string", description: "Search query" },
|
|
16
|
+
num_results: { type: "number", description: "Number of results to return (default: 5, max: 10)" },
|
|
17
|
+
},
|
|
18
|
+
required: ["query"],
|
|
19
|
+
},
|
|
20
|
+
execute: async (_toolCallId, params, signal) => {
|
|
21
|
+
const { query, num_results } = params;
|
|
22
|
+
const count = Math.min(num_results || 5, 10);
|
|
23
|
+
if (signal?.aborted)
|
|
24
|
+
throw new Error("Operation aborted");
|
|
25
|
+
const braveApiKey = process.env.BRAVE_SEARCH_API_KEY;
|
|
26
|
+
if (braveApiKey) {
|
|
27
|
+
return await braveSearch(query, count, braveApiKey, signal);
|
|
28
|
+
}
|
|
29
|
+
const googleApiKey = process.env.GOOGLE_SEARCH_API_KEY;
|
|
30
|
+
const googleCx = process.env.GOOGLE_SEARCH_CX;
|
|
31
|
+
if (googleApiKey && googleCx) {
|
|
32
|
+
return await googleSearch(query, count, googleApiKey, googleCx, signal);
|
|
33
|
+
}
|
|
34
|
+
return await duckDuckGoSearch(query, count, signal);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function braveSearch(query, count, apiKey, signal) {
|
|
39
|
+
const url = `https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=${count}`;
|
|
40
|
+
const response = await fetch(url, {
|
|
41
|
+
headers: {
|
|
42
|
+
"Accept": "application/json",
|
|
43
|
+
"Accept-Encoding": "gzip",
|
|
44
|
+
"X-Subscription-Token": apiKey,
|
|
45
|
+
},
|
|
46
|
+
signal,
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new Error(`Brave Search API error: ${response.status} ${response.statusText}`);
|
|
50
|
+
}
|
|
51
|
+
const data = await response.json();
|
|
52
|
+
const webResults = data.web?.results || [];
|
|
53
|
+
if (webResults.length === 0) {
|
|
54
|
+
return { content: [{ type: "text", text: `No results found for: ${query}` }] };
|
|
55
|
+
}
|
|
56
|
+
const formatted = webResults.map((r, i) => `${i + 1}. ${r.title}\n ${r.url}\n ${r.description || ""}`).join("\n\n");
|
|
57
|
+
return { content: [{ type: "text", text: formatted }] };
|
|
58
|
+
}
|
|
59
|
+
async function googleSearch(query, count, apiKey, cx, signal) {
|
|
60
|
+
const url = `https://www.googleapis.com/customsearch/v1?key=${apiKey}&cx=${cx}&q=${encodeURIComponent(query)}&num=${count}`;
|
|
61
|
+
const response = await fetch(url, { signal });
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
throw new Error(`Google Search API error: ${response.status}`);
|
|
64
|
+
}
|
|
65
|
+
const data = await response.json();
|
|
66
|
+
const items = data.items || [];
|
|
67
|
+
const results = items.map((item, i) => `${i + 1}. ${item.title}\n ${item.link}\n ${item.snippet || ""}`).join("\n\n");
|
|
68
|
+
return {
|
|
69
|
+
content: [{
|
|
70
|
+
type: "text",
|
|
71
|
+
text: results || `No results found for: ${query}`,
|
|
72
|
+
}],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async function duckDuckGoSearch(query, count, signal) {
|
|
76
|
+
const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
|
|
77
|
+
try {
|
|
78
|
+
const response = await fetch(url, {
|
|
79
|
+
headers: {
|
|
80
|
+
"User-Agent": "Mozilla/5.0 (compatible; TIL-CLI/0.1)",
|
|
81
|
+
},
|
|
82
|
+
signal,
|
|
83
|
+
});
|
|
84
|
+
if (!response.ok) {
|
|
85
|
+
throw new Error(`DuckDuckGo search error: ${response.status}`);
|
|
86
|
+
}
|
|
87
|
+
const html = await response.text();
|
|
88
|
+
const results = parseDDGResults(html, count);
|
|
89
|
+
if (results.length === 0) {
|
|
90
|
+
return {
|
|
91
|
+
content: [{ type: "text", text: `No results found for: ${query}. Try using bash with curl for alternative search methods.` }],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const formatted = results.map((r, i) => `${i + 1}. ${r.title}\n ${r.url}\n ${r.snippet}`).join("\n\n");
|
|
95
|
+
return { content: [{ type: "text", text: formatted }] };
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return {
|
|
99
|
+
content: [{
|
|
100
|
+
type: "text",
|
|
101
|
+
text: `Web search failed: ${err.message}. You can use bash with curl as an alternative.`,
|
|
102
|
+
}],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function parseDDGResults(html, maxResults) {
|
|
107
|
+
const results = [];
|
|
108
|
+
const resultPattern = /<a[^>]*class="result__a"[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/gi;
|
|
109
|
+
const snippetPattern = /<a[^>]*class="result__snippet"[^>]*>([\s\S]*?)<\/a>/gi;
|
|
110
|
+
const titles = [...html.matchAll(resultPattern)];
|
|
111
|
+
const snippets = [...html.matchAll(snippetPattern)];
|
|
112
|
+
for (let i = 0; i < Math.min(titles.length, maxResults); i++) {
|
|
113
|
+
const titleMatch = titles[i];
|
|
114
|
+
const snippetMatch = snippets[i];
|
|
115
|
+
const url = decodeURIComponent((titleMatch[1] || "").replace(/.*uddg=([^&]*).*/, "$1") || titleMatch[1] || "");
|
|
116
|
+
const title = (titleMatch[2] || "").replace(/<[^>]*>/g, "").trim();
|
|
117
|
+
const snippet = snippetMatch ? (snippetMatch[1] || "").replace(/<[^>]*>/g, "").trim() : "";
|
|
118
|
+
if (title && url) {
|
|
119
|
+
results.push({ title, url, snippet });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return results;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=web-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/tools/web-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,kBAAkB,CAAC;AAGnE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CA2BtD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { resolveToCwd } from "../utils/path.js";
|
|
4
|
+
export function createWriteTool(cwd) {
|
|
5
|
+
return {
|
|
6
|
+
name: "write",
|
|
7
|
+
label: "Write",
|
|
8
|
+
description: "Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.",
|
|
9
|
+
parameters: {
|
|
10
|
+
type: "object",
|
|
11
|
+
properties: {
|
|
12
|
+
path: { type: "string", description: "Path to the file to write (relative or absolute)" },
|
|
13
|
+
content: { type: "string", description: "Content to write to the file" },
|
|
14
|
+
},
|
|
15
|
+
required: ["path", "content"],
|
|
16
|
+
},
|
|
17
|
+
execute: async (_toolCallId, params, signal) => {
|
|
18
|
+
const { path, content } = params;
|
|
19
|
+
const absolutePath = resolveToCwd(path, cwd);
|
|
20
|
+
if (signal?.aborted)
|
|
21
|
+
throw new Error("Operation aborted");
|
|
22
|
+
await mkdir(dirname(absolutePath), { recursive: true });
|
|
23
|
+
await writeFile(absolutePath, content, "utf-8");
|
|
24
|
+
return {
|
|
25
|
+
content: [{ type: "text", text: `Successfully wrote ${content.length} bytes to ${path}` }],
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,eAAe,CAAC,GAAW;IAC1C,OAAO;QACN,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,iIAAiI;QAC9I,UAAU,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACX,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kDAAkD,EAAE;gBACzF,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;aACxE;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;SAC7B;QACD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC9C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAA2C,CAAC;YACtE,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAE7C,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAE1D,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEhD,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,OAAO,CAAC,MAAM,aAAa,IAAI,EAAE,EAAE,CAAC;aAC1F,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path autocomplete for @ file references in the interactive REPL.
|
|
3
|
+
* Uses `fd` for fuzzy search when available, falls back to readdirSync.
|
|
4
|
+
* Cross-platform: supports both Unix (/) and Windows (\) path separators.
|
|
5
|
+
*/
|
|
6
|
+
export interface CompletionItem {
|
|
7
|
+
value: string;
|
|
8
|
+
display: string;
|
|
9
|
+
isDirectory: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Get file suggestions for an @ prefix.
|
|
13
|
+
* Supports relative paths, absolute paths (/...), and home paths (~/).
|
|
14
|
+
* @param prefix - The text after @, e.g. "src/co", "~/dev/", "/usr/local/"
|
|
15
|
+
* @param cwd - Working directory
|
|
16
|
+
*/
|
|
17
|
+
export declare function getFileSuggestions(prefix: string, cwd: string): CompletionItem[];
|
|
18
|
+
/**
|
|
19
|
+
* Extract the @ prefix from a line for autocomplete purposes.
|
|
20
|
+
* Returns the text after @, or null if not in an @ context.
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractAtPrefix(line: string): string | null;
|
|
23
|
+
//# sourceMappingURL=autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../src/utils/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsCH,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACrB;AAYD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAahF;AAqHD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D"}
|