@acpus/runtime 0.1.0 → 0.2.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 (76) hide show
  1. package/dist/agent-telemetry.d.ts +49 -0
  2. package/dist/agent-telemetry.d.ts.map +1 -0
  3. package/dist/agent-telemetry.js +255 -0
  4. package/dist/agent-telemetry.js.map +1 -0
  5. package/dist/artifacts.d.ts +16 -1
  6. package/dist/artifacts.d.ts.map +1 -1
  7. package/dist/artifacts.js +92 -29
  8. package/dist/artifacts.js.map +1 -1
  9. package/dist/attempt-artifacts.d.ts +35 -0
  10. package/dist/attempt-artifacts.d.ts.map +1 -0
  11. package/dist/attempt-artifacts.js +90 -0
  12. package/dist/attempt-artifacts.js.map +1 -0
  13. package/dist/client.d.ts +27 -0
  14. package/dist/client.d.ts.map +1 -1
  15. package/dist/client.js +33 -0
  16. package/dist/client.js.map +1 -1
  17. package/dist/executors/agent.d.ts +7 -3
  18. package/dist/executors/agent.d.ts.map +1 -1
  19. package/dist/executors/agent.js +58 -61
  20. package/dist/executors/agent.js.map +1 -1
  21. package/dist/executors/mock-program.d.ts +2 -0
  22. package/dist/executors/mock-program.d.ts.map +1 -1
  23. package/dist/executors/mock-program.js +27 -6
  24. package/dist/executors/mock-program.js.map +1 -1
  25. package/dist/executors/output-preview.d.ts +2 -0
  26. package/dist/executors/output-preview.d.ts.map +1 -0
  27. package/dist/executors/output-preview.js +20 -0
  28. package/dist/executors/output-preview.js.map +1 -0
  29. package/dist/executors/program.d.ts +10 -3
  30. package/dist/executors/program.d.ts.map +1 -1
  31. package/dist/executors/program.js +39 -4
  32. package/dist/executors/program.js.map +1 -1
  33. package/dist/executors/types.d.ts +2 -0
  34. package/dist/executors/types.d.ts.map +1 -1
  35. package/dist/fork.d.ts +76 -0
  36. package/dist/fork.d.ts.map +1 -0
  37. package/dist/fork.js +201 -0
  38. package/dist/fork.js.map +1 -0
  39. package/dist/index.d.ts +9 -4
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +6 -3
  42. package/dist/index.js.map +1 -1
  43. package/dist/interpreter.d.ts +5 -49
  44. package/dist/interpreter.d.ts.map +1 -1
  45. package/dist/interpreter.js +210 -462
  46. package/dist/interpreter.js.map +1 -1
  47. package/dist/keys.d.ts +50 -2
  48. package/dist/keys.d.ts.map +1 -1
  49. package/dist/keys.js +261 -1
  50. package/dist/keys.js.map +1 -1
  51. package/dist/run-control.d.ts +45 -0
  52. package/dist/run-control.d.ts.map +1 -0
  53. package/dist/run-control.js +253 -0
  54. package/dist/run-control.js.map +1 -0
  55. package/dist/state-machine.d.ts +5 -1
  56. package/dist/state-machine.d.ts.map +1 -1
  57. package/dist/state-machine.js +16 -1
  58. package/dist/state-machine.js.map +1 -1
  59. package/dist/store.d.ts +26 -1
  60. package/dist/store.d.ts.map +1 -1
  61. package/dist/store.js +127 -28
  62. package/dist/store.js.map +1 -1
  63. package/dist/supervisor-app.d.ts.map +1 -1
  64. package/dist/supervisor-app.js +110 -40
  65. package/dist/supervisor-app.js.map +1 -1
  66. package/dist/supervisor-discovery.d.ts +1 -0
  67. package/dist/supervisor-discovery.d.ts.map +1 -1
  68. package/dist/supervisor-discovery.js +9 -15
  69. package/dist/supervisor-discovery.js.map +1 -1
  70. package/dist/types.d.ts +81 -4
  71. package/dist/types.d.ts.map +1 -1
  72. package/dist/workflow-outputs.d.ts +9 -0
  73. package/dist/workflow-outputs.d.ts.map +1 -0
  74. package/dist/workflow-outputs.js +59 -0
  75. package/dist/workflow-outputs.js.map +1 -0
  76. package/package.json +3 -3
@@ -0,0 +1,49 @@
1
+ import type { AgentAttemptTelemetry, AgentAttemptTelemetryState, AgentContextUsage, AgentTelemetry } from "./types.js";
2
+ export interface AgentTelemetryAccumulatorOptions {
3
+ attempt: number;
4
+ inputText: string;
5
+ inputArtifactRef?: string;
6
+ startedAt?: string;
7
+ now?: () => number;
8
+ previewEdgeBytes?: number;
9
+ maxToolCalls?: number;
10
+ flushIntervalMs?: number;
11
+ onTelemetry?: (attempt: AgentAttemptTelemetry) => void;
12
+ }
13
+ export declare class AgentTelemetryAccumulator {
14
+ private readonly attempt;
15
+ private readonly now;
16
+ private readonly previewEdgeBytes;
17
+ private readonly maxToolCalls;
18
+ private readonly flushIntervalMs;
19
+ private readonly onTelemetry?;
20
+ private readonly startedAt;
21
+ private readonly seenToolIds;
22
+ private readonly tools;
23
+ private partialLine;
24
+ private response;
25
+ private stopReason;
26
+ private latestContext;
27
+ private outputArtifactRef;
28
+ private lastPublishedAt;
29
+ private toolSeq;
30
+ private totalToolCallCount;
31
+ constructor(options: AgentTelemetryAccumulatorOptions);
32
+ private readonly input;
33
+ append(chunk: string): void;
34
+ flush(): void;
35
+ responseText(): string;
36
+ setResponseText(text: string): void;
37
+ finalStopReason(): string | undefined;
38
+ context(): AgentContextUsage | undefined;
39
+ setOutputArtifactRef(ref: string | undefined): void;
40
+ snapshot(state?: AgentAttemptTelemetryState, completedAt?: string): AgentAttemptTelemetry;
41
+ private parseLine;
42
+ private captureResult;
43
+ private captureTool;
44
+ private trimRecentTools;
45
+ private publish;
46
+ }
47
+ export declare function upsertAgentAttemptTelemetry(current: AgentTelemetry | undefined, attempt: AgentAttemptTelemetry): AgentTelemetry;
48
+ export declare function latestAgentAttemptTelemetry(telemetry: AgentTelemetry | undefined): AgentAttemptTelemetry | undefined;
49
+ //# sourceMappingURL=agent-telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-telemetry.d.ts","sourceRoot":"","sources":["../src/agent-telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,EAEjB,cAAc,EAEf,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACxD;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAA2C;IACxE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAC5D,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,kBAAkB,CAAK;gBAEnB,OAAO,EAAE,gCAAgC;IAWrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IAEvC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ3B,KAAK,IAAI,IAAI;IAMb,YAAY,IAAI,MAAM;IAItB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAInC,eAAe,IAAI,MAAM,GAAG,SAAS;IAIrC,OAAO,IAAI,iBAAiB,GAAG,SAAS;IAIxC,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAInD,QAAQ,CAAC,KAAK,GAAE,0BAAsC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,qBAAqB;IA0BpG,OAAO,CAAC,SAAS;IAoCjB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,WAAW;IAuCnB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,OAAO;CAOhB;AAMD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,OAAO,EAAE,qBAAqB,GAC7B,cAAc,CAMhB;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,cAAc,GAAG,SAAS,GAAG,qBAAqB,GAAG,SAAS,CAIpH"}
@@ -0,0 +1,255 @@
1
+ const DEFAULT_PREVIEW_EDGE_BYTES = 8 * 1024;
2
+ const DEFAULT_MAX_TOOL_CALLS = 200;
3
+ const DEFAULT_FLUSH_INTERVAL_MS = 1_000;
4
+ const FINAL_TOOL_STATUSES = new Set(["completed", "failed", "cancelled"]);
5
+ export class AgentTelemetryAccumulator {
6
+ attempt;
7
+ now;
8
+ previewEdgeBytes;
9
+ maxToolCalls;
10
+ flushIntervalMs;
11
+ onTelemetry;
12
+ startedAt;
13
+ seenToolIds = new Set();
14
+ tools = new Map();
15
+ partialLine = "";
16
+ response = "";
17
+ stopReason;
18
+ latestContext;
19
+ outputArtifactRef;
20
+ lastPublishedAt = 0;
21
+ toolSeq = 0;
22
+ totalToolCallCount = 0;
23
+ constructor(options) {
24
+ this.attempt = options.attempt;
25
+ this.now = options.now ?? Date.now;
26
+ this.previewEdgeBytes = options.previewEdgeBytes ?? DEFAULT_PREVIEW_EDGE_BYTES;
27
+ this.maxToolCalls = options.maxToolCalls ?? DEFAULT_MAX_TOOL_CALLS;
28
+ this.flushIntervalMs = options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;
29
+ this.onTelemetry = options.onTelemetry;
30
+ this.startedAt = options.startedAt ?? new Date(this.now()).toISOString();
31
+ this.input = buildPreview(options.inputText, this.previewEdgeBytes, options.inputArtifactRef);
32
+ }
33
+ input;
34
+ append(chunk) {
35
+ if (chunk.length === 0)
36
+ return;
37
+ const text = this.partialLine + chunk;
38
+ const lines = text.split("\n");
39
+ this.partialLine = lines.pop() ?? "";
40
+ for (const line of lines)
41
+ this.parseLine(line);
42
+ }
43
+ flush() {
44
+ if (this.partialLine.trim().length > 0)
45
+ this.parseLine(this.partialLine);
46
+ this.partialLine = "";
47
+ this.publish("running", true);
48
+ }
49
+ responseText() {
50
+ return this.response;
51
+ }
52
+ setResponseText(text) {
53
+ this.response = text;
54
+ }
55
+ finalStopReason() {
56
+ return this.stopReason;
57
+ }
58
+ context() {
59
+ return this.latestContext;
60
+ }
61
+ setOutputArtifactRef(ref) {
62
+ this.outputArtifactRef = ref;
63
+ }
64
+ snapshot(state = "running", completedAt) {
65
+ const updatedAt = completedAt ?? new Date(this.now()).toISOString();
66
+ const recentCalls = [...this.tools.values()]
67
+ .sort((a, b) => b.lastSeq - a.lastSeq)
68
+ .map(({ lastSeq: _lastSeq, ...tool }) => tool);
69
+ return {
70
+ attempt: this.attempt,
71
+ state,
72
+ startedAt: this.startedAt,
73
+ updatedAt,
74
+ completedAt,
75
+ context: this.latestContext,
76
+ input: this.input,
77
+ output: this.response.length > 0
78
+ ? buildPreview(this.response, this.previewEdgeBytes, this.outputArtifactRef)
79
+ : this.outputArtifactRef
80
+ ? buildPreview("", this.previewEdgeBytes, this.outputArtifactRef)
81
+ : undefined,
82
+ tools: {
83
+ totalToolCallCount: this.totalToolCallCount,
84
+ droppedToolCallCount: Math.max(0, this.totalToolCallCount - recentCalls.length),
85
+ recentCalls
86
+ }
87
+ };
88
+ }
89
+ parseLine(line) {
90
+ const trimmed = line.trim();
91
+ if (!trimmed)
92
+ return;
93
+ const parsed = parseObject(trimmed);
94
+ if (!parsed)
95
+ return;
96
+ this.captureResult(parsed);
97
+ const update = extractUpdate(parsed);
98
+ if (!update)
99
+ return;
100
+ const kind = update.sessionUpdate;
101
+ if (kind === "agent_message_chunk") {
102
+ const text = readContentText(update.content);
103
+ if (text) {
104
+ this.response += text;
105
+ this.publish("running", false);
106
+ }
107
+ return;
108
+ }
109
+ if (kind === "usage_update") {
110
+ const used = readNonNegativeNumber(update.used);
111
+ const size = readNonNegativeNumber(update.size);
112
+ if (used !== undefined && size !== undefined) {
113
+ this.latestContext = { used, size, updatedAt: new Date(this.now()).toISOString() };
114
+ this.publish("running", false);
115
+ }
116
+ return;
117
+ }
118
+ if (isToolUpdate(update)) {
119
+ const changed = this.captureTool(update);
120
+ this.publish("running", changed);
121
+ }
122
+ }
123
+ captureResult(obj) {
124
+ const result = readRecord(obj.result);
125
+ if (typeof result?.stopReason === "string")
126
+ this.stopReason = result.stopReason;
127
+ }
128
+ captureTool(update) {
129
+ const toolCallId = readString(update.toolCallId);
130
+ if (!toolCallId)
131
+ return false;
132
+ const now = new Date(this.now()).toISOString();
133
+ const wasSeen = this.seenToolIds.has(toolCallId);
134
+ if (!wasSeen) {
135
+ this.seenToolIds.add(toolCallId);
136
+ this.totalToolCallCount += 1;
137
+ }
138
+ const previous = this.tools.get(toolCallId);
139
+ const status = readString(update.status);
140
+ const current = previous ?? {
141
+ toolCallId,
142
+ startedAt: now,
143
+ updatedAt: now,
144
+ lastSeq: 0
145
+ };
146
+ const statusChanged = status !== undefined && status !== previous?.status;
147
+ current.updatedAt = now;
148
+ current.lastSeq = ++this.toolSeq;
149
+ const title = readString(update.title);
150
+ const kind = readString(update.kind);
151
+ const toolName = readString(readRecord(readRecord(update._meta)?.claudeCode)?.toolName);
152
+ if (title)
153
+ current.title = title;
154
+ if (kind)
155
+ current.kind = kind;
156
+ if (toolName)
157
+ current.toolName = toolName;
158
+ if (status) {
159
+ current.status = status;
160
+ if (FINAL_TOOL_STATUSES.has(status))
161
+ current.completedAt = now;
162
+ }
163
+ this.tools.set(toolCallId, current);
164
+ this.trimRecentTools();
165
+ return !wasSeen || statusChanged || (status !== undefined && FINAL_TOOL_STATUSES.has(status));
166
+ }
167
+ trimRecentTools() {
168
+ if (this.tools.size <= this.maxToolCalls)
169
+ return;
170
+ const ordered = [...this.tools.entries()].sort((a, b) => b[1].lastSeq - a[1].lastSeq);
171
+ const keep = new Set(ordered.slice(0, this.maxToolCalls).map(([id]) => id));
172
+ for (const id of this.tools.keys()) {
173
+ if (!keep.has(id))
174
+ this.tools.delete(id);
175
+ }
176
+ }
177
+ publish(state, force) {
178
+ if (!this.onTelemetry)
179
+ return;
180
+ const now = this.now();
181
+ if (!force && now - this.lastPublishedAt < this.flushIntervalMs)
182
+ return;
183
+ this.lastPublishedAt = now;
184
+ this.onTelemetry(this.snapshot(state));
185
+ }
186
+ }
187
+ export function upsertAgentAttemptTelemetry(current, attempt) {
188
+ const previous = current?.attempts.filter((item) => item.attempt !== attempt.attempt) ?? [];
189
+ return {
190
+ currentAttempt: attempt.attempt,
191
+ attempts: [...previous, attempt].sort((a, b) => a.attempt - b.attempt)
192
+ };
193
+ }
194
+ export function latestAgentAttemptTelemetry(telemetry) {
195
+ if (!telemetry)
196
+ return undefined;
197
+ return telemetry.attempts.find((attempt) => attempt.attempt === telemetry.currentAttempt)
198
+ ?? telemetry.attempts[telemetry.attempts.length - 1];
199
+ }
200
+ function buildPreview(text, edgeBytes, artifactRef) {
201
+ const originalBytes = Buffer.byteLength(text);
202
+ const maxBytes = edgeBytes * 2;
203
+ if (originalBytes <= maxBytes) {
204
+ return { preview: text, truncated: false, originalBytes, headBytes: originalBytes, artifactRef };
205
+ }
206
+ const bytes = Buffer.from(text);
207
+ const head = bytes.subarray(0, edgeBytes).toString("utf8");
208
+ const tail = bytes.subarray(Math.max(edgeBytes, bytes.length - edgeBytes)).toString("utf8");
209
+ return {
210
+ preview: `${head}\n[acpus truncated: originalBytes=${originalBytes}]\n${tail}`,
211
+ truncated: true,
212
+ originalBytes,
213
+ headBytes: edgeBytes,
214
+ tailBytes: edgeBytes,
215
+ artifactRef
216
+ };
217
+ }
218
+ function parseObject(line) {
219
+ try {
220
+ return readRecord(JSON.parse(line));
221
+ }
222
+ catch {
223
+ return undefined;
224
+ }
225
+ }
226
+ function extractUpdate(obj) {
227
+ return readRecord(readRecord(obj.params)?.update);
228
+ }
229
+ function isToolUpdate(update) {
230
+ const kind = update.sessionUpdate;
231
+ return kind === "tool_call" || kind === "tool_call_update";
232
+ }
233
+ function readContentText(value) {
234
+ if (typeof value === "string")
235
+ return value;
236
+ const record = readRecord(value);
237
+ if (!record)
238
+ return undefined;
239
+ if (typeof record.text === "string")
240
+ return record.text;
241
+ const nested = readRecord(record.content);
242
+ return typeof nested?.text === "string" ? nested.text : undefined;
243
+ }
244
+ function readString(value) {
245
+ return typeof value === "string" && value.trim().length > 0 ? value : undefined;
246
+ }
247
+ function readNonNegativeNumber(value) {
248
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : undefined;
249
+ }
250
+ function readRecord(value) {
251
+ return value !== null && typeof value === "object" && !Array.isArray(value)
252
+ ? value
253
+ : undefined;
254
+ }
255
+ //# sourceMappingURL=agent-telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-telemetry.js","sourceRoot":"","sources":["../src/agent-telemetry.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,20 @@
1
1
  import type { ArtifactRef } from "./types.js";
2
+ export interface ParsedArtifactReference {
3
+ uri: string;
4
+ runId: string;
5
+ /** URI-encoded resolved Node Key as it appears in the artifact URI. */
6
+ encodedNodeKey: string;
7
+ /** Decoded (resolved) Node Key with slashes (e.g. "workflow/step-a"). */
8
+ nodeKey: string;
9
+ filename: string;
10
+ }
11
+ export declare const ArtifactReferences: {
12
+ make(runId: string, nodeKey: string, filename: string): ArtifactRef;
13
+ parse(uri: string): ParsedArtifactReference;
14
+ tryParse(uri: string): ParsedArtifactReference | undefined;
15
+ rewriteRunId(uri: string, fromRunId: string, toRunId: string): string;
16
+ resolvePath(baseDir: string, uri: string, isUnsafeRunId: (runId: string) => boolean): string | undefined;
17
+ };
2
18
  /**
3
19
  * Local filesystem artifact store under .acpus/state/runs/<run_id>/artifacts/.
4
20
  * Artifact URIs follow the format: artifact://runs/<runId>/nodes/<nodeKey>/<filename>
@@ -25,6 +41,5 @@ export declare class ArtifactStore {
25
41
  /** Parse an artifact URI into its components. */
26
42
  parseArtifactRef(uri: string): ArtifactRef;
27
43
  private nodeDir;
28
- private makeRef;
29
44
  }
30
45
  //# sourceMappingURL=artifacts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE,MAAM;IAI5B;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW;IAa9F;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW;IAQrE,qEAAqE;IACrE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW;IAQ/F,qCAAqC;IACrC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAM9D,yCAAyC;IACzC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE;IASnD,iDAAiD;IACjD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IAqB1C,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,OAAO;CAKhB"}
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,cAAc,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,kBAAkB;gBACjB,MAAM,WAAW,MAAM,YAAY,MAAM,GAAG,WAAW;eAOxD,MAAM,GAAG,uBAAuB;kBA2B7B,MAAM,GAAG,uBAAuB,GAAG,SAAS;sBAQxC,MAAM,aAAa,MAAM,WAAW,MAAM,GAAG,MAAM;yBAMhD,MAAM,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,GAAG,SAAS;CAmBzG,CAAC;AAEF;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE,MAAM;IAI5B;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW;IAa9F;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW;IAQrE,qEAAqE;IACrE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW;IAQ/F,qCAAqC;IACrC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAM9D,yCAAyC;IACzC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE;IASnD,iDAAiD;IACjD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IAO1C,OAAO,CAAC,OAAO;CAIhB"}
package/dist/artifacts.js CHANGED
@@ -1,6 +1,73 @@
1
1
  import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
- import { join } from "node:path";
2
+ import { join, resolve } from "node:path";
3
3
  import { encodeNodeKeyForDir } from "./keys.js";
4
+ const ARTIFACT_URI_PREFIX = "artifact://runs/";
5
+ export const ArtifactReferences = {
6
+ make(runId, nodeKey, filename) {
7
+ validateArtifactFilename(filename);
8
+ const encodedNodeKey = encodeURIComponent(nodeKey);
9
+ const uri = `${ARTIFACT_URI_PREFIX}${runId}/nodes/${encodedNodeKey}/${filename}`;
10
+ return { uri, runId, nodeKey, filename };
11
+ },
12
+ parse(uri) {
13
+ if (!uri.startsWith(ARTIFACT_URI_PREFIX)) {
14
+ throw new Error(`Invalid artifact URI: ${uri}`);
15
+ }
16
+ const parts = uri.slice(ARTIFACT_URI_PREFIX.length).split("/");
17
+ if (parts.length !== 4 || parts[1] !== "nodes") {
18
+ throw new Error(`Invalid artifact URI format: ${uri}`);
19
+ }
20
+ const runId = parts[0];
21
+ const encodedNodeKey = parts[2];
22
+ const filename = parts[3];
23
+ if (!runId || !encodedNodeKey || !filename) {
24
+ throw new Error(`Invalid artifact URI format: ${uri}`);
25
+ }
26
+ let nodeKey;
27
+ try {
28
+ nodeKey = decodeURIComponent(encodedNodeKey);
29
+ }
30
+ catch {
31
+ throw new Error(`Invalid artifact URI format: ${uri}`);
32
+ }
33
+ return { uri, runId, encodedNodeKey, nodeKey, filename };
34
+ },
35
+ tryParse(uri) {
36
+ try {
37
+ return this.parse(uri);
38
+ }
39
+ catch {
40
+ return undefined;
41
+ }
42
+ },
43
+ rewriteRunId(uri, fromRunId, toRunId) {
44
+ const ref = this.tryParse(uri);
45
+ if (!ref || ref.runId !== fromRunId)
46
+ return uri;
47
+ return `${ARTIFACT_URI_PREFIX}${toRunId}/nodes/${ref.encodedNodeKey}/${ref.filename}`;
48
+ },
49
+ resolvePath(baseDir, uri, isUnsafeRunId) {
50
+ const ref = this.tryParse(uri);
51
+ if (!ref || isUnsafeRunId(ref.runId))
52
+ return undefined;
53
+ if (!isSafeEncodedNodeKey(ref.encodedNodeKey) || !isSafeUriPathSegment(ref.filename))
54
+ return undefined;
55
+ try {
56
+ validateArtifactFilename(ref.filename);
57
+ }
58
+ catch {
59
+ return undefined;
60
+ }
61
+ const safeNodeDir = encodeNodeKeyForDir(ref.nodeKey);
62
+ if (!isSafeUriPathSegment(safeNodeDir))
63
+ return undefined;
64
+ const runDir = join(baseDir, ref.runId);
65
+ const resolved = resolve(join(runDir, "artifacts", safeNodeDir, ref.filename));
66
+ if (!isPathAtOrBelow(resolved, runDir))
67
+ return undefined;
68
+ return resolved;
69
+ }
70
+ };
4
71
  /**
5
72
  * Local filesystem artifact store under .acpus/state/runs/<run_id>/artifacts/.
6
73
  * Artifact URIs follow the format: artifact://runs/<runId>/nodes/<nodeKey>/<filename>
@@ -15,33 +82,33 @@ export class ArtifactStore {
15
82
  * Returns the ArtifactRef for the written file.
16
83
  */
17
84
  write(runId, nodeKey, filename, content) {
18
- validateArtifactFilename(filename);
85
+ const ref = ArtifactReferences.make(runId, nodeKey, filename);
19
86
  const dir = this.nodeDir(runId, nodeKey);
20
87
  mkdirSync(dir, { recursive: true });
21
88
  const filePath = join(dir, filename);
22
89
  const tmpPath = filePath + ".tmp";
23
90
  writeFileSync(tmpPath, content);
24
91
  renameSync(tmpPath, filePath);
25
- return this.makeRef(runId, nodeKey, filename);
92
+ return ref;
26
93
  }
27
94
  /**
28
95
  * Create or truncate an artifact file and return its reference.
29
96
  * Used for artifacts that will be appended while an execution is still live.
30
97
  */
31
98
  create(runId, nodeKey, filename) {
32
- validateArtifactFilename(filename);
99
+ const ref = ArtifactReferences.make(runId, nodeKey, filename);
33
100
  const dir = this.nodeDir(runId, nodeKey);
34
101
  mkdirSync(dir, { recursive: true });
35
102
  writeFileSync(join(dir, filename), "");
36
- return this.makeRef(runId, nodeKey, filename);
103
+ return ref;
37
104
  }
38
105
  /** Append content to an existing artifact, creating it if needed. */
39
106
  append(runId, nodeKey, filename, content) {
40
- validateArtifactFilename(filename);
107
+ const ref = ArtifactReferences.make(runId, nodeKey, filename);
41
108
  const dir = this.nodeDir(runId, nodeKey);
42
109
  mkdirSync(dir, { recursive: true });
43
110
  appendFileSync(join(dir, filename), content);
44
- return this.makeRef(runId, nodeKey, filename);
111
+ return ref;
45
112
  }
46
113
  /** Read an artifact file content. */
47
114
  read(runId, nodeKey, filename) {
@@ -56,37 +123,18 @@ export class ArtifactStore {
56
123
  return [];
57
124
  return readdirSync(dir)
58
125
  .filter((f) => !f.endsWith(".tmp"))
59
- .map((filename) => this.makeRef(runId, nodeKey, filename));
126
+ .map((filename) => ArtifactReferences.make(runId, nodeKey, filename));
60
127
  }
61
128
  /** Parse an artifact URI into its components. */
62
129
  parseArtifactRef(uri) {
63
- const prefix = "artifact://runs/";
64
- if (!uri.startsWith(prefix)) {
65
- throw new Error(`Invalid artifact URI: ${uri}`);
66
- }
67
- const rest = uri.slice(prefix.length);
68
- // Format: <runId>/nodes/<nodeKey>/<filename>
69
- // nodeKey may contain : but not /
70
- const parts = rest.split("/");
71
- if (parts.length < 4 || parts[1] !== "nodes") {
72
- throw new Error(`Invalid artifact URI format: ${uri}`);
73
- }
74
- const runId = parts[0];
75
- // Everything between "nodes/" and the last segment is the nodeKey
76
- const filename = parts[parts.length - 1];
77
- const nodeKey = parts.slice(2, parts.length - 1).join("/");
78
- return { uri, runId, nodeKey, filename };
130
+ const ref = ArtifactReferences.parse(uri);
131
+ return { uri: ref.uri, runId: ref.runId, nodeKey: ref.nodeKey, filename: ref.filename };
79
132
  }
80
133
  // ─── Internal helpers ──────────────────────────────────────────
81
134
  nodeDir(runId, nodeKey) {
82
135
  const safeKey = encodeNodeKeyForDir(nodeKey);
83
136
  return join(this.baseDir, runId, "artifacts", safeKey);
84
137
  }
85
- makeRef(runId, nodeKey, filename) {
86
- const safeKey = encodeNodeKeyForDir(nodeKey);
87
- const uri = `artifact://runs/${runId}/nodes/${safeKey}/${filename}`;
88
- return { uri, runId, nodeKey, filename };
89
- }
90
138
  }
91
139
  /** Validate that an artifact filename has no path traversal or separator characters. */
92
140
  function validateArtifactFilename(filename) {
@@ -94,4 +142,19 @@ function validateArtifactFilename(filename) {
94
142
  throw new Error(`Invalid artifact filename: ${filename}`);
95
143
  }
96
144
  }
145
+ function isSafeUriPathSegment(segment) {
146
+ return Boolean(segment) && !segment.split(/[/:]/).some((part) => part === "" || part === "." || part === "..");
147
+ }
148
+ function isSafeEncodedNodeKey(encodedNodeKey) {
149
+ return (Boolean(encodedNodeKey) &&
150
+ !encodedNodeKey.includes("/") &&
151
+ !encodedNodeKey.includes("\\") &&
152
+ !encodedNodeKey.includes(":") &&
153
+ encodedNodeKey !== "." &&
154
+ encodedNodeKey !== "..");
155
+ }
156
+ function isPathAtOrBelow(path, basePath) {
157
+ const normalizedBase = resolve(basePath);
158
+ return path === normalizedBase || path.startsWith(`${normalizedBase}/`);
159
+ }
97
160
  //# sourceMappingURL=artifacts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { ArtifactStore } from "./artifacts.js";
2
+ import type { AgentAttemptTelemetry } from "./types.js";
3
+ export interface AgentAttemptFinalArtifacts {
4
+ responseText?: string;
5
+ stderr?: string;
6
+ diagnostics?: string[];
7
+ }
8
+ export interface AgentAttemptStartArtifacts {
9
+ artifactRefs: string[];
10
+ promptRef: string;
11
+ rawAcpDebugRef?: string;
12
+ }
13
+ export interface AgentAttemptFinalArtifactRefs {
14
+ artifactRefs: string[];
15
+ responseRef?: string;
16
+ stderrRef?: string;
17
+ }
18
+ /**
19
+ * Owns runtime artifact naming and lifecycle rules for executable node attempts.
20
+ */
21
+ export declare class AttemptArtifactRecorder {
22
+ private readonly artifactStore;
23
+ constructor(artifactStore: ArtifactStore);
24
+ startAgentAttempt(runId: string, nodeKey: string, attemptNo: number, prompt: string, options?: {
25
+ rawAcpDebug?: boolean;
26
+ }): AgentAttemptStartArtifacts;
27
+ appendAgentRawAcpDebug(runId: string, nodeKey: string, attemptNo: number, chunk: string): void;
28
+ finalizeAgentAttempt(runId: string, nodeKey: string, attemptNo: number, content: AgentAttemptFinalArtifacts): AgentAttemptFinalArtifactRefs;
29
+ writeAgentTelemetry(runId: string, nodeKey: string, attemptNo: number, telemetry: AgentAttemptTelemetry): string;
30
+ writeProgramArtifacts(runId: string, nodeKey: string, stdout: string, stderr: string): string[];
31
+ mergeAttemptRefs(target: string[], refs: string[] | undefined): void;
32
+ private mergeStderrDiagnostics;
33
+ private agentAttemptPrefix;
34
+ }
35
+ //# sourceMappingURL=attempt-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt-artifacts.d.ts","sourceRoot":"","sources":["../src/attempt-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,0BAA0B;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,6BAA6B;IAC5C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAEzD,iBAAiB,CACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAO,GACtC,0BAA0B;IAa7B,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9F,oBAAoB,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,0BAA0B,GAClC,6BAA6B;IAiBhC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,qBAAqB,GAAG,MAAM;IAShH,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAM/F,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI;IAYpE,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,kBAAkB;CAG3B"}