edict-lang 0.1.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 +21 -0
- package/README.md +202 -0
- package/dist/ast/nodes.d.ts +248 -0
- package/dist/ast/nodes.d.ts.map +1 -0
- package/dist/ast/nodes.js +95 -0
- package/dist/ast/nodes.js.map +1 -0
- package/dist/ast/types.d.ts +78 -0
- package/dist/ast/types.d.ts.map +1 -0
- package/dist/ast/types.js +7 -0
- package/dist/ast/types.js.map +1 -0
- package/dist/check.d.ts +19 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +49 -0
- package/dist/check.js.map +1 -0
- package/dist/checker/check.d.ts +7 -0
- package/dist/checker/check.d.ts.map +1 -0
- package/dist/checker/check.js +548 -0
- package/dist/checker/check.js.map +1 -0
- package/dist/checker/type-env.d.ts +24 -0
- package/dist/checker/type-env.d.ts.map +1 -0
- package/dist/checker/type-env.js +67 -0
- package/dist/checker/type-env.js.map +1 -0
- package/dist/checker/types-equal.d.ts +18 -0
- package/dist/checker/types-equal.d.ts.map +1 -0
- package/dist/checker/types-equal.js +79 -0
- package/dist/checker/types-equal.js.map +1 -0
- package/dist/codegen/builtins.d.ts +27 -0
- package/dist/codegen/builtins.d.ts.map +1 -0
- package/dist/codegen/builtins.js +54 -0
- package/dist/codegen/builtins.js.map +1 -0
- package/dist/codegen/codegen.d.ts +32 -0
- package/dist/codegen/codegen.d.ts.map +1 -0
- package/dist/codegen/codegen.js +1192 -0
- package/dist/codegen/codegen.js.map +1 -0
- package/dist/codegen/runner.d.ts +16 -0
- package/dist/codegen/runner.d.ts.map +1 -0
- package/dist/codegen/runner.js +82 -0
- package/dist/codegen/runner.js.map +1 -0
- package/dist/codegen/string-table.d.ts +35 -0
- package/dist/codegen/string-table.d.ts.map +1 -0
- package/dist/codegen/string-table.js +62 -0
- package/dist/codegen/string-table.js.map +1 -0
- package/dist/compile.d.ts +18 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +40 -0
- package/dist/compile.js.map +1 -0
- package/dist/contracts/translate.d.ts +39 -0
- package/dist/contracts/translate.d.ts.map +1 -0
- package/dist/contracts/translate.js +372 -0
- package/dist/contracts/translate.js.map +1 -0
- package/dist/contracts/verify.d.ts +8 -0
- package/dist/contracts/verify.d.ts.map +1 -0
- package/dist/contracts/verify.js +400 -0
- package/dist/contracts/verify.js.map +1 -0
- package/dist/contracts/z3-context.d.ts +14 -0
- package/dist/contracts/z3-context.d.ts.map +1 -0
- package/dist/contracts/z3-context.js +24 -0
- package/dist/contracts/z3-context.js.map +1 -0
- package/dist/effects/call-graph.d.ts +21 -0
- package/dist/effects/call-graph.d.ts.map +1 -0
- package/dist/effects/call-graph.js +135 -0
- package/dist/effects/call-graph.js.map +1 -0
- package/dist/effects/effect-check.d.ts +13 -0
- package/dist/effects/effect-check.d.ts.map +1 -0
- package/dist/effects/effect-check.js +48 -0
- package/dist/effects/effect-check.js.map +1 -0
- package/dist/errors/structured-errors.d.ts +193 -0
- package/dist/errors/structured-errors.d.ts.map +1 -0
- package/dist/errors/structured-errors.js +96 -0
- package/dist/errors/structured-errors.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/create-server.d.ts +3 -0
- package/dist/mcp/create-server.d.ts.map +1 -0
- package/dist/mcp/create-server.js +157 -0
- package/dist/mcp/create-server.js.map +1 -0
- package/dist/mcp/handlers.d.ts +44 -0
- package/dist/mcp/handlers.d.ts.map +1 -0
- package/dist/mcp/handlers.js +112 -0
- package/dist/mcp/handlers.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +129 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/resolver/levenshtein.d.ts +12 -0
- package/dist/resolver/levenshtein.d.ts.map +1 -0
- package/dist/resolver/levenshtein.js +54 -0
- package/dist/resolver/levenshtein.js.map +1 -0
- package/dist/resolver/resolve.d.ts +7 -0
- package/dist/resolver/resolve.d.ts.map +1 -0
- package/dist/resolver/resolve.js +393 -0
- package/dist/resolver/resolve.js.map +1 -0
- package/dist/resolver/scope.d.ts +34 -0
- package/dist/resolver/scope.d.ts.map +1 -0
- package/dist/resolver/scope.js +51 -0
- package/dist/resolver/scope.js.map +1 -0
- package/dist/validator/id-tracker.d.ts +14 -0
- package/dist/validator/id-tracker.d.ts.map +1 -0
- package/dist/validator/id-tracker.js +28 -0
- package/dist/validator/id-tracker.js.map +1 -0
- package/dist/validator/node-validators.d.ts +6 -0
- package/dist/validator/node-validators.d.ts.map +1 -0
- package/dist/validator/node-validators.js +808 -0
- package/dist/validator/node-validators.js.map +1 -0
- package/dist/validator/validate.d.ts +17 -0
- package/dist/validator/validate.d.ts.map +1 -0
- package/dist/validator/validate.js +27 -0
- package/dist/validator/validate.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { StructuredError } from "../errors/structured-errors.js";
|
|
2
|
+
export interface SchemaResult {
|
|
3
|
+
schema: unknown;
|
|
4
|
+
}
|
|
5
|
+
export interface ExamplesResult {
|
|
6
|
+
count: number;
|
|
7
|
+
examples: {
|
|
8
|
+
name: string;
|
|
9
|
+
ast: unknown;
|
|
10
|
+
}[];
|
|
11
|
+
}
|
|
12
|
+
export interface ValidateResult {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
errors?: StructuredError[];
|
|
15
|
+
}
|
|
16
|
+
export interface CheckResult {
|
|
17
|
+
ok: boolean;
|
|
18
|
+
errors?: StructuredError[];
|
|
19
|
+
}
|
|
20
|
+
export interface CompileResult {
|
|
21
|
+
ok: boolean;
|
|
22
|
+
wasm?: string;
|
|
23
|
+
errors?: StructuredError[] | string[];
|
|
24
|
+
}
|
|
25
|
+
export interface RunResult {
|
|
26
|
+
output: string;
|
|
27
|
+
exitCode: number;
|
|
28
|
+
returnValue?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface VersionResult {
|
|
31
|
+
version: string;
|
|
32
|
+
schemaVersion: string;
|
|
33
|
+
builtins: string[];
|
|
34
|
+
features: Record<string, boolean>;
|
|
35
|
+
limits: Record<string, number>;
|
|
36
|
+
}
|
|
37
|
+
export declare function handleSchema(): SchemaResult;
|
|
38
|
+
export declare function handleExamples(): ExamplesResult;
|
|
39
|
+
export declare function handleValidate(ast: unknown): ValidateResult;
|
|
40
|
+
export declare function handleCheck(ast: unknown): Promise<CheckResult>;
|
|
41
|
+
export declare function handleCompile(ast: unknown): Promise<CompileResult>;
|
|
42
|
+
export declare function handleRun(wasmBase64: string): Promise<RunResult>;
|
|
43
|
+
export declare function handleVersion(): VersionResult;
|
|
44
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/mcp/handlers.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AA0CtE,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAMD,wBAAgB,YAAY,IAAI,YAAY,CAG3C;AAED,wBAAgB,cAAc,IAAI,cAAc,CAG/C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAM3D;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAMpE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAexE;AAED,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAQtE;AAED,wBAAgB,aAAa,IAAI,aAAa,CAmB7C"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// MCP Tool Handlers — Pure functions (no MCP SDK dependency)
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Each handler takes validated input and returns a structured result.
|
|
5
|
+
// Extracted from the server for testability.
|
|
6
|
+
import { readFileSync, readdirSync } from "node:fs";
|
|
7
|
+
import { resolve, dirname } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { validate } from "../validator/validate.js";
|
|
10
|
+
import { check } from "../check.js";
|
|
11
|
+
import { compile } from "../codegen/codegen.js";
|
|
12
|
+
import { run } from "../codegen/runner.js";
|
|
13
|
+
import { BUILTIN_FUNCTIONS } from "../codegen/builtins.js";
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Path resolution (relative to this file, works regardless of cwd)
|
|
16
|
+
// =============================================================================
|
|
17
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
const projectRoot = resolve(__dirname, "..", "..");
|
|
19
|
+
const schemaPath = resolve(projectRoot, "schema", "edict.schema.json");
|
|
20
|
+
const examplesDir = resolve(projectRoot, "examples");
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Cached assets (loaded once at startup)
|
|
23
|
+
// =============================================================================
|
|
24
|
+
let cachedSchema = null;
|
|
25
|
+
let cachedExamples = null;
|
|
26
|
+
function loadSchema() {
|
|
27
|
+
if (!cachedSchema) {
|
|
28
|
+
cachedSchema = readFileSync(schemaPath, "utf-8");
|
|
29
|
+
}
|
|
30
|
+
return cachedSchema;
|
|
31
|
+
}
|
|
32
|
+
function loadExamples() {
|
|
33
|
+
if (!cachedExamples) {
|
|
34
|
+
const files = readdirSync(examplesDir)
|
|
35
|
+
.filter((f) => f.endsWith(".edict.json"))
|
|
36
|
+
.sort();
|
|
37
|
+
cachedExamples = files.map((f) => ({
|
|
38
|
+
name: f.replace(".edict.json", ""),
|
|
39
|
+
ast: JSON.parse(readFileSync(resolve(examplesDir, f), "utf-8")),
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
return cachedExamples;
|
|
43
|
+
}
|
|
44
|
+
// =============================================================================
|
|
45
|
+
// Handlers
|
|
46
|
+
// =============================================================================
|
|
47
|
+
export function handleSchema() {
|
|
48
|
+
const raw = loadSchema();
|
|
49
|
+
return { schema: JSON.parse(raw) };
|
|
50
|
+
}
|
|
51
|
+
export function handleExamples() {
|
|
52
|
+
const examples = loadExamples();
|
|
53
|
+
return { count: examples.length, examples };
|
|
54
|
+
}
|
|
55
|
+
export function handleValidate(ast) {
|
|
56
|
+
const result = validate(ast);
|
|
57
|
+
if (result.ok) {
|
|
58
|
+
return { ok: true };
|
|
59
|
+
}
|
|
60
|
+
return { ok: false, errors: result.errors };
|
|
61
|
+
}
|
|
62
|
+
export async function handleCheck(ast) {
|
|
63
|
+
const result = await check(ast);
|
|
64
|
+
if (result.ok) {
|
|
65
|
+
return { ok: true };
|
|
66
|
+
}
|
|
67
|
+
return { ok: false, errors: result.errors };
|
|
68
|
+
}
|
|
69
|
+
export async function handleCompile(ast) {
|
|
70
|
+
// Full pipeline: check first, then compile
|
|
71
|
+
const checkResult = await check(ast);
|
|
72
|
+
if (!checkResult.ok || !checkResult.module) {
|
|
73
|
+
return { ok: false, errors: checkResult.errors };
|
|
74
|
+
}
|
|
75
|
+
const compileResult = compile(checkResult.module);
|
|
76
|
+
if (!compileResult.ok) {
|
|
77
|
+
return { ok: false, errors: compileResult.errors };
|
|
78
|
+
}
|
|
79
|
+
// Encode WASM as base64
|
|
80
|
+
const base64 = Buffer.from(compileResult.wasm).toString("base64");
|
|
81
|
+
return { ok: true, wasm: base64 };
|
|
82
|
+
}
|
|
83
|
+
export async function handleRun(wasmBase64) {
|
|
84
|
+
const wasmBytes = new Uint8Array(Buffer.from(wasmBase64, "base64"));
|
|
85
|
+
const result = await run(wasmBytes);
|
|
86
|
+
return {
|
|
87
|
+
output: result.output,
|
|
88
|
+
exitCode: result.exitCode,
|
|
89
|
+
returnValue: result.returnValue,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export function handleVersion() {
|
|
93
|
+
// Note: We could read the version from package.json dynamically,
|
|
94
|
+
// but for the MCP server it's safer to hardcode the API version it thinks it serves.
|
|
95
|
+
return {
|
|
96
|
+
version: "0.1.0",
|
|
97
|
+
schemaVersion: "1.0",
|
|
98
|
+
builtins: Array.from(BUILTIN_FUNCTIONS.keys()),
|
|
99
|
+
features: {
|
|
100
|
+
contracts: true,
|
|
101
|
+
effects: true,
|
|
102
|
+
unitTypes: false,
|
|
103
|
+
multiModule: false,
|
|
104
|
+
compactAst: false,
|
|
105
|
+
},
|
|
106
|
+
limits: {
|
|
107
|
+
z3TimeoutMs: 5000,
|
|
108
|
+
maxModules: 1,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/mcp/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// Edict MCP Server — Agent interface to the Edict compiler pipeline
|
|
4
|
+
// =============================================================================
|
|
5
|
+
// Usage: tsx src/mcp/server.ts (or: npm run mcp)
|
|
6
|
+
// Transport: stdio (standard for local MCP servers)
|
|
7
|
+
import { createEdictServer } from "./create-server.js";
|
|
8
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
9
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
10
|
+
import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js";
|
|
11
|
+
import express from "express";
|
|
12
|
+
import crypto from "node:crypto";
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Start
|
|
15
|
+
// =============================================================================
|
|
16
|
+
async function main() {
|
|
17
|
+
const args = process.argv.slice(2);
|
|
18
|
+
const useHttp = args.includes("--http") || process.env.EDICT_TRANSPORT === "http";
|
|
19
|
+
// Default to port 3000 unless specified or provided in EDICT_PORT
|
|
20
|
+
let port = 3000;
|
|
21
|
+
if (process.env.EDICT_PORT)
|
|
22
|
+
port = parseInt(process.env.EDICT_PORT, 10);
|
|
23
|
+
const portArgIndex = args.indexOf("--port");
|
|
24
|
+
if (portArgIndex !== -1 && portArgIndex + 1 < args.length) {
|
|
25
|
+
port = parseInt(args[portArgIndex + 1], 10);
|
|
26
|
+
}
|
|
27
|
+
if (useHttp) {
|
|
28
|
+
const app = createMcpExpressApp();
|
|
29
|
+
// Active transports keyed by session ID
|
|
30
|
+
const transports = {};
|
|
31
|
+
// Need body parser for Express to handle JSON
|
|
32
|
+
app.use(express.json({ limit: "50mb" }));
|
|
33
|
+
app.post("/mcp", async (req, res) => {
|
|
34
|
+
console.log("POST /mcp body:", req.body, "headers:", req.headers);
|
|
35
|
+
try {
|
|
36
|
+
let transport;
|
|
37
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
38
|
+
if (sessionId && transports[sessionId]) {
|
|
39
|
+
// Reusing existing transport
|
|
40
|
+
transport = transports[sessionId];
|
|
41
|
+
}
|
|
42
|
+
else if (req.body && req.body.method === "initialize") {
|
|
43
|
+
// New session needed
|
|
44
|
+
transport = new StreamableHTTPServerTransport({
|
|
45
|
+
sessionIdGenerator: () => crypto.randomUUID(),
|
|
46
|
+
onsessioninitialized: (sid) => {
|
|
47
|
+
transports[sid] = transport;
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
transport.onclose = () => {
|
|
51
|
+
const sid = transport.sessionId;
|
|
52
|
+
if (sid && transports[sid]) {
|
|
53
|
+
delete transports[sid];
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const server = createEdictServer();
|
|
57
|
+
await server.connect(transport);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
res.status(400).json({
|
|
61
|
+
jsonrpc: "2.0",
|
|
62
|
+
error: { code: -32000, message: "No valid session ID provided" },
|
|
63
|
+
id: null
|
|
64
|
+
});
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
await transport.handleRequest(req, res, req.body);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
console.error("Error handling POST /mcp:", err);
|
|
71
|
+
if (!res.headersSent)
|
|
72
|
+
res.status(500).end();
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
// GET /mcp - handles SSE streaming for responses
|
|
76
|
+
app.get("/mcp", async (req, res) => {
|
|
77
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
78
|
+
if (!sessionId || !transports[sessionId]) {
|
|
79
|
+
res.status(400).send("Invalid or missing session ID");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
await transports[sessionId].handleRequest(req, res);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
console.error("Error handling GET /mcp:", err);
|
|
87
|
+
if (!res.headersSent)
|
|
88
|
+
res.status(500).end();
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
// DELETE /mcp - handles closing a session
|
|
92
|
+
app.delete("/mcp", async (req, res) => {
|
|
93
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
94
|
+
if (!sessionId || !transports[sessionId]) {
|
|
95
|
+
res.status(400).send("Invalid or missing session ID");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
await transports[sessionId].handleRequest(req, res);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
console.error("Error handling DELETE /mcp:", err);
|
|
103
|
+
if (!res.headersSent)
|
|
104
|
+
res.status(500).end();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
const serverInstance = app.listen(port, () => {
|
|
108
|
+
console.log(`Edict MCP HTTP server listening on port ${port}`);
|
|
109
|
+
});
|
|
110
|
+
// Graceful shutdown
|
|
111
|
+
process.on("SIGINT", () => {
|
|
112
|
+
serverInstance.close(() => process.exit(0));
|
|
113
|
+
});
|
|
114
|
+
process.on("SIGTERM", () => {
|
|
115
|
+
serverInstance.close(() => process.exit(0));
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Stdio Transport
|
|
120
|
+
const server = createEdictServer();
|
|
121
|
+
const transport = new StdioServerTransport();
|
|
122
|
+
await server.connect(transport);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
main().catch((e) => {
|
|
126
|
+
console.error("Edict MCP server failed to start:", e);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute the Levenshtein edit distance between two strings.
|
|
3
|
+
* Uses the classic dynamic-programming O(m*n) algorithm.
|
|
4
|
+
*/
|
|
5
|
+
export declare function levenshteinDistance(a: string, b: string): number;
|
|
6
|
+
/**
|
|
7
|
+
* Find candidate names that are close to the given name.
|
|
8
|
+
* Returns names within maxDistance (default 2), sorted ascending by distance.
|
|
9
|
+
* At most 5 results.
|
|
10
|
+
*/
|
|
11
|
+
export declare function findCandidates(name: string, known: string[], maxDistance?: number): string[];
|
|
12
|
+
//# sourceMappingURL=levenshtein.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"levenshtein.d.ts","sourceRoot":"","sources":["../../src/resolver/levenshtein.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA6BhE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,WAAW,SAAI,GAChB,MAAM,EAAE,CAeV"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Levenshtein Distance — "Did you mean?" suggestions
|
|
3
|
+
// =============================================================================
|
|
4
|
+
/**
|
|
5
|
+
* Compute the Levenshtein edit distance between two strings.
|
|
6
|
+
* Uses the classic dynamic-programming O(m*n) algorithm.
|
|
7
|
+
*/
|
|
8
|
+
export function levenshteinDistance(a, b) {
|
|
9
|
+
const m = a.length;
|
|
10
|
+
const n = b.length;
|
|
11
|
+
// Optimisations for trivial cases
|
|
12
|
+
if (m === 0)
|
|
13
|
+
return n;
|
|
14
|
+
if (n === 0)
|
|
15
|
+
return m;
|
|
16
|
+
if (a === b)
|
|
17
|
+
return 0;
|
|
18
|
+
// Use two rows instead of full matrix to save memory
|
|
19
|
+
let prev = new Array(n + 1);
|
|
20
|
+
let curr = new Array(n + 1);
|
|
21
|
+
for (let j = 0; j <= n; j++)
|
|
22
|
+
prev[j] = j;
|
|
23
|
+
for (let i = 1; i <= m; i++) {
|
|
24
|
+
curr[0] = i;
|
|
25
|
+
for (let j = 1; j <= n; j++) {
|
|
26
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
27
|
+
curr[j] = Math.min(prev[j] + 1, // deletion
|
|
28
|
+
curr[j - 1] + 1, // insertion
|
|
29
|
+
prev[j - 1] + cost);
|
|
30
|
+
}
|
|
31
|
+
[prev, curr] = [curr, prev];
|
|
32
|
+
}
|
|
33
|
+
return prev[n];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Find candidate names that are close to the given name.
|
|
37
|
+
* Returns names within maxDistance (default 2), sorted ascending by distance.
|
|
38
|
+
* At most 5 results.
|
|
39
|
+
*/
|
|
40
|
+
export function findCandidates(name, known, maxDistance = 2) {
|
|
41
|
+
const scored = [];
|
|
42
|
+
for (const k of known) {
|
|
43
|
+
// Quick length-based pre-filter: if length difference > maxDistance, skip
|
|
44
|
+
if (Math.abs(k.length - name.length) > maxDistance)
|
|
45
|
+
continue;
|
|
46
|
+
const dist = levenshteinDistance(name, k);
|
|
47
|
+
if (dist <= maxDistance && dist > 0) {
|
|
48
|
+
scored.push({ name: k, dist });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
scored.sort((a, b) => a.dist - b.dist || a.name.localeCompare(b.name));
|
|
52
|
+
return scored.slice(0, 5).map((s) => s.name);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=levenshtein.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"levenshtein.js","sourceRoot":"","sources":["../../src/resolver/levenshtein.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,qDAAqD;AACrD,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAS,EAAE,CAAS;IACpD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAEnB,kCAAkC;IAClC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEtB,qDAAqD;IACrD,IAAI,IAAI,GAAG,IAAI,KAAK,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,IAAI,KAAK,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CACd,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,EAAQ,WAAW;YAC/B,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,EAAI,YAAY;YAChC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,IAAI,CACtB,CAAC;QACN,CAAC;QACD,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,CAAC,CAAC,CAAE,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC1B,IAAY,EACZ,KAAe,EACf,WAAW,GAAG,CAAC;IAEf,MAAM,MAAM,GAA0C,EAAE,CAAC;IAEzD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACpB,0EAA0E;QAC1E,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,WAAW;YAAE,SAAS;QAE7D,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { EdictModule } from "../ast/nodes.js";
|
|
2
|
+
import type { StructuredError } from "../errors/structured-errors.js";
|
|
3
|
+
/**
|
|
4
|
+
* Entry point: resolve all names in a validated Edict module.
|
|
5
|
+
*/
|
|
6
|
+
export declare function resolve(module: EdictModule): StructuredError[];
|
|
7
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/resolver/resolve.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACR,WAAW,EAUd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAOtE;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,EAAE,CA+D9D"}
|