@atom-workflow-agent/atom-executor 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.
- package/LICENSE +201 -0
- package/README.md +31 -0
- package/README.zh-CN.md +31 -0
- package/dist/attempt/atom-attempt-runner.d.ts +30 -0
- package/dist/attempt/atom-attempt-runner.d.ts.map +1 -0
- package/dist/attempt/atom-attempt-runner.js +11 -0
- package/dist/attempt/atom-attempt-runner.js.map +1 -0
- package/dist/attempt/atom-worker-protocol.d.ts +92 -0
- package/dist/attempt/atom-worker-protocol.d.ts.map +1 -0
- package/dist/attempt/atom-worker-protocol.js +2 -0
- package/dist/attempt/atom-worker-protocol.js.map +1 -0
- package/dist/attempt/process-atom-attempt-runner.d.ts +16 -0
- package/dist/attempt/process-atom-attempt-runner.d.ts.map +1 -0
- package/dist/attempt/process-atom-attempt-runner.js +244 -0
- package/dist/attempt/process-atom-attempt-runner.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle/lifecycle-driver.d.ts +68 -0
- package/dist/lifecycle/lifecycle-driver.d.ts.map +1 -0
- package/dist/lifecycle/lifecycle-driver.js +141 -0
- package/dist/lifecycle/lifecycle-driver.js.map +1 -0
- package/dist/resources/attempt-resource-manager.d.ts +12 -0
- package/dist/resources/attempt-resource-manager.d.ts.map +1 -0
- package/dist/resources/attempt-resource-manager.js +33 -0
- package/dist/resources/attempt-resource-manager.js.map +1 -0
- package/dist/timeout/timeout.d.ts +2 -0
- package/dist/timeout/timeout.d.ts.map +1 -0
- package/dist/timeout/timeout.js +39 -0
- package/dist/timeout/timeout.js.map +1 -0
- package/dist/worker/atom-worker-entry.mjs +200 -0
- package/package.json +49 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { fork } from "node:child_process";
|
|
2
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { AtomWorkflowError, } from "@atom-workflow-agent/contracts";
|
|
7
|
+
import { continueAtomAttempt, startAtomAttempt, } from "../lifecycle/lifecycle-driver.js";
|
|
8
|
+
import { ATOM_WORKER_PROTOCOL_VERSION, } from "./atom-worker-protocol.js";
|
|
9
|
+
const COOPERATIVE_ABORT_GRACE_MS = 1_000;
|
|
10
|
+
const FORCE_KILL_GRACE_MS = 5_000;
|
|
11
|
+
const OUTPUT_TAIL_LIMIT = 8 * 1024;
|
|
12
|
+
/** Runs every execute/resume tick in a fresh owned Node.js process. */
|
|
13
|
+
export class ProcessAtomAttemptRunner {
|
|
14
|
+
options;
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.options = options;
|
|
17
|
+
}
|
|
18
|
+
start(input) {
|
|
19
|
+
const invoker = this.invoker(input);
|
|
20
|
+
return startAtomAttempt(input.definition, input.input, input.context, { ...input.lifecycle, invoker });
|
|
21
|
+
}
|
|
22
|
+
continue(input) {
|
|
23
|
+
const invoker = this.invoker(input);
|
|
24
|
+
return continueAtomAttempt(input.definition, input.input, input.context, input.snapshot, { ...input.lifecycle, invoker }, input.resume);
|
|
25
|
+
}
|
|
26
|
+
invoker(input) {
|
|
27
|
+
if (!input.executionSource) {
|
|
28
|
+
throw new AtomWorkflowError("ATOM_EXECUTION_SOURCE_REQUIRED", `Process execution requires a reloadable module source: ${input.definition.manifest.id}@${input.definition.manifest.version}`);
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
execute: async (_definition, _value, _context) => this.runTick({ request: input, phase: "execute" }),
|
|
32
|
+
resume: async (_definition, _value, resumeInput, _context) => this.runTick({ request: input, phase: "resume", resumeInput }),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
async runTick(input) {
|
|
36
|
+
const source = input.request.executionSource;
|
|
37
|
+
const context = input.request.context;
|
|
38
|
+
const workDirectory = await mkdtemp(join(tmpdir(), "atom-attempt-"));
|
|
39
|
+
const entry = workerEntryPath();
|
|
40
|
+
let stdout = "";
|
|
41
|
+
let stderr = "";
|
|
42
|
+
let settled = false;
|
|
43
|
+
let aborting = false;
|
|
44
|
+
let cooperativeTimer;
|
|
45
|
+
let forceTimer;
|
|
46
|
+
const child = fork(entry, [], {
|
|
47
|
+
cwd: context.cwd,
|
|
48
|
+
detached: process.platform !== "win32",
|
|
49
|
+
silent: true,
|
|
50
|
+
serialization: "advanced",
|
|
51
|
+
execArgv: [],
|
|
52
|
+
env: safeEnvironment(workDirectory, context.runtime.attemptId, this.options.environment),
|
|
53
|
+
});
|
|
54
|
+
const append = (previous, chunk) => {
|
|
55
|
+
const next = previous + chunk.toString();
|
|
56
|
+
return next.length <= OUTPUT_TAIL_LIMIT ? next : next.slice(-OUTPUT_TAIL_LIMIT);
|
|
57
|
+
};
|
|
58
|
+
const emitProcessOutput = (type, chunk) => {
|
|
59
|
+
const text = chunk.toString().slice(-4_096);
|
|
60
|
+
if (!text)
|
|
61
|
+
return;
|
|
62
|
+
this.options.onEvent?.({
|
|
63
|
+
schemaVersion: "1.0",
|
|
64
|
+
type,
|
|
65
|
+
timestamp: new Date().toISOString(),
|
|
66
|
+
attemptId: context.runtime.attemptId,
|
|
67
|
+
phase: input.phase,
|
|
68
|
+
data: { text },
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
child.stdout?.on("data", (chunk) => {
|
|
72
|
+
stdout = append(stdout, chunk);
|
|
73
|
+
emitProcessOutput("process.stdout", chunk);
|
|
74
|
+
});
|
|
75
|
+
child.stderr?.on("data", (chunk) => {
|
|
76
|
+
stderr = append(stderr, chunk);
|
|
77
|
+
emitProcessOutput("process.stderr", chunk);
|
|
78
|
+
});
|
|
79
|
+
const terminate = (reason) => {
|
|
80
|
+
if (aborting || settled)
|
|
81
|
+
return;
|
|
82
|
+
aborting = true;
|
|
83
|
+
send(child, { type: "abort", reason: reason instanceof Error ? reason.message : String(reason ?? "cancelled") });
|
|
84
|
+
cooperativeTimer = setTimeout(() => signalProcessTree(child, "SIGTERM"), COOPERATIVE_ABORT_GRACE_MS);
|
|
85
|
+
forceTimer = setTimeout(() => signalProcessTree(child, "SIGKILL"), COOPERATIVE_ABORT_GRACE_MS + FORCE_KILL_GRACE_MS);
|
|
86
|
+
};
|
|
87
|
+
const onAbort = () => terminate(context.signal.reason);
|
|
88
|
+
context.signal.addEventListener("abort", onAbort, { once: true });
|
|
89
|
+
if (context.signal.aborted)
|
|
90
|
+
terminate(context.signal.reason);
|
|
91
|
+
try {
|
|
92
|
+
return await new Promise((resolve, reject) => {
|
|
93
|
+
let terminal;
|
|
94
|
+
let terminalKind;
|
|
95
|
+
child.on("message", (raw) => {
|
|
96
|
+
if (!raw || typeof raw !== "object" || !("type" in raw))
|
|
97
|
+
return;
|
|
98
|
+
const message = raw;
|
|
99
|
+
if (message.type === "event") {
|
|
100
|
+
this.options.onEvent?.(message.event);
|
|
101
|
+
if (message.event.type === "atom.log")
|
|
102
|
+
forwardLog(context, message.event.data);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (message.type === "rpc") {
|
|
106
|
+
if (aborting || terminalKind) {
|
|
107
|
+
send(child, { type: "rpc.result", requestId: message.requestId, ok: false, error: serializedError(new AtomWorkflowError("ATOM_ATTEMPT_CLOSED", "Atom Attempt is no longer accepting service calls")) });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
void handleRpc(context, message.request).then((value) => send(child, { type: "rpc.result", requestId: message.requestId, ok: true, value }), (error) => send(child, { type: "rpc.result", requestId: message.requestId, ok: false, error: serializedError(error) }));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (message.type === "completed") {
|
|
114
|
+
terminalKind = "completed";
|
|
115
|
+
terminal = message.invocation;
|
|
116
|
+
}
|
|
117
|
+
else if (message.type === "failed") {
|
|
118
|
+
terminalKind = "failed";
|
|
119
|
+
terminal = message.error;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
child.once("error", (error) => reject(new AtomWorkflowError("ATOM_WORKER_SPAWN_FAILED", "Atom worker process failed to start", true, { cause: error })));
|
|
123
|
+
child.once("exit", (code, signal) => {
|
|
124
|
+
settled = true;
|
|
125
|
+
if (terminalKind === "completed") {
|
|
126
|
+
resolve(terminal);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (terminalKind === "failed") {
|
|
130
|
+
reject(deserializeError(terminal));
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (context.signal.aborted) {
|
|
134
|
+
const reason = context.signal.reason;
|
|
135
|
+
reject(reason instanceof Error ? reason : new AtomWorkflowError("CANCELLED", "Atom worker was cancelled"));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const detail = [stderr.trim(), stdout.trim()].filter(Boolean).join("\n");
|
|
139
|
+
reject(new AtomWorkflowError("ATOM_WORKER_EXITED", `Atom worker exited without a result${code === null ? "" : ` (code ${code})`}${signal ? ` (${signal})` : ""}${detail ? `: ${detail}` : ""}`, true));
|
|
140
|
+
});
|
|
141
|
+
send(child, {
|
|
142
|
+
type: "run",
|
|
143
|
+
request: {
|
|
144
|
+
protocolVersion: ATOM_WORKER_PROTOCOL_VERSION,
|
|
145
|
+
source,
|
|
146
|
+
atom: { id: input.request.definition.manifest.id, version: input.request.definition.manifest.version },
|
|
147
|
+
phase: input.phase,
|
|
148
|
+
input: input.request.input,
|
|
149
|
+
...(input.resumeInput ? { resumeInput: input.resumeInput } : {}),
|
|
150
|
+
context: {
|
|
151
|
+
runtime: context.runtime,
|
|
152
|
+
cwd: context.cwd,
|
|
153
|
+
metadata: context.metadata,
|
|
154
|
+
...(context.decision ? { decision: context.decision } : {}),
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
settled = true;
|
|
162
|
+
context.signal.removeEventListener("abort", onAbort);
|
|
163
|
+
if (cooperativeTimer)
|
|
164
|
+
clearTimeout(cooperativeTimer);
|
|
165
|
+
if (forceTimer)
|
|
166
|
+
clearTimeout(forceTimer);
|
|
167
|
+
if (child.exitCode === null && child.signalCode === null)
|
|
168
|
+
signalProcessTree(child, "SIGTERM");
|
|
169
|
+
await rm(workDirectory, { recursive: true, force: true }).catch(() => undefined);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function handleRpc(context, request) {
|
|
174
|
+
if (request.method === "artifacts.put")
|
|
175
|
+
return context.artifacts.put(request.input);
|
|
176
|
+
return context.artifacts.get(request.id);
|
|
177
|
+
}
|
|
178
|
+
function forwardLog(context, data) {
|
|
179
|
+
if (!data || typeof data !== "object" || Array.isArray(data))
|
|
180
|
+
return;
|
|
181
|
+
const record = data;
|
|
182
|
+
const level = typeof record.level === "string" ? record.level : "info";
|
|
183
|
+
const message = typeof record.message === "string" ? record.message : "Atom log";
|
|
184
|
+
const fields = record.fields && typeof record.fields === "object" && !Array.isArray(record.fields)
|
|
185
|
+
? record.fields
|
|
186
|
+
: undefined;
|
|
187
|
+
if (level === "debug")
|
|
188
|
+
context.logger.debug(message, fields);
|
|
189
|
+
else if (level === "warn")
|
|
190
|
+
context.logger.warn(message, fields);
|
|
191
|
+
else if (level === "error")
|
|
192
|
+
context.logger.error(message, fields);
|
|
193
|
+
else
|
|
194
|
+
context.logger.info(message, fields);
|
|
195
|
+
}
|
|
196
|
+
function safeEnvironment(workDirectory, attemptId, overrides) {
|
|
197
|
+
const inherited = Object.fromEntries(Object.entries(process.env).filter(([key]) => key !== "NODE_OPTIONS" && key !== "NODE_PATH"));
|
|
198
|
+
return {
|
|
199
|
+
...inherited,
|
|
200
|
+
...overrides,
|
|
201
|
+
ATOM_WORKFLOW_ATTEMPT_ID: attemptId,
|
|
202
|
+
ATOM_WORKFLOW_TEMP_DIR: workDirectory,
|
|
203
|
+
TMPDIR: workDirectory,
|
|
204
|
+
TMP: workDirectory,
|
|
205
|
+
TEMP: workDirectory,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function workerEntryPath() {
|
|
209
|
+
const current = fileURLToPath(import.meta.url);
|
|
210
|
+
return join(dirname(current), "../worker/atom-worker-entry.mjs");
|
|
211
|
+
}
|
|
212
|
+
function send(child, message) {
|
|
213
|
+
if (!child.connected)
|
|
214
|
+
return;
|
|
215
|
+
child.send(message, () => undefined);
|
|
216
|
+
}
|
|
217
|
+
function signalProcessTree(child, signal) {
|
|
218
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
219
|
+
return;
|
|
220
|
+
try {
|
|
221
|
+
if (process.platform !== "win32" && child.pid)
|
|
222
|
+
process.kill(-child.pid, signal);
|
|
223
|
+
else
|
|
224
|
+
child.kill(signal);
|
|
225
|
+
}
|
|
226
|
+
catch { /* process already exited */ }
|
|
227
|
+
}
|
|
228
|
+
function serializedError(error) {
|
|
229
|
+
const candidate = error instanceof Error ? error : undefined;
|
|
230
|
+
return {
|
|
231
|
+
name: candidate?.name ?? "Error",
|
|
232
|
+
code: typeof candidate?.code === "string" ? candidate.code : "ATOM_WORKER_SERVICE_FAILED",
|
|
233
|
+
message: candidate?.message ?? String(error),
|
|
234
|
+
retryable: candidate?.retryable === true,
|
|
235
|
+
...(candidate?.details !== undefined ? { details: JSON.parse(JSON.stringify(candidate.details)) } : {}),
|
|
236
|
+
...(candidate?.stack ? { stack: candidate.stack } : {}),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function deserializeError(error) {
|
|
240
|
+
return new AtomWorkflowError(error.code, error.message, error.retryable, {
|
|
241
|
+
cause: { workerErrorName: error.name, ...(error.details !== undefined ? { details: error.details } : {}), ...(error.stack ? { stack: error.stack } : {}) },
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=process-atom-attempt-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-atom-attempt-runner.js","sourceRoot":"","sources":["../../src/attempt/process-atom-attempt-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./attempt/atom-attempt-runner.js";
|
|
2
|
+
export * from "./attempt/atom-worker-protocol.js";
|
|
3
|
+
export * from "./attempt/process-atom-attempt-runner.js";
|
|
4
|
+
export * from "./lifecycle/lifecycle-driver.js";
|
|
5
|
+
export * from "./resources/attempt-resource-manager.js";
|
|
6
|
+
export * from "./timeout/timeout.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,0CAA0C,CAAC;AACzD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./attempt/atom-attempt-runner.js";
|
|
2
|
+
export * from "./attempt/atom-worker-protocol.js";
|
|
3
|
+
export * from "./attempt/process-atom-attempt-runner.js";
|
|
4
|
+
export * from "./lifecycle/lifecycle-driver.js";
|
|
5
|
+
export * from "./resources/attempt-resource-manager.js";
|
|
6
|
+
export * from "./timeout/timeout.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,0CAA0C,CAAC;AACzD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type AtomHostTaskDeclaration, type AtomLifecycleResult, type AtomResume, type AtomSignalRequest, type AtomSignalResume, type AtomSucceededResult, type HostTaskRequest, type JsonValue } from "@atom-workflow-agent/contracts";
|
|
2
|
+
import { type AtomDefinition, type AtomExecutionContext, type AtomResumeInput } from "@atom-workflow-agent/atom-sdk";
|
|
3
|
+
export type AtomLifecycleTickPhase = "execute" | "resume";
|
|
4
|
+
export type AtomLifecycleTickStatus = "running" | "awaiting_signal" | "awaiting_host" | "succeeded";
|
|
5
|
+
export interface AtomLifecycleTickRecord {
|
|
6
|
+
readonly schemaVersion: "1.0";
|
|
7
|
+
readonly attemptId: string;
|
|
8
|
+
readonly tickIndex: number;
|
|
9
|
+
readonly phase: AtomLifecycleTickPhase;
|
|
10
|
+
readonly status: AtomLifecycleTickStatus;
|
|
11
|
+
readonly checkpoint?: JsonValue;
|
|
12
|
+
readonly checkpointHash?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface PendingAtomSignal {
|
|
15
|
+
readonly signalId: string;
|
|
16
|
+
readonly request: AtomSignalRequest;
|
|
17
|
+
}
|
|
18
|
+
interface SnapshotBase {
|
|
19
|
+
readonly schemaVersion: "1.0";
|
|
20
|
+
readonly attemptId: string;
|
|
21
|
+
readonly checkpoint: JsonValue;
|
|
22
|
+
readonly ticks: readonly AtomLifecycleTickRecord[];
|
|
23
|
+
}
|
|
24
|
+
export interface RunningAtomAttemptSnapshot extends SnapshotBase {
|
|
25
|
+
readonly state: "running";
|
|
26
|
+
readonly nextPollAfterMs?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface AwaitingSignalAtomAttemptSnapshot extends SnapshotBase {
|
|
29
|
+
readonly state: "awaiting_signal";
|
|
30
|
+
readonly pendingSignal: PendingAtomSignal;
|
|
31
|
+
}
|
|
32
|
+
export interface AwaitingHostAtomAttemptSnapshot extends SnapshotBase {
|
|
33
|
+
readonly state: "awaiting_host";
|
|
34
|
+
readonly hostTask: HostTaskRequest;
|
|
35
|
+
}
|
|
36
|
+
export interface SucceededAtomAttemptSnapshot extends SnapshotBase {
|
|
37
|
+
readonly state: "succeeded";
|
|
38
|
+
readonly completion: AtomSucceededResult<JsonValue>;
|
|
39
|
+
}
|
|
40
|
+
export type AtomAttemptLifecycleSnapshot = RunningAtomAttemptSnapshot | AwaitingSignalAtomAttemptSnapshot | AwaitingHostAtomAttemptSnapshot | SucceededAtomAttemptSnapshot;
|
|
41
|
+
export interface AtomLifecycleDriverOptions {
|
|
42
|
+
readonly maxLifecycleTicks: number;
|
|
43
|
+
/** Executes one lifecycle tick. Production callers may use a process-backed invoker. */
|
|
44
|
+
readonly invoker?: AtomLifecycleInvoker;
|
|
45
|
+
readonly persistTick?: (record: AtomLifecycleTickRecord) => void | Promise<void>;
|
|
46
|
+
readonly resolveSignal?: (signal: PendingAtomSignal) => AtomSignalResume | Promise<AtomSignalResume>;
|
|
47
|
+
readonly issueHostTask?: (declaration: AtomHostTaskDeclaration) => HostTaskRequest | Promise<HostTaskRequest>;
|
|
48
|
+
readonly resolveHost?: (task: HostTaskRequest) => AtomResume | Promise<AtomResume>;
|
|
49
|
+
}
|
|
50
|
+
type RuntimeAtomDefinition = AtomDefinition<unknown, JsonValue>;
|
|
51
|
+
export type AtomLifecycleInvocationResult = {
|
|
52
|
+
readonly kind: "output";
|
|
53
|
+
readonly output: unknown;
|
|
54
|
+
} | {
|
|
55
|
+
readonly kind: "transition";
|
|
56
|
+
readonly result: AtomLifecycleResult<JsonValue, JsonValue>;
|
|
57
|
+
};
|
|
58
|
+
export interface AtomLifecycleInvoker {
|
|
59
|
+
execute(definition: RuntimeAtomDefinition, input: unknown, context: AtomExecutionContext): Promise<AtomLifecycleInvocationResult>;
|
|
60
|
+
resume(definition: RuntimeAtomDefinition, input: unknown, resumeInput: AtomResumeInput, context: AtomExecutionContext): Promise<AtomLifecycleInvocationResult>;
|
|
61
|
+
}
|
|
62
|
+
export declare const inProcessAtomLifecycleInvoker: AtomLifecycleInvoker;
|
|
63
|
+
export declare function hashAtomCheckpoint(value: JsonValue): string;
|
|
64
|
+
export declare function startAtomAttempt(definition: RuntimeAtomDefinition, input: unknown, context: AtomExecutionContext, options: AtomLifecycleDriverOptions): Promise<AtomAttemptLifecycleSnapshot>;
|
|
65
|
+
export declare function continueAtomAttempt(definition: RuntimeAtomDefinition, input: unknown, context: AtomExecutionContext, snapshot: RunningAtomAttemptSnapshot | AwaitingSignalAtomAttemptSnapshot | AwaitingHostAtomAttemptSnapshot, options: AtomLifecycleDriverOptions, resume?: AtomResume): Promise<AtomAttemptLifecycleSnapshot>;
|
|
66
|
+
export declare function driveAtomAttempt(definition: RuntimeAtomDefinition, input: unknown, context: AtomExecutionContext, options: AtomLifecycleDriverOptions): Promise<AtomAttemptLifecycleSnapshot>;
|
|
67
|
+
export {};
|
|
68
|
+
//# sourceMappingURL=lifecycle-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-driver.d.ts","sourceRoot":"","sources":["../../src/lifecycle/lifecycle-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { AtomWorkflowError, validateAtomHostResume, validateAtomLifecycleResult, validateAtomSignalResume, } from "@atom-workflow-agent/contracts";
|
|
3
|
+
import { isAtomTransition, } from "@atom-workflow-agent/atom-sdk";
|
|
4
|
+
const IN_PROCESS_ATOM_LIFECYCLE_INVOKER = {
|
|
5
|
+
async execute(definition, input, context) {
|
|
6
|
+
const raw = await definition.execute(input, context);
|
|
7
|
+
return isAtomTransition(raw)
|
|
8
|
+
? { kind: "transition", result: raw.result }
|
|
9
|
+
: { kind: "output", output: raw };
|
|
10
|
+
},
|
|
11
|
+
async resume(definition, input, resumeInput, context) {
|
|
12
|
+
if (!definition.resume)
|
|
13
|
+
fail("ATOM_RESUME_UNAVAILABLE", "Atom cannot continue because resume() is unavailable");
|
|
14
|
+
const raw = await definition.resume(input, resumeInput, context);
|
|
15
|
+
return isAtomTransition(raw)
|
|
16
|
+
? { kind: "transition", result: raw.result }
|
|
17
|
+
: { kind: "output", output: raw };
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
export const inProcessAtomLifecycleInvoker = Object.freeze(IN_PROCESS_ATOM_LIFECYCLE_INVOKER);
|
|
21
|
+
function canonicalize(value) {
|
|
22
|
+
if (Array.isArray(value))
|
|
23
|
+
return value.map(canonicalize);
|
|
24
|
+
if (value !== null && typeof value === "object")
|
|
25
|
+
return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, nested]) => [key, canonicalize(nested)]));
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
function roundTrip(value) { return JSON.parse(JSON.stringify(value)); }
|
|
29
|
+
export function hashAtomCheckpoint(value) {
|
|
30
|
+
return `sha256:${createHash("sha256").update(JSON.stringify(canonicalize(value))).digest("hex")}`;
|
|
31
|
+
}
|
|
32
|
+
function fail(code, message, details) {
|
|
33
|
+
throw new AtomWorkflowError(code, message, false, details === undefined ? undefined : { cause: details });
|
|
34
|
+
}
|
|
35
|
+
function ensureTickBudget(ticks, options) {
|
|
36
|
+
if (!Number.isInteger(options.maxLifecycleTicks) || options.maxLifecycleTicks < 1)
|
|
37
|
+
fail("ATOM_LIFECYCLE_POLICY_INVALID", "maxLifecycleTicks must be a positive integer");
|
|
38
|
+
if (ticks.length >= options.maxLifecycleTicks)
|
|
39
|
+
fail("ATOM_LIFECYCLE_TICK_BUDGET_EXHAUSTED", `Atom Attempt exhausted ${options.maxLifecycleTicks} lifecycle ticks`);
|
|
40
|
+
}
|
|
41
|
+
async function appendTick(attemptId, ticks, phase, status, checkpoint, options) {
|
|
42
|
+
const record = Object.freeze({
|
|
43
|
+
schemaVersion: "1.0", attemptId, tickIndex: ticks.length, phase, status,
|
|
44
|
+
...(checkpoint !== undefined ? { checkpoint: roundTrip(checkpoint), checkpointHash: hashAtomCheckpoint(checkpoint) } : {}),
|
|
45
|
+
});
|
|
46
|
+
await options.persistTick?.(record);
|
|
47
|
+
return Object.freeze([...ticks, record]);
|
|
48
|
+
}
|
|
49
|
+
function normalizeResult(invocation) {
|
|
50
|
+
if (invocation.kind === "transition")
|
|
51
|
+
return invocation.result;
|
|
52
|
+
return { schemaVersion: "1.0", status: "succeeded", output: invocation.output, artifacts: [] };
|
|
53
|
+
}
|
|
54
|
+
async function consumeResult(definition, context, previousCheckpoint, ticks, phase, invocation, options) {
|
|
55
|
+
const attemptId = context.runtime.attemptId;
|
|
56
|
+
const validation = validateAtomLifecycleResult(definition.manifest, normalizeResult(invocation));
|
|
57
|
+
if (!validation.success)
|
|
58
|
+
fail("ATOM_LIFECYCLE_RESULT_INVALID", "Atom returned an invalid output or transition", validation.errors);
|
|
59
|
+
const result = validation.data;
|
|
60
|
+
if (result.status === "succeeded") {
|
|
61
|
+
const nextTicks = await appendTick(attemptId, ticks, phase, "succeeded", undefined, options);
|
|
62
|
+
return Object.freeze({ schemaVersion: "1.0", attemptId, state: "succeeded", checkpoint: roundTrip(previousCheckpoint), completion: Object.freeze({ ...result, artifacts: Object.freeze([...(result.artifacts ?? [])]) }), ticks: nextTicks });
|
|
63
|
+
}
|
|
64
|
+
const checkpoint = roundTrip(result.checkpoint);
|
|
65
|
+
const nextTicks = await appendTick(attemptId, ticks, phase, result.status, checkpoint, options);
|
|
66
|
+
if (result.status === "awaiting_host") {
|
|
67
|
+
if (!definition.resume)
|
|
68
|
+
fail("ATOM_RESUME_UNAVAILABLE", "Atom returned waitForHost() but does not define resume()");
|
|
69
|
+
if (!options.issueHostTask)
|
|
70
|
+
fail("HOST_TASK_ISSUER_REQUIRED", "waitForHost() requires a Runtime HostTask issuer");
|
|
71
|
+
const hostTask = await options.issueHostTask(result.task);
|
|
72
|
+
if (hostTask.attemptId !== attemptId || hostTask.workflowRevisionId !== context.runtime.workflowRevisionId || hostTask.nodeId !== context.runtime.nodeId)
|
|
73
|
+
fail("HOST_TASK_CONTEXT_MISMATCH", "Issued HostTask does not belong to the active Atom Attempt");
|
|
74
|
+
return Object.freeze({ schemaVersion: "1.0", attemptId, state: "awaiting_host", checkpoint, hostTask, ticks: nextTicks });
|
|
75
|
+
}
|
|
76
|
+
if (result.status === "awaiting_signal") {
|
|
77
|
+
if (!definition.resume)
|
|
78
|
+
fail("ATOM_RESUME_UNAVAILABLE", "Atom returned waitForSignal() but does not define resume()");
|
|
79
|
+
return Object.freeze({ schemaVersion: "1.0", attemptId, state: "awaiting_signal", checkpoint, pendingSignal: Object.freeze({ signalId: `${attemptId}:signal:${nextTicks.length - 1}`, request: result.signal }), ticks: nextTicks });
|
|
80
|
+
}
|
|
81
|
+
if (!definition.resume)
|
|
82
|
+
fail("ATOM_RESUME_UNAVAILABLE", "Atom returned continue() but does not define resume()");
|
|
83
|
+
return Object.freeze({ schemaVersion: "1.0", attemptId, state: "running", checkpoint, ...(result.nextPollAfterMs !== undefined ? { nextPollAfterMs: result.nextPollAfterMs } : {}), ticks: nextTicks });
|
|
84
|
+
}
|
|
85
|
+
export async function startAtomAttempt(definition, input, context, options) {
|
|
86
|
+
ensureTickBudget([], options);
|
|
87
|
+
const invoker = options.invoker ?? inProcessAtomLifecycleInvoker;
|
|
88
|
+
return consumeResult(definition, context, null, Object.freeze([]), "execute", await invoker.execute(definition, input, context), options);
|
|
89
|
+
}
|
|
90
|
+
export async function continueAtomAttempt(definition, input, context, snapshot, options, resume) {
|
|
91
|
+
if (snapshot.attemptId !== context.runtime.attemptId)
|
|
92
|
+
fail("ATOM_ATTEMPT_ID_MISMATCH", "Snapshot belongs to another Attempt");
|
|
93
|
+
if (!definition.resume)
|
|
94
|
+
fail("ATOM_RESUME_UNAVAILABLE", "Atom cannot continue because resume() is unavailable");
|
|
95
|
+
let resumeInput;
|
|
96
|
+
if (snapshot.state === "awaiting_signal") {
|
|
97
|
+
if (!resume || resume.kind !== "signal")
|
|
98
|
+
fail("ATOM_SIGNAL_RESUME_REQUIRED", "An awaiting Atom requires a Signal resume payload");
|
|
99
|
+
if (resume.signalId !== snapshot.pendingSignal.signalId)
|
|
100
|
+
fail("ATOM_SIGNAL_ID_MISMATCH", "Signal resume was issued for another pending Signal");
|
|
101
|
+
const validation = validateAtomSignalResume(snapshot.pendingSignal.request, resume);
|
|
102
|
+
if (!validation.success)
|
|
103
|
+
fail("ATOM_SIGNAL_RESUME_INVALID", "Signal resume failed validation", validation.errors);
|
|
104
|
+
resumeInput = { type: "signal", value: validation.data.response, checkpoint: snapshot.checkpoint };
|
|
105
|
+
}
|
|
106
|
+
else if (snapshot.state === "awaiting_host") {
|
|
107
|
+
if (!resume || resume.kind !== "host")
|
|
108
|
+
fail("ATOM_HOST_RESUME_REQUIRED", "An awaiting Atom requires a HostTask result");
|
|
109
|
+
const validation = validateAtomHostResume(definition.manifest, snapshot.hostTask.hostTaskId, snapshot.hostTask.continuation.token, resume, snapshot.hostTask.expected.outputSchema);
|
|
110
|
+
if (!validation.success)
|
|
111
|
+
fail("ATOM_HOST_RESUME_INVALID", "HostTask result failed validation", validation.errors);
|
|
112
|
+
resumeInput = { type: "host", value: validation.data.result.output, artifacts: validation.data.result.artifacts, summary: validation.data.result.summary, checkpoint: snapshot.checkpoint };
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
if (resume)
|
|
116
|
+
fail("ATOM_RESUME_UNEXPECTED", "A running Atom Attempt cannot consume an external resume payload");
|
|
117
|
+
resumeInput = { type: "timer", checkpoint: snapshot.checkpoint };
|
|
118
|
+
}
|
|
119
|
+
ensureTickBudget(snapshot.ticks, options);
|
|
120
|
+
const invoker = options.invoker ?? inProcessAtomLifecycleInvoker;
|
|
121
|
+
return consumeResult(definition, context, snapshot.checkpoint, snapshot.ticks, "resume", await invoker.resume(definition, input, resumeInput, context), options);
|
|
122
|
+
}
|
|
123
|
+
export async function driveAtomAttempt(definition, input, context, options) {
|
|
124
|
+
let snapshot = await startAtomAttempt(definition, input, context, options);
|
|
125
|
+
while (snapshot.state !== "succeeded") {
|
|
126
|
+
if (snapshot.state === "awaiting_signal") {
|
|
127
|
+
if (!options.resolveSignal)
|
|
128
|
+
return snapshot;
|
|
129
|
+
snapshot = await continueAtomAttempt(definition, input, context, snapshot, options, await options.resolveSignal(snapshot.pendingSignal));
|
|
130
|
+
}
|
|
131
|
+
else if (snapshot.state === "awaiting_host") {
|
|
132
|
+
if (!options.resolveHost)
|
|
133
|
+
return snapshot;
|
|
134
|
+
snapshot = await continueAtomAttempt(definition, input, context, snapshot, options, await options.resolveHost(snapshot.hostTask));
|
|
135
|
+
}
|
|
136
|
+
else
|
|
137
|
+
snapshot = await continueAtomAttempt(definition, input, context, snapshot, options);
|
|
138
|
+
}
|
|
139
|
+
return snapshot;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=lifecycle-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-driver.js","sourceRoot":"","sources":["../../src/lifecycle/lifecycle-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ManagedAtomResource, AttemptResourceManager } from "@atom-workflow-agent/atom-sdk";
|
|
2
|
+
export declare class ManagedAttemptResources implements AttemptResourceManager {
|
|
3
|
+
private readonly onRegister?;
|
|
4
|
+
private readonly onRelease?;
|
|
5
|
+
readonly scope: "attempt";
|
|
6
|
+
private readonly resources;
|
|
7
|
+
private disposed;
|
|
8
|
+
constructor(onRegister?: ((resource: ManagedAtomResource) => void) | undefined, onRelease?: ((resource: ManagedAtomResource) => void) | undefined);
|
|
9
|
+
register(resource: ManagedAtomResource): void;
|
|
10
|
+
disposeAll(reason: Parameters<AttemptResourceManager["disposeAll"]>[0]): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=attempt-resource-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt-resource-manager.d.ts","sourceRoot":"","sources":["../../src/resources/attempt-resource-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEjG,qBAAa,uBAAwB,YAAW,sBAAsB;IAMlE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAN7B,QAAQ,CAAC,KAAK,EAAG,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IACpE,OAAO,CAAC,QAAQ,CAAS;gBAGN,UAAU,CAAC,GAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,aAAA,EACpD,SAAS,CAAC,GAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,aAAA;IAGtE,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAOvC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAW7F"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export class ManagedAttemptResources {
|
|
2
|
+
onRegister;
|
|
3
|
+
onRelease;
|
|
4
|
+
scope = "attempt";
|
|
5
|
+
resources = new Map();
|
|
6
|
+
disposed = false;
|
|
7
|
+
constructor(onRegister, onRelease) {
|
|
8
|
+
this.onRegister = onRegister;
|
|
9
|
+
this.onRelease = onRelease;
|
|
10
|
+
}
|
|
11
|
+
register(resource) {
|
|
12
|
+
if (this.disposed)
|
|
13
|
+
throw new Error("Attempt resources are already disposed");
|
|
14
|
+
if (this.resources.has(resource.id))
|
|
15
|
+
throw new Error(`Duplicate Attempt resource: ${resource.id}`);
|
|
16
|
+
this.resources.set(resource.id, resource);
|
|
17
|
+
this.onRegister?.(resource);
|
|
18
|
+
}
|
|
19
|
+
async disposeAll(reason) {
|
|
20
|
+
if (this.disposed)
|
|
21
|
+
return;
|
|
22
|
+
this.disposed = true;
|
|
23
|
+
const resources = [...this.resources.values()].reverse();
|
|
24
|
+
const results = await Promise.allSettled(resources.map((resource) => resource.dispose(reason)));
|
|
25
|
+
for (const resource of resources)
|
|
26
|
+
this.onRelease?.(resource);
|
|
27
|
+
const failures = results.filter((result) => result.status === "rejected");
|
|
28
|
+
if (failures.length > 0) {
|
|
29
|
+
throw new AggregateError(failures.map((failure) => failure.reason), "Attempt resource cleanup failed");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=attempt-resource-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt-resource-manager.js","sourceRoot":"","sources":["../../src/resources/attempt-resource-manager.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,uBAAuB;IAMf;IACA;IANV,KAAK,GAAG,SAAkB,CAAC;IACnB,SAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC5D,QAAQ,GAAG,KAAK,CAAC;IAEzB,YACmB,UAAoD,EACpD,SAAmD;QADnD,eAAU,GAAV,UAAU,CAA0C;QACpD,cAAS,GAAT,SAAS,CAA0C;IACnE,CAAC;IAEJ,QAAQ,CAAC,QAA6B;QACpC,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC7E,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACnG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAA2D;QAC1E,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChG,KAAK,MAAM,QAAQ,IAAI,SAAS;YAAE,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAmC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;QAC3G,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,iCAAiC,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../src/timeout/timeout.ts"],"names":[],"mappings":"AAEA,wBAAsB,WAAW,CAAC,CAAC,EACjC,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9C,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,YAAY,CAAC,EAAE,WAAW,GACzB,OAAO,CAAC,CAAC,CAAC,CAkCZ"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { AtomWorkflowError } from "@atom-workflow-agent/contracts";
|
|
2
|
+
export async function withTimeout(operation, timeoutMs, parentSignal) {
|
|
3
|
+
if (parentSignal?.aborted) {
|
|
4
|
+
const reason = parentSignal.reason;
|
|
5
|
+
throw reason instanceof AtomWorkflowError
|
|
6
|
+
? reason
|
|
7
|
+
: new AtomWorkflowError("CANCELLED", "Operation cancelled", false, reason instanceof Error ? { cause: reason } : undefined);
|
|
8
|
+
}
|
|
9
|
+
const controller = new AbortController();
|
|
10
|
+
const onParentAbort = () => {
|
|
11
|
+
const reason = parentSignal?.reason;
|
|
12
|
+
controller.abort(reason instanceof AtomWorkflowError ? reason : new AtomWorkflowError("CANCELLED", "Operation cancelled", false, reason instanceof Error ? { cause: reason } : undefined));
|
|
13
|
+
};
|
|
14
|
+
parentSignal?.addEventListener("abort", onParentAbort, { once: true });
|
|
15
|
+
const timer = timeoutMs === null
|
|
16
|
+
? undefined
|
|
17
|
+
: setTimeout(() => controller.abort(new AtomWorkflowError("TIMEOUT", `Timed out after ${timeoutMs}ms`, true)), timeoutMs);
|
|
18
|
+
try {
|
|
19
|
+
const aborted = new Promise((_, reject) => {
|
|
20
|
+
const rejectFromAbort = () => {
|
|
21
|
+
const reason = controller.signal.reason;
|
|
22
|
+
reject(reason instanceof Error ? reason : new AtomWorkflowError("CANCELLED", "Operation cancelled"));
|
|
23
|
+
};
|
|
24
|
+
controller.signal.addEventListener("abort", rejectFromAbort, { once: true });
|
|
25
|
+
if (controller.signal.aborted)
|
|
26
|
+
rejectFromAbort();
|
|
27
|
+
});
|
|
28
|
+
return await Promise.race([
|
|
29
|
+
operation(controller.signal),
|
|
30
|
+
aborted,
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
if (timer)
|
|
35
|
+
clearTimeout(timer);
|
|
36
|
+
parentSignal?.removeEventListener("abort", onParentAbort);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=timeout.js.map
|