spec-gen-cli 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 (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1078 -0
  3. package/dist/api/analyze.d.ts +17 -0
  4. package/dist/api/analyze.d.ts.map +1 -0
  5. package/dist/api/analyze.js +109 -0
  6. package/dist/api/analyze.js.map +1 -0
  7. package/dist/api/drift.d.ts +21 -0
  8. package/dist/api/drift.d.ts.map +1 -0
  9. package/dist/api/drift.js +145 -0
  10. package/dist/api/drift.js.map +1 -0
  11. package/dist/api/generate.d.ts +18 -0
  12. package/dist/api/generate.d.ts.map +1 -0
  13. package/dist/api/generate.js +251 -0
  14. package/dist/api/generate.js.map +1 -0
  15. package/dist/api/index.d.ts +39 -0
  16. package/dist/api/index.d.ts.map +1 -0
  17. package/dist/api/index.js +32 -0
  18. package/dist/api/index.js.map +1 -0
  19. package/dist/api/init.d.ts +18 -0
  20. package/dist/api/init.d.ts.map +1 -0
  21. package/dist/api/init.js +82 -0
  22. package/dist/api/init.js.map +1 -0
  23. package/dist/api/run.d.ts +19 -0
  24. package/dist/api/run.d.ts.map +1 -0
  25. package/dist/api/run.js +291 -0
  26. package/dist/api/run.js.map +1 -0
  27. package/dist/api/specs.d.ts +49 -0
  28. package/dist/api/specs.d.ts.map +1 -0
  29. package/dist/api/specs.js +136 -0
  30. package/dist/api/specs.js.map +1 -0
  31. package/dist/api/types.d.ts +176 -0
  32. package/dist/api/types.d.ts.map +1 -0
  33. package/dist/api/types.js +9 -0
  34. package/dist/api/types.js.map +1 -0
  35. package/dist/api/verify.d.ts +20 -0
  36. package/dist/api/verify.d.ts.map +1 -0
  37. package/dist/api/verify.js +117 -0
  38. package/dist/api/verify.js.map +1 -0
  39. package/dist/cli/commands/analyze.d.ts +27 -0
  40. package/dist/cli/commands/analyze.d.ts.map +1 -0
  41. package/dist/cli/commands/analyze.js +485 -0
  42. package/dist/cli/commands/analyze.js.map +1 -0
  43. package/dist/cli/commands/drift.d.ts +9 -0
  44. package/dist/cli/commands/drift.d.ts.map +1 -0
  45. package/dist/cli/commands/drift.js +540 -0
  46. package/dist/cli/commands/drift.js.map +1 -0
  47. package/dist/cli/commands/generate.d.ts +9 -0
  48. package/dist/cli/commands/generate.d.ts.map +1 -0
  49. package/dist/cli/commands/generate.js +633 -0
  50. package/dist/cli/commands/generate.js.map +1 -0
  51. package/dist/cli/commands/init.d.ts +9 -0
  52. package/dist/cli/commands/init.d.ts.map +1 -0
  53. package/dist/cli/commands/init.js +171 -0
  54. package/dist/cli/commands/init.js.map +1 -0
  55. package/dist/cli/commands/mcp.d.ts +638 -0
  56. package/dist/cli/commands/mcp.d.ts.map +1 -0
  57. package/dist/cli/commands/mcp.js +574 -0
  58. package/dist/cli/commands/mcp.js.map +1 -0
  59. package/dist/cli/commands/run.d.ts +24 -0
  60. package/dist/cli/commands/run.d.ts.map +1 -0
  61. package/dist/cli/commands/run.js +546 -0
  62. package/dist/cli/commands/run.js.map +1 -0
  63. package/dist/cli/commands/verify.d.ts +9 -0
  64. package/dist/cli/commands/verify.d.ts.map +1 -0
  65. package/dist/cli/commands/verify.js +417 -0
  66. package/dist/cli/commands/verify.js.map +1 -0
  67. package/dist/cli/commands/view.d.ts +9 -0
  68. package/dist/cli/commands/view.d.ts.map +1 -0
  69. package/dist/cli/commands/view.js +511 -0
  70. package/dist/cli/commands/view.js.map +1 -0
  71. package/dist/cli/index.d.ts +9 -0
  72. package/dist/cli/index.d.ts.map +1 -0
  73. package/dist/cli/index.js +83 -0
  74. package/dist/cli/index.js.map +1 -0
  75. package/dist/core/analyzer/architecture-writer.d.ts +67 -0
  76. package/dist/core/analyzer/architecture-writer.d.ts.map +1 -0
  77. package/dist/core/analyzer/architecture-writer.js +209 -0
  78. package/dist/core/analyzer/architecture-writer.js.map +1 -0
  79. package/dist/core/analyzer/artifact-generator.d.ts +222 -0
  80. package/dist/core/analyzer/artifact-generator.d.ts.map +1 -0
  81. package/dist/core/analyzer/artifact-generator.js +726 -0
  82. package/dist/core/analyzer/artifact-generator.js.map +1 -0
  83. package/dist/core/analyzer/call-graph.d.ts +83 -0
  84. package/dist/core/analyzer/call-graph.d.ts.map +1 -0
  85. package/dist/core/analyzer/call-graph.js +827 -0
  86. package/dist/core/analyzer/call-graph.js.map +1 -0
  87. package/dist/core/analyzer/code-shaper.d.ts +33 -0
  88. package/dist/core/analyzer/code-shaper.d.ts.map +1 -0
  89. package/dist/core/analyzer/code-shaper.js +149 -0
  90. package/dist/core/analyzer/code-shaper.js.map +1 -0
  91. package/dist/core/analyzer/dependency-graph.d.ts +179 -0
  92. package/dist/core/analyzer/dependency-graph.d.ts.map +1 -0
  93. package/dist/core/analyzer/dependency-graph.js +574 -0
  94. package/dist/core/analyzer/dependency-graph.js.map +1 -0
  95. package/dist/core/analyzer/duplicate-detector.d.ts +52 -0
  96. package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -0
  97. package/dist/core/analyzer/duplicate-detector.js +279 -0
  98. package/dist/core/analyzer/duplicate-detector.js.map +1 -0
  99. package/dist/core/analyzer/embedding-service.d.ts +50 -0
  100. package/dist/core/analyzer/embedding-service.d.ts.map +1 -0
  101. package/dist/core/analyzer/embedding-service.js +104 -0
  102. package/dist/core/analyzer/embedding-service.js.map +1 -0
  103. package/dist/core/analyzer/file-walker.d.ts +78 -0
  104. package/dist/core/analyzer/file-walker.d.ts.map +1 -0
  105. package/dist/core/analyzer/file-walker.js +531 -0
  106. package/dist/core/analyzer/file-walker.js.map +1 -0
  107. package/dist/core/analyzer/import-parser.d.ts +91 -0
  108. package/dist/core/analyzer/import-parser.d.ts.map +1 -0
  109. package/dist/core/analyzer/import-parser.js +720 -0
  110. package/dist/core/analyzer/import-parser.js.map +1 -0
  111. package/dist/core/analyzer/index.d.ts +10 -0
  112. package/dist/core/analyzer/index.d.ts.map +1 -0
  113. package/dist/core/analyzer/index.js +10 -0
  114. package/dist/core/analyzer/index.js.map +1 -0
  115. package/dist/core/analyzer/refactor-analyzer.d.ts +80 -0
  116. package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -0
  117. package/dist/core/analyzer/refactor-analyzer.js +339 -0
  118. package/dist/core/analyzer/refactor-analyzer.js.map +1 -0
  119. package/dist/core/analyzer/repository-mapper.d.ts +150 -0
  120. package/dist/core/analyzer/repository-mapper.d.ts.map +1 -0
  121. package/dist/core/analyzer/repository-mapper.js +731 -0
  122. package/dist/core/analyzer/repository-mapper.js.map +1 -0
  123. package/dist/core/analyzer/signature-extractor.d.ts +31 -0
  124. package/dist/core/analyzer/signature-extractor.d.ts.map +1 -0
  125. package/dist/core/analyzer/signature-extractor.js +387 -0
  126. package/dist/core/analyzer/signature-extractor.js.map +1 -0
  127. package/dist/core/analyzer/significance-scorer.d.ts +79 -0
  128. package/dist/core/analyzer/significance-scorer.d.ts.map +1 -0
  129. package/dist/core/analyzer/significance-scorer.js +407 -0
  130. package/dist/core/analyzer/significance-scorer.js.map +1 -0
  131. package/dist/core/analyzer/subgraph-extractor.d.ts +43 -0
  132. package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -0
  133. package/dist/core/analyzer/subgraph-extractor.js +129 -0
  134. package/dist/core/analyzer/subgraph-extractor.js.map +1 -0
  135. package/dist/core/analyzer/vector-index.d.ts +63 -0
  136. package/dist/core/analyzer/vector-index.d.ts.map +1 -0
  137. package/dist/core/analyzer/vector-index.js +169 -0
  138. package/dist/core/analyzer/vector-index.js.map +1 -0
  139. package/dist/core/drift/drift-detector.d.ts +102 -0
  140. package/dist/core/drift/drift-detector.d.ts.map +1 -0
  141. package/dist/core/drift/drift-detector.js +597 -0
  142. package/dist/core/drift/drift-detector.js.map +1 -0
  143. package/dist/core/drift/git-diff.d.ts +55 -0
  144. package/dist/core/drift/git-diff.d.ts.map +1 -0
  145. package/dist/core/drift/git-diff.js +356 -0
  146. package/dist/core/drift/git-diff.js.map +1 -0
  147. package/dist/core/drift/index.d.ts +12 -0
  148. package/dist/core/drift/index.d.ts.map +1 -0
  149. package/dist/core/drift/index.js +9 -0
  150. package/dist/core/drift/index.js.map +1 -0
  151. package/dist/core/drift/spec-mapper.d.ts +73 -0
  152. package/dist/core/drift/spec-mapper.d.ts.map +1 -0
  153. package/dist/core/drift/spec-mapper.js +353 -0
  154. package/dist/core/drift/spec-mapper.js.map +1 -0
  155. package/dist/core/generator/adr-generator.d.ts +32 -0
  156. package/dist/core/generator/adr-generator.d.ts.map +1 -0
  157. package/dist/core/generator/adr-generator.js +192 -0
  158. package/dist/core/generator/adr-generator.js.map +1 -0
  159. package/dist/core/generator/index.d.ts +9 -0
  160. package/dist/core/generator/index.d.ts.map +1 -0
  161. package/dist/core/generator/index.js +12 -0
  162. package/dist/core/generator/index.js.map +1 -0
  163. package/dist/core/generator/mapping-generator.d.ts +54 -0
  164. package/dist/core/generator/mapping-generator.d.ts.map +1 -0
  165. package/dist/core/generator/mapping-generator.js +239 -0
  166. package/dist/core/generator/mapping-generator.js.map +1 -0
  167. package/dist/core/generator/openspec-compat.d.ts +160 -0
  168. package/dist/core/generator/openspec-compat.d.ts.map +1 -0
  169. package/dist/core/generator/openspec-compat.js +523 -0
  170. package/dist/core/generator/openspec-compat.js.map +1 -0
  171. package/dist/core/generator/openspec-format-generator.d.ts +111 -0
  172. package/dist/core/generator/openspec-format-generator.d.ts.map +1 -0
  173. package/dist/core/generator/openspec-format-generator.js +817 -0
  174. package/dist/core/generator/openspec-format-generator.js.map +1 -0
  175. package/dist/core/generator/openspec-writer.d.ts +131 -0
  176. package/dist/core/generator/openspec-writer.d.ts.map +1 -0
  177. package/dist/core/generator/openspec-writer.js +379 -0
  178. package/dist/core/generator/openspec-writer.js.map +1 -0
  179. package/dist/core/generator/prompts.d.ts +35 -0
  180. package/dist/core/generator/prompts.d.ts.map +1 -0
  181. package/dist/core/generator/prompts.js +212 -0
  182. package/dist/core/generator/prompts.js.map +1 -0
  183. package/dist/core/generator/spec-pipeline.d.ts +94 -0
  184. package/dist/core/generator/spec-pipeline.d.ts.map +1 -0
  185. package/dist/core/generator/spec-pipeline.js +474 -0
  186. package/dist/core/generator/spec-pipeline.js.map +1 -0
  187. package/dist/core/generator/stages/stage1-survey.d.ts +19 -0
  188. package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -0
  189. package/dist/core/generator/stages/stage1-survey.js +105 -0
  190. package/dist/core/generator/stages/stage1-survey.js.map +1 -0
  191. package/dist/core/generator/stages/stage2-entities.d.ts +11 -0
  192. package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -0
  193. package/dist/core/generator/stages/stage2-entities.js +67 -0
  194. package/dist/core/generator/stages/stage2-entities.js.map +1 -0
  195. package/dist/core/generator/stages/stage3-services.d.ts +11 -0
  196. package/dist/core/generator/stages/stage3-services.d.ts.map +1 -0
  197. package/dist/core/generator/stages/stage3-services.js +75 -0
  198. package/dist/core/generator/stages/stage3-services.js.map +1 -0
  199. package/dist/core/generator/stages/stage4-api.d.ts +11 -0
  200. package/dist/core/generator/stages/stage4-api.d.ts.map +1 -0
  201. package/dist/core/generator/stages/stage4-api.js +65 -0
  202. package/dist/core/generator/stages/stage4-api.js.map +1 -0
  203. package/dist/core/generator/stages/stage5-architecture.d.ts +10 -0
  204. package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -0
  205. package/dist/core/generator/stages/stage5-architecture.js +62 -0
  206. package/dist/core/generator/stages/stage5-architecture.js.map +1 -0
  207. package/dist/core/generator/stages/stage6-adr.d.ts +8 -0
  208. package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -0
  209. package/dist/core/generator/stages/stage6-adr.js +41 -0
  210. package/dist/core/generator/stages/stage6-adr.js.map +1 -0
  211. package/dist/core/services/chat-agent.d.ts +45 -0
  212. package/dist/core/services/chat-agent.d.ts.map +1 -0
  213. package/dist/core/services/chat-agent.js +310 -0
  214. package/dist/core/services/chat-agent.js.map +1 -0
  215. package/dist/core/services/chat-tools.d.ts +32 -0
  216. package/dist/core/services/chat-tools.d.ts.map +1 -0
  217. package/dist/core/services/chat-tools.js +270 -0
  218. package/dist/core/services/chat-tools.js.map +1 -0
  219. package/dist/core/services/config-manager.d.ts +61 -0
  220. package/dist/core/services/config-manager.d.ts.map +1 -0
  221. package/dist/core/services/config-manager.js +143 -0
  222. package/dist/core/services/config-manager.js.map +1 -0
  223. package/dist/core/services/gitignore-manager.d.ts +29 -0
  224. package/dist/core/services/gitignore-manager.d.ts.map +1 -0
  225. package/dist/core/services/gitignore-manager.js +106 -0
  226. package/dist/core/services/gitignore-manager.js.map +1 -0
  227. package/dist/core/services/index.d.ts +8 -0
  228. package/dist/core/services/index.d.ts.map +1 -0
  229. package/dist/core/services/index.js +8 -0
  230. package/dist/core/services/index.js.map +1 -0
  231. package/dist/core/services/llm-service.d.ts +336 -0
  232. package/dist/core/services/llm-service.d.ts.map +1 -0
  233. package/dist/core/services/llm-service.js +1155 -0
  234. package/dist/core/services/llm-service.js.map +1 -0
  235. package/dist/core/services/mcp-handlers/analysis.d.ts +42 -0
  236. package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -0
  237. package/dist/core/services/mcp-handlers/analysis.js +300 -0
  238. package/dist/core/services/mcp-handlers/analysis.js.map +1 -0
  239. package/dist/core/services/mcp-handlers/graph.d.ts +65 -0
  240. package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -0
  241. package/dist/core/services/mcp-handlers/graph.js +509 -0
  242. package/dist/core/services/mcp-handlers/graph.js.map +1 -0
  243. package/dist/core/services/mcp-handlers/semantic.d.ts +38 -0
  244. package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -0
  245. package/dist/core/services/mcp-handlers/semantic.js +172 -0
  246. package/dist/core/services/mcp-handlers/semantic.js.map +1 -0
  247. package/dist/core/services/mcp-handlers/utils.d.ts +21 -0
  248. package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -0
  249. package/dist/core/services/mcp-handlers/utils.js +62 -0
  250. package/dist/core/services/mcp-handlers/utils.js.map +1 -0
  251. package/dist/core/services/project-detector.d.ts +32 -0
  252. package/dist/core/services/project-detector.d.ts.map +1 -0
  253. package/dist/core/services/project-detector.js +111 -0
  254. package/dist/core/services/project-detector.js.map +1 -0
  255. package/dist/core/verifier/index.d.ts +5 -0
  256. package/dist/core/verifier/index.d.ts.map +1 -0
  257. package/dist/core/verifier/index.js +5 -0
  258. package/dist/core/verifier/index.js.map +1 -0
  259. package/dist/core/verifier/verification-engine.d.ts +226 -0
  260. package/dist/core/verifier/verification-engine.d.ts.map +1 -0
  261. package/dist/core/verifier/verification-engine.js +681 -0
  262. package/dist/core/verifier/verification-engine.js.map +1 -0
  263. package/dist/types/index.d.ts +252 -0
  264. package/dist/types/index.d.ts.map +1 -0
  265. package/dist/types/index.js +5 -0
  266. package/dist/types/index.js.map +1 -0
  267. package/dist/types/pipeline.d.ts +148 -0
  268. package/dist/types/pipeline.d.ts.map +1 -0
  269. package/dist/types/pipeline.js +5 -0
  270. package/dist/types/pipeline.js.map +1 -0
  271. package/dist/utils/errors.d.ts +51 -0
  272. package/dist/utils/errors.d.ts.map +1 -0
  273. package/dist/utils/errors.js +128 -0
  274. package/dist/utils/errors.js.map +1 -0
  275. package/dist/utils/logger.d.ts +149 -0
  276. package/dist/utils/logger.d.ts.map +1 -0
  277. package/dist/utils/logger.js +331 -0
  278. package/dist/utils/logger.js.map +1 -0
  279. package/dist/utils/progress.d.ts +142 -0
  280. package/dist/utils/progress.d.ts.map +1 -0
  281. package/dist/utils/progress.js +280 -0
  282. package/dist/utils/progress.js.map +1 -0
  283. package/dist/utils/prompts.d.ts +53 -0
  284. package/dist/utils/prompts.d.ts.map +1 -0
  285. package/dist/utils/prompts.js +199 -0
  286. package/dist/utils/prompts.js.map +1 -0
  287. package/dist/utils/shutdown.d.ts +89 -0
  288. package/dist/utils/shutdown.d.ts.map +1 -0
  289. package/dist/utils/shutdown.js +237 -0
  290. package/dist/utils/shutdown.js.map +1 -0
  291. package/package.json +114 -0
  292. package/src/viewer/InteractiveGraphViewer.jsx +1486 -0
  293. package/src/viewer/app/index.html +17 -0
  294. package/src/viewer/app/main.jsx +13 -0
  295. package/src/viewer/components/ArchitectureView.jsx +177 -0
  296. package/src/viewer/components/ChatPanel.jsx +448 -0
  297. package/src/viewer/components/ClusterGraph.jsx +441 -0
  298. package/src/viewer/components/FilterBar.jsx +179 -0
  299. package/src/viewer/components/FlatGraph.jsx +275 -0
  300. package/src/viewer/components/MicroComponents.jsx +83 -0
  301. package/src/viewer/hooks/usePanZoom.js +79 -0
  302. package/src/viewer/utils/constants.js +47 -0
  303. package/src/viewer/utils/graph-helpers.js +291 -0
@@ -0,0 +1,509 @@
1
+ /**
2
+ * MCP tool handlers for call-graph analysis:
3
+ * get_call_graph, get_subgraph, analyze_impact, get_critical_hubs,
4
+ * get_leaf_functions, get_low_risk_refactor_candidates, get_god_functions.
5
+ */
6
+ import { validateDirectory, readCachedContext } from './utils.js';
7
+ import { join } from 'node:path';
8
+ import { getFileGodFunctions, extractSubgraph } from '../../analyzer/subgraph-extractor.js';
9
+ import { readSpecGenConfig } from '../config-manager.js';
10
+ // ============================================================================
11
+ // SHARED GRAPH HELPERS (also exported for chat-tools.ts)
12
+ // ============================================================================
13
+ /**
14
+ * Build forward (caller→callees) and backward (callee→callers) adjacency maps
15
+ * from a serialised call graph, returning both maps and a node lookup.
16
+ */
17
+ export function buildAdjacency(cg) {
18
+ const nodeMap = new Map(cg.nodes.map(n => [n.id, n]));
19
+ const forward = new Map(); // callerId → Set<calleeId>
20
+ const backward = new Map(); // calleeId → Set<callerId>
21
+ for (const n of cg.nodes) {
22
+ forward.set(n.id, new Set());
23
+ backward.set(n.id, new Set());
24
+ }
25
+ for (const e of cg.edges) {
26
+ if (!e.calleeId)
27
+ continue;
28
+ forward.get(e.callerId)?.add(e.calleeId);
29
+ backward.get(e.calleeId)?.add(e.callerId);
30
+ }
31
+ return { nodeMap, forward, backward };
32
+ }
33
+ /** BFS up to `maxDepth`. Returns a map of visited node-id → depth reached. */
34
+ export function bfs(seeds, adjacency, maxDepth) {
35
+ const visited = new Map();
36
+ const queue = seeds.map(id => ({ id, depth: 0 }));
37
+ for (const id of seeds)
38
+ visited.set(id, 0);
39
+ while (queue.length > 0) {
40
+ const { id, depth } = queue.shift();
41
+ if (depth >= maxDepth)
42
+ continue;
43
+ for (const nId of adjacency.get(id) ?? []) {
44
+ if (!visited.has(nId)) {
45
+ visited.set(nId, depth + 1);
46
+ queue.push({ id: nId, depth: depth + 1 });
47
+ }
48
+ }
49
+ }
50
+ return visited;
51
+ }
52
+ /**
53
+ * Compute a risk score [0–100] for a node.
54
+ *
55
+ * Weights: fan-in × 4, fan-out × 2, isHub × 20, blastRadius × 1.5. Capped at 100.
56
+ */
57
+ export function computeRiskScore(node, blastRadius, isHub) {
58
+ const raw = (node.fanIn ?? 0) * 4 +
59
+ (node.fanOut ?? 0) * 2 +
60
+ (isHub ? 20 : 0) +
61
+ blastRadius * 1.5;
62
+ return Math.min(100, Math.round(raw));
63
+ }
64
+ /** Derive a plain-language refactoring strategy from the risk profile. */
65
+ export function recommendStrategy(riskScore, fanIn, fanOut, isHub) {
66
+ if (riskScore <= 20) {
67
+ return {
68
+ approach: 'refactor freely',
69
+ rationale: 'Low fan-in and fan-out. Safe to rename, extract, or rewrite inline. ' +
70
+ 'A single PR with unit tests is sufficient.',
71
+ };
72
+ }
73
+ if (riskScore <= 45) {
74
+ return {
75
+ approach: 'refactor with tests',
76
+ rationale: 'Moderate caller count. Write characterisation tests before changing the signature. ' +
77
+ 'Prefer additive changes (new overload / wrapper) then migrate callers.',
78
+ };
79
+ }
80
+ if (isHub && fanOut > 5) {
81
+ return {
82
+ approach: 'split responsibility (SRP)',
83
+ rationale: 'God-function: high fan-in AND high fan-out. Extract cohesive sub-responsibilities ' +
84
+ 'into smaller functions behind a thin façade. Migrate callers incrementally.',
85
+ };
86
+ }
87
+ if (isHub) {
88
+ return {
89
+ approach: 'introduce façade',
90
+ rationale: 'Critical hub with many callers. Do not change the public signature. ' +
91
+ 'Introduce a façade or adapter layer, move logic behind it, ' +
92
+ 'then update callers in waves.',
93
+ };
94
+ }
95
+ if (fanOut > 8) {
96
+ return {
97
+ approach: 'decompose fan-out',
98
+ rationale: 'Too many outgoing dependencies. Extract orchestration logic into smaller coordinators. ' +
99
+ 'Consider dependency injection to decouple from concrete callees.',
100
+ };
101
+ }
102
+ return {
103
+ approach: 'incremental extraction',
104
+ rationale: 'High risk due to caller count. Use the Strangler-Fig pattern: introduce a parallel ' +
105
+ 'implementation, migrate callers one by one, then delete the original.',
106
+ };
107
+ }
108
+ export function nodeToSummary(n) {
109
+ if (!n)
110
+ return { name: '', file: '', className: null, depth: 0 };
111
+ return { name: n.name, file: n.filePath, className: n.className ?? null, depth: 0 };
112
+ }
113
+ // ============================================================================
114
+ // HANDLERS
115
+ // ============================================================================
116
+ /**
117
+ * Return the call graph summary from cached analysis.
118
+ */
119
+ export async function handleGetCallGraph(directory) {
120
+ const absDir = await validateDirectory(directory);
121
+ const ctx = await readCachedContext(absDir);
122
+ if (!ctx)
123
+ return { error: 'No analysis found. Run analyze_codebase first.' };
124
+ if (!ctx.callGraph)
125
+ return { error: 'Call graph not available in cached analysis. Re-run analyze_codebase.' };
126
+ const cg = ctx.callGraph;
127
+ return {
128
+ stats: cg.stats,
129
+ hubFunctions: cg.hubFunctions.map(n => ({
130
+ name: n.name, file: n.filePath, className: n.className,
131
+ fanIn: n.fanIn, fanOut: n.fanOut, language: n.language,
132
+ })),
133
+ entryPoints: cg.entryPoints.map(n => ({
134
+ name: n.name, file: n.filePath, className: n.className, language: n.language,
135
+ })),
136
+ layerViolations: cg.layerViolations,
137
+ };
138
+ }
139
+ /**
140
+ * Extract a depth-limited subgraph centred on a named function.
141
+ * Falls back to semantic search if no exact name match is found.
142
+ */
143
+ export async function handleGetSubgraph(directory, functionName, direction = 'downstream', maxDepth = 3, format = 'json') {
144
+ maxDepth = Math.max(1, Math.min(maxDepth, 20));
145
+ const absDir = await validateDirectory(directory);
146
+ const ctx = await readCachedContext(absDir);
147
+ if (!ctx)
148
+ return { error: 'No analysis found. Run analyze_codebase first.' };
149
+ if (!ctx.callGraph)
150
+ return { error: 'Call graph not available in cached analysis. Re-run analyze_codebase.' };
151
+ const cg = ctx.callGraph;
152
+ const lower = functionName.toLowerCase();
153
+ let seeds = cg.nodes.filter(n => n.name.toLowerCase().includes(lower));
154
+ // Fallback to semantic search if no exact substring match
155
+ if (seeds.length === 0) {
156
+ try {
157
+ const { VectorIndex } = await import('../../analyzer/vector-index.js');
158
+ const { EmbeddingService } = await import('../../analyzer/embedding-service.js');
159
+ const outputDir = join(absDir, '.spec-gen', 'analysis');
160
+ if (VectorIndex.exists(outputDir)) {
161
+ let embedSvc = null;
162
+ try {
163
+ embedSvc = EmbeddingService.fromEnv();
164
+ }
165
+ catch {
166
+ const cfg = await readSpecGenConfig(absDir);
167
+ if (cfg?.embedding)
168
+ embedSvc = EmbeddingService.fromConfig(cfg) ?? null;
169
+ }
170
+ if (embedSvc) {
171
+ const results = await VectorIndex.search(outputDir, functionName, embedSvc, { limit: 1 });
172
+ if (results.length > 0) {
173
+ const top = results[0].record;
174
+ const matched = cg.nodes.find(n => n.id === top.id);
175
+ if (matched)
176
+ seeds = [matched];
177
+ }
178
+ }
179
+ }
180
+ }
181
+ catch { /* ignore fallback errors */ }
182
+ }
183
+ if (seeds.length === 0)
184
+ return { error: `No function matching "${functionName}" found in call graph.` };
185
+ const forward = new Map();
186
+ const backward = new Map();
187
+ for (const node of cg.nodes) {
188
+ forward.set(node.id, []);
189
+ backward.set(node.id, []);
190
+ }
191
+ for (const edge of cg.edges) {
192
+ if (!edge.calleeId)
193
+ continue;
194
+ forward.get(edge.callerId)?.push(edge.calleeId);
195
+ backward.get(edge.calleeId)?.push(edge.callerId);
196
+ }
197
+ const visitedIds = new Set();
198
+ const queue = seeds.map(n => ({ id: n.id, depth: 0 }));
199
+ for (const seed of seeds)
200
+ visitedIds.add(seed.id);
201
+ while (queue.length > 0) {
202
+ const { id, depth } = queue.shift();
203
+ if (depth >= maxDepth)
204
+ continue;
205
+ const neighbours = [];
206
+ if (direction === 'downstream' || direction === 'both')
207
+ neighbours.push(...(forward.get(id) ?? []));
208
+ if (direction === 'upstream' || direction === 'both')
209
+ neighbours.push(...(backward.get(id) ?? []));
210
+ for (const nId of neighbours) {
211
+ if (!visitedIds.has(nId)) {
212
+ visitedIds.add(nId);
213
+ queue.push({ id: nId, depth: depth + 1 });
214
+ }
215
+ }
216
+ }
217
+ const nodeMap = new Map(cg.nodes.map(n => [n.id, n]));
218
+ const subNodes = Array.from(visitedIds)
219
+ .map(id => nodeMap.get(id))
220
+ .filter(Boolean)
221
+ .map(n => ({
222
+ name: n.name, file: n.filePath, className: n.className,
223
+ fanIn: n.fanIn, fanOut: n.fanOut, language: n.language,
224
+ isSeed: seeds.some(s => s.id === n.id),
225
+ }));
226
+ const subEdges = cg.edges
227
+ .filter(e => e.calleeId && visitedIds.has(e.callerId) && visitedIds.has(e.calleeId))
228
+ .map(e => ({
229
+ caller: nodeMap.get(e.callerId)?.name ?? e.callerId,
230
+ callee: nodeMap.get(e.calleeId)?.name ?? e.calleeId,
231
+ callerFile: nodeMap.get(e.callerId)?.filePath,
232
+ calleeFile: nodeMap.get(e.calleeId)?.filePath,
233
+ }));
234
+ if (format === 'mermaid') {
235
+ const idOf = new Map();
236
+ subNodes.forEach((n, i) => idOf.set(n.name + '|' + n.file, `n${i}`));
237
+ const nodeLines = subNodes.map(n => {
238
+ const id = idOf.get(n.name + '|' + n.file);
239
+ const label = `"${n.name}\\n${n.file}"`;
240
+ return n.isSeed ? ` ${id}[${label}]:::seed` : ` ${id}[${label}]`;
241
+ });
242
+ const edgeLines = subEdges.map(e => {
243
+ const fromId = idOf.get(e.caller + '|' + e.callerFile) ?? e.caller;
244
+ const toId = idOf.get(e.callee + '|' + e.calleeFile) ?? e.callee;
245
+ return ` ${fromId} --> ${toId}`;
246
+ });
247
+ const deduped = [...new Set(edgeLines)];
248
+ const diagram = [
249
+ 'flowchart LR',
250
+ ' classDef seed fill:#f5a623,stroke:#d4891a,color:#000',
251
+ ...nodeLines, ...deduped,
252
+ ].join('\n');
253
+ return `\`\`\`mermaid\n${diagram}\n\`\`\`\n\n` +
254
+ `_${subNodes.length} nodes · ${deduped.length} edges · seeds: ${seeds.map(s => s.name).join(', ')}_`;
255
+ }
256
+ return {
257
+ query: { functionName, direction, maxDepth },
258
+ seeds: seeds.map(n => ({ name: n.name, file: n.filePath })),
259
+ stats: { nodes: subNodes.length, edges: subEdges.length },
260
+ nodes: subNodes,
261
+ edges: subEdges,
262
+ };
263
+ }
264
+ /**
265
+ * Deep impact analysis for a single symbol.
266
+ * Falls back to semantic search if no exact name match is found.
267
+ */
268
+ export async function handleAnalyzeImpact(directory, symbol, depth = 2) {
269
+ const absDir = await validateDirectory(directory);
270
+ const ctx = await readCachedContext(absDir);
271
+ if (!ctx)
272
+ return { error: 'No analysis found. Run analyze_codebase first.' };
273
+ if (!ctx.callGraph)
274
+ return { error: 'Call graph not available. Re-run analyze_codebase.' };
275
+ const cg = ctx.callGraph;
276
+ const { nodeMap, forward, backward } = buildAdjacency(cg);
277
+ const hubIds = new Set(cg.hubFunctions.map(n => n.id));
278
+ const lower = symbol.toLowerCase();
279
+ let seeds = cg.nodes.filter(n => n.name.toLowerCase().includes(lower));
280
+ // Fallback to semantic search if no exact substring match
281
+ if (seeds.length === 0) {
282
+ try {
283
+ const { VectorIndex } = await import('../../analyzer/vector-index.js');
284
+ const { EmbeddingService } = await import('../../analyzer/embedding-service.js');
285
+ const outputDir = join(absDir, '.spec-gen', 'analysis');
286
+ if (VectorIndex.exists(outputDir)) {
287
+ let embedSvc = null;
288
+ try {
289
+ embedSvc = EmbeddingService.fromEnv();
290
+ }
291
+ catch {
292
+ const cfg = await readSpecGenConfig(absDir);
293
+ if (cfg?.embedding)
294
+ embedSvc = EmbeddingService.fromConfig(cfg) ?? null;
295
+ }
296
+ if (embedSvc) {
297
+ const results = await VectorIndex.search(outputDir, symbol, embedSvc, { limit: 1 });
298
+ if (results.length > 0) {
299
+ const top = results[0].record;
300
+ const matched = cg.nodes.find(n => n.id === top.id);
301
+ if (matched)
302
+ seeds = [matched];
303
+ }
304
+ }
305
+ }
306
+ }
307
+ catch { /* ignore fallback errors */ }
308
+ }
309
+ if (seeds.length === 0)
310
+ return { error: `No function matching "${symbol}" found in call graph.` };
311
+ const seedIds = seeds.map(n => n.id);
312
+ const upstreamMap = bfs(seedIds, backward, depth);
313
+ const downstreamMap = bfs(seedIds, forward, depth);
314
+ const upstreamNodes = [...upstreamMap.entries()]
315
+ .filter(([id]) => !seedIds.includes(id))
316
+ .map(([id, d]) => ({ ...nodeToSummary(nodeMap.get(id)), depth: d }))
317
+ .filter(n => n.name);
318
+ const downstreamNodes = [...downstreamMap.entries()]
319
+ .filter(([id]) => !seedIds.includes(id))
320
+ .map(([id, d]) => ({ ...nodeToSummary(nodeMap.get(id)), depth: d }))
321
+ .filter(n => n.name);
322
+ const blastRadius = upstreamNodes.length + downstreamNodes.length;
323
+ const results = seeds.map(seed => {
324
+ const isHub = hubIds.has(seed.id);
325
+ const riskScore = computeRiskScore(seed, blastRadius, isHub);
326
+ const strategy = recommendStrategy(riskScore, seed.fanIn ?? 0, seed.fanOut ?? 0, isHub);
327
+ const criticalPathLeaves = downstreamNodes.filter(n => n.depth === depth).map(n => n.name);
328
+ return {
329
+ symbol: seed.name,
330
+ file: seed.filePath,
331
+ className: seed.className ?? null,
332
+ language: seed.language,
333
+ metrics: { fanIn: seed.fanIn ?? 0, fanOut: seed.fanOut ?? 0, isHub },
334
+ blastRadius: { total: blastRadius, upstream: upstreamNodes.length, downstream: downstreamNodes.length },
335
+ riskScore,
336
+ riskLevel: riskScore <= 20 ? 'low' : riskScore <= 45 ? 'medium' : riskScore <= 70 ? 'high' : 'critical',
337
+ upstreamChain: upstreamNodes,
338
+ downstreamCriticalPath: downstreamNodes,
339
+ criticalPathLeaves,
340
+ recommendedStrategy: strategy,
341
+ };
342
+ });
343
+ return seeds.length === 1 ? results[0] : { matches: results };
344
+ }
345
+ /**
346
+ * Return the N safest functions to refactor.
347
+ */
348
+ export async function handleGetLowRiskRefactorCandidates(directory, limit = 5, filePattern) {
349
+ limit = Math.max(1, Math.min(limit, 500));
350
+ const absDir = await validateDirectory(directory);
351
+ const ctx = await readCachedContext(absDir);
352
+ if (!ctx)
353
+ return { error: 'No analysis found. Run analyze_codebase first.' };
354
+ if (!ctx.callGraph)
355
+ return { error: 'Call graph not available. Re-run analyze_codebase.' };
356
+ const cg = ctx.callGraph;
357
+ const hubIds = new Set(cg.hubFunctions.map(n => n.id));
358
+ const entryIds = new Set(cg.entryPoints.map(n => n.id));
359
+ let candidates = cg.nodes.filter(n => {
360
+ const fanIn = n.fanIn ?? 0;
361
+ const fanOut = n.fanOut ?? 0;
362
+ return fanIn <= 2 && fanOut <= 3 && !hubIds.has(n.id) && !entryIds.has(n.id);
363
+ });
364
+ if (filePattern)
365
+ candidates = candidates.filter(n => n.filePath.includes(filePattern));
366
+ candidates.sort((a, b) => {
367
+ const ra = (a.fanIn ?? 0) + (a.fanOut ?? 0);
368
+ const rb = (b.fanIn ?? 0) + (b.fanOut ?? 0);
369
+ return ra !== rb ? ra - rb : a.name.localeCompare(b.name);
370
+ });
371
+ const top = candidates.slice(0, limit).map(n => ({
372
+ name: n.name, file: n.filePath, className: n.className ?? null, language: n.language,
373
+ fanIn: n.fanIn ?? 0, fanOut: n.fanOut ?? 0,
374
+ riskScore: computeRiskScore(n, 0, false),
375
+ rationale: 'Low fan-in, low fan-out, not a hub — safe to rename, extract, or rewrite.',
376
+ }));
377
+ return {
378
+ total: candidates.length, returned: top.length, candidates: top,
379
+ tip: 'Start with the first candidate and work downward. Each can be changed in isolation.',
380
+ };
381
+ }
382
+ /**
383
+ * Return leaf functions (fan-out === 0).
384
+ */
385
+ export async function handleGetLeafFunctions(directory, limit = 20, filePattern, sortBy = 'fanIn') {
386
+ limit = Math.max(1, Math.min(limit, 500));
387
+ const absDir = await validateDirectory(directory);
388
+ const ctx = await readCachedContext(absDir);
389
+ if (!ctx)
390
+ return { error: 'No analysis found. Run analyze_codebase first.' };
391
+ if (!ctx.callGraph)
392
+ return { error: 'Call graph not available. Re-run analyze_codebase.' };
393
+ const cg = ctx.callGraph;
394
+ const hasOutgoing = new Set(cg.edges.filter(e => e.calleeId).map(e => e.callerId));
395
+ let leaves = cg.nodes.filter(n => !hasOutgoing.has(n.id));
396
+ if (filePattern)
397
+ leaves = leaves.filter(n => n.filePath.includes(filePattern));
398
+ leaves.sort((a, b) => {
399
+ if (sortBy === 'fanIn')
400
+ return (b.fanIn ?? 0) - (a.fanIn ?? 0);
401
+ if (sortBy === 'name')
402
+ return a.name.localeCompare(b.name);
403
+ return a.filePath.localeCompare(b.filePath) || a.name.localeCompare(b.name);
404
+ });
405
+ const top = leaves.slice(0, limit).map(n => ({
406
+ name: n.name, file: n.filePath, className: n.className ?? null, language: n.language,
407
+ fanIn: n.fanIn ?? 0, fanOut: 0, blastRadius: 0,
408
+ riskScore: computeRiskScore(n, 0, false),
409
+ refactorAdvice: (n.fanIn ?? 0) === 0
410
+ ? 'Unreachable or dead code — safe to delete after confirmation.'
411
+ : 'Pure leaf: rewrite freely, then re-run tests for its callers.',
412
+ }));
413
+ return {
414
+ totalLeaves: leaves.length, returned: top.length, sortedBy: sortBy, leaves: top,
415
+ insight: 'Refactoring leaves bottom-up lets you build confidence and test coverage before tackling higher-risk hubs.',
416
+ };
417
+ }
418
+ /**
419
+ * Return critical hub functions ranked by composite criticality.
420
+ */
421
+ export async function handleGetCriticalHubs(directory, limit = 10, minFanIn = 3) {
422
+ limit = Math.max(1, Math.min(limit, 500));
423
+ minFanIn = Math.max(1, Math.min(minFanIn, 100));
424
+ const absDir = await validateDirectory(directory);
425
+ const ctx = await readCachedContext(absDir);
426
+ if (!ctx)
427
+ return { error: 'No analysis found. Run analyze_codebase first.' };
428
+ if (!ctx.callGraph)
429
+ return { error: 'Call graph not available. Re-run analyze_codebase.' };
430
+ const cg = ctx.callGraph;
431
+ const nodeMap = new Map(cg.nodes.map(n => [n.id, n]));
432
+ const violatorFiles = new Set(cg.layerViolations.flatMap(v => [nodeMap.get(v.callerId)?.filePath, nodeMap.get(v.calleeId)?.filePath].filter(Boolean)));
433
+ const hubs = cg.nodes
434
+ .filter(n => (n.fanIn ?? 0) >= minFanIn)
435
+ .map(n => {
436
+ const fanIn = n.fanIn ?? 0;
437
+ const fanOut = n.fanOut ?? 0;
438
+ const hasViolation = violatorFiles.has(n.filePath);
439
+ const criticality = fanIn * 3 + fanOut * 1.5 + (hasViolation ? 10 : 0);
440
+ const stabilityScore = Math.max(0, Math.round(100 - Math.min(100, criticality)));
441
+ let approach;
442
+ let approachRationale;
443
+ if (fanIn >= 8 && fanOut >= 5) {
444
+ approach = 'split responsibility';
445
+ approachRationale = 'God-function: extract cohesive groups of callees into dedicated modules and expose a minimal coordinator interface.';
446
+ }
447
+ else if (fanIn >= 8) {
448
+ approach = 'introduce façade';
449
+ approachRationale = 'Heavily depended-upon: keep the signature stable, move implementation behind a façade, then migrate callers to the new interface over time.';
450
+ }
451
+ else if (fanOut >= 5) {
452
+ approach = 'delegate';
453
+ approachRationale = "Too many outgoing calls: extract groups of related calls into helper services and delegate to them, reducing this function's orchestration burden.";
454
+ }
455
+ else {
456
+ approach = 'extract';
457
+ approachRationale = 'Moderate hub: identify the core responsibility, extract secondary logic into well-named helpers, and add integration tests before changing callers.';
458
+ }
459
+ return {
460
+ name: n.name, file: n.filePath, className: n.className ?? null, language: n.language,
461
+ fanIn, fanOut, hasLayerViolation: hasViolation,
462
+ criticality: Math.round(criticality * 10) / 10,
463
+ stabilityScore,
464
+ riskScore: computeRiskScore(n, fanIn + fanOut, true),
465
+ recommendedApproach: { approach, rationale: approachRationale },
466
+ refactoringOrder: stabilityScore >= 60 ? 'can refactor now with good test coverage'
467
+ : stabilityScore >= 30 ? 'refactor after stabilising its leaf dependencies'
468
+ : 'defer — stabilise surrounding code first, then tackle incrementally',
469
+ };
470
+ })
471
+ .sort((a, b) => b.criticality - a.criticality)
472
+ .slice(0, limit);
473
+ return {
474
+ totalHubs: cg.nodes.filter(n => (n.fanIn ?? 0) >= minFanIn).length,
475
+ returned: hubs.length, minFanIn, hubs,
476
+ guidance: 'Start with hubs that have the highest stabilityScore (easiest wins). Defer hubs with stabilityScore < 30 until their dependencies are cleaner.',
477
+ };
478
+ }
479
+ /**
480
+ * Detect god functions (high fan-out) and return their call-graph neighborhood.
481
+ */
482
+ export async function handleGetGodFunctions(directory, filePath, fanOutThreshold = 8) {
483
+ const absDir = await validateDirectory(directory);
484
+ const ctx = await readCachedContext(absDir);
485
+ if (!ctx)
486
+ return { error: 'No analysis found. Run analyze_codebase first.' };
487
+ if (!ctx.callGraph)
488
+ return { error: 'Call graph not available. Re-run analyze_codebase.' };
489
+ const cg = ctx.callGraph;
490
+ let candidates;
491
+ if (filePath) {
492
+ candidates = getFileGodFunctions(cg, filePath, fanOutThreshold);
493
+ }
494
+ else {
495
+ candidates = cg.nodes.filter(n => n.fanOut >= fanOutThreshold);
496
+ }
497
+ if (candidates.length === 0) {
498
+ return { threshold: fanOutThreshold, count: 0, godFunctions: [], message: `No god functions found with fanOut >= ${fanOutThreshold}` };
499
+ }
500
+ const godFunctions = candidates
501
+ .sort((a, b) => b.fanOut - a.fanOut)
502
+ .map(fn => {
503
+ const sub = extractSubgraph(cg, fn);
504
+ const directCallees = [...new Set(sub.edges.filter(([from]) => from === fn.name).map(([, to]) => to))];
505
+ return { name: fn.name, file: fn.filePath, className: fn.className, fanIn: fn.fanIn, fanOut: fn.fanOut, directCallees, subgraphNodes: sub.nodes.length };
506
+ });
507
+ return { threshold: fanOutThreshold, count: godFunctions.length, godFunctions };
508
+ }
509
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/graph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,+EAA+E;AAC/E,yDAAyD;AACzD,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAAuB;IACpD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,OAAO,GAAI,IAAI,GAAG,EAAuB,CAAC,CAAC,2BAA2B;IAC5E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC,CAAC,2BAA2B;IAE5E,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC7B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE,SAAS;QAC1B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,GAAG,CACjB,KAAe,EACf,SAAmC,EACnC,QAAgB;IAEhB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,MAAM,KAAK,GAAyC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxF,KAAK,MAAM,EAAE,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAE3C,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QACrC,IAAI,KAAK,IAAI,QAAQ;YAAE,SAAS;QAChC,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAkB,EAAE,WAAmB,EAAE,KAAc;IACtF,MAAM,GAAG,GACP,CAAC,IAAI,CAAC,KAAK,IAAK,CAAC,CAAC,GAAG,CAAC;QACtB,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;QACtB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,WAAW,GAAG,GAAG,CAAC;IACpB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,KAAa,EACb,MAAc,EACd,KAAc;IAEd,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;QACpB,OAAO;YACL,QAAQ,EAAE,iBAAiB;YAC3B,SAAS,EACP,sEAAsE;gBACtE,4CAA4C;SAC/C,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;QACpB,OAAO;YACL,QAAQ,EAAE,qBAAqB;YAC/B,SAAS,EACP,qFAAqF;gBACrF,wEAAwE;SAC3E,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,QAAQ,EAAE,4BAA4B;YACtC,SAAS,EACP,oFAAoF;gBACpF,6EAA6E;SAChF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO;YACL,QAAQ,EAAE,kBAAkB;YAC5B,SAAS,EACP,sEAAsE;gBACtE,6DAA6D;gBAC7D,+BAA+B;SAClC,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO;YACL,QAAQ,EAAE,mBAAmB;YAC7B,SAAS,EACP,yFAAyF;gBACzF,kEAAkE;SACrE,CAAC;IACJ,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,wBAAwB;QAClC,SAAS,EACP,qFAAqF;YACrF,uEAAuE;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAA2B;IACvD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACtF,CAAC;AAED,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACxD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;IAC7E,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,uEAAuE,EAAE,CAAC;IAE9G,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;IACzB,OAAO;QACL,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS;YACtD,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACvD,CAAC,CAAC;QACH,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ;SAC7E,CAAC,CAAC;QACH,eAAe,EAAE,EAAE,CAAC,eAAe;KACpC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,YAAoB,EACpB,YAAgD,YAAY,EAC5D,QAAQ,GAAG,CAAC,EACZ,SAA6B,MAAM;IAEnC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;IAC7E,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,uEAAuE,EAAE,CAAC;IAE9G,MAAM,EAAE,GAAG,GAAG,CAAC,SAAgC,CAAC;IAChD,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAEvE,0DAA0D;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;YACvE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YAExD,IAAI,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,IAAI,QAAQ,GAAiD,IAAI,CAAC;gBAClE,IAAI,CAAC;oBAAC,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBACpD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;oBAC5C,IAAI,GAAG,EAAE,SAAS;wBAAE,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;gBAC1E,CAAC;gBACD,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC1F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;wBAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;wBACpD,IAAI,OAAO;4BAAE,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,yBAAyB,YAAY,wBAAwB,EAAE,CAAC;IAExG,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAAC,CAAC;IACrF,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,SAAS;QAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,KAAK,GAAyC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7F,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QACrC,IAAI,KAAK,IAAI,QAAQ;YAAE,SAAS;QAChC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,MAAM;YAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpG,IAAI,SAAS,KAAK,UAAU,IAAM,SAAS,KAAK,MAAM;YAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrG,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;SACpC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;SAC3B,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACT,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS;QACtD,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACtD,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;KACvC,CAAC,CAAC,CAAC;IAEN,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;SACnF,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACT,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,QAAQ;QACnD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,QAAQ;QACnD,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ;QAC7C,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ;KAC9C,CAAC,CAAC,CAAC;IAEN,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;QACvC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC;YACxC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,KAAK,GAAG,CAAC;QACzE,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YACnE,MAAM,IAAI,GAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YACnE,OAAO,OAAO,MAAM,QAAQ,IAAI,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG;YACd,cAAc;YACd,0DAA0D;YAC1D,GAAG,SAAS,EAAE,GAAG,OAAO;SACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,kBAAkB,OAAO,cAAc;YAC5C,IAAI,QAAQ,CAAC,MAAM,YAAY,OAAO,CAAC,MAAM,mBAAmB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACzG,CAAC;IAED,OAAO;QACL,KAAK,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE;QAC5C,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE;QACzD,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,QAAQ;KAChB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,MAAc,EACd,KAAK,GAAG,CAAC;IAET,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,GAAG;QAAY,OAAO,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;IACvF,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;IAE3F,MAAM,EAAE,GAAG,GAAG,CAAC,SAAgC,CAAC;IAChD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAEvE,0DAA0D;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;YACvE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YAExD,IAAI,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,IAAI,QAAQ,GAAiD,IAAI,CAAC;gBAClE,IAAI,CAAC;oBAAC,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBACpD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;oBAC5C,IAAI,GAAG,EAAE,SAAS;wBAAE,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;gBAC1E,CAAC;gBACD,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;oBACpF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;wBAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;wBACpD,IAAI,OAAO;4BAAE,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,4BAA4B,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,yBAAyB,MAAM,wBAAwB,EAAE,CAAC;IAElG,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,WAAW,GAAK,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,EAAG,KAAK,CAAC,CAAC;IAEpD,MAAM,aAAa,GAAG,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;SAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;SACnE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM,eAAe,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC;SACjD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;SACnE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;IAElE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC/B,MAAM,KAAK,GAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAI,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QACzF,MAAM,kBAAkB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAE3F,OAAO;YACL,MAAM,EAAK,IAAI,CAAC,IAAI;YACpB,IAAI,EAAO,IAAI,CAAC,QAAQ;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;YACjC,QAAQ,EAAG,IAAI,CAAC,QAAQ;YACxB,OAAO,EAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE;YACtE,WAAW,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,MAAM,EAAE;YACvG,SAAS;YACT,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;YACvG,aAAa,EAAW,aAAa;YACrC,sBAAsB,EAAE,eAAe;YACvC,kBAAkB;YAClB,mBAAmB,EAAE,QAAQ;SAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,SAAiB,EACjB,KAAK,GAAG,CAAC,EACT,WAAoB;IAEpB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,GAAG;QAAY,OAAO,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;IACvF,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;IAE3F,MAAM,EAAE,GAAS,GAAG,CAAC,SAAgC,CAAC;IACtD,MAAM,MAAM,GAAK,IAAI,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAExD,IAAI,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACnC,MAAM,KAAK,GAAI,CAAC,CAAC,KAAK,IAAK,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAC7B,OAAO,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW;QAAE,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IAEvF,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QAC5C,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QAC5C,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpF,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;QAC1C,SAAS,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;QACxC,SAAS,EAAE,2EAA2E;KACvF,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG;QAC/D,GAAG,EAAE,qFAAqF;KAC3F,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,SAAiB,EACjB,KAAK,GAAG,EAAE,EACV,WAAoB,EACpB,SAAoC,OAAO;IAE3C,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,GAAG;QAAY,OAAO,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;IACvF,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;IAE3F,MAAM,EAAE,GAAG,GAAG,CAAC,SAAgC,CAAC;IAChD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnF,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1D,IAAI,WAAW;QAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IAE/E,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAC/D,IAAI,MAAM,KAAK,MAAM;YAAG,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpF,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;QAC9C,SAAS,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;QACxC,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;YAClC,CAAC,CAAC,+DAA+D;YACjE,CAAC,CAAC,+DAA+D;KACpE,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG;QAC/E,OAAO,EAAE,4GAA4G;KACtH,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAAiB,EACjB,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,CAAC;IAEZ,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1C,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,GAAG;QAAY,OAAO,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;IACvF,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;IAE3F,MAAM,EAAE,GAAG,GAAG,CAAC,SAAgC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAC7B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa,CACnG,CACF,CAAC;IAEF,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,KAAK,GAAU,CAAC,CAAC,KAAK,IAAK,CAAC,CAAC;QACnC,MAAM,MAAM,GAAS,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,WAAW,GAAI,KAAK,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QAEjF,IAAI,QAAgB,CAAC;QACrB,IAAI,iBAAyB,CAAC;QAC9B,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAC9B,QAAQ,GAAG,sBAAsB,CAAC;YAClC,iBAAiB,GAAG,qHAAqH,CAAC;QAC5I,CAAC;aAAM,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACtB,QAAQ,GAAG,kBAAkB,CAAC;YAC9B,iBAAiB,GAAG,6IAA6I,CAAC;QACpK,CAAC;aAAM,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,QAAQ,GAAG,UAAU,CAAC;YACtB,iBAAiB,GAAG,oJAAoJ,CAAC;QAC3K,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,SAAS,CAAC;YACrB,iBAAiB,GAAG,qJAAqJ,CAAC;QAC5K,CAAC;QAED,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpF,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY;YAC9C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,EAAE;YAC9C,cAAc;YACd,SAAS,EAAE,gBAAgB,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,IAAI,CAAC;YACpD,mBAAmB,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE;YAC/D,gBAAgB,EACd,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,0CAA0C;gBACjE,CAAC,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,kDAAkD;oBAC3E,CAAC,CAAC,qEAAqE;SAC1E,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;SAC7C,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnB,OAAO;QACL,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,MAAM;QAClE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI;QACrC,QAAQ,EAAE,gJAAgJ;KAC3J,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAAiB,EACjB,QAAiB,EACjB,eAAe,GAAG,CAAC;IAEnB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,GAAG;QAAY,OAAO,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC;IACvF,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;IAE3F,MAAM,EAAE,GAAG,GAAG,CAAC,SAAgC,CAAC;IAChD,IAAI,UAA0B,CAAC;IAC/B,IAAI,QAAQ,EAAE,CAAC;QACb,UAAU,GAAG,mBAAmB,CAAC,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,yCAAyC,eAAe,EAAE,EAAE,CAAC;IACzI,CAAC;IAED,MAAM,YAAY,GAAG,UAAU;SAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;SACnC,GAAG,CAAC,EAAE,CAAC,EAAE;QACR,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvG,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC3J,CAAC,CAAC,CAAC;IAEL,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;AAClF,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * MCP tool handlers for semantic search and feature insertion:
3
+ * search_code, suggest_insertion_points.
4
+ */
5
+ export type InsertionRole = 'entry_point' | 'orchestrator' | 'hub' | 'utility' | 'internal';
6
+ export type InsertionStrategy = 'extend_entry_point' | 'add_orchestration_step' | 'cross_cutting_hook' | 'extract_shared_logic' | 'call_alongside';
7
+ export interface InsertionCandidate {
8
+ rank: number;
9
+ score: number;
10
+ semanticDistance: number;
11
+ name: string;
12
+ filePath: string;
13
+ className?: string;
14
+ language: string;
15
+ signature?: string;
16
+ docstring?: string;
17
+ role: InsertionRole;
18
+ insertionStrategy: InsertionStrategy;
19
+ reason: string;
20
+ fanIn: number;
21
+ fanOut: number;
22
+ isHub: boolean;
23
+ isEntryPoint: boolean;
24
+ }
25
+ export declare function classifyRole(fanIn: number, fanOut: number, isHub: boolean, isEntryPoint: boolean): InsertionRole;
26
+ export declare function deriveStrategy(role: InsertionRole): InsertionStrategy;
27
+ export declare function buildReason(name: string, role: InsertionRole, strategy: InsertionStrategy, fanIn: number, fanOut: number): string;
28
+ /** Composite score = (1 - semanticDistance) * 0.6 + structuralBonus * 0.4 */
29
+ export declare function compositeScore(semanticDistance: number, role: InsertionRole): number;
30
+ /**
31
+ * Semantic search over the vector index built by "spec-gen analyze --embed".
32
+ */
33
+ export declare function handleSearchCode(directory: string, query: string, limit?: number, language?: string, minFanIn?: number): Promise<unknown>;
34
+ /**
35
+ * Find the best places in the codebase to implement a new feature.
36
+ */
37
+ export declare function handleSuggestInsertionPoints(directory: string, description: string, limit?: number, language?: string): Promise<unknown>;
38
+ //# sourceMappingURL=semantic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/semantic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;AAC5F,MAAM,MAAM,iBAAiB,GACzB,oBAAoB,GACpB,wBAAwB,GACxB,oBAAoB,GACpB,sBAAsB,GACtB,gBAAgB,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,GAAG,aAAa,CAMhH;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,iBAAiB,CAQrE;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,MAAM,CAaR;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAUpF;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,EACV,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAkDlB;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,SAAI,EACT,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAqElB"}