taskflow-core 0.1.2 → 0.1.4
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/README.md +858 -0
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +32 -12
- package/dist/compile.js.map +1 -1
- package/dist/contract.d.ts +39 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +150 -0
- package/dist/contract.js.map +1 -0
- package/dist/host/runner-types.d.ts +3 -0
- package/dist/host/runner-types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/peek.d.ts +39 -0
- package/dist/peek.d.ts.map +1 -0
- package/dist/peek.js +119 -0
- package/dist/peek.js.map +1 -0
- package/dist/runner-core.d.ts.map +1 -1
- package/dist/runner-core.js +3 -0
- package/dist/runner-core.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +257 -9
- package/dist/runtime.js.map +1 -1
- package/dist/schema.d.ts +14 -2
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +190 -30
- package/dist/schema.js.map +1 -1
- package/dist/store.d.ts +4 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js.map +1 -1
- package/dist/verify.d.ts +1 -1
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +81 -13
- package/dist/verify.js.map +1 -1
- package/package.json +7 -4
package/dist/runner-core.js
CHANGED
|
@@ -24,6 +24,9 @@ export function isTransientError(r) {
|
|
|
24
24
|
// Idle timeout is a deterministic stall — retrying won't help.
|
|
25
25
|
if (r.stopReason === "error" && r.idleTimeout)
|
|
26
26
|
return false;
|
|
27
|
+
// A phase-timeout abort is deterministic: retrying would double-spend the cap.
|
|
28
|
+
if (r.phaseTimeout)
|
|
29
|
+
return false;
|
|
27
30
|
const hay = `${r.errorMessage ?? ""} ${r.stderr ?? ""} ${r.output ?? ""}`;
|
|
28
31
|
return TRANSIENT_ERROR_RE.test(hay);
|
|
29
32
|
}
|
package/dist/runner-core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-core.js","sourceRoot":"","sources":["../src/runner-core.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runner-core.js","sourceRoot":"","sources":["../src/runner-core.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import * as path from "node:path";
|
|
13
13
|
import * as fs from "node:fs";
|
|
14
14
|
import { coerceArray, evaluateCondition, interpolate, safeParse, tryEvaluateCondition } from "./interpolate.js";
|
|
15
|
+
import { contractViolations } from "./contract.js";
|
|
15
16
|
import { isFailed, isTransientError, mapWithConcurrencyLimit } from "./runner-core.js";
|
|
16
17
|
/** Default runner used when no host injected one: fail loudly rather than
|
|
17
18
|
* silently spawn anything (core is host-neutral and cannot spawn pi/codex). */
|
|
@@ -100,6 +101,7 @@ function resultToPhaseState(id, r, inputHash, parseJson) {
|
|
|
100
101
|
usage: r.usage,
|
|
101
102
|
model: r.model,
|
|
102
103
|
attempts: attempts > 1 ? attempts : undefined,
|
|
104
|
+
timedOut: r.phaseTimeout || undefined,
|
|
103
105
|
error: failed ? r.errorMessage || r.stderr || r.output : undefined,
|
|
104
106
|
inputHash,
|
|
105
107
|
endedAt: Date.now(),
|
|
@@ -314,6 +316,7 @@ function mergePhaseState(id, results, inputHash, parseJson) {
|
|
|
314
316
|
usage,
|
|
315
317
|
model,
|
|
316
318
|
attempts: attempts > results.length ? attempts : undefined,
|
|
319
|
+
timedOut: ran.some((r) => r.phaseTimeout) || undefined,
|
|
317
320
|
budgetTruncated: budgetSkips.length > 0 || undefined,
|
|
318
321
|
subProgress: { done: ran.length, total: results.length, running: 0, failed: failedCount },
|
|
319
322
|
error: errors.length ? errors.join("; ") : undefined,
|
|
@@ -648,7 +651,7 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
648
651
|
// each run (schema already rejects explicit cross-run, but the default-scope
|
|
649
652
|
// path must also be blocked). If flowDefHash failed, cross-run is unsafe
|
|
650
653
|
// because the key degrades to flowName-only and reopens cross-flow collisions.
|
|
651
|
-
const CROSS_RUN_BLOCKED_TYPES = new Set(["gate", "approval", "loop", "tournament"]);
|
|
654
|
+
const CROSS_RUN_BLOCKED_TYPES = new Set(["gate", "approval", "loop", "tournament", "script"]);
|
|
652
655
|
if (cacheScope === "cross-run" && CROSS_RUN_BLOCKED_TYPES.has(type)) {
|
|
653
656
|
cacheScope = "run-only";
|
|
654
657
|
}
|
|
@@ -671,12 +674,12 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
671
674
|
tools: phase.tools,
|
|
672
675
|
preRead,
|
|
673
676
|
};
|
|
674
|
-
const baseRun = (agentName, task, onLive, ctxNodeId) => run(effCwd, deps.agents, agentName, task, {
|
|
677
|
+
const baseRun = (agentName, task, onLive, ctxNodeId, signal) => run(effCwd, deps.agents, agentName, task, {
|
|
675
678
|
model: phase.model,
|
|
676
679
|
thinking: phase.thinking,
|
|
677
680
|
tools: phase.tools,
|
|
678
681
|
cwd: effCwd,
|
|
679
|
-
signal: deps.signal,
|
|
682
|
+
signal: signal ?? deps.signal,
|
|
680
683
|
onLive,
|
|
681
684
|
ctxDir: ctxDir,
|
|
682
685
|
nodeId: ctxDir ? ctxNodeId : undefined,
|
|
@@ -693,7 +696,12 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
693
696
|
const DEFAULT_TRANSIENT_RETRIES = 3;
|
|
694
697
|
const DEFAULT_TRANSIENT_BACKOFF_MS = 2000;
|
|
695
698
|
const DEFAULT_TRANSIENT_FACTOR = 2;
|
|
696
|
-
|
|
699
|
+
// Per-phase timeout: caps EACH subagent call of an agent-running phase.
|
|
700
|
+
// (script phases enforce their own child-process timeout — see the script branch.)
|
|
701
|
+
const phaseTimeoutMs = type !== "script" && typeof phase.timeout === "number" && Number.isFinite(phase.timeout) && phase.timeout >= 1000
|
|
702
|
+
? phase.timeout
|
|
703
|
+
: undefined;
|
|
704
|
+
const runOne = async (agentName, task, onLive, ctxNodeId, check) => {
|
|
697
705
|
const explicitMax = Math.max(1, 1 + Math.max(0, Math.floor(retry?.max ?? 0)));
|
|
698
706
|
// Allow enough attempts to cover whichever policy applies on a given attempt.
|
|
699
707
|
const maxAttempts = Math.max(explicitMax, 1 + DEFAULT_TRANSIENT_RETRIES);
|
|
@@ -702,8 +710,65 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
702
710
|
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
703
711
|
if (deps.signal?.aborted)
|
|
704
712
|
break;
|
|
705
|
-
|
|
713
|
+
// Phase timeout — an AbortController chained to the run's signal that also
|
|
714
|
+
// fires after `phase.timeout` ms. Deterministic: a timed-out call is never
|
|
715
|
+
// retried (retrying a call that just burned its full cap would double-spend).
|
|
716
|
+
let timedOut = false;
|
|
717
|
+
let timer;
|
|
718
|
+
let onParentAbort;
|
|
719
|
+
let callSignal;
|
|
720
|
+
if (phaseTimeoutMs) {
|
|
721
|
+
const ac = new AbortController();
|
|
722
|
+
callSignal = ac.signal;
|
|
723
|
+
if (deps.signal?.aborted)
|
|
724
|
+
ac.abort();
|
|
725
|
+
else if (deps.signal) {
|
|
726
|
+
onParentAbort = () => ac.abort();
|
|
727
|
+
deps.signal.addEventListener("abort", onParentAbort, { once: true });
|
|
728
|
+
}
|
|
729
|
+
timer = setTimeout(() => {
|
|
730
|
+
timedOut = true;
|
|
731
|
+
ac.abort();
|
|
732
|
+
}, phaseTimeoutMs);
|
|
733
|
+
}
|
|
734
|
+
try {
|
|
735
|
+
last = await baseRun(agentName, task, onLive, ctxNodeId, callSignal);
|
|
736
|
+
}
|
|
737
|
+
finally {
|
|
738
|
+
if (timer)
|
|
739
|
+
clearTimeout(timer);
|
|
740
|
+
if (onParentAbort)
|
|
741
|
+
deps.signal?.removeEventListener("abort", onParentAbort);
|
|
742
|
+
}
|
|
743
|
+
if (timedOut) {
|
|
744
|
+
// Reclassify the abort as a phase timeout: a distinct, deterministic
|
|
745
|
+
// failure (stopReason "error" keeps it in the failed bucket; the
|
|
746
|
+
// phaseTimeout marker excludes it from transient retry).
|
|
747
|
+
last = {
|
|
748
|
+
...last,
|
|
749
|
+
exitCode: last.exitCode === 0 ? 1 : last.exitCode,
|
|
750
|
+
stopReason: "error",
|
|
751
|
+
errorMessage: `Phase timed out after ${phaseTimeoutMs}ms (subagent aborted)`,
|
|
752
|
+
phaseTimeout: true,
|
|
753
|
+
};
|
|
754
|
+
usages.push(last.usage);
|
|
755
|
+
break;
|
|
756
|
+
}
|
|
706
757
|
usages.push(last.usage);
|
|
758
|
+
// Output contract (`expect`): a successful attempt whose JSON output
|
|
759
|
+
// violates the declared contract is a failure — eligible for the phase's
|
|
760
|
+
// explicit retry policy (never the transient fallback).
|
|
761
|
+
if (check && !isFailed(last)) {
|
|
762
|
+
const violations = check(last);
|
|
763
|
+
if (violations.length > 0) {
|
|
764
|
+
last = {
|
|
765
|
+
...last,
|
|
766
|
+
exitCode: last.exitCode === 0 ? 1 : last.exitCode,
|
|
767
|
+
stopReason: "error",
|
|
768
|
+
errorMessage: `Output contract violated:\n- ${violations.join("\n- ")}`,
|
|
769
|
+
};
|
|
770
|
+
}
|
|
771
|
+
}
|
|
707
772
|
// B6: aggregate and surface cumulative usage before the retry decision,
|
|
708
773
|
// so the TUI / budget guard see the in-flight spend on every attempt.
|
|
709
774
|
const liveRetry = state.phases[phase.id];
|
|
@@ -759,6 +824,17 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
759
824
|
return last;
|
|
760
825
|
};
|
|
761
826
|
const parseJson = phase.output === "json";
|
|
827
|
+
// Output contract (`expect`): validates the parsed JSON output of a finished
|
|
828
|
+
// subagent call. Wired into `runOne` so a violation counts as a failed attempt
|
|
829
|
+
// (retryable under the phase's explicit `retry` policy).
|
|
830
|
+
const contractCheck = phase.expect !== undefined && parseJson
|
|
831
|
+
? (r) => {
|
|
832
|
+
const parsed = safeParse(r.output);
|
|
833
|
+
if (parsed === undefined)
|
|
834
|
+
return ["$: output is not valid JSON (contract could not be checked)"];
|
|
835
|
+
return contractViolations(parsed, phase.expect);
|
|
836
|
+
}
|
|
837
|
+
: undefined;
|
|
762
838
|
// Runs a list of sub-tasks with live fan-out progress + aggregate live usage/activity.
|
|
763
839
|
// `perItem` (map only) enables per-item cross-run caching: each item is looked
|
|
764
840
|
// up in the cache before spawning a subagent, and a successful fresh item is
|
|
@@ -894,6 +970,12 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
894
970
|
const evalCtx = buildInterpolationContext(state, previousOutput, undefined, onRead);
|
|
895
971
|
let allPassed = true;
|
|
896
972
|
for (const check of phase.eval) {
|
|
973
|
+
// Defensive: a non-string check (validation reports it) must not crash the
|
|
974
|
+
// gate. Treat it as a failed check so the LLM gate runs (fail-safe).
|
|
975
|
+
if (typeof check !== "string") {
|
|
976
|
+
allPassed = false;
|
|
977
|
+
break;
|
|
978
|
+
}
|
|
897
979
|
let expr = check;
|
|
898
980
|
// Pre-process `contains` expressions: "{steps.x.output} contains PASS"
|
|
899
981
|
// Convert to: interpolate LHS, check RHS substring inclusion.
|
|
@@ -902,6 +984,13 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
902
984
|
const lhs = expr.slice(0, containsIdx).trim();
|
|
903
985
|
const rhs = expr.slice(containsIdx + " contains ".length).trim();
|
|
904
986
|
const lhsVal = interpolate(lhs, evalCtx);
|
|
987
|
+
// An unresolved LHS ref (e.g. a typo'd or not-yet-produced step) must NOT
|
|
988
|
+
// silently auto-PASS the gate — that would skip a safety check. Treat a
|
|
989
|
+
// missing ref as a failed eval so the LLM gate runs (fail-safe).
|
|
990
|
+
if (lhsVal.missing.length > 0) {
|
|
991
|
+
allPassed = false;
|
|
992
|
+
break;
|
|
993
|
+
}
|
|
905
994
|
const lhsStr = lhsVal.text;
|
|
906
995
|
if (!lhsStr.includes(rhs)) {
|
|
907
996
|
allPassed = false;
|
|
@@ -909,7 +998,11 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
909
998
|
}
|
|
910
999
|
continue;
|
|
911
1000
|
}
|
|
912
|
-
|
|
1001
|
+
// A parse error must NOT auto-PASS the safety gate (evaluateCondition
|
|
1002
|
+
// fails open with `true`). Treat an unparseable/false eval as a failed
|
|
1003
|
+
// check so the LLM gate runs (fail-safe).
|
|
1004
|
+
const { value: passed, error: evalErr } = tryEvaluateCondition(expr, evalCtx);
|
|
1005
|
+
if (evalErr || !passed) {
|
|
913
1006
|
allPassed = false;
|
|
914
1007
|
break;
|
|
915
1008
|
}
|
|
@@ -942,7 +1035,7 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
942
1035
|
const cached = cachedPhase(cc, ck);
|
|
943
1036
|
if (cached)
|
|
944
1037
|
return cached;
|
|
945
|
-
const r = await runOne(agentName, fullTask, liveSink(state, phase.id, emitProgress), nodeIdFor());
|
|
1038
|
+
const r = await runOne(agentName, fullTask, liveSink(state, phase.id, emitProgress), nodeIdFor(), contractCheck);
|
|
946
1039
|
const ps = resultToPhaseState(phase.id, r, inputHash, parseJson);
|
|
947
1040
|
if (readRefs.length)
|
|
948
1041
|
ps.reads = readRefsToReads(readRefs, state);
|
|
@@ -1004,7 +1097,7 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
1004
1097
|
const retryText = interpolate(phase.task ?? "", retryCtx).text;
|
|
1005
1098
|
const retryTask = preRead + retryText;
|
|
1006
1099
|
const retryIH = cacheKeys(cc, [phase.id, agentName, phase.model ?? "", retryTask]).key;
|
|
1007
|
-
const retryR = await runOne(agentName, retryTask, liveSink(state, phase.id, emitProgress));
|
|
1100
|
+
const retryR = await runOne(agentName, retryTask, liveSink(state, phase.id, emitProgress), undefined, contractCheck);
|
|
1008
1101
|
gatePs = resultToPhaseState(phase.id, retryR, retryIH, parseJson);
|
|
1009
1102
|
if (gatePs.status === "done")
|
|
1010
1103
|
gatePs.gate = parseGateVerdict(retryR.output);
|
|
@@ -1018,6 +1111,157 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
1018
1111
|
recordCache(cc, ps);
|
|
1019
1112
|
return ps;
|
|
1020
1113
|
}
|
|
1114
|
+
// script — zero-token shell command. Spawns a child process, pipes
|
|
1115
|
+
// interpolated `input` to stdin, captures stdout as the phase output.
|
|
1116
|
+
if (type === "script") {
|
|
1117
|
+
const cmd = phase.run;
|
|
1118
|
+
if (!cmd) {
|
|
1119
|
+
return {
|
|
1120
|
+
id: phase.id,
|
|
1121
|
+
status: "failed",
|
|
1122
|
+
error: "script phase requires 'run'",
|
|
1123
|
+
endedAt: Date.now(),
|
|
1124
|
+
usage: emptyUsage(),
|
|
1125
|
+
};
|
|
1126
|
+
}
|
|
1127
|
+
// Interpolate the command.
|
|
1128
|
+
// Array form: interpolate each element (safe — schema rejects placeholders in string form).
|
|
1129
|
+
// String form: skip interpolation — schema already guarantees no {placeholders}.
|
|
1130
|
+
const interpRun = Array.isArray(cmd)
|
|
1131
|
+
? cmd.map((s) => interpolate(s, ctx))
|
|
1132
|
+
: [{ text: cmd, missing: [] }];
|
|
1133
|
+
// Warn unresolved references.
|
|
1134
|
+
for (const r of interpRun) {
|
|
1135
|
+
if (r.missing.length)
|
|
1136
|
+
warnUnresolvedRefs(phase.id, r.missing);
|
|
1137
|
+
}
|
|
1138
|
+
const interpRunText = interpRun.map((r) => r.text);
|
|
1139
|
+
// Interpolate stdin input if provided.
|
|
1140
|
+
const stdinInterp = phase.input !== undefined ? interpolate(phase.input, ctx) : undefined;
|
|
1141
|
+
if (stdinInterp?.missing.length)
|
|
1142
|
+
warnUnresolvedRefs(phase.id, stdinInterp.missing);
|
|
1143
|
+
const stdinInput = stdinInterp?.text;
|
|
1144
|
+
const ck = cacheKeys(cc, [phase.id, JSON.stringify(interpRunText), stdinInput ?? ""]);
|
|
1145
|
+
const inputHash = ck.key;
|
|
1146
|
+
const cached = cachedPhase(cc, ck);
|
|
1147
|
+
if (cached)
|
|
1148
|
+
return cached;
|
|
1149
|
+
const MAX_STDOUT = 1_048_576; // 1 MB cap
|
|
1150
|
+
const SCRIPT_TIMEOUT_MS = (phase.timeout ?? 60_000); // default 60 s, configurable via phase.timeout
|
|
1151
|
+
const SIGKILL_GRACE_MS = 5_000; // grace period after SIGTERM before SIGKILL
|
|
1152
|
+
try {
|
|
1153
|
+
const { spawn } = await import("node:child_process");
|
|
1154
|
+
const result = await new Promise((resolve, reject) => {
|
|
1155
|
+
// Array command → direct spawn (safe); string → shell (rejected at validation if it has placeholders).
|
|
1156
|
+
const child = Array.isArray(cmd)
|
|
1157
|
+
? spawn(interpRunText[0], interpRunText.slice(1), {
|
|
1158
|
+
cwd: effCwd,
|
|
1159
|
+
env: process.env,
|
|
1160
|
+
shell: false,
|
|
1161
|
+
signal: deps.signal,
|
|
1162
|
+
})
|
|
1163
|
+
: spawn(interpRunText[0], [], {
|
|
1164
|
+
cwd: effCwd,
|
|
1165
|
+
env: process.env,
|
|
1166
|
+
shell: true,
|
|
1167
|
+
signal: deps.signal,
|
|
1168
|
+
});
|
|
1169
|
+
let stdout = "";
|
|
1170
|
+
let stderr = "";
|
|
1171
|
+
let stdoutOversize = false;
|
|
1172
|
+
let timedOut = false;
|
|
1173
|
+
child.stdout?.on("data", (d) => {
|
|
1174
|
+
if (stdout.length < MAX_STDOUT) {
|
|
1175
|
+
const need = MAX_STDOUT - stdout.length;
|
|
1176
|
+
stdout += d.toString().slice(0, need);
|
|
1177
|
+
if (stdout.length >= MAX_STDOUT)
|
|
1178
|
+
stdoutOversize = true;
|
|
1179
|
+
}
|
|
1180
|
+
});
|
|
1181
|
+
child.stderr?.on("data", (d) => {
|
|
1182
|
+
if (stderr.length < 500) {
|
|
1183
|
+
stderr += d.toString().slice(0, 500 - stderr.length);
|
|
1184
|
+
}
|
|
1185
|
+
});
|
|
1186
|
+
// Timeout guard: SIGTERM first, then SIGKILL after grace period.
|
|
1187
|
+
let sigkillTimer;
|
|
1188
|
+
const timer = setTimeout(() => {
|
|
1189
|
+
timedOut = true;
|
|
1190
|
+
child.kill("SIGTERM");
|
|
1191
|
+
// SIGKILL fallback if process ignores SIGTERM.
|
|
1192
|
+
sigkillTimer = setTimeout(() => {
|
|
1193
|
+
try {
|
|
1194
|
+
child.kill("SIGKILL");
|
|
1195
|
+
}
|
|
1196
|
+
catch { /* already dead */ }
|
|
1197
|
+
}, SIGKILL_GRACE_MS);
|
|
1198
|
+
}, SCRIPT_TIMEOUT_MS);
|
|
1199
|
+
child.on("error", (err) => {
|
|
1200
|
+
clearTimeout(timer);
|
|
1201
|
+
clearTimeout(sigkillTimer);
|
|
1202
|
+
reject(err);
|
|
1203
|
+
});
|
|
1204
|
+
child.on("close", (code) => {
|
|
1205
|
+
clearTimeout(timer);
|
|
1206
|
+
clearTimeout(sigkillTimer);
|
|
1207
|
+
resolve({ stdout, stderr, code, stdoutOversize, timedOut });
|
|
1208
|
+
});
|
|
1209
|
+
if (stdinInput !== undefined) {
|
|
1210
|
+
child.stdin?.on("error", () => { }); // swallow EPIPE when child closes stdin early
|
|
1211
|
+
child.stdin?.write(stdinInput);
|
|
1212
|
+
child.stdin?.end();
|
|
1213
|
+
}
|
|
1214
|
+
});
|
|
1215
|
+
if (result.code !== 0 || result.timedOut) {
|
|
1216
|
+
const ps = {
|
|
1217
|
+
id: phase.id,
|
|
1218
|
+
status: "failed",
|
|
1219
|
+
output: result.stdout,
|
|
1220
|
+
error: result.timedOut
|
|
1221
|
+
? `Script timed out after ${SCRIPT_TIMEOUT_MS}ms`
|
|
1222
|
+
: `Script exited with code ${result.code}${result.stderr ? ": " + result.stderr.slice(0, 500) : ""}${result.stdoutOversize ? " [stdout truncated at 1 MB]" : ""}`,
|
|
1223
|
+
timedOut: result.timedOut || undefined,
|
|
1224
|
+
usage: emptyUsage(),
|
|
1225
|
+
inputHash,
|
|
1226
|
+
endedAt: Date.now(),
|
|
1227
|
+
};
|
|
1228
|
+
if (readRefs.length)
|
|
1229
|
+
ps.reads = readRefsToReads(readRefs, state);
|
|
1230
|
+
// Non-zero exit: cache (deterministic failure). Timeout: don't cache (transient, like spawn errors).
|
|
1231
|
+
if (!result.timedOut)
|
|
1232
|
+
recordCache(cc, ps);
|
|
1233
|
+
return ps;
|
|
1234
|
+
}
|
|
1235
|
+
const ps = {
|
|
1236
|
+
id: phase.id,
|
|
1237
|
+
status: "done",
|
|
1238
|
+
output: result.stdout.trimEnd() + (result.stdoutOversize ? "\n[stdout truncated at 1 MB]" : ""),
|
|
1239
|
+
usage: emptyUsage(),
|
|
1240
|
+
inputHash,
|
|
1241
|
+
endedAt: Date.now(),
|
|
1242
|
+
};
|
|
1243
|
+
if (readRefs.length)
|
|
1244
|
+
ps.reads = readRefsToReads(readRefs, state);
|
|
1245
|
+
recordCache(cc, ps);
|
|
1246
|
+
return ps;
|
|
1247
|
+
}
|
|
1248
|
+
catch (err) {
|
|
1249
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1250
|
+
// Note: intentionally NOT cached — spawn errors (ENOENT, permission denied, etc.)
|
|
1251
|
+
// are treated as transient. The phase will re-execute on resume/retry.
|
|
1252
|
+
const ps = {
|
|
1253
|
+
id: phase.id,
|
|
1254
|
+
status: "failed",
|
|
1255
|
+
error: `Script error: ${msg}`,
|
|
1256
|
+
usage: emptyUsage(),
|
|
1257
|
+
inputHash,
|
|
1258
|
+
endedAt: Date.now(),
|
|
1259
|
+
};
|
|
1260
|
+
if (readRefs.length)
|
|
1261
|
+
ps.reads = readRefsToReads(readRefs, state);
|
|
1262
|
+
return ps;
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1021
1265
|
if (type === "parallel") {
|
|
1022
1266
|
const branches = (phase.branches ?? []).map((b) => {
|
|
1023
1267
|
const r = interpolate(b.task, ctx);
|
|
@@ -1399,7 +1643,7 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
1399
1643
|
loop: { iteration: i, lastOutput, maxIterations: maxIters },
|
|
1400
1644
|
}, (ref) => readRefs.push(ref));
|
|
1401
1645
|
const body = preRead + interpolate(phase.task ?? "", bodyCtx).text;
|
|
1402
|
-
const r = await runOne(agentName, body, liveSink(state, phase.id, emitProgress));
|
|
1646
|
+
const r = await runOne(agentName, body, liveSink(state, phase.id, emitProgress), undefined, contractCheck);
|
|
1403
1647
|
usages.push(r.usage);
|
|
1404
1648
|
if (isFailed(r)) {
|
|
1405
1649
|
failedResult = r;
|
|
@@ -1440,6 +1684,7 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
1440
1684
|
status: "failed",
|
|
1441
1685
|
output: lastOutput || undefined,
|
|
1442
1686
|
usage: aggUsage,
|
|
1687
|
+
timedOut: failedResult?.phaseTimeout || undefined,
|
|
1443
1688
|
error: failedResult?.errorMessage || failedResult?.stderr || (stop === "aborted" ? "Aborted" : `loop '${phase.id}' iteration ${iterations} failed`),
|
|
1444
1689
|
loop: { iterations, stop },
|
|
1445
1690
|
warnings: loopWarnings.length ? loopWarnings : undefined,
|
|
@@ -1501,6 +1746,7 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
1501
1746
|
status: "failed",
|
|
1502
1747
|
usage: variantUsage,
|
|
1503
1748
|
error: `tournament '${phase.id}': all ${competitors.length} variants failed`,
|
|
1749
|
+
timedOut: ran.some((r) => r.phaseTimeout) || undefined,
|
|
1504
1750
|
budgetTruncated: budgetSkipCount > 0 || undefined,
|
|
1505
1751
|
tournament: { variants: competitors.length, winner: 0, mode },
|
|
1506
1752
|
inputHash,
|
|
@@ -1605,6 +1851,8 @@ async function executePhaseInner(phase, state, deps, prior, emitProgress, _retry
|
|
|
1605
1851
|
}
|
|
1606
1852
|
/** Resolve a `{steps.x.json}`-style ref directly to its parsed value (bypassing stringify). */
|
|
1607
1853
|
function directRef(over, state) {
|
|
1854
|
+
if (typeof over !== "string")
|
|
1855
|
+
return undefined;
|
|
1608
1856
|
const m = over.match(/^\{steps\.([a-zA-Z0-9_-]+)\.(output|json)(?:\.([a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)*))?\}$/);
|
|
1609
1857
|
if (!m)
|
|
1610
1858
|
return undefined;
|