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

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 (97) 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 +68 -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 +33 -12
  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 +193 -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.d.ts.map +1 -1
  26. package/dist/fixtures/index.js +5 -4
  27. package/dist/providers/AnthropicProvider.d.ts +9 -0
  28. package/dist/providers/AnthropicProvider.d.ts.map +1 -0
  29. package/dist/providers/AnthropicProvider.js +33 -0
  30. package/dist/providers/LLMProvider.d.ts +13 -0
  31. package/dist/providers/LLMProvider.d.ts.map +1 -0
  32. package/dist/providers/LLMProvider.js +7 -0
  33. package/dist/providers/OpenAICompatibleProvider.d.ts +8 -0
  34. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -0
  35. package/dist/providers/OpenAICompatibleProvider.js +48 -0
  36. package/dist/providers/ProviderFactory.d.ts +4 -0
  37. package/dist/providers/ProviderFactory.d.ts.map +1 -0
  38. package/dist/providers/ProviderFactory.js +50 -0
  39. package/dist/providers/SanitizingProvider.d.ts +8 -0
  40. package/dist/providers/SanitizingProvider.d.ts.map +1 -0
  41. package/dist/providers/SanitizingProvider.js +27 -0
  42. package/dist/services/ASTSourceUpdater.d.ts.map +1 -1
  43. package/dist/services/ASTSourceUpdater.js +39 -5
  44. package/dist/services/CrossFileHealer.d.ts +7 -1
  45. package/dist/services/CrossFileHealer.d.ts.map +1 -1
  46. package/dist/services/CrossFileHealer.js +243 -9
  47. package/dist/services/DefinitionTracer.d.ts +1 -0
  48. package/dist/services/DefinitionTracer.d.ts.map +1 -1
  49. package/dist/services/DefinitionTracer.js +59 -36
  50. package/dist/services/HealReportService.d.ts +32 -0
  51. package/dist/services/HealReportService.d.ts.map +1 -1
  52. package/dist/services/HealReportService.js +111 -18
  53. package/dist/services/IntentAuditor.d.ts +9 -7
  54. package/dist/services/IntentAuditor.d.ts.map +1 -1
  55. package/dist/services/IntentAuditor.js +21 -16
  56. package/dist/services/LLMService.d.ts +10 -7
  57. package/dist/services/LLMService.d.ts.map +1 -1
  58. package/dist/services/LLMService.js +76 -10
  59. package/dist/services/PRAutomationService.d.ts +7 -2
  60. package/dist/services/PRAutomationService.d.ts.map +1 -1
  61. package/dist/services/PRAutomationService.js +144 -133
  62. package/dist/services/RegressionManifestService.d.ts +8 -0
  63. package/dist/services/RegressionManifestService.d.ts.map +1 -1
  64. package/dist/services/RegressionManifestService.js +8 -0
  65. package/dist/services/RegressionReclassifier.d.ts +25 -0
  66. package/dist/services/RegressionReclassifier.d.ts.map +1 -0
  67. package/dist/services/RegressionReclassifier.js +195 -0
  68. package/dist/services/ReportMergeService.d.ts +9 -0
  69. package/dist/services/ReportMergeService.d.ts.map +1 -1
  70. package/dist/services/ReportMergeService.js +28 -0
  71. package/dist/services/SmartDOMPruner.d.ts +154 -0
  72. package/dist/services/SmartDOMPruner.d.ts.map +1 -0
  73. package/dist/services/SmartDOMPruner.js +678 -0
  74. package/dist/services/TraceBackEngine.d.ts +23 -6
  75. package/dist/services/TraceBackEngine.d.ts.map +1 -1
  76. package/dist/services/TraceBackEngine.js +51 -13
  77. package/dist/services/VisualSnapshotService.d.ts +54 -0
  78. package/dist/services/VisualSnapshotService.d.ts.map +1 -0
  79. package/dist/services/VisualSnapshotService.js +279 -0
  80. package/dist/services/vcs/GitHubProvider.d.ts +17 -0
  81. package/dist/services/vcs/GitHubProvider.d.ts.map +1 -0
  82. package/dist/services/vcs/GitHubProvider.js +162 -0
  83. package/dist/services/vcs/GitLabProvider.d.ts +17 -0
  84. package/dist/services/vcs/GitLabProvider.d.ts.map +1 -0
  85. package/dist/services/vcs/GitLabProvider.js +175 -0
  86. package/dist/services/vcs/VCSProvider.d.ts +100 -0
  87. package/dist/services/vcs/VCSProvider.d.ts.map +1 -0
  88. package/dist/services/vcs/VCSProvider.js +7 -0
  89. package/dist/services/vcs/VCSProviderFactory.d.ts +7 -0
  90. package/dist/services/vcs/VCSProviderFactory.d.ts.map +1 -0
  91. package/dist/services/vcs/VCSProviderFactory.js +42 -0
  92. package/dist/types/index.d.ts +7 -0
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/dist/utils/shell.d.ts +7 -0
  95. package/dist/utils/shell.d.ts.map +1 -0
  96. package/dist/utils/shell.js +32 -0
  97. 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,CAuC7C"}
@@ -0,0 +1,68 @@
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
+ // Expose the resolved path so worker processes (and the fixture's
43
+ // regressionInjector) can discover the manifest without requiring
44
+ // SELA_REGRESSION_MANIFEST to be set explicitly by the user.
45
+ deps.env['SELA_REGRESSION_MANIFEST'] = manifestPath;
46
+ let manifest;
47
+ try {
48
+ manifest = JSON.parse(deps.readFileSync(manifestPath, 'utf-8'));
49
+ }
50
+ catch (err) {
51
+ const message = err instanceof Error ? err.message : String(err);
52
+ deps.stderrWrite(`[Sela] FATAL: SELA_REGRESSION_ACTIVE=true but manifest not found or corrupt.\n` +
53
+ ` Expected: ${manifestPath}\n` +
54
+ ` Error: ${message}\n` +
55
+ ` Run 'sela shadow-regression' to generate the manifest first.\n`);
56
+ deps.exit(1);
57
+ }
58
+ const records = manifest.records;
59
+ if (!Array.isArray(records) || records.length === 0) {
60
+ deps.stderrWrite('[Sela] INFO: Manifest has no records — running full suite.\n');
61
+ return;
62
+ }
63
+ const files = [...new Set(records.map(r => r.sourceFile).filter(Boolean))];
64
+ const titles = [...new Set(records.map(r => r.testTitle).filter(Boolean))];
65
+ const existingGrep = extractGrep(deps.argv);
66
+ const grepPattern = buildGrepPattern(existingGrep, titles.map(escapeRegex));
67
+ deps.argv.push(...files, '--grep', grepPattern);
68
+ }
@@ -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;AAqOzE,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
@@ -169,23 +170,43 @@ function loadRawConfig(configPath) {
169
170
  }
170
171
  // Every attempt failed. Two cases:
171
172
  //
172
- // 1. The only candidate was a .ts file and the error looks like a missing
173
- // TypeScript loader (e.g. "Cannot find module" for a .ts import, or
174
- // "Unknown file extension .ts"). The CLI runs in plain Node.js no tsx/
175
- // ts-node so the config simply cannot be loaded here. Gracefully fall
176
- // back to defaults rather than crashing a CLI command that doesn't need
177
- // the config (e.g. `sela shadow-regression`).
173
+ // 1. The config cannot be loaded due to a missing or incompatible TypeScript
174
+ // loader. This covers several scenarios that all stem from the same root
175
+ // cause the Node.js process has no way to execute .ts (or compiled ESM
176
+ // .js) in the current environment:
177
+ // ERR_UNKNOWN_FILE_EXTENSION / "Unknown file extension .ts" plain
178
+ // Node.js sees the .ts extension with no registered loader.
179
+ // • "Cannot use import statement outside a module" — the config (or its
180
+ // compiled .js sibling) uses ESM `import` syntax but Node.js is
181
+ // running in CJS mode and cannot load it with require(). Happens when
182
+ // a compiled sela.config.js uses top-level `import`, or when Node 20
183
+ // --experimental-strip-types strips .ts annotations but the project
184
+ // is CJS.
185
+ // • ERR_REQUIRE_ESM / "require() of ES Module" — Node.js detected the
186
+ // file is an ES module and refused the synchronous require() call.
187
+ // All of these are environment/loader mismatches, not config content bugs.
188
+ // Gracefully fall back to defaults so the CLI command (e.g.
189
+ // `sela shadow-regression`) still runs rather than crashing.
178
190
  //
179
191
  // 2. Genuine config error (syntax, key validation, etc.) → hard throw so CI
180
192
  // surfaces the problem instead of silently running on stale defaults.
181
193
  const msg = lastError?.message ?? "";
182
- const isNoTsLoader = configPath.endsWith(".ts") &&
183
- (msg.includes("Cannot find module") ||
194
+ const code = lastError?.code ?? "";
195
+ const isLoaderEnvError = configPath.endsWith(".ts") &&
196
+ (code === "ERR_UNKNOWN_FILE_EXTENSION" ||
197
+ code === "ERR_REQUIRE_ESM" ||
198
+ msg.includes("Cannot find module") ||
184
199
  msg.includes("Unknown file extension") ||
185
- msg.includes("ERR_UNKNOWN_FILE_EXTENSION"));
186
- if (isNoTsLoader) {
187
- logger_1.logger.warn(`[Sela] sela.config.ts found but no TypeScript loader is active — running on defaults. ` +
188
- `If you need config values in the CLI, add a compiled sela.config.js alongside it.`);
200
+ msg.includes("ERR_UNKNOWN_FILE_EXTENSION") ||
201
+ msg.includes("Cannot use import statement outside a module") ||
202
+ msg.includes("require() of ES Module") ||
203
+ msg.includes("ERR_REQUIRE_ESM"));
204
+ if (isLoaderEnvError) {
205
+ logger_1.logger.warn(`[Sela] sela.config.ts found but cannot be loaded in this Node.js context ` +
206
+ `(no TypeScript loader active, or the compiled .js output uses ESM syntax ` +
207
+ `incompatible with require()). Running on defaults. ` +
208
+ `To use config values in the CLI, compile sela.config.ts to CJS ` +
209
+ `(e.g. tsc --module commonjs) or set SELA_CONFIG_PATH to the compiled file.`);
189
210
  return {};
190
211
  }
191
212
  throw new Error(`[Sela] Failed to load ${path.basename(configPath)}: ${msg || "unknown error"}. ` +
@@ -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;IAkmClB,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"}