@phnx-labs/agents-cli 1.22.34 → 1.22.37

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 (493) hide show
  1. package/CHANGELOG.md +672 -2
  2. package/README.md +82 -35
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.d.ts +15 -0
  5. package/dist/bootstrap.js +1211 -0
  6. package/dist/commands/accounts.d.ts +4 -11
  7. package/dist/commands/accounts.js +159 -27
  8. package/dist/commands/attach.js +17 -4
  9. package/dist/commands/audit.d.ts +8 -8
  10. package/dist/commands/audit.js +57 -47
  11. package/dist/commands/browser.js +15 -11
  12. package/dist/commands/cloud.js +1 -1
  13. package/dist/commands/commands.js +0 -11
  14. package/dist/commands/computer-actions.js +33 -0
  15. package/dist/commands/computer-sessions-picker.d.ts +21 -0
  16. package/dist/commands/computer-sessions-picker.js +141 -0
  17. package/dist/commands/computer.d.ts +16 -0
  18. package/dist/commands/computer.js +37 -0
  19. package/dist/commands/config.d.ts +17 -0
  20. package/dist/commands/config.js +401 -0
  21. package/dist/commands/cp.d.ts +84 -0
  22. package/dist/commands/cp.js +231 -0
  23. package/dist/commands/daemon.js +243 -14
  24. package/dist/commands/detach-core.d.ts +1 -1
  25. package/dist/commands/detach-core.js +12 -2
  26. package/dist/commands/detach.js +1 -1
  27. package/dist/commands/doctor.js +64 -5
  28. package/dist/commands/events.d.ts +24 -12
  29. package/dist/commands/events.js +144 -28
  30. package/dist/commands/exec.js +85 -41
  31. package/dist/commands/feed.d.ts +1 -1
  32. package/dist/commands/feed.js +16 -8
  33. package/dist/commands/focus.d.ts +33 -1
  34. package/dist/commands/focus.js +177 -17
  35. package/dist/commands/funnel.d.ts +1 -1
  36. package/dist/commands/go.js +9 -8
  37. package/dist/commands/harness-wizard.d.ts +1 -0
  38. package/dist/commands/harness-wizard.js +18 -20
  39. package/dist/commands/harness.d.ts +2 -0
  40. package/dist/commands/harness.js +59 -26
  41. package/dist/commands/hooks.js +0 -11
  42. package/dist/commands/inspect.d.ts +94 -1
  43. package/dist/commands/inspect.js +866 -40
  44. package/dist/commands/lease.d.ts +4 -4
  45. package/dist/commands/lease.js +6 -6
  46. package/dist/commands/login.js +0 -13
  47. package/dist/commands/logs.d.ts +2 -2
  48. package/dist/commands/logs.js +2 -2
  49. package/dist/commands/mcp.js +7 -2
  50. package/dist/commands/memory.js +7 -2
  51. package/dist/commands/message.d.ts +1 -1
  52. package/dist/commands/message.js +37 -6
  53. package/dist/commands/models.js +4 -0
  54. package/dist/commands/monitors.d.ts +0 -1
  55. package/dist/commands/monitors.js +199 -16
  56. package/dist/commands/open.d.ts +18 -0
  57. package/dist/commands/open.js +57 -0
  58. package/dist/commands/packages.js +2 -107
  59. package/dist/commands/plugins.js +6 -3
  60. package/dist/commands/profiles.d.ts +1 -0
  61. package/dist/commands/profiles.js +16 -160
  62. package/dist/commands/projects.d.ts +28 -0
  63. package/dist/commands/projects.js +125 -5
  64. package/dist/commands/reconnect.js +9 -3
  65. package/dist/commands/repo.js +42 -1
  66. package/dist/commands/resource-view.d.ts +17 -0
  67. package/dist/commands/resource-view.js +36 -14
  68. package/dist/commands/resume.js +9 -2
  69. package/dist/commands/routines.d.ts +0 -2
  70. package/dist/commands/routines.js +473 -289
  71. package/dist/commands/secrets.js +52 -9
  72. package/dist/commands/sessions-export.d.ts +47 -0
  73. package/dist/commands/sessions-export.js +116 -6
  74. package/dist/commands/sessions-import.d.ts +17 -0
  75. package/dist/commands/sessions-import.js +114 -6
  76. package/dist/commands/sessions-migrate.d.ts +27 -0
  77. package/dist/commands/sessions-migrate.js +50 -9
  78. package/dist/commands/sessions-picker.js +23 -4
  79. package/dist/commands/sessions-resume.d.ts +5 -3
  80. package/dist/commands/sessions-resume.js +30 -8
  81. package/dist/commands/sessions-watch.d.ts +2 -0
  82. package/dist/commands/sessions-watch.js +53 -0
  83. package/dist/commands/sessions.d.ts +66 -3
  84. package/dist/commands/sessions.js +298 -47
  85. package/dist/commands/set.d.ts +1 -1
  86. package/dist/commands/set.js +2 -2
  87. package/dist/commands/setup-browser.js +2 -2
  88. package/dist/commands/setup-mine.js +0 -1
  89. package/dist/commands/setup-preferences.js +1 -1
  90. package/dist/commands/setup-share.js +34 -4
  91. package/dist/commands/setup.d.ts +5 -0
  92. package/dist/commands/setup.js +26 -0
  93. package/dist/commands/share.d.ts +85 -0
  94. package/dist/commands/share.js +379 -8
  95. package/dist/commands/skills.js +0 -11
  96. package/dist/commands/snapshot.js +1 -1
  97. package/dist/commands/ssh.d.ts +18 -0
  98. package/dist/commands/ssh.js +549 -210
  99. package/dist/commands/sync.d.ts +5 -0
  100. package/dist/commands/sync.js +212 -32
  101. package/dist/commands/teams.d.ts +13 -0
  102. package/dist/commands/teams.js +187 -30
  103. package/dist/commands/tickets.d.ts +2 -0
  104. package/dist/commands/tickets.js +43 -0
  105. package/dist/commands/update.js +2 -4
  106. package/dist/commands/usage.js +5 -3
  107. package/dist/commands/versions.js +11 -5
  108. package/dist/commands/view.js +15 -7
  109. package/dist/commands/webhook.d.ts +2 -2
  110. package/dist/commands/webhook.js +7 -7
  111. package/dist/index.d.ts +18 -2
  112. package/dist/index.js +53 -1264
  113. package/dist/lib/account-catalog.d.ts +18 -0
  114. package/dist/lib/account-catalog.js +38 -0
  115. package/dist/lib/account-provider-registry.d.ts +18 -0
  116. package/dist/lib/account-provider-registry.js +59 -0
  117. package/dist/lib/account-registry.d.ts +40 -0
  118. package/dist/lib/account-registry.js +239 -0
  119. package/dist/lib/account-schema.d.ts +44 -0
  120. package/dist/lib/account-schema.js +91 -0
  121. package/dist/lib/account-state-service.d.ts +21 -0
  122. package/dist/lib/account-state-service.js +60 -0
  123. package/dist/lib/activity.d.ts +1 -1
  124. package/dist/lib/activity.js +8 -1
  125. package/dist/lib/add-dir.d.ts +80 -0
  126. package/dist/lib/add-dir.js +241 -0
  127. package/dist/lib/agent-cli-commands.d.ts +11 -0
  128. package/dist/lib/agent-cli-commands.js +30 -0
  129. package/dist/lib/agents.js +44 -36
  130. package/dist/lib/answer-router.js +1 -1
  131. package/dist/lib/audit/log.d.ts +10 -27
  132. package/dist/lib/audit/log.js +20 -33
  133. package/dist/lib/auth-health.d.ts +9 -2
  134. package/dist/lib/auth-health.js +42 -9
  135. package/dist/lib/auto-pull-worker.js +7 -3
  136. package/dist/lib/auto-pull.d.ts +44 -3
  137. package/dist/lib/auto-pull.js +88 -5
  138. package/dist/lib/binary-shadow.d.ts +28 -0
  139. package/dist/lib/binary-shadow.js +121 -0
  140. package/dist/lib/brand.js +9 -3
  141. package/dist/lib/browser/ipc.d.ts +30 -0
  142. package/dist/lib/browser/ipc.js +81 -4
  143. package/dist/lib/browser/profiles.d.ts +3 -2
  144. package/dist/lib/browser/profiles.js +65 -22
  145. package/dist/lib/browser/service.d.ts +4 -0
  146. package/dist/lib/browser/service.js +30 -3
  147. package/dist/lib/browser/sessions-list.d.ts +22 -2
  148. package/dist/lib/browser/sessions-list.js +54 -6
  149. package/dist/lib/browser/stream.d.ts +2 -0
  150. package/dist/lib/browser/stream.js +1 -0
  151. package/dist/lib/browser/types.d.ts +19 -0
  152. package/dist/lib/byok-usage.d.ts +9 -2
  153. package/dist/lib/byok-usage.js +133 -31
  154. package/dist/lib/cli-entry.d.ts +11 -0
  155. package/dist/lib/cli-entry.js +46 -0
  156. package/dist/lib/cloud/host.d.ts +1 -1
  157. package/dist/lib/cloud/host.js +2 -2
  158. package/dist/lib/cloud/registry.js +1 -1
  159. package/dist/lib/cloud/types.d.ts +1 -1
  160. package/dist/lib/codex-policy.d.ts +9 -1
  161. package/dist/lib/codex-policy.js +17 -2
  162. package/dist/lib/commands.d.ts +2 -0
  163. package/dist/lib/commands.js +2 -0
  164. package/dist/lib/computer/sessions-list.d.ts +150 -0
  165. package/dist/lib/computer/sessions-list.js +363 -0
  166. package/dist/lib/config-keys.d.ts +86 -0
  167. package/dist/lib/config-keys.js +193 -0
  168. package/dist/lib/config-machine-keys.d.ts +12 -0
  169. package/dist/lib/config-machine-keys.js +17 -0
  170. package/dist/lib/config-transfer.js +3 -4
  171. package/dist/lib/crabbox/cli.d.ts +2 -2
  172. package/dist/lib/crabbox/cli.js +3 -3
  173. package/dist/lib/daemon-health.d.ts +22 -0
  174. package/dist/lib/daemon-health.js +33 -3
  175. package/dist/lib/daemon-services.d.ts +50 -0
  176. package/dist/lib/daemon-services.js +147 -0
  177. package/dist/lib/daemon-ticks.d.ts +35 -66
  178. package/dist/lib/daemon-ticks.js +77 -159
  179. package/dist/lib/daemon.d.ts +72 -4
  180. package/dist/lib/daemon.js +792 -202
  181. package/dist/lib/deeplink/register.d.ts +49 -0
  182. package/dist/lib/deeplink/register.js +253 -0
  183. package/dist/lib/deeplink/url.d.ts +34 -0
  184. package/dist/lib/deeplink/url.js +78 -0
  185. package/dist/lib/device-config.d.ts +124 -29
  186. package/dist/lib/device-config.js +346 -141
  187. package/dist/lib/devices/config-migration.d.ts +42 -0
  188. package/dist/lib/devices/config-migration.js +203 -0
  189. package/dist/lib/devices/connect.js +14 -7
  190. package/dist/lib/devices/doctor-findings.d.ts +4 -1
  191. package/dist/lib/devices/doctor-findings.js +20 -1
  192. package/dist/lib/devices/harness-inventory.d.ts +11 -2
  193. package/dist/lib/devices/harness-inventory.js +0 -0
  194. package/dist/lib/devices/health.d.ts +1 -1
  195. package/dist/lib/devices/health.js +1 -1
  196. package/dist/lib/devices/pending.d.ts +22 -1
  197. package/dist/lib/devices/pending.js +67 -2
  198. package/dist/lib/devices/registry.d.ts +0 -25
  199. package/dist/lib/devices/registry.js +2 -83
  200. package/dist/lib/devices/resolve-profile.d.ts +20 -0
  201. package/dist/lib/devices/resolve-profile.js +44 -0
  202. package/dist/lib/devices/rollout-verify.d.ts +101 -0
  203. package/dist/lib/devices/rollout-verify.js +193 -0
  204. package/dist/lib/devices/ssh-config.js +10 -6
  205. package/dist/lib/event-families.d.ts +28 -0
  206. package/dist/lib/event-families.js +159 -0
  207. package/dist/lib/event-stream.d.ts +9 -1
  208. package/dist/lib/event-stream.js +26 -9
  209. package/dist/lib/events.d.ts +9 -1
  210. package/dist/lib/events.js +21 -6
  211. package/dist/lib/exec.d.ts +30 -0
  212. package/dist/lib/exec.js +220 -122
  213. package/dist/lib/feed-broadcast.d.ts +25 -0
  214. package/dist/lib/feed-broadcast.js +33 -0
  215. package/dist/lib/feed.d.ts +1 -1
  216. package/dist/lib/feed.js +12 -2
  217. package/dist/lib/fleet/capture.js +15 -0
  218. package/dist/lib/fleet/manifest.js +9 -0
  219. package/dist/lib/fleet/types.d.ts +9 -0
  220. package/dist/lib/fleet-status.js +10 -8
  221. package/dist/lib/git.d.ts +20 -6
  222. package/dist/lib/git.js +121 -17
  223. package/dist/lib/hosts/dispatch.d.ts +8 -3
  224. package/dist/lib/hosts/dispatch.js +29 -3
  225. package/dist/lib/hosts/logs.d.ts +2 -2
  226. package/dist/lib/hosts/logs.js +2 -2
  227. package/dist/lib/hosts/option.js +1 -1
  228. package/dist/lib/hosts/passthrough.d.ts +2 -3
  229. package/dist/lib/hosts/passthrough.js +10 -24
  230. package/dist/lib/hosts/progress.js +2 -2
  231. package/dist/lib/hosts/providers/devices.d.ts +3 -3
  232. package/dist/lib/hosts/providers/devices.js +18 -12
  233. package/dist/lib/hosts/ready.d.ts +5 -1
  234. package/dist/lib/hosts/ready.js +9 -3
  235. package/dist/lib/hosts/reconcile.d.ts +2 -2
  236. package/dist/lib/hosts/reconcile.js +2 -2
  237. package/dist/lib/hosts/registry.js +14 -9
  238. package/dist/lib/hosts/remote-cmd.js +1 -1
  239. package/dist/lib/hosts/remote-os.d.ts +9 -6
  240. package/dist/lib/hosts/remote-os.js +13 -6
  241. package/dist/lib/hosts/routing-flag.d.ts +23 -0
  242. package/dist/lib/hosts/routing-flag.js +41 -0
  243. package/dist/lib/hosts/run-target.js +1 -1
  244. package/dist/lib/hosts/session-index.js +1 -1
  245. package/dist/lib/hosts/tasks.d.ts +6 -6
  246. package/dist/lib/hosts/tasks.js +4 -4
  247. package/dist/lib/hosts/types.js +1 -2
  248. package/dist/lib/installations/resolve.js +2 -8
  249. package/dist/lib/isolation-boundary-report.js +0 -1
  250. package/dist/lib/linear-cache.d.ts +7 -0
  251. package/dist/lib/linear-cache.js +31 -4
  252. package/dist/lib/linear-project-counts.d.ts +1 -1
  253. package/dist/lib/linear-project-counts.js +2 -3
  254. package/dist/lib/linear-projects.js +1 -1
  255. package/dist/lib/loop.d.ts +2 -2
  256. package/dist/lib/loop.js +1 -1
  257. package/dist/lib/mailbox-target.d.ts +1 -1
  258. package/dist/lib/mailbox-target.js +1 -1
  259. package/dist/lib/manifest.js +7 -4
  260. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  261. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  262. package/dist/lib/menubar/snapshot.d.ts +3 -2
  263. package/dist/lib/menubar/snapshot.js +6 -2
  264. package/dist/lib/migrate-fold.d.ts +33 -0
  265. package/dist/lib/migrate-fold.js +130 -0
  266. package/dist/lib/migrate.d.ts +34 -34
  267. package/dist/lib/migrate.js +106 -128
  268. package/dist/lib/model-tier-overrides.d.ts +1 -1
  269. package/dist/lib/model-tier-overrides.js +15 -2
  270. package/dist/lib/monitors/config.d.ts +17 -3
  271. package/dist/lib/monitors/config.js +52 -18
  272. package/dist/lib/monitors/engine.d.ts +32 -1
  273. package/dist/lib/monitors/engine.js +94 -11
  274. package/dist/lib/monitors/fingerprint.d.ts +46 -0
  275. package/dist/lib/monitors/fingerprint.js +100 -0
  276. package/dist/lib/monitors/remote.d.ts +47 -0
  277. package/dist/lib/monitors/remote.js +81 -0
  278. package/dist/lib/monitors/state.d.ts +39 -0
  279. package/dist/lib/monitors/state.js +56 -0
  280. package/dist/lib/onepassword.d.ts +17 -0
  281. package/dist/lib/onepassword.js +52 -22
  282. package/dist/lib/open-url.js +1 -1
  283. package/dist/lib/picker.d.ts +14 -2
  284. package/dist/lib/picker.js +35 -13
  285. package/dist/lib/placement.d.ts +1 -1
  286. package/dist/lib/placement.js +1 -1
  287. package/dist/lib/pr-land-detach.d.ts +32 -0
  288. package/dist/lib/pr-land-detach.js +79 -0
  289. package/dist/lib/profiles-presets.js +13 -0
  290. package/dist/lib/profiles.d.ts +2 -0
  291. package/dist/lib/profiles.js +44 -1
  292. package/dist/lib/project-focus.d.ts +1 -1
  293. package/dist/lib/project-focus.js +1 -1
  294. package/dist/lib/project-key.d.ts +17 -0
  295. package/dist/lib/project-key.js +26 -0
  296. package/dist/lib/project-probe.d.ts +4 -1
  297. package/dist/lib/project-probe.js +5 -4
  298. package/dist/lib/project-resources.js +2 -18
  299. package/dist/lib/project-root.d.ts +16 -0
  300. package/dist/lib/project-root.js +20 -2
  301. package/dist/lib/projects.d.ts +20 -1
  302. package/dist/lib/projects.js +78 -1
  303. package/dist/lib/refresh-coordinator.d.ts +24 -0
  304. package/dist/lib/refresh-coordinator.js +52 -0
  305. package/dist/lib/registry.d.ts +2 -2
  306. package/dist/lib/registry.js +1 -1
  307. package/dist/lib/resource-aliases.d.ts +13 -0
  308. package/dist/lib/resource-aliases.js +26 -0
  309. package/dist/lib/resources/types.d.ts +1 -1
  310. package/dist/lib/resources.d.ts +16 -0
  311. package/dist/lib/resources.js +66 -10
  312. package/dist/lib/rotate.d.ts +3 -4
  313. package/dist/lib/rotate.js +4 -5
  314. package/dist/lib/routine-activation.d.ts +22 -2
  315. package/dist/lib/routine-activation.js +63 -16
  316. package/dist/lib/routine-context.d.ts +9 -2
  317. package/dist/lib/routine-context.js +21 -6
  318. package/dist/lib/routines-project.d.ts +58 -48
  319. package/dist/lib/routines-project.js +190 -159
  320. package/dist/lib/routines.d.ts +41 -6
  321. package/dist/lib/routines.js +92 -34
  322. package/dist/lib/run-defaults.d.ts +5 -0
  323. package/dist/lib/run-defaults.js +11 -1
  324. package/dist/lib/runner.d.ts +10 -8
  325. package/dist/lib/runner.js +122 -39
  326. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  327. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  328. package/dist/lib/secrets/agent.d.ts +10 -3
  329. package/dist/lib/secrets/agent.js +43 -8
  330. package/dist/lib/secrets/bundles.d.ts +1 -0
  331. package/dist/lib/secrets/bundles.js +92 -80
  332. package/dist/lib/secrets/index.js +32 -9
  333. package/dist/lib/secrets/install-helper.d.ts +4 -4
  334. package/dist/lib/secrets/install-helper.js +4 -4
  335. package/dist/lib/secrets/push.d.ts +40 -6
  336. package/dist/lib/secrets/push.js +58 -11
  337. package/dist/lib/secrets/read-backoff.d.ts +1 -1
  338. package/dist/lib/secrets/read-backoff.js +1 -1
  339. package/dist/lib/secrets/remote.d.ts +24 -0
  340. package/dist/lib/secrets/remote.js +54 -4
  341. package/dist/lib/self-update.d.ts +108 -0
  342. package/dist/lib/self-update.js +276 -1
  343. package/dist/lib/session/active.d.ts +89 -5
  344. package/dist/lib/session/active.js +165 -10
  345. package/dist/lib/session/actor-sidecar.d.ts +1 -1
  346. package/dist/lib/session/actor-sidecar.js +2 -1
  347. package/dist/lib/session/db.d.ts +176 -2
  348. package/dist/lib/session/db.js +484 -17
  349. package/dist/lib/session/discover.js +27 -4
  350. package/dist/lib/session/hook-sessions.js +2 -2
  351. package/dist/lib/session/host-link.d.ts +2 -2
  352. package/dist/lib/session/host-link.js +2 -2
  353. package/dist/lib/session/pid-registry.d.ts +21 -0
  354. package/dist/lib/session/pid-registry.js +57 -0
  355. package/dist/lib/session/remote-active.js +15 -1
  356. package/dist/lib/session/remote.js +2 -2
  357. package/dist/lib/session/session-cache.d.ts +14 -7
  358. package/dist/lib/session/session-cache.js +51 -9
  359. package/dist/lib/session/state.d.ts +2 -2
  360. package/dist/lib/session/state.js +1 -1
  361. package/dist/lib/session/sync/config.d.ts +10 -10
  362. package/dist/lib/session/sync/config.js +10 -10
  363. package/dist/lib/session/sync/r2.d.ts +34 -0
  364. package/dist/lib/session/sync/r2.js +123 -0
  365. package/dist/lib/session/throughput.d.ts +1 -1
  366. package/dist/lib/session/throughput.js +1 -1
  367. package/dist/lib/session/types.d.ts +23 -1
  368. package/dist/lib/session/types.js +15 -0
  369. package/dist/lib/session/viewing-in.d.ts +1 -1
  370. package/dist/lib/session/viewing-in.js +1 -1
  371. package/dist/lib/session/watch.d.ts +101 -0
  372. package/dist/lib/session/watch.js +242 -0
  373. package/dist/lib/share/config.d.ts +4 -0
  374. package/dist/lib/share/config.js +1 -0
  375. package/dist/lib/share/delete.d.ts +93 -0
  376. package/dist/lib/share/delete.js +127 -0
  377. package/dist/lib/share/provision.d.ts +38 -0
  378. package/dist/lib/share/provision.js +50 -0
  379. package/dist/lib/share/publish.d.ts +40 -1
  380. package/dist/lib/share/publish.js +116 -3
  381. package/dist/lib/share/worker-template.js +71 -6
  382. package/dist/lib/shims.d.ts +17 -3
  383. package/dist/lib/shims.js +136 -27
  384. package/dist/lib/signin-badge.js +3 -2
  385. package/dist/lib/skills.js +2 -0
  386. package/dist/lib/smart-launch.d.ts +8 -8
  387. package/dist/lib/smart-launch.js +80 -59
  388. package/dist/lib/ssh-exec.d.ts +1 -1
  389. package/dist/lib/ssh-exec.js +1 -1
  390. package/dist/lib/staleness/prune.d.ts +88 -0
  391. package/dist/lib/staleness/prune.js +69 -0
  392. package/dist/lib/staleness/registry.d.ts +1 -1
  393. package/dist/lib/staleness/writers/commands.js +34 -2
  394. package/dist/lib/staleness/writers/hooks.js +16 -0
  395. package/dist/lib/staleness/writers/kinds.d.ts +6 -0
  396. package/dist/lib/staleness/writers/skills.js +19 -0
  397. package/dist/lib/staleness/writers/subagents.d.ts +2 -3
  398. package/dist/lib/staleness/writers/subagents.js +0 -4
  399. package/dist/lib/staleness/writers/types.d.ts +32 -0
  400. package/dist/lib/startup/command-registry.d.ts +6 -12
  401. package/dist/lib/startup/command-registry.js +14 -31
  402. package/dist/lib/startup/dev-build.d.ts +10 -0
  403. package/dist/lib/startup/dev-build.js +13 -1
  404. package/dist/lib/startup/spellcheck.d.ts +18 -0
  405. package/dist/lib/startup/spellcheck.js +45 -0
  406. package/dist/lib/state.d.ts +36 -9
  407. package/dist/lib/state.js +96 -46
  408. package/dist/lib/subagents-registry.d.ts +0 -7
  409. package/dist/lib/subagents-registry.js +38 -65
  410. package/dist/lib/subagents.d.ts +0 -33
  411. package/dist/lib/subagents.js +0 -75
  412. package/dist/lib/sync-umbrella.js +1 -1
  413. package/dist/lib/teams/agents.d.ts +41 -1
  414. package/dist/lib/teams/agents.js +187 -9
  415. package/dist/lib/teams/api.d.ts +11 -1
  416. package/dist/lib/teams/api.js +11 -2
  417. package/dist/lib/teams/delivery.d.ts +41 -0
  418. package/dist/lib/teams/delivery.js +60 -0
  419. package/dist/lib/teams/registry.d.ts +14 -0
  420. package/dist/lib/teams/registry.js +51 -1
  421. package/dist/lib/teams/remoteWorktree.d.ts +19 -0
  422. package/dist/lib/teams/remoteWorktree.js +29 -0
  423. package/dist/lib/teams/scheduler.d.ts +1 -1
  424. package/dist/lib/teams/scheduler.js +1 -1
  425. package/dist/lib/teams/worktree.d.ts +24 -0
  426. package/dist/lib/teams/worktree.js +42 -0
  427. package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
  428. package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
  429. package/dist/lib/terminal/engine.d.ts +4 -0
  430. package/dist/lib/terminal/engine.js +8 -2
  431. package/dist/lib/terminal/types.d.ts +21 -2
  432. package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
  433. package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
  434. package/dist/lib/tickets/list.d.ts +53 -0
  435. package/dist/lib/tickets/list.js +153 -0
  436. package/dist/lib/tmux/orphan-reap.d.ts +320 -0
  437. package/dist/lib/tmux/orphan-reap.js +644 -0
  438. package/dist/lib/tmux/session.d.ts +68 -3
  439. package/dist/lib/tmux/session.js +95 -5
  440. package/dist/lib/triggers/handlers.d.ts +20 -0
  441. package/dist/lib/triggers/handlers.js +6 -1
  442. package/dist/lib/types.d.ts +46 -34
  443. package/dist/lib/usage-fleet.d.ts +32 -0
  444. package/dist/lib/usage-fleet.js +125 -0
  445. package/dist/lib/usage-refresh.d.ts +3 -3
  446. package/dist/lib/usage-refresh.js +19 -16
  447. package/dist/lib/usage.d.ts +51 -47
  448. package/dist/lib/usage.js +145 -153
  449. package/dist/lib/version-duplicates.js +2 -2
  450. package/dist/lib/versions.d.ts +56 -13
  451. package/dist/lib/versions.js +195 -45
  452. package/dist/lib/watchdog/log.d.ts +1 -1
  453. package/dist/lib/watchdog/log.js +3 -3
  454. package/dist/lib/watchdog/rotate.d.ts +6 -6
  455. package/dist/lib/watchdog/rotate.js +6 -6
  456. package/dist/lib/workflows.d.ts +1 -1
  457. package/dist/lib/yaml-io.d.ts +47 -0
  458. package/dist/lib/yaml-io.js +55 -0
  459. package/package.json +2 -1
  460. package/scripts/install-helper.js +2 -2
  461. package/scripts/postinstall.js +23 -20
  462. package/dist/commands/defaults.d.ts +0 -7
  463. package/dist/commands/defaults.js +0 -107
  464. package/dist/commands/export.d.ts +0 -11
  465. package/dist/commands/export.js +0 -215
  466. package/dist/commands/helper.d.ts +0 -12
  467. package/dist/commands/helper.js +0 -87
  468. package/dist/commands/hosts.d.ts +0 -11
  469. package/dist/commands/hosts.js +0 -330
  470. package/dist/commands/lock.d.ts +0 -12
  471. package/dist/commands/lock.js +0 -70
  472. package/dist/commands/pull.d.ts +0 -17
  473. package/dist/commands/pull.js +0 -39
  474. package/dist/commands/push.d.ts +0 -14
  475. package/dist/commands/push.js +0 -30
  476. package/dist/commands/wallet.d.ts +0 -20
  477. package/dist/commands/wallet.js +0 -216
  478. package/dist/commands/worktree.d.ts +0 -19
  479. package/dist/commands/worktree.js +0 -272
  480. package/dist/lib/account-labels.d.ts +0 -24
  481. package/dist/lib/account-labels.js +0 -72
  482. package/dist/lib/auto-dispatch-linear.d.ts +0 -18
  483. package/dist/lib/auto-dispatch-linear.js +0 -107
  484. package/dist/lib/auto-dispatch-provider.d.ts +0 -10
  485. package/dist/lib/auto-dispatch-provider.js +0 -30
  486. package/dist/lib/auto-dispatch.d.ts +0 -93
  487. package/dist/lib/auto-dispatch.js +0 -128
  488. package/dist/lib/export.d.ts +0 -72
  489. package/dist/lib/export.js +0 -269
  490. package/dist/lib/lock.d.ts +0 -93
  491. package/dist/lib/lock.js +0 -207
  492. package/dist/lib/wallet/index.d.ts +0 -78
  493. package/dist/lib/wallet/index.js +0 -253
@@ -1,13 +1,6 @@
1
1
  import type { Command } from 'commander';
2
- import type { AgentId } from '../lib/types.js';
3
- import { listInstalledVersions } from '../lib/versions.js';
4
- import { discoverAccounts } from '../lib/account-labels.js';
5
- export declare function fingerprintFromSource(raw: string, deps?: {
6
- installedVersions?: typeof listInstalledVersions;
7
- discover?: typeof discoverAccounts;
8
- }): Promise<{
9
- agent: AgentId;
10
- fingerprint: string;
11
- versions: string[];
12
- }>;
2
+ export declare function parseBundleKey(raw: string): {
3
+ bundle: string;
4
+ key: string;
5
+ };
13
6
  export declare function registerAccountsCommand(program: Command): void;
@@ -1,32 +1,164 @@
1
1
  import chalk from 'chalk';
2
- import { select } from '@inquirer/prompts';
3
- import { resolveAgentName, formatAgentError } from '../lib/agents.js';
4
- import { listInstalledVersions } from '../lib/versions.js';
5
- import { discoverAccounts, nameAccount, removeAccountLabel, renameAccountLabel } from '../lib/account-labels.js';
2
+ import { password } from '@inquirer/prompts';
6
3
  import { setHelpSections } from '../lib/help.js';
7
- function parseSource(raw) { const at = raw.lastIndexOf('@'); if (at < 1 || at === raw.length - 1)
8
- throw new Error(`Expected <agent>@<version>, got '${raw}'.`); const name = raw.slice(0, at); const agent = resolveAgentName(name); if (!agent)
9
- throw new Error(formatAgentError(name)); return { agent, version: raw.slice(at + 1) }; }
10
- export async function fingerprintFromSource(raw, deps = {}) {
11
- const { agent, version } = parseSource(raw);
12
- if (!(deps.installedVersions ?? listInstalledVersions)(agent).includes(version))
13
- throw new Error(`${raw} is not installed.`);
14
- const account = (await (deps.discover ?? discoverAccounts)([agent])).find(candidate => candidate.versions.includes(version));
15
- if (!account)
16
- throw new Error(`${raw} has no stable signed-in account. Run it and complete its normal login first.`);
17
- return { agent, fingerprint: account.fingerprint, versions: account.versions };
4
+ import { updateMeta } from '../lib/state.js';
5
+ import { ALL_AGENT_IDS } from '../lib/agents.js';
6
+ import { pushBundleToHost } from '../lib/secrets/push.js';
7
+ import { resolveRemoteOsSync } from '../lib/hosts/remote-os.js';
8
+ import { runDevicesAccounts } from './ssh.js';
9
+ import { discoverNativeAccounts } from '../lib/account-catalog.js';
10
+ import { readAndResolveBundleEnv } from '../lib/secrets/bundles.js';
11
+ import { getAccountProvider, listAccountProviders } from '../lib/account-provider-registry.js';
12
+ import { addAccount, findAccount, inspectAccount, readAccountRegistry, removeAccount, renameAccount, setAccountSecret } from '../lib/account-registry.js';
13
+ export function parseBundleKey(raw) {
14
+ const colon = raw.indexOf(':');
15
+ if (colon < 1 || colon === raw.length - 1)
16
+ throw new Error(`Expected bundle:key, got '${raw}'.`);
17
+ return { bundle: raw.slice(0, colon), key: raw.slice(colon + 1) };
18
+ }
19
+ function secretFromBundle(raw) {
20
+ const { bundle, key } = parseBundleKey(raw);
21
+ return readAndResolveBundleEnv(bundle, { keys: [key], keyMode: 'storage', agentOnly: true, caller: 'accounts import' }).env[key];
22
+ }
23
+ function publicAccount(account) {
24
+ return { kind: 'provider', id: account.id, name: account.name, provider: account.provider, auth: account.auth, baseUrl: account.baseUrl, policy: account.policy, secretPresent: account.secretPresent };
25
+ }
26
+ async function printAccounts(json, fleet = false) {
27
+ if (fleet)
28
+ return runDevicesAccounts({ json });
29
+ const records = Object.values(readAccountRegistry().accounts).sort((a, b) => a.name.localeCompare(b.name));
30
+ const native = await discoverNativeAccounts();
31
+ if (json) {
32
+ console.log(JSON.stringify([...records.map(account => publicAccount(inspectAccount(account.name))), ...native], null, 2));
33
+ return;
34
+ }
35
+ console.log(chalk.bold('Provider account bundles\n'));
36
+ if (!records.length)
37
+ console.log(chalk.gray(" None. Add one with 'agents accounts add <name> --provider <provider> --auth <type>'."));
38
+ for (const account of records) {
39
+ const present = inspectAccount(account.name).secretPresent ? chalk.green('ready') : chalk.red('missing on this device');
40
+ console.log(` ${chalk.cyan(account.name)} ${account.provider} ${account.auth} ${present}`);
41
+ }
42
+ console.log(chalk.bold('\nNative harness logins\n'));
43
+ if (!native.length)
44
+ console.log(chalk.gray(' No signed-in native accounts found.'));
45
+ for (const account of native)
46
+ console.log(` ${chalk.cyan(account.display)} ${account.agent} ${account.versions.join(', ')}`);
47
+ }
48
+ function parseAuth(raw) {
49
+ if (raw === 'api-key' || raw === 'setup-token' || raw === 'bearer-token')
50
+ return raw;
51
+ throw new Error(`Unsupported auth type '${raw}'. Use api-key, setup-token, or bearer-token.`);
18
52
  }
19
- async function printAccounts(json) { const accounts = await discoverAccounts(); if (json)
20
- return console.log(JSON.stringify(accounts, null, 2)); if (!accounts.length)
21
- return console.log(chalk.gray('No signed-in accounts found. Run an installed agent and complete its normal login first.')); console.log(chalk.bold('Signed-in accounts\n')); for (const account of accounts)
22
- console.log(` ${account.label ? chalk.cyan(account.label) : chalk.gray('(unnamed)')} ${account.agent} ${account.display}\n ${account.versions.length} installed version${account.versions.length === 1 ? '' : 's'}: ${account.versions.join(', ')}`); }
23
- async function chooseAccount() { const accounts = await discoverAccounts(); if (!accounts.length)
24
- throw new Error('No signed-in accounts found. Run an installed agent and complete its normal login first.'); return select({ message: 'Which signed-in account do you want to name?', choices: accounts.map(account => ({ name: `${account.agent} ${account.display} (${account.versions.length} version${account.versions.length === 1 ? '' : 's'})${account.label ? ` currently “${account.label}”` : ''}`, value: account })) }); }
25
53
  export function registerAccountsCommand(program) {
26
- const accounts = program.command('accounts').description('Browse and name signed-in harness accounts').option('--json', 'Machine-readable discovered accounts').action(async (o) => printAccounts(!!o.json));
27
- accounts.command('list').description('Alias for accounts').option('--json', 'Machine-readable discovered accounts').action((o) => printAccounts(!!o.json));
28
- accounts.command('name <label>').description('Name one signed-in account; matching installed versions are found automatically').option('--from <agent@version>', 'Non-interactive identity source').action(async (label, o) => { const picked = o.from ? await fingerprintFromSource(o.from) : await chooseAccount(); nameAccount(label, picked.agent, picked.fingerprint); console.log(chalk.green(`Named the ${picked.agent} account '${label}'.`)); console.log(chalk.gray(`Found it in ${picked.versions.length} installed version${picked.versions.length === 1 ? '' : 's'}: ${picked.versions.join(', ')}`)); });
29
- accounts.command('rename <old> <new>').description('Rename a saved account label').action((oldLabel, newLabel) => renameAccountLabel(oldLabel, newLabel));
30
- accounts.command('remove <label>').description('Remove a saved account label').action((label) => removeAccountLabel(label));
31
- setHelpSections(accounts, { examples: `agents accounts\nagents accounts name work\nagents accounts name work --from claude@2.1.220\nagents run claude --account work`, notes: 'First run the harness and complete its normal login. A label names one provider account; every matching installed version is discovered automatically. OAuth credentials are never copied or shared.' });
54
+ const accounts = program.command('accounts').description('Browse native logins and manage provider account bundles')
55
+ .option('--json', 'Machine-readable account metadata')
56
+ .option('--fleet', 'Show harness-native signed-in identities across reachable devices')
57
+ .action((o) => printAccounts(!!o.json, !!o.fleet));
58
+ accounts.command('list').description('List credential accounts').option('--json', 'Machine-readable account metadata').action((o, command) => printAccounts(!!(o.json || command.optsWithGlobals().json)));
59
+ accounts.command('add <name>')
60
+ .description('Add a durable API key, setup token, or bearer token')
61
+ .requiredOption('--provider <provider>', `Credential provider (${listAccountProviders().join(', ')})`)
62
+ .requiredOption('--auth <type>', 'Credential type: api-key | setup-token | bearer-token')
63
+ .option('--base-url <url>', 'Optional endpoint override stored with the account')
64
+ .option('--from-secrets <bundle:key>', 'Import from an existing agents secrets entry')
65
+ .action(async (name, o) => {
66
+ const auth = parseAuth(o.auth);
67
+ const provider = getAccountProvider(o.provider);
68
+ if (!provider.authKinds.includes(auth))
69
+ throw new Error(`Provider '${provider.provider}' does not support ${auth}. Supported: ${provider.authKinds.join(', ')}.`);
70
+ const secret = o.fromSecrets ? secretFromBundle(o.fromSecrets) : await password({ message: `Enter ${provider.provider} ${auth} for '${name}':` });
71
+ const account = addAccount(name, provider.provider, auth, secret, undefined, { baseUrl: o.baseUrl });
72
+ console.log(chalk.green(`Added ${account.provider} ${account.auth} account '${account.name}'.`));
73
+ console.log(chalk.gray(`Secret bundle '${account.name}' is the account and uses policy never, so agent launches never request Touch ID.`));
74
+ });
75
+ accounts.command('set-key <name>')
76
+ .description('Rotate an account credential without changing its identity')
77
+ .option('--from-secrets <bundle:key>', 'Import from an existing agents secrets entry')
78
+ .action(async (name, o) => {
79
+ const account = findAccount(name);
80
+ if (!account)
81
+ throw new Error(`Unknown account '${name}'.`);
82
+ const secret = o.fromSecrets ? secretFromBundle(o.fromSecrets) : await password({ message: `Enter new ${account.provider} ${account.auth} for '${name}':` });
83
+ setAccountSecret(name, secret);
84
+ console.log(chalk.green(`Updated credential for account '${name}'.`));
85
+ });
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));
88
+ if (o.json || command.optsWithGlobals().json)
89
+ return console.log(JSON.stringify(account, null, 2));
90
+ console.log(`${chalk.bold(account.name)} ${account.provider}`);
91
+ console.log(` auth: ${account.auth}`);
92
+ 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'}`);
97
+ });
98
+ accounts.command('rename <old> <new>').description('Rename an account without changing its stable id').action((oldName, newName) => renameAccount(oldName, newName));
99
+ accounts.command('remove <name>').description('Remove an account and its device-local credential').action((name) => removeAccount(name));
100
+ accounts.command('set-default <agent> <name>')
101
+ .description('Use a provider account for a harness when --account is omitted')
102
+ .action((agentRaw, name) => {
103
+ if (!ALL_AGENT_IDS.includes(agentRaw))
104
+ throw new Error(`Unknown agent '${agentRaw}'.`);
105
+ const agent = agentRaw;
106
+ const account = findAccount(name);
107
+ if (!account)
108
+ throw new Error(`Unknown provider account '${name}'.`);
109
+ getAccountProvider(account.provider).envFor(agent, account.auth);
110
+ // Defaults follow the stable account id, so renaming the bundle cannot
111
+ // strand bare runs on a deleted label. findAccount accepts ids and names.
112
+ updateMeta(meta => ({ ...meta, accounts: { ...meta.accounts, defaults: { ...meta.accounts?.defaults, [agent]: account.id } } }));
113
+ console.log(chalk.green(`${agent} now uses account '${account.name}' unless --account overrides it.`));
114
+ });
115
+ accounts.command('clear-default <agent>')
116
+ .description('Return a harness to native login or balanced account selection')
117
+ .action((agentRaw) => {
118
+ if (!ALL_AGENT_IDS.includes(agentRaw))
119
+ throw new Error(`Unknown agent '${agentRaw}'.`);
120
+ updateMeta(meta => {
121
+ const defaults = { ...meta.accounts?.defaults };
122
+ delete defaults[agentRaw];
123
+ return { ...meta, accounts: { ...meta.accounts, defaults } };
124
+ });
125
+ console.log(chalk.green(`Cleared the default account for ${agentRaw}.`));
126
+ });
127
+ accounts.command('sync <name>')
128
+ .description('Copy one provider account bundle to a worker device')
129
+ .requiredOption('--device <device>', 'Destination device or SSH host')
130
+ .option('--force', 'Replace matching keys on the destination')
131
+ .action((name, o) => {
132
+ const account = findAccount(name);
133
+ if (!account)
134
+ throw new Error(`Unknown provider account '${name}'.`);
135
+ const remoteBackend = resolveRemoteOsSync(o.device) === 'win32' ? 'keychain' : 'file';
136
+ const literalValues = {
137
+ ACCOUNT_ID: account.id,
138
+ PROVIDER: account.provider,
139
+ AUTH_TYPE: account.auth,
140
+ ...(account.baseUrl ? { BASE_URL: account.baseUrl } : {}),
141
+ };
142
+ const result = pushBundleToHost(account.name, o.device, {
143
+ remoteBackend,
144
+ force: o.force,
145
+ operation: 'accounts sync',
146
+ policyNever: true,
147
+ agentOnly: false,
148
+ literalValues,
149
+ });
150
+ 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).`));
153
+ });
154
+ setHelpSections(accounts, {
155
+ examples: `agents accounts add work --provider anthropic --auth setup-token
156
+ agents accounts add openrouter-work --provider openrouter --auth api-key --from-secrets openrouter.ai:OPENROUTER_API_KEY
157
+ agents accounts set-key work
158
+ agents accounts inspect work --json
159
+ 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.',
163
+ });
32
164
  }
@@ -4,19 +4,32 @@ import { sessionRecoveryPeer } from '../lib/session/recovery.js';
4
4
  import { resolveSessionMetadataValue, resumeSessionInPlace } from './sessions.js';
5
5
  import { readDetachRecord, clearDetachRecord, isHeadlessAlive } from '../lib/session/detached.js';
6
6
  export function registerAttachCommand(program) {
7
+ // Deprecated: superseded by `agents sessions resume`, which detects the state
8
+ // (live pane / headless / ended) instead of making the caller pick a verb.
9
+ // Hidden from help; kept as a warned, functional alias for one release so old
10
+ // muscle-memory and scripts don't break.
7
11
  program
8
- .command('attach')
12
+ .command('attach', { hidden: true })
9
13
  .argument('<id>', 'Short or full id of the backgrounded/parked session to resume interactively')
10
- .description('Bring a backgrounded agent to the foreground — resume it interactively here')
14
+ .description('Deprecated use `agents sessions resume <id>` instead.')
11
15
  .action(async (id) => {
16
+ console.warn(chalk.yellow('`agents sessions attach` is deprecated — use `agents sessions resume` instead:'));
17
+ console.warn(chalk.gray(` agents sessions resume ${id}`));
12
18
  await attachAction(id);
13
19
  });
14
20
  }
15
21
  export async function attachAction(id) {
16
22
  const outcome = await resolveSessionMetadataValue(id);
17
23
  if (outcome.kind === 'partial') {
18
- console.error(chalk.red(`Could not resolve session while these devices were unavailable: ${outcome.failedPeers.join(', ')}`));
19
- process.exitCode = 2;
24
+ // RUSH-2492: an unreachable peer is a warning, not a hard failure. The
25
+ // resolver already resolves an id found on the reachable fleet (SES-9a), so
26
+ // reaching here means the session was not found on any device we COULD reach
27
+ // — it may live on one of the unreachable peers, which we could not check.
28
+ const offline = outcome.failedPeers;
29
+ console.error(chalk.yellow(`Warning: ${offline.length} device(s) unreachable, not checked: ${offline.join(', ')}`));
30
+ console.error(chalk.red(`No session matching "${id}" on any reachable device (${offline.length} unreachable, not checked).`));
31
+ console.error(chalk.gray(' If it lives on an offline box, wake it (agents devices) or run there: agents ssh <device>'));
32
+ process.exitCode = 1;
20
33
  return;
21
34
  }
22
35
  if (outcome.kind === 'not-found') {
@@ -1,14 +1,14 @@
1
1
  /**
2
- * `agents audit` — inspect the tamper-evident audit log of dispatched runs.
2
+ * `agents audit` — thin alias of `agents events --include runs`.
3
3
  *
4
- * Every run that reaches the exec dispatch chokepoint appends one hash-chained
5
- * record (see src/lib/audit/log.ts). This command walks that chain:
4
+ * New run-dispatch outcomes land in the unified event stream as `run.dispatched`
5
+ * (see lib/audit/log.ts::recordDispatchedRun). This command does not own a
6
+ * separate store or query path — it only sets the default family filter.
6
7
  *
7
- * agents audit verify Confirm the chain is intact; report the first break.
8
- * agents audit list Print recent records (newest last).
9
- *
10
- * `verify` exits non-zero when the chain is broken so it can gate CI / governance
11
- * checks.
8
+ * agents audit agents events --include runs
9
+ * agents audit list same
10
+ * agents audit verify walks the legacy hash-chain file if present
11
+ * (pre-unification history only)
12
12
  */
13
13
  import type { Command } from 'commander';
14
14
  export declare function registerAuditCommands(program: Command): void;
@@ -1,68 +1,78 @@
1
1
  /**
2
- * `agents audit` — inspect the tamper-evident audit log of dispatched runs.
2
+ * `agents audit` — thin alias of `agents events --include runs`.
3
3
  *
4
- * Every run that reaches the exec dispatch chokepoint appends one hash-chained
5
- * record (see src/lib/audit/log.ts). This command walks that chain:
4
+ * New run-dispatch outcomes land in the unified event stream as `run.dispatched`
5
+ * (see lib/audit/log.ts::recordDispatchedRun). This command does not own a
6
+ * separate store or query path — it only sets the default family filter.
6
7
  *
7
- * agents audit verify Confirm the chain is intact; report the first break.
8
- * agents audit list Print recent records (newest last).
9
- *
10
- * `verify` exits non-zero when the chain is broken so it can gate CI / governance
11
- * checks.
8
+ * agents audit agents events --include runs
9
+ * agents audit list same
10
+ * agents audit verify walks the legacy hash-chain file if present
11
+ * (pre-unification history only)
12
12
  */
13
13
  import chalk from 'chalk';
14
14
  import { verifyAuditChain, readAuditLog, getAuditLogPath, } from '../lib/audit/log.js';
15
- function renderRow(r, i) {
16
- const idx = chalk.gray(String(i).padStart(4));
17
- const time = chalk.gray(r.ts.slice(0, 19).replace('T', ' '));
18
- const who = `${r.agent}@${r.version}`.padEnd(20);
19
- const outcome = r.outcome === 'ok' ? chalk.green('ok ') : chalk.red('fail');
20
- const mode = chalk.cyan(r.mode.padEnd(6));
21
- return `${idx} ${time} ${who} ${mode} ${outcome} exit=${r.exit} ${r.repo}`;
22
- }
15
+ import { addEventsReadOptions, runEventsCommand } from './events.js';
23
16
  export function registerAuditCommands(program) {
24
- const audit = program
17
+ const audit = addEventsReadOptions(program
25
18
  .command('audit')
26
- .description('Inspect the tamper-evident audit log of dispatched runs');
19
+ .description('Alias of `agents events --include runs` dispatched-run outcomes'), false)
20
+ .addHelpText('after', `
21
+ Examples:
22
+ agents audit Same as: agents events --include runs
23
+ agents audit --since 7d --json
24
+ agents audit list Muscle-memory alias of bare audit
25
+ agents audit verify Legacy hash-chain file only (if present)
26
+ `)
27
+ .action((_options, command) => {
28
+ const opts = command.optsWithGlobals();
29
+ // Bare audit defaults to --include runs unless the user already set families.
30
+ if (!opts.include && !opts.exclude)
31
+ opts.include = 'runs';
32
+ return runEventsCommand(opts);
33
+ });
34
+ audit
35
+ .command('list')
36
+ .description('Alias of `agents audit` / `agents events --include runs`')
37
+ .action((_options, command) => {
38
+ const parent = command.parent;
39
+ const opts = {
40
+ ...(parent?.optsWithGlobals?.() ?? {}),
41
+ ...(command.optsWithGlobals?.() ?? {}),
42
+ include: 'runs',
43
+ };
44
+ return runEventsCommand(opts);
45
+ });
27
46
  audit
28
47
  .command('verify')
29
- .description('Walk the hash chain and report OK or the first broken index')
48
+ .description('Walk the legacy hash-chain file (pre-unification history only)')
30
49
  .option('--json', 'Output the result as JSON')
31
50
  .action((options) => {
32
- const result = verifyAuditChain();
51
+ const logPath = getAuditLogPath();
52
+ const records = readAuditLog(logPath);
53
+ if (records.length === 0) {
54
+ if (options.json) {
55
+ console.log(JSON.stringify({ ok: true, legacy: true, records: 0, note: 'no legacy audit chain; new runs use events --include runs' }));
56
+ process.exit(0);
57
+ }
58
+ console.log(chalk.green('✓ no legacy audit chain present'));
59
+ console.log(chalk.gray(' New run outcomes: agents events --include runs'));
60
+ console.log(chalk.gray(` (looked for ${logPath})`));
61
+ process.exit(0);
62
+ }
63
+ const result = verifyAuditChain(logPath);
33
64
  if (options.json) {
34
- console.log(JSON.stringify(result));
65
+ console.log(JSON.stringify({ ...result, legacy: true, records: records.length }));
35
66
  process.exit(result.ok ? 0 : 1);
36
67
  }
37
68
  if (result.ok) {
38
- const n = readAuditLog().length;
39
- console.log(chalk.green(`✓ audit chain intact — ${n} record(s) verified`));
40
- console.log(chalk.gray(` ${getAuditLogPath()}`));
69
+ console.log(chalk.green(`✓ legacy audit chain intact — ${records.length} record(s) verified`));
70
+ console.log(chalk.gray(` ${logPath}`));
71
+ console.log(chalk.gray(' New runs use the events stream: agents events --include runs'));
41
72
  process.exit(0);
42
73
  }
43
- console.error(chalk.red(`✗ audit chain BROKEN at record #${result.brokenAt}`));
44
- console.error(chalk.gray(` ${getAuditLogPath()}`));
74
+ console.error(chalk.red(`✗ legacy audit chain BROKEN at record #${result.brokenAt}`));
75
+ console.error(chalk.gray(` ${logPath}`));
45
76
  process.exit(1);
46
77
  });
47
- audit
48
- .command('list')
49
- .description('Print recent audit records (oldest-first)')
50
- .option('--limit <n>', 'Max records to show (default 50)', '50')
51
- .option('--json', 'Output raw records as JSON')
52
- .action((options) => {
53
- const all = readAuditLog();
54
- if (options.json) {
55
- console.log(JSON.stringify(all, null, 2));
56
- return;
57
- }
58
- if (all.length === 0) {
59
- console.log(chalk.gray('No audit records yet.'));
60
- return;
61
- }
62
- const limit = Math.max(1, parseInt(options.limit ?? '50', 10) || 50);
63
- const start = Math.max(0, all.length - limit);
64
- for (let i = start; i < all.length; i++)
65
- console.log(renderRow(all[i], i));
66
- console.log(chalk.gray(`\n${all.length} record(s). Log: ${getAuditLogPath()}`));
67
- });
68
78
  }
@@ -1,7 +1,7 @@
1
+ import chalk from 'chalk';
1
2
  import * as fs from 'fs';
2
3
  import * as path from 'path';
3
4
  import { listProfiles, getProfile, createProfile, deleteProfile, ensureDefaultBrowserProfile, getConfiguredDefaultProfileName, DEFAULT_BROWSER_PROFILE_NAME, getProfileRuntimeDir, extractConfiguredPort, findFreeProfilePort, getEndpointPresets, } from '../lib/browser/profiles.js';
4
- import { updateMeta } from '../lib/state.js';
5
5
  import { resolveActor } from '../lib/actor.js';
6
6
  import { loginsForProfile, profilesLoggedInto, serviceForUrl, loginsWithAccountsForProfile, accountsForProfile, credKeysForService, AUTH_SIGNATURES, } from '../lib/browser/login-detection.js';
7
7
  import { parseSecretRef } from '../lib/browser/secret-ref.js';
@@ -15,7 +15,7 @@ import { parseTargetFilter } from '../lib/browser/service.js';
15
15
  import { BrowserDaemonNotRunningError, formatBrowserDaemonNotRunningError, sendIPCRequest, } from '../lib/browser/ipc.js';
16
16
  import { browserTaskPicker } from './browser-picker.js';
17
17
  import { assertRemoteControlAllowed } from '../lib/browser/remote-control.js';
18
- import { getConfigValue, setConfigValue } from '../lib/device-config.js';
18
+ import { getConfigValue, setConfigValue, unsetConfigValue } from '../lib/device-config.js';
19
19
  import { isInteractiveTerminal } from './utils.js';
20
20
  import { registerCommandGroups, setHelpSections } from '../lib/help.js';
21
21
  import { buildHar } from '../lib/browser/har.js';
@@ -188,17 +188,15 @@ function registerProfilesCommands(browser) {
188
188
  console.log(`Default profile (this machine): ${configuredDefault}`);
189
189
  }
190
190
  });
191
+ const browserProfileDeprecation = chalk.yellow('Deprecation: `agents browser profiles set-default` is replaced by `agents config set browser.profile <name>`.');
191
192
  profiles
192
193
  .command('set-default [name]')
193
194
  .description('Set the profile `agents browser start` uses when no --profile is passed (also re-points an explicit `--profile default`). Device-local — each machine has its own. No name prints the current value.')
194
195
  .option('--unset', 'Clear the configured default (revert to auto-detecting an installed browser)')
195
196
  .action(async (name, opts) => {
197
+ console.warn(browserProfileDeprecation);
196
198
  if (opts.unset) {
197
- updateMeta((m) => {
198
- const { defaultBrowserProfile, ...rest } = m;
199
- void defaultBrowserProfile;
200
- return rest;
201
- });
199
+ unsetConfigValue('browser.profile');
202
200
  console.log('Default browser profile cleared. `agents browser start` will auto-detect an installed Chromium-family browser.');
203
201
  return;
204
202
  }
@@ -209,7 +207,7 @@ function registerProfilesCommands(browser) {
209
207
  }
210
208
  else {
211
209
  console.log('No default browser profile set. `agents browser start` auto-detects an installed Chromium-family browser.');
212
- console.log('Set one with: agents browser profiles set-default <name>');
210
+ console.log('Set one with: agents config set browser.profile <name>');
213
211
  }
214
212
  return;
215
213
  }
@@ -221,7 +219,7 @@ function registerProfilesCommands(browser) {
221
219
  console.error(`Available profiles: ${all.map((p) => p.name).join(', ')}`);
222
220
  process.exit(1);
223
221
  }
224
- updateMeta((m) => ({ ...m, defaultBrowserProfile: name }));
222
+ setConfigValue('browser.profile', name);
225
223
  const eps = getEndpointPresets(target);
226
224
  const epStr = Object.values(eps)[0]?.target ?? '';
227
225
  console.log(`Default browser profile (this machine) is now "${name}" (${target.browser}${epStr ? `, ${epStr}` : ''}).`);
@@ -454,7 +452,7 @@ function registerProfilesCommands(browser) {
454
452
  (removed > 0 ? ` (and ${removed} cache dir${removed === 1 ? '' : 's'})` : ''));
455
453
  if (getConfiguredDefaultProfileName() === name) {
456
454
  console.error(`warning: "${name}" was this machine's default browser profile; ` +
457
- `\`agents browser start\` will auto-detect until you run: agents browser profiles set-default <name>`);
455
+ `\`agents browser start\` will auto-detect until you run: agents config set browser.profile <name>`);
458
456
  }
459
457
  });
460
458
  profiles
@@ -674,6 +672,7 @@ function registerTaskCommands(browser) {
674
672
  task: opts.task ?? process.env.AGENTS_BROWSER_TASK,
675
673
  actor: resolveActor().id,
676
674
  launchId: process.env.AGENT_LAUNCH_ID,
675
+ sessionId: process.env.AGENT_SESSION_ID || process.env.AGENTS_SESSION_ID,
677
676
  });
678
677
  });
679
678
  setHelpSections(stream, {
@@ -695,7 +694,7 @@ function registerTaskCommands(browser) {
695
694
  });
696
695
  browser
697
696
  .command('start')
698
- .description('Start a browser task. Pass --profile <name>; omit to use your configured default (`agents browser profiles set-default`), else auto-pick an installed Chromium-family browser.')
697
+ .description('Start a browser task. Pass --profile <name>; omit to use your configured default (`agents config set browser.profile <name>`), else auto-pick an installed Chromium-family browser.')
699
698
  .option('-p, --profile <name>', 'Browser profile to use (omit to use the configured default, else auto-pick an installed Chromium-family browser)')
700
699
  .option(TASK_OPTION_FLAG, 'Task name (auto-generated if omitted)')
701
700
  .option('-e, --endpoint <name>', 'Endpoint preset (defaults to the profile\'s default)')
@@ -798,6 +797,11 @@ function registerTaskCommands(browser) {
798
797
  // per-run id exec.ts injects for every harness.
799
798
  actor: resolveActor().id,
800
799
  launchId: process.env.AGENT_LAUNCH_ID,
800
+ // The agent session that drove this task — what makes the capture
801
+ // traceable back to a conversation (RUSH-2549). Sent alongside, not
802
+ // instead of, launchId: a launch id is absent on most agent processes,
803
+ // a session id is not.
804
+ sessionId: process.env.AGENT_SESSION_ID || process.env.AGENTS_SESSION_ID,
801
805
  });
802
806
  if (!response.ok) {
803
807
  console.error(response.error);
@@ -127,7 +127,7 @@ Examples:
127
127
  # Codex Cloud
128
128
  agents cloud run "add auth tests" --provider codex --env env_abc123
129
129
 
130
- # One of your own machines (agents hosts / agents devices), over SSH
130
+ # One of your own machines (agents devices), over SSH
131
131
  agents cloud run "run the nightly benchmark" --host gpu-box --agent claude
132
132
  agents cloud run "rebuild the index" --host gpu --any --remote-cwd ~/proj
133
133
 
@@ -395,17 +395,6 @@ Examples:
395
395
  console.log(chalk.gray('Central source unchanged. Commands will re-sync on next agent launch.'));
396
396
  }
397
397
  });
398
- // `commands sync` is gone — sync runs automatically when the agent launches.
399
- commandsCmd
400
- .command('sync', { hidden: true })
401
- .allowUnknownOption()
402
- .allowExcessArguments()
403
- .action(() => {
404
- console.error(chalk.red('"agents commands sync" is gone.'));
405
- console.error(chalk.gray('Sync runs automatically when you launch the agent.'));
406
- console.error(chalk.gray('To remove orphans, use: agents prune cleanup commands'));
407
- process.exit(1);
408
- });
409
398
  // `commands prune` moved to the top-level `agents prune cleanup` command.
410
399
  commandsCmd
411
400
  .command('prune', { hidden: true })
@@ -9,9 +9,12 @@
9
9
  import { execFileSync } from 'child_process';
10
10
  import * as fs from 'fs';
11
11
  import * as path from 'path';
12
+ import { randomUUID } from 'node:crypto';
12
13
  import { openComputerClient, describeTransport, resolvePolicyPath, } from '../lib/computer-rpc.js';
13
14
  import { COMPUTER_INPUT_GATED_VERBS, formatComputerPermissionGrantHint, } from '../lib/permissions.js';
14
15
  import { emit as emitEvent } from '../lib/events.js';
16
+ import { recordComputerSession } from '../lib/session/db.js';
17
+ import { resolveActor } from '../lib/actor.js';
15
18
  function isComputerInputVerb(verb) {
16
19
  return typeof verb === 'string' && COMPUTER_INPUT_GATED_VERBS.includes(verb);
17
20
  }
@@ -358,14 +361,44 @@ function emit(result, json, human) {
358
361
  // NOTE: the field is `targetPid`, never `pid` — `pid` is a reserved envelope
359
362
  // key (the emitting process's OWN pid, events.ts RESERVED_META_KEYS) that
360
363
  // sanitizePayload() silently strips from the payload before it can collide.
364
+ const COMPUTER_INVOCATION_ID = randomUUID();
361
365
  export function emitComputerAction(verb, targetPid, opts, extra = {}) {
362
366
  emitEvent('computer.action', {
363
367
  command: verb,
368
+ invocationId: COMPUTER_INVOCATION_ID,
364
369
  targetPid,
365
370
  bundle: opts.bundle,
366
371
  host: opts.host,
367
372
  ...extra,
368
373
  });
374
+ // Mirror the invocation's IDENTITY into the durable store (RUSH-2549). The
375
+ // event above stays the audit record, but the event ledger is bounded and
376
+ // prunes at 7 days / 50 MiB (events.ts), so a run's history used to vanish on
377
+ // day 8. This row is metadata only -- no screenshots, no typed text -- and
378
+ // `action_count` accumulates across the many calls one invocation makes.
379
+ //
380
+ // Identity is read from this process's own env, exactly as stampProvenance()
381
+ // does for the event: `agents computer` runs IN the caller's process, so there
382
+ // is no shared daemon to mis-attribute it to (the browser problem).
383
+ //
384
+ // Guarded for the same reason `emit` above guards itself ("logging should
385
+ // never break the CLI", events.ts): this is a RECORD of the action, not the
386
+ // action. An unwritable or locked session DB must not stop `agents computer
387
+ // click` from clicking. The action still happened and its event still landed;
388
+ // only this row is missed, and the next call re-records the identity.
389
+ try {
390
+ recordComputerSession({
391
+ invocationId: COMPUTER_INVOCATION_ID,
392
+ sessionId: process.env.AGENT_SESSION_ID || process.env.AGENTS_SESSION_ID,
393
+ launchId: process.env.AGENT_LAUNCH_ID,
394
+ actor: resolveActor().id,
395
+ actionCount: 1,
396
+ taskPreview: typeof extra.task === 'string' ? extra.task : undefined,
397
+ });
398
+ }
399
+ catch {
400
+ // Recording is best-effort; the action and its event are already done.
401
+ }
369
402
  }
370
403
  // Add the shared --pid/--bundle/--host target options to a verb. `--host` routes
371
404
  // the verb at a remote Windows device: the `computer` preAction hook hydrates
@@ -0,0 +1,21 @@
1
+ import { type ComputerRunRow } from '../lib/computer/sessions-list.js';
2
+ export interface ComputerSessionsCommandOpts {
3
+ machine?: string;
4
+ /** Row cap for the flat table only — the interactive picker is searchable
5
+ * and shows every row regardless (see `runComputerSessions`). */
6
+ limit?: number;
7
+ json?: boolean;
8
+ /** Commander's `--no-interactive` convention: `false` opts out. */
9
+ interactive?: boolean;
10
+ /** Pre-collected fleet rows. Omitted for the local ledger path. */
11
+ rows?: ComputerRunRow[];
12
+ }
13
+ /** True when the interactive picker should open instead of the printed table:
14
+ * a real TTY, no `--json`, and `--no-interactive` not set. */
15
+ export declare function shouldOpenInteractiveComputerSessions(opts: ComputerSessionsCommandOpts, isTTY: boolean): boolean;
16
+ /**
17
+ * Shared entry point for `agents computer sessions` and `agents sessions
18
+ * --computer`. Mirrors `runBrowserSessionsCommand`'s interactive-routing
19
+ * split so both call sites stay in lockstep.
20
+ */
21
+ export declare function runComputerSessionsCommand(opts: ComputerSessionsCommandOpts): Promise<void>;