@matteeh/osq 0.1.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 (140) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +183 -0
  3. package/dist/cli/approve.d.ts +6 -0
  4. package/dist/cli/approve.d.ts.map +1 -0
  5. package/dist/cli/approve.js +26 -0
  6. package/dist/cli/approve.js.map +1 -0
  7. package/dist/cli/bin.d.ts +3 -0
  8. package/dist/cli/bin.d.ts.map +1 -0
  9. package/dist/cli/bin.js +5 -0
  10. package/dist/cli/bin.js.map +1 -0
  11. package/dist/cli/index.d.ts +4 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +76 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/init.d.ts +4 -0
  16. package/dist/cli/init.d.ts.map +1 -0
  17. package/dist/cli/init.js +19 -0
  18. package/dist/cli/init.js.map +1 -0
  19. package/dist/cli/new.d.ts +4 -0
  20. package/dist/cli/new.d.ts.map +1 -0
  21. package/dist/cli/new.js +15 -0
  22. package/dist/cli/new.js.map +1 -0
  23. package/dist/cli/report.d.ts +10 -0
  24. package/dist/cli/report.d.ts.map +1 -0
  25. package/dist/cli/report.js +84 -0
  26. package/dist/cli/report.js.map +1 -0
  27. package/dist/cli/setup.d.ts +2 -0
  28. package/dist/cli/setup.d.ts.map +1 -0
  29. package/dist/cli/setup.js +10 -0
  30. package/dist/cli/setup.js.map +1 -0
  31. package/dist/cli/show.d.ts +7 -0
  32. package/dist/cli/show.d.ts.map +1 -0
  33. package/dist/cli/show.js +27 -0
  34. package/dist/cli/show.js.map +1 -0
  35. package/dist/cli/status.d.ts +7 -0
  36. package/dist/cli/status.d.ts.map +1 -0
  37. package/dist/cli/status.js +23 -0
  38. package/dist/cli/status.js.map +1 -0
  39. package/dist/cli/watch.d.ts +9 -0
  40. package/dist/cli/watch.d.ts.map +1 -0
  41. package/dist/cli/watch.js +20 -0
  42. package/dist/cli/watch.js.map +1 -0
  43. package/dist/core/approve.d.ts +11 -0
  44. package/dist/core/approve.d.ts.map +1 -0
  45. package/dist/core/approve.js +52 -0
  46. package/dist/core/approve.js.map +1 -0
  47. package/dist/core/config.d.ts +53 -0
  48. package/dist/core/config.d.ts.map +1 -0
  49. package/dist/core/config.js +124 -0
  50. package/dist/core/config.js.map +1 -0
  51. package/dist/core/hasher.d.ts +4 -0
  52. package/dist/core/hasher.d.ts.map +1 -0
  53. package/dist/core/hasher.js +49 -0
  54. package/dist/core/hasher.js.map +1 -0
  55. package/dist/core/init.d.ts +12 -0
  56. package/dist/core/init.d.ts.map +1 -0
  57. package/dist/core/init.js +151 -0
  58. package/dist/core/init.js.map +1 -0
  59. package/dist/core/linter.d.ts +8 -0
  60. package/dist/core/linter.d.ts.map +1 -0
  61. package/dist/core/linter.js +100 -0
  62. package/dist/core/linter.js.map +1 -0
  63. package/dist/core/lock.d.ts +17 -0
  64. package/dist/core/lock.d.ts.map +1 -0
  65. package/dist/core/lock.js +104 -0
  66. package/dist/core/lock.js.map +1 -0
  67. package/dist/core/logger.d.ts +32 -0
  68. package/dist/core/logger.d.ts.map +1 -0
  69. package/dist/core/logger.js +106 -0
  70. package/dist/core/logger.js.map +1 -0
  71. package/dist/core/new.d.ts +11 -0
  72. package/dist/core/new.d.ts.map +1 -0
  73. package/dist/core/new.js +79 -0
  74. package/dist/core/new.js.map +1 -0
  75. package/dist/core/parser.d.ts +32 -0
  76. package/dist/core/parser.d.ts.map +1 -0
  77. package/dist/core/parser.js +87 -0
  78. package/dist/core/parser.js.map +1 -0
  79. package/dist/core/report.d.ts +54 -0
  80. package/dist/core/report.d.ts.map +1 -0
  81. package/dist/core/report.js +475 -0
  82. package/dist/core/report.js.map +1 -0
  83. package/dist/core/show.d.ts +50 -0
  84. package/dist/core/show.d.ts.map +1 -0
  85. package/dist/core/show.js +374 -0
  86. package/dist/core/show.js.map +1 -0
  87. package/dist/core/state.d.ts +25 -0
  88. package/dist/core/state.d.ts.map +1 -0
  89. package/dist/core/state.js +180 -0
  90. package/dist/core/state.js.map +1 -0
  91. package/dist/core/status.d.ts +10 -0
  92. package/dist/core/status.d.ts.map +1 -0
  93. package/dist/core/status.js +106 -0
  94. package/dist/core/status.js.map +1 -0
  95. package/dist/harness/agy.d.ts +31 -0
  96. package/dist/harness/agy.d.ts.map +1 -0
  97. package/dist/harness/agy.js +251 -0
  98. package/dist/harness/agy.js.map +1 -0
  99. package/dist/harness/index.d.ts +7 -0
  100. package/dist/harness/index.d.ts.map +1 -0
  101. package/dist/harness/index.js +20 -0
  102. package/dist/harness/index.js.map +1 -0
  103. package/dist/harness/mock.d.ts +19 -0
  104. package/dist/harness/mock.d.ts.map +1 -0
  105. package/dist/harness/mock.js +62 -0
  106. package/dist/harness/mock.js.map +1 -0
  107. package/dist/harness/opencode.d.ts +39 -0
  108. package/dist/harness/opencode.d.ts.map +1 -0
  109. package/dist/harness/opencode.js +394 -0
  110. package/dist/harness/opencode.js.map +1 -0
  111. package/dist/harness/process.d.ts +26 -0
  112. package/dist/harness/process.d.ts.map +1 -0
  113. package/dist/harness/process.js +99 -0
  114. package/dist/harness/process.js.map +1 -0
  115. package/dist/harness/stream.d.ts +34 -0
  116. package/dist/harness/stream.d.ts.map +1 -0
  117. package/dist/harness/stream.js +75 -0
  118. package/dist/harness/stream.js.map +1 -0
  119. package/dist/harness/types.d.ts +53 -0
  120. package/dist/harness/types.d.ts.map +1 -0
  121. package/dist/harness/types.js +10 -0
  122. package/dist/harness/types.js.map +1 -0
  123. package/dist/index.d.ts +3 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +2 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/watcher/archiver.d.ts +5 -0
  128. package/dist/watcher/archiver.d.ts.map +1 -0
  129. package/dist/watcher/archiver.js +66 -0
  130. package/dist/watcher/archiver.js.map +1 -0
  131. package/dist/watcher/loop.d.ts +34 -0
  132. package/dist/watcher/loop.d.ts.map +1 -0
  133. package/dist/watcher/loop.js +235 -0
  134. package/dist/watcher/loop.js.map +1 -0
  135. package/dist/watcher/runner.d.ts +70 -0
  136. package/dist/watcher/runner.d.ts.map +1 -0
  137. package/dist/watcher/runner.js +604 -0
  138. package/dist/watcher/runner.js.map +1 -0
  139. package/package.json +66 -0
  140. package/templates/.env.example +3 -0
@@ -0,0 +1,604 @@
1
+ import { spawn } from 'node:child_process';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { hashChangeFolder } from '../core/hasher.js';
5
+ import { acquireLock, releaseLock } from '../core/lock.js';
6
+ import { resolveSymbol } from '../core/logger.js';
7
+ import { parseTaskMd } from '../core/parser.js';
8
+ import { asRecord } from '../harness/stream.js';
9
+ import { appendHarnessEvent, } from '../harness/types.js';
10
+ /**
11
+ * Single-line, human-readable summary of a task outcome. Kept pure so the exact
12
+ * shape can be tested without running the runner, and used directly beside every
13
+ * marker write (`done/<n>` or `dead/<n>.md`) so the log and the marker agree.
14
+ */
15
+ export function formatTaskOutcomeSummary(taskNumber, success, reason, extra) {
16
+ if (success) {
17
+ return `task ${taskNumber} verified (passed)`;
18
+ }
19
+ const detail = extra ? `, ${extra}` : '';
20
+ return `task ${taskNumber} dead (reason: ${reason}${detail})`;
21
+ }
22
+ export async function tickTaskCheckbox(specFolderPath, taskNumber) {
23
+ const tasksMdPath = path.join(specFolderPath, 'tasks.md');
24
+ let content = '';
25
+ try {
26
+ content = await fs.readFile(tasksMdPath, 'utf8');
27
+ }
28
+ catch {
29
+ return;
30
+ }
31
+ const regex = new RegExp(`^(\\s*-\\s*\\[)[ ](\\]\\s*${taskNumber}\\b.*)$`, 'm');
32
+ const updated = content.replace(regex, '$1x$2');
33
+ if (updated !== content) {
34
+ await fs.writeFile(tasksMdPath, updated, 'utf8');
35
+ }
36
+ }
37
+ /**
38
+ * Single code path for process lifecycle observation: the events.jsonl entry and
39
+ * its human readable summary are always emitted together.
40
+ */
41
+ async function recordLifecycleEvent(specFolderPath, taskNumber, event, summary, logger, level = 'info') {
42
+ await appendHarnessEvent(specFolderPath, taskNumber, event);
43
+ if (level === 'verbose') {
44
+ logger?.verbose(summary);
45
+ }
46
+ else {
47
+ logger?.info(summary);
48
+ }
49
+ }
50
+ /**
51
+ * Append the `dead` event that always travels with a dead marker. The event
52
+ * stream is the append-only source of truth for failure history, so it must
53
+ * agree with the marker at every exit. A lock collision never writes a dead
54
+ * marker and therefore never records a dead event.
55
+ */
56
+ async function recordDeadEvent(specFolderPath, taskNumber, reason) {
57
+ await appendHarnessEvent(specFolderPath, taskNumber, {
58
+ type: 'dead',
59
+ timestamp: new Date().toISOString(),
60
+ data: { task: taskNumber, reason },
61
+ });
62
+ }
63
+ /**
64
+ * Append the `done` event that always travels with a `done/<n>` marker.
65
+ */
66
+ async function recordDoneEvent(specFolderPath, taskNumber) {
67
+ await appendHarnessEvent(specFolderPath, taskNumber, {
68
+ type: 'done',
69
+ timestamp: new Date().toISOString(),
70
+ data: { task: taskNumber },
71
+ });
72
+ }
73
+ const heartbeatAccumulators = new Map();
74
+ function createHeartbeatAccumulator() {
75
+ return { byteOffset: 0, eventCount: 0, totalTokens: 0, toolCount: 0, cost: 0, hasCost: false };
76
+ }
77
+ /**
78
+ * Snapshot of task progress. Counters are maintained in memory and advanced
79
+ * with only the bytes appended since the previous poll; the event file may not
80
+ * exist yet, in which case counters are zero.
81
+ */
82
+ export async function computeTaskHeartbeatStats(specFolderPath, taskNumber, startTime) {
83
+ const elapsedSeconds = Number(((Date.now() - startTime) / 1000).toFixed(1));
84
+ const eventFilePath = path.join(specFolderPath, '.run', 'events', `${taskNumber}.jsonl`);
85
+ let content = '';
86
+ try {
87
+ content = await fs.readFile(eventFilePath, 'utf8');
88
+ }
89
+ catch {
90
+ heartbeatAccumulators.delete(eventFilePath);
91
+ return { elapsedSeconds, eventCount: 0, totalTokens: 0, toolCount: 0 };
92
+ }
93
+ let accumulator = heartbeatAccumulators.get(eventFilePath);
94
+ if (!accumulator || accumulator.byteOffset > content.length) {
95
+ accumulator = createHeartbeatAccumulator();
96
+ }
97
+ const fresh = content.slice(accumulator.byteOffset);
98
+ const lastNewline = fresh.lastIndexOf('\n');
99
+ if (lastNewline !== -1) {
100
+ const complete = fresh.slice(0, lastNewline);
101
+ accumulator.byteOffset += lastNewline + 1;
102
+ for (const line of complete.split('\n')) {
103
+ if (!line.trim()) {
104
+ continue;
105
+ }
106
+ accumulator.eventCount += 1;
107
+ let parsed;
108
+ try {
109
+ parsed = JSON.parse(line);
110
+ }
111
+ catch {
112
+ // Ignore malformed lines rather than losing the whole heartbeat.
113
+ continue;
114
+ }
115
+ const event = asRecord(parsed);
116
+ if (!event) {
117
+ continue;
118
+ }
119
+ const data = asRecord(event.data);
120
+ if (event.type === 'tokens') {
121
+ accumulator.totalTokens += Number(data?.totalTokens ?? 0) || 0;
122
+ const cost = Number(data?.cost);
123
+ if (Number.isFinite(cost)) {
124
+ accumulator.cost += cost;
125
+ accumulator.hasCost = true;
126
+ }
127
+ }
128
+ else if (event.type === 'tool') {
129
+ accumulator.toolCount += 1;
130
+ const summary = data?.summary;
131
+ if (typeof summary === 'string') {
132
+ accumulator.lastToolSummary = summary;
133
+ }
134
+ }
135
+ }
136
+ }
137
+ heartbeatAccumulators.set(eventFilePath, accumulator);
138
+ const stats = {
139
+ elapsedSeconds,
140
+ eventCount: accumulator.eventCount,
141
+ totalTokens: accumulator.totalTokens,
142
+ toolCount: accumulator.toolCount,
143
+ };
144
+ if (accumulator.hasCost) {
145
+ stats.cost = accumulator.cost;
146
+ }
147
+ if (accumulator.lastToolSummary !== undefined) {
148
+ stats.lastToolSummary = accumulator.lastToolSummary;
149
+ }
150
+ return stats;
151
+ }
152
+ /**
153
+ * Drop the in-memory counters for a finished task so the map does not grow
154
+ * across watcher cycles.
155
+ */
156
+ export function clearTaskHeartbeatStats(specFolderPath, taskNumber) {
157
+ const eventFilePath = path.join(specFolderPath, '.run', 'events', `${taskNumber}.jsonl`);
158
+ heartbeatAccumulators.delete(eventFilePath);
159
+ }
160
+ const STATUS_SPINNER_PREFIX_WIDTH = 2; // spinner frame plus a single space
161
+ const ELLIPSIS = '…';
162
+ function truncateToWidth(text, width) {
163
+ if (width <= 0) {
164
+ return '';
165
+ }
166
+ if (text.length <= width) {
167
+ return text;
168
+ }
169
+ if (width === 1) {
170
+ return ELLIPSIS;
171
+ }
172
+ return `${text.slice(0, width - 1)}${ELLIPSIS}`;
173
+ }
174
+ /**
175
+ * Single-line running status row. The logger owns the animated spinner and
176
+ * prepends `<frame> `, so this text is truncated to leave room for that prefix
177
+ * while fitting `terminalWidth` columns.
178
+ */
179
+ export function formatTaskStatusRow(taskNumber, stats, terminalWidth = process.stderr.columns ?? 80) {
180
+ const segments = [
181
+ `task ${taskNumber}`,
182
+ `${stats.elapsedSeconds}s`,
183
+ `${stats.toolCount} tools`,
184
+ `${stats.totalTokens} tokens`,
185
+ ];
186
+ if (typeof stats.cost === 'number' && Number.isFinite(stats.cost)) {
187
+ segments.push(`$${stats.cost.toFixed(4)}`);
188
+ }
189
+ const budget = terminalWidth - STATUS_SPINNER_PREFIX_WIDTH;
190
+ const base = segments.join(' · ');
191
+ if (!stats.lastToolSummary) {
192
+ return truncateToWidth(base, budget);
193
+ }
194
+ const separator = ' · ';
195
+ const summaryBudget = budget - base.length - separator.length;
196
+ if (summaryBudget <= 1) {
197
+ return truncateToWidth(base, budget);
198
+ }
199
+ return `${base}${separator}${truncateToWidth(stats.lastToolSummary, summaryBudget)}`;
200
+ }
201
+ /** Periodic heartbeat line shared by the 1s TTY row and the non-TTY log. */
202
+ export function formatTaskHeartbeatLine(taskNumber, stats) {
203
+ return `task ${taskNumber} heartbeat (elapsed: ${stats.elapsedSeconds}s, events: ${stats.eventCount}, tokens: ${stats.totalTokens})`;
204
+ }
205
+ /**
206
+ * Curated task-started line: a single info line carrying the task title
207
+ * truncated so the whole line fits the terminal width. The lifecycle details
208
+ * (pid, timeout) travel with it so the marker and the log line stay in sync.
209
+ */
210
+ export function formatTaskStartedLine(taskNumber, title, pid, timeoutSeconds, symbols, terminalWidth = process.stderr.columns ?? 80) {
211
+ const symbol = resolveSymbol('▶', '[task]', symbols);
212
+ const prefix = `${symbol} task ${taskNumber} started (pid: ${pid ?? 'unknown'}, timeout: ${timeoutSeconds}s): `;
213
+ const budget = Math.max(0, terminalWidth - prefix.length);
214
+ return `${prefix}${truncateToWidth(title, budget)}`;
215
+ }
216
+ /**
217
+ * Curated task-outcome line: verified or dead with the failure reason and the
218
+ * elapsed seconds since the task began.
219
+ */
220
+ export function formatTaskOutcomeLine(taskNumber, success, reason, elapsedSeconds, symbols) {
221
+ if (success) {
222
+ return `${resolveSymbol('✓', '[ok]', symbols)} task ${taskNumber} verified (elapsed: ${elapsedSeconds}s)`;
223
+ }
224
+ return `${resolveSymbol('✗', '[dead]', symbols)} task ${taskNumber} dead (reason: ${reason}, elapsed: ${elapsedSeconds}s)`;
225
+ }
226
+ /**
227
+ * Return the last text message emitted on the agent's event stream, or null
228
+ * when the stream has no text at all. Synthesis reads exclusively from
229
+ * first-class `text` events carrying the completed assistant message; raw
230
+ * harness payload shapes are never inspected. The stream is the append-only
231
+ * `.run/events/<n>.jsonl` file, so this survives a watcher restart.
232
+ */
233
+ export async function extractFinalTextFromStream(specFolderPath, taskNumber) {
234
+ const eventFilePath = path.join(specFolderPath, '.run', 'events', `${taskNumber}.jsonl`);
235
+ let content = '';
236
+ try {
237
+ content = await fs.readFile(eventFilePath, 'utf8');
238
+ }
239
+ catch {
240
+ return null;
241
+ }
242
+ let finalText = null;
243
+ for (const line of content.split('\n')) {
244
+ if (!line.trim()) {
245
+ continue;
246
+ }
247
+ let parsed;
248
+ try {
249
+ parsed = JSON.parse(line);
250
+ }
251
+ catch {
252
+ continue;
253
+ }
254
+ const event = asRecord(parsed);
255
+ if (event?.type !== 'text') {
256
+ continue;
257
+ }
258
+ const text = asRecord(event.data)?.text;
259
+ if (typeof text === 'string' && text.trim().length > 0) {
260
+ finalText = text;
261
+ }
262
+ }
263
+ return finalText?.trim() ? finalText : null;
264
+ }
265
+ /**
266
+ * Write a result file synthesized from the agent's final stream message. The
267
+ * frontmatter flags it as `synthesized: true` and a comment attributes it to
268
+ * the watcher so a reader never mistakes it for an agent-authored result.
269
+ */
270
+ export async function synthesizeResultFile(resultsDir, taskNumber, finalText) {
271
+ await fs.mkdir(resultsDir, { recursive: true });
272
+ const resultPath = path.join(resultsDir, `${taskNumber}.md`);
273
+ const body = finalText.endsWith('\n') ? finalText : `${finalText}\n`;
274
+ const content = [
275
+ '---',
276
+ 'synthesized: true',
277
+ '---',
278
+ "<!-- Synthesized by the osq watcher from the agent's final stream message.",
279
+ ' The agent exited without writing a result file. -->',
280
+ '',
281
+ body,
282
+ ].join('\n');
283
+ await fs.writeFile(resultPath, content, 'utf8');
284
+ return resultPath;
285
+ }
286
+ export async function runTask(projectRoot, specFolderPath, taskNumber, config, adapter, logger) {
287
+ const runDir = path.join(specFolderPath, '.run');
288
+ const deadDir = path.join(runDir, 'dead');
289
+ const doneDir = path.join(runDir, 'done');
290
+ const startTime = Date.now();
291
+ const useSymbols = logger?.symbols === true;
292
+ const interactive = logger?.interactive === true;
293
+ const heartbeatSeconds = config.log?.heartbeatSeconds ?? 60;
294
+ const heartbeatIntervalMs = heartbeatSeconds * 1000;
295
+ let heartbeatTimer = null;
296
+ let heartbeatActive = true;
297
+ let lastHeartbeatLogAt = startTime;
298
+ // One timer owns both observation modes: the 1s TTY status row and the
299
+ // periodic non-TTY heartbeat log. TTY heartbeats are demoted to verbose.
300
+ const stopHeartbeat = () => {
301
+ heartbeatActive = false;
302
+ if (heartbeatTimer) {
303
+ clearInterval(heartbeatTimer);
304
+ heartbeatTimer = null;
305
+ }
306
+ logger?.clearStatus();
307
+ };
308
+ const logOutcome = (success, reason) => {
309
+ stopHeartbeat();
310
+ const elapsedSeconds = Number(((Date.now() - startTime) / 1000).toFixed(1));
311
+ logger?.info(formatTaskOutcomeLine(taskNumber, success, reason, elapsedSeconds, useSymbols));
312
+ };
313
+ const approvedPath = path.join(runDir, 'approved');
314
+ let approvedHash = '';
315
+ try {
316
+ approvedHash = (await fs.readFile(approvedPath, 'utf8')).trim();
317
+ }
318
+ catch {
319
+ await fs.mkdir(deadDir, { recursive: true });
320
+ await fs.writeFile(path.join(deadDir, `${taskNumber}.md`), '---\nreason: spec_conflict\n---\nSpec has not been approved (missing .run/approved).\n', 'utf8');
321
+ await recordDeadEvent(specFolderPath, taskNumber, 'spec_conflict');
322
+ logger?.info(formatTaskOutcomeSummary(taskNumber, false, 'spec_conflict'));
323
+ logOutcome(false, 'spec_conflict');
324
+ return { success: false, reason: 'spec_conflict', error: 'Missing .run/approved' };
325
+ }
326
+ const currentHash = await hashChangeFolder(specFolderPath);
327
+ if (currentHash !== approvedHash) {
328
+ await fs.mkdir(deadDir, { recursive: true });
329
+ await fs.writeFile(path.join(deadDir, `${taskNumber}.md`), `---\nreason: spec_conflict\napproved_hash: "${approvedHash}"\ncurrent_hash: "${currentHash}"\n---\nChange folder modified after approval. Expected ${approvedHash}, computed ${currentHash}.\n`, 'utf8');
330
+ await recordDeadEvent(specFolderPath, taskNumber, 'spec_conflict');
331
+ logger?.info(formatTaskOutcomeSummary(taskNumber, false, 'spec_conflict'));
332
+ logOutcome(false, 'spec_conflict');
333
+ return {
334
+ success: false,
335
+ reason: 'spec_conflict',
336
+ error: `Folder hash mismatch: expected ${approvedHash}, got ${currentHash}`,
337
+ };
338
+ }
339
+ const taskPath = path.join(specFolderPath, 'tasks', `${taskNumber}.md`);
340
+ let taskContent = '';
341
+ try {
342
+ taskContent = await fs.readFile(taskPath, 'utf8');
343
+ }
344
+ catch (err) {
345
+ await fs.mkdir(deadDir, { recursive: true });
346
+ await fs.writeFile(path.join(deadDir, `${taskNumber}.md`), `---\nreason: crashed\n---\nTask file not found: ${taskPath}\n`, 'utf8');
347
+ await recordDeadEvent(specFolderPath, taskNumber, 'crashed');
348
+ logger?.info(formatTaskOutcomeSummary(taskNumber, false, 'crashed'));
349
+ logOutcome(false, 'crashed');
350
+ return { success: false, reason: 'crashed', error: 'Task file not found' };
351
+ }
352
+ const taskData = parseTaskMd(taskContent);
353
+ const lockResult = await acquireLock(runDir, taskNumber);
354
+ if (!lockResult.acquired) {
355
+ // A lock collision means another process is actively running this task, not
356
+ // that the task failed. It writes no dead marker, so it must not append a
357
+ // dead event either; only a dead marker write may record a dead event.
358
+ logger?.info(formatTaskOutcomeSummary(taskNumber, false, 'already_running'));
359
+ logOutcome(false, 'already_running');
360
+ return { success: false, reason: 'already_running', error: 'Task is already running' };
361
+ }
362
+ if (heartbeatIntervalMs > 0) {
363
+ const tickIntervalMs = interactive ? Math.min(heartbeatIntervalMs, 1000) : heartbeatIntervalMs;
364
+ heartbeatTimer = setInterval(() => {
365
+ computeTaskHeartbeatStats(specFolderPath, taskNumber, startTime)
366
+ .then((stats) => {
367
+ if (!heartbeatActive)
368
+ return;
369
+ if (interactive) {
370
+ logger?.status(formatTaskStatusRow(taskNumber, stats));
371
+ const now = Date.now();
372
+ if (now - lastHeartbeatLogAt >= heartbeatIntervalMs) {
373
+ lastHeartbeatLogAt = now;
374
+ logger?.verbose(formatTaskHeartbeatLine(taskNumber, stats));
375
+ }
376
+ }
377
+ else {
378
+ logger?.info(formatTaskHeartbeatLine(taskNumber, stats));
379
+ }
380
+ })
381
+ .catch(() => { });
382
+ }, tickIntervalMs);
383
+ heartbeatTimer.unref();
384
+ }
385
+ try {
386
+ const spawnStartMs = startTime;
387
+ const timeoutSeconds = config.timeouts.taskTimeoutSeconds;
388
+ // The runner alone owns lifecycle events. `started` is emitted the moment
389
+ // the child process exists via `onSpawn`, not after the adapter resolves.
390
+ let startedRecorded = false;
391
+ let startedPromise = null;
392
+ const recordStarted = (pid) => {
393
+ if (startedRecorded) {
394
+ return startedPromise ?? Promise.resolve();
395
+ }
396
+ startedRecorded = true;
397
+ startedPromise = recordLifecycleEvent(specFolderPath, taskNumber, {
398
+ type: 'started',
399
+ timestamp: new Date().toISOString(),
400
+ data: { pid, timeoutSeconds },
401
+ }, formatTaskStartedLine(taskNumber, taskData.title, pid, timeoutSeconds, useSymbols), logger);
402
+ return startedPromise;
403
+ };
404
+ const spawnResult = await adapter.spawn({
405
+ projectRoot,
406
+ specFolderPath,
407
+ taskNumber,
408
+ taskTitle: taskData.title,
409
+ verifyCommand: taskData.verify,
410
+ scope: taskData.scope,
411
+ entry: taskData.entry,
412
+ skills: taskData.skills,
413
+ tier: 'coding',
414
+ timeoutSeconds,
415
+ config,
416
+ onSpawn: (pid) => recordStarted(pid),
417
+ });
418
+ // Fallback: an adapter that never invokes onSpawn (or a spawn that fails
419
+ // before the callback) still yields exactly one `started` event.
420
+ await recordStarted(spawnResult.pid);
421
+ const elapsedMs = spawnResult.elapsedMs ?? Date.now() - spawnStartMs;
422
+ const elapsedSeconds = Number((elapsedMs / 1000).toFixed(1));
423
+ await recordLifecycleEvent(specFolderPath, taskNumber, {
424
+ type: 'exited',
425
+ timestamp: new Date().toISOString(),
426
+ data: {
427
+ exitCode: spawnResult.exitCode,
428
+ pid: spawnResult.pid,
429
+ signal: spawnResult.signal ?? undefined,
430
+ timedOut: spawnResult.timedOut,
431
+ elapsedSeconds,
432
+ },
433
+ }, `task ${taskNumber} exited (code: ${spawnResult.exitCode}, elapsed: ${elapsedSeconds}s)`, logger, 'verbose');
434
+ if (spawnResult.exitCode !== 0 || spawnResult.timedOut) {
435
+ const failureReason = spawnResult.timedOut ? 'timeout' : 'crashed';
436
+ await fs.mkdir(deadDir, { recursive: true });
437
+ const deadMarkerLines = [
438
+ '---',
439
+ `reason: ${failureReason}`,
440
+ `exit_code: ${spawnResult.exitCode}`,
441
+ ];
442
+ if (spawnResult.signal) {
443
+ deadMarkerLines.push(`signal: ${spawnResult.signal}`);
444
+ }
445
+ deadMarkerLines.push('---');
446
+ deadMarkerLines.push(`Agent ${spawnResult.timedOut ? 'timed out' : 'crashed'} with code ${spawnResult.exitCode}: ${spawnResult.error || ''}\n`);
447
+ await fs.writeFile(path.join(deadDir, `${taskNumber}.md`), deadMarkerLines.join('\n'), 'utf8');
448
+ await recordDeadEvent(specFolderPath, taskNumber, failureReason);
449
+ logger?.info(formatTaskOutcomeSummary(taskNumber, false, failureReason, failureReason === 'crashed' ? `code: ${spawnResult.exitCode}` : undefined));
450
+ logOutcome(false, failureReason);
451
+ return {
452
+ success: false,
453
+ reason: failureReason,
454
+ error: spawnResult.error || `Agent exited with code ${spawnResult.exitCode}`,
455
+ };
456
+ }
457
+ const resultPath = path.join(runDir, 'results', `${taskNumber}.md`);
458
+ let hasResult = false;
459
+ try {
460
+ await fs.stat(resultPath);
461
+ hasResult = true;
462
+ }
463
+ catch { }
464
+ if (!hasResult) {
465
+ const finalText = await extractFinalTextFromStream(specFolderPath, taskNumber);
466
+ if (finalText) {
467
+ await synthesizeResultFile(path.join(runDir, 'results'), taskNumber, finalText);
468
+ await appendHarnessEvent(specFolderPath, taskNumber, {
469
+ type: 'result_written',
470
+ timestamp: new Date().toISOString(),
471
+ data: { path: resultPath, synthesized: true },
472
+ });
473
+ logger?.verbose(`task ${taskNumber} result synthesized from agent message`);
474
+ }
475
+ else {
476
+ await fs.mkdir(deadDir, { recursive: true });
477
+ await fs.writeFile(path.join(deadDir, `${taskNumber}.md`), `---\nreason: no_result\n---\nAgent exited without writing result file at .run/results/${taskNumber}.md and produced no final text.\n`, 'utf8');
478
+ await recordDeadEvent(specFolderPath, taskNumber, 'no_result');
479
+ logger?.info(formatTaskOutcomeSummary(taskNumber, false, 'no_result'));
480
+ logOutcome(false, 'no_result');
481
+ return {
482
+ success: false,
483
+ reason: 'no_result',
484
+ error: `Agent exited without writing .run/results/${taskNumber}.md`,
485
+ };
486
+ }
487
+ }
488
+ await appendHarnessEvent(specFolderPath, taskNumber, {
489
+ type: 'verify_ran',
490
+ timestamp: new Date().toISOString(),
491
+ data: { command: taskData.verify },
492
+ });
493
+ const verifyTimeoutMs = (config.timeouts.verifyTimeoutSeconds ?? 600) * 1000;
494
+ let verifyTimedOut = false;
495
+ const verifyPromise = new Promise((resolve, reject) => {
496
+ const child = spawn(taskData.verify, {
497
+ cwd: projectRoot,
498
+ shell: true,
499
+ detached: true,
500
+ stdio: ['ignore', 'pipe', 'pipe'],
501
+ });
502
+ let timer = null;
503
+ let killTimer = null;
504
+ if (verifyTimeoutMs > 0) {
505
+ timer = setTimeout(() => {
506
+ verifyTimedOut = true;
507
+ const childPid = child.pid;
508
+ if (childPid) {
509
+ try {
510
+ process.kill(-childPid, 'SIGTERM');
511
+ }
512
+ catch {
513
+ try {
514
+ child.kill('SIGTERM');
515
+ }
516
+ catch { }
517
+ }
518
+ killTimer = setTimeout(() => {
519
+ try {
520
+ process.kill(-childPid, 'SIGKILL');
521
+ }
522
+ catch {
523
+ try {
524
+ child.kill('SIGKILL');
525
+ }
526
+ catch { }
527
+ }
528
+ }, 5000);
529
+ }
530
+ }, verifyTimeoutMs);
531
+ }
532
+ let stderr = '';
533
+ let stdout = '';
534
+ child.stderr?.on('data', (d) => {
535
+ stderr += d.toString();
536
+ });
537
+ child.stdout?.on('data', (d) => {
538
+ stdout += d.toString();
539
+ });
540
+ child.on('error', (err) => {
541
+ if (timer)
542
+ clearTimeout(timer);
543
+ if (killTimer)
544
+ clearTimeout(killTimer);
545
+ reject(err);
546
+ });
547
+ child.on('close', (code) => {
548
+ if (timer)
549
+ clearTimeout(timer);
550
+ if (killTimer)
551
+ clearTimeout(killTimer);
552
+ if (verifyTimedOut) {
553
+ reject(new Error(`Verify command timed out after ${config.timeouts.verifyTimeoutSeconds ?? 600}s`));
554
+ }
555
+ else if (code !== 0) {
556
+ reject(new Error(stderr || stdout || `Process exited with code ${code}`));
557
+ }
558
+ else {
559
+ resolve();
560
+ }
561
+ });
562
+ });
563
+ try {
564
+ await verifyPromise;
565
+ }
566
+ catch (verifyErr) {
567
+ const msg = verifyErr instanceof Error ? verifyErr.message : String(verifyErr);
568
+ await fs.mkdir(deadDir, { recursive: true });
569
+ const deadLines = ['---', 'reason: verify_red'];
570
+ if (verifyTimedOut) {
571
+ deadLines.push('timed_out: true');
572
+ }
573
+ deadLines.push(`command: "${taskData.verify}"`);
574
+ deadLines.push('---');
575
+ deadLines.push(`Watcher independent verify ${verifyTimedOut ? 'timed out' : 'failed'}:\n${msg}\n`);
576
+ await fs.writeFile(path.join(deadDir, `${taskNumber}.md`), deadLines.join('\n'), 'utf8');
577
+ await recordDeadEvent(specFolderPath, taskNumber, 'verify_red');
578
+ logger?.info(formatTaskOutcomeSummary(taskNumber, false, 'verify_red', verifyTimedOut ? 'timed_out: true' : undefined));
579
+ logOutcome(false, 'verify_red');
580
+ return {
581
+ success: false,
582
+ reason: 'verify_red',
583
+ error: `Verify failed: ${msg}`,
584
+ };
585
+ }
586
+ try {
587
+ await fs.unlink(path.join(deadDir, `${taskNumber}.md`));
588
+ }
589
+ catch { }
590
+ await fs.mkdir(doneDir, { recursive: true });
591
+ await fs.writeFile(path.join(doneDir, taskNumber), `${new Date().toISOString()}\n`, 'utf8');
592
+ await recordDoneEvent(specFolderPath, taskNumber);
593
+ logger?.info(formatTaskOutcomeSummary(taskNumber, true));
594
+ logOutcome(true);
595
+ await tickTaskCheckbox(specFolderPath, taskNumber);
596
+ return { success: true };
597
+ }
598
+ finally {
599
+ stopHeartbeat();
600
+ clearTaskHeartbeatStats(specFolderPath, taskNumber);
601
+ await releaseLock(runDir, taskNumber);
602
+ }
603
+ }
604
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/watcher/runner.ts"],"names":[],"mappings":"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"}