taskflow-core 0.2.5 → 0.2.7

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 (46) hide show
  1. package/README.md +33 -5
  2. package/dist/analytics.d.ts +30 -0
  3. package/dist/analytics.d.ts.map +1 -0
  4. package/dist/analytics.js +127 -0
  5. package/dist/analytics.js.map +1 -0
  6. package/dist/build-info.json +2 -2
  7. package/dist/exec/step-kinds.d.ts +1 -1
  8. package/dist/exec/step-kinds.d.ts.map +1 -1
  9. package/dist/exec/step-kinds.js +26 -14
  10. package/dist/exec/step-kinds.js.map +1 -1
  11. package/dist/hooks.d.ts +73 -0
  12. package/dist/hooks.d.ts.map +1 -0
  13. package/dist/hooks.js +296 -0
  14. package/dist/hooks.js.map +1 -0
  15. package/dist/index.d.ts +4 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +4 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/preflight.d.ts +69 -0
  20. package/dist/preflight.d.ts.map +1 -0
  21. package/dist/preflight.js +389 -0
  22. package/dist/preflight.js.map +1 -0
  23. package/dist/runner-core.d.ts +6 -0
  24. package/dist/runner-core.d.ts.map +1 -1
  25. package/dist/runner-core.js +75 -19
  26. package/dist/runner-core.js.map +1 -1
  27. package/dist/runtime/phases/approval-wait.d.ts +33 -0
  28. package/dist/runtime/phases/approval-wait.d.ts.map +1 -0
  29. package/dist/runtime/phases/approval-wait.js +95 -0
  30. package/dist/runtime/phases/approval-wait.js.map +1 -0
  31. package/dist/runtime/phases/approval.d.ts +1 -1
  32. package/dist/runtime/phases/approval.d.ts.map +1 -1
  33. package/dist/runtime/phases/approval.js +10 -6
  34. package/dist/runtime/phases/approval.js.map +1 -1
  35. package/dist/runtime.d.ts.map +1 -1
  36. package/dist/runtime.js +40 -11
  37. package/dist/runtime.js.map +1 -1
  38. package/dist/savings.d.ts +36 -0
  39. package/dist/savings.d.ts.map +1 -0
  40. package/dist/savings.js +76 -0
  41. package/dist/savings.js.map +1 -0
  42. package/dist/schema.d.ts +31 -0
  43. package/dist/schema.d.ts.map +1 -1
  44. package/dist/schema.js +123 -0
  45. package/dist/schema.js.map +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1,389 @@
1
+ /**
2
+ * Preflight dry-run — zero-token plan before spend.
3
+ *
4
+ * Binds typed args, runs structural verify, projects a phase plan with
5
+ * static/dynamic binding status, and computes a worst-case agent-call bound.
6
+ */
7
+ import { asArray, collectRefs, desugar, isShorthand, LOOP_DEFAULT_MAX_ITERATIONS, LOOP_HARD_MAX_ITERATIONS, resolveArgs, topoLayers, validateInvocationArgs, validateTaskflow, } from "./schema.js";
8
+ import { verifyTaskflow, } from "./verify.js";
9
+ // ---------------------------------------------------------------------------
10
+ // when / binding helpers
11
+ // ---------------------------------------------------------------------------
12
+ const STEPS_PLACEHOLDER = /\{steps\.[a-zA-Z0-9_-]+/;
13
+ const PREVIOUS_PLACEHOLDER = /\{previous\.|\{item\b|\{reflexion\b/;
14
+ const ARGS_PLACEHOLDER = /\{args\.([a-zA-Z0-9_-]+)(?:\.[a-zA-Z0-9_-]+)*\}/g;
15
+ function templateIsDynamic(s) {
16
+ if (!s)
17
+ return false;
18
+ return STEPS_PLACEHOLDER.test(s) || PREVIOUS_PLACEHOLDER.test(s);
19
+ }
20
+ /** Classify a `when` guard for preflight (args-only static evaluation). */
21
+ export function classifyWhen(when, args) {
22
+ if (!when || !when.trim())
23
+ return "always";
24
+ if (templateIsDynamic(when))
25
+ return "dynamic";
26
+ // Only args — try a tiny static truthiness check for simple forms.
27
+ const onlyArgs = when.replace(ARGS_PLACEHOLDER, (_, name) => {
28
+ const v = args[name];
29
+ if (v === undefined)
30
+ return "{missing}";
31
+ return String(v);
32
+ });
33
+ if (onlyArgs.includes("{"))
34
+ return "dynamic";
35
+ // Simple literals after arg substitution
36
+ const t = onlyArgs.trim().toLowerCase();
37
+ if (t === "true" || t === "1" || t === "yes")
38
+ return "static-true";
39
+ if (t === "false" || t === "0" || t === "no" || t === "")
40
+ return "static-false";
41
+ // Equality on args: `{args.x}==foo` already substituted above if exact
42
+ if (/^(true|false)$/i.test(t))
43
+ return t.toLowerCase() === "true" ? "static-true" : "static-false";
44
+ // Conservative: treat non-trivial static expressions as dynamic (fail-open at plan)
45
+ if (!STEPS_PLACEHOLDER.test(when) && !PREVIOUS_PLACEHOLDER.test(when)) {
46
+ // If no missing args placeholders left, we still may not eval full condition language —
47
+ // mark dynamic so we never skip a phase that should run.
48
+ return "dynamic";
49
+ }
50
+ return "dynamic";
51
+ }
52
+ function collectTemplates(phase) {
53
+ const out = [];
54
+ const push = (s) => {
55
+ if (typeof s === "string" && s.includes("{"))
56
+ out.push(s);
57
+ };
58
+ push(phase.task);
59
+ push(phase.over);
60
+ push(phase.when);
61
+ push(phase.until);
62
+ push(phase.cwd);
63
+ if (Array.isArray(phase.run))
64
+ for (const r of phase.run)
65
+ push(r);
66
+ push(phase.input);
67
+ if (typeof phase.def === "string")
68
+ push(phase.def);
69
+ for (const e of asArray(phase.eval))
70
+ push(e);
71
+ const score = phase.score;
72
+ if (score && typeof score === "object") {
73
+ push(score.target);
74
+ if (score.judge && typeof score.judge === "object")
75
+ push(score.judge.task);
76
+ }
77
+ return out;
78
+ }
79
+ function bindingsForPhase(phase, args) {
80
+ const refs = collectRefs(phase);
81
+ const bindings = [];
82
+ for (const a of refs.args) {
83
+ if (a in args && args[a] !== undefined) {
84
+ bindings.push({ path: `args.${a}`, status: "bound", value: stringifyBound(args[a]) });
85
+ }
86
+ else {
87
+ bindings.push({ path: `args.${a}`, status: "unresolved" });
88
+ }
89
+ }
90
+ for (const s of refs.steps) {
91
+ bindings.push({ path: `steps.${s}`, status: "dynamic" });
92
+ }
93
+ // Also flag previous/item style dynamics from templates
94
+ for (const t of collectTemplates(phase)) {
95
+ if (PREVIOUS_PLACEHOLDER.test(t) && !bindings.some((b) => b.path.startsWith("previous") || b.path === "item")) {
96
+ if (/\{previous\./.test(t))
97
+ bindings.push({ path: "previous.output", status: "dynamic" });
98
+ if (/\{item\b/.test(t))
99
+ bindings.push({ path: "item", status: "dynamic" });
100
+ }
101
+ }
102
+ return bindings;
103
+ }
104
+ function stringifyBound(v) {
105
+ if (typeof v === "string")
106
+ return v.length > 80 ? `${v.slice(0, 77)}…` : v;
107
+ try {
108
+ const s = JSON.stringify(v);
109
+ return s.length > 80 ? `${s.slice(0, 77)}…` : s;
110
+ }
111
+ catch {
112
+ return String(v);
113
+ }
114
+ }
115
+ // ---------------------------------------------------------------------------
116
+ // Budget bound
117
+ // ---------------------------------------------------------------------------
118
+ const LLM_TYPES = new Set([
119
+ "agent",
120
+ "gate",
121
+ "reduce",
122
+ "map",
123
+ "parallel",
124
+ "loop",
125
+ "tournament",
126
+ "race",
127
+ ]);
128
+ export function computeBudgetBound(phases, args = {}) {
129
+ const assumptions = [];
130
+ let unbounded = false;
131
+ let maxMapFanout;
132
+ let total = 0;
133
+ const byId = new Map(phases.map((p) => [p.id, p]));
134
+ const boundPhase = (p, stack) => {
135
+ if (stack.has(p.id)) {
136
+ assumptions.push(`cycle involving '${p.id}' treated as unbounded`);
137
+ return "unbounded";
138
+ }
139
+ const when = classifyWhen(p.when, args);
140
+ if (when === "static-false")
141
+ return 0;
142
+ const type = p.type ?? "agent";
143
+ const next = new Set(stack);
144
+ next.add(p.id);
145
+ if (type === "script" || type === "approval")
146
+ return 0;
147
+ if (type === "agent" || type === "gate" || type === "reduce") {
148
+ if (type === "reduce" && p.reduceStrategy === "tree") {
149
+ assumptions.push(`phase '${p.id}': tree-reduce worst-case uses TREE cap (bounded as 256)`);
150
+ return 256;
151
+ }
152
+ return 1;
153
+ }
154
+ if (type === "parallel" || type === "race") {
155
+ const branches = asArray(p.branches);
156
+ // Each branch is one agent call in the common case
157
+ const n = Math.max(branches.length, 1);
158
+ return n;
159
+ }
160
+ if (type === "tournament") {
161
+ const variants = typeof p.variants === "number" && Number.isFinite(p.variants)
162
+ ? Math.max(1, Math.floor(p.variants))
163
+ : asArray(p.branches).length || 3;
164
+ return variants + 1; // variants + judge
165
+ }
166
+ if (type === "map") {
167
+ const over = p.over ?? "";
168
+ if (templateIsDynamic(over) || STEPS_PLACEHOLDER.test(over)) {
169
+ assumptions.push(`phase '${p.id}': map.over is dynamic → agent-call bound unbounded`);
170
+ maxMapFanout = "unbounded";
171
+ unbounded = true;
172
+ return "unbounded";
173
+ }
174
+ // args-only array refs are still dynamic without evaluating over JSON
175
+ if (/\{args\./.test(over)) {
176
+ assumptions.push(`phase '${p.id}': map.over depends on args (length unknown) → unbounded`);
177
+ maxMapFanout = "unbounded";
178
+ unbounded = true;
179
+ return "unbounded";
180
+ }
181
+ assumptions.push(`phase '${p.id}': map.over not a static array → treated as unbounded`);
182
+ maxMapFanout = "unbounded";
183
+ unbounded = true;
184
+ return "unbounded";
185
+ }
186
+ if (type === "loop") {
187
+ const maxIter = typeof p.maxIterations === "number" && Number.isFinite(p.maxIterations)
188
+ ? Math.min(Math.max(1, Math.floor(p.maxIterations)), LOOP_HARD_MAX_ITERATIONS)
189
+ : LOOP_DEFAULT_MAX_ITERATIONS;
190
+ // Body is one agent call per iteration (loop body is the phase task)
191
+ return maxIter;
192
+ }
193
+ if (type === "flow" || type === "expand") {
194
+ const def = p.def;
195
+ if (def && typeof def === "object" && def !== null) {
196
+ const child = def;
197
+ const childPhases = asArray(child.phases);
198
+ if (childPhases.length) {
199
+ let sum = 0;
200
+ for (const cp of childPhases) {
201
+ const b = boundPhase(cp, next);
202
+ if (b === "unbounded")
203
+ return "unbounded";
204
+ sum += b;
205
+ }
206
+ return sum;
207
+ }
208
+ }
209
+ assumptions.push(`phase '${p.id}': ${type} child def not statically available → unbounded`);
210
+ unbounded = true;
211
+ return "unbounded";
212
+ }
213
+ if (LLM_TYPES.has(type))
214
+ return 1;
215
+ return 0;
216
+ };
217
+ for (const p of phases) {
218
+ const b = boundPhase(p, new Set());
219
+ if (b === "unbounded") {
220
+ unbounded = true;
221
+ }
222
+ else {
223
+ total += b;
224
+ }
225
+ }
226
+ // Silence unused byId (reserved for future dep-aware pruning)
227
+ void byId;
228
+ return {
229
+ maxAgentCalls: unbounded ? "unbounded" : total,
230
+ maxMapFanout,
231
+ phasesCounted: phases.length,
232
+ assumptions,
233
+ };
234
+ }
235
+ // ---------------------------------------------------------------------------
236
+ // Main entry
237
+ // ---------------------------------------------------------------------------
238
+ /**
239
+ * Plan a flow without executing any agent. Pure w.r.t. model spend.
240
+ */
241
+ export function preflightTaskflow(raw, opts = {}) {
242
+ const strictArgs = opts.strictArgs !== false;
243
+ const issues = [];
244
+ let flow;
245
+ try {
246
+ if (isShorthand(raw)) {
247
+ flow = desugar(raw);
248
+ }
249
+ else if (raw && typeof raw === "object" && Array.isArray(raw.phases)) {
250
+ flow = raw;
251
+ }
252
+ else {
253
+ // Last chance: treat as shorthand or invalid
254
+ flow = desugar(raw);
255
+ }
256
+ }
257
+ catch (e) {
258
+ const msg = e instanceof Error ? e.message : String(e);
259
+ return {
260
+ ok: false,
261
+ issues: [{ message: `desugar failed: ${msg}`, severity: "error", category: "ref-integrity" }],
262
+ flowName: "(invalid)",
263
+ args: {},
264
+ phases: [],
265
+ budget: { maxAgentCalls: 0, phasesCounted: 0, assumptions: [] },
266
+ summary: `Preflight failed: ${msg}`,
267
+ };
268
+ }
269
+ const validation = validateTaskflow(flow, {
270
+ args: opts.args,
271
+ cwd: opts.cwd,
272
+ });
273
+ for (const e of validation.errors) {
274
+ issues.push({ message: e, severity: "error", category: "ref-integrity" });
275
+ }
276
+ for (const w of validation.warnings) {
277
+ issues.push({ message: w, severity: "warning", category: "ref-integrity" });
278
+ }
279
+ const args = resolveArgs(flow, opts.args);
280
+ const invErrs = validateInvocationArgs(flow, args);
281
+ for (const e of invErrs) {
282
+ issues.push({
283
+ message: e,
284
+ severity: strictArgs ? "error" : "warning",
285
+ category: "ref-integrity",
286
+ });
287
+ }
288
+ const verify = verifyTaskflow(flow, { verifiers: opts.verifiers });
289
+ issues.push(...verify.issues);
290
+ const phases = asArray(flow.phases).filter((p) => !!p && typeof p === "object" && typeof p.id === "string");
291
+ const layers = topoLayers(phases);
292
+ const orderMap = new Map();
293
+ let order = 0;
294
+ for (const layer of layers) {
295
+ for (const p of layer)
296
+ orderMap.set(p.id, order++);
297
+ }
298
+ const plan = phases.map((p) => {
299
+ const when = classifyWhen(p.when, args);
300
+ const bindings = bindingsForPhase(p, args);
301
+ const notes = [];
302
+ if (when === "static-false")
303
+ notes.push("statically skipped by when");
304
+ if (bindings.some((b) => b.status === "unresolved"))
305
+ notes.push("has unresolved args");
306
+ return {
307
+ id: p.id,
308
+ type: p.type ?? "agent",
309
+ order: orderMap.get(p.id) ?? 0,
310
+ when,
311
+ bindings,
312
+ agent: typeof p.agent === "string" ? p.agent : undefined,
313
+ modelHint: typeof p.model === "string" ? p.model : undefined,
314
+ notes: notes.length ? notes : undefined,
315
+ };
316
+ });
317
+ const budget = computeBudgetBound(phases, args);
318
+ if (budget.maxAgentCalls === "unbounded" && flow.budget) {
319
+ issues.push({
320
+ message: "Worst-case agent-call bound is unbounded (dynamic map/flow) while a flow budget is declared — cost ceiling still enforced at runtime but cannot be proven statically.",
321
+ severity: "warning",
322
+ category: "budget-overflow",
323
+ });
324
+ }
325
+ const ok = !issues.some((i) => i.severity === "error");
326
+ const summary = formatPreflightSummary({
327
+ ok,
328
+ flowName: flow.name,
329
+ phases: plan,
330
+ budget,
331
+ issueCount: issues.length,
332
+ errorCount: issues.filter((i) => i.severity === "error").length,
333
+ });
334
+ return {
335
+ ok,
336
+ issues,
337
+ flowName: flow.name,
338
+ args,
339
+ phases: plan,
340
+ budget,
341
+ summary,
342
+ verify,
343
+ };
344
+ }
345
+ export function formatPreflightSummary(p) {
346
+ const runnable = p.phases.filter((x) => x.when !== "static-false").length;
347
+ const dyn = p.phases.filter((x) => x.when === "dynamic" || x.bindings.some((b) => b.status === "dynamic")).length;
348
+ const calls = p.budget.maxAgentCalls;
349
+ const lines = [
350
+ `plan — flow "${p.flowName}" · ${p.ok ? "OK" : "BLOCKED"}`,
351
+ `phases: ${p.phases.length} total · ${runnable} may run · ${dyn} with dynamic refs`,
352
+ `budget bound: maxAgentCalls=${calls === "unbounded" ? "unbounded" : calls} · phasesCounted=${p.budget.phasesCounted}`,
353
+ `issues: ${p.errorCount} error(s), ${p.issueCount - p.errorCount} warning(s)`,
354
+ ];
355
+ if (p.budget.assumptions.length) {
356
+ lines.push(`assumptions: ${p.budget.assumptions.slice(0, 5).join("; ")}${p.budget.assumptions.length > 5 ? "…" : ""}`);
357
+ }
358
+ return lines.join("\n");
359
+ }
360
+ /** Full human report for MCP/CLI. */
361
+ export function formatPreflightReport(r, json = false) {
362
+ if (json)
363
+ return JSON.stringify(r, null, 2);
364
+ const lines = [r.summary, ""];
365
+ lines.push("Phase plan (topo order):");
366
+ const sorted = [...r.phases].sort((a, b) => a.order - b.order);
367
+ for (const p of sorted) {
368
+ const when = p.when === "always" ? "" : ` when=${p.when}`;
369
+ const agent = p.agent ? ` agent=${p.agent}` : "";
370
+ const notes = p.notes?.length ? ` (${p.notes.join("; ")})` : "";
371
+ lines.push(` ${p.order + 1}. ${p.id} [${p.type}]${when}${agent}${notes}`);
372
+ for (const b of p.bindings) {
373
+ const val = b.status === "bound" && b.value !== undefined ? `=${b.value}` : "";
374
+ lines.push(` · {${b.path}} → ${b.status}${val}`);
375
+ }
376
+ }
377
+ if (r.issues.length) {
378
+ lines.push("");
379
+ lines.push("Issues:");
380
+ for (const i of r.issues) {
381
+ const where = i.phaseId ? ` [${i.phaseId}]` : "";
382
+ lines.push(` ${i.severity === "error" ? "✗" : "!"} ${i.severity}${where}: ${i.message}`);
383
+ }
384
+ }
385
+ lines.push("");
386
+ lines.push("Zero tokens. Run with taskflow_run when ready.");
387
+ return lines.join("\n");
388
+ }
389
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"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"}
@@ -138,6 +138,12 @@ export interface RunSubagentProcessOptions<TAcc extends SubagentAccumulator> {
138
138
  acc: TAcc;
139
139
  foldLine: (acc: TAcc, line: string) => LiveUpdate | null;
140
140
  completionPolicy?: CompletionPolicy<TAcc>;
141
+ /** Host-specific escape hatch for a known redundant record that can grow
142
+ * without bound. The callback receives only a bounded prefix and must return
143
+ * true only when the accumulator already contains the authoritative data.
144
+ * Accepted records are discarded through their newline and never count as a
145
+ * terminal event; the host must still emit its compact terminal record. */
146
+ canDiscardOversizedLine?: (acc: TAcc, prefix: string) => boolean;
141
147
  /** Synchronous notification at the terminal-reap linearization point. */
142
148
  onTerminalCommit?: () => void;
143
149
  /** Fail closed when the CLI exits zero before its authoritative terminal event. */
@@ -1 +1 @@
1
- {"version":3,"file":"runner-core.d.ts","sourceRoot":"","sources":["../src/runner-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner-core.d.ts","sourceRoot":"","sources":["../src/runner-core.ts"],"names":[],"mappings":"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"}
@@ -468,6 +468,7 @@ export async function runSubagentProcess(opts) {
468
468
  if (proc.pid)
469
469
  registerProcessTree(proc.pid);
470
470
  let buffer = "";
471
+ let discardingOversizedLine = false;
471
472
  const stdoutDecoder = new StringDecoder("utf8");
472
473
  const stderrDecoder = new StringDecoder("utf8");
473
474
  let idleTimer;
@@ -699,28 +700,78 @@ export async function runSubagentProcess(opts) {
699
700
  break;
700
701
  }
701
702
  };
703
+ const canDiscardOversizedLine = (line) => {
704
+ if (!opts.canDiscardOversizedLine)
705
+ return false;
706
+ try {
707
+ // Never hand an unbounded record to host policy code. Pi needs only
708
+ // the fixed JSON event prefix to identify its redundant history.
709
+ return opts.canDiscardOversizedLine(acc, line.slice(0, 256));
710
+ }
711
+ catch (error) {
712
+ failProtocol(`Oversized-line policy failed: ${error instanceof Error ? error.message : String(error)}`);
713
+ return false;
714
+ }
715
+ };
716
+ const discardOversizedLine = () => {
717
+ clearTerminalCandidate();
718
+ armIdle();
719
+ const diagnostic = "[taskflow] Discarded an oversized redundant host record; waiting for the authoritative terminal event.";
720
+ result.stderr += `${result.stderr && !result.stderr.endsWith("\n") ? "\n" : ""}${diagnostic}\n`;
721
+ };
722
+ const consumeStdout = (decoded) => {
723
+ let chunk = decoded;
724
+ while (chunk && !protocolError) {
725
+ if (discardingOversizedLine) {
726
+ const newline = chunk.indexOf("\n");
727
+ if (newline < 0)
728
+ return;
729
+ discardingOversizedLine = false;
730
+ chunk = chunk.slice(newline + 1);
731
+ continue;
732
+ }
733
+ buffer += chunk;
734
+ chunk = "";
735
+ let newline = buffer.indexOf("\n");
736
+ while (newline >= 0 && !protocolError) {
737
+ const line = buffer.slice(0, newline);
738
+ buffer = buffer.slice(newline + 1);
739
+ if (Buffer.byteLength(line) > MAX_STDOUT_LINE_BYTES) {
740
+ if (canDiscardOversizedLine(line))
741
+ discardOversizedLine();
742
+ else
743
+ failProtocol(`Subagent emitted a stdout record larger than ${MAX_STDOUT_LINE_BYTES} bytes`);
744
+ }
745
+ else {
746
+ processLine(line);
747
+ }
748
+ newline = buffer.indexOf("\n");
749
+ }
750
+ if (protocolError) {
751
+ buffer = "";
752
+ return;
753
+ }
754
+ if (Buffer.byteLength(buffer) > MAX_STDOUT_LINE_BYTES) {
755
+ if (canDiscardOversizedLine(buffer)) {
756
+ // Retain no history payload while the rest of this record
757
+ // streams. The next newline exits discard mode.
758
+ buffer = "";
759
+ discardingOversizedLine = true;
760
+ discardOversizedLine();
761
+ }
762
+ else {
763
+ buffer = "";
764
+ failProtocol(`Subagent emitted an unterminated stdout record larger than ${MAX_STDOUT_LINE_BYTES} bytes`);
765
+ }
766
+ }
767
+ }
768
+ };
702
769
  proc.stdout.on("data", (data) => {
703
770
  // StringDecoder preserves multi-byte UTF-8 characters split across
704
771
  // arbitrary pipe chunks. Candidate revocation is event-semantic below:
705
772
  // metadata/heartbeat records classified as `ignore` must not disable both
706
773
  // terminal grace and the ordinary idle watchdog.
707
- buffer += stdoutDecoder.write(data);
708
- if (Buffer.byteLength(buffer) > MAX_STDOUT_LINE_BYTES && !buffer.includes("\n")) {
709
- // Drop the retained bytes before terminating so the bound remains true
710
- // even while a non-cooperative child takes time to die.
711
- buffer = "";
712
- failProtocol(`Subagent emitted an unterminated stdout record larger than ${MAX_STDOUT_LINE_BYTES} bytes`);
713
- return;
714
- }
715
- const lines = buffer.split("\n");
716
- buffer = lines.pop() || "";
717
- for (const line of lines) {
718
- if (Buffer.byteLength(line) > MAX_STDOUT_LINE_BYTES) {
719
- failProtocol(`Subagent emitted a stdout record larger than ${MAX_STDOUT_LINE_BYTES} bytes`);
720
- break;
721
- }
722
- processLine(line);
723
- }
774
+ consumeStdout(stdoutDecoder.write(data));
724
775
  if (!completionPolicy)
725
776
  armIdle();
726
777
  });
@@ -761,10 +812,15 @@ export async function runSubagentProcess(opts) {
761
812
  // Flush decoders and classify the final unterminated record before
762
813
  // settling. Any force-kill timer created by a malformed tail is cleared
763
814
  // below, so no signal can fire after this Promise resolves.
764
- buffer += stdoutDecoder.end();
815
+ consumeStdout(stdoutDecoder.end());
765
816
  if (!stderrCapped)
766
817
  result.stderr += stderrDecoder.end();
767
- if (buffer.trim() && killReason !== "abort" && killReason !== "idle-timeout" && killReason !== "fatal-error") {
818
+ if (discardingOversizedLine &&
819
+ killReason !== "abort" && killReason !== "idle-timeout" && killReason !== "fatal-error") {
820
+ failProtocol("Subagent ended during an unterminated oversized stdout record");
821
+ }
822
+ else if (buffer.trim() &&
823
+ killReason !== "abort" && killReason !== "idle-timeout" && killReason !== "fatal-error") {
768
824
  processLine(buffer);
769
825
  }
770
826
  settled = true;