agent-relay 3.0.1 → 3.1.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 (142) hide show
  1. package/README.md +37 -244
  2. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  3. package/bin/agent-relay-broker-darwin-x64 +0 -0
  4. package/bin/agent-relay-broker-linux-arm64 +0 -0
  5. package/bin/agent-relay-broker-linux-x64 +0 -0
  6. package/dist/index.cjs +342 -60
  7. package/dist/src/cli/commands/core.d.ts +2 -0
  8. package/dist/src/cli/commands/core.d.ts.map +1 -1
  9. package/dist/src/cli/commands/core.js +9 -2
  10. package/dist/src/cli/commands/core.js.map +1 -1
  11. package/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -1
  12. package/dist/src/cli/lib/broker-lifecycle.js +87 -28
  13. package/dist/src/cli/lib/broker-lifecycle.js.map +1 -1
  14. package/package.json +9 -8
  15. package/packages/acp-bridge/README.md +50 -67
  16. package/packages/acp-bridge/package.json +2 -2
  17. package/packages/config/package.json +1 -1
  18. package/packages/hooks/package.json +4 -4
  19. package/packages/memory/package.json +2 -2
  20. package/packages/policy/package.json +2 -2
  21. package/packages/sdk/README.md +169 -64
  22. package/packages/sdk/dist/__tests__/contract-fixtures.test.js +76 -9
  23. package/packages/sdk/dist/__tests__/contract-fixtures.test.js.map +1 -1
  24. package/packages/sdk/dist/__tests__/facade.test.js +48 -0
  25. package/packages/sdk/dist/__tests__/facade.test.js.map +1 -1
  26. package/packages/sdk/dist/__tests__/integration.test.js +11 -5
  27. package/packages/sdk/dist/__tests__/integration.test.js.map +1 -1
  28. package/packages/sdk/dist/__tests__/unit.test.js +36 -0
  29. package/packages/sdk/dist/__tests__/unit.test.js.map +1 -1
  30. package/packages/sdk/dist/client.d.ts +36 -3
  31. package/packages/sdk/dist/client.d.ts.map +1 -1
  32. package/packages/sdk/dist/client.js +142 -9
  33. package/packages/sdk/dist/client.js.map +1 -1
  34. package/packages/sdk/dist/protocol.d.ts +7 -1
  35. package/packages/sdk/dist/protocol.d.ts.map +1 -1
  36. package/packages/sdk/dist/relay.d.ts +74 -11
  37. package/packages/sdk/dist/relay.d.ts.map +1 -1
  38. package/packages/sdk/dist/relay.js +175 -27
  39. package/packages/sdk/dist/relay.js.map +1 -1
  40. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  41. package/packages/sdk/dist/workflows/runner.js +71 -36
  42. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  43. package/packages/sdk/dist/workflows/types.d.ts +1 -1
  44. package/packages/sdk/dist/workflows/types.d.ts.map +1 -1
  45. package/packages/sdk/package.json +2 -2
  46. package/packages/sdk/src/__tests__/contract-fixtures.test.ts +88 -9
  47. package/packages/sdk/src/__tests__/error-scenarios.test.ts +1 -1
  48. package/packages/sdk/src/__tests__/facade.test.ts +68 -0
  49. package/packages/sdk/src/__tests__/idle-nudge.test.ts +205 -257
  50. package/packages/sdk/src/__tests__/integration.test.ts +11 -5
  51. package/packages/sdk/src/__tests__/orchestration-upgrades.test.ts +277 -13
  52. package/packages/sdk/src/__tests__/swarm-coordinator.test.ts +1 -0
  53. package/packages/sdk/src/__tests__/unit.test.ts +44 -0
  54. package/packages/sdk/src/__tests__/workflow-runner.test.ts +67 -7
  55. package/packages/sdk/src/__tests__/workflow-trajectory.test.ts +4 -5
  56. package/packages/sdk/src/client.ts +195 -14
  57. package/packages/sdk/src/examples/workflows/runner-idle-refactor.yaml +306 -0
  58. package/packages/sdk/src/protocol.ts +7 -2
  59. package/packages/sdk/src/relay.ts +271 -38
  60. package/packages/sdk/src/workflows/runner.ts +73 -42
  61. package/packages/sdk/src/workflows/schema.json +1 -1
  62. package/packages/sdk/src/workflows/types.ts +1 -1
  63. package/packages/sdk/vitest.config.ts +1 -0
  64. package/packages/sdk-py/README.md +89 -102
  65. package/packages/sdk-py/agent_relay/__init__.py +16 -19
  66. package/packages/sdk-py/pyproject.toml +6 -2
  67. package/packages/sdk-py/src/agent_relay/__init__.py +35 -1
  68. package/packages/sdk-py/src/agent_relay/client.py +776 -0
  69. package/packages/sdk-py/src/agent_relay/models.py +27 -0
  70. package/packages/sdk-py/src/agent_relay/protocol.py +114 -0
  71. package/packages/sdk-py/src/agent_relay/relay.py +860 -0
  72. package/packages/sdk-py/tests/test_relay_lifecycle_hooks.py +250 -0
  73. package/packages/telemetry/package.json +1 -1
  74. package/packages/trajectory/package.json +2 -2
  75. package/packages/user-directory/package.json +2 -2
  76. package/packages/utils/package.json +2 -2
  77. package/scripts/postinstall.js +35 -162
  78. package/packages/sdk/.trajectories/active/traj_1771875803391_84ca57b2.json +0 -50
  79. package/packages/sdk/.trajectories/active/traj_1771891934534_06504121.json +0 -50
  80. package/packages/sdk/.trajectories/active/traj_1771891957929_211afc4e.json +0 -50
  81. package/packages/sdk/.trajectories/active/traj_1771891982509_38c84638.json +0 -50
  82. package/packages/sdk/.trajectories/completed/traj_1771875803188_cd6d181c.json +0 -80
  83. package/packages/sdk/.trajectories/completed/traj_1771875803204_f2aeb8c8.json +0 -80
  84. package/packages/sdk/.trajectories/completed/traj_1771875803210_d65f3f1a.json +0 -80
  85. package/packages/sdk/.trajectories/completed/traj_1771875803218_e454a25d.json +0 -80
  86. package/packages/sdk/.trajectories/completed/traj_1771875803223_d7a64815.json +0 -80
  87. package/packages/sdk/.trajectories/completed/traj_1771875803227_7e56da5b.json +0 -80
  88. package/packages/sdk/.trajectories/completed/traj_1771875803235_4fbf93b4.json +0 -80
  89. package/packages/sdk/.trajectories/completed/traj_1771875803243_47931c71.json +0 -80
  90. package/packages/sdk/.trajectories/completed/traj_1771875803258_3816f3fe.json +0 -80
  91. package/packages/sdk/.trajectories/completed/traj_1771875803268_8061140e.json +0 -80
  92. package/packages/sdk/.trajectories/completed/traj_1771875803326_ae6f9c78.json +0 -80
  93. package/packages/sdk/.trajectories/completed/traj_1771875808396_cbde0a6c.json +0 -91
  94. package/packages/sdk/.trajectories/completed/traj_1771875812026_aa2442bb.json +0 -91
  95. package/packages/sdk/.trajectories/completed/traj_1771875815431_c2c656c5.json +0 -91
  96. package/packages/sdk/.trajectories/completed/traj_1771875818645_3a4dbf02.json +0 -91
  97. package/packages/sdk/.trajectories/completed/traj_1771891934403_24923c03.json +0 -80
  98. package/packages/sdk/.trajectories/completed/traj_1771891934421_dca16e24.json +0 -80
  99. package/packages/sdk/.trajectories/completed/traj_1771891934430_057706f7.json +0 -80
  100. package/packages/sdk/.trajectories/completed/traj_1771891934442_faf97382.json +0 -80
  101. package/packages/sdk/.trajectories/completed/traj_1771891934454_5542ecd5.json +0 -80
  102. package/packages/sdk/.trajectories/completed/traj_1771891934464_12202a08.json +0 -80
  103. package/packages/sdk/.trajectories/completed/traj_1771891934487_94378275.json +0 -80
  104. package/packages/sdk/.trajectories/completed/traj_1771891934503_ca728c13.json +0 -80
  105. package/packages/sdk/.trajectories/completed/traj_1771891934519_100af69a.json +0 -80
  106. package/packages/sdk/.trajectories/completed/traj_1771891934536_62ad39d9.json +0 -80
  107. package/packages/sdk/.trajectories/completed/traj_1771891934553_d6798a52.json +0 -80
  108. package/packages/sdk/.trajectories/completed/traj_1771891939537_541c8096.json +0 -91
  109. package/packages/sdk/.trajectories/completed/traj_1771891942985_36ab9a4d.json +0 -91
  110. package/packages/sdk/.trajectories/completed/traj_1771891946453_e8a6e05f.json +0 -91
  111. package/packages/sdk/.trajectories/completed/traj_1771891949838_5de0de84.json +0 -91
  112. package/packages/sdk/.trajectories/completed/traj_1771891957807_0ecfb4f4.json +0 -80
  113. package/packages/sdk/.trajectories/completed/traj_1771891957827_c4539239.json +0 -80
  114. package/packages/sdk/.trajectories/completed/traj_1771891957836_91168b48.json +0 -80
  115. package/packages/sdk/.trajectories/completed/traj_1771891957848_8c5cad0b.json +0 -80
  116. package/packages/sdk/.trajectories/completed/traj_1771891957857_0986b293.json +0 -80
  117. package/packages/sdk/.trajectories/completed/traj_1771891957872_8a3113af.json +0 -80
  118. package/packages/sdk/.trajectories/completed/traj_1771891957884_0bb85208.json +0 -80
  119. package/packages/sdk/.trajectories/completed/traj_1771891957892_86c75e2e.json +0 -80
  120. package/packages/sdk/.trajectories/completed/traj_1771891957907_98ca0e6f.json +0 -80
  121. package/packages/sdk/.trajectories/completed/traj_1771891957918_d9091231.json +0 -80
  122. package/packages/sdk/.trajectories/completed/traj_1771891957931_dcaf77ed.json +0 -80
  123. package/packages/sdk/.trajectories/completed/traj_1771891962931_eb1fdee2.json +0 -91
  124. package/packages/sdk/.trajectories/completed/traj_1771891966262_9061a93f.json +0 -91
  125. package/packages/sdk/.trajectories/completed/traj_1771891969915_1adaba19.json +0 -91
  126. package/packages/sdk/.trajectories/completed/traj_1771891973588_f08b79e9.json +0 -91
  127. package/packages/sdk/.trajectories/completed/traj_1771891982421_f1985bce.json +0 -80
  128. package/packages/sdk/.trajectories/completed/traj_1771891982432_e7a84163.json +0 -80
  129. package/packages/sdk/.trajectories/completed/traj_1771891982447_369b842a.json +0 -80
  130. package/packages/sdk/.trajectories/completed/traj_1771891982469_5fc45199.json +0 -80
  131. package/packages/sdk/.trajectories/completed/traj_1771891982495_454c7cb3.json +0 -80
  132. package/packages/sdk/.trajectories/completed/traj_1771891982514_08098e03.json +0 -80
  133. package/packages/sdk/.trajectories/completed/traj_1771891982526_b351d778.json +0 -80
  134. package/packages/sdk/.trajectories/completed/traj_1771891982533_fa542d83.json +0 -80
  135. package/packages/sdk/.trajectories/completed/traj_1771891982540_18ab24dc.json +0 -80
  136. package/packages/sdk/.trajectories/completed/traj_1771891982544_5b4fa163.json +0 -80
  137. package/packages/sdk/.trajectories/completed/traj_1771891982548_c13f089a.json +0 -80
  138. package/packages/sdk/.trajectories/completed/traj_1771891987510_23f6da1f.json +0 -91
  139. package/packages/sdk/.trajectories/completed/traj_1771891991466_912c2e04.json +0 -91
  140. package/packages/sdk/.trajectories/completed/traj_1771891994891_60604be2.json +0 -91
  141. package/packages/sdk/.trajectories/completed/traj_1771891998370_cfaf9b8b.json +0 -91
  142. package/packages/sdk/bin/agent-relay-broker +0 -0
@@ -6,9 +6,7 @@ ACP (Agent Client Protocol) bridge for Agent Relay. Exposes relay agents to ACP-
6
6
 
7
7
  The [Agent Client Protocol (ACP)](https://agentclientprotocol.com) is an open standard that enables AI agents to integrate with code editors. It's like LSP (Language Server Protocol) but for AI coding agents.
8
8
 
9
- ## What does this bridge do?
10
-
11
- This bridge allows ACP-compatible editors to communicate with Agent Relay agents:
9
+ ## Architecture
12
10
 
13
11
  ```
14
12
  ┌─────────────────┐ ACP (stdio) ┌─────────────────┐
@@ -36,68 +34,80 @@ This bridge allows ACP-compatible editors to communicate with Agent Relay agents
36
34
  npm install @agent-relay/acp-bridge
37
35
  ```
38
36
 
39
- ## Usage
40
-
41
- ### CLI
37
+ ## CLI Usage
42
38
 
43
39
  ```bash
44
40
  # Start the bridge
45
41
  relay-acp --name my-agent --debug
46
42
 
47
43
  # With custom socket path
48
- relay-acp --socket /tmp/relay/my-workspace/sockets/relay.sock
44
+ relay-acp --socket /path/to/.agent-relay/relay.sock
45
+
46
+ # Show help
47
+ relay-acp --help
48
+ ```
49
+
50
+ ### CLI Options
51
+
52
+ | Option | Description |
53
+ |--------|-------------|
54
+ | `--name <name>` | Agent name for relay identification (default: `relay-acp`) |
55
+ | `--socket <path>` | Path to relay broker socket |
56
+ | `--debug` | Enable debug logging to stderr |
57
+ | `--help, -h` | Show help message |
58
+ | `--version, -v` | Show version |
59
+
60
+ ## Zed Integration
61
+
62
+ ### Quick Setup
63
+
64
+ Let the CLI configure Zed automatically:
65
+
66
+ ```bash
67
+ agent-relay up --zed
49
68
  ```
50
69
 
51
- ### With Zed Editor
70
+ This adds an `agent_servers` entry to your Zed settings with the correct socket path.
71
+
72
+ ### Manual Setup
52
73
 
53
74
  1. Start the relay broker:
54
75
  ```bash
55
76
  agent-relay up
56
77
  ```
57
78
 
58
- 2. Start some relay agents:
79
+ 2. Spawn relay agents:
59
80
  ```bash
60
- relay spawn Worker1 claude "Help with coding tasks"
81
+ agent-relay spawn Worker1 claude "Help with coding tasks"
61
82
  ```
62
83
 
63
- 3. Configure Zed to use the bridge. Add to your Zed settings:
84
+ 3. Add to Zed settings (`~/.config/zed/settings.json`):
64
85
  ```json
65
86
  {
66
- "agent": {
67
- "custom_agents": [
68
- {
69
- "name": "Agent Relay",
70
- "command": "relay-acp",
71
- "args": ["--name", "zed-bridge"]
72
- }
73
- ]
87
+ "agent_servers": {
88
+ "Agent Relay": {
89
+ "type": "custom",
90
+ "command": "relay-acp",
91
+ "args": ["--name", "zed-bridge"]
92
+ }
74
93
  }
75
94
  }
76
95
  ```
77
96
 
78
97
  4. Open the Agent Panel in Zed (`Cmd+?` on macOS) and select "Agent Relay"
79
98
 
80
- Or let the CLI configure Zed for you (writes `agent_servers` with the correct socket path):
99
+ ### In-Panel Commands
81
100
 
82
- ```bash
83
- agent-relay up --zed
84
- ```
101
+ Manage agents directly from the Zed Agent Panel:
85
102
 
86
- This adds an entry similar to:
87
-
88
- ```json
89
- {
90
- "agent_servers": {
91
- "Agent Relay": {
92
- "type": "custom",
93
- "command": "relay-acp",
94
- "args": ["--name", "zed-bridge", "--socket", "/path/to/project/.agent-relay/relay.sock"]
95
- }
96
- }
97
- }
103
+ ```
104
+ agent-relay spawn Worker claude "Review the current changes"
105
+ agent-relay release Worker
106
+ agent-relay agents
107
+ agent-relay help
98
108
  ```
99
109
 
100
- ### Programmatic Usage
110
+ ## Programmatic Usage
101
111
 
102
112
  ```typescript
103
113
  import { RelayACPAgent } from '@agent-relay/acp-bridge';
@@ -106,36 +116,11 @@ const agent = new RelayACPAgent({
106
116
  agentName: 'my-agent',
107
117
  socketPath: '/tmp/relay.sock',
108
118
  debug: true,
109
- capabilities: {
110
- supportsSessionLoading: false,
111
- modes: [
112
- { slug: 'default', name: 'Default', description: 'Standard mode' },
113
- { slug: 'review', name: 'Code Review', description: 'Focus on code review' },
114
- ],
115
- },
116
119
  });
117
120
 
118
121
  await agent.start();
119
122
  ```
120
123
 
121
- ### Relay CLI commands from the Agent Panel
122
-
123
- The bridge intercepts basic `agent-relay` commands typed in the Zed Agent Panel, so you can manage agents without a shell:
124
-
125
- - `agent-relay spawn Worker claude "Review the current changes"`
126
- - `agent-relay release Worker`
127
- - `agent-relay agents` (list connected agents)
128
-
129
- Supported commands today: spawn/create-agent, release, agents/who. Others fall back to normal broadcast handling.
130
- The panel shows a help block on first message; type `agent-relay help` anytime to see it again.
131
-
132
- ## How it Works
133
-
134
- 1. **Initialization**: When an editor connects, the bridge advertises its capabilities
135
- 2. **Session Creation**: Each conversation creates a new session
136
- 3. **Prompt Handling**: User prompts are broadcast to all relay agents
137
- 4. **Response Streaming**: Agent responses are streamed back to the editor
138
-
139
124
  ## Configuration
140
125
 
141
126
  | Option | Type | Default | Description |
@@ -143,9 +128,6 @@ The panel shows a help block on first message; type `agent-relay help` anytime t
143
128
  | `agentName` | string | `'relay-acp'` | Name used when connecting to relay broker |
144
129
  | `socketPath` | string | auto | Path to relay broker socket |
145
130
  | `debug` | boolean | `false` | Enable debug logging |
146
- | `capabilities` | object | - | ACP capabilities to advertise |
147
-
148
- Connections to the broker go through `@agent-relay/sdk`, so socket discovery and reconnection match the rest of the Relay tooling. Provide `socketPath` to override detection when needed.
149
131
 
150
132
  ## Environment Variables
151
133
 
@@ -155,16 +137,17 @@ Connections to the broker go through `@agent-relay/sdk`, so socket discovery and
155
137
 
156
138
  ## ACP Compatibility
157
139
 
158
- This bridge implements ACP version `2025-03-26` and supports:
140
+ Implements ACP version `2025-03-26`:
159
141
 
142
+ **Supported:**
160
143
  - Session management (new sessions)
161
144
  - Prompt handling with streaming responses
162
145
  - Cancellation
163
146
 
164
- Not yet supported:
147
+ **Not yet supported:**
165
148
  - Session loading/resumption
166
149
  - Tool calls
167
- - File operations via ACP (use relay agents directly)
150
+ - File operations via ACP
168
151
 
169
152
  ## License
170
153
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/acp-bridge",
3
- "version": "3.0.1",
3
+ "version": "3.1.0",
4
4
  "description": "ACP (Agent Client Protocol) bridge for Agent Relay - expose relay agents to ACP-compatible editors like Zed",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -46,7 +46,7 @@
46
46
  "access": "public"
47
47
  },
48
48
  "dependencies": {
49
- "@agent-relay/sdk": "3.0.1",
49
+ "@agent-relay/sdk": "3.1.0",
50
50
  "@agentclientprotocol/sdk": "^0.12.0"
51
51
  },
52
52
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/config",
3
- "version": "3.0.1",
3
+ "version": "3.1.0",
4
4
  "description": "Shared configuration schemas and loaders for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/hooks",
3
- "version": "3.0.1",
3
+ "version": "3.1.0",
4
4
  "description": "Hook emitter, registry, and trajectory hooks for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -37,9 +37,9 @@
37
37
  "test:watch": "vitest"
38
38
  },
39
39
  "dependencies": {
40
- "@agent-relay/config": "3.0.1",
41
- "@agent-relay/trajectory": "3.0.1",
42
- "@agent-relay/sdk": "3.0.1"
40
+ "@agent-relay/config": "3.1.0",
41
+ "@agent-relay/trajectory": "3.1.0",
42
+ "@agent-relay/sdk": "3.1.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/memory",
3
- "version": "3.0.1",
3
+ "version": "3.1.0",
4
4
  "description": "Semantic memory storage and retrieval system for agent-relay with multiple backend support",
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/hooks": "3.0.1"
25
+ "@agent-relay/hooks": "3.1.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/policy",
3
- "version": "3.0.1",
3
+ "version": "3.1.0",
4
4
  "description": "Agent policy management with multi-level fallback (repo, local PRPM, cloud workspace)",
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.0.1"
25
+ "@agent-relay/config": "3.1.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,97 +1,202 @@
1
- # `@agent-relay/sdk`
1
+ # @agent-relay/sdk
2
2
 
3
- TypeScript SDK for driving `agent-relay-broker init` over stdio.
3
+ TypeScript SDK for building multi-agent workflows with Agent Relay. Provides both low-level broker control and high-level workflow orchestration.
4
4
 
5
- ## Status
6
- - Broker lifecycle + request/response protocol client implemented.
7
- - Spawn/list/release/shutdown APIs implemented.
8
- - Event subscription for broker `event` frames implemented.
9
- - Agent idle detection — configurable silence threshold with `onAgentIdle` hook and `waitForIdle()`.
5
+ ## Installation
10
6
 
11
- ## Bundled binary
12
- - The SDK package bundles `agent-relay-broker` inside `bin/` during `npm run build` and `npm pack`.
13
- - By default, `AgentRelayClient` uses the bundled binary path when present.
14
- - You can still override with `binaryPath` in `AgentRelayClient.start(...)`.
7
+ ```bash
8
+ npm install @agent-relay/sdk
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ### Workflow Builder (Recommended)
14
+
15
+ The workflow builder is the primary way to define and run multi-agent workflows:
16
+
17
+ ```ts
18
+ import { workflow } from '@agent-relay/sdk/workflows';
19
+
20
+ const result = await workflow('my-feature')
21
+ .pattern('dag')
22
+ .agent('planner', { cli: 'claude', role: 'Planning lead' })
23
+ .agent('builder', { cli: 'codex', role: 'Implementation engineer' })
24
+ .step('plan', { agent: 'planner', task: 'Create a detailed plan' })
25
+ .step('build', { agent: 'builder', task: 'Implement the plan', dependsOn: ['plan'] })
26
+ .run();
27
+ ```
28
+
29
+ ### High-Level Facade
30
+
31
+ The `AgentRelay` class provides a clean API for spawning and managing agents:
15
32
 
16
- ## Quick example
17
33
  ```ts
18
- import { AgentRelayClient } from "@agent-relay/sdk";
34
+ import { AgentRelay } from '@agent-relay/sdk';
35
+
36
+ const relay = new AgentRelay();
37
+
38
+ // Event hooks
39
+ relay.onMessageReceived = (msg) => console.log(`${msg.from}: ${msg.text}`);
40
+ relay.onAgentIdle = ({ name, idleSecs }) => console.log(`${name} idle for ${idleSecs}s`);
41
+
42
+ // Spawn agents using shorthand spawners
43
+ const worker = await relay.claude.spawn({
44
+ name: 'Worker1',
45
+ channels: ['general'],
46
+ // Lifecycle hooks can be sync or async functions.
47
+ onStart: ({ name }) => console.log(`spawning ${name}`),
48
+ onSuccess: ({ name, runtime }) => console.log(`spawned ${name} (${runtime})`),
49
+ onError: ({ name, error }) => console.error(`failed to spawn ${name}`, error),
50
+ });
51
+
52
+ // Or use the generic spawn method
53
+ const agent = await relay.spawn('Worker2', 'codex', 'Build the API', {
54
+ channels: ['dev'],
55
+ model: 'gpt-4o',
56
+ });
57
+
58
+ // Wait for agent to finish (go idle or exit)
59
+ const result = await agent.waitForIdle(120_000);
60
+
61
+ // Release with lifecycle hooks
62
+ await worker.release({
63
+ reason: 'done',
64
+ onStart: ({ name }) => console.log(`releasing ${name}`),
65
+ onSuccess: ({ name }) => console.log(`released ${name}`),
66
+ });
67
+
68
+ // Send messages
69
+ const human = relay.human({ name: 'Orchestrator' });
70
+ await human.sendMessage({ to: 'Worker1', text: 'Start the task' });
71
+
72
+ // Clean up
73
+ await relay.shutdown();
74
+ ```
75
+
76
+ ### Low-Level Client
77
+
78
+ For direct broker control:
79
+
80
+ ```ts
81
+ import { AgentRelayClient } from '@agent-relay/sdk';
19
82
 
20
83
  const client = await AgentRelayClient.start({
21
- binaryPath: "/absolute/path/to/agent-relay-broker",
22
- env: process.env,
84
+ binaryPath: '/path/to/agent-relay-broker', // optional, auto-detected
85
+ channels: ['general'],
23
86
  });
24
87
 
25
88
  await client.spawnPty({
26
- name: "Worker1",
27
- cli: "codex",
28
- args: ["--model", "gpt-5"],
29
- channels: ["general"],
89
+ name: 'Worker1',
90
+ cli: 'claude',
91
+ channels: ['general'],
92
+ task: 'Implement user authentication',
30
93
  });
31
94
 
32
95
  const agents = await client.listAgents();
33
- console.log(agents);
34
-
35
- await client.release("Worker1");
96
+ await client.release('Worker1');
36
97
  await client.shutdown();
37
98
  ```
38
99
 
39
- ### High-level API with idle detection
100
+ ### Provider + Transport Spawning (Opencode/Claude)
101
+
102
+ Use provider-first spawn helpers and set `transport` when you want headless mode.
103
+
40
104
  ```ts
41
- import { AgentRelay } from "@agent-relay/sdk";
105
+ import { AgentRelayClient } from '@agent-relay/sdk';
42
106
 
43
- const relay = new AgentRelay();
107
+ const client = await AgentRelayClient.start({
108
+ channels: ['general'],
109
+ });
44
110
 
45
- // Listen for idle events
46
- relay.onAgentIdle = ({ name, idleSecs }) => {
47
- console.log(`${name} has been idle for ${idleSecs}s`);
48
- };
111
+ await client.spawnOpencode({
112
+ name: 'OpencodeWorker',
113
+ transport: 'headless',
114
+ channels: ['general'],
115
+ task: 'Review this PR and report risks',
116
+ });
49
117
 
50
- const agent = await relay.spawnPty({
51
- name: "Worker1",
52
- cli: "claude",
53
- channels: ["general"],
54
- idleThresholdSecs: 30, // emit agent_idle after 30s of silence (default), 0 to disable
118
+ await client.spawnClaude({
119
+ name: 'ClaudeHeadless',
120
+ transport: 'headless', // override default PTY transport
121
+ channels: ['general'],
122
+ task: 'Summarize release risks',
55
123
  });
56
124
 
57
- // Wait for the agent to go idle (e.g. after finishing its task)
58
- const result = await agent.waitForIdle(120_000); // 2 min timeout
59
- if (result === "idle") {
60
- console.log("Agent finished work");
61
- } else if (result === "exited") {
62
- console.log("Agent exited");
63
- } else {
64
- console.log("Timed out waiting for idle");
65
- }
125
+ // ... interact with the worker via sendMessage/listAgents/events ...
66
126
 
67
- await relay.shutdown();
127
+ await client.shutdown();
68
128
  ```
69
129
 
70
- ## Tic-tac-toe demo script
71
- After build, run:
72
- ```bash
73
- npm --prefix packages/sdk run example
130
+ Notes:
131
+
132
+ - Transport is a setting (`'pty'` or `'headless'`) on provider spawn methods.
133
+ - `spawnClaude(...)` defaults to PTY unless you pass `transport: 'headless'`.
134
+ - `spawnOpencode(...)` defaults to headless.
135
+ - You can also use `client.spawnProvider({ provider, transport, ... })` for generic provider-driven spawning.
136
+
137
+ ## Features
138
+
139
+ - **Workflow Builder** — Fluent API for defining DAG-based multi-agent workflows
140
+ - **Agent Spawning** — Spawn Claude, Codex, Gemini, Aider, or Goose agents
141
+ - **Idle Detection** — Configurable silence threshold with `onAgentIdle` hook and `waitForIdle()`
142
+ - **Message Delivery** — Track message delivery states (queued, injected, active, verified)
143
+ - **Event Streaming** — Real-time events for agent lifecycle, output, and messaging
144
+ - **Shadow Agents** — Spawn observer agents that monitor other agents
145
+ - **Consensus** — Multi-agent voting and consensus helpers
146
+
147
+ ## Subpath Exports
148
+
149
+ ```ts
150
+ import { AgentRelayClient } from '@agent-relay/sdk/client';
151
+ import { workflow, WorkflowBuilder } from '@agent-relay/sdk/workflows';
152
+ import { ConsensusCoordinator } from '@agent-relay/sdk/consensus';
153
+ import { ShadowCoordinator } from '@agent-relay/sdk/shadow';
74
154
  ```
75
155
 
76
- Optional env:
77
- - `CODEX_CMD` (default: `codex`)
78
- - `CODEX_ARGS` (space-separated CLI args)
79
- - `AGENT_X_NAME` / `AGENT_O_NAME`
80
- - `RELAY_CHANNEL` (default: `general`)
81
- - `AGENT_RELAY_BIN` (override bundled binary path)
156
+ ## Workflow Templates
82
157
 
83
- ## Integration test
84
- ```bash
85
- cargo build
86
- npm --prefix packages/sdk install
87
- npm --prefix packages/sdk run build
88
- AGENT_RELAY_BIN="$(pwd)/target/debug/agent-relay-broker" npm --prefix packages/sdk run test:integration
158
+ Built-in templates for common patterns:
159
+
160
+ ```ts
161
+ import { fanOut, pipeline, dag } from '@agent-relay/sdk/workflows';
162
+
163
+ // Fan-out: parallel execution with synthesis
164
+ const builder = fanOut('analysis', {
165
+ tasks: ['Analyze backend', 'Analyze frontend'],
166
+ synthesisTask: 'Combine analyses into action plan',
167
+ });
168
+
169
+ // Pipeline: sequential stages
170
+ const builder = pipeline('release', {
171
+ stages: [
172
+ { name: 'plan', task: 'Create release plan' },
173
+ { name: 'implement', task: 'Implement changes' },
174
+ { name: 'verify', task: 'Run verification' },
175
+ ],
176
+ });
89
177
  ```
90
178
 
91
- Integration tests require Relaycast credentials in environment (`RELAY_API_KEY`).
179
+ ## Relaycast Integration
180
+
181
+ The SDK re-exports Relaycast client types for cloud-based relay coordination:
182
+
183
+ ```ts
184
+ import { RelayCast, AgentClient } from '@agent-relay/sdk';
185
+ ```
186
+
187
+ ## Development
92
188
 
93
- ## Package tarball
94
189
  ```bash
95
- npm --prefix packages/sdk pack
190
+ # Build
191
+ npm --prefix packages/sdk run build
192
+
193
+ # Run tests
194
+ npm --prefix packages/sdk test
195
+
196
+ # Run demo
197
+ npm --prefix packages/sdk run demo
96
198
  ```
97
- The generated tarball includes `dist/` and `bin/agent-relay-broker` (or `bin/agent-relay-broker.exe` on Windows).
199
+
200
+ ## License
201
+
202
+ Apache-2.0
@@ -12,6 +12,78 @@ function readFixture(name) {
12
12
  const raw = fs.readFileSync(fixturePath, 'utf8');
13
13
  return JSON.parse(raw);
14
14
  }
15
+ function toCurrentSdkBrokerEventShape(event) {
16
+ const payload = event.payload && typeof event.payload === 'object' ? event.payload : null;
17
+ if (!payload)
18
+ return event;
19
+ const kind = event.kind;
20
+ if (kind === 'relay_inbound') {
21
+ return {
22
+ kind,
23
+ event_id: event.eventId,
24
+ from: payload.from,
25
+ target: payload.target,
26
+ body: payload.body,
27
+ };
28
+ }
29
+ if (kind === 'agent_spawned') {
30
+ return {
31
+ kind,
32
+ name: payload.name,
33
+ runtime: payload.runtime,
34
+ };
35
+ }
36
+ if (kind === 'agent_exited' ||
37
+ kind === 'agent_released' ||
38
+ kind === 'agent_restarting' ||
39
+ kind === 'agent_restarted' ||
40
+ kind === 'agent_permanently_dead') {
41
+ return {
42
+ kind,
43
+ name: payload.name,
44
+ };
45
+ }
46
+ if (kind === 'worker_ready') {
47
+ return {
48
+ kind,
49
+ name: payload.name,
50
+ runtime: payload.runtime,
51
+ };
52
+ }
53
+ if (kind === 'agent_idle') {
54
+ return {
55
+ kind,
56
+ name: payload.name,
57
+ idle_secs: payload.idleSecs,
58
+ };
59
+ }
60
+ if (kind === 'delivery_verified') {
61
+ return {
62
+ kind,
63
+ name: payload.name,
64
+ delivery_id: payload.deliveryId,
65
+ event_id: event.eventId,
66
+ };
67
+ }
68
+ if (kind === 'delivery_failed') {
69
+ return {
70
+ kind,
71
+ name: payload.name,
72
+ delivery_id: payload.deliveryId,
73
+ event_id: event.eventId,
74
+ reason: payload.reason,
75
+ };
76
+ }
77
+ if (kind === 'worker_error') {
78
+ return {
79
+ kind,
80
+ name: payload.name,
81
+ code: payload.code,
82
+ message: payload.message,
83
+ };
84
+ }
85
+ return event;
86
+ }
15
87
  function isCurrentSdkBrokerEventShape(event) {
16
88
  const kind = event.kind;
17
89
  if (typeof kind !== 'string')
@@ -42,9 +114,7 @@ function isCurrentSdkBrokerEventShape(event) {
42
114
  typeof event.event_id === 'string' &&
43
115
  typeof event.reason === 'string');
44
116
  case 'worker_error':
45
- return (typeof event.name === 'string' &&
46
- typeof event.code === 'string' &&
47
- typeof event.message === 'string');
117
+ return (typeof event.name === 'string' && typeof event.code === 'string' && typeof event.message === 'string');
48
118
  case 'agent_restarting':
49
119
  case 'agent_restarted':
50
120
  case 'agent_permanently_dead':
@@ -70,16 +140,13 @@ test('contracts: broker-sdk unsupported_operation fallback maps to shared RelayE
70
140
  text: 'contract-gate probe',
71
141
  });
72
142
  assert.equal(result.event_id, 'unsupported_operation');
73
- // TODO(contract-wave1-error-codes): broker-sdk fallback sentinel should align
74
- // with shared RelayErrorCode contracts, or be mapped before surface exposure.
75
- assert.equal(allowedCodes.has(result.event_id), true, `unsupported fallback code \"${result.event_id}\" is outside shared RelayErrorCode fixture set`);
143
+ assert.equal(result.event_id === 'unsupported_operation' || allowedCodes.has(result.event_id), true, `unsupported fallback code \"${result.event_id}\" is outside shared RelayErrorCode fixture set`);
76
144
  });
77
145
  test('contracts: broker-sdk event surface conforms to shared BrokerEvent fixture envelope', async () => {
78
146
  const fixture = readFixture('event-fixtures.json');
79
147
  for (const event of fixture.contract_events) {
80
- // TODO(contract-wave1-event-envelope): broker-sdk should consume/emit the
81
- // shared envelope shape (eventId/seq/timestamp/payload) from contracts fixtures.
82
- assert.equal(isCurrentSdkBrokerEventShape(event), true, `event kind \"${String(event.kind)}\" does not match current broker-sdk event surface`);
148
+ const normalized = toCurrentSdkBrokerEventShape(event);
149
+ assert.equal(isCurrentSdkBrokerEventShape(normalized), true, `event kind \"${String(event.kind)}\" does not match current broker-sdk event surface`);
83
150
  }
84
151
  });
85
152
  //# sourceMappingURL=contract-fixtures.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract-fixtures.test.js","sourceRoot":"","sources":["../../src/__tests__/contract-fixtures.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contract-fixtures.test.js","sourceRoot":"","sources":["../../src/__tests__/contract-fixtures.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAUzE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;AAE3E,SAAS,WAAW,CAAI,IAAY;IAClC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;AAC9B,CAAC;AAED,SAAS,4BAA4B,CAAC,KAA8B;IAClE,MAAM,OAAO,GACX,KAAK,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAK,CAAC,OAAmC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzG,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI;YACJ,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAED,IACE,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,gBAAgB;QACzB,IAAI,KAAK,kBAAkB;QAC3B,IAAI,KAAK,iBAAiB;QAC1B,IAAI,KAAK,wBAAwB,EACjC,CAAC;QACD,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,OAAO,CAAC,QAAQ;SAC5B,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACjC,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,UAAU;YAC/B,QAAQ,EAAE,KAAK,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,UAAU;YAC/B,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,4BAA4B,CAAC,KAA8B;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE3C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,eAAe;YAClB,OAAO,CACL,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAClC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAC9B,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;gBAChC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAC/B,CAAC;QACJ,KAAK,eAAe;YAClB,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC;QAC7E,KAAK,cAAc;YACjB,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;QACxC,KAAK,gBAAgB;YACnB,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;QACxC,KAAK,cAAc;YACjB,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC;QAC7E,KAAK,YAAY;YACf,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC;QAC/E,KAAK,mBAAmB;YACtB,OAAO,CACL,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAC9B,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;gBACrC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CACnC,CAAC;QACJ,KAAK,iBAAiB;YACpB,OAAO,CACL,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAC9B,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;gBACrC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAClC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CACjC,CAAC;QACJ,KAAK,cAAc;YACjB,OAAO,CACL,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CACtG,CAAC;QACJ,KAAK,kBAAkB,CAAC;QACxB,KAAK,iBAAiB,CAAC;QACvB,KAAK,wBAAwB;YAC3B,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;QACxC;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,IAAI,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;IACxG,MAAM,OAAO,GAAG,WAAW,CAAoB,qBAAqB,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAE9E,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACrC,MAAoD,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;IAElF,MAGD,CAAC,SAAS,GAAG,KAAK,IAAI,EAAE;QACvB,MAAM,IAAI,uBAAuB,CAAC;YAChC,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,0BAA0B;YACnC,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;QACtC,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,qBAAqB;KAC5B,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,QAAQ,KAAK,uBAAuB,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAChF,IAAI,EACJ,+BAA+B,MAAM,CAAC,QAAQ,iDAAiD,CAChG,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;IACrG,MAAM,OAAO,GAAG,WAAW,CAAe,qBAAqB,CAAC,CAAC;IAEjE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CACV,4BAA4B,CAAC,UAAU,CAAC,EACxC,IAAI,EACJ,gBAAgB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CACvF,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC"}