vexp-mcp 1.2.14
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/dist/daemon-client.d.ts +19 -0
- package/dist/daemon-client.d.ts.map +1 -0
- package/dist/daemon-client.js +111 -0
- package/dist/daemon-client.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +238 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/get-context-capsule.d.ts +65 -0
- package/dist/tools/get-context-capsule.d.ts.map +1 -0
- package/dist/tools/get-context-capsule.js +101 -0
- package/dist/tools/get-context-capsule.js.map +1 -0
- package/dist/tools/get-impact-graph.d.ts +48 -0
- package/dist/tools/get-impact-graph.d.ts.map +1 -0
- package/dist/tools/get-impact-graph.js +95 -0
- package/dist/tools/get-impact-graph.js.map +1 -0
- package/dist/tools/get-session-context.d.ts +44 -0
- package/dist/tools/get-session-context.d.ts.map +1 -0
- package/dist/tools/get-session-context.js +51 -0
- package/dist/tools/get-session-context.js.map +1 -0
- package/dist/tools/get-skeleton.d.ts +44 -0
- package/dist/tools/get-skeleton.d.ts.map +1 -0
- package/dist/tools/get-skeleton.js +79 -0
- package/dist/tools/get-skeleton.js.map +1 -0
- package/dist/tools/index-status.d.ts +15 -0
- package/dist/tools/index-status.d.ts.map +1 -0
- package/dist/tools/index-status.js +99 -0
- package/dist/tools/index-status.js.map +1 -0
- package/dist/tools/save-observation.d.ts +44 -0
- package/dist/tools/save-observation.d.ts.map +1 -0
- package/dist/tools/save-observation.js +46 -0
- package/dist/tools/save-observation.js.map +1 -0
- package/dist/tools/search-logic-flow.d.ts +47 -0
- package/dist/tools/search-logic-flow.d.ts.map +1 -0
- package/dist/tools/search-logic-flow.js +90 -0
- package/dist/tools/search-logic-flow.js.map +1 -0
- package/dist/tools/search-memory.d.ts +54 -0
- package/dist/tools/search-memory.d.ts.map +1 -0
- package/dist/tools/search-memory.js +58 -0
- package/dist/tools/search-memory.js.map +1 -0
- package/dist/tools/workspace-setup.d.ts +33 -0
- package/dist/tools/workspace-setup.d.ts.map +1 -0
- package/dist/tools/workspace-setup.js +115 -0
- package/dist/tools/workspace-setup.js.map +1 -0
- package/package.json +32 -0
- package/src/daemon-client.ts +134 -0
- package/src/index.ts +299 -0
- package/src/tools/get-context-capsule.ts +154 -0
- package/src/tools/get-impact-graph.ts +134 -0
- package/src/tools/get-session-context.ts +79 -0
- package/src/tools/get-skeleton.ts +103 -0
- package/src/tools/index-status.ts +141 -0
- package/src/tools/save-observation.ts +63 -0
- package/src/tools/search-logic-flow.ts +147 -0
- package/src/tools/search-memory.ts +85 -0
- package/src/tools/workspace-setup.ts +155 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client per comunicare con il vexp-core daemon via Unix socket / Named pipe.
|
|
3
|
+
* Protocol: JSON lines (newline-delimited JSON).
|
|
4
|
+
*/
|
|
5
|
+
export declare class DaemonClient {
|
|
6
|
+
private socketPath;
|
|
7
|
+
private requestCounter;
|
|
8
|
+
private sessionId;
|
|
9
|
+
constructor(socketPath?: string, sessionId?: string);
|
|
10
|
+
/**
|
|
11
|
+
* Invia una richiesta al daemon e attende la risposta.
|
|
12
|
+
*/
|
|
13
|
+
call(tool: string, params: unknown): Promise<unknown>;
|
|
14
|
+
/**
|
|
15
|
+
* Verifica se il daemon è raggiungibile
|
|
16
|
+
*/
|
|
17
|
+
health(): Promise<boolean>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=daemon-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-client.d.ts","sourceRoot":"","sources":["../src/daemon-client.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,SAAS,CAAS;gBAEd,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAKnD;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAiE3D;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAQjC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as net from "net";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { randomUUID } from "crypto";
|
|
4
|
+
/**
|
|
5
|
+
* Client per comunicare con il vexp-core daemon via Unix socket / Named pipe.
|
|
6
|
+
* Protocol: JSON lines (newline-delimited JSON).
|
|
7
|
+
*/
|
|
8
|
+
export class DaemonClient {
|
|
9
|
+
socketPath;
|
|
10
|
+
requestCounter = 0;
|
|
11
|
+
sessionId;
|
|
12
|
+
constructor(socketPath, sessionId) {
|
|
13
|
+
this.socketPath = socketPath ?? getDefaultSocketPath();
|
|
14
|
+
this.sessionId = sessionId ?? randomUUID();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Invia una richiesta al daemon e attende la risposta.
|
|
18
|
+
*/
|
|
19
|
+
async call(tool, params) {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
const id = ++this.requestCounter;
|
|
22
|
+
const request = { id, tool, params, session_id: this.sessionId };
|
|
23
|
+
const requestLine = JSON.stringify(request) + "\n";
|
|
24
|
+
let client;
|
|
25
|
+
let responseBuffer = "";
|
|
26
|
+
let settled = false;
|
|
27
|
+
const timeout = setTimeout(() => {
|
|
28
|
+
if (!settled) {
|
|
29
|
+
settled = true;
|
|
30
|
+
client?.destroy();
|
|
31
|
+
reject(new Error(`Timeout: no response from daemon for tool '${tool}' after 30s`));
|
|
32
|
+
}
|
|
33
|
+
}, 30_000);
|
|
34
|
+
const settle = (fn) => {
|
|
35
|
+
if (!settled) {
|
|
36
|
+
settled = true;
|
|
37
|
+
clearTimeout(timeout);
|
|
38
|
+
fn();
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
if (process.platform === "win32") {
|
|
42
|
+
client = net.createConnection(this.socketPath);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
client = net.createConnection({ path: this.socketPath });
|
|
46
|
+
}
|
|
47
|
+
client.on("connect", () => {
|
|
48
|
+
client.write(requestLine);
|
|
49
|
+
});
|
|
50
|
+
client.on("data", (chunk) => {
|
|
51
|
+
responseBuffer += chunk.toString();
|
|
52
|
+
const newlineIndex = responseBuffer.indexOf("\n");
|
|
53
|
+
if (newlineIndex !== -1) {
|
|
54
|
+
const line = responseBuffer.slice(0, newlineIndex);
|
|
55
|
+
client.destroy();
|
|
56
|
+
try {
|
|
57
|
+
const response = JSON.parse(line);
|
|
58
|
+
if (response.type === "response") {
|
|
59
|
+
settle(() => resolve(response.result));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
settle(() => reject(new Error(response.message ?? "Daemon error")));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
settle(() => reject(new Error(`Invalid response JSON: ${line}`)));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
client.on("error", (err) => {
|
|
71
|
+
settle(() => reject(new Error(`Daemon connection error: ${err.message}. Is vexp daemon running?`)));
|
|
72
|
+
});
|
|
73
|
+
client.on("close", () => {
|
|
74
|
+
settle(() => reject(new Error("Daemon connection closed unexpectedly")));
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Verifica se il daemon è raggiungibile
|
|
80
|
+
*/
|
|
81
|
+
async health() {
|
|
82
|
+
try {
|
|
83
|
+
await this.call("index_status", {});
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** FNV-1a 64-bit hash — must match vexp-core/src/utils.rs md5_hash() */
|
|
92
|
+
function fnvHash(input) {
|
|
93
|
+
let hash = BigInt("0xcbf29ce484222325");
|
|
94
|
+
const prime = BigInt("0x100000001b3");
|
|
95
|
+
const mask = BigInt("0xffffffffffffffff");
|
|
96
|
+
const bytes = Buffer.from(input, "utf-8");
|
|
97
|
+
for (const byte of bytes) {
|
|
98
|
+
hash ^= BigInt(byte);
|
|
99
|
+
hash = (hash * prime) & mask;
|
|
100
|
+
}
|
|
101
|
+
return hash.toString(16);
|
|
102
|
+
}
|
|
103
|
+
function getDefaultSocketPath() {
|
|
104
|
+
const workspaceRoot = process.env["VEXP_WORKSPACE"] ?? process.cwd();
|
|
105
|
+
if (process.platform === "win32") {
|
|
106
|
+
const hash = fnvHash(workspaceRoot);
|
|
107
|
+
return `\\\\.\\pipe\\vexp-${hash.slice(0, 8)}`;
|
|
108
|
+
}
|
|
109
|
+
return path.join(workspaceRoot, ".vexp", "daemon.sock");
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=daemon-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../src/daemon-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import express from "express";
|
|
6
|
+
import { createServer } from "http";
|
|
7
|
+
import { randomUUID } from "crypto";
|
|
8
|
+
import fs from "fs";
|
|
9
|
+
import { DaemonClient } from "./daemon-client.js";
|
|
10
|
+
import { GET_CONTEXT_CAPSULE_DEFINITION, handleGetContextCapsule, } from "./tools/get-context-capsule.js";
|
|
11
|
+
import { GET_IMPACT_GRAPH_DEFINITION, handleGetImpactGraph, } from "./tools/get-impact-graph.js";
|
|
12
|
+
import { SEARCH_LOGIC_FLOW_DEFINITION, handleSearchLogicFlow, } from "./tools/search-logic-flow.js";
|
|
13
|
+
import { GET_SKELETON_DEFINITION, handleGetSkeleton, } from "./tools/get-skeleton.js";
|
|
14
|
+
import { INDEX_STATUS_DEFINITION, handleIndexStatus, } from "./tools/index-status.js";
|
|
15
|
+
import { WORKSPACE_SETUP_DEFINITION, handleWorkspaceSetup, } from "./tools/workspace-setup.js";
|
|
16
|
+
import { GET_SESSION_CONTEXT_DEFINITION, handleGetSessionContext, } from "./tools/get-session-context.js";
|
|
17
|
+
import { SEARCH_MEMORY_DEFINITION, handleSearchMemory, } from "./tools/search-memory.js";
|
|
18
|
+
import { SAVE_OBSERVATION_DEFINITION, handleSaveObservation, } from "./tools/save-observation.js";
|
|
19
|
+
const ALL_TOOL_DEFINITIONS = [
|
|
20
|
+
GET_CONTEXT_CAPSULE_DEFINITION,
|
|
21
|
+
GET_IMPACT_GRAPH_DEFINITION,
|
|
22
|
+
SEARCH_LOGIC_FLOW_DEFINITION,
|
|
23
|
+
GET_SKELETON_DEFINITION,
|
|
24
|
+
INDEX_STATUS_DEFINITION,
|
|
25
|
+
WORKSPACE_SETUP_DEFINITION,
|
|
26
|
+
GET_SESSION_CONTEXT_DEFINITION,
|
|
27
|
+
SEARCH_MEMORY_DEFINITION,
|
|
28
|
+
SAVE_OBSERVATION_DEFINITION,
|
|
29
|
+
];
|
|
30
|
+
// Free plan: core tools + all memory tools (memory is the showcase).
|
|
31
|
+
const FREE_TOOL_NAMES = new Set([
|
|
32
|
+
"get_context_capsule",
|
|
33
|
+
"get_skeleton",
|
|
34
|
+
"index_status",
|
|
35
|
+
"get_session_context",
|
|
36
|
+
"search_memory",
|
|
37
|
+
"save_observation",
|
|
38
|
+
]);
|
|
39
|
+
const allToolsEnabled = process.env.VEXP_ALL_TOOLS === "1";
|
|
40
|
+
/** FNV-1a 64-bit hash — must match vexp-core/src/utils.rs md5_hash() */
|
|
41
|
+
function fnvHash(input) {
|
|
42
|
+
let hash = BigInt("0xcbf29ce484222325");
|
|
43
|
+
const prime = BigInt("0x100000001b3");
|
|
44
|
+
const mask = BigInt("0xffffffffffffffff");
|
|
45
|
+
const bytes = Buffer.from(input, "utf-8");
|
|
46
|
+
for (const byte of bytes) {
|
|
47
|
+
hash ^= BigInt(byte);
|
|
48
|
+
hash = (hash * prime) & mask;
|
|
49
|
+
}
|
|
50
|
+
return hash.toString(16);
|
|
51
|
+
}
|
|
52
|
+
function getSocketPath() {
|
|
53
|
+
if (process.env.VEXP_SOCKET)
|
|
54
|
+
return process.env.VEXP_SOCKET;
|
|
55
|
+
const workspaceRoot = process.env.VEXP_WORKSPACE ?? process.cwd();
|
|
56
|
+
if (process.platform === "win32") {
|
|
57
|
+
// Normalize to lowercase — Windows drive letters can be C: or c: depending on context,
|
|
58
|
+
// but the FNV hash is case-sensitive. Must match vexp-core/src/utils.rs get_socket_path().
|
|
59
|
+
const normalized = workspaceRoot.toLowerCase();
|
|
60
|
+
const hash = fnvHash(normalized);
|
|
61
|
+
return `\\\\.\\pipe\\vexp-${hash.slice(0, 8)}`;
|
|
62
|
+
}
|
|
63
|
+
const cwdSocket = `${workspaceRoot}/.vexp/daemon.sock`;
|
|
64
|
+
if (fs.existsSync(cwdSocket))
|
|
65
|
+
return cwdSocket;
|
|
66
|
+
const home = process.env.HOME ?? "/tmp";
|
|
67
|
+
return `${home}/.vexp/daemon.sock`;
|
|
68
|
+
}
|
|
69
|
+
function createMcpServer(daemon) {
|
|
70
|
+
const server = new Server({ name: "vexp-mcp", version: "1.0.0" }, { capabilities: { tools: {} } });
|
|
71
|
+
const visibleTools = allToolsEnabled
|
|
72
|
+
? ALL_TOOL_DEFINITIONS
|
|
73
|
+
: ALL_TOOL_DEFINITIONS.filter((t) => FREE_TOOL_NAMES.has(t.name));
|
|
74
|
+
server.setRequestHandler(ListToolsRequestSchema, () => ({
|
|
75
|
+
tools: visibleTools,
|
|
76
|
+
}));
|
|
77
|
+
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
78
|
+
const { name, arguments: args } = req.params;
|
|
79
|
+
// Block Pro-only tools for free users
|
|
80
|
+
if (!allToolsEnabled && !FREE_TOOL_NAMES.has(name)) {
|
|
81
|
+
return {
|
|
82
|
+
isError: true,
|
|
83
|
+
content: [{
|
|
84
|
+
type: "text",
|
|
85
|
+
text: `${name} requires a Pro plan. Upgrade at https://vexp.dev/#pricing to unlock all MCP tools.`,
|
|
86
|
+
}],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
let text;
|
|
91
|
+
switch (name) {
|
|
92
|
+
case "get_context_capsule":
|
|
93
|
+
text = await handleGetContextCapsule(args, daemon);
|
|
94
|
+
break;
|
|
95
|
+
case "get_impact_graph":
|
|
96
|
+
text = await handleGetImpactGraph(args, daemon);
|
|
97
|
+
break;
|
|
98
|
+
case "search_logic_flow":
|
|
99
|
+
text = await handleSearchLogicFlow(args, daemon);
|
|
100
|
+
break;
|
|
101
|
+
case "get_skeleton":
|
|
102
|
+
text = await handleGetSkeleton(args, daemon);
|
|
103
|
+
break;
|
|
104
|
+
case "index_status":
|
|
105
|
+
text = await handleIndexStatus(args, daemon);
|
|
106
|
+
break;
|
|
107
|
+
case "workspace_setup":
|
|
108
|
+
text = await handleWorkspaceSetup(args, daemon);
|
|
109
|
+
break;
|
|
110
|
+
case "get_session_context":
|
|
111
|
+
text = await handleGetSessionContext(args, daemon);
|
|
112
|
+
break;
|
|
113
|
+
case "search_memory":
|
|
114
|
+
text = await handleSearchMemory(args, daemon);
|
|
115
|
+
break;
|
|
116
|
+
case "save_observation":
|
|
117
|
+
text = await handleSaveObservation(args, daemon);
|
|
118
|
+
break;
|
|
119
|
+
default:
|
|
120
|
+
return {
|
|
121
|
+
isError: true,
|
|
122
|
+
content: [{ type: "text", text: `Unknown tool: ${name}` }],
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
content: [{ type: "text", text }],
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
131
|
+
return {
|
|
132
|
+
isError: true,
|
|
133
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
return server;
|
|
138
|
+
}
|
|
139
|
+
async function startStdio(daemon) {
|
|
140
|
+
const server = createMcpServer(daemon);
|
|
141
|
+
const transport = new StdioServerTransport();
|
|
142
|
+
await server.connect(transport);
|
|
143
|
+
console.error("[vexp-mcp] Running on stdio");
|
|
144
|
+
}
|
|
145
|
+
async function startHttp(daemon, port) {
|
|
146
|
+
const app = express();
|
|
147
|
+
app.use(express.json());
|
|
148
|
+
const transports = new Map();
|
|
149
|
+
// CORS preflight
|
|
150
|
+
app.options("*", (_req, res) => {
|
|
151
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
152
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
|
|
153
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, mcp-session-id");
|
|
154
|
+
res.status(204).send();
|
|
155
|
+
});
|
|
156
|
+
// Single MCP endpoint — handles initialize (POST without session ID),
|
|
157
|
+
// subsequent JSON-RPC requests, and GET for SSE notification streams.
|
|
158
|
+
app.all("/mcp", async (req, res) => {
|
|
159
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
160
|
+
const sessionId = req.headers["mcp-session-id"];
|
|
161
|
+
if (sessionId) {
|
|
162
|
+
const transport = transports.get(sessionId);
|
|
163
|
+
if (!transport) {
|
|
164
|
+
// Session lost (server restart, transport closed) — create a new one
|
|
165
|
+
// instead of returning 404, so the client transparently reconnects.
|
|
166
|
+
console.error(`[vexp-mcp] Session ${sessionId} not found — creating new transport`);
|
|
167
|
+
// Fall through to the "new session" code below
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
await transport.handleRequest(req, res, req.body);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// No session ID → new client initializing
|
|
175
|
+
const transport = new StreamableHTTPServerTransport({
|
|
176
|
+
sessionIdGenerator: () => randomUUID(),
|
|
177
|
+
onsessioninitialized: (sid) => {
|
|
178
|
+
transports.set(sid, transport);
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
transport.onclose = () => {
|
|
182
|
+
if (transport.sessionId)
|
|
183
|
+
transports.delete(transport.sessionId);
|
|
184
|
+
};
|
|
185
|
+
const server = createMcpServer(daemon);
|
|
186
|
+
await server.connect(transport);
|
|
187
|
+
await transport.handleRequest(req, res, req.body);
|
|
188
|
+
});
|
|
189
|
+
// Health check
|
|
190
|
+
app.get("/health", async (_req, res) => {
|
|
191
|
+
try {
|
|
192
|
+
const healthy = await daemon.health();
|
|
193
|
+
res.json({ status: healthy ? "ok" : "daemon_down", sessions: transports.size });
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
res.status(503).json({ status: "error" });
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
const httpServer = createServer(app);
|
|
200
|
+
const tryListen = (retries) => new Promise((resolve, reject) => {
|
|
201
|
+
const onError = (err) => {
|
|
202
|
+
if (err.code === "EADDRINUSE" && retries > 0) {
|
|
203
|
+
console.error(`[vexp-mcp] Port ${port} busy, retrying in 1s (${retries} left)`);
|
|
204
|
+
setTimeout(() => tryListen(retries - 1).then(resolve, reject), 2000);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
reject(err);
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
httpServer.once("error", onError);
|
|
211
|
+
httpServer.listen(port, "127.0.0.1", () => {
|
|
212
|
+
httpServer.removeListener("error", onError);
|
|
213
|
+
console.error(`[vexp-mcp] HTTP server listening on 127.0.0.1:${port}`);
|
|
214
|
+
resolve();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
await tryListen(10);
|
|
218
|
+
}
|
|
219
|
+
async function main() {
|
|
220
|
+
const args = process.argv.slice(2);
|
|
221
|
+
const socketPath = getSocketPath();
|
|
222
|
+
const daemon = new DaemonClient(socketPath);
|
|
223
|
+
const useHttp = args.includes("--http") || process.env.VEXP_HTTP === "1";
|
|
224
|
+
const port = parseInt(args.find((a) => a.startsWith("--port="))?.split("=")[1] ??
|
|
225
|
+
process.env.VEXP_PORT ??
|
|
226
|
+
"7821", 10);
|
|
227
|
+
if (useHttp) {
|
|
228
|
+
await startHttp(daemon, port);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
await startStdio(daemon);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
main().catch((err) => {
|
|
235
|
+
console.error("[vexp-mcp] Fatal:", err);
|
|
236
|
+
process.exit(1);
|
|
237
|
+
});
|
|
238
|
+
//# 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,65 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { DaemonClient } from "../daemon-client.js";
|
|
3
|
+
export declare const GetContextCapsuleSchema: z.ZodObject<{
|
|
4
|
+
query: z.ZodString;
|
|
5
|
+
repos: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
6
|
+
max_tokens: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
7
|
+
pivot_depth: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
8
|
+
include_tests: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
9
|
+
skeleton_detail: z.ZodDefault<z.ZodOptional<z.ZodEnum<["minimal", "standard", "detailed"]>>>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
query: string;
|
|
12
|
+
max_tokens: number;
|
|
13
|
+
pivot_depth: number;
|
|
14
|
+
include_tests: boolean;
|
|
15
|
+
skeleton_detail: "minimal" | "standard" | "detailed";
|
|
16
|
+
repos?: string[] | undefined;
|
|
17
|
+
}, {
|
|
18
|
+
query: string;
|
|
19
|
+
repos?: string[] | undefined;
|
|
20
|
+
max_tokens?: number | undefined;
|
|
21
|
+
pivot_depth?: number | undefined;
|
|
22
|
+
include_tests?: boolean | undefined;
|
|
23
|
+
skeleton_detail?: "minimal" | "standard" | "detailed" | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
export type GetContextCapsuleParams = z.infer<typeof GetContextCapsuleSchema>;
|
|
26
|
+
export declare const GET_CONTEXT_CAPSULE_DEFINITION: {
|
|
27
|
+
name: string;
|
|
28
|
+
description: string;
|
|
29
|
+
inputSchema: {
|
|
30
|
+
type: "object";
|
|
31
|
+
properties: {
|
|
32
|
+
query: {
|
|
33
|
+
type: string;
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
repos: {
|
|
37
|
+
type: string;
|
|
38
|
+
items: {
|
|
39
|
+
type: string;
|
|
40
|
+
};
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
max_tokens: {
|
|
44
|
+
type: string;
|
|
45
|
+
description: string;
|
|
46
|
+
};
|
|
47
|
+
pivot_depth: {
|
|
48
|
+
type: string;
|
|
49
|
+
description: string;
|
|
50
|
+
};
|
|
51
|
+
include_tests: {
|
|
52
|
+
type: string;
|
|
53
|
+
description: string;
|
|
54
|
+
};
|
|
55
|
+
skeleton_detail: {
|
|
56
|
+
type: string;
|
|
57
|
+
enum: string[];
|
|
58
|
+
description: string;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
required: string[];
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
export declare function handleGetContextCapsule(params: unknown, daemon: DaemonClient): Promise<string>;
|
|
65
|
+
//# sourceMappingURL=get-context-capsule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-context-capsule.d.ts","sourceRoot":"","sources":["../../src/tools/get-context-capsule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;EAOlC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B1C,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CAIjB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const GetContextCapsuleSchema = z.object({
|
|
3
|
+
query: z.string().describe("Description of the task or what you need context for"),
|
|
4
|
+
repos: z.array(z.string()).optional().describe("Repo aliases to query (default: all)"),
|
|
5
|
+
max_tokens: z.number().optional().default(8000).describe("Max tokens for the capsule"),
|
|
6
|
+
pivot_depth: z.number().optional().default(2).describe("BFS depth from pivot nodes"),
|
|
7
|
+
include_tests: z.boolean().optional().default(false).describe("Include test files"),
|
|
8
|
+
skeleton_detail: z.enum(["minimal", "standard", "detailed"]).optional().default("standard"),
|
|
9
|
+
});
|
|
10
|
+
export const GET_CONTEXT_CAPSULE_DEFINITION = {
|
|
11
|
+
name: "get_context_capsule",
|
|
12
|
+
description: "Get a context capsule for a task. Finds the most relevant code (pivot nodes) via semantic + graph search " +
|
|
13
|
+
"and includes skeletons of supporting files, optimized to minimize token usage while maximizing relevance. " +
|
|
14
|
+
"WHEN TO USE: (1) Before any code change — always call this first to orient yourself. " +
|
|
15
|
+
"(2) When asked how a feature works or where something is implemented. " +
|
|
16
|
+
"(3) At the start of a debugging session. " +
|
|
17
|
+
"Prefer this over Read/Grep for initial exploration — it returns the most relevant code ranked by graph centrality. " +
|
|
18
|
+
"In multi-repo workspaces, automatically queries all indexed repos. Use the 'repos' parameter to restrict to specific repo aliases (discoverable via index_status).",
|
|
19
|
+
inputSchema: {
|
|
20
|
+
type: "object",
|
|
21
|
+
properties: {
|
|
22
|
+
query: { type: "string", description: "Description of the task" },
|
|
23
|
+
repos: { type: "array", items: { type: "string" }, description: "Repo aliases to query (from index_status). Default: all indexed repos" },
|
|
24
|
+
max_tokens: { type: "number", description: "Max tokens (default: 8000)" },
|
|
25
|
+
pivot_depth: { type: "number", description: "Graph traversal depth (default: 2)" },
|
|
26
|
+
include_tests: { type: "boolean", description: "Include test files" },
|
|
27
|
+
skeleton_detail: {
|
|
28
|
+
type: "string",
|
|
29
|
+
enum: ["minimal", "standard", "detailed"],
|
|
30
|
+
description: "Skeleton detail level (default: standard)",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
required: ["query"],
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
export async function handleGetContextCapsule(params, daemon) {
|
|
37
|
+
const validated = GetContextCapsuleSchema.parse(params);
|
|
38
|
+
const result = await daemon.call("get_context_capsule", validated);
|
|
39
|
+
return formatCapsuleAsText(result);
|
|
40
|
+
}
|
|
41
|
+
function formatCapsuleAsText(capsule) {
|
|
42
|
+
const lines = [];
|
|
43
|
+
lines.push(`# vexp Context Capsule`);
|
|
44
|
+
const savingLabel = capsule.token_budget.saving_pct > 1
|
|
45
|
+
? `${capsule.token_budget.saving_pct.toFixed(0)}% token saving vs full content`
|
|
46
|
+
: `${capsule.graph_stats.nodes_analyzed} nodes · ${capsule.graph_stats.edges_traversed} edges traversed`;
|
|
47
|
+
const memoryCount = capsule.memories?.length ?? 0;
|
|
48
|
+
lines.push(`> Token budget: ${capsule.token_budget.used}/${capsule.token_budget.total} used | ` +
|
|
49
|
+
`${savingLabel} | ` +
|
|
50
|
+
`${capsule.graph_stats.query_time_ms}ms | ` +
|
|
51
|
+
`memories: ${memoryCount}`);
|
|
52
|
+
lines.push("");
|
|
53
|
+
if (capsule.pivots.length === 0) {
|
|
54
|
+
lines.push("*No relevant code found for this query. Try a different description.*");
|
|
55
|
+
return lines.join("\n");
|
|
56
|
+
}
|
|
57
|
+
const isMultiRepo = capsule.graph_stats.repos_queried.length > 1;
|
|
58
|
+
lines.push("## Pivot Files (Full Content)");
|
|
59
|
+
lines.push("");
|
|
60
|
+
for (const pivot of capsule.pivots) {
|
|
61
|
+
const repoLabel = isMultiRepo ? `\`${pivot.repo}\` / ` : '';
|
|
62
|
+
lines.push(`### ${repoLabel}\`${pivot.file_path}\` (relevance: ${pivot.relevance_score.toFixed(2)})`);
|
|
63
|
+
lines.push(`*${pivot.why}*`);
|
|
64
|
+
lines.push("");
|
|
65
|
+
lines.push("```");
|
|
66
|
+
lines.push(pivot.content);
|
|
67
|
+
lines.push("```");
|
|
68
|
+
lines.push("");
|
|
69
|
+
}
|
|
70
|
+
if (capsule.supporting.length > 0) {
|
|
71
|
+
lines.push("## Supporting Context (Skeletons)");
|
|
72
|
+
lines.push("");
|
|
73
|
+
for (const sup of capsule.supporting) {
|
|
74
|
+
const crossRepoLabel = sup.cross_repo ? " *(cross-repo)*" : "";
|
|
75
|
+
lines.push(`### \`${sup.file_path}\`${crossRepoLabel}`);
|
|
76
|
+
lines.push(`*${sup.relationship}*`);
|
|
77
|
+
lines.push("");
|
|
78
|
+
lines.push("```");
|
|
79
|
+
lines.push(sup.skeleton);
|
|
80
|
+
lines.push("```");
|
|
81
|
+
lines.push("");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
lines.push("## Session Memory");
|
|
85
|
+
if (capsule.memories && capsule.memories.length > 0) {
|
|
86
|
+
lines.push("*Relevant observations from this and previous sessions:*");
|
|
87
|
+
lines.push("");
|
|
88
|
+
for (const mem of capsule.memories) {
|
|
89
|
+
const date = new Date(mem.created_at * 1000);
|
|
90
|
+
const timeStr = `${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")} ${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`;
|
|
91
|
+
const staleTag = mem.stale ? " ~stale~" : "";
|
|
92
|
+
lines.push(`- [${timeStr}${staleTag}] ${mem.content}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
lines.push("*No relevant memories found. Use `save_observation` to persist important decisions.*");
|
|
97
|
+
}
|
|
98
|
+
lines.push("");
|
|
99
|
+
return lines.join("\n");
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=get-context-capsule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-context-capsule.js","sourceRoot":"","sources":["../../src/tools/get-context-capsule.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { DaemonClient } from "../daemon-client.js";
|
|
3
|
+
export declare const GetImpactGraphSchema: z.ZodObject<{
|
|
4
|
+
symbol_fqn: z.ZodString;
|
|
5
|
+
depth: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
6
|
+
cross_repo: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
7
|
+
format: z.ZodDefault<z.ZodOptional<z.ZodEnum<["list", "tree", "mermaid"]>>>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
symbol_fqn: string;
|
|
10
|
+
depth: number;
|
|
11
|
+
cross_repo: boolean;
|
|
12
|
+
format: "list" | "tree" | "mermaid";
|
|
13
|
+
}, {
|
|
14
|
+
symbol_fqn: string;
|
|
15
|
+
depth?: number | undefined;
|
|
16
|
+
cross_repo?: boolean | undefined;
|
|
17
|
+
format?: "list" | "tree" | "mermaid" | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
export type GetImpactGraphParams = z.infer<typeof GetImpactGraphSchema>;
|
|
20
|
+
export declare const GET_IMPACT_GRAPH_DEFINITION: {
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
inputSchema: {
|
|
24
|
+
type: "object";
|
|
25
|
+
properties: {
|
|
26
|
+
symbol_fqn: {
|
|
27
|
+
type: string;
|
|
28
|
+
description: string;
|
|
29
|
+
};
|
|
30
|
+
depth: {
|
|
31
|
+
type: string;
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
cross_repo: {
|
|
35
|
+
type: string;
|
|
36
|
+
description: string;
|
|
37
|
+
};
|
|
38
|
+
format: {
|
|
39
|
+
type: string;
|
|
40
|
+
enum: string[];
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
required: string[];
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
export declare function handleGetImpactGraph(params: unknown, daemon: DaemonClient): Promise<string>;
|
|
48
|
+
//# sourceMappingURL=get-impact-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-impact-graph.d.ts","sourceRoot":"","sources":["../../src/tools/get-impact-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAK/B,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BvC,CAAC;AAsBF,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CAMjB"}
|