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
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 {};