hermes-action-bridge 0.4.0 → 0.5.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.
Files changed (53) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +111 -14
  3. package/dist/adapters/hermes-cli.d.ts +14 -0
  4. package/dist/adapters/hermes-cli.js +80 -19
  5. package/dist/adapters/hermes-cli.js.map +1 -1
  6. package/dist/approvals.d.ts +35 -0
  7. package/dist/approvals.js +96 -0
  8. package/dist/approvals.js.map +1 -0
  9. package/dist/audit-log.d.ts +21 -0
  10. package/dist/audit-log.js +31 -0
  11. package/dist/audit-log.js.map +1 -0
  12. package/dist/capabilities.d.ts +29 -0
  13. package/dist/capabilities.js +24 -0
  14. package/dist/capabilities.js.map +1 -0
  15. package/dist/cli.js +205 -18
  16. package/dist/cli.js.map +1 -1
  17. package/dist/doctor.d.ts +8 -1
  18. package/dist/doctor.js +76 -13
  19. package/dist/doctor.js.map +1 -1
  20. package/dist/execution-gate.d.ts +5 -0
  21. package/dist/execution-gate.js +20 -0
  22. package/dist/execution-gate.js.map +1 -0
  23. package/dist/http-server.d.ts +18 -0
  24. package/dist/http-server.js +310 -0
  25. package/dist/http-server.js.map +1 -0
  26. package/dist/install/launcher.d.ts +3 -0
  27. package/dist/install/launcher.js +7 -0
  28. package/dist/install/launcher.js.map +1 -0
  29. package/dist/install/mcp-service.d.ts +44 -0
  30. package/dist/install/mcp-service.js +172 -0
  31. package/dist/install/mcp-service.js.map +1 -0
  32. package/dist/install/templates.js +38 -32
  33. package/dist/install/templates.js.map +1 -1
  34. package/dist/install/types.d.ts +1 -0
  35. package/dist/jobs.d.ts +51 -0
  36. package/dist/jobs.js +244 -0
  37. package/dist/jobs.js.map +1 -0
  38. package/dist/mcp-server.d.ts +32 -0
  39. package/dist/mcp-server.js +382 -25
  40. package/dist/mcp-server.js.map +1 -1
  41. package/dist/types.d.ts +2 -0
  42. package/dist/validation.d.ts +1 -0
  43. package/dist/validation.js +8 -0
  44. package/dist/validation.js.map +1 -0
  45. package/docs/ARCHITECTURE.md +67 -7
  46. package/docs/FUNCTIONAL-TESTS.md +27 -12
  47. package/examples/claude-code/SKILL.md +35 -29
  48. package/examples/codex/SKILL.md +35 -29
  49. package/package.json +5 -3
  50. package/plugins/hermes-action/.codex-plugin/plugin.json +30 -0
  51. package/plugins/hermes-action/.mcp.json +8 -0
  52. package/plugins/hermes-action/assets/app-icon.png +0 -0
  53. package/plugins/hermes-action/skills/hermes-action-bridge/SKILL.md +61 -0
@@ -0,0 +1,20 @@
1
+ import { positiveInteger } from "./validation.js";
2
+ /** Reject excess direct MCP work immediately; asynchronous jobs use their own bounded queue. */
3
+ export function createExecutionGate(maxConcurrent = 4) {
4
+ const limit = positiveInteger(maxConcurrent, 4, "maxConcurrent");
5
+ let active = 0;
6
+ return {
7
+ async run(operation) {
8
+ if (active >= limit)
9
+ throw new Error(`Hermes direct execution limit reached (${limit})`);
10
+ active += 1;
11
+ try {
12
+ return await operation();
13
+ }
14
+ finally {
15
+ active -= 1;
16
+ }
17
+ },
18
+ };
19
+ }
20
+ //# sourceMappingURL=execution-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-gate.js","sourceRoot":"","sources":["../src/execution-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMlD,gGAAgG;AAChG,MAAM,UAAU,mBAAmB,CAAC,gBAAwB,CAAC;IAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;IACjE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO;QACL,KAAK,CAAC,GAAG,CAAI,SAA2B;YACtC,IAAI,MAAM,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,GAAG,CAAC,CAAC;YACzF,MAAM,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,MAAM,SAAS,EAAE,CAAC;YAC3B,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { BridgeConfig } from "./types.js";
2
+ export interface BridgeHttpOptions {
3
+ config: BridgeConfig;
4
+ listen: string;
5
+ port: number;
6
+ allowTailnet: boolean;
7
+ tokenEnv?: string | undefined;
8
+ maxBodyBytes?: number | undefined;
9
+ maxSessions?: number | undefined;
10
+ sessionTtlMs?: number | undefined;
11
+ }
12
+ export interface BridgeHttpHandle {
13
+ host: string;
14
+ port: number;
15
+ close(): Promise<void>;
16
+ }
17
+ export declare function startBridgeHttpServer(options: BridgeHttpOptions): Promise<BridgeHttpHandle>;
18
+ export declare function isTailscaleIpv4(address: string | undefined): boolean;
@@ -0,0 +1,310 @@
1
+ import { createHash, randomUUID, timingSafeEqual } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
5
+ import { createBridgeMcpServer, createBridgeRuntime } from "./mcp-server.js";
6
+ import { positiveInteger } from "./validation.js";
7
+ const defaultMaxBodyBytes = 1024 * 1024;
8
+ const defaultMaxSessions = 64;
9
+ const defaultSessionTtlMs = 30 * 60 * 1000;
10
+ const tokenNamePattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
11
+ export async function startBridgeHttpServer(options) {
12
+ validateNetworkOptions(options);
13
+ const token = readBearerToken(options.tokenEnv);
14
+ const tailnetMode = !isLoopback(options.listen);
15
+ if (tailnetMode && !token)
16
+ throw new Error("A bearer token is required for direct tailnet listening.");
17
+ const principalId = token ? `token:${createHash("sha256").update(token).digest("hex").slice(0, 16)}` : "loopback";
18
+ const maxBodyBytes = positiveInteger(options.maxBodyBytes, defaultMaxBodyBytes, "maxBodyBytes");
19
+ const maxSessions = positiveInteger(options.maxSessions, defaultMaxSessions, "maxSessions");
20
+ const sessionTtlMs = positiveInteger(options.sessionTtlMs, defaultSessionTtlMs, "sessionTtlMs");
21
+ const sessions = new Map();
22
+ const runtime = createBridgeRuntime(options.config);
23
+ const context = {
24
+ options,
25
+ token,
26
+ tailnetMode,
27
+ principalId,
28
+ maxBodyBytes,
29
+ maxSessions,
30
+ sessionTtlMs,
31
+ sessions,
32
+ pendingInitializations: 0,
33
+ runtime,
34
+ };
35
+ const server = createServer((request, response) => void handleRequest(request, response, context));
36
+ const sessionCleanupTimer = setInterval(() => expireSessions(context), Math.min(sessionTtlMs, 60_000));
37
+ sessionCleanupTimer.unref();
38
+ await listen(server, options.listen, options.port);
39
+ const address = server.address();
40
+ if (!address || typeof address === "string")
41
+ throw new Error("Could not determine the HTTP listener address.");
42
+ return {
43
+ host: options.listen,
44
+ port: address.port,
45
+ close: async () => {
46
+ clearInterval(sessionCleanupTimer);
47
+ try {
48
+ await Promise.allSettled([...sessions.values()].map(closeSession));
49
+ sessions.clear();
50
+ await closeServer(server);
51
+ }
52
+ finally {
53
+ await runtime.dispose();
54
+ }
55
+ },
56
+ };
57
+ }
58
+ async function handleRequest(request, response, context) {
59
+ try {
60
+ if (request.url !== "/mcp")
61
+ return sendStatus(response, 404, "Not Found");
62
+ const host = requestHost(request);
63
+ if (!host || !validHost(host, context.options.listen))
64
+ return sendStatus(response, 421, "Misdirected Request");
65
+ if (context.tailnetMode && !isTailscaleIpv4(normalizeRemoteAddress(request.socket.remoteAddress))) {
66
+ return sendStatus(response, 403, "Forbidden");
67
+ }
68
+ if (isTailscaleServeHost(host) && !context.token) {
69
+ response.setHeader("WWW-Authenticate", "Bearer");
70
+ return sendStatus(response, 401, "Tailscale Serve forwarding requires bearer authentication");
71
+ }
72
+ if (context.token && !validBearer(request.headers.authorization, context.token)) {
73
+ response.setHeader("WWW-Authenticate", "Bearer");
74
+ return sendStatus(response, 401, "Unauthorized");
75
+ }
76
+ const sessionId = singleHeader(request.headers["mcp-session-id"]);
77
+ if (request.method === "POST") {
78
+ const body = await readJsonBody(request, context.maxBodyBytes);
79
+ if (sessionId) {
80
+ const session = context.sessions.get(sessionId);
81
+ if (!session)
82
+ return sendMcpError(response, 404, "Unknown MCP session");
83
+ await handleSessionRequest(session, () => session.transport.handleRequest(request, response, body));
84
+ return;
85
+ }
86
+ if (!isInitializeRequest(body))
87
+ return sendMcpError(response, 400, "MCP initialization required");
88
+ expireSessions(context);
89
+ if (context.sessions.size + context.pendingInitializations >= context.maxSessions) {
90
+ return sendMcpError(response, 503, "MCP session limit reached");
91
+ }
92
+ context.pendingInitializations += 1;
93
+ try {
94
+ await initializeSession(request, response, body, context);
95
+ }
96
+ finally {
97
+ context.pendingInitializations -= 1;
98
+ }
99
+ return;
100
+ }
101
+ if (request.method === "GET" || request.method === "DELETE") {
102
+ if (!sessionId)
103
+ return sendMcpError(response, 400, "MCP session ID required");
104
+ const session = context.sessions.get(sessionId);
105
+ if (!session)
106
+ return sendMcpError(response, 404, "Unknown MCP session");
107
+ await handleSessionRequest(session, () => session.transport.handleRequest(request, response));
108
+ return;
109
+ }
110
+ response.setHeader("Allow", "GET, POST, DELETE");
111
+ sendStatus(response, 405, "Method Not Allowed");
112
+ }
113
+ catch (error) {
114
+ const status = error instanceof RequestError ? error.status : 500;
115
+ if (!response.headersSent)
116
+ sendMcpError(response, status, status === 500 ? "Internal server error" : errorMessage(error));
117
+ else
118
+ response.end();
119
+ }
120
+ }
121
+ async function initializeSession(request, response, body, context) {
122
+ const server = createBridgeMcpServer(context.options.config, {
123
+ transport: "http",
124
+ principalId: context.principalId,
125
+ runtime: context.runtime,
126
+ });
127
+ const transport = new StreamableHTTPServerTransport({
128
+ sessionIdGenerator: randomUUID,
129
+ onsessioninitialized: (sessionId) => {
130
+ context.sessions.set(sessionId, { transport, server, lastActivityAt: Date.now(), activeRequests: 1 });
131
+ },
132
+ });
133
+ transport.onclose = () => {
134
+ const sessionId = transport.sessionId;
135
+ if (sessionId)
136
+ context.sessions.delete(sessionId);
137
+ };
138
+ // SDK 1.x exposes `onclose` as an accessor returning `undefined`, which is
139
+ // structurally narrower than `Transport` under exactOptionalPropertyTypes.
140
+ await server.connect(transport);
141
+ try {
142
+ await transport.handleRequest(request, response, body);
143
+ }
144
+ finally {
145
+ const sessionId = transport.sessionId;
146
+ const session = sessionId ? context.sessions.get(sessionId) : undefined;
147
+ if (session) {
148
+ session.activeRequests = Math.max(0, session.activeRequests - 1);
149
+ session.lastActivityAt = Date.now();
150
+ }
151
+ }
152
+ }
153
+ function expireSessions(context) {
154
+ const cutoff = Date.now() - context.sessionTtlMs;
155
+ for (const [sessionId, session] of context.sessions) {
156
+ if (session.activeRequests > 0 || session.lastActivityAt > cutoff)
157
+ continue;
158
+ context.sessions.delete(sessionId);
159
+ void closeSession(session).catch(() => undefined);
160
+ }
161
+ }
162
+ async function handleSessionRequest(session, handle) {
163
+ session.activeRequests += 1;
164
+ session.lastActivityAt = Date.now();
165
+ try {
166
+ await handle();
167
+ }
168
+ finally {
169
+ session.activeRequests = Math.max(0, session.activeRequests - 1);
170
+ session.lastActivityAt = Date.now();
171
+ }
172
+ }
173
+ async function closeSession(session) {
174
+ try {
175
+ await session.transport.close();
176
+ }
177
+ finally {
178
+ await session.server.close();
179
+ }
180
+ }
181
+ function validateNetworkOptions(options) {
182
+ if (!Number.isInteger(options.port) || options.port < 0 || options.port > 65_535) {
183
+ throw new Error("port must be an integer between 0 and 65535");
184
+ }
185
+ if (isLoopback(options.listen))
186
+ return;
187
+ if (!options.allowTailnet)
188
+ throw new Error("Non-loopback listening requires --allow-tailnet.");
189
+ if (!isTailscaleIpv4(options.listen)) {
190
+ throw new Error("Direct remote listening is restricted to a Tailscale IPv4 address in 100.64.0.0/10.");
191
+ }
192
+ if (!options.tokenEnv)
193
+ throw new Error("Direct tailnet listening requires --token-env.");
194
+ }
195
+ function readBearerToken(name) {
196
+ if (!name)
197
+ return undefined;
198
+ if (!tokenNamePattern.test(name))
199
+ throw new Error(`Invalid token environment variable name: ${name}`);
200
+ const token = process.env[name];
201
+ if (!token)
202
+ throw new Error(`Bearer token environment variable is unset: ${name}`);
203
+ if (Buffer.byteLength(token, "utf8") < 32)
204
+ throw new Error("Bearer token must contain at least 32 bytes.");
205
+ return token;
206
+ }
207
+ function validBearer(header, expected) {
208
+ if (!header?.startsWith("Bearer "))
209
+ return false;
210
+ const supplied = Buffer.from(header.slice("Bearer ".length), "utf8");
211
+ const target = Buffer.from(expected, "utf8");
212
+ return supplied.length === target.length && timingSafeEqual(supplied, target);
213
+ }
214
+ function requestHost(request) {
215
+ const header = singleHeader(request.headers.host);
216
+ if (!header)
217
+ return undefined;
218
+ if (header.startsWith("[")) {
219
+ const closingBracket = header.indexOf("]");
220
+ return closingBracket > 1 ? header.slice(1, closingBracket) : undefined;
221
+ }
222
+ return header.split(":")[0] || undefined;
223
+ }
224
+ function validHost(host, listenAddress) {
225
+ if (isLoopback(listenAddress))
226
+ return host === "localhost" || isLoopback(host) || isTailscaleServeHost(host);
227
+ return host === listenAddress;
228
+ }
229
+ function isTailscaleServeHost(host) {
230
+ return /^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+ts\.net$/i.test(host);
231
+ }
232
+ function isLoopback(address) {
233
+ if (address === "localhost" || address === "::1")
234
+ return true;
235
+ const octets = parseIpv4(address);
236
+ return octets?.[0] === 127;
237
+ }
238
+ export function isTailscaleIpv4(address) {
239
+ const octets = address ? parseIpv4(address) : undefined;
240
+ if (!octets)
241
+ return false;
242
+ return octets[0] === 100 && octets[1] >= 64 && octets[1] <= 127;
243
+ }
244
+ function parseIpv4(address) {
245
+ const parts = address.split(".");
246
+ if (parts.length !== 4)
247
+ return undefined;
248
+ const octets = parts.map((part) => Number(part));
249
+ if (octets.some((part, index) => !Number.isInteger(part) || part < 0 || part > 255 || String(part) !== parts[index])) {
250
+ return undefined;
251
+ }
252
+ return octets;
253
+ }
254
+ function normalizeRemoteAddress(address) {
255
+ return address?.startsWith("::ffff:") ? address.slice("::ffff:".length) : address;
256
+ }
257
+ function singleHeader(value) {
258
+ return Array.isArray(value) ? value[0] : value;
259
+ }
260
+ async function readJsonBody(request, maxBytes) {
261
+ const chunks = [];
262
+ let bytes = 0;
263
+ for await (const chunk of request) {
264
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
265
+ bytes += buffer.length;
266
+ if (bytes > maxBytes)
267
+ throw new RequestError(413, "Request body too large");
268
+ chunks.push(buffer);
269
+ }
270
+ try {
271
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
272
+ }
273
+ catch {
274
+ throw new RequestError(400, "Request body is not valid JSON");
275
+ }
276
+ }
277
+ function sendStatus(response, status, message) {
278
+ response.writeHead(status, { "content-type": "text/plain; charset=utf-8" });
279
+ response.end(message);
280
+ }
281
+ function sendMcpError(response, status, message) {
282
+ response.writeHead(status, { "content-type": "application/json" });
283
+ response.end(JSON.stringify({ jsonrpc: "2.0", error: { code: -32000, message }, id: null }));
284
+ }
285
+ function listen(server, host, port) {
286
+ return new Promise((resolve, reject) => {
287
+ const onError = (error) => reject(error);
288
+ server.once("error", onError);
289
+ server.listen(port, host, () => {
290
+ server.off("error", onError);
291
+ resolve();
292
+ });
293
+ });
294
+ }
295
+ function closeServer(server) {
296
+ return new Promise((resolve, reject) => {
297
+ server.close((error) => (error ? reject(error) : resolve()));
298
+ });
299
+ }
300
+ function errorMessage(error) {
301
+ return error instanceof Error ? error.message : String(error);
302
+ }
303
+ class RequestError extends Error {
304
+ status;
305
+ constructor(status, message) {
306
+ super(message);
307
+ this.status = status;
308
+ }
309
+ }
310
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpLauncher } from "./mcp-service.js";
2
+ /** Windows MCP clients need Node plus the CLI script; Unix can execute the shebang-enabled script directly. */
3
+ export declare function bridgeMcpLauncher(scriptPath: string, platform?: NodeJS.Platform, nodePath?: string): McpLauncher;
@@ -0,0 +1,7 @@
1
+ /** Windows MCP clients need Node plus the CLI script; Unix can execute the shebang-enabled script directly. */
2
+ export function bridgeMcpLauncher(scriptPath, platform = process.platform, nodePath = process.execPath) {
3
+ return platform === "win32"
4
+ ? { command: nodePath, args: [scriptPath, "mcp"] }
5
+ : { command: scriptPath, args: ["mcp"] };
6
+ }
7
+ //# sourceMappingURL=launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/install/launcher.ts"],"names":[],"mappings":"AAEA,+GAA+G;AAC/G,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,WAA4B,OAAO,CAAC,QAAQ,EAC5C,WAAmB,OAAO,CAAC,QAAQ;IAEnC,OAAO,QAAQ,KAAK,OAAO;QACzB,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE;QAClD,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { FileChange, McpTarget, SkillAgent } from "./types.js";
2
+ interface CommandError {
3
+ code?: string | undefined;
4
+ message: string;
5
+ }
6
+ export interface McpCommandResult {
7
+ status: number | null;
8
+ stdout: string;
9
+ stderr: string;
10
+ error?: CommandError | undefined;
11
+ }
12
+ /** Injectable process boundary: tests never invoke the real Codex or Claude binaries. */
13
+ export type McpCommandRunner = (command: string, args: string[]) => McpCommandResult;
14
+ export interface McpLauncher {
15
+ command: string;
16
+ args: string[];
17
+ }
18
+ export interface McpServiceOptions {
19
+ launcher: McpLauncher;
20
+ dryRun: boolean;
21
+ runner?: McpCommandRunner | undefined;
22
+ }
23
+ export interface McpTargetResult {
24
+ agent: SkillAgent;
25
+ ok: boolean;
26
+ dryRun: boolean;
27
+ change: FileChange;
28
+ }
29
+ export type McpRegistrationState = "absent" | "current" | "conflict" | "unavailable" | "error";
30
+ export interface McpRegistration {
31
+ agent: SkillAgent;
32
+ state: McpRegistrationState;
33
+ detail?: string | undefined;
34
+ }
35
+ /**
36
+ * Register the stdio bridge via each agent's supported CLI instead of editing
37
+ * implementation-owned TOML/JSON. This preserves unrelated user servers.
38
+ */
39
+ export declare function installMcp(target: McpTarget, options: McpServiceOptions): McpTargetResult[];
40
+ /** Remove only the named bridge registration through the owning agent CLI. */
41
+ export declare function uninstallMcp(target: McpTarget, options: McpServiceOptions): McpTargetResult[];
42
+ /** Public inspection used by doctor and setup reporting. It never mutates agent configuration. */
43
+ export declare function inspectMcp(agent: SkillAgent, launcher: McpLauncher, runner?: McpCommandRunner): McpRegistration;
44
+ export {};
@@ -0,0 +1,172 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { isAbsolute } from "node:path";
3
+ import { versionProbeTimeoutMs } from "../status.js";
4
+ const mcpServerName = "hermes-action";
5
+ const allAgents = ["codex", "claude-code"];
6
+ /**
7
+ * Register the stdio bridge via each agent's supported CLI instead of editing
8
+ * implementation-owned TOML/JSON. This preserves unrelated user servers.
9
+ */
10
+ export function installMcp(target, options) {
11
+ const agents = agentsFor(target);
12
+ const runner = options.runner ?? systemRunner;
13
+ const planned = agents.map((agent) => planInstall(agent, options, runner));
14
+ if (options.dryRun || planned.some((entry) => !entry.ok))
15
+ return planned;
16
+ const applied = [];
17
+ for (const plan of planned) {
18
+ if (plan.change.action === "unchanged") {
19
+ applied.push(plan);
20
+ continue;
21
+ }
22
+ const installed = installOne(plan.agent, options);
23
+ applied.push(installed);
24
+ if (installed.ok)
25
+ continue;
26
+ const failure = installed.change.reason ?? "registration failed";
27
+ return [
28
+ ...rollbackCreated(applied, options, runner, failure),
29
+ ...planned.slice(applied.length).map((entry) => result(entry.agent, "refused", false, `registration not attempted because another agent failed: ${failure}`)),
30
+ ];
31
+ }
32
+ return applied;
33
+ }
34
+ /** Remove only the named bridge registration through the owning agent CLI. */
35
+ export function uninstallMcp(target, options) {
36
+ return forAgents(target, (agent) => uninstallOne(agent, options));
37
+ }
38
+ /** Public inspection used by doctor and setup reporting. It never mutates agent configuration. */
39
+ export function inspectMcp(agent, launcher, runner = systemRunner) {
40
+ if (!isAbsolute(launcher.command))
41
+ return { agent, state: "error", detail: "bridge launcher command must be absolute" };
42
+ const result = runner(agentCommand(agent), getArgs(agent));
43
+ if (result.error?.code === "ENOENT")
44
+ return { agent, state: "unavailable", detail: `${agentCommand(agent)} is not available on PATH` };
45
+ if (result.error)
46
+ return { agent, state: "error", detail: result.error.message };
47
+ const output = `${result.stdout}\n${result.stderr}`;
48
+ if (result.status !== 0) {
49
+ return isMissingServerOutput(output)
50
+ ? { agent, state: "absent" }
51
+ : { agent, state: "error", detail: commandFailure(agentCommand(agent), "inspect", result) };
52
+ }
53
+ const fields = registrationFields(output);
54
+ const expectedScope = agent !== "claude-code" || fields.get("scope")?.startsWith("User") === true;
55
+ const expectedHealth = agent !== "claude-code" || /\bConnected$/i.test(fields.get("status") ?? "");
56
+ const expectedTransport = (fields.get(agent === "claude-code" ? "type" : "transport") ?? "").toLowerCase() === "stdio";
57
+ const expectedCommand = fields.get("command") === launcher.command;
58
+ const expectedArgs = fields.get("args") === launcher.args.join(" ");
59
+ return expectedScope && expectedHealth && expectedTransport && expectedCommand && expectedArgs
60
+ ? { agent, state: "current" }
61
+ : { agent, state: "conflict", detail: `existing ${mcpServerName} registration differs from the requested user-level bridge command` };
62
+ }
63
+ function installOne(agent, options) {
64
+ const runner = options.runner ?? systemRunner;
65
+ const planned = planInstall(agent, options, runner);
66
+ if (planned.change.action !== "created" || options.dryRun)
67
+ return planned;
68
+ const command = agentCommand(agent);
69
+ const added = runner(command, addArgs(agent, options.launcher));
70
+ if (added.error)
71
+ return result(agent, "refused", false, added.error.message);
72
+ if (added.status !== 0)
73
+ return result(agent, "refused", false, commandFailure(command, "register", added));
74
+ const verified = inspectMcp(agent, options.launcher, runner);
75
+ if (verified.state !== "current") {
76
+ const removed = runner(command, removeArgs(agent));
77
+ const verificationFailure = verified.detail ?? "registration could not be verified";
78
+ if (removed.error)
79
+ return result(agent, "refused", false, `${verificationFailure}; rollback failed: ${removed.error.message}`);
80
+ if (removed.status !== 0) {
81
+ return result(agent, "refused", false, `${verificationFailure}; ${commandFailure(command, "roll back", removed)}`);
82
+ }
83
+ return result(agent, "refused", false, `${verificationFailure}; newly added registration was rolled back`);
84
+ }
85
+ return result(agent, "created", false);
86
+ }
87
+ function planInstall(agent, options, runner) {
88
+ const registration = inspectMcp(agent, options.launcher, runner);
89
+ if (registration.state === "current")
90
+ return result(agent, "unchanged", options.dryRun);
91
+ if (registration.state === "absent")
92
+ return result(agent, "created", options.dryRun);
93
+ return result(agent, "refused", options.dryRun, registration.detail ?? `could not inspect ${mcpServerName}`);
94
+ }
95
+ function rollbackCreated(applied, options, runner, failure) {
96
+ const rollbackOptions = { ...options, dryRun: false, runner };
97
+ return applied.map((entry) => {
98
+ if (!entry.ok || entry.change.action !== "created")
99
+ return entry;
100
+ const rolledBack = uninstallOne(entry.agent, rollbackOptions);
101
+ const reason = rolledBack.ok
102
+ ? `registration rolled back because another agent failed: ${failure}`
103
+ : `registration rollback failed after another agent failed: ${rolledBack.change.reason ?? failure}`;
104
+ return result(entry.agent, "refused", false, reason);
105
+ });
106
+ }
107
+ function uninstallOne(agent, options) {
108
+ const runner = options.runner ?? systemRunner;
109
+ const registration = inspectMcp(agent, options.launcher, runner);
110
+ if (registration.state === "absent")
111
+ return result(agent, "unchanged", options.dryRun);
112
+ if (registration.state !== "current")
113
+ return result(agent, "refused", options.dryRun, registration.detail ?? `could not inspect ${mcpServerName}`);
114
+ if (options.dryRun)
115
+ return result(agent, "removed", true);
116
+ const command = agentCommand(agent);
117
+ const removed = runner(command, removeArgs(agent));
118
+ if (removed.error)
119
+ return result(agent, "refused", false, removed.error.message);
120
+ if (removed.status !== 0)
121
+ return result(agent, "refused", false, commandFailure(command, "remove", removed));
122
+ const verified = inspectMcp(agent, options.launcher, runner);
123
+ if (verified.state !== "absent")
124
+ return result(agent, "refused", false, verified.detail ?? "removal could not be verified");
125
+ return result(agent, "removed", false);
126
+ }
127
+ function forAgents(target, operation) {
128
+ return agentsFor(target).map(operation);
129
+ }
130
+ function agentsFor(target) {
131
+ return target === "all" ? allAgents : [target];
132
+ }
133
+ function result(agent, action, dryRun, reason) {
134
+ return { agent, ok: action !== "refused", dryRun, change: { path: `${agent} MCP registration (${mcpServerName})`, action, ...(reason ? { reason } : {}) } };
135
+ }
136
+ function agentCommand(agent) {
137
+ return agent === "codex" ? "codex" : "claude";
138
+ }
139
+ function getArgs(_agent) {
140
+ return ["mcp", "get", mcpServerName];
141
+ }
142
+ function addArgs(agent, launcher) {
143
+ return agent === "codex"
144
+ ? ["mcp", "add", mcpServerName, "--", launcher.command, ...launcher.args]
145
+ : ["mcp", "add", "--scope", "user", "--transport", "stdio", mcpServerName, "--", launcher.command, ...launcher.args];
146
+ }
147
+ function removeArgs(agent) {
148
+ return agent === "codex" ? ["mcp", "remove", mcpServerName] : ["mcp", "remove", "--scope", "user", mcpServerName];
149
+ }
150
+ function commandFailure(command, action, result) {
151
+ const output = `${result.stderr}\n${result.stdout}`.trim();
152
+ return output === "" ? `${command} failed to ${action} ${mcpServerName}` : `${command} failed to ${action} ${mcpServerName}: ${output}`;
153
+ }
154
+ function registrationFields(output) {
155
+ const fields = new Map();
156
+ for (const line of output.split(/\r?\n/)) {
157
+ const match = line.match(/^\s*([A-Za-z]+):\s*(.*?)\s*$/);
158
+ if (match?.[1] && match[2] !== undefined)
159
+ fields.set(match[1].toLowerCase(), match[2]);
160
+ }
161
+ return fields;
162
+ }
163
+ function isMissingServerOutput(output) {
164
+ return /(?:^|\n)(?:Error:\s*)?No MCP server named ['"]hermes-action['"](?: found)?\./i.test(output)
165
+ || /(?:^|\n)(?:Error:\s*)?MCP server ['"]hermes-action['"] not found\b/i.test(output);
166
+ }
167
+ function systemRunner(command, args) {
168
+ const process = spawnSync(command, args, { encoding: "utf8", timeout: versionProbeTimeoutMs });
169
+ const error = process.error ? { code: process.error.code, message: process.error.message } : undefined;
170
+ return { status: process.status, stdout: process.stdout ?? "", stderr: process.stderr ?? "", ...(error ? { error } : {}) };
171
+ }
172
+ //# sourceMappingURL=mcp-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-service.js","sourceRoot":"","sources":["../../src/install/mcp-service.ts"],"names":[],"mappings":"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"}