agent-relay 3.1.14 → 3.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/index.cjs +126 -11
  2. package/dist/src/cli/commands/core.d.ts +3 -0
  3. package/dist/src/cli/commands/core.d.ts.map +1 -1
  4. package/dist/src/cli/commands/core.js +17 -0
  5. package/dist/src/cli/commands/core.js.map +1 -1
  6. package/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -1
  7. package/dist/src/cli/lib/broker-lifecycle.js +47 -81
  8. package/dist/src/cli/lib/broker-lifecycle.js.map +1 -1
  9. package/dist/src/cli/lib/core-maintenance.js +1 -1
  10. package/dist/src/cli/lib/core-maintenance.js.map +1 -1
  11. package/package.json +8 -8
  12. package/packages/acp-bridge/package.json +2 -2
  13. package/packages/config/package.json +1 -1
  14. package/packages/hooks/package.json +4 -4
  15. package/packages/memory/package.json +2 -2
  16. package/packages/openclaw/README.md +4 -7
  17. package/packages/openclaw/dist/setup.d.ts.map +1 -1
  18. package/packages/openclaw/dist/setup.js +10 -3
  19. package/packages/openclaw/dist/setup.js.map +1 -1
  20. package/packages/openclaw/package.json +2 -2
  21. package/packages/openclaw/skill/SKILL.md +27 -5
  22. package/packages/openclaw/src/setup.ts +10 -3
  23. package/packages/policy/package.json +2 -2
  24. package/packages/sdk/dist/client.d.ts +1 -0
  25. package/packages/sdk/dist/client.d.ts.map +1 -1
  26. package/packages/sdk/dist/client.js +9 -1
  27. package/packages/sdk/dist/client.js.map +1 -1
  28. package/packages/sdk/dist/workflows/runner.d.ts +20 -0
  29. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  30. package/packages/sdk/dist/workflows/runner.js +130 -11
  31. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  32. package/packages/sdk/dist/workflows/types.d.ts +26 -0
  33. package/packages/sdk/dist/workflows/types.d.ts.map +1 -1
  34. package/packages/sdk/dist/workflows/types.js.map +1 -1
  35. package/packages/sdk/package.json +2 -2
  36. package/packages/sdk/src/client.ts +10 -1
  37. package/packages/sdk/src/workflows/runner.ts +158 -11
  38. package/packages/sdk/src/workflows/schema.json +219 -40
  39. package/packages/sdk/src/workflows/types.ts +29 -0
  40. package/packages/sdk-py/pyproject.toml +1 -1
  41. package/packages/sdk-py/src/agent_relay/__init__.py +2 -0
  42. package/packages/sdk-py/src/agent_relay/types.py +33 -0
  43. package/packages/telemetry/package.json +1 -1
  44. package/packages/trajectory/package.json +2 -2
  45. package/packages/user-directory/package.json +2 -2
  46. package/packages/utils/package.json +2 -2
  47. package/bin/agent-relay-broker-linux-arm64 +0 -0
@@ -1,10 +1,17 @@
1
+ Added workdir to AgentWorkflowStep
2
+ Added workdir to DeterministicWorkflowStep
3
+ Added workdir to WorktreeWorkflowStep
1
4
  {
2
5
  "$schema": "http://json-schema.org/draft-07/schema#",
3
6
  "$id": "RelayYamlConfig",
4
7
  "title": "Relay YAML Configuration",
5
8
  "description": "Schema for relay.yaml workflow configuration files",
6
9
  "type": "object",
7
- "required": ["version", "name", "swarm"],
10
+ "required": [
11
+ "version",
12
+ "name",
13
+ "swarm"
14
+ ],
8
15
  "additionalProperties": false,
9
16
  "properties": {
10
17
  "version": {
@@ -19,6 +26,13 @@
19
26
  "type": "string",
20
27
  "description": "Optional description of the configuration"
21
28
  },
29
+ "paths": {
30
+ "type": "array",
31
+ "description": "Named paths to external directories. The primary working directory defaults to cwd. Use this to declare additional directories so the runner can validate them in preflight and agents can reference them via workdir.",
32
+ "items": {
33
+ "$ref": "#/definitions/PathDefinition"
34
+ }
35
+ },
22
36
  "swarm": {
23
37
  "$ref": "#/definitions/SwarmConfig"
24
38
  },
@@ -51,15 +65,46 @@
51
65
  },
52
66
  {
53
67
  "type": "boolean",
54
- "enum": [false]
68
+ "enum": [
69
+ false
70
+ ]
55
71
  }
56
72
  ]
57
73
  }
58
74
  },
59
75
  "definitions": {
76
+ "PathDefinition": {
77
+ "type": "object",
78
+ "required": [
79
+ "name",
80
+ "path"
81
+ ],
82
+ "additionalProperties": false,
83
+ "properties": {
84
+ "name": {
85
+ "type": "string",
86
+ "description": "Unique name used to reference this project (e.g. 'relaycast', 'relay')"
87
+ },
88
+ "path": {
89
+ "type": "string",
90
+ "description": "Path to the project root, resolved relative to the YAML file. Supports env vars: $HOME/.openclaw"
91
+ },
92
+ "description": {
93
+ "type": "string",
94
+ "description": "Human-readable description of this project's role in the workflow"
95
+ },
96
+ "required": {
97
+ "type": "boolean",
98
+ "default": true,
99
+ "description": "Whether this project is required. If true (default), preflight fails if path doesn't exist."
100
+ }
101
+ }
102
+ },
60
103
  "SwarmConfig": {
61
104
  "type": "object",
62
- "required": ["pattern"],
105
+ "required": [
106
+ "pattern"
107
+ ],
63
108
  "additionalProperties": false,
64
109
  "properties": {
65
110
  "pattern": {
@@ -136,7 +181,10 @@
136
181
  },
137
182
  "AgentDefinition": {
138
183
  "type": "object",
139
- "required": ["name", "cli"],
184
+ "required": [
185
+ "name",
186
+ "cli"
187
+ ],
140
188
  "additionalProperties": false,
141
189
  "properties": {
142
190
  "name": {
@@ -156,7 +204,9 @@
156
204
  },
157
205
  "channels": {
158
206
  "type": "array",
159
- "items": { "type": "string" },
207
+ "items": {
208
+ "type": "string"
209
+ },
160
210
  "description": "Relay channels the agent should join"
161
211
  },
162
212
  "constraints": {
@@ -167,16 +217,47 @@
167
217
  "default": true,
168
218
  "description": "When false, the agent runs as a non-interactive subprocess (no PTY, no relay messaging). It receives its task as a CLI prompt argument and returns stdout as output. Default: true."
169
219
  },
220
+ "cwd": {
221
+ "type": "string",
222
+ "description": "Working directory for this agent, resolved relative to the YAML file."
223
+ },
224
+ "workdir": {
225
+ "type": "string",
226
+ "description": "Sets this agent's working directory to a named entry from the top-level paths array. Mutually exclusive with cwd."
227
+ },
228
+ "additionalPaths": {
229
+ "type": "array",
230
+ "items": {
231
+ "type": "string"
232
+ },
233
+ "description": "Additional paths the agent needs read/write access to."
234
+ },
170
235
  "preset": {
171
236
  "type": "string",
172
- "enum": ["lead", "worker", "reviewer", "analyst"],
237
+ "enum": [
238
+ "lead",
239
+ "worker",
240
+ "reviewer",
241
+ "analyst"
242
+ ],
173
243
  "description": "Role preset that automatically configures interactive mode and injects appropriate task guardrails. lead: interactive PTY, relay-aware. worker/reviewer/analyst: interactive: false, no sub-agents."
174
244
  }
175
245
  }
176
246
  },
177
247
  "AgentCli": {
178
248
  "type": "string",
179
- "enum": ["claude", "codex", "gemini", "aider", "goose", "opencode", "droid", "cursor", "cursor-agent", "agent"]
249
+ "enum": [
250
+ "claude",
251
+ "codex",
252
+ "gemini",
253
+ "aider",
254
+ "goose",
255
+ "opencode",
256
+ "droid",
257
+ "cursor",
258
+ "cursor-agent",
259
+ "agent"
260
+ ]
180
261
  },
181
262
  "AgentConstraints": {
182
263
  "type": "object",
@@ -232,7 +313,10 @@
232
313
  },
233
314
  "WorkflowDefinition": {
234
315
  "type": "object",
235
- "required": ["name", "steps"],
316
+ "required": [
317
+ "name",
318
+ "steps"
319
+ ],
236
320
  "additionalProperties": false,
237
321
  "properties": {
238
322
  "name": {
@@ -258,14 +342,20 @@
258
342
  },
259
343
  "onError": {
260
344
  "type": "string",
261
- "enum": ["fail", "skip", "retry"],
345
+ "enum": [
346
+ "fail",
347
+ "skip",
348
+ "retry"
349
+ ],
262
350
  "description": "Error handling strategy for this workflow"
263
351
  }
264
352
  }
265
353
  },
266
354
  "PreflightCheck": {
267
355
  "type": "object",
268
- "required": ["command"],
356
+ "required": [
357
+ "command"
358
+ ],
269
359
  "additionalProperties": false,
270
360
  "properties": {
271
361
  "command": {
@@ -288,20 +378,34 @@
288
378
  },
289
379
  "WorkflowStep": {
290
380
  "oneOf": [
291
- { "$ref": "#/definitions/AgentWorkflowStep" },
292
- { "$ref": "#/definitions/DeterministicWorkflowStep" },
293
- { "$ref": "#/definitions/WorktreeWorkflowStep" },
294
- { "$ref": "#/definitions/CustomWorkflowStep" }
381
+ {
382
+ "$ref": "#/definitions/AgentWorkflowStep"
383
+ },
384
+ {
385
+ "$ref": "#/definitions/DeterministicWorkflowStep"
386
+ },
387
+ {
388
+ "$ref": "#/definitions/WorktreeWorkflowStep"
389
+ },
390
+ {
391
+ "$ref": "#/definitions/CustomWorkflowStep"
392
+ }
295
393
  ]
296
394
  },
297
395
  "AgentWorkflowStep": {
298
396
  "type": "object",
299
- "required": ["name", "agent", "task"],
397
+ "required": [
398
+ "name",
399
+ "agent",
400
+ "task"
401
+ ],
300
402
  "additionalProperties": false,
301
403
  "properties": {
302
404
  "type": {
303
405
  "type": "string",
304
- "enum": ["agent"],
406
+ "enum": [
407
+ "agent"
408
+ ],
305
409
  "description": "Step type (optional for agent steps, defaults to 'agent')"
306
410
  },
307
411
  "name": {
@@ -318,7 +422,9 @@
318
422
  },
319
423
  "dependsOn": {
320
424
  "type": "array",
321
- "items": { "type": "string" },
425
+ "items": {
426
+ "type": "string"
427
+ },
322
428
  "description": "Step names that must complete before this step runs"
323
429
  },
324
430
  "verification": {
@@ -336,17 +442,27 @@
336
442
  "type": "integer",
337
443
  "minimum": 1,
338
444
  "description": "Maximum iterations for steps that may need to retry"
445
+ },
446
+ "workdir": {
447
+ "type": "string",
448
+ "description": "Sets this step's working directory to a named entry from the top-level paths array."
339
449
  }
340
450
  }
341
451
  },
342
452
  "DeterministicWorkflowStep": {
343
453
  "type": "object",
344
- "required": ["name", "type", "command"],
454
+ "required": [
455
+ "name",
456
+ "type",
457
+ "command"
458
+ ],
345
459
  "additionalProperties": false,
346
460
  "properties": {
347
461
  "type": {
348
462
  "type": "string",
349
- "enum": ["deterministic"],
463
+ "enum": [
464
+ "deterministic"
465
+ ],
350
466
  "description": "Step type - must be 'deterministic' for shell command steps"
351
467
  },
352
468
  "name": {
@@ -359,7 +475,9 @@
359
475
  },
360
476
  "dependsOn": {
361
477
  "type": "array",
362
- "items": { "type": "string" },
478
+ "items": {
479
+ "type": "string"
480
+ },
363
481
  "description": "Step names that must complete before this step runs"
364
482
  },
365
483
  "timeoutMs": {
@@ -375,17 +493,27 @@
375
493
  "type": "boolean",
376
494
  "default": true,
377
495
  "description": "Capture stdout as step output for downstream steps"
496
+ },
497
+ "workdir": {
498
+ "type": "string",
499
+ "description": "Sets this step's working directory to a named entry from the top-level paths array."
378
500
  }
379
501
  }
380
502
  },
381
503
  "WorktreeWorkflowStep": {
382
504
  "type": "object",
383
- "required": ["name", "type", "branch"],
505
+ "required": [
506
+ "name",
507
+ "type",
508
+ "branch"
509
+ ],
384
510
  "additionalProperties": false,
385
511
  "properties": {
386
512
  "type": {
387
513
  "type": "string",
388
- "enum": ["worktree"],
514
+ "enum": [
515
+ "worktree"
516
+ ],
389
517
  "description": "Step type - must be 'worktree' for git worktree setup steps"
390
518
  },
391
519
  "name": {
@@ -411,18 +539,27 @@
411
539
  },
412
540
  "dependsOn": {
413
541
  "type": "array",
414
- "items": { "type": "string" },
542
+ "items": {
543
+ "type": "string"
544
+ },
415
545
  "description": "Step names that must complete before this step runs"
416
546
  },
417
547
  "timeoutMs": {
418
548
  "type": "integer",
419
549
  "minimum": 0
550
+ },
551
+ "workdir": {
552
+ "type": "string",
553
+ "description": "Sets this step's working directory to a named entry from the top-level paths array."
420
554
  }
421
555
  }
422
556
  },
423
557
  "CustomWorkflowStep": {
424
558
  "type": "object",
425
- "required": ["name", "use"],
559
+ "required": [
560
+ "name",
561
+ "use"
562
+ ],
426
563
  "additionalProperties": true,
427
564
  "properties": {
428
565
  "name": {
@@ -435,7 +572,9 @@
435
572
  },
436
573
  "dependsOn": {
437
574
  "type": "array",
438
- "items": { "type": "string" },
575
+ "items": {
576
+ "type": "string"
577
+ },
439
578
  "description": "Step names that must complete before this step runs"
440
579
  },
441
580
  "timeoutMs": {
@@ -446,7 +585,9 @@
446
585
  },
447
586
  "CustomStepParam": {
448
587
  "type": "object",
449
- "required": ["name"],
588
+ "required": [
589
+ "name"
590
+ ],
450
591
  "additionalProperties": false,
451
592
  "properties": {
452
593
  "name": {
@@ -474,12 +615,17 @@
474
615
  "properties": {
475
616
  "params": {
476
617
  "type": "array",
477
- "items": { "$ref": "#/definitions/CustomStepParam" },
618
+ "items": {
619
+ "$ref": "#/definitions/CustomStepParam"
620
+ },
478
621
  "description": "Parameters that can be passed when using this step"
479
622
  },
480
623
  "type": {
481
624
  "type": "string",
482
- "enum": ["deterministic", "worktree"],
625
+ "enum": [
626
+ "deterministic",
627
+ "worktree"
628
+ ],
483
629
  "description": "Step type"
484
630
  },
485
631
  "command": {
@@ -525,24 +671,36 @@
525
671
  },
526
672
  "CustomStepsConfig": {
527
673
  "type": "object",
528
- "required": ["steps"],
674
+ "required": [
675
+ "steps"
676
+ ],
529
677
  "additionalProperties": false,
530
678
  "properties": {
531
679
  "steps": {
532
680
  "type": "object",
533
- "additionalProperties": { "$ref": "#/definitions/CustomStepDefinition" },
681
+ "additionalProperties": {
682
+ "$ref": "#/definitions/CustomStepDefinition"
683
+ },
534
684
  "description": "Map of step name to step definition"
535
685
  }
536
686
  }
537
687
  },
538
688
  "VerificationCheck": {
539
689
  "type": "object",
540
- "required": ["type", "value"],
690
+ "required": [
691
+ "type",
692
+ "value"
693
+ ],
541
694
  "additionalProperties": false,
542
695
  "properties": {
543
696
  "type": {
544
697
  "type": "string",
545
- "enum": ["output_contains", "exit_code", "file_exists", "custom"],
698
+ "enum": [
699
+ "output_contains",
700
+ "exit_code",
701
+ "file_exists",
702
+ "custom"
703
+ ],
546
704
  "description": "Type of verification to perform"
547
705
  },
548
706
  "value": {
@@ -573,14 +731,21 @@
573
731
  },
574
732
  "consensusStrategy": {
575
733
  "type": "string",
576
- "enum": ["majority", "unanimous", "quorum"],
734
+ "enum": [
735
+ "majority",
736
+ "unanimous",
737
+ "quorum"
738
+ ],
577
739
  "description": "Strategy for reaching consensus among agents"
578
740
  }
579
741
  }
580
742
  },
581
743
  "Barrier": {
582
744
  "type": "object",
583
- "required": ["name", "waitFor"],
745
+ "required": [
746
+ "name",
747
+ "waitFor"
748
+ ],
584
749
  "additionalProperties": false,
585
750
  "properties": {
586
751
  "name": {
@@ -589,7 +754,9 @@
589
754
  },
590
755
  "waitFor": {
591
756
  "type": "array",
592
- "items": { "type": "string" },
757
+ "items": {
758
+ "type": "string"
759
+ },
593
760
  "minItems": 1,
594
761
  "description": "Agent or step names to wait for before proceeding"
595
762
  },
@@ -602,12 +769,18 @@
602
769
  },
603
770
  "StateConfig": {
604
771
  "type": "object",
605
- "required": ["backend"],
772
+ "required": [
773
+ "backend"
774
+ ],
606
775
  "additionalProperties": false,
607
776
  "properties": {
608
777
  "backend": {
609
778
  "type": "string",
610
- "enum": ["memory", "redis", "database"],
779
+ "enum": [
780
+ "memory",
781
+ "redis",
782
+ "database"
783
+ ],
611
784
  "description": "State storage backend"
612
785
  },
613
786
  "ttlMs": {
@@ -623,12 +796,18 @@
623
796
  },
624
797
  "ErrorHandlingConfig": {
625
798
  "type": "object",
626
- "required": ["strategy"],
799
+ "required": [
800
+ "strategy"
801
+ ],
627
802
  "additionalProperties": false,
628
803
  "properties": {
629
804
  "strategy": {
630
805
  "type": "string",
631
- "enum": ["fail-fast", "continue", "retry"],
806
+ "enum": [
807
+ "fail-fast",
808
+ "continue",
809
+ "retry"
810
+ ],
632
811
  "description": "Global error handling strategy"
633
812
  },
634
813
  "maxRetries": {
@@ -648,4 +827,4 @@
648
827
  }
649
828
  }
650
829
  }
651
- }
830
+ }
@@ -12,6 +12,11 @@ export interface RelayYamlConfig {
12
12
  version: string;
13
13
  name: string;
14
14
  description?: string;
15
+ /** Named paths to external directories used by this workflow.
16
+ * The primary working directory defaults to cwd and does not need to be declared.
17
+ * Use this to declare additional directories so the runner can validate them
18
+ * in preflight and agents can reference them via `workdir`. */
19
+ paths?: PathDefinition[];
15
20
  swarm: SwarmConfig;
16
21
  agents: AgentDefinition[];
17
22
  workflows?: WorkflowDefinition[];
@@ -21,6 +26,22 @@ export interface RelayYamlConfig {
21
26
  trajectories?: TrajectoryConfig | false;
22
27
  }
23
28
 
29
+ // ── Path definitions ────────────────────────────────────────────────────────
30
+
31
+ /** A named path to an external directory for cross-repo workflows.
32
+ * Only needed for directories outside the default working directory. */
33
+ export interface PathDefinition {
34
+ /** Unique name used to reference this path (e.g. "relaycast"). */
35
+ name: string;
36
+ /** Directory path, resolved relative to the YAML file.
37
+ * Supports environment variables: "$HOME/.openclaw", "$RELAY_ROOT/packages/sdk". */
38
+ path: string;
39
+ /** Human-readable description of this path's role in the workflow. */
40
+ description?: string;
41
+ /** Whether this path is required. If true (default), preflight fails if it doesn't exist. */
42
+ required?: boolean;
43
+ }
44
+
24
45
  // ── Trajectory configuration ─────────────────────────────────────────────────
25
46
 
26
47
  /** Configuration for workflow trajectory recording. */
@@ -102,6 +123,10 @@ export interface AgentDefinition {
102
123
  interactive?: boolean;
103
124
  /** Working directory for this agent, resolved relative to the YAML file. */
104
125
  cwd?: string;
126
+ /** Sets this agent's working directory to a named entry from the top-level `paths` array.
127
+ * Mutually exclusive with `cwd`. If omitted, the agent runs in the runner's
128
+ * working directory (the directory containing the workflow YAML file). */
129
+ workdir?: string;
105
130
  /** Additional paths the agent needs read/write access to. */
106
131
  additionalPaths?: string[];
107
132
  /**
@@ -234,6 +259,10 @@ export interface WorkflowStep {
234
259
  // ── Deterministic step fields ──────────────────────────────────────────────
235
260
  /** Shell command to execute (required for deterministic steps). */
236
261
  command?: string;
262
+ /** Sets this step's working directory to a named entry from the top-level `paths` array.
263
+ * If omitted, the step inherits the agent's workdir, or falls back to the runner's
264
+ * working directory. */
265
+ workdir?: string;
237
266
  /** Fail if command exit code is non-zero. Default: true. */
238
267
  failOnError?: boolean;
239
268
  /** Capture stdout as step output for downstream steps. Default: true. */
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "agent-relay-sdk"
7
- version = "3.1.14"
7
+ version = "3.1.16"
8
8
  description = "Python SDK for Agent Relay workflows"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -59,6 +59,7 @@ from .types import (
59
59
  SwarmPattern,
60
60
  AgentDefinition,
61
61
  AgentConstraints,
62
+ PathDefinition,
62
63
  RelayYamlConfig,
63
64
  AgentCli,
64
65
  IdleNudgeConfig,
@@ -128,6 +129,7 @@ __all__ = [
128
129
  "SwarmPattern",
129
130
  "AgentDefinition",
130
131
  "AgentConstraints",
132
+ "PathDefinition",
131
133
  "RelayYamlConfig",
132
134
  "AgentCli",
133
135
  "IdleNudgeConfig",
@@ -123,6 +123,24 @@ class AgentConstraints:
123
123
  return result
124
124
 
125
125
 
126
+ @dataclass
127
+ class PathDefinition:
128
+ """A named path to an external directory for cross-repo workflows."""
129
+
130
+ name: str
131
+ path: str
132
+ description: str | None = None
133
+ required: bool | None = None
134
+
135
+ def to_dict(self) -> dict[str, Any]:
136
+ result: dict[str, Any] = {"name": self.name, "path": self.path}
137
+ if self.description is not None:
138
+ result["description"] = self.description
139
+ if self.required is not None:
140
+ result["required"] = self.required
141
+ return result
142
+
143
+
126
144
  @dataclass
127
145
  class AgentDefinition:
128
146
  name: str
@@ -132,6 +150,9 @@ class AgentDefinition:
132
150
  channels: list[str] | None = None
133
151
  constraints: AgentConstraints | None = None
134
152
  interactive: bool | None = None
153
+ cwd: str | None = None
154
+ workdir: str | None = None
155
+ additional_paths: list[str] | None = None
135
156
 
136
157
  def to_dict(self) -> dict[str, Any]:
137
158
  result: dict[str, Any] = {
@@ -150,6 +171,12 @@ class AgentDefinition:
150
171
  result["constraints"] = constraints
151
172
  if self.interactive is not None:
152
173
  result["interactive"] = self.interactive
174
+ if self.cwd is not None:
175
+ result["cwd"] = self.cwd
176
+ if self.workdir is not None:
177
+ result["workdir"] = self.workdir
178
+ if self.additional_paths is not None:
179
+ result["additionalPaths"] = self.additional_paths
153
180
  return result
154
181
 
155
182
 
@@ -175,6 +202,7 @@ class WorkflowStep:
175
202
  verification: VerificationCheck | None = None
176
203
  timeout_ms: int | None = None
177
204
  retries: int | None = None
205
+ workdir: str | None = None
178
206
 
179
207
  def to_dict(self) -> dict[str, Any]:
180
208
  result: dict[str, Any] = {
@@ -190,6 +218,8 @@ class WorkflowStep:
190
218
  result["timeoutMs"] = self.timeout_ms
191
219
  if self.retries is not None:
192
220
  result["retries"] = self.retries
221
+ if self.workdir is not None:
222
+ result["workdir"] = self.workdir
193
223
  return result
194
224
 
195
225
 
@@ -285,6 +315,7 @@ class RelayYamlConfig:
285
315
  agents: list[AgentDefinition]
286
316
  version: str = "1.0"
287
317
  description: str | None = None
318
+ paths: list[PathDefinition] | None = None
288
319
  workflows: list[WorkflowDefinition] | None = None
289
320
  coordination: CoordinationConfig | None = None
290
321
  state: StateConfig | None = None
@@ -300,6 +331,8 @@ class RelayYamlConfig:
300
331
  }
301
332
  if self.description is not None:
302
333
  result["description"] = self.description
334
+ if self.paths is not None:
335
+ result["paths"] = [p.to_dict() for p in self.paths]
303
336
  if self.workflows is not None:
304
337
  result["workflows"] = [workflow.to_dict() for workflow in self.workflows]
305
338
  if self.coordination is not None:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/telemetry",
3
- "version": "3.1.14",
3
+ "version": "3.1.16",
4
4
  "description": "Anonymous telemetry for Agent Relay usage analytics",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/trajectory",
3
- "version": "3.1.14",
3
+ "version": "3.1.16",
4
4
  "description": "Trajectory integration utilities (trail/PDERO) for Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/config": "3.1.14"
25
+ "@agent-relay/config": "3.1.16"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",