@agents-ensemble/core 0.6.5 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/conductor/conductor-agent.d.ts +50 -14
- package/dist/conductor/conductor-agent.d.ts.map +1 -1
- package/dist/conductor/conductor-agent.js +1 -96
- package/dist/conductor/conductor-agent.js.map +1 -1
- package/dist/conductor/conductor-send-reconnect.d.ts +10 -6
- package/dist/conductor/conductor-send-reconnect.d.ts.map +1 -1
- package/dist/conductor/conductor-send-reconnect.js +6 -4
- package/dist/conductor/conductor-send-reconnect.js.map +1 -1
- package/dist/conductor/conductor-session-driver.d.ts +2 -4
- package/dist/conductor/conductor-session-driver.d.ts.map +1 -1
- package/dist/conductor/conductor-session-driver.js +29 -28
- package/dist/conductor/conductor-session-driver.js.map +1 -1
- package/dist/conductor/conductor-session.d.ts +5 -1
- package/dist/conductor/conductor-session.d.ts.map +1 -1
- package/dist/conductor/conductor-session.js +77 -28
- package/dist/conductor/conductor-session.js.map +1 -1
- package/dist/conductor/conductor-tool-pi-adapter.d.ts +13 -0
- package/dist/conductor/conductor-tool-pi-adapter.d.ts.map +1 -0
- package/dist/conductor/conductor-tool-pi-adapter.js +30 -0
- package/dist/conductor/conductor-tool-pi-adapter.js.map +1 -0
- package/dist/conductor/conductor-tool-sdk-adapter.d.ts +6 -0
- package/dist/conductor/conductor-tool-sdk-adapter.d.ts.map +1 -0
- package/dist/conductor/conductor-tool-sdk-adapter.js +16 -0
- package/dist/conductor/conductor-tool-sdk-adapter.js.map +1 -0
- package/dist/conductor/conductor-tool.d.ts +35 -0
- package/dist/conductor/conductor-tool.d.ts.map +1 -0
- package/dist/conductor/conductor-tool.js +41 -0
- package/dist/conductor/conductor-tool.js.map +1 -0
- package/dist/conductor/cursor-sdk-conductor-agent.d.ts +18 -0
- package/dist/conductor/cursor-sdk-conductor-agent.d.ts.map +1 -0
- package/dist/conductor/cursor-sdk-conductor-agent.js +134 -0
- package/dist/conductor/cursor-sdk-conductor-agent.js.map +1 -0
- package/dist/conductor/index.d.ts +15 -3
- package/dist/conductor/index.d.ts.map +1 -1
- package/dist/conductor/index.js +8 -2
- package/dist/conductor/index.js.map +1 -1
- package/dist/conductor/pi-conductor-agent.d.ts +46 -0
- package/dist/conductor/pi-conductor-agent.d.ts.map +1 -0
- package/dist/conductor/pi-conductor-agent.js +487 -0
- package/dist/conductor/pi-conductor-agent.js.map +1 -0
- package/dist/conductor/pi-conductor-session.d.ts +20 -0
- package/dist/conductor/pi-conductor-session.d.ts.map +1 -0
- package/dist/conductor/pi-conductor-session.js +60 -0
- package/dist/conductor/pi-conductor-session.js.map +1 -0
- package/dist/conductor/pi-mcp-bridge.d.ts +65 -0
- package/dist/conductor/pi-mcp-bridge.d.ts.map +1 -0
- package/dist/conductor/pi-mcp-bridge.js +259 -0
- package/dist/conductor/pi-mcp-bridge.js.map +1 -0
- package/dist/conductor/pi-resource-loader.d.ts +145 -0
- package/dist/conductor/pi-resource-loader.d.ts.map +1 -0
- package/dist/conductor/pi-resource-loader.js +673 -0
- package/dist/conductor/pi-resource-loader.js.map +1 -0
- package/dist/config/defaults.d.ts +2 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +2 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -2
- package/dist/config/index.js.map +1 -1
- package/dist/config/parse-config.d.ts.map +1 -1
- package/dist/config/parse-config.js +29 -1
- package/dist/config/parse-config.js.map +1 -1
- package/dist/config/resolve-settings.d.ts +25 -1
- package/dist/config/resolve-settings.d.ts.map +1 -1
- package/dist/config/resolve-settings.js +38 -1
- package/dist/config/resolve-settings.js.map +1 -1
- package/dist/config/types.d.ts +11 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/dispatch/prompt-worker-tool.d.ts +2 -2
- package/dist/dispatch/prompt-worker-tool.d.ts.map +1 -1
- package/dist/dispatch/prompt-worker-tool.js +1 -0
- package/dist/dispatch/prompt-worker-tool.js.map +1 -1
- package/dist/dispatch/session-usage-tool.d.ts +2 -2
- package/dist/dispatch/session-usage-tool.d.ts.map +1 -1
- package/dist/dispatch/session-usage-tool.js +2 -0
- package/dist/dispatch/session-usage-tool.js.map +1 -1
- package/dist/dispatch/set-dispatch-hold-tool.d.ts +2 -2
- package/dist/dispatch/set-dispatch-hold-tool.d.ts.map +1 -1
- package/dist/dispatch/set-dispatch-hold-tool.js +1 -0
- package/dist/dispatch/set-dispatch-hold-tool.js.map +1 -1
- package/dist/dispatch/worker-status-tool.d.ts +2 -2
- package/dist/dispatch/worker-status-tool.d.ts.map +1 -1
- package/dist/dispatch/worker-status-tool.js +2 -0
- package/dist/dispatch/worker-status-tool.js.map +1 -1
- package/dist/dispatch/yaml-tool-result.d.ts +3 -9
- package/dist/dispatch/yaml-tool-result.d.ts.map +1 -1
- package/dist/dispatch/yaml-tool-result.js.map +1 -1
- package/dist/escalation/answer-open-question-tool.d.ts +2 -2
- package/dist/escalation/answer-open-question-tool.d.ts.map +1 -1
- package/dist/escalation/answer-open-question-tool.js +1 -0
- package/dist/escalation/answer-open-question-tool.js.map +1 -1
- package/dist/escalation/ask-human-tool.d.ts +2 -2
- package/dist/escalation/ask-human-tool.d.ts.map +1 -1
- package/dist/escalation/ask-human-tool.js +1 -0
- package/dist/escalation/ask-human-tool.js.map +1 -1
- package/dist/escalation/open-question-list-tools.d.ts +2 -2
- package/dist/escalation/open-question-list-tools.d.ts.map +1 -1
- package/dist/escalation/open-question-list-tools.js +2 -0
- package/dist/escalation/open-question-list-tools.js.map +1 -1
- package/dist/github/fetch-github-updates.d.ts +0 -6
- package/dist/github/fetch-github-updates.d.ts.map +1 -1
- package/dist/github/fetch-github-updates.js +74 -119
- package/dist/github/fetch-github-updates.js.map +1 -1
- package/dist/github/github-monitor-cursor.d.ts +24 -8
- package/dist/github/github-monitor-cursor.d.ts.map +1 -1
- package/dist/github/github-monitor-cursor.js +51 -17
- package/dist/github/github-monitor-cursor.js.map +1 -1
- package/dist/github/github-update-types.d.ts +1 -1
- package/dist/github/github-update-types.d.ts.map +1 -1
- package/dist/github/index.d.ts +1 -1
- package/dist/github/index.d.ts.map +1 -1
- package/dist/github/index.js.map +1 -1
- package/dist/github/register-github-watch-tool.d.ts +2 -2
- package/dist/github/register-github-watch-tool.d.ts.map +1 -1
- package/dist/github/register-github-watch-tool.js +1 -0
- package/dist/github/register-github-watch-tool.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -3
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/load-mcp-config.d.ts +29 -5
- package/dist/mcp/load-mcp-config.d.ts.map +1 -1
- package/dist/mcp/load-mcp-config.js +9 -2
- package/dist/mcp/load-mcp-config.js.map +1 -1
- package/dist/permission/resolve-permission-tool.d.ts +2 -2
- package/dist/permission/resolve-permission-tool.d.ts.map +1 -1
- package/dist/permission/resolve-permission-tool.js +1 -0
- package/dist/permission/resolve-permission-tool.js.map +1 -1
- package/dist/profile/index.d.ts +1 -1
- package/dist/profile/index.d.ts.map +1 -1
- package/dist/profile/index.js.map +1 -1
- package/dist/profile/load-profile.d.ts.map +1 -1
- package/dist/profile/load-profile.js +19 -0
- package/dist/profile/load-profile.js.map +1 -1
- package/dist/profile/types.d.ts +7 -0
- package/dist/profile/types.d.ts.map +1 -1
- package/dist/profile/types.js.map +1 -1
- package/dist/session/session-sidecar.d.ts +4 -0
- package/dist/session/session-sidecar.d.ts.map +1 -1
- package/dist/session/session-sidecar.js +16 -0
- package/dist/session/session-sidecar.js.map +1 -1
- package/dist/testing/mock-conductor-get-usage.d.ts +2 -1
- package/dist/testing/mock-conductor-get-usage.d.ts.map +1 -1
- package/dist/testing/mock-conductor-get-usage.js +1 -10
- package/dist/testing/mock-conductor-get-usage.js.map +1 -1
- package/dist/usage/enrich-session-usage-cost.d.ts +2 -2
- package/dist/usage/enrich-session-usage-cost.d.ts.map +1 -1
- package/dist/usage/session-usage-tracker.d.ts +2 -2
- package/dist/usage/session-usage-tracker.d.ts.map +1 -1
- package/dist/usage/session-usage-tracker.js +2 -2
- package/dist/usage/session-usage-tracker.js.map +1 -1
- package/dist/usage/types.d.ts +2 -2
- package/dist/usage/types.d.ts.map +1 -1
- package/dist/worktree/worktree.d.ts.map +1 -1
- package/dist/worktree/worktree.js +33 -16
- package/dist/worktree/worktree.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
2
|
+
import type { McpServerConfigMap } from '../mcp/load-mcp-config.js';
|
|
3
|
+
/** The bridge dependency is intentionally exact-pinned in packages/core. */
|
|
4
|
+
export declare const PI_MCP_SDK_VERSION = "1.30.0";
|
|
5
|
+
interface McpToolDefinition {
|
|
6
|
+
name: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
inputSchema: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
interface McpClient {
|
|
11
|
+
connect(transport: unknown): Promise<void>;
|
|
12
|
+
listTools(): Promise<{
|
|
13
|
+
tools: McpToolDefinition[];
|
|
14
|
+
}>;
|
|
15
|
+
callTool(params: {
|
|
16
|
+
name: string;
|
|
17
|
+
arguments?: Record<string, unknown>;
|
|
18
|
+
}, resultSchema?: unknown, options?: {
|
|
19
|
+
signal?: AbortSignal;
|
|
20
|
+
}): Promise<unknown>;
|
|
21
|
+
close(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export interface PiMcpBridgeSdk {
|
|
24
|
+
Client: new (info: {
|
|
25
|
+
name: string;
|
|
26
|
+
version: string;
|
|
27
|
+
}) => McpClient;
|
|
28
|
+
StdioClientTransport: new (options: {
|
|
29
|
+
command: string;
|
|
30
|
+
args?: string[];
|
|
31
|
+
env?: Record<string, string>;
|
|
32
|
+
cwd?: string;
|
|
33
|
+
}) => unknown;
|
|
34
|
+
StreamableHTTPClientTransport: new (url: URL, options?: {
|
|
35
|
+
requestInit?: RequestInit;
|
|
36
|
+
}) => unknown;
|
|
37
|
+
SSEClientTransport: new (url: URL, options?: {
|
|
38
|
+
requestInit?: RequestInit;
|
|
39
|
+
}) => unknown;
|
|
40
|
+
}
|
|
41
|
+
/** Injectable only for unit tests; production uses the pinned SDK loader. */
|
|
42
|
+
export interface PiMcpBridgeDependencies {
|
|
43
|
+
sdk?: PiMcpBridgeSdk;
|
|
44
|
+
loadSdk?: () => Promise<PiMcpBridgeSdk>;
|
|
45
|
+
}
|
|
46
|
+
export interface PiMcpBridgeOptions {
|
|
47
|
+
cwd: string;
|
|
48
|
+
env?: NodeJS.ProcessEnv;
|
|
49
|
+
}
|
|
50
|
+
export interface PiMcpBridge {
|
|
51
|
+
readonly tools: AgentTool[];
|
|
52
|
+
close(): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Load the harness-owned in-process Pi MCP bridge for one resolved mcp.json
|
|
56
|
+
* snapshot. This is not a Pi ExtensionAPI extension.
|
|
57
|
+
*
|
|
58
|
+
* The bridge is deliberately in-memory: it does not write `.pi/mcp.json` or
|
|
59
|
+
* mutate Pi settings. The Pi resource loader resolves user/project Pi
|
|
60
|
+
* resources separately; this bridge remains the harness-owned connection for
|
|
61
|
+
* the already-resolved ensemble MCP map.
|
|
62
|
+
*/
|
|
63
|
+
export declare function createPiMcpBridge(mcpServers: McpServerConfigMap | undefined, options: PiMcpBridgeOptions, dependencies?: PiMcpBridgeDependencies): Promise<PiMcpBridge | undefined>;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=pi-mcp-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-mcp-bridge.d.ts","sourceRoot":"","sources":["../../src/conductor/pi-mcp-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,2BAA2B,CAAC;AAEnC,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AA8CD,UAAU,SAAS;IACjB,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,SAAS,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA;KAAE,CAAC,CAAC;IACrD,QAAQ,CACN,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAC7D,YAAY,CAAC,EAAE,OAAO,EACtB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACjC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,SAAS,CAAC;IACnE,oBAAoB,EAAE,KAAK,OAAO,EAAE;QAClC,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,KAAK,OAAO,CAAC;IACd,6BAA6B,EAAE,KAC7B,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE,KACpC,OAAO,CAAC;IACb,kBAAkB,EAAE,KAClB,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE,KACpC,OAAO,CAAC;CACd;AAED,6EAA6E;AAC7E,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAOD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,kBAAkB,GAAG,SAAS,EAC1C,OAAO,EAAE,kBAAkB,EAC3B,YAAY,GAAE,uBAA4B,GACzC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAoClC"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/** The bridge dependency is intentionally exact-pinned in packages/core. */
|
|
2
|
+
export const PI_MCP_SDK_VERSION = '1.30.0';
|
|
3
|
+
/**
|
|
4
|
+
* Load the harness-owned in-process Pi MCP bridge for one resolved mcp.json
|
|
5
|
+
* snapshot. This is not a Pi ExtensionAPI extension.
|
|
6
|
+
*
|
|
7
|
+
* The bridge is deliberately in-memory: it does not write `.pi/mcp.json` or
|
|
8
|
+
* mutate Pi settings. The Pi resource loader resolves user/project Pi
|
|
9
|
+
* resources separately; this bridge remains the harness-owned connection for
|
|
10
|
+
* the already-resolved ensemble MCP map.
|
|
11
|
+
*/
|
|
12
|
+
export async function createPiMcpBridge(mcpServers, options, dependencies = {}) {
|
|
13
|
+
if (!mcpServers || Object.keys(mcpServers).length === 0) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const sdk = dependencies.sdk ?? (await loadMcpSdk(dependencies.loadSdk));
|
|
17
|
+
const connectedServers = [];
|
|
18
|
+
const tools = [];
|
|
19
|
+
const usedToolNames = new Set();
|
|
20
|
+
try {
|
|
21
|
+
for (const [serverName, config] of Object.entries(mcpServers)) {
|
|
22
|
+
const client = new sdk.Client({
|
|
23
|
+
name: 'agents-ensemble-pi-conductor',
|
|
24
|
+
version: PI_MCP_SDK_VERSION,
|
|
25
|
+
});
|
|
26
|
+
connectedServers.push({ name: serverName, client });
|
|
27
|
+
const transport = createTransport(sdk, serverName, config, options);
|
|
28
|
+
await client.connect(transport);
|
|
29
|
+
const listed = await client.listTools();
|
|
30
|
+
for (const tool of listed.tools) {
|
|
31
|
+
const exposedName = uniqueToolName(serverName, tool.name, usedToolNames);
|
|
32
|
+
tools.push(createPiMcpTool(client, serverName, tool, exposedName));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
await closeClients(connectedServers);
|
|
38
|
+
throw new Error(`Pi MCP bridge failed while loading server configuration: ${errorMessage(error)}`, { cause: error });
|
|
39
|
+
}
|
|
40
|
+
return new LoadedPiMcpBridge(tools, connectedServers);
|
|
41
|
+
}
|
|
42
|
+
class LoadedPiMcpBridge {
|
|
43
|
+
tools;
|
|
44
|
+
connectedServers;
|
|
45
|
+
closed = false;
|
|
46
|
+
constructor(tools, connectedServers) {
|
|
47
|
+
this.tools = tools;
|
|
48
|
+
this.connectedServers = connectedServers;
|
|
49
|
+
}
|
|
50
|
+
async close() {
|
|
51
|
+
if (this.closed) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this.closed = true;
|
|
55
|
+
await closeClients(this.connectedServers);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function loadMcpSdk(loader = importMcpSdk) {
|
|
59
|
+
try {
|
|
60
|
+
return await loader();
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
throw new Error(`Pi MCP bridge is unavailable. Install @modelcontextprotocol/sdk@${PI_MCP_SDK_VERSION} and reinstall @agents-ensemble/core.`, { cause: error });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function importMcpSdk() {
|
|
67
|
+
const [client, stdio, streamableHttp, sse] = await Promise.all([
|
|
68
|
+
import('@modelcontextprotocol/sdk/client/index.js'),
|
|
69
|
+
import('@modelcontextprotocol/sdk/client/stdio.js'),
|
|
70
|
+
import('@modelcontextprotocol/sdk/client/streamableHttp.js'),
|
|
71
|
+
import('@modelcontextprotocol/sdk/client/sse.js'),
|
|
72
|
+
]);
|
|
73
|
+
return {
|
|
74
|
+
Client: client.Client,
|
|
75
|
+
StdioClientTransport: stdio.StdioClientTransport,
|
|
76
|
+
StreamableHTTPClientTransport: streamableHttp.StreamableHTTPClientTransport,
|
|
77
|
+
SSEClientTransport: sse.SSEClientTransport,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function createTransport(sdk, serverName, config, options) {
|
|
81
|
+
if (config.auth) {
|
|
82
|
+
throw new Error(`MCP server "${serverName}" uses OAuth auth, which the Pi bridge does not support yet. Remove auth from the definition or use the Cursor backend.`);
|
|
83
|
+
}
|
|
84
|
+
const env = options.env ?? process.env;
|
|
85
|
+
const type = config.type ?? (config.command ? 'stdio' : 'http');
|
|
86
|
+
if (type === 'stdio') {
|
|
87
|
+
if (!config.command) {
|
|
88
|
+
throw new Error(`MCP server "${serverName}" is missing command.`);
|
|
89
|
+
}
|
|
90
|
+
return new sdk.StdioClientTransport({
|
|
91
|
+
command: expand(config.command, options.cwd, env),
|
|
92
|
+
...(config.args
|
|
93
|
+
? { args: config.args.map((value) => expand(value, options.cwd, env)) }
|
|
94
|
+
: {}),
|
|
95
|
+
env: mergeProcessEnvironment(config.env, options.cwd, env),
|
|
96
|
+
cwd: config.cwd
|
|
97
|
+
? expand(config.cwd, options.cwd, env)
|
|
98
|
+
: options.cwd,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (!config.url) {
|
|
102
|
+
throw new Error(`MCP server "${serverName}" is missing url.`);
|
|
103
|
+
}
|
|
104
|
+
const requestInit = config.headers
|
|
105
|
+
? { headers: expandRecord(config.headers, options.cwd, env) }
|
|
106
|
+
: undefined;
|
|
107
|
+
const url = new URL(expand(config.url, options.cwd, env));
|
|
108
|
+
if (type === 'sse') {
|
|
109
|
+
return new sdk.SSEClientTransport(url, requestInit ? { requestInit } : undefined);
|
|
110
|
+
}
|
|
111
|
+
if (type === 'http') {
|
|
112
|
+
return new sdk.StreamableHTTPClientTransport(url, requestInit ? { requestInit } : undefined);
|
|
113
|
+
}
|
|
114
|
+
throw new Error(`MCP server "${serverName}" uses unsupported transport type "${type}".`);
|
|
115
|
+
}
|
|
116
|
+
function createPiMcpTool(client, serverName, tool, exposedName) {
|
|
117
|
+
return {
|
|
118
|
+
name: exposedName,
|
|
119
|
+
label: exposedName,
|
|
120
|
+
description: tool.description
|
|
121
|
+
? `[MCP ${serverName}] ${tool.description}`
|
|
122
|
+
: `MCP tool ${serverName}/${tool.name}`,
|
|
123
|
+
// MCP input schemas are JSON Schema objects and are structurally
|
|
124
|
+
// compatible with the TypeBox schema consumed by pi-agent-core.
|
|
125
|
+
parameters: tool.inputSchema,
|
|
126
|
+
execute: async (_toolCallId, params, signal) => {
|
|
127
|
+
const result = toMcpToolResult(await client.callTool({
|
|
128
|
+
name: tool.name,
|
|
129
|
+
arguments: isRecord(params) ? params : {},
|
|
130
|
+
}, undefined, signal ? { signal } : undefined));
|
|
131
|
+
if (result.isError) {
|
|
132
|
+
throw new Error(`MCP tool ${serverName}/${tool.name} returned an error: ${mcpErrorDetail(result)}`);
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
content: toPiContent(result),
|
|
136
|
+
details: {
|
|
137
|
+
mcpServer: serverName,
|
|
138
|
+
mcpTool: tool.name,
|
|
139
|
+
...(result.structuredContent
|
|
140
|
+
? { structuredContent: result.structuredContent }
|
|
141
|
+
: {}),
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function toPiContent(result) {
|
|
148
|
+
const content = [];
|
|
149
|
+
for (const item of result.content ?? []) {
|
|
150
|
+
if (item.type === 'text') {
|
|
151
|
+
content.push({ type: 'text', text: item.text });
|
|
152
|
+
}
|
|
153
|
+
else if (item.type === 'image') {
|
|
154
|
+
content.push({ type: 'image', data: item.data, mimeType: item.mimeType });
|
|
155
|
+
}
|
|
156
|
+
else if (item.type === 'resource') {
|
|
157
|
+
content.push({ type: 'text', text: resourceText(item) });
|
|
158
|
+
}
|
|
159
|
+
else if (item.type === 'resource_link') {
|
|
160
|
+
content.push({
|
|
161
|
+
type: 'text',
|
|
162
|
+
text: `${item.name}: ${item.uri}${item.description ? ` (${item.description})` : ''}`,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
else if (item.type === 'audio') {
|
|
166
|
+
content.push({
|
|
167
|
+
type: 'text',
|
|
168
|
+
text: `[MCP audio ${item.mimeType}] ${item.data}`,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (content.length === 0 && result.structuredContent) {
|
|
173
|
+
content.push({
|
|
174
|
+
type: 'text',
|
|
175
|
+
text: JSON.stringify(result.structuredContent),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
if (content.length === 0) {
|
|
179
|
+
content.push({ type: 'text', text: '(MCP tool returned no content.)' });
|
|
180
|
+
}
|
|
181
|
+
return content;
|
|
182
|
+
}
|
|
183
|
+
function resourceText(item) {
|
|
184
|
+
if ('text' in item.resource) {
|
|
185
|
+
return item.resource.text;
|
|
186
|
+
}
|
|
187
|
+
return `[MCP resource ${item.resource.uri}] ${item.resource.blob}`;
|
|
188
|
+
}
|
|
189
|
+
function uniqueToolName(serverName, toolName, usedNames) {
|
|
190
|
+
const base = `mcp_${sanitizeToolNamePart(serverName)}_${sanitizeToolNamePart(toolName)}`;
|
|
191
|
+
let candidate = base;
|
|
192
|
+
let suffix = 2;
|
|
193
|
+
while (usedNames.has(candidate)) {
|
|
194
|
+
candidate = `${base}_${suffix}`;
|
|
195
|
+
suffix += 1;
|
|
196
|
+
}
|
|
197
|
+
usedNames.add(candidate);
|
|
198
|
+
return candidate;
|
|
199
|
+
}
|
|
200
|
+
function sanitizeToolNamePart(value) {
|
|
201
|
+
const sanitized = value.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
202
|
+
if (!sanitized)
|
|
203
|
+
return 'tool';
|
|
204
|
+
return /^[a-zA-Z_]/.test(sanitized) ? sanitized : `_${sanitized}`;
|
|
205
|
+
}
|
|
206
|
+
function mergeProcessEnvironment(configured, cwd, env) {
|
|
207
|
+
const inherited = Object.fromEntries(Object.entries(env)
|
|
208
|
+
.filter((entry) => entry[1] !== undefined));
|
|
209
|
+
return {
|
|
210
|
+
...inherited,
|
|
211
|
+
...(configured ? expandRecord(configured, cwd, env) : {}),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function expandRecord(record, cwd, env) {
|
|
215
|
+
return Object.fromEntries(Object.entries(record).map(([key, value]) => [
|
|
216
|
+
key,
|
|
217
|
+
expand(value, cwd, env),
|
|
218
|
+
]));
|
|
219
|
+
}
|
|
220
|
+
function expand(value, cwd, env) {
|
|
221
|
+
return value
|
|
222
|
+
.replace(/\$\{env:([^}]+)\}/g, (_match, name) => env[name] ?? '')
|
|
223
|
+
.replace(/\$\{workspaceFolder\}/g, cwd);
|
|
224
|
+
}
|
|
225
|
+
async function closeClients(servers) {
|
|
226
|
+
await Promise.allSettled(servers.map(({ client }) => client.close()));
|
|
227
|
+
}
|
|
228
|
+
function isRecord(value) {
|
|
229
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
230
|
+
}
|
|
231
|
+
function toMcpToolResult(value) {
|
|
232
|
+
if (!isRecord(value)) {
|
|
233
|
+
return {};
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
...(Array.isArray(value.content)
|
|
237
|
+
? { content: value.content }
|
|
238
|
+
: {}),
|
|
239
|
+
...(isRecord(value.structuredContent)
|
|
240
|
+
? { structuredContent: value.structuredContent }
|
|
241
|
+
: {}),
|
|
242
|
+
...(value.isError === true ? { isError: true } : {}),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function mcpErrorDetail(result) {
|
|
246
|
+
const text = (result.content ?? [])
|
|
247
|
+
.filter((item) => item.type === 'text')
|
|
248
|
+
.map((item) => item.text)
|
|
249
|
+
.join('\n');
|
|
250
|
+
if (text)
|
|
251
|
+
return text;
|
|
252
|
+
if (result.structuredContent)
|
|
253
|
+
return JSON.stringify(result.structuredContent);
|
|
254
|
+
return 'the MCP server reported an error';
|
|
255
|
+
}
|
|
256
|
+
function errorMessage(error) {
|
|
257
|
+
return error instanceof Error ? error.message : String(error);
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=pi-mcp-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-mcp-bridge.js","sourceRoot":"","sources":["../../src/conductor/pi-mcp-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
2
|
+
/** The Pi settings fields used by model/auth resolution and resource loading. */
|
|
3
|
+
export interface PiSettingsFile {
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
defaultProvider?: unknown;
|
|
6
|
+
defaultModel?: unknown;
|
|
7
|
+
model?: unknown;
|
|
8
|
+
modelId?: unknown;
|
|
9
|
+
apiKey?: unknown;
|
|
10
|
+
apiKeys?: unknown;
|
|
11
|
+
extensions?: unknown;
|
|
12
|
+
skills?: unknown;
|
|
13
|
+
prompts?: unknown;
|
|
14
|
+
themes?: unknown;
|
|
15
|
+
}
|
|
16
|
+
export type PiAuthFile = Record<string, unknown>;
|
|
17
|
+
export interface PiModelsFile {
|
|
18
|
+
providers: Record<string, PiProviderConfig>;
|
|
19
|
+
}
|
|
20
|
+
export interface PiProviderConfig {
|
|
21
|
+
name?: string;
|
|
22
|
+
baseUrl?: string;
|
|
23
|
+
apiKey?: string;
|
|
24
|
+
api?: string;
|
|
25
|
+
headers?: Record<string, string>;
|
|
26
|
+
authHeader?: boolean;
|
|
27
|
+
compat?: Record<string, unknown>;
|
|
28
|
+
models?: PiModelDefinition[];
|
|
29
|
+
modelOverrides?: Record<string, PiModelOverride>;
|
|
30
|
+
}
|
|
31
|
+
export interface PiModelDefinition {
|
|
32
|
+
id: string;
|
|
33
|
+
name?: string;
|
|
34
|
+
api?: string;
|
|
35
|
+
baseUrl?: string;
|
|
36
|
+
reasoning?: boolean;
|
|
37
|
+
thinkingLevelMap?: Record<string, string | null>;
|
|
38
|
+
input?: Array<'text' | 'image'>;
|
|
39
|
+
cost?: PiModelCost;
|
|
40
|
+
contextWindow?: number;
|
|
41
|
+
maxTokens?: number;
|
|
42
|
+
headers?: Record<string, string>;
|
|
43
|
+
compat?: Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
export interface PiModelOverride {
|
|
46
|
+
name?: string;
|
|
47
|
+
reasoning?: boolean;
|
|
48
|
+
thinkingLevelMap?: Record<string, string | null>;
|
|
49
|
+
input?: Array<'text' | 'image'>;
|
|
50
|
+
cost?: Partial<PiModelCost>;
|
|
51
|
+
contextWindow?: number;
|
|
52
|
+
maxTokens?: number;
|
|
53
|
+
headers?: Record<string, string>;
|
|
54
|
+
compat?: Record<string, unknown>;
|
|
55
|
+
}
|
|
56
|
+
export interface PiModelCost {
|
|
57
|
+
input: number;
|
|
58
|
+
output: number;
|
|
59
|
+
cacheRead: number;
|
|
60
|
+
cacheWrite: number;
|
|
61
|
+
tiers?: Array<PiModelCostTier>;
|
|
62
|
+
}
|
|
63
|
+
export interface PiModelCostTier {
|
|
64
|
+
inputTokensAbove: number;
|
|
65
|
+
input: number;
|
|
66
|
+
output: number;
|
|
67
|
+
cacheRead: number;
|
|
68
|
+
cacheWrite: number;
|
|
69
|
+
}
|
|
70
|
+
export interface PiSkillResource {
|
|
71
|
+
name: string;
|
|
72
|
+
description: string;
|
|
73
|
+
filePath: string;
|
|
74
|
+
content: string;
|
|
75
|
+
disableModelInvocation: boolean;
|
|
76
|
+
}
|
|
77
|
+
export interface PiPromptResource {
|
|
78
|
+
name: string;
|
|
79
|
+
description: string;
|
|
80
|
+
argumentHint?: string;
|
|
81
|
+
filePath: string;
|
|
82
|
+
content: string;
|
|
83
|
+
}
|
|
84
|
+
export interface PiThemeResource {
|
|
85
|
+
name: string;
|
|
86
|
+
filePath: string;
|
|
87
|
+
value: Record<string, unknown>;
|
|
88
|
+
}
|
|
89
|
+
export interface PiResourceRoots {
|
|
90
|
+
agentDir: string;
|
|
91
|
+
projectDir: string;
|
|
92
|
+
}
|
|
93
|
+
export interface PiResourceLoaderOptions {
|
|
94
|
+
cwd: string;
|
|
95
|
+
pi?: {
|
|
96
|
+
agentDir?: string;
|
|
97
|
+
projectDir?: string;
|
|
98
|
+
};
|
|
99
|
+
/** Injectable environment/home for tests; production uses process defaults. */
|
|
100
|
+
env?: NodeJS.ProcessEnv;
|
|
101
|
+
home?: string;
|
|
102
|
+
}
|
|
103
|
+
export interface PiResources {
|
|
104
|
+
roots: PiResourceRoots;
|
|
105
|
+
settings: PiSettingsFile;
|
|
106
|
+
auth: PiAuthFile;
|
|
107
|
+
/** Unmerged layers, in user → project order, for provider-level precedence. */
|
|
108
|
+
authLayers: PiAuthFile[];
|
|
109
|
+
models: PiModelsFile;
|
|
110
|
+
extensionTools: AgentTool[];
|
|
111
|
+
extensionPaths: string[];
|
|
112
|
+
skillPaths: string[];
|
|
113
|
+
promptPaths: string[];
|
|
114
|
+
themePaths: string[];
|
|
115
|
+
skills: PiSkillResource[];
|
|
116
|
+
prompts: PiPromptResource[];
|
|
117
|
+
themes: PiThemeResource[];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Resolve the two Pi resource roots used by the conductor.
|
|
121
|
+
*
|
|
122
|
+
* `agentDir` is the user root and defaults to `~/.ensemble/pi`; `projectDir`
|
|
123
|
+
* is the repository root and defaults to `<cwd>/.ensemble/pi`. The optional
|
|
124
|
+
* environment variable is retained for compatibility with Pi's launcher.
|
|
125
|
+
*/
|
|
126
|
+
export declare function resolvePiResourceRoots(options: PiResourceLoaderOptions): PiResourceRoots;
|
|
127
|
+
/**
|
|
128
|
+
* Load Pi's standard file resources for a conductor.
|
|
129
|
+
*
|
|
130
|
+
* User resources are read first and project resources second. Settings/auth
|
|
131
|
+
* objects are deep-merged, project extension tools replace same-named user
|
|
132
|
+
* tools, and extension loading failures are isolated so a broken optional
|
|
133
|
+
* local extension cannot prevent the fixed harness tools from starting.
|
|
134
|
+
*
|
|
135
|
+
* The conductor intentionally depends on low-level `pi-agent-core` rather
|
|
136
|
+
* than the interactive `pi-coding-agent` package. This loader mirrors the
|
|
137
|
+
* coding-agent resource roots and extension registration boundary without
|
|
138
|
+
* adding Pi's built-in coding tools to the conductor.
|
|
139
|
+
*/
|
|
140
|
+
export declare function loadPiResources(options: PiResourceLoaderOptions): Promise<PiResources>;
|
|
141
|
+
/** Add usable Pi skills to the compiled conductor prompt. */
|
|
142
|
+
export declare function formatPiSkillsForPrompt(skills: PiSkillResource[]): string;
|
|
143
|
+
/** Expand Pi prompt templates and explicit skill invocations for headless sends. */
|
|
144
|
+
export declare function expandPiResourcePrompt(prompt: string, resources: Pick<PiResources, 'prompts' | 'skills'>): string;
|
|
145
|
+
//# sourceMappingURL=pi-resource-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-resource-loader.d.ts","sourceRoot":"","sources":["../../src/conductor/pi-resource-loader.ts"],"names":[],"mappings":"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"}
|