@buildautomaton/cli 0.1.44 → 0.1.46
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/bridge-mcp-server.js +161 -0
- package/dist/bridge-mcp-server.js.map +7 -0
- package/dist/cli.js +419 -39
- package/dist/cli.js.map +4 -4
- package/dist/fork-history-mcp-server.js +132 -0
- package/dist/fork-history-mcp-server.js.map +7 -0
- package/dist/index.js +419 -39
- package/dist/index.js.map +4 -4
- package/dist/migrations/004_bridge_runtime.sql +14 -0
- package/package.json +1 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from "module"; const require = createRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// src/mcp/bridge-access/bridge-access-post.ts
|
|
6
|
+
async function bridgeAccessPost(port, path, body) {
|
|
7
|
+
const res = await fetch(`http://127.0.0.1:${port}${path}`, {
|
|
8
|
+
method: "POST",
|
|
9
|
+
headers: { "Content-Type": "application/json" },
|
|
10
|
+
body: JSON.stringify(body)
|
|
11
|
+
});
|
|
12
|
+
const json = await res.json();
|
|
13
|
+
if (!json.ok) {
|
|
14
|
+
throw new Error("error" in json && json.error ? json.error : "Bridge access request failed");
|
|
15
|
+
}
|
|
16
|
+
return json.data;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// src/mcp/bridge-access/client.ts
|
|
20
|
+
function createBridgeAccessClient(port) {
|
|
21
|
+
return {
|
|
22
|
+
listTools: () => bridgeAccessPost(port, "/tools/list", {}),
|
|
23
|
+
callTool: (sessionId, name, args) => bridgeAccessPost(port, "/tools/call", { sessionId, name, args })
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// src/mcp/bridge-mcp-constants.ts
|
|
28
|
+
var BRIDGE_MCP_SERVER_NAME = "buildautomaton-bridge";
|
|
29
|
+
|
|
30
|
+
// src/mcp/parse-bridge-access-port.ts
|
|
31
|
+
function parseBridgeAccessPortFromArgv(argv = process.argv) {
|
|
32
|
+
const raw = argv[2]?.trim() ?? "";
|
|
33
|
+
const port = Number.parseInt(raw, 10);
|
|
34
|
+
if (!Number.isFinite(port) || port <= 0) {
|
|
35
|
+
throw new Error(`Invalid bridge access port argument: ${raw || "(missing)"}`);
|
|
36
|
+
}
|
|
37
|
+
return port;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// src/mcp/parse-mcp-session-id.ts
|
|
41
|
+
function parseMcpSessionId(params, args) {
|
|
42
|
+
const fromParams = typeof params.sessionId === "string" ? params.sessionId.trim() : "";
|
|
43
|
+
if (fromParams) return fromParams;
|
|
44
|
+
const meta = params._meta;
|
|
45
|
+
if (meta && typeof meta === "object" && !Array.isArray(meta)) {
|
|
46
|
+
const fromMeta = typeof meta.sessionId === "string" ? meta.sessionId.trim() : "";
|
|
47
|
+
if (fromMeta) return fromMeta;
|
|
48
|
+
}
|
|
49
|
+
if (args) {
|
|
50
|
+
const fromArgs = typeof args.sessionId === "string" ? args.sessionId.trim() : "";
|
|
51
|
+
if (fromArgs) return fromArgs;
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
function requireMcpSessionId(params, args) {
|
|
56
|
+
const sessionId = parseMcpSessionId(params, args);
|
|
57
|
+
if (!sessionId) {
|
|
58
|
+
throw new Error("sessionId is required in MCP params or tool arguments");
|
|
59
|
+
}
|
|
60
|
+
return sessionId;
|
|
61
|
+
}
|
|
62
|
+
function stripSessionIdFromToolArgs(args) {
|
|
63
|
+
if (!("sessionId" in args)) return args;
|
|
64
|
+
const { sessionId: _ignored, ...rest } = args;
|
|
65
|
+
return rest;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// src/mcp/stdio-mcp-server.ts
|
|
69
|
+
import * as readline from "node:readline";
|
|
70
|
+
var MCP_PROTOCOL_VERSION = "2024-11-05";
|
|
71
|
+
function writeMessage(msg) {
|
|
72
|
+
process.stdout.write(`${JSON.stringify(msg)}
|
|
73
|
+
`);
|
|
74
|
+
}
|
|
75
|
+
function jsonRpcError(id, code, message) {
|
|
76
|
+
writeMessage({ jsonrpc: "2.0", id, error: { code, message } });
|
|
77
|
+
}
|
|
78
|
+
function jsonRpcResult(id, result) {
|
|
79
|
+
writeMessage({ jsonrpc: "2.0", id, result });
|
|
80
|
+
}
|
|
81
|
+
async function runStdioMcpServer(options) {
|
|
82
|
+
const rl = readline.createInterface({ input: process.stdin, terminal: false });
|
|
83
|
+
let initialized = false;
|
|
84
|
+
for await (const line of rl) {
|
|
85
|
+
const trimmed = line.trim();
|
|
86
|
+
if (!trimmed) continue;
|
|
87
|
+
let msg;
|
|
88
|
+
try {
|
|
89
|
+
msg = JSON.parse(trimmed);
|
|
90
|
+
} catch {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const method = typeof msg.method === "string" ? msg.method : "";
|
|
94
|
+
const id = msg.id;
|
|
95
|
+
const params = msg.params && typeof msg.params === "object" && !Array.isArray(msg.params) ? msg.params : {};
|
|
96
|
+
if (method === "notifications/initialized" || method === "initialized") {
|
|
97
|
+
initialized = true;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (id === void 0 && method.startsWith("notifications/")) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
if (method === "initialize") {
|
|
105
|
+
initialized = true;
|
|
106
|
+
jsonRpcResult(id, {
|
|
107
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
108
|
+
capabilities: { tools: {} },
|
|
109
|
+
serverInfo: { name: options.serverName, version: options.serverVersion }
|
|
110
|
+
});
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (!initialized && method !== "initialize") {
|
|
114
|
+
jsonRpcError(id, -32002, "Server not initialized");
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (method === "tools/list") {
|
|
118
|
+
const tools = await options.listTools(params);
|
|
119
|
+
jsonRpcResult(id, { tools });
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (method === "tools/call") {
|
|
123
|
+
const name = typeof params.name === "string" ? params.name : "";
|
|
124
|
+
const args = params.arguments && typeof params.arguments === "object" && !Array.isArray(params.arguments) ? params.arguments : {};
|
|
125
|
+
if (!name) {
|
|
126
|
+
jsonRpcError(id, -32602, "tools/call requires name");
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const result = await options.callTool(name, args, params);
|
|
130
|
+
jsonRpcResult(id, result);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (id !== void 0) {
|
|
134
|
+
jsonRpcError(id, -32601, `Method not found: ${method}`);
|
|
135
|
+
}
|
|
136
|
+
} catch (err) {
|
|
137
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
138
|
+
if (id !== void 0) {
|
|
139
|
+
jsonRpcResult(id, {
|
|
140
|
+
content: [{ type: "text", text: message }],
|
|
141
|
+
isError: true
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// src/mcp/bridge-mcp-server.ts
|
|
149
|
+
var bridgeAccessPort = parseBridgeAccessPortFromArgv();
|
|
150
|
+
var bridgeAccess = createBridgeAccessClient(bridgeAccessPort);
|
|
151
|
+
void runStdioMcpServer({
|
|
152
|
+
serverName: BRIDGE_MCP_SERVER_NAME,
|
|
153
|
+
serverVersion: "0.1.0",
|
|
154
|
+
listTools: () => bridgeAccess.listTools(),
|
|
155
|
+
callTool: (name, args, params) => {
|
|
156
|
+
const sessionId = requireMcpSessionId(params, args);
|
|
157
|
+
const toolArgs = stripSessionIdFromToolArgs(args);
|
|
158
|
+
return bridgeAccess.callTool(sessionId, name, toolArgs);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
//# sourceMappingURL=bridge-mcp-server.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/mcp/bridge-access/bridge-access-post.ts", "../src/mcp/bridge-access/client.ts", "../src/mcp/bridge-mcp-constants.ts", "../src/mcp/parse-bridge-access-port.ts", "../src/mcp/parse-mcp-session-id.ts", "../src/mcp/stdio-mcp-server.ts", "../src/mcp/bridge-mcp-server.ts"],
|
|
4
|
+
"sourcesContent": ["import type { BridgeAccessEnvelope } from './types.js';\n\nexport async function bridgeAccessPost<T>(\n port: number,\n path: string,\n body: Record<string, unknown>,\n): Promise<T> {\n const res = await fetch(`http://127.0.0.1:${port}${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n const json = (await res.json()) as BridgeAccessEnvelope<T>;\n if (!json.ok) {\n throw new Error('error' in json && json.error ? json.error : 'Bridge access request failed');\n }\n return json.data;\n}\n", "import type { BridgeMcpToolCallResult, BridgeMcpToolDefinition } from '../bridge-mcp-tool-types.js';\nimport { bridgeAccessPost } from './bridge-access-post.js';\n\n/** HTTP client used by the stdio MCP subprocess to reach the bridge access server. */\nexport function createBridgeAccessClient(port: number) {\n return {\n listTools: () => bridgeAccessPost<BridgeMcpToolDefinition[]>(port, '/tools/list', {}),\n callTool: (sessionId: string, name: string, args: Record<string, unknown>) =>\n bridgeAccessPost<BridgeMcpToolCallResult>(port, '/tools/call', { sessionId, name, args }),\n };\n}\n", "/** Human-readable name for the single bridge-backed MCP server passed to ACP agents. */\nexport const BRIDGE_MCP_SERVER_NAME = 'buildautomaton-bridge';\n", "/** First CLI argument after the script path: loopback port for the bridge access server. */\nexport function parseBridgeAccessPortFromArgv(argv: string[] = process.argv): number {\n const raw = argv[2]?.trim() ?? '';\n const port = Number.parseInt(raw, 10);\n if (!Number.isFinite(port) || port <= 0) {\n throw new Error(`Invalid bridge access port argument: ${raw || '(missing)'}`);\n }\n return port;\n}\n", "export function parseMcpSessionId(\n params: Record<string, unknown>,\n args?: Record<string, unknown>,\n): string | null {\n const fromParams = typeof params.sessionId === 'string' ? params.sessionId.trim() : '';\n if (fromParams) return fromParams;\n\n const meta = params._meta;\n if (meta && typeof meta === 'object' && !Array.isArray(meta)) {\n const fromMeta =\n typeof (meta as Record<string, unknown>).sessionId === 'string'\n ? ((meta as Record<string, unknown>).sessionId as string).trim()\n : '';\n if (fromMeta) return fromMeta;\n }\n\n if (args) {\n const fromArgs = typeof args.sessionId === 'string' ? args.sessionId.trim() : '';\n if (fromArgs) return fromArgs;\n }\n\n return null;\n}\n\nexport function requireMcpSessionId(\n params: Record<string, unknown>,\n args?: Record<string, unknown>,\n): string {\n const sessionId = parseMcpSessionId(params, args);\n if (!sessionId) {\n throw new Error('sessionId is required in MCP params or tool arguments');\n }\n return sessionId;\n}\n\nexport function stripSessionIdFromToolArgs(args: Record<string, unknown>): Record<string, unknown> {\n if (!('sessionId' in args)) return args;\n const { sessionId: _ignored, ...rest } = args;\n return rest;\n}\n", "/**\n * Minimal MCP server over stdio (newline-delimited JSON-RPC 2.0).\n * Used by the bridge MCP subprocess spawned for ACP agents.\n */\n\nimport * as readline from 'node:readline';\nimport type { BridgeMcpToolCallResult, BridgeMcpToolDefinition } from './bridge-mcp-tool-types.js';\n\nexport type StdioMcpServerOptions = {\n serverName: string;\n serverVersion: string;\n listTools: (params: Record<string, unknown>) => BridgeMcpToolDefinition[] | Promise<BridgeMcpToolDefinition[]>;\n callTool: (\n name: string,\n args: Record<string, unknown>,\n params: Record<string, unknown>,\n ) => Promise<BridgeMcpToolCallResult>;\n};\n\nconst MCP_PROTOCOL_VERSION = '2024-11-05';\n\nfunction writeMessage(msg: Record<string, unknown>): void {\n process.stdout.write(`${JSON.stringify(msg)}\\n`);\n}\n\nfunction jsonRpcError(id: unknown, code: number, message: string): void {\n writeMessage({ jsonrpc: '2.0', id, error: { code, message } });\n}\n\nfunction jsonRpcResult(id: unknown, result: unknown): void {\n writeMessage({ jsonrpc: '2.0', id, result });\n}\n\nexport async function runStdioMcpServer(options: StdioMcpServerOptions): Promise<void> {\n const rl = readline.createInterface({ input: process.stdin, terminal: false });\n let initialized = false;\n\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(trimmed) as Record<string, unknown>;\n } catch {\n continue;\n }\n\n const method = typeof msg.method === 'string' ? msg.method : '';\n const id = msg.id;\n const params =\n msg.params && typeof msg.params === 'object' && !Array.isArray(msg.params)\n ? (msg.params as Record<string, unknown>)\n : {};\n\n if (method === 'notifications/initialized' || method === 'initialized') {\n initialized = true;\n continue;\n }\n\n if (id === undefined && method.startsWith('notifications/')) {\n continue;\n }\n\n try {\n if (method === 'initialize') {\n initialized = true;\n jsonRpcResult(id, {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: { tools: {} },\n serverInfo: { name: options.serverName, version: options.serverVersion },\n });\n continue;\n }\n\n if (!initialized && method !== 'initialize') {\n jsonRpcError(id, -32002, 'Server not initialized');\n continue;\n }\n\n if (method === 'tools/list') {\n const tools = await options.listTools(params);\n jsonRpcResult(id, { tools });\n continue;\n }\n\n if (method === 'tools/call') {\n const name = typeof params.name === 'string' ? params.name : '';\n const args =\n params.arguments && typeof params.arguments === 'object' && !Array.isArray(params.arguments)\n ? (params.arguments as Record<string, unknown>)\n : {};\n if (!name) {\n jsonRpcError(id, -32602, 'tools/call requires name');\n continue;\n }\n const result = await options.callTool(name, args, params);\n jsonRpcResult(id, result);\n continue;\n }\n\n if (id !== undefined) {\n jsonRpcError(id, -32601, `Method not found: ${method}`);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (id !== undefined) {\n jsonRpcResult(id, {\n content: [{ type: 'text', text: message }],\n isError: true,\n });\n }\n }\n }\n}\n", "#!/usr/bin/env node\n/**\n * Stdio MCP server for bridge-backed tools. Spawned by ACP agents via `session/new` `mcpServers`.\n * The bridge access server port is passed as the first CLI argument.\n * tools/list is session-agnostic; tools/call require sessionId in MCP params or tool arguments.\n */\nimport { createBridgeAccessClient } from './bridge-access/client.js';\nimport { BRIDGE_MCP_SERVER_NAME } from './bridge-mcp-constants.js';\nimport { parseBridgeAccessPortFromArgv } from './parse-bridge-access-port.js';\nimport { requireMcpSessionId, stripSessionIdFromToolArgs } from './parse-mcp-session-id.js';\nimport { runStdioMcpServer } from './stdio-mcp-server.js';\n\nconst bridgeAccessPort = parseBridgeAccessPortFromArgv();\nconst bridgeAccess = createBridgeAccessClient(bridgeAccessPort);\n\nvoid runStdioMcpServer({\n serverName: BRIDGE_MCP_SERVER_NAME,\n serverVersion: '0.1.0',\n listTools: () => bridgeAccess.listTools(),\n callTool: (name, args, params) => {\n const sessionId = requireMcpSessionId(params, args);\n const toolArgs = stripSessionIdFromToolArgs(args);\n return bridgeAccess.callTool(sessionId, name, toolArgs);\n },\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|