@phnx-labs/agents-cli 1.22.39 → 1.22.41

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 (569) hide show
  1. package/CHANGELOG.md +316 -0
  2. package/README.md +116 -70
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.js +45 -27
  5. package/dist/browser.js +2 -2
  6. package/dist/cli/command-registry.d.ts +135 -0
  7. package/dist/cli/command-registry.js +259 -0
  8. package/dist/commands/accounts.d.ts +20 -0
  9. package/dist/commands/accounts.js +186 -25
  10. package/dist/commands/apply.d.ts +3 -3
  11. package/dist/commands/apply.js +20 -63
  12. package/dist/commands/browser.d.ts +15 -0
  13. package/dist/commands/browser.js +318 -131
  14. package/dist/commands/budget.d.ts +7 -6
  15. package/dist/commands/budget.js +8 -7
  16. package/dist/commands/cloud.js +17 -20
  17. package/dist/commands/commands.js +1 -1
  18. package/dist/commands/computer-actions.d.ts +1 -35
  19. package/dist/commands/computer-actions.js +13 -181
  20. package/dist/commands/computer.d.ts +28 -3
  21. package/dist/commands/computer.js +93 -65
  22. package/dist/commands/config.js +16 -3
  23. package/dist/commands/cost.d.ts +2 -1
  24. package/dist/commands/cost.js +7 -6
  25. package/dist/commands/daemon.js +151 -4
  26. package/dist/commands/detach.js +1 -1
  27. package/dist/commands/doctor.js +19 -11
  28. package/dist/commands/events.js +1 -1
  29. package/dist/commands/exec.d.ts +2 -50
  30. package/dist/commands/exec.js +160 -215
  31. package/dist/commands/factory.js +1 -1
  32. package/dist/commands/feed.d.ts +2 -2
  33. package/dist/commands/feed.js +12 -23
  34. package/dist/commands/fleet-capture.js +25 -27
  35. package/dist/commands/focus.d.ts +2 -3
  36. package/dist/commands/focus.js +34 -9
  37. package/dist/commands/go.js +15 -5
  38. package/dist/commands/harness.d.ts +3 -3
  39. package/dist/commands/harness.js +53 -5
  40. package/dist/commands/hooks.js +1 -1
  41. package/dist/commands/import.js +2 -2
  42. package/dist/commands/insights.d.ts +5 -5
  43. package/dist/commands/insights.js +15 -9
  44. package/dist/commands/inspect.d.ts +2 -3
  45. package/dist/commands/inspect.js +4 -16
  46. package/dist/commands/logs.d.ts +2 -2
  47. package/dist/commands/logs.js +9 -9
  48. package/dist/commands/mcp.js +2 -2
  49. package/dist/commands/memory.js +1 -1
  50. package/dist/commands/message.d.ts +1 -1
  51. package/dist/commands/message.js +7 -7
  52. package/dist/commands/mine.d.ts +11 -8
  53. package/dist/commands/mine.js +11 -10
  54. package/dist/commands/models.js +1 -1
  55. package/dist/commands/modes.js +1 -1
  56. package/dist/commands/monitors.js +23 -6
  57. package/dist/commands/output.d.ts +7 -6
  58. package/dist/commands/output.js +11 -10
  59. package/dist/commands/packages.js +4 -4
  60. package/dist/commands/perf.js +1 -1
  61. package/dist/commands/permissions.js +49 -32
  62. package/dist/commands/plugins.d.ts +1 -1
  63. package/dist/commands/plugins.js +3 -3
  64. package/dist/commands/profiles.d.ts +6 -9
  65. package/dist/commands/profiles.js +8 -321
  66. package/dist/commands/projects.d.ts +9 -0
  67. package/dist/commands/projects.js +140 -8
  68. package/dist/commands/prune.js +5 -13
  69. package/dist/commands/refresh-rules.js +1 -1
  70. package/dist/commands/repo.d.ts +5 -7
  71. package/dist/commands/repo.js +34 -18
  72. package/dist/commands/resource-view.js +4 -0
  73. package/dist/commands/resume.d.ts +11 -7
  74. package/dist/commands/resume.js +82 -98
  75. package/dist/commands/route.d.ts +12 -0
  76. package/dist/commands/route.js +261 -0
  77. package/dist/commands/routines.d.ts +2 -3
  78. package/dist/commands/routines.js +120 -145
  79. package/dist/commands/rules.js +1 -1
  80. package/dist/commands/run-account-picker.d.ts +1 -1
  81. package/dist/commands/run-account-picker.js +2 -2
  82. package/dist/commands/run-broadcast.d.ts +21 -0
  83. package/dist/commands/run-broadcast.js +89 -0
  84. package/dist/commands/run-cloud.js +1 -1
  85. package/dist/commands/secrets-vault.d.ts +10 -0
  86. package/dist/commands/{login.js → secrets-vault.js} +34 -14
  87. package/dist/commands/secrets.d.ts +4 -4
  88. package/dist/commands/secrets.js +158 -159
  89. package/dist/commands/sessions-backfill.js +1 -1
  90. package/dist/commands/sessions-browser.d.ts +1 -1
  91. package/dist/commands/sessions-browser.js +9 -5
  92. package/dist/commands/sessions-export.js +2 -2
  93. package/dist/commands/sessions-inject.js +4 -5
  94. package/dist/commands/sessions-migrate.js +16 -27
  95. package/dist/commands/sessions-picker.d.ts +14 -0
  96. package/dist/commands/sessions-picker.js +209 -13
  97. package/dist/commands/sessions-resume.d.ts +7 -3
  98. package/dist/commands/sessions-resume.js +81 -33
  99. package/dist/commands/sessions-share.d.ts +25 -0
  100. package/dist/commands/sessions-share.js +166 -0
  101. package/dist/commands/sessions-stats.js +2 -2
  102. package/dist/commands/sessions.d.ts +75 -68
  103. package/dist/commands/sessions.js +144 -180
  104. package/dist/commands/setup-browser.js +1 -1
  105. package/dist/commands/setup-computer.js +1 -1
  106. package/dist/commands/setup-fleet.js +3 -0
  107. package/dist/commands/setup-mine.d.ts +7 -3
  108. package/dist/commands/setup-mine.js +13 -8
  109. package/dist/commands/setup-preferences.js +2 -2
  110. package/dist/commands/setup-secrets.js +2 -2
  111. package/dist/commands/setup-watchdog.js +2 -2
  112. package/dist/commands/setup.js +7 -2
  113. package/dist/commands/share.d.ts +65 -0
  114. package/dist/commands/share.js +253 -20
  115. package/dist/commands/skills.js +3 -3
  116. package/dist/commands/snapshot.d.ts +2 -2
  117. package/dist/commands/snapshot.js +9 -9
  118. package/dist/commands/ssh.d.ts +1 -1
  119. package/dist/commands/ssh.js +186 -64
  120. package/dist/commands/subagents.js +1 -1
  121. package/dist/commands/sync.js +24 -9
  122. package/dist/commands/teams.d.ts +2 -2
  123. package/dist/commands/teams.js +9 -18
  124. package/dist/commands/tmux.js +5 -1
  125. package/dist/commands/trash.js +1 -1
  126. package/dist/commands/usage.d.ts +1 -1
  127. package/dist/commands/usage.js +2 -2
  128. package/dist/commands/utils.d.ts +4 -14
  129. package/dist/commands/utils.js +6 -27
  130. package/dist/commands/versions.js +2 -2
  131. package/dist/commands/view.d.ts +9 -77
  132. package/dist/commands/view.js +23 -8
  133. package/dist/commands/watchdog.js +1 -1
  134. package/dist/commands/webhook.js +25 -34
  135. package/dist/commands/workflows.js +1 -1
  136. package/dist/index.js +1 -1
  137. package/dist/lib/account-capabilities.d.ts +39 -0
  138. package/dist/lib/account-capabilities.js +59 -0
  139. package/dist/lib/account-catalog.js +1 -1
  140. package/dist/lib/account-registry.d.ts +66 -0
  141. package/dist/lib/account-registry.js +151 -5
  142. package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
  143. package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
  144. package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
  145. package/dist/lib/{usage.js → accounting/usage.js} +11 -11
  146. package/dist/lib/agent-spec/provider.js +1 -1
  147. package/dist/lib/agents.d.ts +72 -4
  148. package/dist/lib/agents.js +231 -199
  149. package/dist/lib/answer-router.d.ts +2 -2
  150. package/dist/lib/ask-classifier.d.ts +1 -1
  151. package/dist/lib/ask-classifier.js +1 -1
  152. package/dist/lib/audit/log.js +1 -1
  153. package/dist/lib/auth-health.d.ts +1 -1
  154. package/dist/lib/auth-health.js +2 -2
  155. package/dist/lib/brand.js +1 -1
  156. package/dist/lib/browser/caller-identity.d.ts +28 -0
  157. package/dist/lib/browser/caller-identity.js +156 -0
  158. package/dist/lib/browser/cdp.js +5 -1
  159. package/dist/lib/browser/chrome.js +12 -1
  160. package/dist/lib/browser/drivers/ssh.d.ts +1 -1
  161. package/dist/lib/browser/drivers/ssh.js +3 -2
  162. package/dist/lib/browser/hygiene.d.ts +10 -2
  163. package/dist/lib/browser/hygiene.js +7 -4
  164. package/dist/lib/browser/ipc.d.ts +22 -2
  165. package/dist/lib/browser/ipc.js +185 -21
  166. package/dist/lib/browser/profiles.d.ts +69 -5
  167. package/dist/lib/browser/profiles.js +135 -13
  168. package/dist/lib/browser/remote-control.d.ts +2 -2
  169. package/dist/lib/browser/remote-control.js +3 -3
  170. package/dist/lib/browser/runtime-state.d.ts +79 -0
  171. package/dist/lib/browser/runtime-state.js +119 -1
  172. package/dist/lib/browser/service.d.ts +137 -2
  173. package/dist/lib/browser/service.js +492 -54
  174. package/dist/lib/browser/sessions-list.d.ts +2 -1
  175. package/dist/lib/browser/sessions-list.js +4 -13
  176. package/dist/lib/browser/types.d.ts +19 -1
  177. package/dist/lib/budget/config.js +1 -1
  178. package/dist/lib/budget/ledger.js +1 -1
  179. package/dist/lib/byok-usage.js +1 -1
  180. package/dist/lib/capabilities.js +3 -15
  181. package/dist/lib/catchup.d.ts +1 -1
  182. package/dist/lib/catchup.js +1 -1
  183. package/dist/lib/cloud/dispatch.js +1 -1
  184. package/dist/lib/cloud/host.d.ts +3 -3
  185. package/dist/lib/cloud/host.js +5 -5
  186. package/dist/lib/cloud/rush.d.ts +9 -21
  187. package/dist/lib/cloud/rush.js +33 -120
  188. package/dist/lib/cloud/types.d.ts +2 -2
  189. package/dist/lib/commands.js +3 -13
  190. package/dist/lib/computer/actions.d.ts +36 -0
  191. package/dist/lib/computer/actions.js +162 -0
  192. package/dist/lib/computer/dispatch.d.ts +2 -2
  193. package/dist/lib/computer/dispatch.js +2 -2
  194. package/dist/lib/computer/sessions-list.d.ts +3 -3
  195. package/dist/lib/computer/sessions-list.js +2 -2
  196. package/dist/lib/config-keys.d.ts +2 -1
  197. package/dist/lib/config-keys.js +8 -4
  198. package/dist/lib/config-machine-keys.d.ts +4 -2
  199. package/dist/lib/config-machine-keys.js +5 -2
  200. package/dist/lib/crabbox/lease.js +9 -1
  201. package/dist/lib/crabbox/runtimes.d.ts +32 -7
  202. package/dist/lib/crabbox/runtimes.js +72 -30
  203. package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
  204. package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
  205. package/dist/lib/daemon-services.d.ts +1 -1
  206. package/dist/lib/daemon-services.js +5 -0
  207. package/dist/lib/daemon-ticks.d.ts +25 -0
  208. package/dist/lib/daemon-ticks.js +31 -1
  209. package/dist/lib/daemon-webhooks.d.ts +104 -0
  210. package/dist/lib/daemon-webhooks.js +215 -0
  211. package/dist/lib/device-config.d.ts +85 -75
  212. package/dist/lib/device-config.js +280 -142
  213. package/dist/lib/devices/config-migration.d.ts +29 -34
  214. package/dist/lib/devices/config-migration.js +209 -130
  215. package/dist/lib/devices/connect.d.ts +2 -2
  216. package/dist/lib/devices/connect.js +2 -2
  217. package/dist/lib/devices/discovery-policy.d.ts +30 -0
  218. package/dist/lib/devices/discovery-policy.js +101 -0
  219. package/dist/lib/devices/fleet-inventory.js +8 -3
  220. package/dist/lib/devices/harness-inventory.d.ts +1 -1
  221. package/dist/lib/devices/harness-inventory.js +12 -3
  222. package/dist/lib/devices/known-hosts.js +1 -1
  223. package/dist/lib/devices/pool.d.ts +10 -5
  224. package/dist/lib/devices/pool.js +5 -7
  225. package/dist/lib/devices/registry.d.ts +1 -1
  226. package/dist/lib/devices/registry.js +1 -1
  227. package/dist/lib/devices/resolve-profile.d.ts +2 -2
  228. package/dist/lib/devices/resolve-profile.js +2 -2
  229. package/dist/lib/devices/resolve-target.d.ts +1 -1
  230. package/dist/lib/devices/resolve-target.js +4 -4
  231. package/dist/lib/devices/self-host.d.ts +1 -1
  232. package/dist/lib/devices/self-host.js +3 -3
  233. package/dist/lib/devices/ssh-config.d.ts +1 -1
  234. package/dist/lib/devices/stats-cache.js +1 -1
  235. package/dist/lib/devices/sync.d.ts +3 -1
  236. package/dist/lib/devices/sync.js +3 -3
  237. package/dist/lib/doctor-diff.js +4 -4
  238. package/dist/lib/drift-sync.js +2 -2
  239. package/dist/lib/drift.js +2 -2
  240. package/dist/lib/event-families.d.ts +1 -1
  241. package/dist/lib/event-stream.d.ts +1 -1
  242. package/dist/lib/event-stream.js +2 -2
  243. package/dist/lib/events-ingest.js +2 -2
  244. package/dist/lib/exec.d.ts +4 -4
  245. package/dist/lib/exec.js +11 -11
  246. package/dist/lib/factory/snapshot.d.ts +1 -1
  247. package/dist/lib/factory/snapshot.js +1 -1
  248. package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
  249. package/dist/lib/{activity.js → feed/activity.js} +7 -7
  250. package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
  251. package/dist/lib/{events.js → feed/events.js} +5 -5
  252. package/dist/lib/{feed.js → feed/feed.js} +4 -4
  253. package/dist/lib/feed-outcome.d.ts +1 -1
  254. package/dist/lib/feed-policy.d.ts +1 -1
  255. package/dist/lib/feed-policy.js +1 -1
  256. package/dist/lib/feed-post.d.ts +1 -1
  257. package/dist/lib/feed-post.js +1 -1
  258. package/dist/lib/feed-ranking.d.ts +1 -1
  259. package/dist/lib/fleet/apply.d.ts +0 -6
  260. package/dist/lib/fleet/apply.js +18 -45
  261. package/dist/lib/fleet/auth-sync.d.ts +16 -35
  262. package/dist/lib/fleet/auth-sync.js +16 -75
  263. package/dist/lib/fleet/capture.js +8 -6
  264. package/dist/lib/fleet/manifest.js +23 -11
  265. package/dist/lib/fleet/types.d.ts +19 -7
  266. package/dist/lib/fleet-cache.d.ts +1 -1
  267. package/dist/lib/fleet-cache.js +1 -1
  268. package/dist/lib/format.d.ts +19 -0
  269. package/dist/lib/format.js +44 -1
  270. package/dist/lib/friction-heuristics.d.ts +1 -1
  271. package/dist/lib/git.d.ts +24 -1
  272. package/dist/lib/git.js +82 -38
  273. package/dist/lib/heal.js +3 -3
  274. package/dist/lib/hooks.d.ts +18 -0
  275. package/dist/lib/hooks.js +113 -1
  276. package/dist/lib/hosts/credentials.d.ts +30 -10
  277. package/dist/lib/hosts/credentials.js +38 -26
  278. package/dist/lib/hosts/dispatch.d.ts +3 -3
  279. package/dist/lib/hosts/dispatch.js +3 -3
  280. package/dist/lib/hosts/option.d.ts +3 -3
  281. package/dist/lib/hosts/option.js +7 -8
  282. package/dist/lib/hosts/passthrough.d.ts +17 -17
  283. package/dist/lib/hosts/passthrough.js +67 -50
  284. package/dist/lib/hosts/providers/devices.d.ts +1 -1
  285. package/dist/lib/hosts/providers/devices.js +1 -1
  286. package/dist/lib/hosts/reconcile.d.ts +1 -1
  287. package/dist/lib/hosts/reconcile.js +1 -1
  288. package/dist/lib/hosts/reconnect.d.ts +1 -1
  289. package/dist/lib/hosts/reconnect.js +2 -2
  290. package/dist/lib/hosts/registry.d.ts +5 -5
  291. package/dist/lib/hosts/registry.js +5 -5
  292. package/dist/lib/hosts/remote-cmd.d.ts +10 -10
  293. package/dist/lib/hosts/remote-cmd.js +25 -18
  294. package/dist/lib/hosts/remote-os.d.ts +4 -4
  295. package/dist/lib/hosts/remote-os.js +4 -4
  296. package/dist/lib/hosts/remote-session-id.d.ts +2 -2
  297. package/dist/lib/hosts/remote-session-id.js +2 -2
  298. package/dist/lib/hosts/routing-flag.d.ts +3 -3
  299. package/dist/lib/hosts/routing-flag.js +4 -5
  300. package/dist/lib/hosts/run-target.d.ts +4 -4
  301. package/dist/lib/hosts/run-target.js +4 -4
  302. package/dist/lib/hosts/session-index.d.ts +2 -2
  303. package/dist/lib/hosts/session-index.js +1 -1
  304. package/dist/lib/hosts/session-marker.d.ts +1 -1
  305. package/dist/lib/hosts/session-marker.js +1 -1
  306. package/dist/lib/hosts/types.d.ts +2 -2
  307. package/dist/lib/hosts/types.js +2 -2
  308. package/dist/lib/import.js +1 -1
  309. package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +13 -1
  310. package/dist/lib/{migrate.js → installations/migrate.js} +160 -40
  311. package/dist/lib/installations/resolve.js +1 -1
  312. package/dist/lib/installations/strategies.js +1 -1
  313. package/dist/lib/installations/update.js +2 -2
  314. package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
  315. package/dist/lib/{versions.js → installations/versions.js} +51 -31
  316. package/dist/lib/isolation-boundary-report.js +1 -1
  317. package/dist/lib/linear-projects.d.ts +28 -0
  318. package/dist/lib/linear-projects.js +30 -0
  319. package/dist/lib/loop.js +1 -1
  320. package/dist/lib/mailbox-gc.js +1 -1
  321. package/dist/lib/mailbox.js +1 -1
  322. package/dist/lib/mcp-registry.d.ts +62 -0
  323. package/dist/lib/mcp-registry.js +177 -0
  324. package/dist/lib/mcp.d.ts +5 -0
  325. package/dist/lib/mcp.js +124 -307
  326. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  327. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  328. package/dist/lib/menubar/install-menubar.d.ts +7 -0
  329. package/dist/lib/menubar/install-menubar.js +24 -6
  330. package/dist/lib/menubar/snapshot.d.ts +7 -0
  331. package/dist/lib/menubar/snapshot.js +8 -6
  332. package/dist/lib/models.js +1 -1
  333. package/dist/lib/monitors/config.d.ts +12 -0
  334. package/dist/lib/monitors/config.js +3 -0
  335. package/dist/lib/monitors/dispatch.js +26 -5
  336. package/dist/lib/monitors/engine.js +10 -0
  337. package/dist/lib/monitors/sources/webhook.d.ts +1 -1
  338. package/dist/lib/monitors/state.d.ts +42 -0
  339. package/dist/lib/monitors/state.js +30 -0
  340. package/dist/lib/notify.d.ts +1 -1
  341. package/dist/lib/observe-aliases.d.ts +3 -3
  342. package/dist/lib/observe-aliases.js +3 -21
  343. package/dist/lib/output/git-output.js +2 -2
  344. package/dist/lib/overdue.d.ts +1 -1
  345. package/dist/lib/overdue.js +1 -1
  346. package/dist/lib/permissions-registry.d.ts +65 -0
  347. package/dist/lib/permissions-registry.js +599 -0
  348. package/dist/lib/permissions.d.ts +24 -13
  349. package/dist/lib/permissions.js +52 -271
  350. package/dist/lib/picker.d.ts +16 -0
  351. package/dist/lib/picker.js +33 -3
  352. package/dist/lib/placement.d.ts +1 -1
  353. package/dist/lib/placement.js +4 -4
  354. package/dist/lib/platform/paths.d.ts +8 -0
  355. package/dist/lib/platform/paths.js +11 -0
  356. package/dist/lib/platform/posixpath.js +3 -3
  357. package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
  358. package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
  359. package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
  360. package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
  361. package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
  362. package/dist/lib/{skills.js → plugins/skills.js} +7 -7
  363. package/dist/lib/pricing/cost.d.ts +1 -1
  364. package/dist/lib/pricing/cost.js +1 -1
  365. package/dist/lib/profiles-presets.d.ts +1 -1
  366. package/dist/lib/profiles-presets.js +1 -1
  367. package/dist/lib/profiles.js +2 -2
  368. package/dist/lib/project-import.js +4 -1
  369. package/dist/lib/project-key.js +7 -0
  370. package/dist/lib/project-launch.d.ts +1 -1
  371. package/dist/lib/project-launch.js +3 -3
  372. package/dist/lib/project-pull.d.ts +128 -0
  373. package/dist/lib/project-pull.js +384 -0
  374. package/dist/lib/project-root.d.ts +2 -2
  375. package/dist/lib/project-root.js +2 -2
  376. package/dist/lib/project-status.js +1 -1
  377. package/dist/lib/projects.d.ts +23 -0
  378. package/dist/lib/projects.js +29 -6
  379. package/dist/lib/refresh.d.ts +12 -1
  380. package/dist/lib/refresh.js +16 -9
  381. package/dist/lib/registry.d.ts +9 -2
  382. package/dist/lib/registry.js +11 -4
  383. package/dist/lib/resources.d.ts +2 -2
  384. package/dist/lib/resources.js +2 -2
  385. package/dist/lib/routers.d.ts +81 -0
  386. package/dist/lib/routers.js +153 -0
  387. package/dist/lib/routine-context.d.ts +1 -0
  388. package/dist/lib/routine-context.js +7 -2
  389. package/dist/lib/routine-notify-owner.d.ts +1 -1
  390. package/dist/lib/routine-notify.d.ts +1 -1
  391. package/dist/lib/routine-notify.js +1 -1
  392. package/dist/lib/routine-process-cleanup.d.ts +1 -1
  393. package/dist/lib/routine-readiness.d.ts +1 -1
  394. package/dist/lib/routine-readiness.js +11 -4
  395. package/dist/lib/routines-placement.d.ts +12 -2
  396. package/dist/lib/routines-placement.js +20 -3
  397. package/dist/lib/routines-project.d.ts +1 -1
  398. package/dist/lib/routines-project.js +1 -1
  399. package/dist/lib/rules/compile.d.ts +1 -0
  400. package/dist/lib/rules/compile.js +10 -2
  401. package/dist/lib/rules/rules.js +1 -1
  402. package/dist/lib/run-notify.js +1 -1
  403. package/dist/lib/runner.d.ts +80 -2
  404. package/dist/lib/runner.js +261 -67
  405. package/dist/lib/sandbox.d.ts +1 -1
  406. package/dist/lib/scheduler.d.ts +1 -1
  407. package/dist/lib/scheduler.js +1 -1
  408. package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
  409. package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
  410. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  411. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  412. package/dist/lib/secrets/agent.js +2 -2
  413. package/dist/lib/secrets/audit.js +1 -1
  414. package/dist/lib/secrets/bundles.d.ts +4 -4
  415. package/dist/lib/secrets/bundles.js +8 -8
  416. package/dist/lib/secrets/headless.d.ts +16 -0
  417. package/dist/lib/secrets/headless.js +21 -0
  418. package/dist/lib/secrets/index.js +1 -1
  419. package/dist/lib/secrets/list-filter.d.ts +1 -1
  420. package/dist/lib/secrets/list-filter.js +2 -2
  421. package/dist/lib/secrets/push.d.ts +1 -1
  422. package/dist/lib/secrets/push.js +10 -12
  423. package/dist/lib/secrets/remote.d.ts +21 -17
  424. package/dist/lib/secrets/remote.js +39 -23
  425. package/dist/lib/secrets/vault.js +2 -2
  426. package/dist/lib/self-heal/checks/shadowing.js +1 -1
  427. package/dist/lib/self-heal/checks/shims.js +1 -1
  428. package/dist/lib/self-update.d.ts +39 -4
  429. package/dist/lib/self-update.js +78 -25
  430. package/dist/lib/serve/control.d.ts +1 -1
  431. package/dist/lib/serve/control.js +4 -4
  432. package/dist/lib/serve/data.d.ts +1 -1
  433. package/dist/lib/serve/data.js +1 -1
  434. package/dist/lib/serve/stream.js +1 -1
  435. package/dist/lib/service-manifest.d.ts +29 -0
  436. package/dist/lib/service-manifest.js +80 -0
  437. package/dist/lib/session/active.d.ts +59 -7
  438. package/dist/lib/session/active.js +158 -17
  439. package/dist/lib/session/bash-command.js +1 -1
  440. package/dist/lib/session/claude-accounts.d.ts +1 -1
  441. package/dist/lib/session/claude-accounts.js +1 -1
  442. package/dist/lib/session/db.d.ts +10 -2
  443. package/dist/lib/session/db.js +25 -6
  444. package/dist/lib/session/discover.d.ts +77 -0
  445. package/dist/lib/session/discover.js +130 -25
  446. package/dist/lib/session/fork.js +1 -1
  447. package/dist/lib/session/inject.d.ts +1 -1
  448. package/dist/lib/session/insights.d.ts +1 -1
  449. package/dist/lib/session/insights.js +1 -1
  450. package/dist/lib/session/live-metadata.d.ts +15 -0
  451. package/dist/lib/session/live-metadata.js +76 -0
  452. package/dist/lib/session/migrate-targets.d.ts +1 -1
  453. package/dist/lib/session/recovery.d.ts +1 -1
  454. package/dist/lib/session/recovery.js +2 -2
  455. package/dist/lib/session/remote-active.d.ts +10 -1
  456. package/dist/lib/session/remote-active.js +8 -3
  457. package/dist/lib/session/remote-bundle.d.ts +1 -1
  458. package/dist/lib/session/remote-bundle.js +2 -2
  459. package/dist/lib/session/remote-list.d.ts +15 -4
  460. package/dist/lib/session/remote-list.js +40 -3
  461. package/dist/lib/session/remote.d.ts +5 -5
  462. package/dist/lib/session/remote.js +13 -17
  463. package/dist/lib/session/resume-command.d.ts +3 -2
  464. package/dist/lib/session/resume-command.js +4 -3
  465. package/dist/lib/session/resume-owner.d.ts +3 -3
  466. package/dist/lib/session/resume-owner.js +3 -3
  467. package/dist/lib/session/session-cache.d.ts +12 -0
  468. package/dist/lib/session/session-cache.js +2 -0
  469. package/dist/lib/session/share-html.d.ts +55 -0
  470. package/dist/lib/session/share-html.js +319 -0
  471. package/dist/lib/session/shell-programs.js +1 -1
  472. package/dist/lib/session/state.js +5 -5
  473. package/dist/lib/session/team-filter.d.ts +1 -1
  474. package/dist/lib/session/team-filter.js +1 -1
  475. package/dist/lib/session/types.d.ts +3 -3
  476. package/dist/lib/session/width.d.ts +2 -2
  477. package/dist/lib/session/width.js +2 -2
  478. package/dist/lib/settings-manifest.d.ts +2 -0
  479. package/dist/lib/settings-manifest.js +81 -3
  480. package/dist/lib/share/delete.d.ts +21 -0
  481. package/dist/lib/share/delete.js +42 -0
  482. package/dist/lib/share/publish.d.ts +120 -0
  483. package/dist/lib/share/publish.js +243 -18
  484. package/dist/lib/share/worker-template.js +172 -9
  485. package/dist/lib/shims.js +35 -7
  486. package/dist/lib/smart-launch.d.ts +4 -4
  487. package/dist/lib/smart-launch.js +6 -4
  488. package/dist/lib/snapshot.d.ts +4 -4
  489. package/dist/lib/snapshot.js +2 -2
  490. package/dist/lib/ssh-exec.d.ts +1 -1
  491. package/dist/lib/ssh-exec.js +2 -2
  492. package/dist/lib/ssh-tunnel.d.ts +10 -10
  493. package/dist/lib/ssh-tunnel.js +12 -12
  494. package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
  495. package/dist/lib/staleness/checkers/hooks.js +1 -1
  496. package/dist/lib/staleness/detectors/permissions.js +0 -23
  497. package/dist/lib/staleness/detectors/plugins.js +1 -1
  498. package/dist/lib/staleness/fingerprint.js +1 -1
  499. package/dist/lib/staleness/layers.d.ts +1 -1
  500. package/dist/lib/staleness/layers.js +1 -1
  501. package/dist/lib/staleness/writers/mcp.js +3 -1
  502. package/dist/lib/staleness/writers/plugins.js +1 -1
  503. package/dist/lib/staleness/writers/types.d.ts +8 -0
  504. package/dist/lib/startup/command-registry.d.ts +6 -147
  505. package/dist/lib/startup/command-registry.js +40 -303
  506. package/dist/lib/startup/dev-build.d.ts +0 -21
  507. package/dist/lib/startup/dev-build.js +29 -8
  508. package/dist/lib/state.d.ts +19 -1
  509. package/dist/lib/state.js +120 -51
  510. package/dist/lib/subagents.js +1 -1
  511. package/dist/lib/sync-status.js +1 -1
  512. package/dist/lib/sync-umbrella.d.ts +6 -1
  513. package/dist/lib/sync-umbrella.js +9 -4
  514. package/dist/lib/teams/agents.js +2 -2
  515. package/dist/lib/teams/registry.js +1 -1
  516. package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
  517. package/dist/lib/terminal/engine.js +1 -1
  518. package/dist/lib/terminal/index.d.ts +4 -0
  519. package/dist/lib/terminal/index.js +3 -0
  520. package/dist/lib/terminal/inject.d.ts +2 -2
  521. package/dist/lib/terminal/inject.js +2 -2
  522. package/dist/lib/terminal/transport.js +1 -1
  523. package/dist/lib/tmux/index.d.ts +1 -1
  524. package/dist/lib/tmux/index.js +1 -1
  525. package/dist/lib/tmux/session.d.ts +21 -5
  526. package/dist/lib/tmux/session.js +76 -22
  527. package/dist/lib/triggers/handlers.d.ts +38 -3
  528. package/dist/lib/triggers/handlers.js +58 -7
  529. package/dist/lib/triggers/webhook.d.ts +113 -5
  530. package/dist/lib/triggers/webhook.js +223 -44
  531. package/dist/lib/types.d.ts +19 -7
  532. package/dist/lib/usage-fleet.d.ts +1 -1
  533. package/dist/lib/usage-fleet.js +1 -1
  534. package/dist/lib/usage-refresh.d.ts +1 -1
  535. package/dist/lib/usage-refresh.js +3 -3
  536. package/dist/lib/version-duplicates.js +2 -2
  537. package/dist/lib/view-types.d.ts +56 -0
  538. package/dist/lib/view-types.js +1 -0
  539. package/dist/lib/watchdog/rotate.d.ts +2 -2
  540. package/dist/lib/watchdog/rotate.js +3 -3
  541. package/dist/lib/watchdog/runner.d.ts +2 -3
  542. package/dist/lib/watchdog/runner.js +3 -4
  543. package/dist/lib/workflows.js +1 -1
  544. package/dist/lib/wrap.d.ts +33 -0
  545. package/dist/lib/wrap.js +70 -0
  546. package/package.json +2 -1
  547. package/scripts/postinstall.js +2 -2
  548. package/dist/commands/bench.d.ts +0 -2
  549. package/dist/commands/bench.js +0 -101
  550. package/dist/commands/cp.d.ts +0 -84
  551. package/dist/commands/cp.js +0 -231
  552. package/dist/commands/login.d.ts +0 -2
  553. package/dist/lib/resources/commands.d.ts +0 -46
  554. package/dist/lib/resources/commands.js +0 -211
  555. package/dist/lib/resources/hooks.d.ts +0 -16
  556. package/dist/lib/resources/hooks.js +0 -153
  557. package/dist/lib/resources/mcp.d.ts +0 -34
  558. package/dist/lib/resources/mcp.js +0 -250
  559. package/dist/lib/resources/memory.d.ts +0 -15
  560. package/dist/lib/resources/memory.js +0 -46
  561. package/dist/lib/resources/permissions.d.ts +0 -13
  562. package/dist/lib/resources/permissions.js +0 -202
  563. package/dist/lib/resources/rules.d.ts +0 -46
  564. package/dist/lib/resources/rules.js +0 -179
  565. package/dist/lib/resources/skills.d.ts +0 -37
  566. package/dist/lib/resources/skills.js +0 -247
  567. package/dist/lib/resources/subagents.d.ts +0 -46
  568. package/dist/lib/resources/subagents.js +0 -202
  569. /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
@@ -22,8 +22,10 @@ import { execFileShellSpec } from './platform/index.js';
22
22
  import { latestFileMtimeMs } from './fs-walk.js';
23
23
  import { damerauLevenshtein } from './fuzzy.js';
24
24
  import { getCacheDir, getVersionsDir, getShimsDir, getHistoryDir, getCliVersionCachePath } from './state.js';
25
- import { resolveVersion, getVersionHomePath, getBinaryPath } from './versions.js';
25
+ import { resolveVersion, getVersionHomePath, getBinaryPath } from './installations/versions.js';
26
26
  import { supports } from './capabilities.js';
27
+ import { MCP_TARGETS } from './mcp-registry.js';
28
+ import { VERSION_RE } from './agent-spec/primitives.js';
27
29
  const execFileAsync = promisify(execFile);
28
30
  const HOME = os.homedir();
29
31
  /**
@@ -239,6 +241,14 @@ export const AGENTS = {
239
241
  claude: {
240
242
  id: 'claude',
241
243
  name: 'Claude',
244
+ sessionDir: ['.claude', 'projects'],
245
+ sessionFileExt: '.jsonl',
246
+ versionStdoutMatch: 'semver',
247
+ unmanagedBinary: 'path',
248
+ mcpRegister: 'cli',
249
+ mcpAddHttp: 'transport',
250
+ mcpAddStdio: 'scope',
251
+ mcpConfigWrite: 'json-mcpServers',
242
252
  color: 'magenta',
243
253
  cliCommand: 'claude',
244
254
  npmPackage: '@anthropic-ai/claude-code',
@@ -263,6 +273,14 @@ export const AGENTS = {
263
273
  codex: {
264
274
  id: 'codex',
265
275
  name: 'Codex',
276
+ sessionDir: ['.codex', 'sessions'],
277
+ sessionFileExt: '.jsonl',
278
+ versionStdoutMatch: 'semver',
279
+ unmanagedBinary: 'path',
280
+ mcpRegister: 'cli',
281
+ mcpAddHttp: 'url',
282
+ mcpAddStdio: 'simple',
283
+ mcpConfigWrite: 'json-mcpServers',
266
284
  color: 'green',
267
285
  cliCommand: 'codex',
268
286
  npmPackage: '@openai/codex',
@@ -284,6 +302,14 @@ export const AGENTS = {
284
302
  gemini: {
285
303
  id: 'gemini',
286
304
  name: 'Gemini',
305
+ sessionDir: ['.gemini', 'tmp'],
306
+ sessionFileExt: '.json',
307
+ versionStdoutMatch: 'semver',
308
+ unmanagedBinary: 'path',
309
+ mcpRegister: 'cli',
310
+ mcpAddHttp: 'transport',
311
+ mcpAddStdio: 'simple',
312
+ mcpConfigWrite: 'json-mcpServers',
287
313
  color: 'blue',
288
314
  cliCommand: 'gemini',
289
315
  npmPackage: '@google/gemini-cli',
@@ -316,6 +342,14 @@ export const AGENTS = {
316
342
  cursor: {
317
343
  id: 'cursor',
318
344
  name: 'Cursor',
345
+ sessionDir: null,
346
+ sessionFileExt: null,
347
+ versionStdoutMatch: 'semver',
348
+ unmanagedBinary: 'path',
349
+ mcpRegister: 'cli',
350
+ mcpAddHttp: 'transport',
351
+ mcpAddStdio: 'simple',
352
+ mcpConfigWrite: 'json-mcpServers',
319
353
  color: 'cyan',
320
354
  cliCommand: 'cursor-agent',
321
355
  npmPackage: '',
@@ -351,6 +385,14 @@ export const AGENTS = {
351
385
  opencode: {
352
386
  id: 'opencode',
353
387
  name: 'OpenCode',
388
+ sessionDir: null,
389
+ sessionFileExt: null,
390
+ versionStdoutMatch: 'semver',
391
+ unmanagedBinary: 'path',
392
+ mcpRegister: 'cli',
393
+ mcpAddHttp: 'transport',
394
+ mcpAddStdio: 'simple',
395
+ mcpConfigWrite: 'json-mcpServers',
354
396
  color: 'yellowBright',
355
397
  cliCommand: 'opencode',
356
398
  npmPackage: 'opencode-ai',
@@ -380,6 +422,14 @@ export const AGENTS = {
380
422
  pi: {
381
423
  id: 'pi',
382
424
  name: 'Pi',
425
+ sessionDir: null,
426
+ sessionFileExt: null,
427
+ versionStdoutMatch: 'semver',
428
+ unmanagedBinary: 'path',
429
+ mcpRegister: 'cli',
430
+ mcpAddHttp: 'transport',
431
+ mcpAddStdio: 'simple',
432
+ mcpConfigWrite: 'json-mcpServers',
383
433
  color: 'magenta',
384
434
  cliCommand: 'omp',
385
435
  npmPackage: '@oh-my-pi/pi-coding-agent',
@@ -411,6 +461,14 @@ export const AGENTS = {
411
461
  openclaw: {
412
462
  id: 'openclaw',
413
463
  name: 'OpenClaw',
464
+ sessionDir: null,
465
+ sessionFileExt: null,
466
+ versionStdoutMatch: 'openclaw',
467
+ unmanagedBinary: 'path',
468
+ mcpRegister: 'cli',
469
+ mcpAddHttp: 'transport',
470
+ mcpAddStdio: 'simple',
471
+ mcpConfigWrite: 'json-mcpServers',
414
472
  color: 'redBright',
415
473
  cliCommand: 'openclaw',
416
474
  npmPackage: 'openclaw',
@@ -443,6 +501,14 @@ export const AGENTS = {
443
501
  copilot: {
444
502
  id: 'copilot',
445
503
  name: 'Copilot',
504
+ sessionDir: ['.copilot', 'session-state'],
505
+ sessionFileExt: '.jsonl',
506
+ versionStdoutMatch: 'semver',
507
+ unmanagedBinary: 'path',
508
+ mcpRegister: 'cli',
509
+ mcpAddHttp: 'transport',
510
+ mcpAddStdio: 'simple',
511
+ mcpConfigWrite: 'json-mcpServers',
446
512
  color: 'whiteBright',
447
513
  cliCommand: 'copilot',
448
514
  npmPackage: '@github/copilot',
@@ -470,6 +536,14 @@ export const AGENTS = {
470
536
  amp: {
471
537
  id: 'amp',
472
538
  name: 'Amp',
539
+ sessionDir: null,
540
+ sessionFileExt: null,
541
+ versionStdoutMatch: 'semver',
542
+ unmanagedBinary: 'path',
543
+ mcpRegister: 'cli',
544
+ mcpAddHttp: 'transport',
545
+ mcpAddStdio: 'simple',
546
+ mcpConfigWrite: 'json-mcpServers',
473
547
  color: 'blueBright',
474
548
  cliCommand: 'amp',
475
549
  npmPackage: '@sourcegraph/amp',
@@ -488,6 +562,14 @@ export const AGENTS = {
488
562
  kiro: {
489
563
  id: 'kiro',
490
564
  name: 'Kiro',
565
+ sessionDir: null,
566
+ sessionFileExt: null,
567
+ versionStdoutMatch: 'semver',
568
+ unmanagedBinary: 'path',
569
+ mcpRegister: 'cli',
570
+ mcpAddHttp: 'transport',
571
+ mcpAddStdio: 'simple',
572
+ mcpConfigWrite: 'json-mcpServers',
491
573
  color: 'greenBright',
492
574
  cliCommand: 'kiro-cli',
493
575
  npmPackage: '',
@@ -513,6 +595,14 @@ export const AGENTS = {
513
595
  goose: {
514
596
  id: 'goose',
515
597
  name: 'Goose',
598
+ sessionDir: null,
599
+ sessionFileExt: null,
600
+ versionStdoutMatch: 'semver',
601
+ unmanagedBinary: 'path',
602
+ mcpRegister: 'cli',
603
+ mcpAddHttp: 'transport',
604
+ mcpAddStdio: 'simple',
605
+ mcpConfigWrite: 'json-mcpServers',
516
606
  color: 'magentaBright',
517
607
  cliCommand: 'goose',
518
608
  npmPackage: '',
@@ -534,13 +624,14 @@ export const AGENTS = {
534
624
  supportsHooks: true,
535
625
  // Plugins: Open Plugins under ~/.agents/plugins/<name>/ (same layout as
536
626
  // agents-cli source). Version isolation copies into versionHome/.agents/plugins/.
537
- // Workflows sync as Goose recipe YAML; permissions sync to permission.yaml.
627
+ // Workflows sync as Goose recipe YAML. Permissions are NOT supported:
628
+ // permission.yaml gates whole tools, so canonical rules cannot round-trip.
538
629
  // Commands: a Goose slash command is a recipe YAML under
539
630
  // ~/.config/goose/commands/<name>.yaml, registered in ~/.config/goose/config.yaml
540
631
  // under `slash_commands: [{ command, recipe_path }]` (see goose-commands.ts).
541
632
  // Subagents: recipe YAML named agents under ~/.config/goose/agents/<name>.yaml
542
633
  // (goose auto-discovers and delegates to them by name in autonomous mode).
543
- capabilities: { hooks: { since: '1.34.0' }, mcp: true, mcpHttp: false, mcpHeaders: false, allowlist: true, skills: { since: '1.25.0' }, commands: true, plugins: true, subagents: true, rules: { file: 'AGENTS.md' }, workflows: true, memory: false, modes: ['edit'], interactiveRepl: true },
634
+ capabilities: { hooks: { since: '1.34.0' }, mcp: true, mcpHttp: false, mcpHeaders: false, allowlist: false, skills: { since: '1.25.0' }, commands: true, plugins: true, subagents: true, rules: { file: 'AGENTS.md' }, workflows: true, memory: false, modes: ['edit'], interactiveRepl: true },
544
635
  },
545
636
  // Google Antigravity CLI (`agy`) — official replacement for Gemini CLI as of IO 2026.
546
637
  // configDir nests inside `~/.gemini/` since agy shares the parent dir with the Gemini
@@ -554,6 +645,14 @@ export const AGENTS = {
554
645
  antigravity: {
555
646
  id: 'antigravity',
556
647
  name: 'Antigravity',
648
+ sessionDir: null,
649
+ sessionFileExt: null,
650
+ versionStdoutMatch: 'semver',
651
+ unmanagedBinary: 'path',
652
+ mcpRegister: 'cli',
653
+ mcpAddHttp: 'transport',
654
+ mcpAddStdio: 'simple',
655
+ mcpConfigWrite: 'json-mcpServers',
557
656
  color: 'blueBright',
558
657
  cliCommand: 'agy',
559
658
  npmPackage: '',
@@ -582,6 +681,14 @@ export const AGENTS = {
582
681
  grok: {
583
682
  id: 'grok',
584
683
  name: 'Grok',
684
+ sessionDir: ['.grok', 'sessions'],
685
+ sessionFileExt: '.json',
686
+ versionStdoutMatch: 'semver',
687
+ unmanagedBinary: 'grok-downloads',
688
+ mcpRegister: 'cli',
689
+ mcpAddHttp: 'transport',
690
+ mcpAddStdio: 'simple',
691
+ mcpConfigWrite: 'json-mcpServers',
585
692
  color: 'cyanBright',
586
693
  cliCommand: 'grok',
587
694
  npmPackage: '',
@@ -631,6 +738,14 @@ export const AGENTS = {
631
738
  kimi: {
632
739
  id: 'kimi',
633
740
  name: 'Kimi',
741
+ sessionDir: null,
742
+ sessionFileExt: null,
743
+ versionStdoutMatch: 'semver',
744
+ unmanagedBinary: 'path',
745
+ mcpRegister: 'cli',
746
+ mcpAddHttp: 'transport',
747
+ mcpAddStdio: 'simple',
748
+ mcpConfigWrite: 'json-mcpServers',
634
749
  color: 'magentaBright',
635
750
  cliCommand: 'kimi',
636
751
  npmPackage: '@moonshot-ai/kimi-code',
@@ -717,6 +832,14 @@ export const AGENTS = {
717
832
  droid: {
718
833
  id: 'droid',
719
834
  name: 'Droid',
835
+ sessionDir: ['.factory', 'sessions'],
836
+ sessionFileExt: '.jsonl',
837
+ versionStdoutMatch: 'semver',
838
+ unmanagedBinary: 'path',
839
+ mcpRegister: 'cli',
840
+ mcpAddHttp: 'transport',
841
+ mcpAddStdio: 'simple',
842
+ mcpConfigWrite: 'json-mcpServers',
720
843
  color: 'yellowBright',
721
844
  cliCommand: 'droid',
722
845
  npmPackage: '',
@@ -760,6 +883,14 @@ export const AGENTS = {
760
883
  hermes: {
761
884
  id: 'hermes',
762
885
  name: 'Hermes',
886
+ sessionDir: null,
887
+ sessionFileExt: null,
888
+ versionStdoutMatch: 'semver',
889
+ unmanagedBinary: 'path',
890
+ mcpRegister: 'config',
891
+ mcpAddHttp: 'transport',
892
+ mcpAddStdio: 'simple',
893
+ mcpConfigWrite: 'yaml-mcp_servers',
763
894
  color: 'cyanBright',
764
895
  cliCommand: 'hermes',
765
896
  npmPackage: '',
@@ -817,6 +948,14 @@ export const AGENTS = {
817
948
  muse: {
818
949
  id: 'muse',
819
950
  name: 'Muse',
951
+ sessionDir: ['.local', 'share', 'muse', 'sessions'],
952
+ sessionFileExt: '.jsonl',
953
+ versionStdoutMatch: 'semver',
954
+ unmanagedBinary: 'path',
955
+ mcpRegister: 'cli',
956
+ mcpAddHttp: 'transport',
957
+ mcpAddStdio: 'simple',
958
+ mcpConfigWrite: 'json-mcpServers',
820
959
  color: 'blueBright',
821
960
  cliCommand: 'muse',
822
961
  npmPackage: '',
@@ -886,6 +1025,14 @@ export const AGENTS = {
886
1025
  warp: {
887
1026
  id: 'warp',
888
1027
  name: 'Warp',
1028
+ sessionDir: null,
1029
+ sessionFileExt: null,
1030
+ versionStdoutMatch: 'semver',
1031
+ unmanagedBinary: 'path',
1032
+ mcpRegister: 'cli',
1033
+ mcpAddHttp: 'transport',
1034
+ mcpAddStdio: 'simple',
1035
+ mcpConfigWrite: 'json-mcpServers',
889
1036
  color: 'blueBright',
890
1037
  cliCommand: 'warp',
891
1038
  npmPackage: '',
@@ -948,7 +1095,9 @@ export const ALL_AGENT_IDS = Object.keys(AGENTS);
948
1095
  export const ROUTINE_AGENT_COMMANDS = {
949
1096
  claude: ['claude', '-p', '--verbose', '{prompt}', '--output-format', 'stream-json', '--permission-mode', 'plan'],
950
1097
  codex: ['codex', 'exec', '{prompt}', '--json'],
951
- gemini: ['gemini', '{prompt}', '--output-format', 'stream-json'],
1098
+ // gemini is hard-deprecated (Antigravity replaced it) — no routine target. A
1099
+ // legacy gemini routine now fails validateJob loud instead of firing a
1100
+ // retired backend; the id survives only for reading old sessions/config.
952
1101
  cursor: ['cursor-agent', '-p', '{prompt}', '--output-format', 'stream-json'],
953
1102
  kimi: ['kimi', '--prompt', '{prompt}', '--output-format', 'stream-json'],
954
1103
  droid: ['droid', 'exec', '{prompt}', '-o', 'stream-json'],
@@ -987,7 +1136,9 @@ export function isSelfUpdatingAgent(agent) {
987
1136
  return !cfg.npmPackage && !!cfg.installScript && !cfg.installScript.includes('VERSION');
988
1137
  }
989
1138
  export function isAgentHardDeprecated(agent) {
990
- return AGENTS[agent].deprecated?.hard === true;
1139
+ // Tolerate ids outside the registry (legacy YAML, test fixtures): an unknown
1140
+ // agent is not hard-deprecated — its own validation rejects it elsewhere.
1141
+ return AGENTS[agent]?.deprecated?.hard === true;
991
1142
  }
992
1143
  // Capability-filtered agent lists used to live here as `*_CAPABLE_AGENTS`
993
1144
  // constants. They were a frequent source of silent-skip bugs (e.g. grok
@@ -1044,14 +1195,11 @@ async function getCachedVersionForBinary(agentId, binaryPath) {
1044
1195
  let version = null;
1045
1196
  try {
1046
1197
  const { stdout } = await execFileAsync(agent.cliCommand, ['--version'], { timeout: 3000 });
1047
- if (agentId === 'openclaw') {
1048
- const match = stdout.match(/openclaw\/(\d+\.\d+\.\d+)/);
1049
- version = match ? match[1] : stdout.trim();
1050
- }
1051
- else {
1052
- const match = stdout.match(/(\d+\.\d+\.\d+)/);
1053
- version = match ? match[1] : stdout.trim();
1054
- }
1198
+ const versionRe = agent.versionStdoutMatch === 'openclaw'
1199
+ ? /openclaw\/(\d+\.\d+\.\d+)/
1200
+ : /(\d+\.\d+\.\d+)/;
1201
+ const match = stdout.match(versionRe);
1202
+ version = match ? match[1] : stdout.trim();
1055
1203
  }
1056
1204
  catch {
1057
1205
  /* version command failed */
@@ -1122,8 +1270,9 @@ export async function getCliState(agentId) {
1122
1270
  */
1123
1271
  export async function getUnmanagedCliState(agentId) {
1124
1272
  const agent = AGENTS[agentId];
1125
- // Special case for grok: it manages its own binaries in ~/.grok/downloads/
1126
- if (agentId === 'grok') {
1273
+ // Grok (and any future harness with unmanagedBinary: 'grok-downloads')
1274
+ // keeps versioned binaries under ~/.grok/downloads/, not on PATH.
1275
+ if (agent.unmanagedBinary === 'grok-downloads') {
1127
1276
  const grokBin = resolveGrokBinary();
1128
1277
  if (!grokBin) {
1129
1278
  return { installed: false, version: null, path: null };
@@ -1158,19 +1307,10 @@ export async function getAllCliStates() {
1158
1307
  }
1159
1308
  /**
1160
1309
  * Agents that `agents setup` probes for pre-existing native installations
1161
- * (i.e., a config dir present before agents-cli took over). Add an agent here
1162
- * once its `cliCommand` reports a usable `--version` and its session dir is
1163
- * wired into `getSessionDir`.
1310
+ * (i.e., a config dir present before agents-cli took over). Derived from
1311
+ * `sessionDir` so a new harness cannot be walkable yet missing from setup.
1164
1312
  */
1165
- export const UNMANAGED_DETECTION_CANDIDATES = [
1166
- 'claude',
1167
- 'codex',
1168
- 'gemini',
1169
- 'grok',
1170
- 'copilot',
1171
- 'droid',
1172
- 'muse',
1173
- ];
1313
+ export const UNMANAGED_DETECTION_CANDIDATES = ALL_AGENT_IDS.filter((id) => AGENTS[id].sessionDir !== null);
1174
1314
  /**
1175
1315
  * Detect existing agent installations that are NOT yet managed by agents-cli.
1176
1316
  * Returns agents whose config dir exists as a real directory (not a symlink).
@@ -2233,45 +2373,12 @@ function writeLastActiveCacheFile(cache, cachePath) {
2233
2373
  }
2234
2374
  /** Return the root directory where the agent stores session files, or null if unknown. */
2235
2375
  function getSessionDir(agentId, base) {
2236
- switch (agentId) {
2237
- case 'claude':
2238
- return path.join(base, '.claude', 'projects');
2239
- case 'codex':
2240
- return path.join(base, '.codex', 'sessions');
2241
- case 'gemini':
2242
- return path.join(base, '.gemini', 'tmp');
2243
- case 'grok':
2244
- return path.join(base, '.grok', 'sessions');
2245
- case 'copilot':
2246
- // Copilot persists sessions at ~/.copilot/session-state/<id>/events.jsonl.
2247
- // The events.jsonl is the canonical NDJSON event stream per session.
2248
- return path.join(base, '.copilot', 'session-state');
2249
- case 'droid':
2250
- return path.join(base, '.factory', 'sessions');
2251
- case 'muse':
2252
- // Muse sessions live under XDG data, not the config dir:
2253
- // ~/.local/share/muse/sessions/YYYY/MM/DD/<uuid>/session.jsonl
2254
- return path.join(base, '.local', 'share', 'muse', 'sessions');
2255
- default:
2256
- return null;
2257
- }
2376
+ const rel = AGENTS[agentId].sessionDir;
2377
+ return rel ? path.join(base, ...rel) : null;
2258
2378
  }
2259
2379
  /** Return the file extension used for session files by the given agent. */
2260
2380
  function getSessionExtension(agentId) {
2261
- switch (agentId) {
2262
- case 'claude':
2263
- case 'codex':
2264
- case 'copilot':
2265
- case 'droid':
2266
- case 'muse':
2267
- return '.jsonl';
2268
- case 'gemini':
2269
- return '.json';
2270
- case 'grok':
2271
- return '.json'; // sessions contain summary.json, events.jsonl, etc.
2272
- default:
2273
- return null;
2274
- }
2381
+ return AGENTS[agentId].sessionFileExt;
2275
2382
  }
2276
2383
  /**
2277
2384
  * Quick count of session files for an agent (without full DB scan).
@@ -2350,7 +2457,7 @@ export async function registerMcp(agentId, name, command, scope = 'user', transp
2350
2457
  if (transport === 'http' && options?.headers && Object.keys(options.headers).length > 0 && !supports(agentId, 'mcpHeaders').ok) {
2351
2458
  return { success: false, error: 'skipped: HTTP MCP headers are only supported for Claude registration' };
2352
2459
  }
2353
- if (agentId === 'hermes') {
2460
+ if (agent.mcpRegister === 'config') {
2354
2461
  try {
2355
2462
  writeMcpToConfig(agentId, name, command, scope, transport, options?.home);
2356
2463
  return { success: true };
@@ -2367,7 +2474,7 @@ export async function registerMcp(agentId, name, command, scope = 'user', transp
2367
2474
  const bin = options?.binary || agent.cliCommand;
2368
2475
  let args;
2369
2476
  if (transport === 'http') {
2370
- if (agentId === 'codex') {
2477
+ if (agent.mcpAddHttp === 'url') {
2371
2478
  args = ['mcp', 'add', name, '--url', command];
2372
2479
  }
2373
2480
  else {
@@ -2375,7 +2482,7 @@ export async function registerMcp(agentId, name, command, scope = 'user', transp
2375
2482
  args = ['mcp', 'add', '--transport', 'http', '--scope', scope, name, command, ...headerArgs];
2376
2483
  }
2377
2484
  }
2378
- else if (agentId === 'claude') {
2485
+ else if (agent.mcpAddStdio === 'scope') {
2379
2486
  const commandArgs = splitCommandLine(command);
2380
2487
  args = ['mcp', 'add', '--transport', transport, '--scope', scope, name, '--', ...commandArgs];
2381
2488
  }
@@ -2404,7 +2511,7 @@ export async function unregisterMcp(agentId, name, options) {
2404
2511
  if (!supports(agentId, 'mcp').ok) {
2405
2512
  return { success: false, error: 'Agent does not support MCP' };
2406
2513
  }
2407
- if (agentId === 'hermes') {
2514
+ if (agent.mcpRegister === 'config') {
2408
2515
  try {
2409
2516
  removeMcpFromConfig(agentId, name, options?.home);
2410
2517
  return { success: true };
@@ -2514,7 +2621,7 @@ function readJsonConfig(configPath) {
2514
2621
  function writeMcpToConfig(agentId, name, command, scope, transport, home) {
2515
2622
  const configPath = scopedMcpConfigPath(agentId, scope, home);
2516
2623
  const entry = mcpEntryFromCommand(command, transport);
2517
- if (agentId === 'hermes') {
2624
+ if (AGENTS[agentId].mcpConfigWrite === 'yaml-mcp_servers') {
2518
2625
  const config = readYamlConfig(configPath);
2519
2626
  if (!config.mcp_servers || typeof config.mcp_servers !== 'object' || Array.isArray(config.mcp_servers)) {
2520
2627
  config.mcp_servers = {};
@@ -2536,7 +2643,7 @@ function removeMcpFromConfig(agentId, name, home) {
2536
2643
  const configPath = userMcpConfigPath(agentId, home);
2537
2644
  if (!fs.existsSync(configPath))
2538
2645
  return;
2539
- if (agentId === 'hermes') {
2646
+ if (AGENTS[agentId].mcpConfigWrite === 'yaml-mcp_servers') {
2540
2647
  const config = readYamlConfig(configPath);
2541
2648
  const servers = config.mcp_servers;
2542
2649
  if (servers && typeof servers === 'object' && !Array.isArray(servers)) {
@@ -2576,8 +2683,13 @@ function extractNpmVersion(args) {
2576
2683
  /**
2577
2684
  * Strip JSON comments for JSONC parsing.
2578
2685
  * Only removes comments outside of strings.
2686
+ *
2687
+ * Exported because the MCP writer needs the SAME parser the reader uses: a
2688
+ * naive `//`-to-end-of-line regex eats the `//` inside
2689
+ * `"$schema": "https://opencode.ai/config.json"`, which every opencode-generated
2690
+ * config carries.
2579
2691
  */
2580
- function stripJsonComments(content) {
2692
+ export function stripJsonComments(content) {
2581
2693
  let result = '';
2582
2694
  let inString = false;
2583
2695
  let escape = false;
@@ -2723,142 +2835,33 @@ function parseMcpFromOpenCodeConfig(configPath) {
2723
2835
  }
2724
2836
  /**
2725
2837
  * Get user-scoped MCP config path for an agent.
2838
+ *
2839
+ * All three MCP path resolvers read `MCP_TARGETS`, so the file the writer
2840
+ * targets, the file the parser reads, and the file the staleness detector
2841
+ * watches cannot drift apart. An agent with no MCP target (the hard-deprecated
2842
+ * `gemini`) keeps the historical settings.json default so old configs still
2843
+ * parse.
2726
2844
  */
2727
2845
  export function getUserMcpConfigPath(agentId) {
2728
- const agent = AGENTS[agentId];
2729
- switch (agentId) {
2730
- case 'claude':
2731
- // Claude user-scoped MCPs are in ~/.claude.json (global user config)
2732
- return path.join(HOME, '.claude.json');
2733
- case 'codex':
2734
- // Codex uses TOML config
2735
- return path.join(agent.configDir, 'config.toml');
2736
- case 'opencode':
2737
- // OpenCode loads ~/.config/opencode/opencode.jsonc (not ~/.opencode/)
2738
- return path.join(HOME, '.config', 'opencode', 'opencode.jsonc');
2739
- case 'cursor':
2740
- // Cursor uses mcp.json
2741
- return path.join(agent.configDir, 'mcp.json');
2742
- case 'openclaw':
2743
- // OpenClaw uses openclaw.json
2744
- return path.join(agent.configDir, 'openclaw.json');
2745
- case 'copilot':
2746
- // GitHub Copilot CLI uses mcp-config.json (matches versioned + project paths)
2747
- return path.join(agent.configDir, 'mcp-config.json');
2748
- case 'antigravity':
2749
- // agy uses mcp_config.json inside its nested config dir (~/.gemini/antigravity-cli/)
2750
- return path.join(agent.configDir, 'mcp_config.json');
2751
- case 'grok':
2752
- // grok mcp.json — exact field schema verified at first install
2753
- return path.join(agent.configDir, 'mcp.json');
2754
- case 'droid':
2755
- // Factory AI Droid stores MCPs in ~/.factory/mcp.json
2756
- return path.join(agent.configDir, 'mcp.json');
2757
- case 'hermes':
2758
- return path.join(agent.configDir, 'config.yaml');
2759
- case 'pi':
2760
- // omp reads user-scope MCP from ~/.omp/agent/.mcp.json (Claude schema).
2761
- return path.join(agent.configDir, '.mcp.json');
2762
- case 'muse':
2763
- // Muse Code: MCP lives in ~/.config/muse/settings.json under mcp_servers.
2764
- return path.join(agent.configDir, 'settings.json');
2765
- case 'warp':
2766
- // Oz reads user-scope MCP from ~/.warp/.mcp.json (Claude schema).
2767
- return path.join(agent.configDir, '.mcp.json');
2768
- default:
2769
- // Gemini and others use settings.json
2770
- return path.join(agent.configDir, 'settings.json');
2771
- }
2846
+ return getMcpConfigPathForHome(agentId, HOME);
2772
2847
  }
2773
2848
  /**
2774
2849
  * Get MCP config path for a specific HOME directory (used for version-managed agents).
2775
2850
  */
2776
2851
  export function getMcpConfigPathForHome(agentId, home) {
2777
- switch (agentId) {
2778
- case 'claude':
2779
- return path.join(home, '.claude.json');
2780
- case 'codex':
2781
- return path.join(home, '.codex', 'config.toml');
2782
- case 'opencode':
2783
- return path.join(home, '.config', 'opencode', 'opencode.jsonc');
2784
- case 'cursor':
2785
- return path.join(home, '.cursor', 'mcp.json');
2786
- case 'openclaw':
2787
- return path.join(home, '.openclaw', 'openclaw.json');
2788
- case 'copilot':
2789
- return path.join(home, '.copilot', 'mcp-config.json');
2790
- case 'amp':
2791
- return path.join(home, '.config', 'amp', 'settings.json');
2792
- case 'kiro':
2793
- return path.join(home, '.kiro', 'settings', 'mcp.json');
2794
- case 'goose':
2795
- return path.join(home, '.config', 'goose', 'config.yaml');
2796
- case 'antigravity':
2797
- return path.join(home, '.gemini', 'antigravity-cli', 'mcp_config.json');
2798
- case 'grok':
2799
- return path.join(home, '.grok', 'config.toml');
2800
- case 'droid':
2801
- return path.join(home, '.factory', 'mcp.json');
2802
- case 'hermes':
2803
- return path.join(home, '.hermes', 'config.yaml');
2804
- case 'pi':
2805
- return path.join(home, '.omp', 'agent', '.mcp.json');
2806
- case 'muse':
2807
- return path.join(home, '.config', 'muse', 'settings.json');
2808
- case 'warp':
2809
- return path.join(home, '.warp', '.mcp.json');
2810
- default:
2811
- return path.join(home, agentConfigDirName(agentId), 'settings.json');
2812
- }
2852
+ const target = MCP_TARGETS[agentId];
2853
+ if (target)
2854
+ return target.home(home);
2855
+ return path.join(home, agentConfigDirName(agentId), 'settings.json');
2813
2856
  }
2814
2857
  /**
2815
2858
  * Get project-scoped MCP config path for an agent.
2816
2859
  */
2817
2860
  export function getProjectMcpConfigPath(agentId, cwd = process.cwd()) {
2818
- switch (agentId) {
2819
- case 'claude':
2820
- // Claude uses .mcp.json at project root for project-scoped MCPs
2821
- return path.join(cwd, '.mcp.json');
2822
- case 'codex':
2823
- return path.join(cwd, `.${agentId}`, 'config.toml');
2824
- case 'opencode':
2825
- // Project config is opencode.jsonc at project root (not .opencode/)
2826
- return path.join(cwd, 'opencode.jsonc');
2827
- case 'cursor':
2828
- return path.join(cwd, `.${agentId}`, 'mcp.json');
2829
- case 'openclaw':
2830
- return path.join(cwd, `.${agentId}`, 'openclaw.json');
2831
- case 'gemini':
2832
- return path.join(cwd, `.${agentId}`, 'settings.json');
2833
- case 'copilot':
2834
- return path.join(cwd, '.copilot', 'mcp-config.json');
2835
- case 'amp':
2836
- return path.join(cwd, '.amp', 'settings.json');
2837
- case 'kiro':
2838
- return path.join(cwd, '.kiro', 'settings', 'mcp.json');
2839
- case 'goose':
2840
- return path.join(cwd, '.goose', 'config.yaml');
2841
- case 'antigravity':
2842
- return path.join(cwd, '.gemini', 'antigravity-cli', 'mcp_config.json');
2843
- case 'grok':
2844
- return path.join(cwd, '.grok', 'config.toml');
2845
- case 'droid':
2846
- return path.join(cwd, '.factory', 'mcp.json');
2847
- case 'hermes':
2848
- return path.join(cwd, '.hermes', 'config.yaml');
2849
- case 'pi':
2850
- // omp reads project MCP from <root>/.mcp.json (Claude-compatible).
2851
- return path.join(cwd, '.mcp.json');
2852
- case 'muse':
2853
- // Muse project MCP rides the same settings schema under .muse/settings.json
2854
- // when present; otherwise fall back to the user settings path.
2855
- return path.join(cwd, '.muse', 'settings.json');
2856
- case 'warp':
2857
- // Oz reads project MCP from <root>/.warp/.mcp.json (Claude schema).
2858
- return path.join(cwd, '.warp', '.mcp.json');
2859
- default:
2860
- return path.join(cwd, `.${agentId}`, 'settings.json');
2861
- }
2861
+ const target = MCP_TARGETS[agentId];
2862
+ if (target)
2863
+ return target.project(cwd);
2864
+ return path.join(cwd, `.${agentId}`, 'settings.json');
2862
2865
  }
2863
2866
  /**
2864
2867
  * Parse MCP servers from OpenClaw's JSON config.
@@ -2902,16 +2905,22 @@ function parseMcpFromOpenClawConfig(configPath) {
2902
2905
  * Parse MCP config based on agent type.
2903
2906
  */
2904
2907
  export function parseMcpConfig(agentId, configPath) {
2905
- switch (agentId) {
2906
- case 'codex':
2908
+ // Dispatch on the registry's declared format, not the agent id, so the parser
2909
+ // can never disagree with the writer about a file's serialization -- grok's
2910
+ // TOML config was previously read as JSON and always came back empty.
2911
+ switch (MCP_TARGETS[agentId]?.format) {
2912
+ case 'toml':
2907
2913
  return parseMcpFromTomlConfig(configPath);
2908
- case 'opencode':
2914
+ case 'opencode-jsonc':
2909
2915
  return parseMcpFromOpenCodeConfig(configPath);
2910
- case 'openclaw':
2916
+ case 'openclaw-json':
2911
2917
  return parseMcpFromOpenClawConfig(configPath);
2912
- case 'hermes':
2918
+ case 'yaml':
2913
2919
  return parseMcpFromYamlConfig(configPath);
2914
2920
  default:
2921
+ // claude-json / antigravity-json / muse-json all live in a JSON object;
2922
+ // parseMcpFromJsonConfig accepts mcpServers | mcp_servers | mcp. Agents
2923
+ // with no declared format fall here too, matching prior behavior.
2915
2924
  return parseMcpFromJsonConfig(configPath);
2916
2925
  }
2917
2926
  }
@@ -3035,6 +3044,29 @@ export function resolveAgentName(input) {
3035
3044
  export function isAgentName(input) {
3036
3045
  return resolveAgentName(input) !== null;
3037
3046
  }
3047
+ /**
3048
+ * Split a CLI-provided `<agent>[@<version>]` spec into its bare agent id and
3049
+ * optional exact version token, the same way `agents run` does
3050
+ * (commands/exec.ts parses its positional with a plain `split('@')`) — NOT the
3051
+ * agent-spec qualifier engine (`@latest`/`@all`), which enumerates installed
3052
+ * versions for read/diagnostic commands, not a single launch target. Returns an
3053
+ * error message rather than throwing so callers decide exit-vs-continue.
3054
+ */
3055
+ export function parseAgentVersionSpec(raw) {
3056
+ const parts = raw.split('@');
3057
+ if (parts.length > 2) {
3058
+ return { error: `Invalid agent spec '${raw}': at most one '@version' is allowed` };
3059
+ }
3060
+ const [rawAgent, rawVersion] = parts;
3061
+ const agent = resolveAgentName(rawAgent);
3062
+ if (!agent) {
3063
+ return { error: `Unknown agent, profile, or workflow: ${rawAgent}. See \`agents list\` for the installed harnesses.` };
3064
+ }
3065
+ if (rawVersion !== undefined && (rawVersion === '' || !VERSION_RE.test(rawVersion))) {
3066
+ return { error: `Invalid version '${rawVersion}' in '${raw}'` };
3067
+ }
3068
+ return { agent, ...(rawVersion ? { version: rawVersion } : {}) };
3069
+ }
3038
3070
  /**
3039
3071
  * Build the deprecation notice lines for an agent, or null if it isn't
3040
3072
  * deprecated. Split from the printer so tests can assert the content without