sela-core 0.1.0-alpha.39 → 0.1.0-alpha.40

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 (96) hide show
  1. package/dist/boot/bootImpl.d.ts +14 -0
  2. package/dist/boot/bootImpl.d.ts.map +1 -0
  3. package/dist/boot/bootImpl.js +64 -0
  4. package/dist/boot/register.cjs +45 -0
  5. package/dist/boot/register.d.cts +2 -0
  6. package/dist/boot/register.d.cts.map +1 -0
  7. package/dist/boot/register.d.mts +2 -0
  8. package/dist/boot/register.d.mts.map +1 -0
  9. package/dist/boot/register.mjs +10 -0
  10. package/dist/cli/commands/init.js +48 -16
  11. package/dist/cli/commands/merge.d.ts.map +1 -1
  12. package/dist/cli/commands/merge.js +5 -0
  13. package/dist/cli/commands/shadowRegression.js +1 -1
  14. package/dist/config/ConfigLoader.d.ts.map +1 -1
  15. package/dist/config/ConfigLoader.js +1 -0
  16. package/dist/config/SelaConfig.d.ts +59 -0
  17. package/dist/config/SelaConfig.d.ts.map +1 -1
  18. package/dist/config/SelaConfig.js +36 -0
  19. package/dist/engine/SelaEngine.d.ts +3 -1
  20. package/dist/engine/SelaEngine.d.ts.map +1 -1
  21. package/dist/engine/SelaEngine.js +183 -3
  22. package/dist/errors/SelaError.d.ts +7 -0
  23. package/dist/errors/SelaError.d.ts.map +1 -1
  24. package/dist/errors/SelaError.js +7 -1
  25. package/dist/fixtures/index.js +2 -2
  26. package/dist/providers/AnthropicProvider.d.ts +9 -0
  27. package/dist/providers/AnthropicProvider.d.ts.map +1 -0
  28. package/dist/providers/AnthropicProvider.js +33 -0
  29. package/dist/providers/LLMProvider.d.ts +13 -0
  30. package/dist/providers/LLMProvider.d.ts.map +1 -0
  31. package/dist/providers/LLMProvider.js +7 -0
  32. package/dist/providers/OpenAICompatibleProvider.d.ts +8 -0
  33. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -0
  34. package/dist/providers/OpenAICompatibleProvider.js +48 -0
  35. package/dist/providers/ProviderFactory.d.ts +4 -0
  36. package/dist/providers/ProviderFactory.d.ts.map +1 -0
  37. package/dist/providers/ProviderFactory.js +50 -0
  38. package/dist/providers/SanitizingProvider.d.ts +8 -0
  39. package/dist/providers/SanitizingProvider.d.ts.map +1 -0
  40. package/dist/providers/SanitizingProvider.js +27 -0
  41. package/dist/services/ASTSourceUpdater.d.ts.map +1 -1
  42. package/dist/services/ASTSourceUpdater.js +39 -5
  43. package/dist/services/CrossFileHealer.d.ts +7 -1
  44. package/dist/services/CrossFileHealer.d.ts.map +1 -1
  45. package/dist/services/CrossFileHealer.js +243 -9
  46. package/dist/services/DefinitionTracer.d.ts +1 -0
  47. package/dist/services/DefinitionTracer.d.ts.map +1 -1
  48. package/dist/services/DefinitionTracer.js +59 -36
  49. package/dist/services/HealReportService.d.ts +32 -0
  50. package/dist/services/HealReportService.d.ts.map +1 -1
  51. package/dist/services/HealReportService.js +110 -18
  52. package/dist/services/IntentAuditor.d.ts +9 -7
  53. package/dist/services/IntentAuditor.d.ts.map +1 -1
  54. package/dist/services/IntentAuditor.js +21 -16
  55. package/dist/services/LLMService.d.ts +10 -7
  56. package/dist/services/LLMService.d.ts.map +1 -1
  57. package/dist/services/LLMService.js +76 -10
  58. package/dist/services/PRAutomationService.d.ts +7 -2
  59. package/dist/services/PRAutomationService.d.ts.map +1 -1
  60. package/dist/services/PRAutomationService.js +143 -132
  61. package/dist/services/RegressionManifestService.d.ts +8 -0
  62. package/dist/services/RegressionManifestService.d.ts.map +1 -1
  63. package/dist/services/RegressionManifestService.js +8 -0
  64. package/dist/services/RegressionReclassifier.d.ts +25 -0
  65. package/dist/services/RegressionReclassifier.d.ts.map +1 -0
  66. package/dist/services/RegressionReclassifier.js +195 -0
  67. package/dist/services/ReportMergeService.d.ts +9 -0
  68. package/dist/services/ReportMergeService.d.ts.map +1 -1
  69. package/dist/services/ReportMergeService.js +28 -0
  70. package/dist/services/SmartDOMPruner.d.ts +154 -0
  71. package/dist/services/SmartDOMPruner.d.ts.map +1 -0
  72. package/dist/services/SmartDOMPruner.js +678 -0
  73. package/dist/services/TraceBackEngine.d.ts +23 -6
  74. package/dist/services/TraceBackEngine.d.ts.map +1 -1
  75. package/dist/services/TraceBackEngine.js +51 -13
  76. package/dist/services/VisualSnapshotService.d.ts +48 -0
  77. package/dist/services/VisualSnapshotService.d.ts.map +1 -0
  78. package/dist/services/VisualSnapshotService.js +264 -0
  79. package/dist/services/vcs/GitHubProvider.d.ts +17 -0
  80. package/dist/services/vcs/GitHubProvider.d.ts.map +1 -0
  81. package/dist/services/vcs/GitHubProvider.js +162 -0
  82. package/dist/services/vcs/GitLabProvider.d.ts +17 -0
  83. package/dist/services/vcs/GitLabProvider.d.ts.map +1 -0
  84. package/dist/services/vcs/GitLabProvider.js +175 -0
  85. package/dist/services/vcs/VCSProvider.d.ts +100 -0
  86. package/dist/services/vcs/VCSProvider.d.ts.map +1 -0
  87. package/dist/services/vcs/VCSProvider.js +7 -0
  88. package/dist/services/vcs/VCSProviderFactory.d.ts +7 -0
  89. package/dist/services/vcs/VCSProviderFactory.d.ts.map +1 -0
  90. package/dist/services/vcs/VCSProviderFactory.js +42 -0
  91. package/dist/types/index.d.ts +7 -0
  92. package/dist/types/index.d.ts.map +1 -1
  93. package/dist/utils/shell.d.ts +7 -0
  94. package/dist/utils/shell.d.ts.map +1 -0
  95. package/dist/utils/shell.js +32 -0
  96. package/package.json +7 -1
@@ -0,0 +1,14 @@
1
+ export interface BootDeps {
2
+ readFileSync: (p: string, enc: 'utf-8') => string;
3
+ exit: (code: number) => never;
4
+ stderrWrite: (msg: string) => boolean;
5
+ argv: string[];
6
+ env: NodeJS.ProcessEnv;
7
+ cwd: () => string;
8
+ }
9
+ export declare function escapeRegex(s: string): string;
10
+ export declare function isPlaywrightTestInvocation(argv: string[]): boolean;
11
+ export declare function extractGrep(argv: string[]): string | null;
12
+ export declare function buildGrepPattern(existing: string | null, escapedTitles: string[]): string;
13
+ export declare function bootImpl(deps: BootDeps): void;
14
+ //# sourceMappingURL=bootImpl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootImpl.d.ts","sourceRoot":"","sources":["../../src/boot/bootImpl.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAClD,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;IAC9B,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAKD,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAMlE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAUzD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAKzF;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAkC7C"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.escapeRegex = escapeRegex;
4
+ exports.isPlaywrightTestInvocation = isPlaywrightTestInvocation;
5
+ exports.extractGrep = extractGrep;
6
+ exports.buildGrepPattern = buildGrepPattern;
7
+ exports.bootImpl = bootImpl;
8
+ function escapeRegex(s) {
9
+ return s.replace(/[[\](){}.*+?^$|\\]/g, '\\$&');
10
+ }
11
+ function isPlaywrightTestInvocation(argv) {
12
+ const script = (argv[1] ?? '').replace(/\\/g, '/');
13
+ return ((/\/(playwright|pw)(\/|$)/i.test(script) || /@playwright\/test\//i.test(script)) &&
14
+ argv.includes('test'));
15
+ }
16
+ function extractGrep(argv) {
17
+ const inlineIdx = argv.findIndex(a => /^(--grep=|-g=)/.test(a));
18
+ if (inlineIdx !== -1) {
19
+ return argv.splice(inlineIdx, 1)[0].split('=').slice(1).join('=');
20
+ }
21
+ const flagIdx = argv.findIndex(a => a === '--grep' || a === '-g');
22
+ if (flagIdx !== -1 && flagIdx + 1 < argv.length) {
23
+ return argv.splice(flagIdx, 2)[1];
24
+ }
25
+ return null;
26
+ }
27
+ function buildGrepPattern(existing, escapedTitles) {
28
+ const manifestPart = escapedTitles.join('|');
29
+ if (!existing)
30
+ return `^(${manifestPart})$`;
31
+ const stripped = existing.replace(/^\^/, '').replace(/\$$/, '');
32
+ return `^((${stripped})|(${manifestPart}))$`;
33
+ }
34
+ function bootImpl(deps) {
35
+ if (deps.env['SELA_REGRESSION_ACTIVE'] !== 'true')
36
+ return;
37
+ if (!isPlaywrightTestInvocation(deps.argv))
38
+ return;
39
+ const manifestPath = deps.env['SELA_REGRESSION_MANIFEST']
40
+ ? deps.env['SELA_REGRESSION_MANIFEST']
41
+ : `${deps.cwd()}/.sela/sela-regression-manifest.json`;
42
+ let manifest;
43
+ try {
44
+ manifest = JSON.parse(deps.readFileSync(manifestPath, 'utf-8'));
45
+ }
46
+ catch (err) {
47
+ const message = err instanceof Error ? err.message : String(err);
48
+ deps.stderrWrite(`[Sela] FATAL: SELA_REGRESSION_ACTIVE=true but manifest not found or corrupt.\n` +
49
+ ` Expected: ${manifestPath}\n` +
50
+ ` Error: ${message}\n` +
51
+ ` Run 'sela shadow-regression' to generate the manifest first.\n`);
52
+ deps.exit(1);
53
+ }
54
+ const records = manifest.records;
55
+ if (!Array.isArray(records) || records.length === 0) {
56
+ deps.stderrWrite('[Sela] INFO: Manifest has no records — running full suite.\n');
57
+ return;
58
+ }
59
+ const files = [...new Set(records.map(r => r.sourceFile).filter(Boolean))];
60
+ const titles = [...new Set(records.map(r => r.testTitle).filter(Boolean))];
61
+ const existingGrep = extractGrep(deps.argv);
62
+ const grepPattern = buildGrepPattern(existingGrep, titles.map(escapeRegex));
63
+ deps.argv.push(...files, '--grep', grepPattern);
64
+ }
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const fs = __importStar(require("node:fs"));
37
+ const bootImpl_js_1 = require("./bootImpl.js");
38
+ (0, bootImpl_js_1.bootImpl)({
39
+ readFileSync: (p, enc) => fs.readFileSync(p, enc),
40
+ exit: (code) => process.exit(code),
41
+ stderrWrite: (msg) => process.stderr.write(msg),
42
+ argv: process.argv,
43
+ env: process.env,
44
+ cwd: () => process.cwd(),
45
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.cts","sourceRoot":"","sources":["../../src/boot/register.cts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.mts","sourceRoot":"","sources":["../../src/boot/register.mts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { bootImpl } from './bootImpl.js';
3
+ bootImpl({
4
+ readFileSync: (p, enc) => readFileSync(p, enc),
5
+ exit: (code) => process.exit(code),
6
+ stderrWrite: (msg) => process.stderr.write(msg),
7
+ argv: process.argv,
8
+ env: process.env,
9
+ cwd: () => process.cwd(),
10
+ });
@@ -39,23 +39,23 @@ const path = __importStar(require("path"));
39
39
  const logger_js_1 = require("../../utils/logger.js");
40
40
  const conventionsInit_js_1 = require("../conventionsInit.js");
41
41
  const PACKAGE_NAME = "sela-core";
42
- const CONFIG_TEMPLATE_TS = `import { defineConfig } from '${PACKAGE_NAME}';
43
-
44
- export default defineConfig({
45
- healingPolicy: 'balanced',
46
- updateStrategy: 'inPlace',
47
- autoCommit: false,
48
- dnaStoragePath: 'sela-snapshots',
49
- });
42
+ const CONFIG_TEMPLATE_TS = `import { defineConfig } from '${PACKAGE_NAME}';
43
+
44
+ export default defineConfig({
45
+ healingPolicy: 'balanced',
46
+ updateStrategy: 'inPlace',
47
+ autoCommit: false,
48
+ dnaStoragePath: 'sela-snapshots',
49
+ });
50
50
  `;
51
- const CONFIG_TEMPLATE_JS = `const { defineConfig } = require('${PACKAGE_NAME}');
52
-
53
- module.exports = defineConfig({
54
- healingPolicy: 'balanced',
55
- updateStrategy: 'inPlace',
56
- autoCommit: false,
57
- dnaStoragePath: 'sela-snapshots',
58
- });
51
+ const CONFIG_TEMPLATE_JS = `const { defineConfig } = require('${PACKAGE_NAME}');
52
+
53
+ module.exports = defineConfig({
54
+ healingPolicy: 'balanced',
55
+ updateStrategy: 'inPlace',
56
+ autoCommit: false,
57
+ dnaStoragePath: 'sela-snapshots',
58
+ });
59
59
  `;
60
60
  const REQUIRED_ENV_VARS = ["ANTHROPIC_API_KEY"];
61
61
  function registerInit(program) {
@@ -126,6 +126,38 @@ async function runInit(opts) {
126
126
  fileTimeoutMs: opts.fileTimeout ? Number(opts.fileTimeout) : undefined,
127
127
  });
128
128
  }
129
+ // ── .npmrc node-options upsert ───────────────────────────────────
130
+ if (!opts.dryRun) {
131
+ upsertNpmrcHook(cwd);
132
+ }
133
+ }
134
+ const NPMRC_HOOK = '--import sela/register';
135
+ const NPMRC_NODE_OPTIONS_RE = /^node-options\s*=\s*(.*)$/m;
136
+ function upsertNpmrcHook(cwd) {
137
+ const npmrcPath = path.join(cwd, '.npmrc');
138
+ let content = '';
139
+ try {
140
+ content = fs.readFileSync(npmrcPath, 'utf8');
141
+ }
142
+ catch {
143
+ // file doesn't exist yet — start empty
144
+ }
145
+ const match = NPMRC_NODE_OPTIONS_RE.exec(content);
146
+ if (match) {
147
+ const existing = match[1].replace(/^"|"$/g, '').trim();
148
+ if (existing.includes(NPMRC_HOOK)) {
149
+ logger_js_1.logger.success(`.npmrc already configured for Sela regression hook`);
150
+ return;
151
+ }
152
+ // Append to existing node-options line
153
+ const updated = content.replace(NPMRC_NODE_OPTIONS_RE, `node-options="${existing} ${NPMRC_HOOK}"`);
154
+ fs.writeFileSync(npmrcPath, updated, 'utf8');
155
+ }
156
+ else {
157
+ const separator = content.length > 0 && !content.endsWith('\n') ? '\n' : '';
158
+ fs.writeFileSync(npmrcPath, `${content}${separator}node-options="${NPMRC_HOOK}"\n`, 'utf8');
159
+ }
160
+ logger_js_1.logger.success(`.npmrc configured — 'SELA_REGRESSION_ACTIVE=true npx playwright test' will auto-filter failed tests`);
129
161
  }
130
162
  function loadDotEnv(cwd) {
131
163
  const envPath = path.join(cwd, ".env");
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8FpD"}
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsGpD"}
@@ -101,6 +101,11 @@ function registerMerge(program) {
101
101
  ? ` (${result.duplicatesDropped} dup dropped)`
102
102
  : "") +
103
103
  ` history: ${result.data.historical_runs.length} run(s)\n`);
104
+ if (result.manifestPath) {
105
+ process.stdout.write(`[sela] Unified regression manifest: ${result.manifestPath} ` +
106
+ `(${result.manifestRecords} bypass record(s))\n` +
107
+ ` Verify with: npx sela shadow-regression\n`);
108
+ }
104
109
  // Partial merges are surfaced but DO NOT fail the job (aggregate-and-flag).
105
110
  if (result.partial) {
106
111
  process.exitCode = 0;
@@ -134,7 +134,7 @@ function registerShadowRegression(program) {
134
134
  // 5. Merge the verdict into the report + regenerate the dashboard.
135
135
  let htmlPath;
136
136
  try {
137
- htmlPath = (0, HealReportService_js_1.mergeRegressionIntoReport)(targetDir, { regressionState, regressionTests }, { reportJsonPath: opts.report });
137
+ htmlPath = (0, HealReportService_js_1.mergeRegressionIntoReport)(targetDir, { regressionState, regressionTests, records: manifest.records }, { reportJsonPath: opts.report });
138
138
  }
139
139
  catch (err) {
140
140
  process.stderr.write(`[sela] Report merge failed: ${err.message}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAiB,MAAM,cAAc,CAAC;AAgNzE,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA+B;IACtD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAuB;IAK5C,OAAO,CAAC,MAAM,CAAC,aAAa,CAA2B;IAEvD;;;;;;;;OAQG;IACH,MAAM,CAAC,WAAW,IAAI,cAAc;IAqCpC;;;;OAIG;IACH,MAAM,CAAC,YAAY,IAAI,UAAU;IAKjC,OAAO,CAAC,MAAM,CAAC,aAAa;IAsB5B,yEAAyE;IACzE,MAAM,CAAC,SAAS,IAAI,MAAM,GAAG,IAAI;IAKjC,uDAAuD;IACvD,MAAM,CAAC,KAAK,IAAI,IAAI;CAKrB"}
1
+ {"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAiB,MAAM,cAAc,CAAC;AAiNzE,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA+B;IACtD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAuB;IAK5C,OAAO,CAAC,MAAM,CAAC,aAAa,CAA2B;IAEvD;;;;;;;;OAQG;IACH,MAAM,CAAC,WAAW,IAAI,cAAc;IAqCpC;;;;OAIG;IACH,MAAM,CAAC,YAAY,IAAI,UAAU;IAKjC,OAAO,CAAC,MAAM,CAAC,aAAa;IAsB5B,yEAAyE;IACzE,MAAM,CAAC,SAAS,IAAI,MAAM,GAAG,IAAI;IAKjC,uDAAuD;IACvD,MAAM,CAAC,KAAK,IAAI,IAAI;CAKrB"}
@@ -59,6 +59,7 @@ const KNOWN_CONFIG_KEYS = new Set([
59
59
  "playwrightRules",
60
60
  "blastRadiusProtection",
61
61
  "branchOverrides",
62
+ "llm",
62
63
  ]);
63
64
  // ─────────────────────────────────────────────────────────────────
64
65
  // FILE DISCOVERY
@@ -72,6 +72,42 @@ export interface PlaywrightRulesConfig {
72
72
  */
73
73
  preferGetByRoleOverCss?: boolean;
74
74
  }
75
+ export type LLMProviderType = "anthropic" | "openai" | "openai-compatible" | "local";
76
+ export interface LLMModelConfig {
77
+ /** Which provider backend to use. */
78
+ provider: LLMProviderType;
79
+ /** Model identifier as the provider understands it. */
80
+ modelId: string;
81
+ /** Base URL for openai-compatible / local endpoints (e.g. http://localhost:11434/v1). */
82
+ baseUrl?: string;
83
+ /**
84
+ * API key or token. Accepts a literal string or process.env reference.
85
+ * Omit when the local server requires no authentication.
86
+ */
87
+ apiKey?: string;
88
+ /** Sampling temperature (0.0 = deterministic). Provider default when omitted. */
89
+ temperature?: number;
90
+ /** Maximum tokens to generate. Defaults to 1024. */
91
+ maxTokens?: number;
92
+ /** Extra HTTP headers forwarded on every request (auth tokens, tenant IDs, etc.). */
93
+ customHeaders?: Record<string, string>;
94
+ /**
95
+ * Skip TLS certificate verification. Use ONLY for air-gapped corporate
96
+ * proxies with self-signed certs — never in production internet contexts.
97
+ */
98
+ disableSslVerification?: boolean;
99
+ /**
100
+ * Per-request timeout in milliseconds. Prevents CI from hanging when a
101
+ * GPU-constrained local cluster stalls. Omit to use the provider default.
102
+ */
103
+ timeoutMs?: number;
104
+ }
105
+ export interface LLMConfig {
106
+ /** Heavy-duty model for AST parsing, code reasoning, and selector generation. */
107
+ healingModel: LLMModelConfig;
108
+ /** Lighter model for real-time semantic validation (intent auditor). */
109
+ intentAuditModel: LLMModelConfig;
110
+ }
75
111
  export interface SelaConfig {
76
112
  /** Shorthand preset that expands to concrete threshold values. */
77
113
  healingPolicy?: "conservative" | "balanced" | "aggressive";
@@ -171,6 +207,12 @@ export interface SelaConfig {
171
207
  * Merge order: expandPreset(base) → base.thresholds → expandPreset(override) → override.thresholds
172
208
  */
173
209
  branchOverrides?: Record<string, Partial<SelaConfig>>;
210
+ /**
211
+ * LLM provider configuration for the two distinct AI operations.
212
+ * When omitted, Sela falls back to ANTHROPIC_API_KEY / SELA_LLM_MODEL
213
+ * env vars (backward-compatible with all existing setups).
214
+ */
215
+ llm?: LLMConfig;
174
216
  }
175
217
  export interface ResolvedVectorThresholds {
176
218
  /** Minimum DNA Architectural Match score (0–100). null = disabled. */
@@ -223,6 +265,21 @@ export interface ResolvedSanitization {
223
265
  redactInputValues: boolean;
224
266
  customPatterns: string[];
225
267
  }
268
+ export interface ResolvedLLMModelConfig {
269
+ provider: LLMProviderType;
270
+ modelId: string;
271
+ apiKey: string;
272
+ baseUrl?: string;
273
+ temperature?: number;
274
+ maxTokens?: number;
275
+ customHeaders?: Record<string, string>;
276
+ disableSslVerification?: boolean;
277
+ timeoutMs?: number;
278
+ }
279
+ export interface ResolvedLLMConfig {
280
+ healingModel: ResolvedLLMModelConfig;
281
+ intentAuditModel: ResolvedLLMModelConfig;
282
+ }
226
283
  export interface ResolvedPlaywrightRules {
227
284
  preferredStrategies: ("role" | "testId" | "text" | "css")[];
228
285
  testIdAttribute: string;
@@ -267,6 +324,8 @@ export interface ResolvedConfig {
267
324
  * goes straight to the LLM. Sourced from `SELA_NO_CACHE` env var.
268
325
  */
269
326
  noCache: boolean;
327
+ /** Resolved LLM provider config for healing and intent-audit models. */
328
+ llm: ResolvedLLMConfig;
270
329
  /**
271
330
  * When true, Sela is completely dormant. It does NOT intercept errors,
272
331
  * does NOT patch memory, does NOT attempt heals, and performs ZERO
@@ -1 +1 @@
1
- {"version":3,"file":"SelaConfig.d.ts","sourceRoot":"","sources":["../../src/config/SelaConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SelaConfig.d.ts","sourceRoot":"","sources":["../../src/config/SelaConfig.ts"],"names":[],"mappings":"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"}
@@ -143,6 +143,41 @@ function resolveMaxHealsPerRun(value) {
143
143
  }
144
144
  return value;
145
145
  }
146
+ function resolveLLMModelConfig(cfg, env) {
147
+ return {
148
+ provider: cfg.provider,
149
+ modelId: cfg.modelId,
150
+ apiKey: cfg.apiKey ?? env.ANTHROPIC_API_KEY ?? "",
151
+ baseUrl: cfg.baseUrl,
152
+ temperature: cfg.temperature,
153
+ maxTokens: cfg.maxTokens,
154
+ customHeaders: cfg.customHeaders,
155
+ disableSslVerification: cfg.disableSslVerification,
156
+ timeoutMs: cfg.timeoutMs,
157
+ };
158
+ }
159
+ function resolveLLMConfig(config, env) {
160
+ if (config.llm) {
161
+ return {
162
+ healingModel: resolveLLMModelConfig(config.llm.healingModel, env),
163
+ intentAuditModel: resolveLLMModelConfig(config.llm.intentAuditModel, env),
164
+ };
165
+ }
166
+ // Backward-compat: derive from legacy ANTHROPIC_API_KEY / SELA_LLM_MODEL env vars.
167
+ const apiKey = env.ANTHROPIC_API_KEY ?? "";
168
+ return {
169
+ healingModel: {
170
+ provider: "anthropic",
171
+ modelId: env.SELA_LLM_MODEL ?? "claude-sonnet-4-6",
172
+ apiKey,
173
+ },
174
+ intentAuditModel: {
175
+ provider: "anthropic",
176
+ modelId: "claude-haiku-4-5-20251001",
177
+ apiKey,
178
+ },
179
+ };
180
+ }
146
181
  function resolveConfig(config, env = process.env) {
147
182
  const prAutomation = resolvePRAutomation(config);
148
183
  // Structural conflict: updateStrategy:'branch' and prAutomation.enabled both
@@ -183,6 +218,7 @@ function resolveConfig(config, env = process.env) {
183
218
  },
184
219
  playwrightRules: resolvePlaywrightRules(config),
185
220
  blastRadiusProtection: config.blastRadiusProtection ?? true,
221
+ llm: resolveLLMConfig(config, env),
186
222
  dryRun,
187
223
  noCache,
188
224
  bypass,
@@ -13,6 +13,7 @@ export declare class SelaEngine {
13
13
  private healMetaBuffer;
14
14
  private testTitleBuffer;
15
15
  private bypassedSelectorCache;
16
+ private readonly noHealCache;
16
17
  constructor();
17
18
  healArgument(page: Page, selector: string, action: string, oldArgument: string, stableId: string, filePath: string, line: number): Promise<string | null>;
18
19
  heal(page: Page, fullSelector: string, elementSelectorOnly: string, stableId: string, filePath: string, line: number, healMode?: HealMode): Promise<string>;
@@ -54,7 +55,8 @@ export declare class SelaEngine {
54
55
  private fetchLiveText;
55
56
  private _rebuildSelectorWithFrames;
56
57
  private getAllFiles;
57
- captureSuccessfulElement(page: Page, selector: string, stableId: string): Promise<void>;
58
+ captureSuccessfulElement(page: Page, selector: string, stableId: string, sourceFile?: string): Promise<void>;
59
+ private static _snapshotFingerprint;
58
60
  }
59
61
  export {};
60
62
  //# sourceMappingURL=SelaEngine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelaEngine.d.ts","sourceRoot":"","sources":["../../src/engine/SelaEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAcxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,EAAe,QAAQ,EAAkB,MAAM,yBAAyB,CAAC;AAiGhF,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,mBAAmB,CAAmB;IAC9C,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,eAAe,CAAkC;IAKzD,OAAO,CAAC,qBAAqB,CAAkC;;IA0BzD,YAAY,CAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqEnB,IAAI,CACR,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,MAAM,EACpB,mBAAmB,EAAE,MAAM,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,QAAmB,GAC5B,OAAO,CAAC,MAAM,CAAC;IAm9BlB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,aAAa;IAerB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,2BAA2B;IA4BnC,OAAO,CAAC,yBAAyB;IAgDjC,OAAO,CAAC,kBAAkB;IA8D1B,OAAO,CAAC,oBAAoB;IAyD5B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5E,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK/B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YAsJtB,aAAa;IAsB3B,OAAO,CAAC,0BAA0B;IA+BlC,OAAO,CAAC,WAAW;IA6Bb,wBAAwB,CAC5B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM;CAqBnB;AAED,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"SelaEngine.d.ts","sourceRoot":"","sources":["../../src/engine/SelaEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAcxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,EAAe,QAAQ,EAAkB,MAAM,yBAAyB,CAAC;AA6GhF,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,mBAAmB,CAAmB;IAC9C,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,eAAe,CAAkC;IAKzD,OAAO,CAAC,qBAAqB,CAAkC;IAK/D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;;IAyCnD,YAAY,CAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqEnB,IAAI,CACR,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,MAAM,EACpB,mBAAmB,EAAE,MAAM,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,QAAmB,GAC5B,OAAO,CAAC,MAAM,CAAC;IAylClB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,aAAa;IAerB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,2BAA2B;IA4BnC,OAAO,CAAC,yBAAyB;IAgDjC,OAAO,CAAC,kBAAkB;IA8D1B,OAAO,CAAC,oBAAoB;IAyD5B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5E,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK/B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YAsJtB,aAAa;IAsB3B,OAAO,CAAC,0BAA0B;IA+BlC,OAAO,CAAC,WAAW;IA6Bb,wBAAwB,CAC5B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM;IAkErB,OAAO,CAAC,MAAM,CAAC,oBAAoB;CAWpC;AAED,OAAO,EAAE,CAAC"}