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.
- package/dist/agents/checkpoint-store.d.ts +51 -0
- package/dist/agents/checkpoint-store.d.ts.map +1 -0
- package/dist/agents/checkpoint-store.js +120 -0
- package/dist/agents/checkpoint-store.js.map +1 -0
- package/dist/agents/context-vault.d.ts +8 -1
- package/dist/agents/context-vault.d.ts.map +1 -1
- package/dist/agents/context-vault.js +16 -1
- package/dist/agents/context-vault.js.map +1 -1
- package/dist/agents/orchestrator.d.ts +20 -0
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +98 -4
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/cli/execute.d.ts +4 -0
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +41 -1
- package/dist/cli/execute.js.map +1 -1
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +38 -1
- package/dist/web-dashboard/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -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 /
|
|
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
|
|
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 /
|
|
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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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');
|