@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
@@ -1,15 +1,67 @@
1
1
  import chalk from 'chalk';
2
2
  import { password } from '@inquirer/prompts';
3
3
  import { setHelpSections } from '../lib/help.js';
4
- import { updateMeta } from '../lib/state.js';
5
- import { ALL_AGENT_IDS } from '../lib/agents.js';
4
+ import { readMeta, updateMeta } from '../lib/state.js';
5
+ import { ALL_AGENT_IDS, getAccountInfo, resolveAgentName } from '../lib/agents.js';
6
+ import { getVersionHomePath, listInstalledVersions } from '../lib/installations/versions.js';
7
+ import { nativeAccountCapability, nativeAccountNameable, nativeIdentityKey } from '../lib/account-capabilities.js';
8
+ import { profileExists, readProfile } from '../lib/profiles.js';
6
9
  import { pushBundleToHost } from '../lib/secrets/push.js';
10
+ import { assertCredentialTransportHostPinned, resolveHostSshTarget } from '../lib/secrets/remote.js';
7
11
  import { resolveRemoteOsSync } from '../lib/hosts/remote-os.js';
8
12
  import { runDevicesAccounts } from './ssh.js';
9
13
  import { discoverNativeAccounts } from '../lib/account-catalog.js';
10
14
  import { readAndResolveBundleEnv } from '../lib/secrets/bundles.js';
11
15
  import { getAccountProvider, listAccountProviders } from '../lib/account-provider-registry.js';
12
- import { addAccount, findAccount, inspectAccount, readAccountRegistry, removeAccount, renameAccount, setAccountSecret } from '../lib/account-registry.js';
16
+ import { accountBindings, addAccount, addNativeAccount, bindAccount, findAccount, findUnifiedAccount, inspectAccount, listNativeAccounts, readAccountRegistry, removeAccount, renameAccount, setAccountSecret, unbindAccount } from '../lib/account-registry.js';
17
+ function parseInstallation(raw) {
18
+ const at = raw.lastIndexOf('@');
19
+ if (at < 1 || at === raw.length - 1)
20
+ throw new Error(`Expected <agent>@<version>, got '${raw}'.`);
21
+ const agent = resolveAgentName(raw.slice(0, at));
22
+ if (!agent)
23
+ throw new Error(`Unknown agent '${raw.slice(0, at)}'.`);
24
+ return { agent, version: raw.slice(at + 1) };
25
+ }
26
+ async function nativeIdentityFromSource(raw) {
27
+ const parsed = parseInstallation(raw);
28
+ const capability = nativeAccountCapability(parsed.agent);
29
+ if (!nativeAccountNameable(parsed.agent)) {
30
+ throw new Error(`${parsed.agent} native accounts are ${capability.status}; agents-cli cannot safely name or attach this login.`);
31
+ }
32
+ if (!listInstalledVersions(parsed.agent).includes(parsed.version))
33
+ throw new Error(`${raw} is not installed.`);
34
+ const info = await getAccountInfo(parsed.agent, getVersionHomePath(parsed.agent, parsed.version));
35
+ const identityKey = nativeIdentityKey(info, capability);
36
+ if (!identityKey)
37
+ throw new Error(`${raw} has no stable signed-in identity. Run it and complete its normal login first.`);
38
+ return { agent: parsed.agent, version: parsed.version, identityKey, identityLabel: info.email ?? undefined, scope: capability.scope };
39
+ }
40
+ /**
41
+ * Classify + validate an attach target, rejecting a typo BEFORE any binding is
42
+ * written: it must be an existing custom-harness profile, an installed
43
+ * `agent@version`, or a known harness id.
44
+ */
45
+ export function classifyAttachTarget(target) {
46
+ if (profileExists(target))
47
+ return { kind: 'profile', profile: readProfile(target) };
48
+ if (target.includes('@')) {
49
+ const at = target.lastIndexOf('@');
50
+ const agent = resolveAgentName(target.slice(0, at));
51
+ const version = target.slice(at + 1);
52
+ if (!agent)
53
+ throw new Error(`Unknown harness '${target.slice(0, at)}' in target '${target}'.`);
54
+ if (!version)
55
+ throw new Error(`Target '${target}' is missing a version.`);
56
+ if (!listInstalledVersions(agent).includes(version))
57
+ throw new Error(`${agent}@${version} is not installed.`);
58
+ return { kind: 'installation', agent, version };
59
+ }
60
+ const agent = resolveAgentName(target);
61
+ if (agent)
62
+ return { kind: 'device-agent', agent };
63
+ throw new Error(`Unknown attach target '${target}'. Expected an installed <agent>@<version>, a harness id, or an existing custom harness profile.`);
64
+ }
13
65
  export function parseBundleKey(raw) {
14
66
  const colon = raw.indexOf(':');
15
67
  if (colon < 1 || colon === raw.length - 1)
@@ -27,7 +79,12 @@ async function printAccounts(json, fleet = false) {
27
79
  if (fleet)
28
80
  return runDevicesAccounts({ json });
29
81
  const records = Object.values(readAccountRegistry().accounts).sort((a, b) => a.name.localeCompare(b.name));
30
- const native = await discoverNativeAccounts();
82
+ const discovered = await discoverNativeAccounts();
83
+ const savedNative = listNativeAccounts(readMeta());
84
+ const native = discovered.map(row => {
85
+ const saved = savedNative.find(account => account.agent === row.agent && account.identityKey === row.id);
86
+ return { ...row, name: saved?.name, id: saved?.id ?? row.id };
87
+ });
31
88
  if (json) {
32
89
  console.log(JSON.stringify([...records.map(account => publicAccount(inspectAccount(account.name))), ...native], null, 2));
33
90
  return;
@@ -43,7 +100,7 @@ async function printAccounts(json, fleet = false) {
43
100
  if (!native.length)
44
101
  console.log(chalk.gray(' No signed-in native accounts found.'));
45
102
  for (const account of native)
46
- console.log(` ${chalk.cyan(account.display)} ${account.agent} ${account.versions.join(', ')}`);
103
+ console.log(` ${account.name ? `${chalk.cyan(account.name)} · ` : ''}${account.display} ${account.agent} ${account.versions.join(', ')}`);
47
104
  }
48
105
  function parseAuth(raw) {
49
106
  if (raw === 'api-key' || raw === 'setup-token' || raw === 'bearer-token')
@@ -78,22 +135,87 @@ export function registerAccountsCommand(program) {
78
135
  .action(async (name, o) => {
79
136
  const account = findAccount(name);
80
137
  if (!account)
81
- throw new Error(`Unknown account '${name}'.`);
138
+ throw new Error(`Unknown provider account '${name}'.`);
82
139
  const secret = o.fromSecrets ? secretFromBundle(o.fromSecrets) : await password({ message: `Enter new ${account.provider} ${account.auth} for '${name}':` });
83
140
  setAccountSecret(name, secret);
84
141
  console.log(chalk.green(`Updated credential for account '${name}'.`));
85
142
  });
86
- accounts.command('inspect <name>').description('Show safe account metadata').option('--json', 'Machine-readable output').action((name, o, command) => {
87
- const account = publicAccount(inspectAccount(name));
143
+ accounts.command('view <name>').alias('inspect').description('Show safe account metadata, custody, and attachments').option('--json', 'Machine-readable output').action((name, o, command) => {
144
+ const meta = readMeta();
145
+ const unified = findUnifiedAccount(name, meta);
146
+ if (!unified)
147
+ throw new Error(`Unknown account '${name}'.`);
148
+ const account = unified.kind === 'provider'
149
+ ? { ...publicAccount(inspectAccount(unified.name)), custody: 'agents secrets (policy never)', attached: accountBindings(unified.id, meta) }
150
+ : { ...unified, custody: `${unified.agent} (not stored by agents-cli)`, attached: accountBindings(unified.id, meta) };
88
151
  if (o.json || command.optsWithGlobals().json)
89
152
  return console.log(JSON.stringify(account, null, 2));
90
- console.log(`${chalk.bold(account.name)} ${account.provider}`);
91
- console.log(` auth: ${account.auth}`);
153
+ console.log(chalk.bold(account.name));
154
+ console.log(` kind: ${account.kind}`);
92
155
  console.log(` id: ${account.id}`);
93
- console.log(` policy: ${account.policy}`);
94
- if (account.baseUrl)
95
- console.log(` base url: ${account.baseUrl}`);
96
- console.log(` credential: ${account.secretPresent ? 'present on this device' : 'missing on this device'}`);
156
+ console.log(` custody: ${account.custody}`);
157
+ if (account.kind === 'provider') {
158
+ console.log(` provider: ${account.provider}`);
159
+ console.log(` auth: ${account.auth}`);
160
+ console.log(` credential: ${account.secretPresent ? 'present on this device' : 'missing on this device'}`);
161
+ }
162
+ else {
163
+ console.log(` identity: ${account.identityLabel ?? account.identityKey}`);
164
+ console.log(` scope: ${account.scope}`);
165
+ }
166
+ console.log(` attached: ${account.attached.length ? account.attached.join(', ') : 'none'}`);
167
+ });
168
+ accounts.command('name <source> <name>')
169
+ .description('Name a signed-in native installation without copying its OAuth credentials')
170
+ .action(async (source, name) => {
171
+ const identity = await nativeIdentityFromSource(source);
172
+ const account = addNativeAccount(name, identity.agent, identity.identityKey, identity.identityLabel, identity.scope);
173
+ console.log(chalk.green(`Named ${source} as ${account.name}.`));
174
+ if (account.scope === 'device')
175
+ console.log(chalk.gray(`${identity.agent} authentication is device-scoped; attach '${account.name}' to '${identity.agent}', not an individual version.`));
176
+ });
177
+ accounts.command('attach <account> <target>')
178
+ .description('Attach a named account to a native installation or custom harness')
179
+ .action(async (name, target) => {
180
+ const meta = readMeta();
181
+ const account = findUnifiedAccount(name, meta);
182
+ if (!account)
183
+ throw new Error(`Unknown account '${name}'.`);
184
+ // Validate the target exists before mutating any binding.
185
+ const t = classifyAttachTarget(target);
186
+ const targetAgent = t.kind === 'profile' ? t.profile.host.agent : t.agent;
187
+ if (account.kind === 'native') {
188
+ // A provider-backed profile injects provider env at spawn, which would run
189
+ // under a different credential than the native identity claims — refuse it.
190
+ if (t.kind === 'profile' && t.profile.provider) {
191
+ throw new Error(`Custom harness '${target}' is provider-backed (${t.profile.provider}); it cannot host the native login account '${account.name}'. Attach a matching provider account instead.`);
192
+ }
193
+ if (targetAgent !== account.agent)
194
+ throw new Error(`Account '${account.name}' is a ${account.agent} login; '${target}' runs ${targetAgent}.`);
195
+ if (account.scope === 'device') {
196
+ if (t.kind !== 'device-agent')
197
+ throw new Error(`${account.agent} authentication is device-scoped. Attach it with 'agents accounts attach ${account.name} ${account.agent}'.`);
198
+ }
199
+ else {
200
+ if (t.kind !== 'installation')
201
+ throw new Error(`${account.agent} authentication is per-version. Attach '${account.name}' to a specific ${account.agent}@<version>.`);
202
+ const identity = await nativeIdentityFromSource(target);
203
+ if (identity.identityKey !== account.identityKey)
204
+ throw new Error(`'${target}' is signed in to a different identity than account '${account.name}'.`);
205
+ }
206
+ }
207
+ else {
208
+ // Provider account: it must be able to authenticate the target's harness.
209
+ getAccountProvider(account.provider).envFor(targetAgent, account.auth);
210
+ }
211
+ bindAccount(name, target);
212
+ console.log(chalk.green(`Attached ${account.name} to ${target}.`));
213
+ });
214
+ accounts.command('detach <account> <target>')
215
+ .description('Remove one account attachment')
216
+ .action((name, target) => {
217
+ unbindAccount(name, target);
218
+ console.log(chalk.green(`Detached ${name} from ${target}.`));
97
219
  });
98
220
  accounts.command('rename <old> <new>').description('Rename an account without changing its stable id').action((oldName, newName) => renameAccount(oldName, newName));
99
221
  accounts.command('remove <name>').description('Remove an account and its device-local credential').action((name) => removeAccount(name));
@@ -124,22 +246,58 @@ export function registerAccountsCommand(program) {
124
246
  });
125
247
  console.log(chalk.green(`Cleared the default account for ${agentRaw}.`));
126
248
  });
127
- accounts.command('sync <name>')
249
+ accounts.command('logout <target>')
250
+ .description('Sign out a harness-native OAuth login. API-key / setup-token / bearer accounts use `accounts remove` instead.')
251
+ .action(async (target) => {
252
+ const provider = findAccount(target);
253
+ if (provider) {
254
+ throw new Error(`Account '${provider.name}' uses ${provider.auth}, not OAuth. Remove it with: agents accounts remove ${provider.name}`);
255
+ }
256
+ const agentRaw = target.split('@')[0];
257
+ if (!ALL_AGENT_IDS.includes(agentRaw)) {
258
+ throw new Error(`Unknown target '${target}'. Pass a native harness (claude, codex, …) or a provider account name. Provider API-key accounts use \`agents accounts remove\`.`);
259
+ }
260
+ const agent = agentRaw;
261
+ const { spawnSync } = await import('child_process');
262
+ const { getBinaryPath, getGlobalDefault, getVersionHomePath, listInstalledVersions } = await import('../lib/installations/versions.js');
263
+ const installed = listInstalledVersions(agent);
264
+ const version = getGlobalDefault(agent) ?? installed[installed.length - 1];
265
+ if (!version)
266
+ throw new Error(`No installed version of ${agent}. Install one with: agents add ${agent}`);
267
+ const bin = getBinaryPath(agent, version);
268
+ const home = getVersionHomePath(agent, version);
269
+ const result = spawnSync(bin, ['logout'], {
270
+ env: { ...process.env, HOME: home },
271
+ stdio: 'inherit',
272
+ });
273
+ if (result.error)
274
+ throw result.error;
275
+ if ((result.status ?? 1) !== 0) {
276
+ throw new Error(`${agent} logout exited ${result.status ?? 'null'}. If this harness has no logout verb, sign out from its own UI.`);
277
+ }
278
+ console.log(chalk.green(`Signed out native ${agent} login (${version}).`));
279
+ });
280
+ accounts.command('sync <name> [device]')
128
281
  .description('Copy one provider account bundle to a worker device')
129
- .requiredOption('--device <device>', 'Destination device or SSH host')
282
+ .option('--device <device>', 'Deprecated destination form; use the positional device')
130
283
  .option('--force', 'Replace matching keys on the destination')
131
- .action((name, o) => {
284
+ .action(async (name, deviceArg, o) => {
285
+ const device = deviceArg ?? o.device;
286
+ if (!device)
287
+ throw new Error('Missing destination device. Usage: agents accounts sync <account> <device>.');
132
288
  const account = findAccount(name);
133
289
  if (!account)
134
290
  throw new Error(`Unknown provider account '${name}'.`);
135
- const remoteBackend = resolveRemoteOsSync(o.device) === 'win32' ? 'keychain' : 'file';
291
+ const sshTarget = await resolveHostSshTarget(device);
292
+ assertCredentialTransportHostPinned(sshTarget);
293
+ const remoteBackend = resolveRemoteOsSync(device) === 'win32' ? 'keychain' : 'file';
136
294
  const literalValues = {
137
295
  ACCOUNT_ID: account.id,
138
296
  PROVIDER: account.provider,
139
297
  AUTH_TYPE: account.auth,
140
298
  ...(account.baseUrl ? { BASE_URL: account.baseUrl } : {}),
141
299
  };
142
- const result = pushBundleToHost(account.name, o.device, {
300
+ const result = pushBundleToHost(account.name, device, {
143
301
  remoteBackend,
144
302
  force: o.force,
145
303
  operation: 'accounts sync',
@@ -148,17 +306,20 @@ export function registerAccountsCommand(program) {
148
306
  literalValues,
149
307
  });
150
308
  if (!result.ok)
151
- throw new Error(`${result.message}\nRetry: agents accounts sync ${account.name} --device ${o.device}${o.force ? ' --force' : ''}`);
152
- console.log(chalk.green(`${account.name} synced to ${o.device} (${result.keyCount} keys, ${remoteBackend} backend, policy never).`));
309
+ throw new Error(`${result.message}\nRetry: agents accounts sync ${account.name} ${device}${o.force ? ' --force' : ''}`);
310
+ console.log(chalk.green(`${account.name} synced to ${device} (${result.keyCount} keys, ${remoteBackend} backend, policy never).`));
153
311
  });
154
312
  setHelpSections(accounts, {
155
313
  examples: `agents accounts add work --provider anthropic --auth setup-token
156
314
  agents accounts add openrouter-work --provider openrouter --auth api-key --from-secrets openrouter.ai:OPENROUTER_API_KEY
157
315
  agents accounts set-key work
158
- agents accounts inspect work --json
316
+ agents accounts name claude@2.1.220 work
317
+ agents accounts attach work claude@2.1.225
318
+ agents accounts view work --json
159
319
  agents accounts set-default claude work
160
- agents accounts sync work --device yosemite-s0
161
- agents run claude --account work`,
162
- notes: 'Provider accounts are durable credentials independent of agent versions. Harness-native auth remains managed by each harness and is not copied or renamed by agents-cli.',
320
+ agents accounts sync openrouter-work yosemite-s0
321
+ agents run claude --account work
322
+ agents accounts logout claude`,
323
+ notes: 'Native account records contain metadata only; harness-owned OAuth credentials are never copied. Provider accounts are explicit portable bundles with policy never. Harness-native OAuth sign-out is `agents accounts logout <harness>` (API-key accounts use `accounts remove`). Synced vault unlock is `agents secrets vault unlock`.',
163
324
  });
164
325
  }
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * `agents apply` (alias `ag apply`) — reconcile the whole fleet to a declared
3
- * profile in one command: install agents-cli + agents, sync config, and
4
- * propagate login so a machine that's signed in once seeds every device. Kills
5
- * the "6 hosts x ~8 harnesses = ~48 OAuth flows" slog.
3
+ * profile in one command: install agents-cli + agents and sync config. Native
4
+ * harness logins remain device-local; portable provider credentials move only
5
+ * through explicit `agents accounts sync`.
6
6
  *
7
7
  * The manifest is the `fleet:` block of any `-f` file (default `agents.yaml`).
8
8
  */
@@ -1,16 +1,14 @@
1
1
  /**
2
2
  * `agents apply` (alias `ag apply`) — reconcile the whole fleet to a declared
3
- * profile in one command: install agents-cli + agents, sync config, and
4
- * propagate login so a machine that's signed in once seeds every device. Kills
5
- * the "6 hosts x ~8 harnesses = ~48 OAuth flows" slog.
3
+ * profile in one command: install agents-cli + agents and sync config. Native
4
+ * harness logins remain device-local; portable provider credentials move only
5
+ * through explicit `agents accounts sync`.
6
6
  *
7
7
  * The manifest is the `fleet:` block of any `-f` file (default `agents.yaml`).
8
8
  */
9
9
  import * as fs from 'fs';
10
- import * as os from 'os';
11
10
  import * as path from 'path';
12
11
  import { fileURLToPath } from 'url';
13
- import { Option } from 'commander';
14
12
  import chalk from 'chalk';
15
13
  import { setHelpSections } from '../lib/help.js';
16
14
  import { machineId } from '../lib/session/sync/config.js';
@@ -18,9 +16,9 @@ import { loadDevices, isControlDevice } from '../lib/devices/registry.js';
18
16
  import { isHostPinned, managedKnownHostsPath } from '../lib/devices/known-hosts.js';
19
17
  import { ensureDevicesRegistered } from '../lib/devices/sync.js';
20
18
  import { readFleetFile, resolveDesired } from '../lib/fleet/manifest.js';
21
- import { snapshotAuth, materializeAuth, parseAuthBundle, KEYCHAIN_BOUND_ON_MAC, isCredentialSafeToPropagate } from '../lib/fleet/auth-sync.js';
19
+ import { snapshotAuth } from '../lib/fleet/auth-sync.js';
22
20
  import { agentIdOf, diffFleet, probeDevice, runFleetApply, pool, sourceHome, expandAllSpecs, rosterNeedsVersions, } from '../lib/fleet/apply.js';
23
- import { listInstalledVersions } from '../lib/versions.js';
21
+ import { listInstalledVersions } from '../lib/installations/versions.js';
24
22
  /** Version of the running agents-cli — the fleet target version. */
25
23
  function localCliVersion() {
26
24
  try {
@@ -32,23 +30,6 @@ function localCliVersion() {
32
30
  return '';
33
31
  }
34
32
  }
35
- async function readStdin() {
36
- const chunks = [];
37
- for await (const c of process.stdin)
38
- chunks.push(c);
39
- return Buffer.concat(chunks).toString('utf-8');
40
- }
41
- /** Hidden path: receive an auth bundle on stdin and materialize it locally. */
42
- async function runRecvAuth() {
43
- const raw = await readStdin();
44
- const bundle = parseAuthBundle(raw);
45
- const res = materializeAuth(bundle, { home: os.homedir() });
46
- if (res.errors.length > 0) {
47
- console.error(`recv-auth: ${res.errors.length} error(s): ${res.errors.join('; ')}`);
48
- process.exit(1);
49
- }
50
- console.log(`recv-auth: wrote login for ${res.written.join(', ') || '(nothing)'}`);
51
- }
52
33
  function confirm(question) {
53
34
  return new Promise((resolve) => {
54
35
  process.stdout.write(question);
@@ -64,7 +45,7 @@ function confirm(question) {
64
45
  const ONLY_KINDS = {
65
46
  agents: new Set(['install-cli', 'upgrade-cli', 'add-agent']),
66
47
  config: new Set(['sync-config']),
67
- login: new Set(['push-login', 'needs-login']),
48
+ login: new Set(['needs-login']),
68
49
  };
69
50
  /** Render the device x dimension matrix (cribbed from `doctor --devices`). */
70
51
  function renderPlan(plan) {
@@ -77,9 +58,8 @@ function renderPlan(plan) {
77
58
  if (acts.length === 0)
78
59
  return chalk.green(`ok ${okLabel}`);
79
60
  if (acts.some((a) => a.kind === 'needs-login')) {
80
- const push = acts.filter((a) => a.kind === 'push-login').length;
81
61
  const need = acts.filter((a) => a.kind === 'needs-login').length;
82
- return chalk.yellow(`${push} push · ${need} manual`);
62
+ return chalk.yellow(`${need} manual`);
83
63
  }
84
64
  return chalk.cyan('↑ ' + acts.map((a) => a.agent ?? a.kind.replace('-cli', '')).join(','));
85
65
  };
@@ -103,7 +83,7 @@ function renderPlan(plan) {
103
83
  const configCell = row.probe.reachable
104
84
  ? (row.actions.some((a) => a.kind === 'sync-config') ? chalk.cyan('↑ sync') : chalk.green('ok'))
105
85
  : chalk.gray('-');
106
- const loginCell = cell(row, ['push-login', 'needs-login'], `${row.desired.agents.length}/${row.desired.agents.length}`);
86
+ const loginCell = cell(row, ['needs-login'], `${row.desired.agents.length}/${row.desired.agents.length}`);
107
87
  const secretsCell = (() => {
108
88
  if (!anySecrets)
109
89
  return '';
@@ -131,31 +111,14 @@ function renderPlan(plan) {
131
111
  if (anySecrets && !rows.some((r) => r.actions.some((a) => a.kind === 'push-secret'))) {
132
112
  console.log(chalk.gray(' secrets: not pushed. `--provision-secrets` pushes declared bundles to devices whose host key is pinned.'));
133
113
  }
134
- // Distinguish *why* a login can't be propagated: macOS keychain-bound,
135
- // single-use rotating refresh token (never copied), or the source simply not
136
- // being signed in to that agent (no portable file).
137
- const bound = [];
138
- const rotating = [];
139
- const noToken = [];
140
- for (const r of rows) {
141
- for (const a of r.loginBlocked) {
142
- const tag = `${a}@${r.device}`;
143
- if (!isCredentialSafeToPropagate(a))
144
- rotating.push(tag);
145
- else if (r.probe.platform === 'macos' && KEYCHAIN_BOUND_ON_MAC.has(a))
146
- bound.push(tag);
147
- else
148
- noToken.push(tag);
149
- }
150
- }
151
- if (rotating.length > 0) {
152
- console.log(chalk.yellow(` manual login needed (single-use rotating refresh token): ${rotating.join(', ')}`));
153
- }
154
- if (bound.length > 0) {
155
- console.log(chalk.yellow(` manual login needed (macOS keychain-bound): ${bound.join(', ')}`));
156
- }
157
- if (noToken.length > 0) {
158
- console.log(chalk.yellow(` manual login needed (no portable token on source): ${noToken.join(', ')}`));
114
+ // `apply` no longer propagates ANY login (SING-1b: a native OAuth / session
115
+ // login is never copied between devices). Every login:sync agent that has a
116
+ // login to establish is surfaced here with the one honest reason + the portable
117
+ // alternative never a silent skip.
118
+ const needsLogin = [...new Set(rows.flatMap((r) => r.loginBlocked.map((a) => `${a}@${r.device}`)))];
119
+ if (needsLogin.length > 0) {
120
+ console.log(chalk.yellow(` manual login needed — a native OAuth login is never copied between devices (SING-1b); ` +
121
+ `log in on the box itself, or sync a portable provider account (\`agents accounts sync\`): ${needsLogin.join(', ')}`));
159
122
  }
160
123
  // Secrets bundles are declared once for the fleet; surface the distinct set the
161
124
  // gate did NOT push, so a refusal is never silent. "never pushed" used to be
@@ -260,8 +223,7 @@ async function runApply(opts) {
260
223
  secretsBundles: manifest.secrets?.bundles,
261
224
  provisionSecrets: opts.provisionSecrets === true,
262
225
  forceSecrets: opts.force === true,
263
- // Same bar as `exec --copy-creds` (EXEC-34): credential values only ever go
264
- // to a host whose key we already pinned.
226
+ // Portable secret values only ever go to a host whose key is already pinned.
265
227
  isHostPinned: (device) => isHostPinned(device, managedKnownHostsPath()),
266
228
  });
267
229
  // --only filter.
@@ -334,7 +296,7 @@ function reportResults(results) {
334
296
  */
335
297
  export function configureApplyCommand(cmd) {
336
298
  return cmd
337
- .description('Reconcile the fleet to a declared profile: install agents, sync config, propagate login.')
299
+ .description('Reconcile the fleet to a declared profile: install agents and sync config.')
338
300
  .option('-f, --file <path>', 'Manifest file carrying a fleet: block (default: agents.yaml)')
339
301
  .option('--plan', 'Show the reconcile plan and exit (no changes)')
340
302
  .option('--dry-run', 'Alias for --plan')
@@ -342,16 +304,11 @@ export function configureApplyCommand(cmd) {
342
304
  .option('--device <name>', 'Scope the apply to a single device')
343
305
  .option('--agent <specs...>', 'Override the roster for targeted device(s): install these specs instead of the manifest\'s. Use `claude@all` to replicate every version installed on this machine.')
344
306
  .option('--only <dims>', 'Limit to dimensions: comma list of agents,config,login')
345
- .option('--no-login', 'Do not propagate logins')
307
+ .option('--no-login', 'Deprecated no-op: native logins are always device-local')
346
308
  .option('--provision-secrets', "Push the manifest's declared secrets bundles to each device (OFF by default; moves credential values over SSH, and only to a device whose host key is already pinned)")
347
309
  .option('--force', 'With --provision-secrets: re-push a bundle the device already has')
348
- .addOption(new Option('--recv-auth', 'internal: receive an auth bundle on stdin').hideHelp())
349
310
  .action(async (opts) => {
350
311
  try {
351
- if (opts.recvAuth) {
352
- await runRecvAuth();
353
- return;
354
- }
355
312
  await runApply(opts);
356
313
  }
357
314
  catch (e) {
@@ -367,7 +324,7 @@ export function registerApplyCommand(program) {
367
324
  # Preview what would change across the fleet
368
325
  agents apply --plan -f agents.yaml
369
326
 
370
- # Bring every device to the profile (installs, syncs, propagates login)
327
+ # Bring every device to the profile (installs + config sync; native login stays local)
371
328
  ag apply -f agents.yaml
372
329
 
373
330
  # One device only
@@ -1,3 +1,18 @@
1
1
  import { Command } from 'commander';
2
+ import { type BrowserProfile } from '../lib/browser/profiles.js';
3
+ import { listInstalledBrowsers } from '../lib/browser/chrome.js';
2
4
  export declare function registerBrowserCommand(program: Command): void;
3
5
  export declare function registerBrowserSubcommands(program: Command): void;
6
+ interface BrowserUseOptions {
7
+ unset?: boolean;
8
+ }
9
+ interface BrowserUseChoice {
10
+ name: string;
11
+ value: {
12
+ name: string;
13
+ installed?: ReturnType<typeof listInstalledBrowsers>[number];
14
+ };
15
+ }
16
+ export declare function buildBrowserUseChoices(profiles: BrowserProfile[], installed: ReturnType<typeof listInstalledBrowsers>, current?: string): BrowserUseChoice[];
17
+ export declare function runBrowserUse(name: string | undefined, opts: BrowserUseOptions, interactive?: boolean): Promise<boolean>;
18
+ export {};