waymark-engine 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +96 -0
- package/bin/waymark-ask.mjs +4 -0
- package/bin/waymark-chart.mjs +4 -0
- package/bin/waymark-discover.mjs +4 -0
- package/dist/src/astExtractor.d.ts +45 -0
- package/dist/src/astExtractor.js +388 -0
- package/dist/src/astExtractor.js.map +1 -0
- package/dist/src/capnAdapter.d.ts +16 -0
- package/dist/src/capnAdapter.js +149 -0
- package/dist/src/capnAdapter.js.map +1 -0
- package/dist/src/cli.d.ts +7 -0
- package/dist/src/cli.js +149 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/discoveryRouter.d.ts +13 -0
- package/dist/src/discoveryRouter.js +137 -0
- package/dist/src/discoveryRouter.js.map +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrity.d.ts +10 -0
- package/dist/src/integrity.js +93 -0
- package/dist/src/integrity.js.map +1 -0
- package/dist/src/mcp/capnIndex.d.ts +2 -0
- package/dist/src/mcp/capnIndex.js +15 -0
- package/dist/src/mcp/capnIndex.js.map +1 -0
- package/dist/src/mcp/capnTools.d.ts +5 -0
- package/dist/src/mcp/capnTools.js +190 -0
- package/dist/src/mcp/capnTools.js.map +1 -0
- package/dist/src/mcp/server.d.ts +22 -0
- package/dist/src/mcp/server.js +241 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/types.d.ts +80 -0
- package/dist/src/mcp/types.js +2 -0
- package/dist/src/mcp/types.js.map +1 -0
- package/dist/src/paths.d.ts +39 -0
- package/dist/src/paths.js +134 -0
- package/dist/src/paths.js.map +1 -0
- package/dist/src/types.d.ts +44 -0
- package/dist/src/types.js +11 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { CAPN_RESOURCES, McpServer } from "./server.js";
|
|
3
|
+
import { CAPN_TOOLS } from "./capnTools.js";
|
|
4
|
+
const server = new McpServer({
|
|
5
|
+
name: "capn-mcp",
|
|
6
|
+
version: "1.3.0",
|
|
7
|
+
tools: CAPN_TOOLS,
|
|
8
|
+
resources: CAPN_RESOURCES,
|
|
9
|
+
prompts: [],
|
|
10
|
+
});
|
|
11
|
+
server.runStdio().catch((error) => {
|
|
12
|
+
process.stderr.write(`Capn MCP server error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=capnIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capnIndex.js","sourceRoot":"","sources":["../../../src/mcp/capnIndex.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,UAAU;IACjB,SAAS,EAAE,cAAc;IACzB,OAAO,EAAE,EAAE;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { repoRoot } from "../paths.js";
|
|
2
|
+
import { ask, publish } from "../capnAdapter.js";
|
|
3
|
+
import { discoverSymbolsInFile } from "../astExtractor.js";
|
|
4
|
+
import { WaymarkError } from "../types.js";
|
|
5
|
+
function jsonResult(value, isError = false) {
|
|
6
|
+
return {
|
|
7
|
+
content: [{ type: "text", text: JSON.stringify(value, null, 2) }],
|
|
8
|
+
isError,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function errorResult(error) {
|
|
12
|
+
if (error instanceof WaymarkError) {
|
|
13
|
+
return jsonResult({ waymark: 1, kind: "error", ok: false, code: error.code, message: error.message }, true);
|
|
14
|
+
}
|
|
15
|
+
const message = error instanceof Error ? error.message : "Unexpected error";
|
|
16
|
+
return jsonResult({ waymark: 1, kind: "error", ok: false, code: "UNEXPECTED_ERROR", message }, true);
|
|
17
|
+
}
|
|
18
|
+
function resolveRoot(args) {
|
|
19
|
+
const custom = typeof args.root === "string" && args.root.trim() ? args.root.trim() : process.cwd();
|
|
20
|
+
return repoRoot(custom);
|
|
21
|
+
}
|
|
22
|
+
function resolveProfile(args) {
|
|
23
|
+
const value = typeof args.profile === "string" && args.profile ? args.profile : process.env.WAYMARK_CAPN_PROFILE;
|
|
24
|
+
return value === "none" ? "none" : "capn-cli";
|
|
25
|
+
}
|
|
26
|
+
function resolveExecutable(args) {
|
|
27
|
+
return (typeof args.capn_executable === "string" && args.capn_executable.trim()) || process.env.WAYMARK_CAPN_EXECUTABLE || "capn";
|
|
28
|
+
}
|
|
29
|
+
export const capnAskTool = {
|
|
30
|
+
definition: {
|
|
31
|
+
name: "capn_ask",
|
|
32
|
+
description: "Query Capn's charted repository memory to check if an answer to the question already exists.",
|
|
33
|
+
inputSchema: {
|
|
34
|
+
type: "object",
|
|
35
|
+
properties: {
|
|
36
|
+
question: {
|
|
37
|
+
type: "string",
|
|
38
|
+
description: "The question to look up in Capn's charted memory.",
|
|
39
|
+
},
|
|
40
|
+
capn_executable: {
|
|
41
|
+
type: "string",
|
|
42
|
+
description: "Optional custom path to the Capn executable.",
|
|
43
|
+
},
|
|
44
|
+
profile: {
|
|
45
|
+
type: "string",
|
|
46
|
+
enum: ["capn-cli", "none"],
|
|
47
|
+
description: "Optional adapter profile; defaults to capn-cli.",
|
|
48
|
+
},
|
|
49
|
+
root: {
|
|
50
|
+
type: "string",
|
|
51
|
+
description: "Optional repository root path. Defaults to current working directory.",
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
required: ["question"],
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
handler: async (args) => {
|
|
58
|
+
try {
|
|
59
|
+
const root = resolveRoot(args);
|
|
60
|
+
const question = typeof args.question === "string" ? args.question.trim() : "";
|
|
61
|
+
if (!question)
|
|
62
|
+
throw new WaymarkError("MISSING_ARGUMENT", "question is required");
|
|
63
|
+
const result = await ask(root, resolveProfile(args), resolveExecutable(args), question);
|
|
64
|
+
const payload = {
|
|
65
|
+
waymark: 1,
|
|
66
|
+
kind: "ask",
|
|
67
|
+
provider: result.provider,
|
|
68
|
+
status: result.status,
|
|
69
|
+
};
|
|
70
|
+
if (result.status === "hit") {
|
|
71
|
+
payload.result = result.result;
|
|
72
|
+
}
|
|
73
|
+
else if (result.status === "error") {
|
|
74
|
+
payload.error = result.error;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
payload.matches = result.matches ?? [];
|
|
78
|
+
}
|
|
79
|
+
return jsonResult(payload);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
return errorResult(error);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
export const capnChartTool = {
|
|
87
|
+
definition: {
|
|
88
|
+
name: "capn_chart",
|
|
89
|
+
description: "Directly chart a question, answer, and associated file references into Capn's long-term memory.",
|
|
90
|
+
inputSchema: {
|
|
91
|
+
type: "object",
|
|
92
|
+
properties: {
|
|
93
|
+
question: {
|
|
94
|
+
type: "string",
|
|
95
|
+
description: "The question or topic charted.",
|
|
96
|
+
},
|
|
97
|
+
answer: {
|
|
98
|
+
type: "string",
|
|
99
|
+
description: "The conclusive charted answer.",
|
|
100
|
+
},
|
|
101
|
+
files: {
|
|
102
|
+
type: "array",
|
|
103
|
+
items: { type: "string" },
|
|
104
|
+
description: "Array of repository-relative file paths referenced in the answer.",
|
|
105
|
+
},
|
|
106
|
+
capn_executable: {
|
|
107
|
+
type: "string",
|
|
108
|
+
description: "Optional custom path to the Capn executable.",
|
|
109
|
+
},
|
|
110
|
+
profile: {
|
|
111
|
+
type: "string",
|
|
112
|
+
enum: ["capn-cli", "none"],
|
|
113
|
+
description: "Optional adapter profile; defaults to capn-cli.",
|
|
114
|
+
},
|
|
115
|
+
root: {
|
|
116
|
+
type: "string",
|
|
117
|
+
description: "Optional repository root path. Defaults to current working directory.",
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
required: ["question", "answer"],
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
handler: async (args) => {
|
|
124
|
+
try {
|
|
125
|
+
const root = resolveRoot(args);
|
|
126
|
+
const question = typeof args.question === "string" ? args.question.trim() : "";
|
|
127
|
+
const answer = typeof args.answer === "string" ? args.answer.trim() : "";
|
|
128
|
+
const files = Array.isArray(args.files) ? args.files.filter((f) => typeof f === "string") : [];
|
|
129
|
+
if (!question)
|
|
130
|
+
throw new WaymarkError("MISSING_ARGUMENT", "question is required");
|
|
131
|
+
if (!answer)
|
|
132
|
+
throw new WaymarkError("MISSING_ARGUMENT", "answer is required");
|
|
133
|
+
const result = await publish(root, resolveProfile(args), resolveExecutable(args), question, answer, files);
|
|
134
|
+
const payload = {
|
|
135
|
+
waymark: 1,
|
|
136
|
+
kind: "chart",
|
|
137
|
+
published: result.published,
|
|
138
|
+
adapter: result.adapter,
|
|
139
|
+
output: result.output,
|
|
140
|
+
};
|
|
141
|
+
if (!result.published && result.error) {
|
|
142
|
+
payload.error = result.error;
|
|
143
|
+
}
|
|
144
|
+
return jsonResult(payload);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return errorResult(error);
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
export const discoverSymbolsTool = {
|
|
152
|
+
definition: {
|
|
153
|
+
name: "waymark_discover_symbols",
|
|
154
|
+
description: "Discover syntax symbols in one repository-relative file without changing any state.",
|
|
155
|
+
inputSchema: {
|
|
156
|
+
type: "object",
|
|
157
|
+
properties: {
|
|
158
|
+
path: {
|
|
159
|
+
type: "string",
|
|
160
|
+
description: "Repository-relative source file path.",
|
|
161
|
+
},
|
|
162
|
+
language: {
|
|
163
|
+
type: "string",
|
|
164
|
+
enum: ["typescript", "python"],
|
|
165
|
+
description: "Optional source language when the file extension is not sufficient.",
|
|
166
|
+
},
|
|
167
|
+
root: {
|
|
168
|
+
type: "string",
|
|
169
|
+
description: "Optional repository root path. Defaults to current working directory.",
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
required: ["path"],
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
handler: async (args) => {
|
|
176
|
+
try {
|
|
177
|
+
const root = resolveRoot(args);
|
|
178
|
+
const storedPath = typeof args.path === "string" ? args.path.trim() : "";
|
|
179
|
+
const language = typeof args.language === "string" ? args.language : undefined;
|
|
180
|
+
if (!storedPath)
|
|
181
|
+
throw new WaymarkError("MISSING_ARGUMENT", "path is required");
|
|
182
|
+
return jsonResult(await discoverSymbolsInFile(root, storedPath, language));
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
return errorResult(error);
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
export const CAPN_TOOLS = [capnAskTool, capnChartTool, discoverSymbolsTool];
|
|
190
|
+
//# sourceMappingURL=capnTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capnTools.js","sourceRoot":"","sources":["../../../src/mcp/capnTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { McpPromptDefinition, McpResourceDefinition, McpToolHandler } from "./types.js";
|
|
2
|
+
export declare const CAPN_RESOURCES: McpResourceDefinition[];
|
|
3
|
+
export interface McpServerOptions {
|
|
4
|
+
name?: string;
|
|
5
|
+
version?: string;
|
|
6
|
+
tools?: McpToolHandler[];
|
|
7
|
+
resources?: McpResourceDefinition[];
|
|
8
|
+
prompts?: McpPromptDefinition[];
|
|
9
|
+
}
|
|
10
|
+
export declare class McpServer {
|
|
11
|
+
private readonly toolMap;
|
|
12
|
+
private readonly serverName;
|
|
13
|
+
private readonly serverVersion;
|
|
14
|
+
private readonly resources;
|
|
15
|
+
private readonly prompts;
|
|
16
|
+
constructor(optionsOrHandlers?: McpServerOptions | McpToolHandler[]);
|
|
17
|
+
getToolDefinitions(): import("./types.js").McpToolDefinition[];
|
|
18
|
+
handleMessage(rawMessage: string): Promise<string | null>;
|
|
19
|
+
private handleNotification;
|
|
20
|
+
private handleRequest;
|
|
21
|
+
runStdio(): Promise<void>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { CAPN_TOOLS } from "./capnTools.js";
|
|
2
|
+
export const CAPN_RESOURCES = [
|
|
3
|
+
{
|
|
4
|
+
uri: "capn://status",
|
|
5
|
+
name: "Capn Memory Status",
|
|
6
|
+
description: "Current Capn adapter profile and executable configuration",
|
|
7
|
+
mimeType: "application/json",
|
|
8
|
+
},
|
|
9
|
+
];
|
|
10
|
+
export class McpServer {
|
|
11
|
+
toolMap = new Map();
|
|
12
|
+
serverName;
|
|
13
|
+
serverVersion;
|
|
14
|
+
resources;
|
|
15
|
+
prompts;
|
|
16
|
+
constructor(optionsOrHandlers = CAPN_TOOLS) {
|
|
17
|
+
if (Array.isArray(optionsOrHandlers)) {
|
|
18
|
+
this.serverName = "waymark-discovery-mcp";
|
|
19
|
+
this.serverVersion = "2.0.0";
|
|
20
|
+
this.resources = CAPN_RESOURCES;
|
|
21
|
+
this.prompts = [];
|
|
22
|
+
for (const item of optionsOrHandlers) {
|
|
23
|
+
this.toolMap.set(item.definition.name, item);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this.serverName = optionsOrHandlers.name ?? "waymark-discovery-mcp";
|
|
28
|
+
this.serverVersion = optionsOrHandlers.version ?? "2.0.0";
|
|
29
|
+
const tools = optionsOrHandlers.tools ?? CAPN_TOOLS;
|
|
30
|
+
this.resources = optionsOrHandlers.resources ?? CAPN_RESOURCES;
|
|
31
|
+
this.prompts = optionsOrHandlers.prompts ?? [];
|
|
32
|
+
for (const item of tools) {
|
|
33
|
+
this.toolMap.set(item.definition.name, item);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
getToolDefinitions() {
|
|
38
|
+
return Array.from(this.toolMap.values()).map((h) => h.definition);
|
|
39
|
+
}
|
|
40
|
+
async handleMessage(rawMessage) {
|
|
41
|
+
const trimmed = rawMessage.trim();
|
|
42
|
+
if (!trimmed)
|
|
43
|
+
return null;
|
|
44
|
+
let parsed;
|
|
45
|
+
try {
|
|
46
|
+
parsed = JSON.parse(trimmed);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return JSON.stringify({
|
|
50
|
+
jsonrpc: "2.0",
|
|
51
|
+
id: null,
|
|
52
|
+
error: { code: -32700, message: "Parse error" },
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (!parsed || typeof parsed !== "object") {
|
|
56
|
+
return JSON.stringify({
|
|
57
|
+
jsonrpc: "2.0",
|
|
58
|
+
id: null,
|
|
59
|
+
error: { code: -32600, message: "Invalid Request" },
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const message = parsed;
|
|
63
|
+
const isNotification = message.id === undefined || message.id === null;
|
|
64
|
+
if (isNotification) {
|
|
65
|
+
await this.handleNotification(message);
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const response = await this.handleRequest(message);
|
|
69
|
+
return JSON.stringify(response);
|
|
70
|
+
}
|
|
71
|
+
async handleNotification(notification) {
|
|
72
|
+
if (notification.method === "notifications/initialized") {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async handleRequest(request) {
|
|
77
|
+
const { id, method, params } = request;
|
|
78
|
+
if (method === "initialize") {
|
|
79
|
+
return {
|
|
80
|
+
jsonrpc: "2.0",
|
|
81
|
+
id,
|
|
82
|
+
result: {
|
|
83
|
+
protocolVersion: "2024-11-05",
|
|
84
|
+
serverInfo: {
|
|
85
|
+
name: this.serverName,
|
|
86
|
+
version: this.serverVersion,
|
|
87
|
+
},
|
|
88
|
+
capabilities: {
|
|
89
|
+
tools: {},
|
|
90
|
+
resources: {},
|
|
91
|
+
prompts: {},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (method === "ping") {
|
|
97
|
+
return {
|
|
98
|
+
jsonrpc: "2.0",
|
|
99
|
+
id,
|
|
100
|
+
result: {},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (method === "tools/list") {
|
|
104
|
+
return {
|
|
105
|
+
jsonrpc: "2.0",
|
|
106
|
+
id,
|
|
107
|
+
result: {
|
|
108
|
+
tools: this.getToolDefinitions(),
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (method === "tools/call") {
|
|
113
|
+
const toolName = typeof params?.name === "string" ? params.name : "";
|
|
114
|
+
const toolArgs = (params?.arguments && typeof params.arguments === "object" ? params.arguments : {});
|
|
115
|
+
const handler = this.toolMap.get(toolName);
|
|
116
|
+
if (!handler) {
|
|
117
|
+
return {
|
|
118
|
+
jsonrpc: "2.0",
|
|
119
|
+
id,
|
|
120
|
+
error: {
|
|
121
|
+
code: -32601,
|
|
122
|
+
message: `Tool not found: ${toolName}`,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
const result = await handler.handler(toolArgs);
|
|
128
|
+
return {
|
|
129
|
+
jsonrpc: "2.0",
|
|
130
|
+
id,
|
|
131
|
+
result,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
const message = error instanceof Error ? error.message : "Internal error";
|
|
136
|
+
return {
|
|
137
|
+
jsonrpc: "2.0",
|
|
138
|
+
id,
|
|
139
|
+
result: {
|
|
140
|
+
content: [{ type: "text", text: JSON.stringify({ error: message }) }],
|
|
141
|
+
isError: true,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (method === "resources/list") {
|
|
147
|
+
return {
|
|
148
|
+
jsonrpc: "2.0",
|
|
149
|
+
id,
|
|
150
|
+
result: {
|
|
151
|
+
resources: this.resources,
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
if (method === "resources/read") {
|
|
156
|
+
const uri = typeof params?.uri === "string" ? params.uri : "";
|
|
157
|
+
if (uri === "capn://status") {
|
|
158
|
+
const capnObj = {
|
|
159
|
+
waymark: 1,
|
|
160
|
+
kind: "capn-status",
|
|
161
|
+
profile: process.env.WAYMARK_CAPN_PROFILE === "none" ? "none" : "capn-cli",
|
|
162
|
+
capnExecutable: process.env.WAYMARK_CAPN_EXECUTABLE || "capn",
|
|
163
|
+
};
|
|
164
|
+
return {
|
|
165
|
+
jsonrpc: "2.0",
|
|
166
|
+
id,
|
|
167
|
+
result: {
|
|
168
|
+
contents: [
|
|
169
|
+
{
|
|
170
|
+
uri,
|
|
171
|
+
mimeType: "application/json",
|
|
172
|
+
text: JSON.stringify(capnObj, null, 2),
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
jsonrpc: "2.0",
|
|
180
|
+
id,
|
|
181
|
+
error: {
|
|
182
|
+
code: -32602,
|
|
183
|
+
message: `Resource not found: ${uri}`,
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
if (method === "prompts/list") {
|
|
188
|
+
return {
|
|
189
|
+
jsonrpc: "2.0",
|
|
190
|
+
id,
|
|
191
|
+
result: {
|
|
192
|
+
prompts: this.prompts,
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
if (method === "prompts/get") {
|
|
197
|
+
return {
|
|
198
|
+
jsonrpc: "2.0",
|
|
199
|
+
id,
|
|
200
|
+
error: {
|
|
201
|
+
code: -32602,
|
|
202
|
+
message: `Prompt not found: ${String(params?.name ?? "")}`,
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
jsonrpc: "2.0",
|
|
208
|
+
id,
|
|
209
|
+
error: {
|
|
210
|
+
code: -32601,
|
|
211
|
+
message: `Method not found: ${method}`,
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
async runStdio() {
|
|
216
|
+
process.stdin.setEncoding("utf8");
|
|
217
|
+
let buffer = "";
|
|
218
|
+
process.stdin.on("data", async (chunk) => {
|
|
219
|
+
buffer += chunk;
|
|
220
|
+
const lines = buffer.split(/\r?\n/u);
|
|
221
|
+
buffer = lines.pop() ?? "";
|
|
222
|
+
for (const line of lines) {
|
|
223
|
+
if (!line.trim())
|
|
224
|
+
continue;
|
|
225
|
+
const response = await this.handleMessage(line);
|
|
226
|
+
if (response) {
|
|
227
|
+
process.stdout.write(`${response}\n`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
process.stdin.on("end", async () => {
|
|
232
|
+
if (buffer.trim()) {
|
|
233
|
+
const response = await this.handleMessage(buffer);
|
|
234
|
+
if (response) {
|
|
235
|
+
process.stdout.write(`${response}\n`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
//# 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,80 @@
|
|
|
1
|
+
export interface JsonRpcRequest {
|
|
2
|
+
jsonrpc: "2.0";
|
|
3
|
+
id: string | number;
|
|
4
|
+
method: string;
|
|
5
|
+
params?: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export interface JsonRpcNotification {
|
|
8
|
+
jsonrpc: "2.0";
|
|
9
|
+
method: string;
|
|
10
|
+
params?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface JsonRpcResponse {
|
|
13
|
+
jsonrpc: "2.0";
|
|
14
|
+
id: string | number | null;
|
|
15
|
+
result?: unknown;
|
|
16
|
+
error?: JsonRpcError;
|
|
17
|
+
}
|
|
18
|
+
export interface JsonRpcError {
|
|
19
|
+
code: number;
|
|
20
|
+
message: string;
|
|
21
|
+
data?: unknown;
|
|
22
|
+
}
|
|
23
|
+
export interface McpToolProperty {
|
|
24
|
+
type: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
enum?: string[];
|
|
27
|
+
items?: {
|
|
28
|
+
type: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface McpToolInputSchema {
|
|
32
|
+
type: "object";
|
|
33
|
+
properties?: Record<string, McpToolProperty>;
|
|
34
|
+
required?: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface McpToolDefinition {
|
|
37
|
+
name: string;
|
|
38
|
+
description: string;
|
|
39
|
+
inputSchema: McpToolInputSchema;
|
|
40
|
+
}
|
|
41
|
+
export interface McpToolContent {
|
|
42
|
+
type: "text";
|
|
43
|
+
text: string;
|
|
44
|
+
}
|
|
45
|
+
export interface McpToolCallResult {
|
|
46
|
+
content: McpToolContent[];
|
|
47
|
+
isError?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface McpToolHandler {
|
|
50
|
+
definition: McpToolDefinition;
|
|
51
|
+
handler: (args: Record<string, unknown>) => Promise<McpToolCallResult>;
|
|
52
|
+
}
|
|
53
|
+
export interface McpResourceDefinition {
|
|
54
|
+
uri: string;
|
|
55
|
+
name: string;
|
|
56
|
+
description?: string;
|
|
57
|
+
mimeType?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface McpResourceContent {
|
|
60
|
+
uri: string;
|
|
61
|
+
mimeType?: string;
|
|
62
|
+
text?: string;
|
|
63
|
+
}
|
|
64
|
+
export interface McpPromptArgument {
|
|
65
|
+
name: string;
|
|
66
|
+
description?: string;
|
|
67
|
+
required?: boolean;
|
|
68
|
+
}
|
|
69
|
+
export interface McpPromptDefinition {
|
|
70
|
+
name: string;
|
|
71
|
+
description?: string;
|
|
72
|
+
arguments?: McpPromptArgument[];
|
|
73
|
+
}
|
|
74
|
+
export interface McpPromptMessage {
|
|
75
|
+
role: "user" | "assistant";
|
|
76
|
+
content: {
|
|
77
|
+
type: "text";
|
|
78
|
+
text: string;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mcp/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { LineRange, StructuralSignature } from "./types.js";
|
|
2
|
+
export declare function sha256(value: Buffer | string): string;
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the repository root: `git rev-parse --show-toplevel` when inside a Git
|
|
5
|
+
* worktree, otherwise the process cwd. The discovery engine itself needs no Git —
|
|
6
|
+
* the fallback keeps the CLI and library usable outside a repository.
|
|
7
|
+
*/
|
|
8
|
+
export declare function repoRoot(cwd?: string): string;
|
|
9
|
+
export declare function normalizeRelativePath(input: string): string;
|
|
10
|
+
export declare function resolveRepositoryFile(root: string, storedPath: string): {
|
|
11
|
+
lexical: string;
|
|
12
|
+
real: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function readFileBytes(root: string, storedPath: string): {
|
|
15
|
+
path: string;
|
|
16
|
+
bytes: Buffer;
|
|
17
|
+
};
|
|
18
|
+
export declare function readFileText(root: string, storedPath: string): {
|
|
19
|
+
path: string;
|
|
20
|
+
bytes: Buffer;
|
|
21
|
+
text: string;
|
|
22
|
+
};
|
|
23
|
+
export declare function normalizedLines(text: string): string[];
|
|
24
|
+
export declare function extractRange(lines: readonly string[], range: LineRange): string;
|
|
25
|
+
export declare function normalizeSpan(text: string): string;
|
|
26
|
+
export declare function structuralSignature(normalized: string): StructuralSignature;
|
|
27
|
+
/**
|
|
28
|
+
* Anchor a repository-relative file range: full-file hash plus a normalized,
|
|
29
|
+
* relocation-tolerant span hash. This is the tamper-evidence primitive — the
|
|
30
|
+
* same one the in-flight continuity ledger used, kept standalone because it is
|
|
31
|
+
* the cheapest way to pin "this span said X" to a later integrity check.
|
|
32
|
+
*/
|
|
33
|
+
export declare function anchorForRange(root: string, storedPath: string, range: LineRange): {
|
|
34
|
+
fileSha256: string;
|
|
35
|
+
normalizedSpanHash: string;
|
|
36
|
+
normalizedSpanLen: number;
|
|
37
|
+
spanLineCount: number;
|
|
38
|
+
structuralSignature: StructuralSignature;
|
|
39
|
+
};
|