kirograph 0.27.1 → 0.28.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 (222) hide show
  1. package/README.md +35 -2
  2. package/dist/bin/commands/annotations.js +56 -0
  3. package/dist/bin/commands/annotations.js.map +7 -0
  4. package/dist/bin/commands/ast-rewrite.js +55 -0
  5. package/dist/bin/commands/ast-rewrite.js.map +7 -0
  6. package/dist/bin/commands/bench.js +103 -0
  7. package/dist/bin/commands/bench.js.map +7 -0
  8. package/dist/bin/commands/branch.js +133 -0
  9. package/dist/bin/commands/branch.js.map +7 -0
  10. package/dist/bin/commands/callees.js +76 -0
  11. package/dist/bin/commands/callees.js.map +7 -0
  12. package/dist/bin/commands/callers.js +76 -0
  13. package/dist/bin/commands/callers.js.map +7 -0
  14. package/dist/bin/commands/changelog.js +55 -0
  15. package/dist/bin/commands/changelog.js.map +7 -0
  16. package/dist/bin/commands/circular-deps.js +68 -0
  17. package/dist/bin/commands/circular-deps.js.map +7 -0
  18. package/dist/bin/commands/commit-context.js +55 -0
  19. package/dist/bin/commands/commit-context.js.map +7 -0
  20. package/dist/bin/commands/complexity.js +60 -0
  21. package/dist/bin/commands/complexity.js.map +7 -0
  22. package/dist/bin/commands/cost.js +146 -0
  23. package/dist/bin/commands/cost.js.map +7 -0
  24. package/dist/bin/commands/dependency-depth.js +55 -0
  25. package/dist/bin/commands/dependency-depth.js.map +7 -0
  26. package/dist/bin/commands/diff-context.js +55 -0
  27. package/dist/bin/commands/diff-context.js.map +7 -0
  28. package/dist/bin/commands/distribution.js +56 -0
  29. package/dist/bin/commands/distribution.js.map +7 -0
  30. package/dist/bin/commands/doc-coverage.js +56 -0
  31. package/dist/bin/commands/doc-coverage.js.map +7 -0
  32. package/dist/bin/commands/doctor.js +202 -0
  33. package/dist/bin/commands/doctor.js.map +7 -0
  34. package/dist/bin/commands/dsm.js +56 -0
  35. package/dist/bin/commands/dsm.js.map +7 -0
  36. package/dist/bin/commands/gini.js +55 -0
  37. package/dist/bin/commands/gini.js.map +7 -0
  38. package/dist/bin/commands/god-class.js +56 -0
  39. package/dist/bin/commands/god-class.js.map +7 -0
  40. package/dist/bin/commands/health.js +55 -0
  41. package/dist/bin/commands/health.js.map +7 -0
  42. package/dist/bin/commands/help.js +224 -45
  43. package/dist/bin/commands/help.js.map +2 -2
  44. package/dist/bin/commands/impact.js +76 -0
  45. package/dist/bin/commands/impact.js.map +7 -0
  46. package/dist/bin/commands/inheritance-depth.js +56 -0
  47. package/dist/bin/commands/inheritance-depth.js.map +7 -0
  48. package/dist/bin/commands/insert-at.js +55 -0
  49. package/dist/bin/commands/insert-at.js.map +7 -0
  50. package/dist/bin/commands/largest.js +56 -0
  51. package/dist/bin/commands/largest.js.map +7 -0
  52. package/dist/bin/commands/manifest.js +158 -0
  53. package/dist/bin/commands/manifest.js.map +7 -0
  54. package/dist/bin/commands/module-api.js +57 -0
  55. package/dist/bin/commands/module-api.js.map +7 -0
  56. package/dist/bin/commands/monitor.js +91 -0
  57. package/dist/bin/commands/monitor.js.map +7 -0
  58. package/dist/bin/commands/multi-replace.js +66 -0
  59. package/dist/bin/commands/multi-replace.js.map +7 -0
  60. package/dist/bin/commands/pr-context.js +55 -0
  61. package/dist/bin/commands/pr-context.js.map +7 -0
  62. package/dist/bin/commands/query.js +19 -1
  63. package/dist/bin/commands/query.js.map +3 -3
  64. package/dist/bin/commands/rank.js +56 -0
  65. package/dist/bin/commands/rank.js.map +7 -0
  66. package/dist/bin/commands/read.js +1 -1
  67. package/dist/bin/commands/read.js.map +2 -2
  68. package/dist/bin/commands/recursion.js +56 -0
  69. package/dist/bin/commands/recursion.js.map +7 -0
  70. package/dist/bin/commands/rename-preview.js +56 -0
  71. package/dist/bin/commands/rename-preview.js.map +7 -0
  72. package/dist/bin/commands/session.js +60 -0
  73. package/dist/bin/commands/session.js.map +7 -0
  74. package/dist/bin/commands/simplify-scan.js +56 -0
  75. package/dist/bin/commands/simplify-scan.js.map +7 -0
  76. package/dist/bin/commands/str-replace.js +55 -0
  77. package/dist/bin/commands/str-replace.js.map +7 -0
  78. package/dist/bin/commands/test-coverage.js +59 -0
  79. package/dist/bin/commands/test-coverage.js.map +7 -0
  80. package/dist/bin/commands/test-map.js +56 -0
  81. package/dist/bin/commands/test-map.js.map +7 -0
  82. package/dist/bin/commands/test-risk.js +59 -0
  83. package/dist/bin/commands/test-risk.js.map +7 -0
  84. package/dist/bin/commands/type-hierarchy.js +76 -0
  85. package/dist/bin/commands/type-hierarchy.js.map +7 -0
  86. package/dist/bin/commands/unused-imports.js +55 -0
  87. package/dist/bin/commands/unused-imports.js.map +7 -0
  88. package/dist/bin/commands/upgrade.js +78 -0
  89. package/dist/bin/commands/upgrade.js.map +7 -0
  90. package/dist/bin/installer/common.js +19 -9
  91. package/dist/bin/installer/common.js.map +2 -2
  92. package/dist/bin/installer/config-prompt.js +147 -12
  93. package/dist/bin/installer/config-prompt.js.map +3 -3
  94. package/dist/bin/installer/index.js +62 -6
  95. package/dist/bin/installer/index.js.map +2 -2
  96. package/dist/bin/installer/instructions.js +14 -25
  97. package/dist/bin/installer/instructions.js.map +2 -2
  98. package/dist/bin/installer/mcp.js.map +2 -2
  99. package/dist/bin/installer/steering.js +569 -100
  100. package/dist/bin/installer/steering.js.map +2 -2
  101. package/dist/bin/installer/targets/aider.js +3 -3
  102. package/dist/bin/installer/targets/aider.js.map +2 -2
  103. package/dist/bin/installer/targets/amp.js +3 -3
  104. package/dist/bin/installer/targets/amp.js.map +2 -2
  105. package/dist/bin/installer/targets/antigravity.js +4 -4
  106. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  107. package/dist/bin/installer/targets/augment.js +3 -3
  108. package/dist/bin/installer/targets/augment.js.map +2 -2
  109. package/dist/bin/installer/targets/claude.js +3 -3
  110. package/dist/bin/installer/targets/claude.js.map +2 -2
  111. package/dist/bin/installer/targets/cline.js +4 -4
  112. package/dist/bin/installer/targets/cline.js.map +2 -2
  113. package/dist/bin/installer/targets/codex.js +4 -4
  114. package/dist/bin/installer/targets/codex.js.map +2 -2
  115. package/dist/bin/installer/targets/continue.js +4 -4
  116. package/dist/bin/installer/targets/continue.js.map +2 -2
  117. package/dist/bin/installer/targets/copilot-cli.js +4 -4
  118. package/dist/bin/installer/targets/copilot-cli.js.map +2 -2
  119. package/dist/bin/installer/targets/copilot.js +4 -4
  120. package/dist/bin/installer/targets/copilot.js.map +2 -2
  121. package/dist/bin/installer/targets/cursor.js +5 -5
  122. package/dist/bin/installer/targets/cursor.js.map +2 -2
  123. package/dist/bin/installer/targets/devin.js +4 -4
  124. package/dist/bin/installer/targets/devin.js.map +2 -2
  125. package/dist/bin/installer/targets/gemini-cli.js +4 -4
  126. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  127. package/dist/bin/installer/targets/generic.js +2 -2
  128. package/dist/bin/installer/targets/generic.js.map +2 -2
  129. package/dist/bin/installer/targets/goose.js +3 -4
  130. package/dist/bin/installer/targets/goose.js.map +3 -3
  131. package/dist/bin/installer/targets/index.js.map +1 -1
  132. package/dist/bin/installer/targets/junie.js +4 -4
  133. package/dist/bin/installer/targets/junie.js.map +2 -2
  134. package/dist/bin/installer/targets/kilo.js +4 -4
  135. package/dist/bin/installer/targets/kilo.js.map +2 -2
  136. package/dist/bin/installer/targets/kiro.js +27 -3
  137. package/dist/bin/installer/targets/kiro.js.map +2 -2
  138. package/dist/bin/installer/targets/opencode.js +3 -3
  139. package/dist/bin/installer/targets/opencode.js.map +2 -2
  140. package/dist/bin/installer/targets/openhands.js +3 -3
  141. package/dist/bin/installer/targets/openhands.js.map +2 -2
  142. package/dist/bin/installer/targets/qoder.js +2 -2
  143. package/dist/bin/installer/targets/qoder.js.map +2 -2
  144. package/dist/bin/installer/targets/qwen.js +2 -2
  145. package/dist/bin/installer/targets/qwen.js.map +2 -2
  146. package/dist/bin/installer/targets/replit.js +3 -3
  147. package/dist/bin/installer/targets/replit.js.map +2 -2
  148. package/dist/bin/installer/targets/roo.js +4 -4
  149. package/dist/bin/installer/targets/roo.js.map +2 -2
  150. package/dist/bin/installer/targets/tabnine.js +3 -3
  151. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  152. package/dist/bin/installer/targets/trae.js +3 -3
  153. package/dist/bin/installer/targets/trae.js.map +2 -2
  154. package/dist/bin/installer/targets/warp.js +4 -4
  155. package/dist/bin/installer/targets/warp.js.map +2 -2
  156. package/dist/bin/installer/targets/windsurf.js +4 -4
  157. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  158. package/dist/bin/kirograph.js +83 -1
  159. package/dist/bin/kirograph.js.map +3 -3
  160. package/dist/config.js +30 -8
  161. package/dist/config.js.map +2 -2
  162. package/dist/core/branch-manager.js +111 -0
  163. package/dist/core/branch-manager.js.map +7 -0
  164. package/dist/core/pipeline.js +3 -3
  165. package/dist/core/pipeline.js.map +2 -2
  166. package/dist/data/pixelrag-bridge.js +93 -0
  167. package/dist/data/pixelrag-bridge.js.map +7 -0
  168. package/dist/data/pixelrag-manager.js +416 -0
  169. package/dist/data/pixelrag-manager.js.map +7 -0
  170. package/dist/db/database.js +34 -7
  171. package/dist/db/database.js.map +2 -2
  172. package/dist/db/schema.sql +7 -1
  173. package/dist/extraction/complexity.js +116 -0
  174. package/dist/extraction/complexity.js.map +7 -0
  175. package/dist/extraction/extractor.js +52 -1
  176. package/dist/extraction/extractor.js.map +2 -2
  177. package/dist/graph/git-context.js +229 -0
  178. package/dist/graph/git-context.js.map +7 -0
  179. package/dist/index.js +4 -2
  180. package/dist/index.js.map +2 -2
  181. package/dist/mcp/cache.js +1 -1
  182. package/dist/mcp/cache.js.map +2 -2
  183. package/dist/mcp/handler.js +446 -0
  184. package/dist/mcp/handler.js.map +7 -0
  185. package/dist/mcp/handlers/architecture.js +297 -0
  186. package/dist/mcp/handlers/architecture.js.map +7 -0
  187. package/dist/mcp/handlers/branch.js +175 -0
  188. package/dist/mcp/handlers/branch.js.map +7 -0
  189. package/dist/mcp/handlers/code-health.js +563 -0
  190. package/dist/mcp/handlers/code-health.js.map +7 -0
  191. package/dist/mcp/handlers/complexity.js +267 -0
  192. package/dist/mcp/handlers/complexity.js.map +7 -0
  193. package/dist/mcp/handlers/core.js +611 -0
  194. package/dist/mcp/handlers/core.js.map +7 -0
  195. package/dist/mcp/handlers/data.js +337 -0
  196. package/dist/mcp/handlers/data.js.map +7 -0
  197. package/dist/mcp/handlers/docs.js +159 -0
  198. package/dist/mcp/handlers/docs.js.map +7 -0
  199. package/dist/mcp/handlers/edit-primitives.js +200 -0
  200. package/dist/mcp/handlers/edit-primitives.js.map +7 -0
  201. package/dist/mcp/handlers/git-context.js +286 -0
  202. package/dist/mcp/handlers/git-context.js.map +7 -0
  203. package/dist/mcp/handlers/memory.js +363 -0
  204. package/dist/mcp/handlers/memory.js.map +7 -0
  205. package/dist/mcp/handlers/patterns.js +310 -0
  206. package/dist/mcp/handlers/patterns.js.map +7 -0
  207. package/dist/mcp/handlers/security.js +699 -0
  208. package/dist/mcp/handlers/security.js.map +7 -0
  209. package/dist/mcp/handlers/utils.js +97 -0
  210. package/dist/mcp/handlers/utils.js.map +7 -0
  211. package/dist/mcp/handlers/watchmen.js +104 -0
  212. package/dist/mcp/handlers/watchmen.js.map +7 -0
  213. package/dist/mcp/handlers/wiki.js +242 -0
  214. package/dist/mcp/handlers/wiki.js.map +7 -0
  215. package/dist/mcp/server.js +72 -3
  216. package/dist/mcp/server.js.map +2 -2
  217. package/dist/mcp/tool-names.js +136 -10
  218. package/dist/mcp/tool-names.js.map +2 -2
  219. package/dist/mcp/tools.js +846 -3019
  220. package/dist/mcp/tools.js.map +3 -3
  221. package/dist/types.js.map +2 -2
  222. package/package.json +36 -10
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var docs_exports = {};
20
+ __export(docs_exports, {
21
+ handleDocs: () => handleDocs
22
+ });
23
+ module.exports = __toCommonJS(docs_exports);
24
+ async function handleDocs(toolName, args, cg) {
25
+ switch (toolName) {
26
+ case "kirograph_docs_toc": {
27
+ const { loadConfig } = await Promise.resolve().then(() => require("../../config.js"));
28
+ const projectRoot = cg.getProjectRoot();
29
+ const config = await loadConfig(projectRoot);
30
+ if (!config.enableDocs) return "Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.";
31
+ const { DocsQueries } = await Promise.resolve().then(() => require("../../docs/queries.js"));
32
+ const db = cg.getDatabase();
33
+ db.applyDocsSchema();
34
+ const docs = new DocsQueries(db.getRawDb(), projectRoot);
35
+ const toc = docs.getToc({ file: args.file, tree: args.tree });
36
+ if (toc.length === 0) return args.file ? `No sections found in "${args.file}".` : "No documentation indexed. Run kirograph index.";
37
+ const lines = [];
38
+ const renderEntry = (entry, indent) => {
39
+ const prefix = "#".repeat(entry.level || 1);
40
+ const summary = entry.summary ? ` \u2014 ${entry.summary}` : "";
41
+ lines.push(`${indent}${prefix} ${entry.title}${summary}`);
42
+ lines.push(`${indent} ID: ${entry.id}`);
43
+ if (entry.children?.length) {
44
+ for (const child of entry.children) renderEntry(child, indent + " ");
45
+ }
46
+ };
47
+ if (args.tree) {
48
+ for (const entry of toc) renderEntry(entry, "");
49
+ } else {
50
+ for (const entry of toc) {
51
+ const prefix = "#".repeat(entry.level || 1);
52
+ const summary = entry.summary ? ` \u2014 ${entry.summary}` : "";
53
+ lines.push(`${prefix} ${entry.title} [${entry.filePath}]${summary}`);
54
+ lines.push(` ID: ${entry.id}`);
55
+ }
56
+ }
57
+ return lines.join("\n");
58
+ }
59
+ case "kirograph_docs_search": {
60
+ const { loadConfig } = await Promise.resolve().then(() => require("../../config.js"));
61
+ const projectRoot = cg.getProjectRoot();
62
+ const config = await loadConfig(projectRoot);
63
+ if (!config.enableDocs) return "Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.";
64
+ const { DocsQueries } = await Promise.resolve().then(() => require("../../docs/queries.js"));
65
+ const db = cg.getDatabase();
66
+ db.applyDocsSchema();
67
+ const docs = new DocsQueries(db.getRawDb(), projectRoot, config);
68
+ const results = await docs.searchSections(args.query, {
69
+ file: args.file,
70
+ limit: args.limit ?? 10
71
+ });
72
+ if (results.length === 0) return `No documentation sections found matching "${args.query}".`;
73
+ return results.map((r, i) => {
74
+ const summary = r.section.summary ? `
75
+ ${r.section.summary}` : "";
76
+ return `${i + 1}. ${r.section.title} [${r.section.filePath}]${summary}
77
+ ID: ${r.section.id}`;
78
+ }).join("\n\n");
79
+ }
80
+ case "kirograph_docs_section": {
81
+ const { loadConfig } = await Promise.resolve().then(() => require("../../config.js"));
82
+ const projectRoot = cg.getProjectRoot();
83
+ const config = await loadConfig(projectRoot);
84
+ if (!config.enableDocs) return "Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.";
85
+ const { DocsQueries } = await Promise.resolve().then(() => require("../../docs/queries.js"));
86
+ const db = cg.getDatabase();
87
+ db.applyDocsSchema();
88
+ const docs = new DocsQueries(db.getRawDb(), projectRoot);
89
+ const result = docs.getSection(args.id, { context: args.context });
90
+ if (!result) return `Section "${args.id}" not found.`;
91
+ const lines = [];
92
+ if (result.ancestors?.length) {
93
+ lines.push("Breadcrumb: " + result.ancestors.map((a) => a.title).join(" > ") + " > " + result.section.title);
94
+ lines.push("");
95
+ }
96
+ lines.push(result.content);
97
+ if (result.children?.length) {
98
+ lines.push("", "## Child sections:");
99
+ for (const child of result.children) {
100
+ const summary = child.summary ? ` \u2014 ${child.summary}` : "";
101
+ lines.push(` - ${child.title}${summary} (ID: ${child.id})`);
102
+ }
103
+ }
104
+ return lines.join("\n");
105
+ }
106
+ case "kirograph_docs_outline": {
107
+ const { loadConfig } = await Promise.resolve().then(() => require("../../config.js"));
108
+ const projectRoot = cg.getProjectRoot();
109
+ const config = await loadConfig(projectRoot);
110
+ if (!config.enableDocs) return "Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.";
111
+ const { DocsQueries } = await Promise.resolve().then(() => require("../../docs/queries.js"));
112
+ const db = cg.getDatabase();
113
+ db.applyDocsSchema();
114
+ const docs = new DocsQueries(db.getRawDb(), projectRoot);
115
+ const outline = docs.getOutline(args.file);
116
+ if (outline.length === 0) return `No sections found in "${args.file}". Is the file indexed?`;
117
+ const lines = [`Outline: ${args.file}`, ""];
118
+ const renderOutline = (entries, indent) => {
119
+ for (const entry of entries) {
120
+ const summary = entry.summary ? ` \u2014 ${entry.summary}` : "";
121
+ lines.push(`${indent}${"#".repeat(entry.level || 1)} ${entry.title}${summary}`);
122
+ if (entry.children?.length) renderOutline(entry.children, indent + " ");
123
+ }
124
+ };
125
+ renderOutline(outline, "");
126
+ return lines.join("\n");
127
+ }
128
+ case "kirograph_docs_refs": {
129
+ const { loadConfig } = await Promise.resolve().then(() => require("../../config.js"));
130
+ const projectRoot = cg.getProjectRoot();
131
+ const config = await loadConfig(projectRoot);
132
+ if (!config.enableDocs) return "Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.";
133
+ const { DocsQueries } = await Promise.resolve().then(() => require("../../docs/queries.js"));
134
+ const db = cg.getDatabase();
135
+ db.applyDocsSchema();
136
+ const docs = new DocsQueries(db.getRawDb(), projectRoot);
137
+ const refs = docs.getRefs({
138
+ sectionId: args.sectionId,
139
+ qualifiedName: args.nodeId
140
+ });
141
+ if (refs.length === 0) {
142
+ if (args.sectionId) return `No code references found in section "${args.sectionId}".`;
143
+ if (args.nodeId) return `No documentation sections reference "${args.nodeId}".`;
144
+ return "Provide either sectionId or nodeId to look up cross-references.";
145
+ }
146
+ return refs.map((r) => {
147
+ const direction = args.sectionId ? `\u2192 ${r.qualifiedName}` : `\u2190 ${r.sectionTitle ?? r.sectionId}`;
148
+ return `[${r.refType}] ${direction} (confidence: ${r.confidence.toFixed(2)})`;
149
+ }).join("\n");
150
+ }
151
+ default:
152
+ return `Unknown tool: ${toolName}`;
153
+ }
154
+ }
155
+ // Annotate the CommonJS export names for ESM import in node:
156
+ 0 && (module.exports = {
157
+ handleDocs
158
+ });
159
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/mcp/handlers/docs.ts"],
4
+ "sourcesContent": ["import KiroGraph from '../../index';\n\nexport async function handleDocs(toolName: string, args: Record<string, unknown>, cg: KiroGraph): Promise<string> {\n switch (toolName) {\n case 'kirograph_docs_toc': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const toc = docs.getToc({ file: args.file as string | undefined, tree: args.tree as boolean | undefined });\n if (toc.length === 0) return args.file ? `No sections found in \"${args.file}\".` : 'No documentation indexed. Run kirograph index.';\n\n const lines: string[] = [];\n const renderEntry = (entry: any, indent: string) => {\n const prefix = '#'.repeat(entry.level || 1);\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${indent}${prefix} ${entry.title}${summary}`);\n lines.push(`${indent} ID: ${entry.id}`);\n if (entry.children?.length) {\n for (const child of entry.children) renderEntry(child, indent + ' ');\n }\n };\n\n if (args.tree) {\n for (const entry of toc) renderEntry(entry, '');\n } else {\n for (const entry of toc) {\n const prefix = '#'.repeat(entry.level || 1);\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${prefix} ${entry.title} [${entry.filePath}]${summary}`);\n lines.push(` ID: ${entry.id}`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot, config);\n\n const results = await docs.searchSections(args.query as string, {\n file: args.file as string | undefined,\n limit: (args.limit as number) ?? 10,\n });\n\n if (results.length === 0) return `No documentation sections found matching \"${args.query}\".`;\n\n return results.map((r, i) => {\n const summary = r.section.summary ? `\\n ${r.section.summary}` : '';\n return `${i + 1}. ${r.section.title} [${r.section.filePath}]${summary}\\n ID: ${r.section.id}`;\n }).join('\\n\\n');\n }\n\n case 'kirograph_docs_section': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const result = docs.getSection(args.id as string, { context: args.context as boolean | undefined });\n if (!result) return `Section \"${args.id}\" not found.`;\n\n const lines: string[] = [];\n\n if (result.ancestors?.length) {\n lines.push('Breadcrumb: ' + result.ancestors.map(a => a.title).join(' > ') + ' > ' + result.section.title);\n lines.push('');\n }\n\n lines.push(result.content);\n\n if (result.children?.length) {\n lines.push('', '## Child sections:');\n for (const child of result.children) {\n const summary = child.summary ? ` \u2014 ${child.summary}` : '';\n lines.push(` - ${child.title}${summary} (ID: ${child.id})`);\n }\n }\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_outline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const outline = docs.getOutline(args.file as string);\n if (outline.length === 0) return `No sections found in \"${args.file}\". Is the file indexed?`;\n\n const lines: string[] = [`Outline: ${args.file}`, ''];\n const renderOutline = (entries: any[], indent: string) => {\n for (const entry of entries) {\n const summary = entry.summary ? ` \u2014 ${entry.summary}` : '';\n lines.push(`${indent}${'#'.repeat(entry.level || 1)} ${entry.title}${summary}`);\n if (entry.children?.length) renderOutline(entry.children, indent + ' ');\n }\n };\n renderOutline(outline, '');\n\n return lines.join('\\n');\n }\n\n case 'kirograph_docs_refs': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableDocs) return 'Documentation indexing is not enabled. Set enableDocs: true in .kirograph/config.json and run kirograph index.';\n\n const { DocsQueries } = await Promise.resolve().then(() => require('../../docs/queries.js'));\n const db = cg.getDatabase();\n db.applyDocsSchema();\n const docs = new DocsQueries(db.getRawDb(), projectRoot);\n\n const refs = docs.getRefs({\n sectionId: args.sectionId as string | undefined,\n qualifiedName: args.nodeId as string | undefined,\n });\n\n if (refs.length === 0) {\n if (args.sectionId) return `No code references found in section \"${args.sectionId}\".`;\n if (args.nodeId) return `No documentation sections reference \"${args.nodeId}\".`;\n return 'Provide either sectionId or nodeId to look up cross-references.';\n }\n\n return refs.map(r => {\n const direction = args.sectionId ? `\u2192 ${r.qualifiedName}` : `\u2190 ${r.sectionTitle ?? r.sectionId}`;\n return `[${r.refType}] ${direction} (confidence: ${r.confidence.toFixed(2)})`;\n }).join('\\n');\n }\n\n default:\n return `Unknown tool: ${toolName}`;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var edit_primitives_exports = {};
30
+ __export(edit_primitives_exports, {
31
+ handleEditPrimitives: () => handleEditPrimitives
32
+ });
33
+ module.exports = __toCommonJS(edit_primitives_exports);
34
+ var fs = __toESM(require("fs"));
35
+ var path = __toESM(require("path"));
36
+ function readProjectFile(cg, filePath) {
37
+ const root = cg.getProjectRoot();
38
+ const absPath = path.resolve(root, filePath);
39
+ if (!absPath.startsWith(root + path.sep) && absPath !== root) return { error: `Path "${filePath}" is outside the project root.` };
40
+ if (!fs.existsSync(absPath)) return { error: `File not found: ${filePath}` };
41
+ return { absPath, content: fs.readFileSync(absPath, "utf8") };
42
+ }
43
+ async function writeAndSync(cg, absPath, content) {
44
+ fs.writeFileSync(absPath, content, "utf8");
45
+ const root = cg.getProjectRoot();
46
+ const rel = path.relative(root, absPath);
47
+ try {
48
+ await cg.sync([rel]);
49
+ } catch {
50
+ }
51
+ return rel;
52
+ }
53
+ async function handleEditPrimitives(toolName, args, cg) {
54
+ switch (toolName) {
55
+ case "kirograph_refactor": {
56
+ const { renamePreview, suggestRefactorings } = await Promise.resolve().then(() => require("../../graph/refactor.js"));
57
+ const db = cg.getDatabase();
58
+ const mode = args.mode;
59
+ if (mode === "rename") {
60
+ if (!args.symbol) return 'Error: "symbol" parameter is required for rename mode.';
61
+ const preview = renamePreview(db, args.symbol);
62
+ if (!preview) return `Symbol "${args.symbol}" not found in index.`;
63
+ const lines = [
64
+ `## Rename Preview: \`${preview.symbol}\``,
65
+ `Kind: ${preview.kind}`,
66
+ `Defined at: ${preview.filePath}:${preview.line}`,
67
+ `Total references: ${preview.totalReferences}`,
68
+ ""
69
+ ];
70
+ if (preview.references.length === 0) {
71
+ lines.push("No references found \u2014 this symbol can be safely renamed without affecting other code.");
72
+ } else {
73
+ const byFile = /* @__PURE__ */ new Map();
74
+ for (const ref of preview.references) {
75
+ if (!byFile.has(ref.filePath)) byFile.set(ref.filePath, []);
76
+ byFile.get(ref.filePath).push(ref);
77
+ }
78
+ for (const [file, refs] of byFile) {
79
+ lines.push(`### ${file} (${refs.length} references)`);
80
+ for (const ref of refs.slice(0, 10)) {
81
+ lines.push(`- Line ${ref.line}: \`${ref.context}\` (${ref.edgeKind})`);
82
+ }
83
+ if (refs.length > 10) lines.push(` \u2026and ${refs.length - 10} more`);
84
+ lines.push("");
85
+ }
86
+ }
87
+ return lines.join("\n");
88
+ }
89
+ if (mode === "suggest") {
90
+ const suggestions = suggestRefactorings(db, args.limit ?? 10);
91
+ if (suggestions.length === 0) return "No refactoring suggestions \u2014 the codebase structure looks clean.";
92
+ const lines = [`## Refactoring Suggestions (${suggestions.length})`, ""];
93
+ for (const s of suggestions) {
94
+ const icon = s.priority === "high" ? "\u{1F534}" : s.priority === "medium" ? "\u{1F7E1}" : "\u{1F7E2}";
95
+ lines.push(`${icon} **${s.type}** [${s.priority}]: ${s.description}`);
96
+ lines.push(` Rationale: ${s.rationale}`);
97
+ if (s.symbols.length > 0) {
98
+ lines.push(` Symbols: ${s.symbols.slice(0, 3).join(", ")}`);
99
+ }
100
+ lines.push("");
101
+ }
102
+ return lines.join("\n");
103
+ }
104
+ return 'Unknown mode. Use "rename" or "suggest".';
105
+ }
106
+ case "kirograph_str_replace": {
107
+ const file = args.file;
108
+ const oldStr = args.old_str;
109
+ const newStr = args.new_str;
110
+ const result = readProjectFile(cg, file);
111
+ if ("error" in result) return result.error;
112
+ const { absPath, content } = result;
113
+ const count = content.split(oldStr).length - 1;
114
+ if (count === 0) return `No match found for the given old_str in "${file}". Nothing changed.`;
115
+ if (count > 1) return `Found ${count} matches for old_str in "${file}" \u2014 replacement would be ambiguous. Provide more context to make it unique.`;
116
+ const updated = content.replace(oldStr, newStr);
117
+ const rel = await writeAndSync(cg, absPath, updated);
118
+ return `Replaced 1 occurrence in ${rel}.`;
119
+ }
120
+ case "kirograph_multi_str_replace": {
121
+ const file = args.file;
122
+ const pairs = args.pairs;
123
+ if (!Array.isArray(pairs) || pairs.length === 0) return 'Error: "pairs" must be a non-empty array of {old_str, new_str} objects.';
124
+ const result = readProjectFile(cg, file);
125
+ if ("error" in result) return result.error;
126
+ const { absPath } = result;
127
+ let content = result.content;
128
+ for (let i = 0; i < pairs.length; i++) {
129
+ const { old_str } = pairs[i];
130
+ const count = content.split(old_str).length - 1;
131
+ if (count === 0) return `Pair ${i + 1}: no match found for old_str. Transaction aborted, no changes made.`;
132
+ if (count > 1) return `Pair ${i + 1}: found ${count} matches for old_str \u2014 ambiguous. Transaction aborted, no changes made.`;
133
+ }
134
+ for (const { old_str, new_str } of pairs) content = content.replace(old_str, new_str);
135
+ const rel = await writeAndSync(cg, absPath, content);
136
+ return `Applied ${pairs.length} replacement(s) in ${rel}.`;
137
+ }
138
+ case "kirograph_insert_at": {
139
+ const file = args.file;
140
+ const anchor = args.anchor;
141
+ const lineNum = args.line;
142
+ const insertContent = args.content;
143
+ const position = args.position ?? "after";
144
+ const result = readProjectFile(cg, file);
145
+ if ("error" in result) return result.error;
146
+ const { absPath, content } = result;
147
+ let updated;
148
+ if (lineNum !== void 0) {
149
+ const lines = content.split("\n");
150
+ const idx = lineNum - 1;
151
+ if (idx < 0 || idx > lines.length) return `Line ${lineNum} is out of range (file has ${lines.length} lines).`;
152
+ const insertIdx = position === "before" ? idx : idx + 1;
153
+ lines.splice(insertIdx, 0, insertContent);
154
+ updated = lines.join("\n");
155
+ } else if (anchor !== void 0) {
156
+ const idx = content.indexOf(anchor);
157
+ if (idx === -1) return `Anchor not found in "${file}". Nothing changed.`;
158
+ if (content.indexOf(anchor, idx + 1) !== -1) return `Anchor appears more than once in "${file}" \u2014 ambiguous. Provide a more unique anchor.`;
159
+ const insertPos = position === "before" ? idx : idx + anchor.length;
160
+ updated = content.slice(0, insertPos) + insertContent + content.slice(insertPos);
161
+ } else {
162
+ return 'Error: either "anchor" or "line" parameter is required.';
163
+ }
164
+ const rel = await writeAndSync(cg, absPath, updated);
165
+ return `Inserted content in ${rel} (${position} ${anchor ? `"${anchor}"` : `line ${lineNum}`}).`;
166
+ }
167
+ case "kirograph_ast_grep_rewrite": {
168
+ const { execSync } = await import("child_process");
169
+ try {
170
+ execSync("which ast-grep", { stdio: "ignore" });
171
+ } catch {
172
+ return "ast-grep is not installed or not on PATH. Install it (https://ast-grep.github.io/) to use this tool.";
173
+ }
174
+ const file = args.file;
175
+ const pattern = args.pattern;
176
+ const rewrite = args.rewrite;
177
+ const result = readProjectFile(cg, file);
178
+ if ("error" in result) return result.error;
179
+ const { absPath } = result;
180
+ try {
181
+ const output = execSync(
182
+ `ast-grep --pattern ${JSON.stringify(pattern)} --rewrite ${JSON.stringify(rewrite)} --update-all ${JSON.stringify(absPath)}`,
183
+ { encoding: "utf8", cwd: cg.getProjectRoot() }
184
+ );
185
+ await writeAndSync(cg, absPath, fs.readFileSync(absPath, "utf8"));
186
+ return `ast-grep rewrite applied to ${file}.
187
+ ${output.trim()}`;
188
+ } catch (err) {
189
+ return `ast-grep error: ${err.message ?? String(err)}`;
190
+ }
191
+ }
192
+ default:
193
+ return `Unknown tool: ${toolName}`;
194
+ }
195
+ }
196
+ // Annotate the CommonJS export names for ESM import in node:
197
+ 0 && (module.exports = {
198
+ handleEditPrimitives
199
+ });
200
+ //# sourceMappingURL=edit-primitives.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/mcp/handlers/edit-primitives.ts"],
4
+ "sourcesContent": ["import * as fs from 'fs';\nimport * as path from 'path';\nimport KiroGraph from '../../index';\n\n/** Read a file relative to projectRoot, validate it exists and is within root. */\nfunction readProjectFile(cg: KiroGraph, filePath: string): { absPath: string; content: string } | { error: string } {\n const root = cg.getProjectRoot();\n const absPath = path.resolve(root, filePath);\n if (!absPath.startsWith(root + path.sep) && absPath !== root) return { error: `Path \"${filePath}\" is outside the project root.` };\n if (!fs.existsSync(absPath)) return { error: `File not found: ${filePath}` };\n return { absPath, content: fs.readFileSync(absPath, 'utf8') };\n}\n\nasync function writeAndSync(cg: KiroGraph, absPath: string, content: string): Promise<string> {\n fs.writeFileSync(absPath, content, 'utf8');\n const root = cg.getProjectRoot();\n const rel = path.relative(root, absPath);\n try { await cg.sync([rel]); } catch { /* non-critical \u2014 index will catch up on next sync */ }\n return rel;\n}\n\nexport async function handleEditPrimitives(toolName: string, args: Record<string, unknown>, cg: KiroGraph): Promise<string> {\n switch (toolName) {\n case 'kirograph_refactor': {\n const { renamePreview, suggestRefactorings } = await Promise.resolve().then(() => require('../../graph/refactor.js'));\n const db = cg.getDatabase();\n const mode = args.mode as string;\n\n if (mode === 'rename') {\n if (!args.symbol) return 'Error: \"symbol\" parameter is required for rename mode.';\n const preview = renamePreview(db, args.symbol as string);\n if (!preview) return `Symbol \"${args.symbol}\" not found in index.`;\n\n const lines = [\n `## Rename Preview: \\`${preview.symbol}\\``,\n `Kind: ${preview.kind}`,\n `Defined at: ${preview.filePath}:${preview.line}`,\n `Total references: ${preview.totalReferences}`,\n '',\n ];\n\n if (preview.references.length === 0) {\n lines.push('No references found \u2014 this symbol can be safely renamed without affecting other code.');\n } else {\n // Group by file\n const byFile = new Map<string, typeof preview.references>();\n for (const ref of preview.references) {\n if (!byFile.has(ref.filePath)) byFile.set(ref.filePath, []);\n byFile.get(ref.filePath)!.push(ref);\n }\n\n for (const [file, refs] of byFile) {\n lines.push(`### ${file} (${refs.length} references)`);\n for (const ref of refs.slice(0, 10)) {\n lines.push(`- Line ${ref.line}: \\`${ref.context}\\` (${ref.edgeKind})`);\n }\n if (refs.length > 10) lines.push(` \u2026and ${refs.length - 10} more`);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n }\n\n if (mode === 'suggest') {\n const suggestions = suggestRefactorings(db, (args.limit as number) ?? 10);\n if (suggestions.length === 0) return 'No refactoring suggestions \u2014 the codebase structure looks clean.';\n\n const lines = [`## Refactoring Suggestions (${suggestions.length})`, ''];\n for (const s of suggestions) {\n const icon = s.priority === 'high' ? '\uD83D\uDD34' : s.priority === 'medium' ? '\uD83D\uDFE1' : '\uD83D\uDFE2';\n lines.push(`${icon} **${s.type}** [${s.priority}]: ${s.description}`);\n lines.push(` Rationale: ${s.rationale}`);\n if (s.symbols.length > 0) {\n lines.push(` Symbols: ${s.symbols.slice(0, 3).join(', ')}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n return 'Unknown mode. Use \"rename\" or \"suggest\".';\n }\n\n case 'kirograph_str_replace': {\n const file = args.file as string;\n const oldStr = args.old_str as string;\n const newStr = args.new_str as string;\n const result = readProjectFile(cg, file);\n if ('error' in result) return result.error;\n const { absPath, content } = result;\n const count = content.split(oldStr).length - 1;\n if (count === 0) return `No match found for the given old_str in \"${file}\". Nothing changed.`;\n if (count > 1) return `Found ${count} matches for old_str in \"${file}\" \u2014 replacement would be ambiguous. Provide more context to make it unique.`;\n const updated = content.replace(oldStr, newStr);\n const rel = await writeAndSync(cg, absPath, updated);\n return `Replaced 1 occurrence in ${rel}.`;\n }\n\n case 'kirograph_multi_str_replace': {\n const file = args.file as string;\n const pairs = args.pairs as Array<{ old_str: string; new_str: string }>;\n if (!Array.isArray(pairs) || pairs.length === 0) return 'Error: \"pairs\" must be a non-empty array of {old_str, new_str} objects.';\n const result = readProjectFile(cg, file);\n if ('error' in result) return result.error;\n const { absPath } = result;\n let content = result.content;\n // Validate all replacements before applying any (all-or-nothing)\n for (let i = 0; i < pairs.length; i++) {\n const { old_str } = pairs[i];\n const count = content.split(old_str).length - 1;\n if (count === 0) return `Pair ${i + 1}: no match found for old_str. Transaction aborted, no changes made.`;\n if (count > 1) return `Pair ${i + 1}: found ${count} matches for old_str \u2014 ambiguous. Transaction aborted, no changes made.`;\n }\n for (const { old_str, new_str } of pairs) content = content.replace(old_str, new_str);\n const rel = await writeAndSync(cg, absPath, content);\n return `Applied ${pairs.length} replacement(s) in ${rel}.`;\n }\n\n case 'kirograph_insert_at': {\n const file = args.file as string;\n const anchor = args.anchor as string | undefined;\n const lineNum = args.line as number | undefined;\n const insertContent = args.content as string;\n const position = (args.position as string) ?? 'after';\n const result = readProjectFile(cg, file);\n if ('error' in result) return result.error;\n const { absPath, content } = result;\n let updated: string;\n if (lineNum !== undefined) {\n const lines = content.split('\\n');\n const idx = lineNum - 1;\n if (idx < 0 || idx > lines.length) return `Line ${lineNum} is out of range (file has ${lines.length} lines).`;\n const insertIdx = position === 'before' ? idx : idx + 1;\n lines.splice(insertIdx, 0, insertContent);\n updated = lines.join('\\n');\n } else if (anchor !== undefined) {\n const idx = content.indexOf(anchor);\n if (idx === -1) return `Anchor not found in \"${file}\". Nothing changed.`;\n if (content.indexOf(anchor, idx + 1) !== -1) return `Anchor appears more than once in \"${file}\" \u2014 ambiguous. Provide a more unique anchor.`;\n const insertPos = position === 'before' ? idx : idx + anchor.length;\n updated = content.slice(0, insertPos) + insertContent + content.slice(insertPos);\n } else {\n return 'Error: either \"anchor\" or \"line\" parameter is required.';\n }\n const rel = await writeAndSync(cg, absPath, updated);\n return `Inserted content in ${rel} (${position} ${anchor ? `\"${anchor}\"` : `line ${lineNum}`}).`;\n }\n\n case 'kirograph_ast_grep_rewrite': {\n const { execSync } = await import('child_process');\n // Check ast-grep is available\n try { execSync('which ast-grep', { stdio: 'ignore' }); } catch {\n return 'ast-grep is not installed or not on PATH. Install it (https://ast-grep.github.io/) to use this tool.';\n }\n const file = args.file as string;\n const pattern = args.pattern as string;\n const rewrite = args.rewrite as string;\n const result = readProjectFile(cg, file);\n if ('error' in result) return result.error;\n const { absPath } = result;\n try {\n const output = execSync(\n `ast-grep --pattern ${JSON.stringify(pattern)} --rewrite ${JSON.stringify(rewrite)} --update-all ${JSON.stringify(absPath)}`,\n { encoding: 'utf8', cwd: cg.getProjectRoot() }\n );\n await writeAndSync(cg, absPath, fs.readFileSync(absPath, 'utf8'));\n return `ast-grep rewrite applied to ${file}.\\n${output.trim()}`;\n } catch (err: any) {\n return `ast-grep error: ${err.message ?? String(err)}`;\n }\n }\n\n default:\n return `Unknown tool: ${toolName}`;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAoB;AACpB,WAAsB;AAItB,SAAS,gBAAgB,IAAe,UAA4E;AAClH,QAAM,OAAO,GAAG,eAAe;AAC/B,QAAM,UAAU,KAAK,QAAQ,MAAM,QAAQ;AAC3C,MAAI,CAAC,QAAQ,WAAW,OAAO,KAAK,GAAG,KAAK,YAAY,KAAM,QAAO,EAAE,OAAO,SAAS,QAAQ,iCAAiC;AAChI,MAAI,CAAC,GAAG,WAAW,OAAO,EAAG,QAAO,EAAE,OAAO,mBAAmB,QAAQ,GAAG;AAC3E,SAAO,EAAE,SAAS,SAAS,GAAG,aAAa,SAAS,MAAM,EAAE;AAC9D;AAEA,eAAe,aAAa,IAAe,SAAiB,SAAkC;AAC5F,KAAG,cAAc,SAAS,SAAS,MAAM;AACzC,QAAM,OAAO,GAAG,eAAe;AAC/B,QAAM,MAAM,KAAK,SAAS,MAAM,OAAO;AACvC,MAAI;AAAE,UAAM,GAAG,KAAK,CAAC,GAAG,CAAC;AAAA,EAAG,QAAQ;AAAA,EAAwD;AAC5F,SAAO;AACT;AAEA,eAAsB,qBAAqB,UAAkB,MAA+B,IAAgC;AAC1H,UAAQ,UAAU;AAAA,IAChB,KAAK,sBAAsB;AACzB,YAAM,EAAE,eAAe,oBAAoB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,yBAAyB,CAAC;AACpH,YAAM,KAAK,GAAG,YAAY;AAC1B,YAAM,OAAO,KAAK;AAElB,UAAI,SAAS,UAAU;AACrB,YAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,cAAM,UAAU,cAAc,IAAI,KAAK,MAAgB;AACvD,YAAI,CAAC,QAAS,QAAO,WAAW,KAAK,MAAM;AAE3C,cAAM,QAAQ;AAAA,UACZ,wBAAwB,QAAQ,MAAM;AAAA,UACtC,SAAS,QAAQ,IAAI;AAAA,UACrB,eAAe,QAAQ,QAAQ,IAAI,QAAQ,IAAI;AAAA,UAC/C,qBAAqB,QAAQ,eAAe;AAAA,UAC5C;AAAA,QACF;AAEA,YAAI,QAAQ,WAAW,WAAW,GAAG;AACnC,gBAAM,KAAK,4FAAuF;AAAA,QACpG,OAAO;AAEL,gBAAM,SAAS,oBAAI,IAAuC;AAC1D,qBAAW,OAAO,QAAQ,YAAY;AACpC,gBAAI,CAAC,OAAO,IAAI,IAAI,QAAQ,EAAG,QAAO,IAAI,IAAI,UAAU,CAAC,CAAC;AAC1D,mBAAO,IAAI,IAAI,QAAQ,EAAG,KAAK,GAAG;AAAA,UACpC;AAEA,qBAAW,CAAC,MAAM,IAAI,KAAK,QAAQ;AACjC,kBAAM,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,cAAc;AACpD,uBAAW,OAAO,KAAK,MAAM,GAAG,EAAE,GAAG;AACnC,oBAAM,KAAK,UAAU,IAAI,IAAI,OAAO,IAAI,OAAO,OAAO,IAAI,QAAQ,GAAG;AAAA,YACvE;AACA,gBAAI,KAAK,SAAS,GAAI,OAAM,KAAK,eAAU,KAAK,SAAS,EAAE,OAAO;AAClE,kBAAM,KAAK,EAAE;AAAA,UACf;AAAA,QACF;AAEA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAEA,UAAI,SAAS,WAAW;AACtB,cAAM,cAAc,oBAAoB,IAAK,KAAK,SAAoB,EAAE;AACxE,YAAI,YAAY,WAAW,EAAG,QAAO;AAErC,cAAM,QAAQ,CAAC,+BAA+B,YAAY,MAAM,KAAK,EAAE;AACvE,mBAAW,KAAK,aAAa;AAC3B,gBAAM,OAAO,EAAE,aAAa,SAAS,cAAO,EAAE,aAAa,WAAW,cAAO;AAC7E,gBAAM,KAAK,GAAG,IAAI,MAAM,EAAE,IAAI,OAAO,EAAE,QAAQ,MAAM,EAAE,WAAW,EAAE;AACpE,gBAAM,KAAK,iBAAiB,EAAE,SAAS,EAAE;AACzC,cAAI,EAAE,QAAQ,SAAS,GAAG;AACxB,kBAAM,KAAK,eAAe,EAAE,QAAQ,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,UAC9D;AACA,gBAAM,KAAK,EAAE;AAAA,QACf;AAEA,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,yBAAyB;AAC5B,YAAM,OAAO,KAAK;AAClB,YAAM,SAAS,KAAK;AACpB,YAAM,SAAS,KAAK;AACpB,YAAM,SAAS,gBAAgB,IAAI,IAAI;AACvC,UAAI,WAAW,OAAQ,QAAO,OAAO;AACrC,YAAM,EAAE,SAAS,QAAQ,IAAI;AAC7B,YAAM,QAAQ,QAAQ,MAAM,MAAM,EAAE,SAAS;AAC7C,UAAI,UAAU,EAAG,QAAO,4CAA4C,IAAI;AACxE,UAAI,QAAQ,EAAG,QAAO,SAAS,KAAK,4BAA4B,IAAI;AACpE,YAAM,UAAU,QAAQ,QAAQ,QAAQ,MAAM;AAC9C,YAAM,MAAM,MAAM,aAAa,IAAI,SAAS,OAAO;AACnD,aAAO,4BAA4B,GAAG;AAAA,IACxC;AAAA,IAEA,KAAK,+BAA+B;AAClC,YAAM,OAAO,KAAK;AAClB,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,EAAG,QAAO;AACxD,YAAM,SAAS,gBAAgB,IAAI,IAAI;AACvC,UAAI,WAAW,OAAQ,QAAO,OAAO;AACrC,YAAM,EAAE,QAAQ,IAAI;AACpB,UAAI,UAAU,OAAO;AAErB,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAM,EAAE,QAAQ,IAAI,MAAM,CAAC;AAC3B,cAAM,QAAQ,QAAQ,MAAM,OAAO,EAAE,SAAS;AAC9C,YAAI,UAAU,EAAG,QAAO,QAAQ,IAAI,CAAC;AACrC,YAAI,QAAQ,EAAG,QAAO,QAAQ,IAAI,CAAC,WAAW,KAAK;AAAA,MACrD;AACA,iBAAW,EAAE,SAAS,QAAQ,KAAK,MAAO,WAAU,QAAQ,QAAQ,SAAS,OAAO;AACpF,YAAM,MAAM,MAAM,aAAa,IAAI,SAAS,OAAO;AACnD,aAAO,WAAW,MAAM,MAAM,sBAAsB,GAAG;AAAA,IACzD;AAAA,IAEA,KAAK,uBAAuB;AAC1B,YAAM,OAAO,KAAK;AAClB,YAAM,SAAS,KAAK;AACpB,YAAM,UAAU,KAAK;AACrB,YAAM,gBAAgB,KAAK;AAC3B,YAAM,WAAY,KAAK,YAAuB;AAC9C,YAAM,SAAS,gBAAgB,IAAI,IAAI;AACvC,UAAI,WAAW,OAAQ,QAAO,OAAO;AACrC,YAAM,EAAE,SAAS,QAAQ,IAAI;AAC7B,UAAI;AACJ,UAAI,YAAY,QAAW;AACzB,cAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,cAAM,MAAM,UAAU;AACtB,YAAI,MAAM,KAAK,MAAM,MAAM,OAAQ,QAAO,QAAQ,OAAO,8BAA8B,MAAM,MAAM;AACnG,cAAM,YAAY,aAAa,WAAW,MAAM,MAAM;AACtD,cAAM,OAAO,WAAW,GAAG,aAAa;AACxC,kBAAU,MAAM,KAAK,IAAI;AAAA,MAC3B,WAAW,WAAW,QAAW;AAC/B,cAAM,MAAM,QAAQ,QAAQ,MAAM;AAClC,YAAI,QAAQ,GAAI,QAAO,wBAAwB,IAAI;AACnD,YAAI,QAAQ,QAAQ,QAAQ,MAAM,CAAC,MAAM,GAAI,QAAO,qCAAqC,IAAI;AAC7F,cAAM,YAAY,aAAa,WAAW,MAAM,MAAM,OAAO;AAC7D,kBAAU,QAAQ,MAAM,GAAG,SAAS,IAAI,gBAAgB,QAAQ,MAAM,SAAS;AAAA,MACjF,OAAO;AACL,eAAO;AAAA,MACT;AACA,YAAM,MAAM,MAAM,aAAa,IAAI,SAAS,OAAO;AACnD,aAAO,uBAAuB,GAAG,KAAK,QAAQ,IAAI,SAAS,IAAI,MAAM,MAAM,QAAQ,OAAO,EAAE;AAAA,IAC9F;AAAA,IAEA,KAAK,8BAA8B;AACjC,YAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAe;AAEjD,UAAI;AAAE,iBAAS,kBAAkB,EAAE,OAAO,SAAS,CAAC;AAAA,MAAG,QAAQ;AAC7D,eAAO;AAAA,MACT;AACA,YAAM,OAAO,KAAK;AAClB,YAAM,UAAU,KAAK;AACrB,YAAM,UAAU,KAAK;AACrB,YAAM,SAAS,gBAAgB,IAAI,IAAI;AACvC,UAAI,WAAW,OAAQ,QAAO,OAAO;AACrC,YAAM,EAAE,QAAQ,IAAI;AACpB,UAAI;AACF,cAAM,SAAS;AAAA,UACb,sBAAsB,KAAK,UAAU,OAAO,CAAC,cAAc,KAAK,UAAU,OAAO,CAAC,iBAAiB,KAAK,UAAU,OAAO,CAAC;AAAA,UAC1H,EAAE,UAAU,QAAQ,KAAK,GAAG,eAAe,EAAE;AAAA,QAC/C;AACA,cAAM,aAAa,IAAI,SAAS,GAAG,aAAa,SAAS,MAAM,CAAC;AAChE,eAAO,+BAA+B,IAAI;AAAA,EAAM,OAAO,KAAK,CAAC;AAAA,MAC/D,SAAS,KAAU;AACjB,eAAO,mBAAmB,IAAI,WAAW,OAAO,GAAG,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,IAEA;AACE,aAAO,iBAAiB,QAAQ;AAAA,EACpC;AACF;",
6
+ "names": []
7
+ }