@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,5 +1,5 @@
1
1
  /**
2
- * Device placement for `--device auto` / `--host auto`.
2
+ * Device placement for `--device auto`.
3
3
  *
4
4
  * Explicit auto placement probes live fleet health and harness readiness.
5
5
  * Historical affinity remains for generic host resolution callers.
@@ -7,7 +7,8 @@
7
7
  */
8
8
  import { queryAffinityRollup } from './session/db.js';
9
9
  import { localMachineId } from './session/origin-machine.js';
10
- import { loadDevicesSync } from './devices/registry.js';
10
+ import { isControlDevice, loadDevicesSync } from './devices/registry.js';
11
+ import { describeAutoPool, filterAutoPool, isAutoPoolMember } from './devices/pool.js';
11
12
  import { normalizeHost } from './machine-id.js';
12
13
  import { probePoolSignals } from './teams/placement-probe.js';
13
14
  import { pickBestDevice } from './teams/scheduler.js';
@@ -45,7 +46,23 @@ export function sampleWeighted(candidates, rng = Math.random) {
45
46
  }
46
47
  return candidates[candidates.length - 1].key;
47
48
  }
48
- /** Online device names from the local registry (+ always include local). */
49
+ /**
50
+ * Online device names from the local registry (+ local), narrowed to the
51
+ * automatic-placement pool.
52
+ *
53
+ * The pool rule lives in `devices/pool.ts` and is an allowlist once any device
54
+ * is marked `role=worker`: this is the single place both automatic-placement
55
+ * paths (`resolveDeviceAuto`, `resolveDeviceAffinity`) get their candidates, so
56
+ * marking workers moves every `--device auto` at once instead of one surface.
57
+ *
58
+ * Paired cockpits (`role: control` in the device registry) are dropped here,
59
+ * where the registry is already being read — they are control surfaces, not
60
+ * compute. It CAN return an empty list — a fleet where every marked worker is
61
+ * offline, or where this box is the only candidate and is marked `personal`. That is a
62
+ * real answer, and both callers fail loud on it rather than falling back to the
63
+ * local machine (which would be the exact box the operator marked personal to
64
+ * keep agents off).
65
+ */
49
66
  export function listOnlineDeviceNames(localName = localMachineId()) {
50
67
  const names = new Set([normalizeHost(localName)]);
51
68
  try {
@@ -57,13 +74,27 @@ export function listOnlineDeviceNames(localName = localMachineId()) {
57
74
  // No tailscale snapshot → treat as candidate (registry-only box).
58
75
  if (online === false)
59
76
  continue;
77
+ // A paired cockpit (iPhone/iPad) is a control surface, not compute — it
78
+ // is never dialed for a session, so it is never a placement candidate.
79
+ if (isControlDevice(d))
80
+ continue;
60
81
  names.add(normalizeHost(name));
61
82
  }
62
83
  }
63
84
  catch {
64
85
  /* registry missing — local only */
65
86
  }
66
- return [...names];
87
+ return filterAutoPool([...names]);
88
+ }
89
+ /**
90
+ * The error both automatic-placement resolvers raise when device roles leave no
91
+ * candidate at all. Fail loud: the alternative — quietly running on the local
92
+ * machine — puts the agent on the box the operator marked `personal`.
93
+ */
94
+ export function formatEmptyAutoPoolError() {
95
+ const marked = describeAutoPool();
96
+ return (`agents: no device is eligible for automatic placement${marked ? ` (${marked})` : ''} — ` +
97
+ 'mark one with `agents devices role <name> worker`, or widen the pool with `agents config set auto.pool all`.');
67
98
  }
68
99
  export function formatNoHealthyDeviceError(pool, signals, agent) {
69
100
  const excluded = pool.map((key) => {
@@ -78,7 +109,13 @@ export function formatNoHealthyDeviceError(pool, signals, agent) {
78
109
  return `${key} (${reason})`;
79
110
  }).join(', ');
80
111
  const target = agent ? `can run ${agent}` : "for 'run auto'";
81
- return `agents: no healthy device ${target} excluded: ${excluded}; earliest window resets unknown`;
112
+ // Name the role narrowing when there is one: a fleet where every box but two
113
+ // is filtered out by a worker mark reads as "the fleet is down" without it.
114
+ // Roster on `pool` so a fleet-wide role default reaches a doc-less device
115
+ // in this error's own candidate set, not just the ones with a doc.
116
+ const marked = describeAutoPool({ roster: pool });
117
+ const poolNote = marked ? ` [pool: ${marked}]` : '';
118
+ return `agents: no healthy device ${target}${poolNote} — excluded: ${excluded}; earliest window resets unknown`;
82
119
  }
83
120
  /**
84
121
  * Pick the least-loaded healthy device that can run `agent` when the harness is
@@ -90,8 +127,13 @@ export function formatNoHealthyDeviceError(pool, signals, agent) {
90
127
  export async function resolveDeviceAuto(agent, opts = {}) {
91
128
  const local = normalizeHost(opts.localMachine ?? localMachineId());
92
129
  const pool = [...new Set((opts.eligibleHosts ?? listOnlineDeviceNames(local)).map(normalizeHost))];
93
- if (!pool.includes(local))
130
+ // The local machine participates in the same probe as every peer — unless a
131
+ // role excludes it. Adding it unconditionally would put agents back on the box
132
+ // the operator marked `personal` precisely to keep them off it.
133
+ if (!pool.includes(local) && isAutoPoolMember(local))
94
134
  pool.push(local);
135
+ if (pool.length === 0)
136
+ throw new Error(formatEmptyAutoPoolError());
95
137
  const signals = await (opts.probe ?? probePoolSignals)(pool, agent);
96
138
  if (!agent && !opts.probe) {
97
139
  const { collectFleetHarnesses } = await import('../commands/ssh.js');
@@ -135,6 +177,12 @@ export async function resolveDeviceAuto(agent, opts = {}) {
135
177
  }
136
178
  /**
137
179
  * Resolve host for `--device auto`. Does NOT pick harness or accounts.
180
+ *
181
+ * Draws from the same automatic-placement pool as {@link resolveDeviceAuto}, so
182
+ * `agents ssh auto`, the generic `--device auto` passthrough, and `matchHost`'s
183
+ * `auto` sentinel honour device roles too. Throws when roles leave the pool
184
+ * empty — a `null` host here means "run locally", which for a box marked
185
+ * `personal` is the outcome the mark exists to prevent.
138
186
  */
139
187
  export function resolveDeviceAffinity(opts = {}) {
140
188
  const local = normalizeHost(opts.localMachine ?? localMachineId());
@@ -142,9 +190,18 @@ export function resolveDeviceAffinity(opts = {}) {
142
190
  const rng = opts.rng ?? Math.random;
143
191
  const sinceDays = opts.sinceDays ?? 14;
144
192
  const sinceMs = Date.now() - sinceDays * 24 * 60 * 60 * 1000;
193
+ // `listOnlineDeviceNames` always contained the local machine before device
194
+ // roles existed, so an empty default list can only mean roles excluded
195
+ // everything — fail loud, exactly as resolveDeviceAuto does. An explicitly
196
+ // empty `eligibleHosts` is the caller's own list and keeps the historical
197
+ // degrade-to-local behavior.
198
+ const usingDefaultPool = opts.eligibleHosts === undefined;
145
199
  const eligible = new Set((opts.eligibleHosts ?? listOnlineDeviceNames(local)).map(normalizeHost));
146
- if (eligible.size === 0)
200
+ if (eligible.size === 0) {
201
+ if (usingDefaultPool)
202
+ throw new Error(formatEmptyAutoPoolError());
147
203
  eligible.add(local);
204
+ }
148
205
  const deviceRows = opts.deviceAffinity ??
149
206
  queryAffinityRollup({
150
207
  groupBy: 'machine',
@@ -187,7 +244,7 @@ export function isDeviceAuto(value) {
187
244
  }
188
245
  const HOST_SLOTS = ['host', 'device', 'on', 'computer'];
189
246
  /**
190
- * Apply `--device auto` / `--host auto` (and deprecated `--smart`) onto run options.
247
+ * Apply `--device auto` (and deprecated `--smart`) onto run options.
191
248
  * Mutates `options` in place. Placement failures propagate without rewriting
192
249
  * `auto`, so callers fail loud instead of silently launching locally.
193
250
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `agents snapshot` — one-process fleet consumer snapshot.
2
+ * `agents devices snapshot` — one-process fleet consumer snapshot.
3
3
  *
4
4
  * Consumers (Factory watchdog, menubar, fleet scripts) used to fork:
5
5
  * agents view <agent> --json × N harnesses
@@ -13,11 +13,11 @@
13
13
  * Stores are not merged — inventory still comes from view, active rows from
14
14
  * sessions, blocks from feed. Only the reader is consolidated.
15
15
  */
16
- import { type OpenBlock } from './feed.js';
16
+ import { type OpenBlock } from './feed/feed.js';
17
17
  import { type FleetAgentCounts } from './fleet-status.js';
18
18
  import type { AgentId } from './types.js';
19
19
  import type { UnifiedSyncStatus } from './sync-status.js';
20
- import type { ViewJsonAgent } from '../commands/view.js';
20
+ import type { ViewJsonAgent } from './view-types.js';
21
21
  /** One open-block row in the optional feed summary (no full question bodies). */
22
22
  export interface SnapshotFeedBlock {
23
23
  blockId: string;
@@ -44,7 +44,7 @@ export type SnapshotSessionRow = {
44
44
  [key: string]: unknown;
45
45
  };
46
46
  /**
47
- * Stable machine-readable contract for `agents snapshot --json`.
47
+ * Stable machine-readable contract for `agents devices snapshot --json`.
48
48
  * Bump `version` only on breaking shape changes.
49
49
  */
50
50
  export interface FleetSnapshot {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `agents snapshot` — one-process fleet consumer snapshot.
2
+ * `agents devices snapshot` — one-process fleet consumer snapshot.
3
3
  *
4
4
  * Consumers (Factory watchdog, menubar, fleet scripts) used to fork:
5
5
  * agents view <agent> --json × N harnesses
@@ -14,7 +14,7 @@
14
14
  * sessions, blocks from feed. Only the reader is consolidated.
15
15
  */
16
16
  import { machineId } from './machine-id.js';
17
- import { listBlocks } from './feed.js';
17
+ import { listBlocks } from './feed/feed.js';
18
18
  import { computeAgentCounts } from './fleet-status.js';
19
19
  /** Summarize open blocks for the snapshot feed slice. Pure / unit-testable. */
20
20
  export function summarizeFeedBlocks(blocks, limit = 50) {
@@ -2,7 +2,7 @@
2
2
  * Shared SSH exec primitive — the single hardened choke point for running a
3
3
  * command on a remote host over the system `ssh`.
4
4
  *
5
- * `agents run --host` dispatch and the browser driver both go through here so the
5
+ * `agents run --device` dispatch and the browser driver both go through here so the
6
6
  * connection hardening (`BatchMode`, `accept-new`, `ConnectTimeout`) and the
7
7
  * target-injection guard live in exactly one place. Target validation is the
8
8
  * canonical definition; `commands/secrets.ts` re-exports it.
@@ -2,7 +2,7 @@
2
2
  * Shared SSH exec primitive — the single hardened choke point for running a
3
3
  * command on a remote host over the system `ssh`.
4
4
  *
5
- * `agents run --host` dispatch and the browser driver both go through here so the
5
+ * `agents run --device` dispatch and the browser driver both go through here so the
6
6
  * connection hardening (`BatchMode`, `accept-new`, `ConnectTimeout`) and the
7
7
  * target-injection guard live in exactly one place. Target validation is the
8
8
  * canonical definition; `commands/secrets.ts` re-exports it.
@@ -83,7 +83,7 @@ export class RemoteUtf8Accumulator {
83
83
  * OpenSSH connection-multiplexing options. The first connection to a host opens
84
84
  * a control socket; subsequent connections (even from a *separate* `agents`
85
85
  * invocation) reuse it, skipping the TCP+auth handshake — so repeated
86
- * `--host <name>` calls to the same box feel local instead of paying ~100-300ms
86
+ * `--device <name>` calls to the same box feel local instead of paying ~100-300ms
87
87
  * each. `ControlPersist=60s` keeps the master alive briefly after the last
88
88
  * client exits. `%C` (a short fixed-length hash of local-host/remote/port/user)
89
89
  * keeps the socket path well under macOS's 104-char `sun_path` limit.
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * 1. `startSSHTunnel` — the generic `ssh -L localPort:127.0.0.1:remotePort -N`
7
7
  * spawn, extracted verbatim from the browser CDP driver so both the browser
8
- * and `agents computer --host` reach a remote loopback service through one
8
+ * and `agents computer --device` reach a remote loopback service through one
9
9
  * hardened tunnel. Behavior for the browser caller is unchanged (default,
10
10
  * foreground, stderr-captured).
11
11
  *
@@ -21,8 +21,8 @@ import { type DeviceProfile } from './devices/registry.js';
21
21
  export interface StartTunnelOptions {
22
22
  /**
23
23
  * Detach the tunnel so it OUTLIVES this CLI process. Used by
24
- * `agents computer start --host` — the tunnel must persist across separate
25
- * verb invocations (`apps`, `click`, …) until `stop --host` tears it down.
24
+ * `agents computer start --device` — the tunnel must persist across separate
25
+ * verb invocations (`apps`, `click`, …) until `stop --device` tears it down.
26
26
  * The browser driver leaves this false: it holds the tunnel for the lifetime
27
27
  * of one CDP session and kills it on cleanup.
28
28
  */
@@ -83,12 +83,12 @@ export declare function sha256File(file: string): Promise<string>;
83
83
  */
84
84
  export declare function downloadWinHelperExe(version: string): Promise<string>;
85
85
  /**
86
- * Resolve the helper exe for `setup --host`: local build outputs first (repo
86
+ * Resolve the helper exe for `setup --device`: local build outputs first (repo
87
87
  * checkout / bundled), then the checksum-verified release-asset download for
88
88
  * the running CLI version. Throws with the tag it checked when neither exists.
89
89
  */
90
90
  export declare function ensureWinHelperExe(version?: string): Promise<string>;
91
- /** Persisted per-device tunnel state so verbs can reconnect after `start --host`. */
91
+ /** Persisted per-device tunnel state so verbs can reconnect after `start --device`. */
92
92
  export interface RemoteTunnelState {
93
93
  device: string;
94
94
  target: string;
@@ -106,7 +106,7 @@ export declare function writeRemoteState(state: RemoteTunnelState): void;
106
106
  export declare function clearRemoteState(device: string): void;
107
107
  /**
108
108
  * Local file holding the shared-secret token for a device's helper daemon.
109
- * Written at `setup --host` (0600), read at `start --host` so the RPC client
109
+ * Written at `setup --device` (0600), read at `start --device` so the RPC client
110
110
  * authenticates. The remote daemon reads the same value from its own
111
111
  * `--token-file`; the CLI is the source of truth and never round-trips it back.
112
112
  */
@@ -154,7 +154,7 @@ export declare function scpRemotePath(remotePath: string): string;
154
154
  */
155
155
  export declare function buildScpArgs(target: string, remotePath: string, filePath: string, extraSshArgs?: string[]): string[];
156
156
  /**
157
- * `setup --host`: push the exe, then register + start the LOGON task. Remote
157
+ * `setup --device`: push the exe, then register + start the LOGON task. Remote
158
158
  * PowerShell hops go through `sshExec` (BatchMode key auth — the same hardening
159
159
  * the browser driver and `agents ssh` use), and the large exe rides a binary
160
160
  * scp transfer. Throws with the remote stderr on any failure.
@@ -166,13 +166,13 @@ export declare function setupRemoteHelper(name: string): Promise<{
166
166
  /** Reserve a free local TCP port by binding :0 and reading the assigned port. */
167
167
  export declare function pickFreePort(): Promise<number>;
168
168
  /**
169
- * `start --host`: open a detached ssh -L tunnel to the remote daemon, verify it
169
+ * `start --device`: open a detached ssh -L tunnel to the remote daemon, verify it
170
170
  * answers over TCP, and persist the tunnel state so verbs can reconnect. Returns
171
171
  * the state (and leaves the tunnel running in the background).
172
172
  */
173
173
  export declare function startRemoteTunnel(name: string): Promise<RemoteTunnelState>;
174
174
  /**
175
- * `stop --host`: kill the local tunnel, unregister the remote task (best-effort
175
+ * `stop --device`: kill the local tunnel, unregister the remote task (best-effort
176
176
  * — the box may be offline), and clear the persisted state.
177
177
  */
178
178
  export declare function stopRemoteHelper(name: string): Promise<{
@@ -182,7 +182,7 @@ export declare function stopRemoteHelper(name: string): Promise<{
182
182
  /**
183
183
  * Point this process's RPC client at a device's live tunnel by setting
184
184
  * COMPUTER_HELPER_TCP / COMPUTER_HELPER_TOKEN from persisted state. Called for
185
- * remote verbs (`apps --host`, `click --host`, …) so the shared
185
+ * remote verbs (`apps --device`, `click --device`, …) so the shared
186
186
  * openComputerClient() transparently selects the TcpClient transport — no
187
187
  * per-verb wiring. Exits with guidance when there is no active tunnel.
188
188
  */
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * 1. `startSSHTunnel` — the generic `ssh -L localPort:127.0.0.1:remotePort -N`
7
7
  * spawn, extracted verbatim from the browser CDP driver so both the browser
8
- * and `agents computer --host` reach a remote loopback service through one
8
+ * and `agents computer --device` reach a remote loopback service through one
9
9
  * hardened tunnel. Behavior for the browser caller is unchanged (default,
10
10
  * foreground, stderr-captured).
11
11
  *
@@ -199,7 +199,7 @@ export async function downloadWinHelperExe(version) {
199
199
  return cached;
200
200
  }
201
201
  /**
202
- * Resolve the helper exe for `setup --host`: local build outputs first (repo
202
+ * Resolve the helper exe for `setup --device`: local build outputs first (repo
203
203
  * checkout / bundled), then the checksum-verified release-asset download for
204
204
  * the running CLI version. Throws with the tag it checked when neither exists.
205
205
  */
@@ -239,7 +239,7 @@ export function clearRemoteState(device) {
239
239
  }
240
240
  /**
241
241
  * Local file holding the shared-secret token for a device's helper daemon.
242
- * Written at `setup --host` (0600), read at `start --host` so the RPC client
242
+ * Written at `setup --device` (0600), read at `start --device` so the RPC client
243
243
  * authenticates. The remote daemon reads the same value from its own
244
244
  * `--token-file`; the CLI is the source of truth and never round-trips it back.
245
245
  */
@@ -275,7 +275,7 @@ export async function resolveRemoteDevice(name) {
275
275
  throw new Error(`Unknown device '${name}'. Register it with \`agents devices add\` / \`agents devices sync\`, then retry.`);
276
276
  }
277
277
  if (device.platform !== 'windows') {
278
- throw new Error(`Device '${name}' is ${device.platform}, not windows. \`agents computer --host\` drives the Windows computer-helper daemon.`);
278
+ throw new Error(`Device '${name}' is ${device.platform}, not windows. \`agents computer --device\` drives the Windows computer-helper daemon.`);
279
279
  }
280
280
  const target = sshTargetFor(device); // validates address + injection guard
281
281
  const host = hostNameFor(device); // sshTargetFor already threw if absent
@@ -392,7 +392,7 @@ function copyFileOverScp(target, remotePath, filePath, extraSshArgs = [], timeou
392
392
  });
393
393
  }
394
394
  /**
395
- * `setup --host`: push the exe, then register + start the LOGON task. Remote
395
+ * `setup --device`: push the exe, then register + start the LOGON task. Remote
396
396
  * PowerShell hops go through `sshExec` (BatchMode key auth — the same hardening
397
397
  * the browser driver and `agents ssh` use), and the large exe rides a binary
398
398
  * scp transfer. Throws with the remote stderr on any failure.
@@ -441,7 +441,7 @@ export async function setupRemoteHelper(name) {
441
441
  if (reg.code !== 0) {
442
442
  throw new Error(`registering scheduled task on '${name}' failed (exit ${reg.code ?? 'null'}): ${reg.stderr.trim() || reg.stdout.trim()}`);
443
443
  }
444
- // Persist the token locally so `start --host` authenticates to the daemon.
444
+ // Persist the token locally so `start --device` authenticates to the daemon.
445
445
  writeHelperToken(name, token);
446
446
  return { target, taskName: REMOTE_TASK_NAME };
447
447
  }
@@ -458,7 +458,7 @@ export function pickFreePort() {
458
458
  });
459
459
  }
460
460
  /**
461
- * `start --host`: open a detached ssh -L tunnel to the remote daemon, verify it
461
+ * `start --device`: open a detached ssh -L tunnel to the remote daemon, verify it
462
462
  * answers over TCP, and persist the tunnel state so verbs can reconnect. Returns
463
463
  * the state (and leaves the tunnel running in the background).
464
464
  */
@@ -514,8 +514,8 @@ export async function startRemoteTunnel(name) {
514
514
  }
515
515
  catch { /* gone */ }
516
516
  const hint = token
517
- ? `Is it installed? Run: agents computer setup --host ${name}`
518
- : `No auth token on record for '${name}' — re-run: agents computer setup --host ${name}`;
517
+ ? `Is it installed? Run: agents computer setup --device ${name}`
518
+ : `No auth token on record for '${name}' — re-run: agents computer setup --device ${name}`;
519
519
  throw new Error(`tunnel to '${name}' opened but the daemon did not answer (${probeErr}). ${hint}`);
520
520
  }
521
521
  const state = {
@@ -532,7 +532,7 @@ export async function startRemoteTunnel(name) {
532
532
  return state;
533
533
  }
534
534
  /**
535
- * `stop --host`: kill the local tunnel, unregister the remote task (best-effort
535
+ * `stop --device`: kill the local tunnel, unregister the remote task (best-effort
536
536
  * — the box may be offline), and clear the persisted state.
537
537
  */
538
538
  export async function stopRemoteHelper(name) {
@@ -566,7 +566,7 @@ export async function stopRemoteHelper(name) {
566
566
  /**
567
567
  * Point this process's RPC client at a device's live tunnel by setting
568
568
  * COMPUTER_HELPER_TCP / COMPUTER_HELPER_TOKEN from persisted state. Called for
569
- * remote verbs (`apps --host`, `click --host`, …) so the shared
569
+ * remote verbs (`apps --device`, `click --device`, …) so the shared
570
570
  * openComputerClient() transparently selects the TcpClient transport — no
571
571
  * per-verb wiring. Exits with guidance when there is no active tunnel.
572
572
  */
@@ -574,7 +574,7 @@ export function hydrateRemoteEnvFromState(name) {
574
574
  const state = readRemoteState(name);
575
575
  if (!state) {
576
576
  console.error(`No active remote tunnel for '${name}'.`);
577
- console.error(`Run: agents computer start --host ${name}`);
577
+ console.error(`Run: agents computer start --device ${name}`);
578
578
  process.exit(1);
579
579
  }
580
580
  process.env.COMPUTER_HELPER_TCP = `127.0.0.1:${state.localPort}`;
@@ -2,7 +2,7 @@
2
2
  * Hooks staleness — one executable file per hook. Project layer is EXCLUDED
3
3
  * by design: a cloned public repo with `.agents/hooks/foo` must not plant a
4
4
  * hook that fires next time the user runs an agent inside it (see
5
- * `src/lib/versions.ts:1832-1836`). Only user + system + extras count.
5
+ * `src/lib/installations/versions.ts:1832-1836`). Only user + system + extras count.
6
6
  *
7
7
  * Auxiliary files (README.md, promptcuts.yaml) live in hooks/ but are not
8
8
  * hooks — the executable bit on the source distinguishes them. This matches
@@ -2,7 +2,7 @@
2
2
  * Hooks staleness — one executable file per hook. Project layer is EXCLUDED
3
3
  * by design: a cloned public repo with `.agents/hooks/foo` must not plant a
4
4
  * hook that fires next time the user runs an agent inside it (see
5
- * `src/lib/versions.ts:1832-1836`). Only user + system + extras count.
5
+ * `src/lib/installations/versions.ts:1832-1836`). Only user + system + extras count.
6
6
  *
7
7
  * Auxiliary files (README.md, promptcuts.yaml) live in hooks/ but are not
8
8
  * hooks — the executable bit on the source distinguishes them. This matches
@@ -142,28 +142,6 @@ function buildGrokDetector() {
142
142
  },
143
143
  };
144
144
  }
145
- function buildGooseDetector() {
146
- return {
147
- kind: 'permissions',
148
- agent: 'goose',
149
- list({ versionHome }) {
150
- const permissionsPath = path.join(versionHome, '.config', 'goose', 'permission.yaml');
151
- if (!fs.existsSync(permissionsPath))
152
- return [];
153
- try {
154
- const config = yaml.parse(fs.readFileSync(permissionsPath, 'utf-8'));
155
- const user = config?.user;
156
- const count = (Array.isArray(user?.always_allow) ? user.always_allow.length : 0) +
157
- (Array.isArray(user?.ask_before) ? user.ask_before.length : 0) +
158
- (Array.isArray(user?.never_allow) ? user.never_allow.length : 0);
159
- if (count > 0)
160
- return discoverPermissionGroups().map(g => g.name);
161
- }
162
- catch { /* parse fail */ }
163
- return [];
164
- },
165
- };
166
- }
167
145
  function buildKimiDetector() {
168
146
  return {
169
147
  kind: 'permissions',
@@ -315,7 +293,6 @@ const handlers = {
315
293
  opencode: buildOpenCodeDetector,
316
294
  antigravity: buildAntigravityDetector,
317
295
  grok: buildGrokDetector,
318
- goose: buildGooseDetector,
319
296
  kimi: buildKimiDetector,
320
297
  cursor: buildCursorDetector,
321
298
  droid: buildDroidDetector,
@@ -1,5 +1,5 @@
1
1
  import { capableAgents } from '../../capabilities.js';
2
- import { discoverPlugins, isPluginSynced } from '../../plugins.js';
2
+ import { discoverPlugins, isPluginSynced } from '../../plugins/plugins.js';
3
3
  import { lazyAgentMap } from '../writers/lazy-map.js';
4
4
  function buildPluginsDetector(agent) {
5
5
  return {
@@ -23,7 +23,7 @@ export function fingerprintFile(filePath) {
23
23
  /**
24
24
  * Names we never fingerprint: OS metadata, VCS bookkeeping, dep caches,
25
25
  * build outputs. Matches the SKILL_COPY_IGNORE set used by the sync writer
26
- * in `src/lib/versions.ts`.
26
+ * in `src/lib/installations/versions.ts`.
27
27
  *
28
28
  * Important: this is an allowlist of noise, NOT a blanket "skip every
29
29
  * dot-prefixed entry". Plugins keep their manifest at
@@ -7,7 +7,7 @@
7
7
  * - "first-wins" (commands, skills, mcp, subagents, workflows, plugins):
8
8
  * project > user > system > extras. Same-named entries shadow.
9
9
  * - "first-wins, no project" (hooks): security exclusion — see
10
- * `src/lib/versions.ts:1832-1836` for the rationale. User > system > extras.
10
+ * `src/lib/installations/versions.ts:1832-1836` for the rationale. User > system > extras.
11
11
  * - "merged" (permissions): every layer contributes; first-wins on name.
12
12
  * - "composed" (rules): preset + subrules resolved per-name across layers.
13
13
  */
@@ -7,7 +7,7 @@
7
7
  * - "first-wins" (commands, skills, mcp, subagents, workflows, plugins):
8
8
  * project > user > system > extras. Same-named entries shadow.
9
9
  * - "first-wins, no project" (hooks): security exclusion — see
10
- * `src/lib/versions.ts:1832-1836` for the rationale. User > system > extras.
10
+ * `src/lib/installations/versions.ts:1832-1836` for the rationale. User > system > extras.
11
11
  * - "merged" (permissions): every layer contributes; first-wins on name.
12
12
  * - "composed" (rules): preset + subrules resolved per-name across layers.
13
13
  */
@@ -7,7 +7,9 @@ function buildMcpWriter(agent) {
7
7
  agent,
8
8
  write({ version, versionHome, selection, cwd }) {
9
9
  const r = installMcpServers(agent, version, versionHome, selection, { cwd });
10
- return { synced: r.applied };
10
+ // Forward r.errors: dropping them is what let a harness with no config
11
+ // writer report a clean sync while writing nothing (RUSH-2677).
12
+ return { synced: r.applied, ...(r.errors.length ? { errors: r.errors } : {}) };
11
13
  },
12
14
  };
13
15
  }
@@ -1,5 +1,5 @@
1
1
  import { capableAgents } from '../../capabilities.js';
2
- import { discoverPlugins, syncPluginToVersion, pluginSupportsAgent, cleanOrphanedPluginSkills } from '../../plugins.js';
2
+ import { discoverPlugins, syncPluginToVersion, pluginSupportsAgent, cleanOrphanedPluginSkills } from '../../plugins/plugins.js';
3
3
  import { lazyAgentMap } from './lazy-map.js';
4
4
  function buildPluginsWriter(agent) {
5
5
  return {
@@ -28,6 +28,14 @@ export interface WriteArgs<Sel> {
28
28
  export interface WriteResult {
29
29
  /** Names actually written. Empty array = write produced nothing (not an error). */
30
30
  synced: string[];
31
+ /**
32
+ * Per-item failures the writer could not complete, as user-facing sentences.
33
+ *
34
+ * `synced: []` alone cannot distinguish "nothing to do" from "refused to
35
+ * write and said why", which is how an unwritable harness reported success
36
+ * for its whole life (RUSH-2677). A writer that declines MUST say so here.
37
+ */
38
+ errors?: string[];
31
39
  }
32
40
  /**
33
41
  * Inverse of a write: locate and delete the materialized artifact for one