@bluewombat/runtime 0.10.0 → 0.11.1

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 (160) hide show
  1. package/README.md +202 -94
  2. package/SPECS.md +151 -25
  3. package/dist/cli.js +95 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config/agent-shorthand.d.ts +3 -4
  6. package/dist/config/agent-shorthand.d.ts.map +1 -1
  7. package/dist/config/agent-shorthand.js +3 -4
  8. package/dist/config/agent-shorthand.js.map +1 -1
  9. package/dist/config/fixture-yaml.d.ts +8 -0
  10. package/dist/config/fixture-yaml.d.ts.map +1 -0
  11. package/dist/config/fixture-yaml.js +30 -0
  12. package/dist/config/fixture-yaml.js.map +1 -0
  13. package/dist/config/load-config.d.ts.map +1 -1
  14. package/dist/config/load-config.js +90 -102
  15. package/dist/config/load-config.js.map +1 -1
  16. package/dist/config/parse-args.d.ts.map +1 -1
  17. package/dist/config/parse-args.js +3 -4
  18. package/dist/config/parse-args.js.map +1 -1
  19. package/dist/config/types.d.ts +15 -16
  20. package/dist/config/types.d.ts.map +1 -1
  21. package/dist/config/types.js +1 -1
  22. package/dist/config/types.js.map +1 -1
  23. package/dist/index.d.ts +3 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/loop/authority.d.ts +2 -0
  28. package/dist/loop/authority.d.ts.map +1 -1
  29. package/dist/loop/authority.js +11 -1
  30. package/dist/loop/authority.js.map +1 -1
  31. package/dist/loop/deliveries.d.ts.map +1 -1
  32. package/dist/loop/deliveries.js +19 -0
  33. package/dist/loop/deliveries.js.map +1 -1
  34. package/dist/loop/features.d.ts +30 -0
  35. package/dist/loop/features.d.ts.map +1 -1
  36. package/dist/loop/features.js +195 -73
  37. package/dist/loop/features.js.map +1 -1
  38. package/dist/loop/journal.d.ts +7 -0
  39. package/dist/loop/journal.d.ts.map +1 -1
  40. package/dist/loop/journal.js +23 -1
  41. package/dist/loop/journal.js.map +1 -1
  42. package/dist/loop/lock.d.ts +2 -0
  43. package/dist/loop/lock.d.ts.map +1 -1
  44. package/dist/loop/lock.js +10 -0
  45. package/dist/loop/lock.js.map +1 -1
  46. package/dist/loop/open-host.d.ts +10 -0
  47. package/dist/loop/open-host.d.ts.map +1 -1
  48. package/dist/loop/open-host.js +8 -8
  49. package/dist/loop/open-host.js.map +1 -1
  50. package/dist/loop/run-slot.d.ts +14 -0
  51. package/dist/loop/run-slot.d.ts.map +1 -1
  52. package/dist/loop/run-slot.js +53 -5
  53. package/dist/loop/run-slot.js.map +1 -1
  54. package/dist/loop/streams.d.ts +3 -0
  55. package/dist/loop/streams.d.ts.map +1 -1
  56. package/dist/loop/streams.js +4 -3
  57. package/dist/loop/streams.js.map +1 -1
  58. package/dist/loop/tick.d.ts +3 -0
  59. package/dist/loop/tick.d.ts.map +1 -1
  60. package/dist/loop/tick.js +2 -1
  61. package/dist/loop/tick.js.map +1 -1
  62. package/dist/loop/trace.d.ts +1 -0
  63. package/dist/loop/trace.d.ts.map +1 -1
  64. package/dist/loop/trace.js +1 -1
  65. package/dist/loop/trace.js.map +1 -1
  66. package/dist/loop/transformers.d.ts +4 -4
  67. package/dist/loop/transformers.d.ts.map +1 -1
  68. package/dist/loop/transformers.js +16 -25
  69. package/dist/loop/transformers.js.map +1 -1
  70. package/dist/operator/board.d.ts +43 -4
  71. package/dist/operator/board.d.ts.map +1 -1
  72. package/dist/operator/board.js +153 -10
  73. package/dist/operator/board.js.map +1 -1
  74. package/dist/operator/dash-model.d.ts +65 -0
  75. package/dist/operator/dash-model.d.ts.map +1 -0
  76. package/dist/operator/dash-model.js +209 -0
  77. package/dist/operator/dash-model.js.map +1 -0
  78. package/dist/operator/dash-view.d.ts +16 -0
  79. package/dist/operator/dash-view.d.ts.map +1 -0
  80. package/dist/operator/dash-view.js +226 -0
  81. package/dist/operator/dash-view.js.map +1 -0
  82. package/dist/operator/dash.d.ts +34 -0
  83. package/dist/operator/dash.d.ts.map +1 -0
  84. package/dist/operator/dash.js +141 -0
  85. package/dist/operator/dash.js.map +1 -0
  86. package/dist/operator/doctor.d.ts.map +1 -1
  87. package/dist/operator/doctor.js +48 -8
  88. package/dist/operator/doctor.js.map +1 -1
  89. package/dist/operator/explain.d.ts.map +1 -1
  90. package/dist/operator/explain.js +6 -11
  91. package/dist/operator/explain.js.map +1 -1
  92. package/dist/operator/incident-dossier.d.ts +154 -0
  93. package/dist/operator/incident-dossier.d.ts.map +1 -0
  94. package/dist/operator/incident-dossier.js +692 -0
  95. package/dist/operator/incident-dossier.js.map +1 -0
  96. package/dist/operator/incident-system.d.ts +57 -0
  97. package/dist/operator/incident-system.d.ts.map +1 -0
  98. package/dist/operator/incident-system.js +214 -0
  99. package/dist/operator/incident-system.js.map +1 -0
  100. package/dist/operator/incident.d.ts +27 -0
  101. package/dist/operator/incident.d.ts.map +1 -0
  102. package/dist/operator/incident.js +220 -0
  103. package/dist/operator/incident.js.map +1 -0
  104. package/dist/operator/init.js +24 -24
  105. package/dist/operator/init.js.map +1 -1
  106. package/dist/operator/install.d.ts +9 -0
  107. package/dist/operator/install.d.ts.map +1 -0
  108. package/dist/operator/install.js +14 -0
  109. package/dist/operator/install.js.map +1 -0
  110. package/dist/operator/live.js +4 -4
  111. package/dist/operator/live.js.map +1 -1
  112. package/dist/operator/log.d.ts +2 -0
  113. package/dist/operator/log.d.ts.map +1 -1
  114. package/dist/operator/log.js +2 -5
  115. package/dist/operator/log.js.map +1 -1
  116. package/dist/operator/restart.d.ts +20 -0
  117. package/dist/operator/restart.d.ts.map +1 -0
  118. package/dist/operator/restart.js +63 -0
  119. package/dist/operator/restart.js.map +1 -0
  120. package/dist/operator/supervise/act.d.ts +37 -0
  121. package/dist/operator/supervise/act.d.ts.map +1 -0
  122. package/dist/operator/supervise/act.js +354 -0
  123. package/dist/operator/supervise/act.js.map +1 -0
  124. package/dist/operator/supervise/config.d.ts +74 -0
  125. package/dist/operator/supervise/config.d.ts.map +1 -0
  126. package/dist/operator/supervise/config.js +175 -0
  127. package/dist/operator/supervise/config.js.map +1 -0
  128. package/dist/operator/supervise/council.d.ts +45 -0
  129. package/dist/operator/supervise/council.d.ts.map +1 -0
  130. package/dist/operator/supervise/council.js +97 -0
  131. package/dist/operator/supervise/council.js.map +1 -0
  132. package/dist/operator/supervise/decision.d.ts +46 -0
  133. package/dist/operator/supervise/decision.d.ts.map +1 -0
  134. package/dist/operator/supervise/decision.js +137 -0
  135. package/dist/operator/supervise/decision.js.map +1 -0
  136. package/dist/operator/supervise/exec.d.ts +28 -0
  137. package/dist/operator/supervise/exec.d.ts.map +1 -0
  138. package/dist/operator/supervise/exec.js +47 -0
  139. package/dist/operator/supervise/exec.js.map +1 -0
  140. package/dist/operator/supervise/memory.d.ts +33 -0
  141. package/dist/operator/supervise/memory.d.ts.map +1 -0
  142. package/dist/operator/supervise/memory.js +73 -0
  143. package/dist/operator/supervise/memory.js.map +1 -0
  144. package/dist/operator/supervise/observe.d.ts +47 -0
  145. package/dist/operator/supervise/observe.d.ts.map +1 -0
  146. package/dist/operator/supervise/observe.js +73 -0
  147. package/dist/operator/supervise/observe.js.map +1 -0
  148. package/dist/operator/supervise/prompts.d.ts +60 -0
  149. package/dist/operator/supervise/prompts.d.ts.map +1 -0
  150. package/dist/operator/supervise/prompts.js +338 -0
  151. package/dist/operator/supervise/prompts.js.map +1 -0
  152. package/dist/operator/supervise/review.d.ts +24 -0
  153. package/dist/operator/supervise/review.d.ts.map +1 -0
  154. package/dist/operator/supervise/review.js +51 -0
  155. package/dist/operator/supervise/review.js.map +1 -0
  156. package/dist/operator/supervise/supervise.d.ts +26 -0
  157. package/dist/operator/supervise/supervise.d.ts.map +1 -0
  158. package/dist/operator/supervise/supervise.js +484 -0
  159. package/dist/operator/supervise/supervise.js.map +1 -0
  160. package/package.json +14 -14
@@ -0,0 +1,354 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { PRODUCT } from "@bluewombat/manager-kit";
4
+ import { runAgent } from "./council.js";
5
+ import { fill, succeeded, tail } from "./exec.js";
6
+ import { fixerPrompt, proposalReviewerPrompt, reviewerPrompt } from "./prompts.js";
7
+ import { parseVerdict } from "./review.js";
8
+ /** A fix that is offered and folded within this long, or it is reported as not folded. */
9
+ const FOLD_WAIT_MS = 60 * 60_000;
10
+ const FOLD_POLL_MS = 20_000;
11
+ /** Rounds the agent gets to make its change pass the checks. */
12
+ const FIX_ROUNDS = 3;
13
+ /** The guard gets the diff in its prompt up to this long; beyond, it reads the tree. */
14
+ const DIFF_CHARS = 60_000;
15
+ /**
16
+ * Do what the arbiter decided.
17
+ *
18
+ * The order is the arbiter's: when the same stop would come straight back
19
+ * without the fixes, they land first and the run is unblocked after; a fix
20
+ * that did not land holds the unblock back. Otherwise the run moves first and
21
+ * the fixes follow while it works. Nothing here chooses: it carries out.
22
+ */
23
+ export async function carryOut(decision, context) {
24
+ const outcomes = [];
25
+ const fix = async () => {
26
+ let landed = true;
27
+ for (const item of decision.fixes) {
28
+ const outcome = await landFix(item, decision, context);
29
+ outcomes.push(outcome);
30
+ landed &&= outcome.ok && outcome.pending !== true;
31
+ }
32
+ return landed;
33
+ };
34
+ const unblock = async () => {
35
+ for (const item of decision.unblock) {
36
+ outcomes.push(await unblockOne(item, context));
37
+ }
38
+ };
39
+ if (decision.unblockAfterFixes) {
40
+ if (await fix()) {
41
+ await unblock();
42
+ }
43
+ else {
44
+ outcomes.push({
45
+ what: "unblock",
46
+ ok: false,
47
+ detail: outcomes.some((o) => o.pending === true)
48
+ ? "held: the fixes wait for a person to fold them, and without them the same stop comes back"
49
+ : "held: the fixes did not land, and without them the same stop comes back",
50
+ });
51
+ }
52
+ }
53
+ else {
54
+ await unblock();
55
+ await fix();
56
+ }
57
+ return outcomes;
58
+ }
59
+ async function unblockOne(item, context) {
60
+ const what = `${item.do}${item.key === undefined ? "" : ` ${item.key}`}`;
61
+ const { config, exec, hands } = context;
62
+ switch (item.do) {
63
+ case "restart":
64
+ return await hands.restart(item.key ?? "");
65
+ case "cancel":
66
+ return await hands.cancel(item.key ?? "");
67
+ case "start-worker":
68
+ return await hands.startWorker();
69
+ case "restart-worker":
70
+ return await hands.restartWorker();
71
+ case "resume": {
72
+ if (config.resume === undefined) {
73
+ return { what, ok: false, detail: "no `resume` command in the supervisor config" };
74
+ }
75
+ const key = item.key ?? "";
76
+ const number = /#(\d+)$/.exec(key)?.[1] ?? key;
77
+ const result = await exec(fill(config.resume.cmd, { key, number }), {
78
+ timeoutMs: config.resume.timeoutMs,
79
+ });
80
+ return {
81
+ what,
82
+ ok: succeeded(result),
83
+ detail: succeeded(result) ? "signalled" : tail(result),
84
+ };
85
+ }
86
+ case "cleanup-disk": {
87
+ for (const step of config.diskCleanup) {
88
+ const result = await exec(step.cmd, { timeoutMs: step.timeoutMs });
89
+ if (!succeeded(result)) {
90
+ return { what, ok: false, detail: `${step.cmd.join(" ")}: ${tail(result)}` };
91
+ }
92
+ }
93
+ return {
94
+ what,
95
+ ok: config.diskCleanup.length > 0,
96
+ detail: config.diskCleanup.length > 0 ? "cleaned" : "no `diskCleanup` in the supervisor config",
97
+ };
98
+ }
99
+ }
100
+ }
101
+ /** Change a repository, offer the change, see it folded, run what follows. */
102
+ async function landFix(fix, decision, context) {
103
+ const what = `fix ${fix.target}: ${fix.title}`;
104
+ if (fix.revises !== undefined) {
105
+ return {
106
+ what,
107
+ ok: false,
108
+ detail: `not made: it would revise ${fix.revises}. That is for a person to decide`,
109
+ };
110
+ }
111
+ const target = context.config.targets.find((t) => t.name === fix.target);
112
+ if (target === undefined) {
113
+ return { what, ok: false, detail: `no target "${fix.target}" in the supervisor config` };
114
+ }
115
+ const stamp = (context.now ?? (() => new Date()))().toISOString().replace(/\D/g, "").slice(0, 14);
116
+ const slug = fix.title
117
+ .toLowerCase()
118
+ .replace(/[^a-z0-9]+/g, "-")
119
+ .replace(/^-|-$/g, "")
120
+ .slice(0, 40);
121
+ const branch = `supervisor/${stamp}-${slug}`;
122
+ const tree = join(context.config.dir, "work", `${stamp}-${slug}`);
123
+ const git = (args, cwd, timeoutMs = 5 * 60_000) => context.exec(["git", ...args], { cwd, timeoutMs });
124
+ const say = context.log ?? (() => { });
125
+ const fetched = await git(["fetch", target.remote, target.base], target.repo);
126
+ if (!succeeded(fetched)) {
127
+ return { what, ok: false, detail: `fetch: ${tail(fetched)}` };
128
+ }
129
+ mkdirSync(join(context.config.dir, "work"), { recursive: true });
130
+ const added = await git(["worktree", "add", "-b", branch, tree, `${target.remote}/${target.base}`], target.repo);
131
+ if (!succeeded(added)) {
132
+ return { what, ok: false, detail: `worktree: ${tail(added)}` };
133
+ }
134
+ try {
135
+ const made = await makeChange(fix, decision, target, tree, branch, context, git);
136
+ if (!made.ok) {
137
+ return { what, ...made };
138
+ }
139
+ say(`fix ${branch}: checks pass, offering`);
140
+ const body = join(context.dir, `${slug}.pr.md`);
141
+ writeFileSync(body, `${decision.summary}\n\n## Cause\n${decision.cause}\n\n## Evidence\n${decision.evidence.map((e) => `- ${e}`).join("\n")}\n\n## Guard\nApproved by an agent that did not see the stop. It checked:\n${made.checked.map((e) => `- ${e}`).join("\n")}\n\nMade by the ${PRODUCT} supervisor from incident ${context.dir}.\n`);
142
+ const pushed = await git(["push", "-u", target.remote, branch], tree);
143
+ if (!succeeded(pushed)) {
144
+ return { what, ok: false, detail: `push: ${tail(pushed)}` };
145
+ }
146
+ const vars = { branch, title: fix.title, bodyFile: body };
147
+ const opened = await context.exec(fill(target.open.cmd, vars), {
148
+ cwd: tree,
149
+ timeoutMs: target.open.timeoutMs,
150
+ });
151
+ if (!succeeded(opened)) {
152
+ return { what, ok: false, detail: `open: ${tail(opened)}` };
153
+ }
154
+ const pr = opened.stdout.trim().split("\n").pop()?.trim() ?? "";
155
+ if (!target.autoMerge) {
156
+ return {
157
+ what,
158
+ ok: true,
159
+ pending: true,
160
+ detail: `${pr} offered, waiting for a person to fold it`,
161
+ };
162
+ }
163
+ const merging = await context.exec(fill(target.merge.cmd, { ...vars, pr }), {
164
+ cwd: tree,
165
+ timeoutMs: target.merge.timeoutMs,
166
+ });
167
+ if (!succeeded(merging)) {
168
+ return { what, ok: false, detail: `merge ${pr}: ${tail(merging)}` };
169
+ }
170
+ const folded = await waitFolded(target, pr, tree, context);
171
+ if (!folded) {
172
+ return {
173
+ what,
174
+ ok: false,
175
+ detail: `${pr} was offered but is not folded after ${FOLD_WAIT_MS / 60_000} min`,
176
+ };
177
+ }
178
+ for (const step of target.after) {
179
+ const result = await context.exec(fill(step.cmd, vars), {
180
+ cwd: target.repo,
181
+ timeoutMs: step.timeoutMs,
182
+ });
183
+ if (!succeeded(result)) {
184
+ return {
185
+ what,
186
+ ok: false,
187
+ detail: `${pr} folded, then \`${step.cmd.join(" ")}\` failed: ${tail(result)}`,
188
+ };
189
+ }
190
+ }
191
+ return { what, ok: true, detail: `${pr} folded` };
192
+ }
193
+ finally {
194
+ await git(["worktree", "remove", "--force", tree], target.repo);
195
+ }
196
+ }
197
+ async function makeChange(fix, decision, target, tree, branch, context, git) {
198
+ const proposal = await askGuard(proposalReviewerPrompt({
199
+ target: target.name,
200
+ title: fix.title,
201
+ instruction: fix.instruction,
202
+ conformity: fix.conformity,
203
+ rules: target.rules,
204
+ }), "proposal", tree, context, true);
205
+ if (proposal.kind === "unavailable") {
206
+ return { ok: false, detail: `the guard could not judge the proposal: ${proposal.reason}` };
207
+ }
208
+ if (proposal.kind === "reject") {
209
+ return {
210
+ ok: false,
211
+ detail: `the guard refused the proposal before it was written:\n${proposal.reasons.map((r) => `- ${r}`).join("\n")}`,
212
+ };
213
+ }
214
+ let failure;
215
+ let lastPoints = [];
216
+ for (let round = 1; round <= FIX_ROUNDS; round++) {
217
+ const agent = await runAgent({
218
+ config: context.config,
219
+ exec: context.exec,
220
+ role: "fixer",
221
+ prompt: fixerPrompt({
222
+ target: target.name,
223
+ title: fix.title,
224
+ instruction: fix.instruction,
225
+ conformity: fix.conformity,
226
+ deferred: proposal.deferred,
227
+ cause: decision.cause,
228
+ evidence: decision.evidence,
229
+ deny: target.deny,
230
+ checks: target.checks.map((check) => check.cmd.join(" ")),
231
+ ...(failure === undefined ? {} : { failure }),
232
+ }),
233
+ dir: join(context.dir, `fix-${round}`),
234
+ cwd: tree,
235
+ addDirs: [],
236
+ });
237
+ if (!agent.ok) {
238
+ failure = `The agent itself failed: ${agent.text.slice(0, 1500)}`;
239
+ continue;
240
+ }
241
+ const status = await git(["status", "--porcelain"], tree);
242
+ const changed = status.stdout
243
+ .split("\n")
244
+ .filter((line) => line.length > 3)
245
+ .map((line) => line.slice(3).replace(/^"|"$/g, ""));
246
+ if (changed.length === 0) {
247
+ failure =
248
+ "You changed nothing. If the cause is not what was described, change what is actually wrong.";
249
+ continue;
250
+ }
251
+ const denied = changed.filter((path) => target.deny.some((prefix) => path.startsWith(prefix)));
252
+ if (denied.length > 0) {
253
+ failure = `You touched paths you may not: ${denied.join(", ")}. Revert them.`;
254
+ continue;
255
+ }
256
+ failure = undefined;
257
+ for (const check of target.checks) {
258
+ const result = await context.exec(check.cmd, { cwd: tree, timeoutMs: check.timeoutMs });
259
+ if (!succeeded(result)) {
260
+ failure = `\`${check.cmd.join(" ")}\` failed:\n${tail(result)}`;
261
+ break;
262
+ }
263
+ }
264
+ if (failure === undefined) {
265
+ const staged = await git(["add", "-A"], tree);
266
+ if (!succeeded(staged)) {
267
+ return { ok: false, detail: `add: ${tail(staged)}` };
268
+ }
269
+ const guard = await review(fix, target, tree, context, git);
270
+ if (guard.kind === "unavailable") {
271
+ return { ok: false, detail: `the guard could not give a verdict: ${guard.reason}` };
272
+ }
273
+ if (guard.kind === "reject") {
274
+ const again = guard.points.filter((point) => lastPoints.includes(point));
275
+ if (again.length > 0) {
276
+ return {
277
+ ok: false,
278
+ detail: `stopped: the guard rejected point ${[...new Set(again)].join(", ")} twice in a row, so another round would repeat it. A person decides:\n${guard.reasons.map((r) => `- ${r}`).join("\n")}`,
279
+ };
280
+ }
281
+ lastPoints = guard.points;
282
+ failure = `The guard rejected the change:\n${guard.reasons.map((r) => `- ${r}`).join("\n")}`;
283
+ continue;
284
+ }
285
+ const done = await git(["commit", "-m", `${fix.title}\n\nMade by the ${PRODUCT} supervisor (${branch}).`], tree);
286
+ return succeeded(done)
287
+ ? { ok: true, checked: guard.checked }
288
+ : { ok: false, detail: `commit: ${tail(done)}` };
289
+ }
290
+ }
291
+ return { ok: false, detail: `no passing change after ${FIX_ROUNDS} rounds: ${failure ?? ""}` };
292
+ }
293
+ /** The guard reads the change and the repository, not the stop. Asked twice if it answers badly. */
294
+ async function review(fix, target, tree, context, git) {
295
+ const files = (await git(["diff", "--cached", "--name-only"], tree)).stdout
296
+ .split("\n")
297
+ .filter((line) => line.length > 0);
298
+ const full = (await git(["diff", "--cached"], tree)).stdout;
299
+ const diff = full.length > DIFF_CHARS
300
+ ? `${full.slice(0, DIFF_CHARS)}\n[diff cut: read the rest in the tree]`
301
+ : full;
302
+ return await askGuard(reviewerPrompt({
303
+ target: target.name,
304
+ title: fix.title,
305
+ files,
306
+ diff,
307
+ checks: target.checks.map((check) => check.cmd.join(" ")),
308
+ }), "review", tree, context);
309
+ }
310
+ /** Ask the guard once, again if it answers badly. `label` names the folder its files go to. */
311
+ async function askGuard(prompt, label, tree, context, proposal = false) {
312
+ let reason = "";
313
+ for (let attempt = 1; attempt <= 2; attempt++) {
314
+ const answer = await runAgent({
315
+ config: context.config,
316
+ exec: context.exec,
317
+ role: "reviewer",
318
+ prompt: attempt === 1
319
+ ? prompt
320
+ : `${prompt}\n\nYour previous answer was refused: ${reason}. Answer again.`,
321
+ dir: join(context.dir, `${label}-${attempt}`),
322
+ cwd: tree,
323
+ addDirs: [],
324
+ });
325
+ if (!answer.ok) {
326
+ reason = `the agent failed: ${answer.text.slice(0, 500)}`;
327
+ continue;
328
+ }
329
+ const verdict = parseVerdict(answer.text, { proposal });
330
+ if (!verdict.ok) {
331
+ reason = verdict.reason;
332
+ continue;
333
+ }
334
+ return verdict.approve
335
+ ? { kind: "approve", checked: verdict.checked, deferred: verdict.deferred }
336
+ : { kind: "reject", reasons: verdict.reasons, points: verdict.points };
337
+ }
338
+ return { kind: "unavailable", reason };
339
+ }
340
+ async function waitFolded(target, pr, cwd, context) {
341
+ const sleep = context.sleep ?? ((ms) => new Promise((done) => setTimeout(done, ms)));
342
+ for (let waited = 0; waited <= FOLD_WAIT_MS; waited += FOLD_POLL_MS) {
343
+ const result = await context.exec(fill(target.merged.cmd, { pr }), {
344
+ cwd,
345
+ timeoutMs: target.merged.timeoutMs,
346
+ });
347
+ if (succeeded(result)) {
348
+ return true;
349
+ }
350
+ await sleep(FOLD_POLL_MS);
351
+ }
352
+ return false;
353
+ }
354
+ //# sourceMappingURL=act.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"act.js","sourceRoot":"","sources":["../../../src/operator/supervise/act.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ export declare const SUPERVISOR_FILENAME = "mason.supervisor.yaml";
2
+ /** A command with a ceiling. `{name}` in a word is filled by the supervisor. */
3
+ export type CommandSpec = {
4
+ cmd: string[];
5
+ timeoutMs: number;
6
+ };
7
+ /** A repository the supervisor may change, and how a change reaches its line. */
8
+ export type FixTarget = {
9
+ name: string;
10
+ /** A checkout of the repository. The supervisor never edits it: it works in its own worktrees. */
11
+ repo: string;
12
+ base: string;
13
+ remote: string;
14
+ /** Run in the worktree after the agent. A change that does not pass is not offered. */
15
+ checks: CommandSpec[];
16
+ /** Offer the branch. Receives `{branch}` `{title}` `{bodyFile}`. Prints the pull request's reference. */
17
+ open: CommandSpec;
18
+ /**
19
+ * Fold the offer without a person. Off unless the Project turns it on: by default the offer waits
20
+ * for a person to read and merge it, and nothing that depends on it moves until then.
21
+ */
22
+ autoMerge: boolean;
23
+ /** Fold the offer. Receives `{pr}`. Used only when `autoMerge` is on. */
24
+ merge: CommandSpec;
25
+ /** Whether the offer is folded yet. Receives `{pr}`. Exit 0 means folded. */
26
+ merged: CommandSpec;
27
+ /** After the fold: release, upgrade, restart. Receives `{branch}` `{title}`. */
28
+ after: CommandSpec[];
29
+ /** Paths the agent's change may not touch (prefixes). */
30
+ deny: string[];
31
+ /**
32
+ * Where the repository writes down what it must be: the rules every member reads before it reasons
33
+ * about a change, relative to `repo`. The first one is expected to route to the others.
34
+ */
35
+ rules: string[];
36
+ };
37
+ export type SupervisorConfig = {
38
+ configDir: string;
39
+ /** Where the supervisor keeps its own files, under Host's home. */
40
+ dir: string;
41
+ pollIntervalMs: number;
42
+ /** Journal silent this long with work active is a stall. */
43
+ stallAfterMs: number;
44
+ /** An escalation younger than this is left to a person who may already be on it. 0: act at once. */
45
+ settleMs: number;
46
+ /** After acting, the same finding seen again is left this long to take effect. */
47
+ cooldownMs: number;
48
+ diskMinBytes: number;
49
+ /** Attempts per finding before it is handed to a person. */
50
+ maxAttempts: number;
51
+ /** An agent per role. `{promptFile}` and `{prompt}` are filled. */
52
+ agents: Record<string, CommandSpec>;
53
+ worker: {
54
+ start?: CommandSpec;
55
+ };
56
+ /** Takes a resume signal to the tracker. Receives `{key}` `{number}`. */
57
+ resume?: CommandSpec;
58
+ diskCleanup: CommandSpec[];
59
+ /** Tell a person. Receives `{subject}` `{file}`. Optional: the page is written either way. */
60
+ notify?: CommandSpec;
61
+ targets: FixTarget[];
62
+ };
63
+ export declare const ROLES: readonly ["rootcause", "remedy", "skeptic", "arbiter", "reformatter", "fixer", "reviewer"];
64
+ export type Role = (typeof ROLES)[number];
65
+ export type LoadedConfig = {
66
+ ok: true;
67
+ config: SupervisorConfig;
68
+ } | {
69
+ ok: false;
70
+ reason: string;
71
+ };
72
+ export declare function findSupervisorConfig(from: string): string | undefined;
73
+ export declare function loadSupervisorConfig(path: string, home: string): LoadedConfig;
74
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/operator/supervise/config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,0BAA+B,CAAC;AAEhE,gFAAgF;AAChF,MAAM,MAAM,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,iFAAiF;AACjF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,kGAAkG;IAClG,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,yGAAyG;IACzG,IAAI,EAAE,WAAW,CAAC;IAClB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,KAAK,EAAE,WAAW,CAAC;IACnB,6EAA6E;IAC7E,MAAM,EAAE,WAAW,CAAC;IACpB,gFAAgF;IAChF,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,yDAAyD;IACzD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;OAGG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,oGAAoG;IACpG,QAAQ,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC;IAChC,yEAAyE;IACzE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,8FAA8F;IAC9F,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,KAAK,4FAQR,CAAC;AACX,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1C,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAgBlG,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAarE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAiB7E"}
@@ -0,0 +1,175 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { PRODUCT } from "@bluewombat/manager-kit";
4
+ import { parse as parseYaml } from "yaml";
5
+ export const SUPERVISOR_FILENAME = `${PRODUCT}.supervisor.yaml`;
6
+ export const ROLES = [
7
+ "rootcause",
8
+ "remedy",
9
+ "skeptic",
10
+ "arbiter",
11
+ "reformatter",
12
+ "fixer",
13
+ "reviewer",
14
+ ];
15
+ const DEFAULT_AGENT_MS = 20 * 60_000;
16
+ /**
17
+ * Claude Code, headless. The analysts read and do not write; the fixer works in
18
+ * a worktree of its own and may. The prompt comes before `--add-dir`, which takes
19
+ * every value after it and would swallow the prompt as a directory.
20
+ */
21
+ function claude(mode, model) {
22
+ return {
23
+ cmd: ["claude", "-p", "{prompt}", "--model", model, "--permission-mode", mode, "{addDirArgs}"],
24
+ timeoutMs: DEFAULT_AGENT_MS,
25
+ };
26
+ }
27
+ export function findSupervisorConfig(from) {
28
+ let dir = resolve(from);
29
+ for (;;) {
30
+ const candidate = join(dir, SUPERVISOR_FILENAME);
31
+ if (existsSync(candidate)) {
32
+ return candidate;
33
+ }
34
+ const parent = dirname(dir);
35
+ if (parent === dir) {
36
+ return undefined;
37
+ }
38
+ dir = parent;
39
+ }
40
+ }
41
+ export function loadSupervisorConfig(path, home) {
42
+ let raw;
43
+ try {
44
+ raw = parseYaml(readFileSync(path, "utf8"));
45
+ }
46
+ catch (error) {
47
+ return { ok: false, reason: `${path}: ${error instanceof Error ? error.message : error}` };
48
+ }
49
+ const object = (raw ?? {});
50
+ if (typeof object !== "object" || Array.isArray(object)) {
51
+ return { ok: false, reason: `${path} must be a YAML mapping.` };
52
+ }
53
+ const configDir = dirname(path);
54
+ try {
55
+ return { ok: true, config: build(object, configDir, home) };
56
+ }
57
+ catch (error) {
58
+ return { ok: false, reason: `${path}: ${error instanceof Error ? error.message : error}` };
59
+ }
60
+ }
61
+ function build(o, configDir, home) {
62
+ const agents = {
63
+ rootcause: claude("plan", "opus"),
64
+ remedy: claude("plan", "opus"),
65
+ skeptic: claude("plan", "opus"),
66
+ arbiter: claude("plan", "opus"),
67
+ reformatter: claude("plan", "haiku"),
68
+ fixer: claude("bypassPermissions", "opus"),
69
+ reviewer: claude("plan", "opus"),
70
+ };
71
+ for (const [role, value] of Object.entries(map(o.agents, "agents"))) {
72
+ if (!ROLES.includes(role)) {
73
+ throw new Error(`agents.${role}: no such role (${ROLES.join(", ")}).`);
74
+ }
75
+ agents[role] = command(value, `agents.${role}`, DEFAULT_AGENT_MS);
76
+ }
77
+ const worker = map(o.worker, "worker");
78
+ const targets = Object.entries(map(o.targets, "targets")).map(([name, value]) => target(name, map(value, `targets.${name}`), configDir));
79
+ return {
80
+ configDir,
81
+ dir: resolve(configDir, text(o.dir) ?? join(home, "supervisor")),
82
+ pollIntervalMs: num(o.pollIntervalMs, "pollIntervalMs", 15_000),
83
+ stallAfterMs: num(o.stallAfterMs, "stallAfterMs", 20 * 60_000),
84
+ settleMs: num(o.settleMs, "settleMs", 0),
85
+ cooldownMs: num(o.cooldownMs, "cooldownMs", 5 * 60_000),
86
+ diskMinBytes: num(o.diskMinBytes, "diskMinBytes", 3 * 1024 ** 3),
87
+ maxAttempts: num(o.maxAttempts, "maxAttempts", 3),
88
+ agents,
89
+ worker: worker.start === undefined ? {} : { start: command(worker.start, "worker.start", 30_000) },
90
+ ...(o.resume === undefined ? {} : { resume: command(o.resume, "resume", 60_000) }),
91
+ diskCleanup: list(o.diskCleanup, "diskCleanup").map((c, i) => command(c, `diskCleanup[${i}]`, 10 * 60_000)),
92
+ ...(o.notify === undefined ? {} : { notify: command(o.notify, "notify", 60_000) }),
93
+ targets,
94
+ };
95
+ }
96
+ function target(name, o, configDir) {
97
+ const where = `targets.${name}`;
98
+ const repo = text(o.repo);
99
+ if (repo === undefined) {
100
+ throw new Error(`${where}.repo is required.`);
101
+ }
102
+ return {
103
+ name,
104
+ repo: resolve(configDir, repo),
105
+ base: text(o.base) ?? "main",
106
+ remote: text(o.remote) ?? "origin",
107
+ checks: list(o.checks, `${where}.checks`).map((c, i) => command(c, `${where}.checks[${i}]`, 30 * 60_000)),
108
+ open: command(o.open ?? {
109
+ cmd: [
110
+ "gh",
111
+ "pr",
112
+ "create",
113
+ "--head",
114
+ "{branch}",
115
+ "--title",
116
+ "{title}",
117
+ "--body-file",
118
+ "{bodyFile}",
119
+ ],
120
+ }, `${where}.open`, 120_000),
121
+ autoMerge: o.autoMerge === true,
122
+ merge: command(o.merge ?? { cmd: ["gh", "pr", "merge", "{pr}", "--squash", "--auto"] }, `${where}.merge`, 120_000),
123
+ merged: command(o.merged ?? {
124
+ cmd: [
125
+ "sh",
126
+ "-c",
127
+ 'test "$(gh pr view "$1" --json state -q .state)" = MERGED',
128
+ "sh",
129
+ "{pr}",
130
+ ],
131
+ }, `${where}.merged`, 60_000),
132
+ after: list(o.after, `${where}.after`).map((c, i) => command(c, `${where}.after[${i}]`, 30 * 60_000)),
133
+ deny: list(o.deny, `${where}.deny`).map((d) => String(d)),
134
+ rules: o.rules === undefined ? ["AGENTS.md"] : list(o.rules, `${where}.rules`).map(String),
135
+ };
136
+ }
137
+ function command(value, where, fallbackMs) {
138
+ const o = Array.isArray(value) ? { cmd: value } : map(value, where);
139
+ const cmd = o.cmd;
140
+ if (!Array.isArray(cmd) || cmd.length === 0 || cmd.some((w) => typeof w !== "string")) {
141
+ throw new Error(`${where}.cmd must be a non-empty list of strings.`);
142
+ }
143
+ return { cmd: cmd, timeoutMs: num(o.timeoutMs, `${where}.timeoutMs`, fallbackMs) };
144
+ }
145
+ function map(value, where) {
146
+ if (value === undefined || value === null) {
147
+ return {};
148
+ }
149
+ if (typeof value !== "object" || Array.isArray(value)) {
150
+ throw new Error(`${where} must be a mapping.`);
151
+ }
152
+ return value;
153
+ }
154
+ function list(value, where) {
155
+ if (value === undefined || value === null) {
156
+ return [];
157
+ }
158
+ if (!Array.isArray(value)) {
159
+ throw new Error(`${where} must be a list.`);
160
+ }
161
+ return value;
162
+ }
163
+ function text(value) {
164
+ return typeof value === "string" && value.length > 0 ? value : undefined;
165
+ }
166
+ function num(value, where, fallback) {
167
+ if (value === undefined) {
168
+ return fallback;
169
+ }
170
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
171
+ throw new Error(`${where} must be a number of zero or more.`);
172
+ }
173
+ return value;
174
+ }
175
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/operator/supervise/config.ts"],"names":[],"mappings":"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"}