agda-mcp-server 0.4.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.
- package/LICENSE +23 -0
- package/README.md +472 -0
- package/dist/agda/advanced-queries.d.ts +52 -0
- package/dist/agda/advanced-queries.js +249 -0
- package/dist/agda/advanced-queries.js.map +1 -0
- package/dist/agda/batch.d.ts +6 -0
- package/dist/agda/batch.js +59 -0
- package/dist/agda/batch.js.map +1 -0
- package/dist/agda/expression-operations.d.ts +17 -0
- package/dist/agda/expression-operations.js +86 -0
- package/dist/agda/expression-operations.js.map +1 -0
- package/dist/agda/goal-operations.d.ts +29 -0
- package/dist/agda/goal-operations.js +156 -0
- package/dist/agda/goal-operations.js.map +1 -0
- package/dist/agda/response-parsing.d.ts +4 -0
- package/dist/agda/response-parsing.js +44 -0
- package/dist/agda/response-parsing.js.map +1 -0
- package/dist/agda/session.d.ts +88 -0
- package/dist/agda/session.js +340 -0
- package/dist/agda/session.js.map +1 -0
- package/dist/agda/types.d.ts +99 -0
- package/dist/agda/types.js +5 -0
- package/dist/agda/types.js.map +1 -0
- package/dist/agda-process.d.ts +4 -0
- package/dist/agda-process.js +14 -0
- package/dist/agda-process.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/navigation.d.ts +3 -0
- package/dist/tools/navigation.js +192 -0
- package/dist/tools/navigation.js.map +1 -0
- package/dist/tools/proof.d.ts +3 -0
- package/dist/tools/proof.js +250 -0
- package/dist/tools/proof.js.map +1 -0
- package/dist/tools/session.d.ts +3 -0
- package/dist/tools/session.js +108 -0
- package/dist/tools/session.js.map +1 -0
- package/package.json +65 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
//
|
|
3
|
+
// agda-mcp-server — Stateful MCP server for Agda proof interaction
|
|
4
|
+
//
|
|
5
|
+
// Maintains a persistent Agda session using --interaction-json mode.
|
|
6
|
+
// After loading a file, goals (interaction points) are assigned IDs
|
|
7
|
+
// that persist for interactive commands: case-split, refine, give,
|
|
8
|
+
// auto-solve, normalize, infer, elaborate, and more.
|
|
9
|
+
//
|
|
10
|
+
// Architecture:
|
|
11
|
+
// src/agda-process.ts — Agda subprocess manager (IOTCM protocol)
|
|
12
|
+
// src/tools/session.ts — agda_load, agda_session_status, agda_typecheck
|
|
13
|
+
// src/tools/proof.ts — goal types, case split, give, refine, auto, etc.
|
|
14
|
+
// src/tools/navigation.ts — read module, list modules, search, why-in-scope
|
|
15
|
+
// external modules — Optional extensions loaded via environment variable
|
|
16
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
17
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
18
|
+
import { existsSync } from "node:fs";
|
|
19
|
+
import { isAbsolute, resolve } from "node:path";
|
|
20
|
+
import { pathToFileURL } from "node:url";
|
|
21
|
+
import { AgdaSession } from "./agda-process.js";
|
|
22
|
+
import { register as registerSession } from "./tools/session.js";
|
|
23
|
+
import { register as registerProof } from "./tools/proof.js";
|
|
24
|
+
import { register as registerNavigation } from "./tools/navigation.js";
|
|
25
|
+
const REPO_ROOT = process.env.AGDA_MCP_ROOT ?? process.cwd();
|
|
26
|
+
// Single shared session — Agda is stateful, one file at a time
|
|
27
|
+
const session = new AgdaSession(REPO_ROOT);
|
|
28
|
+
const server = new McpServer({
|
|
29
|
+
name: "agda-mcp-server",
|
|
30
|
+
version: "0.4.0",
|
|
31
|
+
});
|
|
32
|
+
// ── Core tools (generic Agda) ──────────────────────────────────────
|
|
33
|
+
registerSession(server, session, REPO_ROOT);
|
|
34
|
+
registerProof(server, session, REPO_ROOT);
|
|
35
|
+
registerNavigation(server, session, REPO_ROOT);
|
|
36
|
+
function resolveExtensionSpecifier(modulePath) {
|
|
37
|
+
if (modulePath.startsWith("file://")) {
|
|
38
|
+
return modulePath;
|
|
39
|
+
}
|
|
40
|
+
const filesystemPath = isAbsolute(modulePath)
|
|
41
|
+
? modulePath
|
|
42
|
+
: resolve(REPO_ROOT, modulePath);
|
|
43
|
+
if (existsSync(filesystemPath)) {
|
|
44
|
+
return pathToFileURL(filesystemPath).href;
|
|
45
|
+
}
|
|
46
|
+
return modulePath;
|
|
47
|
+
}
|
|
48
|
+
function collectRegisterFunctions(extensionModule) {
|
|
49
|
+
function isRegisterEntry(entry) {
|
|
50
|
+
const [name, value] = entry;
|
|
51
|
+
return typeof value === "function"
|
|
52
|
+
&& (name === "register" || name.startsWith("register"));
|
|
53
|
+
}
|
|
54
|
+
return Object.entries(extensionModule)
|
|
55
|
+
.filter(isRegisterEntry)
|
|
56
|
+
.sort(([leftName], [rightName]) => leftName.localeCompare(rightName));
|
|
57
|
+
}
|
|
58
|
+
async function loadExternalExtensions() {
|
|
59
|
+
const modulePaths = (process.env.AGDA_MCP_EXTENSION_MODULES ?? "")
|
|
60
|
+
.split(":")
|
|
61
|
+
.map((modulePath) => modulePath.trim())
|
|
62
|
+
.filter(Boolean);
|
|
63
|
+
for (const modulePath of modulePaths) {
|
|
64
|
+
const extensionModule = await import(resolveExtensionSpecifier(modulePath));
|
|
65
|
+
const registerFunctions = collectRegisterFunctions(extensionModule);
|
|
66
|
+
if (registerFunctions.length === 0) {
|
|
67
|
+
console.warn(`Skipping extension module without register exports: ${modulePath}`);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
for (const [, register] of registerFunctions) {
|
|
71
|
+
await register(server, session, REPO_ROOT);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// ── Start server ──────────────────────────────────────────────────────
|
|
76
|
+
async function main() {
|
|
77
|
+
await loadExternalExtensions();
|
|
78
|
+
const transport = new StdioServerTransport();
|
|
79
|
+
await server.connect(transport);
|
|
80
|
+
}
|
|
81
|
+
main().catch((err) => {
|
|
82
|
+
console.error("Agda MCP server failed to start:", err);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
});
|
|
85
|
+
// Clean up on exit
|
|
86
|
+
process.on("SIGINT", () => { session.destroy(); process.exit(0); });
|
|
87
|
+
process.on("SIGTERM", () => { session.destroy(); process.exit(0); });
|
|
88
|
+
// ── Public API (for programmatic embedding) ────────────────────────
|
|
89
|
+
export { AgdaSession } from "./agda-process.js";
|
|
90
|
+
export { server, session, REPO_ROOT };
|
|
91
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// MIT License — see LICENSE
|
|
2
|
+
//
|
|
3
|
+
// Navigation and code-browsing tools: reading modules, listing modules,
|
|
4
|
+
// checking postulates, searching definitions, why-in-scope, show-module,
|
|
5
|
+
// search-about
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { resolve, relative } from "node:path";
|
|
8
|
+
import { readFileSync, existsSync, readdirSync } from "node:fs";
|
|
9
|
+
export function register(server, session, repoRoot) {
|
|
10
|
+
// ── agda_read_module ──────────────────────────────────────────────
|
|
11
|
+
server.tool("agda_read_module", "Read an Agda module file and return its contents with line numbers.", {
|
|
12
|
+
file: z.string().describe("Path to the .agda file"),
|
|
13
|
+
}, async ({ file }) => {
|
|
14
|
+
const filePath = resolve(repoRoot, file);
|
|
15
|
+
if (!existsSync(filePath)) {
|
|
16
|
+
return { content: [{ type: "text", text: `File not found: ${filePath}` }] };
|
|
17
|
+
}
|
|
18
|
+
const fileContent = readFileSync(filePath, "utf-8");
|
|
19
|
+
const lines = fileContent.split("\n");
|
|
20
|
+
const numbered = lines
|
|
21
|
+
.map((line, i) => `${String(i + 1).padStart(4)} | ${line}`)
|
|
22
|
+
.join("\n");
|
|
23
|
+
return {
|
|
24
|
+
content: [{
|
|
25
|
+
type: "text",
|
|
26
|
+
text: `## ${relative(repoRoot, filePath)}\n\n\`\`\`agda\n${numbered}\n\`\`\``,
|
|
27
|
+
}],
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
// ── agda_list_modules ─────────────────────────────────────────────
|
|
31
|
+
server.tool("agda_list_modules", "List Agda modules in a directory tier (MathLib, Foundation, Kernel, Research, Extensions, etc.).", {
|
|
32
|
+
tier: z.string().describe("The tier to list, e.g. 'Kernel', 'Foundation', 'MathLib'"),
|
|
33
|
+
}, async ({ tier }) => {
|
|
34
|
+
const tierDir = resolve(repoRoot, "agda", tier);
|
|
35
|
+
if (!existsSync(tierDir)) {
|
|
36
|
+
return {
|
|
37
|
+
content: [{
|
|
38
|
+
type: "text",
|
|
39
|
+
text: `Tier directory not found: agda/${tier}\nAvailable: MathLib, Foundation, Kernel, Research, Extensions, TrustedCompute`,
|
|
40
|
+
}],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const modules = [];
|
|
44
|
+
function walk(dir) {
|
|
45
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
46
|
+
if (entry.isDirectory())
|
|
47
|
+
walk(resolve(dir, entry.name));
|
|
48
|
+
else if (entry.name.endsWith(".agda"))
|
|
49
|
+
modules.push(relative(repoRoot, resolve(dir, entry.name)));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
walk(tierDir);
|
|
53
|
+
modules.sort();
|
|
54
|
+
return {
|
|
55
|
+
content: [{
|
|
56
|
+
type: "text",
|
|
57
|
+
text: `## agda/${tier} (${modules.length} modules)\n\n${modules.map((m) => `- ${m}`).join("\n")}`,
|
|
58
|
+
}],
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
// ── agda_check_postulates ─────────────────────────────────────────
|
|
62
|
+
server.tool("agda_check_postulates", "Check an Agda file for postulate declarations. In Kernel/ files, postulates are forbidden by construction.", {
|
|
63
|
+
file: z.string().describe("Path to the .agda file"),
|
|
64
|
+
}, async ({ file }) => {
|
|
65
|
+
const filePath = resolve(repoRoot, file);
|
|
66
|
+
if (!existsSync(filePath)) {
|
|
67
|
+
return { content: [{ type: "text", text: `File not found: ${filePath}` }] };
|
|
68
|
+
}
|
|
69
|
+
const fileContent = readFileSync(filePath, "utf-8");
|
|
70
|
+
const lines = fileContent.split("\n");
|
|
71
|
+
const postulates = [];
|
|
72
|
+
for (let i = 0; i < lines.length; i++) {
|
|
73
|
+
if (/^\s*postulate\b/.test(lines[i])) {
|
|
74
|
+
postulates.push(`Line ${i + 1}: ${lines[i].trim()}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const relPath = relative(repoRoot, filePath);
|
|
78
|
+
const isKernel = relPath.startsWith("agda/Kernel/");
|
|
79
|
+
let output = `## Postulate check: ${relPath}\n\n`;
|
|
80
|
+
if (postulates.length === 0) {
|
|
81
|
+
output += "No postulates found. Fully constructive.\n";
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
output += `**${postulates.length} postulate(s) found**`;
|
|
85
|
+
if (isKernel)
|
|
86
|
+
output += ` **VIOLATION: postulates are forbidden in Kernel/**`;
|
|
87
|
+
output += "\n\n";
|
|
88
|
+
for (const p of postulates)
|
|
89
|
+
output += `- ${p}\n`;
|
|
90
|
+
}
|
|
91
|
+
return { content: [{ type: "text", text: output }] };
|
|
92
|
+
});
|
|
93
|
+
// ── agda_search_definitions ───────────────────────────────────────
|
|
94
|
+
server.tool("agda_search_definitions", "Search for a definition, theorem, or type name across Agda modules.", {
|
|
95
|
+
query: z.string().describe("The name or pattern to search for"),
|
|
96
|
+
tier: z.string().optional().describe("Optional tier to limit search (Kernel, Foundation, etc.)"),
|
|
97
|
+
}, async ({ query, tier }) => {
|
|
98
|
+
const searchRoot = tier
|
|
99
|
+
? resolve(repoRoot, "agda", tier)
|
|
100
|
+
: resolve(repoRoot, "agda");
|
|
101
|
+
if (!existsSync(searchRoot)) {
|
|
102
|
+
return { content: [{ type: "text", text: `Directory not found: ${searchRoot}` }] };
|
|
103
|
+
}
|
|
104
|
+
const matches = [];
|
|
105
|
+
function searchDir(dir) {
|
|
106
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
107
|
+
if (entry.isDirectory())
|
|
108
|
+
searchDir(resolve(dir, entry.name));
|
|
109
|
+
else if (entry.name.endsWith(".agda")) {
|
|
110
|
+
const fp = resolve(dir, entry.name);
|
|
111
|
+
const fileContent = readFileSync(fp, "utf-8");
|
|
112
|
+
const lines = fileContent.split("\n");
|
|
113
|
+
for (let i = 0; i < lines.length; i++) {
|
|
114
|
+
if (lines[i].includes(query)) {
|
|
115
|
+
matches.push({ file: relative(repoRoot, fp), line: i + 1, text: lines[i].trim() });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
searchDir(searchRoot);
|
|
122
|
+
if (matches.length === 0) {
|
|
123
|
+
return { content: [{ type: "text", text: `No matches for "${query}" in ${tier ?? "agda/"}` }] };
|
|
124
|
+
}
|
|
125
|
+
const capped = matches.slice(0, 50);
|
|
126
|
+
let output = `## Search: "${query}" (${matches.length} matches${matches.length > 50 ? ", showing first 50" : ""})\n\n`;
|
|
127
|
+
for (const m of capped)
|
|
128
|
+
output += `- **${m.file}:${m.line}** \`${m.text}\`\n`;
|
|
129
|
+
return { content: [{ type: "text", text: output }] };
|
|
130
|
+
});
|
|
131
|
+
// ── agda_why_in_scope ─────────────────────────────────────────────
|
|
132
|
+
server.tool("agda_why_in_scope", "Explain why a name is in scope. If goalId is provided, checks within that goal's context; otherwise checks at the top level.", {
|
|
133
|
+
name: z.string().describe("The name to look up"),
|
|
134
|
+
goalId: z.number().optional().describe("Optional goal ID for context"),
|
|
135
|
+
}, async ({ name, goalId }) => {
|
|
136
|
+
try {
|
|
137
|
+
const result = goalId !== undefined
|
|
138
|
+
? await session.whyInScope(goalId, name)
|
|
139
|
+
: await session.whyInScopeTopLevel(name);
|
|
140
|
+
let output = `## Why in scope: \`${name}\`\n\n`;
|
|
141
|
+
output += result.explanation
|
|
142
|
+
? `\`\`\`\n${result.explanation}\n\`\`\`\n`
|
|
143
|
+
: `No information available.\n`;
|
|
144
|
+
return { content: [{ type: "text", text: output }] };
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
return {
|
|
148
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
// ── agda_show_module ──────────────────────────────────────────────
|
|
153
|
+
server.tool("agda_show_module", "Show the exported contents of an Agda module. If goalId is provided, shows contents visible from that goal's context; otherwise shows top-level contents.", {
|
|
154
|
+
moduleName: z.string().describe("The fully qualified module name"),
|
|
155
|
+
goalId: z.number().optional().describe("Optional goal ID for context"),
|
|
156
|
+
}, async ({ moduleName, goalId }) => {
|
|
157
|
+
try {
|
|
158
|
+
const result = goalId !== undefined
|
|
159
|
+
? await session.showModuleContents(goalId, moduleName)
|
|
160
|
+
: await session.showModuleContentsTopLevel(moduleName);
|
|
161
|
+
let output = `## Module contents: ${moduleName}\n\n`;
|
|
162
|
+
output += result.contents
|
|
163
|
+
? `\`\`\`agda\n${result.contents}\n\`\`\`\n`
|
|
164
|
+
: `No contents found or module not in scope.\n`;
|
|
165
|
+
return { content: [{ type: "text", text: output }] };
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
return {
|
|
169
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
// ── agda_search_about ─────────────────────────────────────────────
|
|
174
|
+
server.tool("agda_search_about", "Search for definitions in the loaded module matching a query string (searches by type components and name fragments).", {
|
|
175
|
+
query: z.string().describe("The search query (type components or name fragments)"),
|
|
176
|
+
}, async ({ query }) => {
|
|
177
|
+
try {
|
|
178
|
+
const result = await session.searchAbout(query);
|
|
179
|
+
let output = `## Search about: "${query}"\n\n`;
|
|
180
|
+
output += result.results
|
|
181
|
+
? `\`\`\`agda\n${result.results}\n\`\`\`\n`
|
|
182
|
+
: `No results found.\n`;
|
|
183
|
+
return { content: [{ type: "text", text: output }] };
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
return {
|
|
187
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=navigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/tools/navigation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
// MIT License — see LICENSE
|
|
2
|
+
//
|
|
3
|
+
// Proof interaction tools: goal types, case split, give, refine, auto,
|
|
4
|
+
// compute, infer, constraints, elaborate, helper function
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export function register(server, session, _repoRoot) {
|
|
7
|
+
// ── agda_goal_type ────────────────────────────────────────────────
|
|
8
|
+
server.tool("agda_goal_type", "Show the type and local context for a specific goal. Requires a file to be loaded first via agda_load.", {
|
|
9
|
+
goalId: z.number().describe("The goal ID (from agda_load output)"),
|
|
10
|
+
}, async ({ goalId }) => {
|
|
11
|
+
try {
|
|
12
|
+
const info = await session.goalTypeContext(goalId);
|
|
13
|
+
let output = `## Goal ?${goalId}\n\n`;
|
|
14
|
+
if (info.context.length > 0) {
|
|
15
|
+
output += `### Context\n\`\`\`agda\n${info.context.join("\n")}\n\`\`\`\n\n`;
|
|
16
|
+
}
|
|
17
|
+
output += `### Goal type\n\`\`\`agda\n${info.type || "(unknown)"}\n\`\`\`\n`;
|
|
18
|
+
return { content: [{ type: "text", text: output }] };
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
// ── agda_metas ────────────────────────────────────────────────────
|
|
27
|
+
server.tool("agda_metas", "List all unsolved metavariables (goals) in the currently loaded file.", {}, async () => {
|
|
28
|
+
try {
|
|
29
|
+
const result = await session.metas();
|
|
30
|
+
let output = `## Unsolved goals (${result.goals.length})\n\n`;
|
|
31
|
+
if (result.text) {
|
|
32
|
+
output += `\`\`\`\n${result.text}\n\`\`\`\n`;
|
|
33
|
+
}
|
|
34
|
+
if (result.goals.length > 0) {
|
|
35
|
+
output += `\nGoal IDs: ${result.goals.map((g) => `?${g.goalId}`).join(", ")}\n`;
|
|
36
|
+
}
|
|
37
|
+
return { content: [{ type: "text", text: output }] };
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return {
|
|
41
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
// ── agda_case_split ───────────────────────────────────────────────
|
|
46
|
+
server.tool("agda_case_split", "Case-split on a variable in a goal. Returns the new function clauses that replace the current clause. The file must be reloaded after applying the split.", {
|
|
47
|
+
goalId: z.number().describe("The goal ID to case-split in"),
|
|
48
|
+
variable: z.string().describe("The variable name to case-split on"),
|
|
49
|
+
}, async ({ goalId, variable }) => {
|
|
50
|
+
try {
|
|
51
|
+
const result = await session.caseSplit(goalId, variable);
|
|
52
|
+
let output = `## Case split on \`${variable}\` in ?${goalId}\n\n`;
|
|
53
|
+
if (result.clauses.length > 0) {
|
|
54
|
+
output += `### New clauses\n\`\`\`agda\n${result.clauses.join("\n")}\n\`\`\`\n`;
|
|
55
|
+
output += `\nReplace the original clause with these, then call \`agda_load\` to reload.\n`;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
output += `No clauses generated. The variable may not be splittable.\n`;
|
|
59
|
+
}
|
|
60
|
+
return { content: [{ type: "text", text: output }] };
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
return {
|
|
64
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
// ── agda_give ─────────────────────────────────────────────────────
|
|
69
|
+
server.tool("agda_give", "Fill a goal with an expression. If the expression type-checks against the goal type, the goal is solved.", {
|
|
70
|
+
goalId: z.number().describe("The goal ID to fill"),
|
|
71
|
+
expr: z.string().describe("The Agda expression to give"),
|
|
72
|
+
}, async ({ goalId, expr }) => {
|
|
73
|
+
try {
|
|
74
|
+
const result = await session.give(goalId, expr);
|
|
75
|
+
let output = `## Give \`${expr}\` to ?${goalId}\n\n`;
|
|
76
|
+
output += result.result
|
|
77
|
+
? `**Result:** \`${result.result}\`\n`
|
|
78
|
+
: `Expression accepted.\n`;
|
|
79
|
+
return { content: [{ type: "text", text: output }] };
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
return {
|
|
83
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
// ── agda_refine ───────────────────────────────────────────────────
|
|
88
|
+
server.tool("agda_refine", "Refine a goal by applying a function. Creates new subgoals for the function's arguments.", {
|
|
89
|
+
goalId: z.number().describe("The goal ID to refine"),
|
|
90
|
+
expr: z.string().describe("The expression to refine with (can be empty to let Agda choose)"),
|
|
91
|
+
}, async ({ goalId, expr }) => {
|
|
92
|
+
try {
|
|
93
|
+
const result = await session.refine(goalId, expr);
|
|
94
|
+
let output = `## Refine ?${goalId} with \`${expr || "(auto)"}\`\n\n`;
|
|
95
|
+
output += result.result
|
|
96
|
+
? `**Result:** \`${result.result}\`\n`
|
|
97
|
+
: `Refinement applied. Call \`agda_metas\` to see new goals.\n`;
|
|
98
|
+
return { content: [{ type: "text", text: output }] };
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
return {
|
|
102
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
// ── agda_auto ─────────────────────────────────────────────────────
|
|
107
|
+
server.tool("agda_auto", "Attempt to automatically solve a goal using Agda's proof search.", {
|
|
108
|
+
goalId: z.number().describe("The goal ID to auto-solve"),
|
|
109
|
+
}, async ({ goalId }) => {
|
|
110
|
+
try {
|
|
111
|
+
const result = await session.autoOne(goalId);
|
|
112
|
+
let output = `## Auto-solve ?${goalId}\n\n`;
|
|
113
|
+
output += result.solution
|
|
114
|
+
? `**Solution:** \`${result.solution}\`\n`
|
|
115
|
+
: `No automatic solution found.\n`;
|
|
116
|
+
return { content: [{ type: "text", text: output }] };
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
return {
|
|
120
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
// ── agda_auto_all ─────────────────────────────────────────────────
|
|
125
|
+
server.tool("agda_auto_all", "Attempt to automatically solve all goals using Agda's proof search.", {}, async () => {
|
|
126
|
+
try {
|
|
127
|
+
const result = await session.autoAll();
|
|
128
|
+
let output = `## Auto-solve all goals\n\n`;
|
|
129
|
+
output += result.solution
|
|
130
|
+
? `**Result:**\n\`\`\`\n${result.solution}\n\`\`\`\n`
|
|
131
|
+
: `No automatic solutions found.\n`;
|
|
132
|
+
return { content: [{ type: "text", text: output }] };
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
return {
|
|
136
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
// ── agda_solve_all ────────────────────────────────────────────────
|
|
141
|
+
server.tool("agda_solve_all", "Attempt to solve all goals that have unique solutions.", {}, async () => {
|
|
142
|
+
try {
|
|
143
|
+
const result = await session.solveAll();
|
|
144
|
+
let output = `## Solve all\n\n`;
|
|
145
|
+
if (result.solutions.length > 0) {
|
|
146
|
+
for (const s of result.solutions) {
|
|
147
|
+
output += `- ${s}\n`;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
output += `No goals with unique solutions found.\n`;
|
|
152
|
+
}
|
|
153
|
+
return { content: [{ type: "text", text: output }] };
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
return {
|
|
157
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
// ── agda_compute ──────────────────────────────────────────────────
|
|
162
|
+
server.tool("agda_compute", "Normalize (evaluate) an expression. If goalId is provided, evaluates in that goal's context; otherwise evaluates at the top level.", {
|
|
163
|
+
expr: z.string().describe("The Agda expression to normalize"),
|
|
164
|
+
goalId: z.number().optional().describe("Optional goal ID for context"),
|
|
165
|
+
}, async ({ expr, goalId }) => {
|
|
166
|
+
try {
|
|
167
|
+
const result = goalId !== undefined
|
|
168
|
+
? await session.compute(goalId, expr)
|
|
169
|
+
: await session.computeTopLevel(expr);
|
|
170
|
+
let output = `## Normalize \`${expr}\`\n\n`;
|
|
171
|
+
output += `\`\`\`agda\n${result.normalForm || "(no result)"}\n\`\`\`\n`;
|
|
172
|
+
return { content: [{ type: "text", text: output }] };
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
return {
|
|
176
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
// ── agda_infer ────────────────────────────────────────────────────
|
|
181
|
+
server.tool("agda_infer", "Infer the type of an expression. If goalId is provided, infers in that goal's context; otherwise infers at the top level.", {
|
|
182
|
+
expr: z.string().describe("The Agda expression to infer the type of"),
|
|
183
|
+
goalId: z.number().optional().describe("Optional goal ID for context"),
|
|
184
|
+
}, async ({ expr, goalId }) => {
|
|
185
|
+
try {
|
|
186
|
+
const result = goalId !== undefined
|
|
187
|
+
? await session.infer(goalId, expr)
|
|
188
|
+
: await session.inferTopLevel(expr);
|
|
189
|
+
let output = `## Type of \`${expr}\`\n\n`;
|
|
190
|
+
output += `\`\`\`agda\n${result.type || "(unable to infer)"}\n\`\`\`\n`;
|
|
191
|
+
return { content: [{ type: "text", text: output }] };
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
return {
|
|
195
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
// ── agda_constraints ──────────────────────────────────────────────
|
|
200
|
+
server.tool("agda_constraints", "Show the current constraint set for the loaded file.", {}, async () => {
|
|
201
|
+
try {
|
|
202
|
+
const result = await session.constraints();
|
|
203
|
+
let output = `## Constraints\n\n`;
|
|
204
|
+
output += result.text
|
|
205
|
+
? `\`\`\`\n${result.text}\n\`\`\`\n`
|
|
206
|
+
: `No constraints.\n`;
|
|
207
|
+
return { content: [{ type: "text", text: output }] };
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
return {
|
|
211
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
// ── agda_elaborate ────────────────────────────────────────────────
|
|
216
|
+
server.tool("agda_elaborate", "Elaborate an expression in a goal context: normalize and show the fully explicit form.", {
|
|
217
|
+
goalId: z.number().describe("The goal ID for context"),
|
|
218
|
+
expr: z.string().describe("The Agda expression to elaborate"),
|
|
219
|
+
}, async ({ goalId, expr }) => {
|
|
220
|
+
try {
|
|
221
|
+
const result = await session.elaborate(goalId, expr);
|
|
222
|
+
let output = `## Elaborate \`${expr}\` in ?${goalId}\n\n`;
|
|
223
|
+
output += `\`\`\`agda\n${result.elaboration || "(no result)"}\n\`\`\`\n`;
|
|
224
|
+
return { content: [{ type: "text", text: output }] };
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
return {
|
|
228
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
// ── agda_helper_function ──────────────────────────────────────────
|
|
233
|
+
server.tool("agda_helper_function", "Generate a helper function type signature for an expression in a goal context. Useful for extracting a subproof into a named lemma.", {
|
|
234
|
+
goalId: z.number().describe("The goal ID for context"),
|
|
235
|
+
expr: z.string().describe("The expression to generate a helper for"),
|
|
236
|
+
}, async ({ goalId, expr }) => {
|
|
237
|
+
try {
|
|
238
|
+
const result = await session.helperFunction(goalId, expr);
|
|
239
|
+
let output = `## Helper function for \`${expr}\` in ?${goalId}\n\n`;
|
|
240
|
+
output += `\`\`\`agda\n${result.helperType || "(no result)"}\n\`\`\`\n`;
|
|
241
|
+
return { content: [{ type: "text", text: output }] };
|
|
242
|
+
}
|
|
243
|
+
catch (err) {
|
|
244
|
+
return {
|
|
245
|
+
content: [{ type: "text", text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=proof.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof.js","sourceRoot":"","sources":["../../src/tools/proof.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,EAAE;AACF,uEAAuE;AACvE,0DAA0D;AAG1D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,QAAQ,CACtB,MAAiB,EACjB,OAAoB,EACpB,SAAiB;IAEjB,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,wGAAwG,EACxG;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KACnE,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,MAAM,GAAG,YAAY,MAAM,MAAM,CAAC;YAEtC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,4BAA4B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;YAC9E,CAAC;YACD,MAAM,IAAI,8BAA8B,IAAI,CAAC,IAAI,IAAI,WAAW,YAAY,CAAC;YAE7E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,uEAAuE,EACvE,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,MAAM,GAAG,sBAAsB,MAAM,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC;YAC9D,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,MAAM,IAAI,WAAW,MAAM,CAAC,IAAI,YAAY,CAAC;YAC/C,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,eAAe,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAClF,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,2JAA2J,EAC3J;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC3D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KACpE,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAI,MAAM,GAAG,sBAAsB,QAAQ,UAAU,MAAM,MAAM,CAAC;YAElE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,gCAAgC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;gBAChF,MAAM,IAAI,gFAAgF,CAAC;YAC7F,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,6DAA6D,CAAC;YAC1E,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,WAAW,EACX,0GAA0G,EAC1G;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAClD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KACzD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAChD,IAAI,MAAM,GAAG,aAAa,IAAI,UAAU,MAAM,MAAM,CAAC;YACrD,MAAM,IAAI,MAAM,CAAC,MAAM;gBACrB,CAAC,CAAC,iBAAiB,MAAM,CAAC,MAAM,MAAM;gBACtC,CAAC,CAAC,wBAAwB,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,aAAa,EACb,0FAA0F,EAC1F;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACpD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;KAC7F,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI,MAAM,GAAG,cAAc,MAAM,WAAW,IAAI,IAAI,QAAQ,QAAQ,CAAC;YACrE,MAAM,IAAI,MAAM,CAAC,MAAM;gBACrB,CAAC,CAAC,iBAAiB,MAAM,CAAC,MAAM,MAAM;gBACtC,CAAC,CAAC,6DAA6D,CAAC;YAClE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,WAAW,EACX,kEAAkE,EAClE;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACzD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,MAAM,GAAG,kBAAkB,MAAM,MAAM,CAAC;YAC5C,MAAM,IAAI,MAAM,CAAC,QAAQ;gBACvB,CAAC,CAAC,mBAAmB,MAAM,CAAC,QAAQ,MAAM;gBAC1C,CAAC,CAAC,gCAAgC,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,eAAe,EACf,qEAAqE,EACrE,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,MAAM,GAAG,6BAA6B,CAAC;YAC3C,MAAM,IAAI,MAAM,CAAC,QAAQ;gBACvB,CAAC,CAAC,wBAAwB,MAAM,CAAC,QAAQ,YAAY;gBACrD,CAAC,CAAC,iCAAiC,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,wDAAwD,EACxD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAI,MAAM,GAAG,kBAAkB,CAAC;YAChC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;gBACvB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,yCAAyC,CAAC;YACtD,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,cAAc,EACd,oIAAoI,EACpI;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KACvE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS;gBACjC,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;gBACrC,CAAC,CAAC,MAAM,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,MAAM,GAAG,kBAAkB,IAAI,QAAQ,CAAC;YAC5C,MAAM,IAAI,eAAe,MAAM,CAAC,UAAU,IAAI,aAAa,YAAY,CAAC;YACxE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,2HAA2H,EAC3H;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACrE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KACvE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS;gBACjC,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;gBACnC,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,MAAM,GAAG,gBAAgB,IAAI,QAAQ,CAAC;YAC1C,MAAM,IAAI,eAAe,MAAM,CAAC,IAAI,IAAI,mBAAmB,YAAY,CAAC;YACxE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,sDAAsD,EACtD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,MAAM,GAAG,oBAAoB,CAAC;YAClC,MAAM,IAAI,MAAM,CAAC,IAAI;gBACnB,CAAC,CAAC,WAAW,MAAM,CAAC,IAAI,YAAY;gBACpC,CAAC,CAAC,mBAAmB,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,wFAAwF,EACxF;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACtD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KAC9D,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACrD,IAAI,MAAM,GAAG,kBAAkB,IAAI,UAAU,MAAM,MAAM,CAAC;YAC1D,MAAM,IAAI,eAAe,MAAM,CAAC,WAAW,IAAI,aAAa,YAAY,CAAC;YACzE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,qIAAqI,EACrI;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACtD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;KACrE,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1D,IAAI,MAAM,GAAG,4BAA4B,IAAI,UAAU,MAAM,MAAM,CAAC;YACpE,MAAM,IAAI,eAAe,MAAM,CAAC,UAAU,IAAI,aAAa,YAAY,CAAC;YACxE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;aACzG,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|