@mobrienv/autoloop-harness 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/artifacts.d.ts +50 -0
  2. package/dist/artifacts.js +333 -0
  3. package/dist/artifacts.js.map +1 -0
  4. package/dist/config-helpers.d.ts +36 -0
  5. package/dist/config-helpers.js +427 -0
  6. package/dist/config-helpers.js.map +1 -0
  7. package/dist/coordination.d.ts +1 -0
  8. package/dist/coordination.js +126 -0
  9. package/dist/coordination.js.map +1 -0
  10. package/dist/display.d.ts +21 -0
  11. package/dist/display.js +177 -0
  12. package/dist/display.js.map +1 -0
  13. package/dist/emit.d.ts +21 -0
  14. package/dist/emit.js +243 -0
  15. package/dist/emit.js.map +1 -0
  16. package/dist/events.d.ts +56 -0
  17. package/dist/events.js +9 -0
  18. package/dist/events.js.map +1 -0
  19. package/dist/index.d.ts +6 -0
  20. package/dist/index.js +272 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/iteration.d.ts +16 -0
  23. package/dist/iteration.js +153 -0
  24. package/dist/iteration.js.map +1 -0
  25. package/dist/metareview.d.ts +6 -0
  26. package/dist/metareview.js +104 -0
  27. package/dist/metareview.js.map +1 -0
  28. package/dist/metrics.d.ts +12 -0
  29. package/dist/metrics.js +177 -0
  30. package/dist/metrics.js.map +1 -0
  31. package/dist/parallel.d.ts +37 -0
  32. package/dist/parallel.js +242 -0
  33. package/dist/parallel.js.map +1 -0
  34. package/dist/pi-adapter.d.ts +1 -0
  35. package/dist/pi-adapter.js +220 -0
  36. package/dist/pi-adapter.js.map +1 -0
  37. package/dist/prompt.d.ts +46 -0
  38. package/dist/prompt.js +446 -0
  39. package/dist/prompt.js.map +1 -0
  40. package/dist/registry-bridge.d.ts +7 -0
  41. package/dist/registry-bridge.js +63 -0
  42. package/dist/registry-bridge.js.map +1 -0
  43. package/dist/scratchpad.d.ts +2 -0
  44. package/dist/scratchpad.js +65 -0
  45. package/dist/scratchpad.js.map +1 -0
  46. package/dist/stop.d.ts +5 -0
  47. package/dist/stop.js +81 -0
  48. package/dist/stop.js.map +1 -0
  49. package/dist/tools.d.ts +3 -0
  50. package/dist/tools.js +65 -0
  51. package/dist/tools.js.map +1 -0
  52. package/dist/types.d.ts +137 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/wave/finalize-wave.d.ts +9 -0
  56. package/dist/wave/finalize-wave.js +86 -0
  57. package/dist/wave/finalize-wave.js.map +1 -0
  58. package/dist/wave/launch-branches.d.ts +6 -0
  59. package/dist/wave/launch-branches.js +313 -0
  60. package/dist/wave/launch-branches.js.map +1 -0
  61. package/dist/wave/parse-objectives.d.ts +3 -0
  62. package/dist/wave/parse-objectives.js +32 -0
  63. package/dist/wave/parse-objectives.js.map +1 -0
  64. package/dist/wave/types.d.ts +43 -0
  65. package/dist/wave/types.js +2 -0
  66. package/dist/wave/types.js.map +1 -0
  67. package/dist/wave.d.ts +6 -0
  68. package/dist/wave.js +158 -0
  69. package/dist/wave.js.map +1 -0
  70. package/package.json +100 -0
package/dist/index.js ADDED
@@ -0,0 +1,272 @@
1
+ import { existsSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { initAcpSession, terminateAcpSession, } from "@mobrienv/autoloop-backends/acp-client";
4
+ import * as config from "@mobrienv/autoloop-core/config";
5
+ import { readIfExists } from "@mobrienv/autoloop-core/journal";
6
+ import { cleanWorktrees, mergeWorktree, readMeta, updateStatus as updateWorktreeStatus, } from "@mobrienv/autoloop-core/worktree";
7
+ import { applyRuntimeModeOverrides, buildLoopContext, ensureLayout, initStore, installRuntimeTools, iterationFieldForRun, reloadLoop, } from "./config-helpers.js";
8
+ import { log } from "./display.js";
9
+ import { emit as emitCmd } from "./emit.js";
10
+ import { runIteration } from "./iteration.js";
11
+ import { maybeRunMetareview } from "./metareview.js";
12
+ import { appendLoopStart, branchStopReason, loadParallelBranchLaunch, parallelBranchBackendOverride, renderBranchResult, seedBranchContext, writeParallelBranchSummary, } from "./parallel.js";
13
+ import { registryStart, registryStop } from "./registry-bridge.js";
14
+ import { completeLoop, stopMaxIterations } from "./stop.js";
15
+ export async function run(projectDir, promptOverride, selfCommand, runOptions) {
16
+ let loop = buildLoopContext(projectDir, promptOverride, selfCommand, runOptions);
17
+ loop.onEvent = runOptions.onEvent;
18
+ loop = initStore(loop);
19
+ ensureLayout(loop.paths.stateDir);
20
+ installRuntimeTools(loop);
21
+ appendLoopStart(loop);
22
+ registryStart(loop);
23
+ // Track current iteration for abort handler (must be mutable)
24
+ let currentIteration = 0;
25
+ let aborted = false;
26
+ const teardown = () => {
27
+ if (aborted)
28
+ return;
29
+ aborted = true;
30
+ // Fire-and-forget ACP termination — abort handlers must stay sync.
31
+ // The finally block below awaits a final terminate as backstop.
32
+ if (loop.kiroSession) {
33
+ const session = loop.kiroSession;
34
+ loop.kiroSession = undefined;
35
+ terminateAcpSession(session).catch(() => {
36
+ /* best-effort */
37
+ });
38
+ }
39
+ try {
40
+ registryStop(loop, currentIteration, "interrupted");
41
+ }
42
+ catch {
43
+ /* best-effort */
44
+ }
45
+ // Update worktree meta so the run isn't stuck as "running"
46
+ if (loop.paths.worktreeMetaDir) {
47
+ try {
48
+ updateWorktreeStatus(loop.paths.worktreeMetaDir, "failed");
49
+ }
50
+ catch {
51
+ /* best-effort */
52
+ }
53
+ }
54
+ // Remove active wave marker so future waves aren't blocked
55
+ const waveMarker = join(loop.paths.stateDir, "waves", "active");
56
+ if (existsSync(waveMarker)) {
57
+ try {
58
+ unlinkSync(waveMarker);
59
+ }
60
+ catch {
61
+ /* best-effort */
62
+ }
63
+ }
64
+ };
65
+ // SDK-friendly cancellation: caller owns process signal handling and
66
+ // passes an AbortSignal. The CLI entry (dispatchRun) installs SIGINT/
67
+ // SIGTERM handlers that abort this controller. Without a signal the
68
+ // harness simply runs to completion (no process.on handlers installed).
69
+ const onAbort = () => teardown();
70
+ runOptions.signal?.addEventListener("abort", onAbort);
71
+ if (runOptions.signal?.aborted)
72
+ teardown();
73
+ log(loop, "info", `loop start run_id=${loop.runtime.runId} max_iterations=${loop.limits.maxIterations}`);
74
+ // Initialize kiro ACP session if backend is kiro
75
+ if (loop.backend.kind === "kiro") {
76
+ const acpOpts = {
77
+ command: loop.backend.command,
78
+ args: loop.backend.args,
79
+ cwd: loop.paths.workDir,
80
+ trustAllTools: loop.store.kiro_trust_all_tools !== false,
81
+ agentName: loop.store.kiro_agent || undefined,
82
+ modelId: loop.store.kiro_model || undefined,
83
+ verbose: loop.runtime.logLevel === "debug",
84
+ };
85
+ loop.kiroSession = await initAcpSession(acpOpts);
86
+ }
87
+ let summary;
88
+ const trackedIterate = async (ctx, iter) => {
89
+ if (aborted)
90
+ return {
91
+ iterations: iter - 1,
92
+ stopReason: "interrupted",
93
+ runId: ctx.runtime.runId,
94
+ };
95
+ currentIteration = iter;
96
+ ctx.onEvent?.({
97
+ type: "iteration.start",
98
+ iteration: iter,
99
+ maxIterations: ctx.limits.maxIterations,
100
+ runId: ctx.runtime.runId,
101
+ });
102
+ return iterateWith(ctx, iter, trackedIterate);
103
+ };
104
+ try {
105
+ summary = await trackedIterate(loop, 1);
106
+ }
107
+ finally {
108
+ if (loop.kiroSession) {
109
+ try {
110
+ await terminateAcpSession(loop.kiroSession);
111
+ }
112
+ catch {
113
+ /* best-effort */
114
+ }
115
+ }
116
+ runOptions.signal?.removeEventListener("abort", onAbort);
117
+ }
118
+ // Post-run worktree lifecycle: status update, automerge, cleanup
119
+ if (loop.runtime.isolationMode === "worktree" && loop.paths.worktreeMetaDir) {
120
+ const succeeded = summary.stopReason === "completed";
121
+ const wtStatus = succeeded ? "completed" : "failed";
122
+ try {
123
+ updateWorktreeStatus(loop.paths.worktreeMetaDir, wtStatus);
124
+ }
125
+ catch {
126
+ /* meta update is best-effort */
127
+ }
128
+ const keepWorktree = runOptions.keepWorktree ?? false;
129
+ const automerge = runOptions.automerge ?? false;
130
+ const cfg = config.loadProject(loop.paths.mainProjectDir);
131
+ const cleanupPolicy = config.get(cfg, "worktree.cleanup", "on_success");
132
+ // Automerge if requested and run succeeded.
133
+ // Skip when trigger is "chain" — chain-mode defers merge to a dedicated automerge step.
134
+ if (automerge &&
135
+ succeeded &&
136
+ !keepWorktree &&
137
+ loop.launch.trigger !== "chain") {
138
+ const meta = readMeta(loop.paths.worktreeMetaDir);
139
+ if (meta) {
140
+ const strategy = (meta.merge_strategy || "squash");
141
+ try {
142
+ mergeWorktree({
143
+ metaDir: loop.paths.worktreeMetaDir,
144
+ strategy,
145
+ workDir: loop.paths.workDir,
146
+ });
147
+ log(loop, "info", `worktree merged (${strategy}) for run ${loop.runtime.runId}`);
148
+ }
149
+ catch (err) {
150
+ const msg = err instanceof Error ? err.message : String(err);
151
+ log(loop, "warn", `worktree merge failed: ${msg}`);
152
+ }
153
+ }
154
+ }
155
+ // Cleanup worktree based on policy (unless --keep-worktree)
156
+ if (!keepWorktree) {
157
+ const shouldClean = cleanupPolicy === "always" ||
158
+ (cleanupPolicy === "on_success" && succeeded);
159
+ if (shouldClean) {
160
+ try {
161
+ cleanWorktrees({
162
+ mainStateDir: loop.paths.baseStateDir,
163
+ runId: loop.runtime.runId,
164
+ force: cleanupPolicy === "always",
165
+ workDir: loop.paths.workDir,
166
+ });
167
+ log(loop, "info", `worktree cleaned for run ${loop.runtime.runId}`);
168
+ }
169
+ catch (err) {
170
+ const msg = err instanceof Error ? err.message : String(err);
171
+ log(loop, "warn", `worktree cleanup failed: ${msg}`);
172
+ }
173
+ }
174
+ }
175
+ }
176
+ loop.onEvent?.({
177
+ type: "summary",
178
+ runId: loop.runtime.runId,
179
+ iterations: summary.iterations,
180
+ stopReason: summary.stopReason,
181
+ journalFile: loop.paths.journalFile,
182
+ memoryFile: loop.paths.memoryFile,
183
+ reviewEvery: loop.review.every,
184
+ toolPath: loop.paths.toolPath,
185
+ });
186
+ loop.onEvent?.({
187
+ type: "loop.finish",
188
+ iterations: summary.iterations,
189
+ stopReason: summary.stopReason,
190
+ runId: loop.runtime.runId,
191
+ });
192
+ return { ...summary, runId: loop.runtime.runId };
193
+ }
194
+ export { emitCmd as emit };
195
+ export async function runParallelBranchCli(projectDir, branchDir, selfCommand, onEvent) {
196
+ const launch = loadParallelBranchLaunch(branchDir);
197
+ const branchPrompt = launch.prompt;
198
+ const routingEvent = launch.routingEvent || "loop.start";
199
+ const backendOverride = parallelBranchBackendOverride(launch);
200
+ const logLevelVal = launch.logLevel || null;
201
+ let branchLoop = buildLoopContext(projectDir, branchPrompt, selfCommand, {
202
+ workDir: branchDir,
203
+ backendOverride,
204
+ logLevel: logLevelVal,
205
+ trigger: "branch",
206
+ });
207
+ branchLoop.onEvent = onEvent;
208
+ branchLoop = initStore(branchLoop);
209
+ branchLoop.runtime.branchMode = true;
210
+ branchLoop = applyRuntimeModeOverrides(branchLoop);
211
+ ensureLayout(branchLoop.paths.stateDir);
212
+ installRuntimeTools(branchLoop);
213
+ appendLoopStart(branchLoop);
214
+ registryStart(branchLoop);
215
+ const seeded = seedBranchContext(branchLoop, routingEvent);
216
+ const startMs = Date.now();
217
+ const summary = await iterate(seeded, 1);
218
+ const finishedMs = Date.now();
219
+ const elapsedMs = finishedMs - startMs;
220
+ const output = iterationFieldForRun(seeded.paths.journalFile, seeded.runtime.runId, "1", "iteration.finish", "output");
221
+ const stopReason = branchStopReason(summary.stopReason, elapsedMs, seeded.parallel.branchTimeoutMs);
222
+ const result = {
223
+ branch_id: launch.branchId,
224
+ objective: launch.objective,
225
+ stop_reason: stopReason,
226
+ output,
227
+ routing_event: routingEvent,
228
+ allowed_roles: launch.allowedRoles,
229
+ allowed_events: launch.allowedEvents,
230
+ branch_dir: branchDir,
231
+ elapsed_ms: elapsedMs,
232
+ finished_at_ms: finishedMs,
233
+ };
234
+ writeFileSync(join(branchDir, "result.md"), renderBranchResult(result));
235
+ writeParallelBranchSummary(branchDir, result);
236
+ }
237
+ // --- Private implementation ---
238
+ function iterateWith(loop, iteration, recurse) {
239
+ const liveLoop = reloadLoop(loop);
240
+ liveLoop.kiroSession = loop.kiroSession;
241
+ installRuntimeTools(liveLoop);
242
+ return runReviewThenIterate(liveLoop, iteration, recurse);
243
+ }
244
+ async function runReviewThenIterate(liveLoop, iteration, recurse) {
245
+ const reviewed = await maybeRunMetareview(liveLoop, iteration);
246
+ const verdict = reviewed.lastVerdict;
247
+ if (verdict) {
248
+ if (verdict.verdict === "EXIT")
249
+ return completeLoop(reviewed, iteration, "verdict_exit");
250
+ if (verdict.verdict === "TAKEOVER")
251
+ return completeLoop(reviewed, iteration, "verdict_takeover");
252
+ if (verdict.verdict === "REDIRECT") {
253
+ const redirectPath = join(reviewed.paths.stateDir, "redirect.md");
254
+ const redirectContent = readIfExists(redirectPath);
255
+ if (redirectContent) {
256
+ reviewed.objective =
257
+ "IMPORTANT: The metareviewer has redirected this task. Disregard your previous approach. New direction:\n" +
258
+ redirectContent +
259
+ "\n\n" +
260
+ reviewed.objective;
261
+ }
262
+ }
263
+ }
264
+ if (iteration > reviewed.limits.maxIterations) {
265
+ return stopMaxIterations(reviewed, iteration);
266
+ }
267
+ return runIteration(reviewed, iteration, recurse);
268
+ }
269
+ function iterate(loop, iteration) {
270
+ return iterateWith(loop, iteration, iterate);
271
+ }
272
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { IterationContext } from "./prompt.js";
2
+ import type { LoopContext, RunSummary } from "./types.js";
3
+ export declare function runIteration(loop: LoopContext, iteration: number, iterate: (loop: LoopContext, iteration: number) => Promise<RunSummary>): Promise<RunSummary>;
4
+ export declare function finishIteration(loop: LoopContext, iter: IterationContext, output: string, iterate: (loop: LoopContext, iteration: number) => Promise<RunSummary>): Promise<RunSummary>;
5
+ export declare function resolveOutcome(ctx: {
6
+ emittedTopic: string;
7
+ allTopics: string[];
8
+ hadInvalidEvents: boolean;
9
+ output: string;
10
+ completionEvent: string;
11
+ requiredEvents: string[];
12
+ completionPromise: string;
13
+ }): {
14
+ action: string;
15
+ outcome: string;
16
+ };
@@ -0,0 +1,153 @@
1
+ import { runKiroIteration } from "@mobrienv/autoloop-backends";
2
+ import { listText } from "@mobrienv/autoloop-core";
3
+ import { extractField, extractIteration, extractTopic, readRunLines, } from "@mobrienv/autoloop-core/journal";
4
+ import { log } from "./display.js";
5
+ import { appendInvalidEvent, invalidEvent, parallelTriggerTopic, systemTopic, } from "./emit.js";
6
+ import { appendBackendFinish, appendBackendStart, appendIterationFinish, appendIterationStart, buildBackendCommand, runProcess, } from "./parallel.js";
7
+ import { buildIterationContext } from "./prompt.js";
8
+ import { registryProgress } from "./registry-bridge.js";
9
+ import { completeLoop, stopBackendFailed, stopBackendTimeout } from "./stop.js";
10
+ import { continueAfterParallelJoin, executeParallelWave, stopAfterParallelWave, } from "./wave.js";
11
+ export async function runIteration(loop, iteration, iterate) {
12
+ const iter = buildIterationContext(loop, iteration);
13
+ loop.onEvent?.({
14
+ type: "iteration.banner",
15
+ iteration: iter.iteration,
16
+ maxIterations: loop.limits.maxIterations,
17
+ allowedRoles: iter.allowedRoles,
18
+ recentEvent: iter.recentEvent,
19
+ allowedEvents: iter.allowedEvents,
20
+ lastRejected: iter.lastRejected,
21
+ });
22
+ appendIterationStart(loop, iter);
23
+ log(loop, "debug", `iteration ${iteration} start`);
24
+ appendBackendStart(loop, iter);
25
+ log(loop, "debug", `backend start command=${loop.backend.command}`);
26
+ const startEpoch = Math.floor(Date.now() / 1000);
27
+ // Switch Kiro session agent mode per-role if agents.toml provides a mapping.
28
+ // Failure is non-fatal — the role just runs with the default agent.
29
+ if (iter.roleAgent && loop.backend.kind === "kiro" && loop.kiroSession) {
30
+ log(loop, "debug", `switching kiro agent to "${iter.roleAgent}" for role "${iter.allowedRoles[0]}"`);
31
+ try {
32
+ await loop.kiroSession.connection.setSessionMode({
33
+ sessionId: loop.kiroSession.sessionId,
34
+ modeId: iter.roleAgent,
35
+ });
36
+ }
37
+ catch (err) {
38
+ process.stderr.write(`[autoloop] warning: failed to set kiro agent mode "${iter.roleAgent}": ${err instanceof Error ? err.message : String(err)}\n`);
39
+ }
40
+ }
41
+ const { output, exitCode, timedOut } = loop.backend.kind === "kiro" && loop.kiroSession
42
+ ? await runKiroIteration(loop.kiroSession, iter.prompt, loop.backend.timeoutMs)
43
+ : runProcess(buildBackendCommand(loop, iter), loop.backend.timeoutMs, loop.backend.kind);
44
+ const elapsedS = Math.floor(Date.now() / 1000) - startEpoch;
45
+ appendBackendFinish(loop, iter, output, exitCode, timedOut);
46
+ appendIterationFinish(loop, iter, output, exitCode, timedOut, elapsedS);
47
+ registryProgress(loop, iteration);
48
+ log(loop, "debug", `iteration ${iteration} finish exit_code=${exitCode}`);
49
+ loop.onEvent?.({
50
+ type: "iteration.footer",
51
+ iteration: iter.iteration,
52
+ elapsedS,
53
+ });
54
+ loop.onEvent?.({ type: "backend.output", output });
55
+ if (timedOut)
56
+ return stopBackendTimeout(loop, iteration, output);
57
+ if (exitCode !== 0)
58
+ return stopBackendFailed(loop, iteration, output);
59
+ return finishIteration(loop, iter, output, iterate);
60
+ }
61
+ export async function finishIteration(loop, iter, output, iterate) {
62
+ const runLines = readRunLines(loop.paths.journalFile, loop.runtime.runId);
63
+ const allTopics = runLines.map(extractTopic).filter((t) => t !== "");
64
+ const turnLines = runLines.filter((l) => extractIteration(l) === String(iter.iteration));
65
+ const emitted = latestAgentEventRecord(turnLines);
66
+ const hadInvalidEvents = turnLines.some((l) => extractTopic(l) === "event.invalid");
67
+ const progress = (emittedTopic, outcome) => loop.onEvent?.({
68
+ type: "progress",
69
+ runId: loop.runtime.runId,
70
+ iteration: iter.iteration,
71
+ recentEvent: iter.recentEvent,
72
+ allowedRoles: iter.allowedRoles,
73
+ emittedTopic,
74
+ outcome,
75
+ });
76
+ if (invalidEvent(emitted.topic, iter.allowedEvents, loop.parallel.enabled, loop.completion.event)) {
77
+ return rejectInvalidAndContinue(loop, iter, emitted.topic, iterate, progress);
78
+ }
79
+ if (parallelTriggerTopic(emitted.topic)) {
80
+ return finishParallelIteration(loop, iter, emitted.topic, emitted.payload, iterate, progress);
81
+ }
82
+ const resolved = resolveOutcome({
83
+ emittedTopic: emitted.topic,
84
+ allTopics,
85
+ hadInvalidEvents,
86
+ output,
87
+ completionEvent: loop.completion.event,
88
+ requiredEvents: loop.completion.requiredEvents,
89
+ completionPromise: loop.completion.promise,
90
+ });
91
+ progress(emitted.topic, resolved.outcome);
92
+ if (resolved.action === "complete_event")
93
+ return completeLoop(loop, iter.iteration, "completion_event");
94
+ if (resolved.action === "complete_promise")
95
+ return completeLoop(loop, iter.iteration, "completion_promise");
96
+ return iterate(loop, iter.iteration + 1);
97
+ }
98
+ async function rejectInvalidAndContinue(loop, iter, emittedTopic, iterate, progress) {
99
+ appendInvalidEvent(loop.paths.journalFile, loop.runtime.runId, String(iter.iteration), iter.recentEvent, emittedTopic, iter.allowedRoles, iter.allowedEvents);
100
+ log(loop, "info", `[reject] invalid event \`${emittedTopic}\`; recent event: \`${iter.recentEvent}\`; allowed next events: ${listText(iter.allowedEvents)}`);
101
+ progress(emittedTopic, "rejected:event.invalid");
102
+ return iterate(loop, iter.iteration + 1);
103
+ }
104
+ async function finishParallelIteration(loop, iter, emittedTopic, emittedPayload, iterate, progress) {
105
+ const result = executeParallelWave(loop, iter, emittedTopic, emittedPayload);
106
+ if (result.reason === "parallel_wave_complete") {
107
+ progress(emittedTopic, "parallel:joined");
108
+ return continueAfterParallelJoin(loop, iter, result.waveId, emittedTopic, result.elapsedMs, iterate);
109
+ }
110
+ progress(emittedTopic, `parallel:stop:${result.reason}`);
111
+ return stopAfterParallelWave(loop, iter, result.reason, result.waveId);
112
+ }
113
+ export function resolveOutcome(ctx) {
114
+ if (completedViaEvent(ctx.allTopics, ctx.completionEvent, ctx.requiredEvents)) {
115
+ return { action: "complete_event", outcome: "complete:completion_event" };
116
+ }
117
+ if (shouldContinueFromAcceptedEvent(ctx.emittedTopic, ctx.completionEvent)) {
118
+ return { action: "continue_routed", outcome: "continue:routed_event" };
119
+ }
120
+ if (!ctx.hadInvalidEvents &&
121
+ completedViaPromise(ctx.output, ctx.completionPromise)) {
122
+ return {
123
+ action: "complete_promise",
124
+ outcome: "complete:completion_promise",
125
+ };
126
+ }
127
+ return { action: "continue", outcome: "continue" };
128
+ }
129
+ function latestAgentEventRecord(lines) {
130
+ for (let i = lines.length - 1; i >= 0; i--) {
131
+ const topic = extractTopic(lines[i]);
132
+ if (!systemTopic(topic)) {
133
+ return { topic, payload: extractField(lines[i], "payload") };
134
+ }
135
+ }
136
+ return { topic: "", payload: "" };
137
+ }
138
+ function completedViaEvent(topics, completionEvent, requiredEvents) {
139
+ if (!topics.includes(completionEvent))
140
+ return false;
141
+ return requiredEvents.every((e) => topics.includes(e));
142
+ }
143
+ function completedViaPromise(output, promise) {
144
+ if (!promise)
145
+ return false;
146
+ return output.includes(promise);
147
+ }
148
+ function shouldContinueFromAcceptedEvent(emittedTopic, completionEvent) {
149
+ if (!emittedTopic)
150
+ return false;
151
+ return emittedTopic !== completionEvent;
152
+ }
153
+ //# sourceMappingURL=iteration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iteration.js","sourceRoot":"","sources":["../src/iteration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { LoopContext, Verdict, VerdictKind } from "./types.js";
2
+ export type { Verdict, VerdictKind };
3
+ export declare function parseVerdict(output: string): Verdict;
4
+ export declare function maybeRunMetareview(loop: LoopContext, iteration: number): Promise<LoopContext>;
5
+ export declare function shouldRunMetareview(loop: LoopContext, iteration: number): boolean;
6
+ export declare function runMetareviewReview(loop: LoopContext, iteration: number): Promise<Verdict>;
@@ -0,0 +1,104 @@
1
+ import { writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { runKiroIteration } from "@mobrienv/autoloop-backends";
4
+ import { jsonBool, jsonField, jsonFieldRaw } from "@mobrienv/autoloop-core";
5
+ import { appendEvent, readRunLines } from "@mobrienv/autoloop-core/journal";
6
+ import { reloadLoop } from "./config-helpers.js";
7
+ import { buildReviewCommand, runProcess } from "./parallel.js";
8
+ import { renderReviewPromptText } from "./prompt.js";
9
+ const DEFAULT_VERDICT = {
10
+ verdict: "CONTINUE",
11
+ confidence: 0,
12
+ reasoning: "No structured verdict found; defaulting to CONTINUE",
13
+ };
14
+ export function parseVerdict(output) {
15
+ const match = output.match(/```(?:json)?\s*\n(\{[\s\S]*?\})\s*\n```/);
16
+ if (!match)
17
+ return DEFAULT_VERDICT;
18
+ try {
19
+ const parsed = JSON.parse(match[1]);
20
+ const v = String(parsed.verdict || "").toUpperCase();
21
+ if (!["CONTINUE", "REDIRECT", "TAKEOVER", "EXIT"].includes(v))
22
+ return DEFAULT_VERDICT;
23
+ return {
24
+ verdict: v,
25
+ confidence: Number(parsed.confidence) || 0,
26
+ reasoning: String(parsed.reasoning || ""),
27
+ redirect_prompt: parsed.redirect_prompt
28
+ ? String(parsed.redirect_prompt)
29
+ : undefined,
30
+ takeover_output: parsed.takeover_output
31
+ ? String(parsed.takeover_output)
32
+ : undefined,
33
+ suggestions: Array.isArray(parsed.suggestions)
34
+ ? parsed.suggestions.map(String)
35
+ : undefined,
36
+ };
37
+ }
38
+ catch {
39
+ return DEFAULT_VERDICT;
40
+ }
41
+ }
42
+ export async function maybeRunMetareview(loop, iteration) {
43
+ if (shouldRunMetareview(loop, iteration)) {
44
+ const verdict = await runMetareviewReview(loop, iteration);
45
+ const reloaded = reloadLoop(loop);
46
+ reloaded.kiroSession = loop.kiroSession;
47
+ reloaded.lastVerdict = verdict;
48
+ return reloaded;
49
+ }
50
+ return loop;
51
+ }
52
+ export function shouldRunMetareview(loop, iteration) {
53
+ if (!loop.review.enabled)
54
+ return false;
55
+ if (iteration === 1 && loop.review.adversarialFirst)
56
+ return true;
57
+ return iteration > 1 && (iteration - 1) % loop.review.every === 0;
58
+ }
59
+ export async function runMetareviewReview(loop, iteration) {
60
+ loop.onEvent?.({ type: "review.banner", iteration });
61
+ const runLines = readRunLines(loop.paths.journalFile, loop.runtime.runId);
62
+ const reviewPrompt = renderReviewPromptText(loop, iteration, runLines);
63
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "review.start", jsonField("kind", "metareview") +
64
+ ", " +
65
+ jsonField("backend_kind", loop.review.kind) +
66
+ ", " +
67
+ jsonField("command", loop.review.command) +
68
+ ", " +
69
+ jsonField("prompt_mode", loop.review.promptMode) +
70
+ ", " +
71
+ jsonField("prompt", reviewPrompt) +
72
+ ", " +
73
+ jsonField("timeout_ms", String(loop.review.timeoutMs)));
74
+ const { output, exitCode, timedOut } = loop.review.kind === "kiro" && loop.kiroSession
75
+ ? await runKiroIteration(loop.kiroSession, reviewPrompt, loop.review.timeoutMs)
76
+ : runProcess(buildReviewCommand(loop, iteration, reviewPrompt), loop.review.timeoutMs, loop.review.kind);
77
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "review.finish", jsonField("kind", "metareview") +
78
+ ", " +
79
+ jsonField("exit_code", String(exitCode)) +
80
+ ", " +
81
+ jsonFieldRaw("timed_out", jsonBool(timedOut)) +
82
+ ", " +
83
+ jsonField("output", output));
84
+ const verdict = parseVerdict(output);
85
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "review.verdict", jsonField("verdict", verdict.verdict) +
86
+ ", " +
87
+ jsonField("confidence", String(verdict.confidence)) +
88
+ ", " +
89
+ jsonField("reasoning", verdict.reasoning));
90
+ if (verdict.verdict === "REDIRECT" && verdict.redirect_prompt) {
91
+ writeFileSync(join(loop.paths.stateDir, "redirect.md"), verdict.redirect_prompt);
92
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "review.redirect", jsonField("redirect_prompt", verdict.redirect_prompt));
93
+ }
94
+ else if (verdict.verdict === "TAKEOVER") {
95
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "review.takeover", jsonField("takeover_output", verdict.takeover_output || "(no takeover output)"));
96
+ }
97
+ else if (verdict.verdict === "EXIT") {
98
+ appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "review.exit", jsonField("iteration", String(iteration)) +
99
+ ", " +
100
+ jsonField("reason", verdict.reasoning));
101
+ }
102
+ return verdict;
103
+ }
104
+ //# sourceMappingURL=metareview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metareview.js","sourceRoot":"","sources":["../src/metareview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ interface MetricsRow {
2
+ iteration: string;
3
+ role: string;
4
+ event: string;
5
+ elapsedS: string;
6
+ exitCode: string;
7
+ timedOut: string;
8
+ outcome: string;
9
+ }
10
+ export declare function collectMetricsRows(lines: string[]): MetricsRow[];
11
+ export declare function formatMetrics(rows: MetricsRow[], format: string): string;
12
+ export {};