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,255 @@
|
|
|
1
|
+
import { appendFile, mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { GOAL_LOOP_STATE_SCHEMA_VERSION, validateGoalLoopState, } from "./goalLoop.js";
|
|
4
|
+
import { validateGoalSpecification } from "./goalSpec.js";
|
|
5
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
6
|
+
import { dirname, resolve } from "node:path";
|
|
7
|
+
export const GOAL_STATE_FILE = "GOAL_STATE.json";
|
|
8
|
+
export const GOAL_TRACE_FILE = "GOAL_TRACE.jsonl";
|
|
9
|
+
export const GOAL_RESULT_FILE = "GOAL_RESULT.md";
|
|
10
|
+
export const GOAL_SPEC_FILE = "GOAL_SPEC.json";
|
|
11
|
+
export const CANONICAL_GOAL_SPEC_DIR = "harness/goals";
|
|
12
|
+
export const CANONICAL_GOAL_SPEC_FILE = "GOAL_SPEC.json";
|
|
13
|
+
export function canonicalGoalSpecPath(projectDir = process.cwd()) {
|
|
14
|
+
return resolve(projectDir, CANONICAL_GOAL_SPEC_DIR, CANONICAL_GOAL_SPEC_FILE);
|
|
15
|
+
}
|
|
16
|
+
export class GoalStateStore {
|
|
17
|
+
paths;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
20
|
+
const goalRunDir = options.goalRunDir ?? path.join(cwd, "tmp", "infinity-harness", "goals", options.goalRunId);
|
|
21
|
+
this.paths = {
|
|
22
|
+
goalRunId: options.goalRunId,
|
|
23
|
+
goalRunDir,
|
|
24
|
+
statePath: path.join(goalRunDir, GOAL_STATE_FILE),
|
|
25
|
+
tracePath: path.join(goalRunDir, GOAL_TRACE_FILE),
|
|
26
|
+
resultPath: path.join(goalRunDir, GOAL_RESULT_FILE),
|
|
27
|
+
goalSpecPath: path.join(goalRunDir, GOAL_SPEC_FILE),
|
|
28
|
+
iterationsDir: path.join(goalRunDir, "iterations"),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async ensureRunDir() {
|
|
32
|
+
await mkdir(this.paths.iterationsDir, { recursive: true });
|
|
33
|
+
}
|
|
34
|
+
async saveState(state) {
|
|
35
|
+
validateGoalLoopState(state);
|
|
36
|
+
await this.ensureRunDir();
|
|
37
|
+
await atomicWriteFile(this.paths.statePath, `${JSON.stringify(state, null, 2)}\n`);
|
|
38
|
+
}
|
|
39
|
+
async loadState() {
|
|
40
|
+
const text = await readFile(this.paths.statePath, "utf8");
|
|
41
|
+
return validateGoalLoopState(JSON.parse(text));
|
|
42
|
+
}
|
|
43
|
+
async saveGoalSpecification(spec) {
|
|
44
|
+
validateGoalSpecification(spec);
|
|
45
|
+
await this.ensureRunDir();
|
|
46
|
+
await atomicWriteFile(this.paths.goalSpecPath, `${JSON.stringify(spec, null, 2)}\n`);
|
|
47
|
+
}
|
|
48
|
+
/** Persist spec to runDir AND canonical harness/goals/GOAL_SPEC.json with proper-lockfile. */
|
|
49
|
+
async saveGoalSpecificationWithCanonical(spec, projectDir = process.cwd()) {
|
|
50
|
+
await this.saveGoalSpecification(spec);
|
|
51
|
+
await this.saveCanonicalGoalSpecification(spec, projectDir);
|
|
52
|
+
}
|
|
53
|
+
async saveCanonicalGoalSpecification(spec, projectDir = process.cwd()) {
|
|
54
|
+
validateGoalSpecification(spec);
|
|
55
|
+
const content = `${JSON.stringify(spec, null, 2)}\n`;
|
|
56
|
+
const target = canonicalGoalSpecPath(projectDir);
|
|
57
|
+
// Use proper-lockfile async lock when available to serialize concurrent writers
|
|
58
|
+
let release = null;
|
|
59
|
+
try {
|
|
60
|
+
const mod = await import("proper-lockfile");
|
|
61
|
+
const lockfile = mod.default ?? mod;
|
|
62
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
63
|
+
if (!existsSync(target))
|
|
64
|
+
writeFileSync(target, "", "utf8");
|
|
65
|
+
release = (await lockfile.lock(target, {
|
|
66
|
+
retries: { retries: 8, minTimeout: 20, maxTimeout: 80 },
|
|
67
|
+
stale: 10000,
|
|
68
|
+
realpath: false,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
release = null;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const tmp = `${target}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
76
|
+
await writeFile(tmp, content, "utf8");
|
|
77
|
+
await rename(tmp, target);
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
if (release) {
|
|
81
|
+
try {
|
|
82
|
+
await release();
|
|
83
|
+
}
|
|
84
|
+
catch { }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async loadCanonicalGoalSpecification(projectDir = process.cwd()) {
|
|
89
|
+
const text = await readFile(canonicalGoalSpecPath(projectDir), "utf8");
|
|
90
|
+
return validateGoalSpecification(JSON.parse(text));
|
|
91
|
+
}
|
|
92
|
+
async tryLoadCanonicalGoalSpecification(projectDir = process.cwd()) {
|
|
93
|
+
try {
|
|
94
|
+
return await this.loadCanonicalGoalSpecification(projectDir);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (isNodeErrnoException(error) && error.code === "ENOENT")
|
|
98
|
+
return undefined;
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async loadGoalSpecification() {
|
|
103
|
+
const text = await readFile(this.paths.goalSpecPath, "utf8");
|
|
104
|
+
return validateGoalSpecification(JSON.parse(text));
|
|
105
|
+
}
|
|
106
|
+
async tryLoadGoalSpecification() {
|
|
107
|
+
try {
|
|
108
|
+
return await this.loadGoalSpecification();
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (isNodeErrnoException(error) && error.code === "ENOENT") {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async appendTrace(event) {
|
|
118
|
+
await this.ensureRunDir();
|
|
119
|
+
await appendFile(this.paths.tracePath, `${JSON.stringify(event)}\n`, "utf8");
|
|
120
|
+
}
|
|
121
|
+
async appendNewTraceEvents(previousTraceLength, state) {
|
|
122
|
+
const events = state.trace.slice(Math.max(0, previousTraceLength));
|
|
123
|
+
for (const event of events) {
|
|
124
|
+
await this.appendTrace(event);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async initializeResultIfMissing(state) {
|
|
128
|
+
try {
|
|
129
|
+
await readFile(this.paths.resultPath, "utf8");
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (!isNodeErrnoException(error) || error.code !== "ENOENT") {
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
await this.initializeResult(state);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
async durableTraceLength() {
|
|
141
|
+
try {
|
|
142
|
+
const text = await readFile(this.paths.tracePath, "utf8");
|
|
143
|
+
return text.split(/\r?\n/).filter((line) => line.trim()).length;
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
if (isNodeErrnoException(error) && error.code === "ENOENT") {
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async initializeResult(state) {
|
|
153
|
+
validateGoalLoopState(state);
|
|
154
|
+
await this.ensureRunDir();
|
|
155
|
+
const lines = [
|
|
156
|
+
"# Pi Goal Task Result",
|
|
157
|
+
"",
|
|
158
|
+
`Run: ${state.goalRunId}`,
|
|
159
|
+
`Goal: ${state.goal}`,
|
|
160
|
+
`Started: ${state.startedAt}`,
|
|
161
|
+
`State: ${this.paths.statePath}`,
|
|
162
|
+
`Trace: ${this.paths.tracePath}`,
|
|
163
|
+
`Goal specification: ${this.paths.goalSpecPath}`,
|
|
164
|
+
"",
|
|
165
|
+
"## Safety limits",
|
|
166
|
+
"",
|
|
167
|
+
`- Minimum iterations before completion: ${state.limits.minIterations}`,
|
|
168
|
+
`- Max iterations: ${state.limits.maxIterations}`,
|
|
169
|
+
`- Run timeout: ${state.limits.timeoutMs}ms`,
|
|
170
|
+
`- Iteration timeout: ${state.limits.iterationTimeoutMs}ms`,
|
|
171
|
+
`- Reviewer timeout: ${state.limits.reviewerTimeoutMs}ms`,
|
|
172
|
+
"",
|
|
173
|
+
];
|
|
174
|
+
await writeFile(this.paths.resultPath, `${lines.join("\n")}\n`, "utf8");
|
|
175
|
+
}
|
|
176
|
+
async appendIterationResult(iteration) {
|
|
177
|
+
await this.ensureRunDir();
|
|
178
|
+
const lines = [
|
|
179
|
+
"",
|
|
180
|
+
`## Iteration ${iteration.iteration}`,
|
|
181
|
+
"",
|
|
182
|
+
`Status: ${iteration.status}`,
|
|
183
|
+
`Started: ${iteration.startedAt}`,
|
|
184
|
+
`Updated: ${iteration.updatedAt}`,
|
|
185
|
+
];
|
|
186
|
+
if (iteration.deadlineAt) {
|
|
187
|
+
lines.push(`Deadline: ${iteration.deadlineAt}`);
|
|
188
|
+
}
|
|
189
|
+
if (iteration.generatedTodo) {
|
|
190
|
+
lines.push("", "### Generated TODO", "", `Path: ${iteration.generatedTodo.todoPath}`);
|
|
191
|
+
if (iteration.generatedTodo.summary) {
|
|
192
|
+
lines.push(`Summary: ${iteration.generatedTodo.summary}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (iteration.workerResult) {
|
|
196
|
+
lines.push("", "### Worker result", "", `Status: ${iteration.workerResult.status}`, `Summary: ${iteration.workerResult.summary}`);
|
|
197
|
+
if (iteration.workerResult.resultPath) {
|
|
198
|
+
lines.push(`Result path: ${iteration.workerResult.resultPath}`);
|
|
199
|
+
}
|
|
200
|
+
if (iteration.workerResult.todoPath) {
|
|
201
|
+
lines.push(`TODO path: ${iteration.workerResult.todoPath}`);
|
|
202
|
+
}
|
|
203
|
+
if (iteration.workerResult.taskResultPath) {
|
|
204
|
+
lines.push(`Task result path: ${iteration.workerResult.taskResultPath}`);
|
|
205
|
+
}
|
|
206
|
+
if (iteration.workerResult.workerProgressPath) {
|
|
207
|
+
lines.push(`Worker progress log: ${iteration.workerResult.workerProgressPath}`);
|
|
208
|
+
}
|
|
209
|
+
if (iteration.workerResult.error) {
|
|
210
|
+
lines.push(`Error: ${iteration.workerResult.error}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (iteration.reviewerResult) {
|
|
214
|
+
lines.push("", "### Reviewer result", "", `Decision: ${iteration.reviewerResult.decision}`, `Complete: ${iteration.reviewerResult.complete ? "yes" : "no"}`, `Summary: ${iteration.reviewerResult.summary}`, `Rationale: ${iteration.reviewerResult.rationale}`);
|
|
215
|
+
if (iteration.reviewerResult.remainingWork.length > 0) {
|
|
216
|
+
lines.push("", "Remaining work:", ...iteration.reviewerResult.remainingWork.map((item) => `- ${item}`));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (iteration.completion) {
|
|
220
|
+
lines.push("", "### Completion", "", `Status: ${iteration.completion.status}`, `Reason: ${iteration.completion.reason}`);
|
|
221
|
+
}
|
|
222
|
+
await appendFile(this.paths.resultPath, `${lines.join("\n")}\n`, "utf8");
|
|
223
|
+
}
|
|
224
|
+
async writeIterationSnapshot(iteration) {
|
|
225
|
+
const iterationDir = this.iterationDir(iteration.iteration);
|
|
226
|
+
await mkdir(iterationDir, { recursive: true });
|
|
227
|
+
const snapshotPath = path.join(iterationDir, "ITERATION_STATE.json");
|
|
228
|
+
await atomicWriteFile(snapshotPath, `${JSON.stringify(iteration, null, 2)}\n`);
|
|
229
|
+
return snapshotPath;
|
|
230
|
+
}
|
|
231
|
+
iterationDir(iteration) {
|
|
232
|
+
return path.join(this.paths.iterationsDir, String(iteration).padStart(2, "0"));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
export function goalStatePaths(options) {
|
|
236
|
+
return new GoalStateStore(options).paths;
|
|
237
|
+
}
|
|
238
|
+
async function atomicWriteFile(filePath, content) {
|
|
239
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
240
|
+
const tmpPath = `${filePath}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
241
|
+
await writeFile(tmpPath, content, "utf8");
|
|
242
|
+
await rename(tmpPath, filePath);
|
|
243
|
+
}
|
|
244
|
+
export function isGoalLoopState(value) {
|
|
245
|
+
try {
|
|
246
|
+
return validateGoalLoopState(value).schemaVersion === GOAL_LOOP_STATE_SCHEMA_VERSION;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function isNodeErrnoException(error) {
|
|
253
|
+
return error instanceof Error && "code" in error;
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=goalState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goalState.js","sourceRoot":"","sources":["../../src/goalState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* infinity-harness — session handoff.
|
|
3
|
+
*
|
|
4
|
+
* A harness that never starts a new pi session is a harness whose context
|
|
5
|
+
* window only ever grows. By the tenth task the model is re-reading the whole
|
|
6
|
+
* history of the first nine in order to do the tenth: it pays for those tokens
|
|
7
|
+
* on every call, it compacts them into a lossy summary once the window fills,
|
|
8
|
+
* and on a small model it simply drowns. That is the failure mode this module
|
|
9
|
+
* exists to remove.
|
|
10
|
+
*
|
|
11
|
+
* The trick is that a handoff costs almost nothing here, because the harness
|
|
12
|
+
* never kept its state in the conversation to begin with. The plan, the phase,
|
|
13
|
+
* the gate history, the retry budgets and the escalation ladder are all files.
|
|
14
|
+
* A new session needs one thing to carry on: the brief — which is what the
|
|
15
|
+
* agent should have been working from anyway.
|
|
16
|
+
*
|
|
17
|
+
* What this module owns:
|
|
18
|
+
* - deciding *whether* a handoff is due (`shouldHandoff`)
|
|
19
|
+
* - writing down what the next session must be told (`requestHandoff`)
|
|
20
|
+
* - handing that to whoever starts it, exactly once (`takeHandoff`)
|
|
21
|
+
*
|
|
22
|
+
* What it deliberately does not own: starting the session. Only pi can do
|
|
23
|
+
* that, only from a command handler, and the adapter is where pi lives.
|
|
24
|
+
*/
|
|
25
|
+
import { pendingSessionPath } from "./core/paths.js";
|
|
26
|
+
import { readJsonSafe, writeJsonAtomic, removeFile, fileExists } from "./core/fsx.js";
|
|
27
|
+
const GRANULARITIES = ["off", "goal", "phase", "sprint", "feature", "task", "subtask"];
|
|
28
|
+
export function isHandoffGranularity(v) {
|
|
29
|
+
return typeof v === "string" && GRANULARITIES.includes(v);
|
|
30
|
+
}
|
|
31
|
+
export function defaultSessionPolicy() {
|
|
32
|
+
return { handoff: "task", contextThreshold: 0.6, carryNotes: true };
|
|
33
|
+
}
|
|
34
|
+
function policyOf(config) {
|
|
35
|
+
const p = (config.session ?? {});
|
|
36
|
+
const handoff = isHandoffGranularity(p.handoff) ? p.handoff : "task";
|
|
37
|
+
// "goal" is an alias for the single-session behaviour; keep the storage
|
|
38
|
+
// as "goal" so the wizard round-trips, but treat it as "off" here.
|
|
39
|
+
const effective = handoff === "goal" ? "off" : handoff;
|
|
40
|
+
const raw = typeof p.contextThreshold === "number" ? p.contextThreshold : 0.6;
|
|
41
|
+
return {
|
|
42
|
+
handoff: effective,
|
|
43
|
+
// A threshold of 1 or more can never fire and a negative one always would;
|
|
44
|
+
// both are configuration mistakes, and clamping is kinder than either.
|
|
45
|
+
contextThreshold: raw <= 0 ? 0 : Math.min(0.95, raw),
|
|
46
|
+
carryNotes: p.carryNotes !== false,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Should the run continue in a fresh session?
|
|
51
|
+
*
|
|
52
|
+
* Order matters. Context pressure wins over everything, because a handoff that
|
|
53
|
+
* arrives after compaction has already happened has arrived too late to be the
|
|
54
|
+
* thing that prevented it.
|
|
55
|
+
*/
|
|
56
|
+
/** Coarsest → finest. Handoff fires at the chosen level and everything coarser. */
|
|
57
|
+
const LEVEL_ORDER = ["off", "goal", "phase", "sprint", "feature", "task", "subtask"];
|
|
58
|
+
function rank(g) {
|
|
59
|
+
const i = LEVEL_ORDER.indexOf(g);
|
|
60
|
+
return i < 0 ? 5 : i;
|
|
61
|
+
}
|
|
62
|
+
export function shouldHandoff(signals) {
|
|
63
|
+
const policy = policyOf(signals.config);
|
|
64
|
+
if (policy.handoff === "off")
|
|
65
|
+
return { handoff: false };
|
|
66
|
+
const ratio = signals.contextRatio;
|
|
67
|
+
if (policy.contextThreshold > 0 && typeof ratio === "number" && ratio >= policy.contextThreshold) {
|
|
68
|
+
return {
|
|
69
|
+
handoff: true,
|
|
70
|
+
reason: "context",
|
|
71
|
+
detail: `context ${Math.round(ratio * 100)}% full (threshold ${Math.round(policy.contextThreshold * 100)}%)`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const lvl = rank(policy.handoff);
|
|
75
|
+
// Hierarchy: off(0) < goal(1) < phase(2) < sprint(3) < feature(4) < task(5) < subtask(6).
|
|
76
|
+
// Finer granularity implies coarser boundaries too (task change implies feature/sprint/phase
|
|
77
|
+
// may have changed, but we check coarsest first so the reason reflects the highest level).
|
|
78
|
+
// Only boundaries at or coarser than the configured granularity? No —
|
|
79
|
+
// the knob is "how fine do you want to go". Choosing "task" means
|
|
80
|
+
// phase/feature/sprint/goal AND task boundaries fire; choosing "phase"
|
|
81
|
+
// means only phase (and coarser goal) fires. So a boundary fires iff
|
|
82
|
+
// its rank <= chosen rank. task (5) should not fire when handoff is phase (2). Hence <= lvl.
|
|
83
|
+
// Fine-grained choice: the wizard knob is the *coarsest* level that still
|
|
84
|
+
// gets a fresh session. Picking "task" means every task gets its own
|
|
85
|
+
// session (feature/sprint/phase do too, implicitly). So a boundary fires
|
|
86
|
+
// iff chosenRank >= boundaryRank.
|
|
87
|
+
// Phase always hands off (except off/goal) because phases are the harness
|
|
88
|
+
// backbone; a phase change must never ride the old session's context.
|
|
89
|
+
if (signals.toPhase && signals.fromPhase !== signals.toPhase && lvl >= 2) {
|
|
90
|
+
return {
|
|
91
|
+
handoff: true,
|
|
92
|
+
reason: "phase",
|
|
93
|
+
detail: `${(signals.fromPhase ?? "start").toUpperCase()} → ${signals.toPhase.toUpperCase()}`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// "goal/off" never fires here — off early-returned, "goal" was mapped to off.
|
|
97
|
+
// Keep for completeness if rank comparison changes; guarded by lvl so it
|
|
98
|
+
// doesn't resurrect. retain dead code removed check.
|
|
99
|
+
void lvl;
|
|
100
|
+
if (signals.fromSprint !== undefined || signals.toSprint !== undefined) {
|
|
101
|
+
const sFrom = (signals.fromSprint ?? null)?.trim() || null;
|
|
102
|
+
const sTo = (signals.toSprint ?? null)?.trim() || null;
|
|
103
|
+
if (sFrom !== sTo && (sTo || sFrom) && lvl >= 3) {
|
|
104
|
+
return { handoff: true, reason: "sprint", detail: `${sFrom ?? "no sprint"} → ${sTo ?? "no sprint"}` };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (signals.fromFeature !== undefined || signals.toFeature !== undefined) {
|
|
108
|
+
const fFrom = (signals.fromFeature ?? null)?.trim() || null;
|
|
109
|
+
const fTo = (signals.toFeature ?? null)?.trim() || null;
|
|
110
|
+
if (fFrom !== fTo && (fTo || fFrom) && lvl >= 4) {
|
|
111
|
+
return { handoff: true, reason: "feature", detail: `${fFrom ?? "no feature"} → ${fTo ?? "no feature"}` };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (lvl >= 5) {
|
|
115
|
+
if ((signals.fromTask ?? null) !== (signals.toTask ?? null) && (signals.fromTask || signals.toTask)) {
|
|
116
|
+
return {
|
|
117
|
+
handoff: true,
|
|
118
|
+
reason: "task",
|
|
119
|
+
detail: `${signals.fromTask ?? "no task"} → ${signals.toTask ?? "no task"}`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (lvl >= 6) {
|
|
124
|
+
const stFrom = (signals.fromSubtask ?? null)?.trim() || null;
|
|
125
|
+
const stTo = (signals.toSubtask ?? null)?.trim() || null;
|
|
126
|
+
if (stFrom !== stTo && (stTo || stFrom)) {
|
|
127
|
+
return { handoff: true, reason: "subtask", detail: `${stFrom ?? "no subtask"} → ${stTo ?? "no subtask"}` };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return { handoff: false };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Record what the replacement session must be told.
|
|
134
|
+
*
|
|
135
|
+
* Written to disk rather than held in memory because the session that writes
|
|
136
|
+
* it is, by definition, about to stop existing.
|
|
137
|
+
*/
|
|
138
|
+
export function requestHandoff(targetDir, handoff) {
|
|
139
|
+
const pending = { ...handoff, at: new Date().toISOString() };
|
|
140
|
+
writeJsonAtomic(pendingSessionPath(targetDir), pending);
|
|
141
|
+
return pending;
|
|
142
|
+
}
|
|
143
|
+
export function peekHandoff(targetDir) {
|
|
144
|
+
const raw = readJsonSafe(pendingSessionPath(targetDir), null);
|
|
145
|
+
if (!raw || typeof raw.kickoff !== "string" || !raw.kickoff.trim())
|
|
146
|
+
return null;
|
|
147
|
+
return raw;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Claim the pending handoff, clearing it.
|
|
151
|
+
*
|
|
152
|
+
* Clearing before returning is deliberate: if the replacement session dies
|
|
153
|
+
* between claiming and sending, the run stalls where a human can see it,
|
|
154
|
+
* rather than looping through handoffs forever on a stale file.
|
|
155
|
+
*/
|
|
156
|
+
export function takeHandoff(targetDir) {
|
|
157
|
+
const pending = peekHandoff(targetDir);
|
|
158
|
+
clearHandoff(targetDir);
|
|
159
|
+
return pending;
|
|
160
|
+
}
|
|
161
|
+
export function clearHandoff(targetDir) {
|
|
162
|
+
removeFile(pendingSessionPath(targetDir));
|
|
163
|
+
}
|
|
164
|
+
export function hasPendingHandoff(targetDir) {
|
|
165
|
+
return fileExists(pendingSessionPath(targetDir));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* The message the replacement session opens with.
|
|
169
|
+
*
|
|
170
|
+
* It is the brief, plus one paragraph explaining why the previous session
|
|
171
|
+
* ended — because an agent that wakes up mid-run with no explanation tends to
|
|
172
|
+
* spend its first turn investigating the harness instead of doing the work.
|
|
173
|
+
*/
|
|
174
|
+
export function composeKickoff(brief, reason, detail, carry) {
|
|
175
|
+
const why = {
|
|
176
|
+
phase: "The pipeline advanced, so the run continues in a clean session.",
|
|
177
|
+
task: "The run moved to a different task, so it continues in a clean session.",
|
|
178
|
+
sprint: "The active sprint changed, so the run continues in a clean session.",
|
|
179
|
+
feature: "The active feature changed, so the run continues in a clean session.",
|
|
180
|
+
goal: "The active goal changed, so the run continues in a clean session.",
|
|
181
|
+
subtask: "The active subtask changed, so the run continues in a clean session.",
|
|
182
|
+
context: "The previous session's context was filling up, so the run continues in a clean one.",
|
|
183
|
+
off: "Session handoff is off.",
|
|
184
|
+
"goal-pass": "A goal pass finished, so the next pass starts in a clean session.",
|
|
185
|
+
manual: "A human asked for a fresh session.",
|
|
186
|
+
};
|
|
187
|
+
const lines = [
|
|
188
|
+
`[infinity-harness] Continuing a run in a fresh session — ${detail}.`,
|
|
189
|
+
why[reason],
|
|
190
|
+
"",
|
|
191
|
+
"Nothing is lost: the plan, the phase, the gate history and every retry budget",
|
|
192
|
+
"live in `harness/` and are already loaded. Work from the brief below. Do not",
|
|
193
|
+
"go looking for the previous conversation.",
|
|
194
|
+
];
|
|
195
|
+
if (carry && carry.trim()) {
|
|
196
|
+
lines.push("", "What the previous session did:", carry.trim());
|
|
197
|
+
}
|
|
198
|
+
lines.push("", brief);
|
|
199
|
+
return lines.join("\n");
|
|
200
|
+
}
|
|
201
|
+
/** One-line summary of a handoff, for a notification or the run journal. */
|
|
202
|
+
export function describeHandoff(h) {
|
|
203
|
+
return `new session — ${h.reason}: ${h.detail}`;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/handoff.ts"],"names":[],"mappings":"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"}
|