sela-core 1.0.0

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 (144) hide show
  1. package/README.md +93 -0
  2. package/bin/sela.js +3 -0
  3. package/dist/cli/ErrorHandler.d.ts +10 -0
  4. package/dist/cli/ErrorHandler.d.ts.map +1 -0
  5. package/dist/cli/ErrorHandler.js +70 -0
  6. package/dist/cli/commands/bulk.d.ts +3 -0
  7. package/dist/cli/commands/bulk.d.ts.map +1 -0
  8. package/dist/cli/commands/bulk.js +140 -0
  9. package/dist/cli/commands/find.d.ts +3 -0
  10. package/dist/cli/commands/find.d.ts.map +1 -0
  11. package/dist/cli/commands/find.js +51 -0
  12. package/dist/cli/commands/init.d.ts +3 -0
  13. package/dist/cli/commands/init.d.ts.map +1 -0
  14. package/dist/cli/commands/init.js +133 -0
  15. package/dist/cli/commands/list.d.ts +3 -0
  16. package/dist/cli/commands/list.d.ts.map +1 -0
  17. package/dist/cli/commands/list.js +56 -0
  18. package/dist/cli/commands/refactor.d.ts +3 -0
  19. package/dist/cli/commands/refactor.d.ts.map +1 -0
  20. package/dist/cli/commands/refactor.js +30 -0
  21. package/dist/cli/commands/status.d.ts +3 -0
  22. package/dist/cli/commands/status.d.ts.map +1 -0
  23. package/dist/cli/commands/status.js +51 -0
  24. package/dist/cli/commands/sync.d.ts +3 -0
  25. package/dist/cli/commands/sync.d.ts.map +1 -0
  26. package/dist/cli/commands/sync.js +123 -0
  27. package/dist/cli/index.d.ts +2 -0
  28. package/dist/cli/index.d.ts.map +1 -0
  29. package/dist/cli/index.js +42 -0
  30. package/dist/cli/ui/DnaTable.d.ts +3 -0
  31. package/dist/cli/ui/DnaTable.d.ts.map +1 -0
  32. package/dist/cli/ui/DnaTable.js +70 -0
  33. package/dist/cli/ui/LocatorPicker.d.ts +8 -0
  34. package/dist/cli/ui/LocatorPicker.d.ts.map +1 -0
  35. package/dist/cli/ui/LocatorPicker.js +33 -0
  36. package/dist/cli/ui/ProgressReporter.d.ts +11 -0
  37. package/dist/cli/ui/ProgressReporter.d.ts.map +1 -0
  38. package/dist/cli/ui/ProgressReporter.js +33 -0
  39. package/dist/cli/ui/RefactorWizard.d.ts +26 -0
  40. package/dist/cli/ui/RefactorWizard.d.ts.map +1 -0
  41. package/dist/cli/ui/RefactorWizard.js +269 -0
  42. package/dist/config/ConfigLoader.d.ts +15 -0
  43. package/dist/config/ConfigLoader.d.ts.map +1 -0
  44. package/dist/config/ConfigLoader.js +174 -0
  45. package/dist/config/SelaConfig.d.ts +67 -0
  46. package/dist/config/SelaConfig.d.ts.map +1 -0
  47. package/dist/config/SelaConfig.js +57 -0
  48. package/dist/config/defineConfig.d.ts +3 -0
  49. package/dist/config/defineConfig.d.ts.map +1 -0
  50. package/dist/config/defineConfig.js +9 -0
  51. package/dist/engine/FixwrightEngine.d.ts +24 -0
  52. package/dist/engine/FixwrightEngine.d.ts.map +1 -0
  53. package/dist/engine/FixwrightEngine.js +403 -0
  54. package/dist/engine/HealingRegistry.d.ts +40 -0
  55. package/dist/engine/HealingRegistry.d.ts.map +1 -0
  56. package/dist/engine/HealingRegistry.js +98 -0
  57. package/dist/engine/singleton.d.ts +3 -0
  58. package/dist/engine/singleton.d.ts.map +1 -0
  59. package/dist/engine/singleton.js +5 -0
  60. package/dist/fixtures/expectProxy.d.ts +12 -0
  61. package/dist/fixtures/expectProxy.d.ts.map +1 -0
  62. package/dist/fixtures/expectProxy.js +228 -0
  63. package/dist/fixtures/index.d.ts +6 -0
  64. package/dist/fixtures/index.d.ts.map +1 -0
  65. package/dist/fixtures/index.js +688 -0
  66. package/dist/fixtures/moduleExpect.d.ts +2 -0
  67. package/dist/fixtures/moduleExpect.d.ts.map +1 -0
  68. package/dist/fixtures/moduleExpect.js +46 -0
  69. package/dist/index.d.ts +7 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +28 -0
  72. package/dist/services/ASTSourceUpdater.d.ts +79 -0
  73. package/dist/services/ASTSourceUpdater.d.ts.map +1 -0
  74. package/dist/services/ASTSourceUpdater.js +3177 -0
  75. package/dist/services/ArgumentTypeAnalyzer.d.ts +26 -0
  76. package/dist/services/ArgumentTypeAnalyzer.d.ts.map +1 -0
  77. package/dist/services/ArgumentTypeAnalyzer.js +92 -0
  78. package/dist/services/BlastRadiusAnalyzer.d.ts +15 -0
  79. package/dist/services/BlastRadiusAnalyzer.d.ts.map +1 -0
  80. package/dist/services/BlastRadiusAnalyzer.js +103 -0
  81. package/dist/services/ChainValidator.d.ts +76 -0
  82. package/dist/services/ChainValidator.d.ts.map +1 -0
  83. package/dist/services/ChainValidator.js +569 -0
  84. package/dist/services/CrossFileHealer.d.ts +6 -0
  85. package/dist/services/CrossFileHealer.d.ts.map +1 -0
  86. package/dist/services/CrossFileHealer.js +134 -0
  87. package/dist/services/DefinitionTracer.d.ts +41 -0
  88. package/dist/services/DefinitionTracer.d.ts.map +1 -0
  89. package/dist/services/DefinitionTracer.js +350 -0
  90. package/dist/services/DnaEditorService.d.ts +31 -0
  91. package/dist/services/DnaEditorService.d.ts.map +1 -0
  92. package/dist/services/DnaEditorService.js +198 -0
  93. package/dist/services/DnaIndexService.d.ts +24 -0
  94. package/dist/services/DnaIndexService.d.ts.map +1 -0
  95. package/dist/services/DnaIndexService.js +131 -0
  96. package/dist/services/HealingAdvisory.d.ts +22 -0
  97. package/dist/services/HealingAdvisory.d.ts.map +1 -0
  98. package/dist/services/HealingAdvisory.js +42 -0
  99. package/dist/services/HealthReportService.d.ts +10 -0
  100. package/dist/services/HealthReportService.d.ts.map +1 -0
  101. package/dist/services/HealthReportService.js +84 -0
  102. package/dist/services/InitializerUpdater.d.ts +16 -0
  103. package/dist/services/InitializerUpdater.d.ts.map +1 -0
  104. package/dist/services/InitializerUpdater.js +37 -0
  105. package/dist/services/IntentAuditor.d.ts +39 -0
  106. package/dist/services/IntentAuditor.d.ts.map +1 -0
  107. package/dist/services/IntentAuditor.js +302 -0
  108. package/dist/services/LLMService.d.ts +100 -0
  109. package/dist/services/LLMService.d.ts.map +1 -0
  110. package/dist/services/LLMService.js +439 -0
  111. package/dist/services/SafetyGuard.d.ts +65 -0
  112. package/dist/services/SafetyGuard.d.ts.map +1 -0
  113. package/dist/services/SafetyGuard.js +524 -0
  114. package/dist/services/SnapshotService.d.ts +11 -0
  115. package/dist/services/SnapshotService.d.ts.map +1 -0
  116. package/dist/services/SnapshotService.js +349 -0
  117. package/dist/services/SourceLinkService.d.ts +26 -0
  118. package/dist/services/SourceLinkService.d.ts.map +1 -0
  119. package/dist/services/SourceLinkService.js +156 -0
  120. package/dist/services/SourceUpdater.d.ts +45 -0
  121. package/dist/services/SourceUpdater.d.ts.map +1 -0
  122. package/dist/services/SourceUpdater.js +1021 -0
  123. package/dist/services/TemplateDiffService.d.ts +25 -0
  124. package/dist/services/TemplateDiffService.d.ts.map +1 -0
  125. package/dist/services/TemplateDiffService.js +331 -0
  126. package/dist/services/types.d.ts +59 -0
  127. package/dist/services/types.d.ts.map +1 -0
  128. package/dist/services/types.js +2 -0
  129. package/dist/storage/SnapshotManager.d.ts +5 -0
  130. package/dist/storage/SnapshotManager.d.ts.map +1 -0
  131. package/dist/storage/SnapshotManager.js +31 -0
  132. package/dist/types/index.d.ts +95 -0
  133. package/dist/types/index.d.ts.map +1 -0
  134. package/dist/types/index.js +7 -0
  135. package/dist/utils/DOMUtils.d.ts +33 -0
  136. package/dist/utils/DOMUtils.d.ts.map +1 -0
  137. package/dist/utils/DOMUtils.js +179 -0
  138. package/dist/utils/StackUtils.d.ts +11 -0
  139. package/dist/utils/StackUtils.d.ts.map +1 -0
  140. package/dist/utils/StackUtils.js +120 -0
  141. package/dist/vendor/enquirer.d.ts +33 -0
  142. package/dist/vendor/enquirer.d.ts.map +1 -0
  143. package/dist/vendor/enquirer.js +11 -0
  144. package/package.json +67 -0
@@ -0,0 +1,26 @@
1
+ import { Node, CallExpression } from "ts-morph";
2
+ export type ArgumentShape = "STRING_LITERAL" | "TEMPLATE_LITERAL" | "IDENTIFIER" | "PROPERTY_ACCESS" | "CALL_EXPRESSION" | "COMPLEX";
3
+ export interface ArgumentAnalysis {
4
+ shape: ArgumentShape;
5
+ node: Node;
6
+ sourceText: string;
7
+ }
8
+ export declare const ALL_LOCATOR_METHODS: Set<string>;
9
+ export declare class ArgumentTypeAnalyzer {
10
+ /**
11
+ * Classify the first argument of any CallExpression.
12
+ * Returns null if the call has no arguments.
13
+ */
14
+ static classify(call: CallExpression): ArgumentAnalysis | null;
15
+ /**
16
+ * Same as classify() but returns null if the call is not a Playwright
17
+ * locator method (locator, getByRole, getByLabel, etc.).
18
+ */
19
+ static classifyLocatorArg(call: CallExpression): ArgumentAnalysis | null;
20
+ /**
21
+ * Returns true when the CallExpression targets a Playwright locator method.
22
+ */
23
+ static isLocatorCall(call: CallExpression): boolean;
24
+ private static classifyNode;
25
+ }
26
+ //# sourceMappingURL=ArgumentTypeAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArgumentTypeAnalyzer.d.ts","sourceRoot":"","sources":["../../src/services/ArgumentTypeAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAMhD,MAAM,MAAM,aAAa,GACrB,gBAAgB,GAChB,kBAAkB,GAClB,YAAY,GACZ,iBAAiB,GACjB,iBAAiB,GACjB,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,eAAO,MAAM,mBAAmB,aAU9B,CAAC;AASH,qBAAa,oBAAoB;IAC/B;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG,IAAI;IAW9D;;;OAGG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG,IAAI;IAKxE;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAenD,OAAO,CAAC,MAAM,CAAC,YAAY;CAgC5B"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ArgumentTypeAnalyzer = exports.ALL_LOCATOR_METHODS = void 0;
4
+ const ts_morph_1 = require("ts-morph");
5
+ // ═══════════════════════════════════════════════════════════════════
6
+ // CONSTANTS
7
+ // ═══════════════════════════════════════════════════════════════════
8
+ exports.ALL_LOCATOR_METHODS = new Set([
9
+ "locator",
10
+ "frameLocator",
11
+ "getByRole",
12
+ "getByLabel",
13
+ "getByText",
14
+ "getByTestId",
15
+ "getByPlaceholder",
16
+ "getByAltText",
17
+ "getByTitle",
18
+ ]);
19
+ // ═══════════════════════════════════════════════════════════════════
20
+ // ArgumentTypeAnalyzer
21
+ //
22
+ // Classifies the first argument of a Playwright locator CallExpression.
23
+ // Stateless — no file I/O, no side effects.
24
+ // ═══════════════════════════════════════════════════════════════════
25
+ class ArgumentTypeAnalyzer {
26
+ /**
27
+ * Classify the first argument of any CallExpression.
28
+ * Returns null if the call has no arguments.
29
+ */
30
+ static classify(call) {
31
+ const args = call.getArguments();
32
+ if (args.length === 0)
33
+ return null;
34
+ const arg = args[0];
35
+ return {
36
+ shape: ArgumentTypeAnalyzer.classifyNode(arg),
37
+ node: arg,
38
+ sourceText: arg.getText(),
39
+ };
40
+ }
41
+ /**
42
+ * Same as classify() but returns null if the call is not a Playwright
43
+ * locator method (locator, getByRole, getByLabel, etc.).
44
+ */
45
+ static classifyLocatorArg(call) {
46
+ if (!ArgumentTypeAnalyzer.isLocatorCall(call))
47
+ return null;
48
+ return ArgumentTypeAnalyzer.classify(call);
49
+ }
50
+ /**
51
+ * Returns true when the CallExpression targets a Playwright locator method.
52
+ */
53
+ static isLocatorCall(call) {
54
+ const expr = call.getExpression();
55
+ if (ts_morph_1.Node.isPropertyAccessExpression(expr)) {
56
+ return exports.ALL_LOCATOR_METHODS.has(expr.getName());
57
+ }
58
+ if (ts_morph_1.Node.isIdentifier(expr)) {
59
+ return exports.ALL_LOCATOR_METHODS.has(expr.getText());
60
+ }
61
+ return false;
62
+ }
63
+ // ─────────────────────────────────────────────────────────────────
64
+ // Private helpers
65
+ // ─────────────────────────────────────────────────────────────────
66
+ static classifyNode(node) {
67
+ // Plain string — value is self-contained in this node.
68
+ if (ts_morph_1.Node.isStringLiteral(node) ||
69
+ ts_morph_1.Node.isNoSubstitutionTemplateLiteral(node)) {
70
+ return "STRING_LITERAL";
71
+ }
72
+ // Template with ${...} spans — static segments are healable, spans are not.
73
+ if (ts_morph_1.Node.isTemplateExpression(node)) {
74
+ return "TEMPLATE_LITERAL";
75
+ }
76
+ // Bare variable name — must trace to declaration.
77
+ if (ts_morph_1.Node.isIdentifier(node)) {
78
+ return "IDENTIFIER";
79
+ }
80
+ // OBJECT.property — must trace to object literal property value.
81
+ if (ts_morph_1.Node.isPropertyAccessExpression(node)) {
82
+ return "PROPERTY_ACCESS";
83
+ }
84
+ // fn(...) — must enter function body to find return value.
85
+ if (ts_morph_1.Node.isCallExpression(node)) {
86
+ return "CALL_EXPRESSION";
87
+ }
88
+ // Binary expressions, conditionals, spreads, etc. — not healable here.
89
+ return "COMPLEX";
90
+ }
91
+ }
92
+ exports.ArgumentTypeAnalyzer = ArgumentTypeAnalyzer;
@@ -0,0 +1,15 @@
1
+ import { Node, SourceFile, Project } from "ts-morph";
2
+ export type BlastRisk = "low" | "medium" | "high";
3
+ export interface BlastRadiusReport {
4
+ totalReferences: number;
5
+ testFunctionCount: number;
6
+ affectedFiles: string[];
7
+ risk: BlastRisk;
8
+ }
9
+ export declare class BlastRadiusAnalyzer {
10
+ static analyze(declarationNode: Node, _sourceFile: SourceFile, _project: Project): BlastRadiusReport;
11
+ private static doAnalyze;
12
+ private static getNameNode;
13
+ private static isTestCall;
14
+ }
15
+ //# sourceMappingURL=BlastRadiusAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlastRadiusAnalyzer.d.ts","sourceRoot":"","sources":["../../src/services/BlastRadiusAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAc,MAAM,UAAU,CAAC;AAMjE,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;CACjB;AAWD,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,OAAO,CACZ,eAAe,EAAE,IAAI,EACrB,WAAW,EAAE,UAAU,EACvB,QAAQ,EAAE,OAAO,GAChB,iBAAiB;IAgBpB,OAAO,CAAC,MAAM,CAAC,SAAS;IAwDxB,OAAO,CAAC,MAAM,CAAC,WAAW;IAY1B,OAAO,CAAC,MAAM,CAAC,UAAU;CAiB1B"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlastRadiusAnalyzer = void 0;
4
+ const ts_morph_1 = require("ts-morph");
5
+ // ═══════════════════════════════════════════════════════════════════
6
+ // BlastRadiusAnalyzer
7
+ //
8
+ // Before mutating a definition-site node, determine how many tests
9
+ // reference it. Uses ts-morph's findReferences() for cross-file
10
+ // accuracy. On any analysis failure, defaults to risk:'low' and logs
11
+ // a warning — never blocks healing due to analysis error.
12
+ // ═══════════════════════════════════════════════════════════════════
13
+ class BlastRadiusAnalyzer {
14
+ static analyze(declarationNode, _sourceFile, _project) {
15
+ try {
16
+ return BlastRadiusAnalyzer.doAnalyze(declarationNode);
17
+ }
18
+ catch (e) {
19
+ console.warn(`[BlastRadius] ⚠️ Analysis failed, defaulting to low risk: ${e.message}`);
20
+ return {
21
+ totalReferences: 0,
22
+ testFunctionCount: 0,
23
+ affectedFiles: [],
24
+ risk: "low",
25
+ };
26
+ }
27
+ }
28
+ static doAnalyze(declarationNode) {
29
+ const nameNode = BlastRadiusAnalyzer.getNameNode(declarationNode);
30
+ if (!nameNode) {
31
+ return {
32
+ totalReferences: 0,
33
+ testFunctionCount: 0,
34
+ affectedFiles: [],
35
+ risk: "low",
36
+ };
37
+ }
38
+ const refs = nameNode.getProject().getLanguageService().findReferences(nameNode);
39
+ const affectedFilesSet = new Set();
40
+ let totalRefs = 0;
41
+ // Key = filePath:startLine of the enclosing test() / it() call.
42
+ const enclosingTestKeys = new Set();
43
+ for (const refSymbol of refs) {
44
+ for (const ref of refSymbol.getReferences()) {
45
+ if (ref.isDefinition())
46
+ continue;
47
+ totalRefs++;
48
+ affectedFilesSet.add(ref.getSourceFile().getFilePath());
49
+ // Walk ancestors to find the enclosing test() or it() call.
50
+ let ancestor = ref.getNode();
51
+ while (ancestor) {
52
+ if (ts_morph_1.Node.isCallExpression(ancestor) &&
53
+ BlastRadiusAnalyzer.isTestCall(ancestor)) {
54
+ enclosingTestKeys.add(`${ref.getSourceFile().getFilePath()}:${ancestor.getStartLineNumber()}`);
55
+ break;
56
+ }
57
+ ancestor = ancestor.getParent();
58
+ }
59
+ }
60
+ }
61
+ const testFunctionCount = enclosingTestKeys.size;
62
+ const risk = testFunctionCount >= 4
63
+ ? "high"
64
+ : testFunctionCount >= 2
65
+ ? "medium"
66
+ : "low";
67
+ return {
68
+ totalReferences: totalRefs,
69
+ testFunctionCount,
70
+ affectedFiles: [...affectedFilesSet],
71
+ risk,
72
+ };
73
+ }
74
+ static getNameNode(node) {
75
+ if (ts_morph_1.Node.isVariableDeclaration(node))
76
+ return node.getNameNode();
77
+ if (node.getKind() === ts_morph_1.SyntaxKind.PropertyAssignment &&
78
+ ts_morph_1.Node.isPropertyAssignment(node)) {
79
+ return node.getNameNode();
80
+ }
81
+ // For already-resolved StringLiteral / Identifier targets.
82
+ return node;
83
+ }
84
+ static isTestCall(call) {
85
+ if (!ts_morph_1.Node.isCallExpression(call))
86
+ return false;
87
+ const expr = call.getExpression();
88
+ // Handles: test("...", ...) and test.only / test.skip etc.
89
+ if (ts_morph_1.Node.isIdentifier(expr)) {
90
+ const name = expr.getText();
91
+ return name === "test" || name === "it";
92
+ }
93
+ if (ts_morph_1.Node.isPropertyAccessExpression(expr)) {
94
+ const obj = expr.getExpression();
95
+ if (ts_morph_1.Node.isIdentifier(obj)) {
96
+ const name = obj.getText();
97
+ return name === "test" || name === "it";
98
+ }
99
+ }
100
+ return false;
101
+ }
102
+ }
103
+ exports.BlastRadiusAnalyzer = BlastRadiusAnalyzer;
@@ -0,0 +1,76 @@
1
+ export type ChainSegment = {
2
+ type: "locator";
3
+ selector: string;
4
+ } | {
5
+ type: "frameLocator";
6
+ selector: string;
7
+ } | {
8
+ type: "getByRole";
9
+ role: string;
10
+ name?: string;
11
+ exact?: boolean;
12
+ } | {
13
+ type: "getByLabel";
14
+ text: string;
15
+ exact?: boolean;
16
+ } | {
17
+ type: "getByText";
18
+ text: string;
19
+ exact?: boolean;
20
+ } | {
21
+ type: "getByPlaceholder";
22
+ text: string;
23
+ } | {
24
+ type: "getByTestId";
25
+ testId: string;
26
+ } | {
27
+ type: "getByAltText";
28
+ text: string;
29
+ } | {
30
+ type: "getByTitle";
31
+ text: string;
32
+ } | {
33
+ type: "filter";
34
+ hasText?: string;
35
+ hasNotText?: string;
36
+ has?: string;
37
+ hasNot?: string;
38
+ } | {
39
+ type: "first";
40
+ } | {
41
+ type: "last";
42
+ } | {
43
+ type: "nth";
44
+ index: number;
45
+ };
46
+ export type ReturnType = "Locator" | "FrameLocator" | "unknown";
47
+ export interface ValidationResult {
48
+ valid: boolean;
49
+ reason?: string;
50
+ segments?: ChainSegment[];
51
+ }
52
+ export declare function segmentsToCode(receiver: string, segments: ChainSegment[], multiLine?: boolean): string;
53
+ export interface ChainValidationInput {
54
+ segments: unknown[];
55
+ originalRootReceiver: string;
56
+ proposedRootReceiver: string;
57
+ rootType?: ReturnType;
58
+ applySemanticUpgrade?: boolean;
59
+ }
60
+ export interface ChainValidationOutput {
61
+ valid: boolean;
62
+ reason?: string;
63
+ segments?: ChainSegment[];
64
+ code?: string;
65
+ multiLine?: boolean;
66
+ }
67
+ export declare class ChainValidator {
68
+ validate(input: ChainValidationInput): ChainValidationOutput;
69
+ /**
70
+ * Lightweight check: does this segment array describe the same
71
+ * semantic intent as the old flat selector string?
72
+ * Used as a sanity check before committing an AST write.
73
+ */
74
+ intentMatches(segments: ChainSegment[], oldFlatSelector: string): boolean;
75
+ }
76
+ //# sourceMappingURL=ChainValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChainValidator.d.ts","sourceRoot":"","sources":["../../src/services/ChainValidator.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AA2cD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,YAAY,EAAE,EACxB,SAAS,GAAE,OAAe,GACzB,MAAM,CAkER;AAWD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB,QAAQ,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB;IAsE5D;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO;CA0B1E"}