agent-nuvira 1.44.0 → 1.45.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.
@@ -0,0 +1,51 @@
1
+ /**
2
+ * CheckpointStore — persist and restore orchestration state for `--resume`.
3
+ *
4
+ * Assessment item #6 ("maintain continuity"): serialize intermediate state so
5
+ * subtasks can resume on another model without loss. After every task batch the
6
+ * orchestrator saves a snapshot of the ContextVault (task plan with per-step
7
+ * statuses, artifacts, file changes, metadata) to disk. A later run with
8
+ * `--resume <id>` rehydrates the vault and continues from the first pending
9
+ * step — completed steps are never re-run, so a crash / quota kill / token
10
+ * expiry mid-pipeline doesn't restart the whole plan.
11
+ *
12
+ * Checkpoints are JSON-serialized (JSON.stringify drops function fields like
13
+ * `onRateLimit` automatically), keyed by a deterministic id derived from
14
+ * `goal + workingDirectory` plus an optional explicit id. Persisted to
15
+ * `~/.buff/memory/checkpoints/` (honors BUFF_MEMORY_DIR). All reads/writes are
16
+ * best-effort — a corrupt or missing checkpoint must never crash a run.
17
+ */
18
+ import type { AgentContext } from './agent.js';
19
+ /** Lightweight checkpoint metadata (used for listing). */
20
+ export interface CheckpointMeta {
21
+ id: string;
22
+ goal: string;
23
+ workingDirectory: string;
24
+ savedAt: number;
25
+ tasksCompleted: number;
26
+ tasksTotal: number;
27
+ }
28
+ /** A full checkpoint on disk: metadata + the rehydratable context snapshot. */
29
+ export interface CheckpointFile extends CheckpointMeta {
30
+ context: AgentContext;
31
+ }
32
+ /**
33
+ * Deterministic checkpoint id for a goal + working directory. Two runs of the
34
+ * same goal in the same directory map to the same id, so `--resume` without an
35
+ * explicit id finds the latest checkpoint for that goal.
36
+ */
37
+ export declare function checkpointIdFor(goal: string, workingDirectory: string): string;
38
+ /**
39
+ * Save a checkpoint. Returns the checkpoint id, or null if the write failed
40
+ * (best-effort — checkpointing must never break the pipeline, and the caller
41
+ * can log the failure honestly instead of claiming a save that didn't happen).
42
+ *
43
+ * @param context The vault context to snapshot (task plan with statuses, etc.)
44
+ * @param id Optional explicit id; defaults to a hash of goal + cwd
45
+ */
46
+ export declare function saveCheckpoint(context: AgentContext, id?: string): string | null;
47
+ /** Load a checkpoint by id (null if missing/corrupt). */
48
+ export declare function loadCheckpoint(id: string): CheckpointFile | null;
49
+ /** List all saved checkpoints, newest first (for `buff execute --checkpoint-list`). */
50
+ export declare function listCheckpoints(): CheckpointMeta[];
51
+ //# sourceMappingURL=checkpoint-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-store.d.ts","sourceRoot":"","sources":["../../src/agents/checkpoint-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAa/C,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,+EAA+E;AAC/E,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,OAAO,EAAE,YAAY,CAAC;CACvB;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAM9E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBhF;AAED,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAUhE;AAED,uFAAuF;AACvF,wBAAgB,eAAe,IAAI,cAAc,EAAE,CA0BlD"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * CheckpointStore — persist and restore orchestration state for `--resume`.
3
+ *
4
+ * Assessment item #6 ("maintain continuity"): serialize intermediate state so
5
+ * subtasks can resume on another model without loss. After every task batch the
6
+ * orchestrator saves a snapshot of the ContextVault (task plan with per-step
7
+ * statuses, artifacts, file changes, metadata) to disk. A later run with
8
+ * `--resume <id>` rehydrates the vault and continues from the first pending
9
+ * step — completed steps are never re-run, so a crash / quota kill / token
10
+ * expiry mid-pipeline doesn't restart the whole plan.
11
+ *
12
+ * Checkpoints are JSON-serialized (JSON.stringify drops function fields like
13
+ * `onRateLimit` automatically), keyed by a deterministic id derived from
14
+ * `goal + workingDirectory` plus an optional explicit id. Persisted to
15
+ * `~/.buff/memory/checkpoints/` (honors BUFF_MEMORY_DIR). All reads/writes are
16
+ * best-effort — a corrupt or missing checkpoint must never crash a run.
17
+ */
18
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
19
+ import { join } from 'node:path';
20
+ import { homedir } from 'node:os';
21
+ import { createHash } from 'node:crypto';
22
+ // ─── Storage ────────────────────────────────────────────────────────────────
23
+ const DEFAULT_MEMORY_DIR = join(homedir(), '.buff', 'memory');
24
+ function checkpointsDir() {
25
+ const base = process.env.BUFF_MEMORY_DIR || DEFAULT_MEMORY_DIR;
26
+ return join(base, 'checkpoints');
27
+ }
28
+ // ─── Helpers ────────────────────────────────────────────────────────────────
29
+ /**
30
+ * Deterministic checkpoint id for a goal + working directory. Two runs of the
31
+ * same goal in the same directory map to the same id, so `--resume` without an
32
+ * explicit id finds the latest checkpoint for that goal.
33
+ */
34
+ export function checkpointIdFor(goal, workingDirectory) {
35
+ const hash = createHash('sha1')
36
+ .update(`${workingDirectory}\u0000${goal}`)
37
+ .digest('hex')
38
+ .slice(0, 12);
39
+ return `cp-${hash}`;
40
+ }
41
+ /**
42
+ * Save a checkpoint. Returns the checkpoint id, or null if the write failed
43
+ * (best-effort — checkpointing must never break the pipeline, and the caller
44
+ * can log the failure honestly instead of claiming a save that didn't happen).
45
+ *
46
+ * @param context The vault context to snapshot (task plan with statuses, etc.)
47
+ * @param id Optional explicit id; defaults to a hash of goal + cwd
48
+ */
49
+ export function saveCheckpoint(context, id) {
50
+ try {
51
+ const dir = checkpointsDir();
52
+ if (!existsSync(dir))
53
+ mkdirSync(dir, { recursive: true });
54
+ const cid = id || checkpointIdFor(context.goal, context.workingDirectory);
55
+ const tasks = context.taskPlan ?? [];
56
+ const file = {
57
+ id: cid,
58
+ goal: context.goal,
59
+ workingDirectory: context.workingDirectory,
60
+ savedAt: Date.now(),
61
+ tasksCompleted: tasks.filter((t) => t.status === 'completed').length,
62
+ tasksTotal: tasks.length,
63
+ // JSON round-trip drops function fields (onRateLimit) — safe to persist.
64
+ context,
65
+ };
66
+ writeFileSync(join(dir, `${cid}.json`), JSON.stringify(file, null, 2), 'utf-8');
67
+ return cid;
68
+ }
69
+ catch {
70
+ // Best-effort — checkpointing must never break the pipeline.
71
+ return null;
72
+ }
73
+ }
74
+ /** Load a checkpoint by id (null if missing/corrupt). */
75
+ export function loadCheckpoint(id) {
76
+ try {
77
+ const path = join(checkpointsDir(), `${id}.json`);
78
+ if (!existsSync(path))
79
+ return null;
80
+ const data = JSON.parse(readFileSync(path, 'utf-8'));
81
+ if (!data || typeof data !== 'object' || !data.context)
82
+ return null;
83
+ return data;
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ /** List all saved checkpoints, newest first (for `buff execute --checkpoint-list`). */
90
+ export function listCheckpoints() {
91
+ try {
92
+ const dir = checkpointsDir();
93
+ if (!existsSync(dir))
94
+ return [];
95
+ return readdirSync(dir)
96
+ .filter((f) => f.endsWith('.json'))
97
+ .map((f) => {
98
+ try {
99
+ const data = JSON.parse(readFileSync(join(dir, f), 'utf-8'));
100
+ return {
101
+ id: data.id,
102
+ goal: data.goal,
103
+ workingDirectory: data.workingDirectory,
104
+ savedAt: data.savedAt,
105
+ tasksCompleted: data.tasksCompleted,
106
+ tasksTotal: data.tasksTotal,
107
+ };
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ })
113
+ .filter((c) => c !== null)
114
+ .sort((a, b) => b.savedAt - a.savedAt);
115
+ }
116
+ catch {
117
+ return [];
118
+ }
119
+ }
120
+ //# sourceMappingURL=checkpoint-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-store.js","sourceRoot":"","sources":["../../src/agents/checkpoint-store.ts"],"names":[],"mappings":"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"}
@@ -43,7 +43,14 @@ export declare class ContextVault {
43
43
  setMeta(key: string, value: unknown): void;
44
44
  /** Retrieve a metadata value */
45
45
  getMeta<T = unknown>(key: string): T | undefined;
46
- /** Get a serialisable snapshot (handy for logging / Phase 2 persistence) */
46
+ /** Get a serialisable snapshot (handy for logging / checkpoint persistence) */
47
47
  snapshot(): AgentContext;
48
+ /**
49
+ * Rehydrate a vault from a previously saved snapshot (checkpoint resume).
50
+ * Restores the goal, task plan (with per-step statuses), artifacts,
51
+ * conversations, file changes, and metadata so a resumed pipeline continues
52
+ * from the first pending step instead of restarting the whole plan.
53
+ */
54
+ static fromSnapshot(snapshot: AgentContext): ContextVault;
48
55
  }
49
56
  //# sourceMappingURL=context-vault.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-vault.d.ts","sourceRoot":"","sources":["../../src/agents/context-vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAgB,UAAU,EAAE,MAAM,YAAY,CAAC;AAe7F;;GAEG;AACH,qBAAa,YAAY;IACvB,oCAAoC;IACpC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;gBAEnB,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAMlD,iCAAiC;IACjC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;IAIpC,2CAA2C;IAC3C,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAUnF,6DAA6D;IAC7D,gBAAgB,IAAI,QAAQ,EAAE;IAU9B,iDAAiD;IACjD,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,mCAAmC;IACnC,IAAI,cAAc,IAAI,OAAO,CAE5B;IAID,qCAAqC;IACrC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;IAIzC,4DAA4D;IAC5D,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;IAO9C,oCAAoC;IACpC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAS3D,yDAAyD;IACzD,kBAAkB,IAAI,MAAM;IAQ5B,2BAA2B;IAC3B,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAUvC,2BAA2B;IAC3B,cAAc,IAAI,UAAU,EAAE;IAI9B,+CAA+C;IAC/C,cAAc,IAAI,MAAM;IAYxB,6BAA6B;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAI1C,gCAAgC;IAChC,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAMhD,4EAA4E;IAC5E,QAAQ,IAAI,YAAY;CAGzB"}
1
+ {"version":3,"file":"context-vault.d.ts","sourceRoot":"","sources":["../../src/agents/context-vault.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAgB,UAAU,EAAE,MAAM,YAAY,CAAC;AAe7F;;GAEG;AACH,qBAAa,YAAY;IACvB,oCAAoC;IACpC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;gBAEnB,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM;IAMlD,iCAAiC;IACjC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;IAIpC,2CAA2C;IAC3C,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAUnF,6DAA6D;IAC7D,gBAAgB,IAAI,QAAQ,EAAE;IAU9B,iDAAiD;IACjD,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,mCAAmC;IACnC,IAAI,cAAc,IAAI,OAAO,CAE5B;IAID,qCAAqC;IACrC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;IAIzC,4DAA4D;IAC5D,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;IAO9C,oCAAoC;IACpC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAS3D,yDAAyD;IACzD,kBAAkB,IAAI,MAAM;IAQ5B,2BAA2B;IAC3B,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAUvC,2BAA2B;IAC3B,cAAc,IAAI,UAAU,EAAE;IAI9B,+CAA+C;IAC/C,cAAc,IAAI,MAAM;IAYxB,6BAA6B;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAI1C,gCAAgC;IAChC,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAMhD,+EAA+E;IAC/E,QAAQ,IAAI,YAAY;IAIxB;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY;CAS1D"}
@@ -126,9 +126,24 @@ export class ContextVault {
126
126
  return this.context.metadata[key];
127
127
  }
128
128
  // ─── Snapshot ───────────────────────────────────────────────────────────
129
- /** Get a serialisable snapshot (handy for logging / Phase 2 persistence) */
129
+ /** Get a serialisable snapshot (handy for logging / checkpoint persistence) */
130
130
  snapshot() {
131
131
  return structuredClone(this.context);
132
132
  }
133
+ /**
134
+ * Rehydrate a vault from a previously saved snapshot (checkpoint resume).
135
+ * Restores the goal, task plan (with per-step statuses), artifacts,
136
+ * conversations, file changes, and metadata so a resumed pipeline continues
137
+ * from the first pending step instead of restarting the whole plan.
138
+ */
139
+ static fromSnapshot(snapshot) {
140
+ const vault = new ContextVault(snapshot.goal, snapshot.workingDirectory);
141
+ vault.context.taskPlan = snapshot.taskPlan ?? [];
142
+ vault.context.artifacts = snapshot.artifacts ?? [];
143
+ vault.context.conversations = snapshot.conversations ?? [];
144
+ vault.context.fileChanges = snapshot.fileChanges ?? [];
145
+ vault.context.metadata = snapshot.metadata ?? {};
146
+ return vault;
147
+ }
133
148
  }
134
149
  //# sourceMappingURL=context-vault.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-vault.js","sourceRoot":"","sources":["../../src/agents/context-vault.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-vault.js","sourceRoot":"","sources":["../../src/agents/context-vault.ts"],"names":[],"mappings":"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"}
@@ -96,6 +96,26 @@ export interface OrchestratorOptions {
96
96
  stop(): void;
97
97
  start(text?: string): void;
98
98
  };
99
+ /**
100
+ * Save a checkpoint after every task batch so the pipeline can be resumed
101
+ * later with `--resume` (or a fresh run of the same goal). Checkpoints live
102
+ * in ~/.buff/memory/checkpoints/ and let a crash / quota kill / token expiry
103
+ * mid-pipeline continue from the first pending step instead of restarting.
104
+ * Default: false. Implied true when resumeCheckpointId is set.
105
+ */
106
+ checkpoint?: boolean;
107
+ /**
108
+ * Resume a previously saved pipeline from a checkpoint id (or the auto id
109
+ * for goal + cwd). Completed steps are skipped; execution continues from the
110
+ * first pending step with its dependencies satisfied.
111
+ */
112
+ resumeCheckpointId?: string;
113
+ /**
114
+ * True when the user explicitly asked to RESUME (bare `--resume` with no id
115
+ * included). Lets the orchestrator warn when no checkpoint matches the auto
116
+ * id (e.g. a reworded goal) instead of silently starting a fresh pipeline.
117
+ */
118
+ resumeRequested?: boolean;
99
119
  }
100
120
  /** The final result of an orchestration session */
101
121
  export interface OrchestrationResult {
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/agents/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/agents/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@ import { ConfigManager } from '../config/manager.js';
24
24
  import { showModelPicker } from '../cli/model-picker.js';
25
25
  import { logger } from '../utils/logger.js';
26
26
  import { ContextVault } from './context-vault.js';
27
+ import { saveCheckpoint, loadCheckpoint, checkpointIdFor } from './checkpoint-store.js';
27
28
  import { buildProjectFileTree, truncateTree } from './utils/file-tree.js';
28
29
  import { cleanupSandbox } from './agents/tester.js';
29
30
  import { getMCPManager, resetMCPManager } from '../mcp/manager.js';
@@ -123,7 +124,39 @@ export class Orchestrator {
123
124
  */
124
125
  async execute(goal, options = {}) {
125
126
  const startTime = Date.now();
126
- const vault = new ContextVault(goal, process.cwd());
127
+ // ── Checkpoint resume: rehydrate a saved vault instead of starting fresh ──
128
+ // Assessment item #6 (continuity): if a previous run saved a checkpoint for
129
+ // this goal, `--resume` continues from the first pending step — completed
130
+ // steps are never re-run, and the resumed provider/model can differ.
131
+ const checkpointId = checkpointIdFor(goal, process.cwd());
132
+ const resumeId = options.resumeCheckpointId || checkpointId;
133
+ const checkpointEnabled = options.checkpoint === true || !!options.resumeCheckpointId;
134
+ let resumed = false;
135
+ let vault;
136
+ if (checkpointEnabled) {
137
+ const saved = loadCheckpoint(resumeId);
138
+ if (saved) {
139
+ vault = ContextVault.fromSnapshot(saved.context);
140
+ resumed = true;
141
+ const done = saved.context.taskPlan.filter((s) => s.status === 'completed').length;
142
+ if (options.verbose) {
143
+ logger.info(` ♻️ Resumed from checkpoint '${resumeId}' — ${done}/${saved.context.taskPlan.length} steps already complete`);
144
+ }
145
+ }
146
+ else {
147
+ // Resume explicitly requested (bare `--resume` or explicit id) but no
148
+ // checkpoint found — warn (a reworded goal silently misses the auto id)
149
+ // and start fresh with checkpointing on, so a later crash can still be
150
+ // resumed.
151
+ if (options.resumeRequested || options.resumeCheckpointId) {
152
+ logger.warn(` ⚠️ No checkpoint found for '${resumeId}' — starting a fresh pipeline (run with --checkpoint to save one)`);
153
+ }
154
+ vault = new ContextVault(goal, process.cwd());
155
+ }
156
+ }
157
+ else {
158
+ vault = new ContextVault(goal, process.cwd());
159
+ }
127
160
  // Reset execution telemetry for this pipeline (shared accumulator used by
128
161
  // createLLMProvider, executeSingleTask, and buildResult).
129
162
  this.stats = {
@@ -144,7 +177,10 @@ export class Orchestrator {
144
177
  // Matches executeSingleTask's rule: an explicit --model always wins.
145
178
  const autoRoutingActive = (options.autoRouteModels === true && !options.model) ||
146
179
  isAutoModel(options.model) || isAutoProvider(options.provider);
147
- const plannerRoutingDecision = autoRoutingActive
180
+ // On RESUME the restored vault already carries the routingContext from the
181
+ // original run — recomputing it here would overwrite the checkpointed
182
+ // metadata (and the planner isn't re-run anyway, so the override is moot).
183
+ const plannerRoutingDecision = autoRoutingActive && !resumed
148
184
  ? this.resolveAutoRoutingDecision({ agentType: 'planner', description: goal }, options)
149
185
  : undefined;
150
186
  if (plannerRoutingDecision) {
@@ -161,7 +197,18 @@ export class Orchestrator {
161
197
  const defaultCallLLM = autoRoutingActive
162
198
  ? this.createAutoRoutedLLM({ agentType: 'planner', description: goal }, options)
163
199
  : this.createLLMProvider(options);
164
- const agentResults = [];
200
+ // On resume, seed the report with the steps already finished in the original
201
+ // run (completed/failed) so the final agent breakdown is complete — these
202
+ // steps are never re-executed, but they still count toward the summary.
203
+ const agentResults = resumed
204
+ ? vault.context.taskPlan
205
+ .filter((s) => s.status === 'completed' || s.status === 'failed')
206
+ .map((s) => ({
207
+ agent: s.agentType,
208
+ success: s.status === 'completed',
209
+ summary: s.result || (s.status === 'completed' ? 'Completed (previous run)' : 'Failed (previous run)'),
210
+ }))
211
+ : [];
165
212
  const contextFiles = [];
166
213
  // ── Emit: pipeline started event ───────────────────────────────────
167
214
  this.eventBus.emit(EventNames.ORCHESTRATOR_PIPELINE_STARTED, {
@@ -274,7 +321,18 @@ export class Orchestrator {
274
321
  // `--auto-route` / autoRouteModels enables per-task AutoModelRouter
275
322
  // routing in executeSingleTask (no static map needed).
276
323
  // ── 4. Planner (or pre-built plan from workflow template) ────────────
277
- if (options.prefillPlan && options.prefillPlan.length > 0) {
324
+ // When resuming from a checkpoint the plan is already in the vault — skip
325
+ // the planner entirely (no re-plan, no re-gather) and continue execution.
326
+ if (resumed && vault.context.taskPlan.length > 0) {
327
+ if (options.verbose) {
328
+ logger.highlight('\n♻️ Resuming existing plan from checkpoint...');
329
+ for (const step of vault.context.taskPlan) {
330
+ const icon = step.status === 'completed' ? '✅' : step.status === 'failed' ? '❌' : '⏳';
331
+ logger.info(` ${icon} [${step.agentType}] ${step.description}`);
332
+ }
333
+ }
334
+ }
335
+ else if (options.prefillPlan && options.prefillPlan.length > 0) {
278
336
  for (const step of options.prefillPlan) {
279
337
  vault.context.taskPlan.push({ ...step });
280
338
  }
@@ -418,6 +476,42 @@ export class Orchestrator {
418
476
  await this.executeSingleTask(task, vault, options, agentResults, contextFiles, defaultCallLLM, strategy);
419
477
  }
420
478
  }
479
+ // ── Checkpoint after every task batch ──────────────────────────────
480
+ // Persist the vault (per-step statuses, artifacts, file changes) so a
481
+ // crash / quota kill / token expiry mid-pipeline can `--resume` from
482
+ // here instead of restarting the whole plan (assessment item #6).
483
+ // Guarded by !vault.isComplete: in-progress states are saved per batch,
484
+ // and the terminal state is persisted once by the final save below —
485
+ // no redundant double-write on the completing iteration.
486
+ if (checkpointEnabled && !vault.isComplete) {
487
+ try {
488
+ const cid = saveCheckpoint(vault.context, resumeId);
489
+ if (cid && options.verbose) {
490
+ const done = vault.context.taskPlan.filter((s) => s.status === 'completed').length;
491
+ logger.debug(` 💾 Checkpoint saved (${cid}): ${done}/${vault.context.taskPlan.length} steps complete`);
492
+ }
493
+ }
494
+ catch {
495
+ // Best-effort — checkpointing must never break the pipeline
496
+ }
497
+ }
498
+ }
499
+ // ── 5b. Final checkpoint (pipeline completing) ────────────────────────
500
+ // Save once more after the loop so the newest on-disk checkpoint reflects
501
+ // the COMPLETED state (including the final batch). Without this, the last
502
+ // saved checkpoint would show the final step still 'pending', and a
503
+ // --resume after a successful run would re-execute it.
504
+ if (checkpointEnabled) {
505
+ try {
506
+ const cid = saveCheckpoint(vault.context, resumeId);
507
+ if (cid && options.verbose) {
508
+ const done = vault.context.taskPlan.filter((s) => s.status === 'completed').length;
509
+ logger.debug(` 💾 Final checkpoint saved (${cid}): ${done}/${vault.context.taskPlan.length} steps complete`);
510
+ }
511
+ }
512
+ catch {
513
+ // Best-effort — checkpointing must never break the pipeline
514
+ }
421
515
  }
422
516
  // ── 6. Clean up sandbox if any ────────────────────────────────────────
423
517
  const sandboxPath = vault.getMeta('sandboxPath');