@element47/ag 4.4.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 +316 -0
- package/dist/cli/parser.d.ts +6 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +62 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/repl.d.ts +16 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +599 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +84 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/__tests__/agent.test.d.ts +2 -0
- package/dist/core/__tests__/agent.test.d.ts.map +1 -0
- package/dist/core/__tests__/agent.test.js +53 -0
- package/dist/core/__tests__/agent.test.js.map +1 -0
- package/dist/core/__tests__/config.test.d.ts +2 -0
- package/dist/core/__tests__/config.test.d.ts.map +1 -0
- package/dist/core/__tests__/config.test.js +58 -0
- package/dist/core/__tests__/config.test.js.map +1 -0
- package/dist/core/__tests__/constants.test.d.ts +2 -0
- package/dist/core/__tests__/constants.test.d.ts.map +1 -0
- package/dist/core/__tests__/constants.test.js +40 -0
- package/dist/core/__tests__/constants.test.js.map +1 -0
- package/dist/core/__tests__/context.test.d.ts +2 -0
- package/dist/core/__tests__/context.test.d.ts.map +1 -0
- package/dist/core/__tests__/context.test.js +120 -0
- package/dist/core/__tests__/context.test.js.map +1 -0
- package/dist/core/__tests__/environment.test.d.ts +2 -0
- package/dist/core/__tests__/environment.test.d.ts.map +1 -0
- package/dist/core/__tests__/environment.test.js +94 -0
- package/dist/core/__tests__/environment.test.js.map +1 -0
- package/dist/core/__tests__/permissions.test.d.ts +2 -0
- package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
- package/dist/core/__tests__/permissions.test.js +66 -0
- package/dist/core/__tests__/permissions.test.js.map +1 -0
- package/dist/core/__tests__/registry.test.d.ts +2 -0
- package/dist/core/__tests__/registry.test.d.ts.map +1 -0
- package/dist/core/__tests__/registry.test.js +152 -0
- package/dist/core/__tests__/registry.test.js.map +1 -0
- package/dist/core/__tests__/streaming.test.d.ts +2 -0
- package/dist/core/__tests__/streaming.test.d.ts.map +1 -0
- package/dist/core/__tests__/streaming.test.js +54 -0
- package/dist/core/__tests__/streaming.test.js.map +1 -0
- package/dist/core/agent.d.ts +87 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +711 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/colors.d.ts +12 -0
- package/dist/core/colors.d.ts.map +1 -0
- package/dist/core/colors.js +37 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/config.d.ts +13 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +30 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +5 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +26 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/context.d.ts +18 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +99 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/loader.d.ts +3 -0
- package/dist/core/loader.d.ts.map +1 -0
- package/dist/core/loader.js +39 -0
- package/dist/core/loader.js.map +1 -0
- package/dist/core/registry.d.ts +11 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +112 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/skills.d.ts +14 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +100 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/types.d.ts +64 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/version.d.ts +2 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +7 -0
- package/dist/core/version.js.map +1 -0
- package/dist/memory/__tests__/memory.test.d.ts +2 -0
- package/dist/memory/__tests__/memory.test.d.ts.map +1 -0
- package/dist/memory/__tests__/memory.test.js +196 -0
- package/dist/memory/__tests__/memory.test.js.map +1 -0
- package/dist/memory/memory.d.ts +41 -0
- package/dist/memory/memory.d.ts.map +1 -0
- package/dist/memory/memory.js +206 -0
- package/dist/memory/memory.js.map +1 -0
- package/dist/tools/__tests__/bash.test.d.ts +2 -0
- package/dist/tools/__tests__/bash.test.d.ts.map +1 -0
- package/dist/tools/__tests__/bash.test.js +58 -0
- package/dist/tools/__tests__/bash.test.js.map +1 -0
- package/dist/tools/__tests__/file.test.d.ts +2 -0
- package/dist/tools/__tests__/file.test.d.ts.map +1 -0
- package/dist/tools/__tests__/file.test.js +115 -0
- package/dist/tools/__tests__/file.test.js.map +1 -0
- package/dist/tools/__tests__/git.test.d.ts +2 -0
- package/dist/tools/__tests__/git.test.d.ts.map +1 -0
- package/dist/tools/__tests__/git.test.js +19 -0
- package/dist/tools/__tests__/git.test.js.map +1 -0
- package/dist/tools/__tests__/grep.test.d.ts +2 -0
- package/dist/tools/__tests__/grep.test.d.ts.map +1 -0
- package/dist/tools/__tests__/grep.test.js +36 -0
- package/dist/tools/__tests__/grep.test.js.map +1 -0
- package/dist/tools/__tests__/memory-tool.test.d.ts +2 -0
- package/dist/tools/__tests__/memory-tool.test.d.ts.map +1 -0
- package/dist/tools/__tests__/memory-tool.test.js +39 -0
- package/dist/tools/__tests__/memory-tool.test.js.map +1 -0
- package/dist/tools/__tests__/plan.test.d.ts +2 -0
- package/dist/tools/__tests__/plan.test.d.ts.map +1 -0
- package/dist/tools/__tests__/plan.test.js +81 -0
- package/dist/tools/__tests__/plan.test.js.map +1 -0
- package/dist/tools/__tests__/schemas.test.d.ts +2 -0
- package/dist/tools/__tests__/schemas.test.d.ts.map +1 -0
- package/dist/tools/__tests__/schemas.test.js +40 -0
- package/dist/tools/__tests__/schemas.test.js.map +1 -0
- package/dist/tools/__tests__/web.test.d.ts +2 -0
- package/dist/tools/__tests__/web.test.d.ts.map +1 -0
- package/dist/tools/__tests__/web.test.js +51 -0
- package/dist/tools/__tests__/web.test.js.map +1 -0
- package/dist/tools/bash.d.ts +6 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +89 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/file.d.ts +7 -0
- package/dist/tools/file.d.ts.map +1 -0
- package/dist/tools/file.js +224 -0
- package/dist/tools/file.js.map +1 -0
- package/dist/tools/git.d.ts +3 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +220 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/grep.d.ts +8 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +265 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/memory.d.ts +3 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +33 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/plan.d.ts +3 -0
- package/dist/tools/plan.d.ts.map +1 -0
- package/dist/tools/plan.js +60 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/skill.d.ts +6 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +20 -0
- package/dist/tools/skill.js.map +1 -0
- package/dist/tools/web.d.ts +3 -0
- package/dist/tools/web.d.ts.map +1 -0
- package/dist/tools/web.js +187 -0
- package/dist/tools/web.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/tools/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAErG,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,kNAAkN;YAC/N,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,kLAAkL,EAAE;oBAC/Q,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;oBACpF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6FAA6F,EAAE;iBACrI;gBACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;aACrB;SACF;QACD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAuD,EAAU,EAAE;YAClG,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,IAAI,CAAC,OAAO;wBAAE,OAAO,6CAA6C,CAAC;oBACnE,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;oBAC9C,OAAO,eAAe,QAAQ,EAAE,CAAC;gBACnC,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,IAAI,CAAC,OAAO;wBAAE,OAAO,+CAA+C,CAAC;oBACrE,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBAC1C,OAAO,qBAAqB,QAAQ,EAAE,CAAC;gBACzC,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,IAAI,CAAC,IAAI;wBAAE,OAAO,oFAAoF,CAAC;oBACvG,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;oBAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;oBACrD,IAAI,CAAC,KAAK;wBAAE,OAAO,qBAAqB,IAAI,4CAA4C,CAAC;oBACzF,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBAC/B,OAAO,qBAAqB,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC3C,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;oBAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,qBAAqB,CAAC;oBACrD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3D,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,IAAI,CAAC,IAAI;wBAAE,OAAO,kFAAkF,CAAC;oBACrG,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBACzC,OAAO,MAAM,IAAI,4BAA4B,IAAI,IAAI,CAAC;gBACxD,CAAC;gBACD;oBACE,OAAO,mBAAmB,MAAM,uDAAuD,CAAC;YAC5F,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,MAAM,WAAW,SAAS;IACxB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAkB/C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function skillTool(host) {
|
|
2
|
+
return {
|
|
3
|
+
type: 'function',
|
|
4
|
+
function: {
|
|
5
|
+
name: 'skill',
|
|
6
|
+
description: 'Activate a skill by name to load its full instructions into context. Check <available-skills> in your system prompt for what is available.',
|
|
7
|
+
parameters: {
|
|
8
|
+
type: 'object',
|
|
9
|
+
properties: {
|
|
10
|
+
name: { type: 'string', description: 'Skill name to activate (from the available-skills catalog).' }
|
|
11
|
+
},
|
|
12
|
+
required: ['name']
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
execute: async ({ name }) => {
|
|
16
|
+
return host.activateSkill(name);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,SAAS,CAAC,IAAe;IACvC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,4IAA4I;YACzJ,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6DAA6D,EAAE;iBACrG;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAoB,EAAmB,EAAE;YAC7D,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/tools/web.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AA8KxC,wBAAgB,OAAO,IAAI,IAAI,CAiC9B"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline';
|
|
2
|
+
import { loadConfig, saveConfig } from '../core/config.js';
|
|
3
|
+
// ── HTML stripping (native fallback when Jina is unavailable) ─────────────
|
|
4
|
+
function stripHtml(html) {
|
|
5
|
+
let text = html;
|
|
6
|
+
// Remove script, style, nav, header, footer, aside blocks
|
|
7
|
+
text = text.replace(/<(script|style|nav|header|footer|aside)\b[^>]*>[\s\S]*?<\/\1>/gi, '');
|
|
8
|
+
// Try to extract article or main content
|
|
9
|
+
const article = text.match(/<(article|main)\b[^>]*>([\s\S]*?)<\/\1>/i);
|
|
10
|
+
if (article)
|
|
11
|
+
text = article[2];
|
|
12
|
+
// Convert headings to markdown-style
|
|
13
|
+
text = text.replace(/<h([1-6])\b[^>]*>([\s\S]*?)<\/h\1>/gi, (_m, _l, content) => `\n## ${content.trim()}\n`);
|
|
14
|
+
// Convert links to text (url) format
|
|
15
|
+
text = text.replace(/<a\b[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/gi, (_m, href, content) => {
|
|
16
|
+
const label = content.replace(/<[^>]+>/g, '').trim();
|
|
17
|
+
return href && !href.startsWith('#') ? `${label} (${href})` : label;
|
|
18
|
+
});
|
|
19
|
+
// Convert block elements to newlines
|
|
20
|
+
text = text.replace(/<\/?(p|div|li|tr|br)\b[^>]*\/?>/gi, '\n');
|
|
21
|
+
// Strip all remaining tags
|
|
22
|
+
text = text.replace(/<[^>]+>/g, '');
|
|
23
|
+
// Decode common HTML entities
|
|
24
|
+
text = text
|
|
25
|
+
.replace(/&/g, '&')
|
|
26
|
+
.replace(/</g, '<')
|
|
27
|
+
.replace(/>/g, '>')
|
|
28
|
+
.replace(/"/g, '"')
|
|
29
|
+
.replace(/'/g, "'")
|
|
30
|
+
.replace(/ /g, ' ');
|
|
31
|
+
// Collapse whitespace
|
|
32
|
+
text = text.replace(/[ \t]+/g, ' ');
|
|
33
|
+
text = text.replace(/\n{3,}/g, '\n\n');
|
|
34
|
+
return text.trim();
|
|
35
|
+
}
|
|
36
|
+
// ── Action handlers ───────────────────────────────────────────────────────
|
|
37
|
+
function isBlockedHost(hostname) {
|
|
38
|
+
// Block localhost variants (strip IPv6 brackets)
|
|
39
|
+
const h = hostname.replace(/^\[|\]$/g, '');
|
|
40
|
+
if (h === 'localhost' || h === '127.0.0.1' || h === '::1' || h === '0.0.0.0')
|
|
41
|
+
return true;
|
|
42
|
+
// Block cloud metadata endpoints
|
|
43
|
+
if (hostname === '169.254.169.254' || hostname === 'metadata.google.internal')
|
|
44
|
+
return true;
|
|
45
|
+
// Block private IPv4 ranges (10.x.x.x, 172.16-31.x.x, 192.168.x.x)
|
|
46
|
+
if (/^10\./.test(hostname))
|
|
47
|
+
return true;
|
|
48
|
+
if (/^172\.(1[6-9]|2\d|3[01])\./.test(hostname))
|
|
49
|
+
return true;
|
|
50
|
+
if (/^192\.168\./.test(hostname))
|
|
51
|
+
return true;
|
|
52
|
+
// Block link-local
|
|
53
|
+
if (/^169\.254\./.test(hostname))
|
|
54
|
+
return true;
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
async function doFetch(url, raw) {
|
|
58
|
+
try {
|
|
59
|
+
const parsed = new URL(url);
|
|
60
|
+
if (!['http:', 'https:'].includes(parsed.protocol)) {
|
|
61
|
+
return 'Error: URL must use http:// or https://';
|
|
62
|
+
}
|
|
63
|
+
if (isBlockedHost(parsed.hostname)) {
|
|
64
|
+
return `Error: access to ${parsed.hostname} is blocked (private/internal address).`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return 'Error: Invalid URL.';
|
|
69
|
+
}
|
|
70
|
+
const fetchOpts = { signal: AbortSignal.timeout(15_000) };
|
|
71
|
+
// Try Jina Reader first (returns clean markdown, handles JS-rendered pages)
|
|
72
|
+
if (!raw) {
|
|
73
|
+
try {
|
|
74
|
+
const res = await fetch(`https://r.jina.ai/${url}`, {
|
|
75
|
+
...fetchOpts,
|
|
76
|
+
headers: { 'Accept': 'text/markdown' }
|
|
77
|
+
});
|
|
78
|
+
if (res.ok) {
|
|
79
|
+
const text = await res.text();
|
|
80
|
+
if (text.trim())
|
|
81
|
+
return text;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Fall through to native fetch
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Native fetch fallback
|
|
89
|
+
try {
|
|
90
|
+
const res = await fetch(url, fetchOpts);
|
|
91
|
+
if (!res.ok)
|
|
92
|
+
return `Fetch error: HTTP ${res.status}`;
|
|
93
|
+
const contentType = res.headers.get('content-type') || '';
|
|
94
|
+
if (contentType.includes('application/json')) {
|
|
95
|
+
const json = await res.json();
|
|
96
|
+
return JSON.stringify(json, null, 2);
|
|
97
|
+
}
|
|
98
|
+
const text = await res.text();
|
|
99
|
+
if (contentType.includes('text/html')) {
|
|
100
|
+
return stripHtml(text);
|
|
101
|
+
}
|
|
102
|
+
return text;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
return `Fetch failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function ensureTavilyKey() {
|
|
109
|
+
const existing = process.env.TAVILY_API_KEY || loadConfig().tavilyApiKey;
|
|
110
|
+
if (existing)
|
|
111
|
+
return existing;
|
|
112
|
+
// Interactive prompt if TTY
|
|
113
|
+
if (process.stdin.isTTY) {
|
|
114
|
+
const C = await import('../core/colors.js').then(m => m.C);
|
|
115
|
+
console.error(`\n${C.bold}Web search requires a Tavily API key${C.reset}`);
|
|
116
|
+
console.error(`Sign up free (no credit card): ${C.cyan}https://app.tavily.com${C.reset}\n`);
|
|
117
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
118
|
+
const key = await new Promise(resolve => rl.question(`${C.yellow}Enter your Tavily API key:${C.reset} `, resolve));
|
|
119
|
+
rl.close();
|
|
120
|
+
const trimmed = key.trim();
|
|
121
|
+
if (!trimmed)
|
|
122
|
+
return null;
|
|
123
|
+
saveConfig({ tavilyApiKey: trimmed });
|
|
124
|
+
console.error(`${C.green}Key saved to config.${C.reset}\n`);
|
|
125
|
+
return trimmed;
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
async function doSearch(query) {
|
|
130
|
+
const key = await ensureTavilyKey();
|
|
131
|
+
if (!key) {
|
|
132
|
+
return 'Error: Tavily API key not configured. Sign up free at https://tavily.com (no credit card needed), then set TAVILY_API_KEY env var or run /config set tavilyApiKey <key>';
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const res = await fetch('https://api.tavily.com/search', {
|
|
136
|
+
method: 'POST',
|
|
137
|
+
headers: { 'Content-Type': 'application/json' },
|
|
138
|
+
signal: AbortSignal.timeout(15_000),
|
|
139
|
+
body: JSON.stringify({ api_key: key, query, max_results: 5 })
|
|
140
|
+
});
|
|
141
|
+
if (!res.ok)
|
|
142
|
+
return `Search error: HTTP ${res.status}`;
|
|
143
|
+
const data = await res.json();
|
|
144
|
+
if (!data.results?.length)
|
|
145
|
+
return 'No results found.';
|
|
146
|
+
return data.results.map((r, i) => `${i + 1}. ${r.title || '(untitled)'}\n ${r.url || ''}\n ${r.content || ''}`).join('\n\n');
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
return `Search failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// ── Exported tool ─────────────────────────────────────────────────────────
|
|
153
|
+
export function webTool() {
|
|
154
|
+
return {
|
|
155
|
+
type: 'function',
|
|
156
|
+
function: {
|
|
157
|
+
name: 'web',
|
|
158
|
+
description: 'Web operations. Actions: fetch (retrieve readable content from a URL), search (search the web for current information via Tavily).',
|
|
159
|
+
parameters: {
|
|
160
|
+
type: 'object',
|
|
161
|
+
properties: {
|
|
162
|
+
action: { type: 'string', enum: ['fetch', 'search'], description: 'The web operation to perform.' },
|
|
163
|
+
url: { type: 'string', description: 'URL to fetch (for action=fetch).' },
|
|
164
|
+
query: { type: 'string', description: 'Search query (for action=search).' },
|
|
165
|
+
raw: { type: 'boolean', description: 'If true, use native fetch + HTML stripping instead of Jina Reader (for action=fetch). Default: false.' }
|
|
166
|
+
},
|
|
167
|
+
required: ['action']
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
execute: async ({ action, url, query, raw }) => {
|
|
171
|
+
switch (action) {
|
|
172
|
+
case 'fetch': {
|
|
173
|
+
if (!url)
|
|
174
|
+
return 'Error: url is required for action=fetch.';
|
|
175
|
+
return doFetch(url, raw);
|
|
176
|
+
}
|
|
177
|
+
case 'search': {
|
|
178
|
+
if (!query)
|
|
179
|
+
return 'Error: query is required for action=search.';
|
|
180
|
+
return doSearch(query);
|
|
181
|
+
}
|
|
182
|
+
default: return `Unknown action "${action}". Use: fetch, search.`;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/tools/web.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@element47/ag",
|
|
3
|
+
"version": "4.4.0",
|
|
4
|
+
"description": "Persistent AI coding agent with memory - any model via OpenRouter",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"ag": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=18.0.0"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"dev": "tsc --watch",
|
|
21
|
+
"start": "npm run build && node dist/cli.js",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest",
|
|
24
|
+
"lint": "eslint src/",
|
|
25
|
+
"format": "prettier --write src/",
|
|
26
|
+
"type-check": "tsc --noEmit",
|
|
27
|
+
"prepublishOnly": "npm run type-check && npm run test && tsc"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"agent",
|
|
31
|
+
"ai",
|
|
32
|
+
"typescript",
|
|
33
|
+
"memory-palace",
|
|
34
|
+
"cli",
|
|
35
|
+
"openrouter"
|
|
36
|
+
],
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^25.0.0",
|
|
40
|
+
"@typescript-eslint/eslint-plugin": "^8.58.2",
|
|
41
|
+
"@typescript-eslint/parser": "^8.58.2",
|
|
42
|
+
"@vitest/coverage-v8": "^4.1.4",
|
|
43
|
+
"eslint": "^10.2.0",
|
|
44
|
+
"prettier": "^3.8.2",
|
|
45
|
+
"typescript": "^6.0.0",
|
|
46
|
+
"vitest": "^4.1.4"
|
|
47
|
+
}
|
|
48
|
+
}
|