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.
Files changed (61) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/README.md +123 -22
  3. package/dist/adapters/hermes-cli.d.ts +14 -0
  4. package/dist/adapters/hermes-cli.js +80 -21
  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 -20
  16. package/dist/cli.js.map +1 -1
  17. package/dist/config.js +0 -6
  18. package/dist/config.js.map +1 -1
  19. package/dist/doctor.d.ts +8 -1
  20. package/dist/doctor.js +76 -13
  21. package/dist/doctor.js.map +1 -1
  22. package/dist/execution-gate.d.ts +5 -0
  23. package/dist/execution-gate.js +20 -0
  24. package/dist/execution-gate.js.map +1 -0
  25. package/dist/http-server.d.ts +18 -0
  26. package/dist/http-server.js +310 -0
  27. package/dist/http-server.js.map +1 -0
  28. package/dist/install/launcher.d.ts +3 -0
  29. package/dist/install/launcher.js +7 -0
  30. package/dist/install/launcher.js.map +1 -0
  31. package/dist/install/mcp-config.js +12 -3
  32. package/dist/install/mcp-config.js.map +1 -1
  33. package/dist/install/mcp-service.d.ts +44 -0
  34. package/dist/install/mcp-service.js +172 -0
  35. package/dist/install/mcp-service.js.map +1 -0
  36. package/dist/install/templates.js +38 -32
  37. package/dist/install/templates.js.map +1 -1
  38. package/dist/install/types.d.ts +1 -0
  39. package/dist/jobs.d.ts +51 -0
  40. package/dist/jobs.js +244 -0
  41. package/dist/jobs.js.map +1 -0
  42. package/dist/mcp-server.d.ts +32 -0
  43. package/dist/mcp-server.js +394 -25
  44. package/dist/mcp-server.js.map +1 -1
  45. package/dist/policy.js +9 -2
  46. package/dist/policy.js.map +1 -1
  47. package/dist/run.js +0 -1
  48. package/dist/run.js.map +1 -1
  49. package/dist/types.d.ts +2 -4
  50. package/dist/validation.d.ts +1 -0
  51. package/dist/validation.js +8 -0
  52. package/dist/validation.js.map +1 -0
  53. package/docs/ARCHITECTURE.md +69 -9
  54. package/docs/FUNCTIONAL-TESTS.md +27 -12
  55. package/examples/claude-code/SKILL.md +35 -29
  56. package/examples/codex/SKILL.md +35 -29
  57. package/package.json +5 -3
  58. package/plugins/hermes-action/.codex-plugin/plugin.json +30 -0
  59. package/plugins/hermes-action/.mcp.json +8 -0
  60. package/plugins/hermes-action/assets/app-icon.png +0 -0
  61. package/plugins/hermes-action/skills/hermes-action-bridge/SKILL.md +61 -0
@@ -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: any thrown error (bad preset,
12
- * missing/oversized context, adapter failure, serialization) becomes a clean
13
- * structured MCP error instead of crashing the server.
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
- async function delegate(config, options) {
25
- const dryRun = options.dryRun ?? false;
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
- const result = await runHermesCli(config, run, dryRun);
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
- export async function startMcpServer(configPath) {
42
- const config = loadConfig(process.cwd(), configPath);
43
- const server = new McpServer({ name: "hermes-action-bridge", version });
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: "Run Hermes through the configured hermes-action-bridge policy and presets.",
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
- }, (args) => guard(() => delegate(config, {
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: "Shortcut for hermes_run with mode=plan.",
66
- inputSchema: { prompt: z.string().min(1), preset: z.string().optional(), contextFiles: z.array(z.string()).optional() },
67
- }, (args) => guard(() => delegate(config, {
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 hermes-action-bridge presets.",
76
- }, () => guard(() => ({ content: [{ type: "text", text: JSON.stringify(config.presets, null, 2) }] })));
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 command is available.",
80
- }, () => guard(() => ({ content: [{ type: "text", text: JSON.stringify(checkHermesStatus(config), null, 2) }] })));
81
- await server.connect(new StdioServerTransport());
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
@@ -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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAmB,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAsB,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAiC,MAAM,WAAW,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAC5E,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AACnC,MAAM,kBAAkB,GAAG;IACzB,8KAA8K;IAC9K,iGAAiG;IACjG,mFAAmF;IACnF,mHAAmH;CACpH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AA+BZ;;;;GAIG;AACH,KAAK,UAAU,KAAK,CAAC,OAA2D;IAC9E,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1F,CAAC;AACH,CAAC;AAeD,SAAS,YAAY,CAAC,MAAoB,EAAE,OAAwB;IAClE,OAAO,iBAAiB,CAAC,MAAM,EAAE;QAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;QACxC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;QAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,MAAoB,EAAE,OAAwB;IACpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IACvC,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,wBAAwB,EAAE,CAAC,CAAC,MAAM,CAAC;IAC9G,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/F,IAAI,MAAM,CAAC,eAAe;QAAE,QAAQ,CAAC,IAAI,CAAC,+BAA+B,wBAAwB,SAAS,CAAC,CAAC;IAC5G,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,2BAA2B,MAAM,CAAC,QAAQ,EAAE,CAAC;IACtG,MAAM,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,gBAAgB;IACvB,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IACtF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnF,OAAO,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,GAAiB,EAAE,SAA0B,EAAE,WAAmB;IACtF,OAAO;QACL,WAAW;QACX,SAAS;QACT,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC;QAChD,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,aAAa,EAAE,GAAG,CAAC,IAAI;QACvB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,aAAa,EAAE,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,KAA0B,EAC1B,SAAiB,EACjB,OAA4B,EAC5B,QAAyF;IAEzF,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK;QACL,SAAS;QACT,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,aAAa,EAAE,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;QACzC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC5E,GAAG,CAAC,QAAQ,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAc;IACrC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAoB,EAAE,SAAS,GAAG,gBAAgB,EAAE;IACtF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC7D,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,wBAAwB,EAAE,CAAC,EAAE;QACrH,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;gBACjD,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;gBACpE,OAAO;YACT,CAAC;YACD,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE;gBAC9G,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC;aAC9B,CAAC,CAAC,CAAC;QACN,CAAC;KACF,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,mBAAmB,CAAC;QACpC,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE;YACtB,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC/C,IAAI,OAAO;gBAAE,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACxF,CAAC;KACF,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,SAAS,CAAC,OAAO,EAAE,CAAC;QACpB,kBAAkB,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC;QACjE,kBAAkB,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC;IAC7E,CAAC,EAAE,MAAM,CAAC,CAAC;IACX,YAAY,CAAC,KAAK,EAAE,CAAC;IACrB,OAAO;QACL,IAAI;QACJ,SAAS;QACT,SAAS;QACT,QAAQ;QACR,aAAa;QACb,gBAAgB,EAAE,mBAAmB,EAAE;QACvC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,aAAa,CAAC,YAAY,CAAC,CAAC;YAC5B,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAoB,EAAE,UAA+B,EAAE;IAC3F,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,SAAS,CAAC;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,EACzC,EAAE,YAAY,EAAE,kBAAkB,EAAE,CACrC,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,8BAA8B;QACrC,WAAW,EACT,+KAA+K;QACjL,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE;YAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC7B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YAC5C,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;YAC5B,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;YAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YAChD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;SACvD;QACD,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;KACrC,EACD,CAAC,IAAI,EAAE,EAAE,CACP,KAAK,CAAC,GAAG,EAAE,CACT,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE;QAClD,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAA8B;QACzC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,cAAc,EAAE,IAAI,CAAC,cAAc;KACpC,CAAC,CAAC,CACJ,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,2KAA2K;QAC7K,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC7B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;SAC7C;QACD,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;KACrC,EACD,CAAC,IAAI,EAAE,EAAE,CACP,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC9D,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,CAAC,CAAC,CAAC,CACP,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,yCAAyC;QAChD,WAAW,EACT,0JAA0J;QAC5J,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CACxE,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,gCAAgC;QACvC,WAAW,EAAE,kFAAkF;QAC/F,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAC9C,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,6BAA6B;QACpC,WAAW,EAAE,kGAAkG;QAC/G,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CACzD,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EACT,kMAAkM;QACpM,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE;YAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC7B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YAC5C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YAChD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;SACvD;QACD,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;KACrC,EACD,CAAC,IAAI,EAAE,EAAE,CACP,KAAK,CAAC,GAAG,EAAE;QACT,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAA8B;YACzC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC,CAAC;QACH,MAAM,GAAG,GAAiB;YACxB,GAAG,KAAK;YACR,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;YAChE,IAAI,EAAE,KAAK;SACZ,CAAC;QACF,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,sFAAsF;QACnG,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;QAChC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACZ,KAAK,CAAC,GAAG,EAAE;QACT,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC;QACnD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,GAAG,CAAC;QAC3C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,+EAA+E;QAC5F,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;QAChC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACZ,KAAK,CAAC,GAAG,EAAE;QACT,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC;QACnD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,kEAAkE;QAC/E,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;KACjC,EACD,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACZ,KAAK,CAAC,GAAG,EAAE;QACT,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC;QACnD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,yCAAyC;QAChD,WAAW,EACT,oLAAoL;QACtL,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC7B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YAC5C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;YAChD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;SACvD;QACD,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;KACrC,EACD,CAAC,IAAI,EAAE,EAAE,CACP,KAAK,CAAC,GAAG,EAAE;QACT,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC,CAAC;QACH,MAAM,GAAG,GAAiB,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC9E,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,UAAU,CAAC;YAChB,GAAG,QAAQ;YACX,OAAO,EAAE;gBACP,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;gBAChC,aAAa,EAAE,GAAG,CAAC,IAAI;gBACvB,aAAa,EAAE,GAAG,CAAC,aAAa;gBAChC,YAAY,EAAE,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACnE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;aAC7C;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,6CAA6C;QACpD,WAAW,EACT,mIAAmI;QACrI,WAAW,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;QACrC,WAAW,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KAC5D,EACD,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CACjB,KAAK,CAAC,GAAG,EAAE;QACT,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,0DAA0D,UAAU,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACtG,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,UAAU,EAAE,CAAC,CAAC;QACvG,MAAM,GAAG,GAAiB,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;QACzF,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,SAAkB,EAAE,CAAC;QACrE,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpF,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzC,OAAO,UAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EAAE,uEAAuE;QACpF,WAAW,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;KACtC,EACD,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CACjB,KAAK,CAAC,GAAG,EAAE;QACT,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,0DAA0D,UAAU,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC,CAAC,CACL,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,OAAsB,EAAE,KAAa,EAAE,WAAmB;IAChF,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAC;AAC7G,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAsB,EACtB,GAAiB,EACjB,OAA4B,EAC5B,WAAoB;IAEpB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;QACnC,WAAW,EAAE,CAAC,SAAS,EAAE,EAAE;YACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC5C,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,WAAW;KACZ,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAsB,EAAE,UAAkB,EAAE,WAAmB;IAC1F,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;IAC/D,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,UAAU,EAAE,CAAC,CAAC;IACrH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,QAA0C,EAAE,MAA+B;IACrG,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAmB;IACtD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,IAAI,cAAyC,CAAC;IAC9C,MAAM,cAAc,GAAG,GAAkB,EAAE;QACzC,cAAc,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO,cAAc,CAAC;IACxB,CAAC,CAAC;IACF,MAAM,oBAAoB,GAAG,GAAS,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;QACzC,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,oBAAoB,EAAE,CAAC;IACzB,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,KAAK,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACvC,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;QACvB,KAAK,cAAc,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACtD,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oBAAoB,EAAE,CAAC;QACvB,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
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
- const approvalRequired = !yolo && detectedRisks.some((risk) => policy.requireApprovalFor.includes(risk));
22
- const mode = approvalRequired && requestedMode === "execute" ? "request-approval" : requestedMode;
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
@@ -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,gBAAgB,GAAG,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACzG,MAAM,IAAI,GAAG,gBAAgB,IAAI,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,aAAa,CAAC;IAClG,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC;AAClE,CAAC"}
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,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO;QACrE,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"}
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"}