purecontext-mcp 1.1.7 → 1.2.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 (182) hide show
  1. package/AGENT_INSTRUCTIONS.md +393 -0
  2. package/AGENT_INSTRUCTIONS_SHORT.md +53 -0
  3. package/AST-SEARCH.md +274 -0
  4. package/CHANGELOG.md +62 -0
  5. package/CODE-INTELLIGENCE.md +369 -0
  6. package/HEALTH-DASHBOARDS.md +241 -0
  7. package/README.md +7 -0
  8. package/REFACTORING-SAFELY.md +279 -0
  9. package/UNDERSTANDING-RELATIONSHIPS.md +240 -0
  10. package/USER-GUIDE.md +14 -0
  11. package/VISUALIZING-CODE.md +199 -0
  12. package/WORKFLOW-TECH-DEBT.md +286 -0
  13. package/dist/core/db/dep-store.d.ts +75 -0
  14. package/dist/core/db/dep-store.d.ts.map +1 -1
  15. package/dist/core/db/dep-store.js +277 -0
  16. package/dist/core/db/dep-store.js.map +1 -1
  17. package/dist/core/db/schema.d.ts.map +1 -1
  18. package/dist/core/db/schema.js +12 -0
  19. package/dist/core/db/schema.js.map +1 -1
  20. package/dist/core/index-manager.js +1 -1
  21. package/dist/core/index-manager.js.map +1 -1
  22. package/dist/core/token-tracker.d.ts +0 -9
  23. package/dist/core/token-tracker.d.ts.map +1 -1
  24. package/dist/core/token-tracker.js +0 -21
  25. package/dist/core/token-tracker.js.map +1 -1
  26. package/dist/core/types.d.ts +5 -0
  27. package/dist/core/types.d.ts.map +1 -1
  28. package/dist/graph/diagram-renderer.d.ts +83 -0
  29. package/dist/graph/diagram-renderer.d.ts.map +1 -0
  30. package/dist/graph/diagram-renderer.js +294 -0
  31. package/dist/graph/diagram-renderer.js.map +1 -0
  32. package/dist/graph/graph-traversal.d.ts +92 -0
  33. package/dist/graph/graph-traversal.d.ts.map +1 -1
  34. package/dist/graph/graph-traversal.js +440 -2
  35. package/dist/graph/graph-traversal.js.map +1 -1
  36. package/dist/server/http-server.d.ts.map +1 -1
  37. package/dist/server/http-server.js +30 -1
  38. package/dist/server/http-server.js.map +1 -1
  39. package/dist/server/mcp-server.d.ts.map +1 -1
  40. package/dist/server/mcp-server.js +145 -0
  41. package/dist/server/mcp-server.js.map +1 -1
  42. package/dist/server/tools/_meta.d.ts +0 -2
  43. package/dist/server/tools/_meta.d.ts.map +1 -1
  44. package/dist/server/tools/_meta.js +1 -4
  45. package/dist/server/tools/_meta.js.map +1 -1
  46. package/dist/server/tools/check-delete-safe.d.ts +50 -0
  47. package/dist/server/tools/check-delete-safe.d.ts.map +1 -0
  48. package/dist/server/tools/check-delete-safe.js +308 -0
  49. package/dist/server/tools/check-delete-safe.js.map +1 -0
  50. package/dist/server/tools/check-move-safe.d.ts +44 -0
  51. package/dist/server/tools/check-move-safe.d.ts.map +1 -0
  52. package/dist/server/tools/check-move-safe.js +266 -0
  53. package/dist/server/tools/check-move-safe.js.map +1 -0
  54. package/dist/server/tools/check-rename-safe.d.ts +48 -0
  55. package/dist/server/tools/check-rename-safe.d.ts.map +1 -0
  56. package/dist/server/tools/check-rename-safe.js +218 -0
  57. package/dist/server/tools/check-rename-safe.js.map +1 -0
  58. package/dist/server/tools/diff-health-radar.d.ts +44 -0
  59. package/dist/server/tools/diff-health-radar.d.ts.map +1 -0
  60. package/dist/server/tools/diff-health-radar.js +192 -0
  61. package/dist/server/tools/diff-health-radar.js.map +1 -0
  62. package/dist/server/tools/find-cycles.d.ts +31 -0
  63. package/dist/server/tools/find-cycles.d.ts.map +1 -0
  64. package/dist/server/tools/find-cycles.js +85 -0
  65. package/dist/server/tools/find-cycles.js.map +1 -0
  66. package/dist/server/tools/find-implementations.d.ts +47 -0
  67. package/dist/server/tools/find-implementations.d.ts.map +1 -0
  68. package/dist/server/tools/find-implementations.js +167 -0
  69. package/dist/server/tools/find-implementations.js.map +1 -0
  70. package/dist/server/tools/find-untested-symbols.d.ts +52 -0
  71. package/dist/server/tools/find-untested-symbols.d.ts.map +1 -0
  72. package/dist/server/tools/find-untested-symbols.js +308 -0
  73. package/dist/server/tools/find-untested-symbols.js.map +1 -0
  74. package/dist/server/tools/get-architecture-snapshot.d.ts +43 -0
  75. package/dist/server/tools/get-architecture-snapshot.d.ts.map +1 -0
  76. package/dist/server/tools/get-architecture-snapshot.js +292 -0
  77. package/dist/server/tools/get-architecture-snapshot.js.map +1 -0
  78. package/dist/server/tools/get-call-hierarchy.d.ts +43 -0
  79. package/dist/server/tools/get-call-hierarchy.d.ts.map +1 -0
  80. package/dist/server/tools/get-call-hierarchy.js +119 -0
  81. package/dist/server/tools/get-call-hierarchy.js.map +1 -0
  82. package/dist/server/tools/get-class-hierarchy.d.ts +36 -0
  83. package/dist/server/tools/get-class-hierarchy.d.ts.map +1 -0
  84. package/dist/server/tools/get-class-hierarchy.js +125 -0
  85. package/dist/server/tools/get-class-hierarchy.js.map +1 -0
  86. package/dist/server/tools/get-complexity-hotspots.d.ts +50 -0
  87. package/dist/server/tools/get-complexity-hotspots.d.ts.map +1 -0
  88. package/dist/server/tools/get-complexity-hotspots.js +282 -0
  89. package/dist/server/tools/get-complexity-hotspots.js.map +1 -0
  90. package/dist/server/tools/get-coupling-map.d.ts +39 -0
  91. package/dist/server/tools/get-coupling-map.d.ts.map +1 -0
  92. package/dist/server/tools/get-coupling-map.js +107 -0
  93. package/dist/server/tools/get-coupling-map.js.map +1 -0
  94. package/dist/server/tools/get-debt-report.d.ts +44 -0
  95. package/dist/server/tools/get-debt-report.d.ts.map +1 -0
  96. package/dist/server/tools/get-debt-report.js +606 -0
  97. package/dist/server/tools/get-debt-report.js.map +1 -0
  98. package/dist/server/tools/get-entry-points.d.ts +79 -0
  99. package/dist/server/tools/get-entry-points.d.ts.map +1 -0
  100. package/dist/server/tools/get-entry-points.js +362 -0
  101. package/dist/server/tools/get-entry-points.js.map +1 -0
  102. package/dist/server/tools/get-public-api.d.ts +53 -0
  103. package/dist/server/tools/get-public-api.d.ts.map +1 -0
  104. package/dist/server/tools/get-public-api.js +218 -0
  105. package/dist/server/tools/get-public-api.js.map +1 -0
  106. package/dist/server/tools/get-savings-stats.d.ts.map +1 -1
  107. package/dist/server/tools/get-savings-stats.js +1 -3
  108. package/dist/server/tools/get-savings-stats.js.map +1 -1
  109. package/dist/server/tools/get-test-coverage-map.d.ts +66 -0
  110. package/dist/server/tools/get-test-coverage-map.d.ts.map +1 -0
  111. package/dist/server/tools/get-test-coverage-map.js +588 -0
  112. package/dist/server/tools/get-test-coverage-map.js.map +1 -0
  113. package/dist/server/tools/get-todos.d.ts +51 -0
  114. package/dist/server/tools/get-todos.d.ts.map +1 -0
  115. package/dist/server/tools/get-todos.js +180 -0
  116. package/dist/server/tools/get-todos.js.map +1 -0
  117. package/dist/server/tools/get-type-graph.d.ts +73 -0
  118. package/dist/server/tools/get-type-graph.d.ts.map +1 -0
  119. package/dist/server/tools/get-type-graph.js +437 -0
  120. package/dist/server/tools/get-type-graph.js.map +1 -0
  121. package/dist/server/tools/health-radar.d.ts +50 -0
  122. package/dist/server/tools/health-radar.d.ts.map +1 -0
  123. package/dist/server/tools/health-radar.js +426 -0
  124. package/dist/server/tools/health-radar.js.map +1 -0
  125. package/dist/server/tools/plan-refactoring.d.ts +74 -0
  126. package/dist/server/tools/plan-refactoring.d.ts.map +1 -0
  127. package/dist/server/tools/plan-refactoring.js +644 -0
  128. package/dist/server/tools/plan-refactoring.js.map +1 -0
  129. package/dist/server/tools/render-call-graph.d.ts +40 -0
  130. package/dist/server/tools/render-call-graph.d.ts.map +1 -0
  131. package/dist/server/tools/render-call-graph.js +215 -0
  132. package/dist/server/tools/render-call-graph.js.map +1 -0
  133. package/dist/server/tools/render-class-hierarchy.d.ts +42 -0
  134. package/dist/server/tools/render-class-hierarchy.d.ts.map +1 -0
  135. package/dist/server/tools/render-class-hierarchy.js +265 -0
  136. package/dist/server/tools/render-class-hierarchy.js.map +1 -0
  137. package/dist/server/tools/render-dep-matrix.d.ts +38 -0
  138. package/dist/server/tools/render-dep-matrix.d.ts.map +1 -0
  139. package/dist/server/tools/render-dep-matrix.js +186 -0
  140. package/dist/server/tools/render-dep-matrix.js.map +1 -0
  141. package/dist/server/tools/render-diagram.d.ts +47 -0
  142. package/dist/server/tools/render-diagram.d.ts.map +1 -0
  143. package/dist/server/tools/render-diagram.js +266 -0
  144. package/dist/server/tools/render-diagram.js.map +1 -0
  145. package/dist/server/tools/render-import-graph.d.ts +41 -0
  146. package/dist/server/tools/render-import-graph.d.ts.map +1 -0
  147. package/dist/server/tools/render-import-graph.js +158 -0
  148. package/dist/server/tools/render-import-graph.js.map +1 -0
  149. package/dist/server/tools/search-ast.d.ts +55 -0
  150. package/dist/server/tools/search-ast.d.ts.map +1 -0
  151. package/dist/server/tools/search-ast.js +279 -0
  152. package/dist/server/tools/search-ast.js.map +1 -0
  153. package/dist/server/tools/search-by-complexity.d.ts +92 -0
  154. package/dist/server/tools/search-by-complexity.d.ts.map +1 -0
  155. package/dist/server/tools/search-by-complexity.js +268 -0
  156. package/dist/server/tools/search-by-complexity.js.map +1 -0
  157. package/dist/server/tools/search-by-decorator.d.ts +48 -0
  158. package/dist/server/tools/search-by-decorator.d.ts.map +1 -0
  159. package/dist/server/tools/search-by-decorator.js +518 -0
  160. package/dist/server/tools/search-by-decorator.js.map +1 -0
  161. package/dist/server/tools/search-by-signature.d.ts +56 -0
  162. package/dist/server/tools/search-by-signature.d.ts.map +1 -0
  163. package/dist/server/tools/search-by-signature.js +200 -0
  164. package/dist/server/tools/search-by-signature.js.map +1 -0
  165. package/dist/ui/assets/BlastRadius-QdgESOL8.js +1 -0
  166. package/dist/ui/assets/{DependencyGraph-CDtBHM0U.js → DependencyGraph-BSMhzwWV.js} +6 -6
  167. package/dist/ui/assets/{NotFound-Cdt6X8pl.js → NotFound-CipFP_s1.js} +1 -1
  168. package/dist/ui/assets/RepoDetail-Dfp5z5Kq.js +1 -0
  169. package/dist/ui/assets/{RepoList-B9LaZvob.js → RepoList-BKtST3hB.js} +1 -1
  170. package/dist/ui/assets/{Search-CLqv2KGV.js → Search-DzhGDViy.js} +1 -1
  171. package/dist/ui/assets/{SymbolView-BlbDR1DU.js → SymbolView-ryVEwAHG.js} +1 -1
  172. package/dist/ui/assets/{index-DADf5y_L.css → index-Ny8gn9F0.css} +1 -1
  173. package/dist/ui/assets/{index-i3Q1XbEh.js → index-nX2chMqi.js} +6 -6
  174. package/dist/ui/assets/{useSearch-mbMk6-M1.js → useSearch-BnBCRKui.js} +1 -1
  175. package/dist/ui/index.html +2 -2
  176. package/dist/version.d.ts +1 -1
  177. package/dist/version.js +1 -1
  178. package/docs/dev/jcodemunch-gap-analysis.md +198 -0
  179. package/package.json +9 -1
  180. package/user-manual.md +2466 -0
  181. package/dist/ui/assets/BlastRadius-BDZWhEk-.js +0 -1
  182. package/dist/ui/assets/RepoDetail-M6WaYbZ3.js +0 -1
@@ -0,0 +1,588 @@
1
+ /**
2
+ * get-test-coverage-map.ts
3
+ *
4
+ * MCP tool: get_test_coverage_map
5
+ *
6
+ * Parses a coverage JSON report (Istanbul/NYC or V8/c8 format) and maps
7
+ * line-level coverage data to symbols in the indexed codebase. Returns
8
+ * per-file coverage metrics and per-symbol covered/uncovered status.
9
+ *
10
+ * Supported formats:
11
+ * Istanbul/NYC — coverage-final.json produced by nyc, jest --coverage,
12
+ * vitest --coverage.reporter=json, c8 (json reporter).
13
+ * Keys are absolute file paths; values have statementMap,
14
+ * fnMap, branchMap, s, f, b counters.
15
+ *
16
+ * V8 — coverage produced by Node --experimental-vm-modules or
17
+ * c8 json-summary. An array of {url, functions} objects
18
+ * where url is a file:// URI and functions carry byte-range
19
+ * hit counts.
20
+ *
21
+ * Detection strategy:
22
+ * - Top-level object → Istanbul
23
+ * - Top-level array → V8
24
+ * Auto-detected by default; override with the `format` parameter.
25
+ *
26
+ * Symbol coverage:
27
+ * Symbols are matched to coverage functions by exact name. If no name
28
+ * match is found, line-range overlap is used as a fallback.
29
+ * This is a static heuristic — minified or transpiled code may reduce
30
+ * accuracy. For precise coverage, ensure the coverage report was generated
31
+ * from the same (or source-mapped) code that was indexed.
32
+ *
33
+ * Differs from related tools:
34
+ * find_untested_symbols — name-based heuristic, no coverage file needed
35
+ * get_complexity_hotspots — complexity ranking without coverage data
36
+ * get_quality_metrics — per-symbol quality scoring, not coverage
37
+ */
38
+ import { z } from 'zod';
39
+ import { readFileSync } from 'fs';
40
+ import { openDatabase, getRepo } from '../../core/db/schema.js';
41
+ import { buildMeta } from './_meta.js';
42
+ export const name = 'get_test_coverage_map';
43
+ export const description = 'Parse a coverage JSON report (Istanbul/NYC or V8/c8 format) and map ' +
44
+ 'line-level coverage to symbols in the indexed codebase. Returns per-file ' +
45
+ 'statement, function, branch, and line coverage metrics together with ' +
46
+ 'per-symbol covered/uncovered status and call counts. ' +
47
+ 'Use this to answer "which functions are untested?" with line-accuracy, ' +
48
+ 'or to build a coverage heat map across the codebase.' +
49
+ '\n\nSupported report formats: Istanbul/NYC (coverage-final.json), ' +
50
+ 'V8/c8 (json reporter). Format is auto-detected.' +
51
+ '\n\nDiffers from related tools:' +
52
+ '\n find_untested_symbols — name-based heuristic, no coverage file needed' +
53
+ '\n get_complexity_hotspots — complexity ranking without coverage data' +
54
+ '\n get_quality_metrics — per-symbol quality scoring, not coverage';
55
+ // ─── Input schema ──────────────────────────────────────────────────────────────
56
+ export const inputSchema = {
57
+ repoId: z.string().describe('Repository ID returned by index_folder or list_repos'),
58
+ coveragePath: z
59
+ .string()
60
+ .describe('Absolute path to the coverage JSON file ' +
61
+ '(e.g. "/project/coverage/coverage-final.json"). ' +
62
+ 'Supports Istanbul/NYC and V8/c8 formats.'),
63
+ scope: z
64
+ .string()
65
+ .optional()
66
+ .describe('Restrict to a directory prefix (e.g. "src/services/"). ' +
67
+ 'Omit to analyse the whole repo.'),
68
+ filePath: z
69
+ .string()
70
+ .optional()
71
+ .describe('Restrict to a specific source file (relative to repo root).'),
72
+ minCoverage: z
73
+ .number().min(0).max(100)
74
+ .optional()
75
+ .describe('Return only files whose line coverage is BELOW this threshold (0–100). ' +
76
+ 'Omit to return all covered files.'),
77
+ includeUncoveredLines: z
78
+ .boolean()
79
+ .optional()
80
+ .describe('When true, include the list of uncovered line numbers per file. ' +
81
+ 'Default false (keeps response size small).'),
82
+ limit: z
83
+ .number().int().min(1).max(100)
84
+ .optional()
85
+ .describe('Maximum number of files to return (default 20).'),
86
+ format: z
87
+ .enum(['auto', 'istanbul', 'v8'])
88
+ .optional()
89
+ .describe('Coverage format. Default "auto" (detect from JSON structure).'),
90
+ };
91
+ // ─── Helpers ───────────────────────────────────────────────────────────────────
92
+ /**
93
+ * Detect the coverage format from the parsed JSON value.
94
+ */
95
+ function detectFormat(parsed) {
96
+ if (Array.isArray(parsed)) {
97
+ // V8: array of { url, functions } objects
98
+ return 'v8';
99
+ }
100
+ if (parsed !== null && typeof parsed === 'object') {
101
+ // Istanbul: keys are file paths; values have statementMap, s, fnMap, f
102
+ return 'istanbul';
103
+ }
104
+ return null;
105
+ }
106
+ /**
107
+ * Normalise a path to forward-slash form for cross-platform comparison.
108
+ */
109
+ function normSlashes(p) {
110
+ return p.replace(/\\/g, '/');
111
+ }
112
+ /**
113
+ * Convert a `file://` URL to an absolute path string.
114
+ * Handles Windows drive letters (file:///D:/path → D:/path).
115
+ */
116
+ function fileUrlToPath(url) {
117
+ if (url.startsWith('file:///')) {
118
+ const p = decodeURIComponent(url.slice(8));
119
+ // Windows: starts with drive letter
120
+ if (/^[A-Za-z]:/.test(p))
121
+ return p;
122
+ return '/' + p;
123
+ }
124
+ if (url.startsWith('file://')) {
125
+ return decodeURIComponent(url.slice(7));
126
+ }
127
+ return url;
128
+ }
129
+ /**
130
+ * Try to resolve an absolute coverage path to a path relative to repoRoot.
131
+ * Returns null if the file is outside the repo.
132
+ */
133
+ function toRelativePath(absPath, repoRoot) {
134
+ const norm = normSlashes(absPath);
135
+ const root = normSlashes(repoRoot).replace(/\/$/, '');
136
+ if (norm.startsWith(root + '/')) {
137
+ return norm.slice(root.length + 1);
138
+ }
139
+ return null;
140
+ }
141
+ /**
142
+ * Compute the 1-based line number of a byte offset in a buffer.
143
+ */
144
+ function lineOf(buf, byteOffset) {
145
+ const limit = Math.min(byteOffset, buf.length);
146
+ let line = 1;
147
+ for (let i = 0; i < limit; i++) {
148
+ if (buf[i] === 0x0a)
149
+ line++;
150
+ }
151
+ return line;
152
+ }
153
+ /**
154
+ * Compute covered and uncovered line sets from an Istanbul statementMap + s.
155
+ */
156
+ function computeIstanbulLines(statementMap, s) {
157
+ // line → whether any statement on this line was executed
158
+ const lineAny = new Map();
159
+ for (const [idx, range] of Object.entries(statementMap)) {
160
+ const count = s[idx] ?? 0;
161
+ const line = range.start.line;
162
+ const prev = lineAny.get(line) ?? false;
163
+ lineAny.set(line, prev || count > 0);
164
+ }
165
+ const covered = new Set();
166
+ const uncovered = new Set();
167
+ for (const [line, isCovered] of lineAny) {
168
+ if (isCovered)
169
+ covered.add(line);
170
+ else
171
+ uncovered.add(line);
172
+ }
173
+ return { covered, uncovered };
174
+ }
175
+ /**
176
+ * From an Istanbul fnMap + f, find the call count for a symbol name.
177
+ * Falls back to line-range overlap.
178
+ */
179
+ function istanbulFnCallCount(symbolName, symbolStartLine, symbolEndLine, fnMap, f) {
180
+ // 1. Exact name match
181
+ for (const [idx, fn] of Object.entries(fnMap)) {
182
+ if (fn.name === symbolName) {
183
+ return f[idx] ?? 0;
184
+ }
185
+ }
186
+ // 2. Line-range overlap: function's start line inside symbol's lines
187
+ for (const [idx, fn] of Object.entries(fnMap)) {
188
+ const fnLine = fn.loc.start.line;
189
+ if (fnLine >= symbolStartLine && fnLine <= symbolEndLine) {
190
+ return f[idx] ?? 0;
191
+ }
192
+ }
193
+ return null;
194
+ }
195
+ /**
196
+ * From a V8 script's functions, find the call count for a symbol name.
197
+ * Returns null when no match found.
198
+ */
199
+ function v8FnCallCount(symbolName, functions) {
200
+ for (const fn of functions) {
201
+ if (fn.functionName === symbolName) {
202
+ // Max count across ranges indicates the function was called
203
+ return fn.ranges.reduce((max, r) => Math.max(max, r.count), 0);
204
+ }
205
+ }
206
+ return null;
207
+ }
208
+ /**
209
+ * Compute V8 function coverage metrics for a script.
210
+ */
211
+ function computeV8FunctionCoverage(functions) {
212
+ // Skip "(top-level)" / "(anonymous)" entries that wrap the module
213
+ const named = functions.filter((fn) => fn.functionName !== '' &&
214
+ fn.functionName !== '(top-level)' &&
215
+ !fn.functionName.startsWith('(anonymous'));
216
+ const total = named.length;
217
+ const covered = named.filter((fn) => fn.ranges.some((r) => r.count > 0)).length;
218
+ return { totalFunctions: total, coveredFunctions: covered };
219
+ }
220
+ /**
221
+ * Compute line coverage from V8 byte ranges + file content.
222
+ * Returns the set of covered lines and uncovered lines.
223
+ */
224
+ function computeV8Lines(content, functions) {
225
+ if (content.length === 0)
226
+ return { covered: new Set(), uncovered: new Set() };
227
+ // Build a per-byte coverage map using function ranges
228
+ const coveredBytes = new Uint8Array(content.length);
229
+ for (const fn of functions) {
230
+ for (const range of fn.ranges) {
231
+ if (range.count > 0) {
232
+ const end = Math.min(range.endOffset, content.length);
233
+ for (let i = range.startOffset; i < end; i++) {
234
+ coveredBytes[i] = 1;
235
+ }
236
+ }
237
+ }
238
+ }
239
+ // Convert to line coverage: a line is covered if any byte on it is covered
240
+ const covered = new Set();
241
+ const uncovered = new Set();
242
+ let line = 1;
243
+ let lineHasCoveredByte = false;
244
+ let lineHasCode = false;
245
+ for (let i = 0; i < content.length; i++) {
246
+ const byte = content[i];
247
+ if (byte !== 0x0a && byte !== 0x0d && byte !== 0x20 && byte !== 0x09) {
248
+ lineHasCode = true;
249
+ }
250
+ if (coveredBytes[i])
251
+ lineHasCoveredByte = true;
252
+ if (byte === 0x0a) {
253
+ if (lineHasCode) {
254
+ if (lineHasCoveredByte)
255
+ covered.add(line);
256
+ else
257
+ uncovered.add(line);
258
+ }
259
+ line++;
260
+ lineHasCoveredByte = false;
261
+ lineHasCode = false;
262
+ }
263
+ }
264
+ // Last line (no trailing newline)
265
+ if (lineHasCode) {
266
+ if (lineHasCoveredByte)
267
+ covered.add(line);
268
+ else
269
+ uncovered.add(line);
270
+ }
271
+ return { covered, uncovered };
272
+ }
273
+ // ─── Istanbul file processing ──────────────────────────────────────────────────
274
+ function processIstanbulFile(relPath, fileCov, symbols, fileContent, includeUncoveredLines) {
275
+ // Statement coverage
276
+ const totalStatements = Object.keys(fileCov.statementMap).length;
277
+ const coveredStatements = Object.values(fileCov.s).filter((c) => c > 0).length;
278
+ const statementCoverage = totalStatements > 0
279
+ ? Math.round((coveredStatements / totalStatements) * 10000) / 100
280
+ : null;
281
+ // Function coverage
282
+ const totalFunctions = Object.keys(fileCov.fnMap).length;
283
+ const coveredFunctions = Object.values(fileCov.f).filter((c) => c > 0).length;
284
+ const functionCoverage = totalFunctions > 0
285
+ ? Math.round((coveredFunctions / totalFunctions) * 10000) / 100
286
+ : 100;
287
+ // Branch coverage
288
+ const totalBranchSides = Object.values(fileCov.b).reduce((sum, arr) => sum + arr.length, 0);
289
+ const coveredBranchSides = Object.values(fileCov.b).reduce((sum, arr) => sum + arr.filter((c) => c > 0).length, 0);
290
+ const branchCoverage = totalBranchSides > 0
291
+ ? Math.round((coveredBranchSides / totalBranchSides) * 10000) / 100
292
+ : null;
293
+ // Line coverage (from statements)
294
+ const { covered: coveredLines, uncovered: uncoveredLines } = computeIstanbulLines(fileCov.statementMap, fileCov.s);
295
+ const totalLines = coveredLines.size + uncoveredLines.size;
296
+ const lineCoverage = totalLines > 0
297
+ ? Math.round((coveredLines.size / totalLines) * 10000) / 100
298
+ : 100;
299
+ // Symbol coverage
300
+ const symbolEntries = [];
301
+ for (const sym of symbols) {
302
+ const startLine = fileContent ? lineOf(fileContent, sym.start_byte) : 1;
303
+ const endByteClamped = Math.min(sym.end_byte, fileContent ? fileContent.length : sym.end_byte);
304
+ const endLine = fileContent ? lineOf(fileContent, endByteClamped) : startLine + (sym.line_count ?? 1) - 1;
305
+ const callCount = istanbulFnCallCount(sym.name, startLine, endLine, fileCov.fnMap, fileCov.f);
306
+ symbolEntries.push({
307
+ symbolId: sym.id,
308
+ name: sym.name,
309
+ kind: sym.kind,
310
+ startLine,
311
+ covered: callCount !== null ? callCount > 0 : false,
312
+ callCount: callCount ?? 0,
313
+ });
314
+ }
315
+ const entry = {
316
+ filePath: relPath,
317
+ lineCoverage,
318
+ statementCoverage,
319
+ functionCoverage,
320
+ branchCoverage,
321
+ totalStatements,
322
+ coveredStatements,
323
+ totalFunctions,
324
+ coveredFunctions,
325
+ totalBranches: Object.keys(fileCov.branchMap).length,
326
+ coveredBranchSides,
327
+ symbols: symbolEntries,
328
+ };
329
+ if (includeUncoveredLines) {
330
+ entry.uncoveredLines = [...uncoveredLines].sort((a, b) => a - b);
331
+ }
332
+ return entry;
333
+ }
334
+ // ─── V8 file processing ────────────────────────────────────────────────────────
335
+ function processV8File(relPath, script, symbols, fileContent, includeUncoveredLines) {
336
+ const { totalFunctions, coveredFunctions } = computeV8FunctionCoverage(script.functions);
337
+ const functionCoverage = totalFunctions > 0
338
+ ? Math.round((coveredFunctions / totalFunctions) * 10000) / 100
339
+ : 100;
340
+ // Line coverage from V8 byte ranges (requires file content)
341
+ let lineCoverage = 100;
342
+ let coveredLineCount = 0;
343
+ let uncoveredLineArr = [];
344
+ const coveredLinesSet = new Set();
345
+ const uncoveredLinesSet = new Set();
346
+ if (fileContent && fileContent.length > 0) {
347
+ const { covered, uncovered } = computeV8Lines(fileContent, script.functions);
348
+ coveredLinesSet.entries();
349
+ const totalLinesWithCode = covered.size + uncovered.size;
350
+ lineCoverage =
351
+ totalLinesWithCode > 0
352
+ ? Math.round((covered.size / totalLinesWithCode) * 10000) / 100
353
+ : 100;
354
+ coveredLineCount = covered.size;
355
+ for (const l of covered)
356
+ coveredLinesSet.add(l);
357
+ for (const l of uncovered)
358
+ uncoveredLinesSet.add(l);
359
+ if (includeUncoveredLines) {
360
+ uncoveredLineArr = [...uncovered].sort((a, b) => a - b);
361
+ }
362
+ }
363
+ // Symbol coverage
364
+ const symbolEntries = [];
365
+ for (const sym of symbols) {
366
+ const startLine = fileContent ? lineOf(fileContent, sym.start_byte) : 1;
367
+ const callCount = v8FnCallCount(sym.name, script.functions);
368
+ symbolEntries.push({
369
+ symbolId: sym.id,
370
+ name: sym.name,
371
+ kind: sym.kind,
372
+ startLine,
373
+ covered: callCount !== null ? callCount > 0 : false,
374
+ callCount: callCount ?? 0,
375
+ });
376
+ }
377
+ const entry = {
378
+ filePath: relPath,
379
+ lineCoverage,
380
+ statementCoverage: null, // V8 doesn't have statement-level data
381
+ functionCoverage,
382
+ branchCoverage: null, // V8 basic format doesn't expose branch data
383
+ totalStatements: 0,
384
+ coveredStatements: 0,
385
+ totalFunctions,
386
+ coveredFunctions,
387
+ totalBranches: 0,
388
+ coveredBranchSides: 0,
389
+ symbols: symbolEntries,
390
+ };
391
+ if (includeUncoveredLines) {
392
+ entry.uncoveredLines = uncoveredLineArr;
393
+ }
394
+ void coveredLineCount; // used above
395
+ return entry;
396
+ }
397
+ // ─── Handler ───────────────────────────────────────────────────────────────────
398
+ export async function handler(args) {
399
+ const t0 = Date.now();
400
+ const { repoId, coveragePath, includeUncoveredLines = false, limit = 20, format = 'auto', } = args;
401
+ const db = openDatabase(repoId);
402
+ try {
403
+ // ── Validate repo ─────────────────────────────────────────────────────────
404
+ const repo = getRepo(db, repoId);
405
+ if (!repo) {
406
+ return {
407
+ content: [{
408
+ type: 'text',
409
+ text: JSON.stringify({ error: `Repo "${repoId}" not found. Run index_folder first.` }),
410
+ }],
411
+ isError: true,
412
+ };
413
+ }
414
+ // ── Read coverage file ────────────────────────────────────────────────────
415
+ let rawJson;
416
+ try {
417
+ rawJson = readFileSync(coveragePath, 'utf8');
418
+ }
419
+ catch {
420
+ return {
421
+ content: [{
422
+ type: 'text',
423
+ text: JSON.stringify({
424
+ error: `Cannot read coverage file: "${coveragePath}". Check the path and permissions.`,
425
+ }),
426
+ }],
427
+ isError: true,
428
+ };
429
+ }
430
+ let parsed;
431
+ try {
432
+ parsed = JSON.parse(rawJson);
433
+ }
434
+ catch {
435
+ return {
436
+ content: [{
437
+ type: 'text',
438
+ text: JSON.stringify({
439
+ error: `Coverage file is not valid JSON: "${coveragePath}".`,
440
+ }),
441
+ }],
442
+ isError: true,
443
+ };
444
+ }
445
+ // ── Detect format ─────────────────────────────────────────────────────────
446
+ const detectedFormat = format !== 'auto' ? format : detectFormat(parsed);
447
+ if (!detectedFormat) {
448
+ return {
449
+ content: [{
450
+ type: 'text',
451
+ text: JSON.stringify({
452
+ error: `Unrecognised coverage format in "${coveragePath}". ` +
453
+ 'Expected Istanbul (object with file paths as keys) or V8 (array of script objects).',
454
+ }),
455
+ }],
456
+ isError: true,
457
+ };
458
+ }
459
+ const repoRoot = repo.rootPath;
460
+ // ── Build coverage entry map: relPath → FileCoverageEntry ─────────────────
461
+ const fileEntries = [];
462
+ if (detectedFormat === 'istanbul') {
463
+ const istanbul = parsed;
464
+ for (const [absPath, fileCov] of Object.entries(istanbul)) {
465
+ const relPath = toRelativePath(absPath, repoRoot);
466
+ if (!relPath)
467
+ continue;
468
+ // Scope / filePath filters
469
+ if (args.scope) {
470
+ const prefix = args.scope.endsWith('/') ? args.scope : `${args.scope}/`;
471
+ if (relPath !== args.scope && !relPath.startsWith(prefix))
472
+ continue;
473
+ }
474
+ if (args.filePath && relPath !== args.filePath)
475
+ continue;
476
+ // Load symbols for this file from DB
477
+ const symbols = db
478
+ .prepare(`SELECT id, name, kind, file_path, start_byte, end_byte,
479
+ signature, summary, COALESCE(line_count, 1) AS line_count
480
+ FROM symbols
481
+ WHERE repo_id = ? AND file_path = ?`)
482
+ .all(repoId, relPath);
483
+ // Load file content for line number computation
484
+ const row = db
485
+ .prepare('SELECT raw_content FROM files WHERE repo_id = ? AND path = ?')
486
+ .get(repoId, relPath);
487
+ const fileContent = row?.raw_content ?? null;
488
+ const entry = processIstanbulFile(relPath, fileCov, symbols, fileContent, includeUncoveredLines);
489
+ fileEntries.push(entry);
490
+ }
491
+ }
492
+ else {
493
+ // V8
494
+ const v8 = parsed;
495
+ for (const script of v8) {
496
+ const absPath = fileUrlToPath(script.url);
497
+ const relPath = toRelativePath(absPath, repoRoot);
498
+ if (!relPath)
499
+ continue;
500
+ // Scope / filePath filters
501
+ if (args.scope) {
502
+ const prefix = args.scope.endsWith('/') ? args.scope : `${args.scope}/`;
503
+ if (relPath !== args.scope && !relPath.startsWith(prefix))
504
+ continue;
505
+ }
506
+ if (args.filePath && relPath !== args.filePath)
507
+ continue;
508
+ const symbols = db
509
+ .prepare(`SELECT id, name, kind, file_path, start_byte, end_byte,
510
+ signature, summary, COALESCE(line_count, 1) AS line_count
511
+ FROM symbols
512
+ WHERE repo_id = ? AND file_path = ?`)
513
+ .all(repoId, relPath);
514
+ const row = db
515
+ .prepare('SELECT raw_content FROM files WHERE repo_id = ? AND path = ?')
516
+ .get(repoId, relPath);
517
+ const fileContent = row?.raw_content ?? null;
518
+ const entry = processV8File(relPath, script, symbols, fileContent, includeUncoveredLines);
519
+ fileEntries.push(entry);
520
+ }
521
+ }
522
+ // ── minCoverage filter ────────────────────────────────────────────────────
523
+ const filteredEntries = args.minCoverage !== undefined
524
+ ? fileEntries.filter((e) => e.lineCoverage < args.minCoverage)
525
+ : fileEntries;
526
+ // ── Sort by lineCoverage ascending (worst coverage first) ─────────────────
527
+ filteredEntries.sort((a, b) => a.lineCoverage - b.lineCoverage);
528
+ // ── Truncation ────────────────────────────────────────────────────────────
529
+ const truncated = filteredEntries.length > limit;
530
+ const visible = filteredEntries.slice(0, limit);
531
+ // ── Summary ───────────────────────────────────────────────────────────────
532
+ const allEntries = filteredEntries; // before truncation
533
+ const avgLineCoverage = allEntries.length > 0
534
+ ? Math.round((allEntries.reduce((s, e) => s + e.lineCoverage, 0) / allEntries.length) * 100) / 100
535
+ : 0;
536
+ const avgFunctionCoverage = allEntries.length > 0
537
+ ? Math.round((allEntries.reduce((s, e) => s + e.functionCoverage, 0) / allEntries.length) * 100) / 100
538
+ : 0;
539
+ const stmtFiles = allEntries.filter((e) => e.statementCoverage !== null);
540
+ const avgStatementCoverage = stmtFiles.length > 0
541
+ ? Math.round((stmtFiles.reduce((s, e) => s + (e.statementCoverage ?? 0), 0) / stmtFiles.length) *
542
+ 100) / 100
543
+ : null;
544
+ const branchFiles = allEntries.filter((e) => e.branchCoverage !== null);
545
+ const avgBranchCoverage = branchFiles.length > 0
546
+ ? Math.round((branchFiles.reduce((s, e) => s + (e.branchCoverage ?? 0), 0) / branchFiles.length) *
547
+ 100) / 100
548
+ : null;
549
+ // Aggregate symbol counts across all entries (not just visible)
550
+ const allSymbols = allEntries.flatMap((e) => e.symbols);
551
+ const totalSymbols = allSymbols.length;
552
+ const coveredSymbols = allSymbols.filter((s) => s.covered).length;
553
+ // ── Token estimate ─────────────────────────────────────────────────────────
554
+ const tokenEstimate = Math.ceil(visible.reduce((sum, e) => sum +
555
+ e.filePath.length +
556
+ e.symbols.reduce((s2, sym) => s2 + sym.name.length + 30, 0) +
557
+ (e.uncoveredLines ? e.uncoveredLines.length * 5 : 0) +
558
+ 120, 0) / 4);
559
+ return {
560
+ content: [{
561
+ type: 'text',
562
+ text: JSON.stringify({
563
+ repoId,
564
+ coveragePath,
565
+ format: detectedFormat,
566
+ summary: {
567
+ totalFiles: allEntries.length,
568
+ avgLineCoverage,
569
+ avgStatementCoverage,
570
+ avgFunctionCoverage,
571
+ avgBranchCoverage,
572
+ totalSymbols,
573
+ coveredSymbols,
574
+ uncoveredSymbols: totalSymbols - coveredSymbols,
575
+ },
576
+ files: visible,
577
+ truncated,
578
+ _tokenEstimate: tokenEstimate,
579
+ _meta: buildMeta({ timingMs: Date.now() - t0 }),
580
+ }, null, 2),
581
+ }],
582
+ };
583
+ }
584
+ finally {
585
+ db.close();
586
+ }
587
+ }
588
+ //# sourceMappingURL=get-test-coverage-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-test-coverage-map.js","sourceRoot":"","sources":["../../../src/server/tools/get-test-coverage-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvC,MAAM,CAAC,MAAM,IAAI,GAAG,uBAAuB,CAAC;AAE5C,MAAM,CAAC,MAAM,WAAW,GACtB,sEAAsE;IACtE,2EAA2E;IAC3E,uEAAuE;IACvE,uDAAuD;IACvD,yEAAyE;IACzE,sDAAsD;IACtD,oEAAoE;IACpE,iDAAiD;IACjD,iCAAiC;IACjC,2EAA2E;IAC3E,wEAAwE;IACxE,oEAAoE,CAAC;AAEvE,kFAAkF;AAElF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;IACnF,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,CACP,0CAA0C;QAC1C,kDAAkD;QAClD,0CAA0C,CAC3C;IACH,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,yDAAyD;QACzD,iCAAiC,CAClC;IACH,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,6DAA6D,CAAC;IAC1E,WAAW,EAAE,CAAC;SACX,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;SACxB,QAAQ,EAAE;SACV,QAAQ,CACP,yEAAyE;QACzE,mCAAmC,CACpC;IACH,qBAAqB,EAAE,CAAC;SACrB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,kEAAkE;QAClE,4CAA4C,CAC7C;IACH,KAAK,EAAE,CAAC;SACL,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;SAC9B,QAAQ,EAAE;SACV,QAAQ,CAAC,iDAAiD,CAAC;IAC9D,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;SAChC,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;CAC7E,CAAC;AAiFF,kFAAkF;AAElF;;GAEG;AACH,SAAS,YAAY,CAAC,MAAe;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,0CAA0C;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClD,uEAAuE;QACvE,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,oCAAoC;QACpC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,OAAe,EAAE,QAAgB;IACvD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,MAAM,CAAC,GAAW,EAAE,UAAkB;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,IAAI,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,YAA2C,EAC3C,CAAyB;IAEzB,yDAAyD;IACzD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC;QACxC,IAAI,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;YAC5B,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,UAAkB,EAClB,eAAuB,EACvB,aAAqB,EACrB,KAAiC,EACjC,CAAyB;IAEzB,sBAAsB;IACtB,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,qEAAqE;IACrE,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,IAAI,MAAM,IAAI,eAAe,IAAI,MAAM,IAAI,aAAa,EAAE,CAAC;YACzD,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CACpB,UAAkB,EAClB,SAAoB;IAEpB,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,EAAE,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACnC,4DAA4D;YAC5D,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,yBAAyB,CAAC,SAAoB;IAIrD,kEAAkE;IAClE,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAC5B,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,YAAY,KAAK,EAAE;QACtB,EAAE,CAAC,YAAY,KAAK,aAAa;QACjC,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAC5C,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAClC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CACnC,CAAC,MAAM,CAAC;IACT,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,OAAe,EACf,SAAoB;IAEpB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAE9E,sDAAsD;IACtD,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACrE,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,YAAY,CAAC,CAAC,CAAC;YAAE,kBAAkB,GAAG,IAAI,CAAC;QAE/C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,kBAAkB;oBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;oBACrC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YACD,IAAI,EAAE,CAAC;YACP,kBAAkB,GAAG,KAAK,CAAC;YAC3B,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,kCAAkC;IAClC,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,kBAAkB;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;YACrC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED,kFAAkF;AAElF,SAAS,mBAAmB,CAC1B,OAAe,EACf,OAAwB,EACxB,OAAoB,EACpB,WAA0B,EAC1B,qBAA8B;IAE9B,qBAAqB;IACrB,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/E,MAAM,iBAAiB,GACrB,eAAe,GAAG,CAAC;QACjB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,iBAAiB,GAAG,eAAe,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG;QACjE,CAAC,CAAC,IAAI,CAAC;IAEX,oBAAoB;IACpB,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACzD,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,gBAAgB,GACpB,cAAc,GAAG,CAAC;QAChB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,cAAc,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG;QAC/D,CAAC,CAAC,GAAG,CAAC;IAEV,kBAAkB;IAClB,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CACtD,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAClC,CAAC;IACF,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CACxD,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CACvD,CAAC;IACF,MAAM,cAAc,GAClB,gBAAgB,GAAG,CAAC;QAClB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG;QACnE,CAAC,CAAC,IAAI,CAAC;IAEX,kCAAkC;IAClC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,GACxD,oBAAoB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;IAC3D,MAAM,YAAY,GAChB,UAAU,GAAG,CAAC;QACZ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,UAAU,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG;QAC5D,CAAC,CAAC,GAAG,CAAC;IAEV,kBAAkB;IAClB,MAAM,aAAa,GAA0B,EAAE,CAAC;IAChD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/F,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAE1G,MAAM,SAAS,GAAG,mBAAmB,CACnC,GAAG,CAAC,IAAI,EACR,SAAS,EACT,OAAO,EACP,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,CAAC,CACV,CAAC;QAEF,aAAa,CAAC,IAAI,CAAC;YACjB,QAAQ,EAAE,GAAG,CAAC,EAAE;YAChB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAkB;YAC5B,SAAS;YACT,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK;YACnD,SAAS,EAAE,SAAS,IAAI,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAsB;QAC/B,QAAQ,EAAE,OAAO;QACjB,YAAY;QACZ,iBAAiB;QACjB,gBAAgB;QAChB,cAAc;QACd,eAAe;QACf,iBAAiB;QACjB,cAAc;QACd,gBAAgB;QAChB,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM;QACpD,kBAAkB;QAClB,OAAO,EAAE,aAAa;KACvB,CAAC;IAEF,IAAI,qBAAqB,EAAE,CAAC;QAC1B,KAAK,CAAC,cAAc,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kFAAkF;AAElF,SAAS,aAAa,CACpB,OAAe,EACf,MAAgB,EAChB,OAAoB,EACpB,WAA0B,EAC1B,qBAA8B;IAE9B,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,yBAAyB,CACpE,MAAM,CAAC,SAAS,CACjB,CAAC;IAEF,MAAM,gBAAgB,GACpB,cAAc,GAAG,CAAC;QAChB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,gBAAgB,GAAG,cAAc,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG;QAC/D,CAAC,CAAC,GAAG,CAAC;IAEV,4DAA4D;IAC5D,IAAI,YAAY,GAAG,GAAG,CAAC;IACvB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,gBAAgB,GAAa,EAAE,CAAC;IACpC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7E,eAAe,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QACzD,YAAY;YACV,kBAAkB,GAAG,CAAC;gBACpB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,kBAAkB,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG;gBAC/D,CAAC,CAAC,GAAG,CAAC;QACV,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,qBAAqB,EAAE,CAAC;YAC1B,gBAAgB,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,aAAa,GAA0B,EAAE,CAAC;IAChD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAExE,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAE5D,aAAa,CAAC,IAAI,CAAC;YACjB,QAAQ,EAAE,GAAG,CAAC,EAAE;YAChB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAkB;YAC5B,SAAS;YACT,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK;YACnD,SAAS,EAAE,SAAS,IAAI,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAsB;QAC/B,QAAQ,EAAE,OAAO;QACjB,YAAY;QACZ,iBAAiB,EAAE,IAAI,EAAE,uCAAuC;QAChE,gBAAgB;QAChB,cAAc,EAAE,IAAI,EAAE,6CAA6C;QACnE,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE,CAAC;QACpB,cAAc;QACd,gBAAgB;QAChB,aAAa,EAAE,CAAC;QAChB,kBAAkB,EAAE,CAAC;QACrB,OAAO,EAAE,aAAa;KACvB,CAAC;IAEF,IAAI,qBAAqB,EAAE,CAAC;QAC1B,KAAK,CAAC,cAAc,GAAG,gBAAgB,CAAC;IAC1C,CAAC;IAED,KAAK,gBAAgB,CAAC,CAAC,aAAa;IAEpC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kFAAkF;AAElF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAS7B;IACC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,EACJ,MAAM,EACN,YAAY,EACZ,qBAAqB,GAAG,KAAK,EAC7B,KAAK,GAAG,EAAE,EACV,MAAM,GAAG,MAAM,GAChB,GAAG,IAAI,CAAC;IAET,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,6EAA6E;QAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,MAAM,sCAAsC,EAAE,CAAC;qBACvF,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,6EAA6E;QAC7E,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,+BAA+B,YAAY,oCAAoC;yBACvF,CAAC;qBACH,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,qCAAqC,YAAY,IAAI;yBAC7D,CAAC;qBACH,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,6EAA6E;QAC7E,MAAM,cAAc,GAClB,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAEpD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,oCAAoC,YAAY,KAAK;gCAC1D,qFAAqF;yBACxF,CAAC;qBACH,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,6EAA6E;QAE7E,MAAM,WAAW,GAAwB,EAAE,CAAC;QAE5C,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAA0B,CAAC;YAE5C,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1D,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAClD,IAAI,CAAC,OAAO;oBAAE,SAAS;gBAEvB,2BAA2B;gBAC3B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;oBACxE,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;wBAAE,SAAS;gBACtE,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBAEzD,qCAAqC;gBACrC,MAAM,OAAO,GAAG,EAAE;qBACf,OAAO,CACN;;;iDAGqC,CACtC;qBACA,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAExB,gDAAgD;gBAChD,MAAM,GAAG,GAAG,EAAE;qBACX,OAAO,CACN,8DAA8D,CAC/D;qBACA,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACxB,MAAM,WAAW,GAAG,GAAG,EAAE,WAAW,IAAI,IAAI,CAAC;gBAE7C,MAAM,KAAK,GAAG,mBAAmB,CAC/B,OAAO,EACP,OAAO,EACP,OAAO,EACP,WAAW,EACX,qBAAqB,CACtB,CAAC;gBACF,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK;YACL,MAAM,EAAE,GAAG,MAAoB,CAAC;YAEhC,KAAK,MAAM,MAAM,IAAI,EAAE,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAClD,IAAI,CAAC,OAAO;oBAAE,SAAS;gBAEvB,2BAA2B;gBAC3B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;oBACxE,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;wBAAE,SAAS;gBACtE,CAAC;gBACD,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBAEzD,MAAM,OAAO,GAAG,EAAE;qBACf,OAAO,CACN;;;iDAGqC,CACtC;qBACA,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAExB,MAAM,GAAG,GAAG,EAAE;qBACX,OAAO,CACN,8DAA8D,CAC/D;qBACA,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACxB,MAAM,WAAW,GAAG,GAAG,EAAE,WAAW,IAAI,IAAI,CAAC;gBAE7C,MAAM,KAAK,GAAG,aAAa,CACzB,OAAO,EACP,MAAM,EACN,OAAO,EACP,WAAW,EACX,qBAAqB,CACtB,CAAC;gBACF,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,6EAA6E;QAC7E,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,KAAK,SAAS;YACpD,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,WAAY,CAAC;YAC/D,CAAC,CAAC,WAAW,CAAC;QAEhB,6EAA6E;QAC7E,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;QAEhE,6EAA6E;QAC7E,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,GAAG,KAAK,CAAC;QACjD,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEhD,6EAA6E;QAC7E,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,oBAAoB;QAExD,MAAM,eAAe,GACnB,UAAU,CAAC,MAAM,GAAG,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,KAAK,CACR,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,GAAG,CAC/E,GAAG,GAAG;YACT,CAAC,CAAC,CAAC,CAAC;QAER,MAAM,mBAAmB,GACvB,UAAU,CAAC,MAAM,GAAG,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,KAAK,CACR,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,GAAG,CACnF,GAAG,GAAG;YACT,CAAC,CAAC,CAAC,CAAC;QAER,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC;QACzE,MAAM,oBAAoB,GACxB,SAAS,CAAC,MAAM,GAAG,CAAC;YAClB,CAAC,CAAC,IAAI,CAAC,KAAK,CACR,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;gBAChF,GAAG,CACN,GAAG,GAAG;YACT,CAAC,CAAC,IAAI,CAAC;QAEX,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC;QACxE,MAAM,iBAAiB,GACrB,WAAW,CAAC,MAAM,GAAG,CAAC;YACpB,CAAC,CAAC,IAAI,CAAC,KAAK,CACR,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;gBACjF,GAAG,CACN,GAAG,GAAG;YACT,CAAC,CAAC,IAAI,CAAC;QAEX,gEAAgE;QAChE,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC;QACvC,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAElE,8EAA8E;QAC9E,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,MAAM,CACZ,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CACT,GAAG;YACH,CAAC,CAAC,QAAQ,CAAC,MAAM;YACjB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,GAAG,EACL,CAAC,CACF,GAAG,CAAC,CACN,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,MAAM;wBACN,YAAY;wBACZ,MAAM,EAAE,cAAc;wBACtB,OAAO,EAAE;4BACP,UAAU,EAAE,UAAU,CAAC,MAAM;4BAC7B,eAAe;4BACf,oBAAoB;4BACpB,mBAAmB;4BACnB,iBAAiB;4BACjB,YAAY;4BACZ,cAAc;4BACd,gBAAgB,EAAE,YAAY,GAAG,cAAc;yBAChD;wBACD,KAAK,EAAE,OAAO;wBACd,SAAS;wBACT,cAAc,EAAE,aAAa;wBAC7B,KAAK,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;qBAChD,EACD,IAAI,EACJ,CAAC,CACF;iBACF,CAAC;SACH,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * get-todos.ts
3
+ *
4
+ * MCP tool: get_todos
5
+ *
6
+ * Scans indexed file content for TODO/FIXME/HACK/NOTE/OPTIMIZE/BUG/XXX
7
+ * comment tags. Returns each occurrence with its file path, line number,
8
+ * tag type, optional assignee (e.g. TODO(alice):), and the comment text.
9
+ *
10
+ * Designed for:
11
+ * - Tracking outstanding work items embedded in source code
12
+ * - Generating a tech-debt inventory from comment annotations
13
+ * - Finding all FIXMEs before a release cutoff
14
+ * - Auditing comment hygiene across a codebase
15
+ */
16
+ import { z } from 'zod';
17
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
18
+ export declare const name = "get_todos";
19
+ export declare const description: string;
20
+ export declare const inputSchema: {
21
+ repoId: z.ZodString;
22
+ tags: z.ZodOptional<z.ZodArray<z.ZodEnum<{
23
+ TODO: "TODO";
24
+ FIXME: "FIXME";
25
+ HACK: "HACK";
26
+ NOTE: "NOTE";
27
+ OPTIMIZE: "OPTIMIZE";
28
+ BUG: "BUG";
29
+ XXX: "XXX";
30
+ }>>>;
31
+ filePath: z.ZodOptional<z.ZodString>;
32
+ assignee: z.ZodOptional<z.ZodString>;
33
+ groupByFile: z.ZodOptional<z.ZodBoolean>;
34
+ limit: z.ZodOptional<z.ZodNumber>;
35
+ };
36
+ export interface TodoItem {
37
+ filePath: string;
38
+ line: number;
39
+ tag: string;
40
+ assignee: string | null;
41
+ text: string;
42
+ }
43
+ export declare function handler(args: {
44
+ repoId: string;
45
+ tags?: string[];
46
+ filePath?: string;
47
+ assignee?: string;
48
+ groupByFile?: boolean;
49
+ limit?: number;
50
+ }): Promise<CallToolResult>;
51
+ //# sourceMappingURL=get-todos.d.ts.map