@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
@@ -19,15 +19,17 @@ import { execFileSync } from 'child_process';
19
19
  import * as fs from 'fs';
20
20
  import * as path from 'path';
21
21
  import { setHelpSections } from '../lib/help.js';
22
- import { getDaemonStatus, isDaemonRunning, isDaemonWedged, readDaemonLog, startDaemon, stopDaemon, signalDaemonReload, findSurvivingStateDirDaemons, getDaemonLogPath, isDaemonAutostartCircuitOpen, } from '../lib/daemon.js';
22
+ import { getDaemonStatus, isDaemonRunning, isDaemonWedged, readDaemonLog, startDaemon, stopDaemon, signalDaemonReload, findSurvivingStateDirDaemons, getDaemonLogPath, isDaemonAutostartCircuitOpen, } from '../lib/daemon/daemon.js';
23
23
  import { getConfigValue, setConfigValue, isDaemonEnabled } from '../lib/device-config.js';
24
24
  import { readSubsystemHealth, SUBSYSTEM_SECRETS_BROKER, SUBSYSTEM_BROWSER_IPC, SUBSYSTEM_DAEMON_START, } from '../lib/daemon-health.js';
25
25
  import { DAEMON_SERVICE_IDS, listDaemonServiceStates, setDaemonServiceEnabled, getDaemonServicesConfigPath, } from '../lib/daemon-services.js';
26
- import { listJobs, getLatestRun } from '../lib/routines.js';
26
+ import { listJobs, getLatestRun } from '../lib/scheduling/routines.js';
27
27
  import { JobScheduler } from '../lib/scheduler.js';
28
28
  import { followFile } from '../lib/log-follow.js';
29
29
  import { parseDuration } from '../lib/hooks/cache.js';
30
30
  import { registerFunnelCommand } from './funnel.js';
31
+ import { DEFAULT_WEBHOOK_PORT, DEFAULT_WEBHOOK_RATE_LIMIT, addHostedReceiver, getDaemonWebhooksConfigPath, hostedReceiverPort, readDaemonWebhooksConfig, removeHostedReceiver, } from '../lib/daemon-webhooks.js';
32
+ import { parseFunnelPort } from '../lib/funnel.js';
31
33
  /**
32
34
  * Provably absent, or null when unknowable.
33
35
  *
@@ -96,7 +98,7 @@ function entryIsGone(p) {
96
98
  *
97
99
  * That split is not academic. The incident this feature exists to catch was
98
100
  * neither the tracked pid nor in the registry: it ran under an ephemeral `/tmp`
99
- * cwd from a deleted worktree, and `lib/daemon.ts` documents that such a process
101
+ * cwd from a deleted worktree, and `lib/daemon/daemon.ts` documents that such a process
100
102
  * "registers under its own state dir and is invisible here" BY DESIGN. Gating
101
103
  * the display on the registry too would have made this command silent on the
102
104
  * exact 4h14m ghost that motivated it.
@@ -624,6 +626,146 @@ async function runDoctor(opts) {
624
626
  console.log(` ${chalk.red('✗')} ${p}`);
625
627
  process.exitCode = 1;
626
628
  }
629
+ // ─── Hosted webhook receivers ────────────────────────────────────────────
630
+ /** Parse a positive-integer option, failing loud rather than silently defaulting. */
631
+ function requirePositiveInt(raw, label) {
632
+ const parsed = Number.parseInt(raw, 10);
633
+ if (!Number.isInteger(parsed) || parsed <= 0) {
634
+ console.error(chalk.red(`${label} must be a positive integer (got '${raw}').`));
635
+ process.exit(1);
636
+ }
637
+ return parsed;
638
+ }
639
+ /**
640
+ * `agents daemon webhooks` — which signed receivers THIS box hosts (RUSH-2548).
641
+ *
642
+ * The entries land in `daemon/webhooks.yaml`, which the daemon's
643
+ * `webhook-receiver` service reads at start; nothing binds until the daemon
644
+ * picks the change up, so every mutation says how to apply it.
645
+ */
646
+ function registerWebhooksSubcommand(parent) {
647
+ const webhooks = parent
648
+ .command('webhooks')
649
+ .description('Signed webhook receivers this box hosts as a supervised daemon service.')
650
+ .option('--json', 'Emit as JSON')
651
+ .action((opts, command) => {
652
+ runWebhooksList(command.optsWithGlobals().json === true);
653
+ });
654
+ setHelpSections(webhooks, {
655
+ examples: `
656
+ # What this box hosts today
657
+ agents daemon webhooks list
658
+
659
+ # Host a receiver on the default port, signing secrets from a bundle
660
+ agents daemon webhooks add --secrets-bundle linear-webhook
661
+
662
+ # A second receiver on its own port, publicly exposed via Tailscale Funnel
663
+ agents daemon webhooks add --secrets-bundle gh-webhook --port 8788 --funnel-port 443
664
+
665
+ # Apply the change (the running daemon rebinds on restart)
666
+ agents daemon restart
667
+
668
+ # Stop hosting the receiver bound to a port
669
+ agents daemon webhooks remove 8788
670
+ `,
671
+ notes: `
672
+ The bundle must hold GITHUB_WEBHOOK_SECRET and/or LINEAR_WEBHOOK_SECRET
673
+ ('agents secrets add <bundle> LINEAR_WEBHOOK_SECRET'). The daemon reads it
674
+ through the secrets broker, so a hosted receiver needs no
675
+ AGENTS_SECRETS_PASSPHRASE and no nohup. A LOCKED bundle fails that receiver
676
+ loud in 'agents daemon logs' rather than binding unverified ingress.
677
+
678
+ Port is the identity: a second 'add' on the same port edits that receiver.
679
+ Funnel ports are limited by Tailscale to 443, 8443, and 10000.
680
+ `,
681
+ });
682
+ webhooks
683
+ .command('list')
684
+ .description('List the receivers declared for this box.')
685
+ .option('--json', 'Emit as JSON')
686
+ .action((opts, command) => {
687
+ runWebhooksList(command.optsWithGlobals().json === true || opts.json === true);
688
+ });
689
+ webhooks
690
+ .command('add')
691
+ .description('Declare a receiver on this box. Replaces any receiver already on the same port.')
692
+ .requiredOption('--secrets-bundle <name>', 'agents secrets bundle holding GITHUB_WEBHOOK_SECRET and/or LINEAR_WEBHOOK_SECRET')
693
+ .option('-p, --port <n>', `Local bind port (default ${DEFAULT_WEBHOOK_PORT})`)
694
+ .option('--rate-limit <n>', `Accepted deliveries per source per minute (default ${DEFAULT_WEBHOOK_RATE_LIMIT})`)
695
+ .option('--funnel-port <n>', 'Expose publicly on this Tailscale Funnel port (443 | 8443 | 10000)')
696
+ .action((opts) => {
697
+ const receiver = { bundle: opts.secretsBundle };
698
+ if (opts.port !== undefined)
699
+ receiver.port = requirePositiveInt(opts.port, '--port');
700
+ if (opts.rateLimit !== undefined)
701
+ receiver.rateLimit = requirePositiveInt(opts.rateLimit, '--rate-limit');
702
+ if (opts.funnelPort !== undefined) {
703
+ try {
704
+ receiver.funnel = { publicPort: parseFunnelPort(opts.funnelPort) };
705
+ }
706
+ catch (err) {
707
+ console.error(chalk.red(err.message));
708
+ process.exit(1);
709
+ }
710
+ }
711
+ addHostedReceiver(receiver);
712
+ const port = hostedReceiverPort(receiver);
713
+ console.log(chalk.green(`Hosting a webhook receiver on 127.0.0.1:${port}`) + chalk.gray(` (bundle ${receiver.bundle})`));
714
+ if (receiver.funnel)
715
+ console.log(chalk.gray(` public: Tailscale Funnel :${receiver.funnel.publicPort} → localhost:${port}`));
716
+ console.log(chalk.gray(` config: ${getDaemonWebhooksConfigPath()}`));
717
+ console.log(chalk.gray(isDaemonRunning()
718
+ ? ' run `agents daemon restart` to bind it'
719
+ : ' run `agents daemon start` to bind it'));
720
+ });
721
+ webhooks
722
+ .command('remove <port>')
723
+ .description('Stop hosting the receiver bound to this port.')
724
+ .action((portArg) => {
725
+ const port = requirePositiveInt(portArg, 'port');
726
+ const removed = removeHostedReceiver(port);
727
+ if (!removed) {
728
+ console.error(chalk.red(`No receiver declared on port ${port}. Run 'agents daemon webhooks list'.`));
729
+ process.exit(1);
730
+ }
731
+ console.log(chalk.green(`Removed the webhook receiver on port ${port}.`));
732
+ if (removed.funnel) {
733
+ // Leaving the Funnel up would keep a public HTTPS route pointed at a port
734
+ // nothing serves, so say what to run — this box may not be the tailnet
735
+ // node, and `funnel down` names the host explicitly.
736
+ console.log(chalk.yellow(` public ingress is still up on :${removed.funnel.publicPort} — take it down:`));
737
+ console.log(chalk.gray(` agents daemon funnel down <host> --port ${removed.funnel.publicPort}`));
738
+ }
739
+ if (isDaemonRunning())
740
+ console.log(chalk.gray(' run `agents daemon restart` to release the port'));
741
+ });
742
+ }
743
+ function runWebhooksList(json) {
744
+ const { receivers } = readDaemonWebhooksConfig();
745
+ if (json) {
746
+ console.log(JSON.stringify(receivers.map((r) => ({
747
+ bundle: r.bundle,
748
+ port: hostedReceiverPort(r),
749
+ rateLimit: r.rateLimit ?? DEFAULT_WEBHOOK_RATE_LIMIT,
750
+ funnelPort: r.funnel?.publicPort ?? null,
751
+ })), null, 2));
752
+ return;
753
+ }
754
+ if (receivers.length === 0) {
755
+ console.log(chalk.gray('No webhook receivers declared on this box — the daemon binds nothing.'));
756
+ console.log(chalk.gray('Add one: agents daemon webhooks add --secrets-bundle <name>'));
757
+ return;
758
+ }
759
+ console.log(chalk.bold('Hosted webhook receivers'));
760
+ for (const r of receivers) {
761
+ const port = hostedReceiverPort(r);
762
+ const funnel = r.funnel ? chalk.cyan(` public :${r.funnel.publicPort}`) : chalk.gray(' localhost only');
763
+ console.log(` 127.0.0.1:${String(port).padEnd(6)} ${chalk.gray(`bundle ${r.bundle}`)}${funnel}`);
764
+ console.log(chalk.gray(` endpoints: /hooks/github, /hooks/linear · ${r.rateLimit ?? DEFAULT_WEBHOOK_RATE_LIMIT}/min per source`));
765
+ }
766
+ console.log(chalk.gray(`\nConfig: ${getDaemonWebhooksConfigPath()}`));
767
+ console.log(chalk.gray('Changes take effect on the next daemon restart.'));
768
+ }
627
769
  // ─── Command registration ────────────────────────────────────────────────
628
770
  export function registerDaemonCommand(program) {
629
771
  const cmd = program
@@ -653,9 +795,13 @@ export function registerDaemonCommand(program) {
653
795
  # Reload config (SIGHUP) without restarting — picks up routine/scheduler-gate changes
654
796
  agents daemon reload
655
797
 
656
- # Just the two hosted services (secrets broker, browser IPC)
798
+ # Every hosted service (secrets broker, browser IPC, webhook receiver, ...)
657
799
  agents daemon services
658
800
 
801
+ # Host a signed webhook receiver here, supervised and restarted on crash
802
+ agents daemon webhooks add --secrets-bundle linear-webhook
803
+ agents daemon webhooks list
804
+
659
805
  # Manage public ingress for daemon-world webhook receivers
660
806
  agents daemon funnel status yosemite-s0
661
807
  agents daemon funnel up yosemite-s0 --local-port 8787 --port 443
@@ -829,6 +975,7 @@ export function registerDaemonCommand(program) {
829
975
  console.log(chalk.gray('Run `agents daemon reload` (or restart) to apply.'));
830
976
  }
831
977
  });
978
+ registerWebhooksSubcommand(cmd);
832
979
  registerFunnelCommand(cmd);
833
980
  cmd.command('logs')
834
981
  .description('Read the daemon\'s own log (lifecycle + subsystem errors — not routine run output).')
@@ -17,7 +17,7 @@ import chalk from 'chalk';
17
17
  import { gatherLiveTargets } from './go.js';
18
18
  import { killSession } from '../lib/tmux/index.js';
19
19
  import { getDefaultSocketPath } from '../lib/tmux/paths.js';
20
- import { getAgentsInvocation } from '../lib/daemon.js';
20
+ import { getAgentsInvocation } from '../lib/daemon/daemon.js';
21
21
  import { captureProcessStartTime } from '../lib/pty-server.js';
22
22
  import { writeDetachRecord } from '../lib/session/detached.js';
23
23
  import { getLogsDir } from '../lib/state.js';
@@ -15,16 +15,16 @@ import { sshExecAsync } from '../lib/ssh-exec.js';
15
15
  import { hostIdentityArgs, sshTargetFor } from '../lib/hosts/types.js';
16
16
  import { deviceIdentityArgs } from '../lib/devices/connect.js';
17
17
  import { machineId, normalizeHost } from '../lib/session/sync/config.js';
18
- import { findAmbiguousDevicePins } from '../lib/routines.js';
18
+ import { findAmbiguousDevicePins } from '../lib/scheduling/routines.js';
19
19
  import chalk from 'chalk';
20
20
  import { checkAllClis, collectTeamsDoctorData } from '../lib/teams/agents.js';
21
21
  import { AGENTS, ALL_AGENT_IDS, resolveAgentName, formatAgentError, getAccountInfo } from '../lib/agents.js';
22
- import { getVersionHomePath, listInstalledVersions, } from '../lib/versions.js';
22
+ import { getVersionHomePath, listInstalledVersions, } from '../lib/installations/versions.js';
23
23
  import { resolveAgentTargets, AgentSpecError } from '../lib/agent-spec/index.js';
24
24
  import { loadManifest, isStale } from '../lib/staleness/index.js';
25
25
  import { diffVersionResources, DOCTOR_ALL_KINDS, } from '../lib/doctor-diff.js';
26
26
  import { checkVersionHookWiring, inspectDuplicateVersionHooks, registerHooksToSettings, repairManagedHookRuntimeArtifacts } from '../lib/hooks.js';
27
- import { isVersionIsolated } from '../lib/versions.js';
27
+ import { isVersionIsolated } from '../lib/installations/versions.js';
28
28
  import { computeDrift, checkSyncStatus, countOrphans, computeSourceBehind } from '../lib/drift.js';
29
29
  import { readAuthHealthCache, summarizeHostAuth } from '../lib/auth-health.js';
30
30
  import { readMeta } from '../lib/state.js';
@@ -156,9 +156,9 @@ export function asRemoteSecretFindings(raw, device) {
156
156
  return out;
157
157
  }
158
158
  async function resolveFleetTargets(opts) {
159
- const singleName = opts.host || opts.device;
159
+ const singleName = opts.device;
160
160
  if (singleName) {
161
- // --device / --host as a single-device filter: resolve through the device
161
+ // --device as a single-device filter: resolve through the device
162
162
  // registry first, then the general host registry, then ad-hoc user@host.
163
163
  const registry = await loadDevices();
164
164
  const deviceProfile = registry[singleName];
@@ -358,7 +358,7 @@ export function asFleetInventory(value) {
358
358
  return v;
359
359
  }
360
360
  async function runDevicesDoctor(opts) {
361
- const singleName = opts.host || opts.device;
361
+ const singleName = opts.device;
362
362
  const targets = await resolveFleetTargets(opts);
363
363
  const localName = machineId();
364
364
  const results = [];
@@ -1189,7 +1189,7 @@ function purgeStaleAgentsCliCopies(_opts) {
1189
1189
  });
1190
1190
  }
1191
1191
  function renderStaleInstallPurgeText(purge) {
1192
- if (purge.removed.length === 0 && purge.failed.length === 0)
1192
+ if (purge.removed.length === 0 && purge.failed.length === 0 && purge.unresolved.length === 0)
1193
1193
  return;
1194
1194
  console.log(chalk.bold('\nStale agents-cli installs'));
1195
1195
  for (const r of purge.removed) {
@@ -1199,6 +1199,15 @@ function renderStaleInstallPurgeText(purge) {
1199
1199
  for (const f of purge.failed) {
1200
1200
  console.log(` ${chalk.red('hold ')} ${chalk.gray(`${f.packageRoot} ${f.version} — ${f.error}`)}`);
1201
1201
  }
1202
+ // RUSH-2705/2713: a duplicate --fix cannot auto-purge — either a healthy
1203
+ // >=1.22.30 peer, OR a pre-1.22.30 copy left alone only because no fixed peer
1204
+ // exists to fall back to (that one is NOT healthy). Either way, hand back the
1205
+ // command that removes it instead of ending on a bare "everything in sync".
1206
+ // Don't call it "healthy" — that would understate a genuinely vulnerable copy.
1207
+ for (const u of purge.unresolved) {
1208
+ console.log(` ${chalk.yellow('manual')} ${chalk.gray(`${u.packageRoot} ${u.version} — --fix will not delete this copy; remove it with:`)}`);
1209
+ console.log(` ${chalk.bold(u.manualRemoveCommand)}`);
1210
+ }
1202
1211
  }
1203
1212
  async function runFix(parsed, opts) {
1204
1213
  // Heal targets the global install — project layer is irrelevant, so cwd is
@@ -1437,8 +1446,7 @@ export function registerDoctorCommand(program) {
1437
1446
  .option('--cwd <path>', 'Resolution cwd for project layer detection (default: process.cwd())')
1438
1447
  .option('--adopt <agent>', "Take over the agent's native launcher that shadows the shim (symlink it to the version-managed shim; reversible with --release)")
1439
1448
  .option('--release <agent>', 'Undo --adopt: restore the native launcher agents-cli previously adopted')
1440
- .option('--devices', 'Check agent readiness AND cross-device harness divergence (missing resources/versions, repo drift) on every registered device (alias --hosts)')
1441
- .option('--hosts', 'Alias of --devices')
1449
+ .option('--devices', 'Check agent readiness AND cross-device harness divergence (missing resources/versions, repo drift) on every registered device')
1442
1450
  .option('--check', 'CI drift gate: exit non-zero when any installed version is out of sync (stale or never-synced), zero when clean. Combine with --devices to gate the whole fleet.')
1443
1451
  .option('--refresh', 'Bypass the cached overview snapshot: recompute the bare `doctor --json` overview live and refresh the shared cache that the menu-bar and other pollers read')
1444
1452
  .option('-q, --quiet', 'With --check, suppress per-version lines; print only the one-line verdict');
@@ -1492,7 +1500,7 @@ export function registerDoctorCommand(program) {
1492
1500
  console.error(chalk.red('Cannot combine --check with a target argument.'));
1493
1501
  process.exit(1);
1494
1502
  }
1495
- if (opts.devices || opts.hosts) {
1503
+ if (opts.devices) {
1496
1504
  await runDevicesCheck(opts, cwd);
1497
1505
  }
1498
1506
  else {
@@ -1500,7 +1508,7 @@ export function registerDoctorCommand(program) {
1500
1508
  }
1501
1509
  return;
1502
1510
  }
1503
- if (opts.devices || opts.hosts) {
1511
+ if (opts.devices) {
1504
1512
  if (target) {
1505
1513
  console.error(chalk.red('Cannot combine --devices with a target argument.'));
1506
1514
  process.exit(1);
@@ -14,7 +14,7 @@
14
14
  */
15
15
  import chalk from 'chalk';
16
16
  import * as fs from 'fs';
17
- import { getLogsPath, stats, rotate } from '../lib/events.js';
17
+ import { getLogsPath, stats, rotate } from '../lib/feed/events.js';
18
18
  import { readUnifiedEvents } from '../lib/event-stream.js';
19
19
  import { parseFamilyList, EVENT_FAMILIES } from '../lib/event-families.js';
20
20
  import { ingestBatch } from '../lib/events-ingest.js';
@@ -8,7 +8,6 @@
8
8
  import { type Command } from 'commander';
9
9
  import type { ExecEffort } from '../lib/exec.js';
10
10
  import { RUN_AUTO_KEYWORD } from '../lib/types.js';
11
- import { type SshGResult } from '../lib/hosts/ssh-config.js';
12
11
  export interface RunAccountPickerRequest {
13
12
  requested: boolean;
14
13
  normalizedAgentSpec: string;
@@ -18,8 +17,8 @@ export interface RunAccountPickerRequest {
18
17
  export declare function parseRunAccountPickerRequest(agentSpec: string): RunAccountPickerRequest;
19
18
  /** Return every option whose routing semantics conflict with a local account choice. */
20
19
  /**
21
- * The `--host` alias family — the flags that mean "dispatch this run to another
22
- * machine over SSH". `--host` is canonical; `--device`/`--on`/`--computer` are
20
+ * The `--device` alias family — the flags that mean "dispatch this run to another
21
+ * machine over SSH". `--device` is canonical; `--on`/`--computer` are hidden
23
22
  * aliases. Returns the values actually given (so callers can both test presence
24
23
  * and read the target). Kept in ONE place because a guard that listed only a
25
24
  * subset silently let `--terminal --device` open a local tab and drop the remote
@@ -68,14 +67,6 @@ export declare function runAutoDefaultsToAffinity(options: {
68
67
  * decision matrix is unit-testable.
69
68
  */
70
69
  export declare function hostInteractiveNeedsCorrelationId(runAgent: string, hostSessionId: string | undefined, resumeId: string | undefined): boolean;
71
- /** The host descriptor fields the `--copy-creds` security gate reads. */
72
- export interface CopyCredsGateHost {
73
- name: string;
74
- /** Concrete SSH target for inline/provider hosts; unset for ssh-config aliases. */
75
- address?: string;
76
- /** `devices` = registered Tailscale fleet host; `local` = ssh-config/inline. */
77
- provider?: string;
78
- }
79
70
  /**
80
71
  * Whether `cwd` is inside a git work tree.
81
72
  *
@@ -109,45 +100,6 @@ export declare function leaseFreshReposPath(): string;
109
100
  export declare function readAlwaysFreshRepos(): string[];
110
101
  /** Persist the always-fresh repo roots. Best-effort — never throws. */
111
102
  export declare function writeAlwaysFreshRepos(repos: string[]): void;
112
- /** Outcome of the `--copy-creds` security gate (RUSH-1767). */
113
- export interface CopyCredsGateDecision {
114
- /** Ship credentials? True only when the host key is pinned in the managed store. */
115
- allowed: boolean;
116
- /** The address whose key is checked/pinned — an ssh-config alias resolved to its real HostName. */
117
- pinTarget: string;
118
- /** True when the non-device self-pin path pinned the target during this call. */
119
- selfPinned: boolean;
120
- }
121
- /** Injectable network seams so the gate decision is testable without ssh/keyscan. */
122
- export interface CopyCredsGateDeps {
123
- /** Managed known_hosts store file (defaults to the real cache path). */
124
- file?: string;
125
- /** Resolve an ssh-config alias to its effective HostName/Port (defaults to real `ssh -G`). */
126
- resolve?: (name: string) => SshGResult | undefined;
127
- /** Self-pin `target` via ssh-keyscan; returns whether it's pinned afterward (defaults to real `pinHostKey`). */
128
- selfPin?: (target: string, port: number | undefined, file: string) => boolean;
129
- }
130
- /**
131
- * Decide whether `--copy-creds` may ship credentials (and the Claude OAuth
132
- * token) to `host` (RUSH-1767). Credentials ship only to a host whose SSH host
133
- * key is pinned in the managed known_hosts store, so the offload never rides an
134
- * accept-new (TOFU) connection a machine-in-the-middle could intercept.
135
- *
136
- * Resolution:
137
- * - The checked target is the host's concrete `address`, else its ssh-config
138
- * HostName (`ssh -G`), else its name — so an alias is pinned/verified against
139
- * the SAME real host the strict dispatch later connects to.
140
- * - An unpinned NON-device (a bare `~/.ssh/config` `Host` alias or literal,
141
- * which `agents ssh <name>` can't reach — "Unknown device") is self-pinned in
142
- * place via ssh-keyscan. A registered device is left unpinned here — it earns
143
- * its pin through the normal `agents ssh <name>` accept-new connect, so the
144
- * caller steers there instead.
145
- *
146
- * The network seams (`resolve`, `selfPin`) default to the real ssh -G /
147
- * ssh-keyscan implementations and are injectable so the ship/refuse decision is
148
- * unit-testable against real known_hosts fixtures with no network.
149
- */
150
- export declare function decideCopyCredsGate(host: CopyCredsGateHost, deps?: CopyCredsGateDeps): CopyCredsGateDecision;
151
103
  /**
152
104
  * Build the LoopConfig the driver consumes from CLI flags and/or a workflow's
153
105
  * `loop:` frontmatter block (issue #332). Returns undefined when neither source