sela-core 1.0.5 → 1.0.7

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 (71) hide show
  1. package/README.md +1 -1
  2. package/dist/config/ConfigLoader.d.ts +1 -0
  3. package/dist/config/ConfigLoader.d.ts.map +1 -1
  4. package/dist/config/ConfigLoader.js +10 -0
  5. package/dist/config/DryRunGuard.d.ts +14 -0
  6. package/dist/config/DryRunGuard.d.ts.map +1 -0
  7. package/dist/config/DryRunGuard.js +79 -0
  8. package/dist/config/SelaConfig.d.ts +15 -1
  9. package/dist/config/SelaConfig.d.ts.map +1 -1
  10. package/dist/config/SelaConfig.js +27 -1
  11. package/dist/engine/SelaEngine.d.ts +26 -6
  12. package/dist/engine/SelaEngine.d.ts.map +1 -1
  13. package/dist/engine/SelaEngine.js +329 -77
  14. package/dist/errors/SelaError.d.ts +133 -0
  15. package/dist/errors/SelaError.d.ts.map +1 -0
  16. package/dist/errors/SelaError.js +155 -0
  17. package/dist/fixtures/expectProxy.d.ts.map +1 -1
  18. package/dist/fixtures/expectProxy.js +7 -0
  19. package/dist/fixtures/index.d.ts +7 -1
  20. package/dist/fixtures/index.d.ts.map +1 -1
  21. package/dist/fixtures/index.js +15 -0
  22. package/dist/fixtures/proxyTag.d.ts +12 -0
  23. package/dist/fixtures/proxyTag.d.ts.map +1 -0
  24. package/dist/fixtures/proxyTag.js +45 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +6 -1
  28. package/dist/reporter/SelaReporter.d.ts +110 -0
  29. package/dist/reporter/SelaReporter.d.ts.map +1 -0
  30. package/dist/reporter/SelaReporter.js +328 -0
  31. package/dist/services/ASTSourceUpdater.d.ts +19 -0
  32. package/dist/services/ASTSourceUpdater.d.ts.map +1 -1
  33. package/dist/services/ASTSourceUpdater.js +173 -29
  34. package/dist/services/HealReportService.d.ts +62 -3
  35. package/dist/services/HealReportService.d.ts.map +1 -1
  36. package/dist/services/HealReportService.js +184 -14
  37. package/dist/services/HealingCacheService.d.ts +135 -0
  38. package/dist/services/HealingCacheService.d.ts.map +1 -0
  39. package/dist/services/HealingCacheService.js +460 -0
  40. package/dist/services/InitializerUpdater.d.ts.map +1 -1
  41. package/dist/services/InitializerUpdater.js +20 -1
  42. package/dist/services/IntentAuditor.d.ts +18 -1
  43. package/dist/services/IntentAuditor.d.ts.map +1 -1
  44. package/dist/services/IntentAuditor.js +19 -6
  45. package/dist/services/InteractiveReview.d.ts +24 -0
  46. package/dist/services/InteractiveReview.d.ts.map +1 -0
  47. package/dist/services/InteractiveReview.js +218 -0
  48. package/dist/services/LLMService.d.ts +23 -2
  49. package/dist/services/LLMService.d.ts.map +1 -1
  50. package/dist/services/LLMService.js +48 -12
  51. package/dist/services/PRAutomationService.d.ts +23 -3
  52. package/dist/services/PRAutomationService.d.ts.map +1 -1
  53. package/dist/services/PRAutomationService.js +325 -79
  54. package/dist/services/PendingPromptLedger.d.ts +44 -0
  55. package/dist/services/PendingPromptLedger.d.ts.map +1 -0
  56. package/dist/services/PendingPromptLedger.js +180 -0
  57. package/dist/services/ReportGenerator.d.ts +70 -0
  58. package/dist/services/ReportGenerator.d.ts.map +1 -0
  59. package/dist/services/ReportGenerator.js +191 -0
  60. package/dist/services/SafetyGuard.d.ts +34 -2
  61. package/dist/services/SafetyGuard.d.ts.map +1 -1
  62. package/dist/services/SafetyGuard.js +65 -13
  63. package/dist/services/SourceUpdater.d.ts.map +1 -1
  64. package/dist/services/SourceUpdater.js +44 -13
  65. package/dist/services/WorkspaceSnapshotService.d.ts +71 -0
  66. package/dist/services/WorkspaceSnapshotService.d.ts.map +1 -0
  67. package/dist/services/WorkspaceSnapshotService.js +202 -0
  68. package/dist/utils/IsolatedDiff.d.ts +45 -0
  69. package/dist/utils/IsolatedDiff.d.ts.map +1 -0
  70. package/dist/utils/IsolatedDiff.js +379 -0
  71. package/package.json +71 -67
@@ -96,6 +96,52 @@ class HealReportService {
96
96
  getProtectedEvents() {
97
97
  return this.events.filter((e) => e.kind === "PROTECTED");
98
98
  }
99
+ /** All FAILED events accumulated in this session. */
100
+ getFailedEvents() {
101
+ return this.events.filter((e) => e.kind === "FAILED");
102
+ }
103
+ /**
104
+ * Inject a Playwright failure screenshot (Base64 PNG, no data: prefix)
105
+ * onto the FAILED event(s) matching the supplied identity hints. Used
106
+ * by `SelaReporter` to enrich engine-emitted FAILED events with the
107
+ * Playwright-captured screenshot from `TestResult.attachments`.
108
+ *
109
+ * Match policy (all supplied hints must agree):
110
+ * • `sourceFile` — suffix-matched both directions to absorb
111
+ * project-relative vs absolute path mismatches between the engine
112
+ * (relative) and Playwright TestInfo.location.file (absolute).
113
+ * • `testTitle` — exact match.
114
+ * • `stableId` — exact match.
115
+ *
116
+ * Returns the number of events updated. Zero means the caller should
117
+ * keep the screenshot pending until the matching FailedEvent is
118
+ * recorded (worker-crash edge case where the heal pipeline did not
119
+ * run before the Reporter received the failure).
120
+ */
121
+ attachFailureScreenshot(match, base64Png) {
122
+ if (!base64Png)
123
+ return 0;
124
+ const norm = (p) => (p ?? "").replace(/\\/g, "/").toLowerCase();
125
+ const targetFile = norm(match.sourceFile);
126
+ let touched = 0;
127
+ for (const ev of this.events) {
128
+ if (ev.kind !== "FAILED")
129
+ continue;
130
+ const evFile = norm(ev.sourceFile);
131
+ const fileMatch = !targetFile ||
132
+ !evFile ||
133
+ evFile === targetFile ||
134
+ evFile.endsWith(targetFile) ||
135
+ targetFile.endsWith(evFile);
136
+ const titleMatch = !match.testTitle || ev.testTitle === match.testTitle;
137
+ const idMatch = !match.stableId || ev.stableId === match.stableId;
138
+ if (fileMatch && titleMatch && idMatch) {
139
+ ev.failureScreenshotPng = base64Png;
140
+ touched++;
141
+ }
142
+ }
143
+ return touched;
144
+ }
99
145
  /**
100
146
  * Write `sela-report.html` (+ `sela-report.json` debug dump) to cwd.
101
147
  * Returns the absolute path of the HTML report, or null if nothing to write.
@@ -684,6 +730,23 @@ a:hover { text-decoration: underline; }
684
730
  .tag.ghost { color: var(--warn); border-color: rgba(251,191,36,0.3); }
685
731
  .tag.occlude { color: var(--bad); border-color: rgba(248,113,113,0.3); }
686
732
 
733
+ /* Failure context — Playwright screenshot rendered inline on FAILED cards */
734
+ .failure-img {
735
+ background: var(--bg-1); border: 1px solid var(--line);
736
+ border-radius: var(--radius-sm); padding: 8px;
737
+ overflow: hidden;
738
+ }
739
+ .failure-img img {
740
+ display: block; max-width: 100%; height: auto;
741
+ border-radius: 4px;
742
+ background: #000;
743
+ outline: 1px solid var(--line);
744
+ }
745
+ .failure-img .img-meta {
746
+ font-family: var(--mono); font-size: 11px; color: var(--text-muted);
747
+ padding: 6px 4px 0;
748
+ }
749
+
687
750
  /* Empty state */
688
751
  .empty {
689
752
  margin-top: 32px; padding: 60px 20px; text-align: center;
@@ -752,6 +815,13 @@ const REPORT_JS = String.raw `
752
815
  try { return new Date(iso).toLocaleString(); } catch { return iso; }
753
816
  }
754
817
  function pluralize(n, one, many) { return n === 1 ? one : (many || one + "s"); }
818
+ // Graceful percentage formatter — mirrors the server-side helper in
819
+ // PRAutomationService. Anything that is not a finite number renders "n/a"
820
+ // instead of being coerced to 0%. Used in every spot that previously
821
+ // hard-coded a plain "x + %" concatenation.
822
+ function fmtPct(v) {
823
+ return (typeof v === "number" && isFinite(v)) ? (v + "%") : "n/a";
824
+ }
755
825
 
756
826
  // ── Hero meta + KPIs ──────────────────────────────────────────
757
827
  $("#meta-generated").textContent = "Generated " + fmtTime(DATA.generatedAt);
@@ -905,15 +975,16 @@ const REPORT_JS = String.raw `
905
975
  function renderAuditor(a) {
906
976
  if (!a) return '<div class="muted-block">The Intent Auditor was not consulted for this event (no AI fix attempted, or auditor unavailable).</div>';
907
977
  const verdictCls = a.verdict.toLowerCase();
908
- const pct = Math.max(0, Math.min(100, a.confidence));
978
+ const hasPct = typeof a.confidence === "number" && isFinite(a.confidence);
979
+ const pct = hasPct ? Math.max(0, Math.min(100, a.confidence)) : 0;
909
980
  const radius = 56;
910
981
  const circ = 2 * Math.PI * radius;
911
- const dash = (pct / 100) * circ;
982
+ const dash = hasPct ? (pct / 100) * circ : 0;
912
983
  const adjustments = [];
913
984
  if (a.penalty != null && a.penalty !== 0) adjustments.push("ancestry drift " + a.penalty);
914
985
  if (a.bonus != null && a.bonus !== 0) adjustments.push("anchor +" + a.bonus);
915
986
  const adjLine = adjustments.length
916
- ? '<div class="audit-row"><span class="label">Score adjustments</span><span class="value">raw ' + a.rawConfidence + '% → ' + pct + '% (' + adjustments.join(", ") + ')</span></div>'
987
+ ? '<div class="audit-row"><span class="label">Score adjustments</span><span class="value">raw ' + fmtPct(a.rawConfidence) + ' → ' + fmtPct(hasPct ? pct : undefined) + ' (' + adjustments.join(", ") + ')</span></div>'
917
988
  : "";
918
989
  return (
919
990
  '<div class="auditor-grid">' +
@@ -924,7 +995,7 @@ const REPORT_JS = String.raw `
924
995
  'stroke-dasharray="' + dash.toFixed(2) + ' ' + circ.toFixed(2) + '"/>' +
925
996
  '</svg>' +
926
997
  '<div class="center">' +
927
- '<div class="pct">' + pct + '%</div>' +
998
+ '<div class="pct">' + (hasPct ? pct + "%" : "n/a") + '</div>' +
928
999
  '<div class="pct-label">Consistency</div>' +
929
1000
  '</div>' +
930
1001
  '</div>' +
@@ -938,6 +1009,58 @@ const REPORT_JS = String.raw `
938
1009
  );
939
1010
  }
940
1011
 
1012
+ // Parse "git diff --unified=N" output into structured hunks. Skips file
1013
+ // headers ("diff ", "index ", "--- ", "+++ ", rename/similarity lines) and
1014
+ // walks each "@@ -a,b +c,d @@" block, tracking real old/new line numbers
1015
+ // so the rendered diff shows correct line refs even when the AST mutation
1016
+ // landed several lines above the failure site (JumpToDef scenario).
1017
+ function parseUnifiedDiff(raw) {
1018
+ const out = [];
1019
+ if (!raw) return out;
1020
+ const rows = raw.split(/\r?\n/);
1021
+ let cur = null;
1022
+ let oldLn = 0, newLn = 0;
1023
+ for (const r of rows) {
1024
+ if (
1025
+ r.startsWith("diff ") ||
1026
+ r.startsWith("index ") ||
1027
+ r.startsWith("--- ") ||
1028
+ r.startsWith("+++ ") ||
1029
+ r.startsWith("new file mode") ||
1030
+ r.startsWith("deleted file mode") ||
1031
+ r.startsWith("similarity ") ||
1032
+ r.startsWith("rename ") ||
1033
+ r.startsWith("Binary files")
1034
+ ) continue;
1035
+ const hunk = r.match(/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
1036
+ if (hunk) {
1037
+ if (cur) out.push(cur);
1038
+ cur = { header: r, lines: [] };
1039
+ oldLn = parseInt(hunk[1], 10);
1040
+ newLn = parseInt(hunk[3], 10);
1041
+ continue;
1042
+ }
1043
+ if (!cur) continue;
1044
+ // "" + truly empty trailing lines: ignore
1045
+ if (r.startsWith("\\")) continue;
1046
+ if (r.length === 0) continue;
1047
+ const head = r.charAt(0);
1048
+ const text = r.slice(1);
1049
+ if (head === "+") {
1050
+ cur.lines.push({ type: "add", text, ln: newLn });
1051
+ newLn++;
1052
+ } else if (head === "-") {
1053
+ cur.lines.push({ type: "del", text, ln: oldLn });
1054
+ oldLn++;
1055
+ } else if (head === " ") {
1056
+ cur.lines.push({ type: "ctx", text, ln: newLn });
1057
+ oldLn++; newLn++;
1058
+ }
1059
+ }
1060
+ if (cur) out.push(cur);
1061
+ return out;
1062
+ }
1063
+
941
1064
  function renderDiff(ev) {
942
1065
  if (ev.kind !== "HEALED") {
943
1066
  if (ev.kind === "PROTECTED") {
@@ -947,8 +1070,45 @@ const REPORT_JS = String.raw `
947
1070
  }
948
1071
  return '<div class="muted-block">No source code was modified — the AI could not propose a confident fix for this selector.</div>';
949
1072
  }
950
- const oldLine = ev.oldCodeLine || "";
951
- const newLine = ev.newCodeLine || "";
1073
+
1074
+ const raw = ev.gitUnifiedDiff || "";
1075
+ const hunks = parseUnifiedDiff(raw);
1076
+
1077
+ let bodyHtml;
1078
+ let sourceTag;
1079
+ if (hunks.length > 0) {
1080
+ sourceTag = "native git diff";
1081
+ bodyHtml = hunks.map(h => {
1082
+ const hdr =
1083
+ '<div class="diff-line ctx">' +
1084
+ '<span class="gutter">@</span><span class="ln"></span><span class="code">' + esc(h.header) + '</span>' +
1085
+ '</div>';
1086
+ const body = h.lines.map(L => {
1087
+ const gutter = L.type === "add" ? "+" : L.type === "del" ? "-" : " ";
1088
+ return '<div class="diff-line ' + L.type + '">' +
1089
+ '<span class="gutter">' + gutter + '</span>' +
1090
+ '<span class="ln">' + L.ln + '</span>' +
1091
+ '<span class="code">' + esc(L.text) + '</span>' +
1092
+ '</div>';
1093
+ }).join("");
1094
+ return hdr + body;
1095
+ }).join("");
1096
+ } else {
1097
+ // Fallback when git diff capture was unavailable (no git, untracked
1098
+ // file, etc.). Render the single before/after pair the engine carried
1099
+ // over from the legacy code path.
1100
+ sourceTag = "fallback (no git diff captured)";
1101
+ const oldLine = ev.oldCodeLine || "";
1102
+ const newLine = ev.newCodeLine || "";
1103
+ bodyHtml =
1104
+ '<div class="diff-line del">' +
1105
+ '<span class="gutter">-</span><span class="ln">' + (ev.newLineNumber || "") + '</span><span class="code">' + esc(oldLine) + '</span>' +
1106
+ '</div>' +
1107
+ '<div class="diff-line add">' +
1108
+ '<span class="gutter">+</span><span class="ln">' + (ev.newLineNumber || "") + '</span><span class="code">' + esc(newLine) + '</span>' +
1109
+ '</div>';
1110
+ }
1111
+
952
1112
  return (
953
1113
  '<div class="diff">' +
954
1114
  '<div class="diff-head">' +
@@ -957,14 +1117,21 @@ const REPORT_JS = String.raw `
957
1117
  '<span>line ' + ev.newLineNumber + '</span>' +
958
1118
  (ev.diffStrategy ? '<span class="muted">·</span><span>strategy: ' + esc(ev.diffStrategy) + '</span>' : "") +
959
1119
  (ev.blastRadius != null ? '<span class="muted">·</span><span>blast radius: ' + ev.blastRadius + '</span>' : "") +
1120
+ '<span class="muted">·</span><span>' + sourceTag + '</span>' +
960
1121
  '</div>' +
961
- '<div class="diff-body">' +
962
- '<div class="diff-line del">' +
963
- '<span class="gutter">-</span><span class="ln">' + ev.newLineNumber + '</span><span class="code">' + esc(oldLine) + '</span>' +
964
- '</div>' +
965
- '<div class="diff-line add">' +
966
- '<span class="gutter">+</span><span class="ln">' + ev.newLineNumber + '</span><span class="code">' + esc(newLine) + '</span>' +
967
- '</div>' +
1122
+ '<div class="diff-body">' + bodyHtml + '</div>' +
1123
+ '</div>'
1124
+ );
1125
+ }
1126
+
1127
+ function renderFailureContext(ev) {
1128
+ if (ev.kind !== "FAILED" || !ev.failureScreenshotPng) return "";
1129
+ return (
1130
+ '<div class="section">' +
1131
+ '<div class="section-title"><span class="marker"></span>Failure Context · Playwright Screenshot</div>' +
1132
+ '<div class="failure-img">' +
1133
+ '<img src="data:image/png;base64,' + ev.failureScreenshotPng + '" alt="Playwright failure screenshot" loading="lazy" />' +
1134
+ '<div class="img-meta">captured by SelaReporter at test failure · base64-embedded · survives Playwright temp cleanup</div>' +
968
1135
  '</div>' +
969
1136
  '</div>'
970
1137
  );
@@ -1059,7 +1226,10 @@ const REPORT_JS = String.raw `
1059
1226
  '</div>'
1060
1227
  );
1061
1228
 
1062
- // 5. Alternatives
1229
+ // 5. Failure Context — Playwright screenshot (FAILED only)
1230
+ blocks.push(renderFailureContext(ev));
1231
+
1232
+ // 6. Alternatives
1063
1233
  blocks.push(renderAlts(ev));
1064
1234
 
1065
1235
  // 6. Actions
@@ -0,0 +1,135 @@
1
+ import type { SmartChainSegment, SelectorSegment } from "./LLMService";
2
+ export type HealCacheMode = "action" | "assertion";
3
+ export interface CacheKeyInput {
4
+ /** Absolute or project-relative spec path containing the failing locator. */
5
+ filePath: string;
6
+ /** 1-based line of the failing call site — paired with filePath as a fingerprint. */
7
+ line: number;
8
+ /**
9
+ * Stable content hash of the DNA snapshot used to drive the heal. When the
10
+ * DNA rewrites, this changes — every cached entry for the old DNA
11
+ * silently stops matching and ages out via TTL.
12
+ */
13
+ dnaContentHash: string;
14
+ /** The original broken selector. */
15
+ brokenSelector: string;
16
+ /** Heal mode the cached fix was produced under. */
17
+ mode: HealCacheMode;
18
+ }
19
+ export interface HealingCacheEntry {
20
+ /** Full SHA1 of the CacheKeyInput tuple. */
21
+ key: string;
22
+ filePath: string;
23
+ line: number;
24
+ dnaContentHash: string;
25
+ brokenSelector: string;
26
+ mode: HealCacheMode;
27
+ healedSelector: string;
28
+ chainSegments?: SmartChainSegment[];
29
+ segments?: SelectorSegment[];
30
+ confidence?: number;
31
+ contentChange?: {
32
+ oldText: string;
33
+ newText: string;
34
+ };
35
+ explanation?: string;
36
+ alternatives?: string[];
37
+ /**
38
+ * True when SafetyGuard cleared this fix in the originating session
39
+ * (SAFE or REQUIRES_REVIEW). Unsafe entries are never replayed.
40
+ */
41
+ safe: boolean;
42
+ createdAt: string;
43
+ /** ISO timestamp after which the entry is considered expired and ignored. */
44
+ ttlExpiresAt: string;
45
+ lastHitAt?: string;
46
+ hitCount: number;
47
+ }
48
+ interface CacheFile {
49
+ schemaVersion: 1;
50
+ entries: Record<string, HealingCacheEntry>;
51
+ }
52
+ export interface HealingCacheSetInput extends CacheKeyInput {
53
+ healedSelector: string;
54
+ chainSegments?: SmartChainSegment[];
55
+ segments?: SelectorSegment[];
56
+ confidence?: number;
57
+ contentChange?: {
58
+ oldText: string;
59
+ newText: string;
60
+ };
61
+ explanation?: string;
62
+ alternatives?: string[];
63
+ safe: boolean;
64
+ /** Optional override for entry-level TTL (ms). Defaults to env / 7d. */
65
+ ttlMs?: number;
66
+ }
67
+ export declare function computeCacheKey(input: CacheKeyInput): string;
68
+ /**
69
+ * Convenience helper — fingerprint the JSON form of a DNA snapshot so
70
+ * the cache key changes whenever the DNA is rewritten.
71
+ */
72
+ export declare function hashDnaContent(dna: unknown): string;
73
+ export declare class HealingCacheService {
74
+ private readonly cacheDir;
75
+ private readonly filename;
76
+ private readonly lockDir;
77
+ private readonly tmpSuffix;
78
+ private readonly bakSuffix;
79
+ private inFlight;
80
+ constructor(opts?: {
81
+ cacheDir?: string;
82
+ filename?: string;
83
+ });
84
+ /**
85
+ * Read-only lookup. Bumps `hitCount` / `lastHitAt` IN-MEMORY only on
86
+ * the returned entry reference — never persisted on the get() path.
87
+ * This eliminates the read-write race where parallel workers each
88
+ * call get() and serialise full entries-map snapshots back to disk,
89
+ * overwriting peer set() operations.
90
+ */
91
+ get(input: CacheKeyInput): HealingCacheEntry | null;
92
+ /**
93
+ * Persist a new cache entry. Serialises against in-process writers
94
+ * AND across processes via the mkdir lock. The in-process chain
95
+ * isolates each `await` so a rejected upstream Promise never
96
+ * deadlocks downstream callers.
97
+ */
98
+ set(input: HealingCacheSetInput): Promise<void>;
99
+ /** Synchronous variant — used by teardown / CLI paths. */
100
+ setSync(input: HealingCacheSetInput): void;
101
+ /** Wipe every entry. Used by tests and the (forthcoming) `sela cache clear` CLI. */
102
+ clear(): void;
103
+ /** Returns the parsed cache file (or an empty shell on failure). */
104
+ read(): CacheFile;
105
+ /** Absolute path of the on-disk cache file. */
106
+ filePath(): string;
107
+ /**
108
+ * Prunes expired entries. Cheap O(n) scan — intended for engine
109
+ * startup. Returns the number of entries removed.
110
+ */
111
+ pruneExpired(): number;
112
+ private isExpired;
113
+ private lockedWrite;
114
+ private buildEntry;
115
+ /**
116
+ * Reads + parses the cache file. Tolerates every realistic failure
117
+ * (missing, empty, malformed, wrong schema version) by returning a
118
+ * fresh empty shell — the contract is "cache misses are silent".
119
+ */
120
+ private safeRead;
121
+ /**
122
+ * Atomic write: write to `<file>.tmp`, copy current to `<file>.bak`,
123
+ * then rename `<file>.tmp` → `<file>`. The rename is the single
124
+ * commit point — a crash between bak and rename leaves the bak file
125
+ * intact for future recovery.
126
+ */
127
+ private atomicWrite;
128
+ private acquireLockWithBackoff;
129
+ private tryAcquireLock;
130
+ private withFileLockSync;
131
+ private releaseLock;
132
+ }
133
+ export declare const sharedHealingCache: HealingCacheService;
134
+ export {};
135
+ //# sourceMappingURL=HealingCacheService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HealingCacheService.d.ts","sourceRoot":"","sources":["../../src/services/HealingCacheService.ts"],"names":[],"mappings":"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"}