vexp-mcp 1.2.27 → 1.2.29
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 +20 -0
- package/dist/daemon-client.d.ts.map +1 -1
- package/dist/daemon-client.js +82 -0
- package/dist/daemon-client.js.map +1 -1
- package/package.json +1 -1
- package/src/daemon-client.ts +117 -0
package/dist/daemon-client.d.ts
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
interface StreamChunk {
|
|
2
|
+
id: number;
|
|
3
|
+
type: "chunk" | "result";
|
|
4
|
+
step?: string;
|
|
5
|
+
steps_executed?: number;
|
|
6
|
+
steps_total?: number;
|
|
7
|
+
elapsed_ms?: number;
|
|
8
|
+
response?: SocketResponse;
|
|
9
|
+
}
|
|
10
|
+
interface SocketResponse {
|
|
11
|
+
type: "response" | "error";
|
|
12
|
+
result?: unknown;
|
|
13
|
+
message?: string;
|
|
14
|
+
}
|
|
1
15
|
/**
|
|
2
16
|
* Client per comunicare con il vexp-core daemon via Unix socket / Named pipe.
|
|
3
17
|
* Protocol: JSON lines (newline-delimited JSON).
|
|
@@ -15,10 +29,16 @@ export declare class DaemonClient {
|
|
|
15
29
|
* Invia una richiesta al daemon con retry per errori di connessione transienti.
|
|
16
30
|
*/
|
|
17
31
|
call(tool: string, params: unknown): Promise<unknown>;
|
|
32
|
+
/**
|
|
33
|
+
* Call a tool with streaming support. Returns the final result.
|
|
34
|
+
* The onChunk callback is called for each intermediate progress chunk.
|
|
35
|
+
*/
|
|
36
|
+
callStreaming(tool: string, params: unknown, onChunk?: (chunk: StreamChunk) => void): Promise<unknown>;
|
|
18
37
|
private callOnce;
|
|
19
38
|
/**
|
|
20
39
|
* Verifica se il daemon è raggiungibile
|
|
21
40
|
*/
|
|
22
41
|
health(): Promise<boolean>;
|
|
23
42
|
}
|
|
43
|
+
export {};
|
|
24
44
|
//# sourceMappingURL=daemon-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-client.d.ts","sourceRoot":"","sources":["../src/daemon-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon-client.d.ts","sourceRoot":"","sources":["../src/daemon-client.ts"],"names":[],"mappings":"AAaA,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAK;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAQ;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAqD;gBAEhF,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAKnD,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAK/B;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB3D;;;OAGG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GACrC,OAAO,CAAC,OAAO,CAAC;YAkGL,QAAQ;IAiEtB;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAQjC"}
|
package/dist/daemon-client.js
CHANGED
|
@@ -43,6 +43,88 @@ export class DaemonClient {
|
|
|
43
43
|
}
|
|
44
44
|
throw lastError;
|
|
45
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Call a tool with streaming support. Returns the final result.
|
|
48
|
+
* The onChunk callback is called for each intermediate progress chunk.
|
|
49
|
+
*/
|
|
50
|
+
async callStreaming(tool, params, onChunk) {
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
const id = ++this.requestCounter;
|
|
53
|
+
const request = {
|
|
54
|
+
id,
|
|
55
|
+
tool,
|
|
56
|
+
params,
|
|
57
|
+
session_id: this.sessionId,
|
|
58
|
+
stream: true,
|
|
59
|
+
};
|
|
60
|
+
const requestLine = JSON.stringify(request) + "\n";
|
|
61
|
+
let client;
|
|
62
|
+
let responseBuffer = "";
|
|
63
|
+
let settled = false;
|
|
64
|
+
const timeout = setTimeout(() => {
|
|
65
|
+
if (!settled) {
|
|
66
|
+
settled = true;
|
|
67
|
+
client?.destroy();
|
|
68
|
+
reject(new Error(`Timeout: no streaming response from daemon for tool '${tool}' after 60s`));
|
|
69
|
+
}
|
|
70
|
+
}, 60_000); // Longer timeout for streaming
|
|
71
|
+
const settle = (fn) => {
|
|
72
|
+
if (!settled) {
|
|
73
|
+
settled = true;
|
|
74
|
+
clearTimeout(timeout);
|
|
75
|
+
fn();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
if (process.platform === "win32") {
|
|
79
|
+
client = net.createConnection(this.socketPath);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
client = net.createConnection({ path: this.socketPath });
|
|
83
|
+
}
|
|
84
|
+
client.on("connect", () => {
|
|
85
|
+
client.write(requestLine);
|
|
86
|
+
});
|
|
87
|
+
client.on("data", (data) => {
|
|
88
|
+
responseBuffer += data.toString();
|
|
89
|
+
// Process all complete lines
|
|
90
|
+
let newlineIndex;
|
|
91
|
+
while ((newlineIndex = responseBuffer.indexOf("\n")) !== -1) {
|
|
92
|
+
const line = responseBuffer.slice(0, newlineIndex);
|
|
93
|
+
responseBuffer = responseBuffer.slice(newlineIndex + 1);
|
|
94
|
+
if (!line.trim())
|
|
95
|
+
continue;
|
|
96
|
+
try {
|
|
97
|
+
const msg = JSON.parse(line);
|
|
98
|
+
if (msg.type === "chunk") {
|
|
99
|
+
onChunk?.(msg);
|
|
100
|
+
}
|
|
101
|
+
else if (msg.type === "result") {
|
|
102
|
+
client.destroy();
|
|
103
|
+
const resp = msg.response;
|
|
104
|
+
if (resp?.type === "response") {
|
|
105
|
+
settle(() => resolve(resp.result));
|
|
106
|
+
}
|
|
107
|
+
else if (resp?.type === "error") {
|
|
108
|
+
settle(() => reject(new Error(resp.message ?? "Daemon error")));
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
settle(() => resolve(resp));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Ignore unparseable lines
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
client.on("error", (err) => {
|
|
121
|
+
settle(() => reject(new Error(`Daemon connection error: ${err.message}. Is vexp daemon running?`)));
|
|
122
|
+
});
|
|
123
|
+
client.on("close", () => {
|
|
124
|
+
settle(() => reject(new Error("Daemon connection closed unexpectedly")));
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
}
|
|
46
128
|
async callOnce(tool, params) {
|
|
47
129
|
return new Promise((resolve, reject) => {
|
|
48
130
|
const id = ++this.requestCounter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../src/daemon-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../src/daemon-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/daemon-client.ts
CHANGED
|
@@ -8,6 +8,17 @@ interface SocketRequest {
|
|
|
8
8
|
tool: string;
|
|
9
9
|
params: unknown;
|
|
10
10
|
session_id?: string;
|
|
11
|
+
stream?: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface StreamChunk {
|
|
15
|
+
id: number;
|
|
16
|
+
type: "chunk" | "result";
|
|
17
|
+
step?: string;
|
|
18
|
+
steps_executed?: number;
|
|
19
|
+
steps_total?: number;
|
|
20
|
+
elapsed_ms?: number;
|
|
21
|
+
response?: SocketResponse;
|
|
11
22
|
}
|
|
12
23
|
|
|
13
24
|
interface SocketResponse {
|
|
@@ -64,6 +75,112 @@ export class DaemonClient {
|
|
|
64
75
|
throw lastError!;
|
|
65
76
|
}
|
|
66
77
|
|
|
78
|
+
/**
|
|
79
|
+
* Call a tool with streaming support. Returns the final result.
|
|
80
|
+
* The onChunk callback is called for each intermediate progress chunk.
|
|
81
|
+
*/
|
|
82
|
+
async callStreaming(
|
|
83
|
+
tool: string,
|
|
84
|
+
params: unknown,
|
|
85
|
+
onChunk?: (chunk: StreamChunk) => void
|
|
86
|
+
): Promise<unknown> {
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
const id = ++this.requestCounter;
|
|
89
|
+
const request: SocketRequest = {
|
|
90
|
+
id,
|
|
91
|
+
tool,
|
|
92
|
+
params,
|
|
93
|
+
session_id: this.sessionId,
|
|
94
|
+
stream: true,
|
|
95
|
+
};
|
|
96
|
+
const requestLine = JSON.stringify(request) + "\n";
|
|
97
|
+
|
|
98
|
+
let client: net.Socket;
|
|
99
|
+
let responseBuffer = "";
|
|
100
|
+
let settled = false;
|
|
101
|
+
|
|
102
|
+
const timeout = setTimeout(() => {
|
|
103
|
+
if (!settled) {
|
|
104
|
+
settled = true;
|
|
105
|
+
client?.destroy();
|
|
106
|
+
reject(
|
|
107
|
+
new Error(
|
|
108
|
+
`Timeout: no streaming response from daemon for tool '${tool}' after 60s`
|
|
109
|
+
)
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
}, 60_000); // Longer timeout for streaming
|
|
113
|
+
|
|
114
|
+
const settle = (fn: () => void) => {
|
|
115
|
+
if (!settled) {
|
|
116
|
+
settled = true;
|
|
117
|
+
clearTimeout(timeout);
|
|
118
|
+
fn();
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
if (process.platform === "win32") {
|
|
123
|
+
client = net.createConnection(this.socketPath);
|
|
124
|
+
} else {
|
|
125
|
+
client = net.createConnection({ path: this.socketPath });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
client.on("connect", () => {
|
|
129
|
+
client.write(requestLine);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
client.on("data", (data: Buffer) => {
|
|
133
|
+
responseBuffer += data.toString();
|
|
134
|
+
// Process all complete lines
|
|
135
|
+
let newlineIndex: number;
|
|
136
|
+
while ((newlineIndex = responseBuffer.indexOf("\n")) !== -1) {
|
|
137
|
+
const line = responseBuffer.slice(0, newlineIndex);
|
|
138
|
+
responseBuffer = responseBuffer.slice(newlineIndex + 1);
|
|
139
|
+
|
|
140
|
+
if (!line.trim()) continue;
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
const msg: StreamChunk = JSON.parse(line);
|
|
144
|
+
if (msg.type === "chunk") {
|
|
145
|
+
onChunk?.(msg);
|
|
146
|
+
} else if (msg.type === "result") {
|
|
147
|
+
client.destroy();
|
|
148
|
+
const resp = msg.response;
|
|
149
|
+
if (resp?.type === "response") {
|
|
150
|
+
settle(() => resolve(resp.result));
|
|
151
|
+
} else if (resp?.type === "error") {
|
|
152
|
+
settle(
|
|
153
|
+
() => reject(new Error(resp.message ?? "Daemon error"))
|
|
154
|
+
);
|
|
155
|
+
} else {
|
|
156
|
+
settle(() => resolve(resp));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
} catch {
|
|
160
|
+
// Ignore unparseable lines
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
client.on("error", (err: Error) => {
|
|
166
|
+
settle(
|
|
167
|
+
() =>
|
|
168
|
+
reject(
|
|
169
|
+
new Error(
|
|
170
|
+
`Daemon connection error: ${err.message}. Is vexp daemon running?`
|
|
171
|
+
)
|
|
172
|
+
)
|
|
173
|
+
);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
client.on("close", () => {
|
|
177
|
+
settle(
|
|
178
|
+
() => reject(new Error("Daemon connection closed unexpectedly"))
|
|
179
|
+
);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
67
184
|
private async callOnce(tool: string, params: unknown): Promise<unknown> {
|
|
68
185
|
return new Promise((resolve, reject) => {
|
|
69
186
|
const id = ++this.requestCounter;
|