@buildautomaton/cli 0.1.45 → 0.1.47
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 +1159 -453
- 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 +1138 -432
- package/dist/index.js.map +4 -4
- package/dist/migrations/004_bridge_runtime.sql +14 -0
- package/package.json +1 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from "module"; const require = createRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// src/mcp/stdio-mcp-server.ts
|
|
6
|
+
import * as readline from "node:readline";
|
|
7
|
+
function runStdioMcpServer(options) {
|
|
8
|
+
const rl = readline.createInterface({ input: process.stdin, terminal: false });
|
|
9
|
+
rl.on("line", (line) => {
|
|
10
|
+
void handleLine(line);
|
|
11
|
+
});
|
|
12
|
+
async function handleLine(line) {
|
|
13
|
+
const trimmed = line.trim();
|
|
14
|
+
if (!trimmed) return;
|
|
15
|
+
let msg;
|
|
16
|
+
try {
|
|
17
|
+
msg = JSON.parse(trimmed);
|
|
18
|
+
} catch {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (msg.jsonrpc !== "2.0" || typeof msg.method !== "string") return;
|
|
22
|
+
const id = msg.id;
|
|
23
|
+
const respond = (result) => {
|
|
24
|
+
if (id === void 0) return;
|
|
25
|
+
process.stdout.write(`${JSON.stringify({ jsonrpc: "2.0", id, result })}
|
|
26
|
+
`);
|
|
27
|
+
};
|
|
28
|
+
const respondError = (message) => {
|
|
29
|
+
if (id === void 0) return;
|
|
30
|
+
process.stdout.write(
|
|
31
|
+
`${JSON.stringify({ jsonrpc: "2.0", id, error: { code: -32603, message } })}
|
|
32
|
+
`
|
|
33
|
+
);
|
|
34
|
+
};
|
|
35
|
+
try {
|
|
36
|
+
switch (msg.method) {
|
|
37
|
+
case "initialize":
|
|
38
|
+
respond({
|
|
39
|
+
protocolVersion: "2024-11-05",
|
|
40
|
+
capabilities: { tools: {} },
|
|
41
|
+
serverInfo: { name: options.serverName, version: options.serverVersion }
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
case "notifications/initialized":
|
|
45
|
+
return;
|
|
46
|
+
case "tools/list":
|
|
47
|
+
respond({ tools: options.tools });
|
|
48
|
+
return;
|
|
49
|
+
case "tools/call": {
|
|
50
|
+
const name = typeof msg.params?.name === "string" ? msg.params.name : "";
|
|
51
|
+
const args = msg.params?.arguments != null && typeof msg.params.arguments === "object" && !Array.isArray(msg.params.arguments) ? msg.params.arguments : {};
|
|
52
|
+
if (!name) {
|
|
53
|
+
respondError("Tool name required");
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const result = await options.callTool(name, args);
|
|
57
|
+
respond(result);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
default:
|
|
61
|
+
if (id !== void 0) respondError(`Unknown method: ${msg.method}`);
|
|
62
|
+
}
|
|
63
|
+
} catch (err) {
|
|
64
|
+
respondError(err instanceof Error ? err.message : String(err));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// src/mcp/fork-history-constants.ts
|
|
70
|
+
var FORK_HISTORY_MCP_SERVER_NAME = "buildautomaton-fork-history";
|
|
71
|
+
var FORK_HISTORY_TOOL_LIST_TURNS = "list_forked_session_turns";
|
|
72
|
+
var FORK_HISTORY_TOOL_GET_TURN_TRANSCRIPT = "get_forked_session_turn_transcript";
|
|
73
|
+
|
|
74
|
+
// src/mcp/fork-history-mcp-server.ts
|
|
75
|
+
var ipcPort = Number.parseInt(process.env.BA_MCP_IPC_PORT ?? "", 10);
|
|
76
|
+
var parentSessionId = (process.env.BA_FORK_PARENT_SESSION_ID ?? "").trim();
|
|
77
|
+
async function ipcRequest(body) {
|
|
78
|
+
if (!Number.isFinite(ipcPort) || ipcPort <= 0) {
|
|
79
|
+
throw new Error("BA_MCP_IPC_PORT is not configured");
|
|
80
|
+
}
|
|
81
|
+
const res = await fetch(`http://127.0.0.1:${ipcPort}/fork-history`, {
|
|
82
|
+
method: "POST",
|
|
83
|
+
headers: { "Content-Type": "application/json" },
|
|
84
|
+
body: JSON.stringify(body)
|
|
85
|
+
});
|
|
86
|
+
const json = await res.json();
|
|
87
|
+
if (!json.ok) {
|
|
88
|
+
throw new Error(json.error ?? "Fork history IPC request failed");
|
|
89
|
+
}
|
|
90
|
+
return json.data;
|
|
91
|
+
}
|
|
92
|
+
var tools = [
|
|
93
|
+
{
|
|
94
|
+
name: FORK_HISTORY_TOOL_LIST_TURNS,
|
|
95
|
+
description: "List prompt turns from the parent session this fork continues from. Returns summaries and previews for each turn.",
|
|
96
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false }
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: FORK_HISTORY_TOOL_GET_TURN_TRANSCRIPT,
|
|
100
|
+
description: "Fetch the full transcript for a specific turn from the parent session. Use turnId from list_forked_session_turns.",
|
|
101
|
+
inputSchema: {
|
|
102
|
+
type: "object",
|
|
103
|
+
properties: {
|
|
104
|
+
turnId: { type: "string", description: "Turn id from list_forked_session_turns" }
|
|
105
|
+
},
|
|
106
|
+
required: ["turnId"],
|
|
107
|
+
additionalProperties: false
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
];
|
|
111
|
+
runStdioMcpServer({
|
|
112
|
+
serverName: FORK_HISTORY_MCP_SERVER_NAME,
|
|
113
|
+
serverVersion: "0.1.0",
|
|
114
|
+
tools,
|
|
115
|
+
callTool: async (name, args) => {
|
|
116
|
+
if (!parentSessionId) {
|
|
117
|
+
throw new Error("This MCP server is only available for forked sessions");
|
|
118
|
+
}
|
|
119
|
+
if (name === FORK_HISTORY_TOOL_LIST_TURNS) {
|
|
120
|
+
const data = await ipcRequest({ parentSessionId, action: "list_turns" });
|
|
121
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
122
|
+
}
|
|
123
|
+
if (name === FORK_HISTORY_TOOL_GET_TURN_TRANSCRIPT) {
|
|
124
|
+
const turnId = typeof args.turnId === "string" ? args.turnId.trim() : "";
|
|
125
|
+
if (!turnId) throw new Error("turnId is required");
|
|
126
|
+
const data = await ipcRequest({ parentSessionId, action: "get_turn_transcript", turnId });
|
|
127
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
128
|
+
}
|
|
129
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=fork-history-mcp-server.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/mcp/stdio-mcp-server.ts", "../src/mcp/fork-history-constants.ts", "../src/mcp/fork-history-mcp-server.ts"],
|
|
4
|
+
"sourcesContent": ["import * as readline from 'node:readline';\n\nexport type McpToolDef = {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n};\n\nexport type McpToolHandler = (args: Record<string, unknown>) => Promise<{ content: Array<{ type: 'text'; text: string }> }>;\n\nexport function runStdioMcpServer(options: {\n serverName: string;\n serverVersion: string;\n tools: McpToolDef[];\n callTool: (name: string, args: Record<string, unknown>) => Promise<{ content: Array<{ type: 'text'; text: string }> }>;\n}): void {\n const rl = readline.createInterface({ input: process.stdin, terminal: false });\n rl.on('line', (line) => {\n void handleLine(line);\n });\n\n async function handleLine(line: string): Promise<void> {\n const trimmed = line.trim();\n if (!trimmed) return;\n let msg: { jsonrpc?: string; id?: number | string; method?: string; params?: Record<string, unknown> };\n try {\n msg = JSON.parse(trimmed) as typeof msg;\n } catch {\n return;\n }\n if (msg.jsonrpc !== '2.0' || typeof msg.method !== 'string') return;\n\n const id = msg.id;\n const respond = (result: unknown) => {\n if (id === undefined) return;\n process.stdout.write(`${JSON.stringify({ jsonrpc: '2.0', id, result })}\\n`);\n };\n const respondError = (message: string) => {\n if (id === undefined) return;\n process.stdout.write(\n `${JSON.stringify({ jsonrpc: '2.0', id, error: { code: -32603, message } })}\\n`,\n );\n };\n\n try {\n switch (msg.method) {\n case 'initialize':\n respond({\n protocolVersion: '2024-11-05',\n capabilities: { tools: {} },\n serverInfo: { name: options.serverName, version: options.serverVersion },\n });\n return;\n case 'notifications/initialized':\n return;\n case 'tools/list':\n respond({ tools: options.tools });\n return;\n case 'tools/call': {\n const name = typeof msg.params?.name === 'string' ? msg.params.name : '';\n const args =\n msg.params?.arguments != null &&\n typeof msg.params.arguments === 'object' &&\n !Array.isArray(msg.params.arguments)\n ? (msg.params.arguments as Record<string, unknown>)\n : {};\n if (!name) {\n respondError('Tool name required');\n return;\n }\n const result = await options.callTool(name, args);\n respond(result);\n return;\n }\n default:\n if (id !== undefined) respondError(`Unknown method: ${msg.method}`);\n }\n } catch (err) {\n respondError(err instanceof Error ? err.message : String(err));\n }\n }\n}\n", "/** ACP MCP server name registered for forked sessions (see session/new mcpServers). */\nexport const FORK_HISTORY_MCP_SERVER_NAME = 'buildautomaton-fork-history';\n\nexport const FORK_HISTORY_TOOL_LIST_TURNS = 'list_forked_session_turns';\n\nexport const FORK_HISTORY_TOOL_GET_TURN_TRANSCRIPT = 'get_forked_session_turn_transcript';\n", "#!/usr/bin/env node\n/**\n * Stdio MCP server exposing forked-session parent history tools.\n * Spawned by ACP agents when a session has `parentSessionId`; routes data requests\n * to the CLI bridge via `BA_MCP_IPC_PORT`.\n */\nimport { runStdioMcpServer } from './stdio-mcp-server.js';\nimport {\n FORK_HISTORY_MCP_SERVER_NAME,\n FORK_HISTORY_TOOL_GET_TURN_TRANSCRIPT,\n FORK_HISTORY_TOOL_LIST_TURNS,\n} from './fork-history-constants.js';\n\nconst ipcPort = Number.parseInt(process.env.BA_MCP_IPC_PORT ?? '', 10);\nconst parentSessionId = (process.env.BA_FORK_PARENT_SESSION_ID ?? '').trim();\n\nasync function ipcRequest(body: Record<string, unknown>): Promise<unknown> {\n if (!Number.isFinite(ipcPort) || ipcPort <= 0) {\n throw new Error('BA_MCP_IPC_PORT is not configured');\n }\n const res = await fetch(`http://127.0.0.1:${ipcPort}/fork-history`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n const json = (await res.json()) as { ok?: boolean; data?: unknown; error?: string };\n if (!json.ok) {\n throw new Error(json.error ?? 'Fork history IPC request failed');\n }\n return json.data;\n}\n\nconst tools = [\n {\n name: FORK_HISTORY_TOOL_LIST_TURNS,\n description:\n 'List prompt turns from the parent session this fork continues from. Returns summaries and previews for each turn.',\n inputSchema: { type: 'object', properties: {}, additionalProperties: false },\n },\n {\n name: FORK_HISTORY_TOOL_GET_TURN_TRANSCRIPT,\n description:\n 'Fetch the full transcript for a specific turn from the parent session. Use turnId from list_forked_session_turns.',\n inputSchema: {\n type: 'object',\n properties: {\n turnId: { type: 'string', description: 'Turn id from list_forked_session_turns' },\n },\n required: ['turnId'],\n additionalProperties: false,\n },\n },\n];\n\nrunStdioMcpServer({\n serverName: FORK_HISTORY_MCP_SERVER_NAME,\n serverVersion: '0.1.0',\n tools,\n callTool: async (name, args) => {\n if (!parentSessionId) {\n throw new Error('This MCP server is only available for forked sessions');\n }\n if (name === FORK_HISTORY_TOOL_LIST_TURNS) {\n const data = await ipcRequest({ parentSessionId, action: 'list_turns' });\n return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };\n }\n if (name === FORK_HISTORY_TOOL_GET_TURN_TRANSCRIPT) {\n const turnId = typeof args.turnId === 'string' ? args.turnId.trim() : '';\n if (!turnId) throw new Error('turnId is required');\n const data = await ipcRequest({ parentSessionId, action: 'get_turn_transcript', turnId });\n return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };\n }\n throw new Error(`Unknown tool: ${name}`);\n },\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|