agents-harness 0.2.0 → 0.3.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/README.md +45 -12
- package/dist/cli.js +9 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/resume.d.ts +4 -0
- package/dist/commands/resume.js +17 -2
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/run.d.ts +4 -0
- package/dist/commands/run.js +17 -2
- package/dist/commands/run.js.map +1 -1
- package/dist/core/context-manager.d.ts +7 -1
- package/dist/core/context-manager.js +8 -2
- package/dist/core/context-manager.js.map +1 -1
- package/dist/core/file-protocol.js +2 -1
- package/dist/core/file-protocol.js.map +1 -1
- package/dist/core/orchestrator.d.ts +3 -0
- package/dist/core/orchestrator.js +21 -7
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/types.d.ts +1 -0
- package/dist/dashboard/server.d.ts +4 -0
- package/dist/dashboard/server.js +33 -2
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/static/static/index.html +10 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -75,13 +75,19 @@ Give it a feature description and it handles the rest.
|
|
|
75
75
|
| `-s, --scope <workspaces...>` | Limit to specific workspaces (monorepo) | All |
|
|
76
76
|
| `--max-attempts <n>` | Max retry attempts per sprint | 3 |
|
|
77
77
|
| `--max-budget <n>` | Max total spend in USD | 50 |
|
|
78
|
-
| `--dashboard` |
|
|
78
|
+
| `--no-dashboard` | Disable the live web dashboard | On |
|
|
79
79
|
| `--port <n>` | Dashboard port | 3117 |
|
|
80
|
+
| `--model <model>` | Claude model for all agents | — |
|
|
81
|
+
| `--planner-model <model>` | Claude model for the planner agent | opus |
|
|
82
|
+
| `--generator-model <model>` | Claude model for the generator agent | opus |
|
|
83
|
+
| `--evaluator-model <model>` | Claude model for the evaluator agent | sonnet |
|
|
84
|
+
|
|
85
|
+
**Available models:** `opus`, `sonnet`, `haiku` (or full model IDs like `claude-opus-4-6`)
|
|
80
86
|
|
|
81
87
|
**Examples:**
|
|
82
88
|
|
|
83
89
|
```bash
|
|
84
|
-
# Simple feature
|
|
90
|
+
# Simple feature (dashboard opens at http://localhost:3117)
|
|
85
91
|
agents-harness run "Add a /health endpoint that returns 200 OK"
|
|
86
92
|
|
|
87
93
|
# With budget limit
|
|
@@ -90,8 +96,14 @@ agents-harness run "Refactor the auth module to use OAuth2" --max-budget 20
|
|
|
90
96
|
# Monorepo — only touch the backend
|
|
91
97
|
agents-harness run "Add pagination to the users API" --scope packages/api
|
|
92
98
|
|
|
93
|
-
#
|
|
94
|
-
agents-harness run "Build a notification system" --dashboard
|
|
99
|
+
# Disable the dashboard for CI or headless environments
|
|
100
|
+
agents-harness run "Build a notification system" --no-dashboard
|
|
101
|
+
|
|
102
|
+
# Use Sonnet for all agents (cheaper)
|
|
103
|
+
agents-harness run "Add a /health endpoint" --model sonnet
|
|
104
|
+
|
|
105
|
+
# Mix models — Opus for generation, Sonnet for planning/evaluation
|
|
106
|
+
agents-harness run "Build auth system" --planner-model sonnet --generator-model opus
|
|
95
107
|
```
|
|
96
108
|
|
|
97
109
|
### `init` — Initialize project config (optional)
|
|
@@ -158,8 +170,12 @@ Picks up where a stopped or failed run left off. Skips completed sprints.
|
|
|
158
170
|
| Flag | Description | Default |
|
|
159
171
|
|------|-------------|---------|
|
|
160
172
|
| `--max-budget <n>` | Max total spend in USD | 50 |
|
|
161
|
-
| `--dashboard` |
|
|
173
|
+
| `--no-dashboard` | Disable the live web dashboard | On |
|
|
162
174
|
| `--port <n>` | Dashboard port | 3117 |
|
|
175
|
+
| `--model <model>` | Claude model for all agents | — |
|
|
176
|
+
| `--planner-model <model>` | Claude model for the planner agent | opus |
|
|
177
|
+
| `--generator-model <model>` | Claude model for the generator agent | opus |
|
|
178
|
+
| `--evaluator-model <model>` | Claude model for the evaluator agent | sonnet |
|
|
163
179
|
|
|
164
180
|
**Example:**
|
|
165
181
|
|
|
@@ -169,6 +185,12 @@ agents-harness resume
|
|
|
169
185
|
|
|
170
186
|
# Resume with a higher budget
|
|
171
187
|
agents-harness resume --max-budget 100
|
|
188
|
+
|
|
189
|
+
# Resume without dashboard
|
|
190
|
+
agents-harness resume --no-dashboard
|
|
191
|
+
|
|
192
|
+
# Resume with different models
|
|
193
|
+
agents-harness resume --model sonnet
|
|
172
194
|
```
|
|
173
195
|
|
|
174
196
|
### `config` — Manage global settings
|
|
@@ -237,17 +259,28 @@ These are checked **in addition to** the built-in defaults (correctness, testing
|
|
|
237
259
|
|
|
238
260
|
## Live Dashboard
|
|
239
261
|
|
|
240
|
-
|
|
262
|
+
The dashboard starts automatically at `http://localhost:3117` on every run. It provides a split-panel UI for monitoring the entire harness lifecycle.
|
|
241
263
|
|
|
242
264
|
```bash
|
|
243
|
-
|
|
265
|
+
# Dashboard is on by default
|
|
266
|
+
agents-harness run "Build a feature"
|
|
244
267
|
# Dashboard: http://localhost:3117
|
|
268
|
+
|
|
269
|
+
# Disable for CI or headless environments
|
|
270
|
+
agents-harness run "Build a feature" --no-dashboard
|
|
245
271
|
```
|
|
246
272
|
|
|
247
|
-
|
|
248
|
-
-
|
|
249
|
-
-
|
|
250
|
-
|
|
273
|
+
**Left panel:**
|
|
274
|
+
- Phase pipeline (Plan → Decompose → Contract → Generate → Evaluate → Handoff) with active/done states
|
|
275
|
+
- Sprint cards with status, attempt count, cost, and evaluation criteria
|
|
276
|
+
|
|
277
|
+
**Right panel:**
|
|
278
|
+
- File viewer with tabs (Spec, Sprints, Contract, Evaluation, Handoff)
|
|
279
|
+
- Live file updates via WebSocket as agents write to `.harness/` files
|
|
280
|
+
- Auto-switches to the relevant tab when the phase changes
|
|
281
|
+
|
|
282
|
+
**Bottom:**
|
|
283
|
+
- Collapsible activity stream (every file read, edit, bash command)
|
|
251
284
|
- Cost tracking with budget progress bar
|
|
252
285
|
- Auto-reconnects if the connection drops
|
|
253
286
|
|
|
@@ -296,7 +329,7 @@ await harness.run("Add a REST API for managing todos");
|
|
|
296
329
|
|
|
297
330
|
| Agent | Model | Role | Tools |
|
|
298
331
|
|-------|-------|------|-------|
|
|
299
|
-
| **Planner** |
|
|
332
|
+
| **Planner** | Opus | Writes specs, decomposes into sprints, writes contracts | Read, Write |
|
|
300
333
|
| **Generator** | Opus | Implements code based on the contract | Read, Edit, Write, Bash, Glob, Grep |
|
|
301
334
|
| **Evaluator** | Sonnet | Critically tests implementation against contract | Read, Bash, Grep, Glob |
|
|
302
335
|
|
package/dist/cli.js
CHANGED
|
@@ -9,7 +9,7 @@ const program = new Command();
|
|
|
9
9
|
program
|
|
10
10
|
.name("agents-harness")
|
|
11
11
|
.description("Multi-agent orchestrator for autonomous software development")
|
|
12
|
-
.version("0.
|
|
12
|
+
.version("0.3.0");
|
|
13
13
|
program
|
|
14
14
|
.command("run")
|
|
15
15
|
.description("Start a new harness run with a specification")
|
|
@@ -19,6 +19,10 @@ program
|
|
|
19
19
|
.option("--max-budget <n>", "Max total budget in USD", parseFloat)
|
|
20
20
|
.option("--no-dashboard", "Disable live dashboard")
|
|
21
21
|
.option("--port <n>", "Dashboard port", parseInt)
|
|
22
|
+
.option("--model <model>", "Claude model for all agents (opus, sonnet, haiku)")
|
|
23
|
+
.option("--planner-model <model>", "Claude model for the planner agent")
|
|
24
|
+
.option("--generator-model <model>", "Claude model for the generator agent")
|
|
25
|
+
.option("--evaluator-model <model>", "Claude model for the evaluator agent")
|
|
22
26
|
.action((spec, options) => {
|
|
23
27
|
runCommand(spec, options);
|
|
24
28
|
});
|
|
@@ -40,6 +44,10 @@ program
|
|
|
40
44
|
.option("--max-budget <n>", "Max total budget in USD", parseFloat)
|
|
41
45
|
.option("--no-dashboard", "Disable live dashboard")
|
|
42
46
|
.option("--port <n>", "Dashboard port", parseInt)
|
|
47
|
+
.option("--model <model>", "Claude model for all agents (opus, sonnet, haiku)")
|
|
48
|
+
.option("--planner-model <model>", "Claude model for the planner agent")
|
|
49
|
+
.option("--generator-model <model>", "Claude model for the generator agent")
|
|
50
|
+
.option("--evaluator-model <model>", "Claude model for the evaluator agent")
|
|
43
51
|
.action((options) => {
|
|
44
52
|
resumeCommand(options);
|
|
45
53
|
});
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,8CAA8C,CAAC;KAC3D,QAAQ,CAAC,QAAQ,EAAE,wCAAwC,CAAC;KAC5D,MAAM,CAAC,6BAA6B,EAAE,8BAA8B,CAAC;KACrE,MAAM,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,QAAQ,CAAC;KACjE,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,UAAU,CAAC;KACjE,MAAM,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;KAClD,MAAM,CAAC,YAAY,EAAE,gBAAgB,EAAE,QAAQ,CAAC;KAChD,MAAM,CAAC,CAAC,IAAY,EAAE,OAAO,EAAE,EAAE;IAChC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,GAAG,EAAE;IACX,WAAW,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,GAAG,EAAE;IACX,aAAa,EAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,UAAU,CAAC;KACjE,MAAM,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;KAClD,MAAM,CAAC,YAAY,EAAE,gBAAgB,EAAE,QAAQ,CAAC;KAChD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;IAClB,aAAa,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;KAC1C,QAAQ,CAAC,OAAO,EAAE,2BAA2B,CAAC;KAC9C,QAAQ,CAAC,SAAS,EAAE,+BAA+B,CAAC;KACpD,MAAM,CAAC,CAAC,MAAc,EAAE,GAAY,EAAE,KAAc,EAAE,EAAE;IACvD,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,9 @@ export interface ResumeOptions {
|
|
|
2
2
|
maxBudget?: number;
|
|
3
3
|
dashboard?: boolean;
|
|
4
4
|
port?: number;
|
|
5
|
+
model?: string;
|
|
6
|
+
plannerModel?: string;
|
|
7
|
+
generatorModel?: string;
|
|
8
|
+
evaluatorModel?: string;
|
|
5
9
|
}
|
|
6
10
|
export declare function resumeCommand(options: ResumeOptions): Promise<void>;
|
package/dist/commands/resume.js
CHANGED
|
@@ -22,12 +22,24 @@ export async function resumeCommand(options) {
|
|
|
22
22
|
}
|
|
23
23
|
const root = process.cwd();
|
|
24
24
|
console.log("Resuming agents-harness run...");
|
|
25
|
-
|
|
25
|
+
const models = {
|
|
26
|
+
planner: options.plannerModel ?? options.model,
|
|
27
|
+
generator: options.generatorModel ?? options.model,
|
|
28
|
+
evaluator: options.evaluatorModel ?? options.model,
|
|
29
|
+
};
|
|
26
30
|
const harness = new Harness({
|
|
27
31
|
apiKey,
|
|
28
32
|
root,
|
|
29
33
|
maxTotalBudgetUsd: options.maxBudget,
|
|
34
|
+
models,
|
|
30
35
|
});
|
|
36
|
+
const resolvedModels = harness.getModels();
|
|
37
|
+
console.log("");
|
|
38
|
+
console.log("Models:");
|
|
39
|
+
console.log(` Planner: ${resolvedModels.planner}`);
|
|
40
|
+
console.log(` Generator: ${resolvedModels.generator}`);
|
|
41
|
+
console.log(` Evaluator: ${resolvedModels.evaluator}`);
|
|
42
|
+
console.log("");
|
|
31
43
|
// Same event listeners as run command
|
|
32
44
|
harness.on("phase:start", (data) => {
|
|
33
45
|
const sprint = data.sprint > 0 ? ` [Sprint ${data.sprint}]` : "";
|
|
@@ -89,7 +101,10 @@ export async function resumeCommand(options) {
|
|
|
89
101
|
await harness.resume();
|
|
90
102
|
}
|
|
91
103
|
catch (error) {
|
|
92
|
-
|
|
104
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
105
|
+
console.error(`\nResume failed: ${msg}`);
|
|
106
|
+
console.log("\nProgress has been saved. After resolving the issue, resume with:");
|
|
107
|
+
console.log(" agents-harness resume");
|
|
93
108
|
process.exit(1);
|
|
94
109
|
}
|
|
95
110
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAU5C,SAAS,cAAc,CAAC,EAAU;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,KAAK,gBAAgB,GAAG,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;IACtC,OAAO,GAAG,KAAK,KAAK,gBAAgB,GAAG,CAAC;AAC1C,CAAC;
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/run.d.ts
CHANGED
|
@@ -4,5 +4,9 @@ export interface RunOptions {
|
|
|
4
4
|
maxBudget?: number;
|
|
5
5
|
dashboard?: boolean;
|
|
6
6
|
port?: number;
|
|
7
|
+
model?: string;
|
|
8
|
+
plannerModel?: string;
|
|
9
|
+
generatorModel?: string;
|
|
10
|
+
evaluatorModel?: string;
|
|
7
11
|
}
|
|
8
12
|
export declare function runCommand(spec: string, options: RunOptions): Promise<void>;
|
package/dist/commands/run.js
CHANGED
|
@@ -23,14 +23,26 @@ export async function runCommand(spec, options) {
|
|
|
23
23
|
const root = process.cwd();
|
|
24
24
|
console.log("Starting agents-harness run...");
|
|
25
25
|
console.log(`Spec: ${spec.slice(0, 100)}${spec.length > 100 ? "..." : ""}`);
|
|
26
|
-
|
|
26
|
+
const models = {
|
|
27
|
+
planner: options.plannerModel ?? options.model,
|
|
28
|
+
generator: options.generatorModel ?? options.model,
|
|
29
|
+
evaluator: options.evaluatorModel ?? options.model,
|
|
30
|
+
};
|
|
27
31
|
const harness = new Harness({
|
|
28
32
|
apiKey,
|
|
29
33
|
root,
|
|
30
34
|
scope: options.scope,
|
|
31
35
|
maxAttemptsPerSprint: options.maxAttempts,
|
|
32
36
|
maxTotalBudgetUsd: options.maxBudget,
|
|
37
|
+
models,
|
|
33
38
|
});
|
|
39
|
+
const resolvedModels = harness.getModels();
|
|
40
|
+
console.log("");
|
|
41
|
+
console.log("Models:");
|
|
42
|
+
console.log(` Planner: ${resolvedModels.planner}`);
|
|
43
|
+
console.log(` Generator: ${resolvedModels.generator}`);
|
|
44
|
+
console.log(` Evaluator: ${resolvedModels.evaluator}`);
|
|
45
|
+
console.log("");
|
|
34
46
|
// Attach event listeners for terminal output
|
|
35
47
|
harness.on("phase:start", (data) => {
|
|
36
48
|
const sprint = data.sprint > 0 ? ` [Sprint ${data.sprint}]` : "";
|
|
@@ -93,7 +105,10 @@ export async function runCommand(spec, options) {
|
|
|
93
105
|
await harness.run(spec);
|
|
94
106
|
}
|
|
95
107
|
catch (error) {
|
|
96
|
-
|
|
108
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
109
|
+
console.error(`\nRun failed: ${msg}`);
|
|
110
|
+
console.log("\nProgress has been saved. After resolving the issue, resume with:");
|
|
111
|
+
console.log(" agents-harness resume");
|
|
97
112
|
process.exit(1);
|
|
98
113
|
}
|
|
99
114
|
finally {
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,16 @@ export interface RunAgentOptions {
|
|
|
8
8
|
prompt: string;
|
|
9
9
|
onActivity?: (tool: string, summary: string) => void;
|
|
10
10
|
}
|
|
11
|
+
export interface ModelOverrides {
|
|
12
|
+
planner?: string;
|
|
13
|
+
generator?: string;
|
|
14
|
+
evaluator?: string;
|
|
15
|
+
}
|
|
11
16
|
export declare class ContextManager {
|
|
12
17
|
private apiKey;
|
|
13
18
|
private projectContext;
|
|
14
|
-
|
|
19
|
+
private modelOverrides;
|
|
20
|
+
constructor(apiKey: string, projectContext: ProjectContext, modelOverrides?: ModelOverrides);
|
|
15
21
|
getModelForRole(role: AgentRole): string;
|
|
16
22
|
getToolsForRole(role: AgentRole): string[];
|
|
17
23
|
getMaxTurnsForRole(role: AgentRole): number;
|
|
@@ -7,7 +7,7 @@ const MODEL_MAP = {
|
|
|
7
7
|
};
|
|
8
8
|
// Default models per role
|
|
9
9
|
const DEFAULT_MODELS = {
|
|
10
|
-
planner: "
|
|
10
|
+
planner: "opus",
|
|
11
11
|
generator: "opus",
|
|
12
12
|
evaluator: "sonnet",
|
|
13
13
|
};
|
|
@@ -26,11 +26,17 @@ const DEFAULT_MAX_TURNS = {
|
|
|
26
26
|
export class ContextManager {
|
|
27
27
|
apiKey;
|
|
28
28
|
projectContext;
|
|
29
|
-
|
|
29
|
+
modelOverrides;
|
|
30
|
+
constructor(apiKey, projectContext, modelOverrides) {
|
|
30
31
|
this.apiKey = apiKey;
|
|
31
32
|
this.projectContext = projectContext;
|
|
33
|
+
this.modelOverrides = modelOverrides ?? {};
|
|
32
34
|
}
|
|
33
35
|
getModelForRole(role) {
|
|
36
|
+
// Priority: CLI override > config.yaml > default
|
|
37
|
+
const cliModel = this.modelOverrides[role];
|
|
38
|
+
if (cliModel)
|
|
39
|
+
return MODEL_MAP[cliModel] ?? cliModel;
|
|
34
40
|
const config = this.projectContext.config;
|
|
35
41
|
const configModel = config?.agents?.[role]?.model;
|
|
36
42
|
const shortName = configModel ?? DEFAULT_MODELS[role];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/core/context-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,gBAAgB;AAChB,MAAM,SAAS,GAA2B;IACxC,IAAI,EAAE,iBAAiB;IACvB,MAAM,EAAE,4BAA4B;IACpC,KAAK,EAAE,2BAA2B;CACnC,CAAC;AAEF,0BAA0B;AAC1B,MAAM,cAAc,GAA8B;IAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/core/context-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,gBAAgB;AAChB,MAAM,SAAS,GAA2B;IACxC,IAAI,EAAE,iBAAiB;IACvB,MAAM,EAAE,4BAA4B;IACpC,KAAK,EAAE,2BAA2B;CACnC,CAAC;AAEF,0BAA0B;AAC1B,MAAM,cAAc,GAA8B;IAChD,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,QAAQ;CACpB,CAAC;AAEF,yBAAyB;AACzB,MAAM,aAAa,GAAgC;IACjD,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAC5D,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;CAC5C,CAAC;AAEF,6BAA6B;AAC7B,MAAM,iBAAiB,GAA8B;IACnD,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,EAAE;CACd,CAAC;AAmBF,MAAM,OAAO,cAAc;IACjB,MAAM,CAAS;IACf,cAAc,CAAiB;IAC/B,cAAc,CAAiB;IAEvC,YAAY,MAAc,EAAE,cAA8B,EAAE,cAA+B;QACzF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,cAAc,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,eAAe,CAAC,IAAe;QAC7B,iDAAiD;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,QAAQ;YAAE,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;QAErD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;QAC1C,MAAM,WAAW,GAAG,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;QAClD,MAAM,SAAS,GAAG,WAAW,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IAC3C,CAAC;IAED,eAAe,CAAC,IAAe;QAC7B,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,kBAAkB,CAAC,IAAe;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;QAC1C,OAAO,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QAEjE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE7C,MAAM,YAAY,GAChB,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC;QACjE,MAAM,YAAY,GAAG,iBAAiB,CACpC,IAAI,EACJ,IAAI,CAAC,cAAc,EACnB,YAAY,CACb,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAE/C,oDAAoD;QACpD,mFAAmF;QACnF,MAAM,YAAY,GAAG,KAAK,CAAC;YACzB,MAAM;YACN,OAAO,EAAE;gBACP,YAAY;gBACZ,KAAK;gBACL,KAAK;gBACL,QAAQ;gBACR,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI;gBAC7B,YAAY,EAAE,KAAK;gBACnB,cAAc,EAAE,mBAA4B;gBAC5C,+BAA+B,EAAE,IAAI;gBACrC,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,iBAAiB,EAAE,IAAI,CAAC,MAAM;iBAC/B;aACF;SACF,CAAC,CAAC;QAEH,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACzC,0EAA0E;YAC1E,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,UAAU,EAAE,CAAC;gBAC/C,MAAM,YAAY,GAAG,OAUpB,CAAC;gBACF,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;oBACjD,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;wBACjD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;4BAC5C,UAAU,CACR,KAAK,CAAC,IAAI,EACV,gBAAgB,CAAC;gCACf,IAAI,EAAE,KAAK,CAAC,IAAI;gCAChB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;6BACzB,CAAC,CACH,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,2DAA2D;YAC3D,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,SAAS,GAAG,OAKjB,CAAC;gBACF,OAAO,GAAG,SAAS,CAAC,cAAc,IAAI,CAAC,CAAC;gBACxC,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;oBACxD,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,KAGzB;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO,QAAQ,KAAK,CAAC,SAAS,EAAE,CAAC;IACzE,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO,SAAS,KAAK,CAAC,SAAS,EAAE,CAAC;IAC3E,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO,QAAQ,KAAK,CAAC,SAAS,EAAE,CAAC;IACzE,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO;QAClC,OAAO,SAAS,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACvD,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC;IACrE,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, appendFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { stringify as toYaml, parse as parseYaml } from "yaml";
|
|
4
|
-
const EPHEMERAL_FILES = ["contract.md", "evaluation.md", "handoff.md", "sprints.md"];
|
|
4
|
+
const EPHEMERAL_FILES = ["contract.md", "evaluation.md", "handoff.md", "sprints.md", "events.json"];
|
|
5
5
|
const GITIGNORE_ENTRIES = [
|
|
6
6
|
"# agents-harness (ephemeral files)",
|
|
7
7
|
".harness/spec.md",
|
|
@@ -11,6 +11,7 @@ const GITIGNORE_ENTRIES = [
|
|
|
11
11
|
".harness/handoff.md",
|
|
12
12
|
".harness/progress.md",
|
|
13
13
|
".harness/summary.md",
|
|
14
|
+
".harness/events.json",
|
|
14
15
|
];
|
|
15
16
|
export class FileProtocol {
|
|
16
17
|
harnessDir;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-protocol.js","sourceRoot":"","sources":["../../src/core/file-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,IAAI,MAAM,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG/D,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"file-protocol.js","sourceRoot":"","sources":["../../src/core/file-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
2
|
import type { Progress } from "./types.js";
|
|
3
|
+
import { type ModelOverrides } from "./context-manager.js";
|
|
3
4
|
export interface HarnessOptions {
|
|
4
5
|
apiKey: string;
|
|
5
6
|
root: string;
|
|
@@ -7,6 +8,7 @@ export interface HarnessOptions {
|
|
|
7
8
|
maxAttemptsPerSprint?: number;
|
|
8
9
|
maxBudgetPerSprintUsd?: number;
|
|
9
10
|
maxTotalBudgetUsd?: number;
|
|
11
|
+
models?: ModelOverrides;
|
|
10
12
|
}
|
|
11
13
|
export declare class Harness extends EventEmitter {
|
|
12
14
|
private contextManager;
|
|
@@ -27,4 +29,5 @@ export declare class Harness extends EventEmitter {
|
|
|
27
29
|
resume(): Promise<void>;
|
|
28
30
|
stop(): void;
|
|
29
31
|
getProgress(): Progress;
|
|
32
|
+
getModels(): Record<string, string>;
|
|
30
33
|
}
|
|
@@ -18,7 +18,7 @@ export class Harness extends EventEmitter {
|
|
|
18
18
|
maxBudgetPerSprintUsd: opts.maxBudgetPerSprintUsd ?? config?.maxBudgetPerSprintUsd ?? 5,
|
|
19
19
|
maxTotalBudgetUsd: opts.maxTotalBudgetUsd ?? config?.maxTotalBudgetUsd ?? 50,
|
|
20
20
|
};
|
|
21
|
-
this.contextManager = new ContextManager(opts.apiKey, projectContext);
|
|
21
|
+
this.contextManager = new ContextManager(opts.apiKey, projectContext, opts.models);
|
|
22
22
|
this.fileProtocol = new FileProtocol(opts.root);
|
|
23
23
|
this.progress = this.initProgress("");
|
|
24
24
|
}
|
|
@@ -90,6 +90,7 @@ export class Harness extends EventEmitter {
|
|
|
90
90
|
async run(spec) {
|
|
91
91
|
this.fileProtocol.ensureDir();
|
|
92
92
|
this.fileProtocol.ensureGitignore();
|
|
93
|
+
this.fileProtocol.cleanEphemeral();
|
|
93
94
|
this.progress = this.initProgress(spec);
|
|
94
95
|
this.aborted = false;
|
|
95
96
|
try {
|
|
@@ -114,18 +115,24 @@ export class Harness extends EventEmitter {
|
|
|
114
115
|
}
|
|
115
116
|
}
|
|
116
117
|
catch (error) {
|
|
117
|
-
this.progress.status = "
|
|
118
|
+
this.progress.status = "stopped";
|
|
119
|
+
this.progress.stoppedAt = new Date().toISOString();
|
|
118
120
|
this.fileProtocol.writeProgress(this.progress);
|
|
119
121
|
throw error;
|
|
120
122
|
}
|
|
121
123
|
return this.finalize();
|
|
122
124
|
}
|
|
123
125
|
async executeSprint(sprintNum) {
|
|
124
|
-
this.progress.sprints[sprintNum]
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
if (!this.progress.sprints[sprintNum]) {
|
|
127
|
+
this.progress.sprints[sprintNum] = {
|
|
128
|
+
status: "in_progress",
|
|
129
|
+
attempts: 0,
|
|
130
|
+
costUsd: 0,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
this.progress.sprints[sprintNum].status = "in_progress";
|
|
135
|
+
}
|
|
129
136
|
// Contract phase — have planner write a contract for this sprint
|
|
130
137
|
this.updatePhase("contract", sprintNum, 0);
|
|
131
138
|
await this.runAgentPhase("planner", `Read .harness/sprints.md. Write a sprint contract for Sprint ${sprintNum} to .harness/contract.md. Include specific, testable success criteria.`, sprintNum);
|
|
@@ -234,5 +241,12 @@ export class Harness extends EventEmitter {
|
|
|
234
241
|
getProgress() {
|
|
235
242
|
return { ...this.progress };
|
|
236
243
|
}
|
|
244
|
+
getModels() {
|
|
245
|
+
return {
|
|
246
|
+
planner: this.contextManager.getModelForRole("planner"),
|
|
247
|
+
generator: this.contextManager.getModelForRole("generator"),
|
|
248
|
+
evaluator: this.contextManager.getModelForRole("evaluator"),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
237
251
|
}
|
|
238
252
|
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO3C,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -7,8 +7,12 @@ export declare class DashboardServer {
|
|
|
7
7
|
private projectRoot;
|
|
8
8
|
private fileWatcher;
|
|
9
9
|
private debounceTimers;
|
|
10
|
+
private eventLog;
|
|
10
11
|
constructor(port?: number, projectRoot?: string);
|
|
11
12
|
private handleRequest;
|
|
13
|
+
private getEventsFilePath;
|
|
14
|
+
private loadEventLog;
|
|
15
|
+
private persistEventLog;
|
|
12
16
|
private buildSnapshot;
|
|
13
17
|
private startFileWatcher;
|
|
14
18
|
start(): Promise<void>;
|
package/dist/dashboard/server.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { createServer } from "node:http";
|
|
2
|
-
import { readFileSync, existsSync, watch } from "node:fs";
|
|
2
|
+
import { readFileSync, writeFileSync, existsSync, watch } from "node:fs";
|
|
3
3
|
import { join, dirname } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import { parse as parseYaml } from "yaml";
|
|
6
6
|
import { WebSocketBroadcaster } from "./socket.js";
|
|
7
|
+
const EVENTS_FILE = "events.json";
|
|
7
8
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
9
|
const ALLOWED_FILES = [
|
|
9
10
|
"spec.md", "sprints.md", "contract.md",
|
|
@@ -17,9 +18,11 @@ export class DashboardServer {
|
|
|
17
18
|
projectRoot;
|
|
18
19
|
fileWatcher = null;
|
|
19
20
|
debounceTimers = new Map();
|
|
21
|
+
eventLog = [];
|
|
20
22
|
constructor(port = 3117, projectRoot) {
|
|
21
23
|
this.port = port;
|
|
22
24
|
this.projectRoot = projectRoot ?? null;
|
|
25
|
+
this.loadEventLog();
|
|
23
26
|
this.server = createServer(this.handleRequest.bind(this));
|
|
24
27
|
this.broadcaster = new WebSocketBroadcaster(this.server, () => this.buildSnapshot());
|
|
25
28
|
}
|
|
@@ -56,6 +59,29 @@ export class DashboardServer {
|
|
|
56
59
|
res.end("Dashboard file not found");
|
|
57
60
|
}
|
|
58
61
|
}
|
|
62
|
+
getEventsFilePath() {
|
|
63
|
+
if (!this.projectRoot)
|
|
64
|
+
return null;
|
|
65
|
+
return join(this.projectRoot, ".harness", EVENTS_FILE);
|
|
66
|
+
}
|
|
67
|
+
loadEventLog() {
|
|
68
|
+
const filePath = this.getEventsFilePath();
|
|
69
|
+
if (!filePath || !existsSync(filePath))
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
this.eventLog = JSON.parse(readFileSync(filePath, "utf-8"));
|
|
73
|
+
}
|
|
74
|
+
catch { /* ignore corrupt file */ }
|
|
75
|
+
}
|
|
76
|
+
persistEventLog() {
|
|
77
|
+
const filePath = this.getEventsFilePath();
|
|
78
|
+
if (!filePath)
|
|
79
|
+
return;
|
|
80
|
+
try {
|
|
81
|
+
writeFileSync(filePath, JSON.stringify(this.eventLog), "utf-8");
|
|
82
|
+
}
|
|
83
|
+
catch { /* ignore write errors */ }
|
|
84
|
+
}
|
|
59
85
|
buildSnapshot() {
|
|
60
86
|
if (!this.projectRoot)
|
|
61
87
|
return null;
|
|
@@ -75,7 +101,7 @@ export class DashboardServer {
|
|
|
75
101
|
}
|
|
76
102
|
catch { /* ignore */ }
|
|
77
103
|
}
|
|
78
|
-
return { type: "state:snapshot", data: { files, progress } };
|
|
104
|
+
return { type: "state:snapshot", data: { files, progress, events: this.eventLog } };
|
|
79
105
|
}
|
|
80
106
|
startFileWatcher() {
|
|
81
107
|
if (!this.projectRoot)
|
|
@@ -141,6 +167,11 @@ export class DashboardServer {
|
|
|
141
167
|
return this.port;
|
|
142
168
|
}
|
|
143
169
|
broadcast(event) {
|
|
170
|
+
// Persist events that carry state (skip file:update and state:snapshot)
|
|
171
|
+
if (event.type !== "file:update" && event.type !== "state:snapshot") {
|
|
172
|
+
this.eventLog.push(event);
|
|
173
|
+
this.persistEventLog();
|
|
174
|
+
}
|
|
144
175
|
this.broadcaster.broadcast(event);
|
|
145
176
|
}
|
|
146
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -522,7 +522,13 @@
|
|
|
522
522
|
}
|
|
523
523
|
}
|
|
524
524
|
}
|
|
525
|
-
//
|
|
525
|
+
// Replay persisted events to rebuild full state (sprints, activities, cost, etc.)
|
|
526
|
+
if (data.events && data.events.length > 0) {
|
|
527
|
+
for (var i = 0; i < data.events.length; i++) {
|
|
528
|
+
handleEvent(data.events[i]);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
// Restore progress (override with latest from progress file)
|
|
526
532
|
if (data.progress) {
|
|
527
533
|
var p = data.progress;
|
|
528
534
|
state.currentPhase = p.currentPhase;
|
|
@@ -533,11 +539,12 @@
|
|
|
533
539
|
state.budget = p.maxBudgetUsd || 0;
|
|
534
540
|
if (p.sprints) {
|
|
535
541
|
for (var sn in p.sprints) {
|
|
542
|
+
var existing = state.sprints[sn];
|
|
536
543
|
state.sprints[sn] = {
|
|
537
544
|
status: p.sprints[sn].status,
|
|
538
545
|
attempts: p.sprints[sn].attempts,
|
|
539
546
|
cost: p.sprints[sn].costUsd || 0,
|
|
540
|
-
eval: null,
|
|
547
|
+
eval: existing ? existing.eval : null,
|
|
541
548
|
};
|
|
542
549
|
}
|
|
543
550
|
}
|
|
@@ -551,6 +558,7 @@
|
|
|
551
558
|
renderSprints();
|
|
552
559
|
renderFileTabs();
|
|
553
560
|
renderFileContent();
|
|
561
|
+
renderActivity();
|
|
554
562
|
if (state.totalCost > 0) {
|
|
555
563
|
document.getElementById('total-cost').textContent = '$' + state.totalCost.toFixed(2);
|
|
556
564
|
}
|