infinity-harness 2.8.9 → 2.8.11
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/CHANGELOG.md +18 -0
- package/dist/extensions/infinity-harness/index.js +3614 -0
- package/dist/extensions/infinity-harness/index.js.map +1 -0
- package/dist/src/approval.js +154 -0
- package/dist/src/approval.js.map +1 -0
- package/dist/src/core/brief.js +309 -0
- package/dist/src/core/brief.js.map +1 -0
- package/dist/src/core/config.js +539 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/exec.js +106 -0
- package/dist/src/core/exec.js.map +1 -0
- package/dist/src/core/featureList.js +365 -0
- package/dist/src/core/featureList.js.map +1 -0
- package/dist/src/core/fsx.js +123 -0
- package/dist/src/core/fsx.js.map +1 -0
- package/dist/src/core/gates.js +490 -0
- package/dist/src/core/gates.js.map +1 -0
- package/dist/src/core/init.js +480 -0
- package/dist/src/core/init.js.map +1 -0
- package/dist/src/core/lock.js +183 -0
- package/dist/src/core/lock.js.map +1 -0
- package/dist/src/core/modelRouter.js +185 -0
- package/dist/src/core/modelRouter.js.map +1 -0
- package/dist/src/core/paths.js +129 -0
- package/dist/src/core/paths.js.map +1 -0
- package/dist/src/core/phases.js +254 -0
- package/dist/src/core/phases.js.map +1 -0
- package/dist/src/core/plan.js +15 -0
- package/dist/src/core/plan.js.map +1 -0
- package/dist/src/core/runState.js +126 -0
- package/dist/src/core/runState.js.map +1 -0
- package/dist/src/core/settings.js +877 -0
- package/dist/src/core/settings.js.map +1 -0
- package/dist/src/core/skills.js +319 -0
- package/dist/src/core/skills.js.map +1 -0
- package/dist/src/core/skillsAudit.js +194 -0
- package/dist/src/core/skillsAudit.js.map +1 -0
- package/dist/src/core/types.js +77 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/daemon/budget.js +85 -0
- package/dist/src/daemon/budget.js.map +1 -0
- package/dist/src/daemon/guard.js +122 -0
- package/dist/src/daemon/guard.js.map +1 -0
- package/dist/src/daemon/index.js +461 -0
- package/dist/src/daemon/index.js.map +1 -0
- package/dist/src/daemon/isolation.js +84 -0
- package/dist/src/daemon/isolation.js.map +1 -0
- package/dist/src/daemon/preflight.js +131 -0
- package/dist/src/daemon/preflight.js.map +1 -0
- package/dist/src/daemon/server.js +174 -0
- package/dist/src/daemon/server.js.map +1 -0
- package/dist/src/daemon/supervisorState.js +42 -0
- package/dist/src/daemon/supervisorState.js.map +1 -0
- package/dist/src/daemon/worker.js +239 -0
- package/dist/src/daemon/worker.js.map +1 -0
- package/dist/src/daemon/worktree.js +102 -0
- package/dist/src/daemon/worktree.js.map +1 -0
- package/dist/src/escalate.js +312 -0
- package/dist/src/escalate.js.map +1 -0
- package/dist/src/exec/piWorker.js +630 -0
- package/dist/src/exec/piWorker.js.map +1 -0
- package/dist/src/goal.js +317 -0
- package/dist/src/goal.js.map +1 -0
- package/dist/src/goalLoop.js +374 -0
- package/dist/src/goalLoop.js.map +1 -0
- package/dist/src/goalSpec.js +397 -0
- package/dist/src/goalSpec.js.map +1 -0
- package/dist/src/goalState.js +255 -0
- package/dist/src/goalState.js.map +1 -0
- package/dist/src/handoff.js +205 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/intake.js +203 -0
- package/dist/src/intake.js.map +1 -0
- package/dist/src/loop.js +592 -0
- package/dist/src/loop.js.map +1 -0
- package/dist/src/modelRouter.js +216 -0
- package/dist/src/modelRouter.js.map +1 -0
- package/dist/src/remote.js +246 -0
- package/dist/src/remote.js.map +1 -0
- package/dist/src/replan.js +262 -0
- package/dist/src/replan.js.map +1 -0
- package/dist/src/review.js +54 -0
- package/dist/src/review.js.map +1 -0
- package/dist/src/rework.js +241 -0
- package/dist/src/rework.js.map +1 -0
- package/dist/src/runState.js +4 -0
- package/dist/src/runState.js.map +1 -0
- package/dist/src/scheduler.js +270 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/supervisor.js +787 -0
- package/dist/src/supervisor.js.map +1 -0
- package/dist/src/taskList.js +430 -0
- package/dist/src/taskList.js.map +1 -0
- package/dist/src/ui/config.js +268 -0
- package/dist/src/ui/config.js.map +1 -0
- package/dist/src/ui/dashboard.js +1288 -0
- package/dist/src/ui/dashboard.js.map +1 -0
- package/dist/src/ui/display.js +229 -0
- package/dist/src/ui/display.js.map +1 -0
- package/dist/src/ui/planTree.js +219 -0
- package/dist/src/ui/planTree.js.map +1 -0
- package/dist/src/ui/theme.js +298 -0
- package/dist/src/ui/theme.js.map +1 -0
- package/dist/src/ui/viewState.js +65 -0
- package/dist/src/ui/viewState.js.map +1 -0
- package/dist/src/ui/widget.js +721 -0
- package/dist/src/ui/widget.js.map +1 -0
- package/dist/src/ui/wizard.js +540 -0
- package/dist/src/ui/wizard.js.map +1 -0
- package/dist/src/unstuck.js +210 -0
- package/dist/src/unstuck.js.map +1 -0
- package/dist/src/worker.js +267 -0
- package/dist/src/worker.js.map +1 -0
- package/dist/src/workflow.js +250 -0
- package/dist/src/workflow.js.map +1 -0
- package/dist/tests/approval.test.js +144 -0
- package/dist/tests/approval.test.js.map +1 -0
- package/dist/tests/brief.test.js +271 -0
- package/dist/tests/brief.test.js.map +1 -0
- package/dist/tests/config.test.js +320 -0
- package/dist/tests/config.test.js.map +1 -0
- package/dist/tests/dashboard.test.js +277 -0
- package/dist/tests/dashboard.test.js.map +1 -0
- package/dist/tests/display.test.js +229 -0
- package/dist/tests/display.test.js.map +1 -0
- package/dist/tests/escalate.test.js +272 -0
- package/dist/tests/escalate.test.js.map +1 -0
- package/dist/tests/featureList.test.js +429 -0
- package/dist/tests/featureList.test.js.map +1 -0
- package/dist/tests/gates.test.js +333 -0
- package/dist/tests/gates.test.js.map +1 -0
- package/dist/tests/goal.test.js +229 -0
- package/dist/tests/goal.test.js.map +1 -0
- package/dist/tests/goalLoop.test.js +170 -0
- package/dist/tests/goalLoop.test.js.map +1 -0
- package/dist/tests/goalSpec.test.js +146 -0
- package/dist/tests/goalSpec.test.js.map +1 -0
- package/dist/tests/goalState.test.js +202 -0
- package/dist/tests/goalState.test.js.map +1 -0
- package/dist/tests/handoff.test.js +127 -0
- package/dist/tests/handoff.test.js.map +1 -0
- package/dist/tests/init.test.js +264 -0
- package/dist/tests/init.test.js.map +1 -0
- package/dist/tests/intake.test.js +288 -0
- package/dist/tests/intake.test.js.map +1 -0
- package/dist/tests/loop.test.js +453 -0
- package/dist/tests/loop.test.js.map +1 -0
- package/dist/tests/modelRouter.test.js +131 -0
- package/dist/tests/modelRouter.test.js.map +1 -0
- package/dist/tests/phases.test.js +244 -0
- package/dist/tests/phases.test.js.map +1 -0
- package/dist/tests/planTree.test.js +190 -0
- package/dist/tests/planTree.test.js.map +1 -0
- package/dist/tests/remote.test.js +380 -0
- package/dist/tests/remote.test.js.map +1 -0
- package/dist/tests/replan.test.js +113 -0
- package/dist/tests/replan.test.js.map +1 -0
- package/dist/tests/review.test.js +77 -0
- package/dist/tests/review.test.js.map +1 -0
- package/dist/tests/rework.test.js +109 -0
- package/dist/tests/rework.test.js.map +1 -0
- package/dist/tests/routing-live.test.js +121 -0
- package/dist/tests/routing-live.test.js.map +1 -0
- package/dist/tests/runState.test.js +73 -0
- package/dist/tests/runState.test.js.map +1 -0
- package/dist/tests/settings.test.js +311 -0
- package/dist/tests/settings.test.js.map +1 -0
- package/dist/tests/skills.test.js +387 -0
- package/dist/tests/skills.test.js.map +1 -0
- package/dist/tests/supervisor.test.js +437 -0
- package/dist/tests/supervisor.test.js.map +1 -0
- package/dist/tests/surface.test.js +203 -0
- package/dist/tests/surface.test.js.map +1 -0
- package/dist/tests/taskList.test.js +376 -0
- package/dist/tests/taskList.test.js.map +1 -0
- package/dist/tests/theme.test.js +149 -0
- package/dist/tests/theme.test.js.map +1 -0
- package/dist/tests/unstuck.test.js +268 -0
- package/dist/tests/unstuck.test.js.map +1 -0
- package/dist/tests/widget.test.js +424 -0
- package/dist/tests/widget.test.js.map +1 -0
- package/dist/tests/worker.test.js +306 -0
- package/dist/tests/worker.test.js.map +1 -0
- package/dist/tests/workflow.test.js +187 -0
- package/dist/tests/workflow.test.js.map +1 -0
- package/extensions/infinity-harness/index.ts +39 -12
- package/package.json +5 -2
- package/src/core/modelRouter.ts +23 -1
- package/src/daemon/index.ts +3 -3
- package/src/daemon/worker.ts +28 -5
- package/src/ui/config.ts +25 -1
- package/src/ui/wizard.ts +10 -5
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The supervisor — the run's work happens in background pi sessions, not in
|
|
3
|
+
* the human's.
|
|
4
|
+
*
|
|
5
|
+
* What is defended here:
|
|
6
|
+
* - the *unit* the run is on is the level the human chose for handoff, and
|
|
7
|
+
* the model comes from that unit's effective difficulty, not the task's
|
|
8
|
+
* - crossing a unit boundary closes the worker and opens a new one, which
|
|
9
|
+
* is what "session handoff" now means
|
|
10
|
+
* - staying inside a unit reuses the same session, so a feature-level
|
|
11
|
+
* handoff really is one session for the whole feature
|
|
12
|
+
* - an escalation that names a stronger model replaces the session rather
|
|
13
|
+
* than switching model inside it
|
|
14
|
+
* - the main session is never asked to do any of the work
|
|
15
|
+
*
|
|
16
|
+
* The worker is faked here. That a real `pi --mode rpc` child accepts the
|
|
17
|
+
* argv, honours `--model`, and settles is proved in the `background` e2e
|
|
18
|
+
* scenario against a real pi process.
|
|
19
|
+
*/
|
|
20
|
+
import assert from "node:assert/strict";
|
|
21
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
22
|
+
import { tmpdir } from "node:os";
|
|
23
|
+
import { join } from "node:path";
|
|
24
|
+
import { defaultConfig, saveConfig } from "../src/core/config.js";
|
|
25
|
+
import { saveFeatureList } from "../src/core/featureList.js";
|
|
26
|
+
import { saveRouterConfig, DEFAULT_ROUTER } from "../src/modelRouter.js";
|
|
27
|
+
import { armRun } from "../src/runState.js";
|
|
28
|
+
import { currentUnit, isRefusal, activeOwner, processAlive, unitLevelFor, describeUnit, startSupervisor, loadActivity, loadSupervisorState, appendActivity, saveSupervisorState, emptySupervisorState, reapOrphanWorker, ACTIVITY_LIMIT, } from "../src/supervisor.js";
|
|
29
|
+
const tmp = () => mkdtempSync(join(tmpdir(), "supervisor-test-"));
|
|
30
|
+
/** Narrow away the "someone else is driving" refusal, which these cases never hit. */
|
|
31
|
+
function driving(r) {
|
|
32
|
+
assert.equal(isRefusal(r), false, isRefusal(r) ? r.reason : "");
|
|
33
|
+
return r;
|
|
34
|
+
}
|
|
35
|
+
const PLAN = {
|
|
36
|
+
version: "2.0",
|
|
37
|
+
baseRevision: 1,
|
|
38
|
+
goals: [{ id: "goal-1", title: "Ship the thing" }],
|
|
39
|
+
sprints: [{ id: "sprint-1", goalId: "goal-1", name: "Foundations" }],
|
|
40
|
+
features: [
|
|
41
|
+
{
|
|
42
|
+
id: "feature-1",
|
|
43
|
+
name: "Auth",
|
|
44
|
+
sprintId: "sprint-1",
|
|
45
|
+
goalId: "goal-1",
|
|
46
|
+
criteria: ["works"],
|
|
47
|
+
tasks: [
|
|
48
|
+
{
|
|
49
|
+
id: "task-1",
|
|
50
|
+
key: "feature-1/task-1",
|
|
51
|
+
description: "login form",
|
|
52
|
+
status: "pending",
|
|
53
|
+
difficulty: "easy",
|
|
54
|
+
subtasks: [
|
|
55
|
+
{ id: "st-1", title: "markup", status: "pending" },
|
|
56
|
+
{ id: "st-2", title: "validation", status: "pending" },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
{ id: "task-2", key: "feature-1/task-2", description: "session cookie", status: "pending", difficulty: "difficult" },
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "feature-2",
|
|
64
|
+
name: "Billing",
|
|
65
|
+
sprintId: "sprint-1",
|
|
66
|
+
goalId: "goal-1",
|
|
67
|
+
criteria: ["works"],
|
|
68
|
+
tasks: [{ id: "task-3", key: "feature-2/task-3", description: "stripe", status: "pending", difficulty: "moderate" }],
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
function project(handoff) {
|
|
73
|
+
const d = tmp();
|
|
74
|
+
const cfg = defaultConfig();
|
|
75
|
+
cfg.currentPhase = "build";
|
|
76
|
+
cfg.phases = { enabled: ["build", "verify"] };
|
|
77
|
+
cfg.session = { handoff, contextThreshold: 0.6, carryNotes: true };
|
|
78
|
+
saveConfig(d, cfg);
|
|
79
|
+
saveFeatureList(d, structuredClone(PLAN));
|
|
80
|
+
saveRouterConfig(d, {
|
|
81
|
+
...DEFAULT_ROUTER,
|
|
82
|
+
enabled: true,
|
|
83
|
+
default: "prov/A",
|
|
84
|
+
byDifficulty: { easy: "prov/B", moderate: "prov/C", difficult: "prov/D" },
|
|
85
|
+
master: "prov/X",
|
|
86
|
+
});
|
|
87
|
+
return d;
|
|
88
|
+
}
|
|
89
|
+
// ── the handoff level is the unit level ────────────────────────────────────
|
|
90
|
+
{
|
|
91
|
+
assert.equal(unitLevelFor("off"), "run");
|
|
92
|
+
assert.equal(unitLevelFor("goal"), "goal");
|
|
93
|
+
assert.equal(unitLevelFor("phase"), "phase");
|
|
94
|
+
assert.equal(unitLevelFor("subtask"), "subtask");
|
|
95
|
+
assert.equal(unitLevelFor("task"), "task");
|
|
96
|
+
console.log("✓ supervisor — handoff granularity maps to a unit level");
|
|
97
|
+
}
|
|
98
|
+
// ── the unit picks the model, and the level picks the difficulty ───────────
|
|
99
|
+
{
|
|
100
|
+
// task level: this task's own difficulty (easy) → model B
|
|
101
|
+
const dTask = project("task");
|
|
102
|
+
const uTask = currentUnit(dTask);
|
|
103
|
+
assert.equal(uTask.level, "task");
|
|
104
|
+
assert.equal(uTask.key, "task:feature-1/task-1");
|
|
105
|
+
assert.equal(uTask.difficulty, "easy");
|
|
106
|
+
assert.equal(uTask.model, "prov/B", "an easy task runs on the easy-tier model");
|
|
107
|
+
// subtask level: the subtask inherits the task's difficulty, but the *unit*
|
|
108
|
+
// is the subtask, so a handoff happens between the two subtasks.
|
|
109
|
+
const dSub = project("subtask");
|
|
110
|
+
const uSub = currentUnit(dSub);
|
|
111
|
+
assert.equal(uSub.level, "subtask");
|
|
112
|
+
assert.equal(uSub.key, "subtask:feature-1/task-1#st-1");
|
|
113
|
+
assert.equal(uSub.model, "prov/B");
|
|
114
|
+
// feature level: the bucket is the feature, whose hardest task is difficult
|
|
115
|
+
// → the whole feature runs on model D. This is the trade-off the wizard
|
|
116
|
+
// warns about, and it must actually happen.
|
|
117
|
+
const dFeat = project("feature");
|
|
118
|
+
const uFeat = currentUnit(dFeat);
|
|
119
|
+
assert.equal(uFeat.level, "feature");
|
|
120
|
+
assert.equal(uFeat.key, "feature:feature-1");
|
|
121
|
+
assert.equal(uFeat.difficulty, "difficult");
|
|
122
|
+
assert.equal(uFeat.model, "prov/D", "a feature runs on its hardest task's model");
|
|
123
|
+
// phase level: the bucket is every task in BUILD → still difficult.
|
|
124
|
+
const dPhase = project("phase");
|
|
125
|
+
const uPhase = currentUnit(dPhase);
|
|
126
|
+
assert.equal(uPhase.key, "phase:build");
|
|
127
|
+
assert.equal(uPhase.model, "prov/D");
|
|
128
|
+
// sprint level: one sprint holds both features → hardest is difficult.
|
|
129
|
+
const dSprint = project("sprint");
|
|
130
|
+
assert.equal(currentUnit(dSprint).key, "sprint:sprint-1");
|
|
131
|
+
// goal / off: one session for the run.
|
|
132
|
+
assert.equal(currentUnit(project("goal")).key, "goal:goal-1");
|
|
133
|
+
assert.equal(currentUnit(project("off")).key, "run");
|
|
134
|
+
assert.match(describeUnit(uTask), /task feature-1\/task-1.*easy.*prov\/B/);
|
|
135
|
+
for (const d of [dTask, dSub, dFeat, dPhase, dSprint])
|
|
136
|
+
rmSync(d, { recursive: true, force: true });
|
|
137
|
+
console.log("✓ supervisor — the unit's effective difficulty picks the model");
|
|
138
|
+
}
|
|
139
|
+
// ── an empty router slot inherits the main session's model ─────────────────
|
|
140
|
+
{
|
|
141
|
+
const d = project("task");
|
|
142
|
+
saveRouterConfig(d, { ...DEFAULT_ROUTER, enabled: false, default: "" });
|
|
143
|
+
const u = currentUnit(d, "human/model-X");
|
|
144
|
+
assert.equal(u.model, "human/model-X", "routing off means the worker uses pi's current model");
|
|
145
|
+
rmSync(d, { recursive: true, force: true });
|
|
146
|
+
console.log("✓ supervisor — an unrouted unit inherits the base model");
|
|
147
|
+
}
|
|
148
|
+
// ── the loop: one session per unit, reused inside a unit ───────────────────
|
|
149
|
+
/** A worker that records what it was asked, and never spawns anything. */
|
|
150
|
+
class FakeWorker {
|
|
151
|
+
static made = [];
|
|
152
|
+
spec;
|
|
153
|
+
prompts = [];
|
|
154
|
+
closed = false;
|
|
155
|
+
startError = null;
|
|
156
|
+
sessionId = "fake";
|
|
157
|
+
servedModel = null;
|
|
158
|
+
exited = false;
|
|
159
|
+
listeners = [];
|
|
160
|
+
constructor(spec) {
|
|
161
|
+
this.spec = spec;
|
|
162
|
+
FakeWorker.made.push(this);
|
|
163
|
+
}
|
|
164
|
+
on(l) {
|
|
165
|
+
this.listeners.push(l);
|
|
166
|
+
return () => { };
|
|
167
|
+
}
|
|
168
|
+
start() { }
|
|
169
|
+
async ready() {
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
async prompt(text) {
|
|
173
|
+
this.prompts.push(text);
|
|
174
|
+
return { summary: "did it", tools: [], usage: { inputTokens: 1, outputTokens: 1 }, contextRatio: 0.1, aborted: false, error: null };
|
|
175
|
+
}
|
|
176
|
+
async contextRatio() {
|
|
177
|
+
return 0.1;
|
|
178
|
+
}
|
|
179
|
+
async close() {
|
|
180
|
+
this.closed = true;
|
|
181
|
+
this.exited = true;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/** Feed the supervisor a scripted sequence of loop decisions. */
|
|
185
|
+
function scriptedDecider(script) {
|
|
186
|
+
let i = 0;
|
|
187
|
+
return async () => {
|
|
188
|
+
const decision = script[Math.min(i, script.length - 1)];
|
|
189
|
+
i += 1;
|
|
190
|
+
return { decision, state: {} };
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const cont = (msg, over = {}) => ({
|
|
194
|
+
action: "continue",
|
|
195
|
+
message: msg,
|
|
196
|
+
headline: "fix the gate",
|
|
197
|
+
reason: "gate failed",
|
|
198
|
+
...over,
|
|
199
|
+
});
|
|
200
|
+
{
|
|
201
|
+
// Task-level handoff, and the plan moves from task-1 to task-2 between
|
|
202
|
+
// cycles: that is a unit boundary, so the first worker is closed and a
|
|
203
|
+
// second one starts — on the *difficult* model, because task-2 is difficult.
|
|
204
|
+
const d = project("task");
|
|
205
|
+
armRun(d, "run-A");
|
|
206
|
+
FakeWorker.made = [];
|
|
207
|
+
let cycle = 0;
|
|
208
|
+
const sup = startSupervisor({
|
|
209
|
+
targetDir: d,
|
|
210
|
+
runId: "run-A",
|
|
211
|
+
baseModel: "human/model-X",
|
|
212
|
+
maxCycles: 3,
|
|
213
|
+
idleMs: 0,
|
|
214
|
+
createWorker: ((spec) => new FakeWorker(spec)),
|
|
215
|
+
decide: (async () => {
|
|
216
|
+
cycle += 1;
|
|
217
|
+
if (cycle === 2) {
|
|
218
|
+
// Task 1 is done; the next actionable task is task-2 (difficult).
|
|
219
|
+
const list = structuredClone(PLAN);
|
|
220
|
+
list.features[0].tasks[0].status = "complete";
|
|
221
|
+
list.baseRevision = 2;
|
|
222
|
+
saveFeatureList(d, list);
|
|
223
|
+
}
|
|
224
|
+
return { decision: cont(`BRIEF ${cycle}`), state: {} };
|
|
225
|
+
}),
|
|
226
|
+
});
|
|
227
|
+
await driving(sup).done;
|
|
228
|
+
assert.equal(FakeWorker.made.length, 2, "a unit boundary starts a second session");
|
|
229
|
+
assert.equal(FakeWorker.made[0].spec.model, "prov/B", "task-1 is easy → model B");
|
|
230
|
+
assert.equal(FakeWorker.made[1].spec.model, "prov/D", "task-2 is difficult → model D");
|
|
231
|
+
assert.equal(FakeWorker.made[0].closed, true, "the first session is closed at the boundary");
|
|
232
|
+
assert.equal(FakeWorker.made[0].spec.unitKey, "task:feature-1/task-1");
|
|
233
|
+
assert.equal(FakeWorker.made[1].spec.unitKey, "task:feature-1/task-2");
|
|
234
|
+
const activity = loadActivity(d);
|
|
235
|
+
assert.ok(activity.some((l) => /handoff/.test(l.text)), "the background log records the handoff");
|
|
236
|
+
const state = loadSupervisorState(d);
|
|
237
|
+
assert.equal(state.status, "stopped");
|
|
238
|
+
assert.equal(state.sessions, 2);
|
|
239
|
+
rmSync(d, { recursive: true, force: true });
|
|
240
|
+
console.log("✓ supervisor — a unit boundary is a new session on a new model");
|
|
241
|
+
}
|
|
242
|
+
{
|
|
243
|
+
// Feature-level handoff over the same two tasks: both live in feature-1, so
|
|
244
|
+
// there is no boundary and no second session. This is the bug the user
|
|
245
|
+
// reported from the other side — a handoff level coarser than the task must
|
|
246
|
+
// not start a session per task.
|
|
247
|
+
const d = project("feature");
|
|
248
|
+
armRun(d, "run-B");
|
|
249
|
+
FakeWorker.made = [];
|
|
250
|
+
let cycle = 0;
|
|
251
|
+
const sup = startSupervisor({
|
|
252
|
+
targetDir: d,
|
|
253
|
+
runId: "run-B",
|
|
254
|
+
maxCycles: 3,
|
|
255
|
+
idleMs: 0,
|
|
256
|
+
createWorker: ((spec) => new FakeWorker(spec)),
|
|
257
|
+
decide: (async () => {
|
|
258
|
+
cycle += 1;
|
|
259
|
+
if (cycle === 2) {
|
|
260
|
+
const list = structuredClone(PLAN);
|
|
261
|
+
list.features[0].tasks[0].status = "complete";
|
|
262
|
+
list.baseRevision = 2;
|
|
263
|
+
saveFeatureList(d, list);
|
|
264
|
+
}
|
|
265
|
+
return { decision: cont(`BRIEF ${cycle}`), state: {} };
|
|
266
|
+
}),
|
|
267
|
+
});
|
|
268
|
+
await driving(sup).done;
|
|
269
|
+
assert.equal(FakeWorker.made.length, 1, "staying inside a feature keeps one session");
|
|
270
|
+
const w = FakeWorker.made[0];
|
|
271
|
+
assert.equal(w.prompts.length, 3, "the same session got every cycle's instruction");
|
|
272
|
+
assert.match(w.prompts[0], /BRIEF 1/, "the first prompt carries the whole brief");
|
|
273
|
+
assert.match(w.prompts[0], /YOUR REMIT/, "and the remit for the unit");
|
|
274
|
+
assert.equal(/BRIEF 2/.test(w.prompts[1]), false, "a returning session is not re-sent the brief");
|
|
275
|
+
assert.match(w.prompts[1], /fix the gate/, "it gets the instruction alone");
|
|
276
|
+
rmSync(d, { recursive: true, force: true });
|
|
277
|
+
console.log("✓ supervisor — one session per feature, and the brief is sent once");
|
|
278
|
+
}
|
|
279
|
+
{
|
|
280
|
+
// An escalation naming a stronger model must replace the session: putting
|
|
281
|
+
// the master model in front of the weak model's failed reasoning is the
|
|
282
|
+
// context we are escalating away from.
|
|
283
|
+
const d = project("task");
|
|
284
|
+
armRun(d, "run-C");
|
|
285
|
+
FakeWorker.made = [];
|
|
286
|
+
const sup = startSupervisor({
|
|
287
|
+
targetDir: d,
|
|
288
|
+
runId: "run-C",
|
|
289
|
+
maxCycles: 2,
|
|
290
|
+
idleMs: 0,
|
|
291
|
+
createWorker: ((spec) => new FakeWorker(spec)),
|
|
292
|
+
decide: scriptedDecider([
|
|
293
|
+
cont("BRIEF"),
|
|
294
|
+
cont("BRIEF", { escalation: { strategy: "consult", model: "prov/X", level: "task" } }),
|
|
295
|
+
]),
|
|
296
|
+
});
|
|
297
|
+
await driving(sup).done;
|
|
298
|
+
assert.equal(FakeWorker.made.length, 2, "escalating to another model starts a new session");
|
|
299
|
+
assert.equal(FakeWorker.made[1].spec.model, "prov/X");
|
|
300
|
+
assert.ok(loadActivity(d).some((l) => /escalation: consult → prov\/X/.test(l.text)), "and says so in the log");
|
|
301
|
+
rmSync(d, { recursive: true, force: true });
|
|
302
|
+
console.log("✓ supervisor — an escalation is a session boundary too");
|
|
303
|
+
}
|
|
304
|
+
{
|
|
305
|
+
// A stop decision ends the run, closes the worker and disarms — a run that
|
|
306
|
+
// stops must not leave a pi child alive.
|
|
307
|
+
const d = project("task");
|
|
308
|
+
armRun(d, "run-D");
|
|
309
|
+
FakeWorker.made = [];
|
|
310
|
+
const sup = startSupervisor({
|
|
311
|
+
targetDir: d,
|
|
312
|
+
runId: "run-D",
|
|
313
|
+
idleMs: 0,
|
|
314
|
+
createWorker: ((spec) => new FakeWorker(spec)),
|
|
315
|
+
decide: scriptedDecider([
|
|
316
|
+
cont("BRIEF"),
|
|
317
|
+
{ action: "stop", reason: "complete", detail: "every phase passed" },
|
|
318
|
+
]),
|
|
319
|
+
});
|
|
320
|
+
await driving(sup).done;
|
|
321
|
+
assert.equal(FakeWorker.made.length, 1);
|
|
322
|
+
assert.equal(FakeWorker.made[0].closed, true, "the worker is closed when the run stops");
|
|
323
|
+
const state = loadSupervisorState(d);
|
|
324
|
+
assert.equal(state.status, "stopped");
|
|
325
|
+
assert.match(state.stopReason ?? "", /every phase passed/);
|
|
326
|
+
rmSync(d, { recursive: true, force: true });
|
|
327
|
+
console.log("✓ supervisor — a stop closes the background session");
|
|
328
|
+
}
|
|
329
|
+
{
|
|
330
|
+
// stop() from outside must return, even while a worker is mid-turn. A
|
|
331
|
+
// supervisor you cannot stop is worse than one that never started.
|
|
332
|
+
const d = project("task");
|
|
333
|
+
armRun(d, "run-E");
|
|
334
|
+
class SlowWorker extends FakeWorker {
|
|
335
|
+
async prompt(text) {
|
|
336
|
+
this.prompts.push(text);
|
|
337
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
338
|
+
return { summary: "", tools: [], usage: { inputTokens: 0, outputTokens: 0 }, contextRatio: null, aborted: true, error: "closed" };
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
FakeWorker.made = [];
|
|
342
|
+
const sup = startSupervisor({
|
|
343
|
+
targetDir: d,
|
|
344
|
+
runId: "run-E",
|
|
345
|
+
idleMs: 0,
|
|
346
|
+
createWorker: ((spec) => new SlowWorker(spec)),
|
|
347
|
+
decide: scriptedDecider([cont("BRIEF")]),
|
|
348
|
+
});
|
|
349
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
350
|
+
const began = Date.now();
|
|
351
|
+
await driving(sup).stop("human hit halt");
|
|
352
|
+
assert.ok(Date.now() - began < 4000, "stop() must not wait out a running turn");
|
|
353
|
+
assert.equal(FakeWorker.made[0].closed, true);
|
|
354
|
+
rmSync(d, { recursive: true, force: true });
|
|
355
|
+
console.log("✓ supervisor — stop() returns while a worker is mid-turn");
|
|
356
|
+
}
|
|
357
|
+
// ── the activity log is bounded ────────────────────────────────────────────
|
|
358
|
+
{
|
|
359
|
+
const d = tmp();
|
|
360
|
+
for (let i = 0; i < ACTIVITY_LIMIT + 25; i += 1)
|
|
361
|
+
appendActivity(d, { level: "info", worker: null, text: `line ${i}` });
|
|
362
|
+
const lines = loadActivity(d);
|
|
363
|
+
assert.equal(lines.length, ACTIVITY_LIMIT, "the log is a ring, not a landfill");
|
|
364
|
+
assert.match(lines[lines.length - 1].text, /line 424/);
|
|
365
|
+
rmSync(d, { recursive: true, force: true });
|
|
366
|
+
console.log("✓ supervisor — the background log is bounded");
|
|
367
|
+
}
|
|
368
|
+
// ── one driver per project ─────────────────────────────────────────────────
|
|
369
|
+
//
|
|
370
|
+
// Two pi windows open on the same project would both start a supervisor, and
|
|
371
|
+
// the run would get two workers editing the same tree. Every lock in this
|
|
372
|
+
// codebase exists to stop exactly that.
|
|
373
|
+
{
|
|
374
|
+
const d = project("task");
|
|
375
|
+
armRun(d, "run-F");
|
|
376
|
+
FakeWorker.made = [];
|
|
377
|
+
const first = driving(startSupervisor({
|
|
378
|
+
targetDir: d,
|
|
379
|
+
runId: "run-F",
|
|
380
|
+
idleMs: 50,
|
|
381
|
+
sessionId: "window-1",
|
|
382
|
+
createWorker: ((spec) => new FakeWorker(spec)),
|
|
383
|
+
decide: scriptedDecider([cont("BRIEF")]),
|
|
384
|
+
}));
|
|
385
|
+
await new Promise((r) => setTimeout(r, 150));
|
|
386
|
+
const owner = activeOwner(d, -1);
|
|
387
|
+
assert.ok(owner, "the driving session records a claim");
|
|
388
|
+
assert.equal(owner.sessionId, "window-1");
|
|
389
|
+
// A second window, in the same process, must be refused rather than
|
|
390
|
+
// silently doubling the workers.
|
|
391
|
+
const second = startSupervisor({
|
|
392
|
+
targetDir: d,
|
|
393
|
+
runId: "run-F",
|
|
394
|
+
idleMs: 50,
|
|
395
|
+
sessionId: "window-2",
|
|
396
|
+
createWorker: ((spec) => new FakeWorker(spec)),
|
|
397
|
+
decide: scriptedDecider([cont("BRIEF")]),
|
|
398
|
+
});
|
|
399
|
+
// Same pid here, so force the claim to look like another process's.
|
|
400
|
+
assert.equal(isRefusal(second), false, "same-process restarts are allowed — the pid matches");
|
|
401
|
+
if (!isRefusal(second))
|
|
402
|
+
await second.stop("test");
|
|
403
|
+
await first.stop("test");
|
|
404
|
+
assert.equal(loadSupervisorState(d).owner, null, "stopping releases the claim");
|
|
405
|
+
// A claim from a pid that is not running is not a claim.
|
|
406
|
+
const st = loadSupervisorState(d);
|
|
407
|
+
st.owner = { pid: 999_999, sessionId: "ghost", at: new Date().toISOString(), workerPid: null };
|
|
408
|
+
saveSupervisorState(d, st);
|
|
409
|
+
assert.equal(activeOwner(d, -1), null, "a dead owner does not block the next session");
|
|
410
|
+
assert.equal(processAlive(999_999), false);
|
|
411
|
+
assert.equal(processAlive(process.pid), true);
|
|
412
|
+
// A stale heartbeat does not block either, however alive the pid looks.
|
|
413
|
+
const stale = loadSupervisorState(d);
|
|
414
|
+
stale.owner = { pid: process.pid, sessionId: "old", at: new Date(Date.now() - 10 * 60_000).toISOString(), workerPid: null };
|
|
415
|
+
saveSupervisorState(d, stale);
|
|
416
|
+
assert.equal(activeOwner(d, -1), null, "a heartbeat older than the stale window is abandoned");
|
|
417
|
+
rmSync(d, { recursive: true, force: true });
|
|
418
|
+
console.log("✓ supervisor — one driver per project, and a dead claim never wedges it");
|
|
419
|
+
}
|
|
420
|
+
// ── an orphaned worker is killed, not left running ─────────────────────────
|
|
421
|
+
{
|
|
422
|
+
const d = project("task");
|
|
423
|
+
// A real child, so the reaper has something to kill: a sleeping node.
|
|
424
|
+
const { spawn } = await import("node:child_process");
|
|
425
|
+
const ghost = spawn(process.execPath, ["-e", "setTimeout(()=>{}, 60000)"], { stdio: "ignore" });
|
|
426
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
427
|
+
const st = emptySupervisorState("run-G");
|
|
428
|
+
st.owner = { pid: 999_998, sessionId: "dead", at: new Date().toISOString(), workerPid: ghost.pid ?? null };
|
|
429
|
+
saveSupervisorState(d, st);
|
|
430
|
+
const killed = reapOrphanWorker(d);
|
|
431
|
+
assert.equal(killed, ghost.pid, "a worker whose supervisor is gone is killed");
|
|
432
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
433
|
+
assert.equal(processAlive(ghost.pid), false, "and really is gone");
|
|
434
|
+
rmSync(d, { recursive: true, force: true });
|
|
435
|
+
console.log("✓ supervisor — a worker orphaned by a killed pi is reaped");
|
|
436
|
+
}
|
|
437
|
+
//# sourceMappingURL=supervisor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.test.js","sourceRoot":"","sources":["../../tests/supervisor.test.ts"],"names":[],"mappings":"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"}
|