@phnx-labs/agents-cli 1.22.38 → 1.22.40

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 (554) hide show
  1. package/CHANGELOG.md +302 -0
  2. package/README.md +111 -70
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.js +46 -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 +260 -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.js +206 -94
  13. package/dist/commands/budget.d.ts +7 -6
  14. package/dist/commands/budget.js +8 -7
  15. package/dist/commands/cloud.js +17 -20
  16. package/dist/commands/commands.js +1 -1
  17. package/dist/commands/computer-actions.d.ts +1 -35
  18. package/dist/commands/computer-actions.js +13 -181
  19. package/dist/commands/computer.d.ts +28 -3
  20. package/dist/commands/computer.js +93 -65
  21. package/dist/commands/config.js +47 -4
  22. package/dist/commands/cost.d.ts +2 -1
  23. package/dist/commands/cost.js +7 -6
  24. package/dist/commands/daemon.js +151 -4
  25. package/dist/commands/detach.js +1 -1
  26. package/dist/commands/doctor.js +19 -11
  27. package/dist/commands/events.js +1 -1
  28. package/dist/commands/exec.d.ts +2 -50
  29. package/dist/commands/exec.js +161 -216
  30. package/dist/commands/factory.js +1 -1
  31. package/dist/commands/feed.d.ts +2 -2
  32. package/dist/commands/feed.js +9 -12
  33. package/dist/commands/fleet-capture.js +25 -27
  34. package/dist/commands/focus.d.ts +2 -3
  35. package/dist/commands/focus.js +34 -9
  36. package/dist/commands/go.js +15 -5
  37. package/dist/commands/harness.d.ts +3 -3
  38. package/dist/commands/harness.js +53 -5
  39. package/dist/commands/hooks.js +1 -1
  40. package/dist/commands/import.js +2 -2
  41. package/dist/commands/insights.d.ts +5 -5
  42. package/dist/commands/insights.js +15 -9
  43. package/dist/commands/inspect.d.ts +2 -3
  44. package/dist/commands/inspect.js +4 -16
  45. package/dist/commands/logs.d.ts +2 -2
  46. package/dist/commands/logs.js +9 -9
  47. package/dist/commands/mcp.js +2 -2
  48. package/dist/commands/memory.js +1 -1
  49. package/dist/commands/message.d.ts +1 -1
  50. package/dist/commands/message.js +7 -7
  51. package/dist/commands/mine.d.ts +11 -8
  52. package/dist/commands/mine.js +11 -10
  53. package/dist/commands/models.js +1 -1
  54. package/dist/commands/modes.js +1 -1
  55. package/dist/commands/monitors.js +23 -6
  56. package/dist/commands/output.d.ts +7 -6
  57. package/dist/commands/output.js +11 -10
  58. package/dist/commands/packages.js +4 -4
  59. package/dist/commands/perf.js +1 -1
  60. package/dist/commands/permissions.js +49 -32
  61. package/dist/commands/plugins.d.ts +1 -1
  62. package/dist/commands/plugins.js +3 -3
  63. package/dist/commands/profiles.d.ts +6 -9
  64. package/dist/commands/profiles.js +8 -321
  65. package/dist/commands/projects.d.ts +9 -0
  66. package/dist/commands/projects.js +140 -8
  67. package/dist/commands/prune.js +5 -13
  68. package/dist/commands/refresh-rules.js +1 -1
  69. package/dist/commands/repo.d.ts +5 -7
  70. package/dist/commands/repo.js +34 -18
  71. package/dist/commands/resource-view.js +4 -0
  72. package/dist/commands/resume.d.ts +11 -7
  73. package/dist/commands/resume.js +82 -98
  74. package/dist/commands/route.d.ts +12 -0
  75. package/dist/commands/route.js +261 -0
  76. package/dist/commands/routines.d.ts +2 -3
  77. package/dist/commands/routines.js +120 -145
  78. package/dist/commands/rules.js +1 -1
  79. package/dist/commands/run-account-picker.d.ts +1 -1
  80. package/dist/commands/run-account-picker.js +2 -2
  81. package/dist/commands/run-broadcast.d.ts +21 -0
  82. package/dist/commands/run-broadcast.js +89 -0
  83. package/dist/commands/run-cloud.js +1 -1
  84. package/dist/commands/secrets-vault.d.ts +10 -0
  85. package/dist/commands/{login.js → secrets-vault.js} +34 -14
  86. package/dist/commands/secrets.d.ts +4 -4
  87. package/dist/commands/secrets.js +72 -63
  88. package/dist/commands/sessions-backfill.js +1 -1
  89. package/dist/commands/sessions-browser.d.ts +1 -1
  90. package/dist/commands/sessions-browser.js +9 -5
  91. package/dist/commands/sessions-export.js +2 -2
  92. package/dist/commands/sessions-inject.js +4 -5
  93. package/dist/commands/sessions-migrate.js +16 -27
  94. package/dist/commands/sessions-picker.d.ts +13 -0
  95. package/dist/commands/sessions-picker.js +182 -8
  96. package/dist/commands/sessions-resume.d.ts +7 -3
  97. package/dist/commands/sessions-resume.js +81 -33
  98. package/dist/commands/sessions-stats.js +2 -2
  99. package/dist/commands/sessions.d.ts +75 -68
  100. package/dist/commands/sessions.js +142 -180
  101. package/dist/commands/setup-computer.js +1 -1
  102. package/dist/commands/setup-fleet.js +3 -0
  103. package/dist/commands/setup-mine.d.ts +7 -3
  104. package/dist/commands/setup-mine.js +13 -8
  105. package/dist/commands/setup-secrets.js +2 -2
  106. package/dist/commands/setup-watchdog.js +2 -2
  107. package/dist/commands/setup.js +7 -2
  108. package/dist/commands/share.d.ts +65 -0
  109. package/dist/commands/share.js +253 -20
  110. package/dist/commands/skills.js +3 -3
  111. package/dist/commands/snapshot.d.ts +2 -2
  112. package/dist/commands/snapshot.js +9 -9
  113. package/dist/commands/ssh.d.ts +1 -1
  114. package/dist/commands/ssh.js +318 -48
  115. package/dist/commands/subagents.js +1 -1
  116. package/dist/commands/sync.js +24 -9
  117. package/dist/commands/teams.d.ts +2 -2
  118. package/dist/commands/teams.js +9 -18
  119. package/dist/commands/tmux.js +5 -1
  120. package/dist/commands/trash.js +1 -1
  121. package/dist/commands/usage.d.ts +1 -1
  122. package/dist/commands/usage.js +2 -2
  123. package/dist/commands/utils.d.ts +4 -14
  124. package/dist/commands/utils.js +6 -27
  125. package/dist/commands/versions.js +2 -2
  126. package/dist/commands/view.d.ts +9 -77
  127. package/dist/commands/view.js +23 -8
  128. package/dist/commands/watchdog.js +1 -1
  129. package/dist/commands/webhook.js +11 -25
  130. package/dist/commands/workflows.js +1 -1
  131. package/dist/index.js +1 -1
  132. package/dist/lib/account-capabilities.d.ts +39 -0
  133. package/dist/lib/account-capabilities.js +59 -0
  134. package/dist/lib/account-catalog.js +1 -1
  135. package/dist/lib/account-registry.d.ts +66 -0
  136. package/dist/lib/account-registry.js +151 -5
  137. package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
  138. package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
  139. package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
  140. package/dist/lib/{usage.js → accounting/usage.js} +11 -11
  141. package/dist/lib/agent-spec/provider.js +1 -1
  142. package/dist/lib/agents.d.ts +72 -4
  143. package/dist/lib/agents.js +231 -199
  144. package/dist/lib/answer-router.d.ts +2 -2
  145. package/dist/lib/ask-classifier.d.ts +1 -1
  146. package/dist/lib/ask-classifier.js +1 -1
  147. package/dist/lib/audit/log.js +1 -1
  148. package/dist/lib/auth-health.d.ts +1 -1
  149. package/dist/lib/auth-health.js +2 -2
  150. package/dist/lib/brand.js +1 -1
  151. package/dist/lib/browser/caller-identity.d.ts +28 -0
  152. package/dist/lib/browser/caller-identity.js +156 -0
  153. package/dist/lib/browser/cdp.js +1 -1
  154. package/dist/lib/browser/drivers/ssh.d.ts +1 -1
  155. package/dist/lib/browser/drivers/ssh.js +2 -2
  156. package/dist/lib/browser/hygiene.d.ts +10 -2
  157. package/dist/lib/browser/hygiene.js +7 -4
  158. package/dist/lib/browser/ipc.d.ts +22 -2
  159. package/dist/lib/browser/ipc.js +185 -21
  160. package/dist/lib/browser/profiles.d.ts +67 -3
  161. package/dist/lib/browser/profiles.js +129 -7
  162. package/dist/lib/browser/remote-control.d.ts +2 -2
  163. package/dist/lib/browser/remote-control.js +3 -3
  164. package/dist/lib/browser/runtime-state.d.ts +79 -0
  165. package/dist/lib/browser/runtime-state.js +119 -1
  166. package/dist/lib/browser/service.d.ts +113 -1
  167. package/dist/lib/browser/service.js +454 -40
  168. package/dist/lib/browser/sessions-list.d.ts +2 -1
  169. package/dist/lib/browser/sessions-list.js +4 -13
  170. package/dist/lib/browser/types.d.ts +18 -0
  171. package/dist/lib/budget/config.js +1 -1
  172. package/dist/lib/budget/ledger.js +1 -1
  173. package/dist/lib/byok-usage.js +1 -1
  174. package/dist/lib/capabilities.js +3 -15
  175. package/dist/lib/catchup.d.ts +1 -1
  176. package/dist/lib/catchup.js +1 -1
  177. package/dist/lib/cloud/dispatch.js +1 -1
  178. package/dist/lib/cloud/host.d.ts +3 -3
  179. package/dist/lib/cloud/host.js +5 -5
  180. package/dist/lib/cloud/rush.d.ts +9 -21
  181. package/dist/lib/cloud/rush.js +33 -120
  182. package/dist/lib/cloud/types.d.ts +2 -2
  183. package/dist/lib/commands.js +3 -13
  184. package/dist/lib/computer/actions.d.ts +36 -0
  185. package/dist/lib/computer/actions.js +162 -0
  186. package/dist/lib/computer/dispatch.d.ts +2 -2
  187. package/dist/lib/computer/dispatch.js +2 -2
  188. package/dist/lib/computer/sessions-list.d.ts +3 -3
  189. package/dist/lib/computer/sessions-list.js +2 -2
  190. package/dist/lib/config-keys.d.ts +12 -3
  191. package/dist/lib/config-keys.js +29 -6
  192. package/dist/lib/config-machine-keys.d.ts +4 -2
  193. package/dist/lib/config-machine-keys.js +6 -2
  194. package/dist/lib/crabbox/lease.js +9 -1
  195. package/dist/lib/crabbox/runtimes.d.ts +32 -7
  196. package/dist/lib/crabbox/runtimes.js +72 -30
  197. package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
  198. package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
  199. package/dist/lib/daemon-services.d.ts +1 -1
  200. package/dist/lib/daemon-services.js +5 -0
  201. package/dist/lib/daemon-ticks.d.ts +25 -0
  202. package/dist/lib/daemon-ticks.js +31 -1
  203. package/dist/lib/daemon-webhooks.d.ts +102 -0
  204. package/dist/lib/daemon-webhooks.js +210 -0
  205. package/dist/lib/device-config.d.ts +116 -72
  206. package/dist/lib/device-config.js +366 -132
  207. package/dist/lib/devices/config-migration.d.ts +29 -34
  208. package/dist/lib/devices/config-migration.js +209 -130
  209. package/dist/lib/devices/connect.d.ts +2 -2
  210. package/dist/lib/devices/connect.js +2 -2
  211. package/dist/lib/devices/discovery-policy.d.ts +30 -0
  212. package/dist/lib/devices/discovery-policy.js +101 -0
  213. package/dist/lib/devices/fleet-inventory.js +8 -3
  214. package/dist/lib/devices/harness-inventory.d.ts +1 -1
  215. package/dist/lib/devices/harness-inventory.js +12 -3
  216. package/dist/lib/devices/known-hosts.js +1 -1
  217. package/dist/lib/devices/pool.d.ts +61 -0
  218. package/dist/lib/devices/pool.js +83 -0
  219. package/dist/lib/devices/registry.d.ts +1 -1
  220. package/dist/lib/devices/registry.js +1 -1
  221. package/dist/lib/devices/resolve-profile.d.ts +2 -2
  222. package/dist/lib/devices/resolve-profile.js +2 -2
  223. package/dist/lib/devices/resolve-target.d.ts +1 -1
  224. package/dist/lib/devices/resolve-target.js +4 -4
  225. package/dist/lib/devices/self-host.d.ts +1 -1
  226. package/dist/lib/devices/self-host.js +3 -3
  227. package/dist/lib/devices/ssh-config.d.ts +1 -1
  228. package/dist/lib/devices/stats-cache.js +1 -1
  229. package/dist/lib/devices/sync.d.ts +3 -1
  230. package/dist/lib/devices/sync.js +3 -3
  231. package/dist/lib/doctor-diff.js +4 -4
  232. package/dist/lib/drift-sync.js +2 -2
  233. package/dist/lib/drift.js +2 -2
  234. package/dist/lib/event-families.d.ts +1 -1
  235. package/dist/lib/event-stream.d.ts +1 -1
  236. package/dist/lib/event-stream.js +2 -2
  237. package/dist/lib/events-ingest.js +2 -2
  238. package/dist/lib/exec.d.ts +8 -5
  239. package/dist/lib/exec.js +19 -13
  240. package/dist/lib/factory/snapshot.d.ts +1 -1
  241. package/dist/lib/factory/snapshot.js +1 -1
  242. package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
  243. package/dist/lib/{activity.js → feed/activity.js} +7 -7
  244. package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
  245. package/dist/lib/{events.js → feed/events.js} +5 -5
  246. package/dist/lib/{feed.js → feed/feed.js} +4 -4
  247. package/dist/lib/feed-outcome.d.ts +1 -1
  248. package/dist/lib/feed-policy.d.ts +1 -1
  249. package/dist/lib/feed-policy.js +1 -1
  250. package/dist/lib/feed-post.d.ts +1 -1
  251. package/dist/lib/feed-post.js +1 -1
  252. package/dist/lib/feed-ranking.d.ts +1 -1
  253. package/dist/lib/fleet/apply.d.ts +0 -6
  254. package/dist/lib/fleet/apply.js +18 -45
  255. package/dist/lib/fleet/auth-sync.d.ts +16 -35
  256. package/dist/lib/fleet/auth-sync.js +16 -75
  257. package/dist/lib/fleet/capture.js +8 -6
  258. package/dist/lib/fleet/manifest.js +23 -11
  259. package/dist/lib/fleet/types.d.ts +19 -7
  260. package/dist/lib/fleet-cache.d.ts +1 -1
  261. package/dist/lib/fleet-cache.js +1 -1
  262. package/dist/lib/format.d.ts +19 -0
  263. package/dist/lib/format.js +44 -1
  264. package/dist/lib/friction-heuristics.d.ts +1 -1
  265. package/dist/lib/git.d.ts +24 -1
  266. package/dist/lib/git.js +82 -38
  267. package/dist/lib/heal.js +3 -3
  268. package/dist/lib/hooks.d.ts +18 -0
  269. package/dist/lib/hooks.js +113 -1
  270. package/dist/lib/hosts/credentials.d.ts +30 -10
  271. package/dist/lib/hosts/credentials.js +38 -26
  272. package/dist/lib/hosts/dispatch.d.ts +3 -3
  273. package/dist/lib/hosts/dispatch.js +3 -3
  274. package/dist/lib/hosts/option.d.ts +3 -3
  275. package/dist/lib/hosts/option.js +7 -8
  276. package/dist/lib/hosts/passthrough.d.ts +17 -17
  277. package/dist/lib/hosts/passthrough.js +67 -50
  278. package/dist/lib/hosts/providers/devices.d.ts +1 -1
  279. package/dist/lib/hosts/providers/devices.js +1 -1
  280. package/dist/lib/hosts/reconcile.d.ts +1 -1
  281. package/dist/lib/hosts/reconcile.js +1 -1
  282. package/dist/lib/hosts/reconnect.d.ts +1 -1
  283. package/dist/lib/hosts/reconnect.js +2 -2
  284. package/dist/lib/hosts/registry.d.ts +5 -5
  285. package/dist/lib/hosts/registry.js +5 -5
  286. package/dist/lib/hosts/remote-cmd.d.ts +10 -10
  287. package/dist/lib/hosts/remote-cmd.js +25 -18
  288. package/dist/lib/hosts/remote-os.d.ts +4 -4
  289. package/dist/lib/hosts/remote-os.js +4 -4
  290. package/dist/lib/hosts/remote-session-id.d.ts +2 -2
  291. package/dist/lib/hosts/remote-session-id.js +2 -2
  292. package/dist/lib/hosts/routing-flag.d.ts +3 -3
  293. package/dist/lib/hosts/routing-flag.js +4 -5
  294. package/dist/lib/hosts/run-target.d.ts +4 -4
  295. package/dist/lib/hosts/run-target.js +4 -4
  296. package/dist/lib/hosts/session-index.d.ts +2 -2
  297. package/dist/lib/hosts/session-index.js +1 -1
  298. package/dist/lib/hosts/session-marker.d.ts +1 -1
  299. package/dist/lib/hosts/session-marker.js +1 -1
  300. package/dist/lib/hosts/types.d.ts +2 -2
  301. package/dist/lib/hosts/types.js +2 -2
  302. package/dist/lib/import.js +1 -1
  303. package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +49 -1
  304. package/dist/lib/{migrate.js → installations/migrate.js} +265 -38
  305. package/dist/lib/installations/resolve.js +1 -1
  306. package/dist/lib/installations/strategies.js +1 -1
  307. package/dist/lib/installations/update.js +2 -2
  308. package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
  309. package/dist/lib/{versions.js → installations/versions.js} +51 -31
  310. package/dist/lib/isolation-boundary-report.js +1 -1
  311. package/dist/lib/linear-projects.d.ts +28 -0
  312. package/dist/lib/linear-projects.js +30 -0
  313. package/dist/lib/loop.js +1 -1
  314. package/dist/lib/mailbox-gc.js +1 -1
  315. package/dist/lib/mailbox.js +1 -1
  316. package/dist/lib/mcp-registry.d.ts +62 -0
  317. package/dist/lib/mcp-registry.js +177 -0
  318. package/dist/lib/mcp.d.ts +5 -0
  319. package/dist/lib/mcp.js +124 -307
  320. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  321. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  322. package/dist/lib/menubar/install-menubar.d.ts +7 -0
  323. package/dist/lib/menubar/install-menubar.js +24 -6
  324. package/dist/lib/menubar/snapshot.d.ts +7 -0
  325. package/dist/lib/menubar/snapshot.js +8 -6
  326. package/dist/lib/models.js +1 -1
  327. package/dist/lib/monitors/config.d.ts +12 -0
  328. package/dist/lib/monitors/config.js +3 -0
  329. package/dist/lib/monitors/dispatch.js +26 -5
  330. package/dist/lib/monitors/engine.js +10 -0
  331. package/dist/lib/monitors/sources/webhook.d.ts +1 -1
  332. package/dist/lib/monitors/state.d.ts +42 -0
  333. package/dist/lib/monitors/state.js +30 -0
  334. package/dist/lib/notify.d.ts +1 -1
  335. package/dist/lib/observe-aliases.d.ts +2 -2
  336. package/dist/lib/observe-aliases.js +2 -11
  337. package/dist/lib/output/git-output.js +2 -2
  338. package/dist/lib/overdue.d.ts +1 -1
  339. package/dist/lib/overdue.js +1 -1
  340. package/dist/lib/permissions-registry.d.ts +65 -0
  341. package/dist/lib/permissions-registry.js +599 -0
  342. package/dist/lib/permissions.d.ts +24 -13
  343. package/dist/lib/permissions.js +52 -271
  344. package/dist/lib/picker.d.ts +16 -0
  345. package/dist/lib/picker.js +33 -3
  346. package/dist/lib/placement.d.ts +1 -1
  347. package/dist/lib/placement.js +4 -4
  348. package/dist/lib/platform/paths.d.ts +8 -0
  349. package/dist/lib/platform/paths.js +11 -0
  350. package/dist/lib/platform/posixpath.js +3 -3
  351. package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
  352. package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
  353. package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
  354. package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
  355. package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
  356. package/dist/lib/{skills.js → plugins/skills.js} +7 -7
  357. package/dist/lib/pricing/cost.d.ts +1 -1
  358. package/dist/lib/pricing/cost.js +1 -1
  359. package/dist/lib/profiles-presets.d.ts +1 -1
  360. package/dist/lib/profiles-presets.js +1 -1
  361. package/dist/lib/profiles.js +2 -2
  362. package/dist/lib/project-import.js +4 -1
  363. package/dist/lib/project-launch.d.ts +1 -1
  364. package/dist/lib/project-launch.js +3 -3
  365. package/dist/lib/project-pull.d.ts +128 -0
  366. package/dist/lib/project-pull.js +384 -0
  367. package/dist/lib/project-root.d.ts +2 -2
  368. package/dist/lib/project-root.js +2 -2
  369. package/dist/lib/project-status.js +1 -1
  370. package/dist/lib/projects.d.ts +23 -0
  371. package/dist/lib/projects.js +29 -6
  372. package/dist/lib/refresh.d.ts +12 -1
  373. package/dist/lib/refresh.js +16 -9
  374. package/dist/lib/registry.d.ts +9 -2
  375. package/dist/lib/registry.js +11 -4
  376. package/dist/lib/resources.d.ts +2 -2
  377. package/dist/lib/resources.js +2 -2
  378. package/dist/lib/routers.d.ts +81 -0
  379. package/dist/lib/routers.js +153 -0
  380. package/dist/lib/routine-context.d.ts +1 -0
  381. package/dist/lib/routine-context.js +7 -2
  382. package/dist/lib/routine-notify-owner.d.ts +1 -1
  383. package/dist/lib/routine-notify.d.ts +1 -1
  384. package/dist/lib/routine-notify.js +1 -1
  385. package/dist/lib/routine-process-cleanup.d.ts +1 -1
  386. package/dist/lib/routine-readiness.d.ts +1 -1
  387. package/dist/lib/routine-readiness.js +11 -4
  388. package/dist/lib/routines-placement.d.ts +12 -2
  389. package/dist/lib/routines-placement.js +20 -3
  390. package/dist/lib/routines-project.d.ts +1 -1
  391. package/dist/lib/routines-project.js +1 -1
  392. package/dist/lib/rules/compile.d.ts +1 -0
  393. package/dist/lib/rules/compile.js +10 -2
  394. package/dist/lib/rules/rules.js +1 -1
  395. package/dist/lib/run-notify.js +1 -1
  396. package/dist/lib/runner.d.ts +80 -2
  397. package/dist/lib/runner.js +241 -62
  398. package/dist/lib/sandbox.d.ts +1 -1
  399. package/dist/lib/scheduler.d.ts +1 -1
  400. package/dist/lib/scheduler.js +1 -1
  401. package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
  402. package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
  403. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  404. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  405. package/dist/lib/secrets/agent.js +2 -2
  406. package/dist/lib/secrets/audit.js +1 -1
  407. package/dist/lib/secrets/bundles.d.ts +3 -3
  408. package/dist/lib/secrets/bundles.js +7 -7
  409. package/dist/lib/secrets/index.js +1 -1
  410. package/dist/lib/secrets/list-filter.d.ts +1 -1
  411. package/dist/lib/secrets/list-filter.js +2 -2
  412. package/dist/lib/secrets/push.d.ts +1 -1
  413. package/dist/lib/secrets/push.js +10 -12
  414. package/dist/lib/secrets/remote.d.ts +12 -10
  415. package/dist/lib/secrets/remote.js +21 -14
  416. package/dist/lib/secrets/vault.js +2 -2
  417. package/dist/lib/self-heal/checks/shadowing.js +1 -1
  418. package/dist/lib/self-heal/checks/shims.js +1 -1
  419. package/dist/lib/self-update.d.ts +39 -4
  420. package/dist/lib/self-update.js +78 -25
  421. package/dist/lib/serve/control.d.ts +1 -1
  422. package/dist/lib/serve/control.js +4 -4
  423. package/dist/lib/serve/data.d.ts +1 -1
  424. package/dist/lib/serve/data.js +1 -1
  425. package/dist/lib/serve/stream.js +1 -1
  426. package/dist/lib/service-manifest.d.ts +29 -0
  427. package/dist/lib/service-manifest.js +80 -0
  428. package/dist/lib/session/active.d.ts +59 -7
  429. package/dist/lib/session/active.js +158 -17
  430. package/dist/lib/session/bash-command.js +1 -1
  431. package/dist/lib/session/claude-accounts.d.ts +1 -1
  432. package/dist/lib/session/claude-accounts.js +1 -1
  433. package/dist/lib/session/db.d.ts +10 -2
  434. package/dist/lib/session/db.js +25 -6
  435. package/dist/lib/session/discover.d.ts +77 -0
  436. package/dist/lib/session/discover.js +130 -25
  437. package/dist/lib/session/fork.js +1 -1
  438. package/dist/lib/session/inject.d.ts +1 -1
  439. package/dist/lib/session/insights.d.ts +1 -1
  440. package/dist/lib/session/insights.js +1 -1
  441. package/dist/lib/session/live-metadata.d.ts +15 -0
  442. package/dist/lib/session/live-metadata.js +76 -0
  443. package/dist/lib/session/migrate-targets.d.ts +1 -1
  444. package/dist/lib/session/recovery.d.ts +1 -1
  445. package/dist/lib/session/recovery.js +2 -2
  446. package/dist/lib/session/remote-active.d.ts +10 -1
  447. package/dist/lib/session/remote-active.js +8 -3
  448. package/dist/lib/session/remote-bundle.d.ts +1 -1
  449. package/dist/lib/session/remote-bundle.js +2 -2
  450. package/dist/lib/session/remote-list.d.ts +15 -4
  451. package/dist/lib/session/remote-list.js +40 -3
  452. package/dist/lib/session/remote.d.ts +5 -5
  453. package/dist/lib/session/remote.js +13 -17
  454. package/dist/lib/session/resume-command.d.ts +3 -2
  455. package/dist/lib/session/resume-command.js +4 -3
  456. package/dist/lib/session/resume-owner.d.ts +3 -3
  457. package/dist/lib/session/resume-owner.js +3 -3
  458. package/dist/lib/session/session-cache.d.ts +12 -0
  459. package/dist/lib/session/session-cache.js +2 -0
  460. package/dist/lib/session/shell-programs.js +1 -1
  461. package/dist/lib/session/state.js +5 -5
  462. package/dist/lib/session/team-filter.d.ts +1 -1
  463. package/dist/lib/session/team-filter.js +1 -1
  464. package/dist/lib/session/types.d.ts +3 -3
  465. package/dist/lib/session/width.d.ts +2 -2
  466. package/dist/lib/session/width.js +2 -2
  467. package/dist/lib/share/delete.d.ts +21 -0
  468. package/dist/lib/share/delete.js +42 -0
  469. package/dist/lib/share/publish.d.ts +82 -0
  470. package/dist/lib/share/publish.js +170 -18
  471. package/dist/lib/share/worker-template.js +172 -9
  472. package/dist/lib/shims.js +35 -7
  473. package/dist/lib/smart-launch.d.ts +36 -6
  474. package/dist/lib/smart-launch.js +65 -8
  475. package/dist/lib/snapshot.d.ts +4 -4
  476. package/dist/lib/snapshot.js +2 -2
  477. package/dist/lib/ssh-exec.d.ts +1 -1
  478. package/dist/lib/ssh-exec.js +2 -2
  479. package/dist/lib/ssh-tunnel.d.ts +10 -10
  480. package/dist/lib/ssh-tunnel.js +12 -12
  481. package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
  482. package/dist/lib/staleness/checkers/hooks.js +1 -1
  483. package/dist/lib/staleness/detectors/permissions.js +0 -23
  484. package/dist/lib/staleness/detectors/plugins.js +1 -1
  485. package/dist/lib/staleness/fingerprint.js +1 -1
  486. package/dist/lib/staleness/layers.d.ts +1 -1
  487. package/dist/lib/staleness/layers.js +1 -1
  488. package/dist/lib/staleness/writers/mcp.js +3 -1
  489. package/dist/lib/staleness/writers/plugins.js +1 -1
  490. package/dist/lib/staleness/writers/types.d.ts +8 -0
  491. package/dist/lib/startup/command-registry.d.ts +5 -147
  492. package/dist/lib/startup/command-registry.js +38 -303
  493. package/dist/lib/startup/dev-build.d.ts +0 -21
  494. package/dist/lib/startup/dev-build.js +29 -8
  495. package/dist/lib/state.d.ts +19 -1
  496. package/dist/lib/state.js +120 -51
  497. package/dist/lib/subagents.js +1 -1
  498. package/dist/lib/sync-status.js +1 -1
  499. package/dist/lib/sync-umbrella.d.ts +6 -1
  500. package/dist/lib/sync-umbrella.js +9 -4
  501. package/dist/lib/teams/agents.js +2 -2
  502. package/dist/lib/teams/registry.js +1 -1
  503. package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
  504. package/dist/lib/terminal/engine.js +1 -1
  505. package/dist/lib/terminal/index.d.ts +4 -0
  506. package/dist/lib/terminal/index.js +3 -0
  507. package/dist/lib/terminal/inject.d.ts +2 -2
  508. package/dist/lib/terminal/inject.js +2 -2
  509. package/dist/lib/terminal/transport.js +1 -1
  510. package/dist/lib/tmux/index.d.ts +1 -1
  511. package/dist/lib/tmux/index.js +1 -1
  512. package/dist/lib/tmux/session.d.ts +21 -5
  513. package/dist/lib/tmux/session.js +76 -22
  514. package/dist/lib/triggers/handlers.d.ts +1 -1
  515. package/dist/lib/triggers/handlers.js +2 -2
  516. package/dist/lib/triggers/webhook.d.ts +36 -2
  517. package/dist/lib/triggers/webhook.js +97 -42
  518. package/dist/lib/types.d.ts +18 -6
  519. package/dist/lib/usage-fleet.d.ts +1 -1
  520. package/dist/lib/usage-fleet.js +1 -1
  521. package/dist/lib/usage-refresh.d.ts +1 -1
  522. package/dist/lib/usage-refresh.js +3 -3
  523. package/dist/lib/version-duplicates.js +2 -2
  524. package/dist/lib/view-types.d.ts +56 -0
  525. package/dist/lib/view-types.js +1 -0
  526. package/dist/lib/watchdog/rotate.d.ts +2 -2
  527. package/dist/lib/watchdog/rotate.js +3 -3
  528. package/dist/lib/watchdog/runner.d.ts +2 -3
  529. package/dist/lib/watchdog/runner.js +3 -4
  530. package/dist/lib/workflows.js +1 -1
  531. package/package.json +2 -1
  532. package/scripts/postinstall.js +2 -2
  533. package/dist/commands/bench.d.ts +0 -2
  534. package/dist/commands/bench.js +0 -101
  535. package/dist/commands/cp.d.ts +0 -84
  536. package/dist/commands/cp.js +0 -231
  537. package/dist/commands/login.d.ts +0 -2
  538. package/dist/lib/resources/commands.d.ts +0 -46
  539. package/dist/lib/resources/commands.js +0 -211
  540. package/dist/lib/resources/hooks.d.ts +0 -16
  541. package/dist/lib/resources/hooks.js +0 -153
  542. package/dist/lib/resources/mcp.d.ts +0 -34
  543. package/dist/lib/resources/mcp.js +0 -250
  544. package/dist/lib/resources/memory.d.ts +0 -15
  545. package/dist/lib/resources/memory.js +0 -46
  546. package/dist/lib/resources/permissions.d.ts +0 -13
  547. package/dist/lib/resources/permissions.js +0 -202
  548. package/dist/lib/resources/rules.d.ts +0 -46
  549. package/dist/lib/resources/rules.js +0 -179
  550. package/dist/lib/resources/skills.d.ts +0 -37
  551. package/dist/lib/resources/skills.js +0 -247
  552. package/dist/lib/resources/subagents.d.ts +0 -46
  553. package/dist/lib/resources/subagents.js +0 -202
  554. /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
@@ -1,28 +1,48 @@
1
1
  /**
2
- * Credential provisioning for `agents run --host --copy-creds`.
2
+ * Credential provisioning for `agents run --device --copy-creds`.
3
3
  *
4
- * Reuses the lease flow's runtime detection + credential-script builder so a
5
- * persistent host can boot logged-in the same way an ephemeral leased box does.
6
- * Unlike `--lease`, a host is persistent, so copying tokens is strictly opt-in
7
- * per run and we shred the files after the run to bound the credential window.
4
+ * `--copy-creds` USED TO copy each signed-in runtime's native login to a
5
+ * persistent host the Claude OAuth token (`.claude/.credentials.json`) plus
6
+ * codex/grok/gemini `auth.json`-style files so the box booted logged-in. Every
7
+ * one of those is a **rotating, interactive OAuth / session credential**, and
8
+ * copying it between devices is forbidden by the fleet-auth contract
9
+ * (`docs/specifications.md` SING-1b, `docs/credential-management.md` invariant 2):
10
+ * a shared refresh token rotates server-side on the next refresh and invalidates
11
+ * every other copy — the "droid collapsed 10 boxes to 1 overnight" failure.
12
+ *
13
+ * So this module no longer serializes native logins at all. It REFUSES the
14
+ * transfer and steers to the portable path — a long-lived, non-rotating provider
15
+ * account (`agents accounts add` / `agents accounts sync`), whose bundle is
16
+ * policy-`never` and safe to reuse on many devices. That sync rides its own
17
+ * hardened SSH transport (RUSH-2527); it never touches this path.
8
18
  */
9
19
  import type { AgentId } from '../types.js';
10
- import { type DetectedRuntime } from '../crabbox/runtimes.js';
20
+ import type { DetectedRuntime } from '../crabbox/runtimes.js';
21
+ export { isNativeOAuthRuntime, nativeOAuthTransferRefusal } from '../crabbox/runtimes.js';
11
22
  export interface HostCredentials {
12
23
  runtimes: AgentId[];
13
24
  detected: DetectedRuntime[];
14
25
  claudeCredentialsJson?: string | null;
15
26
  }
16
27
  /**
17
- * Build the setup (write credential files) and teardown (shred them) scripts for
18
- * a host run. Returns shell snippets meant to be run on the remote host.
28
+ * Build the setup/teardown scripts for a `--copy-creds` host run.
29
+ *
30
+ * Every runtime `--copy-creds` handles is a native OAuth / session login, so this
31
+ * REFUSES rather than serialize one across the wire (SING-1b) — it throws with the
32
+ * concrete `agents accounts` steer. The refusal happens BEFORE anything is
33
+ * serialized, so a native credential can never reach a remote-write script. An
34
+ * empty runtime set is a no-op (nothing to provision, nothing forbidden).
19
35
  */
20
36
  export declare function buildHostCredentialScript(opts: HostCredentials): {
21
37
  setup: string;
22
38
  teardown: string;
23
39
  };
24
40
  /**
25
- * Wrap a remote command so credentials are written before it runs and shredded
26
- * after it exits, regardless of success or failure.
41
+ * Wrap a remote command with credential setup/teardown for a `--copy-creds` run.
42
+ *
43
+ * Delegates to {@link buildHostCredentialScript}, which now refuses to transfer a
44
+ * native OAuth login — so a `--copy-creds` run against a signed-in native runtime
45
+ * fails loudly here (before dispatch) with the `agents accounts sync` steer,
46
+ * rather than shipping a rotating token to another device.
27
47
  */
28
48
  export declare function wrapHostCommandWithCredentials(innerCommand: string, opts: HostCredentials): string;
@@ -1,37 +1,49 @@
1
1
  /**
2
- * Credential provisioning for `agents run --host --copy-creds`.
2
+ * Credential provisioning for `agents run --device --copy-creds`.
3
3
  *
4
- * Reuses the lease flow's runtime detection + credential-script builder so a
5
- * persistent host can boot logged-in the same way an ephemeral leased box does.
6
- * Unlike `--lease`, a host is persistent, so copying tokens is strictly opt-in
7
- * per run and we shred the files after the run to bound the credential window.
4
+ * `--copy-creds` USED TO copy each signed-in runtime's native login to a
5
+ * persistent host the Claude OAuth token (`.claude/.credentials.json`) plus
6
+ * codex/grok/gemini `auth.json`-style files so the box booted logged-in. Every
7
+ * one of those is a **rotating, interactive OAuth / session credential**, and
8
+ * copying it between devices is forbidden by the fleet-auth contract
9
+ * (`docs/specifications.md` SING-1b, `docs/credential-management.md` invariant 2):
10
+ * a shared refresh token rotates server-side on the next refresh and invalidates
11
+ * every other copy — the "droid collapsed 10 boxes to 1 overnight" failure.
12
+ *
13
+ * So this module no longer serializes native logins at all. It REFUSES the
14
+ * transfer and steers to the portable path — a long-lived, non-rotating provider
15
+ * account (`agents accounts add` / `agents accounts sync`), whose bundle is
16
+ * policy-`never` and safe to reuse on many devices. That sync rides its own
17
+ * hardened SSH transport (RUSH-2527); it never touches this path.
8
18
  */
9
- import { buildCredentialScript, CLAUDE_TOKEN_REMOTE } from '../crabbox/runtimes.js';
10
- function getShredPaths(runtimes) {
11
- const pathsById = {
12
- claude: ['.claude.json', CLAUDE_TOKEN_REMOTE],
13
- codex: ['.codex/auth.json'],
14
- gemini: ['.gemini/google_accounts.json'],
15
- grok: ['.grok/auth.json'],
16
- };
17
- return runtimes.flatMap((id) => pathsById[id] ?? []);
18
- }
19
+ import { isNativeOAuthRuntime, nativeOAuthTransferRefusal } from '../crabbox/runtimes.js';
20
+ // The native-OAuth predicate + refusal are canonical in `crabbox/runtimes.ts`
21
+ // (next to `LEASE_RUNTIMES`), so `--copy-creds` here and `--lease` there refuse
22
+ // against exactly the same set. Re-export for this module's existing consumers.
23
+ export { isNativeOAuthRuntime, nativeOAuthTransferRefusal } from '../crabbox/runtimes.js';
19
24
  /**
20
- * Build the setup (write credential files) and teardown (shred them) scripts for
21
- * a host run. Returns shell snippets meant to be run on the remote host.
25
+ * Build the setup/teardown scripts for a `--copy-creds` host run.
26
+ *
27
+ * Every runtime `--copy-creds` handles is a native OAuth / session login, so this
28
+ * REFUSES rather than serialize one across the wire (SING-1b) — it throws with the
29
+ * concrete `agents accounts` steer. The refusal happens BEFORE anything is
30
+ * serialized, so a native credential can never reach a remote-write script. An
31
+ * empty runtime set is a no-op (nothing to provision, nothing forbidden).
22
32
  */
23
33
  export function buildHostCredentialScript(opts) {
24
- const setup = buildCredentialScript(opts.runtimes, opts.detected, {
25
- claudeCredentialsJson: opts.claudeCredentialsJson,
26
- });
27
- const teardown = getShredPaths(opts.runtimes)
28
- .map((p) => `rm -f "$HOME/${p}" 2>/dev/null || true`)
29
- .join('\n');
30
- return { setup, teardown };
34
+ const native = opts.runtimes.filter(isNativeOAuthRuntime);
35
+ if (native.length > 0) {
36
+ throw new Error(nativeOAuthTransferRefusal(native));
37
+ }
38
+ return { setup: '', teardown: '' };
31
39
  }
32
40
  /**
33
- * Wrap a remote command so credentials are written before it runs and shredded
34
- * after it exits, regardless of success or failure.
41
+ * Wrap a remote command with credential setup/teardown for a `--copy-creds` run.
42
+ *
43
+ * Delegates to {@link buildHostCredentialScript}, which now refuses to transfer a
44
+ * native OAuth login — so a `--copy-creds` run against a signed-in native runtime
45
+ * fails loudly here (before dispatch) with the `agents accounts sync` steer,
46
+ * rather than shipping a rotating token to another device.
35
47
  */
36
48
  export function wrapHostCommandWithCredentials(innerCommand, opts) {
37
49
  const { setup, teardown } = buildHostCredentialScript(opts);
@@ -5,7 +5,7 @@
5
5
  * remote log and its exit code to a sibling `.exit` file, so progress survives a
6
6
  * dropped connection (followed via offset-tail in progress.ts). This is the
7
7
  * offload win: the process/thread/file fan-out happens on the host, not the
8
- * laptop. `agents run` uses it; `agents teams start --watch --host` reuses the
8
+ * laptop. `agents run` uses it; `agents teams start --watch --device` reuses the
9
9
  * same core so a remote team supervisor keeps running after you disconnect.
10
10
  */
11
11
  import type { Host } from './types.js';
@@ -221,7 +221,7 @@ export declare function buildInteractiveRunForwardedArgs(opts: InteractiveDispat
221
221
  * tmux wrapping; the local machine is just the transport.
222
222
  */
223
223
  export declare function runInteractiveOnHost(host: Host, opts: InteractiveDispatchOptions): Promise<number>;
224
- /** Dispatch an `agents run <agent> "<prompt>"` onto a host (the `run --host` path). */
224
+ /** Dispatch an `agents run <agent> "<prompt>"` onto a host (the `run --device` path). */
225
225
  export declare function dispatchToHost(host: Host, opts: DispatchOptions): Promise<DispatchResult>;
226
226
  export interface CommandDispatchOptions {
227
227
  /** `agents …` args (command name first), already stripped of routing flags. */
@@ -232,7 +232,7 @@ export interface CommandDispatchOptions {
232
232
  }
233
233
  /**
234
234
  * Dispatch an arbitrary long-running `agents <command>` onto a host detached —
235
- * used for `teams start --watch --host`, whose supervisor must outlive the SSH
235
+ * used for `teams start --watch --device`, whose supervisor must outlive the SSH
236
236
  * connection. Reachability is assumed (the caller has already resolved the host);
237
237
  * a launch failure surfaces the remote stderr.
238
238
  */
@@ -5,7 +5,7 @@
5
5
  * remote log and its exit code to a sibling `.exit` file, so progress survives a
6
6
  * dropped connection (followed via offset-tail in progress.ts). This is the
7
7
  * offload win: the process/thread/file fan-out happens on the host, not the
8
- * laptop. `agents run` uses it; `agents teams start --watch --host` reuses the
8
+ * laptop. `agents run` uses it; `agents teams start --watch --device` reuses the
9
9
  * same core so a remote team supervisor keeps running after you disconnect.
10
10
  */
11
11
  import { randomUUID } from 'crypto';
@@ -499,7 +499,7 @@ export async function runInteractiveOnHost(host, opts) {
499
499
  extraSshArgs: hostIdentityArgs(host),
500
500
  });
501
501
  }
502
- /** Dispatch an `agents run <agent> "<prompt>"` onto a host (the `run --host` path). */
502
+ /** Dispatch an `agents run <agent> "<prompt>"` onto a host (the `run --device` path). */
503
503
  export async function dispatchToHost(host, opts) {
504
504
  const target = sshTargetFor(host);
505
505
  // Concrete agent@version pins fail loud before we print "Dispatched" and
@@ -524,7 +524,7 @@ export async function dispatchToHost(host, opts) {
524
524
  }
525
525
  /**
526
526
  * Dispatch an arbitrary long-running `agents <command>` onto a host detached —
527
- * used for `teams start --watch --host`, whose supervisor must outlive the SSH
527
+ * used for `teams start --watch --device`, whose supervisor must outlive the SSH
528
528
  * connection. Reachability is assumed (the caller has already resolved the host);
529
529
  * a launch failure surfaces the remote stderr.
530
530
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Shared `--host` option registrar. Every command that can run on a remote host
2
+ * Shared `--device` option registrar. Every command that can run on a remote device
3
3
  * declares the flag through here, so its spelling, help text, and companions
4
4
  * (`--remote-cwd`, `--no-tty`, `--any`) stay identical everywhere and show up in
5
5
  * each command's `--help`.
@@ -7,8 +7,8 @@
7
7
  * The flags are consumed centrally by `maybeRunOnHost` (passthrough.ts) *before*
8
8
  * commander parses, so for a real remote run the local action never sees them.
9
9
  * Registering them here still matters: it documents the flag and keeps the local
10
- * fall-through (e.g. `--host <this-machine>`) from erroring on an unknown option.
10
+ * fall-through (e.g. `--device <this-machine>`) from erroring on an unknown option.
11
11
  */
12
12
  import type { Command } from 'commander';
13
- /** Attach the standard `--host` flag family to a command and return it (chainable). */
13
+ /** Attach the standard `--device` flag family to a command and return it (chainable). */
14
14
  export declare function addHostOption(cmd: Command): Command;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Shared `--host` option registrar. Every command that can run on a remote host
2
+ * Shared `--device` option registrar. Every command that can run on a remote device
3
3
  * declares the flag through here, so its spelling, help text, and companions
4
4
  * (`--remote-cwd`, `--no-tty`, `--any`) stay identical everywhere and show up in
5
5
  * each command's `--help`.
@@ -7,14 +7,13 @@
7
7
  * The flags are consumed centrally by `maybeRunOnHost` (passthrough.ts) *before*
8
8
  * commander parses, so for a real remote run the local action never sees them.
9
9
  * Registering them here still matters: it documents the flag and keeps the local
10
- * fall-through (e.g. `--host <this-machine>`) from erroring on an unknown option.
10
+ * fall-through (e.g. `--device <this-machine>`) from erroring on an unknown option.
11
11
  */
12
- /** Attach the standard `--host` flag family to a command and return it (chainable). */
12
+ /** Attach the standard `--device` flag family to a command and return it (chainable). */
13
13
  export function addHostOption(cmd) {
14
14
  return cmd
15
- .option('-H, --host <name>', 'Run this command on another machine over SSH instead of locally — a device, an ssh-config host, user@host, or `all` to fan out across every registered device. See `agents devices`.')
16
- .option('--device <name>', 'Alias of --host: run this command on a registered device (from `agents devices`), or `all` to run it across the whole fleet.')
17
- .option('--remote-cwd <dir>', "Working directory on the host for --host runs. Resolves on the REMOTE host — pass a '$HOME'-relative path (single-quoted so your local shell doesn't expand it) or a valid remote absolute path; a local ~ expands here and won't exist there (/Users/you vs /home/you). No effect on 'teams add'.")
18
- .option('--no-tty', 'Force non-interactive output for --host runs even from a terminal.')
19
- .option('--any', 'With --host <cap> (a capability tag), pick any matching host instead of erroring when several match.');
15
+ .option('-D, --device <name>', 'Run this command on another machine over SSH instead of locally — a registered device, user@host, or `all` to fan out across every registered device. See `agents devices` / `agents hosts`.')
16
+ .option('--remote-cwd <dir>', "Working directory on the device for --device runs. Resolves on the REMOTE device — pass a '$HOME'-relative path (single-quoted so your local shell doesn't expand it) or a valid remote absolute path; a local ~ expands here and won't exist there (/Users/you vs /home/you). No effect on 'teams add'.")
17
+ .option('--no-tty', 'Force non-interactive output for --device runs even from a terminal.')
18
+ .option('--any', 'With --device <cap> (a capability tag), pick any matching device instead of erroring when several match.');
20
19
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Generic `--host` passthrough — the single choke point that runs an allowlisted
2
+ * Generic `--device` passthrough — the single choke point that runs an allowlisted
3
3
  * `agents <command>` on a remote host instead of locally. Called once from
4
4
  * `index.ts` before commander parses; returns `true` when it handled the
5
5
  * invocation (the local command must then NOT run).
@@ -10,10 +10,10 @@
10
10
  * long-running case — `teams start --watch` — dispatches detached so the remote
11
11
  * supervisor outlives a dropped connection.
12
12
  *
13
- * Commands with their own richer `--host` handling (`run`/`sessions`/`feed`/
13
+ * Commands with their own richer `--device` handling (`run`/`sessions`/`feed`/
14
14
  * `computer`/`secrets`/`logs`/…) are listed in {@link OWN_HOST_COMMANDS} and
15
15
  * fall through to their local actions. Everything else either routes via this
16
- * table or, when `--host`/`--device` is present, exits with a clear
16
+ * table or, when `--device` is present, exits with a clear
17
17
  * "not supported" message — never commander's raw `unknown option`.
18
18
  */
19
19
  import { type Host } from './types.js';
@@ -28,7 +28,7 @@ interface RemoteSpec {
28
28
  }
29
29
  /**
30
30
  * First-class groups that run transparently on a remote via SSH when
31
- * `--host`/`--device` is present. Keep both canonical names and aliases
31
+ * `--device` is present. Keep both canonical names and aliases
32
32
  * (`repo`/`repos`, `exec`/`run`) so either argv form routes the same way.
33
33
  *
34
34
  * Prefer adding here over per-command SSH code — this is the single choke point.
@@ -43,7 +43,7 @@ interface RemoteSpec {
43
43
  */
44
44
  export declare const REMOTE_PASSTHROUGH: Record<string, RemoteSpec>;
45
45
  /**
46
- * Commands that register and interpret `--host`/`--device` themselves — must
46
+ * Commands that register and interpret `--device` themselves — must
47
47
  * fall through to local commander even when the flag is present. Do not add
48
48
  * these to {@link REMOTE_PASSTHROUGH}.
49
49
  */
@@ -71,34 +71,34 @@ export declare function markFleetRemote(cmd: string[], device: DeviceProfile): s
71
71
  /** Run `agents <command> …` across every registered device and render the roster. */
72
72
  export declare function runFleetPassthrough(command: string, allArgs: string[], spec: RemoteSpec, opts?: FleetPassthroughOptions): Promise<boolean>;
73
73
  /**
74
- * Route `agents <command> … --host <name>` to a remote if the command is
75
- * host-routable and a `--host` (or its `--device` alias) was given. Returns
76
- * `false` (run locally) when neither flag is present, the command owns its own
77
- * host handling, the target is this very machine, or placement flags need the
78
- * local action. Returns `true` after printing a clear error when the flag is
79
- * present on a command that is neither routable nor self-handling — so the user
80
- * never sees commander's raw `unknown option '--host'`.
74
+ * Route `agents <command> … --device <name>` to a remote if the command is
75
+ * device-routable and `--device` (or a fleet sentinel `--hosts`/`--devices`) was
76
+ * given. Returns `false` (run locally) when no routing flag is present, the
77
+ * command owns its own device handling, the target is this very machine, or
78
+ * placement flags need the local action. Returns `true` after printing a clear
79
+ * error when the flag is present on a command that is neither routable nor
80
+ * self-handling — so the user never sees commander's raw `unknown option`.
81
81
  *
82
82
  * @param command the resolved subcommand name (`process.argv`'s first non-flag).
83
83
  * @param allArgs `process.argv.slice(2)` — the command name followed by its args.
84
84
  */
85
85
  export declare function maybeRunOnHost(command: string, allArgs: string[], opts?: FleetPassthroughOptions): Promise<boolean>;
86
86
  /**
87
- * `--host` passthrough for a **standalone binary** whose command name is fixed by
87
+ * `--device` passthrough for a **standalone binary** whose command name is fixed by
88
88
  * the binary itself (the `browser`/`computer` bins, `dist/browser.js` etc.) rather
89
89
  * than being the first argv token.
90
90
  *
91
- * `agents browser … --host <box>` routes through {@link maybeRunOnHost} in
91
+ * `agents browser … --device <box>` routes through {@link maybeRunOnHost} in
92
92
  * index.ts, but the standalone `browser` binary never enters index.ts — so without
93
- * this it dropped `--host` entirely (commander errored with `unknown option
94
- * '--host'`). This wires the identical routing: it synthesizes the implicit command
93
+ * this it dropped `--device` entirely (commander errored with `unknown option
94
+ * '--device'`). This wires the identical routing: it synthesizes the implicit command
95
95
  * token (`browser`) at the front of the argv so the remote invocation builds as
96
96
  * `agents browser …`, delegates to {@link maybeRunOnHost}, and returns `true` when
97
97
  * it dispatched the run to a remote (the local program must then NOT parse).
98
98
  *
99
99
  * On a local / self-host fall-through it rewrites `process.argv` to the ORIGINAL
100
100
  * args minus the routing flags — never the synthetic command token — so the
101
- * standalone commander program parses cleanly and never sees an unknown `--host`.
101
+ * standalone commander program parses cleanly and never sees an unknown `--device`.
102
102
  * When no routing flag is present it leaves `process.argv` untouched (the common
103
103
  * case), so an unrelated flag like `--no-tty` is never stripped from a purely local
104
104
  * run.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Generic `--host` passthrough — the single choke point that runs an allowlisted
2
+ * Generic `--device` passthrough — the single choke point that runs an allowlisted
3
3
  * `agents <command>` on a remote host instead of locally. Called once from
4
4
  * `index.ts` before commander parses; returns `true` when it handled the
5
5
  * invocation (the local command must then NOT run).
@@ -10,10 +10,10 @@
10
10
  * long-running case — `teams start --watch` — dispatches detached so the remote
11
11
  * supervisor outlives a dropped connection.
12
12
  *
13
- * Commands with their own richer `--host` handling (`run`/`sessions`/`feed`/
13
+ * Commands with their own richer `--device` handling (`run`/`sessions`/`feed`/
14
14
  * `computer`/`secrets`/`logs`/…) are listed in {@link OWN_HOST_COMMANDS} and
15
15
  * fall through to their local actions. Everything else either routes via this
16
- * table or, when `--host`/`--device` is present, exits with a clear
16
+ * table or, when `--device` is present, exits with a clear
17
17
  * "not supported" message — never commander's raw `unknown option`.
18
18
  */
19
19
  import chalk from 'chalk';
@@ -38,7 +38,7 @@ import { isKnownTopLevelCommand } from '../startup/command-registry.js';
38
38
  export { flagValue, hasHostRoutingFlag } from './routing-flag.js';
39
39
  /**
40
40
  * First-class groups that run transparently on a remote via SSH when
41
- * `--host`/`--device` is present. Keep both canonical names and aliases
41
+ * `--device` is present. Keep both canonical names and aliases
42
42
  * (`repo`/`repos`, `exec`/`run`) so either argv form routes the same way.
43
43
  *
44
44
  * Prefer adding here over per-command SSH code — this is the single choke point.
@@ -60,11 +60,9 @@ export const REMOTE_PASSTHROUGH = {
60
60
  check: {},
61
61
  list: {},
62
62
  usage: {},
63
- cost: {},
64
63
  insights: {},
65
- output: {},
66
- budget: {},
67
64
  // config / resources
65
+ config: {},
68
66
  sync: { nonInteractive: ['--yes'] },
69
67
  pull: {},
70
68
  push: {},
@@ -82,7 +80,6 @@ export const REMOTE_PASSTHROUGH = {
82
80
  subagents: {},
83
81
  workflows: {},
84
82
  models: {},
85
- profiles: {},
86
83
  defaults: {},
87
84
  alias: {},
88
85
  // Installations are per-machine, so updating one on a peer means running it
@@ -109,14 +106,14 @@ export const REMOTE_PASSTHROUGH = {
109
106
  browser: {},
110
107
  };
111
108
  /**
112
- * Commands that register and interpret `--host`/`--device` themselves — must
109
+ * Commands that register and interpret `--device` themselves — must
113
110
  * fall through to local commander even when the flag is present. Do not add
114
111
  * these to {@link REMOTE_PASSTHROUGH}.
115
112
  */
116
113
  export const OWN_HOST_COMMANDS = new Set([
117
114
  'run',
118
115
  'exec', // deprecated alias of run
119
- 'harness', // `--host <agent>` names the host CLI to run under, not a remote device
116
+ 'harness', // `--host <agent>` names the host CLI to run under (not a device routing flag)
120
117
  'harnesses',
121
118
  'sessions',
122
119
  'feed',
@@ -149,7 +146,7 @@ function syntheticHost(target) {
149
146
  // Bare name: ssh resolves it from ~/.ssh/config, or connects to it as a hostname.
150
147
  return { name: target, provider: 'local', source: 'ssh-config' };
151
148
  }
152
- /** Resolve a `--host` value to a Host: enrolled name → capability tag → raw target. */
149
+ /** Resolve a `--device` value to a Host: enrolled name → capability tag → raw target. */
153
150
  async function resolveTargetHost(name, any) {
154
151
  const enrolled = await resolveHost(name);
155
152
  if (enrolled)
@@ -238,7 +235,7 @@ function formatCompactTokens(n) {
238
235
  return `${(n / 1e3).toFixed(1)}K`;
239
236
  return String(n);
240
237
  }
241
- /** One-line summary of a per-device `agents output --json` payload. */
238
+ /** One-line summary of a per-device `agents insights output --json` payload. */
242
239
  function summarizeOutputResult(json) {
243
240
  const p = json;
244
241
  const burn = p?.burn;
@@ -254,12 +251,38 @@ function summarizeOutputResult(json) {
254
251
  parts.push(`${commits} commits`);
255
252
  return parts.length ? parts.join(' · ') : 'ok';
256
253
  }
254
+ /**
255
+ * Summarize a `sync` payload, surfacing anything the peer REFUSED to write.
256
+ *
257
+ * The fan-out injects `--json`, so each peer returns the corrected `ok` and
258
+ * `declined` from RUSH-2700 — but the roster rendered a flat `ok` regardless,
259
+ * so `agents sync --device all` printed a green row for every box even when a
260
+ * harness's config was never written. That is the fleet-wide silent success
261
+ * this ticket exists to remove, one layer above where it was fixed.
262
+ *
263
+ * Covers both payload shapes: the umbrella carries a flat `declined`, the
264
+ * per-agent modes carry one per version.
265
+ */
266
+ function summarizeSyncResult(json) {
267
+ const p = json;
268
+ const flat = Array.isArray(p?.declined) ? p.declined : [];
269
+ const perVersion = Array.isArray(p?.versions)
270
+ ? p.versions.flatMap((v) => (Array.isArray(v?.declined) ? v.declined : []))
271
+ : [];
272
+ const declined = [...flat, ...perVersion];
273
+ if (declined.length === 0)
274
+ return 'ok';
275
+ return `${declined.length} not written`;
276
+ }
257
277
  /** Best-effort summary of any per-device JSON payload. */
258
278
  function summarizeResult(command, forwarded, json) {
259
279
  if (command === 'view')
260
280
  return summarizeViewResult(forwarded, json);
261
- if (command === 'output')
281
+ // #2621 nested `output` under `insights`; main added a sync declined tally.
282
+ if (command === 'insights' && forwarded[1] === 'output')
262
283
  return summarizeOutputResult(json);
284
+ if (command === 'sync')
285
+ return summarizeSyncResult(json);
263
286
  return 'ok';
264
287
  }
265
288
  const GROUP_ORDER = ['macOS', 'Linux', 'Windows', 'Other'];
@@ -382,39 +405,37 @@ export async function runFleetPassthrough(command, allArgs, spec, opts = {}) {
382
405
  return true;
383
406
  }
384
407
  /**
385
- * Route `agents <command> … --host <name>` to a remote if the command is
386
- * host-routable and a `--host` (or its `--device` alias) was given. Returns
387
- * `false` (run locally) when neither flag is present, the command owns its own
388
- * host handling, the target is this very machine, or placement flags need the
389
- * local action. Returns `true` after printing a clear error when the flag is
390
- * present on a command that is neither routable nor self-handling — so the user
391
- * never sees commander's raw `unknown option '--host'`.
408
+ * Route `agents <command> … --device <name>` to a remote if the command is
409
+ * device-routable and `--device` (or a fleet sentinel `--hosts`/`--devices`) was
410
+ * given. Returns `false` (run locally) when no routing flag is present, the
411
+ * command owns its own device handling, the target is this very machine, or
412
+ * placement flags need the local action. Returns `true` after printing a clear
413
+ * error when the flag is present on a command that is neither routable nor
414
+ * self-handling — so the user never sees commander's raw `unknown option`.
392
415
  *
393
416
  * @param command the resolved subcommand name (`process.argv`'s first non-flag).
394
417
  * @param allArgs `process.argv.slice(2)` — the command name followed by its args.
395
418
  */
396
419
  export async function maybeRunOnHost(command, allArgs, opts) {
397
- const hostFlag = flagValue(allArgs, 'host', 'H');
398
- const deviceFlag = flagValue(allArgs, 'device');
420
+ const deviceFlag = flagValue(allArgs, 'device', 'D');
399
421
  const hostsFlag = flagValue(allArgs, 'hosts');
400
422
  const devicesFlag = flagValue(allArgs, 'devices');
401
- let hostName = hostFlag ?? deviceFlag;
402
- const fleetAll = isFleetAllSentinel(hostFlag, deviceFlag, hostsFlag, devicesFlag);
423
+ let hostName = deviceFlag;
424
+ const fleetAll = isFleetAllSentinel(undefined, deviceFlag, hostsFlag, devicesFlag);
403
425
  // Proceed when any routing flag is present, including the plural fleet flags
404
426
  // that may carry the `all` sentinel.
405
427
  if (!hostName && !hostsFlag && !devicesFlag)
406
428
  return false;
407
- // Commands with their own richer --host semantics must reach local commander
408
- // BEFORE any single-target conflict gate. sessions/feed merge --host and
409
- // --device into a multi-host list; rejecting "conflicting" pairs would break
410
- // `agents sessions --host a --device b` / `agents feed --host a --device b`.
429
+ // Commands with their own richer --device semantics must reach local commander
430
+ // directly. sessions/feed handle multi-host lists themselves; fall through so
431
+ // those flags reach the local action.
411
432
  if (OWN_HOST_COMMANDS.has(command))
412
433
  return false;
413
434
  // Placement, not routing: `teams add`/`teams create` read `--device`/`--devices`
414
- // (and `--host`/`--hosts`) as WHERE to place a teammate / the team pool — the
435
+ // (and `--hosts`) as WHERE to place a teammate / the team pool — the
415
436
  // command itself always runs locally on the orchestrator. Bail before the
416
437
  // generic teams routing below so those flags reach the local action. Every
417
- // other teams subcommand (`status`/`logs`/`stop`/…) keeps `--host` routing.
438
+ // other teams subcommand (`status`/`logs`/`stop`/…) keeps `--device` routing.
418
439
  // Find the subcommand = the first non-flag token AFTER `teams` (robust to any
419
440
  // leading global flags), then bail for the add/create aliases.
420
441
  if (command === 'teams') {
@@ -428,7 +449,7 @@ export async function maybeRunOnHost(command, allArgs, opts) {
428
449
  // the `all` sentinel, which this module fans out generically. On `routines`,
429
450
  // a non-all `--devices` value is placement (which devices may run the routine).
430
451
  if (allArgs.includes('--hosts') && hostsFlag?.toLowerCase() !== 'all')
431
- return false;
452
+ return false; // legacy plural sentinel; prefer --devices
432
453
  if (allArgs.includes('--devices')) {
433
454
  if (devicesFlag === undefined)
434
455
  return false; // malformed, let commander error
@@ -438,8 +459,8 @@ export async function maybeRunOnHost(command, allArgs, opts) {
438
459
  }
439
460
  // A command that does not exist is an unknown-command error, not a routing
440
461
  // error. The router runs BEFORE commander parses, so without this gate a typo
441
- // (`agents session resume --host box`) was answered with "does not support
442
- // --host/--device" — a true statement about a command the user never typed,
462
+ // (`agents session resume --device box`) was answered with "does not support
463
+ // --device" — a true statement about a command the user never typed,
443
464
  // and the exact opposite of the truth for the `sessions` they meant, which
444
465
  // does support it. Fall through so commander reports `unknown command` (and
445
466
  // its did-you-mean). RUSH-2022.
@@ -449,25 +470,21 @@ export async function maybeRunOnHost(command, allArgs, opts) {
449
470
  if (!spec) {
450
471
  // Flag was accepted (no raw commander "unknown option") but this group has
451
472
  // no remote semantics — say so clearly instead of falling through.
452
- console.error(chalk.red(`\`agents ${command}\` does not support --host/--device (no remote interpretation).`) +
453
- chalk.gray(' Run without the flag, or use a host-routable group (repos, view, sync, teams, doctor, …).'));
454
- process.exitCode = 1;
455
- return true;
456
- }
457
- // Reject a conflicting --host/--device pair before either the fleet fan-out
458
- // or single-target path runs. Equal values (e.g. both `all`) are allowed.
459
- if (hostFlag && deviceFlag && hostFlag !== deviceFlag) {
460
- console.error(chalk.red('Conflicting --host/--device values — pass just one.'));
473
+ console.error(chalk.red(`\`agents ${command}\` does not support --device (no remote interpretation).`) +
474
+ chalk.gray(' Run without the flag, or use a device-routable group (repos, view, sync, teams, doctor, …).'));
461
475
  process.exitCode = 1;
462
476
  return true;
463
477
  }
478
+ // Reject duplicate --device flags before either the fleet fan-out
479
+ // or single-target path runs. (Conflict detection: only --device exists now.)
480
+ // No conflict gate needed — a single canonical flag cannot conflict with itself.
464
481
  // Generic fleet fan-out for the `all` sentinel — before single-host resolution
465
482
  // so `all` is never treated as a literal hostname.
466
483
  if (fleetAll) {
467
484
  return runFleetPassthrough(command, allArgs, spec, opts);
468
485
  }
469
486
  // After the bailouts and fleet fan-out above, the only remaining path is a
470
- // single-target --host/--device. Guard for the type checker: plural non-all
487
+ // single-target --device. Guard for the type checker: plural non-all
471
488
  // flags and bare flags were already handled.
472
489
  if (!hostName)
473
490
  return false;
@@ -489,10 +506,10 @@ export async function maybeRunOnHost(command, allArgs, opts) {
489
506
  }
490
507
  // Running against your own machine is just a local run — skip the SSH round-trip.
491
508
  // Match EVERY identity the box answers to (short id, loopback, tailscale
492
- // dnsName), not just machineId() — a `--host <self-dnsName>` used to slip past a
509
+ // dnsName), not just machineId() — a `--device <self-dnsName>` used to slip past a
493
510
  // short-hostname-only check and self-SSH (RUSH-2114). Strip the routing flags
494
511
  // from process.argv so the local command never sees an unregistered
495
- // `--host`/`--device` and dies with "unknown option".
512
+ // `--device` and dies with "unknown option".
496
513
  if (isSelfHost(hostName)) {
497
514
  const stripped = stripRoutingFlags(allArgs, STRIP_SPECS);
498
515
  process.argv = [process.argv[0], process.argv[1], ...stripped];
@@ -551,21 +568,21 @@ export async function maybeRunOnHost(command, allArgs, opts) {
551
568
  return true;
552
569
  }
553
570
  /**
554
- * `--host` passthrough for a **standalone binary** whose command name is fixed by
571
+ * `--device` passthrough for a **standalone binary** whose command name is fixed by
555
572
  * the binary itself (the `browser`/`computer` bins, `dist/browser.js` etc.) rather
556
573
  * than being the first argv token.
557
574
  *
558
- * `agents browser … --host <box>` routes through {@link maybeRunOnHost} in
575
+ * `agents browser … --device <box>` routes through {@link maybeRunOnHost} in
559
576
  * index.ts, but the standalone `browser` binary never enters index.ts — so without
560
- * this it dropped `--host` entirely (commander errored with `unknown option
561
- * '--host'`). This wires the identical routing: it synthesizes the implicit command
577
+ * this it dropped `--device` entirely (commander errored with `unknown option
578
+ * '--device'`). This wires the identical routing: it synthesizes the implicit command
562
579
  * token (`browser`) at the front of the argv so the remote invocation builds as
563
580
  * `agents browser …`, delegates to {@link maybeRunOnHost}, and returns `true` when
564
581
  * it dispatched the run to a remote (the local program must then NOT parse).
565
582
  *
566
583
  * On a local / self-host fall-through it rewrites `process.argv` to the ORIGINAL
567
584
  * args minus the routing flags — never the synthetic command token — so the
568
- * standalone commander program parses cleanly and never sees an unknown `--host`.
585
+ * standalone commander program parses cleanly and never sees an unknown `--device`.
569
586
  * When no routing flag is present it leaves `process.argv` untouched (the common
570
587
  * case), so an unrelated flag like `--no-tty` is never stripped from a purely local
571
588
  * run.
@@ -5,7 +5,7 @@
5
5
  * registry.json) into the host pool behind the same `HostProvider` seam as
6
6
  * `local` — the "tailscale provider" fast-follow named in docs/hosts.md. With
7
7
  * it, a machine registered once via `agents devices sync` becomes a resolvable
8
- * `--host`/`--device` dispatch target, participates in capability routing, and
8
+ * `--device`/`--device` dispatch target, participates in capability routing, and
9
9
  * is enumerable by target pickers — not just resolvable by exact name.
10
10
  *
11
11
  * Password-auth devices are listed (the pool stays honest about what exists)
@@ -5,7 +5,7 @@
5
5
  * registry.json) into the host pool behind the same `HostProvider` seam as
6
6
  * `local` — the "tailscale provider" fast-follow named in docs/hosts.md. With
7
7
  * it, a machine registered once via `agents devices sync` becomes a resolvable
8
- * `--host`/`--device` dispatch target, participates in capability routing, and
8
+ * `--device`/`--device` dispatch target, participates in capability routing, and
9
9
  * is enumerable by target pickers — not just resolvable by exact name.
10
10
  *
11
11
  * Password-auth devices are listed (the pool stays honest about what exists)
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Reconcile a local host-task record against the remote run's ground truth.
3
3
  *
4
- * A detached `--host` run outlives the local follower: it keeps running and
4
+ * A detached `--device` run outlives the local follower: it keeps running and
5
5
  * writes its exit code to `<id>.exit` on the host even if the laptop sleeps or
6
6
  * the SSH connection drops mid-follow. When that happens the local record is
7
7
  * left at `status:'running'` forever, because the only path that finalizes it