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
@@ -7,58 +7,64 @@ export function contentVersion(content) {
7
7
  export function skillMarkdown() {
8
8
  return `---
9
9
  name: hermes-action-bridge
10
- description: Delegate external actions, Hermes skills, browser automation, messaging, cron jobs, and integrations to Hermes Agent through hermes-action. Use when a task needs capabilities outside the local coding session.
10
+ description: Use Hermes Agent for Hermes-owned skills, memory, connected services, messaging, browser workflows, schedules, and external automation. Prefer the installed hermes_* MCP tools; use the CLI only as a fallback.
11
11
  ---
12
12
 
13
13
  # Hermes Action Bridge
14
14
 
15
- Use this skill when a task needs capabilities outside the local coding session:
16
- Hermes skills or memory, messaging platforms, browser automation, scheduled or
17
- cron automation, external research, or any platform integration already
18
- configured in Hermes Agent.
15
+ Use this skill when a task needs state or capabilities owned by Hermes Agent:
16
+ Hermes skills or memory, connected services, messaging platforms, browser
17
+ workflows, scheduled automation, or another integration configured in Hermes.
19
18
 
20
- Do not reimplement those integrations here. Delegate them to Hermes through the
21
- \`hermes-action\` CLI.
19
+ Do not reimplement a Hermes-owned integration in the coding agent. Prefer the
20
+ installed \`hermes_*\` MCP tools so the host can discover, approve, and inspect
21
+ the delegation.
22
22
 
23
23
  ## When to use
24
24
 
25
- - The task requires a Hermes skill, tool, profile, or connected service.
26
- - The task needs a real-world action that is not local code editing.
27
- - The task needs research, messaging, browser, or scheduled automation Hermes owns.
25
+ - The task names Hermes, a Hermes skill, memory, preset, or connected service.
26
+ - The task needs messaging, scheduling, browser work, or persistent external automation Hermes owns.
27
+ - The task must continue as a cancellable background job outside the local coding step.
28
28
 
29
- ## Safe default
29
+ Do not use Hermes for ordinary local code edits or repository inspection that
30
+ the current agent can perform directly.
30
31
 
31
- Ask Hermes for a plan first; it has no side effects:
32
+ ## Discover first
32
33
 
33
- \`\`\`bash
34
- hermes-action run --mode plan "<describe what Hermes should do>"
35
- \`\`\`
34
+ Call \`hermes_capabilities\` before assuming an integration is configured. Use
35
+ \`hermes_status\` to check the runtime without spending provider tokens.
36
36
 
37
- ## With context
37
+ ## Safe delegation
38
38
 
39
- Write a concise handoff to a file and pass it explicitly:
40
-
41
- \`\`\`bash
42
- hermes-action run --preset coding --context ./handoff.md "<request>"
43
- \`\`\`
39
+ - Use \`hermes_plan\` for plan-mode analysis, but treat it as open-world and review its output.
40
+ - Use \`hermes_submit\`, then \`hermes_job_status\` / \`hermes_result\`, for a
41
+ long cancellable plan or draft.
42
+ - Use \`hermes_cancel\` when a queued or running job is no longer wanted.
44
43
 
45
44
  ## External side effects
46
45
 
47
- For public posts, outbound email or messages, deletes, payments, credential
48
- changes, or git pushes, require human approval:
46
+ For public posts, outbound messages, deletes, payments, credential changes, or
47
+ git pushes:
48
+
49
+ 1. Call \`hermes_prepare\` to produce a local no-tool summary and approval ID.
50
+ 2. Show \`preview.action\` and the rest of the preview to the human.
51
+ 3. Call \`hermes_approve\` only after the human explicitly approves that
52
+ prepared action; otherwise call \`hermes_reject\`.
53
+
54
+ Never treat the model's own decision as human approval.
55
+
56
+ ## CLI fallback
57
+
58
+ If MCP tools are unavailable, use the local CLI:
49
59
 
50
60
  \`\`\`bash
51
- hermes-action run --mode request-approval "<request requiring side effects>"
61
+ hermes-action run --mode plan "<describe what Hermes should do>"
52
62
  \`\`\`
53
63
 
54
- Never use \`--yolo\` unless the human explicitly asked for trusted local
55
- execution. It bypasses only the bridge policy, not Hermes' own safety rules.
56
-
57
64
  ## Verify setup
58
65
 
59
66
  \`\`\`bash
60
- hermes-action status
61
- hermes-action run --dry-run --json "Return BRIDGE_OK only."
67
+ hermes-action doctor
62
68
  \`\`\`
63
69
  `;
64
70
  }
@@ -67,9 +73,9 @@ export function projectHint() {
67
73
  return [
68
74
  "When a task requires Hermes Agent capabilities (skills, memory, messaging,",
69
75
  "browser automation, cron, research, or platform integrations), use the",
70
- "`hermes-action-bridge` skill and delegate through `hermes-action`. Prefer",
71
- "`--mode plan` or `--mode request-approval`; never use `--yolo` unless the",
72
- "human explicitly requested trusted local execution.",
76
+ "`hermes-action-bridge` skill and installed `hermes_*` MCP tools. Discover",
77
+ "capabilities first, prefer `hermes_plan`, and use `hermes_prepare` followed",
78
+ "by `hermes_approve` only after explicit human approval for side effects.",
73
79
  ].join("\n");
74
80
  }
75
81
  /** Canonical MCP server entry for hermes-action, shared by the printed snippets and the .mcp.json writer. */
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/install/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,0GAA0G;AAC1G,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDR,CAAC;AACF,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,4EAA4E;QAC5E,wEAAwE;QACxE,2EAA2E;QAC3E,2EAA2E;QAC3E,qDAAqD;KACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,6GAA6G;AAC7G,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAW,CAAC;AAEnF,0EAA0E;AAC1E,MAAM,UAAU,cAAc;IAC5B,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAC7F,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,6BAA6B,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvG,CAAC"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/install/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,0GAA0G;AAC1G,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DR,CAAC;AACF,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,4EAA4E;QAC5E,wEAAwE;QACxE,2EAA2E;QAC3E,6EAA6E;QAC7E,0EAA0E;KAC3E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,6GAA6G;AAC7G,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAW,CAAC;AAEnF,0EAA0E;AAC1E,MAAM,UAAU,cAAc;IAC5B,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAC7F,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,6BAA6B,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvG,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export type SkillAgent = "claude-code" | "codex";
2
+ export type McpTarget = SkillAgent | "all";
2
3
  export type InstallTarget = SkillAgent | "all" | "mcp";
3
4
  export type InstallScope = "global" | "project";
4
5
  export type ManagedState = "absent" | "current" | "stale" | "user-modified" | "foreign";
package/dist/jobs.d.ts ADDED
@@ -0,0 +1,51 @@
1
+ import type { HermesCliExecution } from "./adapters/hermes-cli.js";
2
+ import type { EffectiveRun } from "./types.js";
3
+ export type JobStatus = "queued" | "running" | "succeeded" | "failed" | "cancelled" | "timed_out";
4
+ export interface JobOutput {
5
+ stdout: string;
6
+ stderr: string;
7
+ truncated: boolean;
8
+ }
9
+ export interface BridgeJob {
10
+ id: string;
11
+ status: JobStatus;
12
+ createdAt: string;
13
+ startedAt?: string | undefined;
14
+ finishedAt?: string | undefined;
15
+ startBefore?: string | undefined;
16
+ expiresAt: string;
17
+ requestedMode: EffectiveRun["requestedMode"];
18
+ effectiveMode: EffectiveRun["mode"];
19
+ presetName: string;
20
+ detectedRisks: EffectiveRun["detectedRisks"];
21
+ exitCode?: number | undefined;
22
+ output?: JobOutput | undefined;
23
+ }
24
+ export interface JobStoreOptions {
25
+ ttlMs?: number | undefined;
26
+ maxOutputBytes?: number | undefined;
27
+ maxConcurrent?: number | undefined;
28
+ maxQueued?: number | undefined;
29
+ now?: () => Date;
30
+ createId?: () => string;
31
+ onSettled?: ((job: BridgeJob) => void) | undefined;
32
+ }
33
+ export interface JobStore {
34
+ submit(run: EffectiveRun, options?: JobSubmitOptions): BridgeJob;
35
+ canSubmit(): boolean;
36
+ get(jobId: string): BridgeJob | undefined;
37
+ cancel(jobId: string): BridgeJob | undefined;
38
+ cleanup(): number;
39
+ shutdown(): Promise<void>;
40
+ }
41
+ export interface JobSubmitOptions {
42
+ beforeStart?: ((job: BridgeJob) => void) | undefined;
43
+ startBefore?: string | undefined;
44
+ }
45
+ export type StartExecution = (run: EffectiveRun) => HermesCliExecution;
46
+ export declare const defaultJobMaxOutputBytes: number;
47
+ /**
48
+ * In-process job storage for long-running Hermes requests. It intentionally keeps no prompt or context
49
+ * document after starting the child process, so a status endpoint cannot expose handoff data.
50
+ */
51
+ export declare function createJobStore(startExecution: StartExecution, options?: JobStoreOptions): JobStore;
package/dist/jobs.js ADDED
@@ -0,0 +1,244 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { positiveInteger } from "./validation.js";
3
+ const defaultTtlMs = 24 * 60 * 60 * 1000;
4
+ export const defaultJobMaxOutputBytes = 256 * 1024;
5
+ const defaultMaxConcurrent = 4;
6
+ const defaultMaxQueued = 32;
7
+ /**
8
+ * In-process job storage for long-running Hermes requests. It intentionally keeps no prompt or context
9
+ * document after starting the child process, so a status endpoint cannot expose handoff data.
10
+ */
11
+ export function createJobStore(startExecution, options = {}) {
12
+ const ttlMs = positiveInteger(options.ttlMs, defaultTtlMs, "ttlMs");
13
+ const maxOutputBytes = positiveInteger(options.maxOutputBytes, defaultJobMaxOutputBytes, "maxOutputBytes");
14
+ const maxConcurrent = positiveInteger(options.maxConcurrent, defaultMaxConcurrent, "maxConcurrent");
15
+ const maxQueued = positiveInteger(options.maxQueued, defaultMaxQueued, "maxQueued");
16
+ const now = options.now ?? (() => new Date());
17
+ const createId = options.createId ?? randomUUID;
18
+ const onSettled = options.onSettled;
19
+ const jobs = new Map();
20
+ const executions = new Map();
21
+ const queuedRuns = new Map();
22
+ const queue = [];
23
+ const cancelRequested = new Set();
24
+ let shuttingDown = false;
25
+ let shutdownPromise;
26
+ const snapshot = (job) => structuredClone(job);
27
+ const notifySettled = (job) => {
28
+ try {
29
+ onSettled?.(snapshot(job));
30
+ }
31
+ catch {
32
+ // Job settlement must not become an unhandled rejection when best-effort telemetry fails.
33
+ }
34
+ };
35
+ const startNext = () => {
36
+ if (shuttingDown)
37
+ return;
38
+ while (executions.size < maxConcurrent) {
39
+ const id = queue.shift();
40
+ if (!id)
41
+ return;
42
+ const job = jobs.get(id);
43
+ const queued = queuedRuns.get(id);
44
+ if (!job || !queued || job.status !== "queued")
45
+ continue;
46
+ queuedRuns.delete(id);
47
+ if (Date.parse(job.startBefore ?? job.expiresAt) <= now().getTime()) {
48
+ job.status = "timed_out";
49
+ job.finishedAt = now().toISOString();
50
+ notifySettled(job);
51
+ continue;
52
+ }
53
+ let execution;
54
+ try {
55
+ queued.beforeStart?.(snapshot(job));
56
+ job.status = "running";
57
+ job.startedAt = now().toISOString();
58
+ execution = startExecution(queued.run);
59
+ }
60
+ catch (error) {
61
+ const message = error instanceof Error ? error.message : String(error);
62
+ settleJob(jobs, executions, cancelRequested, id, failedResult(message), now, maxOutputBytes);
63
+ notifySettled(job);
64
+ continue;
65
+ }
66
+ executions.set(id, execution);
67
+ void execution.result.then((result) => {
68
+ settleJob(jobs, executions, cancelRequested, id, result, now, maxOutputBytes);
69
+ notifySettled(job);
70
+ startNext();
71
+ }, (error) => {
72
+ const message = error instanceof Error ? error.message : String(error);
73
+ settleJob(jobs, executions, cancelRequested, id, failedResult(message), now, maxOutputBytes);
74
+ notifySettled(job);
75
+ startNext();
76
+ });
77
+ }
78
+ };
79
+ const cleanupExpired = () => {
80
+ const current = now().getTime();
81
+ let removed = 0;
82
+ for (const [id, job] of jobs) {
83
+ if (job.status === "running")
84
+ continue;
85
+ const retentionExpired = Date.parse(job.expiresAt) <= current;
86
+ const queuedStartExpired = job.status === "queued"
87
+ && job.startBefore !== undefined
88
+ && Date.parse(job.startBefore) <= current;
89
+ if (!retentionExpired && !queuedStartExpired)
90
+ continue;
91
+ if (job.status === "queued") {
92
+ job.status = "timed_out";
93
+ job.finishedAt = now().toISOString();
94
+ notifySettled(job);
95
+ }
96
+ else if (!isTerminal(job.status)) {
97
+ continue;
98
+ }
99
+ jobs.delete(id);
100
+ executions.delete(id);
101
+ queuedRuns.delete(id);
102
+ removeQueuedId(queue, id);
103
+ cancelRequested.delete(id);
104
+ removed += 1;
105
+ }
106
+ return removed;
107
+ };
108
+ return {
109
+ submit(run, submitOptions = {}) {
110
+ if (shuttingDown)
111
+ throw new Error("Job store is shutting down");
112
+ cleanupExpired();
113
+ if (queuedRuns.size >= maxQueued)
114
+ throw new Error(`Hermes job queue is full (${maxQueued} waiting)`);
115
+ const created = now();
116
+ const startBefore = submitOptions.startBefore === undefined ? undefined : Date.parse(submitOptions.startBefore);
117
+ if (startBefore !== undefined && (!Number.isFinite(startBefore) || startBefore <= created.getTime())) {
118
+ throw new Error("Hermes job start deadline has elapsed or is invalid");
119
+ }
120
+ const id = createId();
121
+ if (jobs.has(id))
122
+ throw new Error("Job ID collision");
123
+ const job = {
124
+ id,
125
+ status: "queued",
126
+ createdAt: created.toISOString(),
127
+ ...(submitOptions.startBefore === undefined ? {} : { startBefore: submitOptions.startBefore }),
128
+ expiresAt: new Date(created.getTime() + ttlMs).toISOString(),
129
+ requestedMode: run.requestedMode,
130
+ effectiveMode: run.mode,
131
+ presetName: run.presetName,
132
+ detectedRisks: [...run.detectedRisks],
133
+ };
134
+ jobs.set(id, job);
135
+ queuedRuns.set(id, { run: structuredClone(run), beforeStart: submitOptions.beforeStart });
136
+ queue.push(id);
137
+ startNext();
138
+ return snapshot(job);
139
+ },
140
+ canSubmit() {
141
+ cleanupExpired();
142
+ return !shuttingDown && queuedRuns.size < maxQueued;
143
+ },
144
+ get(jobId) {
145
+ cleanupExpired();
146
+ const job = jobs.get(jobId);
147
+ return job ? snapshot(job) : undefined;
148
+ },
149
+ cancel(jobId) {
150
+ cleanupExpired();
151
+ const job = jobs.get(jobId);
152
+ const execution = executions.get(jobId);
153
+ if (!job)
154
+ return undefined;
155
+ if (isTerminal(job.status))
156
+ return snapshot(job);
157
+ if (job.status === "queued") {
158
+ queuedRuns.delete(jobId);
159
+ removeQueuedId(queue, jobId);
160
+ job.status = "cancelled";
161
+ job.finishedAt = now().toISOString();
162
+ notifySettled(job);
163
+ return snapshot(job);
164
+ }
165
+ if (cancelRequested.has(jobId))
166
+ return snapshot(job);
167
+ if (!execution || !execution.cancel())
168
+ return snapshot(job);
169
+ cancelRequested.add(jobId);
170
+ return snapshot(job);
171
+ },
172
+ cleanup: cleanupExpired,
173
+ shutdown() {
174
+ if (shutdownPromise)
175
+ return shutdownPromise;
176
+ shuttingDown = true;
177
+ for (const id of [...queuedRuns.keys()]) {
178
+ const job = jobs.get(id);
179
+ queuedRuns.delete(id);
180
+ removeQueuedId(queue, id);
181
+ if (!job || job.status !== "queued")
182
+ continue;
183
+ job.status = "cancelled";
184
+ job.finishedAt = now().toISOString();
185
+ notifySettled(job);
186
+ }
187
+ const active = [...executions.entries()];
188
+ for (const [id, execution] of active) {
189
+ if (cancelRequested.has(id))
190
+ continue;
191
+ if (execution.cancel())
192
+ cancelRequested.add(id);
193
+ }
194
+ shutdownPromise = Promise.allSettled(active.map(([, execution]) => execution.result)).then(() => undefined);
195
+ return shutdownPromise;
196
+ },
197
+ };
198
+ }
199
+ function settleJob(jobs, executions, cancelRequested, jobId, result, now, maxOutputBytes) {
200
+ const job = jobs.get(jobId);
201
+ if (!job || isTerminal(job.status))
202
+ return;
203
+ job.status = cancelRequested.has(jobId) ? "cancelled" : result.timedOut ? "timed_out" : result.ok ? "succeeded" : "failed";
204
+ job.finishedAt = now().toISOString();
205
+ job.exitCode = result.exitCode;
206
+ job.output = boundedOutput(result, maxOutputBytes);
207
+ executions.delete(jobId);
208
+ cancelRequested.delete(jobId);
209
+ }
210
+ function boundedOutput(result, maxBytes) {
211
+ const stdoutBytes = Buffer.byteLength(result.stdout, "utf8");
212
+ const stderrBytes = Buffer.byteLength(result.stderr, "utf8");
213
+ if (stdoutBytes + stderrBytes <= maxBytes) {
214
+ return { stdout: result.stdout, stderr: result.stderr, truncated: result.outputTruncated === true };
215
+ }
216
+ const stdout = truncateUtf8(result.stdout, maxBytes);
217
+ const remainingBytes = maxBytes - Buffer.byteLength(stdout, "utf8");
218
+ return { stdout, stderr: truncateUtf8(result.stderr, remainingBytes), truncated: true };
219
+ }
220
+ /** Avoid cutting a multi-byte character, which could otherwise exceed the byte cap after replacement decoding. */
221
+ function truncateUtf8(value, maxBytes) {
222
+ let result = "";
223
+ let used = 0;
224
+ for (const char of value) {
225
+ const bytes = Buffer.byteLength(char, "utf8");
226
+ if (used + bytes > maxBytes)
227
+ break;
228
+ result += char;
229
+ used += bytes;
230
+ }
231
+ return result;
232
+ }
233
+ function failedResult(message) {
234
+ return { ok: false, exitCode: 1, stdout: "", stderr: message, command: [], prompt: "", dryRun: false };
235
+ }
236
+ function isTerminal(status) {
237
+ return status === "succeeded" || status === "failed" || status === "cancelled" || status === "timed_out";
238
+ }
239
+ function removeQueuedId(queue, jobId) {
240
+ const index = queue.indexOf(jobId);
241
+ if (index >= 0)
242
+ queue.splice(index, 1);
243
+ }
244
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
@@ -1 +1,33 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type ApprovalStore } from "./approvals.js";
3
+ import { type ExecutionGate } from "./execution-gate.js";
4
+ import { type JobStore } from "./jobs.js";
5
+ import type { BridgeConfig, BridgeMode, EffectiveRun } from "./types.js";
6
+ type BridgeTransport = "stdio" | "http";
7
+ interface RequestAuditContext {
8
+ principalId: string;
9
+ transport: BridgeTransport;
10
+ promptFingerprint: string;
11
+ requestedMode: BridgeMode;
12
+ effectiveMode: BridgeMode;
13
+ presetName: string;
14
+ detectedRisks: EffectiveRun["detectedRisks"];
15
+ }
16
+ export interface BridgeRuntime {
17
+ jobs: JobStore;
18
+ approvals: ApprovalStore;
19
+ auditFile: string;
20
+ jobAudit: Map<string, RequestAuditContext>;
21
+ approvalAudit: Map<string, RequestAuditContext>;
22
+ directExecutions: ExecutionGate;
23
+ dispose(): Promise<void>;
24
+ }
25
+ export interface BridgeServerOptions {
26
+ transport?: BridgeTransport | undefined;
27
+ principalId?: string | undefined;
28
+ runtime?: BridgeRuntime | undefined;
29
+ }
30
+ export declare function createBridgeRuntime(config: BridgeConfig, auditFile?: string): BridgeRuntime;
31
+ export declare function createBridgeMcpServer(config: BridgeConfig, options?: BridgeServerOptions): McpServer;
1
32
  export declare function startMcpServer(configPath?: string): Promise<void>;
33
+ export {};