hermes-action-bridge 0.3.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.
- package/CHANGELOG.md +70 -0
- package/README.md +123 -22
- package/dist/adapters/hermes-cli.d.ts +14 -0
- package/dist/adapters/hermes-cli.js +80 -21
- package/dist/adapters/hermes-cli.js.map +1 -1
- package/dist/approvals.d.ts +35 -0
- package/dist/approvals.js +96 -0
- package/dist/approvals.js.map +1 -0
- package/dist/audit-log.d.ts +21 -0
- package/dist/audit-log.js +31 -0
- package/dist/audit-log.js.map +1 -0
- package/dist/capabilities.d.ts +29 -0
- package/dist/capabilities.js +24 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/cli.js +205 -20
- package/dist/cli.js.map +1 -1
- package/dist/config.js +0 -6
- package/dist/config.js.map +1 -1
- package/dist/doctor.d.ts +8 -1
- package/dist/doctor.js +76 -13
- package/dist/doctor.js.map +1 -1
- package/dist/execution-gate.d.ts +5 -0
- package/dist/execution-gate.js +20 -0
- package/dist/execution-gate.js.map +1 -0
- package/dist/http-server.d.ts +18 -0
- package/dist/http-server.js +310 -0
- package/dist/http-server.js.map +1 -0
- package/dist/install/launcher.d.ts +3 -0
- package/dist/install/launcher.js +7 -0
- package/dist/install/launcher.js.map +1 -0
- package/dist/install/mcp-config.js +12 -3
- package/dist/install/mcp-config.js.map +1 -1
- package/dist/install/mcp-service.d.ts +44 -0
- package/dist/install/mcp-service.js +172 -0
- package/dist/install/mcp-service.js.map +1 -0
- package/dist/install/templates.js +38 -32
- package/dist/install/templates.js.map +1 -1
- package/dist/install/types.d.ts +1 -0
- package/dist/jobs.d.ts +51 -0
- package/dist/jobs.js +244 -0
- package/dist/jobs.js.map +1 -0
- package/dist/mcp-server.d.ts +32 -0
- package/dist/mcp-server.js +394 -25
- package/dist/mcp-server.js.map +1 -1
- package/dist/policy.js +9 -2
- package/dist/policy.js.map +1 -1
- package/dist/run.js +0 -1
- package/dist/run.js.map +1 -1
- package/dist/types.d.ts +2 -4
- package/dist/validation.d.ts +1 -0
- package/dist/validation.js +8 -0
- package/dist/validation.js.map +1 -0
- package/docs/ARCHITECTURE.md +69 -9
- package/docs/FUNCTIONAL-TESTS.md +27 -12
- package/examples/claude-code/SKILL.md +35 -29
- package/examples/codex/SKILL.md +35 -29
- package/package.json +5 -3
- package/plugins/hermes-action/.codex-plugin/plugin.json +30 -0
- package/plugins/hermes-action/.mcp.json +8 -0
- package/plugins/hermes-action/assets/app-icon.png +0 -0
- package/plugins/hermes-action/skills/hermes-action-bridge/SKILL.md +61 -0
package/dist/mcp-server.js
CHANGED
|
@@ -1,16 +1,30 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
1
3
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
5
|
import { z } from "zod";
|
|
6
|
+
import { appendAuditEvent, fingerprintPrompt } from "./audit-log.js";
|
|
7
|
+
import { createApprovalStore } from "./approvals.js";
|
|
8
|
+
import { startHermesCli } from "./adapters/hermes-cli.js";
|
|
9
|
+
import { getBridgeCapabilities } from "./capabilities.js";
|
|
4
10
|
import { loadConfig } from "./config.js";
|
|
11
|
+
import { createExecutionGate } from "./execution-gate.js";
|
|
12
|
+
import { createJobStore, defaultJobMaxOutputBytes } from "./jobs.js";
|
|
5
13
|
import { buildEffectiveRun } from "./run.js";
|
|
6
|
-
import { runHermesCli } from "./adapters/hermes-cli.js";
|
|
7
14
|
import { checkHermesStatus } from "./status.js";
|
|
8
15
|
import { version } from "./version.js";
|
|
9
16
|
const modeSchema = z.enum(["plan", "draft", "execute", "request-approval"]);
|
|
17
|
+
const idSchema = z.string().uuid();
|
|
18
|
+
const serverInstructions = [
|
|
19
|
+
"Use Hermes for capabilities owned by the Hermes runtime: configured skills, connected services, messaging, schedules, browser workflows, and persistent external automation.",
|
|
20
|
+
"Call hermes_capabilities before assuming that a Hermes preset, skill, or toolset is configured.",
|
|
21
|
+
"Prefer hermes_plan or hermes_prepare before an action with external side effects.",
|
|
22
|
+
"Do not delegate ordinary local code edits or repository inspection when the host agent can perform them directly.",
|
|
23
|
+
].join(" ");
|
|
10
24
|
/**
|
|
11
|
-
* Single error boundary for every tool handler:
|
|
12
|
-
*
|
|
13
|
-
*
|
|
25
|
+
* Single error boundary for every tool handler: bad presets, missing context,
|
|
26
|
+
* process errors, storage errors, and serialization become structured MCP
|
|
27
|
+
* errors instead of terminating the server.
|
|
14
28
|
*/
|
|
15
29
|
async function guard(produce) {
|
|
16
30
|
try {
|
|
@@ -21,29 +35,133 @@ async function guard(produce) {
|
|
|
21
35
|
return { content: [{ type: "text", text: `Bridge error: ${message}` }], isError: true };
|
|
22
36
|
}
|
|
23
37
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const run = buildEffectiveRun(config, {
|
|
38
|
+
function effectiveRun(config, options) {
|
|
39
|
+
return buildEffectiveRun(config, {
|
|
27
40
|
prompt: options.prompt,
|
|
28
41
|
mode: options.mode,
|
|
29
42
|
preset: options.preset,
|
|
30
43
|
contextFiles: options.contextFiles ?? [],
|
|
31
44
|
yolo: options.yolo ?? false,
|
|
32
|
-
dryRun,
|
|
45
|
+
dryRun: options.dryRun ?? false,
|
|
33
46
|
json: false,
|
|
47
|
+
provider: options.provider,
|
|
48
|
+
model: options.model,
|
|
49
|
+
maxTurns: options.maxTurns,
|
|
50
|
+
timeoutSeconds: options.timeoutSeconds,
|
|
34
51
|
});
|
|
35
|
-
|
|
52
|
+
}
|
|
53
|
+
async function delegate(config, options) {
|
|
54
|
+
const dryRun = options.dryRun ?? false;
|
|
55
|
+
const run = effectiveRun(config, options);
|
|
56
|
+
const result = await startHermesCli(config, run, dryRun, { maxOutputBytes: defaultJobMaxOutputBytes }).result;
|
|
36
57
|
const sections = [result.stdout, result.stderr].filter((section) => section.trim().length > 0);
|
|
58
|
+
if (result.outputTruncated)
|
|
59
|
+
sections.push(`[Hermes output truncated at ${defaultJobMaxOutputBytes} bytes]`);
|
|
37
60
|
const text = sections.length > 0 ? sections.join("\n") : `Hermes exited with code ${result.exitCode}`;
|
|
38
61
|
const content = [{ type: "text", text }];
|
|
39
62
|
return result.ok ? { content } : { content, isError: true };
|
|
40
63
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
64
|
+
function jsonResult(value) {
|
|
65
|
+
return { content: [{ type: "text", text: JSON.stringify(value, null, 2) }] };
|
|
66
|
+
}
|
|
67
|
+
function defaultAuditFile() {
|
|
68
|
+
if (process.env.HERMES_ACTION_AUDIT_FILE)
|
|
69
|
+
return process.env.HERMES_ACTION_AUDIT_FILE;
|
|
70
|
+
const stateHome = process.env.XDG_STATE_HOME || join(homedir(), ".local", "state");
|
|
71
|
+
return join(stateHome, "hermes-action", "audit.jsonl");
|
|
72
|
+
}
|
|
73
|
+
function auditContext(run, transport, principalId) {
|
|
74
|
+
return {
|
|
75
|
+
principalId,
|
|
76
|
+
transport,
|
|
77
|
+
promptFingerprint: fingerprintPrompt(run.prompt),
|
|
78
|
+
requestedMode: run.requestedMode,
|
|
79
|
+
effectiveMode: run.mode,
|
|
80
|
+
presetName: run.presetName,
|
|
81
|
+
detectedRisks: [...run.detectedRisks],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function auditEvent(phase, requestId, context, terminal) {
|
|
85
|
+
return {
|
|
86
|
+
timestamp: new Date().toISOString(),
|
|
87
|
+
phase,
|
|
88
|
+
requestId,
|
|
89
|
+
principalId: context.principalId,
|
|
90
|
+
transport: context.transport,
|
|
91
|
+
requestedMode: context.requestedMode,
|
|
92
|
+
effectiveMode: context.effectiveMode,
|
|
93
|
+
presetName: context.presetName,
|
|
94
|
+
detectedRisks: [...context.detectedRisks],
|
|
95
|
+
promptFingerprint: context.promptFingerprint,
|
|
96
|
+
...(terminal?.exitCode === undefined ? {} : { exitCode: terminal.exitCode }),
|
|
97
|
+
...(terminal?.outcome === undefined ? {} : { outcome: terminal.outcome }),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function terminalOutcome(job) {
|
|
101
|
+
switch (job.status) {
|
|
102
|
+
case "succeeded":
|
|
103
|
+
return "succeeded";
|
|
104
|
+
case "cancelled":
|
|
105
|
+
return "cancelled";
|
|
106
|
+
case "timed_out":
|
|
107
|
+
return "timed_out";
|
|
108
|
+
default:
|
|
109
|
+
return "failed";
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export function createBridgeRuntime(config, auditFile = defaultAuditFile()) {
|
|
113
|
+
const jobAudit = new Map();
|
|
114
|
+
const approvalAudit = new Map();
|
|
115
|
+
const jobs = createJobStore((run) => startHermesCli(config, run, false, { maxOutputBytes: defaultJobMaxOutputBytes }), {
|
|
116
|
+
onSettled: (job) => {
|
|
117
|
+
const context = jobAudit.get(job.id);
|
|
118
|
+
if (!context)
|
|
119
|
+
return;
|
|
120
|
+
if (job.status === "timed_out" && !job.startedAt) {
|
|
121
|
+
appendAuditEvent(auditFile, auditEvent("expired", job.id, context));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
appendAuditEvent(auditFile, auditEvent(job.status === "cancelled" ? "cancelled" : "completed", job.id, context, {
|
|
125
|
+
exitCode: job.exitCode,
|
|
126
|
+
outcome: terminalOutcome(job),
|
|
127
|
+
}));
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
const approvals = createApprovalStore({
|
|
131
|
+
onExpired: (approval) => {
|
|
132
|
+
const context = approvalAudit.get(approval.id);
|
|
133
|
+
if (context)
|
|
134
|
+
appendAuditEvent(auditFile, auditEvent("expired", approval.id, context));
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
const cleanupTimer = setInterval(() => {
|
|
138
|
+
jobs.cleanup();
|
|
139
|
+
approvals.cleanup();
|
|
140
|
+
pruneAuditContexts(jobAudit, (id) => jobs.get(id) !== undefined);
|
|
141
|
+
pruneAuditContexts(approvalAudit, (id) => approvals.get(id) !== undefined);
|
|
142
|
+
}, 60_000);
|
|
143
|
+
cleanupTimer.unref();
|
|
144
|
+
return {
|
|
145
|
+
jobs,
|
|
146
|
+
approvals,
|
|
147
|
+
auditFile,
|
|
148
|
+
jobAudit,
|
|
149
|
+
approvalAudit,
|
|
150
|
+
directExecutions: createExecutionGate(),
|
|
151
|
+
dispose: async () => {
|
|
152
|
+
clearInterval(cleanupTimer);
|
|
153
|
+
await jobs.shutdown();
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export function createBridgeMcpServer(config, options = {}) {
|
|
158
|
+
const transport = options.transport ?? "stdio";
|
|
159
|
+
const principalId = options.principalId ?? transport;
|
|
160
|
+
const runtime = options.runtime ?? createBridgeRuntime(config);
|
|
161
|
+
const server = new McpServer({ name: "hermes-action-bridge", version }, { instructions: serverInstructions });
|
|
44
162
|
server.registerTool("hermes_run", {
|
|
45
163
|
title: "Delegate a request to Hermes",
|
|
46
|
-
description: "
|
|
164
|
+
description: "Use Hermes-owned skills, connected services, browser workflows, messaging, schedules, or external automation through bridge policy. Do not use for ordinary local code edits.",
|
|
47
165
|
inputSchema: {
|
|
48
166
|
prompt: z.string().min(1),
|
|
49
167
|
mode: modeSchema.optional(),
|
|
@@ -51,33 +169,284 @@ export async function startMcpServer(configPath) {
|
|
|
51
169
|
contextFiles: z.array(z.string()).optional(),
|
|
52
170
|
yolo: z.boolean().optional(),
|
|
53
171
|
dryRun: z.boolean().optional(),
|
|
172
|
+
provider: z.string().optional(),
|
|
173
|
+
model: z.string().optional(),
|
|
174
|
+
maxTurns: z.number().int().positive().optional(),
|
|
175
|
+
timeoutSeconds: z.number().int().positive().optional(),
|
|
54
176
|
},
|
|
55
|
-
|
|
177
|
+
annotations: { openWorldHint: true },
|
|
178
|
+
}, (args) => guard(() => runtime.directExecutions.run(() => delegate(config, {
|
|
56
179
|
prompt: args.prompt,
|
|
57
180
|
mode: args.mode,
|
|
58
181
|
preset: args.preset,
|
|
59
182
|
contextFiles: args.contextFiles,
|
|
60
183
|
yolo: args.yolo,
|
|
61
184
|
dryRun: args.dryRun,
|
|
62
|
-
|
|
185
|
+
provider: args.provider,
|
|
186
|
+
model: args.model,
|
|
187
|
+
maxTurns: args.maxTurns,
|
|
188
|
+
timeoutSeconds: args.timeoutSeconds,
|
|
189
|
+
}))));
|
|
63
190
|
server.registerTool("hermes_plan", {
|
|
64
191
|
title: "Ask Hermes for a plan",
|
|
65
|
-
description: "
|
|
66
|
-
inputSchema: {
|
|
67
|
-
|
|
192
|
+
description: "Ask Hermes to inspect its configured capabilities in plan mode. Hermes may access open-world tools, so review the response before taking or approving an external action.",
|
|
193
|
+
inputSchema: {
|
|
194
|
+
prompt: z.string().min(1),
|
|
195
|
+
preset: z.string().optional(),
|
|
196
|
+
contextFiles: z.array(z.string()).optional(),
|
|
197
|
+
},
|
|
198
|
+
annotations: { openWorldHint: true },
|
|
199
|
+
}, (args) => guard(() => runtime.directExecutions.run(() => delegate(config, {
|
|
68
200
|
prompt: args.prompt,
|
|
69
201
|
mode: "plan",
|
|
70
202
|
preset: args.preset,
|
|
71
203
|
contextFiles: args.contextFiles,
|
|
72
|
-
})));
|
|
204
|
+
}))));
|
|
205
|
+
server.registerTool("hermes_capabilities", {
|
|
206
|
+
title: "Discover configured Hermes capabilities",
|
|
207
|
+
description: "Inspect bridge status, configured presets, skills, toolsets, providers, models, and policy before deciding whether Hermes owns the requested capability.",
|
|
208
|
+
inputSchema: {},
|
|
209
|
+
annotations: { readOnlyHint: true },
|
|
210
|
+
}, () => guard(() => jsonResult(getBridgeCapabilities(config, transport))));
|
|
73
211
|
server.registerTool("hermes_presets", {
|
|
74
|
-
title: "List presets",
|
|
75
|
-
description: "List configured
|
|
76
|
-
|
|
212
|
+
title: "List Hermes delegation presets",
|
|
213
|
+
description: "List configured bridge presets and their declarative Hermes skills and toolsets.",
|
|
214
|
+
annotations: { readOnlyHint: true },
|
|
215
|
+
}, () => guard(() => jsonResult(config.presets)));
|
|
77
216
|
server.registerTool("hermes_status", {
|
|
78
217
|
title: "Check Hermes runtime status",
|
|
79
|
-
description: "Check whether the configured Hermes
|
|
80
|
-
|
|
81
|
-
|
|
218
|
+
description: "Check whether the configured Hermes CLI runtime is available without running a provider request.",
|
|
219
|
+
annotations: { readOnlyHint: true },
|
|
220
|
+
}, () => guard(() => jsonResult(checkHermesStatus(config))));
|
|
221
|
+
server.registerTool("hermes_submit", {
|
|
222
|
+
title: "Submit a cancellable Hermes job",
|
|
223
|
+
description: "Start a long Hermes plan, draft, or approval-preview job and return immediately. Direct execute requests are converted to request-approval; use hermes_prepare and hermes_approve for execution.",
|
|
224
|
+
inputSchema: {
|
|
225
|
+
prompt: z.string().min(1),
|
|
226
|
+
mode: modeSchema.optional(),
|
|
227
|
+
preset: z.string().optional(),
|
|
228
|
+
contextFiles: z.array(z.string()).optional(),
|
|
229
|
+
provider: z.string().optional(),
|
|
230
|
+
model: z.string().optional(),
|
|
231
|
+
maxTurns: z.number().int().positive().optional(),
|
|
232
|
+
timeoutSeconds: z.number().int().positive().optional(),
|
|
233
|
+
},
|
|
234
|
+
annotations: { openWorldHint: true },
|
|
235
|
+
}, (args) => guard(() => {
|
|
236
|
+
const built = effectiveRun(config, {
|
|
237
|
+
prompt: args.prompt,
|
|
238
|
+
mode: args.mode,
|
|
239
|
+
preset: args.preset,
|
|
240
|
+
contextFiles: args.contextFiles,
|
|
241
|
+
provider: args.provider,
|
|
242
|
+
model: args.model,
|
|
243
|
+
maxTurns: args.maxTurns,
|
|
244
|
+
timeoutSeconds: args.timeoutSeconds,
|
|
245
|
+
});
|
|
246
|
+
const run = {
|
|
247
|
+
...built,
|
|
248
|
+
mode: built.mode === "execute" ? "request-approval" : built.mode,
|
|
249
|
+
yolo: false,
|
|
250
|
+
};
|
|
251
|
+
const context = auditContext(run, transport, principalId);
|
|
252
|
+
return jsonResult(submitAuditedJob(runtime, run, context));
|
|
253
|
+
}));
|
|
254
|
+
server.registerTool("hermes_job_status", {
|
|
255
|
+
title: "Check a Hermes job",
|
|
256
|
+
description: "Read lifecycle metadata for an asynchronous Hermes job without returning its output.",
|
|
257
|
+
inputSchema: { jobId: idSchema },
|
|
258
|
+
annotations: { readOnlyHint: true },
|
|
259
|
+
}, ({ jobId }) => guard(() => {
|
|
260
|
+
ensureJobOwner(runtime, jobId, principalId);
|
|
261
|
+
const job = runtime.jobs.get(jobId);
|
|
262
|
+
if (!job)
|
|
263
|
+
throw new Error(`Unknown job: ${jobId}`);
|
|
264
|
+
const { output: _output, ...status } = job;
|
|
265
|
+
return jsonResult(status);
|
|
266
|
+
}));
|
|
267
|
+
server.registerTool("hermes_result", {
|
|
268
|
+
title: "Read a Hermes job result",
|
|
269
|
+
description: "Read the bounded stdout/stderr result of a completed asynchronous Hermes job.",
|
|
270
|
+
inputSchema: { jobId: idSchema },
|
|
271
|
+
annotations: { readOnlyHint: true },
|
|
272
|
+
}, ({ jobId }) => guard(() => {
|
|
273
|
+
ensureJobOwner(runtime, jobId, principalId);
|
|
274
|
+
const job = runtime.jobs.get(jobId);
|
|
275
|
+
if (!job)
|
|
276
|
+
throw new Error(`Unknown job: ${jobId}`);
|
|
277
|
+
return jsonResult(job);
|
|
278
|
+
}));
|
|
279
|
+
server.registerTool("hermes_cancel", {
|
|
280
|
+
title: "Cancel a Hermes job",
|
|
281
|
+
description: "Idempotently cancel a queued or running asynchronous Hermes job.",
|
|
282
|
+
inputSchema: { jobId: idSchema },
|
|
283
|
+
}, ({ jobId }) => guard(() => {
|
|
284
|
+
ensureJobOwner(runtime, jobId, principalId);
|
|
285
|
+
const job = runtime.jobs.cancel(jobId);
|
|
286
|
+
if (!job)
|
|
287
|
+
throw new Error(`Unknown job: ${jobId}`);
|
|
288
|
+
return jsonResult(job);
|
|
289
|
+
}));
|
|
290
|
+
server.registerTool("hermes_prepare", {
|
|
291
|
+
title: "Prepare an external action for approval",
|
|
292
|
+
description: "Create a local, non-executing preview and short-lived one-shot approval ID without invoking Hermes or its tools. The caller must show preview.action to the human before approval.",
|
|
293
|
+
inputSchema: {
|
|
294
|
+
prompt: z.string().min(1),
|
|
295
|
+
preset: z.string().optional(),
|
|
296
|
+
contextFiles: z.array(z.string()).optional(),
|
|
297
|
+
provider: z.string().optional(),
|
|
298
|
+
model: z.string().optional(),
|
|
299
|
+
maxTurns: z.number().int().positive().optional(),
|
|
300
|
+
timeoutSeconds: z.number().int().positive().optional(),
|
|
301
|
+
},
|
|
302
|
+
annotations: { openWorldHint: true },
|
|
303
|
+
}, (args) => guard(() => {
|
|
304
|
+
const built = effectiveRun(config, {
|
|
305
|
+
prompt: args.prompt,
|
|
306
|
+
mode: "execute",
|
|
307
|
+
preset: args.preset,
|
|
308
|
+
contextFiles: args.contextFiles,
|
|
309
|
+
provider: args.provider,
|
|
310
|
+
model: args.model,
|
|
311
|
+
maxTurns: args.maxTurns,
|
|
312
|
+
timeoutSeconds: args.timeoutSeconds,
|
|
313
|
+
});
|
|
314
|
+
const run = { ...built, mode: "request-approval", yolo: false };
|
|
315
|
+
const approval = runtime.approvals.prepare(run);
|
|
316
|
+
const context = auditContext(run, transport, principalId);
|
|
317
|
+
runtime.approvalAudit.set(approval.id, context);
|
|
318
|
+
try {
|
|
319
|
+
appendAuditEvent(runtime.auditFile, auditEvent("prepared", approval.id, context));
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
runtime.approvals.reject(approval.id);
|
|
323
|
+
runtime.approvalAudit.delete(approval.id);
|
|
324
|
+
throw error;
|
|
325
|
+
}
|
|
326
|
+
return jsonResult({
|
|
327
|
+
...approval,
|
|
328
|
+
preview: {
|
|
329
|
+
action: run.prompt,
|
|
330
|
+
presetName: run.presetName,
|
|
331
|
+
requestedMode: run.requestedMode,
|
|
332
|
+
effectiveMode: run.mode,
|
|
333
|
+
detectedRisks: run.detectedRisks,
|
|
334
|
+
contextFiles: run.contextDocuments.map((document) => document.path),
|
|
335
|
+
promptFingerprint: context.promptFingerprint,
|
|
336
|
+
},
|
|
337
|
+
});
|
|
338
|
+
}));
|
|
339
|
+
server.registerTool("hermes_approve", {
|
|
340
|
+
title: "Approve and submit a prepared Hermes action",
|
|
341
|
+
description: "Consume a prepared approval ID exactly once and submit the unchanged request for execution. This can cause external side effects.",
|
|
342
|
+
inputSchema: { approvalId: idSchema },
|
|
343
|
+
annotations: { destructiveHint: true, openWorldHint: true },
|
|
344
|
+
}, ({ approvalId }) => guard(() => {
|
|
345
|
+
const context = ensureApprovalOwner(runtime, approvalId, principalId);
|
|
346
|
+
const current = runtime.approvals.get(approvalId);
|
|
347
|
+
if (!current || current.status !== "awaiting_approval") {
|
|
348
|
+
throw new Error(`Approval is unavailable, expired, or already consumed: ${approvalId}`);
|
|
349
|
+
}
|
|
350
|
+
if (!runtime.jobs.canSubmit())
|
|
351
|
+
throw new Error("Hermes job queue is full; approval was not consumed");
|
|
352
|
+
appendAuditEvent(runtime.auditFile, auditEvent("approved", approvalId, context));
|
|
353
|
+
const consumed = runtime.approvals.approve(approvalId);
|
|
354
|
+
if (!consumed)
|
|
355
|
+
throw new Error(`Approval is unavailable, expired, or already consumed: ${approvalId}`);
|
|
356
|
+
const run = { ...consumed.run, mode: "execute", requestedMode: "execute" };
|
|
357
|
+
const jobContext = { ...context, effectiveMode: "execute" };
|
|
358
|
+
const job = submitAuditedJob(runtime, run, jobContext, consumed.approval.expiresAt);
|
|
359
|
+
runtime.approvalAudit.delete(approvalId);
|
|
360
|
+
return jsonResult({ approval: consumed.approval, job });
|
|
361
|
+
}));
|
|
362
|
+
server.registerTool("hermes_reject", {
|
|
363
|
+
title: "Reject a prepared Hermes action",
|
|
364
|
+
description: "Consume a prepared approval ID without executing the external action.",
|
|
365
|
+
inputSchema: { approvalId: idSchema },
|
|
366
|
+
}, ({ approvalId }) => guard(() => {
|
|
367
|
+
const context = ensureApprovalOwner(runtime, approvalId, principalId);
|
|
368
|
+
const current = runtime.approvals.get(approvalId);
|
|
369
|
+
if (!current || current.status !== "awaiting_approval") {
|
|
370
|
+
throw new Error(`Approval is unavailable, expired, or already consumed: ${approvalId}`);
|
|
371
|
+
}
|
|
372
|
+
appendAuditEvent(runtime.auditFile, auditEvent("rejected", approvalId, context));
|
|
373
|
+
const rejected = runtime.approvals.reject(approvalId);
|
|
374
|
+
if (!rejected)
|
|
375
|
+
throw new Error(`Unknown approval: ${approvalId}`);
|
|
376
|
+
runtime.approvalAudit.delete(approvalId);
|
|
377
|
+
return jsonResult(rejected);
|
|
378
|
+
}));
|
|
379
|
+
return server;
|
|
380
|
+
}
|
|
381
|
+
function ensureJobOwner(runtime, jobId, principalId) {
|
|
382
|
+
const owner = runtime.jobAudit.get(jobId);
|
|
383
|
+
if (!owner)
|
|
384
|
+
throw new Error(`Unknown job: ${jobId}`);
|
|
385
|
+
if (owner.principalId !== principalId)
|
|
386
|
+
throw new Error(`Job is not available to this principal: ${jobId}`);
|
|
387
|
+
}
|
|
388
|
+
function submitAuditedJob(runtime, run, context, startBefore) {
|
|
389
|
+
const job = runtime.jobs.submit(run, {
|
|
390
|
+
beforeStart: (queuedJob) => {
|
|
391
|
+
runtime.jobAudit.set(queuedJob.id, context);
|
|
392
|
+
appendAuditEvent(runtime.auditFile, auditEvent("submitted", queuedJob.id, context));
|
|
393
|
+
},
|
|
394
|
+
startBefore,
|
|
395
|
+
});
|
|
396
|
+
runtime.jobAudit.set(job.id, context);
|
|
397
|
+
return job;
|
|
398
|
+
}
|
|
399
|
+
function ensureApprovalOwner(runtime, approvalId, principalId) {
|
|
400
|
+
const owner = runtime.approvalAudit.get(approvalId);
|
|
401
|
+
if (!owner)
|
|
402
|
+
throw new Error(`Unknown approval: ${approvalId}`);
|
|
403
|
+
if (owner.principalId !== principalId)
|
|
404
|
+
throw new Error(`Approval is not available to this principal: ${approvalId}`);
|
|
405
|
+
return owner;
|
|
406
|
+
}
|
|
407
|
+
function pruneAuditContexts(contexts, exists) {
|
|
408
|
+
for (const id of contexts.keys()) {
|
|
409
|
+
if (!exists(id))
|
|
410
|
+
contexts.delete(id);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
export async function startMcpServer(configPath) {
|
|
414
|
+
const config = loadConfig(process.cwd(), configPath);
|
|
415
|
+
const runtime = createBridgeRuntime(config);
|
|
416
|
+
const server = createBridgeMcpServer(config, { runtime });
|
|
417
|
+
const transport = new StdioServerTransport();
|
|
418
|
+
let disposePromise;
|
|
419
|
+
const disposeRuntime = () => {
|
|
420
|
+
disposePromise ??= runtime.dispose();
|
|
421
|
+
return disposePromise;
|
|
422
|
+
};
|
|
423
|
+
const removeSignalHandlers = () => {
|
|
424
|
+
process.off("SIGINT", onSignal);
|
|
425
|
+
process.off("SIGTERM", onSignal);
|
|
426
|
+
};
|
|
427
|
+
const shutdown = async () => {
|
|
428
|
+
await disposeRuntime();
|
|
429
|
+
await server.close().catch(() => undefined);
|
|
430
|
+
removeSignalHandlers();
|
|
431
|
+
};
|
|
432
|
+
const onSignal = () => {
|
|
433
|
+
void shutdown().catch((error) => {
|
|
434
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
435
|
+
process.exitCode = 1;
|
|
436
|
+
});
|
|
437
|
+
};
|
|
438
|
+
transport.onclose = () => {
|
|
439
|
+
void disposeRuntime().finally(removeSignalHandlers);
|
|
440
|
+
};
|
|
441
|
+
process.once("SIGINT", onSignal);
|
|
442
|
+
process.once("SIGTERM", onSignal);
|
|
443
|
+
try {
|
|
444
|
+
await server.connect(transport);
|
|
445
|
+
}
|
|
446
|
+
catch (error) {
|
|
447
|
+
removeSignalHandlers();
|
|
448
|
+
await disposeRuntime();
|
|
449
|
+
throw error;
|
|
450
|
+
}
|
|
82
451
|
}
|
|
83
452
|
//# sourceMappingURL=mcp-server.js.map
|
package/dist/mcp-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
package/dist/policy.js
CHANGED
|
@@ -16,10 +16,17 @@ export function detectRisks(text) {
|
|
|
16
16
|
return [...risks];
|
|
17
17
|
}
|
|
18
18
|
export function applyPolicy(requestedMode, policy, prompt, yoloFlag) {
|
|
19
|
+
// Detected risks are informative only: they are surfaced to the human and to Hermes, but they never
|
|
20
|
+
// decide the mode. Keyword matching cannot be a security barrier — it is English-biased and trivially
|
|
21
|
+
// evaded by paraphrase. The real, deterministic, language-agnostic barrier is the host agent's approval
|
|
22
|
+
// prompt (Claude Code / Codex asking the human before the call runs). See docs/ARCHITECTURE.md.
|
|
19
23
|
const detectedRisks = detectRisks(prompt);
|
|
20
24
|
const yolo = yoloFlag || policy.yolo;
|
|
21
|
-
|
|
22
|
-
|
|
25
|
+
// Deterministic guard: any `execute` is downgraded to request-approval unless this context is explicitly
|
|
26
|
+
// trusted (empty requireApprovalFor) or yolo is set. Independent of the prompt's language or wording.
|
|
27
|
+
const guardActive = policy.requireApprovalFor.length > 0;
|
|
28
|
+
const approvalRequired = !yolo && guardActive && requestedMode === "execute";
|
|
29
|
+
const mode = approvalRequired ? "request-approval" : requestedMode;
|
|
23
30
|
return { mode, requestedMode, detectedRisks, approvalRequired };
|
|
24
31
|
}
|
|
25
32
|
//# sourceMappingURL=policy.js.map
|
package/dist/policy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAmD;IACnE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,iEAAiE,EAAE;IACxG,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,4DAA4D,EAAE;IAC/F,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,8CAA8C,EAAE;IAC/E,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iDAAiD,EAAE;IAC9E,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,gEAAgE,EAAE;IAC9F,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,mEAAmE,EAAE;IAClG,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,gEAAgE,EAAE;CACzG,CAAC;AASF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,aAAyB,EAAE,MAAoB,EAAE,MAAc,EAAE,QAAiB;IAC5G,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC;IACrC,MAAM,
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAmD;IACnE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,iEAAiE,EAAE;IACxG,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,4DAA4D,EAAE;IAC/F,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,8CAA8C,EAAE;IAC/E,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iDAAiD,EAAE;IAC9E,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,gEAAgE,EAAE;IAC9F,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,mEAAmE,EAAE;IAClG,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,gEAAgE,EAAE;CACzG,CAAC;AASF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,aAAyB,EAAE,MAAoB,EAAE,MAAc,EAAE,QAAiB;IAC5G,oGAAoG;IACpG,sGAAsG;IACtG,wGAAwG;IACxG,gGAAgG;IAChG,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC;IACrC,yGAAyG;IACzG,sGAAsG;IACtG,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;IACzD,MAAM,gBAAgB,GAAG,CAAC,IAAI,IAAI,WAAW,IAAI,aAAa,KAAK,SAAS,CAAC;IAC7E,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,aAAa,CAAC;IACnE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC;AAClE,CAAC"}
|
package/dist/run.js
CHANGED
|
@@ -26,7 +26,6 @@ export function buildEffectiveRun(config, options) {
|
|
|
26
26
|
preset,
|
|
27
27
|
prompt: options.prompt,
|
|
28
28
|
source: options.source || preset.source || config.defaults.source,
|
|
29
|
-
profile: options.profile || preset.profile || config.defaults.profile,
|
|
30
29
|
provider: options.provider || preset.provider,
|
|
31
30
|
model: options.model || preset.model,
|
|
32
31
|
maxTurns: options.maxTurns || preset.maxTurns || config.defaults.maxTurns,
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAgB;IACpD,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAoB,EAAE,OAAmB;IACzE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAChD,MAAM,eAAe,GAAiB;QACpC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;QACxB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,MAAM,CAAC,kBAAkB;KAClF,CAAC;IACF,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,EAAE,eAAe,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEnF,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,UAAU;QACV,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM;QACjE,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAgB;IACpD,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAoB,EAAE,OAAmB;IACzE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAChD,MAAM,eAAe,GAAiB;QACpC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;QACxB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,MAAM,CAAC,kBAAkB;KAClF,CAAC;IACF,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,EAAE,eAAe,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEnF,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,UAAU;QACV,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM;QACjE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ;QAC7C,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;QACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ;QACzE,IAAI;QACJ,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,gBAAgB,EAAE,gBAAgB,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;QACxF,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,IAAI,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC;KAChH,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -15,7 +15,6 @@ export interface PresetConfig {
|
|
|
15
15
|
toolsets: string[];
|
|
16
16
|
provider?: string | undefined;
|
|
17
17
|
model?: string | undefined;
|
|
18
|
-
profile?: string | undefined;
|
|
19
18
|
maxTurns?: number | undefined;
|
|
20
19
|
source?: string | undefined;
|
|
21
20
|
/** Per-preset override of the risk categories that force request-approval. Falls back to the global policy when unset. */
|
|
@@ -23,7 +22,6 @@ export interface PresetConfig {
|
|
|
23
22
|
}
|
|
24
23
|
export interface DefaultsConfig {
|
|
25
24
|
mode: BridgeMode;
|
|
26
|
-
profile?: string | undefined;
|
|
27
25
|
source: string;
|
|
28
26
|
maxTurns: number;
|
|
29
27
|
preset: string;
|
|
@@ -47,7 +45,6 @@ export interface RunOptions {
|
|
|
47
45
|
yolo: boolean;
|
|
48
46
|
dryRun: boolean;
|
|
49
47
|
json: boolean;
|
|
50
|
-
profile?: string | undefined;
|
|
51
48
|
provider?: string | undefined;
|
|
52
49
|
model?: string | undefined;
|
|
53
50
|
maxTurns?: number | undefined;
|
|
@@ -65,7 +62,6 @@ export interface EffectiveRun {
|
|
|
65
62
|
preset: PresetConfig;
|
|
66
63
|
prompt: string;
|
|
67
64
|
source: string;
|
|
68
|
-
profile?: string | undefined;
|
|
69
65
|
provider?: string | undefined;
|
|
70
66
|
model?: string | undefined;
|
|
71
67
|
maxTurns: number;
|
|
@@ -84,6 +80,8 @@ export interface AdapterResult {
|
|
|
84
80
|
/** The full constructed envelope. For large payloads this is what was written to the temp file, not the short `-q` pointer in `command`. */
|
|
85
81
|
prompt: string;
|
|
86
82
|
dryRun: boolean;
|
|
83
|
+
/** True when a bounded capture omitted additional child or dry-run output. */
|
|
84
|
+
outputTruncated?: boolean;
|
|
87
85
|
/** True when the child was killed because it exceeded the timeout. */
|
|
88
86
|
timedOut?: boolean;
|
|
89
87
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function positiveInteger(value: number | undefined, fallback: number, name: string): number;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export function positiveInteger(value, fallback, name) {
|
|
2
|
+
if (value === undefined)
|
|
3
|
+
return fallback;
|
|
4
|
+
if (!Number.isSafeInteger(value) || value <= 0)
|
|
5
|
+
throw new Error(`${name} must be a positive safe integer`);
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,KAAyB,EAAE,QAAgB,EAAE,IAAY;IACvF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kCAAkC,CAAC,CAAC;IAC3G,OAAO,KAAK,CAAC;AACf,CAAC"}
|