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.
Files changed (192) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/extensions/infinity-harness/index.js +3614 -0
  3. package/dist/extensions/infinity-harness/index.js.map +1 -0
  4. package/dist/src/approval.js +154 -0
  5. package/dist/src/approval.js.map +1 -0
  6. package/dist/src/core/brief.js +309 -0
  7. package/dist/src/core/brief.js.map +1 -0
  8. package/dist/src/core/config.js +539 -0
  9. package/dist/src/core/config.js.map +1 -0
  10. package/dist/src/core/exec.js +106 -0
  11. package/dist/src/core/exec.js.map +1 -0
  12. package/dist/src/core/featureList.js +365 -0
  13. package/dist/src/core/featureList.js.map +1 -0
  14. package/dist/src/core/fsx.js +123 -0
  15. package/dist/src/core/fsx.js.map +1 -0
  16. package/dist/src/core/gates.js +490 -0
  17. package/dist/src/core/gates.js.map +1 -0
  18. package/dist/src/core/init.js +480 -0
  19. package/dist/src/core/init.js.map +1 -0
  20. package/dist/src/core/lock.js +183 -0
  21. package/dist/src/core/lock.js.map +1 -0
  22. package/dist/src/core/modelRouter.js +185 -0
  23. package/dist/src/core/modelRouter.js.map +1 -0
  24. package/dist/src/core/paths.js +129 -0
  25. package/dist/src/core/paths.js.map +1 -0
  26. package/dist/src/core/phases.js +254 -0
  27. package/dist/src/core/phases.js.map +1 -0
  28. package/dist/src/core/plan.js +15 -0
  29. package/dist/src/core/plan.js.map +1 -0
  30. package/dist/src/core/runState.js +126 -0
  31. package/dist/src/core/runState.js.map +1 -0
  32. package/dist/src/core/settings.js +877 -0
  33. package/dist/src/core/settings.js.map +1 -0
  34. package/dist/src/core/skills.js +319 -0
  35. package/dist/src/core/skills.js.map +1 -0
  36. package/dist/src/core/skillsAudit.js +194 -0
  37. package/dist/src/core/skillsAudit.js.map +1 -0
  38. package/dist/src/core/types.js +77 -0
  39. package/dist/src/core/types.js.map +1 -0
  40. package/dist/src/daemon/budget.js +85 -0
  41. package/dist/src/daemon/budget.js.map +1 -0
  42. package/dist/src/daemon/guard.js +122 -0
  43. package/dist/src/daemon/guard.js.map +1 -0
  44. package/dist/src/daemon/index.js +461 -0
  45. package/dist/src/daemon/index.js.map +1 -0
  46. package/dist/src/daemon/isolation.js +84 -0
  47. package/dist/src/daemon/isolation.js.map +1 -0
  48. package/dist/src/daemon/preflight.js +131 -0
  49. package/dist/src/daemon/preflight.js.map +1 -0
  50. package/dist/src/daemon/server.js +174 -0
  51. package/dist/src/daemon/server.js.map +1 -0
  52. package/dist/src/daemon/supervisorState.js +42 -0
  53. package/dist/src/daemon/supervisorState.js.map +1 -0
  54. package/dist/src/daemon/worker.js +239 -0
  55. package/dist/src/daemon/worker.js.map +1 -0
  56. package/dist/src/daemon/worktree.js +102 -0
  57. package/dist/src/daemon/worktree.js.map +1 -0
  58. package/dist/src/escalate.js +312 -0
  59. package/dist/src/escalate.js.map +1 -0
  60. package/dist/src/exec/piWorker.js +630 -0
  61. package/dist/src/exec/piWorker.js.map +1 -0
  62. package/dist/src/goal.js +317 -0
  63. package/dist/src/goal.js.map +1 -0
  64. package/dist/src/goalLoop.js +374 -0
  65. package/dist/src/goalLoop.js.map +1 -0
  66. package/dist/src/goalSpec.js +397 -0
  67. package/dist/src/goalSpec.js.map +1 -0
  68. package/dist/src/goalState.js +255 -0
  69. package/dist/src/goalState.js.map +1 -0
  70. package/dist/src/handoff.js +205 -0
  71. package/dist/src/handoff.js.map +1 -0
  72. package/dist/src/intake.js +203 -0
  73. package/dist/src/intake.js.map +1 -0
  74. package/dist/src/loop.js +592 -0
  75. package/dist/src/loop.js.map +1 -0
  76. package/dist/src/modelRouter.js +216 -0
  77. package/dist/src/modelRouter.js.map +1 -0
  78. package/dist/src/remote.js +246 -0
  79. package/dist/src/remote.js.map +1 -0
  80. package/dist/src/replan.js +262 -0
  81. package/dist/src/replan.js.map +1 -0
  82. package/dist/src/review.js +54 -0
  83. package/dist/src/review.js.map +1 -0
  84. package/dist/src/rework.js +241 -0
  85. package/dist/src/rework.js.map +1 -0
  86. package/dist/src/runState.js +4 -0
  87. package/dist/src/runState.js.map +1 -0
  88. package/dist/src/scheduler.js +270 -0
  89. package/dist/src/scheduler.js.map +1 -0
  90. package/dist/src/supervisor.js +787 -0
  91. package/dist/src/supervisor.js.map +1 -0
  92. package/dist/src/taskList.js +430 -0
  93. package/dist/src/taskList.js.map +1 -0
  94. package/dist/src/ui/config.js +268 -0
  95. package/dist/src/ui/config.js.map +1 -0
  96. package/dist/src/ui/dashboard.js +1288 -0
  97. package/dist/src/ui/dashboard.js.map +1 -0
  98. package/dist/src/ui/display.js +229 -0
  99. package/dist/src/ui/display.js.map +1 -0
  100. package/dist/src/ui/planTree.js +219 -0
  101. package/dist/src/ui/planTree.js.map +1 -0
  102. package/dist/src/ui/theme.js +298 -0
  103. package/dist/src/ui/theme.js.map +1 -0
  104. package/dist/src/ui/viewState.js +65 -0
  105. package/dist/src/ui/viewState.js.map +1 -0
  106. package/dist/src/ui/widget.js +721 -0
  107. package/dist/src/ui/widget.js.map +1 -0
  108. package/dist/src/ui/wizard.js +540 -0
  109. package/dist/src/ui/wizard.js.map +1 -0
  110. package/dist/src/unstuck.js +210 -0
  111. package/dist/src/unstuck.js.map +1 -0
  112. package/dist/src/worker.js +267 -0
  113. package/dist/src/worker.js.map +1 -0
  114. package/dist/src/workflow.js +250 -0
  115. package/dist/src/workflow.js.map +1 -0
  116. package/dist/tests/approval.test.js +144 -0
  117. package/dist/tests/approval.test.js.map +1 -0
  118. package/dist/tests/brief.test.js +271 -0
  119. package/dist/tests/brief.test.js.map +1 -0
  120. package/dist/tests/config.test.js +320 -0
  121. package/dist/tests/config.test.js.map +1 -0
  122. package/dist/tests/dashboard.test.js +277 -0
  123. package/dist/tests/dashboard.test.js.map +1 -0
  124. package/dist/tests/display.test.js +229 -0
  125. package/dist/tests/display.test.js.map +1 -0
  126. package/dist/tests/escalate.test.js +272 -0
  127. package/dist/tests/escalate.test.js.map +1 -0
  128. package/dist/tests/featureList.test.js +429 -0
  129. package/dist/tests/featureList.test.js.map +1 -0
  130. package/dist/tests/gates.test.js +333 -0
  131. package/dist/tests/gates.test.js.map +1 -0
  132. package/dist/tests/goal.test.js +229 -0
  133. package/dist/tests/goal.test.js.map +1 -0
  134. package/dist/tests/goalLoop.test.js +170 -0
  135. package/dist/tests/goalLoop.test.js.map +1 -0
  136. package/dist/tests/goalSpec.test.js +146 -0
  137. package/dist/tests/goalSpec.test.js.map +1 -0
  138. package/dist/tests/goalState.test.js +202 -0
  139. package/dist/tests/goalState.test.js.map +1 -0
  140. package/dist/tests/handoff.test.js +127 -0
  141. package/dist/tests/handoff.test.js.map +1 -0
  142. package/dist/tests/init.test.js +264 -0
  143. package/dist/tests/init.test.js.map +1 -0
  144. package/dist/tests/intake.test.js +288 -0
  145. package/dist/tests/intake.test.js.map +1 -0
  146. package/dist/tests/loop.test.js +453 -0
  147. package/dist/tests/loop.test.js.map +1 -0
  148. package/dist/tests/modelRouter.test.js +131 -0
  149. package/dist/tests/modelRouter.test.js.map +1 -0
  150. package/dist/tests/phases.test.js +244 -0
  151. package/dist/tests/phases.test.js.map +1 -0
  152. package/dist/tests/planTree.test.js +190 -0
  153. package/dist/tests/planTree.test.js.map +1 -0
  154. package/dist/tests/remote.test.js +380 -0
  155. package/dist/tests/remote.test.js.map +1 -0
  156. package/dist/tests/replan.test.js +113 -0
  157. package/dist/tests/replan.test.js.map +1 -0
  158. package/dist/tests/review.test.js +77 -0
  159. package/dist/tests/review.test.js.map +1 -0
  160. package/dist/tests/rework.test.js +109 -0
  161. package/dist/tests/rework.test.js.map +1 -0
  162. package/dist/tests/routing-live.test.js +121 -0
  163. package/dist/tests/routing-live.test.js.map +1 -0
  164. package/dist/tests/runState.test.js +73 -0
  165. package/dist/tests/runState.test.js.map +1 -0
  166. package/dist/tests/settings.test.js +311 -0
  167. package/dist/tests/settings.test.js.map +1 -0
  168. package/dist/tests/skills.test.js +387 -0
  169. package/dist/tests/skills.test.js.map +1 -0
  170. package/dist/tests/supervisor.test.js +437 -0
  171. package/dist/tests/supervisor.test.js.map +1 -0
  172. package/dist/tests/surface.test.js +203 -0
  173. package/dist/tests/surface.test.js.map +1 -0
  174. package/dist/tests/taskList.test.js +376 -0
  175. package/dist/tests/taskList.test.js.map +1 -0
  176. package/dist/tests/theme.test.js +149 -0
  177. package/dist/tests/theme.test.js.map +1 -0
  178. package/dist/tests/unstuck.test.js +268 -0
  179. package/dist/tests/unstuck.test.js.map +1 -0
  180. package/dist/tests/widget.test.js +424 -0
  181. package/dist/tests/widget.test.js.map +1 -0
  182. package/dist/tests/worker.test.js +306 -0
  183. package/dist/tests/worker.test.js.map +1 -0
  184. package/dist/tests/workflow.test.js +187 -0
  185. package/dist/tests/workflow.test.js.map +1 -0
  186. package/extensions/infinity-harness/index.ts +39 -12
  187. package/package.json +5 -2
  188. package/src/core/modelRouter.ts +23 -1
  189. package/src/daemon/index.ts +3 -3
  190. package/src/daemon/worker.ts +28 -5
  191. package/src/ui/config.ts +25 -1
  192. package/src/ui/wizard.ts +10 -5
@@ -0,0 +1,102 @@
1
+ /**
2
+ * infinity-harness — daemon/worktree.ts
3
+ *
4
+ * Git worktree per concurrent worker. Gate in worktree, merge lock, unlock.
5
+ *
6
+ * v3.0 is sequential (maxWorkers:1) — this file is the isolation that will be
7
+ * used when we lift that. Kept isolated in its own module so it cannot leak
8
+ * into the single-owner path prematurely.
9
+ */
10
+ import { existsSync } from "node:fs";
11
+ import { worktreePath, worktreesDir } from "../core/paths.js";
12
+ import { run } from "../core/exec.js";
13
+ import { ensureDir } from "../core/fsx.js";
14
+ export async function isWorktreeSupported(targetDir) {
15
+ const r = await run("git rev-parse --is-inside-work-tree", { cwd: targetDir, timeoutMs: 10_000 });
16
+ return r.ok && r.stdout.trim() === "true";
17
+ }
18
+ export async function createWorktree(targetDir, branch) {
19
+ if (!await isWorktreeSupported(targetDir))
20
+ return { path: "", error: "not a git repo — cannot create worktree" };
21
+ const worktree = worktreePath(targetDir, branch);
22
+ if (existsSync(worktree))
23
+ return { path: worktree, error: null };
24
+ try {
25
+ ensureDir(worktreesDir(targetDir));
26
+ }
27
+ catch { }
28
+ // Safe to create on current HEAD: `git worktree add <path>` with no branch creates detached worktree
29
+ const r = await run(`git worktree add --detach "${worktree.replace(/"/g, '\\"')}"`, { cwd: targetDir, timeoutMs: 30_000 });
30
+ if (!r.ok)
31
+ return { path: "", error: (r.stderr || r.stdout || r.spawnError || `git worktree add exited ${r.code}`).slice(0, 400) };
32
+ return { path: worktree, error: null };
33
+ }
34
+ export async function removeWorktree(targetDir, branch) {
35
+ const worktree = worktreePath(targetDir, branch);
36
+ if (!existsSync(worktree))
37
+ return { ok: true, error: null };
38
+ const r = await run(`git worktree remove --force "${worktree.replace(/"/g, '\\"')}"`, { cwd: targetDir, timeoutMs: 30_000 });
39
+ if (!r.ok && !r.stderr?.includes("not a valid path"))
40
+ return { ok: false, error: (r.stderr || r.stdout || r.spawnError || `exit ${r.code}`).slice(0, 400) };
41
+ // Also prune any stale branch/worktree registration
42
+ await run("git worktree prune", { cwd: targetDir, timeoutMs: 15_000 });
43
+ return { ok: true, error: null };
44
+ }
45
+ export async function removeAllWorktrees(targetDir) {
46
+ await run("git worktree prune", { cwd: targetDir, timeoutMs: 15_000 });
47
+ // Best-effort remove each directory under harness/worktrees
48
+ const root = worktreesDir(targetDir);
49
+ if (!existsSync(root))
50
+ return;
51
+ let entries = [];
52
+ try {
53
+ const { readdirSync } = await import("node:fs");
54
+ entries = readdirSync(root);
55
+ }
56
+ catch { }
57
+ for (const e of entries) {
58
+ await removeWorktree(targetDir, e);
59
+ }
60
+ }
61
+ export async function gateInWorktree(targetDir, worktree, phase) {
62
+ const { runChecks } = await import("../core/gates.js");
63
+ const g = await runChecks(worktree, phase, { record: false });
64
+ if (g.overall)
65
+ return { pass: true };
66
+ return { pass: false, reason: g.failures.join(", ") };
67
+ }
68
+ export async function mergeWorktreeBranch(targetDir, branch, worktree, gatePhase) {
69
+ // We use a harness/<unit> branch name when creating the worktree. Merge with `git merge`.
70
+ const branchName = `harness/${branch}`;
71
+ // Ensure branch exists (worktree add --detach doesn't create one). Create branch from worktree HEAD.
72
+ const currentHead = (await run(`git -C "${worktree.replace(/"/g, '\\"')}" rev-parse HEAD`, { cwd: targetDir, timeoutMs: 10_000 })).stdout?.trim() ?? null;
73
+ if (currentHead) {
74
+ const create = await run(`git branch "${branchName}" "${currentHead}"`, { cwd: targetDir, timeoutMs: 15_000 });
75
+ // exists is ok — we will merge the branch if already there.
76
+ if (!create.ok && !(create.stderr || "").includes("already exists")) {
77
+ // best-effort: continue to merge attempt
78
+ }
79
+ }
80
+ const merge = await run(`git merge --no-ff --no-edit "${branchName}"`, { cwd: targetDir, timeoutMs: 30_000 });
81
+ if (merge.ok) {
82
+ await run(`git branch -D "${branchName}"`, { cwd: targetDir, timeoutMs: 10_000 });
83
+ const { runChecks: _runChecks } = await import("../core/gates.js");
84
+ const { loadConfig } = await import("../core/config.js");
85
+ const phase = gatePhase ?? (loadConfig(targetDir).config?.currentPhase ?? "build");
86
+ const post = await _runChecks(targetDir, phase, { record: false });
87
+ if (!post.overall) {
88
+ await run("git reset --hard HEAD~1", { cwd: targetDir, timeoutMs: 15_000 }).catch(() => null);
89
+ return { ok: false, conflict: false, reason: `post-merge gate FAIL: ${post.failures.join(", ")}` };
90
+ }
91
+ return { ok: true };
92
+ }
93
+ const out = (merge.stdout ?? "") + "\n" + (merge.stderr ?? "");
94
+ const conflict = /conflict/i.test(out);
95
+ if (conflict) {
96
+ await run("git merge --abort", { cwd: targetDir, timeoutMs: 10_000 }).catch(() => null);
97
+ return { ok: false, conflict: true, reason: out.slice(0, 500) };
98
+ }
99
+ await run("git merge --abort", { cwd: targetDir, timeoutMs: 10_000 }).catch(() => null);
100
+ return { ok: false, conflict: false, reason: out.slice(0, 500) };
101
+ }
102
+ //# sourceMappingURL=worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../../src/daemon/worktree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,312 @@
1
+ /**
2
+ * infinity-harness — the escalation ladder, actually connected.
3
+ *
4
+ * `unstuck.ts` has always been able to choose what to do when a run stalls:
5
+ * retry → reframe → consult → rework → replan → master, with budgets,
6
+ * fingerprint dedup and a cooldown. It picks a strategy name and returns it.
7
+ *
8
+ * Nothing ever executed one. There was a chooser and no actuator, so
9
+ * `chooseUnstuckStrategy` was called by its own tests and by nothing else,
10
+ * and `/infinity:run` did the only thing it could when the gate kept failing:
11
+ * count strikes and stop. A run that could have escalated to a stronger model,
12
+ * reworked the task that poisoned everything downstream, or amended a plan
13
+ * that turned out to be wrong instead sat there failing the same check three
14
+ * times and gave up.
15
+ *
16
+ * This module is the actuator. It asks `unstuck` what to do, does the part
17
+ * that is ours to do — flipping tasks to `rework`, naming the model to
18
+ * escalate to — and returns an instruction the agent can act on for the part
19
+ * that is the agent's.
20
+ *
21
+ * It deliberately does not implement `replan` itself. Inventing the tasks a
22
+ * stuck plan is missing is a modelling job, not a control-flow job; the ladder
23
+ * tells the agent to amend the plan and hands it `infinity_replan`.
24
+ */
25
+ import { loadFeatureList, flattenTasks } from "./core/featureList.js";
26
+ import { chooseUnstuckStrategy } from "./unstuck.js";
27
+ import { shouldBounceToRework } from "./review.js";
28
+ import { startRework, loadRework } from "./rework.js";
29
+ import { loadReplanHistory } from "./replan.js";
30
+ import { loadRouterConfig } from "./modelRouter.js";
31
+ export function emptyEscalationState() {
32
+ return { consultedCount: 0, masterUsed: false, lastUnstuckAt: null, fingerprints: [], tried: [] };
33
+ }
34
+ /** Fingerprints kept for dedup. Older ones tell us nothing. */
35
+ const FINGERPRINT_WINDOW = 12;
36
+ /**
37
+ * Decide what to do about a stalled run, and do the part that is ours.
38
+ *
39
+ * Never throws: an escalation that fails is a run that continues without one,
40
+ * not a run that dies. The failure is reported in `reason`, because a silent
41
+ * fallback to "retry" would look exactly like a healthy ladder.
42
+ */
43
+ export async function escalate(options) {
44
+ const { targetDir, phase, state } = options;
45
+ const now = options.now ?? new Date();
46
+ const carry = (strategy, over = {}) => ({
47
+ ...state,
48
+ ...over,
49
+ lastUnstuckAt: now.toISOString(),
50
+ fingerprints: [...state.fingerprints, options.fingerprint].slice(-FINGERPRINT_WINDOW),
51
+ tried: strategy && !state.tried.includes(strategy) ? [...state.tried, strategy] : state.tried,
52
+ });
53
+ const { list } = loadFeatureList(targetDir);
54
+ const tasks = flattenTasks(list);
55
+ const task = currentTask(tasks);
56
+ // REVIEW is its own decision before the general ladder. A failing review is
57
+ // not the reviewer being stuck; it is the reviewer saying the work is wrong,
58
+ // and the answer to that is going back to the work.
59
+ if (phase === "review") {
60
+ // `shouldBounceToRework` reads its own bounce count from rework.json,
61
+ // which is the right source: bounces are reworks, not replans.
62
+ const bounce = shouldBounceToRework({ projectDir: targetDir, fileDelta: options.fileDelta });
63
+ if (bounce.shouldBounce && task) {
64
+ const applied = await applyRework(options, task, "review bounce");
65
+ return {
66
+ strategy: "rework",
67
+ reason: `review bounce: ${bounce.reason}`,
68
+ instruction: reworkInstruction(task, applied.impacted, options.failures),
69
+ model: null,
70
+ applied: applied.detail,
71
+ next: carry("rework"),
72
+ };
73
+ }
74
+ }
75
+ let choice;
76
+ try {
77
+ choice = chooseUnstuckStrategy({
78
+ projectDir: targetDir,
79
+ featureId: task?.featureId,
80
+ taskId: task?.id,
81
+ attemptFingerprints: state.fingerprints,
82
+ currentFingerprint: options.fingerprint,
83
+ fileDelta: options.fileDelta,
84
+ tried: state.tried,
85
+ // A stall is defined by the tree not having moved, so the delta guard —
86
+ // which exists for review bounces — must not veto the rungs that exist
87
+ // for exactly this situation.
88
+ requireDeltaForRework: false,
89
+ lastUnstuckAt: state.lastUnstuckAt ?? undefined,
90
+ consultedCount: state.consultedCount,
91
+ currentDifficulty: task?.difficulty ?? null,
92
+ masterUsed: state.masterUsed,
93
+ });
94
+ }
95
+ catch (e) {
96
+ return {
97
+ strategy: null,
98
+ reason: `the escalation ladder could not run: ${message(e)}`,
99
+ instruction: null,
100
+ model: null,
101
+ applied: null,
102
+ next: carry(null),
103
+ };
104
+ }
105
+ const failureList = options.failures.length
106
+ ? options.failures.map((f) => ` - ${f}`).join("\n")
107
+ : " - (the gate reported no detail)";
108
+ switch (choice.strategy) {
109
+ case "retry":
110
+ return {
111
+ strategy: "retry",
112
+ reason: choice.reason,
113
+ instruction: `The ${phase.toUpperCase()} gate failed again and the working tree has not moved. One ` +
114
+ `more attempt before this changes tack — go straight at the failure, and change ` +
115
+ `something real this time:\n${failureList}`,
116
+ model: null,
117
+ applied: null,
118
+ next: carry("retry"),
119
+ };
120
+ case "reframe":
121
+ return {
122
+ strategy: "reframe",
123
+ reason: choice.reason,
124
+ instruction: `STOP AND REFRAME. The same gate has now failed repeatedly with the same result, which ` +
125
+ `means the approach is wrong, not incomplete. Before writing another line:\n` +
126
+ ` 1. State the assumption you have been working under.\n` +
127
+ ` 2. Say why the evidence contradicts it — quote the failure.\n` +
128
+ ` 3. Describe a different approach, and only then implement it.\n\n` +
129
+ `Still failing:\n${failureList}`,
130
+ model: null,
131
+ applied: null,
132
+ next: carry("reframe"),
133
+ };
134
+ case "consult": {
135
+ const model = choice.nextModel ?? null;
136
+ const lvl = options.level ?? "task";
137
+ let thinkingHint = null;
138
+ try {
139
+ const { consultNextWithThinking, DIFFICULTY_LADDER } = await import("./modelRouter.js");
140
+ const cur = (task?.difficulty ?? null);
141
+ const idx = DIFFICULTY_LADDER.indexOf(cur ?? "");
142
+ const nextDiff = idx >= 0 && idx < DIFFICULTY_LADDER.length - 1 ? DIFFICULTY_LADDER[idx + 1] : null;
143
+ const picked = consultNextWithThinking(cur, { projectDir: targetDir, consultedCount: state.consultedCount });
144
+ void picked;
145
+ void nextDiff;
146
+ thinkingHint = null; // keep instruction lean; spawned worker resolves thinking from router
147
+ }
148
+ catch { }
149
+ return {
150
+ strategy: "consult",
151
+ reason: `${choice.reason} [${lvl}]`,
152
+ instruction: `ESCALATE [${lvl}]. Reframing did not shift this either, so it is going to a stronger model` +
153
+ (model ? `: ${model}` : "") +
154
+ (thinkingHint ? ` (thinking: ${thinkingHint})` : "") +
155
+ `. Write down, precisely, what you have tried and what the failure actually says — ` +
156
+ `that hand-off is the whole value of the escalation.\n\nStill failing:\n${failureList}`,
157
+ model,
158
+ applied: model ? `consulting ${model} [${lvl}]` : `consult [${lvl}]`,
159
+ next: carry("consult", { consultedCount: state.consultedCount + 1 }),
160
+ };
161
+ }
162
+ case "rework": {
163
+ if (!task) {
164
+ return {
165
+ strategy: null,
166
+ reason: "rework was chosen but there is no actionable task to rework",
167
+ instruction: null,
168
+ model: null,
169
+ applied: null,
170
+ next: carry(null),
171
+ };
172
+ }
173
+ const applied = await applyRework(options, task, `stuck on ${phase}`);
174
+ if (applied.error) {
175
+ return {
176
+ strategy: null,
177
+ reason: `rework failed: ${applied.error}`,
178
+ instruction: null,
179
+ model: null,
180
+ applied: null,
181
+ next: carry(null),
182
+ };
183
+ }
184
+ return {
185
+ strategy: "rework",
186
+ reason: choice.reason,
187
+ instruction: reworkInstruction(task, applied.impacted, options.failures),
188
+ model: null,
189
+ applied: applied.detail,
190
+ next: carry("rework"),
191
+ };
192
+ }
193
+ case "replan":
194
+ return {
195
+ strategy: "replan",
196
+ reason: choice.reason,
197
+ instruction: `THE PLAN IS WRONG. Retrying, reframing and reworking have all failed, which points at ` +
198
+ `the plan rather than the work: something this needs was never planned. Call ` +
199
+ `\`infinity_replan\` to add the missing sprints, features or tasks — do not invent them ` +
200
+ `in code and leave the plan stale.\n\nStill failing:\n${failureList}`,
201
+ model: null,
202
+ applied: null,
203
+ next: carry("replan"),
204
+ };
205
+ case "master": {
206
+ const model = masterModel(targetDir);
207
+ return {
208
+ strategy: "master",
209
+ reason: choice.reason,
210
+ instruction: `LAST RESORT. Every other rung of the ladder is spent` +
211
+ (model ? `, so this goes to the master model: ${model}` : "") +
212
+ `. State the problem from scratch, as if to someone who has not seen any of the ` +
213
+ `previous attempts, and include what has already been ruled out.\n\n` +
214
+ `Still failing:\n${failureList}`,
215
+ model,
216
+ applied: model ? `escalated to master (${model})` : null,
217
+ next: carry("master", { masterUsed: true }),
218
+ };
219
+ }
220
+ default:
221
+ return {
222
+ strategy: null,
223
+ reason: choice.reason || "no strategy available",
224
+ instruction: null,
225
+ model: null,
226
+ applied: null,
227
+ next: carry(null),
228
+ };
229
+ }
230
+ }
231
+ /**
232
+ * The task the run is stuck on: whatever is in flight, else the first thing
233
+ * that is not finished. `rework` needs a specific origin to walk out from.
234
+ */
235
+ function currentTask(tasks) {
236
+ return (tasks.find((t) => t.status === "in_progress") ??
237
+ tasks.find((t) => t.status === "rework") ??
238
+ tasks.find((t) => t.status !== "complete") ??
239
+ null);
240
+ }
241
+ async function applyRework(options, task, reason) {
242
+ try {
243
+ const result = await startRework({
244
+ projectDir: options.targetDir,
245
+ featureId: task.featureId,
246
+ taskId: task.id,
247
+ key: task.key,
248
+ reason,
249
+ runId: options.runId,
250
+ });
251
+ const detail = `flipped ${task.compositeKey}` +
252
+ (result.impacted.length ? ` and ${result.impacted.length} dependent task(s)` : "") +
253
+ ` to rework (plan revision ${result.baseRevision})`;
254
+ return { impacted: result.impacted, detail };
255
+ }
256
+ catch (e) {
257
+ return { impacted: [], detail: null, error: message(e) };
258
+ }
259
+ }
260
+ function reworkInstruction(task, impacted, failures) {
261
+ const downstream = impacted.length
262
+ ? `Everything that depends on it went with it: ${impacted.join(", ")}. ` +
263
+ `They were built on the broken thing, so they are suspect until re-proved.`
264
+ : `Nothing depends on it, so this is contained.`;
265
+ return (`REWORK. This task has been flipped back to \`rework\` because the work built on it does not ` +
266
+ `hold up:\n ${task.compositeKey} — ${task.description}\n\n${downstream}\n\n` +
267
+ `Fix the root task first, then re-prove the rest. Failing checks:\n` +
268
+ (failures.length ? failures.map((f) => ` - ${f}`).join("\n") : " - (no detail)"));
269
+ }
270
+ function masterModel(targetDir) {
271
+ try {
272
+ const router = loadRouterConfig(targetDir);
273
+ const master = router.master;
274
+ return typeof master === "string" && master.trim() ? master.trim() : null;
275
+ }
276
+ catch {
277
+ return null;
278
+ }
279
+ }
280
+ function message(e) {
281
+ return e instanceof Error ? e.message : String(e);
282
+ }
283
+ /** A one-line summary for the widget, the log, and the human coming back. */
284
+ export function describeEscalation(e) {
285
+ if (!e.strategy)
286
+ return `no escalation available — ${e.reason}`;
287
+ return `${e.strategy}: ${e.reason}${e.applied ? ` (${e.applied})` : ""}`;
288
+ }
289
+ /** Where the run currently sits on the ladder, for the status surfaces. */
290
+ export function escalationSummary(targetDir) {
291
+ let reworks = 0;
292
+ let returnTo = null;
293
+ try {
294
+ const record = loadRework(targetDir);
295
+ if (record) {
296
+ returnTo = `${record.returnFeature}/${record.returnTask}`;
297
+ reworks = 1;
298
+ }
299
+ }
300
+ catch {
301
+ /* absent is not an error */
302
+ }
303
+ let replans = 0;
304
+ try {
305
+ replans = loadReplanHistory(targetDir).length;
306
+ }
307
+ catch {
308
+ /* absent is not an error */
309
+ }
310
+ return { reworks, replans, returnTo };
311
+ }
312
+ //# sourceMappingURL=escalate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escalate.js","sourceRoot":"","sources":["../../src/escalate.ts"],"names":[],"mappings":"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"}