@aionlabsai/aion 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +224 -9
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +461 -20
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/chat.d.ts +3 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +128 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +3 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +144 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/health.d.ts.map +1 -1
- package/dist/cli/commands/health.js +17 -0
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +52 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +8 -0
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/menu.d.ts.map +1 -1
- package/dist/cli/menu.js +43 -1
- package/dist/cli/menu.js.map +1 -1
- package/dist/core/orchestrator.d.ts +2 -1
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +2 -2
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/pipelines/audit-pipeline.d.ts +9 -1
- package/dist/core/pipelines/audit-pipeline.d.ts.map +1 -1
- package/dist/core/pipelines/audit-pipeline.js +98 -9
- package/dist/core/pipelines/audit-pipeline.js.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/infra/aion-config.d.ts +26 -0
- package/dist/infra/aion-config.d.ts.map +1 -0
- package/dist/infra/aion-config.js +60 -0
- package/dist/infra/aion-config.js.map +1 -0
- package/dist/infra/aion-ignore.d.ts +3 -0
- package/dist/infra/aion-ignore.d.ts.map +1 -0
- package/dist/infra/aion-ignore.js +35 -0
- package/dist/infra/aion-ignore.js.map +1 -0
- package/dist/infra/audit-cache.d.ts +39 -0
- package/dist/infra/audit-cache.d.ts.map +1 -0
- package/dist/infra/audit-cache.js +82 -0
- package/dist/infra/audit-cache.js.map +1 -0
- package/dist/infra/audit-trend.d.ts +17 -0
- package/dist/infra/audit-trend.d.ts.map +1 -0
- package/dist/infra/audit-trend.js +113 -0
- package/dist/infra/audit-trend.js.map +1 -0
- package/dist/infra/db/store.d.ts.map +1 -1
- package/dist/infra/db/store.js +14 -7
- package/dist/infra/db/store.js.map +1 -1
- package/dist/infra/embeddings.d.ts.map +1 -1
- package/dist/infra/embeddings.js +32 -14
- package/dist/infra/embeddings.js.map +1 -1
- package/dist/prompts/scanner.d.ts +1 -0
- package/dist/prompts/scanner.d.ts.map +1 -1
- package/dist/prompts/scanner.js +4 -0
- package/dist/prompts/scanner.js.map +1 -1
- package/package.json +24 -19
- package/dist/agents/planner.test.d.ts +0 -2
- package/dist/agents/planner.test.d.ts.map +0 -1
- package/dist/agents/planner.test.js +0 -21
- package/dist/agents/planner.test.js.map +0 -1
- package/dist/core/cost-tracker.test.d.ts +0 -2
- package/dist/core/cost-tracker.test.d.ts.map +0 -1
- package/dist/core/cost-tracker.test.js +0 -36
- package/dist/core/cost-tracker.test.js.map +0 -1
- package/dist/core/pipelines/audit-pipeline.test.d.ts +0 -2
- package/dist/core/pipelines/audit-pipeline.test.d.ts.map +0 -1
- package/dist/core/pipelines/audit-pipeline.test.js +0 -135
- package/dist/core/pipelines/audit-pipeline.test.js.map +0 -1
- package/dist/core/repo-context.d.ts +0 -2
- package/dist/core/repo-context.d.ts.map +0 -1
- package/dist/core/repo-context.js +0 -12
- package/dist/core/repo-context.js.map +0 -1
- package/dist/core/repo-context.test.d.ts +0 -2
- package/dist/core/repo-context.test.d.ts.map +0 -1
- package/dist/core/repo-context.test.js +0 -40
- package/dist/core/repo-context.test.js.map +0 -1
- package/dist/core/runtime-policy.test.d.ts +0 -2
- package/dist/core/runtime-policy.test.d.ts.map +0 -1
- package/dist/core/runtime-policy.test.js +0 -27
- package/dist/core/runtime-policy.test.js.map +0 -1
- package/dist/infra/bm25.test.d.ts +0 -2
- package/dist/infra/bm25.test.d.ts.map +0 -1
- package/dist/infra/bm25.test.js +0 -17
- package/dist/infra/bm25.test.js.map +0 -1
- package/dist/infra/chunker.test.d.ts +0 -2
- package/dist/infra/chunker.test.d.ts.map +0 -1
- package/dist/infra/chunker.test.js +0 -33
- package/dist/infra/chunker.test.js.map +0 -1
- package/dist/infra/db/database.d.ts +0 -4
- package/dist/infra/db/database.d.ts.map +0 -1
- package/dist/infra/db/database.js +0 -25
- package/dist/infra/db/database.js.map +0 -1
- package/dist/infra/evidence-gate.test.d.ts +0 -2
- package/dist/infra/evidence-gate.test.d.ts.map +0 -1
- package/dist/infra/evidence-gate.test.js +0 -36
- package/dist/infra/evidence-gate.test.js.map +0 -1
- package/dist/infra/repo-index.test.d.ts +0 -2
- package/dist/infra/repo-index.test.d.ts.map +0 -1
- package/dist/infra/repo-index.test.js +0 -53
- package/dist/infra/repo-index.test.js.map +0 -1
- package/dist/infra/repo-query.test.d.ts +0 -2
- package/dist/infra/repo-query.test.d.ts.map +0 -1
- package/dist/infra/repo-query.test.js +0 -34
- package/dist/infra/repo-query.test.js.map +0 -1
- package/dist/infra/semgrep.test.d.ts +0 -2
- package/dist/infra/semgrep.test.d.ts.map +0 -1
- package/dist/infra/semgrep.test.js +0 -39
- package/dist/infra/semgrep.test.js.map +0 -1
- package/dist/schemas/audit.test.d.ts +0 -2
- package/dist/schemas/audit.test.d.ts.map +0 -1
- package/dist/schemas/audit.test.js +0 -41
- package/dist/schemas/audit.test.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -16,13 +16,16 @@ import { registerPatterns } from './cli/commands/patterns.js';
|
|
|
16
16
|
import { registerHealth } from './cli/commands/health.js';
|
|
17
17
|
import { registerReport } from './cli/commands/report.js';
|
|
18
18
|
import { registerExplain } from './cli/commands/explain.js';
|
|
19
|
+
import { registerInit } from './cli/commands/init.js';
|
|
20
|
+
import { registerDiff } from './cli/commands/diff.js';
|
|
21
|
+
import { registerChat } from './cli/commands/chat.js';
|
|
19
22
|
import { runNaturalLanguage } from './cli/interactive.js';
|
|
20
23
|
import { runMenu } from './cli/menu.js';
|
|
21
24
|
runMigrations();
|
|
22
25
|
program
|
|
23
26
|
.name('ai')
|
|
24
27
|
.description('Multi-agent AI engineering runtime')
|
|
25
|
-
.version('0.2.
|
|
28
|
+
.version('0.2.1')
|
|
26
29
|
.option('-C, --cwd <path>', 'working directory (defaults to current directory)')
|
|
27
30
|
.argument('[request...]', 'natural language request (e.g. "corrija o bug de login")')
|
|
28
31
|
.action(async (requestWords) => {
|
|
@@ -66,6 +69,9 @@ registerPatterns(program);
|
|
|
66
69
|
registerHealth(program);
|
|
67
70
|
registerReport(program);
|
|
68
71
|
registerExplain(program);
|
|
72
|
+
registerInit(program);
|
|
73
|
+
registerDiff(program);
|
|
74
|
+
registerChat(program);
|
|
69
75
|
// Explicit menu command
|
|
70
76
|
program
|
|
71
77
|
.command('menu')
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface AionConfig {
|
|
2
|
+
/** Default persona preset: security | ai | backend | devops | quality | saas | fintech | full */
|
|
3
|
+
preset?: string;
|
|
4
|
+
/** Default budget: low | normal | deep */
|
|
5
|
+
budget?: 'low' | 'normal' | 'deep';
|
|
6
|
+
/** Default AI provider: claude | openrouter */
|
|
7
|
+
provider?: string;
|
|
8
|
+
/** Default model override (for openrouter) */
|
|
9
|
+
model?: string;
|
|
10
|
+
/** Extra glob patterns to ignore during audit (merged with .aionignore) */
|
|
11
|
+
ignore?: string[];
|
|
12
|
+
/** Default domains (comma-separated), overrides preset if set */
|
|
13
|
+
domains?: string[];
|
|
14
|
+
/** Default max auto-fixes */
|
|
15
|
+
fixMax?: number;
|
|
16
|
+
/** Default minimum severity to auto-fix */
|
|
17
|
+
fixMinSeverity?: 'critical' | 'high' | 'medium';
|
|
18
|
+
/** Default scanner count override */
|
|
19
|
+
scanners?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function loadAionConfig(cwd: string): AionConfig;
|
|
22
|
+
/** Merge config defaults under CLI options (CLI wins) */
|
|
23
|
+
export declare function mergeConfig<T extends Record<string, unknown>>(cliOpts: T, config: AionConfig, defaults?: Partial<T>): T;
|
|
24
|
+
export declare function generateDefaultConfig(): AionConfig;
|
|
25
|
+
export declare function writeDefaultConfig(cwd: string): string;
|
|
26
|
+
//# sourceMappingURL=aion-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aion-config.d.ts","sourceRoot":"","sources":["../../src/infra/aion-config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,iGAAiG;IACjG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAOtD;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,UAAU,EAClB,QAAQ,GAAE,OAAO,CAAC,CAAC,CAAM,GACxB,CAAC,CAyBH;AAED,wBAAgB,qBAAqB,IAAI,UAAU,CASlD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKtD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
const CONFIG_FILE = '.aionrc.json';
|
|
4
|
+
export function loadAionConfig(cwd) {
|
|
5
|
+
const path = join(cwd, CONFIG_FILE);
|
|
6
|
+
if (!existsSync(path))
|
|
7
|
+
return {};
|
|
8
|
+
try {
|
|
9
|
+
const raw = readFileSync(path, 'utf8');
|
|
10
|
+
return JSON.parse(raw);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Merge config defaults under CLI options (CLI wins) */
|
|
17
|
+
export function mergeConfig(cliOpts, config, defaults = {}) {
|
|
18
|
+
const result = { ...defaults };
|
|
19
|
+
// Apply config fields only if CLI option is not set
|
|
20
|
+
const configMap = {
|
|
21
|
+
preset: 'preset',
|
|
22
|
+
budget: 'budget',
|
|
23
|
+
provider: 'provider',
|
|
24
|
+
model: 'model',
|
|
25
|
+
domains: 'domains',
|
|
26
|
+
fixMax: 'fixMax',
|
|
27
|
+
fixMinSeverity: 'fixMinSeverity',
|
|
28
|
+
scanners: 'scanners',
|
|
29
|
+
};
|
|
30
|
+
for (const [cliKey, configKey] of Object.entries(configMap)) {
|
|
31
|
+
const configVal = config[configKey];
|
|
32
|
+
const cliVal = cliOpts[cliKey];
|
|
33
|
+
if (configVal !== undefined && (cliVal === undefined || cliVal === null)) {
|
|
34
|
+
result[cliKey] = Array.isArray(configVal) ? configVal.join(',') : configVal;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// CLI overrides everything
|
|
38
|
+
for (const [k, v] of Object.entries(cliOpts)) {
|
|
39
|
+
if (v !== undefined && v !== null)
|
|
40
|
+
result[k] = v;
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
export function generateDefaultConfig() {
|
|
45
|
+
return {
|
|
46
|
+
preset: 'quality',
|
|
47
|
+
budget: 'low',
|
|
48
|
+
provider: 'claude',
|
|
49
|
+
ignore: ['**/fixtures/**', '**/testdata/**', '**/*.generated.*'],
|
|
50
|
+
fixMax: 5,
|
|
51
|
+
fixMinSeverity: 'high',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function writeDefaultConfig(cwd) {
|
|
55
|
+
const path = join(cwd, CONFIG_FILE);
|
|
56
|
+
const config = generateDefaultConfig();
|
|
57
|
+
writeFileSync(path, JSON.stringify(config, null, 2) + '\n', 'utf8');
|
|
58
|
+
return path;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=aion-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aion-config.js","sourceRoot":"","sources":["../../src/infra/aion-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,WAAW,GAAG,cAAc,CAAC;AAuBnC,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACxB,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,WAAW,CACzB,OAAU,EACV,MAAkB,EAClB,WAAuB,EAAE;IAEzB,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAA6B,CAAC;IAC1D,oDAAoD;IACpD,MAAM,SAAS,GAAqC;QAClD,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,SAAS;QAClB,MAAM,EAAE,QAAQ;QAChB,cAAc,EAAE,gBAAgB;QAChC,QAAQ,EAAE,UAAU;KACrB,CAAC;IACF,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;YACzE,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,SAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,2BAA2B;IAC3B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC;QAChE,MAAM,EAAE,CAAC;QACT,cAAc,EAAE,MAAM;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aion-ignore.d.ts","sourceRoot":"","sources":["../../src/infra/aion-ignore.ts"],"names":[],"mappings":"AAkBA,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAWxD;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAEvE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
const IGNORE_FILE = '.aionignore';
|
|
4
|
+
function globToRegex(pattern) {
|
|
5
|
+
// Escape regex special chars except * and ?
|
|
6
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
7
|
+
const re = escaped
|
|
8
|
+
.replace(/\*\*/g, '__GLOBSTAR__')
|
|
9
|
+
.replace(/\*/g, '[^/]*')
|
|
10
|
+
.replace(/\?/g, '[^/]')
|
|
11
|
+
.replace(/__GLOBSTAR__/g, '.*');
|
|
12
|
+
// If pattern has no slash, match anywhere in path
|
|
13
|
+
const anchored = pattern.includes('/') ? `^${re}` : `(^|/)${re}`;
|
|
14
|
+
return new RegExp(`${anchored}($|/)`);
|
|
15
|
+
}
|
|
16
|
+
export function loadIgnorePatterns(cwd) {
|
|
17
|
+
const path = join(cwd, IGNORE_FILE);
|
|
18
|
+
if (!existsSync(path))
|
|
19
|
+
return [];
|
|
20
|
+
try {
|
|
21
|
+
const content = readFileSync(path, 'utf8');
|
|
22
|
+
return content
|
|
23
|
+
.split('\n')
|
|
24
|
+
.map((l) => l.trim())
|
|
25
|
+
.filter((l) => l && !l.startsWith('#'))
|
|
26
|
+
.map(globToRegex);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function isIgnored(filePath, patterns) {
|
|
33
|
+
return patterns.some((p) => p.test(filePath));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=aion-ignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aion-ignore.js","sourceRoot":"","sources":["../../src/infra/aion-ignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,SAAS,WAAW,CAAC,OAAe;IAClC,4CAA4C;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,EAAE,GAAG,OAAO;SACf,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC;SAChC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAClC,kDAAkD;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;IACjE,OAAO,IAAI,MAAM,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,OAAO,OAAO;aACX,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACtC,GAAG,CAAC,WAAW,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,QAAkB;IAC5D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
interface CacheEntry {
|
|
2
|
+
mtime: number;
|
|
3
|
+
size: number;
|
|
4
|
+
}
|
|
5
|
+
interface AuditCache {
|
|
6
|
+
version: 2;
|
|
7
|
+
files: Record<string, CacheEntry>;
|
|
8
|
+
lastAuditAt: string;
|
|
9
|
+
lastFindings: Record<string, {
|
|
10
|
+
severity: string;
|
|
11
|
+
finding: string;
|
|
12
|
+
recommendation: string;
|
|
13
|
+
category: string;
|
|
14
|
+
persona?: string;
|
|
15
|
+
}[]>;
|
|
16
|
+
}
|
|
17
|
+
export declare function loadAuditCache(cwd: string): AuditCache | null;
|
|
18
|
+
export declare function saveAuditCache(cwd: string, files: string[], findings: Array<{
|
|
19
|
+
file: string;
|
|
20
|
+
severity: string;
|
|
21
|
+
finding: string;
|
|
22
|
+
recommendation: string;
|
|
23
|
+
category: string;
|
|
24
|
+
persona?: string;
|
|
25
|
+
}>): void;
|
|
26
|
+
export declare function filterChangedFiles(cwd: string, files: string[], cache: AuditCache | null): {
|
|
27
|
+
changed: string[];
|
|
28
|
+
unchanged: string[];
|
|
29
|
+
};
|
|
30
|
+
export declare function getCachedFindingsForFiles(cache: AuditCache | null, unchangedFiles: string[]): Array<{
|
|
31
|
+
file: string;
|
|
32
|
+
severity: string;
|
|
33
|
+
finding: string;
|
|
34
|
+
recommendation: string;
|
|
35
|
+
category: string;
|
|
36
|
+
persona?: string;
|
|
37
|
+
}>;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=audit-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-cache.d.ts","sourceRoot":"","sources":["../../src/infra/audit-cache.ts"],"names":[],"mappings":"AAKA,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;CACnI;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAS7D;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC/H,IAAI,CAyBN;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,UAAU,GAAG,IAAI,GACvB;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAoB5C;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,UAAU,GAAG,IAAI,EACxB,cAAc,EAAE,MAAM,EAAE,GACvB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYxH"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, statSync, mkdirSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
const CACHE_FILE = '.ai-runtime/audit-cache.json';
|
|
4
|
+
export function loadAuditCache(cwd) {
|
|
5
|
+
try {
|
|
6
|
+
const content = readFileSync(join(cwd, CACHE_FILE), 'utf8');
|
|
7
|
+
const parsed = JSON.parse(content);
|
|
8
|
+
if (parsed.version !== 2)
|
|
9
|
+
return null;
|
|
10
|
+
return parsed;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function saveAuditCache(cwd, files, findings) {
|
|
17
|
+
const entries = {};
|
|
18
|
+
for (const f of files) {
|
|
19
|
+
try {
|
|
20
|
+
const st = statSync(join(cwd, f));
|
|
21
|
+
entries[f] = { mtime: st.mtimeMs, size: st.size };
|
|
22
|
+
}
|
|
23
|
+
catch { /* skip */ }
|
|
24
|
+
}
|
|
25
|
+
// Group findings by file
|
|
26
|
+
const lastFindings = {};
|
|
27
|
+
for (const finding of findings) {
|
|
28
|
+
if (!lastFindings[finding.file])
|
|
29
|
+
lastFindings[finding.file] = [];
|
|
30
|
+
lastFindings[finding.file].push({
|
|
31
|
+
severity: finding.severity,
|
|
32
|
+
finding: finding.finding,
|
|
33
|
+
recommendation: finding.recommendation,
|
|
34
|
+
category: finding.category,
|
|
35
|
+
persona: finding.persona,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const cache = { version: 2, files: entries, lastAuditAt: new Date().toISOString(), lastFindings };
|
|
39
|
+
mkdirSync(join(cwd, '.ai-runtime'), { recursive: true });
|
|
40
|
+
writeFileSync(join(cwd, CACHE_FILE), JSON.stringify(cache, null, 2), 'utf8');
|
|
41
|
+
}
|
|
42
|
+
export function filterChangedFiles(cwd, files, cache) {
|
|
43
|
+
if (!cache)
|
|
44
|
+
return { changed: files, unchanged: [] };
|
|
45
|
+
const changed = [];
|
|
46
|
+
const unchanged = [];
|
|
47
|
+
for (const f of files) {
|
|
48
|
+
const cached = cache.files[f];
|
|
49
|
+
if (!cached) {
|
|
50
|
+
changed.push(f);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const st = statSync(join(cwd, f));
|
|
55
|
+
if (st.mtimeMs !== cached.mtime || st.size !== cached.size) {
|
|
56
|
+
changed.push(f);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
unchanged.push(f);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
changed.push(f);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { changed, unchanged };
|
|
67
|
+
}
|
|
68
|
+
export function getCachedFindingsForFiles(cache, unchangedFiles) {
|
|
69
|
+
if (!cache)
|
|
70
|
+
return [];
|
|
71
|
+
const results = [];
|
|
72
|
+
for (const f of unchangedFiles) {
|
|
73
|
+
const findings = cache.lastFindings[f];
|
|
74
|
+
if (findings) {
|
|
75
|
+
for (const finding of findings) {
|
|
76
|
+
results.push({ file: f, ...finding });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return results;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=audit-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-cache.js","sourceRoot":"","sources":["../../src/infra/audit-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface TrendEntry {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
gitSha?: string;
|
|
4
|
+
gitBranch?: string;
|
|
5
|
+
score: number;
|
|
6
|
+
grade: string;
|
|
7
|
+
dimensions: Record<string, number>;
|
|
8
|
+
totalFiles?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface HealthTrend {
|
|
11
|
+
version: 1;
|
|
12
|
+
entries: TrendEntry[];
|
|
13
|
+
}
|
|
14
|
+
export declare function loadTrend(cwd: string): HealthTrend;
|
|
15
|
+
export declare function appendTrend(cwd: string, entry: Omit<TrendEntry, 'gitSha' | 'gitBranch'>): void;
|
|
16
|
+
export declare function renderTrendChart(entries: TrendEntry[]): void;
|
|
17
|
+
//# sourceMappingURL=audit-trend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-trend.d.ts","sourceRoot":"","sources":["../../src/infra/audit-trend.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAQlD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,CAAC,GAAG,IAAI,CAiB9F;AAiCD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAsD5D"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { execFileSync } from 'child_process';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
const TREND_FILE = '.ai-runtime/health-trend.json';
|
|
6
|
+
const MAX_ENTRIES = 90;
|
|
7
|
+
export function loadTrend(cwd) {
|
|
8
|
+
const path = join(cwd, TREND_FILE);
|
|
9
|
+
if (!existsSync(path))
|
|
10
|
+
return { version: 1, entries: [] };
|
|
11
|
+
try {
|
|
12
|
+
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
13
|
+
if (parsed.version !== 1)
|
|
14
|
+
return { version: 1, entries: [] };
|
|
15
|
+
return parsed;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return { version: 1, entries: [] };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function appendTrend(cwd, entry) {
|
|
22
|
+
const trend = loadTrend(cwd);
|
|
23
|
+
let gitSha;
|
|
24
|
+
let gitBranch;
|
|
25
|
+
try {
|
|
26
|
+
gitSha = execFileSync('git', ['rev-parse', '--short', 'HEAD'], { cwd, stdio: ['pipe', 'pipe', 'ignore'] }).toString().trim();
|
|
27
|
+
gitBranch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, stdio: ['pipe', 'pipe', 'ignore'] }).toString().trim();
|
|
28
|
+
}
|
|
29
|
+
catch { /* not a git repo */ }
|
|
30
|
+
trend.entries.push({ ...entry, gitSha, gitBranch });
|
|
31
|
+
if (trend.entries.length > MAX_ENTRIES) {
|
|
32
|
+
trend.entries = trend.entries.slice(trend.entries.length - MAX_ENTRIES);
|
|
33
|
+
}
|
|
34
|
+
mkdirSync(join(cwd, '.ai-runtime'), { recursive: true });
|
|
35
|
+
writeFileSync(join(cwd, TREND_FILE), JSON.stringify(trend, null, 2), 'utf8');
|
|
36
|
+
}
|
|
37
|
+
function downsample(entries, width) {
|
|
38
|
+
if (entries.length <= width)
|
|
39
|
+
return entries;
|
|
40
|
+
const result = [];
|
|
41
|
+
const step = entries.length / width;
|
|
42
|
+
for (let i = 0; i < width; i++) {
|
|
43
|
+
const idx = Math.min(Math.round(i * step), entries.length - 1);
|
|
44
|
+
result.push(entries[idx]);
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
function colorScore(score, text) {
|
|
49
|
+
const label = text ?? `${score}/100`;
|
|
50
|
+
if (score >= 85)
|
|
51
|
+
return chalk.green(label);
|
|
52
|
+
if (score >= 70)
|
|
53
|
+
return chalk.yellow(label);
|
|
54
|
+
return chalk.red(label);
|
|
55
|
+
}
|
|
56
|
+
function colorDot(score) {
|
|
57
|
+
if (score >= 85)
|
|
58
|
+
return chalk.green('●');
|
|
59
|
+
if (score >= 70)
|
|
60
|
+
return chalk.yellow('●');
|
|
61
|
+
return chalk.red('●');
|
|
62
|
+
}
|
|
63
|
+
function formatDate(iso) {
|
|
64
|
+
try {
|
|
65
|
+
const d = new Date(iso);
|
|
66
|
+
return `${(d.getMonth() + 1).toString().padStart(2, '0')}-${d.getDate().toString().padStart(2, '0')}`;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return iso.slice(5, 10);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function renderTrendChart(entries) {
|
|
73
|
+
if (entries.length === 0) {
|
|
74
|
+
console.log(chalk.dim(' No trend data yet. Run `aion health` a few times to build history.'));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const CHART_WIDTH = 50;
|
|
78
|
+
const CHART_HEIGHT = 10;
|
|
79
|
+
const scores = entries.map((e) => e.score);
|
|
80
|
+
const minScore = Math.max(0, Math.min(...scores) - 5);
|
|
81
|
+
const maxScore = Math.min(100, Math.max(...scores) + 5);
|
|
82
|
+
const range = maxScore - minScore || 1;
|
|
83
|
+
const sampled = downsample(entries, CHART_WIDTH);
|
|
84
|
+
// Build grid: rows from top (high score) to bottom (low score)
|
|
85
|
+
const grid = Array.from({ length: CHART_HEIGHT }, () => Array.from({ length: sampled.length }, () => ({ char: ' ', score: 0 })));
|
|
86
|
+
for (let col = 0; col < sampled.length; col++) {
|
|
87
|
+
const e = sampled[col];
|
|
88
|
+
const rowF = ((e.score - minScore) / range) * (CHART_HEIGHT - 1);
|
|
89
|
+
const row = Math.max(0, Math.min(CHART_HEIGHT - 1, CHART_HEIGHT - 1 - Math.round(rowF)));
|
|
90
|
+
grid[row][col] = { char: '●', score: e.score };
|
|
91
|
+
}
|
|
92
|
+
console.log('');
|
|
93
|
+
for (let row = 0; row < CHART_HEIGHT; row++) {
|
|
94
|
+
const scoreAtRow = Math.round(maxScore - (row / (CHART_HEIGHT - 1)) * range);
|
|
95
|
+
const label = (row === 0 || row === CHART_HEIGHT - 1) ? String(scoreAtRow).padStart(3) : ' ';
|
|
96
|
+
const line = grid[row].map((cell) => cell.char === '●' ? colorDot(cell.score) : chalk.dim('·')).join('');
|
|
97
|
+
process.stdout.write(` ${chalk.dim(label)} │${line}\n`);
|
|
98
|
+
}
|
|
99
|
+
const axis = '─'.repeat(sampled.length);
|
|
100
|
+
console.log(` └${axis}`);
|
|
101
|
+
const first = formatDate(sampled[0].timestamp);
|
|
102
|
+
const last = formatDate(sampled[sampled.length - 1].timestamp);
|
|
103
|
+
const pad = Math.max(0, sampled.length - first.length - last.length);
|
|
104
|
+
console.log(` ${chalk.dim(first)}${' '.repeat(pad)}${chalk.dim(last)}`);
|
|
105
|
+
console.log('');
|
|
106
|
+
const latest = entries[entries.length - 1];
|
|
107
|
+
const prev = entries.length > 1 ? entries[entries.length - 2] : null;
|
|
108
|
+
const delta = prev ? latest.score - prev.score : 0;
|
|
109
|
+
const deltaStr = delta > 0 ? chalk.green(`+${delta}`) : delta < 0 ? chalk.red(String(delta)) : chalk.gray('±0');
|
|
110
|
+
const trendIcon = delta > 2 ? chalk.green('↑') : delta < -2 ? chalk.red('↓') : chalk.gray('→');
|
|
111
|
+
console.log(` Latest: ${colorScore(latest.score)} grade ${latest.grade} ${trendIcon} ${deltaStr} vs prev (${entries.length} data points)`);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=audit-trend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-trend.js","sourceRoot":"","sources":["../../src/infra/audit-trend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/infra/db/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/infra/db/store.ts"],"names":[],"mappings":"AAwCA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAG5C;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAEnD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAIlF;AAUD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAG1F;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CAOtD;AAUD,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAMP"}
|
package/dist/infra/db/store.js
CHANGED
|
@@ -2,6 +2,13 @@ import { mkdirSync, readFileSync, writeFileSync, readdirSync, existsSync, append
|
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { homedir } from 'os';
|
|
4
4
|
const STORE_DIR = process.env['AI_RUNTIME_DB_PATH'] ?? join(homedir(), '.ai-runtime');
|
|
5
|
+
const SAFE_NAME_RE = /^[A-Za-z0-9._-]+$/;
|
|
6
|
+
function safeName(value, label) {
|
|
7
|
+
if (!SAFE_NAME_RE.test(value) || value === '.' || value === '..') {
|
|
8
|
+
throw new Error(`Invalid ${label}: only letters, numbers, dot, underscore, and dash are allowed`);
|
|
9
|
+
}
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
5
12
|
function ensureDir(dir) {
|
|
6
13
|
mkdirSync(dir, { recursive: true });
|
|
7
14
|
}
|
|
@@ -26,29 +33,29 @@ const tasksDir = () => {
|
|
|
26
33
|
};
|
|
27
34
|
export function saveTask(task) {
|
|
28
35
|
const t = task;
|
|
29
|
-
writeJson(join(tasksDir(), `${t.id}.json`), task);
|
|
36
|
+
writeJson(join(tasksDir(), `${safeName(t.id, 'task id')}.json`), task);
|
|
30
37
|
}
|
|
31
38
|
export function loadTask(id) {
|
|
32
|
-
return readJson(join(tasksDir(), `${id}.json`));
|
|
39
|
+
return readJson(join(tasksDir(), `${safeName(id, 'task id')}.json`));
|
|
33
40
|
}
|
|
34
41
|
export function updateTaskFields(id, fields) {
|
|
35
42
|
const existing = loadTask(id);
|
|
36
43
|
if (!existing)
|
|
37
44
|
return;
|
|
38
|
-
writeJson(join(tasksDir(), `${id}.json`), { ...existing, ...fields, updatedAt: new Date() });
|
|
45
|
+
writeJson(join(tasksDir(), `${safeName(id, 'task id')}.json`), { ...existing, ...fields, updatedAt: new Date() });
|
|
39
46
|
}
|
|
40
47
|
// ── Evidence ─────────────────────────────────────────────────────────────────
|
|
41
48
|
const evidenceDir = (taskId) => {
|
|
42
|
-
const d = join(STORE_DIR, 'evidence', taskId);
|
|
49
|
+
const d = join(STORE_DIR, 'evidence', safeName(taskId, 'task id'));
|
|
43
50
|
ensureDir(d);
|
|
44
51
|
return d;
|
|
45
52
|
};
|
|
46
53
|
export function saveEvidenceEntry(taskId, agentName, report) {
|
|
47
|
-
const filename = `${agentName}-${Date.now()}.json`;
|
|
54
|
+
const filename = `${safeName(agentName, 'agent name')}-${Date.now()}.json`;
|
|
48
55
|
writeJson(join(evidenceDir(taskId), filename), { agentName, report });
|
|
49
56
|
}
|
|
50
57
|
export function loadEvidence(taskId) {
|
|
51
|
-
const dir = join(STORE_DIR, 'evidence', taskId);
|
|
58
|
+
const dir = join(STORE_DIR, 'evidence', safeName(taskId, 'task id'));
|
|
52
59
|
if (!existsSync(dir))
|
|
53
60
|
return [];
|
|
54
61
|
return readdirSync(dir)
|
|
@@ -63,7 +70,7 @@ const historyDir = () => {
|
|
|
63
70
|
return d;
|
|
64
71
|
};
|
|
65
72
|
export function appendHistory(entry) {
|
|
66
|
-
const file = join(historyDir(), `${entry.taskId}.jsonl`);
|
|
73
|
+
const file = join(historyDir(), `${safeName(entry.taskId, 'task id')}.jsonl`);
|
|
67
74
|
const line = JSON.stringify({ ...entry, timestamp: Date.now() }) + '\n';
|
|
68
75
|
try {
|
|
69
76
|
appendFileSync(file, line, 'utf8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/infra/db/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACjH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/infra/db/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACjH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACtF,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,gEAAgE,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,QAAQ,CAAI,QAAgB;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAM,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,IAAa;IAChD,MAAM,GAAG,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9B,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1D,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED,gFAAgF;AAEhF,MAAM,QAAQ,GAAG,GAAW,EAAE;IAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,CAAC,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,MAAM,CAAC,GAAG,IAAsB,CAAC;IACjC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAU,EAAE,MAA+B;IAC1E,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,GAAI,QAAmB,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;AAChI,CAAC;AAED,gFAAgF;AAEhF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAU,EAAE;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACnE,SAAS,CAAC,CAAC,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,SAAiB,EAAE,MAAe;IAClF,MAAM,QAAQ,GAAG,GAAG,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC;IAC3E,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,WAAW,CAAC,GAAG,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;SAClC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,GAAG,GAAW,EAAE;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrC,SAAS,CAAC,CAAC,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,KAK7B;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;IACxE,IAAI,CAAC;QACH,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/infra/embeddings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/infra/embeddings.ts"],"names":[],"mappings":"AAkDA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAQD,qBAAa,cAAc;IAGb,OAAO,CAAC,QAAQ,CAAC,aAAa;IAF1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEL,aAAa,EAAE,MAAM;IAIlD,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,SAAS;IAIX,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAWjG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBvD,QAAQ,IAAI,OAAO;IAIb,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAgCnE"}
|
package/dist/infra/embeddings.js
CHANGED
|
@@ -1,13 +1,35 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
return
|
|
3
|
+
const VECTOR_DIMENSIONS = 384;
|
|
4
|
+
function hashToken(token) {
|
|
5
|
+
let hash = 2166136261;
|
|
6
|
+
for (let i = 0; i < token.length; i++) {
|
|
7
|
+
hash ^= token.charCodeAt(i);
|
|
8
|
+
hash = Math.imul(hash, 16777619);
|
|
9
|
+
}
|
|
10
|
+
return hash >>> 0;
|
|
11
|
+
}
|
|
12
|
+
function embedText(text, maxChars) {
|
|
13
|
+
const vector = new Float32Array(VECTOR_DIMENSIONS);
|
|
14
|
+
const tokens = text
|
|
15
|
+
.slice(0, maxChars)
|
|
16
|
+
.toLowerCase()
|
|
17
|
+
.match(/[a-z0-9_./:-]{2,}/g) ?? [];
|
|
18
|
+
for (const token of tokens) {
|
|
19
|
+
const hash = hashToken(token);
|
|
20
|
+
const index = hash % VECTOR_DIMENSIONS;
|
|
21
|
+
const sign = hash & 1 ? 1 : -1;
|
|
22
|
+
vector[index] += sign;
|
|
23
|
+
}
|
|
24
|
+
let norm = 0;
|
|
25
|
+
for (const value of vector)
|
|
26
|
+
norm += value * value;
|
|
27
|
+
if (norm === 0)
|
|
28
|
+
return vector;
|
|
29
|
+
const scale = 1 / Math.sqrt(norm);
|
|
30
|
+
for (let i = 0; i < vector.length; i++)
|
|
31
|
+
vector[i] *= scale;
|
|
32
|
+
return vector;
|
|
11
33
|
}
|
|
12
34
|
function cosineSimilarity(a, b) {
|
|
13
35
|
let dot = 0;
|
|
@@ -49,9 +71,7 @@ export class EmbeddingStore {
|
|
|
49
71
|
if (cached && cached.mtime === mtime) {
|
|
50
72
|
return new Float32Array(cached.vector);
|
|
51
73
|
}
|
|
52
|
-
const
|
|
53
|
-
const output = await embed(text.slice(0, 2000), { pooling: 'mean', normalize: true });
|
|
54
|
-
const vector = Array.from(output.data);
|
|
74
|
+
const vector = Array.from(embedText(text, 2000));
|
|
55
75
|
this.saveCache(category, filename, { vector, mtime, text: text.slice(0, 500) });
|
|
56
76
|
return new Float32Array(vector);
|
|
57
77
|
}
|
|
@@ -77,9 +97,7 @@ export class EmbeddingStore {
|
|
|
77
97
|
return existsSync(this.indexDir);
|
|
78
98
|
}
|
|
79
99
|
async query(queryText, topK = 5) {
|
|
80
|
-
const
|
|
81
|
-
const queryOutput = await embed(queryText.slice(0, 500), { pooling: 'mean', normalize: true });
|
|
82
|
-
const queryVec = new Float32Array(queryOutput.data);
|
|
100
|
+
const queryVec = embedText(queryText, 500);
|
|
83
101
|
const results = [];
|
|
84
102
|
if (!existsSync(this.indexDir))
|
|
85
103
|
return results;
|