@agent-relay/sdk 3.2.9 → 3.2.11
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/bin/agent-relay-broker-darwin-arm64 +0 -0
- package/bin/agent-relay-broker-darwin-x64 +0 -0
- package/bin/agent-relay-broker-linux-arm64 +0 -0
- package/bin/agent-relay-broker-linux-x64 +0 -0
- package/dist/cli-registry.d.ts +42 -0
- package/dist/cli-registry.d.ts.map +1 -0
- package/dist/cli-registry.js +126 -0
- package/dist/cli-registry.js.map +1 -0
- package/dist/cli-resolver.d.ts +30 -0
- package/dist/cli-resolver.d.ts.map +1 -0
- package/dist/cli-resolver.js +132 -0
- package/dist/cli-resolver.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/spawn-from-env.d.ts.map +1 -1
- package/dist/spawn-from-env.js +6 -15
- package/dist/spawn-from-env.js.map +1 -1
- package/dist/workflows/__tests__/cli-session-collector.test.d.ts +2 -0
- package/dist/workflows/__tests__/cli-session-collector.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/cli-session-collector.test.js +54 -0
- package/dist/workflows/__tests__/cli-session-collector.test.js.map +1 -0
- package/dist/workflows/__tests__/collectors/claude.test.d.ts +2 -0
- package/dist/workflows/__tests__/collectors/claude.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/collectors/claude.test.js +85 -0
- package/dist/workflows/__tests__/collectors/claude.test.js.map +1 -0
- package/dist/workflows/__tests__/collectors/codex.test.d.ts +2 -0
- package/dist/workflows/__tests__/collectors/codex.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/collectors/codex.test.js +67 -0
- package/dist/workflows/__tests__/collectors/codex.test.js.map +1 -0
- package/dist/workflows/__tests__/collectors/opencode.test.d.ts +2 -0
- package/dist/workflows/__tests__/collectors/opencode.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/collectors/opencode.test.js +119 -0
- package/dist/workflows/__tests__/collectors/opencode.test.js.map +1 -0
- package/dist/workflows/__tests__/run-summary-table.test.d.ts +2 -0
- package/dist/workflows/__tests__/run-summary-table.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/run-summary-table.test.js +130 -0
- package/dist/workflows/__tests__/run-summary-table.test.js.map +1 -0
- package/dist/workflows/__tests__/step-cwd.test.d.ts +2 -0
- package/dist/workflows/__tests__/step-cwd.test.d.ts.map +1 -0
- package/dist/workflows/__tests__/step-cwd.test.js +42 -0
- package/dist/workflows/__tests__/step-cwd.test.js.map +1 -0
- package/dist/workflows/builder.d.ts +7 -0
- package/dist/workflows/builder.d.ts.map +1 -1
- package/dist/workflows/builder.js +40 -5
- package/dist/workflows/builder.js.map +1 -1
- package/dist/workflows/cli-session-collector.d.ts +39 -0
- package/dist/workflows/cli-session-collector.d.ts.map +1 -0
- package/dist/workflows/cli-session-collector.js +23 -0
- package/dist/workflows/cli-session-collector.js.map +1 -0
- package/dist/workflows/cli.js +228 -48
- package/dist/workflows/cli.js.map +1 -1
- package/dist/workflows/collectors/claude.d.ts +6 -0
- package/dist/workflows/collectors/claude.d.ts.map +1 -0
- package/dist/workflows/collectors/claude.js +330 -0
- package/dist/workflows/collectors/claude.js.map +1 -0
- package/dist/workflows/collectors/codex.d.ts +18 -0
- package/dist/workflows/collectors/codex.d.ts.map +1 -0
- package/dist/workflows/collectors/codex.js +265 -0
- package/dist/workflows/collectors/codex.js.map +1 -0
- package/dist/workflows/collectors/opencode.d.ts +6 -0
- package/dist/workflows/collectors/opencode.d.ts.map +1 -0
- package/dist/workflows/collectors/opencode.js +204 -0
- package/dist/workflows/collectors/opencode.js.map +1 -0
- package/dist/workflows/default-logger.d.ts +9 -0
- package/dist/workflows/default-logger.d.ts.map +1 -0
- package/dist/workflows/default-logger.js +104 -0
- package/dist/workflows/default-logger.js.map +1 -0
- package/dist/workflows/index.d.ts +4 -0
- package/dist/workflows/index.d.ts.map +1 -1
- package/dist/workflows/index.js +4 -0
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/listr-renderer.d.ts +26 -0
- package/dist/workflows/listr-renderer.d.ts.map +1 -0
- package/dist/workflows/listr-renderer.js +232 -0
- package/dist/workflows/listr-renderer.js.map +1 -0
- package/dist/workflows/run-summary-table.d.ts +4 -0
- package/dist/workflows/run-summary-table.d.ts.map +1 -0
- package/dist/workflows/run-summary-table.js +98 -0
- package/dist/workflows/run-summary-table.js.map +1 -0
- package/dist/workflows/runner.d.ts +12 -1
- package/dist/workflows/runner.d.ts.map +1 -1
- package/dist/workflows/runner.js +107 -71
- package/dist/workflows/runner.js.map +1 -1
- package/dist/workflows/types.d.ts +2 -0
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/types.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listr-renderer.js","sourceRoot":"","sources":["../../src/workflows/listr-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CliSessionReport } from './cli-session-collector.js';
|
|
2
|
+
import type { StepOutcome } from './trajectory.js';
|
|
3
|
+
export declare function formatRunSummaryTable(outcomes: StepOutcome[], reports: Map<string, CliSessionReport>): string;
|
|
4
|
+
//# sourceMappingURL=run-summary-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-summary-table.d.ts","sourceRoot":"","sources":["../../src/workflows/run-summary-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAuCnD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACrC,MAAM,CAkER"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
function formatCurrency(value) {
|
|
2
|
+
return typeof value === 'number' ? `$${value.toFixed(2)}` : '--';
|
|
3
|
+
}
|
|
4
|
+
function formatTokens(report) {
|
|
5
|
+
if (!report?.tokens)
|
|
6
|
+
return '--';
|
|
7
|
+
const total = report.tokens.input + report.tokens.output + report.tokens.cacheRead;
|
|
8
|
+
return total.toLocaleString('en-US');
|
|
9
|
+
}
|
|
10
|
+
function formatDuration(durationMs) {
|
|
11
|
+
if (typeof durationMs !== 'number' || !Number.isFinite(durationMs))
|
|
12
|
+
return '--';
|
|
13
|
+
if (durationMs < 1000)
|
|
14
|
+
return `${durationMs}ms`;
|
|
15
|
+
const totalSeconds = Math.round(durationMs / 1000);
|
|
16
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
17
|
+
const seconds = totalSeconds % 60;
|
|
18
|
+
return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
|
|
19
|
+
}
|
|
20
|
+
function truncate(value, length) {
|
|
21
|
+
if (value.length <= length)
|
|
22
|
+
return value;
|
|
23
|
+
if (length <= 1)
|
|
24
|
+
return value.slice(0, length);
|
|
25
|
+
return `${value.slice(0, length - 1)}…`;
|
|
26
|
+
}
|
|
27
|
+
function pad(value, width, align = 'left') {
|
|
28
|
+
return align === 'right' ? value.padStart(width, ' ') : value.padEnd(width, ' ');
|
|
29
|
+
}
|
|
30
|
+
function formatErrors(outcome, report) {
|
|
31
|
+
const count = report?.errors.length ?? 0;
|
|
32
|
+
if (count === 0)
|
|
33
|
+
return outcome.status === 'failed' && outcome.error ? '1' : '--';
|
|
34
|
+
if (outcome.status === 'completed')
|
|
35
|
+
return `${count} (fixed)`;
|
|
36
|
+
return String(count);
|
|
37
|
+
}
|
|
38
|
+
export function formatRunSummaryTable(outcomes, reports) {
|
|
39
|
+
// Only show the Cost column when at least one report has reliable cost data
|
|
40
|
+
// (currently only OpenCode populates cost; Claude and Codex return null)
|
|
41
|
+
const hasCost = Array.from(reports.values()).some((r) => typeof r.cost === 'number' && r.cost > 0);
|
|
42
|
+
const headers = hasCost
|
|
43
|
+
? ['Step', 'Status', 'Model', 'Cost', 'Tokens', 'Duration', 'Errors']
|
|
44
|
+
: ['Step', 'Status', 'Model', 'Tokens', 'Duration', 'Errors'];
|
|
45
|
+
const widths = hasCost
|
|
46
|
+
? [20, 6, 16, 8, 10, 10, 10]
|
|
47
|
+
: [20, 6, 16, 10, 10, 10];
|
|
48
|
+
const lines = [];
|
|
49
|
+
lines.push(headers.map((h, i) => {
|
|
50
|
+
const align = i <= 2 ? 'left' : 'right';
|
|
51
|
+
return pad(h, widths[i], align);
|
|
52
|
+
}).join(' '));
|
|
53
|
+
let totalCost = 0;
|
|
54
|
+
let totalTokens = 0;
|
|
55
|
+
let totalDurationMs = 0;
|
|
56
|
+
for (const outcome of outcomes) {
|
|
57
|
+
const report = reports.get(outcome.name);
|
|
58
|
+
const reportDuration = report?.durationMs ?? outcome.durationMs;
|
|
59
|
+
const reportTokens = report?.tokens
|
|
60
|
+
? report.tokens.input + report.tokens.output + report.tokens.cacheRead
|
|
61
|
+
: 0;
|
|
62
|
+
if (typeof report?.cost === 'number')
|
|
63
|
+
totalCost += report.cost;
|
|
64
|
+
totalTokens += reportTokens;
|
|
65
|
+
if (typeof reportDuration === 'number')
|
|
66
|
+
totalDurationMs += reportDuration;
|
|
67
|
+
const cols = [
|
|
68
|
+
pad(truncate(outcome.name, widths[0]), widths[0]),
|
|
69
|
+
pad(outcome.status === 'failed' ? 'FAIL' : outcome.status === 'completed' ? 'pass' : 'skip', widths[1]),
|
|
70
|
+
pad(truncate(report?.model ?? '--', widths[2]), widths[2]),
|
|
71
|
+
];
|
|
72
|
+
if (hasCost)
|
|
73
|
+
cols.push(pad(formatCurrency(report?.cost), widths[3], 'right'));
|
|
74
|
+
const tokenIdx = hasCost ? 4 : 3;
|
|
75
|
+
cols.push(pad(formatTokens(report), widths[tokenIdx], 'right'));
|
|
76
|
+
cols.push(pad(formatDuration(reportDuration), widths[tokenIdx + 1], 'right'));
|
|
77
|
+
cols.push(pad(formatErrors(outcome, report), widths[tokenIdx + 2], 'right'));
|
|
78
|
+
lines.push(cols.join(' '));
|
|
79
|
+
if (outcome.status === 'failed') {
|
|
80
|
+
const firstError = report?.errors[0];
|
|
81
|
+
if (firstError) {
|
|
82
|
+
lines.push(` └─ Error [turn ${firstError.turn}] ${truncate(firstError.text, 120)}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const totalLabelWidth = widths[0] + widths[1] + widths[2] + 4;
|
|
87
|
+
lines.push('─'.repeat(lines[0].length));
|
|
88
|
+
const totalCols = [pad('Total', totalLabelWidth)];
|
|
89
|
+
if (hasCost)
|
|
90
|
+
totalCols.push(pad(formatCurrency(totalCost), widths[3], 'right'));
|
|
91
|
+
const tokenIdx = hasCost ? 4 : 3;
|
|
92
|
+
totalCols.push(pad(totalTokens > 0 ? totalTokens.toLocaleString('en-US') : '--', widths[tokenIdx], 'right'));
|
|
93
|
+
totalCols.push(pad(formatDuration(totalDurationMs), widths[tokenIdx + 1], 'right'));
|
|
94
|
+
totalCols.push(pad('', widths[tokenIdx + 2], 'right'));
|
|
95
|
+
lines.push(totalCols.join(' '));
|
|
96
|
+
return lines.map((line) => ` ${line}`).join('\n');
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=run-summary-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-summary-table.js","sourceRoot":"","sources":["../../src/workflows/run-summary-table.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* persists state to DB, and supports pause/resume/abort with retries.
|
|
5
5
|
*/
|
|
6
6
|
import type { BrokerEvent } from '../protocol.js';
|
|
7
|
+
import { type CliSessionReport } from './cli-session-collector.js';
|
|
7
8
|
import type { AgentCli, AgentDefinition, DryRunReport, RelayYamlConfig, StepCompletionEvidence, WorkflowRunRow, WorkflowStep, WorkflowExecuteOptions, WorkflowStepRow } from './types.js';
|
|
8
9
|
import { AgentRelay } from '../relay.js';
|
|
9
10
|
import type { AgentRelayOptions } from '../relay.js';
|
|
@@ -61,6 +62,11 @@ export type WorkflowEvent = {
|
|
|
61
62
|
runId: string;
|
|
62
63
|
stepName: string;
|
|
63
64
|
ownerName: string;
|
|
65
|
+
} | {
|
|
66
|
+
type: 'step:agent-report';
|
|
67
|
+
runId: string;
|
|
68
|
+
stepName: string;
|
|
69
|
+
report: CliSessionReport;
|
|
64
70
|
} | {
|
|
65
71
|
type: 'step:failed';
|
|
66
72
|
runId: string;
|
|
@@ -167,6 +173,8 @@ export declare class WorkflowRunner {
|
|
|
167
173
|
private resolvedPaths;
|
|
168
174
|
/** Tracks agent names currently assigned as reviewers (ref-counted to handle concurrent usage). */
|
|
169
175
|
private readonly activeReviewers;
|
|
176
|
+
/** Structured CLI session reports captured during the current run, keyed by step name. */
|
|
177
|
+
private readonly agentReports;
|
|
170
178
|
constructor(options?: WorkflowRunnerOptions);
|
|
171
179
|
/** Expand environment variables like $HOME or $VAR in a path string. */
|
|
172
180
|
private static resolveEnvVars;
|
|
@@ -186,6 +194,7 @@ export declare class WorkflowRunner {
|
|
|
186
194
|
* Returns undefined if no workdir is set.
|
|
187
195
|
*/
|
|
188
196
|
private resolveStepWorkdir;
|
|
197
|
+
private resolveEffectiveCwd;
|
|
189
198
|
private static readonly EVIDENCE_IGNORED_DIRS;
|
|
190
199
|
getStepCompletionEvidence(stepName: string): StepCompletionEvidence | undefined;
|
|
191
200
|
private getOrCreateStepEvidenceRecord;
|
|
@@ -323,7 +332,7 @@ export declare class WorkflowRunner {
|
|
|
323
332
|
private combineStepAndReviewOutput;
|
|
324
333
|
/**
|
|
325
334
|
* Build the CLI command and arguments for a non-interactive agent execution.
|
|
326
|
-
*
|
|
335
|
+
* Delegates to the consolidated CLI registry for per-CLI arg formats.
|
|
327
336
|
*/
|
|
328
337
|
static buildNonInteractiveCommand(cli: AgentCli, task: string, extraArgs?: string[]): {
|
|
329
338
|
cmd: string;
|
|
@@ -375,6 +384,7 @@ export declare class WorkflowRunner {
|
|
|
375
384
|
private runVerification;
|
|
376
385
|
private updateRunStatus;
|
|
377
386
|
private markStepFailed;
|
|
387
|
+
private captureAgentReport;
|
|
378
388
|
private markDownstreamSkipped;
|
|
379
389
|
/**
|
|
380
390
|
* Walk the dependsOn graph backwards from a target step to collect ALL
|
|
@@ -442,6 +452,7 @@ export declare class WorkflowRunner {
|
|
|
442
452
|
private getStepOutputDir;
|
|
443
453
|
/** Persist step output to disk and post full output as a channel message. */
|
|
444
454
|
private persistStepOutput;
|
|
455
|
+
private persistAgentReport;
|
|
445
456
|
/** Scan .agent-relay/step-outputs/ for the most recent run directory containing the needed steps. */
|
|
446
457
|
private findMostRecentRunWithSteps;
|
|
447
458
|
/** Load persisted step output from disk. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/workflows/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/workflows/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/workflows/runner.js
CHANGED
|
@@ -3,16 +3,21 @@
|
|
|
3
3
|
* executes steps (sequential/parallel/DAG), runs verification checks,
|
|
4
4
|
* persists state to DB, and supports pause/resume/abort with retries.
|
|
5
5
|
*/
|
|
6
|
-
import { spawn as cpSpawn
|
|
6
|
+
import { spawn as cpSpawn } from 'node:child_process';
|
|
7
7
|
import { randomBytes } from 'node:crypto';
|
|
8
8
|
import { createWriteStream, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, writeFileSync, } from 'node:fs';
|
|
9
9
|
import { readFile, writeFile } from 'node:fs/promises';
|
|
10
10
|
import path from 'node:path';
|
|
11
|
+
import chalk from 'chalk';
|
|
11
12
|
import { parse as parseYaml } from 'yaml';
|
|
12
13
|
import { stripAnsi as stripAnsiFn } from '../pty.js';
|
|
13
14
|
import { resolveSpawnPolicy } from '../spawn-from-env.js';
|
|
15
|
+
import { getCliDefinition } from '../cli-registry.js';
|
|
16
|
+
import { resolveCliSync } from '../cli-resolver.js';
|
|
14
17
|
import { loadCustomSteps, resolveAllCustomSteps, validateCustomStepsUsage, CustomStepsParseError, CustomStepResolutionError, } from './custom-steps.js';
|
|
18
|
+
import { collectCliSession } from './cli-session-collector.js';
|
|
15
19
|
import { InMemoryWorkflowDb } from './memory-db.js';
|
|
20
|
+
import { formatRunSummaryTable } from './run-summary-table.js';
|
|
16
21
|
import { WorkflowTrajectory } from './trajectory.js';
|
|
17
22
|
// ── AgentRelay SDK imports ──────────────────────────────────────────────────
|
|
18
23
|
// Import from sub-paths to avoid pulling in the full @relaycast/sdk dependency.
|
|
@@ -40,27 +45,12 @@ class WorkflowCompletionError extends Error {
|
|
|
40
45
|
// ── CLI resolution ───────────────────────────────────────────────────────────
|
|
41
46
|
/**
|
|
42
47
|
* Resolve `cursor` to the concrete cursor agent binary available in PATH.
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* Result is memoized after the first call to avoid repeated sync PATH lookups.
|
|
48
|
+
* Delegates to the consolidated cli-resolver which checks PATH + well-known
|
|
49
|
+
* install directories. Falls back to `agent` if nothing found.
|
|
46
50
|
*/
|
|
47
|
-
let _resolvedCursorCli;
|
|
48
51
|
function resolveCursorCli() {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const candidates = ['cursor-agent', 'agent'];
|
|
52
|
-
for (const candidate of candidates) {
|
|
53
|
-
try {
|
|
54
|
-
execFileSync('which', [candidate], { stdio: 'ignore' });
|
|
55
|
-
_resolvedCursorCli = candidate;
|
|
56
|
-
return candidate;
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
// not in PATH, try next
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
_resolvedCursorCli = 'agent'; // last-resort default
|
|
63
|
-
return _resolvedCursorCli;
|
|
52
|
+
const resolved = resolveCliSync('cursor');
|
|
53
|
+
return resolved?.binary ?? 'agent';
|
|
64
54
|
}
|
|
65
55
|
// ── WorkflowRunner ──────────────────────────────────────────────────────────
|
|
66
56
|
export class WorkflowRunner {
|
|
@@ -120,6 +110,8 @@ export class WorkflowRunner {
|
|
|
120
110
|
resolvedPaths = new Map();
|
|
121
111
|
/** Tracks agent names currently assigned as reviewers (ref-counted to handle concurrent usage). */
|
|
122
112
|
activeReviewers = new Map();
|
|
113
|
+
/** Structured CLI session reports captured during the current run, keyed by step name. */
|
|
114
|
+
agentReports = new Map();
|
|
123
115
|
constructor(options = {}) {
|
|
124
116
|
this.db = options.db ?? new InMemoryWorkflowDb();
|
|
125
117
|
this.workspaceId = options.workspaceId ?? 'local';
|
|
@@ -199,6 +191,12 @@ export class WorkflowRunner {
|
|
|
199
191
|
}
|
|
200
192
|
return resolved;
|
|
201
193
|
}
|
|
194
|
+
resolveEffectiveCwd(step, agentDef) {
|
|
195
|
+
if (step.cwd) {
|
|
196
|
+
return path.resolve(this.cwd, step.cwd);
|
|
197
|
+
}
|
|
198
|
+
return this.resolveStepWorkdir(step) ?? (agentDef ? this.resolveAgentCwd(agentDef) : this.cwd);
|
|
199
|
+
}
|
|
202
200
|
static EVIDENCE_IGNORED_DIRS = new Set([
|
|
203
201
|
'.git',
|
|
204
202
|
'.agent-relay',
|
|
@@ -643,7 +641,7 @@ export class WorkflowRunner {
|
|
|
643
641
|
const ts = mins > 0
|
|
644
642
|
? `${String(mins).padStart(2, '0')}:${String(secs).padStart(2, '0')}`
|
|
645
643
|
: `00:${String(secs).padStart(2, '0')}`;
|
|
646
|
-
console.log(
|
|
644
|
+
console.log(`${chalk.dim.cyan('[workflow')} ${chalk.dim.cyan(ts)}${chalk.dim.cyan(']')} ${msg}`);
|
|
647
645
|
}
|
|
648
646
|
// ── Relaycast auto-provisioning ────────────────────────────────────────
|
|
649
647
|
/**
|
|
@@ -1500,6 +1498,7 @@ export class WorkflowRunner {
|
|
|
1500
1498
|
this.runStartTime = Date.now();
|
|
1501
1499
|
this.runtimeStepAgents.clear();
|
|
1502
1500
|
this.stepCompletionEvidence.clear();
|
|
1501
|
+
this.agentReports.clear();
|
|
1503
1502
|
this.log(`Starting workflow "${workflow.name}" (${workflow.steps.length} steps)`);
|
|
1504
1503
|
// Initialize trajectory recording
|
|
1505
1504
|
this.trajectory = new WorkflowTrajectory(config.trajectories, runId, this.cwd);
|
|
@@ -1713,7 +1712,7 @@ export class WorkflowRunner {
|
|
|
1713
1712
|
this.relaycastAgent = undefined;
|
|
1714
1713
|
// Wire broker stderr to console for observability
|
|
1715
1714
|
this.unsubBrokerStderr = this.relay.onBrokerStderr((line) => {
|
|
1716
|
-
console.log(
|
|
1715
|
+
console.log(`${chalk.dim.yellow('[broker]')} ${line}`);
|
|
1717
1716
|
});
|
|
1718
1717
|
if (!relaycastDisabled) {
|
|
1719
1718
|
this.log(`Creating channel: ${channel}...`);
|
|
@@ -2157,7 +2156,7 @@ export class WorkflowRunner {
|
|
|
2157
2156
|
return value !== undefined ? String(value) : _match;
|
|
2158
2157
|
});
|
|
2159
2158
|
// Resolve step workdir (named path reference) for deterministic steps
|
|
2160
|
-
const stepCwd = this.
|
|
2159
|
+
const stepCwd = this.resolveEffectiveCwd(step);
|
|
2161
2160
|
this.beginStepEvidence(step.name, [stepCwd], state.row.startedAt);
|
|
2162
2161
|
try {
|
|
2163
2162
|
// Delegate to executor if present
|
|
@@ -2534,6 +2533,9 @@ export class WorkflowRunner {
|
|
|
2534
2533
|
let lastExitCode;
|
|
2535
2534
|
let lastExitSignal;
|
|
2536
2535
|
let lastCompletionReason;
|
|
2536
|
+
let lastAttemptStartedAt;
|
|
2537
|
+
let lastEffectiveAgentDef;
|
|
2538
|
+
let lastEffectiveCwd;
|
|
2537
2539
|
// OWNER_DECISION: INCOMPLETE_RETRY is enforced here at the attempt-loop level so every
|
|
2538
2540
|
// interactive execution path shares the same contract:
|
|
2539
2541
|
// - retries remaining => throw back into the loop and retry
|
|
@@ -2561,6 +2563,7 @@ export class WorkflowRunner {
|
|
|
2561
2563
|
await this.delay(retryDelay);
|
|
2562
2564
|
}
|
|
2563
2565
|
try {
|
|
2566
|
+
lastAttemptStartedAt = Date.now();
|
|
2564
2567
|
// Mark step as running
|
|
2565
2568
|
state.row.status = 'running';
|
|
2566
2569
|
state.row.error = undefined;
|
|
@@ -2613,7 +2616,10 @@ export class WorkflowRunner {
|
|
|
2613
2616
|
}
|
|
2614
2617
|
}
|
|
2615
2618
|
// Apply step-level workdir override to agent definitions if present
|
|
2616
|
-
const
|
|
2619
|
+
const applyStepCwd = (def) => {
|
|
2620
|
+
if (step.cwd) {
|
|
2621
|
+
return { ...def, cwd: step.cwd, workdir: undefined };
|
|
2622
|
+
}
|
|
2617
2623
|
if (step.workdir) {
|
|
2618
2624
|
const stepWorkdir = this.resolveStepWorkdir(step);
|
|
2619
2625
|
if (stepWorkdir) {
|
|
@@ -2622,9 +2628,11 @@ export class WorkflowRunner {
|
|
|
2622
2628
|
}
|
|
2623
2629
|
return def;
|
|
2624
2630
|
};
|
|
2625
|
-
const effectiveSpecialist =
|
|
2626
|
-
const effectiveOwner =
|
|
2627
|
-
const effectiveReviewer = reviewDef ?
|
|
2631
|
+
const effectiveSpecialist = applyStepCwd(specialistDef);
|
|
2632
|
+
const effectiveOwner = applyStepCwd(ownerDef);
|
|
2633
|
+
const effectiveReviewer = reviewDef ? applyStepCwd(reviewDef) : undefined;
|
|
2634
|
+
lastEffectiveAgentDef = effectiveSpecialist;
|
|
2635
|
+
lastEffectiveCwd = this.resolveAgentCwd(effectiveSpecialist);
|
|
2628
2636
|
this.beginStepEvidence(step.name, [
|
|
2629
2637
|
this.resolveAgentCwd(effectiveSpecialist),
|
|
2630
2638
|
this.resolveAgentCwd(effectiveOwner),
|
|
@@ -2746,6 +2754,7 @@ export class WorkflowRunner {
|
|
|
2746
2754
|
this.activeReviewers.set(reviewDef.name, count);
|
|
2747
2755
|
}
|
|
2748
2756
|
}
|
|
2757
|
+
await this.captureAgentReport(runId, step.name, lastEffectiveAgentDef, lastEffectiveCwd, lastAttemptStartedAt, Date.now());
|
|
2749
2758
|
// Mark completed
|
|
2750
2759
|
state.row.status = 'completed';
|
|
2751
2760
|
state.row.output = combinedOutput;
|
|
@@ -2789,6 +2798,7 @@ export class WorkflowRunner {
|
|
|
2789
2798
|
const verificationValue = typeof step.verification === 'object' && 'value' in step.verification
|
|
2790
2799
|
? String(step.verification.value)
|
|
2791
2800
|
: undefined;
|
|
2801
|
+
await this.captureAgentReport(runId, step.name, lastEffectiveAgentDef, lastEffectiveCwd, lastAttemptStartedAt, Date.now());
|
|
2792
2802
|
await this.trajectory?.stepFailed(step, lastError ?? 'Unknown error', maxRetries + 1, maxRetries, {
|
|
2793
2803
|
agent: agentName,
|
|
2794
2804
|
nonInteractive,
|
|
@@ -3636,34 +3646,18 @@ export class WorkflowRunner {
|
|
|
3636
3646
|
}
|
|
3637
3647
|
/**
|
|
3638
3648
|
* Build the CLI command and arguments for a non-interactive agent execution.
|
|
3639
|
-
*
|
|
3649
|
+
* Delegates to the consolidated CLI registry for per-CLI arg formats.
|
|
3640
3650
|
*/
|
|
3641
3651
|
static buildNonInteractiveCommand(cli, task, extraArgs = []) {
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
|
|
3645
|
-
|
|
3646
|
-
return { cmd: 'claude', args: ['-p', '--dangerously-skip-permissions', task, ...extraArgs] };
|
|
3647
|
-
case 'codex':
|
|
3648
|
-
return { cmd: 'codex', args: ['exec', task, ...extraArgs] };
|
|
3649
|
-
case 'gemini':
|
|
3650
|
-
return { cmd: 'gemini', args: ['-p', task, ...extraArgs] };
|
|
3651
|
-
case 'opencode':
|
|
3652
|
-
return { cmd: 'opencode', args: ['--prompt', task, ...extraArgs] };
|
|
3653
|
-
case 'droid':
|
|
3654
|
-
return { cmd: 'droid', args: ['exec', task, ...extraArgs] };
|
|
3655
|
-
case 'aider':
|
|
3656
|
-
return { cmd: 'aider', args: ['--message', task, '--yes-always', '--no-git', ...extraArgs] };
|
|
3657
|
-
case 'goose':
|
|
3658
|
-
return { cmd: 'goose', args: ['run', '--text', task, '--no-session', ...extraArgs] };
|
|
3659
|
-
case 'cursor-agent':
|
|
3660
|
-
case 'agent':
|
|
3661
|
-
return { cmd: cli, args: ['--force', '-p', task, ...extraArgs] };
|
|
3662
|
-
case 'cursor':
|
|
3663
|
-
// Should not reach here after resolveAgentDef resolves to agent/cursor-agent,
|
|
3664
|
-
// but handle as fallback.
|
|
3665
|
-
return { cmd: resolveCursorCli(), args: ['--force', '-p', task, ...extraArgs] };
|
|
3652
|
+
const resolvedCli = cli === 'cursor' ? resolveCursorCli() : cli;
|
|
3653
|
+
const def = getCliDefinition(resolvedCli);
|
|
3654
|
+
if (!def) {
|
|
3655
|
+
throw new Error(`Unknown CLI: ${resolvedCli}`);
|
|
3666
3656
|
}
|
|
3657
|
+
return {
|
|
3658
|
+
cmd: def.binaries[0],
|
|
3659
|
+
args: def.nonInteractiveArgs(task, extraArgs),
|
|
3660
|
+
};
|
|
3667
3661
|
}
|
|
3668
3662
|
/**
|
|
3669
3663
|
* Apply preset defaults to an agent definition.
|
|
@@ -3761,7 +3755,7 @@ export class WorkflowRunner {
|
|
|
3761
3755
|
const { stdout: output, exitCode, exitSignal } = await new Promise((resolve, reject) => {
|
|
3762
3756
|
const child = cpSpawn(cmd, args, {
|
|
3763
3757
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
3764
|
-
cwd: this.
|
|
3758
|
+
cwd: this.resolveEffectiveCwd(step, agentDef),
|
|
3765
3759
|
env: this.getRelayEnv() ?? { ...process.env },
|
|
3766
3760
|
});
|
|
3767
3761
|
// Update workers.json with PID now that we have it
|
|
@@ -4459,6 +4453,26 @@ export class WorkflowRunner {
|
|
|
4459
4453
|
});
|
|
4460
4454
|
this.finalizeStepEvidence(state.row.stepName, 'failed', state.row.completedAt, completionReason);
|
|
4461
4455
|
}
|
|
4456
|
+
async captureAgentReport(runId, stepName, agentDef, cwd, startedAt, completedAt) {
|
|
4457
|
+
if (!agentDef || !cwd || !startedAt)
|
|
4458
|
+
return;
|
|
4459
|
+
try {
|
|
4460
|
+
const report = await collectCliSession({
|
|
4461
|
+
cli: agentDef.cli,
|
|
4462
|
+
cwd,
|
|
4463
|
+
startedAt,
|
|
4464
|
+
completedAt,
|
|
4465
|
+
});
|
|
4466
|
+
if (!report)
|
|
4467
|
+
return;
|
|
4468
|
+
this.agentReports.set(stepName, report);
|
|
4469
|
+
this.emit({ type: 'step:agent-report', runId, stepName, report });
|
|
4470
|
+
await this.persistAgentReport(runId, stepName, report);
|
|
4471
|
+
}
|
|
4472
|
+
catch (error) {
|
|
4473
|
+
this.log(`[${stepName}] CLI session collection failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
4474
|
+
}
|
|
4475
|
+
}
|
|
4462
4476
|
async markDownstreamSkipped(failedStepName, allSteps, stepStates, runId) {
|
|
4463
4477
|
const queue = [failedStepName];
|
|
4464
4478
|
const visited = new Set();
|
|
@@ -4686,23 +4700,28 @@ export class WorkflowRunner {
|
|
|
4686
4700
|
const failed = outcomes.filter((o) => o.status === 'failed');
|
|
4687
4701
|
const skipped = outcomes.filter((o) => o.status === 'skipped');
|
|
4688
4702
|
console.log('');
|
|
4689
|
-
console.log('━'.repeat(70));
|
|
4690
|
-
console.log(` Workflow "${workflowName}" — ${failed.length === 0 ? 'COMPLETED' : 'FAILED'}`);
|
|
4691
|
-
console.log(` ${completed.length} passed, ${failed.length} failed, ${skipped.length} skipped`);
|
|
4692
|
-
console.log('━'.repeat(70));
|
|
4693
|
-
|
|
4694
|
-
|
|
4695
|
-
|
|
4696
|
-
|
|
4697
|
-
|
|
4698
|
-
|
|
4699
|
-
|
|
4700
|
-
|
|
4701
|
-
|
|
4702
|
-
|
|
4703
|
-
|
|
4704
|
-
|
|
4705
|
-
|
|
4703
|
+
console.log(chalk.dim('━'.repeat(70)));
|
|
4704
|
+
console.log(` Workflow "${workflowName}" — ${failed.length === 0 ? chalk.green('COMPLETED') : chalk.red('FAILED')}`);
|
|
4705
|
+
console.log(` ${chalk.green(`${completed.length} passed`)}, ${chalk.red(`${failed.length} failed`)}, ${chalk.dim(`${skipped.length} skipped`)}`);
|
|
4706
|
+
console.log(chalk.dim('━'.repeat(70)));
|
|
4707
|
+
if (this.agentReports.size > 0) {
|
|
4708
|
+
console.log(formatRunSummaryTable(outcomes, this.agentReports));
|
|
4709
|
+
}
|
|
4710
|
+
else {
|
|
4711
|
+
for (const outcome of outcomes) {
|
|
4712
|
+
const icon = outcome.status === 'completed' ? chalk.green('✓') : outcome.status === 'failed' ? chalk.red('✗') : chalk.dim('⊘');
|
|
4713
|
+
const retryNote = outcome.attempts > 1 ? ` (${outcome.attempts} attempts)` : '';
|
|
4714
|
+
console.log(` ${icon} ${outcome.name} [${outcome.agent}]${retryNote}`);
|
|
4715
|
+
if (outcome.error) {
|
|
4716
|
+
console.log(` Error: ${outcome.error}`);
|
|
4717
|
+
}
|
|
4718
|
+
// Extract last meaningful lines from raw PTY output
|
|
4719
|
+
if (outcome.output) {
|
|
4720
|
+
const excerpt = this.extractOutputExcerpt(outcome.output);
|
|
4721
|
+
if (excerpt) {
|
|
4722
|
+
for (const line of excerpt.split('\n')) {
|
|
4723
|
+
console.log(` ${line}`);
|
|
4724
|
+
}
|
|
4706
4725
|
}
|
|
4707
4726
|
}
|
|
4708
4727
|
}
|
|
@@ -4711,9 +4730,10 @@ export class WorkflowRunner {
|
|
|
4711
4730
|
const outputDir = this.getStepOutputDir(runId);
|
|
4712
4731
|
const logsDir = path.join(this.cwd, '.agent-relay', 'team', 'worker-logs');
|
|
4713
4732
|
console.log('');
|
|
4733
|
+
console.log(` Run ID: ${runId}`);
|
|
4714
4734
|
console.log(` Step output: ${outputDir}`);
|
|
4715
4735
|
console.log(` Agent logs: ${logsDir}`);
|
|
4716
|
-
console.log('━'.repeat(70));
|
|
4736
|
+
console.log(chalk.dim('━'.repeat(70)));
|
|
4717
4737
|
console.log('');
|
|
4718
4738
|
}
|
|
4719
4739
|
/**
|
|
@@ -4776,6 +4796,11 @@ export class WorkflowRunner {
|
|
|
4776
4796
|
const stepsWithVerification = new Set(steps?.filter((s) => s.verification).map((s) => s.name) ?? []);
|
|
4777
4797
|
const outcomes = [];
|
|
4778
4798
|
for (const [name, state] of stepStates) {
|
|
4799
|
+
const startedAtMs = state.row.startedAt ? Date.parse(state.row.startedAt) : Number.NaN;
|
|
4800
|
+
const completedAtMs = state.row.completedAt ? Date.parse(state.row.completedAt) : Number.NaN;
|
|
4801
|
+
const durationMs = Number.isFinite(startedAtMs) && Number.isFinite(completedAtMs)
|
|
4802
|
+
? Math.max(0, completedAtMs - startedAtMs)
|
|
4803
|
+
: undefined;
|
|
4779
4804
|
outcomes.push({
|
|
4780
4805
|
name,
|
|
4781
4806
|
agent: state.row.agentName ?? 'deterministic',
|
|
@@ -4788,6 +4813,7 @@ export class WorkflowRunner {
|
|
|
4788
4813
|
output: state.row.output,
|
|
4789
4814
|
error: state.row.error,
|
|
4790
4815
|
verificationPassed: state.row.status === 'completed' && stepsWithVerification.has(name),
|
|
4816
|
+
durationMs,
|
|
4791
4817
|
completionMode: state.row.completionReason
|
|
4792
4818
|
? this.buildStepCompletionDecision(name, state.row.completionReason)?.mode
|
|
4793
4819
|
: undefined,
|
|
@@ -4960,6 +4986,16 @@ export class WorkflowRunner {
|
|
|
4960
4986
|
const preview = scrubbed.length > maxMsg ? scrubbed.slice(-maxMsg) : scrubbed;
|
|
4961
4987
|
this.postToChannel(`**[${stepName}] Output:**\n\`\`\`\n${preview}\n\`\`\``, { stepName });
|
|
4962
4988
|
}
|
|
4989
|
+
async persistAgentReport(runId, stepName, report) {
|
|
4990
|
+
const reportPath = path.join(this.getStepOutputDir(runId), `${stepName}.report.json`);
|
|
4991
|
+
try {
|
|
4992
|
+
mkdirSync(this.getStepOutputDir(runId), { recursive: true });
|
|
4993
|
+
await writeFile(reportPath, JSON.stringify(report, null, 2), 'utf8');
|
|
4994
|
+
}
|
|
4995
|
+
catch {
|
|
4996
|
+
// Non-critical
|
|
4997
|
+
}
|
|
4998
|
+
}
|
|
4963
4999
|
/** Scan .agent-relay/step-outputs/ for the most recent run directory containing the needed steps. */
|
|
4964
5000
|
findMostRecentRunWithSteps(stepNames) {
|
|
4965
5001
|
try {
|