@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.
- package/dist/artifacts.d.ts +50 -0
- package/dist/artifacts.js +333 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/config-helpers.d.ts +36 -0
- package/dist/config-helpers.js +427 -0
- package/dist/config-helpers.js.map +1 -0
- package/dist/coordination.d.ts +1 -0
- package/dist/coordination.js +126 -0
- package/dist/coordination.js.map +1 -0
- package/dist/display.d.ts +21 -0
- package/dist/display.js +177 -0
- package/dist/display.js.map +1 -0
- package/dist/emit.d.ts +21 -0
- package/dist/emit.js +243 -0
- package/dist/emit.js.map +1 -0
- package/dist/events.d.ts +56 -0
- package/dist/events.js +9 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +272 -0
- package/dist/index.js.map +1 -0
- package/dist/iteration.d.ts +16 -0
- package/dist/iteration.js +153 -0
- package/dist/iteration.js.map +1 -0
- package/dist/metareview.d.ts +6 -0
- package/dist/metareview.js +104 -0
- package/dist/metareview.js.map +1 -0
- package/dist/metrics.d.ts +12 -0
- package/dist/metrics.js +177 -0
- package/dist/metrics.js.map +1 -0
- package/dist/parallel.d.ts +37 -0
- package/dist/parallel.js +242 -0
- package/dist/parallel.js.map +1 -0
- package/dist/pi-adapter.d.ts +1 -0
- package/dist/pi-adapter.js +220 -0
- package/dist/pi-adapter.js.map +1 -0
- package/dist/prompt.d.ts +46 -0
- package/dist/prompt.js +446 -0
- package/dist/prompt.js.map +1 -0
- package/dist/registry-bridge.d.ts +7 -0
- package/dist/registry-bridge.js +63 -0
- package/dist/registry-bridge.js.map +1 -0
- package/dist/scratchpad.d.ts +2 -0
- package/dist/scratchpad.js +65 -0
- package/dist/scratchpad.js.map +1 -0
- package/dist/stop.d.ts +5 -0
- package/dist/stop.js +81 -0
- package/dist/stop.js.map +1 -0
- package/dist/tools.d.ts +3 -0
- package/dist/tools.js +65 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +137 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/wave/finalize-wave.d.ts +9 -0
- package/dist/wave/finalize-wave.js +86 -0
- package/dist/wave/finalize-wave.js.map +1 -0
- package/dist/wave/launch-branches.d.ts +6 -0
- package/dist/wave/launch-branches.js +313 -0
- package/dist/wave/launch-branches.js.map +1 -0
- package/dist/wave/parse-objectives.d.ts +3 -0
- package/dist/wave/parse-objectives.js +32 -0
- package/dist/wave/parse-objectives.js.map +1 -0
- package/dist/wave/types.d.ts +43 -0
- package/dist/wave/types.js +2 -0
- package/dist/wave/types.js.map +1 -0
- package/dist/wave.d.ts +6 -0
- package/dist/wave.js +158 -0
- package/dist/wave.js.map +1 -0
- package/package.json +100 -0
package/dist/prompt.js
ADDED
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
import { joinCsv, listText } from "@mobrienv/autoloop-core";
|
|
2
|
+
import { resolveRoleAgent } from "@mobrienv/autoloop-core/agent-map";
|
|
3
|
+
import { appendHarnessEvent, extractField, extractIteration, extractTopic, readLines, readRunLines, } from "@mobrienv/autoloop-core/journal";
|
|
4
|
+
import * as memory from "@mobrienv/autoloop-core/memory";
|
|
5
|
+
import { materialize as materializeTasks } from "@mobrienv/autoloop-core/tasks";
|
|
6
|
+
import { renderTasksPrompt } from "@mobrienv/autoloop-core/tasks-render";
|
|
7
|
+
import * as topology from "@mobrienv/autoloop-core/topology";
|
|
8
|
+
import { coordinationTopic, coreSystemTopic, parallelTopic, reservedParallelJoinedTopic, routingTopic, systemTopic, } from "./emit.js";
|
|
9
|
+
import { renderRunScratchpadPrompt } from "./scratchpad.js";
|
|
10
|
+
function deriveRunContext(loop, runLines) {
|
|
11
|
+
const taskLines = readLines(loop.paths.tasksFile);
|
|
12
|
+
const tasksMaterialized = materializeTasks(taskLines);
|
|
13
|
+
const tasksText = renderTasksPrompt(tasksMaterialized, loop.tasks.budgetChars);
|
|
14
|
+
return {
|
|
15
|
+
scratchpadText: renderRunScratchpadPrompt(runLines),
|
|
16
|
+
memoryText: memory.renderTwoTier(loop.paths.memoryFile, loop.paths.runMemoryFile, loop.memory.budgetChars),
|
|
17
|
+
memoryStats: memory.statsTwoTier(loop.paths.memoryFile, loop.paths.runMemoryFile, loop.memory.budgetChars),
|
|
18
|
+
tasksText,
|
|
19
|
+
tasksStats: {
|
|
20
|
+
open: tasksMaterialized.open.length,
|
|
21
|
+
done: tasksMaterialized.done.length,
|
|
22
|
+
total: tasksMaterialized.open.length + tasksMaterialized.done.length,
|
|
23
|
+
},
|
|
24
|
+
guidanceMessages: drainGuidance(runLines),
|
|
25
|
+
routing: iterationRoutingContext(loop.topology, runLines),
|
|
26
|
+
backpressure: latestInvalidNote(runLines),
|
|
27
|
+
invalidCount: invalidEventCount(runLines),
|
|
28
|
+
lastRejected: lastRejectedTopic(runLines),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function buildIterationContext(loop, iteration) {
|
|
32
|
+
const runLines = readRunLines(loop.paths.journalFile, loop.runtime.runId);
|
|
33
|
+
const derived = deriveRunContext(loop, runLines);
|
|
34
|
+
const activeRole = derived.routing.allowedRoles.length === 1
|
|
35
|
+
? derived.routing.allowedRoles[0]
|
|
36
|
+
: "";
|
|
37
|
+
const roleAgent = resolveRoleAgent(loop.agentMap, loop.launch.preset, activeRole) || "";
|
|
38
|
+
const prompt = renderIterationPromptText(loop, iteration, derived);
|
|
39
|
+
if (derived.guidanceMessages.length > 0) {
|
|
40
|
+
appendHarnessEvent(loop.paths.journalFile, loop.runtime.runId, String(iteration), "operator.guidance.consumed", `Consumed ${derived.guidanceMessages.length} guidance message(s)`);
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
iteration,
|
|
44
|
+
recentEvent: derived.routing.recentEvent,
|
|
45
|
+
allowedRoles: derived.routing.allowedRoles,
|
|
46
|
+
allowedEvents: derived.routing.allowedEvents,
|
|
47
|
+
backpressure: derived.backpressure,
|
|
48
|
+
lastRejected: derived.lastRejected,
|
|
49
|
+
scratchpadText: derived.scratchpadText,
|
|
50
|
+
memoryText: derived.memoryText,
|
|
51
|
+
prompt,
|
|
52
|
+
roleAgent,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function iterationRoutingContext(topo, runLines) {
|
|
56
|
+
const recentEvent = routingEventFromLines(runLines);
|
|
57
|
+
if (reservedParallelJoinedTopic(recentEvent)) {
|
|
58
|
+
return joinedIterationRoutingContext(topo, runLines, recentEvent);
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
recentEvent,
|
|
62
|
+
allowedRoles: topology.suggestedRoles(topo, recentEvent),
|
|
63
|
+
allowedEvents: topology.allowedEvents(topo, recentEvent),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function joinedIterationRoutingContext(topo, runLines, joinedTopic) {
|
|
67
|
+
const joinLine = latestWaveJoinFinishLine(runLines, joinedTopic);
|
|
68
|
+
const routingBasis = joinedRoutingBasis(joinLine, joinedTopic);
|
|
69
|
+
const resumeRecentEvent = joinedRecentEvent(joinLine, joinedTopic);
|
|
70
|
+
const fallbackRoles = topology.suggestedRoles(topo, routingBasis);
|
|
71
|
+
const fallbackEvents = topology.allowedEvents(topo, routingBasis);
|
|
72
|
+
const restoredRoles = csvFieldList(joinLine, "resume_roles");
|
|
73
|
+
const restoredEvents = csvFieldList(joinLine, "resume_events");
|
|
74
|
+
return {
|
|
75
|
+
recentEvent: resumeRecentEvent,
|
|
76
|
+
allowedRoles: restoredRoles.length > 0 ? restoredRoles : fallbackRoles,
|
|
77
|
+
allowedEvents: restoredEvents.length > 0 ? restoredEvents : fallbackEvents,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function latestWaveJoinFinishLine(lines, joinedTopic) {
|
|
81
|
+
let current = "";
|
|
82
|
+
for (const line of lines) {
|
|
83
|
+
if (extractTopic(line) === "wave.join.finish") {
|
|
84
|
+
if (extractField(line, "joined_topic") === joinedTopic) {
|
|
85
|
+
current = line;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return current;
|
|
90
|
+
}
|
|
91
|
+
function joinedRoutingBasis(joinLine, joinedTopic) {
|
|
92
|
+
if (!joinLine)
|
|
93
|
+
return defaultJoinedRoutingBasis(joinedTopic);
|
|
94
|
+
const basis = extractField(joinLine, "routing_basis");
|
|
95
|
+
return basis || defaultJoinedRoutingBasis(joinedTopic);
|
|
96
|
+
}
|
|
97
|
+
function defaultJoinedRoutingBasis(joinedTopic) {
|
|
98
|
+
if (joinedTopic === "explore.parallel.joined")
|
|
99
|
+
return "loop.start";
|
|
100
|
+
if (joinedTopic.endsWith(".parallel.joined")) {
|
|
101
|
+
return joinedTopic.slice(0, -".parallel.joined".length);
|
|
102
|
+
}
|
|
103
|
+
return joinedTopic;
|
|
104
|
+
}
|
|
105
|
+
function joinedRecentEvent(joinLine, joinedTopic) {
|
|
106
|
+
if (!joinLine)
|
|
107
|
+
return joinedTopic;
|
|
108
|
+
return extractField(joinLine, "resume_recent_event") || joinedTopic;
|
|
109
|
+
}
|
|
110
|
+
function csvFieldList(line, field) {
|
|
111
|
+
if (!line)
|
|
112
|
+
return [];
|
|
113
|
+
const value = extractField(line, field);
|
|
114
|
+
if (!value)
|
|
115
|
+
return [];
|
|
116
|
+
return value
|
|
117
|
+
.split(",")
|
|
118
|
+
.map((s) => s.trim())
|
|
119
|
+
.filter((s) => s !== "");
|
|
120
|
+
}
|
|
121
|
+
export function routingEventFromLines(lines) {
|
|
122
|
+
let current = "loop.start";
|
|
123
|
+
for (const line of lines) {
|
|
124
|
+
const topic = extractTopic(line);
|
|
125
|
+
if (topic === "event.invalid") {
|
|
126
|
+
const extracted = extractField(line, "recent_event");
|
|
127
|
+
if (extracted)
|
|
128
|
+
current = extracted;
|
|
129
|
+
}
|
|
130
|
+
else if (routingTopic(topic)) {
|
|
131
|
+
current = topic;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return current;
|
|
135
|
+
}
|
|
136
|
+
export function latestInvalidNote(runLines) {
|
|
137
|
+
let note = "";
|
|
138
|
+
for (const line of runLines) {
|
|
139
|
+
const topic = extractTopic(line);
|
|
140
|
+
if (topic === "event.invalid") {
|
|
141
|
+
note = invalidNoteFromLine(line);
|
|
142
|
+
}
|
|
143
|
+
else if (!systemTopic(topic)) {
|
|
144
|
+
note = "";
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return note;
|
|
148
|
+
}
|
|
149
|
+
function invalidNoteFromLine(line) {
|
|
150
|
+
return ("Emitted `" +
|
|
151
|
+
extractField(line, "emitted") +
|
|
152
|
+
"` after `" +
|
|
153
|
+
extractField(line, "recent_event") +
|
|
154
|
+
"`.\n" +
|
|
155
|
+
"Suggested roles: " +
|
|
156
|
+
emptyListText(extractField(line, "suggested_roles")) +
|
|
157
|
+
"\n" +
|
|
158
|
+
"Allowed next events: " +
|
|
159
|
+
emptyListText(extractField(line, "allowed_events")) +
|
|
160
|
+
"\n" +
|
|
161
|
+
"Re-emit using one of the allowed events above.");
|
|
162
|
+
}
|
|
163
|
+
function emptyListText(text) {
|
|
164
|
+
return text || "(none)";
|
|
165
|
+
}
|
|
166
|
+
export function invalidEventCount(runLines) {
|
|
167
|
+
let count = 0;
|
|
168
|
+
for (const line of runLines) {
|
|
169
|
+
if (extractTopic(line) === "event.invalid")
|
|
170
|
+
count++;
|
|
171
|
+
}
|
|
172
|
+
return count;
|
|
173
|
+
}
|
|
174
|
+
export function lastRejectedTopic(runLines) {
|
|
175
|
+
let last = "";
|
|
176
|
+
for (const line of runLines) {
|
|
177
|
+
if (extractTopic(line) === "event.invalid") {
|
|
178
|
+
last = extractField(line, "emitted");
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return last;
|
|
182
|
+
}
|
|
183
|
+
export function renderIterationPromptText(loop, iteration, derived) {
|
|
184
|
+
const { routing, backpressure, memoryStats, memoryText, tasksText, tasksStats, guidanceMessages, scratchpadText, invalidCount, lastRejected, } = derived;
|
|
185
|
+
const { allowedRoles, allowedEvents, recentEvent } = routing;
|
|
186
|
+
return ("You are inside a bare-minimal autoloops harness.\n\n" +
|
|
187
|
+
harnessInstructionsText(loop) +
|
|
188
|
+
contextPressureText(memoryStats, tasksStats, invalidCount, lastRejected) +
|
|
189
|
+
backpressureText(backpressure) +
|
|
190
|
+
"Objective:\n" +
|
|
191
|
+
loop.objective +
|
|
192
|
+
"\n\n" +
|
|
193
|
+
renderGuidanceSection(guidanceMessages) +
|
|
194
|
+
(memoryText ? `${memoryText}\n` : "") +
|
|
195
|
+
(tasksText ? `${tasksText}\n` : "") +
|
|
196
|
+
topology.renderWithContext(loop.topology, recentEvent, allowedRoles, allowedEvents) +
|
|
197
|
+
"\n" +
|
|
198
|
+
parallelPromptText(loop, allowedEvents) +
|
|
199
|
+
`Iteration: ${iteration}/${loop.limits.maxIterations}\n` +
|
|
200
|
+
`Log level: ${loop.runtime.logLevel}\n` +
|
|
201
|
+
`Completion event: ${loop.completion.event}\n` +
|
|
202
|
+
`Completion promise fallback: ${loop.completion.promise}\n` +
|
|
203
|
+
`Required events: ${loop.completion.requiredEvents.length === 0 ? "(none)" : joinCsv(loop.completion.requiredEvents)}\n` +
|
|
204
|
+
`Loop-owned working files belong under: ${loop.paths.stateDir}\n` +
|
|
205
|
+
`Do not leave loop-owned artifacts at the repo root. Use paths under ${loop.paths.stateDir} such as ${loop.paths.stateDir}/progress.md or ${loop.paths.stateDir}/logs/.\n` +
|
|
206
|
+
`Suggested next roles now: ${listText(allowedRoles)}\n` +
|
|
207
|
+
`Allowed next events now: ${listText(allowedEvents)}\n` +
|
|
208
|
+
"Event tool: " +
|
|
209
|
+
loop.paths.toolPath +
|
|
210
|
+
"\n\n" +
|
|
211
|
+
"Current scratchpad:\n" +
|
|
212
|
+
(scratchpadText || "(empty)") +
|
|
213
|
+
"\n\n" +
|
|
214
|
+
"Use the event tool to publish your allowed handoff or completion event.\n" +
|
|
215
|
+
"Examples:\n" +
|
|
216
|
+
loop.paths.toolPath +
|
|
217
|
+
' emit <allowed-topic> "brief handoff summary"\n' +
|
|
218
|
+
loop.paths.toolPath +
|
|
219
|
+
" emit " +
|
|
220
|
+
loop.completion.event +
|
|
221
|
+
' "brief completion summary"\n' +
|
|
222
|
+
loop.paths.toolPath +
|
|
223
|
+
' memory add learning "durable lesson"\n' +
|
|
224
|
+
loop.paths.toolPath +
|
|
225
|
+
' memory add preference Workflow "short preference note"\n' +
|
|
226
|
+
loop.paths.toolPath +
|
|
227
|
+
' task add "description of work item"\n' +
|
|
228
|
+
loop.paths.toolPath +
|
|
229
|
+
" task complete task-1\n\n" +
|
|
230
|
+
"Backpressure rule: if you emit an event outside the allowed next-event set, the loop will reject that handoff and ask you to re-route.\n" +
|
|
231
|
+
"Prompt/output/scratchpad/memory are projections or stores you can inspect with `" +
|
|
232
|
+
loop.paths.toolPath +
|
|
233
|
+
` inspect prompt ${iteration} --format md\`, \`` +
|
|
234
|
+
loop.paths.toolPath +
|
|
235
|
+
" inspect scratchpad --format md`, and `" +
|
|
236
|
+
loop.paths.toolPath +
|
|
237
|
+
" inspect memory --format md`.\n" +
|
|
238
|
+
"Plain text alone does not publish an event. Prefer the event tool over the stdout completion promise.\n");
|
|
239
|
+
}
|
|
240
|
+
export function renderReviewPromptText(loop, iteration, runLines) {
|
|
241
|
+
const derived = deriveRunContext(loop, runLines);
|
|
242
|
+
const { scratchpadText, memoryText, tasksText, memoryStats, tasksStats, guidanceMessages, routing, backpressure, invalidCount, lastRejected, } = derived;
|
|
243
|
+
const latestIteration = String(maxReviewPromptIteration(runLines));
|
|
244
|
+
const adversarialPreamble = iteration === 1 && loop.review.adversarialFirst
|
|
245
|
+
? "You are the adversarial gate for this loop. Your job is to be skeptical.\n" +
|
|
246
|
+
"Assume the loop is wasting compute until proven otherwise.\n\n" +
|
|
247
|
+
"After reviewing iteration 1 output, you MUST emit exactly one verdict:\n\n" +
|
|
248
|
+
"- CONTINUE: The approach is correct AND more iterations will meaningfully improve output.\n" +
|
|
249
|
+
"- REDIRECT: The approach is wrong or suboptimal. Provide a corrected task prompt.\n" +
|
|
250
|
+
"- TAKEOVER: The task is trivial enough to solve now, or so broken that iterating won't help. Provide the solution directly.\n" +
|
|
251
|
+
"- EXIT: Iteration 1 output is already sufficient. Stop.\n\n" +
|
|
252
|
+
"Default to EXIT or REDIRECT. Only CONTINUE if you can articulate what specific improvements further iterations will produce.\n\n"
|
|
253
|
+
: "";
|
|
254
|
+
const verdictSchema = "\n## Verdict\n\n" +
|
|
255
|
+
"You MUST include a JSON verdict block in your response:\n\n" +
|
|
256
|
+
"```json\n" +
|
|
257
|
+
"{\n" +
|
|
258
|
+
' "verdict": "CONTINUE | REDIRECT | TAKEOVER | EXIT",\n' +
|
|
259
|
+
' "confidence": 0.0,\n' +
|
|
260
|
+
' "reasoning": "One paragraph explaining the decision",\n' +
|
|
261
|
+
' "redirect_prompt": "New/amended task prompt (REDIRECT only)",\n' +
|
|
262
|
+
' "takeover_output": "Direct solution content (TAKEOVER only)",\n' +
|
|
263
|
+
' "suggestions": ["Optional list of specific improvements for CONTINUE"]\n' +
|
|
264
|
+
"}\n" +
|
|
265
|
+
"```\n";
|
|
266
|
+
return (adversarialPreamble +
|
|
267
|
+
"You are the metareview meta-reviewer for this loop.\n\n" +
|
|
268
|
+
"Your job is to improve the loop itself, not to finish the task directly.\n" +
|
|
269
|
+
"You may make bounded hygiene edits to runtime-facing loop files when that will improve the next iterations.\n" +
|
|
270
|
+
`Safe edit targets include \`autoloops.toml\`, \`topology.toml\`, \`harness.md\`, \`metareview.md\`, \`roles/*.md\`, \`${loop.paths.stateDir}/context.md\`, \`${loop.paths.stateDir}/plan.md\`, \`${loop.paths.stateDir}/progress.md\`, \`${loop.paths.stateDir}/logs/\`, and \`${loop.paths.stateDir}/docs/*.md\`.\n` +
|
|
271
|
+
`Keep loop-owned artifacts under \`${loop.paths.stateDir}/\`; do not leave loop-owned working files at the repo root.\n` +
|
|
272
|
+
`Use \`${loop.paths.toolPath} memory add ...\` for short durable lessons or operator notes that should persist across turns.\n` +
|
|
273
|
+
`Do not edit app/product source code, tests, package manifests, generated state under \`${loop.paths.stateDir}/\`, or journal history during review.\n` +
|
|
274
|
+
"The scratchpad is projected from journal history, so do not try to edit it directly; instead tighten prompts, working files, or archived context so future iterations stay concise.\n" +
|
|
275
|
+
"Do not emit normal loop events during review.\n\n" +
|
|
276
|
+
reviewInstructionsText(loop) +
|
|
277
|
+
contextPressureText(memoryStats, tasksStats, invalidCount, lastRejected) +
|
|
278
|
+
backpressureText(backpressure) +
|
|
279
|
+
renderGuidanceSection(guidanceMessages) +
|
|
280
|
+
(memoryText ? `${memoryText}\n` : "") +
|
|
281
|
+
(tasksText ? `${tasksText}\n` : "") +
|
|
282
|
+
`Review trigger iteration: ${iteration}\n` +
|
|
283
|
+
"Latest routing event: " +
|
|
284
|
+
routing.recentEvent +
|
|
285
|
+
"\n\n" +
|
|
286
|
+
topology.renderWithContext(loop.topology, routing.recentEvent, routing.allowedRoles, routing.allowedEvents) +
|
|
287
|
+
"\n" +
|
|
288
|
+
"Current scratchpad:\n" +
|
|
289
|
+
(scratchpadText || "(empty)") +
|
|
290
|
+
"\n\n" +
|
|
291
|
+
"Useful commands:\n" +
|
|
292
|
+
loop.paths.toolPath +
|
|
293
|
+
" inspect scratchpad --format md\n" +
|
|
294
|
+
loop.paths.toolPath +
|
|
295
|
+
" inspect memory --format md\n" +
|
|
296
|
+
loop.paths.toolPath +
|
|
297
|
+
" inspect prompt " +
|
|
298
|
+
latestIteration +
|
|
299
|
+
" --format md\n" +
|
|
300
|
+
loop.paths.toolPath +
|
|
301
|
+
" inspect output " +
|
|
302
|
+
latestIteration +
|
|
303
|
+
" --format text\n\n" +
|
|
304
|
+
"If no improvements are needed, store a short learning explaining why and exit cleanly.\n" +
|
|
305
|
+
verdictSchema);
|
|
306
|
+
}
|
|
307
|
+
export function drainGuidance(runLines) {
|
|
308
|
+
// Find the index of the last operator.guidance.consumed marker
|
|
309
|
+
let consumedIdx = -1;
|
|
310
|
+
for (let i = runLines.length - 1; i >= 0; i--) {
|
|
311
|
+
if (extractTopic(runLines[i]) === "operator.guidance.consumed") {
|
|
312
|
+
consumedIdx = i;
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Collect all operator.guidance events after the last consumed marker
|
|
317
|
+
const messages = [];
|
|
318
|
+
for (let i = consumedIdx + 1; i < runLines.length; i++) {
|
|
319
|
+
if (extractTopic(runLines[i]) === "operator.guidance") {
|
|
320
|
+
const payload = extractField(runLines[i], "payload");
|
|
321
|
+
if (payload)
|
|
322
|
+
messages.push(payload);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return messages;
|
|
326
|
+
}
|
|
327
|
+
function renderGuidanceSection(guidance) {
|
|
328
|
+
if (guidance.length === 0)
|
|
329
|
+
return "";
|
|
330
|
+
const body = guidance.length === 1
|
|
331
|
+
? guidance[0]
|
|
332
|
+
: guidance.map((g, i) => `${i + 1}. ${g}`).join("\n");
|
|
333
|
+
return ("## OPERATOR GUIDANCE\n\n" +
|
|
334
|
+
body +
|
|
335
|
+
"\n\n\u26a0\ufe0f Act on this guidance in this iteration. It will not be repeated.\n\n");
|
|
336
|
+
}
|
|
337
|
+
function harnessInstructionsText(loop) {
|
|
338
|
+
if (!loop.harness.instructions)
|
|
339
|
+
return "";
|
|
340
|
+
return `Live harness instructions:\n${loop.harness.instructions}\n\n`;
|
|
341
|
+
}
|
|
342
|
+
function reviewInstructionsText(loop) {
|
|
343
|
+
if (!loop.review.prompt)
|
|
344
|
+
return "";
|
|
345
|
+
return `Additional metareview instructions:\n${loop.review.prompt}\n\n`;
|
|
346
|
+
}
|
|
347
|
+
function contextPressureText(memoryStats, tasksStats, invalidCount, lastRejected) {
|
|
348
|
+
return ("Context pressure:\n" +
|
|
349
|
+
"- Memory: " +
|
|
350
|
+
memoryPressureSummary(memoryStats) +
|
|
351
|
+
"\n" +
|
|
352
|
+
"- Tasks: " +
|
|
353
|
+
tasksPressureSummary(tasksStats) +
|
|
354
|
+
"\n" +
|
|
355
|
+
"- Invalid emits this run: " +
|
|
356
|
+
invalidCount +
|
|
357
|
+
invalidEmitHint(invalidCount, lastRejected) +
|
|
358
|
+
"\n" +
|
|
359
|
+
contextPressureRecommendation(memoryStats.truncated, invalidCount));
|
|
360
|
+
}
|
|
361
|
+
function tasksPressureSummary(stats) {
|
|
362
|
+
if (stats.total === 0)
|
|
363
|
+
return "no tasks";
|
|
364
|
+
return `${stats.open} open, ${stats.done} done (${stats.total} total)`;
|
|
365
|
+
}
|
|
366
|
+
function memoryPressureSummary(stats) {
|
|
367
|
+
const p = stats.project;
|
|
368
|
+
const r = stats.run;
|
|
369
|
+
const parts = [];
|
|
370
|
+
if (p.preferences.length > 0)
|
|
371
|
+
parts.push(`${p.preferences.length} project preferences`);
|
|
372
|
+
if (p.learnings.length > 0)
|
|
373
|
+
parts.push(`${p.learnings.length} project learnings`);
|
|
374
|
+
if (r.learnings.length > 0)
|
|
375
|
+
parts.push(`${r.learnings.length} run learnings`);
|
|
376
|
+
if (r.meta.length > 0)
|
|
377
|
+
parts.push(`${r.meta.length} run meta`);
|
|
378
|
+
if (p.meta.length > 0)
|
|
379
|
+
parts.push(`${p.meta.length} project meta`);
|
|
380
|
+
const totalEntries = p.preferences.length +
|
|
381
|
+
p.learnings.length +
|
|
382
|
+
p.meta.length +
|
|
383
|
+
r.preferences.length +
|
|
384
|
+
r.learnings.length +
|
|
385
|
+
r.meta.length;
|
|
386
|
+
const entryDetail = `${totalEntries} entries (${parts.length > 0 ? parts.join(", ") : "empty"})`;
|
|
387
|
+
if (stats.truncated) {
|
|
388
|
+
return `${stats.combinedRenderedChars}/${stats.budgetChars} chars across ${entryDetail} — truncated by ${stats.combinedRenderedChars - stats.budgetChars} chars (drop order: meta → learnings → preferences)`;
|
|
389
|
+
}
|
|
390
|
+
if (stats.budgetChars <= 0) {
|
|
391
|
+
return `${stats.combinedRenderedChars} chars across ${entryDetail}; prompt budget disabled`;
|
|
392
|
+
}
|
|
393
|
+
return `${stats.combinedRenderedChars}/${stats.budgetChars} chars across ${entryDetail}`;
|
|
394
|
+
}
|
|
395
|
+
function invalidEmitHint(invalidCount, lastRejected) {
|
|
396
|
+
if (invalidCount === 0)
|
|
397
|
+
return "";
|
|
398
|
+
if (!lastRejected)
|
|
399
|
+
return " — routing is currently under backpressure";
|
|
400
|
+
return ` — routing backpressure; last rejected: \`${lastRejected}\``;
|
|
401
|
+
}
|
|
402
|
+
function contextPressureRecommendation(truncated, invalidCount) {
|
|
403
|
+
if (truncated || invalidCount > 0) {
|
|
404
|
+
return "- Recommendation: consolidate stale or duplicate context before adding new memory, and re-route using the allowed-event set when needed.\n\n";
|
|
405
|
+
}
|
|
406
|
+
return "\n";
|
|
407
|
+
}
|
|
408
|
+
function backpressureText(text) {
|
|
409
|
+
return text ? `Backpressure:\n${text}\n\n` : "";
|
|
410
|
+
}
|
|
411
|
+
function parallelPromptText(loop, allowedEvents) {
|
|
412
|
+
if (!loop.parallel.enabled || loop.runtime.branchMode)
|
|
413
|
+
return "";
|
|
414
|
+
const dispatch = parallelDispatchPromptEvents(allowedEvents, loop.completion.event);
|
|
415
|
+
const dispatchLine = dispatch.length === 0
|
|
416
|
+
? "- Dispatch fan-out is available as `<allowed-event>.parallel` for currently allowed normal handoff events.\n"
|
|
417
|
+
: "- Dispatch fan-out is available now via `<allowed-event>.parallel`: " +
|
|
418
|
+
dispatch.map((e) => `\`${e}\``).join(", ") +
|
|
419
|
+
".\n";
|
|
420
|
+
return ("Structured parallelism:\n" +
|
|
421
|
+
"- `explore.parallel` is available for exploratory self-loop fan-out before you choose the real next event.\n" +
|
|
422
|
+
dispatchLine +
|
|
423
|
+
`- Payloads must be a markdown bullet list or numbered list with 1..${loop.parallel.maxBranches} distinct branch objectives.\n` +
|
|
424
|
+
"- Use fan-out only when branches are concrete, independently useful, and worth the barrier cost; keep one active wave at a time.\n" +
|
|
425
|
+
`- Branches run in isolated state under \`${loop.paths.stateDir}/waves/\`; only the harness may emit \`*.parallel.joined\` to resume the parent after the join barrier.\n\n`);
|
|
426
|
+
}
|
|
427
|
+
function parallelDispatchPromptEvents(allowedEvents, completionEvent) {
|
|
428
|
+
return allowedEvents
|
|
429
|
+
.filter((e) => e !== completionEvent &&
|
|
430
|
+
!coordinationTopic(e) &&
|
|
431
|
+
!coreSystemTopic(e) &&
|
|
432
|
+
!parallelTopic(e))
|
|
433
|
+
.map((e) => `${e}.parallel`);
|
|
434
|
+
}
|
|
435
|
+
function maxReviewPromptIteration(runLines) {
|
|
436
|
+
let current = 1;
|
|
437
|
+
for (const line of runLines) {
|
|
438
|
+
if (extractTopic(line) === "iteration.start") {
|
|
439
|
+
const val = parseInt(extractIteration(line), 10);
|
|
440
|
+
if (!Number.isNaN(val) && val > current)
|
|
441
|
+
current = val;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return current;
|
|
445
|
+
}
|
|
446
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RegistryStatus } from "@mobrienv/autoloop-core/registry/types";
|
|
2
|
+
import type { LoopContext } from "./types.js";
|
|
3
|
+
export declare function registryStart(loop: LoopContext): void;
|
|
4
|
+
export declare function registryProgress(loop: LoopContext, iteration: number): void;
|
|
5
|
+
export declare function registryTerminal(loop: LoopContext, iteration: number, status: RegistryStatus, stopReason: string, latestEvent: string): void;
|
|
6
|
+
export declare function registryComplete(loop: LoopContext, iteration: number, reason: string): void;
|
|
7
|
+
export declare function registryStop(loop: LoopContext, iteration: number, reason: string): void;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { normalizeBackendLabel } from "@mobrienv/autoloop-core";
|
|
2
|
+
import { stopReasonToStatus } from "@mobrienv/autoloop-core/registry/derive";
|
|
3
|
+
import { getRun } from "@mobrienv/autoloop-core/registry/read";
|
|
4
|
+
import { appendRegistryEntry } from "@mobrienv/autoloop-core/registry/update";
|
|
5
|
+
function registryPath(loop) {
|
|
6
|
+
return loop.paths.registryFile;
|
|
7
|
+
}
|
|
8
|
+
function baseRecord(loop) {
|
|
9
|
+
return {
|
|
10
|
+
run_id: loop.runtime.runId,
|
|
11
|
+
status: "running",
|
|
12
|
+
preset: loop.launch.preset,
|
|
13
|
+
objective: loop.objective,
|
|
14
|
+
trigger: loop.launch.trigger,
|
|
15
|
+
project_dir: loop.paths.projectDir,
|
|
16
|
+
work_dir: loop.paths.workDir,
|
|
17
|
+
state_dir: loop.paths.stateDir,
|
|
18
|
+
journal_file: loop.paths.journalFile,
|
|
19
|
+
parent_run_id: loop.launch.parentRunId,
|
|
20
|
+
backend: normalizeBackendLabel(loop.backend.command),
|
|
21
|
+
backend_args: loop.backend.args,
|
|
22
|
+
created_at: loop.launch.createdAt,
|
|
23
|
+
updated_at: new Date().toISOString(),
|
|
24
|
+
iteration: 0,
|
|
25
|
+
max_iterations: loop.limits.maxIterations,
|
|
26
|
+
stop_reason: "",
|
|
27
|
+
latest_event: "loop.start",
|
|
28
|
+
isolation_mode: loop.runtime.isolationMode ?? "run-scoped",
|
|
29
|
+
worktree_name: loop.paths.worktreeBranch || "",
|
|
30
|
+
worktree_path: loop.paths.worktreePath || "",
|
|
31
|
+
pid: process.pid,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function registryStart(loop) {
|
|
35
|
+
appendRegistryEntry(registryPath(loop), baseRecord(loop));
|
|
36
|
+
}
|
|
37
|
+
export function registryProgress(loop, iteration) {
|
|
38
|
+
const path = registryPath(loop);
|
|
39
|
+
const existing = getRun(path, loop.runtime.runId);
|
|
40
|
+
const record = existing ? { ...existing } : baseRecord(loop);
|
|
41
|
+
record.iteration = iteration;
|
|
42
|
+
record.updated_at = new Date().toISOString();
|
|
43
|
+
record.latest_event = "iteration.finish";
|
|
44
|
+
appendRegistryEntry(path, record);
|
|
45
|
+
}
|
|
46
|
+
export function registryTerminal(loop, iteration, status, stopReason, latestEvent) {
|
|
47
|
+
const path = registryPath(loop);
|
|
48
|
+
const existing = getRun(path, loop.runtime.runId);
|
|
49
|
+
const record = existing ? { ...existing } : baseRecord(loop);
|
|
50
|
+
record.status = status;
|
|
51
|
+
record.iteration = iteration;
|
|
52
|
+
record.stop_reason = stopReason;
|
|
53
|
+
record.updated_at = new Date().toISOString();
|
|
54
|
+
record.latest_event = latestEvent;
|
|
55
|
+
appendRegistryEntry(path, record);
|
|
56
|
+
}
|
|
57
|
+
export function registryComplete(loop, iteration, reason) {
|
|
58
|
+
registryTerminal(loop, iteration, "completed", reason, "loop.complete");
|
|
59
|
+
}
|
|
60
|
+
export function registryStop(loop, iteration, reason) {
|
|
61
|
+
registryTerminal(loop, iteration, stopReasonToStatus(reason), reason, "loop.stop");
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=registry-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-bridge.js","sourceRoot":"","sources":["../src/registry-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { bulletList, decodeEvent, heading, lineSep, } from "@mobrienv/autoloop-core";
|
|
2
|
+
export function renderRunScratchpadFull(lines) {
|
|
3
|
+
const entries = collectScratchpadEntries(lines);
|
|
4
|
+
return renderScratchpadEntries(entries);
|
|
5
|
+
}
|
|
6
|
+
export function renderRunScratchpadPrompt(lines) {
|
|
7
|
+
const entries = collectScratchpadEntries(lines);
|
|
8
|
+
if (entries.length <= 4)
|
|
9
|
+
return renderScratchpadEntries(entries);
|
|
10
|
+
const compactCount = entries.length - 4;
|
|
11
|
+
const compacted = entries.slice(0, compactCount);
|
|
12
|
+
const recent = entries.slice(compactCount);
|
|
13
|
+
return (heading(2, "Earlier iterations (compacted)") +
|
|
14
|
+
"\n\n" +
|
|
15
|
+
bulletList(compacted.map(compactScratchpadItem)) +
|
|
16
|
+
"\n\n" +
|
|
17
|
+
renderScratchpadEntries(recent));
|
|
18
|
+
}
|
|
19
|
+
function collectScratchpadEntries(lines) {
|
|
20
|
+
const entries = [];
|
|
21
|
+
for (const line of lines) {
|
|
22
|
+
const event = decodeEvent(line);
|
|
23
|
+
if (!event ||
|
|
24
|
+
event.shape !== "fields" ||
|
|
25
|
+
event.topic !== "iteration.finish")
|
|
26
|
+
continue;
|
|
27
|
+
entries.push({
|
|
28
|
+
iteration: event.iteration ?? "",
|
|
29
|
+
exitCode: event.fields.exit_code ?? "",
|
|
30
|
+
output: event.fields.output ?? "",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return entries;
|
|
34
|
+
}
|
|
35
|
+
function renderScratchpadEntries(entries) {
|
|
36
|
+
return entries.map(scratchpadEntryText).join("");
|
|
37
|
+
}
|
|
38
|
+
function scratchpadEntryText(entry) {
|
|
39
|
+
return (heading(2, `Iteration ${entry.iteration}`) +
|
|
40
|
+
"\n\n" +
|
|
41
|
+
"exit_code=" +
|
|
42
|
+
entry.exitCode +
|
|
43
|
+
"\n\n" +
|
|
44
|
+
entry.output +
|
|
45
|
+
"\n");
|
|
46
|
+
}
|
|
47
|
+
function compactScratchpadItem(entry) {
|
|
48
|
+
return ("Iteration " +
|
|
49
|
+
entry.iteration +
|
|
50
|
+
" exit_code=" +
|
|
51
|
+
entry.exitCode +
|
|
52
|
+
" — " +
|
|
53
|
+
scratchpadEntrySummary(entry));
|
|
54
|
+
}
|
|
55
|
+
function scratchpadEntrySummary(entry) {
|
|
56
|
+
const lines = entry.output.split(lineSep());
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
const trimmed = line.trim();
|
|
59
|
+
if (trimmed !== "") {
|
|
60
|
+
return trimmed.length <= 120 ? trimmed : `${trimmed.slice(0, 120)}...`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return "(no output)";
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=scratchpad.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratchpad.js","sourceRoot":"","sources":["../src/scratchpad.ts"],"names":[],"mappings":"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"}
|
package/dist/stop.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { LoopContext, RunSummary } from "./types.js";
|
|
2
|
+
export declare function stopMaxIterations(loop: LoopContext, iteration: number): RunSummary;
|
|
3
|
+
export declare function stopBackendFailed(loop: LoopContext, iteration: number, output: string): RunSummary;
|
|
4
|
+
export declare function stopBackendTimeout(loop: LoopContext, iteration: number, output: string): RunSummary;
|
|
5
|
+
export declare function completeLoop(loop: LoopContext, iteration: number, reason: string): RunSummary;
|