@enderfga/claw-orchestrator 3.3.1 → 3.5.5

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 (37) hide show
  1. package/README.md +16 -1
  2. package/configs/autoloop-coder-prompt.md +59 -0
  3. package/configs/autoloop-planner-prompt.md +136 -0
  4. package/configs/autoloop-reviewer-prompt.md +76 -0
  5. package/dist/src/autoloop/agent-tools.d.ts +44 -0
  6. package/dist/src/autoloop/agent-tools.js +71 -0
  7. package/dist/src/autoloop/agent-tools.js.map +1 -0
  8. package/dist/src/autoloop/dispatcher.d.ts +137 -0
  9. package/dist/src/autoloop/dispatcher.js +580 -0
  10. package/dist/src/autoloop/dispatcher.js.map +1 -0
  11. package/dist/src/autoloop/messages.d.ts +114 -0
  12. package/dist/src/autoloop/messages.js +92 -0
  13. package/dist/src/autoloop/messages.js.map +1 -0
  14. package/dist/src/autoloop/notify.d.ts +36 -0
  15. package/dist/src/autoloop/notify.js +166 -0
  16. package/dist/src/autoloop/notify.js.map +1 -0
  17. package/dist/src/autoloop/planner-tools.d.ts +81 -0
  18. package/dist/src/autoloop/planner-tools.js +140 -0
  19. package/dist/src/autoloop/planner-tools.js.map +1 -0
  20. package/dist/src/autoloop/runner.d.ts +48 -0
  21. package/dist/src/autoloop/runner.js +214 -0
  22. package/dist/src/autoloop/runner.js.map +1 -0
  23. package/dist/src/autoloop/types.d.ts +69 -0
  24. package/dist/src/autoloop/types.js +16 -0
  25. package/dist/src/autoloop/types.js.map +1 -0
  26. package/dist/src/dashboard/index.html +910 -0
  27. package/dist/src/embedded-server.js +198 -0
  28. package/dist/src/embedded-server.js.map +1 -1
  29. package/dist/src/index.d.ts +5 -0
  30. package/dist/src/index.js +128 -0
  31. package/dist/src/index.js.map +1 -1
  32. package/dist/src/session-manager.d.ts +51 -0
  33. package/dist/src/session-manager.js +162 -0
  34. package/dist/src/session-manager.js.map +1 -1
  35. package/package.json +2 -2
  36. package/skills/SKILL.md +22 -1
  37. package/skills/references/autoloop.md +223 -0
@@ -0,0 +1,580 @@
1
+ /**
2
+ * ClaudeAgentDispatcher — wires the v2 runner to real persistent Claude
3
+ * sessions managed by SessionManager.
4
+ *
5
+ * S2 scope: Planner only (chat-mode, no subagents yet). Coder/Reviewer
6
+ * delivery throws — S4 wires them in.
7
+ *
8
+ * Naming convention:
9
+ * autoloop-<run_id>-planner
10
+ * autoloop-<run_id>-coder (S4)
11
+ * autoloop-<run_id>-reviewer (S4)
12
+ *
13
+ * Reply path:
14
+ * When the user chats, we sendMessage(planner, text) and capture the
15
+ * Planner's natural-language reply. The reply is *not* a v2 message —
16
+ * it is emitted as the dispatcher's own 'planner_reply' event so the
17
+ * `autoloop_chat` plugin tool can return it to the user. Structured
18
+ * signals (S3+) will be parsed out of the same reply text and pushed
19
+ * into the runner queue.
20
+ */
21
+ import { EventEmitter } from 'node:events';
22
+ import * as fs from 'node:fs';
23
+ import * as path from 'node:path';
24
+ import { fileURLToPath } from 'node:url';
25
+ import { nullLogger } from '../logger.js';
26
+ import { spawn } from 'node:child_process';
27
+ import { Msg } from './messages.js';
28
+ import { applyPlannerToolCalls, parsePlannerReply, } from './planner-tools.js';
29
+ import { extractIterComplete, extractReviewComplete, parseAgentReply } from './agent-tools.js';
30
+ function resolveConfigByName(filename) {
31
+ const filePath = fileURLToPath(import.meta.url);
32
+ let dir = path.dirname(filePath);
33
+ for (let i = 0; i < 8; i++) {
34
+ const candidate = path.join(dir, 'configs', filename);
35
+ if (fs.existsSync(candidate))
36
+ return candidate;
37
+ const parent = path.dirname(dir);
38
+ if (parent === dir)
39
+ break;
40
+ dir = parent;
41
+ }
42
+ return path.join(path.dirname(filePath), '..', 'configs', filename);
43
+ }
44
+ const resolveDefaultPlannerPrompt = () => resolveConfigByName('autoloop-planner-prompt.md');
45
+ const resolveDefaultCoderPrompt = () => resolveConfigByName('autoloop-coder-prompt.md');
46
+ const resolveDefaultReviewerPrompt = () => resolveConfigByName('autoloop-reviewer-prompt.md');
47
+ export class ClaudeAgentDispatcher extends EventEmitter {
48
+ config;
49
+ logger;
50
+ plannerName;
51
+ coderName;
52
+ reviewerName;
53
+ plannerStarted = false;
54
+ coderStarted = false;
55
+ reviewerStarted = false;
56
+ plannerSystemPrompt;
57
+ coderSystemPrompt;
58
+ reviewerSystemPrompt;
59
+ coderModel;
60
+ reviewerModel;
61
+ /** Where Reviewer reads from. Created lazily by stageReviewSandbox(). */
62
+ reviewerSandboxDir;
63
+ ledgerDir;
64
+ constructor(config) {
65
+ super();
66
+ this.config = config;
67
+ this.logger = config.logger ?? nullLogger;
68
+ this.plannerName = `autoloop-${config.runId}-planner`;
69
+ this.coderName = `autoloop-${config.runId}-coder`;
70
+ this.reviewerName = `autoloop-${config.runId}-reviewer`;
71
+ const promptPath = config.plannerPromptPath ?? resolveDefaultPlannerPrompt();
72
+ this.plannerSystemPrompt = fs.readFileSync(promptPath, 'utf-8');
73
+ this.coderSystemPrompt = fs.readFileSync(config.coderPromptPath ?? resolveDefaultCoderPrompt(), 'utf-8');
74
+ this.reviewerSystemPrompt = fs.readFileSync(config.reviewerPromptPath ?? resolveDefaultReviewerPrompt(), 'utf-8');
75
+ this.coderModel = config.coderModel ?? 'sonnet';
76
+ this.reviewerModel = config.reviewerModel ?? 'sonnet';
77
+ this.ledgerDir = path.join(config.workspace, 'tasks', config.runId);
78
+ this.reviewerSandboxDir = path.join(this.ledgerDir, 'reviewer_sandbox');
79
+ }
80
+ get sessionNames() {
81
+ return { planner: this.plannerName, coder: this.coderName, reviewer: this.reviewerName };
82
+ }
83
+ async init(state) {
84
+ void state;
85
+ await this.ensurePlanner();
86
+ }
87
+ async shutdown(reason) {
88
+ void reason;
89
+ // Best-effort cleanup. Stopping a non-existent session is a no-op.
90
+ for (const name of [this.plannerName, this.coderName, this.reviewerName]) {
91
+ try {
92
+ await this.config.manager.stopSession(name);
93
+ }
94
+ catch (err) {
95
+ this.logger.warn?.(`[autoloop] failed to stop ${name}: ${err.message}`);
96
+ }
97
+ }
98
+ }
99
+ async deliver(env) {
100
+ switch (env.to) {
101
+ case 'planner':
102
+ return await this.deliverToPlanner(env);
103
+ case 'coder':
104
+ return await this.deliverToCoder(env);
105
+ case 'reviewer':
106
+ return await this.deliverToReviewer(env);
107
+ default:
108
+ throw new Error(`[autoloop] unexpected dispatcher target: ${env.to}`);
109
+ }
110
+ }
111
+ /**
112
+ * Start Coder + Reviewer sessions. Idempotent. Called in response to a
113
+ * Planner spawn_subagents tool (the SessionManager wires this via
114
+ * onSpawnSubagents).
115
+ */
116
+ async spawnSubagents(args = {}) {
117
+ if (args.coder_model)
118
+ this.coderModel = args.coder_model;
119
+ if (args.reviewer_model)
120
+ this.reviewerModel = args.reviewer_model;
121
+ await this.ensureCoder();
122
+ await this.ensureReviewer();
123
+ }
124
+ /**
125
+ * Reset a single subagent — stop its session, clear the started flag, and
126
+ * (optionally) eagerly start a fresh one. The session-level system prompt is
127
+ * the same; persistent state lives in `<ledger>/{coder,reviewer}_memory.md`
128
+ * which the agent reads on its first turn after reset.
129
+ *
130
+ * Refuses to reset Planner without `force: true` — Planner reset throws away
131
+ * the user-conversation context and must be a deliberate action.
132
+ */
133
+ async resetAgent(agent, opts = {}) {
134
+ if (agent === 'planner' && !opts.force) {
135
+ throw new Error('Refusing to reset Planner without force=true (would discard chat context)');
136
+ }
137
+ const name = agent === 'planner' ? this.plannerName : agent === 'coder' ? this.coderName : this.reviewerName;
138
+ try {
139
+ await this.config.manager.stopSession(name);
140
+ }
141
+ catch (err) {
142
+ this.logger.warn?.(`[autoloop] resetAgent stop failed for ${name}: ${err.message}`);
143
+ }
144
+ if (agent === 'planner')
145
+ this.plannerStarted = false;
146
+ if (agent === 'coder')
147
+ this.coderStarted = false;
148
+ if (agent === 'reviewer')
149
+ this.reviewerStarted = false;
150
+ if (opts.eagerRestart) {
151
+ if (agent === 'planner')
152
+ await this.ensurePlanner();
153
+ else if (agent === 'coder')
154
+ await this.ensureCoder();
155
+ else
156
+ await this.ensureReviewer();
157
+ }
158
+ }
159
+ /**
160
+ * Wrap a subagent send. If the underlying session throws or returns an
161
+ * error string, auto-reset the subagent once and retry. Used by
162
+ * deliverToCoder / deliverToReviewer to recover from subprocess deaths.
163
+ */
164
+ async sendWithRecovery(agent, name, promptText) {
165
+ try {
166
+ return (await this.config.manager.sendMessage(name, promptText, {
167
+ timeout: this.config.sendTimeoutMs ?? 10 * 60_000,
168
+ }));
169
+ }
170
+ catch (err) {
171
+ this.logger.warn?.(`[autoloop] ${agent} send threw, attempting reset+retry: ${err.message}`);
172
+ await this.resetAgent(agent, { eagerRestart: true });
173
+ try {
174
+ return (await this.config.manager.sendMessage(name, promptText, {
175
+ timeout: this.config.sendTimeoutMs ?? 10 * 60_000,
176
+ }));
177
+ }
178
+ catch (err2) {
179
+ this.logger.error?.(`[autoloop] ${agent} second attempt failed after reset: ${err2.message}`);
180
+ return { output: '', error: err2.message };
181
+ }
182
+ }
183
+ }
184
+ // ─── Auto-compact ────────────────────────────────────────────────────────
185
+ //
186
+ // After each agent turn we check getStats().contextPercent. When it crosses
187
+ // the per-agent threshold we send `/compact <hint>` to ask Claude Code to
188
+ // drop chunks of history while preserving what each role needs to keep
189
+ // working. /compact preserves the session id — no reset, no memory-file
190
+ // dance, no reprime — so this is cheap.
191
+ //
192
+ // We track lastCompactAt per agent to avoid re-firing within 30 s in case
193
+ // the immediate post-compact stats haven't refreshed yet.
194
+ lastCompactAt = {};
195
+ compactSummaryFor(agent) {
196
+ if (agent === 'planner') {
197
+ return [
198
+ 'Preserve: current plan.md state and goal.json criteria; what the user has asked',
199
+ "for and approved; what directions have been tried and rejected; the user's style",
200
+ 'preferences for this run; iter-by-iter Reviewer verdicts. Drop: verbose tool',
201
+ 'output, intermediate file dumps, redundant context.',
202
+ ].join(' ');
203
+ }
204
+ if (agent === 'coder') {
205
+ return [
206
+ 'Preserve: codebase familiarity (what files do what), what patches you have already',
207
+ 'tried and why they failed, what is currently working, the current plan and goal.',
208
+ 'Drop: full file dumps, verbose stack traces, intermediate eval output beyond the',
209
+ 'last few iters.',
210
+ ].join(' ');
211
+ }
212
+ return [
213
+ 'Preserve: patterns of fakery you have caught (in reviewer_memory.md), recent metric',
214
+ 'history, structural rules from goal.json, your accumulating model of what cheating',
215
+ 'looks like in this codebase. Drop: full diff dumps from older iters, verbose audit',
216
+ 'transcripts beyond the last few iters.',
217
+ ].join(' ');
218
+ }
219
+ async maybeCompact(agent, name) {
220
+ const cfg = this.config.compactThresholds ?? {};
221
+ const threshold = agent === 'planner' ? (cfg.planner ?? 80) : agent === 'coder' ? (cfg.coder ?? 70) : (cfg.reviewer ?? 70);
222
+ let pct;
223
+ try {
224
+ const stats = this.config.manager.getStatus(name).stats;
225
+ pct = stats.contextPercent;
226
+ }
227
+ catch {
228
+ // Session might be gone (terminate races); silent skip.
229
+ return;
230
+ }
231
+ if (pct == null || pct < threshold)
232
+ return;
233
+ const last = this.lastCompactAt[agent] ?? 0;
234
+ if (Date.now() - last < 30_000)
235
+ return;
236
+ this.lastCompactAt[agent] = Date.now();
237
+ this.logger.info?.(`[autoloop/${this.config.runId}] ${agent} context ${pct.toFixed(0)}% ≥ ${threshold}% — auto-compact`);
238
+ this.emit('compact', { agent, percent: pct, threshold });
239
+ try {
240
+ await this.config.manager.compactSession(name, this.compactSummaryFor(agent));
241
+ }
242
+ catch (err) {
243
+ this.logger.warn?.(`[autoloop/${this.config.runId}] compact ${agent} failed: ${err.message}`);
244
+ }
245
+ }
246
+ // ─── Planner-specific ────────────────────────────────────────────────────
247
+ async ensurePlanner() {
248
+ if (this.plannerStarted)
249
+ return;
250
+ await this.config.manager.startSession({
251
+ name: this.plannerName,
252
+ cwd: this.config.workspace,
253
+ engine: 'claude',
254
+ model: this.config.plannerModel ?? 'opus',
255
+ permissionMode: 'bypassPermissions',
256
+ systemPrompt: this.plannerSystemPrompt,
257
+ });
258
+ this.plannerStarted = true;
259
+ }
260
+ async deliverToPlanner(env) {
261
+ if (env.type !== 'chat' && env.type !== 'directive_ack' && env.type !== 'iter_done') {
262
+ // Other types (push_user / pause / resume / terminate) are runner-only
263
+ // or planner-emitted; they should never arrive *to* planner.
264
+ throw new Error(`[autoloop] planner does not accept message type=${env.type}`);
265
+ }
266
+ await this.ensurePlanner();
267
+ // Compose the prompt fed into the Planner session. For S2 we only handle
268
+ // user chat; iter_done / directive_ack are wired in S4.
269
+ let promptText;
270
+ if (env.type === 'chat') {
271
+ promptText = env.payload.text;
272
+ }
273
+ else if (env.type === 'directive_ack') {
274
+ promptText = `[system] coder directive_ack iter=${env.iter}: ${JSON.stringify(env.payload)}`;
275
+ }
276
+ else {
277
+ // iter_done
278
+ promptText = `[system] iter ${env.iter} done. verdict=${env.payload.verdict} metric=${env.payload.metric}`;
279
+ }
280
+ const result = (await this.config.manager.sendMessage(this.plannerName, promptText, {
281
+ timeout: this.config.sendTimeoutMs ?? 10 * 60_000,
282
+ }));
283
+ if (result.error) {
284
+ this.logger.error?.(`[autoloop] planner send error: ${result.error}`);
285
+ this.emit('planner_error', new Error(result.error));
286
+ }
287
+ const replyText = (result.output ?? '').trim();
288
+ // S3: parse autoloop-fenced tool calls out of the reply, apply effects,
289
+ // and bubble emitted messages back into the runner queue.
290
+ const parsed = parsePlannerReply(replyText);
291
+ if (parsed.parse_errors.length > 0) {
292
+ this.logger.warn?.(`[autoloop] planner emitted ${parsed.parse_errors.length} malformed autoloop block(s)`);
293
+ }
294
+ const effects = {
295
+ spawnSubagents: async (args) => {
296
+ if (this.config.onSpawnSubagents) {
297
+ await this.config.onSpawnSubagents(args);
298
+ }
299
+ else {
300
+ this.logger.warn?.('[autoloop] spawn_subagents called but no handler installed (S4 not wired yet)');
301
+ }
302
+ },
303
+ updatePushPolicy: (delta) => {
304
+ if (!this.config.pushPolicyRef)
305
+ return;
306
+ // Shallow-merge whitelisted keys onto the policy object.
307
+ const policyKeys = new Set([
308
+ 'on_start',
309
+ 'on_iter_done_ok',
310
+ 'on_target_hit',
311
+ 'on_metric_regression_2',
312
+ 'on_reviewer_reject_2',
313
+ 'on_phase_error',
314
+ 'on_stall_30min',
315
+ 'on_decision_needed',
316
+ ]);
317
+ for (const [k, v] of Object.entries(delta)) {
318
+ if (!policyKeys.has(k) || typeof v !== 'object' || v === null)
319
+ continue;
320
+ this.config.pushPolicyRef[k] = v;
321
+ }
322
+ },
323
+ commitPlanFile: async (file, message) => {
324
+ await this.gitCommit(file, message ?? `autoloop: planner commits ${file}`);
325
+ },
326
+ };
327
+ const handlerResult = await applyPlannerToolCalls(parsed.calls, effects, env.iter);
328
+ for (const errEntry of handlerResult.errors) {
329
+ this.logger.warn?.(`[autoloop] tool '${errEntry.tool}' failed: ${errEntry.error}`);
330
+ }
331
+ // Emit cleaned reply (without raw JSON blocks) for the chat tool to surface.
332
+ if (parsed.cleaned_reply)
333
+ this.emit('planner_reply', parsed.cleaned_reply);
334
+ // Auto-compact after each Planner turn if context is filling up.
335
+ await this.maybeCompact('planner', this.plannerName);
336
+ return handlerResult.emitted_messages;
337
+ }
338
+ // ─── Coder ──────────────────────────────────────────────────────────────
339
+ async ensureCoder() {
340
+ if (this.coderStarted)
341
+ return;
342
+ await this.config.manager.startSession({
343
+ name: this.coderName,
344
+ cwd: this.config.workspace,
345
+ engine: 'claude',
346
+ model: this.coderModel,
347
+ permissionMode: 'bypassPermissions',
348
+ systemPrompt: this.coderSystemPrompt,
349
+ });
350
+ this.coderStarted = true;
351
+ }
352
+ async deliverToCoder(env) {
353
+ if (env.type !== 'directive') {
354
+ throw new Error(`[autoloop] coder does not accept message type=${env.type}`);
355
+ }
356
+ await this.ensureCoder();
357
+ // Compose directive prompt + write directive.json to ledger so Reviewer
358
+ // and history can see exactly what the Coder was asked.
359
+ const iterDir = path.join(this.ledgerDir, 'iter', String(env.iter));
360
+ fs.mkdirSync(iterDir, { recursive: true });
361
+ fs.writeFileSync(path.join(iterDir, 'directive.json'), JSON.stringify({
362
+ iter: env.iter,
363
+ ts: env.ts,
364
+ ...env.payload,
365
+ }, null, 2));
366
+ // Defensive: Planner may emit constraints / success_criteria as either
367
+ // a string or a string[]. Normalise.
368
+ const constraints = Array.isArray(env.payload.constraints)
369
+ ? env.payload.constraints.map(String)
370
+ : env.payload.constraints
371
+ ? [String(env.payload.constraints)]
372
+ : [];
373
+ const success = Array.isArray(env.payload.success_criteria)
374
+ ? env.payload.success_criteria.map(String)
375
+ : env.payload.success_criteria
376
+ ? [String(env.payload.success_criteria)]
377
+ : [];
378
+ const promptText = [
379
+ `[directive iter=${env.iter}]`,
380
+ `goal: ${env.payload.goal}`,
381
+ constraints.length ? `constraints:\n - ${constraints.join('\n - ')}` : '',
382
+ success.length ? `success_criteria:\n - ${success.join('\n - ')}` : '',
383
+ `max_attempts: ${env.payload.max_attempts}`,
384
+ '',
385
+ 'Read plan.md / goal.json, make the change, run the evaluator, then emit `iter_complete`.',
386
+ ]
387
+ .filter(Boolean)
388
+ .join('\n');
389
+ const result = await this.sendWithRecovery('coder', this.coderName, promptText);
390
+ const replyText = (result.output ?? '').trim();
391
+ const parsed = parseAgentReply(replyText);
392
+ this.emit('coder_reply', parsed.cleaned_reply);
393
+ const ic = extractIterComplete(parsed.calls);
394
+ if (!ic) {
395
+ // No iter_complete emitted — could be a clarification request, or the
396
+ // Coder bailed. Return a directive_ack so Planner sees it next turn.
397
+ await this.maybeCompact('coder', this.coderName);
398
+ return [
399
+ Msg.directiveAck(env.iter, {
400
+ understood: false,
401
+ clarification: parsed.cleaned_reply.slice(0, 500),
402
+ }),
403
+ ];
404
+ }
405
+ // Persist eval output to ledger.
406
+ fs.writeFileSync(path.join(iterDir, 'eval_output.json'), JSON.stringify(ic.eval_output, null, 2));
407
+ fs.writeFileSync(path.join(iterDir, 'coder_summary.txt'), `${ic.summary}\n\n--- coder cleaned reply ---\n${parsed.cleaned_reply}\n`);
408
+ // Compute diff + files_changed via git so we don't trust Coder's claim.
409
+ const diffOut = await this.runGit(['git', 'diff', '--unified=3']);
410
+ fs.writeFileSync(path.join(iterDir, 'diff.patch'), diffOut.out);
411
+ let filesChanged = ic.files_changed;
412
+ if (!filesChanged) {
413
+ const named = await this.runGit(['git', 'diff', '--name-only']);
414
+ filesChanged = named.out
415
+ .split('\n')
416
+ .map((s) => s.trim())
417
+ .filter(Boolean);
418
+ }
419
+ // Commit the iteration so Reviewer's git view is clean for the next iter.
420
+ await this.runGit(['git', 'add', '-A']);
421
+ const commitMsg = `autoloop/iter-${env.iter}: ${ic.summary}`.slice(0, 200);
422
+ await this.runGit(['git', 'commit', '-m', commitMsg]);
423
+ await this.maybeCompact('coder', this.coderName);
424
+ return [
425
+ Msg.iterArtifacts(env.iter, {
426
+ diff: diffOut.out,
427
+ eval_output: ic.eval_output,
428
+ files_changed: filesChanged,
429
+ }),
430
+ ];
431
+ }
432
+ // ─── Reviewer ───────────────────────────────────────────────────────────
433
+ async ensureReviewer() {
434
+ if (this.reviewerStarted)
435
+ return;
436
+ fs.mkdirSync(this.reviewerSandboxDir, { recursive: true });
437
+ await this.config.manager.startSession({
438
+ name: this.reviewerName,
439
+ cwd: this.reviewerSandboxDir,
440
+ engine: 'claude',
441
+ model: this.reviewerModel,
442
+ permissionMode: 'bypassPermissions',
443
+ systemPrompt: this.reviewerSystemPrompt,
444
+ });
445
+ this.reviewerStarted = true;
446
+ }
447
+ /**
448
+ * Stage the iter's artifacts into the Reviewer sandbox cwd. Reviewer is a
449
+ * persistent session whose cwd is fixed at <ledger>/reviewer_sandbox/, so
450
+ * every review must rewrite the sandbox to "this iter's view".
451
+ */
452
+ stageReviewSandbox(iter) {
453
+ fs.mkdirSync(this.reviewerSandboxDir, { recursive: true });
454
+ // Wipe top-level files (keep reviewer_memory.md if present).
455
+ for (const ent of fs.readdirSync(this.reviewerSandboxDir)) {
456
+ if (ent === 'reviewer_memory.md')
457
+ continue;
458
+ const full = path.join(this.reviewerSandboxDir, ent);
459
+ try {
460
+ fs.rmSync(full, { recursive: true, force: true });
461
+ }
462
+ catch {
463
+ /* ignore */
464
+ }
465
+ }
466
+ const iterSrc = path.join(this.ledgerDir, 'iter', String(iter));
467
+ if (!fs.existsSync(iterSrc))
468
+ return;
469
+ const dest = path.join(this.reviewerSandboxDir, `iter-${iter}`);
470
+ fs.mkdirSync(dest, { recursive: true });
471
+ for (const ent of fs.readdirSync(iterSrc)) {
472
+ fs.copyFileSync(path.join(iterSrc, ent), path.join(dest, ent));
473
+ }
474
+ // Also surface goal.json + plan.md if they exist at the workspace root.
475
+ for (const f of ['plan.md', 'goal.json']) {
476
+ const src = path.join(this.config.workspace, f);
477
+ if (fs.existsSync(src))
478
+ fs.copyFileSync(src, path.join(this.reviewerSandboxDir, f));
479
+ }
480
+ // Last iter's verdict for context (if exists).
481
+ if (iter > 0) {
482
+ const prior = path.join(this.ledgerDir, 'iter', String(iter - 1), 'verdict.json');
483
+ if (fs.existsSync(prior)) {
484
+ fs.copyFileSync(prior, path.join(this.reviewerSandboxDir, 'prior_verdict.json'));
485
+ }
486
+ }
487
+ }
488
+ async deliverToReviewer(env) {
489
+ if (env.type !== 'review_request') {
490
+ throw new Error(`[autoloop] reviewer does not accept message type=${env.type}`);
491
+ }
492
+ await this.ensureReviewer();
493
+ this.stageReviewSandbox(env.payload.iter);
494
+ const promptText = [
495
+ `[review_request iter=${env.payload.iter}]`,
496
+ `Artifacts staged at: iter-${env.payload.iter}/ (directive.json, diff.patch, eval_output.json)`,
497
+ `prior_verdict: ${fs.existsSync(path.join(this.reviewerSandboxDir, 'prior_verdict.json')) ? 'prior_verdict.json' : '(none)'}`,
498
+ `prior_metrics: ${JSON.stringify(env.payload.prior_metrics ?? [])}`,
499
+ '',
500
+ 'Audit and emit `review_complete`.',
501
+ ].join('\n');
502
+ const result = await this.sendWithRecovery('reviewer', this.reviewerName, promptText);
503
+ const replyText = (result.output ?? '').trim();
504
+ const parsed = parseAgentReply(replyText);
505
+ this.emit('reviewer_reply', parsed.cleaned_reply);
506
+ const rc = extractReviewComplete(parsed.calls);
507
+ if (!rc) {
508
+ // Reviewer didn't emit a verdict — treat as 'hold' with the cleaned
509
+ // reply as audit notes so the loop doesn't stall silently.
510
+ const verdict = Msg.reviewVerdict(env.payload.iter, {
511
+ decision: 'hold',
512
+ metric: null,
513
+ audit_notes: `[no verdict emitted] ${parsed.cleaned_reply.slice(0, 500)}`,
514
+ });
515
+ this.persistVerdict(env.payload.iter, {
516
+ decision: 'hold',
517
+ metric: null,
518
+ audit_notes: verdict.payload.audit_notes,
519
+ });
520
+ await this.maybeCompact('reviewer', this.reviewerName);
521
+ return [verdict];
522
+ }
523
+ this.persistVerdict(env.payload.iter, rc);
524
+ await this.maybeCompact('reviewer', this.reviewerName);
525
+ return [Msg.reviewVerdict(env.payload.iter, rc)];
526
+ }
527
+ persistVerdict(iter, payload) {
528
+ const iterDir = path.join(this.ledgerDir, 'iter', String(iter));
529
+ fs.mkdirSync(iterDir, { recursive: true });
530
+ fs.writeFileSync(path.join(iterDir, 'verdict.json'), JSON.stringify({ iter, ts: new Date().toISOString(), ...payload }, null, 2));
531
+ }
532
+ /** Run a git command in the workspace; returns combined output. Used by Coder commits. */
533
+ async runGit(argv) {
534
+ return new Promise((resolve) => {
535
+ const child = spawn(argv[0], argv.slice(1), {
536
+ cwd: this.config.workspace,
537
+ stdio: ['ignore', 'pipe', 'pipe'],
538
+ });
539
+ let out = '';
540
+ let err = '';
541
+ child.stdout?.on('data', (b) => (out += b.toString()));
542
+ child.stderr?.on('data', (b) => (err += b.toString()));
543
+ child.on('error', (e) => resolve({ code: 127, out: '', err: e.message }));
544
+ child.on('exit', (code) => resolve({ code: code ?? 0, out, err }));
545
+ });
546
+ }
547
+ // ─── git helper for write_plan_committed / write_goal_committed ──────────
548
+ async gitCommit(filename, message) {
549
+ const run = (argv) => new Promise((resolve) => {
550
+ const child = spawn(argv[0], argv.slice(1), {
551
+ cwd: this.config.workspace,
552
+ stdio: ['ignore', 'pipe', 'pipe'],
553
+ });
554
+ let out = '';
555
+ let err = '';
556
+ child.stdout?.on('data', (b) => (out += b.toString()));
557
+ child.stderr?.on('data', (b) => (err += b.toString()));
558
+ child.on('error', (e) => resolve({ code: 127, out: '', err: e.message }));
559
+ child.on('exit', (code) => resolve({ code: code ?? 0, out, err }));
560
+ });
561
+ // Allow either a workspace-rooted plan.md or one inside tasks/<run_id>/.
562
+ // We don't know which; best-effort `git add -A` keeps it simple and the
563
+ // commit message captures the intent. Empty diff → skip (no error).
564
+ const status = await run(['git', 'status', '--porcelain']);
565
+ if (status.code !== 0) {
566
+ this.logger.warn?.(`[autoloop] git status failed: ${status.err.slice(0, 200)}`);
567
+ return;
568
+ }
569
+ if (status.out.trim() === '') {
570
+ this.logger.info?.(`[autoloop] commit_${filename}: no changes to commit`);
571
+ return;
572
+ }
573
+ await run(['git', 'add', '-A']);
574
+ const commit = await run(['git', 'commit', '-m', message]);
575
+ if (commit.code !== 0) {
576
+ this.logger.warn?.(`[autoloop] git commit failed: ${commit.err.slice(0, 200)}`);
577
+ }
578
+ }
579
+ }
580
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../../src/autoloop/dispatcher.ts"],"names":[],"mappings":"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"}