agent-relay 3.1.21 → 3.1.23

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 (45) hide show
  1. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  2. package/bin/agent-relay-broker-darwin-x64 +0 -0
  3. package/bin/agent-relay-broker-linux-arm64 +0 -0
  4. package/bin/agent-relay-broker-linux-x64 +0 -0
  5. package/dist/index.cjs +341 -64
  6. package/dist/src/cli/commands/core.d.ts.map +1 -1
  7. package/dist/src/cli/commands/core.js +1 -0
  8. package/dist/src/cli/commands/core.js.map +1 -1
  9. package/dist/src/cli/lib/broker-lifecycle.d.ts +1 -0
  10. package/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -1
  11. package/dist/src/cli/lib/broker-lifecycle.js +107 -0
  12. package/dist/src/cli/lib/broker-lifecycle.js.map +1 -1
  13. package/dist/src/cli/lib/core-maintenance.d.ts.map +1 -1
  14. package/dist/src/cli/lib/core-maintenance.js +46 -1
  15. package/dist/src/cli/lib/core-maintenance.js.map +1 -1
  16. package/package.json +8 -8
  17. package/packages/acp-bridge/package.json +2 -2
  18. package/packages/config/dist/cli-registry.generated.d.ts +427 -67
  19. package/packages/config/dist/cli-registry.generated.d.ts.map +1 -1
  20. package/packages/config/dist/cli-registry.generated.js +334 -54
  21. package/packages/config/dist/cli-registry.generated.js.map +1 -1
  22. package/packages/config/package.json +1 -1
  23. package/packages/config/src/cli-registry.generated.ts +342 -54
  24. package/packages/hooks/package.json +4 -4
  25. package/packages/memory/package.json +2 -2
  26. package/packages/openclaw/package.json +2 -2
  27. package/packages/policy/package.json +2 -2
  28. package/packages/sdk/dist/__tests__/spawn-from-env.test.js +28 -12
  29. package/packages/sdk/dist/__tests__/spawn-from-env.test.js.map +1 -1
  30. package/packages/sdk/dist/spawn-from-env.d.ts +2 -1
  31. package/packages/sdk/dist/spawn-from-env.d.ts.map +1 -1
  32. package/packages/sdk/dist/spawn-from-env.js +20 -9
  33. package/packages/sdk/dist/spawn-from-env.js.map +1 -1
  34. package/packages/sdk/package.json +2 -2
  35. package/packages/sdk/src/__tests__/spawn-from-env.test.ts +37 -12
  36. package/packages/sdk/src/spawn-from-env.ts +26 -9
  37. package/packages/sdk-py/agent_relay/__init__.py +19 -16
  38. package/packages/sdk-py/agent_relay/models.py +230 -38
  39. package/packages/sdk-py/pyproject.toml +1 -1
  40. package/packages/shared/cli-registry.yaml +293 -42
  41. package/packages/telemetry/package.json +1 -1
  42. package/packages/trajectory/package.json +2 -2
  43. package/packages/user-directory/package.json +2 -2
  44. package/packages/utils/package.json +2 -2
  45. package/scripts/postinstall.js +117 -0
@@ -12,7 +12,7 @@ clis:
12
12
  name: "Claude Code"
13
13
  package: "@anthropic-ai/claude-code"
14
14
  npm_link: "https://www.npmjs.com/package/@anthropic-ai"
15
- version: "2.1.50"
15
+ version: "2.1.72"
16
16
  install: "npm install -g @anthropic-ai/claude-code"
17
17
  models:
18
18
  sonnet:
@@ -30,25 +30,28 @@ clis:
30
30
  name: "Codex CLI"
31
31
  package: "@openai/codex"
32
32
  npm_link: "https://www.npmjs.com/package/@openai/codex"
33
- version: "0.104.0"
33
+ version: "0.114.0"
34
34
  install: "npm install -g @openai/codex"
35
35
  models:
36
- gpt_5_2_codex:
37
- id: "gpt-5.2-codex"
38
- label: "GPT-5.2 Codex Frontier agentic coding model"
36
+ gpt_5_4:
37
+ id: "gpt-5.4"
38
+ label: "GPT-5.4Latest frontier agentic coding model"
39
39
  default: true
40
40
  gpt_5_3_codex:
41
41
  id: "gpt-5.3-codex"
42
- label: "GPT-5.3 Codex — Latest frontier agentic coding model"
42
+ label: "GPT-5.3 Codex — Frontier agentic coding model"
43
43
  gpt_5_3_codex_spark:
44
44
  id: "gpt-5.3-codex-spark"
45
45
  label: "GPT-5.3 Codex Spark — Ultra-fast coding model"
46
- gpt_5_1_codex_max:
47
- id: "gpt-5.1-codex-max"
48
- label: "GPT-5.1 Codex Max Deep and fast reasoning"
46
+ gpt_5_2_codex:
47
+ id: "gpt-5.2-codex"
48
+ label: "GPT-5.2 Codex — Frontier agentic coding model"
49
49
  gpt_5_2:
50
50
  id: "gpt-5.2"
51
51
  label: "GPT-5.2 — Frontier model, knowledge & reasoning"
52
+ gpt_5_1_codex_max:
53
+ id: "gpt-5.1-codex-max"
54
+ label: "GPT-5.1 Codex Max — Deep and fast reasoning"
52
55
  gpt_5_1_codex_mini:
53
56
  id: "gpt-5.1-codex-mini"
54
57
  label: "GPT-5.1 Codex Mini — Cheaper, faster"
@@ -57,16 +60,19 @@ clis:
57
60
  name: "Gemini CLI"
58
61
  package: "@google/gemini-cli"
59
62
  npm_link: "https://www.npmjs.com/package/@google/gemini-cli"
60
- version: "0.29.5"
63
+ version: "0.33.0"
61
64
  install: "npm install -g @google/gemini-cli"
62
65
  models:
63
- gemini_3_pro_preview:
64
- id: "gemini-3-pro-preview"
65
- label: "Gemini 3 Pro Preview"
66
+ gemini_3_1_pro_preview:
67
+ id: "gemini-3.1-pro-preview"
68
+ label: "Gemini 3.1 Pro Preview"
69
+ default: true
70
+ gemini_3_flash_preview:
71
+ id: "gemini-3-flash-preview"
72
+ label: "Gemini 3 Flash Preview"
66
73
  gemini_2_5_pro:
67
74
  id: "gemini-2.5-pro"
68
75
  label: "Gemini 2.5 Pro"
69
- default: true
70
76
  gemini_2_5_flash:
71
77
  id: "gemini-2.5-flash"
72
78
  label: "Gemini 2.5 Flash"
@@ -77,73 +83,318 @@ clis:
77
83
  cursor:
78
84
  name: "Cursor"
79
85
  package: "cursor"
80
- version: "0.48.6"
86
+ version: "2026.02.27-e7d2ef6"
81
87
  install: "Download from cursor.com"
82
88
  models:
83
- opus_4_5_thinking:
84
- id: "opus-4.5-thinking"
85
- label: "Claude 4.5 Opus (Thinking)"
89
+ opus_4_6_thinking:
90
+ id: "opus-4.6-thinking"
91
+ label: "Claude 4.6 Opus (Thinking)"
86
92
  default: true
93
+ opus_4_6:
94
+ id: "opus-4.6"
95
+ label: "Claude 4.6 Opus"
87
96
  opus_4_5:
88
97
  id: "opus-4.5"
89
98
  label: "Claude 4.5 Opus"
99
+ opus_4_5_thinking:
100
+ id: "opus-4.5-thinking"
101
+ label: "Claude 4.5 Opus (Thinking)"
102
+ sonnet_4_6:
103
+ id: "sonnet-4.6"
104
+ label: "Claude 4.6 Sonnet"
105
+ sonnet_4_6_thinking:
106
+ id: "sonnet-4.6-thinking"
107
+ label: "Claude 4.6 Sonnet (Thinking)"
90
108
  sonnet_4_5:
91
109
  id: "sonnet-4.5"
92
110
  label: "Claude 4.5 Sonnet"
93
111
  sonnet_4_5_thinking:
94
112
  id: "sonnet-4.5-thinking"
95
113
  label: "Claude 4.5 Sonnet (Thinking)"
96
- gpt_5_2_codex:
97
- id: "gpt-5.2-codex"
98
- label: "GPT-5.2 Codex"
99
- gpt_5_2_codex_high:
100
- id: "gpt-5.2-codex-high"
101
- label: "GPT-5.2 Codex High"
102
- gpt_5_2_codex_low:
103
- id: "gpt-5.2-codex-low"
104
- label: "GPT-5.2 Codex Low"
114
+ composer_1_5:
115
+ id: "composer-1.5"
116
+ label: "Composer 1.5"
117
+ composer_1:
118
+ id: "composer-1"
119
+ label: "Composer 1"
120
+ gpt_5_4_xhigh:
121
+ id: "gpt-5.4-xhigh"
122
+ label: "GPT-5.4 Extra High"
123
+ gpt_5_4_xhigh_fast:
124
+ id: "gpt-5.4-xhigh-fast"
125
+ label: "GPT-5.4 Extra High Fast"
126
+ gpt_5_4_high:
127
+ id: "gpt-5.4-high"
128
+ label: "GPT-5.4 High"
129
+ gpt_5_4_high_fast:
130
+ id: "gpt-5.4-high-fast"
131
+ label: "GPT-5.4 High Fast"
132
+ gpt_5_4_medium:
133
+ id: "gpt-5.4-medium"
134
+ label: "GPT-5.4"
135
+ gpt_5_4_medium_fast:
136
+ id: "gpt-5.4-medium-fast"
137
+ label: "GPT-5.4 Fast"
138
+ gpt_5_4_low:
139
+ id: "gpt-5.4-low"
140
+ label: "GPT-5.4 Low"
141
+ gpt_5_3_codex_xhigh:
142
+ id: "gpt-5.3-codex-xhigh"
143
+ label: "GPT-5.3 Codex Extra High"
144
+ gpt_5_3_codex_xhigh_fast:
145
+ id: "gpt-5.3-codex-xhigh-fast"
146
+ label: "GPT-5.3 Codex Extra High Fast"
147
+ gpt_5_3_codex_high:
148
+ id: "gpt-5.3-codex-high"
149
+ label: "GPT-5.3 Codex High"
150
+ gpt_5_3_codex_high_fast:
151
+ id: "gpt-5.3-codex-high-fast"
152
+ label: "GPT-5.3 Codex High Fast"
153
+ gpt_5_3_codex:
154
+ id: "gpt-5.3-codex"
155
+ label: "GPT-5.3 Codex"
156
+ gpt_5_3_codex_fast:
157
+ id: "gpt-5.3-codex-fast"
158
+ label: "GPT-5.3 Codex Fast"
159
+ gpt_5_3_codex_low:
160
+ id: "gpt-5.3-codex-low"
161
+ label: "GPT-5.3 Codex Low"
162
+ gpt_5_3_codex_low_fast:
163
+ id: "gpt-5.3-codex-low-fast"
164
+ label: "GPT-5.3 Codex Low Fast"
165
+ gpt_5_3_codex_spark_preview:
166
+ id: "gpt-5.3-codex-spark-preview"
167
+ label: "GPT-5.3 Codex Spark"
105
168
  gpt_5_2_codex_xhigh:
106
169
  id: "gpt-5.2-codex-xhigh"
107
170
  label: "GPT-5.2 Codex Extra High"
108
- gpt_5_2_codex_fast:
109
- id: "gpt-5.2-codex-fast"
110
- label: "GPT-5.2 Codex Fast"
171
+ gpt_5_2_codex_xhigh_fast:
172
+ id: "gpt-5.2-codex-xhigh-fast"
173
+ label: "GPT-5.2 Codex Extra High Fast"
174
+ gpt_5_2_codex_high:
175
+ id: "gpt-5.2-codex-high"
176
+ label: "GPT-5.2 Codex High"
111
177
  gpt_5_2_codex_high_fast:
112
178
  id: "gpt-5.2-codex-high-fast"
113
179
  label: "GPT-5.2 Codex High Fast"
180
+ gpt_5_2_codex:
181
+ id: "gpt-5.2-codex"
182
+ label: "GPT-5.2 Codex"
183
+ gpt_5_2_codex_fast:
184
+ id: "gpt-5.2-codex-fast"
185
+ label: "GPT-5.2 Codex Fast"
186
+ gpt_5_2_codex_low:
187
+ id: "gpt-5.2-codex-low"
188
+ label: "GPT-5.2 Codex Low"
114
189
  gpt_5_2_codex_low_fast:
115
190
  id: "gpt-5.2-codex-low-fast"
116
191
  label: "GPT-5.2 Codex Low Fast"
117
- gpt_5_2_codex_xhigh_fast:
118
- id: "gpt-5.2-codex-xhigh-fast"
119
- label: "GPT-5.2 Codex Extra High Fast"
120
- gpt_5_1_codex_max:
121
- id: "gpt-5.1-codex-max"
122
- label: "GPT-5.1 Codex Max"
123
- gpt_5_1_codex_max_high:
124
- id: "gpt-5.1-codex-max-high"
125
- label: "GPT-5.1 Codex Max High"
126
192
  gpt_5_2:
127
193
  id: "gpt-5.2"
128
194
  label: "GPT-5.2"
129
195
  gpt_5_2_high:
130
196
  id: "gpt-5.2-high"
131
197
  label: "GPT-5.2 High"
198
+ gpt_5_1_codex_max:
199
+ id: "gpt-5.1-codex-max"
200
+ label: "GPT-5.1 Codex Max"
201
+ gpt_5_1_codex_max_high:
202
+ id: "gpt-5.1-codex-max-high"
203
+ label: "GPT-5.1 Codex Max High"
204
+ gpt_5_1_codex_mini:
205
+ id: "gpt-5.1-codex-mini"
206
+ label: "GPT-5.1 Codex Mini"
132
207
  gpt_5_1_high:
133
208
  id: "gpt-5.1-high"
134
209
  label: "GPT-5.1 High"
210
+ gemini_3_1_pro:
211
+ id: "gemini-3.1-pro"
212
+ label: "Gemini 3.1 Pro"
135
213
  gemini_3_pro:
136
214
  id: "gemini-3-pro"
137
215
  label: "Gemini 3 Pro"
138
216
  gemini_3_flash:
139
217
  id: "gemini-3-flash"
140
218
  label: "Gemini 3 Flash"
141
- composer_1:
142
- id: "composer-1"
143
- label: "Composer 1"
144
219
  grok:
145
220
  id: "grok"
146
221
  label: "Grok"
222
+ kimi_k2_5:
223
+ id: "kimi-k2.5"
224
+ label: "Kimi K2.5"
225
+
226
+ droid:
227
+ name: "Droid"
228
+ package: "droid"
229
+ version: "0.1.0"
230
+ install: "Download from droid.dev"
231
+ models:
232
+ opus_4_6_fast:
233
+ id: "opus-4.6-fast"
234
+ label: "Opus 4.6 Fast Mode (12x)"
235
+ default: true
236
+ opus_4_5:
237
+ id: "opus-4.5"
238
+ label: "Opus 4.5 (2x)"
239
+ sonnet_4_5:
240
+ id: "sonnet-4.5"
241
+ label: "Sonnet 4.5 (1.2x)"
242
+ haiku_4_5:
243
+ id: "haiku-4.5"
244
+ label: "Haiku 4.5 (0.4x)"
245
+ gpt_5_2:
246
+ id: "gpt-5.2"
247
+ label: "GPT-5.2 (0.7x)"
248
+ gpt_5_2_codex:
249
+ id: "gpt-5.2-codex"
250
+ label: "GPT-5.2 Codex (0.7x)"
251
+ gemini_3_flash:
252
+ id: "gemini-3-flash"
253
+ label: "Gemini 3 Flash (0.2x)"
254
+ droid_core:
255
+ id: "droid-core-glm-4.7"
256
+ label: "Droid Core (GLM-4.7) (0.25x)"
257
+
258
+ opencode:
259
+ name: "OpenCode"
260
+ package: "opencode-ai"
261
+ npm_link: "https://www.npmjs.com/package/opencode-ai"
262
+ version: "1.2.24"
263
+ install: "npm install -g opencode-ai"
264
+ models:
265
+ opencode_big_pickle:
266
+ id: "opencode/big-pickle"
267
+ label: "Big Pickle"
268
+ opencode_gpt_5_nano:
269
+ id: "opencode/gpt-5-nano"
270
+ label: "GPT-5 Nano (OpenCode)"
271
+ opencode_mimo_v2_flash_free:
272
+ id: "opencode/mimo-v2-flash-free"
273
+ label: "Mimo V2 Flash Free"
274
+ opencode_minimax_m2_5_free:
275
+ id: "opencode/minimax-m2.5-free"
276
+ label: "MiniMax M2.5 Free"
277
+ openai_codex_mini_latest:
278
+ id: "openai/codex-mini-latest"
279
+ label: "Codex Mini Latest"
280
+ openai_gpt_3_5_turbo:
281
+ id: "openai/gpt-3.5-turbo"
282
+ label: "GPT-3.5 Turbo"
283
+ openai_gpt_4:
284
+ id: "openai/gpt-4"
285
+ label: "GPT-4"
286
+ openai_gpt_4_turbo:
287
+ id: "openai/gpt-4-turbo"
288
+ label: "GPT-4 Turbo"
289
+ openai_gpt_4_1:
290
+ id: "openai/gpt-4.1"
291
+ label: "GPT-4.1"
292
+ openai_gpt_4_1_mini:
293
+ id: "openai/gpt-4.1-mini"
294
+ label: "GPT-4.1 Mini"
295
+ openai_gpt_4_1_nano:
296
+ id: "openai/gpt-4.1-nano"
297
+ label: "GPT-4.1 Nano"
298
+ openai_gpt_4o:
299
+ id: "openai/gpt-4o"
300
+ label: "GPT-4o"
301
+ openai_gpt_4o_2024_05_13:
302
+ id: "openai/gpt-4o-2024-05-13"
303
+ label: "GPT-4o (2024-05-13)"
304
+ openai_gpt_4o_2024_08_06:
305
+ id: "openai/gpt-4o-2024-08-06"
306
+ label: "GPT-4o (2024-08-06)"
307
+ openai_gpt_4o_2024_11_20:
308
+ id: "openai/gpt-4o-2024-11-20"
309
+ label: "GPT-4o (2024-11-20)"
310
+ openai_gpt_4o_mini:
311
+ id: "openai/gpt-4o-mini"
312
+ label: "GPT-4o Mini"
313
+ openai_gpt_5:
314
+ id: "openai/gpt-5"
315
+ label: "GPT-5"
316
+ openai_gpt_5_codex:
317
+ id: "openai/gpt-5-codex"
318
+ label: "GPT-5 Codex"
319
+ openai_gpt_5_mini:
320
+ id: "openai/gpt-5-mini"
321
+ label: "GPT-5 Mini"
322
+ openai_gpt_5_nano:
323
+ id: "openai/gpt-5-nano"
324
+ label: "GPT-5 Nano"
325
+ openai_gpt_5_pro:
326
+ id: "openai/gpt-5-pro"
327
+ label: "GPT-5 Pro"
328
+ openai_gpt_5_1:
329
+ id: "openai/gpt-5.1"
330
+ label: "GPT-5.1"
331
+ openai_gpt_5_1_chat_latest:
332
+ id: "openai/gpt-5.1-chat-latest"
333
+ label: "GPT-5.1 Chat Latest"
334
+ openai_gpt_5_1_codex:
335
+ id: "openai/gpt-5.1-codex"
336
+ label: "GPT-5.1 Codex"
337
+ openai_gpt_5_1_codex_max:
338
+ id: "openai/gpt-5.1-codex-max"
339
+ label: "GPT-5.1 Codex Max"
340
+ openai_gpt_5_1_codex_mini:
341
+ id: "openai/gpt-5.1-codex-mini"
342
+ label: "GPT-5.1 Codex Mini"
343
+ openai_gpt_5_2:
344
+ id: "openai/gpt-5.2"
345
+ label: "GPT-5.2"
346
+ default: true
347
+ openai_gpt_5_2_chat_latest:
348
+ id: "openai/gpt-5.2-chat-latest"
349
+ label: "GPT-5.2 Chat Latest"
350
+ openai_gpt_5_2_codex:
351
+ id: "openai/gpt-5.2-codex"
352
+ label: "GPT-5.2 Codex"
353
+ openai_gpt_5_2_pro:
354
+ id: "openai/gpt-5.2-pro"
355
+ label: "GPT-5.2 Pro"
356
+ openai_gpt_5_3_codex:
357
+ id: "openai/gpt-5.3-codex"
358
+ label: "GPT-5.3 Codex"
359
+ openai_gpt_5_3_codex_spark:
360
+ id: "openai/gpt-5.3-codex-spark"
361
+ label: "GPT-5.3 Codex Spark"
362
+ openai_gpt_5_4:
363
+ id: "openai/gpt-5.4"
364
+ label: "GPT-5.4"
365
+ openai_gpt_5_4_pro:
366
+ id: "openai/gpt-5.4-pro"
367
+ label: "GPT-5.4 Pro"
368
+ openai_o1:
369
+ id: "openai/o1"
370
+ label: "O1"
371
+ openai_o1_mini:
372
+ id: "openai/o1-mini"
373
+ label: "O1 Mini"
374
+ openai_o1_preview:
375
+ id: "openai/o1-preview"
376
+ label: "O1 Preview"
377
+ openai_o1_pro:
378
+ id: "openai/o1-pro"
379
+ label: "O1 Pro"
380
+ openai_o3:
381
+ id: "openai/o3"
382
+ label: "O3"
383
+ openai_o3_deep_research:
384
+ id: "openai/o3-deep-research"
385
+ label: "O3 Deep Research"
386
+ openai_o3_mini:
387
+ id: "openai/o3-mini"
388
+ label: "O3 Mini"
389
+ openai_o3_pro:
390
+ id: "openai/o3-pro"
391
+ label: "O3 Pro"
392
+ openai_o4_mini:
393
+ id: "openai/o4-mini"
394
+ label: "O4 Mini"
395
+ openai_o4_mini_deep_research:
396
+ id: "openai/o4-mini-deep-research"
397
+ label: "O4 Mini Deep Research"
147
398
 
148
399
  aider:
149
400
  name: "Aider"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/telemetry",
3
- "version": "3.1.21",
3
+ "version": "3.1.23",
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.21",
3
+ "version": "3.1.23",
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.21"
25
+ "@agent-relay/config": "3.1.23"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/user-directory",
3
- "version": "3.1.21",
3
+ "version": "3.1.23",
4
4
  "description": "User directory service for agent-relay (per-user credential storage)",
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/utils": "3.1.21"
25
+ "@agent-relay/utils": "3.1.23"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/utils",
3
- "version": "3.1.21",
3
+ "version": "3.1.23",
4
4
  "description": "Shared utilities for agent-relay: logging, name generation, command resolution, update checking",
5
5
  "type": "module",
6
6
  "main": "dist/cjs/index.js",
@@ -112,7 +112,7 @@
112
112
  "vitest": "^3.2.4"
113
113
  },
114
114
  "dependencies": {
115
- "@agent-relay/config": "3.1.21",
115
+ "@agent-relay/config": "3.1.23",
116
116
  "compare-versions": "^6.1.1"
117
117
  },
118
118
  "publishConfig": {
@@ -373,6 +373,112 @@ async function installBrokerBinary() {
373
373
  return false;
374
374
  }
375
375
 
376
+ /**
377
+ * Install the standalone dashboard-server binary.
378
+ *
379
+ * The curl-based installer downloads this binary, but npm install does not.
380
+ * This brings the npm install path to parity so `agent-relay up` can start
381
+ * the dashboard without falling back to `npx @agent-relay/dashboard-server@latest`.
382
+ */
383
+ async function installDashboardBinary() {
384
+ const homeDir = os.homedir();
385
+ const targetPath = path.join(homeDir, '.local', 'bin', 'relay-dashboard-server');
386
+
387
+ // Already installed?
388
+ if (fs.existsSync(targetPath)) {
389
+ try {
390
+ execSync(`"${targetPath}" --version`, { stdio: 'pipe' });
391
+ info('Dashboard server binary already installed');
392
+ return true;
393
+ } catch {
394
+ // Binary exists but broken — reinstall
395
+ }
396
+ }
397
+
398
+ const platform = os.platform();
399
+ const arch = os.arch();
400
+ const platformMap = { darwin: 'darwin', linux: 'linux' };
401
+ const archMap = { arm64: 'arm64', x64: 'x64' };
402
+ const targetPlatform = platformMap[platform];
403
+ const targetArch = archMap[arch];
404
+
405
+ if (!targetPlatform || !targetArch) {
406
+ info(`No prebuilt dashboard binary for ${platform}-${arch}`);
407
+ return false;
408
+ }
409
+
410
+ const binaryName = `relay-dashboard-server-${targetPlatform}-${targetArch}`;
411
+ const downloadUrl = `https://github.com/AgentWorkforce/relay-dashboard/releases/latest/download/${binaryName}`;
412
+
413
+ info(`Downloading dashboard-server binary...`);
414
+ try {
415
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
416
+ await downloadBinary(downloadUrl, targetPath);
417
+ fs.chmodSync(targetPath, 0o755);
418
+ resignBinaryForMacOS(targetPath);
419
+ success('Downloaded dashboard-server binary');
420
+ return true;
421
+ } catch (err) {
422
+ const message = err instanceof Error ? err.message : String(err);
423
+ info(`Dashboard binary not available (${message}) — will use npx fallback`);
424
+ return false;
425
+ }
426
+ }
427
+
428
+ /**
429
+ * Install the relay-acp binary (Zed editor integration).
430
+ *
431
+ * The curl-based installer downloads this binary, but npm install does not.
432
+ * This brings the npm install path to parity.
433
+ */
434
+ async function installRelayAcpBinary() {
435
+ const homeDir = os.homedir();
436
+ const targetPath = path.join(homeDir, '.local', 'bin', 'relay-acp');
437
+
438
+ // Already installed and functional?
439
+ if (fs.existsSync(targetPath)) {
440
+ try {
441
+ execSync(`"${targetPath}" --version`, { stdio: 'pipe' });
442
+ info('relay-acp binary already installed');
443
+ return true;
444
+ } catch {
445
+ // Binary exists but broken or outdated — reinstall
446
+ }
447
+ }
448
+
449
+ const platform = os.platform();
450
+ const arch = os.arch();
451
+ const platformMap = { darwin: 'darwin', linux: 'linux' };
452
+ const archMap = { arm64: 'arm64', x64: 'x64' };
453
+ const targetPlatform = platformMap[platform];
454
+ const targetArch = archMap[arch];
455
+
456
+ if (!targetPlatform || !targetArch) {
457
+ return false;
458
+ }
459
+
460
+ const pkgRoot = getPackageRoot();
461
+ const version = getPackageVersion(pkgRoot);
462
+ if (!version) return false;
463
+
464
+ const binaryName = `relay-acp-${targetPlatform}-${targetArch}`;
465
+ const downloadUrl = `https://github.com/AgentWorkforce/relay/releases/download/v${version}/${binaryName}`;
466
+
467
+ info('Downloading relay-acp binary (Zed editor integration)...');
468
+ try {
469
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
470
+ await downloadBinary(downloadUrl, targetPath);
471
+ fs.chmodSync(targetPath, 0o755);
472
+ resignBinaryForMacOS(targetPath);
473
+ success('Downloaded relay-acp binary');
474
+ return true;
475
+ } catch (err) {
476
+ const message = err instanceof Error ? err.message : String(err);
477
+ info(`relay-acp binary not available (${message}) — Zed integration requires manual install`);
478
+ return false;
479
+ }
480
+ }
481
+
376
482
  /**
377
483
  * Setup workspace package symlinks for global/bundled installs.
378
484
  *
@@ -639,9 +745,20 @@ async function main() {
639
745
  // Always install dashboard dependencies (needed for build)
640
746
  installDashboardDeps();
641
747
 
748
+ // Install dashboard-server and relay-acp binaries for parity with curl installer
749
+ const hasDashboardBinary = await installDashboardBinary();
750
+ const hasAcpBinary = await installRelayAcpBinary();
751
+
642
752
  // Always print diagnostics (even in CI)
643
753
  logPostinstallDiagnostics(hasBrokerBinary, sqliteStatus, linkResult);
644
754
 
755
+ if (hasDashboardBinary) {
756
+ console.log('✓ dashboard-server binary installed');
757
+ }
758
+ if (hasAcpBinary) {
759
+ console.log('✓ relay-acp binary installed (Zed editor integration)');
760
+ }
761
+
645
762
  if (!hasBrokerBinary) {
646
763
  warn('agent-relay-broker binary not available');
647
764
  info('Agent spawning will not work without the broker binary.');