sela-core 0.1.0-alpha.46 → 0.1.0-alpha.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/ConfigLoader.d.ts +3 -4
- package/dist/config/ConfigLoader.d.ts.map +1 -1
- package/dist/config/ConfigLoader.js +35 -30
- package/dist/config/HealingGovernance.d.ts.map +1 -1
- package/dist/config/HealingGovernance.js +46 -7
- package/dist/config/SelaConfig.d.ts +0 -28
- package/dist/config/SelaConfig.d.ts.map +1 -1
- package/dist/config/SelaConfig.js +0 -4
- package/dist/engine/HealingRegistry.d.ts +8 -2
- package/dist/engine/HealingRegistry.d.ts.map +1 -1
- package/dist/engine/HealingRegistry.js +20 -7
- package/dist/engine/SelaEngine.d.ts.map +1 -1
- package/dist/engine/SelaEngine.js +34 -60
- package/dist/engine/lifecycle/SelaLifecycleStateManager.d.ts +10 -0
- package/dist/engine/lifecycle/SelaLifecycleStateManager.d.ts.map +1 -1
- package/dist/engine/lifecycle/SelaLifecycleStateManager.js +26 -8
- package/dist/errors/FailureClassifier.d.ts.map +1 -1
- package/dist/errors/FailureClassifier.js +46 -10
- package/dist/errors/SelectorForensics.d.ts +13 -2
- package/dist/errors/SelectorForensics.d.ts.map +1 -1
- package/dist/errors/SelectorForensics.js +33 -3
- package/dist/fixtures/expectProxy.d.ts.map +1 -1
- package/dist/fixtures/expectProxy.js +19 -5
- package/dist/fixtures/index.d.ts +15 -0
- package/dist/fixtures/index.d.ts.map +1 -1
- package/dist/fixtures/index.js +157 -70
- package/dist/forensics/SelectorForensics.d.ts +3 -0
- package/dist/forensics/SelectorForensics.d.ts.map +1 -0
- package/dist/forensics/SelectorForensics.js +25 -0
- package/dist/heuristics/AnnotationScanner.d.ts +26 -0
- package/dist/heuristics/AnnotationScanner.d.ts.map +1 -0
- package/dist/heuristics/AnnotationScanner.js +180 -0
- package/dist/heuristics/VetoEngine.d.ts +64 -0
- package/dist/heuristics/VetoEngine.d.ts.map +1 -0
- package/dist/heuristics/VetoEngine.js +132 -0
- package/dist/reporter/SelaReporter.d.ts +4 -50
- package/dist/reporter/SelaReporter.d.ts.map +1 -1
- package/dist/reporter/SelaReporter.js +38 -262
- package/dist/services/ASTSourceUpdater.d.ts +7 -0
- package/dist/services/ASTSourceUpdater.d.ts.map +1 -1
- package/dist/services/ASTSourceUpdater.js +43 -93
- package/dist/services/AggregatorCRDT.d.ts +57 -0
- package/dist/services/AggregatorCRDT.d.ts.map +1 -0
- package/dist/services/AggregatorCRDT.js +0 -0
- package/dist/services/AnchorResolver.d.ts +10 -0
- package/dist/services/AnchorResolver.d.ts.map +1 -1
- package/dist/services/AnchorResolver.js +22 -7
- package/dist/services/ArtifactAggregator.d.ts.map +1 -1
- package/dist/services/ArtifactAggregator.js +11 -0
- package/dist/services/ArtifactNaming.d.ts +0 -31
- package/dist/services/ArtifactNaming.d.ts.map +1 -1
- package/dist/services/ArtifactNaming.js +0 -55
- package/dist/services/AtomicChainMutator.d.ts +73 -0
- package/dist/services/AtomicChainMutator.d.ts.map +1 -0
- package/dist/services/AtomicChainMutator.js +205 -0
- package/dist/services/DnaSyncService.d.ts.map +1 -1
- package/dist/services/DnaSyncService.js +46 -11
- package/dist/services/HealBudget.d.ts.map +1 -1
- package/dist/services/HealBudget.js +15 -1
- package/dist/services/HealCircuitBreaker.d.ts.map +1 -1
- package/dist/services/HealCircuitBreaker.js +16 -2
- package/dist/services/HealingCacheService.d.ts.map +1 -1
- package/dist/services/HealingCacheService.js +17 -2
- package/dist/services/LedgerAnchor.js +1 -1
- package/dist/services/MutationApplier.d.ts.map +1 -1
- package/dist/services/MutationApplier.js +26 -13
- package/dist/services/PRAutomationService.d.ts.map +1 -1
- package/dist/services/PRAutomationService.js +27 -9
- package/dist/services/ReportMergeService.d.ts.map +1 -1
- package/dist/services/ReportMergeService.js +25 -12
- package/dist/services/SafetyGuard.d.ts +1 -0
- package/dist/services/SafetyGuard.d.ts.map +1 -1
- package/dist/services/SafetyGuard.js +29 -0
- package/dist/services/SessionContext.d.ts +53 -0
- package/dist/services/SessionContext.d.ts.map +1 -0
- package/dist/services/SessionContext.js +147 -0
- package/dist/services/TestDeadline.d.ts +0 -1
- package/dist/services/TestDeadline.d.ts.map +1 -1
- package/dist/services/TestDeadline.js +11 -2
- package/dist/services/TraceBackEngine.d.ts +1 -1
- package/dist/services/TraceBackEngine.d.ts.map +1 -1
- package/dist/services/TraceBackEngine.js +78 -34
- package/dist/services/vcs/VCSProviderFactory.js +3 -3
- package/dist/utils/SourceNormalizer.d.ts +67 -0
- package/dist/utils/SourceNormalizer.d.ts.map +1 -0
- package/dist/utils/SourceNormalizer.js +125 -0
- package/package.json +33 -1
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { SelaConfig, ResolvedConfig } from "./SelaConfig";
|
|
2
2
|
export declare class ConfigLoader {
|
|
3
|
-
private static
|
|
4
|
-
private static
|
|
5
|
-
private static rawUserConfig;
|
|
3
|
+
private static readonly SESSION_SLOT;
|
|
4
|
+
private static cache;
|
|
6
5
|
/**
|
|
7
6
|
* Returns the fully resolved config. First call does all I/O; subsequent
|
|
8
7
|
* calls return the cached result at zero cost.
|
|
@@ -22,7 +21,7 @@ export declare class ConfigLoader {
|
|
|
22
21
|
private static logEnvBanners;
|
|
23
22
|
/** Returns the detected Git branch name, or null if detection failed. */
|
|
24
23
|
static getBranch(): string | null;
|
|
25
|
-
/** Clears the
|
|
24
|
+
/** Clears the session's config cache - useful for testing. */
|
|
26
25
|
static reset(): void;
|
|
27
26
|
}
|
|
28
27
|
//# sourceMappingURL=ConfigLoader.d.ts.map
|
|
@@ -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;
|
|
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;AA2SzE,qBAAa,YAAY;IAMvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAA0C;IAE9E,OAAO,CAAC,MAAM,CAAC,KAAK;IAQpB;;;;;;;;OAQG;IACH,MAAM,CAAC,WAAW,IAAI,cAAc;IAsCpC;;;;OAIG;IACH,MAAM,CAAC,YAAY,IAAI,UAAU;IAKjC,OAAO,CAAC,MAAM,CAAC,aAAa;IAsB5B,yEAAyE;IACzE,MAAM,CAAC,SAAS,IAAI,MAAM,GAAG,IAAI;IAKjC,8DAA8D;IAC9D,MAAM,CAAC,KAAK,IAAI,IAAI;CAMrB"}
|
|
@@ -43,6 +43,7 @@ const path = __importStar(require("path"));
|
|
|
43
43
|
const child_process_1 = require("child_process");
|
|
44
44
|
const SelaConfig_1 = require("./SelaConfig");
|
|
45
45
|
const logger_1 = require("../utils/logger");
|
|
46
|
+
const SessionContext_1 = require("../services/SessionContext");
|
|
46
47
|
// All public top-level keys of SelaConfig — used to catch typos at load time.
|
|
47
48
|
const KNOWN_CONFIG_KEYS = new Set([
|
|
48
49
|
"healingPolicy",
|
|
@@ -63,7 +64,6 @@ const KNOWN_CONFIG_KEYS = new Set([
|
|
|
63
64
|
"branchOverrides",
|
|
64
65
|
"llm",
|
|
65
66
|
"healing",
|
|
66
|
-
"reporting",
|
|
67
67
|
]);
|
|
68
68
|
// ─────────────────────────────────────────────────────────────────
|
|
69
69
|
// FILE DISCOVERY
|
|
@@ -277,17 +277,20 @@ function deepMerge(base, override) {
|
|
|
277
277
|
}
|
|
278
278
|
return result;
|
|
279
279
|
}
|
|
280
|
-
// ─────────────────────────────────────────────────────────────────
|
|
281
|
-
// SINGLETON LOADER
|
|
282
|
-
// ─────────────────────────────────────────────────────────────────
|
|
283
280
|
class ConfigLoader {
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
//
|
|
287
|
-
//
|
|
288
|
-
// the
|
|
289
|
-
|
|
290
|
-
static
|
|
281
|
+
// Session-scoped resolution cache. Under a plain worker (no `runInSession`)
|
|
282
|
+
// this is the process-default session's single bundle — identical to the
|
|
283
|
+
// historical process-lifetime singleton. Under Chronos, each session resolves
|
|
284
|
+
// config against its OWN cwd/branch without a second session's resolution
|
|
285
|
+
// clobbering the first's cached bundle.
|
|
286
|
+
static SESSION_SLOT = Symbol.for("sela.session.configCache");
|
|
287
|
+
static cache() {
|
|
288
|
+
return (0, SessionContext_1.sessionSlot)(ConfigLoader.SESSION_SLOT, () => ({
|
|
289
|
+
resolved: null,
|
|
290
|
+
branch: null,
|
|
291
|
+
rawUserConfig: null,
|
|
292
|
+
}));
|
|
293
|
+
}
|
|
291
294
|
/**
|
|
292
295
|
* Returns the fully resolved config. First call does all I/O; subsequent
|
|
293
296
|
* calls return the cached result at zero cost.
|
|
@@ -298,19 +301,20 @@ class ConfigLoader {
|
|
|
298
301
|
* - `SELA_DRY_RUN` / `SELA_NO_CACHE` contain an unrecognised value.
|
|
299
302
|
*/
|
|
300
303
|
static getInstance() {
|
|
301
|
-
|
|
302
|
-
|
|
304
|
+
const cache = ConfigLoader.cache();
|
|
305
|
+
if (cache.resolved)
|
|
306
|
+
return cache.resolved;
|
|
303
307
|
const configPath = findConfigFile(process.cwd());
|
|
304
308
|
if (!configPath) {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
ConfigLoader.logEnvBanners(
|
|
308
|
-
return
|
|
309
|
+
cache.rawUserConfig = {};
|
|
310
|
+
cache.resolved = (0, SelaConfig_1.resolveConfig)({});
|
|
311
|
+
ConfigLoader.logEnvBanners(cache.resolved);
|
|
312
|
+
return cache.resolved;
|
|
309
313
|
}
|
|
310
314
|
logger_1.logger.debug(`Loaded config from: ${path.relative(process.cwd(), configPath)}`);
|
|
311
315
|
let rawConfig = loadRawConfig(configPath);
|
|
312
316
|
const detectedBranch = getCurrentBranch();
|
|
313
|
-
|
|
317
|
+
cache.branch = detectedBranch;
|
|
314
318
|
if (rawConfig.branchOverrides && detectedBranch) {
|
|
315
319
|
const override = rawConfig.branchOverrides[detectedBranch];
|
|
316
320
|
if (override) {
|
|
@@ -318,10 +322,10 @@ class ConfigLoader {
|
|
|
318
322
|
rawConfig = deepMerge(rawConfig, override);
|
|
319
323
|
}
|
|
320
324
|
}
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
ConfigLoader.logEnvBanners(
|
|
324
|
-
return
|
|
325
|
+
cache.rawUserConfig = rawConfig;
|
|
326
|
+
cache.resolved = (0, SelaConfig_1.resolveConfig)(rawConfig);
|
|
327
|
+
ConfigLoader.logEnvBanners(cache.resolved);
|
|
328
|
+
return cache.resolved;
|
|
325
329
|
}
|
|
326
330
|
/**
|
|
327
331
|
* Returns the raw, pre-resolution user config (after branch-override merge).
|
|
@@ -329,9 +333,9 @@ class ConfigLoader {
|
|
|
329
333
|
* for normal reads use {@link getInstance} (resolved + defaulted).
|
|
330
334
|
*/
|
|
331
335
|
static getRawConfig() {
|
|
332
|
-
if (!ConfigLoader.resolved)
|
|
336
|
+
if (!ConfigLoader.cache().resolved)
|
|
333
337
|
ConfigLoader.getInstance();
|
|
334
|
-
return ConfigLoader.rawUserConfig ?? {};
|
|
338
|
+
return ConfigLoader.cache().rawUserConfig ?? {};
|
|
335
339
|
}
|
|
336
340
|
static logEnvBanners(resolved) {
|
|
337
341
|
if (resolved.bypass) {
|
|
@@ -350,15 +354,16 @@ class ConfigLoader {
|
|
|
350
354
|
}
|
|
351
355
|
/** Returns the detected Git branch name, or null if detection failed. */
|
|
352
356
|
static getBranch() {
|
|
353
|
-
if (!ConfigLoader.resolved)
|
|
357
|
+
if (!ConfigLoader.cache().resolved)
|
|
354
358
|
ConfigLoader.getInstance();
|
|
355
|
-
return ConfigLoader.branch;
|
|
359
|
+
return ConfigLoader.cache().branch;
|
|
356
360
|
}
|
|
357
|
-
/** Clears the
|
|
361
|
+
/** Clears the session's config cache - useful for testing. */
|
|
358
362
|
static reset() {
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
363
|
+
const cache = ConfigLoader.cache();
|
|
364
|
+
cache.resolved = null;
|
|
365
|
+
cache.branch = null;
|
|
366
|
+
cache.rawUserConfig = null;
|
|
362
367
|
}
|
|
363
368
|
}
|
|
364
369
|
exports.ConfigLoader = ConfigLoader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HealingGovernance.d.ts","sourceRoot":"","sources":["../../src/config/HealingGovernance.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"HealingGovernance.d.ts","sourceRoot":"","sources":["../../src/config/HealingGovernance.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG1D,MAAM,MAAM,kBAAkB,GAC1B,qBAAqB,GACrB,0BAA0B,GAC1B,+BAA+B,GAC/B,gCAAgC,GAChC,uBAAuB,CAAC;AAE5B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAsCD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwC;IACxE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsC;gBAEpD,GAAG,EAAE,qBAAqB,EAAE,GAAG,GAAE,MAAsB;IA8BnE,cAAc,IAAI,OAAO;IAIzB,yDAAyD;IACzD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAUzC,2EAA2E;IAC3E,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAoCrD,oFAAoF;IACpF,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAanE,gFAAgF;IAChF,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,GAAG,IAAI;CAyB1D;AAWD,wBAAgB,gBAAgB,IAAI,iBAAiB,GAAG,IAAI,CAQ3D;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -55,10 +55,37 @@ const path = __importStar(require("path"));
|
|
|
55
55
|
const minimatch_1 = require("minimatch");
|
|
56
56
|
const ConfigLoader_1 = require("./ConfigLoader");
|
|
57
57
|
const PathScopeGuard_1 = require("./PathScopeGuard");
|
|
58
|
+
const logger_1 = require("../utils/logger");
|
|
58
59
|
const REGEX_LITERAL = /^\/(.+)\/$/;
|
|
59
60
|
function escapeRegExp(s) {
|
|
60
61
|
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
61
62
|
}
|
|
63
|
+
function sanitizeStringArray(value) {
|
|
64
|
+
return Array.isArray(value)
|
|
65
|
+
? value.filter((v) => typeof v === "string")
|
|
66
|
+
: [];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Defense-in-depth (CLAUDE.md Zero-Crash Policy): production always feeds
|
|
70
|
+
* this class a `resolveHealing()`-validated config, but the class is also
|
|
71
|
+
* constructed directly (tests, future call sites) — a missing/malformed
|
|
72
|
+
* field here must degrade gracefully, never crash the constructor. A single
|
|
73
|
+
* bad field crashing construction would otherwise take out ALL governance
|
|
74
|
+
* for that instance (see `sharedGovernance()`'s catch-to-null below), not
|
|
75
|
+
* just the one bad entry.
|
|
76
|
+
*/
|
|
77
|
+
function sanitizeHealingConfig(cfg) {
|
|
78
|
+
const c = (cfg ?? {});
|
|
79
|
+
return {
|
|
80
|
+
enabled: c.enabled ?? true,
|
|
81
|
+
exclude: sanitizeStringArray(c.exclude),
|
|
82
|
+
protectedSelectors: sanitizeStringArray(c.protectedSelectors),
|
|
83
|
+
protectedAttributes: sanitizeStringArray(c.protectedAttributes),
|
|
84
|
+
triggers: c.triggers ?? { interactionBlocked: "refuse" },
|
|
85
|
+
criticality: c.criticality ?? {},
|
|
86
|
+
annotations: c.annotations ?? true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
62
89
|
class HealingGovernance {
|
|
63
90
|
cfg;
|
|
64
91
|
cwd;
|
|
@@ -66,16 +93,25 @@ class HealingGovernance {
|
|
|
66
93
|
selectorRegexes;
|
|
67
94
|
attrLocks;
|
|
68
95
|
constructor(cfg, cwd = process.cwd()) {
|
|
69
|
-
this.cfg = cfg;
|
|
96
|
+
this.cfg = sanitizeHealingConfig(cfg);
|
|
70
97
|
this.cwd = cwd;
|
|
71
|
-
this.exactSelectors = new Set(cfg.protectedSelectors.filter((s) => !REGEX_LITERAL.test(s)));
|
|
72
|
-
this.selectorRegexes = cfg.protectedSelectors
|
|
98
|
+
this.exactSelectors = new Set(this.cfg.protectedSelectors.filter((s) => !REGEX_LITERAL.test(s)));
|
|
99
|
+
this.selectorRegexes = this.cfg.protectedSelectors
|
|
73
100
|
.map((s) => REGEX_LITERAL.exec(s))
|
|
74
101
|
.filter((m) => m !== null)
|
|
75
|
-
.map((m) =>
|
|
102
|
+
.map((m) => {
|
|
103
|
+
try {
|
|
104
|
+
return { source: m[0], re: new RegExp(m[1]) };
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
logger_1.logger.warn(`[Sela Warning]: Skipping gracefully — invalid protectedSelectors regex literal ${m[0]} (${e instanceof Error ? e.message : String(e)})`);
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
})
|
|
111
|
+
.filter((entry) => entry !== null);
|
|
76
112
|
// Matches `[attr=`, `[attr~=`, `[attr^=` … — the CSS attribute anchor
|
|
77
113
|
// forms, including the getByTestId → [data-testid="…"] fixture mapping.
|
|
78
|
-
this.attrLocks = cfg.protectedAttributes.map((attr) => ({
|
|
114
|
+
this.attrLocks = this.cfg.protectedAttributes.map((attr) => ({
|
|
79
115
|
attr,
|
|
80
116
|
re: new RegExp(`\\[\\s*${escapeRegExp(attr)}\\s*[*^$~|]?=`, "i"),
|
|
81
117
|
}));
|
|
@@ -144,7 +180,10 @@ class HealingGovernance {
|
|
|
144
180
|
testOptedOut(info) {
|
|
145
181
|
if (!this.cfg.annotations)
|
|
146
182
|
return null;
|
|
147
|
-
const
|
|
183
|
+
const safeInfo = info ?? {};
|
|
184
|
+
const annotations = Array.isArray(safeInfo.annotations) ? safeInfo.annotations : [];
|
|
185
|
+
const tags = Array.isArray(safeInfo.tags) ? safeInfo.tags : [];
|
|
186
|
+
const annotated = annotations.some((a) => a?.type === "sela" &&
|
|
148
187
|
typeof a.description === "string" &&
|
|
149
188
|
/\bno-?heal\b/i.test(a.description));
|
|
150
189
|
if (annotated) {
|
|
@@ -153,7 +192,7 @@ class HealingGovernance {
|
|
|
153
192
|
reason: "test carries annotation { type: 'sela', description: 'no-heal' }",
|
|
154
193
|
};
|
|
155
194
|
}
|
|
156
|
-
if (
|
|
195
|
+
if (tags.includes("@sela-no-heal")) {
|
|
157
196
|
return {
|
|
158
197
|
kind: "GOVERNANCE_ANNOTATION",
|
|
159
198
|
reason: "test is tagged @sela-no-heal",
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type ReportMode } from "../services/ArtifactNaming";
|
|
2
1
|
export type PRStrategy = "directCommit" | "pr" | "draftPR" | "readOnly";
|
|
3
2
|
export type BugAction = "failCI" | "createIssue" | "labelOnly";
|
|
4
3
|
export interface SelaPRAutomationConfig {
|
|
@@ -155,27 +154,9 @@ export interface SelaHealingConfig {
|
|
|
155
154
|
/** Honor `@sela-no-heal` tags / `{ type:'sela' }` annotations. Default true. */
|
|
156
155
|
annotations?: boolean;
|
|
157
156
|
}
|
|
158
|
-
/**
|
|
159
|
-
* Two-Phase Reporting (RFC: docs/rfc-two-phase-reporting.md).
|
|
160
|
-
* Controls WHEN the HTML report + git/PR flow execute.
|
|
161
|
-
*/
|
|
162
|
-
export interface SelaReportingConfig {
|
|
163
|
-
/**
|
|
164
|
-
* - 'auto' (default): local runs and single-machine CI stay eager
|
|
165
|
-
* (report + PR flow in the reporter's onEnd); CI runs with a shard
|
|
166
|
-
* signal (`--shard=N/M` or `SELA_SHARD_ID`) defer to the fan-in job.
|
|
167
|
-
* - 'eager': always finalize in onEnd (legacy behavior).
|
|
168
|
-
* - 'deferred': onEnd only emits raw JSON artifacts under `.sela/artifacts/`;
|
|
169
|
-
* `sela report generate` + `sela pr generate` own the fan-in.
|
|
170
|
-
* Env `SELA_REPORT_MODE` overrides this value.
|
|
171
|
-
*/
|
|
172
|
-
mode?: ReportMode;
|
|
173
|
-
}
|
|
174
157
|
export interface SelaConfig {
|
|
175
158
|
/** Shorthand preset that expands to concrete threshold values. */
|
|
176
159
|
healingPolicy?: "conservative" | "balanced" | "aggressive";
|
|
177
|
-
/** Two-phase reporting mode (Allure pattern). Default: { mode: 'auto' }. */
|
|
178
|
-
reporting?: SelaReportingConfig;
|
|
179
160
|
/** Fine-grained threshold overrides. Explicit values always win over preset expansion. */
|
|
180
161
|
thresholds?: {
|
|
181
162
|
/** Minimum AI confidence to attempt a heal. Default: 85. Maps to CONFIDENCE_HARD_STOP. */
|
|
@@ -402,17 +383,8 @@ export interface ResolvedPlaywrightRules {
|
|
|
402
383
|
testIdAttribute: string;
|
|
403
384
|
preferGetByRoleOverCss: boolean;
|
|
404
385
|
}
|
|
405
|
-
export interface ResolvedReporting {
|
|
406
|
-
/**
|
|
407
|
-
* The CONFIGURED mode after the `SELA_REPORT_MODE` env override. `auto` is
|
|
408
|
-
* collapsed into eager/deferred at the reporter layer, where the Playwright
|
|
409
|
-
* shard signal is known (see ArtifactNaming.resolveEffectiveReportMode).
|
|
410
|
-
*/
|
|
411
|
-
mode: ReportMode;
|
|
412
|
-
}
|
|
413
386
|
export interface ResolvedConfig {
|
|
414
387
|
thresholds: ResolvedThresholds;
|
|
415
|
-
reporting: ResolvedReporting;
|
|
416
388
|
updateStrategy: "inPlace" | "commentOnly" | "branch";
|
|
417
389
|
autoCommit: boolean;
|
|
418
390
|
dnaStoragePath: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelaConfig.d.ts","sourceRoot":"","sources":["../../src/config/SelaConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SelaConfig.d.ts","sourceRoot":"","sources":["../../src/config/SelaConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,6 @@ exports.resolveLargeDomNodeThreshold = resolveLargeDomNodeThreshold;
|
|
|
10
10
|
exports.resolveTiming = resolveTiming;
|
|
11
11
|
exports.resolveHealing = resolveHealing;
|
|
12
12
|
exports.resolveConfig = resolveConfig;
|
|
13
|
-
const ArtifactNaming_1 = require("../services/ArtifactNaming");
|
|
14
13
|
const PRESET_MAP = {
|
|
15
14
|
conservative: {
|
|
16
15
|
minHealerConfidence: 92,
|
|
@@ -317,9 +316,6 @@ function resolveConfig(config, env = process.env) {
|
|
|
317
316
|
const largeDomNodeThreshold = resolveLargeDomNodeThreshold(config.largeDomNodeThreshold);
|
|
318
317
|
return {
|
|
319
318
|
thresholds: resolveThresholds(config),
|
|
320
|
-
reporting: {
|
|
321
|
-
mode: (0, ArtifactNaming_1.resolveConfiguredReportMode)(config.reporting?.mode, env),
|
|
322
|
-
},
|
|
323
319
|
updateStrategy: config.updateStrategy ?? "inPlace",
|
|
324
320
|
autoCommit,
|
|
325
321
|
dnaStoragePath: config.dnaStoragePath ?? ".sela/snapshots",
|
|
@@ -6,7 +6,13 @@ export interface SelectorContext {
|
|
|
6
6
|
parentChain?: string[];
|
|
7
7
|
}
|
|
8
8
|
export declare class HealingRegistry {
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Session-scoped slot key. `getInstance()` resolves the registry from the
|
|
11
|
+
* ACTIVE session (process-default when no `runInSession` is active), so a
|
|
12
|
+
* heal broadcast in one Chronos session never reaches a concurrent session's
|
|
13
|
+
* listeners or overwrites its call-site map.
|
|
14
|
+
*/
|
|
15
|
+
private static readonly SESSION_SLOT;
|
|
10
16
|
private readonly listeners;
|
|
11
17
|
/**
|
|
12
18
|
* Two-level store:
|
|
@@ -19,7 +25,7 @@ export declare class HealingRegistry {
|
|
|
19
25
|
private readonly healMap;
|
|
20
26
|
private constructor();
|
|
21
27
|
static getInstance(): HealingRegistry;
|
|
22
|
-
static fingerprint(ctx: SelectorContext): string;
|
|
28
|
+
static fingerprint(ctx: SelectorContext | null | undefined): string;
|
|
23
29
|
broadcast(ctx: SelectorContext, oldSelector: string, newSelector: string): void;
|
|
24
30
|
broadcastCascade(ctx: SelectorContext, pairs: Array<{
|
|
25
31
|
oldSelector: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HealingRegistry.d.ts","sourceRoot":"","sources":["../../src/engine/HealingRegistry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HealingRegistry.d.ts","sourceRoot":"","sources":["../../src/engine/HealingRegistry.ts"],"names":[],"mappings":"AAMA,KAAK,YAAY,GAAG,CAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;AAEV,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,eAAe;IAC1B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAElC;IAEF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IAErD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0C;IAElE,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,eAAe;IASrC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM;IAmBnE,SAAS,CACP,GAAG,EAAE,eAAe,EACpB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,IAAI;IAqBP,gBAAgB,CACd,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,GACzD,IAAI;IAMP;;;;;;;OAOG;IACH,IAAI,CACF,OAAO,EAAE,KAAK,CAAC;QACb,GAAG,EAAE,eAAe,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,GACD,IAAI;IAcP,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,IAAI;IAK7C;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,MAAM;IAYhE,OAAO,CAAC,SAAS;IAWjB,YAAY,IAAI,IAAI;IAMpB,QAAQ,IAAI,IAAI;CAIjB"}
|
|
@@ -4,8 +4,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.HealingRegistry = void 0;
|
|
5
5
|
const crypto_1 = require("crypto");
|
|
6
6
|
const logger_1 = require("../utils/logger");
|
|
7
|
+
const SessionContext_1 = require("../services/SessionContext");
|
|
7
8
|
class HealingRegistry {
|
|
8
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Session-scoped slot key. `getInstance()` resolves the registry from the
|
|
11
|
+
* ACTIVE session (process-default when no `runInSession` is active), so a
|
|
12
|
+
* heal broadcast in one Chronos session never reaches a concurrent session's
|
|
13
|
+
* listeners or overwrites its call-site map.
|
|
14
|
+
*/
|
|
15
|
+
static SESSION_SLOT = Symbol.for("sela.session.healingRegistry");
|
|
9
16
|
listeners = new Set();
|
|
10
17
|
/**
|
|
11
18
|
* Two-level store:
|
|
@@ -18,16 +25,22 @@ class HealingRegistry {
|
|
|
18
25
|
healMap = new Map();
|
|
19
26
|
constructor() { }
|
|
20
27
|
static getInstance() {
|
|
21
|
-
|
|
22
|
-
HealingRegistry.instance = new HealingRegistry();
|
|
23
|
-
}
|
|
24
|
-
return HealingRegistry.instance;
|
|
28
|
+
return (0, SessionContext_1.sessionSlot)(HealingRegistry.SESSION_SLOT, () => new HealingRegistry());
|
|
25
29
|
}
|
|
26
30
|
// ── Fingerprint generation ───────────────────────────────────
|
|
27
31
|
static fingerprint(ctx) {
|
|
28
|
-
|
|
32
|
+
// Single shared funnel: broadcast/broadcastCascade/seed/resolveSelector
|
|
33
|
+
// all call this method to derive their map key, so sanitizing HERE
|
|
34
|
+
// (rather than at each call site) closes totality for all four at once.
|
|
35
|
+
// A malformed ctx (null/undefined, or a parentChain that isn't actually
|
|
36
|
+
// an array — e.g. a corrupted/version-skewed ledger record) must never
|
|
37
|
+
// crash the host suite (CLAUDE.md Zero-Crash / Safe Backoff).
|
|
38
|
+
const safeCtx = ctx ?? {};
|
|
39
|
+
const chain = Array.isArray(safeCtx.parentChain)
|
|
40
|
+
? safeCtx.parentChain.join("||")
|
|
41
|
+
: "";
|
|
29
42
|
return (0, crypto_1.createHash)("sha1")
|
|
30
|
-
.update(`${
|
|
43
|
+
.update(`${safeCtx.filePath}:${safeCtx.line}:${chain}`)
|
|
31
44
|
.digest("hex")
|
|
32
45
|
.slice(0, 16);
|
|
33
46
|
}
|
|
@@ -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;AAsBxC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAgBjF,OAAO,EAAe,QAAQ,EAAkB,MAAM,yBAAyB,CAAC;AA+HhF,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;IAMzD,OAAO,CAAC,yBAAyB,CAA6C;IAK9E,OAAO,CAAC,qBAAqB,CAAkC;IAI/D,OAAO,CAAC,iBAAiB,CAAmC;IAM5D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IAMzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGxB;;IAkDE,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;IAqEzB;;;;;OAKG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAQlC;;;;;;OAMG;YACW,sBAAsB;IA4CpC;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB,CAAkC;IAE5D,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI;IAInD;;;;;;;OAOG;IACH,2BAA2B,CAAC,KAAK,EAAE;QACjC,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,qEAAqE;QACrE,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kEAAkE;QAClE,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,IAAI;IAkCR;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAsCxB,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,EAC7B,cAAc,CAAC,EAAE,MAAM,EAKvB,eAAe,CAAC,EAAE;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE,EAG7C,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"SelaEngine.d.ts","sourceRoot":"","sources":["../../src/engine/SelaEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -66,7 +66,6 @@ const HealBudget_1 = require("../services/HealBudget");
|
|
|
66
66
|
const HealCircuitBreaker_1 = require("../services/HealCircuitBreaker");
|
|
67
67
|
const HealReportService_1 = require("../services/HealReportService");
|
|
68
68
|
const SharedLocatorGuard_1 = require("../services/SharedLocatorGuard");
|
|
69
|
-
const RegressionManifestService_1 = require("../services/RegressionManifestService");
|
|
70
69
|
const PendingPromptLedger_1 = require("../services/PendingPromptLedger");
|
|
71
70
|
const InboundArgumentGate_1 = require("../services/InboundArgumentGate");
|
|
72
71
|
const SelaError_1 = require("../errors/SelaError");
|
|
@@ -405,15 +404,20 @@ CRITICAL: Do NOT return a CSS selector like "#my-select". Return plain text only
|
|
|
405
404
|
// Surfaces WHY the call failed in the LLM prompt and the report.
|
|
406
405
|
failure) {
|
|
407
406
|
logger_1.logger.stage("HEALING", stableId);
|
|
408
|
-
// ── Shadow-regression gate (Job 2)
|
|
407
|
+
// ── Shadow-regression / global bypass gate (Job 2, F-7) ─────────
|
|
409
408
|
// In regression mode the engine NEVER heals. The fixture has already
|
|
410
409
|
// hot-swapped the manifest's proposed selector at pre-flight; if the call
|
|
411
410
|
// still failed, that is a genuine downstream side-effect and MUST surface.
|
|
411
|
+
// SELA_BYPASS mirrors this exact short-circuit (F-7 Global Dormancy):
|
|
412
|
+
// Sela must never touch the failure, so heal() returns "" before any
|
|
413
|
+
// LLM/AST/cache work regardless of any other config combination.
|
|
412
414
|
// Return "" → the caller throws the original error. Zero LLM, zero cache,
|
|
413
415
|
// zero disk — the "refuse to heal / absolute transparency" contract
|
|
414
416
|
// (CLAUDE.md §4 & §6).
|
|
415
|
-
if (this.config.regressionActive) {
|
|
416
|
-
logger_1.logger.debug(
|
|
417
|
+
if (this.config.regressionActive || this.config.bypass) {
|
|
418
|
+
logger_1.logger.debug(this.config.bypass
|
|
419
|
+
? "Bypass active — heal suppressed, failing naturally."
|
|
420
|
+
: "Shadow-regression active — heal suppressed, failing naturally.");
|
|
417
421
|
return "";
|
|
418
422
|
}
|
|
419
423
|
// ── Bypass selector cache ──────────────────────────────────────────────
|
|
@@ -1971,21 +1975,27 @@ Decision rule (overrides any typo/Levenshtein-distance heuristic):
|
|
|
1971
1975
|
this.snapshotService.remove(stableId);
|
|
1972
1976
|
}
|
|
1973
1977
|
async commitUpdates() {
|
|
1974
|
-
// ── Shadow-regression
|
|
1978
|
+
// ── Shadow-regression / global bypass: ZERO write layers (Job 2, F-7) ──
|
|
1975
1979
|
// Golden rule #1 — no disk/git pollution during the regression phase.
|
|
1976
1980
|
// Skip every persistence side-effect (DNA snapshots, the insights report,
|
|
1977
1981
|
// the worker ledger, and the regression manifest itself). The run exists
|
|
1978
1982
|
// only to verify the injected selectors; the CLI merges results into the
|
|
1979
1983
|
// pristine base report afterward. Buffers are dropped so a long-lived
|
|
1980
1984
|
// worker process carries nothing into a later run.
|
|
1981
|
-
|
|
1985
|
+
// SELA_BYPASS (F-7 Global Dormancy) demands the same zero-write outcome —
|
|
1986
|
+
// "zero DNA operations" — as a defense-in-depth mirror of the fixture
|
|
1987
|
+
// layer already handing out native, unproxied objects (so these buffers
|
|
1988
|
+
// should already be empty; this clears them regardless of call path).
|
|
1989
|
+
if (this.config.regressionActive || this.config.bypass) {
|
|
1982
1990
|
this.dnaBuffer.clear();
|
|
1983
1991
|
this.healMetaBuffer.clear();
|
|
1984
1992
|
this.testTitleBuffer.clear();
|
|
1985
1993
|
this.aliasBuffer.clear();
|
|
1986
1994
|
HealReportService_1.sharedHealReport.clear();
|
|
1987
1995
|
WorkspaceSnapshotService_1.sharedWorkspaceSnapshot.clear();
|
|
1988
|
-
logger_1.logger.debug(
|
|
1996
|
+
logger_1.logger.debug(this.config.bypass
|
|
1997
|
+
? "Bypass: commitUpdates skipped (no disk writes, zero DNA ops)."
|
|
1998
|
+
: "Shadow-regression: commitUpdates skipped (no disk writes).");
|
|
1989
1999
|
return;
|
|
1990
2000
|
}
|
|
1991
2001
|
if (this.dnaBuffer.size > 0) {
|
|
@@ -2077,64 +2087,28 @@ Decision rule (overrides any typo/Levenshtein-distance heuristic):
|
|
|
2077
2087
|
}
|
|
2078
2088
|
// Ledger flushed — this worker's WAL intents are all durable now.
|
|
2079
2089
|
HealJournal_1.sharedHealJournal.clearOwn();
|
|
2080
|
-
// ──
|
|
2081
|
-
|
|
2090
|
+
// ── Phase 1 (two-phase pipeline) — emit the raw JSON artifact ONLY ──
|
|
2091
|
+
// End of run NEVER renders sela-report.html, NEVER writes the unified
|
|
2092
|
+
// shadow-regression manifest, and NEVER opens a PR. EVERY process —
|
|
2093
|
+
// worker AND single/main — writes only its namespaced raw report
|
|
2094
|
+
// artifact into <cwd>/.sela/artifacts/ (JSON, `.sela`-scoped). The HTML
|
|
2095
|
+
// report + unified manifest are produced exclusively by the explicit
|
|
2096
|
+
// `sela report generate` fan-in; the PR by `sela pr generate`.
|
|
2097
|
+
//
|
|
2098
|
+
// This is the single-writer invariant taken to its conclusion: since the
|
|
2099
|
+
// run phase never renders a shared file, concurrent workers (or shards on
|
|
2100
|
+
// separate machines) can never race a `sela-report.html` / `.json`.
|
|
2082
2101
|
const healedEvents = HealReportService_1.sharedHealReport.getHealedEvents();
|
|
2083
2102
|
const protectedEvents = HealReportService_1.sharedHealReport.getProtectedEvents();
|
|
2084
2103
|
if (HealReportService_1.sharedHealReport.hasContent()) {
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
// real CI runners execute `--workers=N` inside every shard. Workers
|
|
2090
|
-
// therefore ALWAYS write a private shard; the single main-process
|
|
2091
|
-
// reporter fans them in at onEnd (or `sela merge` across sharded
|
|
2092
|
-
// machines). Only a non-worker process may flush the shared files.
|
|
2093
|
-
const inWorkerProcess = process.env["TEST_WORKER_INDEX"] !== undefined;
|
|
2094
|
-
if (inWorkerProcess) {
|
|
2095
|
-
try {
|
|
2096
|
-
const shard = HealReportService_1.sharedHealReport.flushShard(process.cwd());
|
|
2097
|
-
if (shard) {
|
|
2098
|
-
logger_1.logger.debug(`Heal shard written: ${path.relative(process.cwd(), shard)}`);
|
|
2099
|
-
}
|
|
2100
|
-
}
|
|
2101
|
-
catch (err) {
|
|
2102
|
-
logger_1.logger.warn(`Failed to write heal shard: ${err.message}`);
|
|
2104
|
+
try {
|
|
2105
|
+
const shard = HealReportService_1.sharedHealReport.flushShard(process.cwd());
|
|
2106
|
+
if (shard) {
|
|
2107
|
+
logger_1.logger.debug(`Heal report artifact written: ${path.relative(process.cwd(), shard)}`);
|
|
2103
2108
|
}
|
|
2104
2109
|
}
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
logger_1.logger.stage("GENERATING REPORT");
|
|
2108
|
-
reportHtmlPath = HealReportService_1.sharedHealReport.flushToDisk(process.cwd());
|
|
2109
|
-
if (reportHtmlPath) {
|
|
2110
|
-
logger_1.logger.success(`Insights report written: ${path.relative(process.cwd(), reportHtmlPath)}`);
|
|
2111
|
-
logger_1.logger.info(" Open with: npx sela show-report");
|
|
2112
|
-
}
|
|
2113
|
-
}
|
|
2114
|
-
catch (err) {
|
|
2115
|
-
logger_1.logger.warn(`Failed to write insights report: ${err.message}`);
|
|
2116
|
-
}
|
|
2117
|
-
// ── Shadow-regression manifest (Job 1 → Job 2 handoff) ──────────
|
|
2118
|
-
// Emit alongside the report whenever blast-radius protection bypassed
|
|
2119
|
-
// a shared locator: the proposed in-memory heal that was NOT written to
|
|
2120
|
-
// disk now needs downstream verification. Never re-emit during a
|
|
2121
|
-
// regression run, and only on this CI / single-worker path (the same
|
|
2122
|
-
// condition that gates flushToDisk) so concurrent local workers do not
|
|
2123
|
-
// race-write the manifest.
|
|
2124
|
-
if (!this.config.regressionActive) {
|
|
2125
|
-
try {
|
|
2126
|
-
const records = RegressionManifestService_1.RegressionManifestService.buildRecords(HealReportService_1.sharedHealReport.getBypassedEvents());
|
|
2127
|
-
const manifestPath = RegressionManifestService_1.RegressionManifestService.writeManifest(path.join(process.cwd(), ".sela"), records);
|
|
2128
|
-
if (manifestPath) {
|
|
2129
|
-
logger_1.logger.info(` Shadow-regression manifest: ${path.relative(process.cwd(), manifestPath)} ` +
|
|
2130
|
-
`(${records.length} bypass${records.length !== 1 ? "es" : ""})`);
|
|
2131
|
-
logger_1.logger.info(" Verify with: npx sela shadow-regression --manifest sela-regression-manifest.json");
|
|
2132
|
-
}
|
|
2133
|
-
}
|
|
2134
|
-
catch (err) {
|
|
2135
|
-
logger_1.logger.warn(`Failed to write regression manifest: ${err.message}`);
|
|
2136
|
-
}
|
|
2137
|
-
}
|
|
2110
|
+
catch (err) {
|
|
2111
|
+
logger_1.logger.warn(`Failed to write heal report artifact: ${err.message}`);
|
|
2138
2112
|
}
|
|
2139
2113
|
}
|
|
2140
2114
|
// ── Cross-process worker ledger ──────────────────────────────────────
|
|
@@ -120,5 +120,15 @@ export declare class SelaLifecycleStateManager {
|
|
|
120
120
|
/** Read a no-heal lock only if it belongs to the CURRENT session. */
|
|
121
121
|
private liveLock;
|
|
122
122
|
private setState;
|
|
123
|
+
/**
|
|
124
|
+
* Defend against a malformed SelectorContext — a null/undefined ctx, or a
|
|
125
|
+
* `parentChain` that isn't actually an array — so a corrupted call-site
|
|
126
|
+
* shape can never crash the host suite (CLAUDE.md F-2 Zero-Crash Policy).
|
|
127
|
+
* Every ctx-consuming public method funnels through here (including the
|
|
128
|
+
* one that forwards ctx into `this.registry`) before it reaches
|
|
129
|
+
* `HealingRegistry.fingerprint`, which assumes a well-formed shape.
|
|
130
|
+
*/
|
|
131
|
+
private sanitizeCtx;
|
|
132
|
+
private fp;
|
|
123
133
|
}
|
|
124
134
|
//# sourceMappingURL=SelaLifecycleStateManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelaLifecycleStateManager.d.ts","sourceRoot":"","sources":["../../../src/engine/lifecycle/SelaLifecycleStateManager.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAOlE,oBAAY,aAAa;IACvB,iFAAiF;IACjF,IAAI,SAAS;IACb,0DAA0D;IAC1D,cAAc,mBAAmB;IACjC,iFAAiF;IACjF,gBAAgB,qBAAqB;IACrC,mEAAmE;IACnE,OAAO,YAAY;IACnB,+EAA+E;IAC/E,MAAM,WAAW;IACjB;;;;;OAKG;IACH,cAAc,mBAAmB;IACjC;;;;;OAKG;IACH,sBAAsB,2BAA2B;CAClD;AAED,oFAAoF;AACpF,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,kFAAkF;AAClF,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAYjC,2EAA2E;AAC3E,MAAM,WAAW,wBAAwB;IACvC,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAUD,qBAAa,yBAAyB;IAiBlC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAjB3B,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IACrE;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAE7D,OAAO,CAAC,OAAO,CAAsD;IACrE,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAK;IACrB,wEAAwE;IACxE,OAAO,CAAC,MAAM,CAAS;gBAGJ,MAAM,EAAE,wBAAwB,EAChC,QAAQ,EAAE,eAAe;IAG5C,OAAO,CAAC,MAAM,CAAC,WAAW;IAU1B,oEAAoE;IACpE,cAAc,IAAI,SAAS;IAI3B,6EAA6E;IAC7E,QAAQ,IAAI,OAAO;IAInB;;;;;OAKG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBlC;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO9B;;;;OAIG;IACH,OAAO,CACL,GAAG,EAAE,eAAe,EACpB,cAAc,EAAE,MAAM,GACrB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,CAAA;KAAE;
|
|
1
|
+
{"version":3,"file":"SelaLifecycleStateManager.d.ts","sourceRoot":"","sources":["../../../src/engine/lifecycle/SelaLifecycleStateManager.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAOlE,oBAAY,aAAa;IACvB,iFAAiF;IACjF,IAAI,SAAS;IACb,0DAA0D;IAC1D,cAAc,mBAAmB;IACjC,iFAAiF;IACjF,gBAAgB,qBAAqB;IACrC,mEAAmE;IACnE,OAAO,YAAY;IACnB,+EAA+E;IAC/E,MAAM,WAAW;IACjB;;;;;OAKG;IACH,cAAc,mBAAmB;IACjC;;;;;OAKG;IACH,sBAAsB,2BAA2B;CAClD;AAED,oFAAoF;AACpF,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,kFAAkF;AAClF,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAYjC,2EAA2E;AAC3E,MAAM,WAAW,wBAAwB;IACvC,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAUD,qBAAa,yBAAyB;IAiBlC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAjB3B,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IACrE;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAE7D,OAAO,CAAC,OAAO,CAAsD;IACrE,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAK;IACrB,wEAAwE;IACxE,OAAO,CAAC,MAAM,CAAS;gBAGJ,MAAM,EAAE,wBAAwB,EAChC,QAAQ,EAAE,eAAe;IAG5C,OAAO,CAAC,MAAM,CAAC,WAAW;IAU1B,oEAAoE;IACpE,cAAc,IAAI,SAAS;IAI3B,6EAA6E;IAC7E,QAAQ,IAAI,OAAO;IAInB;;;;;OAKG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBlC;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO9B;;;;OAIG;IACH,OAAO,CACL,GAAG,EAAE,eAAe,EACpB,cAAc,EAAE,MAAM,GACrB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,CAAA;KAAE;IAY7C,+EAA+E;IAC/E,iBAAiB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAU7C,wCAAwC;IACxC,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAIrC,0CAA0C;IAC1C,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAIxC;;;;;;;OAOG;IACH,UAAU,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAKxE;;;;;OAKG;IACH,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAI/C,mEAAmE;IACnE,OAAO,CAAC,GAAG,EAAE,eAAe,GAAG,aAAa;IAM5C,gFAAgF;IAChF,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAOrD,8DAA8D;IAC9D,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI5C,2EAA2E;IAC3E,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQzD,4EAA4E;IAC5E,OAAO,CAAC,IAAI;IAUZ,qEAAqE;IACrE,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,QAAQ;IAIhB;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,EAAE;CAGX"}
|