@aionlabsai/aion 0.2.0 → 0.2.2

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 (177) hide show
  1. package/README.md +283 -9
  2. package/dist/agents/base-agent.d.ts.map +1 -1
  3. package/dist/agents/base-agent.js +23 -12
  4. package/dist/agents/base-agent.js.map +1 -1
  5. package/dist/agents/synthesizer.d.ts +3 -0
  6. package/dist/agents/synthesizer.d.ts.map +1 -1
  7. package/dist/agents/synthesizer.js +93 -52
  8. package/dist/agents/synthesizer.js.map +1 -1
  9. package/dist/cli/commands/audit.d.ts.map +1 -1
  10. package/dist/cli/commands/audit.js +115 -121
  11. package/dist/cli/commands/audit.js.map +1 -1
  12. package/dist/cli/commands/chat.d.ts +3 -0
  13. package/dist/cli/commands/chat.d.ts.map +1 -0
  14. package/dist/cli/commands/chat.js +129 -0
  15. package/dist/cli/commands/chat.js.map +1 -0
  16. package/dist/cli/commands/context.d.ts +3 -0
  17. package/dist/cli/commands/context.d.ts.map +1 -0
  18. package/dist/cli/commands/context.js +72 -0
  19. package/dist/cli/commands/context.js.map +1 -0
  20. package/dist/cli/commands/diff.d.ts +3 -0
  21. package/dist/cli/commands/diff.d.ts.map +1 -0
  22. package/dist/cli/commands/diff.js +144 -0
  23. package/dist/cli/commands/diff.js.map +1 -0
  24. package/dist/cli/commands/health.d.ts.map +1 -1
  25. package/dist/cli/commands/health.js +17 -0
  26. package/dist/cli/commands/health.js.map +1 -1
  27. package/dist/cli/commands/init.d.ts +3 -0
  28. package/dist/cli/commands/init.d.ts.map +1 -0
  29. package/dist/cli/commands/init.js +52 -0
  30. package/dist/cli/commands/init.js.map +1 -0
  31. package/dist/cli/commands/next.d.ts +3 -0
  32. package/dist/cli/commands/next.d.ts.map +1 -0
  33. package/dist/cli/commands/next.js +49 -0
  34. package/dist/cli/commands/next.js.map +1 -0
  35. package/dist/cli/commands/report.d.ts.map +1 -1
  36. package/dist/cli/commands/report.js +52 -392
  37. package/dist/cli/commands/report.js.map +1 -1
  38. package/dist/cli/commands/search.d.ts +3 -0
  39. package/dist/cli/commands/search.d.ts.map +1 -0
  40. package/dist/cli/commands/search.js +50 -0
  41. package/dist/cli/commands/search.js.map +1 -0
  42. package/dist/cli/commands/tree.d.ts +3 -0
  43. package/dist/cli/commands/tree.d.ts.map +1 -0
  44. package/dist/cli/commands/tree.js +85 -0
  45. package/dist/cli/commands/tree.js.map +1 -0
  46. package/dist/cli/menu.d.ts.map +1 -1
  47. package/dist/cli/menu.js +56 -1
  48. package/dist/cli/menu.js.map +1 -1
  49. package/dist/core/cost-tracker.d.ts +10 -0
  50. package/dist/core/cost-tracker.d.ts.map +1 -1
  51. package/dist/core/cost-tracker.js +53 -0
  52. package/dist/core/cost-tracker.js.map +1 -1
  53. package/dist/core/orchestrator.d.ts +2 -1
  54. package/dist/core/orchestrator.d.ts.map +1 -1
  55. package/dist/core/orchestrator.js +2 -2
  56. package/dist/core/orchestrator.js.map +1 -1
  57. package/dist/core/pipelines/audit-pipeline.d.ts +13 -2
  58. package/dist/core/pipelines/audit-pipeline.d.ts.map +1 -1
  59. package/dist/core/pipelines/audit-pipeline.js +156 -37
  60. package/dist/core/pipelines/audit-pipeline.js.map +1 -1
  61. package/dist/index.js +17 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/infra/aion-config.d.ts +26 -0
  64. package/dist/infra/aion-config.d.ts.map +1 -0
  65. package/dist/infra/aion-config.js +60 -0
  66. package/dist/infra/aion-config.js.map +1 -0
  67. package/dist/infra/aion-ignore.d.ts +3 -0
  68. package/dist/infra/aion-ignore.d.ts.map +1 -0
  69. package/dist/infra/aion-ignore.js +35 -0
  70. package/dist/infra/aion-ignore.js.map +1 -0
  71. package/dist/infra/audit-cache.d.ts +40 -0
  72. package/dist/infra/audit-cache.d.ts.map +1 -0
  73. package/dist/infra/audit-cache.js +94 -0
  74. package/dist/infra/audit-cache.js.map +1 -0
  75. package/dist/infra/audit-model.d.ts +72 -0
  76. package/dist/infra/audit-model.d.ts.map +1 -0
  77. package/dist/infra/audit-model.js +146 -0
  78. package/dist/infra/audit-model.js.map +1 -0
  79. package/dist/infra/audit-report-writer.d.ts +4 -0
  80. package/dist/infra/audit-report-writer.d.ts.map +1 -0
  81. package/dist/infra/audit-report-writer.js +290 -0
  82. package/dist/infra/audit-report-writer.js.map +1 -0
  83. package/dist/infra/audit-trend.d.ts +17 -0
  84. package/dist/infra/audit-trend.d.ts.map +1 -0
  85. package/dist/infra/audit-trend.js +113 -0
  86. package/dist/infra/audit-trend.js.map +1 -0
  87. package/dist/infra/code-metrics.d.ts +11 -0
  88. package/dist/infra/code-metrics.d.ts.map +1 -1
  89. package/dist/infra/code-metrics.js +62 -0
  90. package/dist/infra/code-metrics.js.map +1 -1
  91. package/dist/infra/db/store.d.ts.map +1 -1
  92. package/dist/infra/db/store.js +14 -7
  93. package/dist/infra/db/store.js.map +1 -1
  94. package/dist/infra/embeddings.d.ts +2 -0
  95. package/dist/infra/embeddings.d.ts.map +1 -1
  96. package/dist/infra/embeddings.js +33 -15
  97. package/dist/infra/embeddings.js.map +1 -1
  98. package/dist/infra/project-report.d.ts +67 -0
  99. package/dist/infra/project-report.d.ts.map +1 -0
  100. package/dist/infra/project-report.js +159 -0
  101. package/dist/infra/project-report.js.map +1 -0
  102. package/dist/infra/repo-vectors.d.ts +31 -0
  103. package/dist/infra/repo-vectors.d.ts.map +1 -0
  104. package/dist/infra/repo-vectors.js +83 -0
  105. package/dist/infra/repo-vectors.js.map +1 -0
  106. package/dist/infra/update-check.d.ts +3 -0
  107. package/dist/infra/update-check.d.ts.map +1 -0
  108. package/dist/infra/update-check.js +84 -0
  109. package/dist/infra/update-check.js.map +1 -0
  110. package/dist/prompts/scanner.d.ts +1 -0
  111. package/dist/prompts/scanner.d.ts.map +1 -1
  112. package/dist/prompts/scanner.js +5 -1
  113. package/dist/prompts/scanner.js.map +1 -1
  114. package/dist/prompts/synthesizer.d.ts.map +1 -1
  115. package/dist/prompts/synthesizer.js +7 -23
  116. package/dist/prompts/synthesizer.js.map +1 -1
  117. package/dist/providers/cli-provider.d.ts +1 -0
  118. package/dist/providers/cli-provider.d.ts.map +1 -1
  119. package/dist/providers/cli-provider.js +22 -2
  120. package/dist/providers/cli-provider.js.map +1 -1
  121. package/package.json +24 -19
  122. package/dist/agents/planner.test.d.ts +0 -2
  123. package/dist/agents/planner.test.d.ts.map +0 -1
  124. package/dist/agents/planner.test.js +0 -21
  125. package/dist/agents/planner.test.js.map +0 -1
  126. package/dist/core/cost-tracker.test.d.ts +0 -2
  127. package/dist/core/cost-tracker.test.d.ts.map +0 -1
  128. package/dist/core/cost-tracker.test.js +0 -36
  129. package/dist/core/cost-tracker.test.js.map +0 -1
  130. package/dist/core/pipelines/audit-pipeline.test.d.ts +0 -2
  131. package/dist/core/pipelines/audit-pipeline.test.d.ts.map +0 -1
  132. package/dist/core/pipelines/audit-pipeline.test.js +0 -135
  133. package/dist/core/pipelines/audit-pipeline.test.js.map +0 -1
  134. package/dist/core/repo-context.d.ts +0 -2
  135. package/dist/core/repo-context.d.ts.map +0 -1
  136. package/dist/core/repo-context.js +0 -12
  137. package/dist/core/repo-context.js.map +0 -1
  138. package/dist/core/repo-context.test.d.ts +0 -2
  139. package/dist/core/repo-context.test.d.ts.map +0 -1
  140. package/dist/core/repo-context.test.js +0 -40
  141. package/dist/core/repo-context.test.js.map +0 -1
  142. package/dist/core/runtime-policy.test.d.ts +0 -2
  143. package/dist/core/runtime-policy.test.d.ts.map +0 -1
  144. package/dist/core/runtime-policy.test.js +0 -27
  145. package/dist/core/runtime-policy.test.js.map +0 -1
  146. package/dist/infra/bm25.test.d.ts +0 -2
  147. package/dist/infra/bm25.test.d.ts.map +0 -1
  148. package/dist/infra/bm25.test.js +0 -17
  149. package/dist/infra/bm25.test.js.map +0 -1
  150. package/dist/infra/chunker.test.d.ts +0 -2
  151. package/dist/infra/chunker.test.d.ts.map +0 -1
  152. package/dist/infra/chunker.test.js +0 -33
  153. package/dist/infra/chunker.test.js.map +0 -1
  154. package/dist/infra/db/database.d.ts +0 -4
  155. package/dist/infra/db/database.d.ts.map +0 -1
  156. package/dist/infra/db/database.js +0 -25
  157. package/dist/infra/db/database.js.map +0 -1
  158. package/dist/infra/evidence-gate.test.d.ts +0 -2
  159. package/dist/infra/evidence-gate.test.d.ts.map +0 -1
  160. package/dist/infra/evidence-gate.test.js +0 -36
  161. package/dist/infra/evidence-gate.test.js.map +0 -1
  162. package/dist/infra/repo-index.test.d.ts +0 -2
  163. package/dist/infra/repo-index.test.d.ts.map +0 -1
  164. package/dist/infra/repo-index.test.js +0 -53
  165. package/dist/infra/repo-index.test.js.map +0 -1
  166. package/dist/infra/repo-query.test.d.ts +0 -2
  167. package/dist/infra/repo-query.test.d.ts.map +0 -1
  168. package/dist/infra/repo-query.test.js +0 -34
  169. package/dist/infra/repo-query.test.js.map +0 -1
  170. package/dist/infra/semgrep.test.d.ts +0 -2
  171. package/dist/infra/semgrep.test.d.ts.map +0 -1
  172. package/dist/infra/semgrep.test.js +0 -39
  173. package/dist/infra/semgrep.test.js.map +0 -1
  174. package/dist/schemas/audit.test.d.ts +0 -2
  175. package/dist/schemas/audit.test.d.ts.map +0 -1
  176. package/dist/schemas/audit.test.js +0 -41
  177. package/dist/schemas/audit.test.js.map +0 -1
@@ -1,97 +1,35 @@
1
1
  import chalk from 'chalk';
2
- import { mkdirSync, writeFileSync } from 'fs';
3
- import { join } from 'path';
4
2
  import { Orchestrator } from '../../core/orchestrator.js';
5
3
  import { AuditPipeline } from '../../core/pipelines/audit-pipeline.js';
6
4
  import { createRuntimePolicy } from '../../core/runtime-policy.js';
7
5
  import { CostTracker } from '../../core/cost-tracker.js';
8
6
  import { Renderer } from '../ui/renderer.js';
9
- const SEVERITY_COLOR = {
10
- critical: chalk.bgRed.white.bold,
11
- high: chalk.red.bold,
12
- medium: chalk.yellow,
13
- low: chalk.gray,
14
- info: chalk.dim,
15
- };
16
- const SEVERITY_ICON = {
17
- critical: '🔴',
18
- high: '🟠',
19
- medium: '🟡',
20
- low: '⚪',
21
- info: '🔵',
22
- };
7
+ import { saveAuditReport } from '../../infra/audit-report-writer.js';
8
+ import { SEVERITY_RANK } from '../../infra/audit-model.js';
23
9
  function renderAuditReport(report, durationMs) {
24
- console.log('\n' + chalk.bold('═'.repeat(60)));
25
- console.log(chalk.bold.cyan(' AUDIT REPORT') + chalk.gray(` — ${report.totalFiles} files — ${(durationMs / 1000).toFixed(1)}s`));
26
- console.log(chalk.bold('═'.repeat(60)));
27
- // Summary
28
- console.log('\n' + chalk.bold('Summary:'));
29
- console.log(' ' + report.summary);
30
- // Counts
10
+ const bySeverity = report.findings.reduce((acc, f) => { acc[f.severity] = (acc[f.severity] ?? 0) + 1; return acc; }, {});
31
11
  const counts = [
32
12
  report.criticalCount > 0 ? chalk.bgRed.white.bold(` ${report.criticalCount} critical `) : null,
33
13
  report.highCount > 0 ? chalk.red.bold(`${report.highCount} high`) : null,
34
- chalk.gray(`${report.findings.filter(f => f.severity === 'medium').length} medium`),
35
- chalk.gray(`${report.findings.filter(f => f.severity === 'low').length} low`),
14
+ (bySeverity['medium'] ?? 0) > 0 ? chalk.yellow(`${bySeverity['medium']} medium`) : null,
15
+ (bySeverity['low'] ?? 0) > 0 ? chalk.gray(`${bySeverity['low']} low`) : null,
36
16
  ].filter(Boolean);
37
- console.log('\n' + chalk.bold('Severity:') + ' ' + counts.join(' '));
38
- // Top priorities
17
+ console.log('\n' + chalk.bold.cyan('Audit complete') + chalk.gray(` ${report.totalFiles} files, ${(durationMs / 1000).toFixed(1)}s`));
18
+ console.log(chalk.bold('Findings:') + ' ' + counts.join(' ') + chalk.dim(` (${report.findings.length} total)`));
19
+ console.log(' ' + chalk.dim(report.summary));
39
20
  if (report.topPriorities.length > 0) {
40
- console.log('\n' + chalk.bold('Top Priorities:'));
41
- report.topPriorities.forEach((p, i) => {
42
- console.log(chalk.cyan(` ${i + 1}.`) + ' ' + p);
43
- });
21
+ console.log(chalk.bold('\nTop Priorities:'));
22
+ report.topPriorities.slice(0, 3).forEach((p, i) => console.log(chalk.cyan(` ${i + 1}.`) + ' ' + p));
23
+ if (report.topPriorities.length > 3)
24
+ console.log(chalk.dim(` ... ${report.topPriorities.length - 3} more in HTML`));
44
25
  }
45
- // Findings: if sections exist, render by domain; otherwise by severity
46
- const auditReport = report;
47
- if (auditReport.sections && auditReport.sections.length > 0) {
48
- for (const section of auditReport.sections) {
49
- if (section.findings.length === 0)
50
- continue;
51
- console.log('\n' + chalk.bold.blue(` ▸ ${section.domain.toUpperCase()} (${section.findings.length})`));
52
- for (const f of section.findings) {
53
- const loc = f.line ? `${f.file}:${f.line}` : f.file;
54
- const color = SEVERITY_COLOR[f.severity] ?? chalk.white;
55
- console.log(color(` ${loc}`) + chalk.gray(` [${f.severity}]`));
56
- console.log(` ${f.finding}`);
57
- console.log(chalk.dim(` → ${f.recommendation}`));
58
- console.log();
59
- }
60
- }
61
- }
62
- else {
63
- const order = ['critical', 'high', 'medium', 'low', 'info'];
64
- for (const sev of order) {
65
- const group = report.findings.filter(f => f.severity === sev);
66
- if (group.length === 0)
67
- continue;
68
- const color = SEVERITY_COLOR[sev] ?? chalk.white;
69
- const icon = SEVERITY_ICON[sev] ?? '';
70
- console.log('\n' + color(` ${icon} ${sev.toUpperCase()} (${group.length}) `));
71
- for (const f of group) {
72
- const loc = f.line ? `${f.file}:${f.line}` : f.file;
73
- console.log(chalk.bold(` ${loc}`) + chalk.gray(` [${f.category}]`));
74
- console.log(` ${f.finding}`);
75
- console.log(chalk.dim(` → ${f.recommendation}`));
76
- console.log();
77
- }
78
- }
79
- }
80
- console.log(chalk.bold('═'.repeat(60)));
81
- }
82
- function saveAuditReport(report, durationMs) {
83
- const dir = join(process.cwd(), '.ai-runtime', 'reports');
84
- mkdirSync(dir, { recursive: true });
85
- const stamp = new Date().toISOString().replace(/[:.]/g, '-');
86
- const file = join(dir, `audit-${stamp}.json`);
87
- writeFileSync(file, JSON.stringify({ ...report, durationMs, createdAt: new Date().toISOString() }, null, 2), 'utf8');
88
- return file;
89
26
  }
90
- function renderDryRun(stats) {
27
+ function renderDryRun(pipeline, stats, maxFilesForAi) {
91
28
  console.log('\n' + chalk.bold.cyan('Audit dry run'));
92
29
  console.log(chalk.gray('No agents were started and no API tokens were used.'));
93
30
  console.log(` total files seen: ${stats.totalFiles}`);
94
31
  console.log(` audit source files: ${stats.auditFiles.length}`);
32
+ console.log(` AI target files: ${Math.min(stats.auditFiles.length, maxFilesForAi)} prioritized file(s)`);
95
33
  console.log(` ignored directories: ${stats.ignoredDirs}`);
96
34
  console.log(` ignored/non-source files: ${stats.ignoredFiles}`);
97
35
  console.log(` oversized source files: ${stats.oversizedFiles}`);
@@ -101,83 +39,139 @@ function renderDryRun(stats) {
101
39
  exts.forEach(([ext, count]) => console.log(` ${ext}: ${count}`));
102
40
  }
103
41
  if (stats.auditFiles.length > 0) {
104
- console.log('\n' + chalk.bold('Sample:'));
105
- stats.auditFiles.slice(0, 10).forEach((file) => console.log(` ${file}`));
42
+ console.log('\n' + chalk.bold('AI target sample:'));
43
+ pipeline.prioritizeFiles(stats.auditFiles, maxFilesForAi).slice(0, 15).forEach((file) => console.log(` ${file}`));
44
+ }
45
+ }
46
+ function parseBudget(value) {
47
+ return (['low', 'normal', 'deep'].includes(value) ? value : 'low');
48
+ }
49
+ function parsePositiveInt(value, fallback, max) {
50
+ if (!value)
51
+ return fallback;
52
+ return Math.max(1, Math.min(max, parseInt(String(value), 10) || fallback));
53
+ }
54
+ async function printPersonas() {
55
+ const { listPresets } = await import('../../infra/persona-presets.js');
56
+ console.log(chalk.bold.cyan('\nPersonas (scanner domains):\n'));
57
+ [
58
+ 'security', 'bugs', 'redundancy', 'error-handling', 'architecture', 'testing',
59
+ 'performance', 'infrastructure', 'observability', 'resilience', 'data',
60
+ 'dependencies', 'compliance', 'multitenancy', 'prompt-audit',
61
+ ].forEach((d) => console.log(` ${chalk.cyan(d)}`));
62
+ listPresets();
63
+ }
64
+ async function maybeAutoFix(options, report, orch) {
65
+ if (!options.fix)
66
+ return;
67
+ const maxFixes = parsePositiveInt(options.fixMax, 5, 20);
68
+ const minSev = (['critical', 'high', 'medium'].includes(options.fixMinSeverity)
69
+ ? options.fixMinSeverity : 'high');
70
+ const eligible = report.findings
71
+ .filter((f) => f.file && f.line && ((SEVERITY_RANK[f.severity] ?? 0) >= (SEVERITY_RANK[minSev] ?? 0)))
72
+ .sort((a, b) => (SEVERITY_RANK[b.severity] ?? 0) - (SEVERITY_RANK[a.severity] ?? 0))
73
+ .slice(0, maxFixes);
74
+ if (options.dryRun) {
75
+ console.log('\n' + chalk.bold.yellow(`Fix dry-run: ${eligible.length} finding(s) would be targeted.`));
76
+ eligible.forEach((f, i) => console.log(` ${i + 1}. ${f.severity} ${f.file}:${f.line} ${f.finding}`));
77
+ }
78
+ else if (report.criticalCount > 0 || report.highCount > 0 || minSev === 'medium') {
79
+ console.log(chalk.bold.yellow(`\nAuto-fixing up to ${maxFixes} ${minSev}+ findings...\n`));
80
+ const fixReport = await orch.runAuditFixPipeline(report, { maxFixes, minSeverity: minSev });
81
+ console.log(chalk.bold(`Fix summary: ${fixReport.succeeded} fixed, ${fixReport.failed} failed, ${fixReport.skipped} skipped`));
106
82
  }
107
83
  }
108
84
  export function registerAudit(program) {
109
85
  program
110
86
  .command('audit [target]')
111
- .description('Deep parallel audit: N scanners cover all files, synthesizer unifies findings')
87
+ .description('Deep audit with local scan, capped AI file scope, and compact reports')
112
88
  .option('-n, --scanners <n>', 'number of scanner agents (auto-selected if omitted)')
113
89
  .option('--budget <budget>', 'low | normal | deep (default: low)', 'low')
114
90
  .option('--provider <provider>', 'claude | openrouter (default: claude)')
115
- .option('--model <model>', 'model override for openrouter (e.g. moonshotai/kimi-k2)')
91
+ .option('--model <model>', 'model override for openrouter')
116
92
  .option('--preset <name>', 'persona preset: security, ai, backend, devops, quality, saas, fintech, full')
117
- .option('--domains <list>', 'comma-separated scanner domains, e.g. security,compliance,data')
93
+ .option('--domains <list>', 'comma-separated scanner domains')
118
94
  .option('--list-personas', 'show all available personas and presets then exit')
95
+ .option('--local-only', 'run only deterministic local scans; no AI scanners or synthesizer')
96
+ .option('--force-full', 'allow the full preset to start all requested AI scanner domains')
97
+ .option('--max-files <n>', 'max prioritized source files sent to AI scanners')
98
+ .option('--scanner-timeout <seconds>', 'timeout per AI scanner in seconds')
99
+ .option('--ai-context-budget <tokens>', 'max approximate tokens for ai-context.md', '8000')
119
100
  .option('--fix', 'auto-fix critical/high findings after audit')
120
101
  .option('--fix-max <n>', 'max findings to auto-fix (default: 5)', '5')
121
102
  .option('--fix-min-severity <s>', 'minimum severity to fix: critical|high|medium (default: high)', 'high')
122
103
  .option('--dry-run', 'collect audit file stats without starting agents')
104
+ .option('--incremental', 'only scan files changed since last audit')
123
105
  .action(async (target = '.', options) => {
124
- if (options.listPersonas) {
125
- const { listPresets, BUILT_IN_PRESETS } = await import('../../infra/persona-presets.js');
126
- console.log(chalk.bold.cyan('\nPersonas (scanner domains):\n'));
127
- const allDomains = [
128
- 'security', 'bugs', 'redundancy', 'error-handling', 'architecture', 'testing', 'performance',
129
- 'infrastructure', 'observability', 'resilience', 'data', 'dependencies', 'compliance', 'multitenancy', 'prompt-audit',
130
- ];
131
- allDomains.forEach((d) => console.log(` ${chalk.cyan(d)}`));
132
- listPresets();
133
- return;
134
- }
135
- const explicitN = options.scanners ? Math.max(1, Math.min(15, parseInt(options.scanners, 10) || 5)) : undefined;
136
- const budget = (['low', 'normal', 'deep'].includes(options.budget) ? options.budget : 'low');
137
- const providerName = options.provider === 'openrouter' ? 'openrouter' : undefined;
106
+ if (options.listPersonas)
107
+ return printPersonas();
108
+ const { loadAionConfig, mergeConfig } = await import('../../infra/aion-config.js');
109
+ const mergedOptions = mergeConfig(options, loadAionConfig(process.cwd()));
110
+ const explicitN = mergedOptions.scanners ? Math.max(1, Math.min(15, parseInt(String(mergedOptions.scanners), 10) || 5)) : undefined;
111
+ const budget = parseBudget(mergedOptions.budget);
112
+ const scannerTimeoutSeconds = mergedOptions.scannerTimeout
113
+ ? Math.max(10, Math.min(600, parseInt(String(mergedOptions.scannerTimeout), 10) || 90))
114
+ : budget === 'deep' ? 240 : budget === 'normal' ? 150 : 90;
115
+ const maxFilesForAi = parsePositiveInt(mergedOptions.maxFiles, budget === 'deep' ? 120 : budget === 'normal' ? 60 : 30, 500);
138
116
  const policyInput = {
139
117
  budget,
140
- ...(options.model ? { openrouterModel: options.model } : {}),
141
- ...(providerName ? {
142
- plannerProvider: providerName,
143
- investigatorProvider: providerName,
144
- developerProvider: providerName,
145
- reviewerProvider: providerName,
146
- } : {}),
118
+ ...(mergedOptions.model ? { openrouterModel: mergedOptions.model } : {}),
119
+ ...(mergedOptions.provider === 'openrouter' ? { plannerProvider: 'openrouter', investigatorProvider: 'openrouter', developerProvider: 'openrouter', reviewerProvider: 'openrouter' } : {}),
147
120
  };
148
121
  const policy = createRuntimePolicy(policyInput);
149
- const renderer = new Renderer();
150
- const orch = new Orchestrator(process.cwd(), policyInput);
151
122
  if (options.dryRun) {
152
123
  const pipeline = new AuditPipeline(process.cwd(), policy, new CostTracker(), () => { }, () => { });
153
- renderDryRun(pipeline.collectAuditStats(target));
124
+ renderDryRun(pipeline, pipeline.collectAuditStats(target), maxFilesForAi);
154
125
  return;
155
126
  }
127
+ const renderer = new Renderer();
128
+ const orch = new Orchestrator(process.cwd(), policyInput);
156
129
  orch.on('agent:start', ({ agentName }) => renderer.agentStart(agentName));
157
130
  orch.on('agent:output', ({ agentName, text }) => renderer.agentChunk(agentName, text));
158
131
  orch.on('agent:done', ({ agentName, durationMs }) => renderer.agentDone(agentName, durationMs));
159
- // Resolve persona domains
160
132
  const { resolveDomainsFromConfig } = await import('../../infra/persona-presets.js');
161
- const { domains: explicitDomains, source: domainSource } = resolveDomainsFromConfig(process.cwd(), options.preset, options.domains, explicitN);
133
+ const { domains: explicitDomains, source: domainSource } = resolveDomainsFromConfig(process.cwd(), mergedOptions.preset, mergedOptions.domains, explicitN);
134
+ const maxAiScanners = explicitN ?? policy.maxAgents;
135
+ const requestsFullPreset = (mergedOptions.preset === 'full' && explicitN === undefined) || explicitDomains.length > maxAiScanners;
136
+ if (requestsFullPreset && !mergedOptions.forceFull && !mergedOptions.localOnly) {
137
+ console.error(chalk.red.bold('\nRefusing expensive full audit by default.\n'));
138
+ console.error(chalk.gray(`Requested ${explicitDomains.length} domains, but ${budget} budget allows ${maxAiScanners} AI scanner(s).`));
139
+ console.error(` ${chalk.cyan('aion audit . --local-only')} no AI tokens`);
140
+ console.error(` ${chalk.cyan(`aion audit . --preset ${mergedOptions.preset ?? 'security'} --scanners ${maxAiScanners}`)} capped AI audit`);
141
+ console.error(` ${chalk.cyan('aion audit . --preset full --force-full')} explicit full-cost run`);
142
+ process.exitCode = 1;
143
+ return;
144
+ }
145
+ const label = mergedOptions.localOnly ? 'local-only scan (no AI tokens)'
146
+ : explicitDomains.length > 0 ? `personas: ${explicitDomains.slice(0, maxAiScanners).join(', ')} [${domainSource}]`
147
+ : explicitN ? `${explicitN} scanners` : `auto scanners (${budget} budget)`;
148
+ console.log(chalk.bold.cyan(`\nStarting audit with ${label}...\n`));
162
149
  const start = Date.now();
163
- const nLabel = explicitDomains.length > 0
164
- ? `personas: ${explicitDomains.join(', ')} [${domainSource}]`
165
- : explicitN ? `${explicitN} scanners` : `auto scanners (${budget} budget)`;
166
- console.log(chalk.bold.cyan(`\nStarting audit with ${nLabel}...\n`));
167
150
  try {
168
- const report = await orch.runAuditPipeline(target, explicitN, explicitDomains.length > 0 ? explicitDomains : undefined);
151
+ const report = await orch.runAuditPipeline(target, explicitN, explicitDomains.length > 0 ? explicitDomains : undefined, {
152
+ incremental: options.incremental,
153
+ localOnly: mergedOptions.localOnly,
154
+ maxAiScanners: mergedOptions.forceFull ? explicitDomains.length || explicitN : maxAiScanners,
155
+ maxFilesForAi,
156
+ scannerTimeoutMs: scannerTimeoutSeconds * 1000,
157
+ });
169
158
  const durationMs = Date.now() - start;
170
159
  renderAuditReport(report, durationMs);
171
- console.log(chalk.gray(`report: ${saveAuditReport(report, durationMs)}`));
160
+ const costSummary = {
161
+ totalUsd: orch.costs.totalUsd(),
162
+ model: policy.claudeModel,
163
+ perAgent: orch.costs.byAgent().map((e) => ({
164
+ name: e.agentName,
165
+ costUsd: e.costUsd,
166
+ inputTokens: e.usage.inputTokens,
167
+ outputTokens: e.usage.outputTokens,
168
+ })),
169
+ };
170
+ const saved = saveAuditReport(process.cwd(), report, durationMs, parsePositiveInt(mergedOptions.aiContextBudget, 8000, 100000), costSummary);
171
+ console.log(chalk.gray(`\nhtml: ${saved.html}`));
172
+ console.log(chalk.gray(`dashboard: ${saved.dashboard}`));
172
173
  console.log(chalk.dim(orch.costs.summary()));
173
- if (options.fix && (report.criticalCount > 0 || report.highCount > 0)) {
174
- const maxFixes = Math.max(1, Math.min(20, parseInt(options.fixMax, 10) || 5));
175
- const minSev = (['critical', 'high', 'medium'].includes(options.fixMinSeverity)
176
- ? options.fixMinSeverity : 'high');
177
- console.log(chalk.bold.yellow(`\nAuto-fixing up to ${maxFixes} ${minSev}+ findings...\n`));
178
- const fixReport = await orch.runAuditFixPipeline(report, { maxFixes, minSeverity: minSev });
179
- console.log(chalk.bold(`Fix summary: ${fixReport.succeeded} fixed, ${fixReport.failed} failed, ${fixReport.skipped} skipped`));
180
- }
174
+ await maybeAutoFix(options, report, orch);
181
175
  process.exit(report.criticalCount > 0 ? 2 : report.highCount > 0 ? 1 : 0);
182
176
  }
183
177
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,MAAM,cAAc,GAA0C;IAC5D,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;IAChC,IAAI,EAAM,KAAK,CAAC,GAAG,CAAC,IAAI;IACxB,MAAM,EAAI,KAAK,CAAC,MAAM;IACtB,GAAG,EAAO,KAAK,CAAC,IAAI;IACpB,IAAI,EAAM,KAAK,CAAC,GAAG;CACpB,CAAC;AAEF,MAAM,aAAa,GAA2B;IAC5C,QAAQ,EAAE,IAAI;IACd,IAAI,EAAM,IAAI;IACd,MAAM,EAAI,IAAI;IACd,GAAG,EAAO,GAAG;IACb,IAAI,EAAM,IAAI;CACf,CAAC;AAEF,SAAS,iBAAiB,CAAC,MAO1B,EAAE,UAAkB;IACnB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,UAAU,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAExC,UAAU;IACV,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnC,SAAS;IACT,MAAM,MAAM,GAAG;QACb,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,aAAa,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;QAC9F,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;QACxE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,SAAS,CAAC;QACnF,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC;KAC9E,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvE,iBAAiB;IACjB,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,MAAM,WAAW,GAAG,MAAsD,CAAC;IAC3E,IAAI,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC5C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxG,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpD,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5D,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;YAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACjC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;YACjD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YAC9E,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,eAAe,CAAC,MAOxB,EAAE,UAAkB;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAC1D,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACrH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,KAAqD;IACzE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;IAEjE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1C,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,+EAA+E,CAAC;SAC5F,MAAM,CAAC,oBAAoB,EAAE,qDAAqD,CAAC;SACnF,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,EAAE,KAAK,CAAC;SACxE,MAAM,CAAC,uBAAuB,EAAE,uCAAuC,CAAC;SACxE,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;SACpF,MAAM,CAAC,iBAAiB,EAAE,6EAA6E,CAAC;SACxG,MAAM,CAAC,kBAAkB,EAAE,gEAAgE,CAAC;SAC5F,MAAM,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;SAC9E,MAAM,CAAC,OAAO,EAAE,6CAA6C,CAAC;SAC9D,MAAM,CAAC,eAAe,EAAE,uCAAuC,EAAE,GAAG,CAAC;SACrE,MAAM,CAAC,wBAAwB,EAAE,+DAA+D,EAAE,MAAM,CAAC;SACzG,MAAM,CAAC,WAAW,EAAE,kDAAkD,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,SAAiB,GAAG,EAAE,OAAqN,EAAE,EAAE;QAC5P,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;YACzF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAChE,MAAM,UAAU,GAAG;gBACjB,UAAU,EAAC,MAAM,EAAC,YAAY,EAAC,gBAAgB,EAAC,cAAc,EAAC,SAAS,EAAC,aAAa;gBACtF,gBAAgB,EAAC,eAAe,EAAC,YAAY,EAAC,MAAM,EAAC,cAAc,EAAC,YAAY,EAAC,cAAc,EAAC,cAAc;aAC/G,CAAC;YACF,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,WAAW,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChH,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAA8B,CAAC;QAC1H,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,YAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,MAAM,WAAW,GAAG;YAClB,MAAM;YACN,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;gBACjB,eAAe,EAAE,YAAY;gBAC7B,oBAAoB,EAAE,YAAY;gBAClC,iBAAiB,EAAE,YAAY;gBAC/B,gBAAgB,EAAE,YAAY;aAC/B,CAAC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;QAE1D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,WAAW,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACjG,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QAEhG,0BAA0B;QAC1B,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QACpF,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,wBAAwB,CACjF,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAC1D,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,aAAa,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,YAAY,GAAG;YAC7D,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,WAAW,CAAC,CAAC,CAAC,kBAAkB,MAAM,UAAU,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,MAAM,OAAO,CAAC,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACxH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACtC,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAE7C,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;gBACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9E,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC;oBAC7E,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAmC,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,QAAQ,IAAI,MAAM,iBAAiB,CAAC,CAAC,CAAC;gBAC3F,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,SAAS,CAAC,SAAS,WAAW,SAAS,CAAC,MAAM,YAAY,SAAS,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC;YACjI,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerChat(program: Command): void;
3
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsDzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6FnD"}
@@ -0,0 +1,129 @@
1
+ import chalk from 'chalk';
2
+ import * as readline from 'readline';
3
+ import { GraphAgent } from '../../agents/graph-agent.js';
4
+ import { createRuntimePolicy } from '../../core/runtime-policy.js';
5
+ import { CostTracker } from '../../core/cost-tracker.js';
6
+ import { safeProcessEnv } from '../../providers/cli-provider.js';
7
+ const SYSTEM_PROMPT = `You are an expert code assistant with deep knowledge of this repository.
8
+ Answer questions concisely based on the provided repository context.
9
+ When citing code locations use file:line format.
10
+ Never invent file paths or function names not shown in context.
11
+ If unsure, say so rather than guessing.`;
12
+ async function askAI(cwd, question, context, provider, policy, onChunk) {
13
+ const systemPrompt = `${SYSTEM_PROMPT}\n\n--- REPOSITORY CONTEXT ---\n${context}\n--- END CONTEXT ---`;
14
+ const input = { agentName: 'chat', cwd, systemPrompt, userMessage: question, policy };
15
+ if (provider === 'openrouter') {
16
+ const { OpenRouterProvider } = await import('../../providers/openrouter-provider.js');
17
+ await new OpenRouterProvider(policy.openrouterModel).run(input, (_, text) => onChunk(text));
18
+ return;
19
+ }
20
+ // SDK provider (ANTHROPIC_API_KEY)
21
+ if (process.env['ANTHROPIC_API_KEY']) {
22
+ const { SdkProvider } = await import('../../providers/sdk-provider.js');
23
+ await new SdkProvider().run(input, (_, text) => onChunk(text));
24
+ return;
25
+ }
26
+ // Fallback: claude CLI
27
+ const { spawn } = await import('child_process');
28
+ await new Promise((resolve) => {
29
+ const proc = spawn('claude', ['-p', question, '--system-prompt', systemPrompt], {
30
+ cwd,
31
+ stdio: ['ignore', 'pipe', 'ignore'],
32
+ env: safeProcessEnv(),
33
+ });
34
+ proc.stdout.on('data', (chunk) => onChunk(chunk.toString()));
35
+ proc.on('close', () => resolve());
36
+ proc.on('error', () => resolve());
37
+ });
38
+ }
39
+ export function registerChat(program) {
40
+ program
41
+ .command('chat')
42
+ .description('Interactive Q&A about the codebase using repo index as context')
43
+ .option('--budget <budget>', 'low | normal | deep', 'normal')
44
+ .option('--provider <provider>', 'claude | openrouter')
45
+ .option('--model <model>', 'model override for openrouter')
46
+ .option('--context-limit <n>', 'max chars of repo context injected (default: 6000)', '6000')
47
+ .action(async (options) => {
48
+ const cwd = process.cwd();
49
+ const contextLimit = Math.max(1000, Math.min(20000, parseInt(options.contextLimit, 10) || 6000));
50
+ const budget = (['low', 'normal', 'deep'].includes(options.budget) ? options.budget : 'normal');
51
+ const provider = options.provider ?? (process.env['OPENROUTER_API_KEY'] ? 'openrouter' : 'claude');
52
+ const policyInput = {
53
+ budget,
54
+ ...(options.model ? { openrouterModel: options.model } : {}),
55
+ ...(provider === 'openrouter' ? {
56
+ plannerProvider: 'openrouter',
57
+ investigatorProvider: 'openrouter',
58
+ developerProvider: 'openrouter',
59
+ reviewerProvider: 'openrouter',
60
+ } : {}),
61
+ };
62
+ const policy = createRuntimePolicy(policyInput);
63
+ const costs = new CostTracker();
64
+ void costs;
65
+ console.log(chalk.dim('\nBuilding repository index…'));
66
+ const graph = new GraphAgent(cwd);
67
+ let repoContext = '';
68
+ try {
69
+ repoContext = await graph.queryWithContext('architecture structure files modules', 20, contextLimit);
70
+ }
71
+ catch {
72
+ repoContext = '(No repo index available)';
73
+ }
74
+ const projectName = cwd.split('/').pop() ?? cwd;
75
+ console.log(chalk.bold.cyan(`\n 💬 Aion Chat — ${projectName}`));
76
+ console.log(chalk.dim(` Provider: ${provider} Budget: ${budget} Context: ${repoContext.length} chars`));
77
+ console.log(chalk.dim(' Type "exit" or Ctrl+C to quit.'));
78
+ console.log(chalk.dim(' Special: "context" to show injected context, "/context <query>" to refresh it.\n'));
79
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
80
+ rl.on('close', () => console.log(chalk.dim('\nBye!\n')));
81
+ const ask = () => {
82
+ rl.question(chalk.cyan(' You: '), async (raw) => {
83
+ const question = raw.trim();
84
+ if (!question || question === 'exit' || question === 'quit') {
85
+ rl.close();
86
+ return;
87
+ }
88
+ if (question === 'context') {
89
+ console.log(chalk.dim('\n--- Injected context (first 800 chars) ---'));
90
+ console.log(repoContext.slice(0, 800) + (repoContext.length > 800 ? '\n…' : ''));
91
+ console.log(chalk.dim('---\n'));
92
+ ask();
93
+ return;
94
+ }
95
+ if (question.startsWith('/context ')) {
96
+ const newQuery = question.slice('/context '.length);
97
+ try {
98
+ repoContext = await graph.queryWithContext(newQuery, 20, contextLimit);
99
+ console.log(chalk.dim(` Context updated (${repoContext.length} chars)\n`));
100
+ }
101
+ catch {
102
+ console.log(chalk.dim(' Could not update context\n'));
103
+ }
104
+ ask();
105
+ return;
106
+ }
107
+ process.stdout.write(chalk.bold('\n AI: '));
108
+ let gotOutput = false;
109
+ try {
110
+ await askAI(cwd, question, repoContext, provider, policy, (chunk) => {
111
+ gotOutput = true;
112
+ process.stdout.write(chunk);
113
+ });
114
+ }
115
+ catch (err) {
116
+ console.error(chalk.red(`\n Error: ${err.message}`));
117
+ }
118
+ if (!gotOutput)
119
+ process.stdout.write(chalk.dim('(no response)'));
120
+ if (!repoContext.endsWith('\n'))
121
+ process.stdout.write('\n');
122
+ console.log();
123
+ ask();
124
+ });
125
+ };
126
+ ask();
127
+ });
128
+ }
129
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerContext(program: Command): void;
3
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoDzC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoBtD"}
@@ -0,0 +1,72 @@
1
+ import chalk from 'chalk';
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
3
+ import { dirname, join } from 'path';
4
+ import { GraphAgent } from '../../agents/graph-agent.js';
5
+ import { renderAiContext } from '../../infra/audit-model.js';
6
+ import { queryRepoIndex } from '../../infra/repo-query.js';
7
+ function latestAudit(cwd) {
8
+ try {
9
+ const pointerPath = join(cwd, '.ai-runtime', 'reports', 'latest-audit.json');
10
+ if (!existsSync(pointerPath))
11
+ return null;
12
+ const pointer = JSON.parse(readFileSync(pointerPath, 'utf8'));
13
+ const reportPath = pointer.runDir ? join(pointer.runDir, 'report.json') : pointer.report;
14
+ if (!reportPath || !existsSync(reportPath))
15
+ return null;
16
+ return JSON.parse(readFileSync(reportPath, 'utf8'));
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function trimBudget(text, tokens) {
23
+ const maxChars = Math.max(2000, tokens * 4);
24
+ return text.length > maxChars ? `${text.slice(0, maxChars)}\n\n[truncated to ~${tokens} tokens]` : text;
25
+ }
26
+ async function buildTopicContext(cwd, topic, tokens) {
27
+ const graph = new GraphAgent(cwd);
28
+ const index = await graph.ensureIndex();
29
+ const result = queryRepoIndex(index, topic, 12);
30
+ const lines = [
31
+ '# Aion Project Context',
32
+ '',
33
+ `Topic: ${topic}`,
34
+ `Repository: ${index.stats.files} files, ${index.stats.symbols} symbols, ${index.stats.chunks} chunks`,
35
+ '',
36
+ '## Relevant Files',
37
+ ...(result.files.length ? result.files.map((f) => `- ${f.path} (${f.loc} loc${f.isTest ? ', test' : ''})`) : ['No direct file matches.']),
38
+ '',
39
+ '## Relevant Symbols',
40
+ ...(result.symbols.length ? result.symbols.map((s) => `- ${s.name} ${s.kind} ${s.file}:${s.line}`) : ['No direct symbol matches.']),
41
+ '',
42
+ '## Dependency Edges Near Matches',
43
+ ...(result.imports.length ? result.imports.map((i) => `- ${i.from} -> ${i.resolved ?? i.specifier}`) : ['No nearby imports.']),
44
+ '',
45
+ '## Probable Tests',
46
+ ...(result.tests.length ? result.tests.map((t) => `- ${t.source} <= ${t.tests.join(', ')}`) : ['No probable tests found.']),
47
+ '',
48
+ ];
49
+ return trimBudget(lines.join('\n'), tokens);
50
+ }
51
+ export function registerContext(program) {
52
+ program
53
+ .command('context [topic...]')
54
+ .description('Generate compact AI-safe context instead of sending raw reports or all files')
55
+ .option('--budget <tokens>', 'approximate max output tokens', '8000')
56
+ .option('--audit', 'use the latest audit as source')
57
+ .option('--out <file>', 'output file path')
58
+ .action(async (topicWords, options) => {
59
+ const cwd = process.cwd();
60
+ const budget = Math.max(1000, Math.min(100000, parseInt(options.budget, 10) || 8000));
61
+ const topic = topicWords.join(' ').trim() || 'project architecture audit hotspots';
62
+ const audit = options.audit || topicWords.length === 0 ? latestAudit(cwd) : null;
63
+ const text = audit ? renderAiContext(audit, budget) : await buildTopicContext(cwd, topic, budget);
64
+ const out = options.out ?? join(cwd, '.ai-runtime', 'context', `${topic.replace(/[^a-z0-9]+/gi, '-').replace(/^-|-$/g, '').toLowerCase() || 'project'}-context.md`);
65
+ mkdirSync(dirname(out), { recursive: true });
66
+ writeFileSync(out, text, 'utf8');
67
+ console.log(chalk.bold.cyan('\nContext generated'));
68
+ console.log(chalk.gray(`file: ${out}`));
69
+ console.log(chalk.gray(`size: ~${Math.round(text.length / 4)} tokens`));
70
+ });
71
+ }
72
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerDiff(program: Command): void;
3
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+DzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4GnD"}