@acpus/runtime 0.1.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -0
  3. package/dist/artifacts.d.ts +30 -0
  4. package/dist/artifacts.d.ts.map +1 -0
  5. package/dist/artifacts.js +97 -0
  6. package/dist/artifacts.js.map +1 -0
  7. package/dist/client.d.ts +54 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +159 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/evaluator.d.ts +37 -0
  12. package/dist/evaluator.d.ts.map +1 -0
  13. package/dist/evaluator.js +101 -0
  14. package/dist/evaluator.js.map +1 -0
  15. package/dist/executors/agent.d.ts +74 -0
  16. package/dist/executors/agent.d.ts.map +1 -0
  17. package/dist/executors/agent.js +401 -0
  18. package/dist/executors/agent.js.map +1 -0
  19. package/dist/executors/mock-program.d.ts +24 -0
  20. package/dist/executors/mock-program.d.ts.map +1 -0
  21. package/dist/executors/mock-program.js +79 -0
  22. package/dist/executors/mock-program.js.map +1 -0
  23. package/dist/executors/program.d.ts +21 -0
  24. package/dist/executors/program.d.ts.map +1 -0
  25. package/dist/executors/program.js +178 -0
  26. package/dist/executors/program.js.map +1 -0
  27. package/dist/executors/types.d.ts +26 -0
  28. package/dist/executors/types.d.ts.map +1 -0
  29. package/dist/executors/types.js +2 -0
  30. package/dist/executors/types.js.map +1 -0
  31. package/dist/index.d.ts +18 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +25 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/interpreter.d.ts +186 -0
  36. package/dist/interpreter.d.ts.map +1 -0
  37. package/dist/interpreter.js +1500 -0
  38. package/dist/interpreter.js.map +1 -0
  39. package/dist/keys.d.ts +36 -0
  40. package/dist/keys.d.ts.map +1 -0
  41. package/dist/keys.js +59 -0
  42. package/dist/keys.js.map +1 -0
  43. package/dist/state-machine.d.ts +27 -0
  44. package/dist/state-machine.d.ts.map +1 -0
  45. package/dist/state-machine.js +87 -0
  46. package/dist/state-machine.js.map +1 -0
  47. package/dist/store.d.ts +46 -0
  48. package/dist/store.d.ts.map +1 -0
  49. package/dist/store.js +260 -0
  50. package/dist/store.js.map +1 -0
  51. package/dist/supervisor-app.d.ts +27 -0
  52. package/dist/supervisor-app.d.ts.map +1 -0
  53. package/dist/supervisor-app.js +548 -0
  54. package/dist/supervisor-app.js.map +1 -0
  55. package/dist/supervisor-discovery.d.ts +17 -0
  56. package/dist/supervisor-discovery.d.ts.map +1 -0
  57. package/dist/supervisor-discovery.js +186 -0
  58. package/dist/supervisor-discovery.js.map +1 -0
  59. package/dist/supervisor-entry.d.ts +11 -0
  60. package/dist/supervisor-entry.d.ts.map +1 -0
  61. package/dist/supervisor-entry.js +50 -0
  62. package/dist/supervisor-entry.js.map +1 -0
  63. package/dist/supervisor-lock.d.ts +26 -0
  64. package/dist/supervisor-lock.d.ts.map +1 -0
  65. package/dist/supervisor-lock.js +49 -0
  66. package/dist/supervisor-lock.js.map +1 -0
  67. package/dist/supervisor-runner.d.ts +11 -0
  68. package/dist/supervisor-runner.d.ts.map +1 -0
  69. package/dist/supervisor-runner.js +128 -0
  70. package/dist/supervisor-runner.js.map +1 -0
  71. package/dist/types.d.ts +230 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +2 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/validate-input.d.ts +27 -0
  76. package/dist/validate-input.d.ts.map +1 -0
  77. package/dist/validate-input.js +56 -0
  78. package/dist/validate-input.js.map +1 -0
  79. package/package.json +66 -0
package/dist/store.js ADDED
@@ -0,0 +1,260 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, mkdirSync, rmSync, readdirSync, readFileSync, renameSync, lstatSync, writeFileSync } from "node:fs";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { encodeNodeKeyForFs, encodeNodeKeyForDir } from "./keys.js";
5
+ /**
6
+ * Per-node JSON file persistence with write-to-temp-then-rename for crash safety.
7
+ *
8
+ * Directory layout:
9
+ * .acpus/state/
10
+ * runs/
11
+ * <run_id>/
12
+ * ir.json # frozen IR snapshot
13
+ * input.json # resolved input
14
+ * run-meta.json # RunState
15
+ * nodes/
16
+ * workflow:step-a.json # NodeExecutionState
17
+ * workflow:mapped:item:0:lane:0.json
18
+ * artifacts/
19
+ * workflow:step-a/
20
+ * transcript.json
21
+ * stdout.txt
22
+ */
23
+ /**
24
+ * Validate a runId is safe for filesystem path construction.
25
+ * Rejects path traversal (..), path separators, and null bytes.
26
+ * Does NOT require strict UUID format — tests may use short IDs like "run-1".
27
+ */
28
+ const UNSAFE_RUN_ID = /(^|\/)\.\.?(\/|$)|[\\:\0]/;
29
+ function validateRunId(runId) {
30
+ if (!runId || UNSAFE_RUN_ID.test(runId)) {
31
+ throw new Error(`Invalid runId: '${runId}' contains unsafe path characters`);
32
+ }
33
+ }
34
+ export class RunStore {
35
+ baseDir;
36
+ constructor(baseDir) {
37
+ this.baseDir = baseDir ?? join(process.cwd(), ".acpus", "state", "runs");
38
+ }
39
+ // ─── Run lifecycle ─────────────────────────────────────────────
40
+ /** Create a new run directory and write IR + input snapshots. */
41
+ initRun(runId, ir, input, source) {
42
+ validateRunId(runId);
43
+ const runDir = this.runDir(runId);
44
+ mkdirSync(join(runDir, "nodes"), { recursive: true });
45
+ mkdirSync(join(runDir, "artifacts"), { recursive: true });
46
+ const irJson = JSON.stringify(ir, null, 2);
47
+ const inputJson = JSON.stringify(input, null, 2);
48
+ const irDigest = sha256(irJson);
49
+ const inputDigest = sha256(inputJson);
50
+ writeFileSync(join(runDir, "ir.json"), irJson, "utf8");
51
+ writeFileSync(join(runDir, "input.json"), inputJson, "utf8");
52
+ const now = new Date().toISOString();
53
+ const meta = {
54
+ runId,
55
+ workflowName: ir.name,
56
+ workflowRef: source?.workflowRef,
57
+ workflowSourcePath: source?.workflowSourcePath ?? ir.source.path,
58
+ status: "running",
59
+ irDigest,
60
+ inputDigest,
61
+ createdAt: now,
62
+ updatedAt: now,
63
+ runAttempt: 1
64
+ };
65
+ this.writeRunMeta(runId, meta);
66
+ return meta;
67
+ }
68
+ /** Read the frozen IR snapshot for a run. */
69
+ readIr(runId) {
70
+ validateRunId(runId);
71
+ return this.readJson(join(this.runDir(runId), "ir.json"));
72
+ }
73
+ /** Read the resolved input for a run. */
74
+ readInput(runId) {
75
+ validateRunId(runId);
76
+ return this.readJson(join(this.runDir(runId), "input.json"));
77
+ }
78
+ // ─── Run metadata ──────────────────────────────────────────────
79
+ writeRunMeta(runId, meta) {
80
+ validateRunId(runId);
81
+ this.atomicWriteJson(join(this.runDir(runId), "run-meta.json"), meta);
82
+ }
83
+ readRunMeta(runId) {
84
+ validateRunId(runId);
85
+ return this.readJson(join(this.runDir(runId), "run-meta.json"));
86
+ }
87
+ // ─── Node state ────────────────────────────────────────────────
88
+ /** Atomically write node execution state. */
89
+ writeNodeState(runId, state) {
90
+ validateRunId(runId);
91
+ const filename = encodeNodeKeyForFs(state.nodeKey);
92
+ this.atomicWriteJson(join(this.runDir(runId), "nodes", filename), state);
93
+ }
94
+ /** Read node execution state. Returns undefined if not found. */
95
+ readNodeState(runId, nodeKey) {
96
+ validateRunId(runId);
97
+ const filename = encodeNodeKeyForFs(nodeKey);
98
+ return this.readJson(join(this.runDir(runId), "nodes", filename));
99
+ }
100
+ /** List all node states for a run. */
101
+ listNodeStates(runId) {
102
+ validateRunId(runId);
103
+ const nodesDir = join(this.runDir(runId), "nodes");
104
+ if (!existsSync(nodesDir))
105
+ return [];
106
+ const files = readdirSync(nodesDir).filter((f) => f.endsWith(".json"));
107
+ return files
108
+ .map((f) => this.readJson(join(nodesDir, f)))
109
+ .filter((s) => s !== undefined);
110
+ }
111
+ // ─── Run discovery ─────────────────────────────────────────────
112
+ /** List all run IDs on disk. */
113
+ listRunIds() {
114
+ if (!existsSync(this.baseDir))
115
+ return [];
116
+ return readdirSync(this.baseDir, { withFileTypes: true })
117
+ .filter((d) => d.isDirectory())
118
+ .map((d) => d.name);
119
+ }
120
+ /** Get the artifacts directory for a node. */
121
+ artifactsDir(runId, nodeKey) {
122
+ validateRunId(runId);
123
+ const dir = join(this.runDir(runId), "artifacts", encodeNodeKeyForDir(nodeKey));
124
+ mkdirSync(dir, { recursive: true });
125
+ return dir;
126
+ }
127
+ /** Check if a run exists on disk. */
128
+ hasRun(runId) {
129
+ validateRunId(runId);
130
+ return existsSync(this.runDir(runId));
131
+ }
132
+ cleanTerminalRuns(options = {}) {
133
+ const dryRun = Boolean(options.dryRun);
134
+ const deleted = [];
135
+ const skipped = [];
136
+ for (const runId of this.listRunIds()) {
137
+ const runDir = this.runDir(runId);
138
+ const meta = this.readRunMeta(runId);
139
+ const bytes = directorySize(runDir);
140
+ if (!meta) {
141
+ skipped.push({ runId, bytes, reason: "corrupt-metadata" });
142
+ continue;
143
+ }
144
+ if (meta.status !== "completed" && meta.status !== "failed" && meta.status !== "cancelled") {
145
+ skipped.push({ runId, status: meta.status, bytes, reason: "not-terminal" });
146
+ continue;
147
+ }
148
+ let deleteStatus = meta.status;
149
+ if (!dryRun) {
150
+ const latest = this.readRunMeta(runId);
151
+ if (!latest) {
152
+ skipped.push({ runId, bytes, reason: "corrupt-metadata" });
153
+ continue;
154
+ }
155
+ if (latest.status !== "completed" && latest.status !== "failed" && latest.status !== "cancelled") {
156
+ skipped.push({ runId, status: latest.status, bytes, reason: "not-terminal" });
157
+ continue;
158
+ }
159
+ deleteStatus = latest.status;
160
+ }
161
+ deleted.push({ runId, status: deleteStatus, bytes });
162
+ if (!dryRun) {
163
+ try {
164
+ rmSync(runDir, { recursive: true });
165
+ }
166
+ catch {
167
+ deleted.pop();
168
+ skipped.push({ runId, status: meta.status, bytes, reason: "delete-failed" });
169
+ }
170
+ }
171
+ }
172
+ return {
173
+ dryRun,
174
+ deletedCount: deleted.length,
175
+ skippedCount: skipped.length,
176
+ bytesReclaimed: deleted.reduce((sum, item) => sum + item.bytes, 0),
177
+ deleted,
178
+ skipped
179
+ };
180
+ }
181
+ /** Get the base directory. */
182
+ getBaseDir() {
183
+ return this.baseDir;
184
+ }
185
+ /**
186
+ * Resolve an `artifact://runs/<runId>/nodes/<safeKey>/<filename>` URI to its
187
+ * absolute filesystem path. Pure (no mkdir). Returns undefined for malformed
188
+ * URIs. Mirrors ArtifactStore's layout: <baseDir>/<runId>/artifacts/<safeKey>/<filename>.
189
+ */
190
+ resolveArtifactPath(uri) {
191
+ const prefix = "artifact://runs/";
192
+ if (!uri.startsWith(prefix))
193
+ return undefined;
194
+ const parts = uri.slice(prefix.length).split("/");
195
+ // Format: <runId>/nodes/<safeKey>/<filename>
196
+ if (parts.length < 4 || parts[1] !== "nodes")
197
+ return undefined;
198
+ const runId = parts[0];
199
+ // Validate runId from URI before using it in path construction
200
+ if (!runId || UNSAFE_RUN_ID.test(runId))
201
+ return undefined;
202
+ // Reject path traversal in safeKey and filename segments
203
+ if (parts.slice(2).some((p) => p === ".." || p === "." || p === ""))
204
+ return undefined;
205
+ const filename = parts[parts.length - 1];
206
+ const safeKey = parts.slice(2, parts.length - 1).join("/");
207
+ if (!runId || !filename || !safeKey)
208
+ return undefined;
209
+ // safeKey is already the encoded form (slashes → colons) used on disk.
210
+ const resolved = resolve(join(this.runDir(runId), "artifacts", safeKey, filename));
211
+ // Defense-in-depth: verify the resolved path stays under the run directory
212
+ const runDir = this.runDir(runId);
213
+ if (!resolved.startsWith(runDir + "/") && resolved !== runDir)
214
+ return undefined;
215
+ return resolved;
216
+ }
217
+ // ─── Internal helpers ──────────────────────────────────────────
218
+ runDir(runId) {
219
+ return join(this.baseDir, runId);
220
+ }
221
+ /** Write JSON via temp file + atomic rename for crash safety. */
222
+ atomicWriteJson(filePath, data) {
223
+ const dir = dirname(filePath);
224
+ mkdirSync(dir, { recursive: true });
225
+ const tmpPath = filePath + ".tmp";
226
+ writeFileSync(tmpPath, JSON.stringify(data, null, 2), "utf8");
227
+ renameSync(tmpPath, filePath);
228
+ }
229
+ /** Read and parse a JSON file. Returns undefined if missing or invalid. */
230
+ readJson(filePath) {
231
+ if (!existsSync(filePath))
232
+ return undefined;
233
+ try {
234
+ return JSON.parse(readFileSync(filePath, "utf8"));
235
+ }
236
+ catch {
237
+ return undefined;
238
+ }
239
+ }
240
+ }
241
+ /** SHA-256 digest of a string. */
242
+ function sha256(content) {
243
+ return `sha256:${createHash("sha256").update(content).digest("hex")}`;
244
+ }
245
+ function directorySize(path) {
246
+ try {
247
+ const stat = lstatSync(path);
248
+ if (!stat.isDirectory())
249
+ return stat.size;
250
+ let total = 0;
251
+ for (const entry of readdirSync(path, { withFileTypes: true })) {
252
+ total += directorySize(join(path, entry.name));
253
+ }
254
+ return total;
255
+ }
256
+ catch {
257
+ return 0;
258
+ }
259
+ }
260
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Hono } from "hono";
2
+ import type { RunStore } from "./store.js";
3
+ import type { ExecutorAdapter } from "./executors/types.js";
4
+ import type { SupervisorConfig } from "./types.js";
5
+ /**
6
+ * Creates a Hono HTTP app for the acpus Run Supervisor.
7
+ *
8
+ * Note: Node keys contain "/" characters (e.g. "workflow/step-a"), which are
9
+ * incompatible with URL path segments. Node-addressed routes accept the nodeKey
10
+ * as a query parameter instead.
11
+ *
12
+ * Returns the Hono app plus control handles for the runner to query
13
+ * idle-shutdown state and inject health-overrides after listen.
14
+ */
15
+ export declare function createSupervisorApp(config: SupervisorConfig, store: RunStore, agentExecutor: ExecutorAdapter, programExecutor: ExecutorAdapter): {
16
+ app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
17
+ /** Expose for the runner to read idle-shutdown state. */
18
+ getLastActiveAt: () => number;
19
+ /** Expose for the runner to check how many Runs are still active. */
20
+ runningCount: () => number;
21
+ /** Expose for the runner to write the startedAt and endpoint after listen. */
22
+ setHealthOverrides: (overrides: {
23
+ startedAt?: string;
24
+ endpoint?: string;
25
+ }) => void;
26
+ };
27
+ //# sourceMappingURL=supervisor-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor-app.d.ts","sourceRoot":"","sources":["../src/supervisor-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAgC,MAAM,YAAY,CAAC;AAYjF;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,QAAQ,EACf,aAAa,EAAE,eAAe,EAC9B,eAAe,EAAE,eAAe;;IAyiB9B,yDAAyD;;IAEzD,qEAAqE;;IAErE,8EAA8E;oCAC9C;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;EAK5E"}