@geohar/pi-mcp-combiner 0.14.3 → 0.16.0-dev.1
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/README.md +71 -48
- package/dist/client/config-ladder.d.ts +1 -1
- package/dist/client/config-ladder.d.ts.map +1 -1
- package/dist/client/control.d.ts +1 -1
- package/dist/client/control.d.ts.map +1 -1
- package/dist/client/elicitation.d.ts +4 -2
- package/dist/client/elicitation.d.ts.map +1 -1
- package/dist/client/elicitation.js +8 -2
- package/dist/client/elicitation.js.map +1 -1
- package/dist/client/footer.d.ts +1 -1
- package/dist/client/footer.d.ts.map +1 -1
- package/dist/client/panel.d.ts +1 -1
- package/dist/client/panel.d.ts.map +1 -1
- package/dist/client/panel.js +1 -1
- package/dist/client/panel.js.map +1 -1
- package/dist/client/prompts.d.ts +1 -1
- package/dist/client/prompts.d.ts.map +1 -1
- package/dist/client/proxy-tool.d.ts +1 -1
- package/dist/client/proxy-tool.d.ts.map +1 -1
- package/dist/client/resource-naming.d.ts +8 -0
- package/dist/client/resource-naming.d.ts.map +1 -0
- package/dist/client/resource-naming.js +33 -0
- package/dist/client/resource-naming.js.map +1 -0
- package/dist/client/settings.d.ts +5 -4
- package/dist/client/settings.d.ts.map +1 -1
- package/dist/client/settings.js +3 -3
- package/dist/client/settings.js.map +1 -1
- package/dist/client/tool-matching.d.ts +32 -0
- package/dist/client/tool-matching.d.ts.map +1 -0
- package/dist/client/tool-matching.js +43 -0
- package/dist/client/tool-matching.js.map +1 -0
- package/dist/client/types.d.ts +71 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +16 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/widget-support.d.ts +17 -0
- package/dist/client/widget-support.d.ts.map +1 -0
- package/dist/client/widget-support.js +89 -0
- package/dist/client/widget-support.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +109 -53
- package/dist/index.js.map +1 -1
- package/dist/{client/connection.d.ts → native/combiner-connection.d.ts} +46 -38
- package/dist/native/combiner-connection.d.ts.map +1 -0
- package/dist/native/combiner-connection.js +412 -0
- package/dist/native/combiner-connection.js.map +1 -0
- package/dist/native/index.d.ts +30 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +61 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/resources.d.ts +18 -0
- package/dist/native/resources.d.ts.map +1 -0
- package/dist/native/resources.js +97 -0
- package/dist/native/resources.js.map +1 -0
- package/dist/native/tool-surface.d.ts +26 -0
- package/dist/native/tool-surface.d.ts.map +1 -0
- package/dist/native/tool-surface.js +113 -0
- package/dist/native/tool-surface.js.map +1 -0
- package/dist/pi.d.ts +19 -0
- package/dist/pi.d.ts.map +1 -1
- package/package.json +3 -5
- package/src/client/config-ladder.ts +1 -1
- package/src/client/control.ts +1 -1
- package/src/client/elicitation.ts +10 -2
- package/src/client/footer.ts +1 -1
- package/src/client/panel.ts +2 -2
- package/src/client/prompts.ts +1 -1
- package/src/client/proxy-tool.ts +1 -1
- package/src/client/resource-naming.ts +36 -0
- package/src/client/settings.ts +7 -6
- package/src/client/tool-matching.ts +69 -0
- package/src/client/types.ts +80 -0
- package/src/client/widget-support.ts +86 -0
- package/src/index.ts +109 -65
- package/src/native/combiner-connection.ts +483 -0
- package/src/native/index.ts +100 -0
- package/src/native/resources.ts +112 -0
- package/src/native/tool-surface.ts +147 -0
- package/src/pi.ts +16 -0
- package/dist/client/connection.d.ts.map +0 -1
- package/dist/client/connection.js +0 -332
- package/dist/client/connection.js.map +0 -1
- package/dist/client/direct-tools.d.ts +0 -41
- package/dist/client/direct-tools.d.ts.map +0 -1
- package/dist/client/direct-tools.js +0 -122
- package/dist/client/direct-tools.js.map +0 -1
- package/dist/client/resources.d.ts +0 -20
- package/dist/client/resources.d.ts.map +0 -1
- package/dist/client/resources.js +0 -119
- package/dist/client/resources.js.map +0 -1
- package/dist/client/script.d.ts +0 -10
- package/dist/client/script.d.ts.map +0 -1
- package/dist/client/script.js +0 -130
- package/dist/client/script.js.map +0 -1
- package/src/client/connection.ts +0 -373
- package/src/client/direct-tools.ts +0 -146
- package/src/client/resources.ts +0 -137
- package/src/client/script.ts +0 -150
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
// NATIVE CONNECTION : the combiner MCP client rebuilt
|
|
2
|
+
// on @earendil-works/pi-mcp (peer dependency on pi's own published MCP package) so the
|
|
3
|
+
// connection is OURS and therefore the elicitation capability is OURS to declare:
|
|
4
|
+
//
|
|
5
|
+
// capabilities: { elicitation: {} } // advertised, because we CAN answer
|
|
6
|
+
// client.setRequestHandler("elicitation/create", …) // elicitation.ts bridge
|
|
7
|
+
//
|
|
8
|
+
// Everything else falls through to pi-mcp: transports, reconnection of dropped SSE
|
|
9
|
+
// streams, protocol negotiation, tool/resource listing with pagination, roots. We add
|
|
10
|
+
// only what the combiner needs on top: the per-Pi-session grouping token in the URL
|
|
11
|
+
// path, the optional inbound bearer, tools/prompts/resources caches, one stale-session
|
|
12
|
+
// retry, and the widget log-notification tap.
|
|
13
|
+
//
|
|
14
|
+
// CONTRACT: this class matches client/connection.ts's public surface structurally, so
|
|
15
|
+
// existing consumers (prompts.ts, resources.ts, footer.ts, panel.ts, control.ts) work
|
|
16
|
+
// unchanged and index.ts's mode gate can pick either implementation. The model-facing
|
|
17
|
+
// difference from the SDK client half is registration: see native/tool-surface.ts —
|
|
18
|
+
// tools are declared to pi NATIVELY (pi.registerTool with exposure/namespace), there is
|
|
19
|
+
// no mcp() proxy and no script tool.
|
|
20
|
+
//
|
|
21
|
+
// Why instantiate instead of wrapping: pi's built-in MCP extension owns its client
|
|
22
|
+
// instances privately; no hook reaches them (verified 0.99→1.0). Owning the connection
|
|
23
|
+
// is the only sanctioned way to advertise elicitation today. The two-switch upstream
|
|
24
|
+
// design (per-server config + handler-availability negotiation) remains the ecosystem
|
|
25
|
+
// endgame; this class is what the extension ships until and after that lands.
|
|
26
|
+
import { appendFileSync } from "node:fs";
|
|
27
|
+
import { McpClient, McpSessionExpiredError, StreamableHttpTransport } from "@earendil-works/pi-mcp";
|
|
28
|
+
import { handleElicitation } from "../client/elicitation.js";
|
|
29
|
+
function ncDbg(s) {
|
|
30
|
+
try {
|
|
31
|
+
appendFileSync("/tmp/pi-combiner-dbg.log", `${new Date().toISOString()} ${s}\n`);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// debug only
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const CLIENT_INFO = { name: "pi-mcp-combiner", version: "0.14.3" };
|
|
38
|
+
const CONNECT_TIMEOUT_MS = 8_000;
|
|
39
|
+
const LIST_CACHE_MS = 5_000;
|
|
40
|
+
function isRecord(v) {
|
|
41
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
42
|
+
}
|
|
43
|
+
/** Build the tokened endpoint URL: <origin>/mcp/<token> (identical to client/connection.ts). */
|
|
44
|
+
export function tokenedUrl(baseUrl, token) {
|
|
45
|
+
try {
|
|
46
|
+
const u = new URL(baseUrl);
|
|
47
|
+
const path = u.pathname.replace(/\/mcp(?:\/[^/]*)*\/?$/, "/mcp");
|
|
48
|
+
u.pathname = `${path.replace(/\/$/, "")}/${encodeURIComponent(token)}`;
|
|
49
|
+
return u.toString();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return baseUrl;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export class NativeCombinerConnection {
|
|
56
|
+
conn;
|
|
57
|
+
log;
|
|
58
|
+
elicitUi = { hasUI: false };
|
|
59
|
+
token;
|
|
60
|
+
client;
|
|
61
|
+
connecting;
|
|
62
|
+
tools;
|
|
63
|
+
toolsFetchedAt = 0;
|
|
64
|
+
prompts;
|
|
65
|
+
promptsFetchedAt = 0;
|
|
66
|
+
resources;
|
|
67
|
+
resourcesFetchedAt = 0;
|
|
68
|
+
hooks = {};
|
|
69
|
+
state = "disconnected";
|
|
70
|
+
lastError;
|
|
71
|
+
constructor(conn, log) {
|
|
72
|
+
this.conn = conn;
|
|
73
|
+
this.log = log;
|
|
74
|
+
}
|
|
75
|
+
setHooks(hooks) {
|
|
76
|
+
this.hooks = hooks;
|
|
77
|
+
}
|
|
78
|
+
/** Effective grouping token for this session (explicit URL token wins). */
|
|
79
|
+
get sessionToken() {
|
|
80
|
+
return this.effectiveToken();
|
|
81
|
+
}
|
|
82
|
+
/** Bind the UI slice used by elicitation (called from session_start). */
|
|
83
|
+
bindUi(ui) {
|
|
84
|
+
this.elicitUi = ui;
|
|
85
|
+
}
|
|
86
|
+
/** Swap connection inputs (base URL / bearer env); drops the client when changed. */
|
|
87
|
+
rebind(conn) {
|
|
88
|
+
if (conn.baseUrl === this.conn.baseUrl &&
|
|
89
|
+
conn.bearerTokenEnv === this.conn.bearerTokenEnv &&
|
|
90
|
+
conn.urlToken === this.conn.urlToken) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
this.conn = conn;
|
|
94
|
+
void this.reset("connection rebound (session config changed)");
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
/** Set the grouping token for this session; resets any open connection. */
|
|
98
|
+
setToken(token) {
|
|
99
|
+
if (this.token === token)
|
|
100
|
+
return;
|
|
101
|
+
this.token = token;
|
|
102
|
+
void this.reset("token changed");
|
|
103
|
+
}
|
|
104
|
+
/** Drop the connection + caches (session reset / shutdown). Never throws. */
|
|
105
|
+
async reset(reason) {
|
|
106
|
+
const client = this.client;
|
|
107
|
+
this.client = undefined;
|
|
108
|
+
this.connecting = undefined;
|
|
109
|
+
this.tools = undefined;
|
|
110
|
+
this.prompts = undefined;
|
|
111
|
+
this.resources = undefined;
|
|
112
|
+
this.state = "disconnected";
|
|
113
|
+
try {
|
|
114
|
+
await client?.close();
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// best-effort
|
|
118
|
+
}
|
|
119
|
+
if (reason)
|
|
120
|
+
this.log("info", `connection reset (${reason})`);
|
|
121
|
+
}
|
|
122
|
+
effectiveToken() {
|
|
123
|
+
return this.conn.urlToken ?? this.token;
|
|
124
|
+
}
|
|
125
|
+
/** Connect (idempotent, single-flight). THE elicitation-relevant site: the
|
|
126
|
+
* capability + request handler live HERE, on a client we own. */
|
|
127
|
+
async ensureConnected() {
|
|
128
|
+
if (this.client)
|
|
129
|
+
return this.client;
|
|
130
|
+
if (this.connecting)
|
|
131
|
+
return this.connecting;
|
|
132
|
+
const token = this.effectiveToken();
|
|
133
|
+
if (!token)
|
|
134
|
+
throw new Error("no grouping token set (session not started)");
|
|
135
|
+
const endpoint = tokenedUrl(this.conn.baseUrl, token);
|
|
136
|
+
let url;
|
|
137
|
+
try {
|
|
138
|
+
url = new URL(endpoint);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
throw new Error(`combiner URL "${endpoint}" is not parseable; set a valid url (…/mcp) in settings or mcp.json`);
|
|
142
|
+
}
|
|
143
|
+
const bearer = this.conn.bearerTokenEnv ? process.env[this.conn.bearerTokenEnv] : undefined;
|
|
144
|
+
this.state = "connecting";
|
|
145
|
+
this.connecting = (async () => {
|
|
146
|
+
const client = new McpClient({
|
|
147
|
+
name: CLIENT_INFO.name,
|
|
148
|
+
version: CLIENT_INFO.version,
|
|
149
|
+
// Advertised elicitation — the combiner's permission gate depends on it,
|
|
150
|
+
// and our handler below CAN answer (decline when no dialog UI exists).
|
|
151
|
+
capabilities: { elicitation: {} },
|
|
152
|
+
// Widget holds keep a call in flight up to MCP_COMBINER_UI_HOLD_TIMEOUT
|
|
153
|
+
// (default 50s combiner-side); 90s headroom so the native call outlives it.
|
|
154
|
+
requestTimeoutMs: 90_000,
|
|
155
|
+
});
|
|
156
|
+
client.setRequestHandler("elicitation/create", async (raw, { signal }) => {
|
|
157
|
+
const params = isRecord(raw) ? raw : undefined;
|
|
158
|
+
const message = typeof params?.message === "string" ? params.message : undefined;
|
|
159
|
+
const requestedSchema = isRecord(params?.requestedSchema) ? params?.requestedSchema : undefined;
|
|
160
|
+
if (!message && !requestedSchema)
|
|
161
|
+
return { action: "decline" };
|
|
162
|
+
const result = await handleElicitation({ message, requestedSchema }, this.elicitUi, signal);
|
|
163
|
+
return result;
|
|
164
|
+
});
|
|
165
|
+
// pi-mcp's onNotification listeners receive the notification PARAMS directly
|
|
166
|
+
// (not the raw envelope) — params shape for notifications/message is
|
|
167
|
+
// { level, logger, data }.
|
|
168
|
+
client.onNotification("notifications/tools/list_changed", () => {
|
|
169
|
+
this.tools = undefined;
|
|
170
|
+
this.prompts = undefined;
|
|
171
|
+
this.resources = undefined;
|
|
172
|
+
try {
|
|
173
|
+
this.hooks.onToolsChanged?.();
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// hook errors must never break the notification path
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
client.onNotification("notifications/resources/list_changed", () => {
|
|
180
|
+
this.resources = undefined;
|
|
181
|
+
try {
|
|
182
|
+
this.hooks.onToolsChanged?.();
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// hook errors must never break the notification path
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
// Widget hold announces its UI URL via a log notification mid-flight.
|
|
189
|
+
client.onNotification("notifications/message", (params) => {
|
|
190
|
+
const data = (isRecord(params) ? params.data : undefined);
|
|
191
|
+
if (typeof data !== "string")
|
|
192
|
+
return;
|
|
193
|
+
const m = data.match(/Interactive UI ready: (\S+)/);
|
|
194
|
+
if (m) {
|
|
195
|
+
try {
|
|
196
|
+
this.hooks.onWidgetUrl?.(m[1]);
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// hook errors must never break the notification path
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
client.onClose(() => {
|
|
204
|
+
if (this.client === client) {
|
|
205
|
+
this.client = undefined;
|
|
206
|
+
this.state = "disconnected";
|
|
207
|
+
this.hooks.onStateChange?.(this.state);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
const transport = new StreamableHttpTransport({
|
|
211
|
+
url,
|
|
212
|
+
authProvider: bearer ? { token: async () => bearer } : undefined,
|
|
213
|
+
});
|
|
214
|
+
await Promise.race([
|
|
215
|
+
client.connect(transport),
|
|
216
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("connect timeout")), CONNECT_TIMEOUT_MS)),
|
|
217
|
+
]);
|
|
218
|
+
this.client = client;
|
|
219
|
+
ncDbg(`ensureConnected: CONNECTED session=${client.sessionId ?? "?"} state=${client.transport?.sessionId ?? "?"}`);
|
|
220
|
+
this.state = "connected";
|
|
221
|
+
this.lastError = undefined;
|
|
222
|
+
// Catch-up after (re)connect — same rationale as client/connection.ts:
|
|
223
|
+
// MCP notifications are lossy for disconnected clients, so re-sync every
|
|
224
|
+
// surface the moment the stream is live again. Idempotent upstream.
|
|
225
|
+
try {
|
|
226
|
+
this.hooks.onToolsChanged?.();
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// hook errors must never break the connect path
|
|
230
|
+
}
|
|
231
|
+
this.hooks.onStateChange?.(this.state);
|
|
232
|
+
return client;
|
|
233
|
+
})();
|
|
234
|
+
try {
|
|
235
|
+
return await this.connecting;
|
|
236
|
+
}
|
|
237
|
+
catch (e) {
|
|
238
|
+
this.state = "failed";
|
|
239
|
+
this.lastError = e instanceof Error ? e.message : String(e);
|
|
240
|
+
this.log("warn", `combiner connect failed (${this.lastError})`);
|
|
241
|
+
this.hooks.onStateChange?.(this.state);
|
|
242
|
+
throw new Error(`cannot reach the combiner at ${this.conn.baseUrl}: ${this.lastError} — the combiner may have restarted; this call did not run and is safe to retry (carried state: grants, filters, parked sessions survives restarts)`);
|
|
243
|
+
}
|
|
244
|
+
finally {
|
|
245
|
+
this.connecting = undefined;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/** One-shot stale-session retry shared by EVERY request method — a combiner
|
|
249
|
+
* bounce invalidates the transport session, and the first operation to notice
|
|
250
|
+
* can be any of them (the router's listTools lookup runs BEFORE callTool;
|
|
251
|
+
* without this it surfaced raw McpSessionExpiredError and never reset the
|
|
252
|
+
* client, wedging the connection until reload). Same classification as
|
|
253
|
+
* callTool: the typed McpSessionExpiredError first, the message regex as belt. */
|
|
254
|
+
async withStaleRetry(label, op) {
|
|
255
|
+
const client = await this.ensureConnected();
|
|
256
|
+
try {
|
|
257
|
+
return await op(client);
|
|
258
|
+
}
|
|
259
|
+
catch (e) {
|
|
260
|
+
const typedStale = e instanceof McpSessionExpiredError;
|
|
261
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
262
|
+
ncDbg(`${label} THROW typed=${typedStale} ${msg.slice(0, 140)}`);
|
|
263
|
+
const stale = typedStale || /404|stale|session|not found|closed|fetch failed|illegal/i.test(msg);
|
|
264
|
+
if (!stale)
|
|
265
|
+
throw e;
|
|
266
|
+
ncDbg(`${label} stale-retry FIRED`);
|
|
267
|
+
this.log("info", `${label} went stale (${msg}); reconnecting once`);
|
|
268
|
+
await this.reset("stale session");
|
|
269
|
+
return await op(await this.ensureConnected());
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/** tools/list, cached until invalidated (list_changed / reset / reconnect).
|
|
273
|
+
* pi-mcp returns the tools array directly (pagination already resolved). */
|
|
274
|
+
async listTools(force = false) {
|
|
275
|
+
if (!force && this.tools && Date.now() - this.toolsFetchedAt < LIST_CACHE_MS)
|
|
276
|
+
return this.tools;
|
|
277
|
+
const client = await this.ensureConnected();
|
|
278
|
+
const tools = (await this.withStaleRetry("listTools", (c) => c.listTools())).map((t) => ({
|
|
279
|
+
name: t.name,
|
|
280
|
+
description: t.description,
|
|
281
|
+
inputSchema: t.inputSchema,
|
|
282
|
+
annotations: t.annotations,
|
|
283
|
+
}));
|
|
284
|
+
this.tools = tools;
|
|
285
|
+
this.toolsFetchedAt = Date.now();
|
|
286
|
+
return tools;
|
|
287
|
+
}
|
|
288
|
+
/** prompts/list, cached alongside tools. pi-mcp has no prompts convenience (yet);
|
|
289
|
+
* the generic request() is the sanctioned path for server-initiated methods the
|
|
290
|
+
* client doesn't model. */
|
|
291
|
+
async listPrompts(force = false) {
|
|
292
|
+
if (!force && this.prompts && Date.now() - this.promptsFetchedAt < LIST_CACHE_MS)
|
|
293
|
+
return this.prompts;
|
|
294
|
+
const res = await this.withStaleRetry("listPrompts", (c) => c.request("prompts/list"));
|
|
295
|
+
this.prompts = res.prompts ?? [];
|
|
296
|
+
this.promptsFetchedAt = Date.now();
|
|
297
|
+
return this.prompts;
|
|
298
|
+
}
|
|
299
|
+
/** prompts/get through the combiner. */
|
|
300
|
+
async getPrompt(name, args) {
|
|
301
|
+
return this.withStaleRetry(`getPrompt ${name}`, (c) => c.request("prompts/get", { name, arguments: args }));
|
|
302
|
+
}
|
|
303
|
+
/** resources/list, cached alongside tools/prompts.
|
|
304
|
+
* SAFETY: pi-mcp's Resource adds typed `_meta` variance the combiner surfaces as
|
|
305
|
+
* Record<string, unknown> — the shapes agree on the fields we consume
|
|
306
|
+
* (uri/name/description/mimeType), so the cast narrows only metadata typing. */
|
|
307
|
+
async listResources(force = false) {
|
|
308
|
+
if (!force && this.resources && Date.now() - this.resourcesFetchedAt < LIST_CACHE_MS)
|
|
309
|
+
return this.resources;
|
|
310
|
+
const resources = (await this.withStaleRetry("listResources", (c) => c.listResources()));
|
|
311
|
+
this.resources = resources;
|
|
312
|
+
this.resourcesFetchedAt = Date.now();
|
|
313
|
+
return resources;
|
|
314
|
+
}
|
|
315
|
+
/** resources/read through the combiner. */
|
|
316
|
+
async readResource(uri) {
|
|
317
|
+
return this.withStaleRetry(`readResource ${uri}`, (c) => c.readResource(uri));
|
|
318
|
+
}
|
|
319
|
+
/** callTool with one stale-session retry (combiner bounce; handover keeps token).
|
|
320
|
+
* A server-marked error (CallToolResult.isError) THROWS so pi records the call
|
|
321
|
+
* as a tool error — same convention the rest of the extension uses. */
|
|
322
|
+
async callTool(name, args) {
|
|
323
|
+
const attempt = async () => {
|
|
324
|
+
const client = await this.ensureConnected();
|
|
325
|
+
const result = await client.callTool(name, args);
|
|
326
|
+
if (result.isError) {
|
|
327
|
+
const text = (result.content ?? [])
|
|
328
|
+
.map((b) => (isRecord(b) && b.type === "text" && typeof b.text === "string" ? b.text : JSON.stringify(b)))
|
|
329
|
+
.filter(Boolean)
|
|
330
|
+
.join("\n");
|
|
331
|
+
throw new Error(`combiner tool error (${name}): ${text}`);
|
|
332
|
+
}
|
|
333
|
+
return result;
|
|
334
|
+
};
|
|
335
|
+
try {
|
|
336
|
+
return await attempt();
|
|
337
|
+
}
|
|
338
|
+
catch (e) {
|
|
339
|
+
// pi-mcp raises a TYPED McpSessionExpiredError on 404-with-session-id (the
|
|
340
|
+
// combiner's stale-session 404) — catch it first-class, exactly like pi's
|
|
341
|
+
// own builtin does ("retry once on a new session; the old client is
|
|
342
|
+
// detached, not closed, so other in-flight calls get their own 404 and
|
|
343
|
+
// retry the same way"). The message regex stays as a belt for anything
|
|
344
|
+
// the transport doesn't classify.
|
|
345
|
+
const typedStale = e instanceof McpSessionExpiredError;
|
|
346
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
347
|
+
ncDbg(`callTool ${name} THROW typed=${typedStale} status=${e?.status} ${msg.slice(0, 140)}`);
|
|
348
|
+
const stale = typedStale || /404|stale|session|not found|closed|fetch failed|illegal/i.test(msg);
|
|
349
|
+
if (!stale)
|
|
350
|
+
throw e;
|
|
351
|
+
ncDbg(`callTool ${name} stale-retry FIRED`);
|
|
352
|
+
this.log("info", `call "${name}" went stale (${typedStale ? "session expired (typed)" : msg}); reconnecting once`);
|
|
353
|
+
await this.reset("stale session");
|
|
354
|
+
ncDbg(`callTool ${name} reset done; retrying`);
|
|
355
|
+
try {
|
|
356
|
+
const result = await attempt();
|
|
357
|
+
ncDbg(`callTool ${name} RETRY SUCCEEDED`);
|
|
358
|
+
return result;
|
|
359
|
+
}
|
|
360
|
+
catch (e2) {
|
|
361
|
+
ncDbg(`callTool ${name} RETRY FAILED: ${e2 instanceof Error ? e2.message : String(e2)}`);
|
|
362
|
+
throw e2;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// ── control plane (unchanged from client/connection.ts) ─────────────────────────
|
|
367
|
+
controlOrigin() {
|
|
368
|
+
try {
|
|
369
|
+
return new URL(this.conn.baseUrl).origin;
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
return this.conn.baseUrl;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
uiUrlFor(resourceUri) {
|
|
376
|
+
const token = this.effectiveToken();
|
|
377
|
+
if (!token || !resourceUri)
|
|
378
|
+
return "";
|
|
379
|
+
return `${this.controlOrigin()}/ui/${encodeURIComponent(token)}/?resource=${encodeURIComponent(resourceUri)}`;
|
|
380
|
+
}
|
|
381
|
+
controlHeaders() {
|
|
382
|
+
const token = this.conn.bearerTokenEnv ? process.env[this.conn.bearerTokenEnv] : undefined;
|
|
383
|
+
return token ? { authorization: `Bearer ${token}` } : {};
|
|
384
|
+
}
|
|
385
|
+
async applyFilter(filter) {
|
|
386
|
+
const token = this.effectiveToken();
|
|
387
|
+
if (!token)
|
|
388
|
+
throw new Error("no grouping token set (session not started)");
|
|
389
|
+
const body = {};
|
|
390
|
+
if (filter.allow?.length)
|
|
391
|
+
body.allowed_servers = filter.allow;
|
|
392
|
+
else if (filter.deny?.length)
|
|
393
|
+
body.disabled_servers = filter.deny;
|
|
394
|
+
else
|
|
395
|
+
return;
|
|
396
|
+
const res = await fetch(`${this.controlOrigin()}/sessions/token/${encodeURIComponent(token)}/filter`, {
|
|
397
|
+
method: "POST",
|
|
398
|
+
headers: { "content-type": "application/json", ...this.controlHeaders() },
|
|
399
|
+
body: JSON.stringify(body),
|
|
400
|
+
});
|
|
401
|
+
if (!res.ok)
|
|
402
|
+
throw new Error(`filter apply failed: ${res.status} ${await res.text().catch(() => "")}`);
|
|
403
|
+
this.log("info", `session server filter applied (${filter.allow ? "allow" : "deny"}-list)`);
|
|
404
|
+
}
|
|
405
|
+
async health() {
|
|
406
|
+
const res = await fetch(`${this.controlOrigin()}/health`, { headers: this.controlHeaders() });
|
|
407
|
+
if (!res.ok)
|
|
408
|
+
throw new Error(`/health returned ${res.status}`);
|
|
409
|
+
return res.json();
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=combiner-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combiner-connection.js","sourceRoot":"","sources":["../../src/native/combiner-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ExtensionAPI, ExtensionContext } from "../pi.js";
|
|
2
|
+
import type { ServerFilter } from "../client/config-ladder.js";
|
|
3
|
+
import { NativeCombinerConnection } from "./combiner-connection.js";
|
|
4
|
+
export { NativeCombinerConnection } from "./combiner-connection.js";
|
|
5
|
+
export { activateNativeTools, type NativeToolSurfaceOptions } from "./tool-surface.js";
|
|
6
|
+
export { tokenedUrl } from "./combiner-connection.js";
|
|
7
|
+
export { activateNativeResources, filterInteractiveResources, type NativeResourceOptions } from "./resources.js";
|
|
8
|
+
export type NativeActivationOptions = {
|
|
9
|
+
connection: NativeCombinerConnection;
|
|
10
|
+
directSpec?: string[] | "search";
|
|
11
|
+
serverFilter?: ServerFilter;
|
|
12
|
+
/** Register the interactive read_<resource> tools (index.ts's exposeResources
|
|
13
|
+
* setting); default true. */
|
|
14
|
+
exposeResources?: boolean;
|
|
15
|
+
/** Auto-open widget URLs (index.ts's uiAutoOpen setting); default true. */
|
|
16
|
+
uiAutoOpen?: boolean;
|
|
17
|
+
/** Warn when the direct-exposure set grows large; settings kill-switch
|
|
18
|
+
* warnLargeDirectExposure disables it (default true, i.e. warn). */
|
|
19
|
+
warnLargeDirectExposure?: boolean;
|
|
20
|
+
log: (level: "info" | "warn" | "error", message: string) => void;
|
|
21
|
+
};
|
|
22
|
+
/** Register the declared tool surface + interactive-resource read_* tools + the
|
|
23
|
+
* list_changed re-registration handler. Called once at session_start; the
|
|
24
|
+
* list_changed hook re-syncs both surfaces on the same names. */
|
|
25
|
+
export declare function activateNativeMode(pi: ExtensionAPI, opts: NativeActivationOptions): {
|
|
26
|
+
run(): void;
|
|
27
|
+
dispose(): void;
|
|
28
|
+
};
|
|
29
|
+
export type { ExtensionContext };
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAInE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAEhH,MAAM,MAAM,uBAAuB,GAAG;IAClC,UAAU,EAAE,wBAAwB,CAAA;IACpC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAA;IAChC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;kCAC8B;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;yEACqE;IACrE,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACnE,CAAA;AAED;;kEAEkE;AAClE,wBAAgB,kBAAkB,CAC9B,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,uBAAuB,GAC9B;IAAE,GAAG,IAAI,IAAI,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE,CAwClC;AAaD,YAAY,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// NATIVE MODE : activation entry for the
|
|
2
|
+
// pi-mcp-based combiner connection + native tool surface. This file exists so the
|
|
3
|
+
// wire-in stays a few lines in src/index.ts's mode gate while the shape is reviewed:
|
|
4
|
+
//
|
|
5
|
+
// const native = settings.integration === "nativeTools" // new tri-state member
|
|
6
|
+
// const conn = native ? new NativeCombinerConnection(…, clientLog) // same contract
|
|
7
|
+
// : new CombinerConnection(…, clientLog)
|
|
8
|
+
// if (native) void activateNativeTools(pi, { connection: conn, ... }) as needed
|
|
9
|
+
//
|
|
10
|
+
// Mode matrix (the native-migration plan item):: extension-owned connection (peer dep on @earendil-works/pi-mcp) + native
|
|
11
|
+
// tool declaration via pi.registerTool(exposure/namespace/annotations) = native
|
|
12
|
+
// exposure with elicitation STILL ANSWERED (capability advertised on the owned
|
|
13
|
+
// connection) — no mcp() proxy, no script tool, no upstream PR required for v1.
|
|
14
|
+
import { activateNativeTools } from "./tool-surface.js";
|
|
15
|
+
import { activateNativeResources } from "./resources.js";
|
|
16
|
+
export { NativeCombinerConnection } from "./combiner-connection.js";
|
|
17
|
+
export { activateNativeTools } from "./tool-surface.js";
|
|
18
|
+
export { tokenedUrl } from "./combiner-connection.js";
|
|
19
|
+
export { activateNativeResources, filterInteractiveResources } from "./resources.js";
|
|
20
|
+
/** Register the declared tool surface + interactive-resource read_* tools + the
|
|
21
|
+
* list_changed re-registration handler. Called once at session_start; the
|
|
22
|
+
* list_changed hook re-syncs both surfaces on the same names. */
|
|
23
|
+
export function activateNativeMode(pi, opts) {
|
|
24
|
+
const resourceRegistered = new Set();
|
|
25
|
+
let active = true;
|
|
26
|
+
const resourceOpts = {
|
|
27
|
+
connection: opts.connection,
|
|
28
|
+
serverFilter: opts.serverFilter,
|
|
29
|
+
uiAutoOpen: opts.uiAutoOpen,
|
|
30
|
+
log: opts.log,
|
|
31
|
+
};
|
|
32
|
+
const run = () => {
|
|
33
|
+
if (!active)
|
|
34
|
+
return;
|
|
35
|
+
void activateNativeTools(pi, {
|
|
36
|
+
connection: opts.connection,
|
|
37
|
+
serverFilter: opts.serverFilter,
|
|
38
|
+
directSpec: opts.directSpec,
|
|
39
|
+
warnLargeDirectExposure: opts.warnLargeDirectExposure,
|
|
40
|
+
log: opts.log,
|
|
41
|
+
}).catch((e) => opts.log("warn", `native tool surface failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
42
|
+
if (opts.exposeResources !== false) {
|
|
43
|
+
void activateNativeResources(pi, resourceOpts, resourceRegistered).catch((e) => opts.log("warn", `native resource surface failed: ${e instanceof Error ? e.message : String(e)}`));
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
// The FIRST run is the caller's to schedule: the grouping token only exists
|
|
47
|
+
// after session_start (the connection refuses to connect without it), so a
|
|
48
|
+
// factory-time run() would fail with "no grouping token set" — the startup
|
|
49
|
+
// warnings this signature used to emit. index.ts calls run() at
|
|
50
|
+
// session_start (post-setToken) and from its own onToolsChanged hook; we
|
|
51
|
+
// deliberately do NOT setHooks here — a second setHooks call from the
|
|
52
|
+
// wiring would replace ours wholesale (last-wins), so the re-sync lives in
|
|
53
|
+
// ONE hook set, index.ts's.
|
|
54
|
+
return {
|
|
55
|
+
run,
|
|
56
|
+
dispose() {
|
|
57
|
+
active = false;
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,kFAAkF;AAClF,qFAAqF;AACrF,EAAE;AACF,oFAAoF;AACpF,wFAAwF;AACxF,gEAAgE;AAChE,kFAAkF;AAClF,EAAE;AACF,0HAA0H;AAC1H,gFAAgF;AAChF,+EAA+E;AAC/E,gFAAgF;AAKhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAExD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAiC,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAA8B,MAAM,gBAAgB,CAAA;AAiBhH;;kEAEkE;AAClE,MAAM,UAAU,kBAAkB,CAC9B,EAAgB,EAChB,IAA6B;IAE7B,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAA;IAC5C,IAAI,MAAM,GAAG,IAAI,CAAA;IACjB,MAAM,YAAY,GAAG;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,EAAE,IAAI,CAAC,GAAG;KAChB,CAAA;IACD,MAAM,GAAG,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,KAAK,mBAAmB,CAAC,EAAE,EAAE;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,GAAG,EAAE,IAAI,CAAC,GAAG;SAChB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACX,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,+BAA+B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAChG,CAAA;QACD,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;YACjC,KAAK,uBAAuB,CAAC,EAAE,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3E,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,mCAAmC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CACpG,CAAA;QACL,CAAC;IACL,CAAC,CAAA;IACD,4EAA4E;IAC5E,2EAA2E;IAC3E,2EAA2E;IAC3E,gEAAgE;IAChE,yEAAyE;IACzE,sEAAsE;IACtE,2EAA2E;IAC3E,4BAA4B;IAC5B,OAAO;QACH,GAAG;QACH,OAAO;YACH,MAAM,GAAG,KAAK,CAAA;QAClB,CAAC;KACJ,CAAA;AACL,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "../pi.js";
|
|
2
|
+
import type { NativeCombinerConnection, ResourceSummary } from "./combiner-connection.js";
|
|
3
|
+
import type { ServerFilter } from "../client/config-ladder.js";
|
|
4
|
+
export type NativeResourceOptions = {
|
|
5
|
+
connection: NativeCombinerConnection;
|
|
6
|
+
/** Per-project server filter, same semantics as legacy filterResources. */
|
|
7
|
+
serverFilter?: ServerFilter;
|
|
8
|
+
/** Auto-open the widget URL on read (index.ts's uiAutoOpen setting). */
|
|
9
|
+
uiAutoOpen?: boolean;
|
|
10
|
+
log: (level: "info" | "warn" | "error", message: string) => void;
|
|
11
|
+
};
|
|
12
|
+
/** Project server filter for resources — mirrors legacy filterResources
|
|
13
|
+
* attribution semantics (uri host first, `<server>_` name-prefix fallback). */
|
|
14
|
+
export declare function filterInteractiveResources(resources: ResourceSummary[], filter: ServerFilter | undefined): ResourceSummary[];
|
|
15
|
+
/** Register read_* tools for the interactive resources (idempotent, like legacy).
|
|
16
|
+
* Returns the tool names registered this pass. */
|
|
17
|
+
export declare function activateNativeResources(pi: ExtensionAPI, opts: NativeResourceOptions, registered: Set<string>): Promise<string[]>;
|
|
18
|
+
//# sourceMappingURL=resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/native/resources.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,UAAU,CAAA;AAC5D,OAAO,KAAK,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAGzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,MAAM,MAAM,qBAAqB,GAAG;IAChC,UAAU,EAAE,wBAAwB,CAAA;IACpC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,wEAAwE;IACxE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACnE,CAAA;AAED;gFACgF;AAChF,wBAAgB,0BAA0B,CACtC,SAAS,EAAE,eAAe,EAAE,EAC5B,MAAM,EAAE,YAAY,GAAG,SAAS,GACjC,eAAe,EAAE,CAUnB;AAoCD;mDACmD;AACnD,wBAAsB,uBAAuB,CACzC,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,qBAAqB,EAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB"}
|