@agent-relay/sdk 2.3.14 → 2.3.16
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/README.md +68 -838
- 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/__tests__/contract-fixtures.test.d.ts +2 -0
- package/dist/__tests__/contract-fixtures.test.d.ts.map +1 -0
- package/dist/__tests__/contract-fixtures.test.js +85 -0
- package/dist/__tests__/contract-fixtures.test.js.map +1 -0
- package/dist/__tests__/facade.test.d.ts +2 -0
- package/dist/__tests__/facade.test.d.ts.map +1 -0
- package/dist/__tests__/facade.test.js +305 -0
- package/dist/__tests__/facade.test.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +2 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +169 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/pty.test.d.ts +2 -0
- package/dist/__tests__/pty.test.d.ts.map +1 -0
- package/dist/__tests__/pty.test.js +20 -0
- package/dist/__tests__/pty.test.js.map +1 -0
- package/dist/__tests__/quickstart.test.d.ts +2 -0
- package/dist/__tests__/quickstart.test.d.ts.map +1 -0
- package/dist/__tests__/quickstart.test.js +176 -0
- package/dist/__tests__/quickstart.test.js.map +1 -0
- package/dist/__tests__/spawn-from-env.test.d.ts +2 -0
- package/dist/__tests__/spawn-from-env.test.d.ts.map +1 -0
- package/dist/__tests__/spawn-from-env.test.js +206 -0
- package/dist/__tests__/spawn-from-env.test.js.map +1 -0
- package/dist/__tests__/unit.test.d.ts +2 -0
- package/dist/__tests__/unit.test.d.ts.map +1 -0
- package/dist/__tests__/unit.test.js +347 -0
- package/dist/__tests__/unit.test.js.map +1 -0
- package/dist/browser.d.ts +16 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +19 -0
- package/dist/browser.js.map +1 -0
- package/dist/client.d.ts +140 -526
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +430 -1509
- package/dist/client.js.map +1 -1
- package/dist/consensus-helpers.d.ts +103 -0
- package/dist/consensus-helpers.d.ts.map +1 -0
- package/dist/consensus-helpers.js +147 -0
- package/dist/consensus-helpers.js.map +1 -0
- package/dist/consensus.d.ts +72 -0
- package/dist/consensus.d.ts.map +1 -0
- package/dist/consensus.js +378 -0
- package/dist/consensus.js.map +1 -0
- package/dist/examples/demo.d.ts +2 -0
- package/dist/examples/demo.d.ts.map +1 -0
- package/dist/examples/demo.js +63 -0
- package/dist/examples/demo.js.map +1 -0
- package/dist/examples/example.d.ts +2 -0
- package/dist/examples/example.d.ts.map +1 -0
- package/dist/examples/example.js +80 -0
- package/dist/examples/example.js.map +1 -0
- package/dist/examples/quickstart.d.ts +2 -0
- package/dist/examples/quickstart.d.ts.map +1 -0
- package/dist/examples/quickstart.js +56 -0
- package/dist/examples/quickstart.js.map +1 -0
- package/dist/examples/ralph-loop.d.ts +2 -0
- package/dist/examples/ralph-loop.d.ts.map +1 -0
- package/dist/examples/ralph-loop.js +281 -0
- package/dist/examples/ralph-loop.js.map +1 -0
- package/dist/examples/workflow-superiority.d.ts +32 -0
- package/dist/examples/workflow-superiority.d.ts.map +1 -0
- package/dist/examples/workflow-superiority.js +1421 -0
- package/dist/examples/workflow-superiority.js.map +1 -0
- package/dist/index.d.ts +13 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -26
- package/dist/index.js.map +1 -1
- package/dist/logs.d.ts +70 -25
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +238 -42
- package/dist/logs.js.map +1 -1
- package/dist/models.d.ts +9 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +17 -0
- package/dist/models.js.map +1 -0
- package/dist/protocol.d.ts +366 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +2 -0
- package/dist/protocol.js.map +1 -0
- package/dist/pty.d.ts +8 -0
- package/dist/pty.d.ts.map +1 -0
- package/dist/pty.js +26 -0
- package/dist/pty.js.map +1 -0
- package/dist/relay-adapter.d.ts +139 -0
- package/dist/relay-adapter.d.ts.map +1 -0
- package/dist/relay-adapter.js +210 -0
- package/dist/relay-adapter.js.map +1 -0
- package/dist/relay.d.ts +304 -0
- package/dist/relay.d.ts.map +1 -0
- package/dist/relay.js +910 -0
- package/dist/relay.js.map +1 -0
- package/dist/shadow.d.ts +101 -0
- package/dist/shadow.d.ts.map +1 -0
- package/dist/shadow.js +174 -0
- package/dist/shadow.js.map +1 -0
- package/dist/spawn-from-env.d.ts +77 -0
- package/dist/spawn-from-env.d.ts.map +1 -0
- package/dist/spawn-from-env.js +172 -0
- package/dist/spawn-from-env.js.map +1 -0
- package/dist/workflows/barrier.d.ts +72 -0
- package/dist/workflows/barrier.d.ts.map +1 -0
- package/dist/workflows/barrier.js +162 -0
- package/dist/workflows/barrier.js.map +1 -0
- package/dist/workflows/builder.d.ts +114 -0
- package/dist/workflows/builder.d.ts.map +1 -0
- package/dist/workflows/builder.js +201 -0
- package/dist/workflows/builder.js.map +1 -0
- package/dist/workflows/cli.d.ts +11 -0
- package/dist/workflows/cli.d.ts.map +1 -0
- package/dist/workflows/cli.js +144 -0
- package/dist/workflows/cli.js.map +1 -0
- package/dist/workflows/coordinator.d.ts +73 -0
- package/dist/workflows/coordinator.d.ts.map +1 -0
- package/dist/workflows/coordinator.js +647 -0
- package/dist/workflows/coordinator.js.map +1 -0
- package/dist/workflows/custom-steps.d.ts +73 -0
- package/dist/workflows/custom-steps.d.ts.map +1 -0
- package/dist/workflows/custom-steps.js +321 -0
- package/dist/workflows/custom-steps.js.map +1 -0
- package/dist/workflows/dry-run-format.d.ts +6 -0
- package/dist/workflows/dry-run-format.d.ts.map +1 -0
- package/dist/workflows/dry-run-format.js +68 -0
- package/dist/workflows/dry-run-format.js.map +1 -0
- package/dist/workflows/file-db.d.ts +33 -0
- package/dist/workflows/file-db.d.ts.map +1 -0
- package/dist/workflows/file-db.js +108 -0
- package/dist/workflows/file-db.js.map +1 -0
- package/dist/workflows/index.d.ts +15 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +15 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/memory-db.d.ts +17 -0
- package/dist/workflows/memory-db.d.ts.map +1 -0
- package/dist/workflows/memory-db.js +33 -0
- package/dist/workflows/memory-db.js.map +1 -0
- package/dist/workflows/run.d.ts +38 -0
- package/dist/workflows/run.d.ts.map +1 -0
- package/dist/workflows/run.js +25 -0
- package/dist/workflows/run.js.map +1 -0
- package/dist/workflows/runner.d.ts +320 -0
- package/dist/workflows/runner.d.ts.map +1 -0
- package/dist/workflows/runner.js +2821 -0
- package/dist/workflows/runner.js.map +1 -0
- package/dist/workflows/state.d.ts +77 -0
- package/dist/workflows/state.d.ts.map +1 -0
- package/dist/workflows/state.js +140 -0
- package/dist/workflows/state.js.map +1 -0
- package/dist/workflows/templates.d.ts +47 -0
- package/dist/workflows/templates.d.ts.map +1 -0
- package/dist/workflows/templates.js +405 -0
- package/dist/workflows/templates.js.map +1 -0
- package/dist/workflows/trajectory.d.ts +87 -0
- package/dist/workflows/trajectory.d.ts.map +1 -0
- package/dist/workflows/trajectory.js +441 -0
- package/dist/workflows/trajectory.js.map +1 -0
- package/dist/workflows/types.d.ts +306 -0
- package/dist/workflows/types.d.ts.map +1 -0
- package/dist/workflows/types.js +23 -0
- package/dist/workflows/types.js.map +1 -0
- package/dist/workflows/validator.d.ts +11 -0
- package/dist/workflows/validator.d.ts.map +1 -0
- package/dist/workflows/validator.js +128 -0
- package/dist/workflows/validator.js.map +1 -0
- package/package.json +59 -53
- package/dist/discovery.d.ts +0 -10
- package/dist/discovery.d.ts.map +0 -1
- package/dist/discovery.js +0 -22
- package/dist/discovery.js.map +0 -1
- package/dist/errors.d.ts +0 -9
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -9
- package/dist/errors.js.map +0 -1
- package/dist/protocol/index.d.ts +0 -8
- package/dist/protocol/index.d.ts.map +0 -1
- package/dist/protocol/index.js +0 -8
- package/dist/protocol/index.js.map +0 -1
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI entry point for running relay.yaml workflows.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* relay-workflow <yaml-path> [--workflow <name>]
|
|
7
|
+
* relay-workflow --resume <run-id>
|
|
8
|
+
* npx @agent-relay/sdk run <yaml-path> [--workflow <name>]
|
|
9
|
+
*/
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { WorkflowRunner } from './runner.js';
|
|
12
|
+
import { JsonFileWorkflowDb } from './file-db.js';
|
|
13
|
+
function printUsage() {
|
|
14
|
+
console.log(`
|
|
15
|
+
Usage: relay-workflow <yaml-path> [options]
|
|
16
|
+
relay-workflow --resume <run-id>
|
|
17
|
+
|
|
18
|
+
Run a relay.yaml workflow file.
|
|
19
|
+
|
|
20
|
+
Arguments:
|
|
21
|
+
<yaml-path> Path to the relay.yaml workflow file
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
--workflow <name> Run a specific workflow by name (default: first)
|
|
25
|
+
--resume <run-id> Resume a failed or interrupted run by its run ID
|
|
26
|
+
--validate Validate workflow YAML for common issues without running
|
|
27
|
+
--help Show this help message
|
|
28
|
+
|
|
29
|
+
Examples:
|
|
30
|
+
relay-workflow workflows/daytona-migration.yaml
|
|
31
|
+
relay-workflow workflows/feature-dev.yaml --workflow build-and-test
|
|
32
|
+
relay-workflow --resume f409ce1d1788710bcc6abb55
|
|
33
|
+
`.trim());
|
|
34
|
+
}
|
|
35
|
+
function formatEvent(event) {
|
|
36
|
+
switch (event.type) {
|
|
37
|
+
case 'run:started':
|
|
38
|
+
return `[run] started (${event.runId})`;
|
|
39
|
+
case 'run:completed':
|
|
40
|
+
return `[run] completed`;
|
|
41
|
+
case 'run:failed':
|
|
42
|
+
return `[run] failed: ${event.error}`;
|
|
43
|
+
case 'run:cancelled':
|
|
44
|
+
return `[run] cancelled`;
|
|
45
|
+
case 'step:started':
|
|
46
|
+
return `[step] ${event.stepName} started`;
|
|
47
|
+
case 'step:completed':
|
|
48
|
+
return `[step] ${event.stepName} completed`;
|
|
49
|
+
case 'step:failed':
|
|
50
|
+
return `[step] ${event.stepName} failed: ${event.error}`;
|
|
51
|
+
case 'step:skipped':
|
|
52
|
+
return `[step] ${event.stepName} skipped`;
|
|
53
|
+
case 'step:retrying':
|
|
54
|
+
return `[step] ${event.stepName} retrying (attempt ${event.attempt})`;
|
|
55
|
+
case 'step:nudged':
|
|
56
|
+
return `[step] ${event.stepName} nudged (nudge #${event.nudgeCount})`;
|
|
57
|
+
case 'step:force-released':
|
|
58
|
+
return `[step] ${event.stepName} force-released`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function main() {
|
|
62
|
+
const args = process.argv.slice(2);
|
|
63
|
+
if (args.length === 0 || args.includes('--help')) {
|
|
64
|
+
printUsage();
|
|
65
|
+
process.exit(args.includes('--help') ? 0 : 1);
|
|
66
|
+
}
|
|
67
|
+
// Use a file-backed DB so runs survive process restarts and --resume works.
|
|
68
|
+
const dbPath = path.join(process.cwd(), '.agent-relay', 'workflow-runs.jsonl');
|
|
69
|
+
const fileDb = new JsonFileWorkflowDb(dbPath);
|
|
70
|
+
if (!fileDb.isWritable()) {
|
|
71
|
+
console.warn(`[workflow] warning: cannot write to ${dbPath} — run state will not be persisted (--resume unavailable)`);
|
|
72
|
+
}
|
|
73
|
+
const runner = new WorkflowRunner({ db: fileDb });
|
|
74
|
+
let shuttingDown = false;
|
|
75
|
+
const shutdown = async (signal) => {
|
|
76
|
+
if (shuttingDown)
|
|
77
|
+
return;
|
|
78
|
+
shuttingDown = true;
|
|
79
|
+
console.log(`\n[workflow] ${signal} received — shutting down broker...`);
|
|
80
|
+
await runner.relay?.shutdown().catch(() => undefined);
|
|
81
|
+
process.exit(130);
|
|
82
|
+
};
|
|
83
|
+
process.on('SIGINT', () => void shutdown('SIGINT'));
|
|
84
|
+
process.on('SIGTERM', () => void shutdown('SIGTERM'));
|
|
85
|
+
// ── Resume mode ────────────────────────────────────────────────────────────
|
|
86
|
+
const resumeIdx = args.indexOf('--resume');
|
|
87
|
+
if (resumeIdx !== -1) {
|
|
88
|
+
const runId = args[resumeIdx + 1];
|
|
89
|
+
if (!runId) {
|
|
90
|
+
console.error('Error: --resume requires a run ID');
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
console.log(`Resuming run ${runId}...`);
|
|
94
|
+
runner.on((event) => console.log(formatEvent(event)));
|
|
95
|
+
const result = await runner.resume(runId);
|
|
96
|
+
if (result.status === 'completed') {
|
|
97
|
+
console.log(`\nWorkflow completed successfully.`);
|
|
98
|
+
process.exit(0);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
console.error(`\nWorkflow ${result.status}${result.error ? `: ${result.error}` : ''}`);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// ── Normal / validate / dry-run mode ──────────────────────────────────────
|
|
107
|
+
const yamlPath = args[0];
|
|
108
|
+
let workflowName;
|
|
109
|
+
const workflowIdx = args.indexOf('--workflow');
|
|
110
|
+
if (workflowIdx !== -1 && args[workflowIdx + 1]) {
|
|
111
|
+
workflowName = args[workflowIdx + 1];
|
|
112
|
+
}
|
|
113
|
+
const isValidate = args.includes('--validate');
|
|
114
|
+
console.log(`Running workflow from ${yamlPath}...`);
|
|
115
|
+
const isDryRun = !!process.env.DRY_RUN;
|
|
116
|
+
const config = await runner.parseYamlFile(yamlPath);
|
|
117
|
+
if (isValidate) {
|
|
118
|
+
const { validateWorkflow, formatValidationReport } = await import('./validator.js');
|
|
119
|
+
const issues = validateWorkflow(config);
|
|
120
|
+
console.log(formatValidationReport(issues, yamlPath));
|
|
121
|
+
process.exit(issues.some((i) => i.severity === 'error') ? 1 : 0);
|
|
122
|
+
}
|
|
123
|
+
if (isDryRun) {
|
|
124
|
+
const { formatDryRunReport } = await import('./dry-run-format.js');
|
|
125
|
+
const report = runner.dryRun(config, workflowName);
|
|
126
|
+
console.log(formatDryRunReport(report));
|
|
127
|
+
process.exit(report.valid ? 0 : 1);
|
|
128
|
+
}
|
|
129
|
+
runner.on((event) => console.log(formatEvent(event)));
|
|
130
|
+
const result = await runner.execute(config, workflowName);
|
|
131
|
+
if (result.status === 'completed') {
|
|
132
|
+
console.log(`\nWorkflow completed successfully.`);
|
|
133
|
+
process.exit(0);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.error(`\nWorkflow ${result.status}${result.error ? `: ${result.error}` : ''}`);
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
main().catch((err) => {
|
|
141
|
+
console.error(`Error: ${err.message}`);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/workflows/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swarm Coordinator — pattern selection, agent topology, and workflow lifecycle.
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates workflow runs: picks the right swarm pattern (or auto-selects),
|
|
5
|
+
* resolves agent topology from the config, and drives the run through its
|
|
6
|
+
* lifecycle states (pending → running → completed / failed / cancelled).
|
|
7
|
+
*/
|
|
8
|
+
import { EventEmitter } from 'node:events';
|
|
9
|
+
import type { AgentDefinition, RelayYamlConfig, SwarmPattern, WorkflowRunRow, WorkflowRunStatus, WorkflowStepRow } from './types.js';
|
|
10
|
+
/** Minimal database client contract accepted by all services. */
|
|
11
|
+
export interface DbClient {
|
|
12
|
+
query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{
|
|
13
|
+
rows: T[];
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
/** Describes the communication graph for a set of agents. */
|
|
17
|
+
export interface AgentTopology {
|
|
18
|
+
pattern: SwarmPattern;
|
|
19
|
+
agents: AgentDefinition[];
|
|
20
|
+
/** Agent name → names it can send messages to. */
|
|
21
|
+
edges: Map<string, string[]>;
|
|
22
|
+
/** Optional hub agent for hub-spoke / hierarchical. */
|
|
23
|
+
hub?: string;
|
|
24
|
+
/** Ordered pipeline stages (pipeline pattern only). */
|
|
25
|
+
pipelineOrder?: string[];
|
|
26
|
+
}
|
|
27
|
+
export interface SwarmCoordinatorEvents {
|
|
28
|
+
'run:created': (run: WorkflowRunRow) => void;
|
|
29
|
+
'run:started': (run: WorkflowRunRow) => void;
|
|
30
|
+
'run:completed': (run: WorkflowRunRow) => void;
|
|
31
|
+
'run:failed': (run: WorkflowRunRow) => void;
|
|
32
|
+
'run:cancelled': (run: WorkflowRunRow) => void;
|
|
33
|
+
'step:started': (step: WorkflowStepRow) => void;
|
|
34
|
+
'step:completed': (step: WorkflowStepRow) => void;
|
|
35
|
+
'step:failed': (step: WorkflowStepRow) => void;
|
|
36
|
+
}
|
|
37
|
+
export declare class SwarmCoordinator extends EventEmitter {
|
|
38
|
+
private db;
|
|
39
|
+
constructor(db: DbClient);
|
|
40
|
+
/**
|
|
41
|
+
* Select the swarm pattern to use for a config. If the config already
|
|
42
|
+
* specifies a pattern, it is returned as-is. Otherwise heuristics apply.
|
|
43
|
+
*/
|
|
44
|
+
selectPattern(config: RelayYamlConfig): SwarmPattern;
|
|
45
|
+
/**
|
|
46
|
+
* Build the agent communication topology for a given config and pattern.
|
|
47
|
+
* Non-interactive agents are excluded from message edges — they only communicate
|
|
48
|
+
* through step output chaining ({{steps.X.output}}).
|
|
49
|
+
*/
|
|
50
|
+
resolveTopology(config: RelayYamlConfig, pattern?: SwarmPattern): AgentTopology;
|
|
51
|
+
/** Internal: resolve topology edges for interactive agents only. */
|
|
52
|
+
private resolveInteractiveTopology;
|
|
53
|
+
createRun(workspaceId: string, config: RelayYamlConfig): Promise<WorkflowRunRow>;
|
|
54
|
+
startRun(runId: string): Promise<WorkflowRunRow>;
|
|
55
|
+
completeRun(runId: string, stateSnapshot?: Record<string, unknown>): Promise<WorkflowRunRow>;
|
|
56
|
+
failRun(runId: string, error: string): Promise<WorkflowRunRow>;
|
|
57
|
+
cancelRun(runId: string): Promise<WorkflowRunRow>;
|
|
58
|
+
createSteps(runId: string, config: RelayYamlConfig): Promise<WorkflowStepRow[]>;
|
|
59
|
+
startStep(stepId: string): Promise<WorkflowStepRow>;
|
|
60
|
+
completeStep(stepId: string, output?: string): Promise<WorkflowStepRow>;
|
|
61
|
+
failStep(stepId: string, error: string): Promise<WorkflowStepRow>;
|
|
62
|
+
skipStep(stepId: string): Promise<WorkflowStepRow>;
|
|
63
|
+
getRun(runId: string): Promise<WorkflowRunRow | null>;
|
|
64
|
+
getSteps(runId: string): Promise<WorkflowStepRow[]>;
|
|
65
|
+
getReadySteps(runId: string): Promise<WorkflowStepRow[]>;
|
|
66
|
+
getRunsByWorkspace(workspaceId: string, status?: WorkflowRunStatus): Promise<WorkflowRunRow[]>;
|
|
67
|
+
private transitionRun;
|
|
68
|
+
private pickHub;
|
|
69
|
+
private resolvePipelineOrder;
|
|
70
|
+
private resolveEscalationOrder;
|
|
71
|
+
private resolveDAGEdges;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/workflows/coordinator.ts"],"names":[],"mappings":"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"}
|