@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
@@ -0,0 +1,177 @@
1
+ import { execSync } from "node:child_process";
2
+ import { lineSep, listText } from "@mobrienv/autoloop-core";
3
+ export function printSummary(summary, loop) {
4
+ const hint = stopReasonHint(summary.stopReason);
5
+ const lines = [
6
+ "autoloops summary",
7
+ "===================",
8
+ `run_id: ${loop.runtime.runId}`,
9
+ `iterations: ${summary.iterations}`,
10
+ `stop_reason: ${summary.stopReason}`,
11
+ `journal: ${loop.paths.journalFile}`,
12
+ `memory: ${loop.paths.memoryFile}`,
13
+ `review_every: ${loop.review.every}`,
14
+ `inspect scratchpad: ${loop.paths.toolPath} inspect scratchpad --format md`,
15
+ ...hint,
16
+ ];
17
+ for (const l of lines)
18
+ console.log(l);
19
+ }
20
+ function stopReasonHint(reason) {
21
+ switch (reason) {
22
+ case "backend_failed":
23
+ return [
24
+ "Hint: check the backend output above; common causes: invalid API key, model not available, network error.",
25
+ ];
26
+ case "backend_timeout":
27
+ return [
28
+ "Hint: the backend did not respond in time. Try increasing timeout or check backend availability.",
29
+ ];
30
+ case "max_iterations":
31
+ return [
32
+ "Hint: loop reached the iteration limit without a completion event. Increase max_iterations or check if agents are stuck.",
33
+ ];
34
+ default:
35
+ return [];
36
+ }
37
+ }
38
+ function decorativeOutputEnabled() {
39
+ return Boolean(process.stdout.isTTY);
40
+ }
41
+ export function printIterationBanner(loop, iter) {
42
+ const roleLine = `role: ${listText(iter.allowedRoles)} │ event: ${iter.recentEvent} │ next: ${listText(iter.allowedEvents)}`;
43
+ if (!decorativeOutputEnabled()) {
44
+ console.log(`iteration ${iter.iteration}/${loop.limits.maxIterations}`);
45
+ console.log(roleLine);
46
+ if (iter.lastRejected) {
47
+ console.log(`previous emit rejected: \`${iter.lastRejected}\` — rerouting`);
48
+ }
49
+ return;
50
+ }
51
+ const label = `━━━ iteration ${iter.iteration}/${loop.limits.maxIterations} `;
52
+ const width = terminalWidth();
53
+ const rule = label.padEnd(width, "━");
54
+ console.log("");
55
+ console.log(rule);
56
+ console.log(roleLine);
57
+ if (iter.lastRejected) {
58
+ console.log(`↳ previous emit rejected: \`${iter.lastRejected}\` — rerouting`);
59
+ }
60
+ console.log("━".repeat(width));
61
+ }
62
+ export function printIterationFooter(iter, elapsedS) {
63
+ if (!decorativeOutputEnabled())
64
+ return;
65
+ const elapsed = elapsedS >= 60
66
+ ? `${Math.floor(elapsedS / 60)}m ${elapsedS % 60}s`
67
+ : `${elapsedS}s`;
68
+ const label = `──── end iteration ${iter.iteration} (${elapsed}) `;
69
+ console.log(label.padEnd(terminalWidth(), "─"));
70
+ console.log("");
71
+ }
72
+ export function printProgressLine(data) {
73
+ const parts = [
74
+ "[progress]",
75
+ `ts=${new Date().toISOString()}`,
76
+ `run_id=${data.runId}`,
77
+ `iter=${data.iteration}`,
78
+ `role=${progressRoleLabel(data.allowedRoles)}`,
79
+ `recent=${data.recentEvent || "(none)"}`,
80
+ ];
81
+ if (data.emittedTopic)
82
+ parts.push(`emitted=${data.emittedTopic}`);
83
+ parts.push(`outcome=${data.outcome}`);
84
+ console.log(parts.join(" "));
85
+ }
86
+ function progressRoleLabel(roles) {
87
+ if (roles.length === 0)
88
+ return "(none)";
89
+ if (roles.length === 1)
90
+ return roles[0];
91
+ return roles.join(",");
92
+ }
93
+ export function printReviewBanner(iteration) {
94
+ if (!decorativeOutputEnabled()) {
95
+ console.log(`review before iteration ${iteration}`);
96
+ return;
97
+ }
98
+ const label = `━━━ review before iteration ${iteration} `;
99
+ console.log("");
100
+ console.log(label.padEnd(terminalWidth(), "━"));
101
+ }
102
+ export function printBackendOutputTail(output, maxLines = 200) {
103
+ const lines = output.split(lineSep());
104
+ const tail = lines.slice(-maxLines);
105
+ if (!tail.join("").trim())
106
+ return;
107
+ const shown = Math.min(lines.length, maxLines);
108
+ if (!decorativeOutputEnabled()) {
109
+ console.log(`── backend stdout (last ${shown} of ${lines.length} lines) ──`);
110
+ console.log(tail.join(lineSep()));
111
+ return;
112
+ }
113
+ console.log(`── backend stdout (last ${shown} of ${lines.length} lines) ──`);
114
+ console.log(tail.join(lineSep()));
115
+ console.log("──────────────────────────────────────");
116
+ }
117
+ export function printFailureDiagnostic(output, stopReason) {
118
+ const lines = output.split(lineSep());
119
+ const tail = lines.slice(-15).join(lineSep());
120
+ if (!tail.trim())
121
+ return;
122
+ const header = stopReason
123
+ ? `── backend output (last 15 lines) — stopped: ${stopReason} ──`
124
+ : "── backend output (last 15 lines) ──";
125
+ console.log("");
126
+ console.log(header);
127
+ console.log(tail);
128
+ console.log("──────────────────────────────────────");
129
+ }
130
+ export function terminalWidth() {
131
+ const envWidth = parseInt(process.env.AUTOLOOP_WIDTH ?? "", 10);
132
+ if (envWidth > 0)
133
+ return envWidth;
134
+ const cols = parseInt(process.env.COLUMNS ?? "", 10);
135
+ if (cols > 0)
136
+ return cols;
137
+ try {
138
+ const tputResult = execSync("tput cols 2>/dev/null || true", {
139
+ encoding: "utf-8",
140
+ timeout: 1000,
141
+ }).trim();
142
+ const w = parseInt(tputResult, 10);
143
+ if (w > 0)
144
+ return w;
145
+ }
146
+ catch {
147
+ /* ignore */
148
+ }
149
+ return 68;
150
+ }
151
+ export function lastNChars(text, n) {
152
+ return text.length > n ? text.slice(-n) : text;
153
+ }
154
+ export function log(loop, level, message) {
155
+ const ranks = {
156
+ debug: 0,
157
+ info: 1,
158
+ warn: 2,
159
+ error: 3,
160
+ none: 4,
161
+ };
162
+ const currentRank = ranks[loop.runtime.logLevel] ?? 1;
163
+ const messageRank = ranks[level] ?? 1;
164
+ if (messageRank >= currentRank) {
165
+ process.stderr.write(`[autoloops] [${level}] ${message}\n`);
166
+ }
167
+ loop.onEvent?.({ type: "log", level, message });
168
+ }
169
+ export function printProjectedMarkdown(text, _format) {
170
+ // In terminal mode, the original uses host_call(:io_render_markdown)
171
+ // which is Tonic-specific. For TS, just output plain text.
172
+ console.log(text);
173
+ }
174
+ export function printProjectedText(text, _format) {
175
+ console.log(text);
176
+ }
177
+ //# sourceMappingURL=display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.js","sourceRoot":"","sources":["../src/display.ts"],"names":[],"mappings":"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"}
package/dist/emit.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ export declare function coordinationTopic(topic: string): boolean;
2
+ export declare function operatorTopic(topic: string): boolean;
3
+ export declare function coreSystemTopic(topic: string): boolean;
4
+ export declare function systemTopic(topic: string): boolean;
5
+ export declare function parallelTopic(topic: string): boolean;
6
+ export declare function parallelTriggerTopic(topic: string): boolean;
7
+ export declare function reservedParallelJoinedTopic(topic: string): boolean;
8
+ export interface EmitResult {
9
+ ok: boolean;
10
+ topic?: string;
11
+ error?: string;
12
+ }
13
+ export declare function emit(projectDir: string, topic: string, payload: string): EmitResult;
14
+ export declare function invalidEvent(emittedTopic: string, allowedEvents: string[], parallelEnabled: boolean, completionEvent: string): boolean;
15
+ export declare function parallelDispatchBase(topic: string): string;
16
+ export declare function parallelJoinedTopic(topic: string): string;
17
+ export declare function dispatchParallelJoinedTopic(topic: string): boolean;
18
+ export declare function dispatchParallelJoinBase(topic: string): string;
19
+ export declare function routingTopic(topic: string): boolean;
20
+ export declare function appendInvalidEvent(journalFile: string, runId: string, iteration: string, recentEvent: string, emittedTopic: string, allowedRoles: string[], allowedEvents: string[]): void;
21
+ export declare function resolveEmitJournalFile(projectDir: string): string;
package/dist/emit.js ADDED
@@ -0,0 +1,243 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { joinCsv, jsonField, listText, splitCsv, } from "@mobrienv/autoloop-core";
4
+ import * as config from "@mobrienv/autoloop-core/config";
5
+ import { appendAgentEvent, appendEvent, latestIterationForRun, latestRunId, } from "@mobrienv/autoloop-core/journal";
6
+ import { materializeOpenFrom } from "@mobrienv/autoloop-core/tasks";
7
+ import * as topology from "@mobrienv/autoloop-core/topology";
8
+ const COORDINATION_TOPICS = new Set([
9
+ "issue.discovered",
10
+ "issue.resolved",
11
+ "slice.started",
12
+ "slice.verified",
13
+ "slice.committed",
14
+ "context.archived",
15
+ "chain.spawn",
16
+ ]);
17
+ export function coordinationTopic(topic) {
18
+ return COORDINATION_TOPICS.has(topic);
19
+ }
20
+ const OPERATOR_TOPICS = new Set([
21
+ "operator.guidance",
22
+ "operator.guidance.consumed",
23
+ ]);
24
+ export function operatorTopic(topic) {
25
+ return OPERATOR_TOPICS.has(topic);
26
+ }
27
+ const CORE_SYSTEM_TOPICS = new Set([
28
+ "iteration.start",
29
+ "iteration.finish",
30
+ "loop.start",
31
+ "loop.complete",
32
+ "loop.stop",
33
+ "review.start",
34
+ "review.finish",
35
+ "backend.start",
36
+ "backend.finish",
37
+ "event.invalid",
38
+ ]);
39
+ export function coreSystemTopic(topic) {
40
+ if (CORE_SYSTEM_TOPICS.has(topic))
41
+ return true;
42
+ return topic.startsWith("wave.");
43
+ }
44
+ export function systemTopic(topic) {
45
+ return coordinationTopic(topic) || coreSystemTopic(topic);
46
+ }
47
+ export function parallelTopic(topic) {
48
+ return parallelTriggerTopic(topic) || reservedParallelJoinedTopic(topic);
49
+ }
50
+ export function parallelTriggerTopic(topic) {
51
+ if (topic === "explore.parallel")
52
+ return true;
53
+ return dispatchParallelTopic(topic);
54
+ }
55
+ function dispatchParallelTopic(topic) {
56
+ if (topic === "explore.parallel")
57
+ return false;
58
+ return topic.endsWith(".parallel");
59
+ }
60
+ export function reservedParallelJoinedTopic(topic) {
61
+ return topic.endsWith(".parallel.joined");
62
+ }
63
+ export function emit(projectDir, topic, payload) {
64
+ const journalFile = resolveEmitJournalFile(projectDir);
65
+ mkdirSync(dirname(journalFile), { recursive: true });
66
+ const validation = emitValidationContext(projectDir, journalFile);
67
+ if (coordinationTopic(topic)) {
68
+ return acceptEmit(journalFile, topic, payload, validation);
69
+ }
70
+ if (operatorTopic(topic)) {
71
+ return acceptEmit(journalFile, topic, payload, validation);
72
+ }
73
+ // Task completion gate: block completion if open tasks remain
74
+ if (topic === validation.completionEvent) {
75
+ const tasksFile = config.resolveTasksFile(projectDir);
76
+ const openTasks = materializeOpenFrom(tasksFile);
77
+ if (openTasks.length > 0) {
78
+ return rejectTaskGate(journalFile, topic, openTasks, validation);
79
+ }
80
+ }
81
+ if (invalidEvent(topic, validation.allowedEvents, validation.parallelEnabled, validation.completionEvent)) {
82
+ return rejectEmit(journalFile, topic, validation);
83
+ }
84
+ return acceptEmit(journalFile, topic, payload, validation);
85
+ }
86
+ export function invalidEvent(emittedTopic, allowedEvents, parallelEnabled, completionEvent) {
87
+ if (!emittedTopic)
88
+ return false;
89
+ if (reservedParallelJoinedTopic(emittedTopic))
90
+ return true;
91
+ if (!parallelEnabled) {
92
+ if (parallelTopic(emittedTopic))
93
+ return true;
94
+ return invalidEventAfterParallelCheck(emittedTopic, allowedEvents);
95
+ }
96
+ if (parallelTopic(emittedTopic)) {
97
+ return !validParallelTriggerEvent(emittedTopic, allowedEvents, completionEvent);
98
+ }
99
+ return invalidEventAfterParallelCheck(emittedTopic, allowedEvents);
100
+ }
101
+ function invalidEventAfterParallelCheck(emittedTopic, allowedEvents) {
102
+ if (allowedEvents.length === 0)
103
+ return false;
104
+ return !topology.eventMatchesAny(emittedTopic, allowedEvents);
105
+ }
106
+ function validParallelTriggerEvent(emittedTopic, allowedEvents, completionEvent) {
107
+ if (emittedTopic === "explore.parallel")
108
+ return true;
109
+ const baseEvent = parallelDispatchBase(emittedTopic);
110
+ if (!baseEvent)
111
+ return false;
112
+ if (baseEvent === completionEvent)
113
+ return false;
114
+ if (coordinationTopic(baseEvent) ||
115
+ coreSystemTopic(baseEvent) ||
116
+ parallelTopic(baseEvent))
117
+ return false;
118
+ if (allowedEvents.length === 0)
119
+ return false;
120
+ return topology.eventMatchesAny(baseEvent, allowedEvents);
121
+ }
122
+ export function parallelDispatchBase(topic) {
123
+ if (!dispatchParallelTopic(topic))
124
+ return "";
125
+ return topic.slice(0, -".parallel".length);
126
+ }
127
+ export function parallelJoinedTopic(topic) {
128
+ return `${topic}.joined`;
129
+ }
130
+ export function dispatchParallelJoinedTopic(topic) {
131
+ if (topic === "explore.parallel.joined")
132
+ return false;
133
+ return topic.endsWith(".parallel.joined");
134
+ }
135
+ export function dispatchParallelJoinBase(topic) {
136
+ if (topic === "explore.parallel.joined")
137
+ return "loop.start";
138
+ if (dispatchParallelJoinedTopic(topic)) {
139
+ return topic.slice(0, -".parallel.joined".length);
140
+ }
141
+ return topic;
142
+ }
143
+ export function routingTopic(topic) {
144
+ const nonRouting = new Set([
145
+ "iteration.start",
146
+ "iteration.finish",
147
+ "loop.complete",
148
+ "loop.stop",
149
+ "review.start",
150
+ "review.finish",
151
+ "backend.start",
152
+ "backend.finish",
153
+ "event.invalid",
154
+ "operator.guidance",
155
+ "operator.guidance.consumed",
156
+ "",
157
+ ]);
158
+ if (nonRouting.has(topic))
159
+ return false;
160
+ return !coordinationTopic(topic);
161
+ }
162
+ function emitValidationContext(projectDir, journalFile) {
163
+ const runId = resolveEmitRunId(journalFile);
164
+ const cfg = config.loadProject(projectDir);
165
+ const topo = topology.loadTopology(projectDir);
166
+ const compEvent = topology.completionEvent(topo, config.get(cfg, "event_loop.completion_event", "task.complete"));
167
+ const parallelEnabled = truthySetting(config.get(cfg, "parallel.enabled", "false"));
168
+ return {
169
+ runId,
170
+ iteration: resolveEmitIteration(journalFile, runId),
171
+ recentEvent: emitRecentEvent(),
172
+ allowedRoles: envCsvList("AUTOLOOP_ALLOWED_ROLES"),
173
+ allowedEvents: envCsvList("AUTOLOOP_ALLOWED_EVENTS"),
174
+ parallelEnabled,
175
+ completionEvent: compEvent,
176
+ };
177
+ }
178
+ function resolveEmitRunId(journalFile) {
179
+ const envValue = process.env.AUTOLOOP_RUN_ID;
180
+ return envValue || latestRunId(journalFile);
181
+ }
182
+ function resolveEmitIteration(journalFile, runId) {
183
+ const envValue = process.env.AUTOLOOP_ITERATION;
184
+ return envValue || latestIterationForRun(journalFile, runId);
185
+ }
186
+ function emitRecentEvent() {
187
+ return process.env.AUTOLOOP_RECENT_EVENT || "loop.start";
188
+ }
189
+ function envCsvList(name) {
190
+ const value = process.env[name];
191
+ if (!value)
192
+ return [];
193
+ return splitCsv(value);
194
+ }
195
+ function acceptEmit(journalFile, topic, payload, validation) {
196
+ appendAgentEvent(journalFile, validation.runId, validation.iteration, topic, payload);
197
+ return { ok: true, topic };
198
+ }
199
+ function rejectEmit(journalFile, topic, validation) {
200
+ const message = invalidEmitMessage(topic, validation);
201
+ appendInvalidEvent(journalFile, validation.runId, validation.iteration, validation.recentEvent, topic, validation.allowedRoles, validation.allowedEvents);
202
+ return { ok: false, topic, error: message };
203
+ }
204
+ function invalidEmitMessage(topic, validation) {
205
+ return ("invalid event `" +
206
+ topic +
207
+ "`; recent event: `" +
208
+ validation.recentEvent +
209
+ "`; suggested roles: " +
210
+ listText(validation.allowedRoles) +
211
+ "; allowed next events: " +
212
+ listText(validation.allowedEvents));
213
+ }
214
+ export function appendInvalidEvent(journalFile, runId, iteration, recentEvent, emittedTopic, allowedRoles, allowedEvents) {
215
+ appendEvent(journalFile, runId, iteration, "event.invalid", jsonField("recent_event", recentEvent) +
216
+ ", " +
217
+ jsonField("emitted", emittedTopic) +
218
+ ", " +
219
+ jsonField("suggested_roles", joinCsv(allowedRoles)) +
220
+ ", " +
221
+ jsonField("allowed_events", joinCsv(allowedEvents)));
222
+ }
223
+ export function resolveEmitJournalFile(projectDir) {
224
+ const envJournal = process.env.AUTOLOOP_JOURNAL_FILE;
225
+ if (envJournal)
226
+ return envJournal;
227
+ const envEvents = process.env.AUTOLOOP_EVENTS_FILE;
228
+ if (envEvents)
229
+ return envEvents;
230
+ return config.resolveJournalFile(projectDir);
231
+ }
232
+ function rejectTaskGate(journalFile, topic, openTasks, validation) {
233
+ appendEvent(journalFile, validation.runId, validation.iteration, "task.gate", jsonField("blocked_topic", topic) +
234
+ ", " +
235
+ jsonField("open_tasks", openTasks.map((t) => t.id).join(",")));
236
+ const taskLines = openTasks.map((t) => ` - [${t.id}] ${t.text}`).join("\n");
237
+ const message = `Cannot complete: ${openTasks.length} open tasks remain:\n${taskLines}\nComplete or remove these tasks before emitting ${topic}.`;
238
+ return { ok: false, topic, error: message };
239
+ }
240
+ function truthySetting(value) {
241
+ return value !== "false" && value !== "0" && value !== "";
242
+ }
243
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export type LoopEvent = {
2
+ type: "log";
3
+ level: string;
4
+ message: string;
5
+ } | {
6
+ type: "iteration.start";
7
+ iteration: number;
8
+ maxIterations: number;
9
+ runId: string;
10
+ } | {
11
+ type: "loop.finish";
12
+ iterations: number;
13
+ stopReason: string;
14
+ runId: string;
15
+ } | {
16
+ type: "iteration.banner";
17
+ iteration: number;
18
+ maxIterations: number;
19
+ allowedRoles: string[];
20
+ recentEvent: string;
21
+ allowedEvents: string[];
22
+ lastRejected?: string;
23
+ } | {
24
+ type: "iteration.footer";
25
+ iteration: number;
26
+ elapsedS: number;
27
+ } | {
28
+ type: "progress";
29
+ runId: string;
30
+ iteration: number;
31
+ recentEvent: string;
32
+ allowedRoles: string[];
33
+ emittedTopic?: string;
34
+ outcome: string;
35
+ } | {
36
+ type: "review.banner";
37
+ iteration: number;
38
+ } | {
39
+ type: "backend.output";
40
+ output: string;
41
+ maxLines?: number;
42
+ } | {
43
+ type: "failure.diagnostic";
44
+ output: string;
45
+ stopReason: string;
46
+ } | {
47
+ type: "summary";
48
+ runId: string;
49
+ iterations: number;
50
+ stopReason: string;
51
+ journalFile: string;
52
+ memoryFile: string;
53
+ reviewEvery: number;
54
+ toolPath: string;
55
+ };
56
+ export type LoopEventEmitter = (event: LoopEvent) => void;
package/dist/events.js ADDED
@@ -0,0 +1,9 @@
1
+ // LoopEvent — the public event envelope for SDK consumers.
2
+ //
3
+ // Emitted by harness.run() via RunOptions.onEvent. Each Phase-1 commit moves
4
+ // one or more console.log call sites onto this stream; the default CLI
5
+ // event-printer (cli/event-printer.ts) renders them using the helpers in
6
+ // harness/display.ts. SDK consumers can ignore the display variants entirely
7
+ // or drive their own UI.
8
+ export {};
9
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,6EAA6E;AAC7E,uEAAuE;AACvE,yEAAyE;AACzE,6EAA6E;AAC7E,yBAAyB"}
@@ -0,0 +1,6 @@
1
+ import { emit as emitCmd } from "./emit.js";
2
+ import type { LoopContext, RunOptions, RunSummary } from "./types.js";
3
+ export type { LoopContext, RunOptions, RunSummary };
4
+ export declare function run(projectDir: string, promptOverride: string | null, selfCommand: string, runOptions: RunOptions): Promise<RunSummary>;
5
+ export { emitCmd as emit };
6
+ export declare function runParallelBranchCli(projectDir: string, branchDir: string, selfCommand: string, onEvent?: (event: import("./events.js").LoopEvent) => void): Promise<void>;