aura-code 0.3.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 (288) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -0
  3. package/dist/agent/context.d.ts +13 -0
  4. package/dist/agent/context.js +183 -0
  5. package/dist/agent/context.js.map +1 -0
  6. package/dist/agent/loop.d.ts +60 -0
  7. package/dist/agent/loop.js +228 -0
  8. package/dist/agent/loop.js.map +1 -0
  9. package/dist/agent/session-store.d.ts +30 -0
  10. package/dist/agent/session-store.js +178 -0
  11. package/dist/agent/session-store.js.map +1 -0
  12. package/dist/agent/spawner.d.ts +57 -0
  13. package/dist/agent/spawner.js +112 -0
  14. package/dist/agent/spawner.js.map +1 -0
  15. package/dist/agent/system-prompt.d.ts +3 -0
  16. package/dist/agent/system-prompt.js +100 -0
  17. package/dist/agent/system-prompt.js.map +1 -0
  18. package/dist/architect/engine.d.ts +47 -0
  19. package/dist/architect/engine.js +217 -0
  20. package/dist/architect/engine.js.map +1 -0
  21. package/dist/architect/types.d.ts +61 -0
  22. package/dist/architect/types.js +6 -0
  23. package/dist/architect/types.js.map +1 -0
  24. package/dist/cli/diamond.d.ts +1 -0
  25. package/dist/cli/diamond.js +23 -0
  26. package/dist/cli/diamond.js.map +1 -0
  27. package/dist/cli/display.d.ts +44 -0
  28. package/dist/cli/display.js +234 -0
  29. package/dist/cli/display.js.map +1 -0
  30. package/dist/cli/index.d.ts +2 -0
  31. package/dist/cli/index.js +1734 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/config/defaults.d.ts +46 -0
  34. package/dist/config/defaults.js +106 -0
  35. package/dist/config/defaults.js.map +1 -0
  36. package/dist/config/project-config.d.ts +90 -0
  37. package/dist/config/project-config.js +141 -0
  38. package/dist/config/project-config.js.map +1 -0
  39. package/dist/harness/proposer.d.ts +26 -0
  40. package/dist/harness/proposer.js +204 -0
  41. package/dist/harness/proposer.js.map +1 -0
  42. package/dist/harness/weakness-miner.d.ts +28 -0
  43. package/dist/harness/weakness-miner.js +359 -0
  44. package/dist/harness/weakness-miner.js.map +1 -0
  45. package/dist/integrations/harnesses.d.ts +23 -0
  46. package/dist/integrations/harnesses.js +161 -0
  47. package/dist/integrations/harnesses.js.map +1 -0
  48. package/dist/orchestration/competence.d.ts +53 -0
  49. package/dist/orchestration/competence.js +181 -0
  50. package/dist/orchestration/competence.js.map +1 -0
  51. package/dist/orchestration/executor.d.ts +42 -0
  52. package/dist/orchestration/executor.js +206 -0
  53. package/dist/orchestration/executor.js.map +1 -0
  54. package/dist/orchestration/index.d.ts +20 -0
  55. package/dist/orchestration/index.js +39 -0
  56. package/dist/orchestration/index.js.map +1 -0
  57. package/dist/orchestration/orchestrator-prompts.d.ts +11 -0
  58. package/dist/orchestration/orchestrator-prompts.js +153 -0
  59. package/dist/orchestration/orchestrator-prompts.js.map +1 -0
  60. package/dist/orchestration/orchestrator.d.ts +27 -0
  61. package/dist/orchestration/orchestrator.js +169 -0
  62. package/dist/orchestration/orchestrator.js.map +1 -0
  63. package/dist/orchestration/plan-store.d.ts +53 -0
  64. package/dist/orchestration/plan-store.js +176 -0
  65. package/dist/orchestration/plan-store.js.map +1 -0
  66. package/dist/orchestration/router-prompts.d.ts +6 -0
  67. package/dist/orchestration/router-prompts.js +55 -0
  68. package/dist/orchestration/router-prompts.js.map +1 -0
  69. package/dist/orchestration/router.d.ts +23 -0
  70. package/dist/orchestration/router.js +70 -0
  71. package/dist/orchestration/router.js.map +1 -0
  72. package/dist/orchestration/ruby-detect.d.ts +6 -0
  73. package/dist/orchestration/ruby-detect.js +130 -0
  74. package/dist/orchestration/ruby-detect.js.map +1 -0
  75. package/dist/orchestration/ruby-types.d.ts +44 -0
  76. package/dist/orchestration/ruby-types.js +6 -0
  77. package/dist/orchestration/ruby-types.js.map +1 -0
  78. package/dist/orchestration/specialist-prompts.d.ts +19 -0
  79. package/dist/orchestration/specialist-prompts.js +143 -0
  80. package/dist/orchestration/specialist-prompts.js.map +1 -0
  81. package/dist/orchestration/specialists.d.ts +66 -0
  82. package/dist/orchestration/specialists.js +175 -0
  83. package/dist/orchestration/specialists.js.map +1 -0
  84. package/dist/orchestration/types.d.ts +82 -0
  85. package/dist/orchestration/types.js +6 -0
  86. package/dist/orchestration/types.js.map +1 -0
  87. package/dist/perception/extractor.d.ts +7 -0
  88. package/dist/perception/extractor.js +521 -0
  89. package/dist/perception/extractor.js.map +1 -0
  90. package/dist/perception/graph-store.d.ts +25 -0
  91. package/dist/perception/graph-store.js +117 -0
  92. package/dist/perception/graph-store.js.map +1 -0
  93. package/dist/perception/index.d.ts +4 -0
  94. package/dist/perception/index.js +18 -0
  95. package/dist/perception/index.js.map +1 -0
  96. package/dist/perception/queries.d.ts +29 -0
  97. package/dist/perception/queries.js +354 -0
  98. package/dist/perception/queries.js.map +1 -0
  99. package/dist/perception/types.d.ts +103 -0
  100. package/dist/perception/types.js +6 -0
  101. package/dist/perception/types.js.map +1 -0
  102. package/dist/providers/anthropic.d.ts +11 -0
  103. package/dist/providers/anthropic.js +172 -0
  104. package/dist/providers/anthropic.js.map +1 -0
  105. package/dist/providers/factory.d.ts +58 -0
  106. package/dist/providers/factory.js +354 -0
  107. package/dist/providers/factory.js.map +1 -0
  108. package/dist/providers/fallback.d.ts +24 -0
  109. package/dist/providers/fallback.js +72 -0
  110. package/dist/providers/fallback.js.map +1 -0
  111. package/dist/providers/google.d.ts +11 -0
  112. package/dist/providers/google.js +129 -0
  113. package/dist/providers/google.js.map +1 -0
  114. package/dist/providers/openai-compatible.d.ts +24 -0
  115. package/dist/providers/openai-compatible.js +216 -0
  116. package/dist/providers/openai-compatible.js.map +1 -0
  117. package/dist/providers/resilient-factory.d.ts +24 -0
  118. package/dist/providers/resilient-factory.js +57 -0
  119. package/dist/providers/resilient-factory.js.map +1 -0
  120. package/dist/providers/resilient.d.ts +63 -0
  121. package/dist/providers/resilient.js +145 -0
  122. package/dist/providers/resilient.js.map +1 -0
  123. package/dist/providers/types.d.ts +84 -0
  124. package/dist/providers/types.js +6 -0
  125. package/dist/providers/types.js.map +1 -0
  126. package/dist/ruby/alternator.d.ts +40 -0
  127. package/dist/ruby/alternator.js +233 -0
  128. package/dist/ruby/alternator.js.map +1 -0
  129. package/dist/ruby/competence.d.ts +34 -0
  130. package/dist/ruby/competence.js +264 -0
  131. package/dist/ruby/competence.js.map +1 -0
  132. package/dist/ruby/episode-capture.d.ts +56 -0
  133. package/dist/ruby/episode-capture.js +193 -0
  134. package/dist/ruby/episode-capture.js.map +1 -0
  135. package/dist/ruby/fine-tune.d.ts +16 -0
  136. package/dist/ruby/fine-tune.js +253 -0
  137. package/dist/ruby/fine-tune.js.map +1 -0
  138. package/dist/ruby/index.d.ts +10 -0
  139. package/dist/ruby/index.js +26 -0
  140. package/dist/ruby/index.js.map +1 -0
  141. package/dist/ruby/ruby-model.d.ts +36 -0
  142. package/dist/ruby/ruby-model.js +81 -0
  143. package/dist/ruby/ruby-model.js.map +1 -0
  144. package/dist/ruby/training-data.d.ts +11 -0
  145. package/dist/ruby/training-data.js +107 -0
  146. package/dist/ruby/training-data.js.map +1 -0
  147. package/dist/ruby/types.d.ts +136 -0
  148. package/dist/ruby/types.js +20 -0
  149. package/dist/ruby/types.js.map +1 -0
  150. package/dist/safety/permissions.d.ts +32 -0
  151. package/dist/safety/permissions.js +304 -0
  152. package/dist/safety/permissions.js.map +1 -0
  153. package/dist/server/index.d.ts +9 -0
  154. package/dist/server/index.js +342 -0
  155. package/dist/server/index.js.map +1 -0
  156. package/dist/server/session.d.ts +22 -0
  157. package/dist/server/session.js +16 -0
  158. package/dist/server/session.js.map +1 -0
  159. package/dist/setup/first-run.d.ts +41 -0
  160. package/dist/setup/first-run.js +386 -0
  161. package/dist/setup/first-run.js.map +1 -0
  162. package/dist/setup/global-config.d.ts +19 -0
  163. package/dist/setup/global-config.js +97 -0
  164. package/dist/setup/global-config.js.map +1 -0
  165. package/dist/tools/audio-transcribe.d.ts +8 -0
  166. package/dist/tools/audio-transcribe.js +156 -0
  167. package/dist/tools/audio-transcribe.js.map +1 -0
  168. package/dist/tools/browser.d.ts +15 -0
  169. package/dist/tools/browser.js +241 -0
  170. package/dist/tools/browser.js.map +1 -0
  171. package/dist/tools/calendar.d.ts +12 -0
  172. package/dist/tools/calendar.js +196 -0
  173. package/dist/tools/calendar.js.map +1 -0
  174. package/dist/tools/clipboard.d.ts +7 -0
  175. package/dist/tools/clipboard.js +90 -0
  176. package/dist/tools/clipboard.js.map +1 -0
  177. package/dist/tools/cron.d.ts +10 -0
  178. package/dist/tools/cron.js +167 -0
  179. package/dist/tools/cron.js.map +1 -0
  180. package/dist/tools/edit-file.d.ts +6 -0
  181. package/dist/tools/edit-file.js +98 -0
  182. package/dist/tools/edit-file.js.map +1 -0
  183. package/dist/tools/email.d.ts +11 -0
  184. package/dist/tools/email.js +153 -0
  185. package/dist/tools/email.js.map +1 -0
  186. package/dist/tools/git.d.ts +1 -0
  187. package/dist/tools/git.js +7 -0
  188. package/dist/tools/git.js.map +1 -0
  189. package/dist/tools/http-request.d.ts +12 -0
  190. package/dist/tools/http-request.js +91 -0
  191. package/dist/tools/http-request.js.map +1 -0
  192. package/dist/tools/image-read.d.ts +7 -0
  193. package/dist/tools/image-read.js +125 -0
  194. package/dist/tools/image-read.js.map +1 -0
  195. package/dist/tools/index.d.ts +3 -0
  196. package/dist/tools/index.js +201 -0
  197. package/dist/tools/index.js.map +1 -0
  198. package/dist/tools/list-dir.d.ts +1 -0
  199. package/dist/tools/list-dir.js +6 -0
  200. package/dist/tools/list-dir.js.map +1 -0
  201. package/dist/tools/mcp.d.ts +11 -0
  202. package/dist/tools/mcp.js +356 -0
  203. package/dist/tools/mcp.js.map +1 -0
  204. package/dist/tools/memory.d.ts +9 -0
  205. package/dist/tools/memory.js +124 -0
  206. package/dist/tools/memory.js.map +1 -0
  207. package/dist/tools/notify.d.ts +9 -0
  208. package/dist/tools/notify.js +40 -0
  209. package/dist/tools/notify.js.map +1 -0
  210. package/dist/tools/read-file.d.ts +6 -0
  211. package/dist/tools/read-file.js +76 -0
  212. package/dist/tools/read-file.js.map +1 -0
  213. package/dist/tools/run-shell.d.ts +1 -0
  214. package/dist/tools/run-shell.js +6 -0
  215. package/dist/tools/run-shell.js.map +1 -0
  216. package/dist/tools/run-tests.d.ts +1 -0
  217. package/dist/tools/run-tests.js +6 -0
  218. package/dist/tools/run-tests.js.map +1 -0
  219. package/dist/tools/search-code.d.ts +1 -0
  220. package/dist/tools/search-code.js +6 -0
  221. package/dist/tools/search-code.js.map +1 -0
  222. package/dist/tools/telegram-bot.d.ts +2 -0
  223. package/dist/tools/telegram-bot.js +693 -0
  224. package/dist/tools/telegram-bot.js.map +1 -0
  225. package/dist/tools/telegram-safety.d.ts +52 -0
  226. package/dist/tools/telegram-safety.js +189 -0
  227. package/dist/tools/telegram-safety.js.map +1 -0
  228. package/dist/tools/telegram.d.ts +16 -0
  229. package/dist/tools/telegram.js +227 -0
  230. package/dist/tools/telegram.js.map +1 -0
  231. package/dist/tools/tools.d.ts +48 -0
  232. package/dist/tools/tools.js +328 -0
  233. package/dist/tools/tools.js.map +1 -0
  234. package/dist/tools/web-fetch.d.ts +11 -0
  235. package/dist/tools/web-fetch.js +119 -0
  236. package/dist/tools/web-fetch.js.map +1 -0
  237. package/dist/tools/web-search.d.ts +8 -0
  238. package/dist/tools/web-search.js +81 -0
  239. package/dist/tools/web-search.js.map +1 -0
  240. package/dist/tools/whatsapp.d.ts +10 -0
  241. package/dist/tools/whatsapp.js +222 -0
  242. package/dist/tools/whatsapp.js.map +1 -0
  243. package/dist/tools/write-file.d.ts +1 -0
  244. package/dist/tools/write-file.js +6 -0
  245. package/dist/tools/write-file.js.map +1 -0
  246. package/dist/tools/youtube-transcript.d.ts +9 -0
  247. package/dist/tools/youtube-transcript.js +200 -0
  248. package/dist/tools/youtube-transcript.js.map +1 -0
  249. package/dist/util/circuit-breaker.d.ts +44 -0
  250. package/dist/util/circuit-breaker.js +78 -0
  251. package/dist/util/circuit-breaker.js.map +1 -0
  252. package/dist/util/env.d.ts +18 -0
  253. package/dist/util/env.js +39 -0
  254. package/dist/util/env.js.map +1 -0
  255. package/dist/util/errors.d.ts +42 -0
  256. package/dist/util/errors.js +121 -0
  257. package/dist/util/errors.js.map +1 -0
  258. package/dist/util/rate-limiter.d.ts +71 -0
  259. package/dist/util/rate-limiter.js +141 -0
  260. package/dist/util/rate-limiter.js.map +1 -0
  261. package/dist/util/retry.d.ts +30 -0
  262. package/dist/util/retry.js +57 -0
  263. package/dist/util/retry.js.map +1 -0
  264. package/dist/util/sanitize.d.ts +16 -0
  265. package/dist/util/sanitize.js +255 -0
  266. package/dist/util/sanitize.js.map +1 -0
  267. package/dist/verify/checks.d.ts +21 -0
  268. package/dist/verify/checks.js +311 -0
  269. package/dist/verify/checks.js.map +1 -0
  270. package/dist/verify/index.d.ts +33 -0
  271. package/dist/verify/index.js +127 -0
  272. package/dist/verify/index.js.map +1 -0
  273. package/dist/verify/types.d.ts +20 -0
  274. package/dist/verify/types.js +3 -0
  275. package/dist/verify/types.js.map +1 -0
  276. package/dist/versioncheck.d.ts +22 -0
  277. package/dist/versioncheck.js +203 -0
  278. package/dist/versioncheck.js.map +1 -0
  279. package/dist/viz/index.d.ts +2 -0
  280. package/dist/viz/index.js +733 -0
  281. package/dist/viz/index.js.map +1 -0
  282. package/dist/workflows/engine.d.ts +46 -0
  283. package/dist/workflows/engine.js +320 -0
  284. package/dist/workflows/engine.js.map +1 -0
  285. package/dist/workflows/types.d.ts +92 -0
  286. package/dist/workflows/types.js +6 -0
  287. package/dist/workflows/types.js.map +1 -0
  288. package/package.json +86 -0
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.listDir = listDir;
37
+ exports.writeFile = writeFile;
38
+ exports.searchCode = searchCode;
39
+ exports.runShell = runShell;
40
+ exports.runTests = runTests;
41
+ exports.gitStatus = gitStatus;
42
+ exports.gitDiff = gitDiff;
43
+ // ─────────────────────────────────────────────────────────────────────────────
44
+ // list_dir
45
+ // ─────────────────────────────────────────────────────────────────────────────
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const child_process_1 = require("child_process");
49
+ const defaults_js_1 = require("../config/defaults.js");
50
+ /** Match a filename against a simple glob pattern (supports leading/trailing *). */
51
+ function matchGlob(name, pattern) {
52
+ if (!pattern.includes('*'))
53
+ return name === pattern;
54
+ if (pattern === '*')
55
+ return true;
56
+ if (pattern.startsWith('*') && pattern.endsWith('*'))
57
+ return name.includes(pattern.slice(1, -1));
58
+ if (pattern.startsWith('*'))
59
+ return name.endsWith(pattern.slice(1));
60
+ if (pattern.endsWith('*'))
61
+ return name.startsWith(pattern.slice(0, -1));
62
+ // Multiple wildcards: check prefix and suffix
63
+ const firstStar = pattern.indexOf('*');
64
+ const lastStar = pattern.lastIndexOf('*');
65
+ if (firstStar !== lastStar) {
66
+ const prefix = pattern.substring(0, firstStar);
67
+ const suffix = pattern.substring(lastStar + 1);
68
+ return name.startsWith(prefix) && name.endsWith(suffix);
69
+ }
70
+ return name === pattern;
71
+ }
72
+ function listDir(input, cwd) {
73
+ const dirPath = path.resolve(cwd, input.path ?? '.');
74
+ if (!fs.existsSync(dirPath))
75
+ return `Error: Directory not found: ${input.path}`;
76
+ const lines = [];
77
+ function walk(dir, prefix, currentDepth) {
78
+ if (currentDepth > input.depth)
79
+ return;
80
+ let entries;
81
+ try {
82
+ entries = fs.readdirSync(dir, { withFileTypes: true });
83
+ }
84
+ catch {
85
+ return;
86
+ }
87
+ const filtered = entries.filter(e => !defaults_js_1.IGNORE_PATTERNS.some(p => matchGlob(e.name, p)));
88
+ filtered.sort((a, b) => {
89
+ if (a.isDirectory() && !b.isDirectory())
90
+ return -1;
91
+ if (!a.isDirectory() && b.isDirectory())
92
+ return 1;
93
+ return a.name.localeCompare(b.name);
94
+ });
95
+ for (let i = 0; i < filtered.length; i++) {
96
+ const e = filtered[i];
97
+ const isLast = i === filtered.length - 1;
98
+ const connector = isLast ? '└── ' : '├── ';
99
+ const childPrefix = isLast ? prefix + ' ' : prefix + '│ ';
100
+ lines.push(`${prefix}${connector}${e.name}${e.isDirectory() ? '/' : ''}`);
101
+ if (e.isDirectory() && input.recursive)
102
+ walk(path.join(dir, e.name), childPrefix, currentDepth + 1);
103
+ }
104
+ }
105
+ const rel = path.relative(cwd, dirPath) || '.';
106
+ lines.push(rel + '/');
107
+ walk(dirPath, '', 1);
108
+ if (lines.length > 200) {
109
+ return lines.slice(0, 200).join('\n') + `\n\n... (${lines.length - 200} more entries — use a more specific path)`;
110
+ }
111
+ return lines.join('\n');
112
+ }
113
+ function writeFile(input, cwd) {
114
+ const filePath = path.resolve(cwd, input.path);
115
+ const dir = path.dirname(filePath);
116
+ if (!fs.existsSync(dir))
117
+ fs.mkdirSync(dir, { recursive: true });
118
+ const existed = fs.existsSync(filePath);
119
+ fs.writeFileSync(filePath, input.content, 'utf8');
120
+ const lines = input.content.split('\n').length;
121
+ return `✓ ${existed ? 'Overwrote' : 'Created'} ${input.path} (${lines} lines)`;
122
+ }
123
+ function searchCode(input, cwd) {
124
+ const searchDir = path.resolve(cwd, input.path ?? '.');
125
+ // Try ripgrep first (much faster), fall back to grep
126
+ const hasRg = (() => { try {
127
+ (0, child_process_1.execSync)('which rg', { stdio: 'pipe' });
128
+ return true;
129
+ }
130
+ catch {
131
+ return false;
132
+ } })();
133
+ const flagsRg = ['-n', '--no-heading', '--max-count=1'];
134
+ const flagsGrep = ['-rn'];
135
+ if (!input.case_sensitive) {
136
+ if (hasRg)
137
+ flagsRg.push('-i');
138
+ else
139
+ flagsGrep.push('-i');
140
+ }
141
+ if (input.literal) {
142
+ if (hasRg)
143
+ flagsRg.push('-F');
144
+ else
145
+ flagsGrep.push('-F');
146
+ }
147
+ if (input.file_glob) {
148
+ if (hasRg)
149
+ flagsRg.push('--glob=' + input.file_glob);
150
+ else
151
+ flagsGrep.push('--include', input.file_glob);
152
+ }
153
+ try {
154
+ if (hasRg) {
155
+ // Use execFileSync with args array to avoid shell injection
156
+ const result = (0, child_process_1.execFileSync)('rg', flagsRg.concat([input.pattern, searchDir]), {
157
+ encoding: 'utf8',
158
+ maxBuffer: 2 * 1024 * 1024,
159
+ });
160
+ const allLines = result.trim() ? result.trim().split('\n').filter(Boolean) : [];
161
+ const lines = allLines.slice(0, input.max_results);
162
+ if (lines.length === 0)
163
+ return 'No results for "' + input.pattern + '"';
164
+ const relative = lines.map(l => l.replace(searchDir + '/', '').replace(searchDir + path.sep, ''));
165
+ const truncated = allLines.length > lines.length ? ' (showing first ' + lines.length + ' of ' + allLines.length + ')' : '';
166
+ return 'Found ' + allLines.length + ' result' + (allLines.length > 1 ? 's' : '') + ' for "' + input.pattern + '"' + truncated + ':\n\n' + relative.join('\n');
167
+ }
168
+ else {
169
+ const result = (0, child_process_1.execFileSync)('grep', flagsGrep.concat(['--', input.pattern, searchDir]), {
170
+ encoding: 'utf8',
171
+ maxBuffer: 2 * 1024 * 1024,
172
+ });
173
+ const allLines = result.trim() ? result.trim().split('\n').filter(Boolean) : [];
174
+ const lines = allLines.slice(0, input.max_results);
175
+ if (lines.length === 0)
176
+ return 'No results for "' + input.pattern + '"';
177
+ const relative = lines.map(l => l.replace(searchDir + '/', '').replace(searchDir + path.sep, ''));
178
+ const truncated = allLines.length > lines.length ? ' (showing first ' + lines.length + ' of ' + allLines.length + ')' : '';
179
+ return 'Found ' + allLines.length + ' result' + (allLines.length > 1 ? 's' : '') + ' for "' + input.pattern + '"' + truncated + ':\n\n' + relative.join('\n');
180
+ }
181
+ }
182
+ catch (e) {
183
+ // Exit code 1 from grep/rg means no results
184
+ if (typeof e === 'object' && e !== null && 'status' in e && e.status === 1) {
185
+ return 'No results for "' + input.pattern + '"';
186
+ }
187
+ return 'Search error: ' + String(e);
188
+ }
189
+ }
190
+ /**
191
+ * Run a shell command with SIGKILL escalation on timeout.
192
+ *
193
+ * Uses `spawn` with `detached: true` so the child gets its own process group.
194
+ * On timeout: SIGTERM is sent to the process group; after a grace period,
195
+ * SIGKILL follows. This handles processes that trap or ignore SIGTERM.
196
+ *
197
+ * NOTE: Even SIGKILL cannot terminate a true D-state process blocked on
198
+ * hardware/network I/O (e.g. an unresponsive FUSE mount). That is a Linux
199
+ * kernel limitation — the real fix is preventing traversal into such paths
200
+ * (see BLOCKED_TRAVERSAL_PATHS in config/defaults.ts).
201
+ */
202
+ async function runShell(input, projectCwd) {
203
+ const workDir = input.cwd ? path.resolve(projectCwd, input.cwd) : projectCwd;
204
+ const timeout = input.timeout ?? 30_000;
205
+ const SIGKILL_GRACE_MS = 2_000;
206
+ const MAX_BUFFER = 2 * 1024 * 1024;
207
+ return new Promise((resolve) => {
208
+ const proc = (0, child_process_1.spawn)(input.command, {
209
+ shell: true,
210
+ detached: true,
211
+ cwd: workDir,
212
+ stdio: ['pipe', 'pipe', 'pipe'],
213
+ });
214
+ let stdout = '';
215
+ let stderr = '';
216
+ let exceededBuffer = false;
217
+ proc.stdout.on('data', (chunk) => {
218
+ if (!exceededBuffer) {
219
+ stdout += chunk.toString();
220
+ if (stdout.length > MAX_BUFFER)
221
+ exceededBuffer = true;
222
+ }
223
+ });
224
+ proc.stderr.on('data', (chunk) => {
225
+ if (!exceededBuffer) {
226
+ stderr += chunk.toString();
227
+ if (stderr.length > MAX_BUFFER)
228
+ exceededBuffer = true;
229
+ }
230
+ });
231
+ // Timeout → SIGTERM → grace → SIGKILL
232
+ const timer = setTimeout(() => {
233
+ try {
234
+ process.kill(-proc.pid, 'SIGTERM');
235
+ }
236
+ catch { /* already dead */ }
237
+ const grace = setTimeout(() => {
238
+ try {
239
+ process.kill(-proc.pid, 'SIGKILL');
240
+ }
241
+ catch { /* already dead */ }
242
+ }, SIGKILL_GRACE_MS);
243
+ proc.on('exit', () => clearTimeout(grace));
244
+ }, timeout);
245
+ proc.on('exit', (code, signal) => {
246
+ clearTimeout(timer);
247
+ if (exceededBuffer) {
248
+ resolve(`Error: Output exceeded ${MAX_BUFFER} bytes`);
249
+ return;
250
+ }
251
+ if (signal === 'SIGTERM' || signal === 'SIGKILL') {
252
+ resolve(`Error: Command timed out after ${timeout}ms`);
253
+ return;
254
+ }
255
+ if (code !== 0 && stderr.trim()) {
256
+ resolve(stderr.trim());
257
+ return;
258
+ }
259
+ resolve(stdout.trim() || '(command completed with no output)');
260
+ });
261
+ proc.on('error', (err) => {
262
+ clearTimeout(timer);
263
+ resolve(`Error: ${err.message}`);
264
+ });
265
+ });
266
+ }
267
+ async function runTests(input, cwd) {
268
+ // Detect test framework
269
+ let testCmd = detectTestCommand(cwd, input.file_or_pattern);
270
+ return runShell({ command: testCmd, timeout: 60_000 }, cwd);
271
+ }
272
+ function detectTestCommand(cwd, fileOrPattern) {
273
+ const pkg = path.join(cwd, 'package.json');
274
+ if (fs.existsSync(pkg)) {
275
+ const p = JSON.parse(fs.readFileSync(pkg, 'utf8'));
276
+ const scripts = p.scripts ?? {};
277
+ const deps = { ...(p.dependencies ?? {}), ...(p.devDependencies ?? {}) };
278
+ const pat = fileOrPattern ? ` ${JSON.stringify(fileOrPattern)}` : '';
279
+ if (deps.vitest || scripts.test?.includes('vitest'))
280
+ return `npx vitest run${pat}`;
281
+ if (deps.jest || scripts.test?.includes('jest'))
282
+ return `npx jest${pat}`;
283
+ if (scripts.test)
284
+ return `npm test${fileOrPattern ? ` -- ${fileOrPattern}` : ''}`;
285
+ }
286
+ if (fs.existsSync(path.join(cwd, 'pytest.ini')) || fs.existsSync(path.join(cwd, 'setup.py'))) {
287
+ return `python -m pytest${fileOrPattern ? ` ${fileOrPattern}` : ''} -v`;
288
+ }
289
+ if (fs.existsSync(path.join(cwd, 'go.mod'))) {
290
+ return `go test${fileOrPattern ? ` ${fileOrPattern}` : ' ./...'}`;
291
+ }
292
+ if (fs.existsSync(path.join(cwd, 'Cargo.toml'))) {
293
+ return `cargo test${fileOrPattern ? ` ${fileOrPattern}` : ''}`;
294
+ }
295
+ return 'npm test';
296
+ }
297
+ // ─────────────────────────────────────────────────────────────────────────────
298
+ // git tools
299
+ // ─────────────────────────────────────────────────────────────────────────────
300
+ function gitStatus(cwd) {
301
+ try {
302
+ const status = (0, child_process_1.execSync)('git status --short', { cwd, encoding: 'utf8' }).trim();
303
+ const log = (0, child_process_1.execSync)('git log --oneline -5', { cwd, encoding: 'utf8' }).trim();
304
+ const branch = (0, child_process_1.execSync)('git branch --show-current', { cwd, encoding: 'utf8' }).trim();
305
+ return [
306
+ `Branch: ${branch}`,
307
+ '',
308
+ status ? `Changed files:\n${status}` : 'Working tree clean',
309
+ '',
310
+ `Recent commits:\n${log}`,
311
+ ].join('\n');
312
+ }
313
+ catch {
314
+ return 'Not a git repository (or git not installed)';
315
+ }
316
+ }
317
+ function gitDiff(input, cwd) {
318
+ try {
319
+ const staged = input.staged ? '--staged ' : '';
320
+ const file = input.path ? `-- ${JSON.stringify(input.path)}` : '';
321
+ const diff = (0, child_process_1.execSync)(`git diff ${staged}${file}`, { cwd, encoding: 'utf8' });
322
+ return diff.trim() || `No ${input.staged ? 'staged ' : ''}changes${input.path ? ` in ${input.path}` : ''}`;
323
+ }
324
+ catch (e) {
325
+ return `Git error: ${String(e)}`;
326
+ }
327
+ }
328
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ToolDefinition } from '../providers/types.js';
2
+ export interface WebFetchInput {
3
+ url: string;
4
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD';
5
+ headers?: Record<string, string>;
6
+ body?: string;
7
+ max_chars?: number;
8
+ timeout_ms?: number;
9
+ }
10
+ export declare const WEB_FETCH_DEFINITION: ToolDefinition;
11
+ export declare function webFetch(input: WebFetchInput): Promise<string>;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WEB_FETCH_DEFINITION = void 0;
4
+ exports.webFetch = webFetch;
5
+ const sanitize_js_1 = require("../util/sanitize.js");
6
+ exports.WEB_FETCH_DEFINITION = {
7
+ name: 'web_fetch',
8
+ description: 'Fetch content from a URL. Returns the response body as text. ' +
9
+ 'Supports GET/POST/PUT/DELETE/PATCH/HEAD. Useful for reading web pages, ' +
10
+ 'calling APIs, downloading files. Large responses are truncated.',
11
+ parameters: {
12
+ type: 'object',
13
+ properties: {
14
+ url: { type: 'string', description: 'The URL to fetch' },
15
+ method: { type: 'string', description: 'HTTP method (default: GET)' },
16
+ headers: { type: 'object', description: 'Request headers as key-value string pairs' },
17
+ body: { type: 'string', description: 'Request body (for POST/PUT/PATCH)' },
18
+ max_chars: { type: 'number', description: 'Max characters to return (default: 50000)' },
19
+ timeout_ms: { type: 'number', description: 'Request timeout in ms (default: 15000)' },
20
+ },
21
+ required: ['url'],
22
+ },
23
+ };
24
+ const MAX_CHARS_DEFAULT = 50_000;
25
+ const TIMEOUT_MS_DEFAULT = 15_000;
26
+ const MAX_REDIRECTS = 5;
27
+ function truncate(text, max) {
28
+ if (text.length <= max)
29
+ return text;
30
+ return text.slice(0, max) + `\n\n... [truncated — ${text.length} chars total, showing first ${max}]`;
31
+ }
32
+ async function webFetch(input) {
33
+ const url = input.url;
34
+ const method = (input.method ?? 'GET').toUpperCase();
35
+ const maxChars = input.max_chars ?? MAX_CHARS_DEFAULT;
36
+ const timeoutMs = input.timeout_ms ?? TIMEOUT_MS_DEFAULT;
37
+ // Validate URL
38
+ let parsed;
39
+ try {
40
+ parsed = new URL(url);
41
+ }
42
+ catch {
43
+ return `Error: Invalid URL: ${url}`;
44
+ }
45
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
46
+ return `Error: Unsupported protocol: ${parsed.protocol} (only http/https supported)`;
47
+ }
48
+ const controller = new AbortController();
49
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
50
+ try {
51
+ const headers = {
52
+ 'User-Agent': 'Aura/0.2.4 (AI Agent)',
53
+ 'Accept': 'text/html,application/xhtml+xml,application/json,text/plain,*/*',
54
+ ...input.headers,
55
+ };
56
+ if (input.body && !headers['Content-Type']) {
57
+ headers['Content-Type'] = 'application/json';
58
+ }
59
+ const response = await fetch(url, {
60
+ method,
61
+ headers,
62
+ body: input.body,
63
+ signal: controller.signal,
64
+ redirect: 'follow',
65
+ });
66
+ clearTimeout(timer);
67
+ const status = response.status;
68
+ const statusText = response.statusText;
69
+ const contentType = response.headers.get('content-type') ?? '';
70
+ const contentLength = response.headers.get('content-length');
71
+ let body;
72
+ try {
73
+ body = await response.text();
74
+ }
75
+ catch (e) {
76
+ return `Error reading response body: ${String(e)}`;
77
+ }
78
+ // Build header summary
79
+ const headerLines = [
80
+ `HTTP ${status} ${statusText}`,
81
+ `Content-Type: ${contentType}`,
82
+ ];
83
+ if (contentLength) {
84
+ headerLines.push(`Content-Length: ${contentLength}`);
85
+ }
86
+ headerLines.push(`URL: ${url}`);
87
+ headerLines.push('');
88
+ const headerBlock = headerLines.join('\n');
89
+ if (!response.ok) {
90
+ return `${headerBlock}Error: HTTP ${status} ${statusText}\n\n${truncate(body, maxChars)}`;
91
+ }
92
+ // Auto-detect and clean HTML
93
+ const isHtml = contentType.includes('html');
94
+ const isJson = contentType.includes('json');
95
+ let processed = body;
96
+ if (isHtml) {
97
+ processed = (0, sanitize_js_1.stripHtml)(body);
98
+ }
99
+ // For JSON, try to pretty-print
100
+ if (isJson) {
101
+ try {
102
+ const parsed = JSON.parse(processed);
103
+ processed = JSON.stringify(parsed, null, 2);
104
+ }
105
+ catch {
106
+ // leave as-is if parse fails
107
+ }
108
+ }
109
+ return `${headerBlock}${truncate(processed, maxChars)}`;
110
+ }
111
+ catch (e) {
112
+ clearTimeout(timer);
113
+ if (e?.name === 'AbortError') {
114
+ return `Error: Request timed out after ${timeoutMs}ms — ${url}`;
115
+ }
116
+ return `Error fetching ${url}: ${String(e?.message ?? e)}`;
117
+ }
118
+ }
119
+ //# 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,8 @@
1
+ import type { ToolDefinition } from '../providers/types.js';
2
+ export interface WebSearchInput {
3
+ query: string;
4
+ max_results?: number;
5
+ region?: string;
6
+ }
7
+ export declare const WEB_SEARCH_DEFINITION: ToolDefinition;
8
+ export declare function webSearch(input: WebSearchInput): Promise<string>;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WEB_SEARCH_DEFINITION = void 0;
4
+ exports.webSearch = webSearch;
5
+ const sanitize_js_1 = require("../util/sanitize.js");
6
+ exports.WEB_SEARCH_DEFINITION = {
7
+ name: 'web_search',
8
+ description: 'Search the web using DuckDuckGo. Returns titles, URLs, and snippets. ' +
9
+ 'No API key required. Use for research, fact-checking, finding documentation.',
10
+ parameters: {
11
+ type: 'object',
12
+ properties: {
13
+ query: { type: 'string', description: 'The search query' },
14
+ max_results: { type: 'number', description: 'Max results to return (default: 10)' },
15
+ region: { type: 'string', description: 'Search region (default: wt-wt for global)' },
16
+ },
17
+ required: ['query'],
18
+ },
19
+ };
20
+ function extractResults(html) {
21
+ const results = [];
22
+ // Match DuckDuckGo result blocks
23
+ const resultRegex = /<a[^>]+class="result__a"[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<a[^>]+class="result__snippet"[^>]*>([\s\S]*?)<\/a>/gi;
24
+ let match;
25
+ while ((match = resultRegex.exec(html)) !== null) {
26
+ let url = match[1];
27
+ // DuckDuckGo wraps URLs in a redirect — extract the real URL
28
+ const uddg = url.match(/uddg=([^&]+)/);
29
+ if (uddg)
30
+ url = decodeURIComponent(uddg[1]);
31
+ const title = (0, sanitize_js_1.stripHtml)(match[2]).trim();
32
+ const snippet = (0, sanitize_js_1.stripHtml)(match[3]).trim();
33
+ if (title && url) {
34
+ results.push({ title, url, snippet });
35
+ }
36
+ }
37
+ return results;
38
+ }
39
+ async function webSearch(input) {
40
+ const maxResults = input.max_results ?? 10;
41
+ const region = input.region ?? 'wt-wt';
42
+ const query = input.query;
43
+ if (!query.trim())
44
+ return 'Error: query is required';
45
+ const params = new URLSearchParams({
46
+ q: query,
47
+ kl: region,
48
+ t: 'h_',
49
+ });
50
+ const url = `https://html.duckduckgo.com/html/?${params}`;
51
+ try {
52
+ const response = await fetch(url, {
53
+ headers: {
54
+ 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
55
+ 'Accept': 'text/html',
56
+ },
57
+ signal: AbortSignal.timeout(10_000),
58
+ });
59
+ if (!response.ok) {
60
+ return `Error: DuckDuckGo returned HTTP ${response.status}`;
61
+ }
62
+ const html = await response.text();
63
+ const results = extractResults(html).slice(0, maxResults);
64
+ if (results.length === 0) {
65
+ return `No results found for: "${query}"`;
66
+ }
67
+ const lines = [`Search results for: "${query}"`, ''];
68
+ results.forEach((r, i) => {
69
+ lines.push(`${i + 1}. ${r.title}`);
70
+ lines.push(` ${r.url}`);
71
+ if (r.snippet)
72
+ lines.push(` ${r.snippet}`);
73
+ lines.push('');
74
+ });
75
+ return lines.join('\n');
76
+ }
77
+ catch (e) {
78
+ return `Error searching: ${e?.message ?? String(e)}`;
79
+ }
80
+ }
81
+ //# 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,10 @@
1
+ import type { ToolDefinition } from '../providers/types.js';
2
+ export interface WhatsAppInput {
3
+ action: 'send' | 'send_media' | 'status';
4
+ to?: string;
5
+ message?: string;
6
+ media_url?: string;
7
+ from?: string;
8
+ }
9
+ export declare const WHATSAPP_DEFINITION: ToolDefinition;
10
+ export declare function whatsAppTool(input: WhatsAppInput): Promise<string>;