@jamesaphoenix/tx-cli 0.5.2 → 0.5.9

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 (44) hide show
  1. package/dist/cli.d.ts +1 -1
  2. package/dist/cli.js +20 -5
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/claim.d.ts +2 -2
  5. package/dist/commands/claim.d.ts.map +1 -1
  6. package/dist/commands/claim.js +20 -1
  7. package/dist/commands/claim.js.map +1 -1
  8. package/dist/commands/cycle.d.ts.map +1 -1
  9. package/dist/commands/cycle.js +14 -3
  10. package/dist/commands/cycle.js.map +1 -1
  11. package/dist/commands/daemon.d.ts +1 -1
  12. package/dist/commands/dashboard.d.ts.map +1 -1
  13. package/dist/commands/dashboard.js +95 -28
  14. package/dist/commands/dashboard.js.map +1 -1
  15. package/dist/commands/doc.d.ts +3 -2
  16. package/dist/commands/doc.d.ts.map +1 -1
  17. package/dist/commands/doc.js +190 -4
  18. package/dist/commands/doc.js.map +1 -1
  19. package/dist/commands/doctor.d.ts +1 -1
  20. package/dist/commands/graph.d.ts +1 -1
  21. package/dist/commands/group-context.d.ts +6 -0
  22. package/dist/commands/group-context.d.ts.map +1 -0
  23. package/dist/commands/group-context.js +42 -0
  24. package/dist/commands/group-context.js.map +1 -0
  25. package/dist/commands/scaffold.d.ts +24 -2
  26. package/dist/commands/scaffold.d.ts.map +1 -1
  27. package/dist/commands/scaffold.js +173 -7
  28. package/dist/commands/scaffold.js.map +1 -1
  29. package/dist/commands/trace.d.ts +15 -2
  30. package/dist/commands/trace.d.ts.map +1 -1
  31. package/dist/commands/trace.js +138 -18
  32. package/dist/commands/trace.js.map +1 -1
  33. package/dist/help.d.ts.map +1 -1
  34. package/dist/help.js +129 -8
  35. package/dist/help.js.map +1 -1
  36. package/dist/output.d.ts.map +1 -1
  37. package/dist/output.js +5 -1
  38. package/dist/output.js.map +1 -1
  39. package/package.json +8 -2
  40. package/dist/commands/orchestrator.d.ts +0 -11
  41. package/dist/commands/orchestrator.d.ts.map +0 -1
  42. package/dist/commands/orchestrator.js +0 -129
  43. package/dist/commands/orchestrator.js.map +0 -1
  44. package/dist/tx +0 -0
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * Scaffold Claude Code or Codex integration files into the current project.
3
3
  *
4
- * Copies template files (CLAUDE.md / AGENTS.md, skills, scripts) into the
4
+ * Copies template files (CLAUDE.md / AGENTS.md, skills, scripts, codex rules) into the
5
5
  * user's project, skipping any files that already exist.
6
6
  */
7
- import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, statSync, chmodSync } from "node:fs";
8
- import { resolve, join, dirname, relative } from "node:path";
7
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, statSync, chmodSync, accessSync, constants as fsConstants } from "node:fs";
8
+ import { resolve, join, dirname, relative, delimiter } from "node:path";
9
9
  import { fileURLToPath } from "node:url";
10
10
  import * as p from "@clack/prompts";
11
11
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -66,6 +66,110 @@ function copyTree(src, dest, baseDir) {
66
66
  }
67
67
  return { copied, skipped };
68
68
  }
69
+ const WATCHDOG_RUNTIME_MODES = ["auto", "codex", "claude", "both"];
70
+ export function parseWatchdogRuntimeMode(value) {
71
+ if (value === undefined) {
72
+ return "auto";
73
+ }
74
+ if (value === true) {
75
+ throw new Error("Flag --watchdog-runtime requires a value: auto|codex|claude|both.");
76
+ }
77
+ if (typeof value !== "string") {
78
+ throw new Error("Flag --watchdog-runtime must be one of: auto|codex|claude|both.");
79
+ }
80
+ if (WATCHDOG_RUNTIME_MODES.includes(value)) {
81
+ return value;
82
+ }
83
+ throw new Error(`Invalid --watchdog-runtime value: ${value} (expected: auto|codex|claude|both)`);
84
+ }
85
+ function commandAvailable(commandName, pathEnv) {
86
+ if (!pathEnv) {
87
+ return false;
88
+ }
89
+ const pathEntries = pathEnv.split(delimiter).filter(Boolean);
90
+ const isWindows = process.platform === "win32";
91
+ const extensions = isWindows
92
+ ? (process.env.PATHEXT ?? ".EXE;.CMD;.BAT;.COM").split(";")
93
+ : [""];
94
+ for (const entry of pathEntries) {
95
+ for (const ext of extensions) {
96
+ const candidate = join(entry, isWindows ? `${commandName}${ext}` : commandName);
97
+ try {
98
+ accessSync(candidate, fsConstants.X_OK);
99
+ if (statSync(candidate).isFile()) {
100
+ return true;
101
+ }
102
+ }
103
+ catch {
104
+ continue;
105
+ }
106
+ }
107
+ }
108
+ return false;
109
+ }
110
+ function resolveWatchdogRuntime(mode, pathEnv) {
111
+ const codexAvailable = commandAvailable("codex", pathEnv);
112
+ const claudeAvailable = commandAvailable("claude", pathEnv);
113
+ if (mode === "codex") {
114
+ if (!codexAvailable) {
115
+ throw new Error("Watchdog runtime 'codex' unavailable: codex CLI not found in PATH. Install codex or use --watchdog-runtime auto|claude.");
116
+ }
117
+ return { warnings: [], watchdogEnabled: true, codexEnabled: true, claudeEnabled: false };
118
+ }
119
+ if (mode === "claude") {
120
+ if (!claudeAvailable) {
121
+ throw new Error("Watchdog runtime 'claude' unavailable: claude CLI not found in PATH. Install claude or use --watchdog-runtime auto|codex.");
122
+ }
123
+ return { warnings: [], watchdogEnabled: true, codexEnabled: false, claudeEnabled: true };
124
+ }
125
+ if (mode === "both") {
126
+ const missing = [];
127
+ if (!codexAvailable)
128
+ missing.push("codex");
129
+ if (!claudeAvailable)
130
+ missing.push("claude");
131
+ if (missing.length > 0) {
132
+ throw new Error(`Watchdog runtime 'both' requires codex and claude; missing: ${missing.join(", ")}.`);
133
+ }
134
+ return { warnings: [], watchdogEnabled: true, codexEnabled: true, claudeEnabled: true };
135
+ }
136
+ const codexEnabled = codexAvailable;
137
+ const claudeEnabled = claudeAvailable;
138
+ const watchdogEnabled = codexEnabled || claudeEnabled;
139
+ const warnings = watchdogEnabled
140
+ ? []
141
+ : [
142
+ "Watchdog runtime auto-detect found no codex/claude CLI in PATH. Assets were scaffolded with WATCHDOG_ENABLED=0.",
143
+ "Install a runtime and update .tx/watchdog.env to enable watchdog supervision.",
144
+ ];
145
+ return {
146
+ warnings,
147
+ watchdogEnabled,
148
+ codexEnabled,
149
+ claudeEnabled,
150
+ };
151
+ }
152
+ function renderWatchdogEnv(mode, runtime, detached) {
153
+ const as01 = (value) => (value ? "1" : "0");
154
+ const lines = [
155
+ `WATCHDOG_ENABLED=${as01(runtime.watchdogEnabled)}`,
156
+ `WATCHDOG_RUNTIME_MODE=${mode}`,
157
+ `WATCHDOG_CODEX_ENABLED=${as01(runtime.codexEnabled)}`,
158
+ `WATCHDOG_CLAUDE_ENABLED=${as01(runtime.claudeEnabled)}`,
159
+ "WATCHDOG_POLL_SECONDS=300",
160
+ "WATCHDOG_TRANSCRIPT_IDLE_SECONDS=600",
161
+ "WATCHDOG_CLAUDE_STALL_GRACE_SECONDS=900",
162
+ "WATCHDOG_HEARTBEAT_LAG_SECONDS=180",
163
+ "WATCHDOG_RUN_STALE_SECONDS=5400",
164
+ "WATCHDOG_IDLE_ROUNDS=300",
165
+ "WATCHDOG_ERROR_BURST_WINDOW_MINUTES=20",
166
+ "WATCHDOG_ERROR_BURST_THRESHOLD=4",
167
+ "WATCHDOG_ERROR_BURST_GRACE_SECONDS=600",
168
+ "WATCHDOG_RESTART_COOLDOWN_SECONDS=900",
169
+ `WATCHDOG_DETACHED=${detached ? "1" : "0"}`,
170
+ ];
171
+ return `${lines.join("\n")}\n`;
172
+ }
69
173
  /**
70
174
  * Scaffold Claude Code integration into the current project.
71
175
  */
@@ -131,6 +235,12 @@ export function scaffoldCodex(projectDir) {
131
235
  const agentsResult = copyTree(codexAgentsSrc, codexAgentsDest);
132
236
  allCopied.push(...agentsResult.copied.map(p => `.codex/agents/${p}`));
133
237
  allSkipped.push(...agentsResult.skipped.map(p => `.codex/agents/${p}`));
238
+ // Copy codex command policy rules
239
+ const codexRulesSrc = join(templates, "codex", "rules");
240
+ const codexRulesDest = join(projectDir, ".codex", "rules");
241
+ const rulesResult = copyTree(codexRulesSrc, codexRulesDest);
242
+ allCopied.push(...rulesResult.copied.map(p => `.codex/rules/${p}`));
243
+ allSkipped.push(...rulesResult.skipped.map(p => `.codex/rules/${p}`));
134
244
  const agentsMdSrc = join(templates, "codex", "AGENTS.md");
135
245
  const agentsMdDest = join(projectDir, "AGENTS.md");
136
246
  if (existsSync(agentsMdDest)) {
@@ -150,6 +260,46 @@ export function scaffoldCodex(projectDir) {
150
260
  }
151
261
  return { copied: allCopied, skipped: allSkipped };
152
262
  }
263
+ /**
264
+ * Scaffold watchdog supervision scripts/config into the current project.
265
+ * Runtime-specific toggles are persisted in .tx/watchdog.env.
266
+ */
267
+ export function scaffoldWatchdog(projectDir, options) {
268
+ const allCopied = [];
269
+ const allSkipped = [];
270
+ const mode = options?.runtimeMode ?? "auto";
271
+ const runtime = resolveWatchdogRuntime(mode, options?.pathEnv ?? (process.env.PATH ?? ""));
272
+ const detached = options?.detached !== false;
273
+ const templates = templatesDir();
274
+ const scriptsSrc = join(templates, "watchdog", "scripts");
275
+ const scriptsDest = join(projectDir, "scripts");
276
+ const scriptsResult = copyTree(scriptsSrc, scriptsDest);
277
+ allCopied.push(...scriptsResult.copied.map(p => `scripts/${p}`));
278
+ allSkipped.push(...scriptsResult.skipped.map(p => `scripts/${p}`));
279
+ const opsSrc = join(templates, "watchdog", "ops");
280
+ const opsDest = join(projectDir, "ops");
281
+ const opsResult = copyTree(opsSrc, opsDest);
282
+ allCopied.push(...opsResult.copied.map(p => `ops/${p}`));
283
+ allSkipped.push(...opsResult.skipped.map(p => `ops/${p}`));
284
+ const envPath = join(projectDir, ".tx", "watchdog.env");
285
+ if (existsSync(envPath)) {
286
+ allSkipped.push(".tx/watchdog.env");
287
+ }
288
+ else {
289
+ mkdirSync(dirname(envPath), { recursive: true });
290
+ writeFileSync(envPath, renderWatchdogEnv(mode, runtime, detached));
291
+ allCopied.push(".tx/watchdog.env");
292
+ }
293
+ return {
294
+ copied: allCopied,
295
+ skipped: allSkipped,
296
+ warnings: runtime.warnings,
297
+ runtimeMode: mode,
298
+ watchdogEnabled: runtime.watchdogEnabled,
299
+ codexEnabled: runtime.codexEnabled,
300
+ claudeEnabled: runtime.claudeEnabled,
301
+ };
302
+ }
153
303
  /** Format scaffold results for clack note */
154
304
  function formatResults(results) {
155
305
  const lines = [];
@@ -165,7 +315,8 @@ function formatResults(results) {
165
315
  * Interactive scaffold using @clack/prompts.
166
316
  * Asks the user what they want step by step.
167
317
  */
168
- export async function interactiveScaffold(projectDir) {
318
+ export async function interactiveScaffold(projectDir, options) {
319
+ const watchdogRuntimeMode = options?.watchdogRuntimeMode ?? "auto";
169
320
  const wantsClaude = await p.confirm({
170
321
  message: "Add Claude Code integration? (CLAUDE.md + skills)",
171
322
  initialValue: true,
@@ -201,7 +352,7 @@ export async function interactiveScaffold(projectDir) {
201
352
  results.push(result);
202
353
  }
203
354
  const wantsCodex = await p.confirm({
204
- message: "Add Codex integration? (AGENTS.md + .codex/agents)",
355
+ message: "Add Codex integration? (AGENTS.md + .codex/agents + .codex/rules)",
205
356
  initialValue: true,
206
357
  });
207
358
  if (p.isCancel(wantsCodex)) {
@@ -211,12 +362,27 @@ export async function interactiveScaffold(projectDir) {
211
362
  if (wantsCodex) {
212
363
  results.push(scaffoldCodex(projectDir));
213
364
  }
365
+ const wantsWatchdog = await p.confirm({
366
+ message: "Enable watchdog supervision for detached RALPH loops? (default: No)",
367
+ initialValue: false,
368
+ });
369
+ if (p.isCancel(wantsWatchdog)) {
370
+ p.cancel("Setup cancelled.");
371
+ return;
372
+ }
373
+ if (wantsWatchdog) {
374
+ const watchdogResult = scaffoldWatchdog(projectDir, { runtimeMode: watchdogRuntimeMode });
375
+ for (const warning of watchdogResult.warnings) {
376
+ p.log.warn(warning);
377
+ }
378
+ results.push(watchdogResult);
379
+ }
214
380
  const output = formatResults(results);
215
381
  if (output) {
216
382
  p.note(output, "Files");
217
383
  }
218
- if (!wantsClaude && !wantsCodex) {
219
- p.log.info("Skipped agent integration. Run tx init --claude or tx init --codex later.");
384
+ if (!wantsClaude && !wantsCodex && !wantsWatchdog) {
385
+ p.log.info("Skipped integrations. Run tx init --claude, --codex, or --watchdog later.");
220
386
  }
221
387
  }
222
388
  //# sourceMappingURL=scaffold.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC9G,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAA;AAEnC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzD,mEAAmE;AACnE,SAAS,YAAY;IACnB,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;AAC9C,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,iEAAiE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACxF,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CACf,GAAW,EACX,IAAY,EACZ,OAAgB;IAEhB,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,IAAI,GAAG,OAAO,IAAI,IAAI,CAAA;IAE5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IAEhD,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;QAE9B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;YAC7C,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;YAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC;oBACH,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;gBACnD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,GAAG,GAAG,KAA8B,CAAA;oBAC1C,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBAC3B,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,4EAA4E,CAAC,CAAA;oBAC1H,CAAC;oBACD,MAAM,KAAK,CAAA;gBACb,CAAC;gBACD,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;gBAC9C,4BAA4B;gBAC5B,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7B,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;gBAC5B,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAC5B,CAAC;AAcD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,OAAuB;IACxE,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAA;IACtG,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAEhC,0CAA0C;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;IACxD,MAAM,eAAe,GAAa,EAAE,CAAA;IACpC,IAAI,IAAI,CAAC,aAAa;QAAE,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC3D,IAAI,IAAI,CAAC,UAAU;QAAE,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAErD,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAClC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QACzE,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7E,CAAC;IAED,oBAAoB;IACpB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;QAChD,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAA;QACzD,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,wBAAwB;IACxB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;QAElD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;YACpD,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;YAC3D,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;gBACpD,aAAa,CAAC,YAAY,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC,CAAA;gBAC1D,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;YACnD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;YAC/D,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAEhC,4BAA4B;IAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IACzD,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC5D,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;IAC9D,SAAS,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAA;IACrE,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAA;IAEvE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;IACzD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IAElD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QACpD,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,UAAU,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;QAC3D,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;YACpD,aAAa,CAAC,YAAY,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC,CAAA;YAC1D,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;QAC/D,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC7B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;AACnD,CAAC;AAED,6CAA6C;AAC7C,SAAS,aAAa,CAAC,OAAyB;IAC9C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAChD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB;IAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QAClC,OAAO,EAAE,mDAAmD;QAC5D,YAAY,EAAE,IAAI;KACnB,CAAC,CAAA;IACF,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAErE,MAAM,OAAO,GAAqB,EAAE,CAAA;IAEpC,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;YACjC,OAAO,EAAE,4DAA4D;YACrE,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QACF,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QAEpE,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;YACjC,OAAO,EAAE,8CAA8C;YACvD,YAAY,EAAE,KAAK;SACpB,CAAC,CAAA;QACF,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE;YACxC,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,WAAW,EAAE,CAAC,CAAC,UAAU;SAC1B,CAAC,CAAA;QACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACtB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QACjC,OAAO,EAAE,oDAAoD;QAC7D,YAAY,EAAE,IAAI;KACnB,CAAC,CAAA;IACF,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAEpE,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAA;IACzC,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzB,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAA;IACzF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  * CLI commands for execution tracing (PRD-019).
5
5
  */
6
6
  import { Effect } from "effect";
7
- import { RunRepository, SqliteClient, type DatabaseError } from "@jamesaphoenix/tx-core";
7
+ import { RunRepository, RunHeartbeatService, SqliteClient, type DatabaseError } from "@jamesaphoenix/tx-core";
8
8
  import { type Flags } from "../utils/parse.js";
9
9
  /**
10
10
  * tx trace list - Show recent runs with event counts.
@@ -28,6 +28,19 @@ export declare const traceStderr: (pos: string[], _flags: Flags) => Effect.Effec
28
28
  * tx trace show <run-id> - Show metrics events for a run.
29
29
  */
30
30
  export declare const traceShow: (pos: string[], flags: Flags) => Effect.Effect<void, DatabaseError, RunRepository | SqliteClient>;
31
+ /**
32
+ * tx trace heartbeat <run-id> - Update run heartbeat state.
33
+ *
34
+ * Primitive used by orchestration loops to record transcript/log progress.
35
+ */
36
+ export declare const traceHeartbeat: (pos: string[], flags: Flags) => Effect.Effect<void, DatabaseError, RunHeartbeatService>;
37
+ /**
38
+ * tx trace stalled - Find or reap stalled running runs.
39
+ *
40
+ * A run is considered stalled when transcript activity has not moved
41
+ * for longer than --transcript-idle-seconds.
42
+ */
43
+ export declare const traceStalled: (pos: string[], flags: Flags) => Effect.Effect<void, DatabaseError, RunHeartbeatService>;
31
44
  /**
32
45
  * tx trace errors - Show recent errors across all runs.
33
46
  */
@@ -35,5 +48,5 @@ export declare const traceErrors: (_pos: string[], flags: Flags) => Effect.Effec
35
48
  /**
36
49
  * Main trace command dispatcher.
37
50
  */
38
- export declare const trace: (pos: string[], flags: Flags) => Effect.Effect<void, DatabaseError, RunRepository | SqliteClient>;
51
+ export declare const trace: (pos: string[], flags: Flags) => Effect.Effect<void, DatabaseError, RunRepository | RunHeartbeatService | SqliteClient>;
39
52
  //# sourceMappingURL=trace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAG/B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,KAAK,aAAa,EAGnB,MAAM,wBAAwB,CAAA;AAI/B,OAAO,EAAE,KAAK,KAAK,EAAqB,MAAM,mBAAmB,CAAA;AAmDjE;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,EAAE,OAAO,KAAK,KAmE9C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,GAAG,YAAY,CAAC,CAAA;AAiIxE;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,EAAE,QAAQ,KAAK,KA4CpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,CAAC,CAAA;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,EAAE,QAAQ,KAAK,KA4ChD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,CAAC,CAAA;AAEzD;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,KA0L7C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,GAAG,YAAY,CAAC,CAAA;AAwCxE;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,EAAE,OAAO,KAAK,KAuIhD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,YAAY,CAAC,CAAA;AAExD;;GAEG;AACH,eAAO,MAAM,KAAK,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,KAgDzC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,GAAG,YAAY,CAAC,CAAA"}
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAG/B,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,KAAK,aAAa,EAGnB,MAAM,wBAAwB,CAAA;AAI/B,OAAO,EAAE,KAAK,KAAK,EAA0B,MAAM,mBAAmB,CAAA;AAmDtE;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,EAAE,OAAO,KAAK,KA6D9C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,GAAG,YAAY,CAAC,CAAA;AAiIxE;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,EAAE,QAAQ,KAAK,KA4CpD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,CAAC,CAAA;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,EAAE,QAAQ,KAAK,KA4ChD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,CAAC,CAAA;AAEzD;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,KA0L7C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,GAAG,YAAY,CAAC,CAAA;AAgDxE;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,KAsDlD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAA;AAE/D;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,KA0DhD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAA;AAE/D;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,EAAE,OAAO,KAAK,KAuIhD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,YAAY,CAAC,CAAA;AAExD;;GAEG;AACH,eAAO,MAAM,KAAK,GAAI,KAAK,MAAM,EAAE,EAAE,OAAO,KAAK,KAsDzC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,aAAa,GAAG,mBAAmB,GAAG,YAAY,CAAC,CAAA"}
@@ -6,10 +6,10 @@
6
6
  import { Effect } from "effect";
7
7
  import { existsSync, readFileSync } from "node:fs";
8
8
  import { join, resolve } from "node:path";
9
- import { RunRepository, SqliteClient, getAdapter } from "@jamesaphoenix/tx-core";
9
+ import { RunRepository, RunHeartbeatService, SqliteClient, getAdapter } from "@jamesaphoenix/tx-core";
10
10
  import { toJson, truncate } from "../output.js";
11
11
  import { commandHelp } from "../help.js";
12
- import { flag, parseIntOpt } from "../utils/parse.js";
12
+ import { flag, opt, parseIntOpt } from "../utils/parse.js";
13
13
  /**
14
14
  * Calculate relative time string (e.g., "2h ago", "3d ago").
15
15
  */
@@ -38,7 +38,7 @@ const getSpanCountsForRuns = (db, runIds) => {
38
38
  const rows = db.prepare(`
39
39
  SELECT run_id, COUNT(*) as count
40
40
  FROM events
41
- WHERE run_id IN (${placeholders}) AND event_type = 'span'
41
+ WHERE event_type = 'span' AND run_id IN (${placeholders})
42
42
  GROUP BY run_id
43
43
  `).all(...runIds);
44
44
  const counts = new Map();
@@ -56,14 +56,9 @@ export const traceList = (_pos, flags) => Effect.gen(function* () {
56
56
  // Parse options
57
57
  const limit = parseIntOpt(flags, "limit", "limit", "n") ?? 20;
58
58
  const hours = parseIntOpt(flags, "hours", "hours") ?? 24;
59
- // Get recent runs - for now we'll get more than needed and filter by time
60
- // A more efficient approach would be to add a time-filtered query to RunRepository
61
- const allRuns = yield* runRepo.findRecent(limit * 2); // Get extra to account for time filtering
62
- // Filter to runs within the specified hours
63
- const cutoff = Date.now() - hours * 60 * 60 * 1000;
64
- const recentRuns = allRuns
65
- .filter(r => r.startedAt.getTime() >= cutoff)
66
- .slice(0, limit);
59
+ // Push time-window filtering into SQL to avoid overfetching runs in memory.
60
+ const cutoff = new Date(Date.now() - hours * 60 * 60 * 1000);
61
+ const recentRuns = yield* runRepo.findRecentSince(cutoff, limit);
67
62
  // Get span counts for all runs
68
63
  const runIds = recentRuns.map(r => r.id);
69
64
  const spanCounts = getSpanCountsForRuns(db, runIds);
@@ -440,6 +435,123 @@ export const traceShow = (pos, flags) => Effect.gen(function* () {
440
435
  console.log("");
441
436
  console.log(`${metricsEvents.length} event(s)`);
442
437
  });
438
+ const parseRunId = (raw) => {
439
+ if (!/^run-.+$/.test(raw)) {
440
+ console.error(`Invalid run ID: "${raw}". Expected format: run-<id>`);
441
+ process.exit(1);
442
+ }
443
+ return raw;
444
+ };
445
+ /**
446
+ * tx trace heartbeat <run-id> - Update run heartbeat state.
447
+ *
448
+ * Primitive used by orchestration loops to record transcript/log progress.
449
+ */
450
+ export const traceHeartbeat = (pos, flags) => Effect.gen(function* () {
451
+ const raw = pos[0];
452
+ if (!raw) {
453
+ console.error("Error: run-id is required");
454
+ console.error("Usage: tx trace heartbeat <run-id> [--stdout-bytes <n>] [--stderr-bytes <n>] [--transcript-bytes <n>] [--delta-bytes <n>] [--check-at <iso>] [--activity-at <iso>]");
455
+ process.exit(1);
456
+ }
457
+ const runId = parseRunId(raw);
458
+ const svc = yield* RunHeartbeatService;
459
+ const stdoutBytes = parseIntOpt(flags, "stdout-bytes", "stdout-bytes") ?? 0;
460
+ const stderrBytes = parseIntOpt(flags, "stderr-bytes", "stderr-bytes") ?? 0;
461
+ const transcriptBytes = parseIntOpt(flags, "transcript-bytes", "transcript-bytes") ?? 0;
462
+ const deltaBytes = parseIntOpt(flags, "delta-bytes", "delta-bytes") ?? 0;
463
+ const parseDateFlag = (name) => {
464
+ const rawValue = opt(flags, name);
465
+ if (!rawValue)
466
+ return undefined;
467
+ const parsed = new Date(rawValue);
468
+ if (Number.isNaN(parsed.getTime())) {
469
+ console.error(`Invalid value for --${name}: "${rawValue}" is not a valid ISO timestamp`);
470
+ process.exit(1);
471
+ }
472
+ return parsed;
473
+ };
474
+ const checkAt = parseDateFlag("check-at");
475
+ const activityAt = parseDateFlag("activity-at");
476
+ yield* svc.heartbeat({
477
+ runId,
478
+ checkAt,
479
+ activityAt,
480
+ stdoutBytes,
481
+ stderrBytes,
482
+ transcriptBytes,
483
+ deltaBytes,
484
+ });
485
+ if (flag(flags, "json")) {
486
+ console.log(toJson({
487
+ runId,
488
+ checkAt: (checkAt ?? new Date()).toISOString(),
489
+ activityAt: activityAt?.toISOString() ?? null,
490
+ stdoutBytes,
491
+ stderrBytes,
492
+ transcriptBytes,
493
+ deltaBytes,
494
+ }));
495
+ }
496
+ else {
497
+ console.log(`Heartbeat updated: ${runId}`);
498
+ }
499
+ });
500
+ /**
501
+ * tx trace stalled - Find or reap stalled running runs.
502
+ *
503
+ * A run is considered stalled when transcript activity has not moved
504
+ * for longer than --transcript-idle-seconds.
505
+ */
506
+ export const traceStalled = (pos, flags) => Effect.gen(function* () {
507
+ const _ = pos; // reserved for future positional args
508
+ void _;
509
+ const svc = yield* RunHeartbeatService;
510
+ const transcriptIdleSeconds = parseIntOpt(flags, "transcript-idle-seconds", "transcript-idle-seconds") ?? 300;
511
+ const heartbeatLagSeconds = parseIntOpt(flags, "heartbeat-lag-seconds", "heartbeat-lag-seconds");
512
+ const reap = flag(flags, "reap", "kill");
513
+ const dryRun = flag(flags, "dry-run");
514
+ const noResetTask = flag(flags, "no-reset-task");
515
+ if (reap) {
516
+ const results = yield* svc.reapStalled({
517
+ transcriptIdleSeconds,
518
+ heartbeatLagSeconds,
519
+ dryRun,
520
+ resetTask: !noResetTask,
521
+ });
522
+ if (flag(flags, "json")) {
523
+ console.log(toJson(results));
524
+ return;
525
+ }
526
+ if (results.length === 0) {
527
+ console.log("No stalled running runs found.");
528
+ return;
529
+ }
530
+ console.log(`Reaped stalled runs (${results.length}):`);
531
+ for (const row of results) {
532
+ console.log(` ${row.id} [${row.reason}] pid=${row.pid ?? "-"} task=${row.taskId ?? "-"}`);
533
+ console.log(` processTerminated=${row.processTerminated} taskReset=${row.taskReset}`);
534
+ }
535
+ return;
536
+ }
537
+ const results = yield* svc.listStalled({
538
+ transcriptIdleSeconds,
539
+ heartbeatLagSeconds,
540
+ });
541
+ if (flag(flags, "json")) {
542
+ console.log(toJson(results));
543
+ return;
544
+ }
545
+ if (results.length === 0) {
546
+ console.log("No stalled running runs found.");
547
+ return;
548
+ }
549
+ console.log(`Stalled running runs (${results.length}):`);
550
+ for (const row of results) {
551
+ console.log(` ${row.run.id} [${row.reason}] pid=${row.run.pid ?? "-"} task=${row.run.taskId ?? "-"}`);
552
+ console.log(` transcriptIdleSeconds=${row.transcriptIdleSeconds ?? "-"} heartbeatLagSeconds=${row.heartbeatLagSeconds ?? "-"}`);
553
+ }
554
+ });
443
555
  /**
444
556
  * tx trace errors - Show recent errors across all runs.
445
557
  */
@@ -454,10 +566,10 @@ export const traceErrors = (_pos, flags) => Effect.gen(function* () {
454
566
  const failedRuns = db.prepare(`
455
567
  SELECT id, task_id, agent, ended_at, error_message
456
568
  FROM runs
457
- WHERE status = 'failed' AND ended_at >= ?
569
+ WHERE status = ? AND ended_at >= ?
458
570
  ORDER BY ended_at DESC
459
571
  LIMIT ?
460
- `).all(cutoff, limit);
572
+ `).all("failed", cutoff, limit);
461
573
  for (const run of failedRuns) {
462
574
  errors.push({
463
575
  timestamp: run.ended_at ? new Date(run.ended_at) : new Date(),
@@ -474,12 +586,12 @@ export const traceErrors = (_pos, flags) => Effect.gen(function* () {
474
586
  const errorSpans = db.prepare(`
475
587
  SELECT timestamp, run_id, task_id, agent, content, metadata, duration_ms
476
588
  FROM events
477
- WHERE event_type = 'span'
589
+ WHERE event_type = ?
590
+ AND json_extract(metadata, '$.status') = ?
478
591
  AND timestamp >= ?
479
- AND json_extract(metadata, '$.status') = 'error'
480
592
  ORDER BY timestamp DESC
481
593
  LIMIT ?
482
- `).all(cutoff, limit);
594
+ `).all("span", "error", cutoff, limit);
483
595
  for (const span of errorSpans) {
484
596
  let errorMessage = "Unknown error";
485
597
  try {
@@ -506,10 +618,10 @@ export const traceErrors = (_pos, flags) => Effect.gen(function* () {
506
618
  const errorEvents = db.prepare(`
507
619
  SELECT timestamp, run_id, task_id, agent, content, metadata, duration_ms
508
620
  FROM events
509
- WHERE event_type = 'error' AND timestamp >= ?
621
+ WHERE event_type = ? AND timestamp >= ?
510
622
  ORDER BY timestamp DESC
511
623
  LIMIT ?
512
- `).all(cutoff, limit);
624
+ `).all("error", cutoff, limit);
513
625
  for (const event of errorEvents) {
514
626
  errors.push({
515
627
  timestamp: new Date(event.timestamp),
@@ -578,6 +690,8 @@ Subcommands:
578
690
  show <run-id> Show metrics events for a run
579
691
  transcript <run-id> Display raw transcript content
580
692
  stderr <run-id> Display stderr content
693
+ heartbeat <run-id> Update heartbeat state for a run
694
+ stalled List or reap stalled running runs
581
695
  errors Show recent errors across all runs
582
696
 
583
697
  Options:
@@ -608,6 +722,12 @@ Options:
608
722
  else if (subcommand === "stderr") {
609
723
  yield* traceStderr(pos.slice(1), flags);
610
724
  }
725
+ else if (subcommand === "heartbeat") {
726
+ yield* traceHeartbeat(pos.slice(1), flags);
727
+ }
728
+ else if (subcommand === "stalled") {
729
+ yield* traceStalled(pos.slice(1), flags);
730
+ }
611
731
  else if (subcommand === "errors") {
612
732
  yield* traceErrors(pos.slice(1), flags);
613
733
  }