@agent-relay/sdk 2.3.13 → 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.
Files changed (179) hide show
  1. package/README.md +68 -838
  2. package/bin/agent-relay-broker +0 -0
  3. package/dist/__tests__/contract-fixtures.test.d.ts +2 -0
  4. package/dist/__tests__/contract-fixtures.test.d.ts.map +1 -0
  5. package/dist/__tests__/contract-fixtures.test.js +85 -0
  6. package/dist/__tests__/contract-fixtures.test.js.map +1 -0
  7. package/dist/__tests__/facade.test.d.ts +2 -0
  8. package/dist/__tests__/facade.test.d.ts.map +1 -0
  9. package/dist/__tests__/facade.test.js +305 -0
  10. package/dist/__tests__/facade.test.js.map +1 -0
  11. package/dist/__tests__/integration.test.d.ts +2 -0
  12. package/dist/__tests__/integration.test.d.ts.map +1 -0
  13. package/dist/__tests__/integration.test.js +169 -0
  14. package/dist/__tests__/integration.test.js.map +1 -0
  15. package/dist/__tests__/pty.test.d.ts +2 -0
  16. package/dist/__tests__/pty.test.d.ts.map +1 -0
  17. package/dist/__tests__/pty.test.js +20 -0
  18. package/dist/__tests__/pty.test.js.map +1 -0
  19. package/dist/__tests__/quickstart.test.d.ts +2 -0
  20. package/dist/__tests__/quickstart.test.d.ts.map +1 -0
  21. package/dist/__tests__/quickstart.test.js +176 -0
  22. package/dist/__tests__/quickstart.test.js.map +1 -0
  23. package/dist/__tests__/spawn-from-env.test.d.ts +2 -0
  24. package/dist/__tests__/spawn-from-env.test.d.ts.map +1 -0
  25. package/dist/__tests__/spawn-from-env.test.js +206 -0
  26. package/dist/__tests__/spawn-from-env.test.js.map +1 -0
  27. package/dist/__tests__/unit.test.d.ts +2 -0
  28. package/dist/__tests__/unit.test.d.ts.map +1 -0
  29. package/dist/__tests__/unit.test.js +347 -0
  30. package/dist/__tests__/unit.test.js.map +1 -0
  31. package/dist/browser.d.ts +16 -0
  32. package/dist/browser.d.ts.map +1 -0
  33. package/dist/browser.js +19 -0
  34. package/dist/browser.js.map +1 -0
  35. package/dist/client.d.ts +140 -526
  36. package/dist/client.d.ts.map +1 -1
  37. package/dist/client.js +416 -1509
  38. package/dist/client.js.map +1 -1
  39. package/dist/consensus-helpers.d.ts +103 -0
  40. package/dist/consensus-helpers.d.ts.map +1 -0
  41. package/dist/consensus-helpers.js +147 -0
  42. package/dist/consensus-helpers.js.map +1 -0
  43. package/dist/consensus.d.ts +72 -0
  44. package/dist/consensus.d.ts.map +1 -0
  45. package/dist/consensus.js +378 -0
  46. package/dist/consensus.js.map +1 -0
  47. package/dist/examples/demo.d.ts +2 -0
  48. package/dist/examples/demo.d.ts.map +1 -0
  49. package/dist/examples/demo.js +63 -0
  50. package/dist/examples/demo.js.map +1 -0
  51. package/dist/examples/example.d.ts +2 -0
  52. package/dist/examples/example.d.ts.map +1 -0
  53. package/dist/examples/example.js +80 -0
  54. package/dist/examples/example.js.map +1 -0
  55. package/dist/examples/quickstart.d.ts +2 -0
  56. package/dist/examples/quickstart.d.ts.map +1 -0
  57. package/dist/examples/quickstart.js +56 -0
  58. package/dist/examples/quickstart.js.map +1 -0
  59. package/dist/examples/ralph-loop.d.ts +2 -0
  60. package/dist/examples/ralph-loop.d.ts.map +1 -0
  61. package/dist/examples/ralph-loop.js +281 -0
  62. package/dist/examples/ralph-loop.js.map +1 -0
  63. package/dist/examples/workflow-superiority.d.ts +32 -0
  64. package/dist/examples/workflow-superiority.d.ts.map +1 -0
  65. package/dist/examples/workflow-superiority.js +1421 -0
  66. package/dist/examples/workflow-superiority.js.map +1 -0
  67. package/dist/index.d.ts +13 -20
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +12 -26
  70. package/dist/index.js.map +1 -1
  71. package/dist/logs.d.ts +70 -25
  72. package/dist/logs.d.ts.map +1 -1
  73. package/dist/logs.js +238 -42
  74. package/dist/logs.js.map +1 -1
  75. package/dist/models.d.ts +9 -0
  76. package/dist/models.d.ts.map +1 -0
  77. package/dist/models.js +17 -0
  78. package/dist/models.js.map +1 -0
  79. package/dist/protocol.d.ts +366 -0
  80. package/dist/protocol.d.ts.map +1 -0
  81. package/dist/protocol.js +2 -0
  82. package/dist/protocol.js.map +1 -0
  83. package/dist/pty.d.ts +8 -0
  84. package/dist/pty.d.ts.map +1 -0
  85. package/dist/pty.js +26 -0
  86. package/dist/pty.js.map +1 -0
  87. package/dist/relay-adapter.d.ts +139 -0
  88. package/dist/relay-adapter.d.ts.map +1 -0
  89. package/dist/relay-adapter.js +210 -0
  90. package/dist/relay-adapter.js.map +1 -0
  91. package/dist/relay.d.ts +304 -0
  92. package/dist/relay.d.ts.map +1 -0
  93. package/dist/relay.js +910 -0
  94. package/dist/relay.js.map +1 -0
  95. package/dist/shadow.d.ts +101 -0
  96. package/dist/shadow.d.ts.map +1 -0
  97. package/dist/shadow.js +174 -0
  98. package/dist/shadow.js.map +1 -0
  99. package/dist/spawn-from-env.d.ts +77 -0
  100. package/dist/spawn-from-env.d.ts.map +1 -0
  101. package/dist/spawn-from-env.js +172 -0
  102. package/dist/spawn-from-env.js.map +1 -0
  103. package/dist/workflows/barrier.d.ts +72 -0
  104. package/dist/workflows/barrier.d.ts.map +1 -0
  105. package/dist/workflows/barrier.js +162 -0
  106. package/dist/workflows/barrier.js.map +1 -0
  107. package/dist/workflows/builder.d.ts +114 -0
  108. package/dist/workflows/builder.d.ts.map +1 -0
  109. package/dist/workflows/builder.js +201 -0
  110. package/dist/workflows/builder.js.map +1 -0
  111. package/dist/workflows/cli.d.ts +11 -0
  112. package/dist/workflows/cli.d.ts.map +1 -0
  113. package/dist/workflows/cli.js +144 -0
  114. package/dist/workflows/cli.js.map +1 -0
  115. package/dist/workflows/coordinator.d.ts +73 -0
  116. package/dist/workflows/coordinator.d.ts.map +1 -0
  117. package/dist/workflows/coordinator.js +647 -0
  118. package/dist/workflows/coordinator.js.map +1 -0
  119. package/dist/workflows/custom-steps.d.ts +73 -0
  120. package/dist/workflows/custom-steps.d.ts.map +1 -0
  121. package/dist/workflows/custom-steps.js +321 -0
  122. package/dist/workflows/custom-steps.js.map +1 -0
  123. package/dist/workflows/dry-run-format.d.ts +6 -0
  124. package/dist/workflows/dry-run-format.d.ts.map +1 -0
  125. package/dist/workflows/dry-run-format.js +68 -0
  126. package/dist/workflows/dry-run-format.js.map +1 -0
  127. package/dist/workflows/file-db.d.ts +33 -0
  128. package/dist/workflows/file-db.d.ts.map +1 -0
  129. package/dist/workflows/file-db.js +108 -0
  130. package/dist/workflows/file-db.js.map +1 -0
  131. package/dist/workflows/index.d.ts +15 -0
  132. package/dist/workflows/index.d.ts.map +1 -0
  133. package/dist/workflows/index.js +15 -0
  134. package/dist/workflows/index.js.map +1 -0
  135. package/dist/workflows/memory-db.d.ts +17 -0
  136. package/dist/workflows/memory-db.d.ts.map +1 -0
  137. package/dist/workflows/memory-db.js +33 -0
  138. package/dist/workflows/memory-db.js.map +1 -0
  139. package/dist/workflows/run.d.ts +38 -0
  140. package/dist/workflows/run.d.ts.map +1 -0
  141. package/dist/workflows/run.js +25 -0
  142. package/dist/workflows/run.js.map +1 -0
  143. package/dist/workflows/runner.d.ts +320 -0
  144. package/dist/workflows/runner.d.ts.map +1 -0
  145. package/dist/workflows/runner.js +2821 -0
  146. package/dist/workflows/runner.js.map +1 -0
  147. package/dist/workflows/state.d.ts +77 -0
  148. package/dist/workflows/state.d.ts.map +1 -0
  149. package/dist/workflows/state.js +140 -0
  150. package/dist/workflows/state.js.map +1 -0
  151. package/dist/workflows/templates.d.ts +47 -0
  152. package/dist/workflows/templates.d.ts.map +1 -0
  153. package/dist/workflows/templates.js +405 -0
  154. package/dist/workflows/templates.js.map +1 -0
  155. package/dist/workflows/trajectory.d.ts +87 -0
  156. package/dist/workflows/trajectory.d.ts.map +1 -0
  157. package/dist/workflows/trajectory.js +441 -0
  158. package/dist/workflows/trajectory.js.map +1 -0
  159. package/dist/workflows/types.d.ts +306 -0
  160. package/dist/workflows/types.d.ts.map +1 -0
  161. package/dist/workflows/types.js +23 -0
  162. package/dist/workflows/types.js.map +1 -0
  163. package/dist/workflows/validator.d.ts +11 -0
  164. package/dist/workflows/validator.d.ts.map +1 -0
  165. package/dist/workflows/validator.js +128 -0
  166. package/dist/workflows/validator.js.map +1 -0
  167. package/package.json +59 -53
  168. package/dist/discovery.d.ts +0 -10
  169. package/dist/discovery.d.ts.map +0 -1
  170. package/dist/discovery.js +0 -22
  171. package/dist/discovery.js.map +0 -1
  172. package/dist/errors.d.ts +0 -9
  173. package/dist/errors.d.ts.map +0 -1
  174. package/dist/errors.js +0 -9
  175. package/dist/errors.js.map +0 -1
  176. package/dist/protocol/index.d.ts +0 -8
  177. package/dist/protocol/index.d.ts.map +0 -1
  178. package/dist/protocol/index.js +0 -8
  179. package/dist/protocol/index.js.map +0 -1
@@ -0,0 +1,306 @@
1
+ /**
2
+ * Workflow Types for Relay Cloud Swarm Patterns
3
+ *
4
+ * Shared TypeScript types for relay.yaml configuration, workflow execution,
5
+ * and database row representations.
6
+ */
7
+ /** Top-level relay.yaml configuration file structure. */
8
+ export interface RelayYamlConfig {
9
+ version: string;
10
+ name: string;
11
+ description?: string;
12
+ swarm: SwarmConfig;
13
+ agents: AgentDefinition[];
14
+ workflows?: WorkflowDefinition[];
15
+ coordination?: CoordinationConfig;
16
+ state?: StateConfig;
17
+ errorHandling?: ErrorHandlingConfig;
18
+ trajectories?: TrajectoryConfig | false;
19
+ }
20
+ /** Configuration for workflow trajectory recording. */
21
+ export interface TrajectoryConfig {
22
+ /** Enable trajectory recording (default: true). */
23
+ enabled?: boolean;
24
+ /** Auto-reflect when barriers resolve (default: true). */
25
+ reflectOnBarriers?: boolean;
26
+ /** Auto-reflect when parallel tracks converge (default: true). */
27
+ reflectOnConverge?: boolean;
28
+ /** Record retry/skip/fail decisions automatically (default: true). */
29
+ autoDecisions?: boolean;
30
+ }
31
+ /** Configuration for idle agent detection and nudging. */
32
+ export interface IdleNudgeConfig {
33
+ /** ms after idle detection before first nudge (default: 120_000 = 2 min). */
34
+ nudgeAfterMs?: number;
35
+ /** ms after nudge before force-release (default: 120_000 = 2 min). */
36
+ escalateAfterMs?: number;
37
+ /** Max nudges before escalation (default: 1). */
38
+ maxNudges?: number;
39
+ }
40
+ /** Swarm-level settings controlling the overall pattern. */
41
+ export interface SwarmConfig {
42
+ pattern: SwarmPattern;
43
+ maxConcurrency?: number;
44
+ timeoutMs?: number;
45
+ channel?: string;
46
+ /** Idle agent detection and nudging configuration for interactive agents. */
47
+ idleNudge?: IdleNudgeConfig;
48
+ }
49
+ export type SwarmPattern = 'fan-out' | 'pipeline' | 'hub-spoke' | 'consensus' | 'mesh' | 'handoff' | 'cascade' | 'dag' | 'debate' | 'hierarchical' | 'map-reduce' | 'scatter-gather' | 'supervisor' | 'reflection' | 'red-team' | 'verifier' | 'auction' | 'escalation' | 'saga' | 'circuit-breaker' | 'blackboard' | 'swarm' | 'competitive' | 'review-loop';
50
+ export type AgentPreset = 'lead' | 'worker' | 'reviewer' | 'analyst';
51
+ /** Definition of an agent participating in a workflow. */
52
+ export interface AgentDefinition {
53
+ name: string;
54
+ cli: AgentCli;
55
+ role?: string;
56
+ task?: string;
57
+ channels?: string[];
58
+ constraints?: AgentConstraints;
59
+ /** When false, the agent runs as a non-interactive subprocess (no PTY, no relay messaging).
60
+ * It receives its task as a CLI prompt argument and returns stdout as output.
61
+ * Default: true (interactive PTY mode). */
62
+ interactive?: boolean;
63
+ /** Working directory for this agent, resolved relative to the YAML file. */
64
+ cwd?: string;
65
+ /** Additional paths the agent needs read/write access to. */
66
+ additionalPaths?: string[];
67
+ /**
68
+ * Role preset that automatically configures interactive mode and injects
69
+ * appropriate task guardrails. Overrides are still accepted.
70
+ * lead → interactive PTY, relay-aware, coordinates workers via channels
71
+ * worker → interactive: false, produces structured output, no sub-agents
72
+ * reviewer → interactive: false, reads artifacts, produces verdict, no sub-agents
73
+ * analyst → interactive: false, reads code/files, writes findings, no sub-agents
74
+ */
75
+ preset?: AgentPreset;
76
+ }
77
+ export type AgentCli = 'claude' | 'codex' | 'gemini' | 'aider' | 'goose' | 'opencode' | 'droid';
78
+ /** Resource and behavioral constraints for an agent. */
79
+ export interface AgentConstraints {
80
+ maxTokens?: number;
81
+ timeoutMs?: number;
82
+ retries?: number;
83
+ model?: string;
84
+ /** Silence duration in seconds before the agent is considered idle (0 = disabled, default: 30). */
85
+ idleThresholdSecs?: number;
86
+ }
87
+ /** Preflight check that runs before any workflow steps. */
88
+ export interface PreflightCheck {
89
+ /** Shell command to execute. */
90
+ command: string;
91
+ /** Fail if output matches this condition: "non-empty", "empty", or a regex pattern. */
92
+ failIf?: 'non-empty' | 'empty' | string;
93
+ /** Succeed only if output matches this condition. */
94
+ successIf?: string;
95
+ /** Human-readable description of what this check validates. */
96
+ description?: string;
97
+ }
98
+ /** A named workflow composed of sequential or parallel steps. */
99
+ export interface WorkflowDefinition {
100
+ name: string;
101
+ description?: string;
102
+ /** Preflight checks that run before any steps. All must pass. */
103
+ preflight?: PreflightCheck[];
104
+ steps: WorkflowStep[];
105
+ onError?: 'fail' | 'skip' | 'retry';
106
+ }
107
+ /** Step type: agent (LLM-powered), deterministic (shell command), or worktree (git worktree setup). */
108
+ export type WorkflowStepType = 'agent' | 'deterministic' | 'worktree';
109
+ /** Parameter definition for a custom step. */
110
+ export interface CustomStepParam {
111
+ /** Parameter name. */
112
+ name: string;
113
+ /** Whether this parameter is required. Default: false. */
114
+ required?: boolean;
115
+ /** Default value if not provided. */
116
+ default?: string;
117
+ /** Human-readable description of the parameter. */
118
+ description?: string;
119
+ }
120
+ /** A reusable custom step definition stored in .relay/steps.yaml. */
121
+ export interface CustomStepDefinition {
122
+ /** Parameters that can be passed when using this step. */
123
+ params?: CustomStepParam[];
124
+ /** Step type: "deterministic" or "worktree". */
125
+ type?: 'deterministic' | 'worktree';
126
+ /** Shell command to execute (for deterministic steps). Supports {{param}} interpolation. */
127
+ command?: string;
128
+ /** Branch name (for worktree steps). Supports {{param}} interpolation. */
129
+ branch?: string;
130
+ /** Base branch (for worktree steps). */
131
+ baseBranch?: string;
132
+ /** Worktree path (for worktree steps). */
133
+ path?: string;
134
+ /** Create branch if missing (for worktree steps). */
135
+ createBranch?: boolean;
136
+ /** Fail if command exit code is non-zero. Default: true. */
137
+ failOnError?: boolean;
138
+ /** Capture stdout as step output. Default: true. */
139
+ captureOutput?: boolean;
140
+ /** Timeout in milliseconds. */
141
+ timeoutMs?: number;
142
+ /** Human-readable description of this step. */
143
+ description?: string;
144
+ }
145
+ /** Configuration file for custom step definitions (.relay/steps.yaml). */
146
+ export interface CustomStepsConfig {
147
+ /** Map of step name to step definition. */
148
+ steps: Record<string, CustomStepDefinition>;
149
+ }
150
+ /**
151
+ * A single step within a workflow.
152
+ *
153
+ * Steps can be either:
154
+ * - Agent steps (type: undefined or "agent"): Spawn an LLM agent to execute a task
155
+ * - Deterministic steps (type: "deterministic"): Execute a shell command
156
+ */
157
+ export interface WorkflowStep {
158
+ /** Unique step name within the workflow. */
159
+ name: string;
160
+ /** Step type: "agent" (default) or "deterministic". */
161
+ type?: WorkflowStepType;
162
+ /** Reference to a custom step definition from .relay/steps.yaml. */
163
+ use?: string;
164
+ /** Step names that must complete before this step runs. */
165
+ dependsOn?: string[];
166
+ /** Timeout in milliseconds. */
167
+ timeoutMs?: number;
168
+ /** Name of the agent to execute this step (required for agent steps). */
169
+ agent?: string;
170
+ /** Task description for the agent (required for agent steps). */
171
+ task?: string;
172
+ /** Verification check to validate step output. */
173
+ verification?: VerificationCheck;
174
+ /** Number of retry attempts on failure. */
175
+ retries?: number;
176
+ /** Maximum iterations for steps that may need to retry (e.g., fix-failures). */
177
+ maxIterations?: number;
178
+ /** Shell command to execute (required for deterministic steps). */
179
+ command?: string;
180
+ /** Fail if command exit code is non-zero. Default: true. */
181
+ failOnError?: boolean;
182
+ /** Capture stdout as step output for downstream steps. Default: true. */
183
+ captureOutput?: boolean;
184
+ /** Branch name for the worktree (required for worktree steps). */
185
+ branch?: string;
186
+ /** Base branch to create the worktree from. Default: HEAD. */
187
+ baseBranch?: string;
188
+ /** Explicit path for the worktree. Default: .worktrees/<step-name>. */
189
+ path?: string;
190
+ /** Create the branch if it doesn't exist. Default: true. */
191
+ createBranch?: boolean;
192
+ }
193
+ /** Type guard: Check if a step is a deterministic (shell command) step. */
194
+ export declare function isDeterministicStep(step: WorkflowStep): boolean;
195
+ /** Type guard: Check if a step is a worktree (git worktree setup) step. */
196
+ export declare function isWorktreeStep(step: WorkflowStep): boolean;
197
+ /** Type guard: Check if a step uses a custom step definition. */
198
+ export declare function isCustomStep(step: WorkflowStep): boolean;
199
+ /** Type guard: Check if a step is an agent (LLM-powered) step. */
200
+ export declare function isAgentStep(step: WorkflowStep): boolean;
201
+ export type AgentWorkflowStep = WorkflowStep;
202
+ export type DeterministicWorkflowStep = WorkflowStep;
203
+ /** Verification check to validate a step's output. */
204
+ export interface VerificationCheck {
205
+ type: 'output_contains' | 'exit_code' | 'file_exists' | 'custom';
206
+ value: string;
207
+ description?: string;
208
+ }
209
+ /** Coordination settings for multi-agent synchronization. */
210
+ export interface CoordinationConfig {
211
+ barriers?: Barrier[];
212
+ votingThreshold?: number;
213
+ consensusStrategy?: 'majority' | 'unanimous' | 'quorum';
214
+ }
215
+ /** A synchronization barrier that gates downstream work. */
216
+ export interface Barrier {
217
+ name: string;
218
+ waitFor: string[];
219
+ timeoutMs?: number;
220
+ }
221
+ /** Shared state configuration for workflows. */
222
+ export interface StateConfig {
223
+ backend: 'memory' | 'redis' | 'database';
224
+ ttlMs?: number;
225
+ namespace?: string;
226
+ }
227
+ /** Global error handling configuration. */
228
+ export interface ErrorHandlingConfig {
229
+ strategy: 'fail-fast' | 'continue' | 'retry';
230
+ maxRetries?: number;
231
+ retryDelayMs?: number;
232
+ notifyChannel?: string;
233
+ }
234
+ /** A single execution wave in a dry-run simulation. */
235
+ export interface DryRunWave {
236
+ wave: number;
237
+ /** Steps in this wave. Agent is undefined for deterministic steps. */
238
+ steps: Array<{
239
+ name: string;
240
+ agent?: string;
241
+ dependsOn: string[];
242
+ }>;
243
+ }
244
+ /** Report produced by a dry-run validation of a workflow config. */
245
+ export interface DryRunReport {
246
+ valid: boolean;
247
+ errors: string[];
248
+ warnings: string[];
249
+ name: string;
250
+ description?: string;
251
+ pattern: string;
252
+ agents: Array<{
253
+ name: string;
254
+ cli: string;
255
+ role?: string;
256
+ cwd?: string;
257
+ stepCount: number;
258
+ }>;
259
+ waves: DryRunWave[];
260
+ totalSteps: number;
261
+ maxConcurrency?: number;
262
+ estimatedWaves: number;
263
+ /** Estimated peak concurrent agents. */
264
+ estimatedPeakConcurrency?: number;
265
+ /** Estimated total agent-steps (counting retries as additional steps). */
266
+ estimatedTotalAgentSteps?: number;
267
+ }
268
+ export type WorkflowRunStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
269
+ /** Database row representing a workflow run. */
270
+ export interface WorkflowRunRow {
271
+ id: string;
272
+ workspaceId: string;
273
+ workflowName: string;
274
+ pattern: SwarmPattern;
275
+ status: WorkflowRunStatus;
276
+ config: RelayYamlConfig;
277
+ stateSnapshot?: Record<string, unknown>;
278
+ startedAt: string;
279
+ completedAt?: string;
280
+ error?: string;
281
+ createdAt: string;
282
+ updatedAt: string;
283
+ }
284
+ export type WorkflowStepStatus = 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
285
+ /** Database row representing a single workflow step execution. */
286
+ export interface WorkflowStepRow {
287
+ id: string;
288
+ runId: string;
289
+ stepName: string;
290
+ /** Agent name for agent steps, null for deterministic/worktree steps. */
291
+ agentName: string | null;
292
+ /** Step type: agent, deterministic, or worktree. */
293
+ stepType: WorkflowStepType;
294
+ status: WorkflowStepStatus;
295
+ /** Task description for agent steps, command for deterministic steps, branch for worktree steps. */
296
+ task: string;
297
+ dependsOn: string[];
298
+ output?: string;
299
+ error?: string;
300
+ startedAt?: string;
301
+ completedAt?: string;
302
+ retryCount: number;
303
+ createdAt: string;
304
+ updatedAt: string;
305
+ }
306
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/workflows/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Workflow Types for Relay Cloud Swarm Patterns
3
+ *
4
+ * Shared TypeScript types for relay.yaml configuration, workflow execution,
5
+ * and database row representations.
6
+ */
7
+ /** Type guard: Check if a step is a deterministic (shell command) step. */
8
+ export function isDeterministicStep(step) {
9
+ return step.type === 'deterministic';
10
+ }
11
+ /** Type guard: Check if a step is a worktree (git worktree setup) step. */
12
+ export function isWorktreeStep(step) {
13
+ return step.type === 'worktree';
14
+ }
15
+ /** Type guard: Check if a step uses a custom step definition. */
16
+ export function isCustomStep(step) {
17
+ return step.use !== undefined;
18
+ }
19
+ /** Type guard: Check if a step is an agent (LLM-powered) step. */
20
+ export function isAgentStep(step) {
21
+ return step.type !== 'deterministic' && step.type !== 'worktree';
22
+ }
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workflows/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuPH,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,IAAkB;IACpD,OAAO,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC;AACvC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,OAAO,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC;AAClC,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC7C,OAAO,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC;AAChC,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,IAAkB;IAC5C,OAAO,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC;AACnE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { RelayYamlConfig } from './types.js';
2
+ export interface ValidationIssue {
3
+ severity: 'error' | 'warning' | 'info';
4
+ code: string;
5
+ message: string;
6
+ fix?: string;
7
+ location?: string;
8
+ }
9
+ export declare function validateWorkflow(config: RelayYamlConfig): ValidationIssue[];
10
+ export declare function formatValidationReport(issues: ValidationIssue[], yamlPath: string): string;
11
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/workflows/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAiC,MAAM,YAAY,CAAC;AAEjF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,EAAE,CAmG3E;AAWD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA8B1F"}
@@ -0,0 +1,128 @@
1
+ export function validateWorkflow(config) {
2
+ const issues = [];
3
+ const agentMap = new Map(config.agents.map((a) => [a.name, a]));
4
+ for (const workflow of config.workflows ?? []) {
5
+ for (const step of workflow.steps ?? []) {
6
+ if (step.type === 'deterministic' || step.type === 'worktree')
7
+ continue;
8
+ if (!step.agent)
9
+ continue;
10
+ const rawDef = agentMap.get(step.agent);
11
+ if (!rawDef) {
12
+ issues.push({
13
+ severity: 'error',
14
+ code: 'UNKNOWN_AGENT',
15
+ message: `Step "${step.name}" references unknown agent "${step.agent}"`,
16
+ location: `step:${step.name}`,
17
+ });
18
+ continue;
19
+ }
20
+ // Resolve preset
21
+ const def = resolveForValidation(rawDef);
22
+ const task = step.task ?? '';
23
+ // Check 1: step chaining on interactive agent
24
+ if (def.interactive !== false && /\{\{steps\.[^}]+\}\}/.test(task)) {
25
+ issues.push({
26
+ severity: 'warning',
27
+ code: 'CHAIN_ON_INTERACTIVE',
28
+ message: `Step "${step.name}" uses {{steps.X.output}} but agent "${step.agent}" is interactive. PTY output includes TUI chrome — step chaining will receive raw terminal output.`,
29
+ fix: `Add \`interactive: false\` to agent "${step.agent}", or use \`preset: worker\` / \`preset: reviewer\`.`,
30
+ location: `step:${step.name}`,
31
+ });
32
+ }
33
+ // Check 2: interactive codex missing /exit in task
34
+ if (def.interactive !== false && def.cli === 'codex' && !task.includes('/exit')) {
35
+ issues.push({
36
+ severity: 'warning',
37
+ code: 'CODEX_NO_EXIT',
38
+ message: `Step "${step.name}" uses interactive codex but the task has no /exit instruction. Interactive codex may hang indefinitely.`,
39
+ fix: `End the task with an explicit /exit example:\n When done, output:\n TASK_COMPLETE\n /exit`,
40
+ location: `step:${step.name}`,
41
+ });
42
+ }
43
+ // Check 3: interactive agent with no sub-agent guardrail on complex tasks
44
+ if (def.interactive !== false &&
45
+ def.cli === 'claude' &&
46
+ task.length > 500 &&
47
+ !task.includes('do not') &&
48
+ !task.includes('Do NOT') &&
49
+ !task.includes('relay_spawn') &&
50
+ !task.includes('add_agent')) {
51
+ issues.push({
52
+ severity: 'info',
53
+ code: 'CLAUDE_NO_SPAWN_GUARD',
54
+ message: `Step "${step.name}" uses interactive claude with a long task. Claude may spontaneously spawn sub-agents via relay MCP tools.`,
55
+ fix: `Add "Do NOT use relay_spawn or add_agent to spawn sub-agents." to the task, or use \`interactive: false\`.`,
56
+ location: `step:${step.name}`,
57
+ });
58
+ }
59
+ // Check 4: non-interactive agent that references relay_send in task
60
+ if (def.interactive === false &&
61
+ (task.includes('relay_send') || task.includes('post_message') || task.includes('check_inbox'))) {
62
+ issues.push({
63
+ severity: 'warning',
64
+ code: 'NONINTERACTIVE_RELAY',
65
+ message: `Step "${step.name}" has \`interactive: false\` but the task mentions relay tools. Non-interactive agents cannot use relay MCP tools.`,
66
+ fix: `Remove relay tool calls from the task, or set the agent to interactive.`,
67
+ location: `step:${step.name}`,
68
+ });
69
+ }
70
+ }
71
+ // Check 5: maxConcurrency vs interactive agent count
72
+ const interactiveSteps = (workflow.steps ?? []).filter((s) => {
73
+ if (s.type === 'deterministic')
74
+ return false;
75
+ const def = agentMap.get(s.agent ?? '');
76
+ return def && resolveForValidation(def).interactive !== false;
77
+ });
78
+ const maxConc = config.swarm.maxConcurrency ?? 10;
79
+ if (interactiveSteps.length > 4 && maxConc > 4) {
80
+ issues.push({
81
+ severity: 'warning',
82
+ code: 'HIGH_CONCURRENCY',
83
+ message: `Workflow "${workflow.name}" has ${interactiveSteps.length} interactive steps with maxConcurrency: ${maxConc}. Spawning many interactive PTY agents simultaneously can saturate the broker and cause spawn timeouts.`,
84
+ fix: `Set \`maxConcurrency: 3\` or lower, or convert implementation agents to \`interactive: false\`.`,
85
+ location: `workflow:${workflow.name}`,
86
+ });
87
+ }
88
+ }
89
+ return issues;
90
+ }
91
+ function resolveForValidation(def) {
92
+ if (!def.preset)
93
+ return def;
94
+ const nonInteractive = ['worker', 'reviewer', 'analyst'];
95
+ if (nonInteractive.includes(def.preset) && def.interactive === undefined) {
96
+ return { ...def, interactive: false };
97
+ }
98
+ return def;
99
+ }
100
+ export function formatValidationReport(issues, yamlPath) {
101
+ const errors = issues.filter((i) => i.severity === 'error');
102
+ const warnings = issues.filter((i) => i.severity === 'warning');
103
+ const infos = issues.filter((i) => i.severity === 'info');
104
+ const lines = [`Validating ${yamlPath}...`, ''];
105
+ if (issues.length === 0) {
106
+ lines.push('No issues found');
107
+ return lines.join('\n');
108
+ }
109
+ const icon = { error: 'ERROR', warning: 'WARN', info: 'INFO' };
110
+ for (const issue of issues) {
111
+ const loc = issue.location ? ` [${issue.location}]` : '';
112
+ lines.push(`${icon[issue.severity]} ${issue.message}${loc}`);
113
+ if (issue.fix) {
114
+ lines.push(` -> ${issue.fix}`);
115
+ }
116
+ lines.push('');
117
+ }
118
+ const summary = [];
119
+ if (errors.length)
120
+ summary.push(`${errors.length} error${errors.length > 1 ? 's' : ''}`);
121
+ if (warnings.length)
122
+ summary.push(`${warnings.length} warning${warnings.length > 1 ? 's' : ''}`);
123
+ if (infos.length)
124
+ summary.push(`${infos.length} info`);
125
+ lines.push(summary.join(', '));
126
+ return lines.join('\n');
127
+ }
128
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/workflows/validator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,82 +1,88 @@
1
1
  {
2
2
  "name": "@agent-relay/sdk",
3
- "version": "2.3.13",
4
- "description": "Lightweight SDK for agent-to-agent communication via Agent Relay",
3
+ "version": "2.4.0",
5
4
  "type": "module",
6
5
  "main": "dist/index.js",
7
6
  "types": "dist/index.d.ts",
8
7
  "exports": {
9
8
  ".": {
10
9
  "types": "./dist/index.d.ts",
11
- "import": "./dist/index.js"
12
- },
13
- "./protocol": {
14
- "types": "./dist/protocol/index.d.ts",
15
- "import": "./dist/protocol/index.js",
16
- "default": "./dist/protocol/index.js"
10
+ "import": "./dist/index.js",
11
+ "default": "./dist/index.js"
17
12
  },
18
13
  "./client": {
19
14
  "types": "./dist/client.d.ts",
20
15
  "import": "./dist/client.js",
21
16
  "default": "./dist/client.js"
22
17
  },
23
- "./discovery": {
24
- "types": "./dist/discovery.d.ts",
25
- "import": "./dist/discovery.js",
26
- "default": "./dist/discovery.js"
18
+ "./protocol": {
19
+ "types": "./dist/protocol.d.ts",
20
+ "import": "./dist/protocol.js",
21
+ "default": "./dist/protocol.js"
22
+ },
23
+ "./relay": {
24
+ "types": "./dist/relay.d.ts",
25
+ "import": "./dist/relay.js",
26
+ "default": "./dist/relay.js"
27
+ },
28
+ "./logs": {
29
+ "types": "./dist/logs.d.ts",
30
+ "import": "./dist/logs.js",
31
+ "default": "./dist/logs.js"
27
32
  },
28
- "./errors": {
29
- "types": "./dist/errors.d.ts",
30
- "import": "./dist/errors.js",
31
- "default": "./dist/errors.js"
33
+ "./consensus": {
34
+ "types": "./dist/consensus.d.ts",
35
+ "import": "./dist/consensus.js",
36
+ "default": "./dist/consensus.js"
37
+ },
38
+ "./shadow": {
39
+ "types": "./dist/shadow.d.ts",
40
+ "import": "./dist/shadow.js",
41
+ "default": "./dist/shadow.js"
42
+ },
43
+ "./browser": {
44
+ "types": "./dist/browser.d.ts",
45
+ "import": "./dist/browser.js",
46
+ "default": "./dist/browser.js"
47
+ },
48
+ "./workflows": {
49
+ "types": "./dist/workflows/index.d.ts",
50
+ "import": "./dist/workflows/index.js",
51
+ "default": "./dist/workflows/index.js"
32
52
  }
33
53
  },
34
54
  "files": [
35
55
  "dist",
36
- "README.md"
37
- ],
38
- "scripts": {
39
- "build": "tsc",
40
- "clean": "rm -rf dist",
41
- "test": "vitest run",
42
- "test:watch": "vitest",
43
- "prepublishOnly": "npm run build"
44
- },
45
- "keywords": [
46
- "agent-relay",
47
- "agent",
48
- "ai",
49
- "communication",
50
- "sdk"
56
+ "bin",
57
+ "README.md",
58
+ "package.json"
51
59
  ],
52
- "author": "Khaliq Gant",
53
- "license": "Apache-2.0",
54
60
  "repository": {
55
61
  "type": "git",
56
62
  "url": "git+https://github.com/AgentWorkforce/relay.git",
57
63
  "directory": "packages/sdk"
58
64
  },
59
- "publishConfig": {
60
- "access": "public"
61
- },
62
- "dependencies": {
63
- "@agent-relay/protocol": "2.3.13",
64
- "@agent-relay/utils": "2.3.13"
65
- },
66
- "engines": {
67
- "node": ">=18.0.0"
68
- },
69
- "peerDependencies": {
70
- "@agent-relay/daemon": "*"
71
- },
72
- "peerDependenciesMeta": {
73
- "@agent-relay/daemon": {
74
- "optional": true
75
- }
65
+ "scripts": {
66
+ "prebuild": "npm --prefix ../config run build",
67
+ "build": "tsc -p tsconfig.build.json",
68
+ "build:full": "tsc -p tsconfig.json && npm run bundle:binary",
69
+ "bundle:binary": "node ./scripts/bundle-agent-relay.mjs",
70
+ "check": "tsc -p tsconfig.json --noEmit",
71
+ "test": "npm run build && node --test dist/__tests__/integration.test.js",
72
+ "test:quickstart": "node --test dist/__tests__/quickstart.test.js",
73
+ "quickstart": "node dist/examples/quickstart.js",
74
+ "demo": "node dist/examples/demo.js",
75
+ "ralph": "node dist/examples/ralph-loop.js",
76
+ "example": "node dist/examples/example.js",
77
+ "prepack": "npm run build:full"
76
78
  },
77
79
  "devDependencies": {
78
- "@types/node": "^22.19.3",
79
- "typescript": "^5.9.3",
80
- "vitest": "^3.0.0"
80
+ "@types/node": "^22.13.10",
81
+ "typescript": "^5.7.3"
82
+ },
83
+ "dependencies": {
84
+ "@agent-relay/config": "2.4.0",
85
+ "@relaycast/sdk": "^0.4.0",
86
+ "yaml": "^2.7.0"
81
87
  }
82
88
  }
@@ -1,10 +0,0 @@
1
- /**
2
- * Socket Discovery & Cloud Workspace Detection
3
- *
4
- * Re-exports all discovery functionality from @agent-relay/utils,
5
- * which is the single source of truth. This module exists so SDK
6
- * consumers can import discovery from either '@agent-relay/sdk'
7
- * or '@agent-relay/sdk/discovery'.
8
- */
9
- export { type CloudWorkspace, type DiscoveryResult, type CloudConnectionOptions, type CloudConnectionInfo, detectCloudWorkspace, isCloudWorkspace, getCloudSocketPath, getCloudOutboxPath, discoverSocket, cloudApiRequest, getWorkspaceStatus, getConnectionInfo, getCloudEnvironmentSummary, discoverAgentName, } from '@agent-relay/utils/discovery';
10
- //# sourceMappingURL=discovery.d.ts.map