agent-relay 2.3.2 → 2.3.5
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 +1 -1
- package/dist/index.cjs +1 -1
- package/dist/src/cli/index.js +124 -7
- package/dist/src/cli/index.js.map +1 -1
- package/package.json +20 -26
- package/packages/acp-bridge/package.json +2 -2
- package/packages/bridge/package.json +7 -7
- package/packages/config/dist/cloud-config.d.ts +1 -1
- package/packages/config/dist/cloud-config.d.ts.map +1 -1
- package/packages/config/dist/cloud-config.js.map +1 -1
- package/packages/config/dist/schemas.d.ts +5 -5
- package/packages/config/dist/schemas.js +1 -1
- package/packages/config/dist/schemas.js.map +1 -1
- package/packages/config/package.json +2 -2
- package/packages/config/src/cloud-config.ts +2 -2
- package/packages/config/src/schemas.test.ts +48 -0
- package/packages/config/src/schemas.ts +1 -1
- package/packages/continuity/package.json +2 -2
- package/packages/daemon/package.json +12 -12
- package/packages/hooks/package.json +4 -4
- package/packages/mcp/package.json +5 -5
- package/packages/memory/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/protocol/package.json +1 -1
- package/packages/resiliency/package.json +1 -1
- package/packages/sdk/dist/index.d.ts +1 -29
- package/packages/sdk/dist/index.d.ts.map +1 -1
- package/packages/sdk/dist/index.js +1 -38
- package/packages/sdk/dist/index.js.map +1 -1
- package/packages/sdk/package.json +4 -25
- package/packages/sdk/src/index.ts +1 -69
- package/packages/sdk-py/README.md +56 -0
- package/packages/sdk-py/pyproject.toml +23 -0
- package/packages/sdk-py/src/agent_relay/__init__.py +27 -0
- package/packages/sdk-py/src/agent_relay/builder.py +367 -0
- package/packages/sdk-py/src/agent_relay/types.py +92 -0
- package/packages/sdk-py/tests/__init__.py +0 -0
- package/packages/sdk-py/tests/test_builder.py +101 -0
- package/packages/sdk-ts/dist/__tests__/facade.test.d.ts +2 -0
- package/packages/sdk-ts/dist/__tests__/facade.test.d.ts.map +1 -0
- package/packages/sdk-ts/dist/__tests__/facade.test.js +257 -0
- package/packages/sdk-ts/dist/__tests__/facade.test.js.map +1 -0
- package/packages/sdk-ts/dist/__tests__/unit.test.d.ts +2 -0
- package/packages/sdk-ts/dist/__tests__/unit.test.d.ts.map +1 -0
- package/packages/sdk-ts/dist/__tests__/unit.test.js +124 -0
- package/packages/sdk-ts/dist/__tests__/unit.test.js.map +1 -0
- package/packages/sdk-ts/dist/client.d.ts +2 -0
- package/packages/sdk-ts/dist/client.d.ts.map +1 -1
- package/packages/sdk-ts/dist/client.js +2 -0
- package/packages/sdk-ts/dist/client.js.map +1 -1
- package/packages/sdk-ts/dist/index.d.ts +1 -0
- package/packages/sdk-ts/dist/index.d.ts.map +1 -1
- package/packages/sdk-ts/dist/index.js +1 -0
- package/packages/sdk-ts/dist/index.js.map +1 -1
- package/packages/sdk-ts/dist/protocol.d.ts +1 -0
- package/packages/sdk-ts/dist/protocol.d.ts.map +1 -1
- package/packages/sdk-ts/dist/relay.d.ts +44 -0
- package/packages/sdk-ts/dist/relay.d.ts.map +1 -1
- package/packages/sdk-ts/dist/relay.js +89 -11
- package/packages/sdk-ts/dist/relay.js.map +1 -1
- package/packages/sdk-ts/dist/relaycast.js +2 -2
- package/packages/sdk-ts/dist/relaycast.js.map +1 -1
- package/packages/sdk-ts/dist/workflows/barrier.d.ts +72 -0
- package/packages/sdk-ts/dist/workflows/barrier.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/barrier.js +162 -0
- package/packages/sdk-ts/dist/workflows/barrier.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/builder.d.ts +101 -0
- package/packages/sdk-ts/dist/workflows/builder.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/builder.js +179 -0
- package/packages/sdk-ts/dist/workflows/builder.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/cli.d.ts +10 -0
- package/packages/sdk-ts/dist/workflows/cli.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/cli.js +82 -0
- package/packages/sdk-ts/dist/workflows/cli.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/coordinator.d.ts +68 -0
- package/packages/sdk-ts/dist/workflows/coordinator.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/coordinator.js +353 -0
- package/packages/sdk-ts/dist/workflows/coordinator.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/index.d.ts +10 -0
- package/packages/sdk-ts/dist/workflows/index.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/index.js +10 -0
- package/packages/sdk-ts/dist/workflows/index.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/memory-db.d.ts +17 -0
- package/packages/sdk-ts/dist/workflows/memory-db.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/memory-db.js +33 -0
- package/packages/sdk-ts/dist/workflows/memory-db.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/run.d.ts +31 -0
- package/packages/sdk-ts/dist/workflows/run.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/run.js +24 -0
- package/packages/sdk-ts/dist/workflows/run.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/runner.d.ts +119 -0
- package/packages/sdk-ts/dist/workflows/runner.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/runner.js +650 -0
- package/packages/sdk-ts/dist/workflows/runner.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/state.d.ts +77 -0
- package/packages/sdk-ts/dist/workflows/state.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/state.js +140 -0
- package/packages/sdk-ts/dist/workflows/state.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/templates.d.ts +47 -0
- package/packages/sdk-ts/dist/workflows/templates.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/templates.js +395 -0
- package/packages/sdk-ts/dist/workflows/templates.js.map +1 -0
- package/packages/sdk-ts/dist/workflows/types.d.ts +126 -0
- package/packages/sdk-ts/dist/workflows/types.d.ts.map +1 -0
- package/packages/sdk-ts/dist/workflows/types.js +8 -0
- package/packages/sdk-ts/dist/workflows/types.js.map +1 -0
- package/packages/sdk-ts/package.json +9 -3
- package/packages/sdk-ts/src/__tests__/error-scenarios.test.ts +682 -0
- package/packages/sdk-ts/src/__tests__/facade.test.ts +296 -0
- package/packages/sdk-ts/src/__tests__/swarm-coordinator.test.ts +416 -0
- package/packages/sdk-ts/src/__tests__/unit.test.ts +152 -0
- package/packages/sdk-ts/src/__tests__/workflow-runner.test.ts +333 -0
- package/packages/sdk-ts/src/client.ts +4 -0
- package/packages/sdk-ts/src/index.ts +1 -0
- package/packages/sdk-ts/src/protocol.ts +1 -1
- package/packages/sdk-ts/src/relay.ts +112 -11
- package/packages/sdk-ts/src/relaycast.ts +2 -2
- package/packages/sdk-ts/src/workflows/README.md +450 -0
- package/packages/sdk-ts/src/workflows/barrier.ts +254 -0
- package/packages/sdk-ts/src/workflows/builder.ts +241 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/bug-fix.yaml +75 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/code-review.yaml +82 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/documentation.yaml +70 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/feature-dev.yaml +76 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/refactor.yaml +82 -0
- package/packages/sdk-ts/src/workflows/builtin-templates/security-audit.yaml +84 -0
- package/packages/sdk-ts/src/workflows/cli.ts +93 -0
- package/packages/sdk-ts/src/workflows/coordinator.ts +520 -0
- package/packages/sdk-ts/src/workflows/index.ts +9 -0
- package/packages/sdk-ts/src/workflows/memory-db.ts +39 -0
- package/packages/sdk-ts/src/workflows/run.ts +47 -0
- package/packages/sdk-ts/src/workflows/runner.ts +873 -0
- package/packages/sdk-ts/src/workflows/schema.json +321 -0
- package/packages/sdk-ts/src/workflows/state.ts +279 -0
- package/packages/sdk-ts/src/workflows/templates.ts +544 -0
- package/packages/sdk-ts/src/workflows/types.ts +178 -0
- package/packages/sdk-ts/tsconfig.json +6 -1
- package/packages/spawner/package.json +1 -1
- package/packages/state/package.json +1 -1
- package/packages/storage/package.json +2 -2
- 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 +3 -3
- package/packages/wrapper/package.json +5 -6
- package/scripts/postinstall.js +106 -2
- package/packages/api-types/.trajectories/active/traj_xbsvuzogscey.json +0 -15
- package/packages/api-types/.trajectories/index.json +0 -12
- package/packages/api-types/dist/index.d.ts +0 -21
- package/packages/api-types/dist/index.d.ts.map +0 -1
- package/packages/api-types/dist/index.js +0 -22
- package/packages/api-types/dist/index.js.map +0 -1
- package/packages/api-types/dist/schemas/agent.d.ts +0 -259
- package/packages/api-types/dist/schemas/agent.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/agent.js +0 -102
- package/packages/api-types/dist/schemas/agent.js.map +0 -1
- package/packages/api-types/dist/schemas/api.d.ts +0 -290
- package/packages/api-types/dist/schemas/api.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/api.js +0 -162
- package/packages/api-types/dist/schemas/api.js.map +0 -1
- package/packages/api-types/dist/schemas/decision.d.ts +0 -230
- package/packages/api-types/dist/schemas/decision.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/decision.js +0 -104
- package/packages/api-types/dist/schemas/decision.js.map +0 -1
- package/packages/api-types/dist/schemas/fleet.d.ts +0 -615
- package/packages/api-types/dist/schemas/fleet.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/fleet.js +0 -71
- package/packages/api-types/dist/schemas/fleet.js.map +0 -1
- package/packages/api-types/dist/schemas/history.d.ts +0 -180
- package/packages/api-types/dist/schemas/history.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/history.js +0 -72
- package/packages/api-types/dist/schemas/history.js.map +0 -1
- package/packages/api-types/dist/schemas/index.d.ts +0 -14
- package/packages/api-types/dist/schemas/index.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/index.js +0 -22
- package/packages/api-types/dist/schemas/index.js.map +0 -1
- package/packages/api-types/dist/schemas/message.d.ts +0 -456
- package/packages/api-types/dist/schemas/message.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/message.js +0 -88
- package/packages/api-types/dist/schemas/message.js.map +0 -1
- package/packages/api-types/dist/schemas/session.d.ts +0 -60
- package/packages/api-types/dist/schemas/session.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/session.js +0 -36
- package/packages/api-types/dist/schemas/session.js.map +0 -1
- package/packages/api-types/dist/schemas/task.d.ts +0 -111
- package/packages/api-types/dist/schemas/task.d.ts.map +0 -1
- package/packages/api-types/dist/schemas/task.js +0 -64
- package/packages/api-types/dist/schemas/task.js.map +0 -1
- package/packages/api-types/package.json +0 -61
- package/packages/api-types/scripts/generate-openapi.ts +0 -106
- package/packages/api-types/src/index.ts +0 -22
- package/packages/api-types/src/schemas/agent.test.ts +0 -164
- package/packages/api-types/src/schemas/agent.ts +0 -110
- package/packages/api-types/src/schemas/api.test.ts +0 -372
- package/packages/api-types/src/schemas/api.ts +0 -194
- package/packages/api-types/src/schemas/decision.test.ts +0 -324
- package/packages/api-types/src/schemas/decision.ts +0 -136
- package/packages/api-types/src/schemas/fleet.test.ts +0 -212
- package/packages/api-types/src/schemas/fleet.ts +0 -83
- package/packages/api-types/src/schemas/history.test.ts +0 -242
- package/packages/api-types/src/schemas/history.ts +0 -84
- package/packages/api-types/src/schemas/index.ts +0 -148
- package/packages/api-types/src/schemas/message.test.ts +0 -192
- package/packages/api-types/src/schemas/message.ts +0 -98
- package/packages/api-types/src/schemas/session.test.ts +0 -104
- package/packages/api-types/src/schemas/session.ts +0 -40
- package/packages/api-types/src/schemas/task.test.ts +0 -192
- package/packages/api-types/src/schemas/task.ts +0 -78
- package/packages/api-types/tsconfig.json +0 -19
- package/packages/api-types/vitest.config.ts +0 -9
- package/packages/benchmark/README.md +0 -200
- package/packages/benchmark/datasets/coding-tasks.yaml +0 -127
- package/packages/benchmark/datasets/coordination-tasks.yaml +0 -122
- package/packages/benchmark/datasets/quick-test.yaml +0 -20
- package/packages/benchmark/dist/benchmark.d.ts +0 -47
- package/packages/benchmark/dist/benchmark.d.ts.map +0 -1
- package/packages/benchmark/dist/benchmark.js +0 -224
- package/packages/benchmark/dist/benchmark.js.map +0 -1
- package/packages/benchmark/dist/cli.d.ts +0 -8
- package/packages/benchmark/dist/cli.d.ts.map +0 -1
- package/packages/benchmark/dist/cli.js +0 -185
- package/packages/benchmark/dist/cli.js.map +0 -1
- package/packages/benchmark/dist/harbor.d.ts +0 -53
- package/packages/benchmark/dist/harbor.d.ts.map +0 -1
- package/packages/benchmark/dist/harbor.js +0 -127
- package/packages/benchmark/dist/harbor.js.map +0 -1
- package/packages/benchmark/dist/index.d.ts +0 -48
- package/packages/benchmark/dist/index.d.ts.map +0 -1
- package/packages/benchmark/dist/index.js +0 -50
- package/packages/benchmark/dist/index.js.map +0 -1
- package/packages/benchmark/dist/runners/base.d.ts +0 -63
- package/packages/benchmark/dist/runners/base.d.ts.map +0 -1
- package/packages/benchmark/dist/runners/base.js +0 -156
- package/packages/benchmark/dist/runners/base.js.map +0 -1
- package/packages/benchmark/dist/runners/index.d.ts +0 -10
- package/packages/benchmark/dist/runners/index.d.ts.map +0 -1
- package/packages/benchmark/dist/runners/index.js +0 -10
- package/packages/benchmark/dist/runners/index.js.map +0 -1
- package/packages/benchmark/dist/runners/single.d.ts +0 -19
- package/packages/benchmark/dist/runners/single.d.ts.map +0 -1
- package/packages/benchmark/dist/runners/single.js +0 -111
- package/packages/benchmark/dist/runners/single.js.map +0 -1
- package/packages/benchmark/dist/runners/subagent.d.ts +0 -32
- package/packages/benchmark/dist/runners/subagent.d.ts.map +0 -1
- package/packages/benchmark/dist/runners/subagent.js +0 -212
- package/packages/benchmark/dist/runners/subagent.js.map +0 -1
- package/packages/benchmark/dist/runners/swarm.d.ts +0 -36
- package/packages/benchmark/dist/runners/swarm.d.ts.map +0 -1
- package/packages/benchmark/dist/runners/swarm.js +0 -273
- package/packages/benchmark/dist/runners/swarm.js.map +0 -1
- package/packages/benchmark/dist/types.d.ts +0 -178
- package/packages/benchmark/dist/types.d.ts.map +0 -1
- package/packages/benchmark/dist/types.js +0 -16
- package/packages/benchmark/dist/types.js.map +0 -1
- package/packages/benchmark/package.json +0 -80
- package/packages/benchmark/src/benchmark.ts +0 -298
- package/packages/benchmark/src/cli.ts +0 -240
- package/packages/benchmark/src/harbor.ts +0 -170
- package/packages/benchmark/src/index.ts +0 -73
- package/packages/benchmark/src/runners/base.ts +0 -205
- package/packages/benchmark/src/runners/index.ts +0 -10
- package/packages/benchmark/src/runners/single.ts +0 -121
- package/packages/benchmark/src/runners/subagent.ts +0 -240
- package/packages/benchmark/src/runners/swarm.ts +0 -326
- package/packages/benchmark/src/types.ts +0 -205
- package/packages/benchmark/tsconfig.json +0 -20
- package/packages/cli-tester/README.md +0 -277
- package/packages/cli-tester/dist/index.d.ts +0 -21
- package/packages/cli-tester/dist/index.d.ts.map +0 -1
- package/packages/cli-tester/dist/index.js +0 -21
- package/packages/cli-tester/dist/index.js.map +0 -1
- package/packages/cli-tester/dist/utils/credential-check.d.ts +0 -56
- package/packages/cli-tester/dist/utils/credential-check.d.ts.map +0 -1
- package/packages/cli-tester/dist/utils/credential-check.js +0 -230
- package/packages/cli-tester/dist/utils/credential-check.js.map +0 -1
- package/packages/cli-tester/dist/utils/socket-client.d.ts +0 -76
- package/packages/cli-tester/dist/utils/socket-client.d.ts.map +0 -1
- package/packages/cli-tester/dist/utils/socket-client.js +0 -153
- package/packages/cli-tester/dist/utils/socket-client.js.map +0 -1
- package/packages/cli-tester/docker/Dockerfile +0 -61
- package/packages/cli-tester/docker/docker-compose.yml +0 -71
- package/packages/cli-tester/docker/entrypoint.sh +0 -58
- package/packages/cli-tester/package.json +0 -32
- package/packages/cli-tester/scripts/clear-auth.sh +0 -101
- package/packages/cli-tester/scripts/inject-message.sh +0 -42
- package/packages/cli-tester/scripts/start.sh +0 -71
- package/packages/cli-tester/scripts/test-cli.sh +0 -56
- package/packages/cli-tester/scripts/test-full-spawn.sh +0 -238
- package/packages/cli-tester/scripts/test-registration.sh +0 -182
- package/packages/cli-tester/scripts/test-setup-flow.sh +0 -202
- package/packages/cli-tester/scripts/test-spawn.sh +0 -140
- package/packages/cli-tester/scripts/test-with-daemon.sh +0 -247
- package/packages/cli-tester/scripts/verify-auth.sh +0 -112
- package/packages/cli-tester/src/index.ts +0 -40
- package/packages/cli-tester/src/utils/credential-check.ts +0 -284
- package/packages/cli-tester/src/utils/socket-client.ts +0 -211
- package/packages/cli-tester/tests/credential-check.test.ts +0 -56
- package/packages/cli-tester/tsconfig.json +0 -11
- package/packages/sdk/dist/browser-client.d.ts +0 -212
- package/packages/sdk/dist/browser-client.d.ts.map +0 -1
- package/packages/sdk/dist/browser-client.js +0 -750
- package/packages/sdk/dist/browser-client.js.map +0 -1
- package/packages/sdk/dist/browser-framing.d.ts +0 -46
- package/packages/sdk/dist/browser-framing.d.ts.map +0 -1
- package/packages/sdk/dist/browser-framing.js +0 -122
- package/packages/sdk/dist/browser-framing.js.map +0 -1
- package/packages/sdk/dist/standalone.d.ts +0 -89
- package/packages/sdk/dist/standalone.d.ts.map +0 -1
- package/packages/sdk/dist/standalone.js +0 -131
- package/packages/sdk/dist/standalone.js.map +0 -1
- package/packages/sdk/dist/transports/index.d.ts +0 -92
- package/packages/sdk/dist/transports/index.d.ts.map +0 -1
- package/packages/sdk/dist/transports/index.js +0 -129
- package/packages/sdk/dist/transports/index.js.map +0 -1
- package/packages/sdk/dist/transports/socket-transport.d.ts +0 -30
- package/packages/sdk/dist/transports/socket-transport.d.ts.map +0 -1
- package/packages/sdk/dist/transports/socket-transport.js +0 -94
- package/packages/sdk/dist/transports/socket-transport.js.map +0 -1
- package/packages/sdk/dist/transports/types.d.ts +0 -69
- package/packages/sdk/dist/transports/types.d.ts.map +0 -1
- package/packages/sdk/dist/transports/types.js +0 -10
- package/packages/sdk/dist/transports/types.js.map +0 -1
- package/packages/sdk/dist/transports/websocket-transport.d.ts +0 -55
- package/packages/sdk/dist/transports/websocket-transport.d.ts.map +0 -1
- package/packages/sdk/dist/transports/websocket-transport.js +0 -180
- package/packages/sdk/dist/transports/websocket-transport.js.map +0 -1
- package/packages/sdk/src/browser-client.ts +0 -985
- package/packages/sdk/src/browser-framing.test.ts +0 -115
- package/packages/sdk/src/browser-framing.ts +0 -150
- package/packages/sdk/src/standalone.ts +0 -183
- package/packages/sdk/src/transports/index.ts +0 -197
- package/packages/sdk/src/transports/socket-transport.ts +0 -115
- package/packages/sdk/src/transports/types.ts +0 -77
- package/packages/sdk/src/transports/websocket-transport.ts +0 -245
|
@@ -0,0 +1,353 @@
|
|
|
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 { randomBytes } from 'node:crypto';
|
|
9
|
+
import { EventEmitter } from 'node:events';
|
|
10
|
+
// ── Pattern auto-selection ──────────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Mapping used when auto-selecting a pattern from config heuristics.
|
|
13
|
+
* The coordinator checks the config shape and picks the best match.
|
|
14
|
+
*/
|
|
15
|
+
const PATTERN_HEURISTICS = [
|
|
16
|
+
{
|
|
17
|
+
test: (c) => Array.isArray(c.workflows) &&
|
|
18
|
+
c.workflows.some((w) => w.steps.some((s) => s.dependsOn?.length)),
|
|
19
|
+
pattern: 'dag',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
test: (c) => c.coordination?.consensusStrategy !== undefined,
|
|
23
|
+
pattern: 'consensus',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
test: (c) => Array.isArray(c.workflows) &&
|
|
27
|
+
c.workflows.some((w) => {
|
|
28
|
+
const names = w.steps.map((s) => s.agent);
|
|
29
|
+
return new Set(names).size === names.length && names.length > 2;
|
|
30
|
+
}),
|
|
31
|
+
pattern: 'pipeline',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
test: (c) => c.agents.length > 3 && c.agents.some((a) => a.role === 'lead'),
|
|
35
|
+
pattern: 'hierarchical',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
test: (c) => c.agents.some((a) => a.role === 'hub' || a.role === 'coordinator'),
|
|
39
|
+
pattern: 'hub-spoke',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
// Default: many independent agents → fan-out
|
|
43
|
+
test: () => true,
|
|
44
|
+
pattern: 'fan-out',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
// ── Coordinator ─────────────────────────────────────────────────────────────
|
|
48
|
+
export class SwarmCoordinator extends EventEmitter {
|
|
49
|
+
db;
|
|
50
|
+
constructor(db) {
|
|
51
|
+
super();
|
|
52
|
+
this.db = db;
|
|
53
|
+
}
|
|
54
|
+
// ── Pattern selection ───────────────────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Select the swarm pattern to use for a config. If the config already
|
|
57
|
+
* specifies a pattern, it is returned as-is. Otherwise heuristics apply.
|
|
58
|
+
*/
|
|
59
|
+
selectPattern(config) {
|
|
60
|
+
if (config.swarm.pattern) {
|
|
61
|
+
return config.swarm.pattern;
|
|
62
|
+
}
|
|
63
|
+
for (const h of PATTERN_HEURISTICS) {
|
|
64
|
+
if (h.test(config))
|
|
65
|
+
return h.pattern;
|
|
66
|
+
}
|
|
67
|
+
return 'fan-out';
|
|
68
|
+
}
|
|
69
|
+
// ── Topology resolution ─────────────────────────────────────────────────
|
|
70
|
+
/**
|
|
71
|
+
* Build the agent communication topology for a given config and pattern.
|
|
72
|
+
*/
|
|
73
|
+
resolveTopology(config, pattern) {
|
|
74
|
+
const p = pattern ?? this.selectPattern(config);
|
|
75
|
+
const agents = config.agents;
|
|
76
|
+
const edges = new Map();
|
|
77
|
+
const names = agents.map((a) => a.name);
|
|
78
|
+
switch (p) {
|
|
79
|
+
case 'fan-out': {
|
|
80
|
+
// Hub (first agent or role=lead) fans out to all others; no inter-worker edges.
|
|
81
|
+
const hub = this.pickHub(agents);
|
|
82
|
+
const others = names.filter((n) => n !== hub);
|
|
83
|
+
edges.set(hub, others);
|
|
84
|
+
for (const o of others)
|
|
85
|
+
edges.set(o, [hub]);
|
|
86
|
+
return { pattern: p, agents, edges, hub };
|
|
87
|
+
}
|
|
88
|
+
case 'pipeline': {
|
|
89
|
+
// Linear chain following workflow step order or agent list order.
|
|
90
|
+
const order = this.resolvePipelineOrder(config, names);
|
|
91
|
+
for (let i = 0; i < order.length; i++) {
|
|
92
|
+
edges.set(order[i], i < order.length - 1 ? [order[i + 1]] : []);
|
|
93
|
+
}
|
|
94
|
+
return { pattern: p, agents, edges, pipelineOrder: order };
|
|
95
|
+
}
|
|
96
|
+
case 'hub-spoke': {
|
|
97
|
+
const hub = this.pickHub(agents);
|
|
98
|
+
const spokes = names.filter((n) => n !== hub);
|
|
99
|
+
edges.set(hub, spokes);
|
|
100
|
+
for (const s of spokes)
|
|
101
|
+
edges.set(s, [hub]);
|
|
102
|
+
return { pattern: p, agents, edges, hub };
|
|
103
|
+
}
|
|
104
|
+
case 'consensus':
|
|
105
|
+
case 'debate':
|
|
106
|
+
case 'mesh': {
|
|
107
|
+
// Full mesh — every agent can talk to every other.
|
|
108
|
+
for (const n of names) {
|
|
109
|
+
edges.set(n, names.filter((o) => o !== n));
|
|
110
|
+
}
|
|
111
|
+
return { pattern: p, agents, edges };
|
|
112
|
+
}
|
|
113
|
+
case 'handoff': {
|
|
114
|
+
// Chain with explicit handoff: each agent passes to the next.
|
|
115
|
+
const order = this.resolvePipelineOrder(config, names);
|
|
116
|
+
for (let i = 0; i < order.length; i++) {
|
|
117
|
+
edges.set(order[i], i < order.length - 1 ? [order[i + 1]] : []);
|
|
118
|
+
}
|
|
119
|
+
return { pattern: p, agents, edges, pipelineOrder: order };
|
|
120
|
+
}
|
|
121
|
+
case 'cascade': {
|
|
122
|
+
// Primary tries first; on failure, falls through to next.
|
|
123
|
+
for (let i = 0; i < names.length; i++) {
|
|
124
|
+
edges.set(names[i], i < names.length - 1 ? [names[i + 1]] : []);
|
|
125
|
+
}
|
|
126
|
+
return { pattern: p, agents, edges, pipelineOrder: names };
|
|
127
|
+
}
|
|
128
|
+
case 'dag': {
|
|
129
|
+
// Edges derived from workflow step dependencies.
|
|
130
|
+
const stepEdges = this.resolveDAGEdges(config);
|
|
131
|
+
for (const n of names) {
|
|
132
|
+
if (!stepEdges.has(n))
|
|
133
|
+
stepEdges.set(n, []);
|
|
134
|
+
}
|
|
135
|
+
return { pattern: p, agents, edges: stepEdges };
|
|
136
|
+
}
|
|
137
|
+
case 'hierarchical': {
|
|
138
|
+
const hub = this.pickHub(agents);
|
|
139
|
+
const subordinates = names.filter((n) => n !== hub);
|
|
140
|
+
edges.set(hub, subordinates);
|
|
141
|
+
for (const s of subordinates)
|
|
142
|
+
edges.set(s, [hub]);
|
|
143
|
+
return { pattern: p, agents, edges, hub };
|
|
144
|
+
}
|
|
145
|
+
default: {
|
|
146
|
+
// Fallback: full mesh.
|
|
147
|
+
for (const n of names) {
|
|
148
|
+
edges.set(n, names.filter((o) => o !== n));
|
|
149
|
+
}
|
|
150
|
+
return { pattern: p, agents, edges };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// ── Lifecycle: create run ───────────────────────────────────────────────
|
|
155
|
+
async createRun(workspaceId, config) {
|
|
156
|
+
const id = `run_${Date.now()}_${randomBytes(4).toString('hex')}`;
|
|
157
|
+
const pattern = this.selectPattern(config);
|
|
158
|
+
const now = new Date().toISOString();
|
|
159
|
+
const { rows } = await this.db.query(`INSERT INTO workflow_runs (id, workspace_id, workflow_name, pattern, status, config, started_at, created_at, updated_at)
|
|
160
|
+
VALUES ($1, $2, $3, $4, 'pending', $5, $6, $6, $6)
|
|
161
|
+
RETURNING *`, [id, workspaceId, config.name, pattern, JSON.stringify(config), now]);
|
|
162
|
+
const run = rows[0];
|
|
163
|
+
this.emit('run:created', run);
|
|
164
|
+
return run;
|
|
165
|
+
}
|
|
166
|
+
// ── Lifecycle: start run ────────────────────────────────────────────────
|
|
167
|
+
async startRun(runId) {
|
|
168
|
+
const now = new Date().toISOString();
|
|
169
|
+
const { rows } = await this.db.query(`UPDATE workflow_runs SET status = 'running', started_at = $2, updated_at = $2
|
|
170
|
+
WHERE id = $1 AND status = 'pending'
|
|
171
|
+
RETURNING *`, [runId, now]);
|
|
172
|
+
if (rows.length === 0) {
|
|
173
|
+
throw new Error(`Run ${runId} not found or not in pending state`);
|
|
174
|
+
}
|
|
175
|
+
const run = rows[0];
|
|
176
|
+
this.emit('run:started', run);
|
|
177
|
+
return run;
|
|
178
|
+
}
|
|
179
|
+
// ── Lifecycle: complete / fail / cancel ─────────────────────────────────
|
|
180
|
+
async completeRun(runId, stateSnapshot) {
|
|
181
|
+
return this.transitionRun(runId, 'completed', undefined, stateSnapshot);
|
|
182
|
+
}
|
|
183
|
+
async failRun(runId, error) {
|
|
184
|
+
return this.transitionRun(runId, 'failed', error);
|
|
185
|
+
}
|
|
186
|
+
async cancelRun(runId) {
|
|
187
|
+
return this.transitionRun(runId, 'cancelled');
|
|
188
|
+
}
|
|
189
|
+
// ── Step management ─────────────────────────────────────────────────────
|
|
190
|
+
async createSteps(runId, config) {
|
|
191
|
+
const workflows = config.workflows ?? [];
|
|
192
|
+
const created = [];
|
|
193
|
+
for (const wf of workflows) {
|
|
194
|
+
for (const step of wf.steps) {
|
|
195
|
+
const id = `step_${Date.now()}_${randomBytes(4).toString('hex')}`;
|
|
196
|
+
const now = new Date().toISOString();
|
|
197
|
+
const { rows } = await this.db.query(`INSERT INTO workflow_steps (id, run_id, step_name, agent_name, status, task, depends_on, created_at, updated_at)
|
|
198
|
+
VALUES ($1, $2, $3, $4, 'pending', $5, $6, $7, $7)
|
|
199
|
+
RETURNING *`, [
|
|
200
|
+
id,
|
|
201
|
+
runId,
|
|
202
|
+
step.name,
|
|
203
|
+
step.agent,
|
|
204
|
+
step.task,
|
|
205
|
+
JSON.stringify(step.dependsOn ?? []),
|
|
206
|
+
now,
|
|
207
|
+
]);
|
|
208
|
+
created.push(rows[0]);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return created;
|
|
212
|
+
}
|
|
213
|
+
async startStep(stepId) {
|
|
214
|
+
const now = new Date().toISOString();
|
|
215
|
+
const { rows } = await this.db.query(`UPDATE workflow_steps SET status = 'running', started_at = $2, updated_at = $2
|
|
216
|
+
WHERE id = $1 AND status = 'pending'
|
|
217
|
+
RETURNING *`, [stepId, now]);
|
|
218
|
+
if (rows.length === 0) {
|
|
219
|
+
throw new Error(`Step ${stepId} not found or not in pending state`);
|
|
220
|
+
}
|
|
221
|
+
const step = rows[0];
|
|
222
|
+
this.emit('step:started', step);
|
|
223
|
+
return step;
|
|
224
|
+
}
|
|
225
|
+
async completeStep(stepId, output) {
|
|
226
|
+
const now = new Date().toISOString();
|
|
227
|
+
const { rows } = await this.db.query(`UPDATE workflow_steps SET status = 'completed', output = $2, completed_at = $3, updated_at = $3
|
|
228
|
+
WHERE id = $1 AND status = 'running'
|
|
229
|
+
RETURNING *`, [stepId, output ?? null, now]);
|
|
230
|
+
if (rows.length === 0) {
|
|
231
|
+
throw new Error(`Step ${stepId} not found or not in running state`);
|
|
232
|
+
}
|
|
233
|
+
const step = rows[0];
|
|
234
|
+
this.emit('step:completed', step);
|
|
235
|
+
return step;
|
|
236
|
+
}
|
|
237
|
+
async failStep(stepId, error) {
|
|
238
|
+
const now = new Date().toISOString();
|
|
239
|
+
const { rows } = await this.db.query(`UPDATE workflow_steps SET status = 'failed', error = $2, completed_at = $3, updated_at = $3
|
|
240
|
+
WHERE id = $1 AND status = 'running'
|
|
241
|
+
RETURNING *`, [stepId, error, now]);
|
|
242
|
+
if (rows.length === 0) {
|
|
243
|
+
throw new Error(`Step ${stepId} not found or not in running state`);
|
|
244
|
+
}
|
|
245
|
+
const step = rows[0];
|
|
246
|
+
this.emit('step:failed', step);
|
|
247
|
+
return step;
|
|
248
|
+
}
|
|
249
|
+
async skipStep(stepId) {
|
|
250
|
+
const now = new Date().toISOString();
|
|
251
|
+
const { rows } = await this.db.query(`UPDATE workflow_steps SET status = 'skipped', completed_at = $2, updated_at = $2
|
|
252
|
+
WHERE id = $1
|
|
253
|
+
RETURNING *`, [stepId, now]);
|
|
254
|
+
if (rows.length === 0) {
|
|
255
|
+
throw new Error(`Step ${stepId} not found`);
|
|
256
|
+
}
|
|
257
|
+
return rows[0];
|
|
258
|
+
}
|
|
259
|
+
// ── Queries ─────────────────────────────────────────────────────────────
|
|
260
|
+
async getRun(runId) {
|
|
261
|
+
const { rows } = await this.db.query(`SELECT * FROM workflow_runs WHERE id = $1`, [runId]);
|
|
262
|
+
return rows[0] ?? null;
|
|
263
|
+
}
|
|
264
|
+
async getSteps(runId) {
|
|
265
|
+
const { rows } = await this.db.query(`SELECT * FROM workflow_steps WHERE run_id = $1 ORDER BY created_at ASC`, [runId]);
|
|
266
|
+
return rows;
|
|
267
|
+
}
|
|
268
|
+
async getReadySteps(runId) {
|
|
269
|
+
const steps = await this.getSteps(runId);
|
|
270
|
+
const completedNames = new Set(steps.filter((s) => s.status === 'completed').map((s) => s.stepName));
|
|
271
|
+
return steps.filter((s) => {
|
|
272
|
+
if (s.status !== 'pending')
|
|
273
|
+
return false;
|
|
274
|
+
const deps = Array.isArray(s.dependsOn) ? s.dependsOn : [];
|
|
275
|
+
return deps.every((d) => completedNames.has(d));
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
async getRunsByWorkspace(workspaceId, status) {
|
|
279
|
+
if (status) {
|
|
280
|
+
const { rows } = await this.db.query(`SELECT * FROM workflow_runs WHERE workspace_id = $1 AND status = $2 ORDER BY created_at DESC`, [workspaceId, status]);
|
|
281
|
+
return rows;
|
|
282
|
+
}
|
|
283
|
+
const { rows } = await this.db.query(`SELECT * FROM workflow_runs WHERE workspace_id = $1 ORDER BY created_at DESC`, [workspaceId]);
|
|
284
|
+
return rows;
|
|
285
|
+
}
|
|
286
|
+
// ── Private helpers ─────────────────────────────────────────────────────
|
|
287
|
+
async transitionRun(runId, status, error, stateSnapshot) {
|
|
288
|
+
const now = new Date().toISOString();
|
|
289
|
+
const { rows } = await this.db.query(`UPDATE workflow_runs
|
|
290
|
+
SET status = $2, completed_at = $3, error = $4, state_snapshot = $5, updated_at = $3
|
|
291
|
+
WHERE id = $1
|
|
292
|
+
RETURNING *`, [
|
|
293
|
+
runId,
|
|
294
|
+
status,
|
|
295
|
+
now,
|
|
296
|
+
error ?? null,
|
|
297
|
+
stateSnapshot ? JSON.stringify(stateSnapshot) : null,
|
|
298
|
+
]);
|
|
299
|
+
if (rows.length === 0) {
|
|
300
|
+
throw new Error(`Run ${runId} not found`);
|
|
301
|
+
}
|
|
302
|
+
const run = rows[0];
|
|
303
|
+
const eventName = `run:${status}`;
|
|
304
|
+
this.emit(eventName, run);
|
|
305
|
+
return run;
|
|
306
|
+
}
|
|
307
|
+
pickHub(agents) {
|
|
308
|
+
const lead = agents.find((a) => a.role === 'lead' || a.role === 'hub' || a.role === 'coordinator');
|
|
309
|
+
return lead?.name ?? agents[0].name;
|
|
310
|
+
}
|
|
311
|
+
resolvePipelineOrder(config, fallback) {
|
|
312
|
+
const workflow = config.workflows?.[0];
|
|
313
|
+
if (!workflow)
|
|
314
|
+
return fallback;
|
|
315
|
+
// Use step order — each step's agent in sequence, deduped.
|
|
316
|
+
const seen = new Set();
|
|
317
|
+
const order = [];
|
|
318
|
+
for (const step of workflow.steps) {
|
|
319
|
+
if (!seen.has(step.agent)) {
|
|
320
|
+
seen.add(step.agent);
|
|
321
|
+
order.push(step.agent);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return order.length > 0 ? order : fallback;
|
|
325
|
+
}
|
|
326
|
+
resolveDAGEdges(config) {
|
|
327
|
+
const edges = new Map();
|
|
328
|
+
const workflows = config.workflows ?? [];
|
|
329
|
+
for (const wf of workflows) {
|
|
330
|
+
// Build step-name → agent-name mapping.
|
|
331
|
+
const stepAgent = new Map();
|
|
332
|
+
for (const step of wf.steps) {
|
|
333
|
+
stepAgent.set(step.name, step.agent);
|
|
334
|
+
}
|
|
335
|
+
for (const step of wf.steps) {
|
|
336
|
+
if (!step.dependsOn?.length)
|
|
337
|
+
continue;
|
|
338
|
+
for (const dep of step.dependsOn) {
|
|
339
|
+
const fromAgent = stepAgent.get(dep);
|
|
340
|
+
if (!fromAgent)
|
|
341
|
+
continue;
|
|
342
|
+
const existing = edges.get(fromAgent) ?? [];
|
|
343
|
+
if (!existing.includes(step.agent)) {
|
|
344
|
+
existing.push(step.agent);
|
|
345
|
+
}
|
|
346
|
+
edges.set(fromAgent, existing);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return edges;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/workflows/coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./runner.js";
|
|
3
|
+
export * from "./memory-db.js";
|
|
4
|
+
export * from "./run.js";
|
|
5
|
+
export * from "./builder.js";
|
|
6
|
+
export * from "./coordinator.js";
|
|
7
|
+
export * from "./barrier.js";
|
|
8
|
+
export * from "./state.js";
|
|
9
|
+
export * from "./templates.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./runner.js";
|
|
3
|
+
export * from "./memory-db.js";
|
|
4
|
+
export * from "./run.js";
|
|
5
|
+
export * from "./builder.js";
|
|
6
|
+
export * from "./coordinator.js";
|
|
7
|
+
export * from "./barrier.js";
|
|
8
|
+
export * from "./state.js";
|
|
9
|
+
export * from "./templates.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { WorkflowRunRow, WorkflowStepRow } from './types.js';
|
|
2
|
+
import type { WorkflowDb } from './runner.js';
|
|
3
|
+
/**
|
|
4
|
+
* In-memory implementation of WorkflowDb for local workflow runs.
|
|
5
|
+
* No persistence — state lives only for the duration of the process.
|
|
6
|
+
*/
|
|
7
|
+
export declare class InMemoryWorkflowDb implements WorkflowDb {
|
|
8
|
+
private runs;
|
|
9
|
+
private steps;
|
|
10
|
+
insertRun(run: WorkflowRunRow): Promise<void>;
|
|
11
|
+
updateRun(id: string, patch: Partial<WorkflowRunRow>): Promise<void>;
|
|
12
|
+
getRun(id: string): Promise<WorkflowRunRow | null>;
|
|
13
|
+
insertStep(step: WorkflowStepRow): Promise<void>;
|
|
14
|
+
updateStep(id: string, patch: Partial<WorkflowStepRow>): Promise<void>;
|
|
15
|
+
getStepsByRunId(runId: string): Promise<WorkflowStepRow[]>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=memory-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-db.d.ts","sourceRoot":"","sources":["../../src/workflows/memory-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,IAAI,CAAqC;IACjD,OAAO,CAAC,KAAK,CAAsC;IAE7C,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAIlD,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAGjE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory implementation of WorkflowDb for local workflow runs.
|
|
3
|
+
* No persistence — state lives only for the duration of the process.
|
|
4
|
+
*/
|
|
5
|
+
export class InMemoryWorkflowDb {
|
|
6
|
+
runs = new Map();
|
|
7
|
+
steps = new Map();
|
|
8
|
+
async insertRun(run) {
|
|
9
|
+
this.runs.set(run.id, { ...run });
|
|
10
|
+
}
|
|
11
|
+
async updateRun(id, patch) {
|
|
12
|
+
const existing = this.runs.get(id);
|
|
13
|
+
if (!existing)
|
|
14
|
+
return;
|
|
15
|
+
this.runs.set(id, { ...existing, ...patch, updatedAt: new Date().toISOString() });
|
|
16
|
+
}
|
|
17
|
+
async getRun(id) {
|
|
18
|
+
return this.runs.get(id) ?? null;
|
|
19
|
+
}
|
|
20
|
+
async insertStep(step) {
|
|
21
|
+
this.steps.set(step.id, { ...step });
|
|
22
|
+
}
|
|
23
|
+
async updateStep(id, patch) {
|
|
24
|
+
const existing = this.steps.get(id);
|
|
25
|
+
if (!existing)
|
|
26
|
+
return;
|
|
27
|
+
this.steps.set(id, { ...existing, ...patch, updatedAt: new Date().toISOString() });
|
|
28
|
+
}
|
|
29
|
+
async getStepsByRunId(runId) {
|
|
30
|
+
return Array.from(this.steps.values()).filter((s) => s.runId === runId);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=memory-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../../src/workflows/memory-db.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACrB,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;IACzC,KAAK,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,KAAK,CAAC,SAAS,CAAC,GAAmB;QACjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU,EAAE,KAA8B;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAqB;QACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,KAA+B;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa;QACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAC1E,CAAC;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AgentRelayOptions } from '../relay.js';
|
|
2
|
+
import type { WorkflowRunRow } from './types.js';
|
|
3
|
+
import { type WorkflowEventListener, type VariableContext } from './runner.js';
|
|
4
|
+
/**
|
|
5
|
+
* Options for the `runWorkflow` convenience function.
|
|
6
|
+
*/
|
|
7
|
+
export interface RunWorkflowOptions {
|
|
8
|
+
/** Workflow name within the YAML file. Defaults to the first workflow. */
|
|
9
|
+
workflow?: string;
|
|
10
|
+
/** Template variable substitutions for {{variable}} placeholders. */
|
|
11
|
+
vars?: VariableContext;
|
|
12
|
+
/** Working directory. Defaults to process.cwd(). */
|
|
13
|
+
cwd?: string;
|
|
14
|
+
/** AgentRelay options (all optional — broker starts automatically). */
|
|
15
|
+
relay?: AgentRelayOptions;
|
|
16
|
+
/** Progress callback for workflow events. */
|
|
17
|
+
onEvent?: WorkflowEventListener;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Run a workflow from a relay.yaml file with zero configuration.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* import { runWorkflow } from "@agent-relay/broker-sdk/workflows";
|
|
25
|
+
*
|
|
26
|
+
* const result = await runWorkflow("workflows/daytona-migration.yaml");
|
|
27
|
+
* console.log(result.status); // "completed" | "failed"
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function runWorkflow(yamlPath: string, options?: RunWorkflowOptions): Promise<WorkflowRunRow>;
|
|
31
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/workflows/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAkB,KAAK,qBAAqB,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE/F;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,oDAAoD;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,cAAc,CAAC,CAYzB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { WorkflowRunner } from './runner.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run a workflow from a relay.yaml file with zero configuration.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* import { runWorkflow } from "@agent-relay/broker-sdk/workflows";
|
|
8
|
+
*
|
|
9
|
+
* const result = await runWorkflow("workflows/daytona-migration.yaml");
|
|
10
|
+
* console.log(result.status); // "completed" | "failed"
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export async function runWorkflow(yamlPath, options = {}) {
|
|
14
|
+
const runner = new WorkflowRunner({
|
|
15
|
+
cwd: options.cwd,
|
|
16
|
+
relay: options.relay,
|
|
17
|
+
});
|
|
18
|
+
if (options.onEvent) {
|
|
19
|
+
runner.on(options.onEvent);
|
|
20
|
+
}
|
|
21
|
+
const config = await runner.parseYamlFile(yamlPath);
|
|
22
|
+
return runner.execute(config, options.workflow, options.vars);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/workflows/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAoD,MAAM,aAAa,CAAC;AAkB/F;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,UAA8B,EAAE;IAEhC,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkflowRunner — parses relay.yaml, validates config, resolves templates,
|
|
3
|
+
* executes steps (sequential/parallel/DAG), runs verification checks,
|
|
4
|
+
* persists state to DB, and supports pause/resume/abort with retries.
|
|
5
|
+
*/
|
|
6
|
+
import type { RelayYamlConfig, WorkflowRunRow, WorkflowStepRow } from './types.js';
|
|
7
|
+
import type { AgentRelayOptions } from '../relay.js';
|
|
8
|
+
/** Minimal DB adapter so the runner is not coupled to a specific driver. */
|
|
9
|
+
export interface WorkflowDb {
|
|
10
|
+
insertRun(run: WorkflowRunRow): Promise<void>;
|
|
11
|
+
updateRun(id: string, patch: Partial<WorkflowRunRow>): Promise<void>;
|
|
12
|
+
getRun(id: string): Promise<WorkflowRunRow | null>;
|
|
13
|
+
insertStep(step: WorkflowStepRow): Promise<void>;
|
|
14
|
+
updateStep(id: string, patch: Partial<WorkflowStepRow>): Promise<void>;
|
|
15
|
+
getStepsByRunId(runId: string): Promise<WorkflowStepRow[]>;
|
|
16
|
+
}
|
|
17
|
+
export type WorkflowEvent = {
|
|
18
|
+
type: 'run:started';
|
|
19
|
+
runId: string;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'run:completed';
|
|
22
|
+
runId: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'run:failed';
|
|
25
|
+
runId: string;
|
|
26
|
+
error: string;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'run:cancelled';
|
|
29
|
+
runId: string;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'step:started';
|
|
32
|
+
runId: string;
|
|
33
|
+
stepName: string;
|
|
34
|
+
} | {
|
|
35
|
+
type: 'step:completed';
|
|
36
|
+
runId: string;
|
|
37
|
+
stepName: string;
|
|
38
|
+
output?: string;
|
|
39
|
+
} | {
|
|
40
|
+
type: 'step:failed';
|
|
41
|
+
runId: string;
|
|
42
|
+
stepName: string;
|
|
43
|
+
error: string;
|
|
44
|
+
} | {
|
|
45
|
+
type: 'step:skipped';
|
|
46
|
+
runId: string;
|
|
47
|
+
stepName: string;
|
|
48
|
+
} | {
|
|
49
|
+
type: 'step:retrying';
|
|
50
|
+
runId: string;
|
|
51
|
+
stepName: string;
|
|
52
|
+
attempt: number;
|
|
53
|
+
};
|
|
54
|
+
export type WorkflowEventListener = (event: WorkflowEvent) => void;
|
|
55
|
+
export interface WorkflowRunnerOptions {
|
|
56
|
+
db?: WorkflowDb;
|
|
57
|
+
workspaceId?: string;
|
|
58
|
+
relay?: AgentRelayOptions;
|
|
59
|
+
cwd?: string;
|
|
60
|
+
summaryDir?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface VariableContext {
|
|
63
|
+
[key: string]: string | number | boolean | undefined;
|
|
64
|
+
}
|
|
65
|
+
export declare class WorkflowRunner {
|
|
66
|
+
private readonly db;
|
|
67
|
+
private readonly workspaceId;
|
|
68
|
+
private readonly relayOptions;
|
|
69
|
+
private readonly cwd;
|
|
70
|
+
private readonly summaryDir;
|
|
71
|
+
private relay?;
|
|
72
|
+
private abortController?;
|
|
73
|
+
private paused;
|
|
74
|
+
private pauseResolver?;
|
|
75
|
+
private listeners;
|
|
76
|
+
constructor(options?: WorkflowRunnerOptions);
|
|
77
|
+
on(listener: WorkflowEventListener): () => void;
|
|
78
|
+
private emit;
|
|
79
|
+
/** Parse a relay.yaml file from disk. */
|
|
80
|
+
parseYamlFile(filePath: string): Promise<RelayYamlConfig>;
|
|
81
|
+
/** Parse a relay.yaml string. */
|
|
82
|
+
parseYamlString(raw: string, source?: string): RelayYamlConfig;
|
|
83
|
+
/** Validate a config object against the RelayYamlConfig shape. */
|
|
84
|
+
validateConfig(config: unknown, source?: string): asserts config is RelayYamlConfig;
|
|
85
|
+
private validateWorkflow;
|
|
86
|
+
private detectCycles;
|
|
87
|
+
/** Resolve {{variable}} placeholders in all task strings. */
|
|
88
|
+
resolveVariables(config: RelayYamlConfig, vars: VariableContext): RelayYamlConfig;
|
|
89
|
+
private interpolate;
|
|
90
|
+
private resolveDotPath;
|
|
91
|
+
/** Build a nested context from completed step outputs for {{steps.X.output}} resolution. */
|
|
92
|
+
private buildStepOutputContext;
|
|
93
|
+
/** Interpolate step-output variables, silently skipping unresolved ones (they may be user vars). */
|
|
94
|
+
private interpolateStepTask;
|
|
95
|
+
/** Execute a named workflow from a validated config. */
|
|
96
|
+
execute(config: RelayYamlConfig, workflowName?: string, vars?: VariableContext): Promise<WorkflowRunRow>;
|
|
97
|
+
/** Resume a previously paused or partially completed run. */
|
|
98
|
+
resume(runId: string, vars?: VariableContext): Promise<WorkflowRunRow>;
|
|
99
|
+
/** Pause execution. Currently-running steps will finish but no new steps start. */
|
|
100
|
+
pause(): void;
|
|
101
|
+
/** Resume after a pause(). */
|
|
102
|
+
unpause(): void;
|
|
103
|
+
/** Abort the current run. Running agents are released. */
|
|
104
|
+
abort(): void;
|
|
105
|
+
private executeSteps;
|
|
106
|
+
private findReadySteps;
|
|
107
|
+
private executeStep;
|
|
108
|
+
private spawnAndWait;
|
|
109
|
+
private runVerification;
|
|
110
|
+
private updateRunStatus;
|
|
111
|
+
private markStepFailed;
|
|
112
|
+
private markDownstreamSkipped;
|
|
113
|
+
private checkAborted;
|
|
114
|
+
private waitIfPaused;
|
|
115
|
+
private delay;
|
|
116
|
+
private generateId;
|
|
117
|
+
private generateShortId;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=runner.d.ts.map
|