agent-relay 3.1.6 → 3.1.7
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/index.cjs +130 -107
- package/package.json +8 -8
- package/packages/acp-bridge/package.json +2 -2
- package/packages/config/package.json +1 -1
- package/packages/hooks/package.json +4 -4
- package/packages/memory/package.json +2 -2
- package/packages/openclaw/dist/gateway.d.ts +2 -0
- package/packages/openclaw/dist/gateway.d.ts.map +1 -1
- package/packages/openclaw/dist/gateway.js +27 -7
- package/packages/openclaw/dist/gateway.js.map +1 -1
- package/packages/openclaw/package.json +2 -2
- package/packages/openclaw/skill/SKILL.md +101 -31
- package/packages/openclaw/src/gateway.ts +29 -9
- package/packages/policy/package.json +2 -2
- package/packages/sdk/dist/client.js +6 -8
- package/packages/sdk/dist/client.js.map +1 -1
- package/packages/sdk/dist/workflows/builder.d.ts +3 -1
- package/packages/sdk/dist/workflows/builder.d.ts.map +1 -1
- package/packages/sdk/dist/workflows/builder.js +1 -0
- package/packages/sdk/dist/workflows/builder.js.map +1 -1
- package/packages/sdk/dist/workflows/runner.d.ts +15 -1
- package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
- package/packages/sdk/dist/workflows/runner.js +146 -117
- package/packages/sdk/dist/workflows/runner.js.map +1 -1
- package/packages/sdk/package.json +2 -2
- package/packages/sdk/scripts/bundle-agent-relay.mjs +11 -1
- package/packages/sdk/src/client.ts +6 -8
- package/packages/sdk/src/workflows/builder.ts +4 -1
- package/packages/sdk/src/workflows/runner.ts +173 -119
- package/packages/sdk-py/pyproject.toml +1 -1
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/workflows/builder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EACV,QAAQ,EAER,YAAY,EAEZ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,iBAAiB,EAEjB,cAAc,EAEf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAkB,KAAK,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/workflows/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -168,6 +168,7 @@ export class WorkflowBuilder {
|
|
|
168
168
|
const runner = new WorkflowRunner({
|
|
169
169
|
cwd: options.cwd,
|
|
170
170
|
relay: options.relay,
|
|
171
|
+
executor: options.executor,
|
|
171
172
|
});
|
|
172
173
|
// Auto-detect DRY_RUN env var so existing scripts get dry-run for free
|
|
173
174
|
const isDryRun = options.dryRun ?? !!process.env.DRY_RUN;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/workflows/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAgBlD,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/workflows/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
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 type { AgentCli, DryRunReport, RelayYamlConfig, WorkflowRunRow, WorkflowStepRow } from './types.js';
|
|
6
|
+
import type { AgentCli, AgentDefinition, DryRunReport, RelayYamlConfig, WorkflowRunRow, WorkflowStep, WorkflowStepRow } from './types.js';
|
|
7
7
|
import { AgentRelay } from '../relay.js';
|
|
8
8
|
import type { AgentRelayOptions } from '../relay.js';
|
|
9
9
|
/** Minimal DB adapter so the runner is not coupled to a specific driver. */
|
|
@@ -68,6 +68,19 @@ export interface WorkflowRunnerOptions {
|
|
|
68
68
|
relay?: AgentRelayOptions;
|
|
69
69
|
cwd?: string;
|
|
70
70
|
summaryDir?: string;
|
|
71
|
+
executor?: StepExecutor;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Extension point for delegating step execution to an external backend
|
|
75
|
+
* (e.g. Daytona sandboxes) while keeping the runner's DAG/retry/verification
|
|
76
|
+
* machinery intact.
|
|
77
|
+
*/
|
|
78
|
+
export interface StepExecutor {
|
|
79
|
+
executeAgentStep(step: WorkflowStep, agentDef: AgentDefinition, resolvedTask: string, timeoutMs?: number): Promise<string>;
|
|
80
|
+
executeDeterministicStep?(step: WorkflowStep, resolvedCommand: string, cwd: string): Promise<{
|
|
81
|
+
output: string;
|
|
82
|
+
exitCode: number;
|
|
83
|
+
}>;
|
|
71
84
|
}
|
|
72
85
|
export interface VariableContext {
|
|
73
86
|
[key: string]: string | number | boolean | undefined;
|
|
@@ -78,6 +91,7 @@ export declare class WorkflowRunner {
|
|
|
78
91
|
private readonly relayOptions;
|
|
79
92
|
private readonly cwd;
|
|
80
93
|
private readonly summaryDir;
|
|
94
|
+
private readonly executor?;
|
|
81
95
|
/** @internal exposed for CLI signal-handler shutdown only */
|
|
82
96
|
relay?: AgentRelay;
|
|
83
97
|
private relaycast?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/workflows/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,OAAO,KAAK,EACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/workflows/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,7 @@ export class WorkflowRunner {
|
|
|
49
49
|
relayOptions;
|
|
50
50
|
cwd;
|
|
51
51
|
summaryDir;
|
|
52
|
+
executor;
|
|
52
53
|
/** @internal exposed for CLI signal-handler shutdown only */
|
|
53
54
|
relay;
|
|
54
55
|
relaycast;
|
|
@@ -92,6 +93,7 @@ export class WorkflowRunner {
|
|
|
92
93
|
this.cwd = options.cwd ?? process.cwd();
|
|
93
94
|
this.summaryDir = options.summaryDir ?? path.join(this.cwd, '.relay', 'summaries');
|
|
94
95
|
this.workersPath = path.join(this.cwd, '.agent-relay', 'team', 'workers.json');
|
|
96
|
+
this.executor = options.executor;
|
|
95
97
|
}
|
|
96
98
|
// ── Progress logging ────────────────────────────────────────────────────
|
|
97
99
|
/** Log a progress message with elapsed time since run start. */
|
|
@@ -900,130 +902,133 @@ export class WorkflowRunner {
|
|
|
900
902
|
config.swarm.channel = channel;
|
|
901
903
|
await this.db.updateRun(runId, { config });
|
|
902
904
|
}
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
this.log(
|
|
908
|
-
this.
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
listener(
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
const
|
|
942
|
-
|
|
905
|
+
// Skip broker/relay init when an external executor handles agent spawning
|
|
906
|
+
if (!this.executor) {
|
|
907
|
+
this.log('Resolving Relaycast API key...');
|
|
908
|
+
await this.ensureRelaycastApiKey(channel);
|
|
909
|
+
this.log('API key resolved');
|
|
910
|
+
if (this.relayApiKeyAutoCreated && this.relayApiKey) {
|
|
911
|
+
this.log(`Workspace created — follow this run in Relaycast:`);
|
|
912
|
+
this.log(` Observer: https://observer.relaycast.dev/?key=${this.relayApiKey}`);
|
|
913
|
+
this.log(` Channel: ${channel}`);
|
|
914
|
+
}
|
|
915
|
+
this.log('Starting broker...');
|
|
916
|
+
// Include a short run ID suffix in the broker name so each workflow execution
|
|
917
|
+
// registers a unique identity in Relaycast. Without this, re-running in the same
|
|
918
|
+
// workspace hits a 409 conflict because the previous run's agent is still registered.
|
|
919
|
+
const brokerBaseName = path.basename(this.cwd) || 'workflow';
|
|
920
|
+
const brokerName = `${brokerBaseName}-${runId.slice(0, 8)}`;
|
|
921
|
+
this.relay = new AgentRelay({
|
|
922
|
+
...this.relayOptions,
|
|
923
|
+
brokerName,
|
|
924
|
+
channels: [channel],
|
|
925
|
+
env: this.getRelayEnv(),
|
|
926
|
+
// Workflows spawn agents across multiple waves; each spawn requires a PTY +
|
|
927
|
+
// Relaycast registration. 60s is too tight when the broker is saturated with
|
|
928
|
+
// long-running PTY processes from earlier steps. 120s gives room to breathe.
|
|
929
|
+
requestTimeoutMs: this.relayOptions.requestTimeoutMs ?? 120_000,
|
|
930
|
+
});
|
|
931
|
+
// Wire PTY output dispatcher — routes chunks to per-agent listeners + activity logging
|
|
932
|
+
this.relay.onWorkerOutput = ({ name, chunk }) => {
|
|
933
|
+
const listener = this.ptyListeners.get(name);
|
|
934
|
+
if (listener)
|
|
935
|
+
listener(chunk);
|
|
936
|
+
// Parse PTY output for high-signal activity
|
|
937
|
+
const stripped = WorkflowRunner.stripAnsi(chunk);
|
|
938
|
+
const shortName = name.replace(/-[a-f0-9]{6,}$/, '');
|
|
939
|
+
let activity;
|
|
940
|
+
if (/Read\(/.test(stripped)) {
|
|
941
|
+
// Extract filename — path may be truncated at chunk boundary so require
|
|
942
|
+
// at least a dir separator or 8+ chars to trust the basename.
|
|
943
|
+
const m = stripped.match(/Read\(\s*~?([^\s)"']{8,})/);
|
|
944
|
+
if (m) {
|
|
945
|
+
const base = path.basename(m[1]);
|
|
946
|
+
activity = base.length >= 3 ? `Reading ${base}` : 'Reading file...';
|
|
947
|
+
}
|
|
948
|
+
else {
|
|
949
|
+
activity = 'Reading file...';
|
|
950
|
+
}
|
|
943
951
|
}
|
|
944
|
-
else {
|
|
945
|
-
|
|
952
|
+
else if (/Edit\(/.test(stripped)) {
|
|
953
|
+
const m = stripped.match(/Edit\(\s*~?([^\s)"']{8,})/);
|
|
954
|
+
if (m) {
|
|
955
|
+
const base = path.basename(m[1]);
|
|
956
|
+
activity = base.length >= 3 ? `Editing ${base}` : 'Editing file...';
|
|
957
|
+
}
|
|
958
|
+
else {
|
|
959
|
+
activity = 'Editing file...';
|
|
960
|
+
}
|
|
946
961
|
}
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
const base = path.basename(m[1]);
|
|
952
|
-
activity = base.length >= 3 ? `Editing ${base}` : 'Editing file...';
|
|
962
|
+
else if (/Bash\(/.test(stripped)) {
|
|
963
|
+
// Extract a short preview of the command
|
|
964
|
+
const m = stripped.match(/Bash\(\s*(.{1,40})/);
|
|
965
|
+
activity = m ? `Running: ${m[1].trim()}...` : 'Running command...';
|
|
953
966
|
}
|
|
954
|
-
else {
|
|
955
|
-
|
|
967
|
+
else if (/Explore\(/.test(stripped)) {
|
|
968
|
+
const m = stripped.match(/Explore\(\s*(.{1,50})/);
|
|
969
|
+
activity = m ? `Exploring: ${m[1].replace(/\).*/, '').trim()}` : 'Exploring codebase...';
|
|
956
970
|
}
|
|
971
|
+
else if (/Task\(/.test(stripped)) {
|
|
972
|
+
activity = 'Running sub-agent...';
|
|
973
|
+
}
|
|
974
|
+
else if (/Sublimating|Thinking|Coalescing|Cultivating/.test(stripped)) {
|
|
975
|
+
const m = stripped.match(/(\d+)s/);
|
|
976
|
+
activity = m ? `Thinking... (${m[1]}s)` : 'Thinking...';
|
|
977
|
+
}
|
|
978
|
+
if (activity && this.lastActivity.get(name) !== activity) {
|
|
979
|
+
this.lastActivity.set(name, activity);
|
|
980
|
+
this.log(`[${shortName}] ${activity}`);
|
|
981
|
+
}
|
|
982
|
+
};
|
|
983
|
+
// Wire relay event hooks for rich console logging
|
|
984
|
+
this.relay.onMessageReceived = (msg) => {
|
|
985
|
+
const body = msg.text.length > 120 ? msg.text.slice(0, 117) + '...' : msg.text;
|
|
986
|
+
const fromShort = msg.from.replace(/-[a-f0-9]{6,}$/, '');
|
|
987
|
+
const toShort = msg.to.replace(/-[a-f0-9]{6,}$/, '');
|
|
988
|
+
this.log(`[msg] ${fromShort} → ${toShort}: ${body}`);
|
|
989
|
+
};
|
|
990
|
+
this.relay.onAgentSpawned = (agent) => {
|
|
991
|
+
// Skip agents already managed by step execution
|
|
992
|
+
if (!this.activeAgentHandles.has(agent.name)) {
|
|
993
|
+
this.log(`[spawned] ${agent.name} (${agent.runtime})`);
|
|
994
|
+
}
|
|
995
|
+
};
|
|
996
|
+
this.relay.onAgentExited = (agent) => {
|
|
997
|
+
this.lastActivity.delete(agent.name);
|
|
998
|
+
this.lastIdleLog.delete(agent.name);
|
|
999
|
+
if (!this.activeAgentHandles.has(agent.name)) {
|
|
1000
|
+
this.log(`[exited] ${agent.name} (code: ${agent.exitCode ?? '?'})`);
|
|
1001
|
+
}
|
|
1002
|
+
};
|
|
1003
|
+
this.relay.onAgentIdle = ({ name, idleSecs }) => {
|
|
1004
|
+
// Only log at 30s multiples to avoid watchdog spam
|
|
1005
|
+
const bucket = Math.floor(idleSecs / 30) * 30;
|
|
1006
|
+
if (bucket >= 30 && this.lastIdleLog.get(name) !== bucket) {
|
|
1007
|
+
this.lastIdleLog.set(name, bucket);
|
|
1008
|
+
const shortName = name.replace(/-[a-f0-9]{6,}$/, '');
|
|
1009
|
+
this.log(`[idle] ${shortName} silent for ${bucket}s`);
|
|
1010
|
+
}
|
|
1011
|
+
};
|
|
1012
|
+
this.relaycast = undefined;
|
|
1013
|
+
this.relaycastAgent = undefined;
|
|
1014
|
+
// Wire broker stderr to console for observability
|
|
1015
|
+
this.unsubBrokerStderr = this.relay.onBrokerStderr((line) => {
|
|
1016
|
+
console.log(`[broker] ${line}`);
|
|
1017
|
+
});
|
|
1018
|
+
this.log(`Creating channel: ${channel}...`);
|
|
1019
|
+
if (isResume) {
|
|
1020
|
+
await this.createAndJoinRelaycastChannel(channel);
|
|
957
1021
|
}
|
|
958
|
-
else
|
|
959
|
-
|
|
960
|
-
const m = stripped.match(/Bash\(\s*(.{1,40})/);
|
|
961
|
-
activity = m ? `Running: ${m[1].trim()}...` : 'Running command...';
|
|
962
|
-
}
|
|
963
|
-
else if (/Explore\(/.test(stripped)) {
|
|
964
|
-
const m = stripped.match(/Explore\(\s*(.{1,50})/);
|
|
965
|
-
activity = m ? `Exploring: ${m[1].replace(/\).*/, '').trim()}` : 'Exploring codebase...';
|
|
966
|
-
}
|
|
967
|
-
else if (/Task\(/.test(stripped)) {
|
|
968
|
-
activity = 'Running sub-agent...';
|
|
969
|
-
}
|
|
970
|
-
else if (/Sublimating|Thinking|Coalescing|Cultivating/.test(stripped)) {
|
|
971
|
-
const m = stripped.match(/(\d+)s/);
|
|
972
|
-
activity = m ? `Thinking... (${m[1]}s)` : 'Thinking...';
|
|
973
|
-
}
|
|
974
|
-
if (activity && this.lastActivity.get(name) !== activity) {
|
|
975
|
-
this.lastActivity.set(name, activity);
|
|
976
|
-
this.log(`[${shortName}] ${activity}`);
|
|
977
|
-
}
|
|
978
|
-
};
|
|
979
|
-
// Wire relay event hooks for rich console logging
|
|
980
|
-
this.relay.onMessageReceived = (msg) => {
|
|
981
|
-
const body = msg.text.length > 120 ? msg.text.slice(0, 117) + '...' : msg.text;
|
|
982
|
-
const fromShort = msg.from.replace(/-[a-f0-9]{6,}$/, '');
|
|
983
|
-
const toShort = msg.to.replace(/-[a-f0-9]{6,}$/, '');
|
|
984
|
-
this.log(`[msg] ${fromShort} → ${toShort}: ${body}`);
|
|
985
|
-
};
|
|
986
|
-
this.relay.onAgentSpawned = (agent) => {
|
|
987
|
-
// Skip agents already managed by step execution
|
|
988
|
-
if (!this.activeAgentHandles.has(agent.name)) {
|
|
989
|
-
this.log(`[spawned] ${agent.name} (${agent.runtime})`);
|
|
1022
|
+
else {
|
|
1023
|
+
await this.createAndJoinRelaycastChannel(channel, workflow.description);
|
|
990
1024
|
}
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
this.lastIdleLog.delete(agent.name);
|
|
995
|
-
if (!this.activeAgentHandles.has(agent.name)) {
|
|
996
|
-
this.log(`[exited] ${agent.name} (code: ${agent.exitCode ?? '?'})`);
|
|
1025
|
+
this.log('Channel ready');
|
|
1026
|
+
if (isResume) {
|
|
1027
|
+
this.postToChannel(`Workflow **${workflow.name}** resumed — ${pendingCount} pending steps`);
|
|
997
1028
|
}
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
// Only log at 30s multiples to avoid watchdog spam
|
|
1001
|
-
const bucket = Math.floor(idleSecs / 30) * 30;
|
|
1002
|
-
if (bucket >= 30 && this.lastIdleLog.get(name) !== bucket) {
|
|
1003
|
-
this.lastIdleLog.set(name, bucket);
|
|
1004
|
-
const shortName = name.replace(/-[a-f0-9]{6,}$/, '');
|
|
1005
|
-
this.log(`[idle] ${shortName} silent for ${bucket}s`);
|
|
1029
|
+
else {
|
|
1030
|
+
this.postToChannel(`Workflow **${workflow.name}** started — ${workflow.steps.length} steps, pattern: ${config.swarm.pattern}`);
|
|
1006
1031
|
}
|
|
1007
|
-
};
|
|
1008
|
-
this.relaycast = undefined;
|
|
1009
|
-
this.relaycastAgent = undefined;
|
|
1010
|
-
// Wire broker stderr to console for observability
|
|
1011
|
-
this.unsubBrokerStderr = this.relay.onBrokerStderr((line) => {
|
|
1012
|
-
console.log(`[broker] ${line}`);
|
|
1013
|
-
});
|
|
1014
|
-
this.log(`Creating channel: ${channel}...`);
|
|
1015
|
-
if (isResume) {
|
|
1016
|
-
await this.createAndJoinRelaycastChannel(channel);
|
|
1017
|
-
}
|
|
1018
|
-
else {
|
|
1019
|
-
await this.createAndJoinRelaycastChannel(channel, workflow.description);
|
|
1020
|
-
}
|
|
1021
|
-
this.log('Channel ready');
|
|
1022
|
-
if (isResume) {
|
|
1023
|
-
this.postToChannel(`Workflow **${workflow.name}** resumed — ${pendingCount} pending steps`);
|
|
1024
|
-
}
|
|
1025
|
-
else {
|
|
1026
|
-
this.postToChannel(`Workflow **${workflow.name}** started — ${workflow.steps.length} steps, pattern: ${config.swarm.pattern}`);
|
|
1027
1032
|
}
|
|
1028
1033
|
const agentMap = new Map();
|
|
1029
1034
|
for (const agent of config.agents) {
|
|
@@ -1380,6 +1385,28 @@ export class WorkflowRunner {
|
|
|
1380
1385
|
return value !== undefined ? String(value) : _match;
|
|
1381
1386
|
});
|
|
1382
1387
|
try {
|
|
1388
|
+
// Delegate to executor if present
|
|
1389
|
+
if (this.executor?.executeDeterministicStep) {
|
|
1390
|
+
const result = await this.executor.executeDeterministicStep(step, resolvedCommand, this.cwd);
|
|
1391
|
+
const failOnError = step.failOnError !== false;
|
|
1392
|
+
if (failOnError && result.exitCode !== 0) {
|
|
1393
|
+
throw new Error(`Command failed with exit code ${result.exitCode}: ${result.output.slice(0, 500)}`);
|
|
1394
|
+
}
|
|
1395
|
+
const output = step.captureOutput !== false ? result.output : `Command completed (exit code ${result.exitCode})`;
|
|
1396
|
+
// Mark completed
|
|
1397
|
+
state.row.status = 'completed';
|
|
1398
|
+
state.row.output = output;
|
|
1399
|
+
state.row.completedAt = new Date().toISOString();
|
|
1400
|
+
await this.db.updateStep(state.row.id, {
|
|
1401
|
+
status: 'completed',
|
|
1402
|
+
output,
|
|
1403
|
+
completedAt: state.row.completedAt,
|
|
1404
|
+
updatedAt: new Date().toISOString(),
|
|
1405
|
+
});
|
|
1406
|
+
await this.persistStepOutput(runId, step.name, output);
|
|
1407
|
+
this.emit({ type: 'step:completed', runId, stepName: step.name, output });
|
|
1408
|
+
return;
|
|
1409
|
+
}
|
|
1383
1410
|
const output = await new Promise((resolve, reject) => {
|
|
1384
1411
|
const child = cpSpawn('sh', ['-c', resolvedCommand], {
|
|
1385
1412
|
stdio: 'pipe',
|
|
@@ -1684,7 +1711,9 @@ export class WorkflowRunner {
|
|
|
1684
1711
|
// Spawn agent via AgentRelay
|
|
1685
1712
|
this.log(`[${step.name}] Spawning agent "${agentDef.name}" (cli: ${agentDef.cli})`);
|
|
1686
1713
|
const resolvedStep = { ...step, task: resolvedTask };
|
|
1687
|
-
const output =
|
|
1714
|
+
const output = this.executor
|
|
1715
|
+
? await this.executor.executeAgentStep(resolvedStep, agentDef, resolvedTask, timeoutMs)
|
|
1716
|
+
: await this.spawnAndWait(agentDef, resolvedStep, timeoutMs);
|
|
1688
1717
|
this.log(`[${step.name}] Agent "${agentDef.name}" exited`);
|
|
1689
1718
|
// Run verification if configured
|
|
1690
1719
|
if (step.verification) {
|