@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
@@ -34,7 +34,7 @@ import { Option } from 'commander';
34
34
  import chalk from 'chalk';
35
35
  import { resolveSyncPassphraseFromEnv } from '../lib/secrets/sync-passphrase.js';
36
36
  import { agentLabel, resolveAgentName, MANAGED_AGENT_IDS, isAgentHardDeprecated, hardDeprecationError } from '../lib/agents.js';
37
- import { isVersionInstalled, syncResourcesToVersion, parseAgentSpec, resolveVersion, resolveVersionAlias, listInstalledVersions, getAvailableResources, getActuallySyncedResources, getProjectOnlyResources, getNewResources, hasNewResources, promptResourceSelection, promptNewResourceSelection, buildSelection, mergeRepoScopedSelections, listRepoNames, getVersionHomePath, } from '../lib/versions.js';
37
+ import { isVersionInstalled, syncResourcesToVersion, parseAgentSpec, resolveVersion, resolveVersionAlias, listInstalledVersions, getAvailableResources, getActuallySyncedResources, getProjectOnlyResources, getNewResources, hasNewResources, promptResourceSelection, promptNewResourceSelection, buildSelection, mergeRepoScopedSelections, listRepoNames, getVersionHomePath, } from '../lib/installations/versions.js';
38
38
  import { capableAgents } from '../lib/capabilities.js';
39
39
  import { parseHookManifest, registerHooksToSettings } from '../lib/hooks.js';
40
40
  import { compileRulesForProject } from '../lib/rules/compile.js';
@@ -134,7 +134,7 @@ export function addSelectorOptions(cmd) {
134
134
  export function registerSyncCommand(program) {
135
135
  const cmd = addHostOption(program.command('sync [agentSpec] [repo]'))
136
136
  .summary('Make this machine current, or sync resources into one agent')
137
- .description('With an [agentSpec], syncs resources (commands, skills, hooks, rules, MCPs, plugins, etc.) into that installed agent version — previews changes and lets you pick. e.g. "claude", "claude@2.1.142", a selector: @latest / @oldest / @pinned (= @default), or @all for every installed version.\n\nAppend a [repo] (or pass --repo) to scope the sync to a single DotAgent repo — system / user / project / <alias>. e.g. "agents sync claude@all system" reconciles only the system repo\'s resources into every installed Claude.\n\nGive a DotAgent repo name ALONE — "agents sync system" / "agents sync user" / "agents sync <alias>" — to git-sync that one repo: git pull --rebase against origin when the tree is clean; when it is dirty, fast-forward anyway if no incoming path is uncommitted, else refuse and name what collided. The user repo and extra aliases also push local commits up; the system repo is a pull-only mirror.\n\nWith NO agent, runs the umbrella verb: fetch the config repos then reconcile them into every installed agent. Secrets are opt-in — add --secrets to pull secret bundles. Session transcripts are queryable live via "agents sessions --host <machine>", or moved with "agents sessions export/import". Also: --cloud (fetch only), --local (reconcile only).')
137
+ .description('With an [agentSpec], syncs resources (commands, skills, hooks, rules, MCPs, plugins, etc.) into that installed agent version — previews changes and lets you pick. e.g. "claude", "claude@2.1.142", a selector: @latest / @oldest / @pinned (= @default), or @all for every installed version.\n\nAppend a [repo] (or pass --repo) to scope the sync to a single DotAgent repo — system / user / project / <alias>. e.g. "agents sync claude@all system" reconciles only the system repo\'s resources into every installed Claude.\n\nGive a DotAgent repo name ALONE — "agents sync system" / "agents sync user" / "agents sync <alias>" — to git-sync that one repo: git pull --rebase against origin when the tree is clean; when it is dirty, fast-forward anyway if no incoming path is uncommitted, else refuse and name what collided. The user repo and extra aliases also push local commits up; the system repo is a pull-only mirror.\n\nWith NO agent, runs the umbrella verb: fetch the config repos then reconcile them into every installed agent. Secrets are opt-in — add --secrets to pull secret bundles. Session transcripts are queryable live via "agents sessions --device <machine>", or moved with "agents sessions export/import". Also: --cloud (fetch only), --local (reconcile only).')
138
138
  .option('--agent <agent>', 'Agent identifier (legacy form; prefer the positional spec)')
139
139
  .option('--agent-version <version>', 'Version to sync into (legacy form; prefer "agent@version" or --version)')
140
140
  .option('--repo <name>', 'Scope the sync to a single DotAgent repo: system / user / project / <alias> (also accepted as a positional)')
@@ -146,7 +146,7 @@ export function registerSyncCommand(program) {
146
146
  .option('--quiet', 'Suppress all output (exit code indicates success)', false)
147
147
  .option('--dry-run', 'Show what would be synced without making any changes', false)
148
148
  .option('--allow-exec-surfaces', 'Allow syncing plugin exec surfaces (scripts, binaries) — off by default for safety', false)
149
- .option('--json', 'Emit machine-readable JSON (also accepted so fleet fan-out via --host all can parse each peer)', false)
149
+ .option('--json', 'Emit machine-readable JSON (also accepted so fleet fan-out via --device all can parse each peer)', false)
150
150
  // Umbrella verb (no agent given): make this machine current.
151
151
  .option('--repos', 'Umbrella: git-pull ~/.agents + enabled ~/.agents-* extras', false)
152
152
  .option('--secrets', 'Umbrella: pull encrypted secret bundles from the remote', false)
@@ -317,7 +317,7 @@ async function runInteractiveReconcile(opts, outLog, errLog) {
317
317
  /**
318
318
  * The umbrella verb: bare `agents sync` (no agent) makes this machine current.
319
319
  * Resolves the flags + a secrets passphrase (env-only for now; tokenized auth
320
- * arrives with `agents login`) and runs the fetch+reconcile stages, then prints
320
+ * arrives with `agents secrets vault unlock`) and runs the fetch+reconcile stages, then prints
321
321
  * a one-line summary. Stage failures are non-fatal and surfaced as warnings.
322
322
  */
323
323
  async function runUmbrella(opts, quiet, outLog, errLog, json = false) {
@@ -357,13 +357,15 @@ async function runUmbrella(opts, quiet, outLog, errLog, json = false) {
357
357
  });
358
358
  if (json) {
359
359
  emitJson({
360
- ok: true,
360
+ // A refused resource is not a clean sync (RUSH-2700).
361
+ ok: result.declined.length === 0,
361
362
  mode: 'umbrella',
362
363
  plan: result.plan,
363
364
  repos: result.repos,
364
365
  secrets: result.secrets,
365
366
  devices: result.devices,
366
367
  reconciled: result.reconciled,
368
+ declined: result.declined,
367
369
  });
368
370
  return;
369
371
  }
@@ -498,7 +500,7 @@ async function runSync(agentSpec, repoArg, opts) {
498
500
  if (!agentId) {
499
501
  // No agent specified → the umbrella verb: make this machine current
500
502
  // (fetch repos + secrets + sessions, then reconcile all installed agents).
501
- // This is the path fleet fan-out (`--host all`) hits with injected --json.
503
+ // This is the path fleet fan-out (`--device all`) hits with injected --json.
502
504
  await runUmbrella(opts, quiet, outLog, errLog, json);
503
505
  return;
504
506
  }
@@ -575,7 +577,8 @@ async function runSync(agentSpec, repoArg, opts) {
575
577
  }
576
578
  if (json) {
577
579
  emitJson({
578
- ok: true,
580
+ // Any version that refused a write makes the whole run not-ok (RUSH-2700).
581
+ ok: versions.every(({ result }) => result.declined.length === 0),
579
582
  mode: 'agent-all',
580
583
  agent: agentId,
581
584
  repo: repoScope,
@@ -591,6 +594,7 @@ async function runSync(agentSpec, repoArg, opts) {
591
594
  plugins: result.plugins,
592
595
  workflows: result.workflows,
593
596
  pruned: result.pruned,
597
+ declined: result.declined,
594
598
  })),
595
599
  });
596
600
  }
@@ -810,7 +814,10 @@ async function runSync(agentSpec, repoArg, opts) {
810
814
  /** Stable `--json` payload for a single agent@version resource sync. */
811
815
  function agentSyncJson(agent, version, result, repo) {
812
816
  return {
813
- ok: true,
817
+ // A refused resource is not a clean sync. `ok` was hardcoded true, so the
818
+ // machine surface (`--host all` fan-out) reported success for exactly the
819
+ // silent no-op this changed (RUSH-2677).
820
+ ok: result.declined.length === 0,
814
821
  mode: 'agent',
815
822
  agent,
816
823
  version,
@@ -826,6 +833,7 @@ function agentSyncJson(agent, version, result, repo) {
826
833
  workflows: result.workflows,
827
834
  projectSkipped: result.projectSkipped,
828
835
  pruned: result.pruned,
836
+ declined: result.declined,
829
837
  };
830
838
  }
831
839
  function anyResources(r) {
@@ -864,7 +872,7 @@ function printSyncDetail(result, agent, version, cwd) {
864
872
  const prunedLines = Object.entries(result.pruned)
865
873
  .filter(([, names]) => names.length > 0)
866
874
  .map(([kind, names]) => ({ kind, items: names }));
867
- if (lines.length === 0 && prunedLines.length === 0) {
875
+ if (lines.length === 0 && prunedLines.length === 0 && result.declined.length === 0) {
868
876
  console.log(chalk.gray(`Already in sync — ${agentLabel(agent)}@${version}`));
869
877
  if (kept)
870
878
  console.log(chalk.gray(kept));
@@ -891,6 +899,13 @@ function printSyncDetail(result, agent, version, cwd) {
891
899
  for (const { kind, items } of prunedLines)
892
900
  printKindLine(kind, items, kindWidth, chalk.yellow);
893
901
  }
902
+ // A resource agents-cli refused to write is reported, never swallowed — an
903
+ // empty synced list on its own reads as "nothing to do" (RUSH-2677).
904
+ if (result.declined.length > 0) {
905
+ console.log(chalk.yellow(`Not written to ${agentLabel(agent)}@${version}:`));
906
+ for (const reason of result.declined)
907
+ console.log(` ${chalk.yellow(reason)}`);
908
+ }
894
909
  if (kept)
895
910
  console.log(chalk.gray(kept));
896
911
  }
@@ -115,8 +115,8 @@ spawners?: Map<string, TeamSpawner>): {
115
115
  };
116
116
  /**
117
117
  * `teams add --remote-cwd` is a no-op trap. `--remote-cwd` comes from the shared
118
- * `--host` option family (option.ts) and is meaningful for commands that *route*
119
- * to a host, but `teams add` special-cases `--host`/`--device` as PLACEMENT, so
118
+ * `--device` option family (option.ts) and is meaningful for commands that *route*
119
+ * to a host, but `teams add` special-cases `--device`/`--device` as PLACEMENT, so
120
120
  * the flag is never read — a teammate's directory is the team's repo plus its
121
121
  * `--worktree`, not a path passed here. Silently ignoring it misleads you into
122
122
  * thinking it set the teammate's repo path (the exact wrong model that turns one
@@ -6,7 +6,7 @@ import * as path from 'path';
6
6
  import { AgentManager, AgentStatus, checkCliSignedIn, collectTeamsDoctorData, getAgentsDir, VALID_TASK_TYPES, } from '../lib/teams/agents.js';
7
7
  import { mailboxDir, enqueue } from '../lib/mailbox.js';
8
8
  import { resolveProvider } from '../lib/cloud/registry.js';
9
- import { emit } from '../lib/events.js';
9
+ import { emit } from '../lib/feed/events.js';
10
10
  import { maybeShowStarNudge } from '../lib/star-nudge.js';
11
11
  import { shareRuntimeEnv } from '../lib/share/config.js';
12
12
  import { runSupervisor } from '../lib/teams/supervisor.js';
@@ -26,13 +26,13 @@ import { resolveRemoteOsSync } from '../lib/hosts/remote-os.js';
26
26
  import { remoteWorktreeDirty, removeRemoteWorktree, ensureRemoteRepo, remoteCommitsBehindDefault } from '../lib/teams/remoteWorktree.js';
27
27
  import { getRemoteUrl } from '../lib/git.js';
28
28
  import { machineId } from '../lib/session/sync/config.js';
29
- import { isVersionInstalled, resolveVersionAlias, resolveVersionAliasLoose } from '../lib/versions.js';
29
+ import { isVersionInstalled, resolveVersionAlias, resolveVersionAliasLoose } from '../lib/installations/versions.js';
30
30
  import { AGENTS, warnAgentDeprecated } from '../lib/agents.js';
31
31
  import { discoverSessions, parseTimeFilter, resolveSessionById } from '../lib/session/discover.js';
32
32
  import { renderSessionLog } from './sessions.js';
33
33
  import { buildPreview as buildSessionPreview } from './sessions-picker.js';
34
34
  import { parseExecEnv } from '../lib/exec.js';
35
- import { checkRunAccountReadiness } from '../lib/rotate.js';
35
+ import { checkRunAccountReadiness } from '../lib/accounting/rotate.js';
36
36
  import { teamPicker, printTeamTable } from './teams-picker.js';
37
37
  import { teamSpawners } from '../lib/session/db.js';
38
38
  import { itemPicker } from '../lib/picker.js';
@@ -1155,8 +1155,8 @@ async function pickTeamOr(mgr, command) {
1155
1155
  }
1156
1156
  /**
1157
1157
  * `teams add --remote-cwd` is a no-op trap. `--remote-cwd` comes from the shared
1158
- * `--host` option family (option.ts) and is meaningful for commands that *route*
1159
- * to a host, but `teams add` special-cases `--host`/`--device` as PLACEMENT, so
1158
+ * `--device` option family (option.ts) and is meaningful for commands that *route*
1159
+ * to a host, but `teams add` special-cases `--device`/`--device` as PLACEMENT, so
1160
1160
  * the flag is never read — a teammate's directory is the team's repo plus its
1161
1161
  * `--worktree`, not a path passed here. Silently ignoring it misleads you into
1162
1162
  * thinking it set the teammate's repo path (the exact wrong model that turns one
@@ -1347,7 +1347,6 @@ export function registerTeamsCommands(program) {
1347
1347
  .option('--enable-worktrees', 'Each teammate works in its own git worktree (requires --worktree on add)')
1348
1348
  .option('--use-worktree <path>', 'All teammates share this existing worktree path (mutually exclusive with --enable-worktrees)')
1349
1349
  .option('--devices <list>', 'Pool of machines this team may run teammates on (comma-separated). Enables distributed auto-scheduling.')
1350
- .option('--hosts <list>', 'Alias for --devices.')
1351
1350
  .option('--repo <urlOrPath>', 'How each remote (--device) teammate gets the code — ONE git URL/path for the whole team (existing checkout reused, else cloned). A team is single-repo; for work across repos, make one team per repo. Defaults to this checkout origin.')
1352
1351
  .option('--project <slug>', "Work this team on a defined project: its primary directory is each local teammate's base cwd, its other directories become --add-dir grants")
1353
1352
  .option('--json', 'Output machine-readable JSON')
@@ -1460,7 +1459,7 @@ export function registerTeamsCommands(program) {
1460
1459
  .option('--confirm', 'Proceed even when the base checkout/repo is behind origin/main (a stale repo otherwise blocks the add)')
1461
1460
  .option('--json', 'Output machine-readable JSON')
1462
1461
  .action(async (team, teammate, task, opts) => {
1463
- // `--remote-cwd` rides the shared --host option family but is never read by
1462
+ // `--remote-cwd` rides the shared --device option family but is never read by
1464
1463
  // `teams add` (placement, not routing). Fail loud with guidance rather than
1465
1464
  // silently ignoring it — see remoteCwdOnAddError. `!== undefined` so even an
1466
1465
  // explicit empty value (`--remote-cwd ""`) is rejected, not silently dropped.
@@ -1495,17 +1494,9 @@ export function registerTeamsCommands(program) {
1495
1494
  // device gets the code) before we resolve a per-teammate --device pin.
1496
1495
  await ensureTeam(team);
1497
1496
  const teamMeta = await getTeam(team);
1498
- // `--device`/`--host` are aliases (addHostOption registers both). For `teams
1499
- // add` the passthrough special-cases them as PLACEMENT, not routing, so the
1500
- // local action reads them here. Reject a conflicting pair.
1501
- let explicitDevice = (() => {
1502
- const h = opts.host;
1503
- const d = opts.device;
1504
- if (h && d && h !== d) {
1505
- dieFriction('teams', 'conflicting-host-device', 'Conflicting --host/--device values — pass just one.');
1506
- }
1507
- return h ?? d ?? null;
1508
- })();
1497
+ // For `teams add` the passthrough special-cases --device as PLACEMENT,
1498
+ // not routing, so the local action reads it here.
1499
+ let explicitDevice = opts.device ?? null;
1509
1500
  // `auto` is the same live fleet sentinel `agents run --device auto` resolves
1510
1501
  // (RUSH-2185) — pick the concrete device name up front so the local-machine
1511
1502
  // check right below (and every dieFriction message further down) sees the
@@ -24,7 +24,7 @@ import chalk from 'chalk';
24
24
  import { truncate } from '../lib/format.js';
25
25
  import * as path from 'path';
26
26
  import { setHelpSections } from '../lib/help.js';
27
- import { assertTmuxAvailable, attachTmux, capturePane, createSession, getDefaultSocketPath, getTmuxVersion, hasSession, isTmuxInstalled, isTmuxVersionSupported, killAll, killSession, listSessions, MIN_TMUX_VERSION, readSessionMeta, sendKeys, splitPane, TmuxCommandError, TmuxSessionError, TmuxUnavailableError, } from '../lib/tmux/index.js';
27
+ import { assertTmuxAvailable, attachTmux, capturePane, createSession, ensureSessionHookRepaired, getDefaultSocketPath, getTmuxVersion, hasSession, isTmuxInstalled, isTmuxVersionSupported, killAll, killSession, listSessions, MIN_TMUX_VERSION, readSessionMeta, sendKeys, splitPane, TmuxCommandError, TmuxSessionError, TmuxUnavailableError, } from '../lib/tmux/index.js';
28
28
  /** Register the `agents tmux` command tree. */
29
29
  export function registerTmuxCommands(program) {
30
30
  const tmux = program
@@ -158,6 +158,10 @@ export function registerTmuxCommands(program) {
158
158
  console.error(chalk.red('attach requires a TTY. Run this from an interactive shell.'));
159
159
  process.exit(1);
160
160
  }
161
+ // Repair a legacy/stale pane-died hook before handing the session to an
162
+ // attach client — the 5-min daemon reconcile that used to cover this was
163
+ // deleted; attach-time repair is what closes the gap now (RUSH-2435).
164
+ await ensureSessionHookRepaired(name, socket);
161
165
  const code = await attachTmux({ socket, args: ['attach-session', '-t', `=${name}`] });
162
166
  process.exit(code);
163
167
  });
@@ -3,7 +3,7 @@ import * as fs from 'fs';
3
3
  import * as path from 'path';
4
4
  import { resolveAgentName, agentLabel } from '../lib/agents.js';
5
5
  import { getTrashVersionsDir } from '../lib/state.js';
6
- import { getVersionDir } from '../lib/versions.js';
6
+ import { getVersionDir } from '../lib/installations/versions.js';
7
7
  function listTrashEntries(filterAgent) {
8
8
  const root = getTrashVersionsDir();
9
9
  if (!fs.existsSync(root))
@@ -12,7 +12,7 @@
12
12
  */
13
13
  import type { Command } from 'commander';
14
14
  import type { AgentId } from '../lib/types.js';
15
- import { getUsageInfoForIdentity } from '../lib/usage.js';
15
+ import { getUsageInfoForIdentity } from '../lib/accounting/usage.js';
16
16
  /** One agent's usage snapshot — the unit the text and --json renderers share. */
17
17
  export interface AgentUsageRecord {
18
18
  agent: AgentId;
@@ -1,8 +1,8 @@
1
1
  import { addHostOption } from '../lib/hosts/option.js';
2
2
  import chalk from 'chalk';
3
3
  import { ALL_AGENT_IDS, AGENTS, getAccountInfo, agentLabel, resolveAgentName, formatAgentError, } from '../lib/agents.js';
4
- import { listInstalledVersions, getGlobalDefault, getVersionHomePath } from '../lib/versions.js';
5
- import { agentReportsUsage, formatUsageSection, getUsageInfoForIdentity } from '../lib/usage.js';
4
+ import { listInstalledVersions, getGlobalDefault, getVersionHomePath } from '../lib/installations/versions.js';
5
+ import { agentReportsUsage, formatUsageSection, getUsageInfoForIdentity } from '../lib/accounting/usage.js';
6
6
  export function registerUsageCommand(program) {
7
7
  addHostOption(program.command('usage [agent]'))
8
8
  .description('Show rate-limit / quota usage per agent')
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import type { Command } from 'commander';
8
8
  import type { AgentId } from '../lib/types.js';
9
- import { type InstalledAgentTargetResult, type VersionSelectionResult } from '../lib/versions.js';
9
+ import { type InstalledAgentTargetResult, type VersionSelectionResult } from '../lib/installations/versions.js';
10
10
  /**
11
11
  * Resolve a read/list command's `@version` filter through the agent-spec engine,
12
12
  * exiting cleanly on a bad spec. Drop-in for the old
@@ -15,14 +15,8 @@ import { type InstalledAgentTargetResult, type VersionSelectionResult } from '..
15
15
  * @latest/@oldest/@x.y.z → concrete.
16
16
  */
17
17
  export declare function resolveListFilterOrExit(agent: AgentId, qualifier: string | undefined | null): string | undefined;
18
- /**
19
- * Check if an error is from user cancelling a prompt (Ctrl+C)
20
- */
21
- export declare function isPromptCancelled(err: unknown): boolean;
22
- /**
23
- * True when stdin/stdout are attached to a real terminal.
24
- */
25
- export declare function isInteractiveTerminal(): boolean;
18
+ import { isPromptCancelled, isInteractiveTerminal, parseCommaSeparatedList } from '../lib/format.js';
19
+ export { isPromptCancelled, isInteractiveTerminal, parseCommaSeparatedList };
26
20
  /** The resolved I/O surface for one command invocation — the human/agent split. */
27
21
  export interface Surface {
28
22
  /** Machine-readable output was requested (`--json`). */
@@ -73,10 +67,6 @@ export declare function requireDestructiveArg(opts: {
73
67
  * Print long content directly in non-interactive shells, use a pager only for real terminals.
74
68
  */
75
69
  export declare function printWithPager(output: string, lineCount: number): void;
76
- /**
77
- * Parse a comma-separated CLI list, trimming whitespace and dropping empties.
78
- */
79
- export declare function parseCommaSeparatedList(value: string | undefined): string[];
80
70
  /**
81
71
  * A target for resource removal: agent + version.
82
72
  */
@@ -127,4 +117,4 @@ export declare function resolveInstalledAgentTargetsAutoInstalling(value: string
127
117
  yes?: boolean;
128
118
  allVersions?: boolean;
129
119
  }): Promise<InstalledAgentTargetResult | null>;
130
- export { VersionNotInstalledError } from '../lib/versions.js';
120
+ export { VersionNotInstalledError } from '../lib/installations/versions.js';
@@ -10,7 +10,7 @@ import chalk from 'chalk';
10
10
  import ora from 'ora';
11
11
  import { confirm } from '@inquirer/prompts';
12
12
  import { agentLabel, resolveAgentName } from '../lib/agents.js';
13
- import { installVersion, listInstalledVersions, resolveAgentVersionTargets, resolveInstalledAgentTargets, } from '../lib/versions.js';
13
+ import { installVersion, listInstalledVersions, resolveAgentVersionTargets, resolveInstalledAgentTargets, } from '../lib/installations/versions.js';
14
14
  import { resolveListFilter, AgentSpecError } from '../lib/agent-spec/index.js';
15
15
  /**
16
16
  * Resolve a read/list command's `@version` filter through the agent-spec engine,
@@ -31,20 +31,10 @@ export function resolveListFilterOrExit(agent, qualifier) {
31
31
  throw e;
32
32
  }
33
33
  }
34
- /**
35
- * Check if an error is from user cancelling a prompt (Ctrl+C)
36
- */
37
- export function isPromptCancelled(err) {
38
- return err instanceof Error && (err.name === 'ExitPromptError' ||
39
- err.message.includes('force closed') ||
40
- err.message.includes('User force closed'));
41
- }
42
- /**
43
- * True when stdin/stdout are attached to a real terminal.
44
- */
45
- export function isInteractiveTerminal() {
46
- return Boolean(process.stdin.isTTY && process.stdout.isTTY);
47
- }
34
+ // Defined in lib/format.ts so `lib/` callers don't have to import upward into
35
+ // the command layer; re-exported here for the ~50 command-layer consumers.
36
+ import { isPromptCancelled, isInteractiveTerminal, parseCommaSeparatedList } from '../lib/format.js';
37
+ export { isPromptCancelled, isInteractiveTerminal, parseCommaSeparatedList };
48
38
  /**
49
39
  * Compute a command's I/O surface once, in one place, instead of each command
50
40
  * re-deriving the human-vs-agent split (and raw-sniffing `process.std*.isTTY`
@@ -126,17 +116,6 @@ export function printWithPager(output, lineCount) {
126
116
  process.stdout.write(output.endsWith('\n') ? output : `${output}\n`);
127
117
  }
128
118
  }
129
- /**
130
- * Parse a comma-separated CLI list, trimming whitespace and dropping empties.
131
- */
132
- export function parseCommaSeparatedList(value) {
133
- if (!value)
134
- return [];
135
- return value
136
- .split(',')
137
- .map((item) => item.trim())
138
- .filter(Boolean);
139
- }
140
119
  /**
141
120
  * Prompt user to select which agent/version targets to remove a resource from.
142
121
  * If only one target, returns it without prompting. If multiple, shows checkbox.
@@ -317,4 +296,4 @@ export async function resolveInstalledAgentTargetsAutoInstalling(value, availabl
317
296
  }
318
297
  // Re-export so callers can `catch (err) { if (err instanceof VersionNotInstalledError) … }`
319
298
  // without reaching into ../lib/versions directly.
320
- export { VersionNotInstalledError } from '../lib/versions.js';
299
+ export { VersionNotInstalledError } from '../lib/installations/versions.js';
@@ -5,11 +5,11 @@ import * as fs from 'fs';
5
5
  import * as path from 'path';
6
6
  import { select, confirm, checkbox } from '@inquirer/prompts';
7
7
  import { AGENTS, MANAGED_AGENT_IDS, accountOrgBadge, getAccountEmail, getAccountInfo, agentLabel, warnAgentDeprecated, isAgentHardDeprecated, hardDeprecationError, isSelfUpdatingAgent, } from '../lib/agents.js';
8
- import { formatUsageSummary, getUsageInfoForIdentity, getUsageInfoByIdentity, getUsageLookupKey, isUsageHeadlessScopeError, } from '../lib/usage.js';
8
+ import { formatUsageSummary, getUsageInfoForIdentity, getUsageInfoByIdentity, getUsageLookupKey, isUsageHeadlessScopeError, } from '../lib/accounting/usage.js';
9
9
  import { viewAction } from './view.js';
10
10
  import { resolveConfiguredModel, formatAgentIdentity } from '../lib/models.js';
11
11
  import { readManifest, writeManifest, createDefaultManifest } from '../lib/manifest.js';
12
- import { installVersion, removeVersion, listInstalledVersions, isVersionInstalled, isLatestInstalled, isOldestInstalled, getGlobalDefault, setGlobalDefault, markVersionIsolated, setIsolatedDefault, isVersionIsolated, getVersionHomePath, getVersionDir, syncResourcesToVersion, parseAgentSpec, promptResourceSelection, promptNewResourceSelection, getAvailableResources, getActuallySyncedResources, getNewResources, getProjectOnlyResources, hasNewResources, printTrashFooter, } from '../lib/versions.js';
12
+ import { installVersion, removeVersion, listInstalledVersions, isVersionInstalled, isLatestInstalled, isOldestInstalled, getGlobalDefault, setGlobalDefault, markVersionIsolated, setIsolatedDefault, isVersionIsolated, getVersionHomePath, getVersionDir, syncResourcesToVersion, parseAgentSpec, promptResourceSelection, promptNewResourceSelection, getAvailableResources, getActuallySyncedResources, getNewResources, getProjectOnlyResources, hasNewResources, printTrashFooter, } from '../lib/installations/versions.js';
13
13
  import { carryForwardSettings } from '../lib/settings-manifest.js';
14
14
  import { createShim, createVersionedAlias, supportsIsolatedInstall, isIsolationProtected, CONFIG_ENV_ISOLATED_AGENTS, removeShim, shimExists, getShimsDir, getShimPath, getPathShadowingExecutable, isShimsInPath, getPathSetupInstructions, addShimsToPath, switchConfigSymlink, switchHomeFileSymlinks, } from '../lib/shims.js';
15
15
  import { isInteractiveTerminal, isPromptCancelled, requireInteractiveSelection } from './utils.js';
@@ -10,11 +10,19 @@ import type { Command } from 'commander';
10
10
  import { accountDisplayLabel } from '../lib/agents.js';
11
11
  import type { AccountInfo } from '../lib/agents.js';
12
12
  import type { AgentId } from '../lib/types.js';
13
- import { type ConfiguredModelSource } from '../lib/models.js';
13
+ import type { ResourceSection, ViewJsonAgent } from '../lib/view-types.js';
14
+ export type { ResourceItemJson, ResourceSection, SyncState, VersionResourcesJson, ViewJsonAgent, ViewJsonVersion } from '../lib/view-types.js';
14
15
  import { type ProfileSummary } from '../lib/profiles.js';
15
16
  import { type ByokUsageResult } from '../lib/byok-usage.js';
16
17
  /** Shared account identity formatter, re-exported for the view-specific tests. */
17
18
  export declare const accountColumnLabel: typeof accountDisplayLabel;
19
+ /**
20
+ * The account column with the durable native-account name folded in: when the
21
+ * signed-in identity of `agentId` has been named via `agents accounts name`,
22
+ * render `work · email` instead of the bare email. Falls back to the plain
23
+ * display label when the identity is unnamed.
24
+ */
25
+ export declare function namedAccountColumnLabel(agentId: AgentId, info: AccountInfo | undefined): string;
18
26
  export interface AccountOrderedVersion {
19
27
  version: string;
20
28
  email: string | null;
@@ -32,7 +40,6 @@ export declare function compareAccountOrderedVersions(a: AccountOrderedVersion,
32
40
  * gutter, but interior empties stay padded so later columns stay aligned.
33
41
  */
34
42
  export declare function joinViewColumns(cols: string[]): string;
35
- type SyncState = 'synced' | 'new' | 'modified' | 'deleted';
36
43
  /** Per-section filter flags. When any are true, only those sections render. */
37
44
  export interface ViewSectionFilter {
38
45
  commands?: boolean;
@@ -59,80 +66,6 @@ export declare function descriptionForPrefix(desc: string | undefined, prefix: s
59
66
  * host is missing is flagged rather than silently listed as runnable.
60
67
  */
61
68
  export declare function renderHarnessBlocks(harnesses: ProfileSummary[], installedHosts: Set<AgentId>, showPaths: boolean, byokMap?: Map<string, ByokUsageResult>): void;
62
- /** Machine-readable entry for a single installed version. */
63
- export interface ViewJsonVersion {
64
- version: string;
65
- isDefault: boolean;
66
- /**
67
- * Installed with `--isolated`. The human view has shown this since the isolated
68
- * tag landed, but JSON carried no signal at all, so tooling could not tell a
69
- * sandboxed copy from one that owns the user's launcher and real config.
70
- */
71
- isolated: boolean;
72
- /**
73
- * The isolated copy a bare `agents run <agent>` resolves to. Separate from
74
- * `isDefault`, which is the GLOBAL default an isolated version can never be —
75
- * reporting only `isDefault: false` hid the fact that this one is selected.
76
- */
77
- isIsolatedDefault: boolean;
78
- signedIn: boolean;
79
- email: string | null;
80
- accountId?: string | null;
81
- organizationType?: string | null;
82
- organizationName?: string | null;
83
- plan: string | null;
84
- usageStatus: 'available' | 'rate_limited' | 'out_of_credits' | null;
85
- overageCredits?: {
86
- amount: number;
87
- currency: string;
88
- } | null;
89
- windows: Array<{
90
- key: 'session' | 'week' | 'sonnet_week' | 'month';
91
- label?: string;
92
- usedPercent: number;
93
- resetsAt: string | null;
94
- }>;
95
- lastActive: string | null;
96
- path: string;
97
- configuredModel?: {
98
- model: string;
99
- source: ConfiguredModelSource;
100
- } | null;
101
- /** Present only when --resources / --detailed (or --json with a section
102
- * flag) is passed: this version's resource inventory with git sync-state. */
103
- resources?: VersionResourcesJson;
104
- }
105
- /** Machine-readable entry for one agent's installed versions. */
106
- export interface ViewJsonAgent {
107
- agent: AgentId;
108
- versions: ViewJsonVersion[];
109
- /** Custom harnesses that run on this agent as their host CLI. */
110
- harnesses: ProfileSummary[];
111
- }
112
- /** Resource sections that --resources can include in --json output. */
113
- export type ResourceSection = 'commands' | 'skills' | 'mcp' | 'memory' | 'hooks' | 'workflows' | 'plugins';
114
- /** One resource entry in `--json --resources` output. */
115
- export interface ResourceItemJson {
116
- name: string;
117
- scope?: 'user' | 'project';
118
- /** Git sync-state vs ~/.agents. Omitted for project-scoped resources or when
119
- * ~/.agents isn't a git repo. When queried via --host it reflects the
120
- * remote's ~/.agents — i.e. per-host resource drift. */
121
- syncState?: SyncState;
122
- description?: string;
123
- /** Skills only, when > 0. */
124
- ruleCount?: number;
125
- }
126
- /** Per-version resource inventory; one key per requested section. */
127
- export interface VersionResourcesJson {
128
- commands?: ResourceItemJson[];
129
- skills?: ResourceItemJson[];
130
- mcp?: ResourceItemJson[];
131
- memory?: ResourceItemJson[];
132
- hooks?: ResourceItemJson[];
133
- workflows?: ResourceItemJson[];
134
- plugins?: ResourceItemJson[];
135
- }
136
69
  /** Build the set of resource sections to include in `--json` from the
137
70
  * `--resources` / `--detailed` flags, plus (in --json mode) the per-section
138
71
  * boolean filters (`--skills` etc.) that plain `--json` historically ignored. */
@@ -183,4 +116,3 @@ export declare function viewAction(agentArg?: string, options?: {
183
116
  } & ViewSectionFilter): Promise<void>;
184
117
  /** Register the `agents view` command. */
185
118
  export declare function registerViewCommand(program: Command): void;
186
- export {};
@@ -8,21 +8,22 @@ import { AGENTS, ALL_AGENT_IDS, accountDisplayLabel, getAllCliStates, getUnmanag
8
8
  import { ambientClaudeToken, loginHint } from '../lib/signin-badge.js';
9
9
  import { machineId } from '../lib/machine-id.js';
10
10
  import { authCacheKey, formatCheckedAge, readAuthHealthCache } from '../lib/auth-health.js';
11
- import { agentReportsUsage, deriveUsageStatusFromSnapshot, formatUsageSection, formatUsageSummary, formatUsageStatusBadge, getUsageInfoForIdentity, getUsageInfoByIdentity, getUsageLookupKey, isUsageHeadlessScopeError, } from '../lib/usage.js';
11
+ import { agentReportsUsage, deriveUsageStatusFromSnapshot, formatUsageSection, formatUsageSummary, formatUsageStatusBadge, getUsageInfoForIdentity, getUsageInfoByIdentity, getUsageLookupKey, isUsageHeadlessScopeError, } from '../lib/accounting/usage.js';
12
12
  import { readManifest } from '../lib/manifest.js';
13
- import { listInstalledVersions, listInstalledVersionDirs, getGlobalDefault, getVersionHomePath, getVersionDir, removeVersion, printTrashFooter, reconcileStaleLatestForAgent, isGlobalBinaryAgent, getLiveVersion, isVersionIsolated, getIsolatedDefault, } from '../lib/versions.js';
13
+ import { listInstalledVersions, listInstalledVersionDirs, getGlobalDefault, getVersionHomePath, getVersionDir, removeVersion, printTrashFooter, reconcileStaleLatestForAgent, isGlobalBinaryAgent, getLiveVersion, isVersionIsolated, getIsolatedDefault, } from '../lib/installations/versions.js';
14
14
  import { ensureVersionedAliasCurrent, removeShim, } from '../lib/shims.js';
15
15
  import { getAgentResources } from '../lib/resources.js';
16
16
  import { renderMergedResources } from '../lib/merged-resources.js';
17
17
  import { resolveVersionFilter, AgentSpecError } from '../lib/agent-spec/index.js';
18
18
  import { listCliStatus } from '../lib/cli-resources.js';
19
19
  import { isCapable } from '../lib/capabilities.js';
20
- import { discoverPlugins, pluginSupportsAgent } from '../lib/plugins.js';
21
- import { getAgentsDir, getUserAgentsDir, getEffectivePromptcutsPath, readMergedPromptcuts } from '../lib/state.js';
20
+ import { discoverPlugins, pluginSupportsAgent } from '../lib/plugins/plugins.js';
21
+ import { getAgentsDir, getUserAgentsDir, getEffectivePromptcutsPath, readMergedPromptcuts, readMeta } from '../lib/state.js';
22
+ import { listNativeAccounts } from '../lib/account-registry.js';
22
23
  import { isGitRepo, getGitSyncStatus } from '../lib/git.js';
23
24
  import { getCentralRulesFileName } from '../lib/rules/rules.js';
24
25
  import { composeRulesFromState } from '../lib/rules/compose.js';
25
- import { getConfiguredRunStrategy } from '../lib/rotate.js';
26
+ import { getConfiguredRunStrategy } from '../lib/accounting/rotate.js';
26
27
  import { resolveRunDefaults } from '../lib/run-defaults.js';
27
28
  import { resolveConfiguredModel } from '../lib/models.js';
28
29
  import { listProfiles, profileExists, profileSummary, readProfile } from '../lib/profiles.js';
@@ -33,6 +34,20 @@ import { formatPath, isInteractiveTerminal, isPromptCancelled } from './utils.js
33
34
  import { terminalWidth, truncateToWidth, stringWidth, padToWidth } from '../lib/session/width.js';
34
35
  /** Shared account identity formatter, re-exported for the view-specific tests. */
35
36
  export const accountColumnLabel = accountDisplayLabel;
37
+ /**
38
+ * The account column with the durable native-account name folded in: when the
39
+ * signed-in identity of `agentId` has been named via `agents accounts name`,
40
+ * render `work · email` instead of the bare email. Falls back to the plain
41
+ * display label when the identity is unnamed.
42
+ */
43
+ export function namedAccountColumnLabel(agentId, info) {
44
+ const display = accountColumnLabel(info);
45
+ const identityKey = info?.accountKey ?? info?.email?.toLowerCase();
46
+ if (!identityKey)
47
+ return display;
48
+ const saved = listNativeAccounts(readMeta()).find(item => item.agent === agentId && item.identityKey === identityKey);
49
+ return saved ? `${saved.name} · ${display || saved.identityLabel || identityKey}` : display;
50
+ }
36
51
  /**
37
52
  * Human `agents view` row order: selected default first, then email-bearing
38
53
  * accounts alphabetically, then installs whose account has no email. Version
@@ -499,7 +514,7 @@ async function showInstalledVersions(filterAgentId, viewOpts) {
499
514
  maxVerLabel = Math.max(maxVerLabel, versionRowLabel(agentId, v, globalDefault).length);
500
515
  const rawInfo = infoMap.get(`${agentId}:${v}`);
501
516
  const info = rawInfo ? mergeCanonical(rawInfo) : undefined;
502
- const accountLabel = accountColumnLabel(info);
517
+ const accountLabel = namedAccountColumnLabel(agentId, info);
503
518
  if (accountLabel)
504
519
  maxEmail = Math.max(maxEmail, accountLabel.length);
505
520
  if (info?.plan)
@@ -628,7 +643,7 @@ async function showInstalledVersions(filterAgentId, viewOpts) {
628
643
  // Always emit account / usage / status / lastActive columns once any
629
644
  // signed-in row exists in the table (widths are global). Empty cells
630
645
  // are space-padded so later columns do not drift left.
631
- const display = accountColumnLabel(vInfo);
646
+ const display = namedAccountColumnLabel(agentId, vInfo);
632
647
  parts.push(display ? chalk.cyan(padToWidth(display, maxEmail)) : ' '.repeat(maxEmail));
633
648
  if (maxUsageWidth > 0) {
634
649
  parts.push(padToWidth(usageStr, maxUsageWidth));
@@ -1690,7 +1705,7 @@ Examples:
1690
1705
 
1691
1706
  # One call: full inventory + what's synced on a host (installed agents,
1692
1707
  # versions, accounts, usage, and per-version resource sync-state)
1693
- agents view claude --host yosemite-s0 --json --resources all
1708
+ agents view claude --device yosemite-s0 --json --resources all
1694
1709
  agents view claude --json --resources skills,plugins # just those sections
1695
1710
 
1696
1711
  # Prune older versions that duplicate an account already used by a newer version
@@ -37,7 +37,7 @@ function stateDir() {
37
37
  * Dynamic import keeps daemon.ts's heavy deps off the watchdog command's load path.
38
38
  */
39
39
  async function reloadDaemonForRoutine(startIfStopped) {
40
- const { isDaemonRunning, ensureDaemonStarted, signalDaemonReload } = await import('../lib/daemon.js');
40
+ const { isDaemonRunning, ensureDaemonStarted, signalDaemonReload } = await import('../lib/daemon/daemon.js');
41
41
  if (isDaemonRunning()) {
42
42
  signalDaemonReload();
43
43
  return;