@agent-relay/sdk 2.3.14 → 2.4.0
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 +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 +416 -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,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrier Manager — synchronization barriers with all/any/majority semantics.
|
|
3
|
+
*
|
|
4
|
+
* Barriers gate downstream workflow steps until a set of upstream agents
|
|
5
|
+
* or steps have resolved. Supports three resolution modes:
|
|
6
|
+
*
|
|
7
|
+
* - **all** — every agent in `waitFor` must resolve (default)
|
|
8
|
+
* - **any** — at least one agent resolves
|
|
9
|
+
* - **majority** — more than half of `waitFor` must resolve
|
|
10
|
+
*/
|
|
11
|
+
import { EventEmitter } from 'node:events';
|
|
12
|
+
import type { DbClient } from './coordinator.js';
|
|
13
|
+
export type BarrierMode = 'all' | 'any' | 'majority';
|
|
14
|
+
export interface BarrierDefinition {
|
|
15
|
+
name: string;
|
|
16
|
+
waitFor: string[];
|
|
17
|
+
mode?: BarrierMode;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface BarrierRow {
|
|
21
|
+
id: string;
|
|
22
|
+
runId: string;
|
|
23
|
+
barrierName: string;
|
|
24
|
+
waitFor: string[];
|
|
25
|
+
resolved: string[];
|
|
26
|
+
isSatisfied: boolean;
|
|
27
|
+
timeoutMs: number | null;
|
|
28
|
+
createdAt: string;
|
|
29
|
+
updatedAt: string;
|
|
30
|
+
}
|
|
31
|
+
export interface BarrierManagerEvents {
|
|
32
|
+
'barrier:created': (barrier: BarrierRow) => void;
|
|
33
|
+
'barrier:resolved': (barrierName: string, agent: string) => void;
|
|
34
|
+
'barrier:satisfied': (barrier: BarrierRow) => void;
|
|
35
|
+
'barrier:timeout': (barrier: BarrierRow) => void;
|
|
36
|
+
}
|
|
37
|
+
export declare class BarrierManager extends EventEmitter {
|
|
38
|
+
private db;
|
|
39
|
+
/** In-memory mode tracking (not persisted — set once at creation). */
|
|
40
|
+
private modes;
|
|
41
|
+
private timeoutTimers;
|
|
42
|
+
constructor(db: DbClient);
|
|
43
|
+
/**
|
|
44
|
+
* Create a barrier for a workflow run.
|
|
45
|
+
*/
|
|
46
|
+
createBarrier(runId: string, definition: BarrierDefinition): Promise<BarrierRow>;
|
|
47
|
+
/**
|
|
48
|
+
* Bulk-create barriers from a list of definitions (e.g. from coordination config).
|
|
49
|
+
*/
|
|
50
|
+
createBarriers(runId: string, definitions: BarrierDefinition[]): Promise<BarrierRow[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Mark an agent/step as resolved for a barrier. Returns whether the
|
|
53
|
+
* barrier is now fully satisfied.
|
|
54
|
+
*/
|
|
55
|
+
resolve(runId: string, barrierName: string, agent: string): Promise<{
|
|
56
|
+
satisfied: boolean;
|
|
57
|
+
barrier: BarrierRow;
|
|
58
|
+
}>;
|
|
59
|
+
getBarrier(runId: string, barrierName: string): Promise<BarrierRow | null>;
|
|
60
|
+
getBarriers(runId: string): Promise<BarrierRow[]>;
|
|
61
|
+
getUnsatisfiedBarriers(runId: string): Promise<BarrierRow[]>;
|
|
62
|
+
/**
|
|
63
|
+
* Check if a named barrier is satisfied (useful for gating downstream work).
|
|
64
|
+
*/
|
|
65
|
+
isSatisfied(runId: string, barrierName: string): Promise<boolean>;
|
|
66
|
+
cleanup(): void;
|
|
67
|
+
private checkSatisfied;
|
|
68
|
+
private markSatisfied;
|
|
69
|
+
private scheduleTimeout;
|
|
70
|
+
private clearTimeout;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=barrier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"barrier.d.ts","sourceRoot":"","sources":["../../src/workflows/barrier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IACjD,kBAAkB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,mBAAmB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IACnD,iBAAiB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;CAClD;AAID,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,EAAE,CAAW;IACrB,sEAAsE;IACtE,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,aAAa,CAAoD;gBAE7D,EAAE,EAAE,QAAQ;IAOxB;;OAEG;IACG,aAAa,CACjB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,iBAAiB,GAC5B,OAAO,CAAC,UAAU,CAAC;IA+BtB;;OAEG;IACG,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,iBAAiB,EAAE,GAC/B,OAAO,CAAC,UAAU,EAAE,CAAC;IAUxB;;;OAGG;IACG,OAAO,CACX,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,UAAU,CAAA;KAAE,CAAC;IAsCjD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQ1E,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAQjD,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAQlE;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOvE,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,cAAc;YAcR,aAAa;IAmB3B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,YAAY;CAOrB"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrier Manager — synchronization barriers with all/any/majority semantics.
|
|
3
|
+
*
|
|
4
|
+
* Barriers gate downstream workflow steps until a set of upstream agents
|
|
5
|
+
* or steps have resolved. Supports three resolution modes:
|
|
6
|
+
*
|
|
7
|
+
* - **all** — every agent in `waitFor` must resolve (default)
|
|
8
|
+
* - **any** — at least one agent resolves
|
|
9
|
+
* - **majority** — more than half of `waitFor` must resolve
|
|
10
|
+
*/
|
|
11
|
+
import { randomBytes } from 'node:crypto';
|
|
12
|
+
import { EventEmitter } from 'node:events';
|
|
13
|
+
// ── Manager ─────────────────────────────────────────────────────────────────
|
|
14
|
+
export class BarrierManager extends EventEmitter {
|
|
15
|
+
db;
|
|
16
|
+
/** In-memory mode tracking (not persisted — set once at creation). */
|
|
17
|
+
modes = new Map();
|
|
18
|
+
timeoutTimers = new Map();
|
|
19
|
+
constructor(db) {
|
|
20
|
+
super();
|
|
21
|
+
this.db = db;
|
|
22
|
+
}
|
|
23
|
+
// ── Create ──────────────────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Create a barrier for a workflow run.
|
|
26
|
+
*/
|
|
27
|
+
async createBarrier(runId, definition) {
|
|
28
|
+
const id = `bar_${Date.now()}_${randomBytes(4).toString('hex')}`;
|
|
29
|
+
const now = new Date().toISOString();
|
|
30
|
+
const mode = definition.mode ?? 'all';
|
|
31
|
+
const { rows } = await this.db.query(`INSERT INTO workflow_barriers (id, run_id, barrier_name, wait_for, resolved, is_satisfied, timeout_ms, created_at, updated_at)
|
|
32
|
+
VALUES ($1, $2, $3, $4, '[]'::jsonb, FALSE, $5, $6, $6)
|
|
33
|
+
RETURNING *`, [
|
|
34
|
+
id,
|
|
35
|
+
runId,
|
|
36
|
+
definition.name,
|
|
37
|
+
JSON.stringify(definition.waitFor),
|
|
38
|
+
definition.timeoutMs ?? null,
|
|
39
|
+
now,
|
|
40
|
+
]);
|
|
41
|
+
const barrier = rows[0];
|
|
42
|
+
const key = `${runId}:${definition.name}`;
|
|
43
|
+
this.modes.set(key, mode);
|
|
44
|
+
if (definition.timeoutMs) {
|
|
45
|
+
this.scheduleTimeout(barrier, definition.timeoutMs);
|
|
46
|
+
}
|
|
47
|
+
this.emit('barrier:created', barrier);
|
|
48
|
+
return barrier;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Bulk-create barriers from a list of definitions (e.g. from coordination config).
|
|
52
|
+
*/
|
|
53
|
+
async createBarriers(runId, definitions) {
|
|
54
|
+
const results = [];
|
|
55
|
+
for (const def of definitions) {
|
|
56
|
+
results.push(await this.createBarrier(runId, def));
|
|
57
|
+
}
|
|
58
|
+
return results;
|
|
59
|
+
}
|
|
60
|
+
// ── Resolve ─────────────────────────────────────────────────────────────
|
|
61
|
+
/**
|
|
62
|
+
* Mark an agent/step as resolved for a barrier. Returns whether the
|
|
63
|
+
* barrier is now fully satisfied.
|
|
64
|
+
*/
|
|
65
|
+
async resolve(runId, barrierName, agent) {
|
|
66
|
+
const now = new Date().toISOString();
|
|
67
|
+
// Atomic: append agent to resolved array if not already present.
|
|
68
|
+
const { rows } = await this.db.query(`UPDATE workflow_barriers
|
|
69
|
+
SET resolved = CASE
|
|
70
|
+
WHEN resolved @> $3::jsonb THEN resolved
|
|
71
|
+
ELSE resolved || $3::jsonb
|
|
72
|
+
END,
|
|
73
|
+
updated_at = $4
|
|
74
|
+
WHERE run_id = $1 AND barrier_name = $2 AND is_satisfied = FALSE
|
|
75
|
+
RETURNING *`, [runId, barrierName, JSON.stringify(agent), now]);
|
|
76
|
+
if (rows.length === 0) {
|
|
77
|
+
// Barrier may already be satisfied or not exist.
|
|
78
|
+
const existing = await this.getBarrier(runId, barrierName);
|
|
79
|
+
if (!existing)
|
|
80
|
+
throw new Error(`Barrier ${barrierName} not found for run ${runId}`);
|
|
81
|
+
return { satisfied: existing.isSatisfied, barrier: existing };
|
|
82
|
+
}
|
|
83
|
+
const barrier = rows[0];
|
|
84
|
+
this.emit('barrier:resolved', barrierName, agent);
|
|
85
|
+
const key = `${runId}:${barrierName}`;
|
|
86
|
+
const mode = this.modes.get(key) ?? 'all';
|
|
87
|
+
if (this.checkSatisfied(barrier, mode)) {
|
|
88
|
+
return this.markSatisfied(barrier);
|
|
89
|
+
}
|
|
90
|
+
return { satisfied: false, barrier };
|
|
91
|
+
}
|
|
92
|
+
// ── Queries ─────────────────────────────────────────────────────────────
|
|
93
|
+
async getBarrier(runId, barrierName) {
|
|
94
|
+
const { rows } = await this.db.query(`SELECT * FROM workflow_barriers WHERE run_id = $1 AND barrier_name = $2`, [runId, barrierName]);
|
|
95
|
+
return rows[0] ?? null;
|
|
96
|
+
}
|
|
97
|
+
async getBarriers(runId) {
|
|
98
|
+
const { rows } = await this.db.query(`SELECT * FROM workflow_barriers WHERE run_id = $1 ORDER BY created_at ASC`, [runId]);
|
|
99
|
+
return rows;
|
|
100
|
+
}
|
|
101
|
+
async getUnsatisfiedBarriers(runId) {
|
|
102
|
+
const { rows } = await this.db.query(`SELECT * FROM workflow_barriers WHERE run_id = $1 AND is_satisfied = FALSE ORDER BY created_at ASC`, [runId]);
|
|
103
|
+
return rows;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if a named barrier is satisfied (useful for gating downstream work).
|
|
107
|
+
*/
|
|
108
|
+
async isSatisfied(runId, barrierName) {
|
|
109
|
+
const barrier = await this.getBarrier(runId, barrierName);
|
|
110
|
+
return barrier?.isSatisfied ?? false;
|
|
111
|
+
}
|
|
112
|
+
// ── Cleanup ─────────────────────────────────────────────────────────────
|
|
113
|
+
cleanup() {
|
|
114
|
+
for (const timer of this.timeoutTimers.values())
|
|
115
|
+
clearTimeout(timer);
|
|
116
|
+
this.timeoutTimers.clear();
|
|
117
|
+
this.modes.clear();
|
|
118
|
+
}
|
|
119
|
+
// ── Private ─────────────────────────────────────────────────────────────
|
|
120
|
+
checkSatisfied(barrier, mode) {
|
|
121
|
+
const waitFor = Array.isArray(barrier.waitFor) ? barrier.waitFor : [];
|
|
122
|
+
const resolved = Array.isArray(barrier.resolved) ? barrier.resolved : [];
|
|
123
|
+
switch (mode) {
|
|
124
|
+
case 'all':
|
|
125
|
+
return waitFor.every((w) => resolved.includes(w));
|
|
126
|
+
case 'any':
|
|
127
|
+
return resolved.length > 0;
|
|
128
|
+
case 'majority':
|
|
129
|
+
return resolved.length > waitFor.length / 2;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async markSatisfied(barrier) {
|
|
133
|
+
const now = new Date().toISOString();
|
|
134
|
+
const { rows } = await this.db.query(`UPDATE workflow_barriers SET is_satisfied = TRUE, updated_at = $2
|
|
135
|
+
WHERE id = $1
|
|
136
|
+
RETURNING *`, [barrier.id, now]);
|
|
137
|
+
const updated = rows[0];
|
|
138
|
+
const key = `${barrier.runId}:${barrier.barrierName}`;
|
|
139
|
+
this.clearTimeout(key);
|
|
140
|
+
this.emit('barrier:satisfied', updated);
|
|
141
|
+
return { satisfied: true, barrier: updated };
|
|
142
|
+
}
|
|
143
|
+
scheduleTimeout(barrier, timeoutMs) {
|
|
144
|
+
const key = `${barrier.runId}:${barrier.barrierName}`;
|
|
145
|
+
const timer = setTimeout(async () => {
|
|
146
|
+
const current = await this.getBarrier(barrier.runId, barrier.barrierName);
|
|
147
|
+
if (current && !current.isSatisfied) {
|
|
148
|
+
this.emit('barrier:timeout', current);
|
|
149
|
+
}
|
|
150
|
+
}, timeoutMs);
|
|
151
|
+
timer.unref();
|
|
152
|
+
this.timeoutTimers.set(key, timer);
|
|
153
|
+
}
|
|
154
|
+
clearTimeout(key) {
|
|
155
|
+
const timer = this.timeoutTimers.get(key);
|
|
156
|
+
if (timer) {
|
|
157
|
+
globalThis.clearTimeout(timer);
|
|
158
|
+
this.timeoutTimers.delete(key);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=barrier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"barrier.js","sourceRoot":"","sources":["../../src/workflows/barrier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { AgentRelayOptions } from '../relay.js';
|
|
2
|
+
import type { AgentCli, DryRunReport, IdleNudgeConfig, RelayYamlConfig, SwarmPattern, VerificationCheck, WorkflowRunRow } from './types.js';
|
|
3
|
+
import { type WorkflowEventListener, type VariableContext } from './runner.js';
|
|
4
|
+
export interface AgentOptions {
|
|
5
|
+
cli: AgentCli;
|
|
6
|
+
role?: string;
|
|
7
|
+
task?: string;
|
|
8
|
+
channels?: string[];
|
|
9
|
+
model?: string;
|
|
10
|
+
maxTokens?: number;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
retries?: number;
|
|
13
|
+
/** Seconds of silence before considering the agent idle (for idle nudging). */
|
|
14
|
+
idleThresholdSecs?: number;
|
|
15
|
+
/** When false, the agent runs as a non-interactive subprocess (no PTY, no relay messaging).
|
|
16
|
+
* Default: true. */
|
|
17
|
+
interactive?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface StepOptions {
|
|
20
|
+
agent: string;
|
|
21
|
+
task: string;
|
|
22
|
+
dependsOn?: string[];
|
|
23
|
+
verification?: VerificationCheck;
|
|
24
|
+
timeoutMs?: number;
|
|
25
|
+
retries?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface ErrorOptions {
|
|
28
|
+
maxRetries?: number;
|
|
29
|
+
retryDelayMs?: number;
|
|
30
|
+
notifyChannel?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface WorkflowRunOptions {
|
|
33
|
+
/** Run a specific workflow by name (default: first). */
|
|
34
|
+
workflow?: string;
|
|
35
|
+
/** Template variable substitutions. */
|
|
36
|
+
vars?: VariableContext;
|
|
37
|
+
/** Working directory (default: process.cwd()). */
|
|
38
|
+
cwd?: string;
|
|
39
|
+
/** AgentRelay options (all optional). */
|
|
40
|
+
relay?: AgentRelayOptions;
|
|
41
|
+
/** Progress callback. */
|
|
42
|
+
onEvent?: WorkflowEventListener;
|
|
43
|
+
/** Validate and print execution plan without spawning agents. */
|
|
44
|
+
dryRun?: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Fluent builder for constructing workflow configurations programmatically.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* import { workflow } from "@agent-relay/sdk/workflows";
|
|
52
|
+
*
|
|
53
|
+
* const result = await workflow("my-workflow")
|
|
54
|
+
* .pattern("dag")
|
|
55
|
+
* .agent("worker", { cli: "claude", role: "Backend engineer" })
|
|
56
|
+
* .step("build", { agent: "worker", task: "Build the project" })
|
|
57
|
+
* .step("test", { agent: "worker", task: "Run tests", dependsOn: ["build"] })
|
|
58
|
+
* .run();
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare class WorkflowBuilder {
|
|
62
|
+
private _name;
|
|
63
|
+
private _description?;
|
|
64
|
+
private _pattern;
|
|
65
|
+
private _maxConcurrency?;
|
|
66
|
+
private _timeoutMs?;
|
|
67
|
+
private _channel?;
|
|
68
|
+
private _idleNudge?;
|
|
69
|
+
private _agents;
|
|
70
|
+
private _steps;
|
|
71
|
+
private _errorHandling?;
|
|
72
|
+
constructor(name: string);
|
|
73
|
+
/** Set workflow description. */
|
|
74
|
+
description(desc: string): this;
|
|
75
|
+
/** Set swarm pattern (default: "dag"). */
|
|
76
|
+
pattern(p: SwarmPattern): this;
|
|
77
|
+
/** Set maximum concurrent agents. */
|
|
78
|
+
maxConcurrency(n: number): this;
|
|
79
|
+
/** Set global timeout in milliseconds. */
|
|
80
|
+
timeout(ms: number): this;
|
|
81
|
+
/** Set the relay channel for agent communication. */
|
|
82
|
+
channel(ch: string): this;
|
|
83
|
+
/** Configure idle agent detection and nudging for interactive agents. */
|
|
84
|
+
idleNudge(config: IdleNudgeConfig): this;
|
|
85
|
+
/** Add an agent definition. */
|
|
86
|
+
agent(name: string, options: AgentOptions): this;
|
|
87
|
+
/** Add a workflow step. */
|
|
88
|
+
step(name: string, options: StepOptions): this;
|
|
89
|
+
/** Set error handling strategy. */
|
|
90
|
+
onError(strategy: 'fail-fast' | 'continue' | 'retry', options?: ErrorOptions): this;
|
|
91
|
+
/** Build and return the RelayYamlConfig object. */
|
|
92
|
+
toConfig(): RelayYamlConfig;
|
|
93
|
+
/** Serialize the config to a YAML string. */
|
|
94
|
+
toYaml(): string;
|
|
95
|
+
/** Build the config and execute it with the WorkflowRunner. */
|
|
96
|
+
run(options: WorkflowRunOptions & {
|
|
97
|
+
dryRun: true;
|
|
98
|
+
}): Promise<DryRunReport>;
|
|
99
|
+
run(options?: WorkflowRunOptions): Promise<WorkflowRunRow>;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create a new workflow builder.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const result = await workflow("my-task")
|
|
107
|
+
* .pattern("fan-out")
|
|
108
|
+
* .agent("worker", { cli: "claude" })
|
|
109
|
+
* .step("do-work", { agent: "worker", task: "Build the feature" })
|
|
110
|
+
* .run();
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export declare function workflow(name: string): WorkflowBuilder;
|
|
114
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/workflows/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { stringify as stringifyYaml } from 'yaml';
|
|
2
|
+
import { WorkflowRunner } from './runner.js';
|
|
3
|
+
import { formatDryRunReport } from './dry-run-format.js';
|
|
4
|
+
// ── WorkflowBuilder ─────────────────────────────────────────────────────────
|
|
5
|
+
/**
|
|
6
|
+
* Fluent builder for constructing workflow configurations programmatically.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { workflow } from "@agent-relay/sdk/workflows";
|
|
11
|
+
*
|
|
12
|
+
* const result = await workflow("my-workflow")
|
|
13
|
+
* .pattern("dag")
|
|
14
|
+
* .agent("worker", { cli: "claude", role: "Backend engineer" })
|
|
15
|
+
* .step("build", { agent: "worker", task: "Build the project" })
|
|
16
|
+
* .step("test", { agent: "worker", task: "Run tests", dependsOn: ["build"] })
|
|
17
|
+
* .run();
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export class WorkflowBuilder {
|
|
21
|
+
_name;
|
|
22
|
+
_description;
|
|
23
|
+
_pattern = 'dag';
|
|
24
|
+
_maxConcurrency;
|
|
25
|
+
_timeoutMs;
|
|
26
|
+
_channel;
|
|
27
|
+
_idleNudge;
|
|
28
|
+
_agents = [];
|
|
29
|
+
_steps = [];
|
|
30
|
+
_errorHandling;
|
|
31
|
+
constructor(name) {
|
|
32
|
+
this._name = name;
|
|
33
|
+
}
|
|
34
|
+
/** Set workflow description. */
|
|
35
|
+
description(desc) {
|
|
36
|
+
this._description = desc;
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
/** Set swarm pattern (default: "dag"). */
|
|
40
|
+
pattern(p) {
|
|
41
|
+
this._pattern = p;
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
/** Set maximum concurrent agents. */
|
|
45
|
+
maxConcurrency(n) {
|
|
46
|
+
this._maxConcurrency = n;
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
/** Set global timeout in milliseconds. */
|
|
50
|
+
timeout(ms) {
|
|
51
|
+
this._timeoutMs = ms;
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
/** Set the relay channel for agent communication. */
|
|
55
|
+
channel(ch) {
|
|
56
|
+
this._channel = ch;
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
/** Configure idle agent detection and nudging for interactive agents. */
|
|
60
|
+
idleNudge(config) {
|
|
61
|
+
this._idleNudge = config;
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
/** Add an agent definition. */
|
|
65
|
+
agent(name, options) {
|
|
66
|
+
const def = {
|
|
67
|
+
name,
|
|
68
|
+
cli: options.cli,
|
|
69
|
+
};
|
|
70
|
+
if (options.role !== undefined)
|
|
71
|
+
def.role = options.role;
|
|
72
|
+
if (options.task !== undefined)
|
|
73
|
+
def.task = options.task;
|
|
74
|
+
if (options.channels !== undefined)
|
|
75
|
+
def.channels = options.channels;
|
|
76
|
+
if (options.interactive !== undefined)
|
|
77
|
+
def.interactive = options.interactive;
|
|
78
|
+
if (options.model !== undefined ||
|
|
79
|
+
options.maxTokens !== undefined ||
|
|
80
|
+
options.timeoutMs !== undefined ||
|
|
81
|
+
options.retries !== undefined ||
|
|
82
|
+
options.idleThresholdSecs !== undefined) {
|
|
83
|
+
def.constraints = {};
|
|
84
|
+
if (options.model !== undefined)
|
|
85
|
+
def.constraints.model = options.model;
|
|
86
|
+
if (options.maxTokens !== undefined)
|
|
87
|
+
def.constraints.maxTokens = options.maxTokens;
|
|
88
|
+
if (options.timeoutMs !== undefined)
|
|
89
|
+
def.constraints.timeoutMs = options.timeoutMs;
|
|
90
|
+
if (options.retries !== undefined)
|
|
91
|
+
def.constraints.retries = options.retries;
|
|
92
|
+
if (options.idleThresholdSecs !== undefined)
|
|
93
|
+
def.constraints.idleThresholdSecs = options.idleThresholdSecs;
|
|
94
|
+
}
|
|
95
|
+
this._agents.push(def);
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
98
|
+
/** Add a workflow step. */
|
|
99
|
+
step(name, options) {
|
|
100
|
+
const step = {
|
|
101
|
+
name,
|
|
102
|
+
agent: options.agent,
|
|
103
|
+
task: options.task,
|
|
104
|
+
};
|
|
105
|
+
if (options.dependsOn !== undefined)
|
|
106
|
+
step.dependsOn = options.dependsOn;
|
|
107
|
+
if (options.verification !== undefined)
|
|
108
|
+
step.verification = options.verification;
|
|
109
|
+
if (options.timeoutMs !== undefined)
|
|
110
|
+
step.timeoutMs = options.timeoutMs;
|
|
111
|
+
if (options.retries !== undefined)
|
|
112
|
+
step.retries = options.retries;
|
|
113
|
+
this._steps.push(step);
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
/** Set error handling strategy. */
|
|
117
|
+
onError(strategy, options) {
|
|
118
|
+
this._errorHandling = { strategy };
|
|
119
|
+
if (options?.maxRetries !== undefined)
|
|
120
|
+
this._errorHandling.maxRetries = options.maxRetries;
|
|
121
|
+
if (options?.retryDelayMs !== undefined)
|
|
122
|
+
this._errorHandling.retryDelayMs = options.retryDelayMs;
|
|
123
|
+
if (options?.notifyChannel !== undefined)
|
|
124
|
+
this._errorHandling.notifyChannel = options.notifyChannel;
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
/** Build and return the RelayYamlConfig object. */
|
|
128
|
+
toConfig() {
|
|
129
|
+
if (this._agents.length === 0) {
|
|
130
|
+
throw new Error('Workflow must have at least one agent');
|
|
131
|
+
}
|
|
132
|
+
if (this._steps.length === 0) {
|
|
133
|
+
throw new Error('Workflow must have at least one step');
|
|
134
|
+
}
|
|
135
|
+
const wfDef = {
|
|
136
|
+
name: `${this._name}-workflow`,
|
|
137
|
+
steps: [...this._steps],
|
|
138
|
+
};
|
|
139
|
+
const config = {
|
|
140
|
+
version: '1.0',
|
|
141
|
+
name: this._name,
|
|
142
|
+
swarm: {
|
|
143
|
+
pattern: this._pattern,
|
|
144
|
+
},
|
|
145
|
+
agents: [...this._agents],
|
|
146
|
+
workflows: [wfDef],
|
|
147
|
+
};
|
|
148
|
+
if (this._description !== undefined)
|
|
149
|
+
config.description = this._description;
|
|
150
|
+
if (this._maxConcurrency !== undefined)
|
|
151
|
+
config.swarm.maxConcurrency = this._maxConcurrency;
|
|
152
|
+
if (this._timeoutMs !== undefined)
|
|
153
|
+
config.swarm.timeoutMs = this._timeoutMs;
|
|
154
|
+
if (this._channel !== undefined)
|
|
155
|
+
config.swarm.channel = this._channel;
|
|
156
|
+
if (this._idleNudge !== undefined)
|
|
157
|
+
config.swarm.idleNudge = this._idleNudge;
|
|
158
|
+
if (this._errorHandling !== undefined)
|
|
159
|
+
config.errorHandling = this._errorHandling;
|
|
160
|
+
return config;
|
|
161
|
+
}
|
|
162
|
+
/** Serialize the config to a YAML string. */
|
|
163
|
+
toYaml() {
|
|
164
|
+
return stringifyYaml(this.toConfig());
|
|
165
|
+
}
|
|
166
|
+
async run(options = {}) {
|
|
167
|
+
const config = this.toConfig();
|
|
168
|
+
const runner = new WorkflowRunner({
|
|
169
|
+
cwd: options.cwd,
|
|
170
|
+
relay: options.relay,
|
|
171
|
+
});
|
|
172
|
+
// Auto-detect DRY_RUN env var so existing scripts get dry-run for free
|
|
173
|
+
const isDryRun = options.dryRun ?? !!process.env.DRY_RUN;
|
|
174
|
+
if (isDryRun) {
|
|
175
|
+
const report = runner.dryRun(config, options.workflow, options.vars);
|
|
176
|
+
console.log(formatDryRunReport(report));
|
|
177
|
+
return report;
|
|
178
|
+
}
|
|
179
|
+
if (options.onEvent) {
|
|
180
|
+
runner.on(options.onEvent);
|
|
181
|
+
}
|
|
182
|
+
return runner.execute(config, options.workflow, options.vars);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// ── Entry point ─────────────────────────────────────────────────────────────
|
|
186
|
+
/**
|
|
187
|
+
* Create a new workflow builder.
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```typescript
|
|
191
|
+
* const result = await workflow("my-task")
|
|
192
|
+
* .pattern("fan-out")
|
|
193
|
+
* .agent("worker", { cli: "claude" })
|
|
194
|
+
* .step("do-work", { agent: "worker", task: "Build the feature" })
|
|
195
|
+
* .run();
|
|
196
|
+
* ```
|
|
197
|
+
*/
|
|
198
|
+
export function workflow(name) {
|
|
199
|
+
return new WorkflowBuilder(name);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/workflows/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/workflows/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
|