@phnx-labs/agents-cli 1.22.39 → 1.22.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (569) hide show
  1. package/CHANGELOG.md +316 -0
  2. package/README.md +116 -70
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.js +45 -27
  5. package/dist/browser.js +2 -2
  6. package/dist/cli/command-registry.d.ts +135 -0
  7. package/dist/cli/command-registry.js +259 -0
  8. package/dist/commands/accounts.d.ts +20 -0
  9. package/dist/commands/accounts.js +186 -25
  10. package/dist/commands/apply.d.ts +3 -3
  11. package/dist/commands/apply.js +20 -63
  12. package/dist/commands/browser.d.ts +15 -0
  13. package/dist/commands/browser.js +318 -131
  14. package/dist/commands/budget.d.ts +7 -6
  15. package/dist/commands/budget.js +8 -7
  16. package/dist/commands/cloud.js +17 -20
  17. package/dist/commands/commands.js +1 -1
  18. package/dist/commands/computer-actions.d.ts +1 -35
  19. package/dist/commands/computer-actions.js +13 -181
  20. package/dist/commands/computer.d.ts +28 -3
  21. package/dist/commands/computer.js +93 -65
  22. package/dist/commands/config.js +16 -3
  23. package/dist/commands/cost.d.ts +2 -1
  24. package/dist/commands/cost.js +7 -6
  25. package/dist/commands/daemon.js +151 -4
  26. package/dist/commands/detach.js +1 -1
  27. package/dist/commands/doctor.js +19 -11
  28. package/dist/commands/events.js +1 -1
  29. package/dist/commands/exec.d.ts +2 -50
  30. package/dist/commands/exec.js +160 -215
  31. package/dist/commands/factory.js +1 -1
  32. package/dist/commands/feed.d.ts +2 -2
  33. package/dist/commands/feed.js +12 -23
  34. package/dist/commands/fleet-capture.js +25 -27
  35. package/dist/commands/focus.d.ts +2 -3
  36. package/dist/commands/focus.js +34 -9
  37. package/dist/commands/go.js +15 -5
  38. package/dist/commands/harness.d.ts +3 -3
  39. package/dist/commands/harness.js +53 -5
  40. package/dist/commands/hooks.js +1 -1
  41. package/dist/commands/import.js +2 -2
  42. package/dist/commands/insights.d.ts +5 -5
  43. package/dist/commands/insights.js +15 -9
  44. package/dist/commands/inspect.d.ts +2 -3
  45. package/dist/commands/inspect.js +4 -16
  46. package/dist/commands/logs.d.ts +2 -2
  47. package/dist/commands/logs.js +9 -9
  48. package/dist/commands/mcp.js +2 -2
  49. package/dist/commands/memory.js +1 -1
  50. package/dist/commands/message.d.ts +1 -1
  51. package/dist/commands/message.js +7 -7
  52. package/dist/commands/mine.d.ts +11 -8
  53. package/dist/commands/mine.js +11 -10
  54. package/dist/commands/models.js +1 -1
  55. package/dist/commands/modes.js +1 -1
  56. package/dist/commands/monitors.js +23 -6
  57. package/dist/commands/output.d.ts +7 -6
  58. package/dist/commands/output.js +11 -10
  59. package/dist/commands/packages.js +4 -4
  60. package/dist/commands/perf.js +1 -1
  61. package/dist/commands/permissions.js +49 -32
  62. package/dist/commands/plugins.d.ts +1 -1
  63. package/dist/commands/plugins.js +3 -3
  64. package/dist/commands/profiles.d.ts +6 -9
  65. package/dist/commands/profiles.js +8 -321
  66. package/dist/commands/projects.d.ts +9 -0
  67. package/dist/commands/projects.js +140 -8
  68. package/dist/commands/prune.js +5 -13
  69. package/dist/commands/refresh-rules.js +1 -1
  70. package/dist/commands/repo.d.ts +5 -7
  71. package/dist/commands/repo.js +34 -18
  72. package/dist/commands/resource-view.js +4 -0
  73. package/dist/commands/resume.d.ts +11 -7
  74. package/dist/commands/resume.js +82 -98
  75. package/dist/commands/route.d.ts +12 -0
  76. package/dist/commands/route.js +261 -0
  77. package/dist/commands/routines.d.ts +2 -3
  78. package/dist/commands/routines.js +120 -145
  79. package/dist/commands/rules.js +1 -1
  80. package/dist/commands/run-account-picker.d.ts +1 -1
  81. package/dist/commands/run-account-picker.js +2 -2
  82. package/dist/commands/run-broadcast.d.ts +21 -0
  83. package/dist/commands/run-broadcast.js +89 -0
  84. package/dist/commands/run-cloud.js +1 -1
  85. package/dist/commands/secrets-vault.d.ts +10 -0
  86. package/dist/commands/{login.js → secrets-vault.js} +34 -14
  87. package/dist/commands/secrets.d.ts +4 -4
  88. package/dist/commands/secrets.js +158 -159
  89. package/dist/commands/sessions-backfill.js +1 -1
  90. package/dist/commands/sessions-browser.d.ts +1 -1
  91. package/dist/commands/sessions-browser.js +9 -5
  92. package/dist/commands/sessions-export.js +2 -2
  93. package/dist/commands/sessions-inject.js +4 -5
  94. package/dist/commands/sessions-migrate.js +16 -27
  95. package/dist/commands/sessions-picker.d.ts +14 -0
  96. package/dist/commands/sessions-picker.js +209 -13
  97. package/dist/commands/sessions-resume.d.ts +7 -3
  98. package/dist/commands/sessions-resume.js +81 -33
  99. package/dist/commands/sessions-share.d.ts +25 -0
  100. package/dist/commands/sessions-share.js +166 -0
  101. package/dist/commands/sessions-stats.js +2 -2
  102. package/dist/commands/sessions.d.ts +75 -68
  103. package/dist/commands/sessions.js +144 -180
  104. package/dist/commands/setup-browser.js +1 -1
  105. package/dist/commands/setup-computer.js +1 -1
  106. package/dist/commands/setup-fleet.js +3 -0
  107. package/dist/commands/setup-mine.d.ts +7 -3
  108. package/dist/commands/setup-mine.js +13 -8
  109. package/dist/commands/setup-preferences.js +2 -2
  110. package/dist/commands/setup-secrets.js +2 -2
  111. package/dist/commands/setup-watchdog.js +2 -2
  112. package/dist/commands/setup.js +7 -2
  113. package/dist/commands/share.d.ts +65 -0
  114. package/dist/commands/share.js +253 -20
  115. package/dist/commands/skills.js +3 -3
  116. package/dist/commands/snapshot.d.ts +2 -2
  117. package/dist/commands/snapshot.js +9 -9
  118. package/dist/commands/ssh.d.ts +1 -1
  119. package/dist/commands/ssh.js +186 -64
  120. package/dist/commands/subagents.js +1 -1
  121. package/dist/commands/sync.js +24 -9
  122. package/dist/commands/teams.d.ts +2 -2
  123. package/dist/commands/teams.js +9 -18
  124. package/dist/commands/tmux.js +5 -1
  125. package/dist/commands/trash.js +1 -1
  126. package/dist/commands/usage.d.ts +1 -1
  127. package/dist/commands/usage.js +2 -2
  128. package/dist/commands/utils.d.ts +4 -14
  129. package/dist/commands/utils.js +6 -27
  130. package/dist/commands/versions.js +2 -2
  131. package/dist/commands/view.d.ts +9 -77
  132. package/dist/commands/view.js +23 -8
  133. package/dist/commands/watchdog.js +1 -1
  134. package/dist/commands/webhook.js +25 -34
  135. package/dist/commands/workflows.js +1 -1
  136. package/dist/index.js +1 -1
  137. package/dist/lib/account-capabilities.d.ts +39 -0
  138. package/dist/lib/account-capabilities.js +59 -0
  139. package/dist/lib/account-catalog.js +1 -1
  140. package/dist/lib/account-registry.d.ts +66 -0
  141. package/dist/lib/account-registry.js +151 -5
  142. package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
  143. package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
  144. package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
  145. package/dist/lib/{usage.js → accounting/usage.js} +11 -11
  146. package/dist/lib/agent-spec/provider.js +1 -1
  147. package/dist/lib/agents.d.ts +72 -4
  148. package/dist/lib/agents.js +231 -199
  149. package/dist/lib/answer-router.d.ts +2 -2
  150. package/dist/lib/ask-classifier.d.ts +1 -1
  151. package/dist/lib/ask-classifier.js +1 -1
  152. package/dist/lib/audit/log.js +1 -1
  153. package/dist/lib/auth-health.d.ts +1 -1
  154. package/dist/lib/auth-health.js +2 -2
  155. package/dist/lib/brand.js +1 -1
  156. package/dist/lib/browser/caller-identity.d.ts +28 -0
  157. package/dist/lib/browser/caller-identity.js +156 -0
  158. package/dist/lib/browser/cdp.js +5 -1
  159. package/dist/lib/browser/chrome.js +12 -1
  160. package/dist/lib/browser/drivers/ssh.d.ts +1 -1
  161. package/dist/lib/browser/drivers/ssh.js +3 -2
  162. package/dist/lib/browser/hygiene.d.ts +10 -2
  163. package/dist/lib/browser/hygiene.js +7 -4
  164. package/dist/lib/browser/ipc.d.ts +22 -2
  165. package/dist/lib/browser/ipc.js +185 -21
  166. package/dist/lib/browser/profiles.d.ts +69 -5
  167. package/dist/lib/browser/profiles.js +135 -13
  168. package/dist/lib/browser/remote-control.d.ts +2 -2
  169. package/dist/lib/browser/remote-control.js +3 -3
  170. package/dist/lib/browser/runtime-state.d.ts +79 -0
  171. package/dist/lib/browser/runtime-state.js +119 -1
  172. package/dist/lib/browser/service.d.ts +137 -2
  173. package/dist/lib/browser/service.js +492 -54
  174. package/dist/lib/browser/sessions-list.d.ts +2 -1
  175. package/dist/lib/browser/sessions-list.js +4 -13
  176. package/dist/lib/browser/types.d.ts +19 -1
  177. package/dist/lib/budget/config.js +1 -1
  178. package/dist/lib/budget/ledger.js +1 -1
  179. package/dist/lib/byok-usage.js +1 -1
  180. package/dist/lib/capabilities.js +3 -15
  181. package/dist/lib/catchup.d.ts +1 -1
  182. package/dist/lib/catchup.js +1 -1
  183. package/dist/lib/cloud/dispatch.js +1 -1
  184. package/dist/lib/cloud/host.d.ts +3 -3
  185. package/dist/lib/cloud/host.js +5 -5
  186. package/dist/lib/cloud/rush.d.ts +9 -21
  187. package/dist/lib/cloud/rush.js +33 -120
  188. package/dist/lib/cloud/types.d.ts +2 -2
  189. package/dist/lib/commands.js +3 -13
  190. package/dist/lib/computer/actions.d.ts +36 -0
  191. package/dist/lib/computer/actions.js +162 -0
  192. package/dist/lib/computer/dispatch.d.ts +2 -2
  193. package/dist/lib/computer/dispatch.js +2 -2
  194. package/dist/lib/computer/sessions-list.d.ts +3 -3
  195. package/dist/lib/computer/sessions-list.js +2 -2
  196. package/dist/lib/config-keys.d.ts +2 -1
  197. package/dist/lib/config-keys.js +8 -4
  198. package/dist/lib/config-machine-keys.d.ts +4 -2
  199. package/dist/lib/config-machine-keys.js +5 -2
  200. package/dist/lib/crabbox/lease.js +9 -1
  201. package/dist/lib/crabbox/runtimes.d.ts +32 -7
  202. package/dist/lib/crabbox/runtimes.js +72 -30
  203. package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
  204. package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
  205. package/dist/lib/daemon-services.d.ts +1 -1
  206. package/dist/lib/daemon-services.js +5 -0
  207. package/dist/lib/daemon-ticks.d.ts +25 -0
  208. package/dist/lib/daemon-ticks.js +31 -1
  209. package/dist/lib/daemon-webhooks.d.ts +104 -0
  210. package/dist/lib/daemon-webhooks.js +215 -0
  211. package/dist/lib/device-config.d.ts +85 -75
  212. package/dist/lib/device-config.js +280 -142
  213. package/dist/lib/devices/config-migration.d.ts +29 -34
  214. package/dist/lib/devices/config-migration.js +209 -130
  215. package/dist/lib/devices/connect.d.ts +2 -2
  216. package/dist/lib/devices/connect.js +2 -2
  217. package/dist/lib/devices/discovery-policy.d.ts +30 -0
  218. package/dist/lib/devices/discovery-policy.js +101 -0
  219. package/dist/lib/devices/fleet-inventory.js +8 -3
  220. package/dist/lib/devices/harness-inventory.d.ts +1 -1
  221. package/dist/lib/devices/harness-inventory.js +12 -3
  222. package/dist/lib/devices/known-hosts.js +1 -1
  223. package/dist/lib/devices/pool.d.ts +10 -5
  224. package/dist/lib/devices/pool.js +5 -7
  225. package/dist/lib/devices/registry.d.ts +1 -1
  226. package/dist/lib/devices/registry.js +1 -1
  227. package/dist/lib/devices/resolve-profile.d.ts +2 -2
  228. package/dist/lib/devices/resolve-profile.js +2 -2
  229. package/dist/lib/devices/resolve-target.d.ts +1 -1
  230. package/dist/lib/devices/resolve-target.js +4 -4
  231. package/dist/lib/devices/self-host.d.ts +1 -1
  232. package/dist/lib/devices/self-host.js +3 -3
  233. package/dist/lib/devices/ssh-config.d.ts +1 -1
  234. package/dist/lib/devices/stats-cache.js +1 -1
  235. package/dist/lib/devices/sync.d.ts +3 -1
  236. package/dist/lib/devices/sync.js +3 -3
  237. package/dist/lib/doctor-diff.js +4 -4
  238. package/dist/lib/drift-sync.js +2 -2
  239. package/dist/lib/drift.js +2 -2
  240. package/dist/lib/event-families.d.ts +1 -1
  241. package/dist/lib/event-stream.d.ts +1 -1
  242. package/dist/lib/event-stream.js +2 -2
  243. package/dist/lib/events-ingest.js +2 -2
  244. package/dist/lib/exec.d.ts +4 -4
  245. package/dist/lib/exec.js +11 -11
  246. package/dist/lib/factory/snapshot.d.ts +1 -1
  247. package/dist/lib/factory/snapshot.js +1 -1
  248. package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
  249. package/dist/lib/{activity.js → feed/activity.js} +7 -7
  250. package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
  251. package/dist/lib/{events.js → feed/events.js} +5 -5
  252. package/dist/lib/{feed.js → feed/feed.js} +4 -4
  253. package/dist/lib/feed-outcome.d.ts +1 -1
  254. package/dist/lib/feed-policy.d.ts +1 -1
  255. package/dist/lib/feed-policy.js +1 -1
  256. package/dist/lib/feed-post.d.ts +1 -1
  257. package/dist/lib/feed-post.js +1 -1
  258. package/dist/lib/feed-ranking.d.ts +1 -1
  259. package/dist/lib/fleet/apply.d.ts +0 -6
  260. package/dist/lib/fleet/apply.js +18 -45
  261. package/dist/lib/fleet/auth-sync.d.ts +16 -35
  262. package/dist/lib/fleet/auth-sync.js +16 -75
  263. package/dist/lib/fleet/capture.js +8 -6
  264. package/dist/lib/fleet/manifest.js +23 -11
  265. package/dist/lib/fleet/types.d.ts +19 -7
  266. package/dist/lib/fleet-cache.d.ts +1 -1
  267. package/dist/lib/fleet-cache.js +1 -1
  268. package/dist/lib/format.d.ts +19 -0
  269. package/dist/lib/format.js +44 -1
  270. package/dist/lib/friction-heuristics.d.ts +1 -1
  271. package/dist/lib/git.d.ts +24 -1
  272. package/dist/lib/git.js +82 -38
  273. package/dist/lib/heal.js +3 -3
  274. package/dist/lib/hooks.d.ts +18 -0
  275. package/dist/lib/hooks.js +113 -1
  276. package/dist/lib/hosts/credentials.d.ts +30 -10
  277. package/dist/lib/hosts/credentials.js +38 -26
  278. package/dist/lib/hosts/dispatch.d.ts +3 -3
  279. package/dist/lib/hosts/dispatch.js +3 -3
  280. package/dist/lib/hosts/option.d.ts +3 -3
  281. package/dist/lib/hosts/option.js +7 -8
  282. package/dist/lib/hosts/passthrough.d.ts +17 -17
  283. package/dist/lib/hosts/passthrough.js +67 -50
  284. package/dist/lib/hosts/providers/devices.d.ts +1 -1
  285. package/dist/lib/hosts/providers/devices.js +1 -1
  286. package/dist/lib/hosts/reconcile.d.ts +1 -1
  287. package/dist/lib/hosts/reconcile.js +1 -1
  288. package/dist/lib/hosts/reconnect.d.ts +1 -1
  289. package/dist/lib/hosts/reconnect.js +2 -2
  290. package/dist/lib/hosts/registry.d.ts +5 -5
  291. package/dist/lib/hosts/registry.js +5 -5
  292. package/dist/lib/hosts/remote-cmd.d.ts +10 -10
  293. package/dist/lib/hosts/remote-cmd.js +25 -18
  294. package/dist/lib/hosts/remote-os.d.ts +4 -4
  295. package/dist/lib/hosts/remote-os.js +4 -4
  296. package/dist/lib/hosts/remote-session-id.d.ts +2 -2
  297. package/dist/lib/hosts/remote-session-id.js +2 -2
  298. package/dist/lib/hosts/routing-flag.d.ts +3 -3
  299. package/dist/lib/hosts/routing-flag.js +4 -5
  300. package/dist/lib/hosts/run-target.d.ts +4 -4
  301. package/dist/lib/hosts/run-target.js +4 -4
  302. package/dist/lib/hosts/session-index.d.ts +2 -2
  303. package/dist/lib/hosts/session-index.js +1 -1
  304. package/dist/lib/hosts/session-marker.d.ts +1 -1
  305. package/dist/lib/hosts/session-marker.js +1 -1
  306. package/dist/lib/hosts/types.d.ts +2 -2
  307. package/dist/lib/hosts/types.js +2 -2
  308. package/dist/lib/import.js +1 -1
  309. package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +13 -1
  310. package/dist/lib/{migrate.js → installations/migrate.js} +160 -40
  311. package/dist/lib/installations/resolve.js +1 -1
  312. package/dist/lib/installations/strategies.js +1 -1
  313. package/dist/lib/installations/update.js +2 -2
  314. package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
  315. package/dist/lib/{versions.js → installations/versions.js} +51 -31
  316. package/dist/lib/isolation-boundary-report.js +1 -1
  317. package/dist/lib/linear-projects.d.ts +28 -0
  318. package/dist/lib/linear-projects.js +30 -0
  319. package/dist/lib/loop.js +1 -1
  320. package/dist/lib/mailbox-gc.js +1 -1
  321. package/dist/lib/mailbox.js +1 -1
  322. package/dist/lib/mcp-registry.d.ts +62 -0
  323. package/dist/lib/mcp-registry.js +177 -0
  324. package/dist/lib/mcp.d.ts +5 -0
  325. package/dist/lib/mcp.js +124 -307
  326. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  327. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  328. package/dist/lib/menubar/install-menubar.d.ts +7 -0
  329. package/dist/lib/menubar/install-menubar.js +24 -6
  330. package/dist/lib/menubar/snapshot.d.ts +7 -0
  331. package/dist/lib/menubar/snapshot.js +8 -6
  332. package/dist/lib/models.js +1 -1
  333. package/dist/lib/monitors/config.d.ts +12 -0
  334. package/dist/lib/monitors/config.js +3 -0
  335. package/dist/lib/monitors/dispatch.js +26 -5
  336. package/dist/lib/monitors/engine.js +10 -0
  337. package/dist/lib/monitors/sources/webhook.d.ts +1 -1
  338. package/dist/lib/monitors/state.d.ts +42 -0
  339. package/dist/lib/monitors/state.js +30 -0
  340. package/dist/lib/notify.d.ts +1 -1
  341. package/dist/lib/observe-aliases.d.ts +3 -3
  342. package/dist/lib/observe-aliases.js +3 -21
  343. package/dist/lib/output/git-output.js +2 -2
  344. package/dist/lib/overdue.d.ts +1 -1
  345. package/dist/lib/overdue.js +1 -1
  346. package/dist/lib/permissions-registry.d.ts +65 -0
  347. package/dist/lib/permissions-registry.js +599 -0
  348. package/dist/lib/permissions.d.ts +24 -13
  349. package/dist/lib/permissions.js +52 -271
  350. package/dist/lib/picker.d.ts +16 -0
  351. package/dist/lib/picker.js +33 -3
  352. package/dist/lib/placement.d.ts +1 -1
  353. package/dist/lib/placement.js +4 -4
  354. package/dist/lib/platform/paths.d.ts +8 -0
  355. package/dist/lib/platform/paths.js +11 -0
  356. package/dist/lib/platform/posixpath.js +3 -3
  357. package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
  358. package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
  359. package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
  360. package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
  361. package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
  362. package/dist/lib/{skills.js → plugins/skills.js} +7 -7
  363. package/dist/lib/pricing/cost.d.ts +1 -1
  364. package/dist/lib/pricing/cost.js +1 -1
  365. package/dist/lib/profiles-presets.d.ts +1 -1
  366. package/dist/lib/profiles-presets.js +1 -1
  367. package/dist/lib/profiles.js +2 -2
  368. package/dist/lib/project-import.js +4 -1
  369. package/dist/lib/project-key.js +7 -0
  370. package/dist/lib/project-launch.d.ts +1 -1
  371. package/dist/lib/project-launch.js +3 -3
  372. package/dist/lib/project-pull.d.ts +128 -0
  373. package/dist/lib/project-pull.js +384 -0
  374. package/dist/lib/project-root.d.ts +2 -2
  375. package/dist/lib/project-root.js +2 -2
  376. package/dist/lib/project-status.js +1 -1
  377. package/dist/lib/projects.d.ts +23 -0
  378. package/dist/lib/projects.js +29 -6
  379. package/dist/lib/refresh.d.ts +12 -1
  380. package/dist/lib/refresh.js +16 -9
  381. package/dist/lib/registry.d.ts +9 -2
  382. package/dist/lib/registry.js +11 -4
  383. package/dist/lib/resources.d.ts +2 -2
  384. package/dist/lib/resources.js +2 -2
  385. package/dist/lib/routers.d.ts +81 -0
  386. package/dist/lib/routers.js +153 -0
  387. package/dist/lib/routine-context.d.ts +1 -0
  388. package/dist/lib/routine-context.js +7 -2
  389. package/dist/lib/routine-notify-owner.d.ts +1 -1
  390. package/dist/lib/routine-notify.d.ts +1 -1
  391. package/dist/lib/routine-notify.js +1 -1
  392. package/dist/lib/routine-process-cleanup.d.ts +1 -1
  393. package/dist/lib/routine-readiness.d.ts +1 -1
  394. package/dist/lib/routine-readiness.js +11 -4
  395. package/dist/lib/routines-placement.d.ts +12 -2
  396. package/dist/lib/routines-placement.js +20 -3
  397. package/dist/lib/routines-project.d.ts +1 -1
  398. package/dist/lib/routines-project.js +1 -1
  399. package/dist/lib/rules/compile.d.ts +1 -0
  400. package/dist/lib/rules/compile.js +10 -2
  401. package/dist/lib/rules/rules.js +1 -1
  402. package/dist/lib/run-notify.js +1 -1
  403. package/dist/lib/runner.d.ts +80 -2
  404. package/dist/lib/runner.js +261 -67
  405. package/dist/lib/sandbox.d.ts +1 -1
  406. package/dist/lib/scheduler.d.ts +1 -1
  407. package/dist/lib/scheduler.js +1 -1
  408. package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
  409. package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
  410. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  411. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  412. package/dist/lib/secrets/agent.js +2 -2
  413. package/dist/lib/secrets/audit.js +1 -1
  414. package/dist/lib/secrets/bundles.d.ts +4 -4
  415. package/dist/lib/secrets/bundles.js +8 -8
  416. package/dist/lib/secrets/headless.d.ts +16 -0
  417. package/dist/lib/secrets/headless.js +21 -0
  418. package/dist/lib/secrets/index.js +1 -1
  419. package/dist/lib/secrets/list-filter.d.ts +1 -1
  420. package/dist/lib/secrets/list-filter.js +2 -2
  421. package/dist/lib/secrets/push.d.ts +1 -1
  422. package/dist/lib/secrets/push.js +10 -12
  423. package/dist/lib/secrets/remote.d.ts +21 -17
  424. package/dist/lib/secrets/remote.js +39 -23
  425. package/dist/lib/secrets/vault.js +2 -2
  426. package/dist/lib/self-heal/checks/shadowing.js +1 -1
  427. package/dist/lib/self-heal/checks/shims.js +1 -1
  428. package/dist/lib/self-update.d.ts +39 -4
  429. package/dist/lib/self-update.js +78 -25
  430. package/dist/lib/serve/control.d.ts +1 -1
  431. package/dist/lib/serve/control.js +4 -4
  432. package/dist/lib/serve/data.d.ts +1 -1
  433. package/dist/lib/serve/data.js +1 -1
  434. package/dist/lib/serve/stream.js +1 -1
  435. package/dist/lib/service-manifest.d.ts +29 -0
  436. package/dist/lib/service-manifest.js +80 -0
  437. package/dist/lib/session/active.d.ts +59 -7
  438. package/dist/lib/session/active.js +158 -17
  439. package/dist/lib/session/bash-command.js +1 -1
  440. package/dist/lib/session/claude-accounts.d.ts +1 -1
  441. package/dist/lib/session/claude-accounts.js +1 -1
  442. package/dist/lib/session/db.d.ts +10 -2
  443. package/dist/lib/session/db.js +25 -6
  444. package/dist/lib/session/discover.d.ts +77 -0
  445. package/dist/lib/session/discover.js +130 -25
  446. package/dist/lib/session/fork.js +1 -1
  447. package/dist/lib/session/inject.d.ts +1 -1
  448. package/dist/lib/session/insights.d.ts +1 -1
  449. package/dist/lib/session/insights.js +1 -1
  450. package/dist/lib/session/live-metadata.d.ts +15 -0
  451. package/dist/lib/session/live-metadata.js +76 -0
  452. package/dist/lib/session/migrate-targets.d.ts +1 -1
  453. package/dist/lib/session/recovery.d.ts +1 -1
  454. package/dist/lib/session/recovery.js +2 -2
  455. package/dist/lib/session/remote-active.d.ts +10 -1
  456. package/dist/lib/session/remote-active.js +8 -3
  457. package/dist/lib/session/remote-bundle.d.ts +1 -1
  458. package/dist/lib/session/remote-bundle.js +2 -2
  459. package/dist/lib/session/remote-list.d.ts +15 -4
  460. package/dist/lib/session/remote-list.js +40 -3
  461. package/dist/lib/session/remote.d.ts +5 -5
  462. package/dist/lib/session/remote.js +13 -17
  463. package/dist/lib/session/resume-command.d.ts +3 -2
  464. package/dist/lib/session/resume-command.js +4 -3
  465. package/dist/lib/session/resume-owner.d.ts +3 -3
  466. package/dist/lib/session/resume-owner.js +3 -3
  467. package/dist/lib/session/session-cache.d.ts +12 -0
  468. package/dist/lib/session/session-cache.js +2 -0
  469. package/dist/lib/session/share-html.d.ts +55 -0
  470. package/dist/lib/session/share-html.js +319 -0
  471. package/dist/lib/session/shell-programs.js +1 -1
  472. package/dist/lib/session/state.js +5 -5
  473. package/dist/lib/session/team-filter.d.ts +1 -1
  474. package/dist/lib/session/team-filter.js +1 -1
  475. package/dist/lib/session/types.d.ts +3 -3
  476. package/dist/lib/session/width.d.ts +2 -2
  477. package/dist/lib/session/width.js +2 -2
  478. package/dist/lib/settings-manifest.d.ts +2 -0
  479. package/dist/lib/settings-manifest.js +81 -3
  480. package/dist/lib/share/delete.d.ts +21 -0
  481. package/dist/lib/share/delete.js +42 -0
  482. package/dist/lib/share/publish.d.ts +120 -0
  483. package/dist/lib/share/publish.js +243 -18
  484. package/dist/lib/share/worker-template.js +172 -9
  485. package/dist/lib/shims.js +35 -7
  486. package/dist/lib/smart-launch.d.ts +4 -4
  487. package/dist/lib/smart-launch.js +6 -4
  488. package/dist/lib/snapshot.d.ts +4 -4
  489. package/dist/lib/snapshot.js +2 -2
  490. package/dist/lib/ssh-exec.d.ts +1 -1
  491. package/dist/lib/ssh-exec.js +2 -2
  492. package/dist/lib/ssh-tunnel.d.ts +10 -10
  493. package/dist/lib/ssh-tunnel.js +12 -12
  494. package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
  495. package/dist/lib/staleness/checkers/hooks.js +1 -1
  496. package/dist/lib/staleness/detectors/permissions.js +0 -23
  497. package/dist/lib/staleness/detectors/plugins.js +1 -1
  498. package/dist/lib/staleness/fingerprint.js +1 -1
  499. package/dist/lib/staleness/layers.d.ts +1 -1
  500. package/dist/lib/staleness/layers.js +1 -1
  501. package/dist/lib/staleness/writers/mcp.js +3 -1
  502. package/dist/lib/staleness/writers/plugins.js +1 -1
  503. package/dist/lib/staleness/writers/types.d.ts +8 -0
  504. package/dist/lib/startup/command-registry.d.ts +6 -147
  505. package/dist/lib/startup/command-registry.js +40 -303
  506. package/dist/lib/startup/dev-build.d.ts +0 -21
  507. package/dist/lib/startup/dev-build.js +29 -8
  508. package/dist/lib/state.d.ts +19 -1
  509. package/dist/lib/state.js +120 -51
  510. package/dist/lib/subagents.js +1 -1
  511. package/dist/lib/sync-status.js +1 -1
  512. package/dist/lib/sync-umbrella.d.ts +6 -1
  513. package/dist/lib/sync-umbrella.js +9 -4
  514. package/dist/lib/teams/agents.js +2 -2
  515. package/dist/lib/teams/registry.js +1 -1
  516. package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
  517. package/dist/lib/terminal/engine.js +1 -1
  518. package/dist/lib/terminal/index.d.ts +4 -0
  519. package/dist/lib/terminal/index.js +3 -0
  520. package/dist/lib/terminal/inject.d.ts +2 -2
  521. package/dist/lib/terminal/inject.js +2 -2
  522. package/dist/lib/terminal/transport.js +1 -1
  523. package/dist/lib/tmux/index.d.ts +1 -1
  524. package/dist/lib/tmux/index.js +1 -1
  525. package/dist/lib/tmux/session.d.ts +21 -5
  526. package/dist/lib/tmux/session.js +76 -22
  527. package/dist/lib/triggers/handlers.d.ts +38 -3
  528. package/dist/lib/triggers/handlers.js +58 -7
  529. package/dist/lib/triggers/webhook.d.ts +113 -5
  530. package/dist/lib/triggers/webhook.js +223 -44
  531. package/dist/lib/types.d.ts +19 -7
  532. package/dist/lib/usage-fleet.d.ts +1 -1
  533. package/dist/lib/usage-fleet.js +1 -1
  534. package/dist/lib/usage-refresh.d.ts +1 -1
  535. package/dist/lib/usage-refresh.js +3 -3
  536. package/dist/lib/version-duplicates.js +2 -2
  537. package/dist/lib/view-types.d.ts +56 -0
  538. package/dist/lib/view-types.js +1 -0
  539. package/dist/lib/watchdog/rotate.d.ts +2 -2
  540. package/dist/lib/watchdog/rotate.js +3 -3
  541. package/dist/lib/watchdog/runner.d.ts +2 -3
  542. package/dist/lib/watchdog/runner.js +3 -4
  543. package/dist/lib/workflows.js +1 -1
  544. package/dist/lib/wrap.d.ts +33 -0
  545. package/dist/lib/wrap.js +70 -0
  546. package/package.json +2 -1
  547. package/scripts/postinstall.js +2 -2
  548. package/dist/commands/bench.d.ts +0 -2
  549. package/dist/commands/bench.js +0 -101
  550. package/dist/commands/cp.d.ts +0 -84
  551. package/dist/commands/cp.js +0 -231
  552. package/dist/commands/login.d.ts +0 -2
  553. package/dist/lib/resources/commands.d.ts +0 -46
  554. package/dist/lib/resources/commands.js +0 -211
  555. package/dist/lib/resources/hooks.d.ts +0 -16
  556. package/dist/lib/resources/hooks.js +0 -153
  557. package/dist/lib/resources/mcp.d.ts +0 -34
  558. package/dist/lib/resources/mcp.js +0 -250
  559. package/dist/lib/resources/memory.d.ts +0 -15
  560. package/dist/lib/resources/memory.js +0 -46
  561. package/dist/lib/resources/permissions.d.ts +0 -13
  562. package/dist/lib/resources/permissions.js +0 -202
  563. package/dist/lib/resources/rules.d.ts +0 -46
  564. package/dist/lib/resources/rules.js +0 -179
  565. package/dist/lib/resources/skills.d.ts +0 -37
  566. package/dist/lib/resources/skills.js +0 -247
  567. package/dist/lib/resources/subagents.d.ts +0 -46
  568. package/dist/lib/resources/subagents.js +0 -202
  569. /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
@@ -21,10 +21,11 @@ import { getActiveSessions } from '../lib/session/active.js';
21
21
  import { gatherRemoteActive } from '../lib/session/remote-active.js';
22
22
  import { gatherRemoteAgentsJson } from '../lib/remote-agents-json.js';
23
23
  import { formatFleetSummary, formatFleetWorkspaces, parseRemoteProbe, probeProjectWorkspaces, workspaceTargetsForDef, workspaceWarnings, } from '../lib/project-probe.js';
24
- import { listProjectDefs, loadProjectDef, writeProjectDef, removeProjectDef, projectDefPath, isSafeProjectName, validateProjectDef, projectNameForCwd, } from '../lib/projects.js';
24
+ import { listProjectDefs, loadProjectDef, writeProjectDef, removeProjectDef, projectDefPath, isSafeProjectName, validateProjectDef, projectNameForCwd, projectRepoTargetsForDef, } from '../lib/projects.js';
25
+ import { buildPullEnvelope, decodePullTargets, fingerprintTargets, pullLocalArgs, parseProjectPullEnvelope, printProjectPullSummary, projectPullComplete, pullProjectTargets, } from '../lib/project-pull.js';
25
26
  import { rollupSessionsByProject, withDefaultMachine, isDeadStatus, formatDeadSummary, liveDeadSplit, enrichProjectSignals, formatProjectMembersByHost, formatProjectWarnings, } from '../lib/project-status.js';
26
27
  import { fetchLinearProjectCounts } from '../lib/linear-project-counts.js';
27
- import { listLinearProjects, pickLinearProject } from '../lib/linear-projects.js';
28
+ import { listLinearProjects, nextLinearLink, pickLinearProject } from '../lib/linear-projects.js';
28
29
  import { checkRepoSlug } from '../lib/project-doctor.js';
29
30
  import { formatFocusAreas, readFocusAreas } from '../lib/project-focus.js';
30
31
  import { formatVerdict, scheduleVerdict } from '../lib/project-schedule.js';
@@ -61,6 +62,23 @@ export function formatFleetSkippedNote(skipped) {
61
62
  const noun = skipped.length === 1 ? 'device' : 'devices';
62
63
  return chalk.gray(` · ${skipped.length} ${noun} didn't answer (unreachable, older agents-cli, or timed out): ${list}\n`);
63
64
  }
65
+ /**
66
+ * One compact trailing note for peers that DID answer a fan-out but whose
67
+ * payload failed verification — a wrong machine id, a fingerprint that doesn't
68
+ * match the targets we sent, or a malformed row. Deliberately separate from
69
+ * {@link formatFleetSkippedNote}: silence means a peer never ran, while this
70
+ * means it ran and we cannot trust what it reports, which is the worse state.
71
+ * Empty string when every answer verified.
72
+ */
73
+ export function formatFleetUnverifiedNote(unverified) {
74
+ if (unverified.length === 0)
75
+ return '';
76
+ const named = unverified.slice(0, SKIPPED_NAME_LIMIT);
77
+ const rest = unverified.length - named.length;
78
+ const list = rest > 0 ? `${named.join(', ')} +${rest}` : named.join(', ');
79
+ const noun = unverified.length === 1 ? 'device' : 'devices';
80
+ return chalk.red(` · ${unverified.length} ${noun} answered with a result that could not be verified: ${list}\n`);
81
+ }
64
82
  /** `path:purpose` → a context anchor. Purpose may contain colons. */
65
83
  function parseContextFlag(raw) {
66
84
  const i = raw.indexOf(':');
@@ -616,8 +634,13 @@ export function registerProjectsCommands(program) {
616
634
  for (const ig of def.integrations ?? []) {
617
635
  console.log(` ${chalk.dim(ig.kind.padEnd(8))} ${ig.url}${ig.label ? chalk.dim(` (${ig.label})`) : ''}`);
618
636
  }
619
- if (def.linear?.url || def.linear?.projectId)
620
- console.log(` ${chalk.dim('linear')} ${def.linear.url ?? def.linear.projectId}`);
637
+ if (def.linear?.url || def.linear?.projectId || def.linear?.name) {
638
+ // Lead with the board's own name — the id/url answers "which project",
639
+ // but the name is what a reader (or an agent) calls the work.
640
+ const ref = def.linear.url ?? def.linear.projectId;
641
+ const label = def.linear.name ? chalk.cyan(def.linear.name) : '';
642
+ console.log(` ${chalk.dim('linear')} ${[label, ref && chalk.dim(ref)].filter(Boolean).join(' ')}`);
643
+ }
621
644
  for (const d of def.docs ?? [])
622
645
  console.log(` ${chalk.dim('doc')} ${d}`);
623
646
  console.log(chalk.gray(` ${projectDefPath(name)}`));
@@ -789,6 +812,112 @@ export function registerProjectsCommands(program) {
789
812
  // and this command has no remote code path either way.
790
813
  console.log(JSON.stringify(probeProjectWorkspaces(paths ?? []), null, 2));
791
814
  });
815
+ // ---- pull-local (hidden; the peer half of `pull`) ----
816
+ projects
817
+ .command('pull-local', { hidden: true })
818
+ .description('Fast-forward workspace repos (default-branch only) and print JSON. Answers for this machine only.')
819
+ .requiredOption('--targets <json>', 'JSON array of {path, expectedSlug} targets, from the orchestrating `pull`')
820
+ .option('--json', 'Machine-readable output (the only output format)')
821
+ .action(async (opts) => {
822
+ // Never fans out — this is the peer half of the fleet fan-out.
823
+ //
824
+ // Targets arrive as {path, expectedSlug} PAIRS, not bare paths: the slug
825
+ // is what lets this machine refuse to fast-forward a directory hosting a
826
+ // different repo, and it is hashed into the fingerprint the caller
827
+ // verifies. Decoding failures exit non-zero so the caller records this
828
+ // peer as skipped instead of reading a missing answer as "nothing to do".
829
+ let targets;
830
+ try {
831
+ targets = decodePullTargets(opts.targets);
832
+ }
833
+ catch (err) {
834
+ console.error(chalk.red(`Invalid --targets: ${err.message}`));
835
+ process.exit(1);
836
+ }
837
+ const results = await pullProjectTargets(targets);
838
+ const envelope = buildPullEnvelope(results, targets);
839
+ console.log(JSON.stringify(envelope, null, 2));
840
+ });
841
+ // ---- pull ----
842
+ const pullCmd = projects
843
+ .command('pull <name>')
844
+ .description('Fast-forward every fleet checkout of a named project to its remote default branch.')
845
+ .option('--device <name...>', 'Scope fleet pull to one or more devices (repeatable)')
846
+ .option('--devices <names>', 'Scope fleet pull to a comma-separated list of devices')
847
+ .option('--json', 'Machine-readable output')
848
+ .action(async (name, rawOpts) => {
849
+ const def = loadProjectDef(name);
850
+ if (!def) {
851
+ console.error(chalk.red(`No project named "${name}". Create it: agents projects add ${name}`));
852
+ process.exit(1);
853
+ }
854
+ const targets = projectRepoTargetsForDef(def);
855
+ if (targets.length === 0) {
856
+ console.error(chalk.yellow(`Project "${name}" has no configured repositories.`));
857
+ process.exit(0);
858
+ }
859
+ const deviceFilter = resolveDeviceFilter(rawOpts.device, rawOpts.devices);
860
+ // Pull locally first.
861
+ const self = machineId();
862
+ const localResults = await pullProjectTargets(targets, self);
863
+ // Fan out to fleet peers. Send the full {path, expectedSlug} targets —
864
+ // bare paths would disable slug verification on every peer AND make the
865
+ // peer's fingerprint (which hashes the slug) unmatchable, so its whole
866
+ // answer would be discarded. Compute the fingerprint once so every peer
867
+ // envelope can be verified against the exact target set we sent.
868
+ const expectedFingerprint = fingerprintTargets(targets);
869
+ const remoteRes = await gatherRemoteAgentsJson({
870
+ args: pullLocalArgs(targets),
871
+ noFanoutEnv: PROJECTS_NO_FANOUT_ENV,
872
+ hosts: deviceFilter,
873
+ parse: (stdout, machine) => parseProjectPullEnvelope(stdout, machine, { expectedFingerprint }),
874
+ quiet: true,
875
+ timeoutMs: 120_000,
876
+ });
877
+ const allResults = [...localResults, ...remoteRes.items];
878
+ if (rawOpts.json) {
879
+ // Mirror `status --json`: peers that didn't answer, or answered
880
+ // unverifiably, go to stderr so a machine caller can still tell them
881
+ // apart from a device with nothing to report (the JSON array itself
882
+ // stays a clean result list).
883
+ if (remoteRes.skipped.length > 0)
884
+ process.stderr.write(formatFleetSkippedNote(remoteRes.skipped));
885
+ if (remoteRes.parseFailed.length > 0)
886
+ process.stderr.write(formatFleetUnverifiedNote(remoteRes.parseFailed));
887
+ console.log(JSON.stringify(allResults, null, 2));
888
+ }
889
+ else {
890
+ printProjectPullSummary(name, allResults, remoteRes.skipped, remoteRes.parseFailed);
891
+ }
892
+ // A peer whose answer could not be verified already ran a real pull whose
893
+ // outcome we cannot see — that is a failed pull, not a quiet success.
894
+ if (!projectPullComplete(allResults) || remoteRes.parseFailed.length > 0) {
895
+ process.exit(1);
896
+ }
897
+ });
898
+ setHelpSections(pullCmd, {
899
+ examples: `
900
+ agents projects pull rush # pull every checkout in the project
901
+ agents projects pull rush --device yosemite-s0 # scope to one device
902
+ agents projects pull rush --devices s0,s1 # scope to multiple devices
903
+ agents projects pull rush --json # machine-readable results
904
+ `,
905
+ notes: `
906
+ Only checkouts on their remote's default branch are fast-forwarded. Dirty
907
+ trees, local commits ahead of upstream, or a wrong branch are blocked and
908
+ reported — never overwritten.
909
+
910
+ Each checkout is verified against the project's declared repo slug before
911
+ anything is fast-forwarded — on every device, not just this one. A path
912
+ hosting a different repo is blocked.
913
+
914
+ Checkouts absent on a device are skipped (never cloned). Blocked or failed
915
+ checkouts drive a non-zero exit; missing paths do not. A device that
916
+ answers with a result that cannot be verified is reported as unverified
917
+ and also drives a non-zero exit; a device that never answers is reported
918
+ as unavailable and does not.
919
+ `,
920
+ });
792
921
  // ---- import ----
793
922
  projects
794
923
  .command('import')
@@ -914,7 +1043,7 @@ export function registerProjectsCommands(program) {
914
1043
  // ---- link ----
915
1044
  projects
916
1045
  .command('link <name>')
917
- .description('Attach an external tracker to a project definition (writes linear.projectId into the YAML).')
1046
+ .description('Attach an external tracker to a project definition (writes linear.projectId + name into the YAML; re-run to pick up a Linear rename).')
918
1047
  .option('--linear [query]', 'Bind a Linear project by exact name or id; no value auto-suggests from the def name + repo')
919
1048
  .action((name, opts) => {
920
1049
  const def = loadProjectDef(name);
@@ -976,9 +1105,12 @@ export function registerProjectsCommands(program) {
976
1105
  if (def.linear?.projectId && def.linear.projectId !== p.id) {
977
1106
  console.log(chalk.gray(` replacing previous Linear link (${def.linear.projectId})`));
978
1107
  }
979
- def.linear = { ...def.linear, projectId: p.id };
980
- if (p.url)
981
- def.linear.url = p.url;
1108
+ if (def.linear?.name && def.linear.name !== p.name) {
1109
+ console.log(chalk.gray(` renaming "${def.linear.name}" → "${p.name}" (Linear is authoritative)`));
1110
+ }
1111
+ // Assigned, not spread over `def.linear`: a spread would resurrect a url
1112
+ // that nextLinearLink deliberately dropped. The block has no other fields.
1113
+ def.linear = nextLinearLink(def.linear, p);
982
1114
  writeProjectDef(def);
983
1115
  console.log(chalk.green(`${def.name} → Linear project "${p.name}" (${p.id})${p.url ? ` ${p.url}` : ''}`));
984
1116
  });
@@ -23,18 +23,19 @@
23
23
  */
24
24
  import * as fs from 'fs';
25
25
  import chalk from 'chalk';
26
+ import { formatBytes } from '../lib/format.js';
26
27
  import { confirm } from '@inquirer/prompts';
27
28
  import { diffVersionCommands, iterCommandsCapableVersions, removeCommandFromVersion, } from '../lib/commands.js';
28
- import { diffVersionSkills, iterSkillsCapableVersions, removeSkillFromVersion, } from '../lib/skills.js';
29
+ import { diffVersionSkills, iterSkillsCapableVersions, removeSkillFromVersion, } from '../lib/plugins/skills.js';
29
30
  import { listUnmanagedHooksInVersionHome, iterHooksCapableVersions, removeHookFromVersion, } from '../lib/hooks.js';
30
- import { diffVersionPlugins, iterPluginsCapableVersions, removePluginSkillFromVersion, } from '../lib/plugins.js';
31
+ import { diffVersionPlugins, iterPluginsCapableVersions, removePluginSkillFromVersion, } from '../lib/plugins/plugins.js';
31
32
  import { diffVersionSubagents, iterSubagentsCapableVersions, removeSubagentFromVersion, } from '../lib/subagents.js';
32
- import { getGlobalDefault } from '../lib/versions.js';
33
+ import { getGlobalDefault } from '../lib/installations/versions.js';
33
34
  import { resolveAgentName, formatAgentError } from '../lib/agents.js';
34
35
  import { pruneDuplicates } from './view.js';
35
36
  import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
36
37
  import { getTrashDir } from '../lib/state.js';
37
- import { previewRunsPrune, pruneRuns, countAllRuns } from '../lib/routines.js';
38
+ import { previewRunsPrune, pruneRuns, countAllRuns } from '../lib/scheduling/routines.js';
38
39
  const RESOURCE_TYPES = ['commands', 'skills', 'hooks', 'plugins', 'subagents'];
39
40
  const STATE_TYPES = ['trash', 'sessions', 'runs'];
40
41
  const ALL_TYPES = [...RESOURCE_TYPES, 'versions', ...STATE_TYPES];
@@ -128,15 +129,6 @@ function parseTarget(arg) {
128
129
  console.log(chalk.gray(formatAgentError(arg)));
129
130
  process.exit(1);
130
131
  }
131
- function formatBytes(bytes) {
132
- if (bytes < 1024)
133
- return `${bytes} B`;
134
- if (bytes < 1024 * 1024)
135
- return `${(bytes / 1024).toFixed(1)} KB`;
136
- if (bytes < 1024 * 1024 * 1024)
137
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
138
- return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;
139
- }
140
132
  async function runTrashPrune(options) {
141
133
  const trashDir = getTrashDir();
142
134
  if (!fs.existsSync(trashDir)) {
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import chalk from 'chalk';
9
9
  import { AGENTS, resolveAgentName } from '../lib/agents.js';
10
- import { isVersionInstalled } from '../lib/versions.js';
10
+ import { isVersionInstalled } from '../lib/installations/versions.js';
11
11
  import { ensureRulesFresh, supportsRulesImports } from '../lib/rules/compile.js';
12
12
  /**
13
13
  * Hidden command invoked by shims for agents that don't natively resolve
@@ -99,12 +99,10 @@ export declare function wrapPhrases(parts: string[], width: number): string[];
99
99
  export interface RepoStatusOptions {
100
100
  verbose?: boolean;
101
101
  json?: boolean;
102
- /** Fan out across every reachable fleet device (`--devices-all`/`--hosts-all`). */
102
+ /** Fan out across every reachable fleet device (`--devices-all`). */
103
103
  devicesAll?: boolean;
104
- hostsAll?: boolean;
105
- /** `all`, or a comma-separated device list (`--devices`/`--hosts`). */
104
+ /** `all`, or a comma-separated device list (`--devices`). */
106
105
  devices?: string;
107
- hosts?: string;
108
106
  }
109
107
  /**
110
108
  * Per-device repo status — the unit of the `--devices-all` fleet fan-out. One
@@ -146,9 +144,9 @@ type DeviceIntent = {
146
144
  };
147
145
  /**
148
146
  * Read the device-scope flags into an intent, or null for the default local-only
149
- * run. `--devices-all`/`--hosts-all` (and `--devices all`/`--hosts all`) sweep
150
- * every reachable peer; `--devices box1,box2` targets an explicit list. A peer
151
- * carrying {@link NO_REPO_FANOUT_ENV} never fans out again (recursion guard).
147
+ * run. `--devices-all` (and `--devices all`) sweeps every reachable peer;
148
+ * `--devices box1,box2` targets an explicit list. A peer carrying
149
+ * {@link NO_REPO_FANOUT_ENV} never fans out again (recursion guard).
152
150
  */
153
151
  export declare function resolveDeviceIntent(opts: RepoStatusOptions): DeviceIntent | null;
154
152
  /** Register the `agents repos` command tree (`repo` is a convenience alias). */
@@ -34,8 +34,8 @@ import { DEFAULT_SYSTEM_REPO } from '../lib/types.js';
34
34
  import { ALL_AGENT_IDS, isAgentName, resolveAgentName } from '../lib/agents.js';
35
35
  import { refresh } from '../lib/refresh.js';
36
36
  import { capableAgents } from '../lib/capabilities.js';
37
- import { getGlobalDefault, getVersionHomePath, listInstalledVersions } from '../lib/versions.js';
38
- import { syncAllMarketplaces } from '../lib/plugin-marketplace.js';
37
+ import { getGlobalDefault, getVersionHomePath, listInstalledVersions } from '../lib/installations/versions.js';
38
+ import { syncAllMarketplaces } from '../lib/plugins/plugin-marketplace.js';
39
39
  import { gatherRemoteAgentsJson } from '../lib/remote-agents-json.js';
40
40
  import { machineId, normalizeHost } from '../lib/machine-id.js';
41
41
  /**
@@ -522,16 +522,16 @@ export function renderDeviceStatusRows(results) {
522
522
  }
523
523
  /**
524
524
  * Read the device-scope flags into an intent, or null for the default local-only
525
- * run. `--devices-all`/`--hosts-all` (and `--devices all`/`--hosts all`) sweep
526
- * every reachable peer; `--devices box1,box2` targets an explicit list. A peer
527
- * carrying {@link NO_REPO_FANOUT_ENV} never fans out again (recursion guard).
525
+ * run. `--devices-all` (and `--devices all`) sweeps every reachable peer;
526
+ * `--devices box1,box2` targets an explicit list. A peer carrying
527
+ * {@link NO_REPO_FANOUT_ENV} never fans out again (recursion guard).
528
528
  */
529
529
  export function resolveDeviceIntent(opts) {
530
530
  if (process.env[NO_REPO_FANOUT_ENV] === '1')
531
531
  return null;
532
- if (opts.devicesAll || opts.hostsAll)
532
+ if (opts.devicesAll)
533
533
  return { all: true };
534
- const val = opts.devices ?? opts.hosts;
534
+ const val = opts.devices;
535
535
  if (val === undefined)
536
536
  return null;
537
537
  const v = val.trim();
@@ -639,21 +639,19 @@ function formatRepoTarget(alias, dir, branch) {
639
639
  }
640
640
  /**
641
641
  * Register the fleet device-scope flags shared by `repo list` / `repo status`.
642
- * `--devices-all` (alias `--hosts-all`) sweeps every reachable device;
643
- * `--devices <who>` (alias `--hosts`) takes `all` or a comma-separated list.
644
- * A single `--host`/`--device` is handled upstream by maybeRunOnHost, which
645
- * streams that one box's `agents repo status` — these are the aggregating forms.
642
+ * `--devices-all` sweeps every reachable device; `--devices <who>` takes `all`
643
+ * or a comma-separated list. A single `--device` is handled upstream by
644
+ * maybeRunOnHost, which streams that one box's `agents repo status` these are
645
+ * the aggregating forms.
646
646
  */
647
647
  function addDeviceStatusOptions(cmd) {
648
648
  return cmd
649
- .option('--devices-all', 'Report repo sync state across ALL reachable fleet devices (alias: --hosts-all).')
650
- .option('--hosts-all', 'Alias of --devices-all.')
651
- .option('--devices <who>', 'Fleet devices to report on: "all", or a comma-separated device list (alias: --hosts).')
652
- .option('--hosts <who>', 'Alias of --devices.');
649
+ .option('--devices-all', 'Report repo sync state across ALL reachable fleet devices.')
650
+ .option('--devices <who>', 'Fleet devices to report on: "all", or a comma-separated device list.');
653
651
  }
654
652
  /** Register the `agents repos` command tree (`repo` is a convenience alias). */
655
653
  export function registerRepoCommands(program) {
656
- // addHostOption on the group so --help documents --host/--device; remote
654
+ // addHostOption on the group so --help documents --device; remote
657
655
  // routing is handled pre-parse by maybeRunOnHost (passthrough.ts).
658
656
  const repoCmd = addHostOption(program
659
657
  .command('repos')
@@ -968,7 +966,7 @@ export function registerRepoCommands(program) {
968
966
  });
969
967
  repoCmd
970
968
  .command('pull [alias] [url]')
971
- .description('Pull updates. Aliases: "system" (~/.agents/.system/), "user" (~/.agents/), or any registered extra. No arg pulls all. Pass a git URL to git-back a not-yet-cloned user repo: "agents repo pull user <url>".')
969
+ .description('Pull updates and reconcile synced device decisions. Aliases: "system" (~/.agents/.system/), "user" (~/.agents/), or any registered extra. No arg pulls all. Pass a git URL to git-back a not-yet-cloned user repo: "agents repo pull user <url>".')
972
970
  .action(async (alias, url) => {
973
971
  const targets = collectRepoTargets(alias);
974
972
  if (!targets) {
@@ -980,6 +978,7 @@ export function registerRepoCommands(program) {
980
978
  return;
981
979
  }
982
980
  let anyPulled = false;
981
+ let userPulled = false;
983
982
  for (const t of targets) {
984
983
  if (!fs.existsSync(t.dir) || !isGitRepo(t.dir)) {
985
984
  // A plain (never-cloned) user repo — setup makes ~/.agents a bare dir and
@@ -1020,6 +1019,8 @@ export function registerRepoCommands(program) {
1020
1019
  if (result.success) {
1021
1020
  spinner.succeed(`${formatRepoTarget(t.alias, t.dir, result.branch)}: ${result.commit}`);
1022
1021
  anyPulled = true;
1022
+ if (t.alias === 'user')
1023
+ userPulled = true;
1023
1024
  }
1024
1025
  else {
1025
1026
  spinner.fail(`${formatRepoTarget(t.alias, t.dir)}: ${result.error}`);
@@ -1036,11 +1037,22 @@ export function registerRepoCommands(program) {
1036
1037
  // so scheduler.reloadAll() re-reads the synced YAML and device pins refresh.
1037
1038
  // No-op when the daemon isn't running (or on Windows, which has no SIGHUP).
1038
1039
  if (anyPulled) {
1039
- const { isDaemonRunning, signalDaemonReload } = await import('../lib/daemon.js');
1040
+ const { isDaemonRunning, signalDaemonReload } = await import('../lib/daemon/daemon.js');
1040
1041
  if (isDaemonRunning() && signalDaemonReload()) {
1041
1042
  console.log(chalk.gray('Reloaded the routines daemon (device pins refreshed).'));
1042
1043
  }
1043
1044
  }
1045
+ if (userPulled) {
1046
+ const { reconcileDeviceDiscoveryPolicies } = await import('../lib/devices/discovery-policy.js');
1047
+ const result = await reconcileDeviceDiscoveryPolicies();
1048
+ const parts = [
1049
+ result.registered.length ? `${result.registered.length} registered` : null,
1050
+ result.ignored.length ? `${result.ignored.length} ignored` : null,
1051
+ result.unresolved.length ? `${result.unresolved.length} approved but unavailable` : null,
1052
+ ].filter(Boolean);
1053
+ if (parts.length > 0)
1054
+ console.log(chalk.gray(`Device policy: ${parts.join(' · ')}`));
1055
+ }
1044
1056
  });
1045
1057
  repoCmd
1046
1058
  .command('push [alias]')
@@ -1123,6 +1135,10 @@ Examples:
1123
1135
  if (result.success) {
1124
1136
  const pushed = result.pushed ? ' (pushed)' : '';
1125
1137
  spinner.succeed(`${formatRepoTarget(t.alias, t.dir)}: ${result.commit}${pushed}`);
1138
+ if (t.alias === 'user') {
1139
+ const { reconcileDeviceDiscoveryPolicies } = await import('../lib/devices/discovery-policy.js');
1140
+ await reconcileDeviceDiscoveryPolicies();
1141
+ }
1126
1142
  }
1127
1143
  else {
1128
1144
  spinner.fail(`${formatRepoTarget(t.alias, t.dir)}: ${result.error}`);
@@ -42,6 +42,10 @@ export async function showResourceList(opts) {
42
42
  filter: (query) => filterRows(opts.rows, query),
43
43
  labelFor: (row) => formatPickerRow(row, opts),
44
44
  buildPreview: (row) => row.buildDetail(),
45
+ // Row numbers say where each entry sits in the list while scrolling —
46
+ // and read against the total when the caller prints one, as
47
+ // `agents inspect` does with its "commands (12)" header.
48
+ numbered: true,
45
49
  pageSize: 12,
46
50
  emptyMessage: `No matching ${opts.resourcePlural}.`,
47
51
  enterHint: 'view',
@@ -1,5 +1,4 @@
1
- import type { Command } from 'commander';
2
- interface ResumeOptions {
1
+ export interface StrictResumeOptions {
3
2
  mode?: string;
4
3
  interactive?: boolean;
5
4
  headless?: boolean;
@@ -16,13 +15,18 @@ interface ResumeOptions {
16
15
  * on an older CLI (see the constant's docs). Every argv token here exists in the
17
16
  * released surface.
18
17
  */
19
- export declare function buildResumeRemoteArgs(sessionId: string, prompt: string | undefined, options: ResumeOptions): string[];
20
- /** Translate `agents resume <id>` to the canonical `agents run` surface after
18
+ export declare function buildResumeRemoteArgs(sessionId: string, prompt: string | undefined, options: StrictResumeOptions): string[];
19
+ /** Translate `agents sessions resume <id>` to the canonical `agents run` surface after
21
20
  * resolving the source identity. The run command remains the only executor. */
22
21
  export declare function buildResumeRunArgs(session: {
23
22
  id: string;
24
23
  agent: string;
25
24
  version?: string;
26
- }, prompt: string | undefined, options: ResumeOptions): string[];
27
- export declare function registerResumeCommand(program: Command): void;
28
- export {};
25
+ }, prompt: string | undefined, options: StrictResumeOptions): string[];
26
+ /** True when the caller asked for the strict resume path (prompt and/or flags). */
27
+ export declare function wantsStrictResume(prompt: string | undefined, options: StrictResumeOptions): boolean;
28
+ /**
29
+ * Strict single-session resume: resolve id/label across the fleet, hop to the
30
+ * owning device when needed, then delegate to `agents run --resume`.
31
+ */
32
+ export declare function runStrictResume(sessionId: string, prompt: string | undefined, options: StrictResumeOptions): Promise<void>;