@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.
Files changed (118) hide show
  1. package/README.md +224 -9
  2. package/dist/cli/commands/audit.d.ts.map +1 -1
  3. package/dist/cli/commands/audit.js +461 -20
  4. package/dist/cli/commands/audit.js.map +1 -1
  5. package/dist/cli/commands/chat.d.ts +3 -0
  6. package/dist/cli/commands/chat.d.ts.map +1 -0
  7. package/dist/cli/commands/chat.js +128 -0
  8. package/dist/cli/commands/chat.js.map +1 -0
  9. package/dist/cli/commands/diff.d.ts +3 -0
  10. package/dist/cli/commands/diff.d.ts.map +1 -0
  11. package/dist/cli/commands/diff.js +144 -0
  12. package/dist/cli/commands/diff.js.map +1 -0
  13. package/dist/cli/commands/health.d.ts.map +1 -1
  14. package/dist/cli/commands/health.js +17 -0
  15. package/dist/cli/commands/health.js.map +1 -1
  16. package/dist/cli/commands/init.d.ts +3 -0
  17. package/dist/cli/commands/init.d.ts.map +1 -0
  18. package/dist/cli/commands/init.js +52 -0
  19. package/dist/cli/commands/init.js.map +1 -0
  20. package/dist/cli/commands/report.d.ts.map +1 -1
  21. package/dist/cli/commands/report.js +8 -0
  22. package/dist/cli/commands/report.js.map +1 -1
  23. package/dist/cli/menu.d.ts.map +1 -1
  24. package/dist/cli/menu.js +43 -1
  25. package/dist/cli/menu.js.map +1 -1
  26. package/dist/core/orchestrator.d.ts +2 -1
  27. package/dist/core/orchestrator.d.ts.map +1 -1
  28. package/dist/core/orchestrator.js +2 -2
  29. package/dist/core/orchestrator.js.map +1 -1
  30. package/dist/core/pipelines/audit-pipeline.d.ts +9 -1
  31. package/dist/core/pipelines/audit-pipeline.d.ts.map +1 -1
  32. package/dist/core/pipelines/audit-pipeline.js +98 -9
  33. package/dist/core/pipelines/audit-pipeline.js.map +1 -1
  34. package/dist/index.js +7 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/infra/aion-config.d.ts +26 -0
  37. package/dist/infra/aion-config.d.ts.map +1 -0
  38. package/dist/infra/aion-config.js +60 -0
  39. package/dist/infra/aion-config.js.map +1 -0
  40. package/dist/infra/aion-ignore.d.ts +3 -0
  41. package/dist/infra/aion-ignore.d.ts.map +1 -0
  42. package/dist/infra/aion-ignore.js +35 -0
  43. package/dist/infra/aion-ignore.js.map +1 -0
  44. package/dist/infra/audit-cache.d.ts +39 -0
  45. package/dist/infra/audit-cache.d.ts.map +1 -0
  46. package/dist/infra/audit-cache.js +82 -0
  47. package/dist/infra/audit-cache.js.map +1 -0
  48. package/dist/infra/audit-trend.d.ts +17 -0
  49. package/dist/infra/audit-trend.d.ts.map +1 -0
  50. package/dist/infra/audit-trend.js +113 -0
  51. package/dist/infra/audit-trend.js.map +1 -0
  52. package/dist/infra/db/store.d.ts.map +1 -1
  53. package/dist/infra/db/store.js +14 -7
  54. package/dist/infra/db/store.js.map +1 -1
  55. package/dist/infra/embeddings.d.ts.map +1 -1
  56. package/dist/infra/embeddings.js +32 -14
  57. package/dist/infra/embeddings.js.map +1 -1
  58. package/dist/prompts/scanner.d.ts +1 -0
  59. package/dist/prompts/scanner.d.ts.map +1 -1
  60. package/dist/prompts/scanner.js +4 -0
  61. package/dist/prompts/scanner.js.map +1 -1
  62. package/package.json +24 -19
  63. package/dist/agents/planner.test.d.ts +0 -2
  64. package/dist/agents/planner.test.d.ts.map +0 -1
  65. package/dist/agents/planner.test.js +0 -21
  66. package/dist/agents/planner.test.js.map +0 -1
  67. package/dist/core/cost-tracker.test.d.ts +0 -2
  68. package/dist/core/cost-tracker.test.d.ts.map +0 -1
  69. package/dist/core/cost-tracker.test.js +0 -36
  70. package/dist/core/cost-tracker.test.js.map +0 -1
  71. package/dist/core/pipelines/audit-pipeline.test.d.ts +0 -2
  72. package/dist/core/pipelines/audit-pipeline.test.d.ts.map +0 -1
  73. package/dist/core/pipelines/audit-pipeline.test.js +0 -135
  74. package/dist/core/pipelines/audit-pipeline.test.js.map +0 -1
  75. package/dist/core/repo-context.d.ts +0 -2
  76. package/dist/core/repo-context.d.ts.map +0 -1
  77. package/dist/core/repo-context.js +0 -12
  78. package/dist/core/repo-context.js.map +0 -1
  79. package/dist/core/repo-context.test.d.ts +0 -2
  80. package/dist/core/repo-context.test.d.ts.map +0 -1
  81. package/dist/core/repo-context.test.js +0 -40
  82. package/dist/core/repo-context.test.js.map +0 -1
  83. package/dist/core/runtime-policy.test.d.ts +0 -2
  84. package/dist/core/runtime-policy.test.d.ts.map +0 -1
  85. package/dist/core/runtime-policy.test.js +0 -27
  86. package/dist/core/runtime-policy.test.js.map +0 -1
  87. package/dist/infra/bm25.test.d.ts +0 -2
  88. package/dist/infra/bm25.test.d.ts.map +0 -1
  89. package/dist/infra/bm25.test.js +0 -17
  90. package/dist/infra/bm25.test.js.map +0 -1
  91. package/dist/infra/chunker.test.d.ts +0 -2
  92. package/dist/infra/chunker.test.d.ts.map +0 -1
  93. package/dist/infra/chunker.test.js +0 -33
  94. package/dist/infra/chunker.test.js.map +0 -1
  95. package/dist/infra/db/database.d.ts +0 -4
  96. package/dist/infra/db/database.d.ts.map +0 -1
  97. package/dist/infra/db/database.js +0 -25
  98. package/dist/infra/db/database.js.map +0 -1
  99. package/dist/infra/evidence-gate.test.d.ts +0 -2
  100. package/dist/infra/evidence-gate.test.d.ts.map +0 -1
  101. package/dist/infra/evidence-gate.test.js +0 -36
  102. package/dist/infra/evidence-gate.test.js.map +0 -1
  103. package/dist/infra/repo-index.test.d.ts +0 -2
  104. package/dist/infra/repo-index.test.d.ts.map +0 -1
  105. package/dist/infra/repo-index.test.js +0 -53
  106. package/dist/infra/repo-index.test.js.map +0 -1
  107. package/dist/infra/repo-query.test.d.ts +0 -2
  108. package/dist/infra/repo-query.test.d.ts.map +0 -1
  109. package/dist/infra/repo-query.test.js +0 -34
  110. package/dist/infra/repo-query.test.js.map +0 -1
  111. package/dist/infra/semgrep.test.d.ts +0 -2
  112. package/dist/infra/semgrep.test.d.ts.map +0 -1
  113. package/dist/infra/semgrep.test.js +0 -39
  114. package/dist/infra/semgrep.test.js.map +0 -1
  115. package/dist/schemas/audit.test.d.ts +0 -2
  116. package/dist/schemas/audit.test.d.ts.map +0 -1
  117. package/dist/schemas/audit.test.js +0 -41
  118. 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.0')
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,3 @@
1
+ export declare function loadIgnorePatterns(cwd: string): RegExp[];
2
+ export declare function isIgnored(filePath: string, patterns: RegExp[]): boolean;
3
+ //# sourceMappingURL=aion-ignore.d.ts.map
@@ -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":"AAgCA,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"}
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"}
@@ -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":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/infra/db/store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/infra/embeddings.ts"],"names":[],"mappings":"AA4BA,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;IAajG,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;CAkCnE"}
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"}
@@ -1,13 +1,35 @@
1
1
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
- let _pipeline = null;
4
- async function getPipeline() {
5
- if (_pipeline)
6
- return _pipeline;
7
- const { pipeline } = await import('@xenova/transformers');
8
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
- _pipeline = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2', { quantized: true }));
10
- return _pipeline;
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 embed = await getPipeline();
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 embed = await getPipeline();
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;