@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.
Files changed (158) hide show
  1. package/README.md +316 -0
  2. package/dist/cli/parser.d.ts +6 -0
  3. package/dist/cli/parser.d.ts.map +1 -0
  4. package/dist/cli/parser.js +62 -0
  5. package/dist/cli/parser.js.map +1 -0
  6. package/dist/cli/repl.d.ts +16 -0
  7. package/dist/cli/repl.d.ts.map +1 -0
  8. package/dist/cli/repl.js +599 -0
  9. package/dist/cli/repl.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +84 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/core/__tests__/agent.test.d.ts +2 -0
  15. package/dist/core/__tests__/agent.test.d.ts.map +1 -0
  16. package/dist/core/__tests__/agent.test.js +53 -0
  17. package/dist/core/__tests__/agent.test.js.map +1 -0
  18. package/dist/core/__tests__/config.test.d.ts +2 -0
  19. package/dist/core/__tests__/config.test.d.ts.map +1 -0
  20. package/dist/core/__tests__/config.test.js +58 -0
  21. package/dist/core/__tests__/config.test.js.map +1 -0
  22. package/dist/core/__tests__/constants.test.d.ts +2 -0
  23. package/dist/core/__tests__/constants.test.d.ts.map +1 -0
  24. package/dist/core/__tests__/constants.test.js +40 -0
  25. package/dist/core/__tests__/constants.test.js.map +1 -0
  26. package/dist/core/__tests__/context.test.d.ts +2 -0
  27. package/dist/core/__tests__/context.test.d.ts.map +1 -0
  28. package/dist/core/__tests__/context.test.js +120 -0
  29. package/dist/core/__tests__/context.test.js.map +1 -0
  30. package/dist/core/__tests__/environment.test.d.ts +2 -0
  31. package/dist/core/__tests__/environment.test.d.ts.map +1 -0
  32. package/dist/core/__tests__/environment.test.js +94 -0
  33. package/dist/core/__tests__/environment.test.js.map +1 -0
  34. package/dist/core/__tests__/permissions.test.d.ts +2 -0
  35. package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
  36. package/dist/core/__tests__/permissions.test.js +66 -0
  37. package/dist/core/__tests__/permissions.test.js.map +1 -0
  38. package/dist/core/__tests__/registry.test.d.ts +2 -0
  39. package/dist/core/__tests__/registry.test.d.ts.map +1 -0
  40. package/dist/core/__tests__/registry.test.js +152 -0
  41. package/dist/core/__tests__/registry.test.js.map +1 -0
  42. package/dist/core/__tests__/streaming.test.d.ts +2 -0
  43. package/dist/core/__tests__/streaming.test.d.ts.map +1 -0
  44. package/dist/core/__tests__/streaming.test.js +54 -0
  45. package/dist/core/__tests__/streaming.test.js.map +1 -0
  46. package/dist/core/agent.d.ts +87 -0
  47. package/dist/core/agent.d.ts.map +1 -0
  48. package/dist/core/agent.js +711 -0
  49. package/dist/core/agent.js.map +1 -0
  50. package/dist/core/colors.d.ts +12 -0
  51. package/dist/core/colors.d.ts.map +1 -0
  52. package/dist/core/colors.js +37 -0
  53. package/dist/core/colors.js.map +1 -0
  54. package/dist/core/config.d.ts +13 -0
  55. package/dist/core/config.d.ts.map +1 -0
  56. package/dist/core/config.js +30 -0
  57. package/dist/core/config.js.map +1 -0
  58. package/dist/core/constants.d.ts +5 -0
  59. package/dist/core/constants.d.ts.map +1 -0
  60. package/dist/core/constants.js +26 -0
  61. package/dist/core/constants.js.map +1 -0
  62. package/dist/core/context.d.ts +18 -0
  63. package/dist/core/context.d.ts.map +1 -0
  64. package/dist/core/context.js +99 -0
  65. package/dist/core/context.js.map +1 -0
  66. package/dist/core/loader.d.ts +3 -0
  67. package/dist/core/loader.d.ts.map +1 -0
  68. package/dist/core/loader.js +39 -0
  69. package/dist/core/loader.js.map +1 -0
  70. package/dist/core/registry.d.ts +11 -0
  71. package/dist/core/registry.d.ts.map +1 -0
  72. package/dist/core/registry.js +112 -0
  73. package/dist/core/registry.js.map +1 -0
  74. package/dist/core/skills.d.ts +14 -0
  75. package/dist/core/skills.d.ts.map +1 -0
  76. package/dist/core/skills.js +100 -0
  77. package/dist/core/skills.js.map +1 -0
  78. package/dist/core/types.d.ts +64 -0
  79. package/dist/core/types.d.ts.map +1 -0
  80. package/dist/core/types.js +2 -0
  81. package/dist/core/types.js.map +1 -0
  82. package/dist/core/version.d.ts +2 -0
  83. package/dist/core/version.d.ts.map +1 -0
  84. package/dist/core/version.js +7 -0
  85. package/dist/core/version.js.map +1 -0
  86. package/dist/memory/__tests__/memory.test.d.ts +2 -0
  87. package/dist/memory/__tests__/memory.test.d.ts.map +1 -0
  88. package/dist/memory/__tests__/memory.test.js +196 -0
  89. package/dist/memory/__tests__/memory.test.js.map +1 -0
  90. package/dist/memory/memory.d.ts +41 -0
  91. package/dist/memory/memory.d.ts.map +1 -0
  92. package/dist/memory/memory.js +206 -0
  93. package/dist/memory/memory.js.map +1 -0
  94. package/dist/tools/__tests__/bash.test.d.ts +2 -0
  95. package/dist/tools/__tests__/bash.test.d.ts.map +1 -0
  96. package/dist/tools/__tests__/bash.test.js +58 -0
  97. package/dist/tools/__tests__/bash.test.js.map +1 -0
  98. package/dist/tools/__tests__/file.test.d.ts +2 -0
  99. package/dist/tools/__tests__/file.test.d.ts.map +1 -0
  100. package/dist/tools/__tests__/file.test.js +115 -0
  101. package/dist/tools/__tests__/file.test.js.map +1 -0
  102. package/dist/tools/__tests__/git.test.d.ts +2 -0
  103. package/dist/tools/__tests__/git.test.d.ts.map +1 -0
  104. package/dist/tools/__tests__/git.test.js +19 -0
  105. package/dist/tools/__tests__/git.test.js.map +1 -0
  106. package/dist/tools/__tests__/grep.test.d.ts +2 -0
  107. package/dist/tools/__tests__/grep.test.d.ts.map +1 -0
  108. package/dist/tools/__tests__/grep.test.js +36 -0
  109. package/dist/tools/__tests__/grep.test.js.map +1 -0
  110. package/dist/tools/__tests__/memory-tool.test.d.ts +2 -0
  111. package/dist/tools/__tests__/memory-tool.test.d.ts.map +1 -0
  112. package/dist/tools/__tests__/memory-tool.test.js +39 -0
  113. package/dist/tools/__tests__/memory-tool.test.js.map +1 -0
  114. package/dist/tools/__tests__/plan.test.d.ts +2 -0
  115. package/dist/tools/__tests__/plan.test.d.ts.map +1 -0
  116. package/dist/tools/__tests__/plan.test.js +81 -0
  117. package/dist/tools/__tests__/plan.test.js.map +1 -0
  118. package/dist/tools/__tests__/schemas.test.d.ts +2 -0
  119. package/dist/tools/__tests__/schemas.test.d.ts.map +1 -0
  120. package/dist/tools/__tests__/schemas.test.js +40 -0
  121. package/dist/tools/__tests__/schemas.test.js.map +1 -0
  122. package/dist/tools/__tests__/web.test.d.ts +2 -0
  123. package/dist/tools/__tests__/web.test.d.ts.map +1 -0
  124. package/dist/tools/__tests__/web.test.js +51 -0
  125. package/dist/tools/__tests__/web.test.js.map +1 -0
  126. package/dist/tools/bash.d.ts +6 -0
  127. package/dist/tools/bash.d.ts.map +1 -0
  128. package/dist/tools/bash.js +89 -0
  129. package/dist/tools/bash.js.map +1 -0
  130. package/dist/tools/file.d.ts +7 -0
  131. package/dist/tools/file.d.ts.map +1 -0
  132. package/dist/tools/file.js +224 -0
  133. package/dist/tools/file.js.map +1 -0
  134. package/dist/tools/git.d.ts +3 -0
  135. package/dist/tools/git.d.ts.map +1 -0
  136. package/dist/tools/git.js +220 -0
  137. package/dist/tools/git.js.map +1 -0
  138. package/dist/tools/grep.d.ts +8 -0
  139. package/dist/tools/grep.d.ts.map +1 -0
  140. package/dist/tools/grep.js +265 -0
  141. package/dist/tools/grep.js.map +1 -0
  142. package/dist/tools/memory.d.ts +3 -0
  143. package/dist/tools/memory.d.ts.map +1 -0
  144. package/dist/tools/memory.js +33 -0
  145. package/dist/tools/memory.js.map +1 -0
  146. package/dist/tools/plan.d.ts +3 -0
  147. package/dist/tools/plan.d.ts.map +1 -0
  148. package/dist/tools/plan.js +60 -0
  149. package/dist/tools/plan.js.map +1 -0
  150. package/dist/tools/skill.d.ts +6 -0
  151. package/dist/tools/skill.d.ts.map +1 -0
  152. package/dist/tools/skill.js +20 -0
  153. package/dist/tools/skill.js.map +1 -0
  154. package/dist/tools/web.d.ts +3 -0
  155. package/dist/tools/web.d.ts.map +1 -0
  156. package/dist/tools/web.js +187 -0
  157. package/dist/tools/web.js.map +1 -0
  158. 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,6 @@
1
+ import { Tool } from '../core/types.js';
2
+ export interface SkillHost {
3
+ activateSkill(name: string): Promise<string>;
4
+ }
5
+ export declare function skillTool(host: SkillHost): Tool;
6
+ //# sourceMappingURL=skill.d.ts.map
@@ -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,3 @@
1
+ import { Tool } from '../core/types.js';
2
+ export declare function webTool(): Tool;
3
+ //# sourceMappingURL=web.d.ts.map
@@ -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(/&amp;/g, '&')
26
+ .replace(/&lt;/g, '<')
27
+ .replace(/&gt;/g, '>')
28
+ .replace(/&quot;/g, '"')
29
+ .replace(/&#39;/g, "'")
30
+ .replace(/&nbsp;/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
+ }