pi-kot 0.1.2 → 0.1.4

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.
Files changed (48) hide show
  1. package/README.md +1 -1
  2. package/dist/client/assets/index-DKuFpehe.css +1 -0
  3. package/dist/client/assets/{index-UJgsBs6a.js → index-DXO0I7ud.js} +75 -75
  4. package/dist/client/assets/index-DXO0I7ud.js.map +1 -0
  5. package/dist/client/index.html +2 -2
  6. package/dist/server/config.d.ts +3 -0
  7. package/dist/server/config.d.ts.map +1 -1
  8. package/dist/server/config.js +3 -0
  9. package/dist/server/config.js.map +1 -1
  10. package/dist/server/index.d.ts.map +1 -1
  11. package/dist/server/index.js +8 -0
  12. package/dist/server/index.js.map +1 -1
  13. package/dist/server/mcp/config.d.ts +23 -0
  14. package/dist/server/mcp/config.d.ts.map +1 -0
  15. package/dist/server/mcp/config.js +139 -0
  16. package/dist/server/mcp/config.js.map +1 -0
  17. package/dist/server/mcp/manager.d.ts +40 -0
  18. package/dist/server/mcp/manager.d.ts.map +1 -0
  19. package/dist/server/mcp/manager.js +435 -0
  20. package/dist/server/mcp/manager.js.map +1 -0
  21. package/dist/server/mcp/stdio-trust.d.ts +5 -0
  22. package/dist/server/mcp/stdio-trust.d.ts.map +1 -0
  23. package/dist/server/mcp/stdio-trust.js +78 -0
  24. package/dist/server/mcp/stdio-trust.js.map +1 -0
  25. package/dist/server/mcp/tool-bridge.d.ts +33 -0
  26. package/dist/server/mcp/tool-bridge.d.ts.map +1 -0
  27. package/dist/server/mcp/tool-bridge.js +138 -0
  28. package/dist/server/mcp/tool-bridge.js.map +1 -0
  29. package/dist/server/routes/config.d.ts.map +1 -1
  30. package/dist/server/routes/config.js +137 -0
  31. package/dist/server/routes/config.js.map +1 -1
  32. package/dist/server/routes/mcp.d.ts +3 -0
  33. package/dist/server/routes/mcp.d.ts.map +1 -0
  34. package/dist/server/routes/mcp.js +387 -0
  35. package/dist/server/routes/mcp.js.map +1 -0
  36. package/dist/server/routes/sessions.d.ts.map +1 -1
  37. package/dist/server/routes/sessions.js +60 -0
  38. package/dist/server/routes/sessions.js.map +1 -1
  39. package/dist/server/session-registry.d.ts.map +1 -1
  40. package/dist/server/session-registry.js +28 -0
  41. package/dist/server/session-registry.js.map +1 -1
  42. package/dist/server/tool-overrides.d.ts +39 -0
  43. package/dist/server/tool-overrides.d.ts.map +1 -0
  44. package/dist/server/tool-overrides.js +121 -0
  45. package/dist/server/tool-overrides.js.map +1 -0
  46. package/package.json +2 -1
  47. package/dist/client/assets/index-UJgsBs6a.js.map +0 -1
  48. package/dist/client/assets/index-ZuTc_0YY.css +0 -1
@@ -0,0 +1,435 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
4
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
5
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
6
+ import { getDefaultEnvironment, StdioClientTransport, } from "@modelcontextprotocol/sdk/client/stdio.js";
7
+ import { isStdioConfig, readMcpJson } from "./config.js";
8
+ import { isStdioTrustedForProject } from "./stdio-trust.js";
9
+ import { bridgeMcpTool } from "./tool-bridge.js";
10
+ const PROJECT_MCP_FILE = ".mcp.json";
11
+ function entryKey(scope, name) {
12
+ return scope === "global" ? `global::${name}` : `project:${scope.project}::${name}`;
13
+ }
14
+ const pool = new Map();
15
+ const loadedProjects = new Set();
16
+ let globallyEnabled = true;
17
+ let globalLoaded = false;
18
+ let globalLoadPromise;
19
+ export function isGloballyEnabled() {
20
+ return globallyEnabled;
21
+ }
22
+ export async function loadGlobal() {
23
+ if (globalLoadPromise !== undefined)
24
+ return globalLoadPromise;
25
+ globalLoadPromise = loadGlobalNow();
26
+ try {
27
+ await globalLoadPromise;
28
+ }
29
+ finally {
30
+ globalLoadPromise = undefined;
31
+ }
32
+ }
33
+ export async function ensureGlobalLoaded() {
34
+ if (globalLoaded)
35
+ return;
36
+ await loadGlobal();
37
+ }
38
+ async function loadGlobalNow() {
39
+ const cfg = await readMcpJson();
40
+ globallyEnabled = cfg.disabled !== true;
41
+ await syncScope("global", cfg.servers);
42
+ globalLoaded = true;
43
+ }
44
+ export async function loadProject(projectId, projectPath) {
45
+ cachedProjectPaths.set(projectId, projectPath);
46
+ const cfg = await readProjectMcpJson(projectPath);
47
+ await syncScope({ project: projectId }, cfg);
48
+ loadedProjects.add(projectId);
49
+ }
50
+ export async function ensureProjectLoaded(projectId, projectPath) {
51
+ if (loadedProjects.has(projectId))
52
+ return;
53
+ await loadProject(projectId, projectPath);
54
+ }
55
+ export async function reloadGlobal() {
56
+ loadedProjects.clear();
57
+ globalLoadPromise = loadGlobalNow();
58
+ try {
59
+ await globalLoadPromise;
60
+ }
61
+ finally {
62
+ globalLoadPromise = undefined;
63
+ }
64
+ }
65
+ export function customToolsForProject(projectId) {
66
+ const projectServerNames = new Set();
67
+ for (const e of pool.values()) {
68
+ if (e.scope === "global")
69
+ continue;
70
+ if (e.scope.project !== projectId)
71
+ continue;
72
+ projectServerNames.add(e.name);
73
+ }
74
+ const seenToolNames = new Set();
75
+ const out = [];
76
+ for (const e of pool.values()) {
77
+ if (e.scope === "global")
78
+ continue;
79
+ if (e.scope.project !== projectId)
80
+ continue;
81
+ if (e.state !== "connected")
82
+ continue;
83
+ for (const t of e.bridged) {
84
+ if (seenToolNames.has(t.name))
85
+ continue;
86
+ seenToolNames.add(t.name);
87
+ out.push(t);
88
+ }
89
+ }
90
+ for (const e of pool.values()) {
91
+ if (e.scope !== "global")
92
+ continue;
93
+ if (projectServerNames.has(e.name))
94
+ continue;
95
+ if (e.state !== "connected")
96
+ continue;
97
+ for (const t of e.bridged) {
98
+ if (seenToolNames.has(t.name))
99
+ continue;
100
+ seenToolNames.add(t.name);
101
+ out.push(t);
102
+ }
103
+ }
104
+ return out;
105
+ }
106
+ export function getStatus(opts) {
107
+ const out = [];
108
+ for (const e of pool.values()) {
109
+ if (e.scope !== "global") {
110
+ if (opts?.projectId !== undefined && e.scope.project !== opts.projectId)
111
+ continue;
112
+ if (opts?.projectId === undefined)
113
+ continue;
114
+ }
115
+ const tools = e.tools.map((t, i) => ({
116
+ name: e.bridged[i]?.name ?? `${e.name}__${t.name}`,
117
+ shortName: t.name,
118
+ description: t.description,
119
+ }));
120
+ const isStdio = isStdioConfig(e.config);
121
+ const status = {
122
+ scope: e.scope === "global" ? "global" : "project",
123
+ name: e.name,
124
+ kind: isStdio ? "stdio" : "remote",
125
+ enabled: e.config.enabled !== false,
126
+ state: e.state,
127
+ toolCount: e.tools.length,
128
+ tools,
129
+ };
130
+ if (isStdio) {
131
+ if (e.config.command !== undefined)
132
+ status.command = e.config.command;
133
+ if (e.config.args !== undefined)
134
+ status.args = [...e.config.args];
135
+ }
136
+ else {
137
+ if (e.config.url !== undefined)
138
+ status.url = e.config.url;
139
+ if (e.config.transport !== undefined)
140
+ status.transport = e.config.transport;
141
+ }
142
+ if (e.scope !== "global")
143
+ status.projectId = e.scope.project;
144
+ if (e.lastError !== undefined)
145
+ status.lastError = e.lastError;
146
+ out.push(status);
147
+ }
148
+ return out;
149
+ }
150
+ export async function probe(scope, name) {
151
+ const entry = pool.get(entryKey(scope, name));
152
+ if (entry === undefined)
153
+ return undefined;
154
+ await disconnectEntry(entry);
155
+ await connectEntry(entry);
156
+ const opts = scope === "global" ? undefined : { projectId: scope.project };
157
+ return getStatus(opts).find((s) => s.name === name && s.scope === (scope === "global" ? "global" : "project"));
158
+ }
159
+ export async function reconnectGatedStdioForProject(projectId) {
160
+ const toConnect = [];
161
+ for (const e of pool.values()) {
162
+ if (e.scope === "global")
163
+ continue;
164
+ if (e.scope.project !== projectId)
165
+ continue;
166
+ if (e.state !== "trust_required")
167
+ continue;
168
+ toConnect.push(e);
169
+ }
170
+ for (const entry of toConnect) {
171
+ await connectEntry(entry);
172
+ }
173
+ }
174
+ export async function unloadProject(projectId) {
175
+ const toClose = [];
176
+ for (const [key, entry] of Array.from(pool.entries())) {
177
+ if (entry.scope === "global")
178
+ continue;
179
+ if (entry.scope.project !== projectId)
180
+ continue;
181
+ toClose.push(entry);
182
+ pool.delete(key);
183
+ }
184
+ await Promise.allSettled(toClose.map((e) => disconnectEntry(e)));
185
+ loadedProjects.delete(projectId);
186
+ cachedProjectPaths.delete(projectId);
187
+ }
188
+ export async function disposeAll() {
189
+ await Promise.allSettled(Array.from(pool.values()).map((entry) => disconnectEntry(entry)));
190
+ pool.clear();
191
+ loadedProjects.clear();
192
+ cachedProjectPaths.clear();
193
+ globalLoaded = false;
194
+ globalLoadPromise = undefined;
195
+ }
196
+ async function syncScope(scope, configs) {
197
+ const wantNames = new Set(Object.keys(configs));
198
+ for (const [key, entry] of Array.from(pool.entries())) {
199
+ if (entryScopeMatches(entry.scope, scope) && !wantNames.has(entry.name)) {
200
+ await disconnectEntry(entry);
201
+ pool.delete(key);
202
+ }
203
+ }
204
+ const toConnect = [];
205
+ for (const [name, cfg] of Object.entries(configs)) {
206
+ const key = entryKey(scope, name);
207
+ const existing = pool.get(key);
208
+ if (existing !== undefined) {
209
+ const sameEnabled = (existing.config.enabled !== false) === (cfg.enabled !== false);
210
+ const sameConnectionFields = sameConnectionConfig(existing.config, cfg);
211
+ existing.config = cfg;
212
+ if (sameEnabled && sameConnectionFields && existing.state === "connected") {
213
+ continue;
214
+ }
215
+ await disconnectEntry(existing);
216
+ if (cfg.enabled === false) {
217
+ existing.state = "disabled";
218
+ continue;
219
+ }
220
+ toConnect.push(existing);
221
+ continue;
222
+ }
223
+ const entry = {
224
+ scope,
225
+ name,
226
+ config: cfg,
227
+ state: cfg.enabled === false ? "disabled" : "idle",
228
+ tools: [],
229
+ bridged: [],
230
+ };
231
+ pool.set(key, entry);
232
+ if (cfg.enabled !== false) {
233
+ toConnect.push(entry);
234
+ }
235
+ }
236
+ for (const entry of toConnect) {
237
+ await connectEntry(entry);
238
+ }
239
+ }
240
+ function sameConnectionConfig(a, b) {
241
+ if (a.url !== b.url)
242
+ return false;
243
+ if (a.transport !== b.transport)
244
+ return false;
245
+ if (a.command !== b.command)
246
+ return false;
247
+ if (a.cwd !== b.cwd)
248
+ return false;
249
+ if (JSON.stringify(a.args ?? []) !== JSON.stringify(b.args ?? []))
250
+ return false;
251
+ if (JSON.stringify(a.headers ?? {}) !== JSON.stringify(b.headers ?? {}))
252
+ return false;
253
+ if (JSON.stringify(a.env ?? {}) !== JSON.stringify(b.env ?? {}))
254
+ return false;
255
+ return true;
256
+ }
257
+ function entryScopeMatches(a, b) {
258
+ if (a === "global" && b === "global")
259
+ return true;
260
+ if (a !== "global" && b !== "global")
261
+ return a.project === b.project;
262
+ return false;
263
+ }
264
+ async function connectEntry(entry) {
265
+ if (isStdioConfig(entry.config) && entry.scope !== "global") {
266
+ const trusted = await isStdioTrustedForProject(entry.scope.project).catch(() => false);
267
+ if (!trusted) {
268
+ entry.state = "trust_required";
269
+ entry.lastError = "stdio MCP servers from this project require trust";
270
+ entry.tools = [];
271
+ entry.bridged = [];
272
+ return;
273
+ }
274
+ }
275
+ entry.state = "connecting";
276
+ delete entry.lastError;
277
+ try {
278
+ const { client, transport, resolvedTransport } = await openConnection(entry.config, entry.scope);
279
+ entry.client = client;
280
+ entry.transport = transport;
281
+ if (resolvedTransport !== undefined)
282
+ entry.config.transport = resolvedTransport;
283
+ const list = await client.listTools();
284
+ entry.tools = (list.tools ?? []).map((t) => ({
285
+ name: t.name,
286
+ description: typeof t.description === "string" ? t.description : "",
287
+ inputSchema: t.inputSchema ?? {
288
+ type: "object",
289
+ properties: {},
290
+ },
291
+ }));
292
+ entry.bridged = entry.tools.map((t) => bridgeMcpTool({
293
+ serverName: entry.name,
294
+ toolName: t.name,
295
+ description: t.description,
296
+ inputSchema: t.inputSchema,
297
+ getClient: () => pool.get(entryKey(entry.scope, entry.name))?.client,
298
+ recoverStaleSession: () => recoverStaleSession(entry.scope, entry.name),
299
+ }));
300
+ entry.state = "connected";
301
+ }
302
+ catch (err) {
303
+ delete entry.client;
304
+ delete entry.transport;
305
+ entry.tools = [];
306
+ entry.bridged = [];
307
+ entry.state = "error";
308
+ entry.lastError = err instanceof Error ? err.message : String(err);
309
+ }
310
+ }
311
+ async function recoverStaleSession(scope, name) {
312
+ const entry = pool.get(entryKey(scope, name));
313
+ if (entry === undefined || entry.config.enabled === false)
314
+ return false;
315
+ if (entry.reconnecting !== undefined)
316
+ return await entry.reconnecting;
317
+ entry.reconnecting = (async () => {
318
+ await disconnectEntry(entry);
319
+ await connectEntry(entry);
320
+ return entry.state === "connected" && entry.client !== undefined;
321
+ })();
322
+ try {
323
+ return await entry.reconnecting;
324
+ }
325
+ finally {
326
+ if (entry.reconnecting !== undefined)
327
+ delete entry.reconnecting;
328
+ }
329
+ }
330
+ async function disconnectEntry(entry) {
331
+ const client = entry.client;
332
+ const transport = entry.transport;
333
+ delete entry.client;
334
+ delete entry.transport;
335
+ entry.tools = [];
336
+ entry.bridged = [];
337
+ if (entry.state !== "disabled")
338
+ entry.state = "idle";
339
+ await Promise.resolve(client?.close()).catch(() => undefined);
340
+ await Promise.resolve(transport?.close()).catch(() => undefined);
341
+ }
342
+ async function openConnection(cfg, scope) {
343
+ if (isStdioConfig(cfg)) {
344
+ return await openStdio(cfg, scope);
345
+ }
346
+ if (cfg.url === undefined) {
347
+ throw new Error("mcp: server has neither url nor command");
348
+ }
349
+ const url = new URL(cfg.url);
350
+ const requested = cfg.transport ?? "auto";
351
+ if (requested === "streamable-http") {
352
+ return await openStreamableHttp(url, cfg.headers);
353
+ }
354
+ if (requested === "sse") {
355
+ return await openSse(url, cfg.headers);
356
+ }
357
+ try {
358
+ return await openStreamableHttp(url, cfg.headers);
359
+ }
360
+ catch {
361
+ return await openSse(url, cfg.headers);
362
+ }
363
+ }
364
+ async function openStdio(cfg, scope) {
365
+ if (cfg.command === undefined || cfg.command.length === 0) {
366
+ throw new Error("mcp: stdio server requires a command");
367
+ }
368
+ const resolvedCwd = cfg.cwd ?? (scope === "global" ? undefined : projectCwdHint(scope.project));
369
+ const env = {
370
+ ...getDefaultEnvironment(),
371
+ ...(cfg.env ?? {}),
372
+ };
373
+ const transport = new StdioClientTransport({
374
+ command: cfg.command,
375
+ args: cfg.args ?? [],
376
+ env,
377
+ ...(resolvedCwd !== undefined ? { cwd: resolvedCwd } : {}),
378
+ stderr: "inherit",
379
+ });
380
+ const client = new Client({ name: "pi-kot", version: "0.1.0" }, { capabilities: {} });
381
+ await client.connect(transport);
382
+ return { client, transport, resolvedTransport: undefined };
383
+ }
384
+ function projectCwdHint(projectId) {
385
+ for (const e of pool.values()) {
386
+ if (e.scope !== "global" && e.scope.project === projectId) {
387
+ return e.config.cwd ?? cachedProjectPaths.get(projectId);
388
+ }
389
+ }
390
+ return cachedProjectPaths.get(projectId);
391
+ }
392
+ const cachedProjectPaths = new Map();
393
+ async function openStreamableHttp(url, headers) {
394
+ const transport = new StreamableHTTPClientTransport(url, headers !== undefined ? { requestInit: { headers } } : undefined);
395
+ const client = new Client({ name: "pi-kot", version: "0.1.0" }, { capabilities: {} });
396
+ await client.connect(transport);
397
+ return { client, transport, resolvedTransport: "streamable-http" };
398
+ }
399
+ async function openSse(url, headers) {
400
+ const transport = headers !== undefined
401
+ ? new SSEClientTransport(url, {
402
+ requestInit: { headers },
403
+ eventSourceInit: {
404
+ fetch: (input, init) => fetch(input, {
405
+ ...init,
406
+ headers: { ...(init?.headers ?? {}), ...headers },
407
+ }),
408
+ },
409
+ })
410
+ : new SSEClientTransport(url);
411
+ const client = new Client({ name: "pi-kot", version: "0.1.0" }, { capabilities: {} });
412
+ await client.connect(transport);
413
+ return { client, transport, resolvedTransport: "sse" };
414
+ }
415
+ async function readProjectMcpJson(projectPath) {
416
+ const path = join(projectPath, PROJECT_MCP_FILE);
417
+ try {
418
+ const raw = await readFile(path, "utf8");
419
+ if (raw.trim().length === 0)
420
+ return {};
421
+ const parsed = JSON.parse(raw);
422
+ if (typeof parsed !== "object" || parsed === null)
423
+ return {};
424
+ const servers = parsed.servers ?? parsed.mcpServers;
425
+ if (typeof servers !== "object" || servers === null)
426
+ return {};
427
+ return servers;
428
+ }
429
+ catch (err) {
430
+ if (err.code === "ENOENT")
431
+ return {};
432
+ throw err;
433
+ }
434
+ }
435
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function isStdioTrustedForProject(projectId: string): Promise<boolean>;
2
+ export declare function grantStdioTrust(projectId: string): Promise<void>;
3
+ export declare function revokeStdioTrust(projectId: string): Promise<void>;
4
+ export declare function clearProjectStdioTrust(projectId: string): Promise<void>;
5
+ //# sourceMappingURL=stdio-trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-trust.d.ts","sourceRoot":"","sources":["../../src/mcp/stdio-trust.ts"],"names":[],"mappings":"AAwDA,wBAAsB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGlF;AAED,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtE;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvE;AAED,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E"}
@@ -0,0 +1,78 @@
1
+ import { chmodSync } from "node:fs";
2
+ import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ import { randomUUID } from "node:crypto";
5
+ import { config } from "../config.js";
6
+ async function ensureDir() {
7
+ await mkdir(dirname(config.mcpStdioTrustFile), { recursive: true });
8
+ }
9
+ async function atomicWrite(data) {
10
+ await ensureDir();
11
+ const path = config.mcpStdioTrustFile;
12
+ const tmp = `${path}.${randomUUID()}.tmp`;
13
+ await writeFile(tmp, JSON.stringify(data, null, 2), { mode: 0o600 });
14
+ try {
15
+ chmodSync(tmp, 0o600);
16
+ }
17
+ catch {
18
+ // best-effort
19
+ }
20
+ try {
21
+ await rename(tmp, path);
22
+ }
23
+ catch (err) {
24
+ await unlink(tmp).catch(() => undefined);
25
+ throw err;
26
+ }
27
+ }
28
+ async function readAll() {
29
+ try {
30
+ const raw = await readFile(config.mcpStdioTrustFile, "utf8");
31
+ if (raw.trim().length === 0)
32
+ return { projects: {} };
33
+ const parsed = JSON.parse(raw);
34
+ if (typeof parsed !== "object" || parsed === null || !("projects" in parsed)) {
35
+ return { projects: {} };
36
+ }
37
+ const projects = parsed.projects;
38
+ if (typeof projects !== "object" || projects === null)
39
+ return { projects: {} };
40
+ const out = { projects: {} };
41
+ for (const [pid, val] of Object.entries(projects)) {
42
+ if (typeof val !== "object" || val === null)
43
+ continue;
44
+ const trustedAt = val.trustedAt;
45
+ if (typeof trustedAt !== "string")
46
+ continue;
47
+ out.projects[pid] = { trustedAt };
48
+ }
49
+ return out;
50
+ }
51
+ catch (err) {
52
+ if (err.code === "ENOENT")
53
+ return { projects: {} };
54
+ throw err;
55
+ }
56
+ }
57
+ export async function isStdioTrustedForProject(projectId) {
58
+ const cur = await readAll();
59
+ return cur.projects[projectId] !== undefined;
60
+ }
61
+ export async function grantStdioTrust(projectId) {
62
+ const cur = await readAll();
63
+ if (cur.projects[projectId] !== undefined)
64
+ return;
65
+ cur.projects[projectId] = { trustedAt: new Date().toISOString() };
66
+ await atomicWrite(cur);
67
+ }
68
+ export async function revokeStdioTrust(projectId) {
69
+ const cur = await readAll();
70
+ if (cur.projects[projectId] === undefined)
71
+ return;
72
+ delete cur.projects[projectId];
73
+ await atomicWrite(cur);
74
+ }
75
+ export async function clearProjectStdioTrust(projectId) {
76
+ await revokeStdioTrust(projectId);
77
+ }
78
+ //# sourceMappingURL=stdio-trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio-trust.js","sourceRoot":"","sources":["../../src/mcp/stdio-trust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import type { ToolDefinition } from "@earendil-works/pi-coding-agent";
3
+ export declare function bridgeMcpTool(opts: {
4
+ serverName: string;
5
+ toolName: string;
6
+ description: string;
7
+ inputSchema: Record<string, unknown>;
8
+ getClient: () => Client | undefined;
9
+ recoverStaleSession?: () => Promise<boolean>;
10
+ }): ToolDefinition;
11
+ export declare function mcpResultToAgentResult(res: unknown): {
12
+ content: ({
13
+ type: "text";
14
+ text: string;
15
+ } | {
16
+ type: "image";
17
+ data: string;
18
+ mimeType: string;
19
+ })[];
20
+ details: {} | null;
21
+ };
22
+ export declare const MCP_TEXT_CAP_CHARS = 30000;
23
+ type ContentBlock = {
24
+ type: "text";
25
+ text: string;
26
+ } | {
27
+ type: "image";
28
+ data: string;
29
+ mimeType: string;
30
+ };
31
+ export declare function capTextContent(blocks: ContentBlock[]): ContentBlock[];
32
+ export {};
33
+ //# sourceMappingURL=tool-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-bridge.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-bridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACpC,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C,GAAG,cAAc,CA2CjB;AA4DD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO;;cAGzB,MAAM;cAAQ,MAAM;;cAAa,OAAO;cAAQ,MAAM;kBAAY,MAAM;;;EAyBjG;AAED,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,KAAK,YAAY,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAqCrE"}