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,204 @@
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.proposalsDir = proposalsDir;
37
+ exports.generateProposals = generateProposals;
38
+ exports.listProposals = listProposals;
39
+ exports.defaultSystemPromptPath = defaultSystemPromptPath;
40
+ exports.applyHarnessProposal = applyHarnessProposal;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const child_process_1 = require("child_process");
44
+ const weakness_miner_js_1 = require("./weakness-miner.js");
45
+ const PATCH_REGISTRY = {
46
+ 'no-tool-calls': {
47
+ section: '## How you operate',
48
+ anchor: '- When done, summarize exactly what you changed and why.',
49
+ patch: '- Never respond to a task with only prose. Always begin by using at least one tool (search_code, read_file, or list_dir) to investigate the codebase before summarizing or concluding. A response with zero tool calls is almost always incomplete.',
50
+ },
51
+ 'file-not-created': {
52
+ section: '## How you operate',
53
+ anchor: '- If a tool returns an error, read the error carefully and adjust.',
54
+ patch: '- After calling write_file, verify the file exists by reading it back or checking with list_dir. If write_file fails, diagnose the error (permission, missing parent dir) and retry with the fix. Never move on after a failed write without attempting recovery.',
55
+ },
56
+ 'explored-not-executed': {
57
+ section: '## How you operate',
58
+ anchor: '- When done, summarize exactly what you changed and why.',
59
+ patch: '- If the task requires a code change, you must eventually call write_file or edit_file to apply it. Do not spend all turns on read_file and search_code — at some point you must commit to making the change. Aim for a 2:1 ratio of reads to writes, not 100% reads.',
60
+ },
61
+ 'test-regression': {
62
+ section: '## How you operate',
63
+ anchor: '- After making changes, run_tests to verify nothing broke.',
64
+ patch: '- When run_tests reports new failures you did not expect, immediately investigate and fix them before proceeding. Never leave the codebase in a state with more test failures than you started with. If you introduced a regression, roll back your change or fix it before moving on.',
65
+ },
66
+ 'loop-exhausted': {
67
+ section: '## How you operate',
68
+ anchor: '- When done, summarize exactly what you changed and why.',
69
+ patch: '- Work efficiently. Do not repeat the same tool calls. If you have made 3+ attempts at the same approach without progress, try a fundamentally different strategy. Prioritize completing the task over perfect completion — a working partial solution is better than an exhausted loop.',
70
+ },
71
+ 'safety-false-positive': {
72
+ section: '## Safety',
73
+ anchor: '- If a command seems destructive, explain what it does and ask for confirmation.',
74
+ patch: '- The safety system may occasionally block harmless commands (mkdir, ls, touch, cp, etc.). If a common file-manipulation command is blocked, try using write_file or edit_file as an alternative, or explain in your response that the safety layer is being overly cautious.',
75
+ },
76
+ };
77
+ // ─────────────────────────────────────────────────────────────────────────────
78
+ // Paths
79
+ // ─────────────────────────────────────────────────────────────────────────────
80
+ function proposalsDir() {
81
+ return path.join(process.env.HOME ?? '/tmp', '.aura', 'harness', 'proposals');
82
+ }
83
+ function proposalPath(id) {
84
+ return path.join(proposalsDir(), `${id}.json`);
85
+ }
86
+ // ─────────────────────────────────────────────────────────────────────────────
87
+ // Generate proposals
88
+ // ─────────────────────────────────────────────────────────────────────────────
89
+ function generateProposals(reportPath) {
90
+ const report = (0, weakness_miner_js_1.loadReport)(reportPath);
91
+ if (!report)
92
+ return [];
93
+ const proposals = [];
94
+ for (const p of report.patterns) {
95
+ const entry = PATCH_REGISTRY[p.pattern];
96
+ if (!entry)
97
+ continue;
98
+ const id = `patch-${Date.now()}-${p.pattern}`;
99
+ const proposal = {
100
+ id,
101
+ pattern: p.pattern,
102
+ description: p.description,
103
+ targetSection: entry.section,
104
+ patchText: entry.patch,
105
+ anchorText: entry.anchor,
106
+ createdAt: new Date().toISOString(),
107
+ status: 'proposed',
108
+ };
109
+ const outDir = proposalsDir();
110
+ if (!fs.existsSync(outDir))
111
+ fs.mkdirSync(outDir, { recursive: true });
112
+ fs.writeFileSync(proposalPath(id), JSON.stringify(proposal, null, 2), 'utf8');
113
+ proposals.push(proposal);
114
+ }
115
+ return proposals;
116
+ }
117
+ // ─────────────────────────────────────────────────────────────────────────────
118
+ // List proposals
119
+ // ─────────────────────────────────────────────────────────────────────────────
120
+ function listProposals() {
121
+ const dir = proposalsDir();
122
+ if (!fs.existsSync(dir))
123
+ return [];
124
+ const files = fs.readdirSync(dir).filter(f => f.endsWith('.json'));
125
+ const proposals = [];
126
+ for (const f of files) {
127
+ try {
128
+ const raw = fs.readFileSync(path.join(dir, f), 'utf8');
129
+ proposals.push(JSON.parse(raw));
130
+ }
131
+ catch {
132
+ // Skip malformed files
133
+ }
134
+ }
135
+ return proposals;
136
+ }
137
+ // ─────────────────────────────────────────────────────────────────────────────
138
+ // Apply a proposal (with rollback on test failure)
139
+ // ─────────────────────────────────────────────────────────────────────────────
140
+ function defaultSystemPromptPath() {
141
+ return path.join(process.cwd(), 'src', 'agent', 'system-prompt.ts');
142
+ }
143
+ function applyHarnessProposal(id, opts = {}) {
144
+ const dir = opts.proposalsDir ?? proposalsDir();
145
+ const filePath = path.join(dir, `${id}.json`);
146
+ // 1. Load proposal
147
+ if (!fs.existsSync(filePath)) {
148
+ return { success: false, message: `Proposal not found: ${id}` };
149
+ }
150
+ let proposal;
151
+ try {
152
+ proposal = JSON.parse(fs.readFileSync(filePath, 'utf8'));
153
+ }
154
+ catch {
155
+ return { success: false, message: `Invalid proposal file: ${filePath}` };
156
+ }
157
+ // 2. Read system-prompt.ts
158
+ const promptPath = opts.systemPromptPath ?? defaultSystemPromptPath();
159
+ if (!fs.existsSync(promptPath)) {
160
+ return { success: false, message: `System prompt not found: ${promptPath}` };
161
+ }
162
+ const original = fs.readFileSync(promptPath, 'utf8');
163
+ // 3. Find the anchor and insert the patch after it
164
+ const anchorIdx = original.indexOf(proposal.anchorText);
165
+ if (anchorIdx === -1) {
166
+ return { success: false, message: `Anchor text not found in system prompt: "${proposal.anchorText.slice(0, 60)}..."` };
167
+ }
168
+ const insertPos = anchorIdx + proposal.anchorText.length;
169
+ const patched = original.slice(0, insertPos) + '\n' + proposal.patchText + original.slice(insertPos);
170
+ // 4. Write patched file
171
+ fs.writeFileSync(promptPath, patched, 'utf8');
172
+ // 5. Update proposal status
173
+ proposal.status = 'applied';
174
+ fs.writeFileSync(filePath, JSON.stringify(proposal, null, 2), 'utf8');
175
+ // 6. Run tests
176
+ const testCmd = opts.testCommand ?? 'npm test 2>&1';
177
+ let testsPassed = false;
178
+ try {
179
+ const output = (0, child_process_1.execSync)(testCmd, {
180
+ encoding: 'utf8',
181
+ timeout: 120_000,
182
+ cwd: process.cwd(),
183
+ stdio: ['pipe', 'pipe', 'pipe'],
184
+ });
185
+ // Check for failures in output — look for non-zero failure counts
186
+ const hasFailure = /[1-9]\d* tests? (fail|failed|failing)/i.test(output) ||
187
+ /FAIL\s/i.test(output) ||
188
+ /Tests:.*\s[1-9]\d*\s+failed/i.test(output);
189
+ testsPassed = !hasFailure;
190
+ }
191
+ catch {
192
+ // Non-zero exit code = test failure
193
+ testsPassed = false;
194
+ }
195
+ // 7. Revert if tests failed
196
+ if (!testsPassed) {
197
+ fs.writeFileSync(promptPath, original, 'utf8');
198
+ proposal.status = 'reverted';
199
+ fs.writeFileSync(filePath, JSON.stringify(proposal, null, 2), 'utf8');
200
+ return { success: false, message: 'Tests failed after patch — reverted.' };
201
+ }
202
+ return { success: true, message: `Patch applied: ${proposal.pattern} → ${proposal.targetSection}` };
203
+ }
204
+ //# sourceMappingURL=proposer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposer.js","sourceRoot":"","sources":["../../src/harness/proposer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export type PatternName = 'no-tool-calls' | 'file-not-created' | 'explored-not-executed' | 'test-regression' | 'loop-exhausted' | 'safety-false-positive';
2
+ export interface WeaknessOccurrence {
3
+ sessionId: string;
4
+ sessionTitle: string;
5
+ /** The user task that triggered this pattern */
6
+ exampleTask: string;
7
+ /** Brief description of the failure */
8
+ exampleFailure: string;
9
+ timestamp: string;
10
+ }
11
+ export interface PatternReport {
12
+ pattern: PatternName;
13
+ frequency: number;
14
+ description: string;
15
+ occurrences: WeaknessOccurrence[];
16
+ promptPatch: string;
17
+ }
18
+ export interface WeaknessReport {
19
+ generatedAt: string;
20
+ sessionsAnalyzed: number;
21
+ patterns: PatternReport[];
22
+ summary: string;
23
+ }
24
+ export declare function sessionDir(): string;
25
+ export declare function mineWeaknesses(customDir?: string): WeaknessReport;
26
+ export declare function reportPath(): string;
27
+ export declare function saveReport(report: WeaknessReport, customPath?: string): string;
28
+ export declare function loadReport(customPath?: string): WeaknessReport | null;
@@ -0,0 +1,359 @@
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.sessionDir = sessionDir;
37
+ exports.mineWeaknesses = mineWeaknesses;
38
+ exports.reportPath = reportPath;
39
+ exports.saveReport = saveReport;
40
+ exports.loadReport = loadReport;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ // Harmless commands that should not be blocked by the safety layer
44
+ const HARMLESS_COMMANDS = [
45
+ 'mkdir', 'ls', 'cat', 'echo', 'pwd', 'touch', 'cp', 'mv',
46
+ 'git status', 'git log', 'git diff', 'git show', 'git add', 'git commit',
47
+ 'npm test', 'npm run', 'npx', 'node', 'tsc',
48
+ 'which', 'find', 'grep', 'rg',
49
+ ];
50
+ // ─────────────────────────────────────────────────────────────────────────────
51
+ // Session file reading
52
+ // ─────────────────────────────────────────────────────────────────────────────
53
+ function sessionDir() {
54
+ return process.env.AURA_SESSION_DIR ?? path.join(process.env.HOME ?? '/tmp', '.aura', 'sessions');
55
+ }
56
+ function loadAllSessions(baseDir) {
57
+ const sessions = [];
58
+ if (!fs.existsSync(baseDir))
59
+ return sessions;
60
+ const entries = fs.readdirSync(baseDir, { withFileTypes: true });
61
+ for (const entry of entries) {
62
+ const fullPath = path.join(baseDir, entry.name);
63
+ if (entry.isDirectory()) {
64
+ // Project subdirectory — scan for session files inside
65
+ const subFiles = fs.readdirSync(fullPath).filter(f => f.endsWith('.json') && !f.endsWith('.tmp'));
66
+ for (const f of subFiles) {
67
+ const session = parseSessionFile(path.join(fullPath, f));
68
+ if (session)
69
+ sessions.push(session);
70
+ }
71
+ }
72
+ else if (entry.isFile() && entry.name.endsWith('.json') && !entry.name.endsWith('.tmp')) {
73
+ const session = parseSessionFile(fullPath);
74
+ if (session)
75
+ sessions.push(session);
76
+ }
77
+ }
78
+ return sessions;
79
+ }
80
+ function parseSessionFile(filePath) {
81
+ try {
82
+ const raw = fs.readFileSync(filePath, 'utf8');
83
+ const parsed = JSON.parse(raw);
84
+ if (!Array.isArray(parsed.history) || parsed.history.length === 0)
85
+ return null;
86
+ // Derive id from filename if missing
87
+ if (!parsed.id)
88
+ parsed.id = path.basename(filePath, '.json');
89
+ return parsed;
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }
95
+ function getUserTask(history) {
96
+ const first = history.find(m => m.role === 'user');
97
+ if (!first)
98
+ return '(unknown task)';
99
+ return typeof first.content === 'string' ? first.content.slice(0, 120) : '(unknown task)';
100
+ }
101
+ function getTimestamp(session) {
102
+ return session.updatedAt ?? session.savedAt ?? session.createdAt ?? '(unknown time)';
103
+ }
104
+ // ─────────────────────────────────────────────────────────────────────────────
105
+ // Pattern detectors
106
+ // ─────────────────────────────────────────────────────────────────────────────
107
+ function collectToolCalls(history) {
108
+ const calls = [];
109
+ for (const msg of history) {
110
+ if (msg.role === 'assistant' && 'toolCalls' in msg && msg.toolCalls) {
111
+ calls.push(...msg.toolCalls);
112
+ }
113
+ }
114
+ return calls;
115
+ }
116
+ function collectToolResults(history) {
117
+ const results = [];
118
+ for (const msg of history) {
119
+ if (msg.role === 'tool_result' && 'results' in msg) {
120
+ results.push(...msg.results);
121
+ }
122
+ }
123
+ return results;
124
+ }
125
+ function hasAssistantProse(history) {
126
+ return history.some(m => m.role === 'assistant' && 'content' in m && typeof m.content === 'string' && m.content.trim().length > 20);
127
+ }
128
+ /** no-tool-calls: assistant responded with prose but zero tool invocations */
129
+ function detectNoToolCalls(session) {
130
+ const calls = collectToolCalls(session.history);
131
+ if (calls.length > 0)
132
+ return null;
133
+ if (!hasAssistantProse(session.history))
134
+ return null;
135
+ return {
136
+ sessionId: session.id ?? '(unknown)',
137
+ sessionTitle: session.title ?? '(untitled)',
138
+ exampleTask: getUserTask(session.history),
139
+ exampleFailure: 'Agent responded with prose only — no tool calls were made to investigate or solve the task.',
140
+ timestamp: getTimestamp(session),
141
+ };
142
+ }
143
+ /** file-not-created: write_file was called but the target file doesn't exist on disk */
144
+ function detectFileNotCreated(session) {
145
+ const calls = collectToolCalls(session.history);
146
+ const results = collectToolResults(session.history);
147
+ const occurrences = [];
148
+ for (const call of calls) {
149
+ if (call.name !== 'write_file')
150
+ continue;
151
+ const filePath = String(call.input.path ?? '');
152
+ if (!filePath)
153
+ continue;
154
+ // Check if the corresponding tool result indicates an error
155
+ const matchingResult = results.find(r => r.id === call.id);
156
+ if (matchingResult?.isError) {
157
+ occurrences.push({
158
+ sessionId: session.id ?? '(unknown)',
159
+ sessionTitle: session.title ?? '(untitled)',
160
+ exampleTask: getUserTask(session.history),
161
+ exampleFailure: `write_file called for "${filePath}" but the operation reported an error: ${matchingResult.content.slice(0, 100)}`,
162
+ timestamp: getTimestamp(session),
163
+ });
164
+ }
165
+ }
166
+ return occurrences;
167
+ }
168
+ /** explored-not-executed: only read operations (read_file, search_code, list_dir), no writes */
169
+ function detectExploredNotExecuted(session) {
170
+ const calls = collectToolCalls(session.history);
171
+ if (calls.length === 0)
172
+ return null;
173
+ const readOnlyTools = ['read_file', 'search_code', 'list_dir', 'git_status', 'git_diff'];
174
+ const writeTools = ['write_file', 'edit_file', 'run_shell', 'run_tests', 'spawn_task'];
175
+ const hasOnlyReadOnly = calls.every(c => readOnlyTools.includes(c.name));
176
+ const hasWriteAttempt = calls.some(c => writeTools.includes(c.name));
177
+ if (!hasOnlyReadOnly || hasWriteAttempt)
178
+ return null;
179
+ return {
180
+ sessionId: session.id ?? '(unknown)',
181
+ sessionTitle: session.title ?? '(untitled)',
182
+ exampleTask: getUserTask(session.history),
183
+ exampleFailure: `Agent made ${calls.length} read-only calls (${Array.from(new Set(calls.map(c => c.name))).join(', ')}) but never attempted to write or execute anything.`,
184
+ timestamp: getTimestamp(session),
185
+ };
186
+ }
187
+ /** test-regression: run_tests was called and the result indicates new failures */
188
+ function detectTestRegression(session) {
189
+ const results = collectToolResults(session.history);
190
+ const calls = collectToolCalls(session.history);
191
+ // Only flag if run_tests was actually called
192
+ const testCalls = calls.filter(c => c.name === 'run_tests');
193
+ if (testCalls.length === 0)
194
+ return null;
195
+ // Look for test results with errors
196
+ const testResults = results.filter(r => r.name === 'run_tests' || r.name === 'run_shell');
197
+ const failedResult = testResults.find(r => {
198
+ if (r.isError)
199
+ return true;
200
+ const content = r.content.toLowerCase();
201
+ return content.includes('failed') || content.includes('failing') || content.includes('error') ||
202
+ content.includes('FAIL ') || content.includes('✗') || content.includes('❌');
203
+ });
204
+ if (!failedResult)
205
+ return null;
206
+ return {
207
+ sessionId: session.id ?? '(unknown)',
208
+ sessionTitle: session.title ?? '(untitled)',
209
+ exampleTask: getUserTask(session.history),
210
+ exampleFailure: `Tests showed failures: ${failedResult.content.slice(0, 150)}`,
211
+ timestamp: getTimestamp(session),
212
+ };
213
+ }
214
+ /** loop-exhausted: the session ended with the "Loop ended after N turns" message */
215
+ function detectLoopExhausted(session) {
216
+ const lastAssistant = [...session.history].reverse().find(m => m.role === 'assistant');
217
+ if (!lastAssistant || !('content' in lastAssistant))
218
+ return null;
219
+ const content = String(lastAssistant.content ?? '');
220
+ if (!content.includes('Loop ended after') && !content.includes('maxTurns'))
221
+ return null;
222
+ return {
223
+ sessionId: session.id ?? '(unknown)',
224
+ sessionTitle: session.title ?? '(untitled)',
225
+ exampleTask: getUserTask(session.history),
226
+ exampleFailure: `Loop exhausted: ${content.slice(0, 150)}`,
227
+ timestamp: getTimestamp(session),
228
+ };
229
+ }
230
+ /** safety-false-positive: run_shell was blocked on a harmless command */
231
+ function detectSafetyFalsePositive(session) {
232
+ const results = collectToolResults(session.history);
233
+ const calls = collectToolCalls(session.history);
234
+ const occurrences = [];
235
+ for (const result of results) {
236
+ if (!result.isError)
237
+ continue;
238
+ const content = result.content.toLowerCase();
239
+ if (!content.includes('blocked') && !content.includes('dangerous') && !content.includes('not allowed'))
240
+ continue;
241
+ // Find the matching call to get the command
242
+ const matchingCall = calls.find(c => c.id === result.id);
243
+ if (!matchingCall || matchingCall.name !== 'run_shell')
244
+ continue;
245
+ const cmd = String(matchingCall.input.command ?? '');
246
+ const isHarmless = HARMLESS_COMMANDS.some(h => cmd.toLowerCase().trim().startsWith(h));
247
+ if (isHarmless) {
248
+ occurrences.push({
249
+ sessionId: session.id ?? '(unknown)',
250
+ sessionTitle: session.title ?? '(untitled)',
251
+ exampleTask: getUserTask(session.history),
252
+ exampleFailure: `Harmless command "${cmd.slice(0, 80)}" was blocked by safety system: ${result.content.slice(0, 100)}`,
253
+ timestamp: getTimestamp(session),
254
+ });
255
+ }
256
+ }
257
+ return occurrences;
258
+ }
259
+ // ─────────────────────────────────────────────────────────────────────────────
260
+ // Prompt patch suggestions
261
+ // ─────────────────────────────────────────────────────────────────────────────
262
+ const PROMPT_PATCHES = {
263
+ 'no-tool-calls': 'PATCH: Add to system prompt — "Never respond to a task with only prose. Always begin by using at least one tool (search_code, read_file, or list_dir) to investigate the codebase before summarizing or concluding. A response with zero tool calls is almost always incomplete."',
264
+ 'file-not-created': 'PATCH: Add to system prompt — "After calling write_file, verify the file exists by reading it back or checking with list_dir. If write_file fails, diagnose the error (permission, missing parent dir) and retry with the fix. Never move on after a failed write without attempting recovery."',
265
+ 'explored-not-executed': 'PATCH: Add to system prompt — "If the task requires a code change, you must eventually call write_file or edit_file to apply it. Do not spend all turns on read_file and search_code — at some point you must commit to making the change. Aim for a 2:1 ratio of reads to writes, not 100% reads."',
266
+ 'test-regression': 'PATCH: Add to system prompt — "When run_tests reports new failures you did not expect, immediately investigate and fix them before proceeding. Never leave the codebase in a state with more test failures than you started with. If you introduced a regression, roll back your change or fix it before moving on."',
267
+ 'loop-exhausted': 'PATCH: Add to system prompt — "Work efficiently. Do not repeat the same tool calls. If you have made 3+ attempts at the same approach without progress, try a fundamentally different strategy. Prioritize completing the task over perfect completion — a working partial solution is better than an exhausted loop."',
268
+ 'safety-false-positive': 'PATCH: Review DANGEROUS_PATTERNS and SAFE_SHELL_COMMANDS in config/defaults.ts. The safety system is blocking commands that are harmless. Add the blocked command prefix to SAFE_SHELL_COMMANDS, or refine the regex in DANGEROUS_PATTERNS to avoid over-matching. Consider allowing mkdir, touch, and other common file-manipulation commands without confirmation.',
269
+ };
270
+ // ─────────────────────────────────────────────────────────────────────────────
271
+ // Main miner
272
+ // ─────────────────────────────────────────────────────────────────────────────
273
+ function mineWeaknesses(customDir) {
274
+ const dir = customDir ?? sessionDir();
275
+ const sessions = loadAllSessions(dir);
276
+ const rawOccurrences = {
277
+ 'no-tool-calls': [],
278
+ 'file-not-created': [],
279
+ 'explored-not-executed': [],
280
+ 'test-regression': [],
281
+ 'loop-exhausted': [],
282
+ 'safety-false-positive': [],
283
+ };
284
+ for (const session of sessions) {
285
+ const noTool = detectNoToolCalls(session);
286
+ if (noTool)
287
+ rawOccurrences['no-tool-calls'].push(noTool);
288
+ rawOccurrences['file-not-created'].push(...detectFileNotCreated(session));
289
+ const explored = detectExploredNotExecuted(session);
290
+ if (explored)
291
+ rawOccurrences['explored-not-executed'].push(explored);
292
+ const regression = detectTestRegression(session);
293
+ if (regression)
294
+ rawOccurrences['test-regression'].push(regression);
295
+ const exhausted = detectLoopExhausted(session);
296
+ if (exhausted)
297
+ rawOccurrences['loop-exhausted'].push(exhausted);
298
+ rawOccurrences['safety-false-positive'].push(...detectSafetyFalsePositive(session));
299
+ }
300
+ // Only include patterns with 2+ occurrences
301
+ const patterns = [];
302
+ for (const [name, occurrences] of Object.entries(rawOccurrences)) {
303
+ if (occurrences.length < 2)
304
+ continue;
305
+ patterns.push({
306
+ pattern: name,
307
+ frequency: occurrences.length,
308
+ description: PATTERN_DESCRIPTIONS[name],
309
+ occurrences,
310
+ promptPatch: PROMPT_PATCHES[name],
311
+ });
312
+ }
313
+ // Sort by frequency descending
314
+ patterns.sort((a, b) => b.frequency - a.frequency);
315
+ const totalWeaknesses = patterns.reduce((sum, p) => sum + p.frequency, 0);
316
+ const summary = patterns.length === 0
317
+ ? 'No recurring weakness patterns detected across all sessions. Agent behavior looks healthy.'
318
+ : `Found ${patterns.length} recurring pattern(s) across ${sessions.length} session(s) with ${totalWeaknesses} total occurrences. Top issue: ${patterns[0]?.pattern} (${patterns[0]?.frequency}x).`;
319
+ return {
320
+ generatedAt: new Date().toISOString(),
321
+ sessionsAnalyzed: sessions.length,
322
+ patterns,
323
+ summary,
324
+ };
325
+ }
326
+ const PATTERN_DESCRIPTIONS = {
327
+ 'no-tool-calls': 'Agent responded with prose only — no tool calls were made to investigate or solve the task.',
328
+ 'file-not-created': 'Agent called write_file but the operation failed (file not created on disk).',
329
+ 'explored-not-executed': 'Agent only performed read operations (read_file, search_code, list_dir) without writing or executing anything.',
330
+ 'test-regression': 'Agent introduced new test failures during the session.',
331
+ 'loop-exhausted': 'Agent loop hit the max turn limit without completing the task.',
332
+ 'safety-false-positive': 'Safety system blocked a harmless shell command, preventing the agent from working.',
333
+ };
334
+ // ─────────────────────────────────────────────────────────────────────────────
335
+ // Report persistence
336
+ // ─────────────────────────────────────────────────────────────────────────────
337
+ function reportPath() {
338
+ return path.join(process.env.HOME ?? '/tmp', '.aura', 'harness', 'weakness-report.json');
339
+ }
340
+ function saveReport(report, customPath) {
341
+ const filePath = customPath ?? reportPath();
342
+ const dir = path.dirname(filePath);
343
+ if (!fs.existsSync(dir))
344
+ fs.mkdirSync(dir, { recursive: true });
345
+ fs.writeFileSync(filePath, JSON.stringify(report, null, 2), 'utf8');
346
+ return filePath;
347
+ }
348
+ function loadReport(customPath) {
349
+ const filePath = customPath ?? reportPath();
350
+ if (!fs.existsSync(filePath))
351
+ return null;
352
+ try {
353
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
354
+ }
355
+ catch {
356
+ return null;
357
+ }
358
+ }
359
+ //# sourceMappingURL=weakness-miner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weakness-miner.js","sourceRoot":"","sources":["../../src/harness/weakness-miner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface ExternalHarness {
2
+ id: string;
3
+ name: string;
4
+ command: string;
5
+ role: string;
6
+ status: 'available' | 'missing' | 'partial';
7
+ path?: string;
8
+ version?: string;
9
+ notes: string[];
10
+ }
11
+ export interface HermesStatus {
12
+ home: string;
13
+ workspace: string;
14
+ homeExists: boolean;
15
+ workspaceExists: boolean;
16
+ scripts: string[];
17
+ skills: string[];
18
+ skillCount: number;
19
+ processStateExists: boolean;
20
+ gatewayStateExists: boolean;
21
+ }
22
+ export declare function getHarnessStatus(): ExternalHarness[];
23
+ export declare function getHermesStatus(): HermesStatus;