@phnx-labs/agents-cli 1.22.35 → 1.22.38

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 (500) hide show
  1. package/CHANGELOG.md +708 -2
  2. package/README.md +83 -43
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.d.ts +15 -0
  5. package/dist/bootstrap.js +1212 -0
  6. package/dist/commands/accounts.d.ts +4 -11
  7. package/dist/commands/accounts.js +159 -27
  8. package/dist/commands/artifacts-setup.d.ts +53 -0
  9. package/dist/commands/artifacts-setup.js +161 -0
  10. package/dist/commands/artifacts.d.ts +18 -0
  11. package/dist/commands/artifacts.js +58 -0
  12. package/dist/commands/attach.js +17 -4
  13. package/dist/commands/audit.d.ts +8 -8
  14. package/dist/commands/audit.js +57 -47
  15. package/dist/commands/browser.js +17 -11
  16. package/dist/commands/cloud.js +1 -1
  17. package/dist/commands/commands.js +0 -11
  18. package/dist/commands/computer-actions.js +33 -0
  19. package/dist/commands/computer-sessions-picker.d.ts +21 -0
  20. package/dist/commands/computer-sessions-picker.js +141 -0
  21. package/dist/commands/computer.d.ts +16 -0
  22. package/dist/commands/computer.js +37 -0
  23. package/dist/commands/config.d.ts +17 -0
  24. package/dist/commands/config.js +401 -0
  25. package/dist/commands/cp.d.ts +84 -0
  26. package/dist/commands/cp.js +231 -0
  27. package/dist/commands/daemon.js +243 -14
  28. package/dist/commands/detach-core.d.ts +1 -1
  29. package/dist/commands/detach-core.js +12 -2
  30. package/dist/commands/detach.js +1 -1
  31. package/dist/commands/doctor.js +64 -5
  32. package/dist/commands/events.d.ts +24 -12
  33. package/dist/commands/events.js +144 -28
  34. package/dist/commands/exec.js +86 -42
  35. package/dist/commands/feed.d.ts +1 -1
  36. package/dist/commands/feed.js +16 -8
  37. package/dist/commands/focus.d.ts +33 -1
  38. package/dist/commands/focus.js +177 -17
  39. package/dist/commands/funnel.d.ts +1 -1
  40. package/dist/commands/go.js +9 -8
  41. package/dist/commands/harness-wizard.d.ts +1 -0
  42. package/dist/commands/harness-wizard.js +18 -20
  43. package/dist/commands/harness.d.ts +2 -0
  44. package/dist/commands/harness.js +59 -26
  45. package/dist/commands/hooks.js +0 -11
  46. package/dist/commands/inspect.d.ts +94 -1
  47. package/dist/commands/inspect.js +866 -40
  48. package/dist/commands/lease.d.ts +4 -4
  49. package/dist/commands/lease.js +6 -6
  50. package/dist/commands/login.js +0 -13
  51. package/dist/commands/logs.d.ts +2 -2
  52. package/dist/commands/logs.js +2 -2
  53. package/dist/commands/mcp.js +7 -2
  54. package/dist/commands/memory.js +7 -2
  55. package/dist/commands/message.d.ts +1 -1
  56. package/dist/commands/message.js +37 -6
  57. package/dist/commands/models.js +71 -0
  58. package/dist/commands/monitors.d.ts +0 -1
  59. package/dist/commands/monitors.js +199 -16
  60. package/dist/commands/open.d.ts +18 -0
  61. package/dist/commands/open.js +57 -0
  62. package/dist/commands/packages.js +2 -107
  63. package/dist/commands/plugins.js +6 -3
  64. package/dist/commands/profiles.d.ts +1 -0
  65. package/dist/commands/profiles.js +16 -160
  66. package/dist/commands/projects.d.ts +28 -0
  67. package/dist/commands/projects.js +125 -5
  68. package/dist/commands/reconnect.js +9 -3
  69. package/dist/commands/repo.js +42 -1
  70. package/dist/commands/resource-view.d.ts +17 -0
  71. package/dist/commands/resource-view.js +36 -14
  72. package/dist/commands/resume.js +9 -2
  73. package/dist/commands/routines.d.ts +0 -2
  74. package/dist/commands/routines.js +473 -289
  75. package/dist/commands/secrets.js +52 -9
  76. package/dist/commands/sessions-export.d.ts +47 -0
  77. package/dist/commands/sessions-export.js +116 -6
  78. package/dist/commands/sessions-import.d.ts +17 -0
  79. package/dist/commands/sessions-import.js +114 -6
  80. package/dist/commands/sessions-migrate.d.ts +27 -0
  81. package/dist/commands/sessions-migrate.js +50 -9
  82. package/dist/commands/sessions-picker.js +23 -4
  83. package/dist/commands/sessions-resume.d.ts +5 -3
  84. package/dist/commands/sessions-resume.js +30 -8
  85. package/dist/commands/sessions-watch.d.ts +2 -0
  86. package/dist/commands/sessions-watch.js +53 -0
  87. package/dist/commands/sessions.d.ts +66 -3
  88. package/dist/commands/sessions.js +298 -47
  89. package/dist/commands/setup-browser.js +2 -2
  90. package/dist/commands/setup-mine.js +0 -1
  91. package/dist/commands/setup-preferences.js +1 -1
  92. package/dist/commands/setup.d.ts +5 -0
  93. package/dist/commands/setup.js +31 -5
  94. package/dist/commands/share.d.ts +87 -7
  95. package/dist/commands/share.js +320 -58
  96. package/dist/commands/skills.js +0 -11
  97. package/dist/commands/snapshot.js +1 -1
  98. package/dist/commands/ssh.d.ts +18 -0
  99. package/dist/commands/ssh.js +549 -210
  100. package/dist/commands/sync.d.ts +5 -0
  101. package/dist/commands/sync.js +212 -32
  102. package/dist/commands/teams.d.ts +13 -0
  103. package/dist/commands/teams.js +187 -30
  104. package/dist/commands/tickets.d.ts +2 -0
  105. package/dist/commands/tickets.js +43 -0
  106. package/dist/commands/update.js +2 -4
  107. package/dist/commands/usage.js +5 -3
  108. package/dist/commands/versions.js +11 -5
  109. package/dist/commands/view.js +15 -7
  110. package/dist/commands/webhook.d.ts +2 -2
  111. package/dist/commands/webhook.js +7 -7
  112. package/dist/index.d.ts +18 -2
  113. package/dist/index.js +53 -1264
  114. package/dist/lib/account-catalog.d.ts +18 -0
  115. package/dist/lib/account-catalog.js +38 -0
  116. package/dist/lib/account-provider-registry.d.ts +18 -0
  117. package/dist/lib/account-provider-registry.js +59 -0
  118. package/dist/lib/account-registry.d.ts +40 -0
  119. package/dist/lib/account-registry.js +239 -0
  120. package/dist/lib/account-schema.d.ts +44 -0
  121. package/dist/lib/account-schema.js +91 -0
  122. package/dist/lib/account-state-service.d.ts +21 -0
  123. package/dist/lib/account-state-service.js +60 -0
  124. package/dist/lib/activity.d.ts +1 -1
  125. package/dist/lib/activity.js +8 -1
  126. package/dist/lib/add-dir.d.ts +80 -0
  127. package/dist/lib/add-dir.js +241 -0
  128. package/dist/lib/agent-cli-commands.d.ts +11 -0
  129. package/dist/lib/agent-cli-commands.js +30 -0
  130. package/dist/lib/agents.js +44 -36
  131. package/dist/lib/answer-router.js +1 -1
  132. package/dist/lib/audit/log.d.ts +10 -27
  133. package/dist/lib/audit/log.js +20 -33
  134. package/dist/lib/auth-health.d.ts +9 -2
  135. package/dist/lib/auth-health.js +42 -9
  136. package/dist/lib/auto-pull-worker.js +7 -3
  137. package/dist/lib/auto-pull.d.ts +44 -3
  138. package/dist/lib/auto-pull.js +88 -5
  139. package/dist/lib/binary-shadow.d.ts +28 -0
  140. package/dist/lib/binary-shadow.js +121 -0
  141. package/dist/lib/brand.js +9 -3
  142. package/dist/lib/browser/hygiene.d.ts +90 -0
  143. package/dist/lib/browser/hygiene.js +146 -0
  144. package/dist/lib/browser/ipc.d.ts +30 -0
  145. package/dist/lib/browser/ipc.js +93 -4
  146. package/dist/lib/browser/profiles.d.ts +3 -2
  147. package/dist/lib/browser/profiles.js +65 -22
  148. package/dist/lib/browser/service.d.ts +79 -1
  149. package/dist/lib/browser/service.js +231 -14
  150. package/dist/lib/browser/sessions-list.d.ts +22 -2
  151. package/dist/lib/browser/sessions-list.js +54 -6
  152. package/dist/lib/browser/stream.d.ts +2 -0
  153. package/dist/lib/browser/stream.js +1 -0
  154. package/dist/lib/browser/types.d.ts +63 -1
  155. package/dist/lib/byok-usage.d.ts +9 -2
  156. package/dist/lib/byok-usage.js +133 -31
  157. package/dist/lib/cli-entry.d.ts +11 -0
  158. package/dist/lib/cli-entry.js +46 -0
  159. package/dist/lib/cloud/host.d.ts +1 -1
  160. package/dist/lib/cloud/host.js +2 -2
  161. package/dist/lib/cloud/registry.js +1 -1
  162. package/dist/lib/cloud/types.d.ts +1 -1
  163. package/dist/lib/commands.d.ts +2 -0
  164. package/dist/lib/commands.js +2 -0
  165. package/dist/lib/computer/sessions-list.d.ts +150 -0
  166. package/dist/lib/computer/sessions-list.js +363 -0
  167. package/dist/lib/config-keys.d.ts +86 -0
  168. package/dist/lib/config-keys.js +193 -0
  169. package/dist/lib/config-machine-keys.d.ts +12 -0
  170. package/dist/lib/config-machine-keys.js +17 -0
  171. package/dist/lib/config-transfer.js +3 -4
  172. package/dist/lib/crabbox/cli.d.ts +2 -2
  173. package/dist/lib/crabbox/cli.js +3 -3
  174. package/dist/lib/daemon-health.d.ts +22 -0
  175. package/dist/lib/daemon-health.js +33 -3
  176. package/dist/lib/daemon-services.d.ts +50 -0
  177. package/dist/lib/daemon-services.js +147 -0
  178. package/dist/lib/daemon-ticks.d.ts +35 -66
  179. package/dist/lib/daemon-ticks.js +77 -159
  180. package/dist/lib/daemon.d.ts +72 -4
  181. package/dist/lib/daemon.js +792 -202
  182. package/dist/lib/deeplink/register.d.ts +49 -0
  183. package/dist/lib/deeplink/register.js +253 -0
  184. package/dist/lib/deeplink/url.d.ts +34 -0
  185. package/dist/lib/deeplink/url.js +78 -0
  186. package/dist/lib/device-config.d.ts +124 -29
  187. package/dist/lib/device-config.js +346 -141
  188. package/dist/lib/devices/config-migration.d.ts +42 -0
  189. package/dist/lib/devices/config-migration.js +203 -0
  190. package/dist/lib/devices/connect.js +14 -7
  191. package/dist/lib/devices/doctor-findings.d.ts +4 -1
  192. package/dist/lib/devices/doctor-findings.js +20 -1
  193. package/dist/lib/devices/harness-inventory.d.ts +11 -2
  194. package/dist/lib/devices/harness-inventory.js +0 -0
  195. package/dist/lib/devices/health.d.ts +1 -1
  196. package/dist/lib/devices/health.js +1 -1
  197. package/dist/lib/devices/pending.d.ts +22 -1
  198. package/dist/lib/devices/pending.js +67 -2
  199. package/dist/lib/devices/registry.d.ts +0 -25
  200. package/dist/lib/devices/registry.js +2 -83
  201. package/dist/lib/devices/resolve-profile.d.ts +20 -0
  202. package/dist/lib/devices/resolve-profile.js +44 -0
  203. package/dist/lib/devices/rollout-verify.d.ts +101 -0
  204. package/dist/lib/devices/rollout-verify.js +193 -0
  205. package/dist/lib/devices/ssh-config.js +10 -6
  206. package/dist/lib/event-families.d.ts +28 -0
  207. package/dist/lib/event-families.js +159 -0
  208. package/dist/lib/event-stream.d.ts +9 -1
  209. package/dist/lib/event-stream.js +26 -9
  210. package/dist/lib/events.d.ts +9 -1
  211. package/dist/lib/events.js +21 -6
  212. package/dist/lib/exec.d.ts +30 -0
  213. package/dist/lib/exec.js +219 -121
  214. package/dist/lib/feed-broadcast.d.ts +25 -0
  215. package/dist/lib/feed-broadcast.js +33 -0
  216. package/dist/lib/feed.d.ts +1 -1
  217. package/dist/lib/feed.js +12 -2
  218. package/dist/lib/fleet/capture.js +15 -0
  219. package/dist/lib/fleet/manifest.js +9 -0
  220. package/dist/lib/fleet/types.d.ts +9 -0
  221. package/dist/lib/fleet-status.js +10 -8
  222. package/dist/lib/git.d.ts +21 -7
  223. package/dist/lib/git.js +122 -18
  224. package/dist/lib/hosts/dispatch.d.ts +8 -3
  225. package/dist/lib/hosts/dispatch.js +29 -3
  226. package/dist/lib/hosts/logs.d.ts +2 -2
  227. package/dist/lib/hosts/logs.js +2 -2
  228. package/dist/lib/hosts/option.js +1 -1
  229. package/dist/lib/hosts/passthrough.d.ts +2 -3
  230. package/dist/lib/hosts/passthrough.js +10 -24
  231. package/dist/lib/hosts/progress.js +2 -2
  232. package/dist/lib/hosts/providers/devices.d.ts +3 -3
  233. package/dist/lib/hosts/providers/devices.js +18 -12
  234. package/dist/lib/hosts/ready.d.ts +5 -1
  235. package/dist/lib/hosts/ready.js +9 -3
  236. package/dist/lib/hosts/reconcile.d.ts +2 -2
  237. package/dist/lib/hosts/reconcile.js +2 -2
  238. package/dist/lib/hosts/registry.js +14 -9
  239. package/dist/lib/hosts/remote-cmd.js +1 -1
  240. package/dist/lib/hosts/remote-os.d.ts +9 -6
  241. package/dist/lib/hosts/remote-os.js +13 -6
  242. package/dist/lib/hosts/routing-flag.d.ts +23 -0
  243. package/dist/lib/hosts/routing-flag.js +41 -0
  244. package/dist/lib/hosts/run-target.js +1 -1
  245. package/dist/lib/hosts/session-index.js +1 -1
  246. package/dist/lib/hosts/tasks.d.ts +6 -6
  247. package/dist/lib/hosts/tasks.js +4 -4
  248. package/dist/lib/hosts/types.js +1 -2
  249. package/dist/lib/installations/resolve.js +2 -8
  250. package/dist/lib/isolation-boundary-report.js +0 -1
  251. package/dist/lib/linear-cache.d.ts +7 -0
  252. package/dist/lib/linear-cache.js +31 -4
  253. package/dist/lib/linear-project-counts.d.ts +1 -1
  254. package/dist/lib/linear-project-counts.js +2 -3
  255. package/dist/lib/linear-projects.js +1 -1
  256. package/dist/lib/loop.d.ts +2 -2
  257. package/dist/lib/loop.js +1 -1
  258. package/dist/lib/mailbox-target.d.ts +1 -1
  259. package/dist/lib/mailbox-target.js +1 -1
  260. package/dist/lib/manifest.js +7 -4
  261. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  262. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  263. package/dist/lib/menubar/snapshot.d.ts +3 -2
  264. package/dist/lib/menubar/snapshot.js +6 -2
  265. package/dist/lib/migrate-fold.d.ts +33 -0
  266. package/dist/lib/migrate-fold.js +130 -0
  267. package/dist/lib/migrate.d.ts +34 -34
  268. package/dist/lib/migrate.js +106 -128
  269. package/dist/lib/model-tier-overrides.d.ts +1 -1
  270. package/dist/lib/model-tier-overrides.js +15 -2
  271. package/dist/lib/monitors/config.d.ts +17 -3
  272. package/dist/lib/monitors/config.js +52 -18
  273. package/dist/lib/monitors/engine.d.ts +32 -1
  274. package/dist/lib/monitors/engine.js +94 -11
  275. package/dist/lib/monitors/fingerprint.d.ts +46 -0
  276. package/dist/lib/monitors/fingerprint.js +100 -0
  277. package/dist/lib/monitors/remote.d.ts +47 -0
  278. package/dist/lib/monitors/remote.js +81 -0
  279. package/dist/lib/monitors/state.d.ts +39 -0
  280. package/dist/lib/monitors/state.js +56 -0
  281. package/dist/lib/onepassword.d.ts +17 -0
  282. package/dist/lib/onepassword.js +52 -22
  283. package/dist/lib/open-url.js +1 -1
  284. package/dist/lib/picker.d.ts +14 -2
  285. package/dist/lib/picker.js +35 -13
  286. package/dist/lib/placement.d.ts +1 -1
  287. package/dist/lib/placement.js +1 -1
  288. package/dist/lib/pr-land-detach.d.ts +32 -0
  289. package/dist/lib/pr-land-detach.js +79 -0
  290. package/dist/lib/profiles-presets.js +13 -0
  291. package/dist/lib/profiles.d.ts +2 -0
  292. package/dist/lib/profiles.js +44 -1
  293. package/dist/lib/project-focus.d.ts +1 -1
  294. package/dist/lib/project-focus.js +1 -1
  295. package/dist/lib/project-probe.d.ts +4 -1
  296. package/dist/lib/project-probe.js +5 -4
  297. package/dist/lib/project-resources.js +2 -18
  298. package/dist/lib/project-root.d.ts +16 -0
  299. package/dist/lib/project-root.js +20 -2
  300. package/dist/lib/projects.d.ts +20 -1
  301. package/dist/lib/projects.js +78 -1
  302. package/dist/lib/refresh-coordinator.d.ts +24 -0
  303. package/dist/lib/refresh-coordinator.js +52 -0
  304. package/dist/lib/registry.d.ts +2 -2
  305. package/dist/lib/registry.js +1 -1
  306. package/dist/lib/resource-aliases.d.ts +13 -0
  307. package/dist/lib/resource-aliases.js +26 -0
  308. package/dist/lib/resources/types.d.ts +1 -1
  309. package/dist/lib/resources.d.ts +16 -0
  310. package/dist/lib/resources.js +66 -10
  311. package/dist/lib/rotate.d.ts +3 -4
  312. package/dist/lib/rotate.js +4 -5
  313. package/dist/lib/routine-activation.d.ts +22 -2
  314. package/dist/lib/routine-activation.js +63 -16
  315. package/dist/lib/routine-context.d.ts +9 -2
  316. package/dist/lib/routine-context.js +21 -6
  317. package/dist/lib/routines-project.d.ts +58 -48
  318. package/dist/lib/routines-project.js +190 -159
  319. package/dist/lib/routines.d.ts +44 -7
  320. package/dist/lib/routines.js +92 -34
  321. package/dist/lib/run-defaults.d.ts +5 -0
  322. package/dist/lib/run-defaults.js +11 -1
  323. package/dist/lib/runner.d.ts +10 -8
  324. package/dist/lib/runner.js +122 -39
  325. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  326. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  327. package/dist/lib/secrets/agent.d.ts +10 -3
  328. package/dist/lib/secrets/agent.js +43 -8
  329. package/dist/lib/secrets/bundles.d.ts +1 -0
  330. package/dist/lib/secrets/bundles.js +92 -80
  331. package/dist/lib/secrets/index.js +32 -9
  332. package/dist/lib/secrets/install-helper.d.ts +4 -4
  333. package/dist/lib/secrets/install-helper.js +4 -4
  334. package/dist/lib/secrets/push.d.ts +40 -6
  335. package/dist/lib/secrets/push.js +58 -11
  336. package/dist/lib/secrets/read-backoff.d.ts +1 -1
  337. package/dist/lib/secrets/read-backoff.js +1 -1
  338. package/dist/lib/secrets/remote.d.ts +24 -0
  339. package/dist/lib/secrets/remote.js +54 -4
  340. package/dist/lib/self-update.d.ts +108 -0
  341. package/dist/lib/self-update.js +276 -1
  342. package/dist/lib/session/active.d.ts +89 -5
  343. package/dist/lib/session/active.js +165 -10
  344. package/dist/lib/session/actor-sidecar.d.ts +1 -1
  345. package/dist/lib/session/actor-sidecar.js +2 -1
  346. package/dist/lib/session/db.d.ts +176 -2
  347. package/dist/lib/session/db.js +484 -17
  348. package/dist/lib/session/discover.js +27 -4
  349. package/dist/lib/session/hook-sessions.js +2 -2
  350. package/dist/lib/session/host-link.d.ts +2 -2
  351. package/dist/lib/session/host-link.js +2 -2
  352. package/dist/lib/session/pid-registry.d.ts +21 -0
  353. package/dist/lib/session/pid-registry.js +57 -0
  354. package/dist/lib/session/remote-active.js +15 -1
  355. package/dist/lib/session/remote.js +2 -2
  356. package/dist/lib/session/session-cache.d.ts +14 -7
  357. package/dist/lib/session/session-cache.js +51 -9
  358. package/dist/lib/session/state.d.ts +2 -2
  359. package/dist/lib/session/state.js +1 -1
  360. package/dist/lib/session/sync/config.d.ts +10 -10
  361. package/dist/lib/session/sync/config.js +10 -10
  362. package/dist/lib/session/sync/r2.d.ts +34 -0
  363. package/dist/lib/session/sync/r2.js +123 -0
  364. package/dist/lib/session/throughput.d.ts +1 -1
  365. package/dist/lib/session/throughput.js +1 -1
  366. package/dist/lib/session/types.d.ts +23 -1
  367. package/dist/lib/session/types.js +15 -0
  368. package/dist/lib/session/viewing-in.d.ts +1 -1
  369. package/dist/lib/session/viewing-in.js +1 -1
  370. package/dist/lib/session/watch.d.ts +101 -0
  371. package/dist/lib/session/watch.js +242 -0
  372. package/dist/lib/share/analytics.js +1 -1
  373. package/dist/lib/share/capture.d.ts +1 -1
  374. package/dist/lib/share/capture.js +3 -3
  375. package/dist/lib/share/config.d.ts +6 -2
  376. package/dist/lib/share/config.js +6 -5
  377. package/dist/lib/share/delete.js +3 -3
  378. package/dist/lib/share/provision.d.ts +38 -0
  379. package/dist/lib/share/provision.js +51 -1
  380. package/dist/lib/share/publish.d.ts +40 -1
  381. package/dist/lib/share/publish.js +119 -6
  382. package/dist/lib/share/worker-template.d.ts +12 -1
  383. package/dist/lib/share/worker-template.js +83 -7
  384. package/dist/lib/shims.d.ts +17 -3
  385. package/dist/lib/shims.js +98 -26
  386. package/dist/lib/signin-badge.js +3 -2
  387. package/dist/lib/skills.js +2 -0
  388. package/dist/lib/smart-launch.d.ts +8 -8
  389. package/dist/lib/smart-launch.js +80 -59
  390. package/dist/lib/ssh-exec.d.ts +1 -1
  391. package/dist/lib/ssh-exec.js +1 -1
  392. package/dist/lib/staleness/prune.d.ts +88 -0
  393. package/dist/lib/staleness/prune.js +69 -0
  394. package/dist/lib/staleness/registry.d.ts +1 -1
  395. package/dist/lib/staleness/writers/commands.js +34 -2
  396. package/dist/lib/staleness/writers/hooks.js +16 -0
  397. package/dist/lib/staleness/writers/kinds.d.ts +6 -0
  398. package/dist/lib/staleness/writers/skills.js +19 -0
  399. package/dist/lib/staleness/writers/subagents.d.ts +2 -3
  400. package/dist/lib/staleness/writers/subagents.js +0 -4
  401. package/dist/lib/staleness/writers/types.d.ts +32 -0
  402. package/dist/lib/startup/command-registry.d.ts +16 -14
  403. package/dist/lib/startup/command-registry.js +26 -37
  404. package/dist/lib/startup/dev-build.d.ts +10 -0
  405. package/dist/lib/startup/dev-build.js +13 -1
  406. package/dist/lib/startup/spellcheck.d.ts +18 -0
  407. package/dist/lib/startup/spellcheck.js +45 -0
  408. package/dist/lib/state.d.ts +36 -9
  409. package/dist/lib/state.js +96 -46
  410. package/dist/lib/subagents-registry.d.ts +0 -7
  411. package/dist/lib/subagents-registry.js +38 -65
  412. package/dist/lib/subagents.d.ts +0 -33
  413. package/dist/lib/subagents.js +0 -75
  414. package/dist/lib/sync-umbrella.js +1 -1
  415. package/dist/lib/teams/agents.d.ts +41 -1
  416. package/dist/lib/teams/agents.js +187 -9
  417. package/dist/lib/teams/api.d.ts +11 -1
  418. package/dist/lib/teams/api.js +11 -2
  419. package/dist/lib/teams/delivery.d.ts +41 -0
  420. package/dist/lib/teams/delivery.js +60 -0
  421. package/dist/lib/teams/registry.d.ts +14 -0
  422. package/dist/lib/teams/registry.js +51 -1
  423. package/dist/lib/teams/remoteWorktree.d.ts +19 -0
  424. package/dist/lib/teams/remoteWorktree.js +29 -0
  425. package/dist/lib/teams/scheduler.d.ts +1 -1
  426. package/dist/lib/teams/scheduler.js +1 -1
  427. package/dist/lib/teams/worktree.d.ts +24 -0
  428. package/dist/lib/teams/worktree.js +42 -0
  429. package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
  430. package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
  431. package/dist/lib/terminal/engine.d.ts +4 -0
  432. package/dist/lib/terminal/engine.js +8 -2
  433. package/dist/lib/terminal/types.d.ts +21 -2
  434. package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
  435. package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
  436. package/dist/lib/tickets/list.d.ts +53 -0
  437. package/dist/lib/tickets/list.js +153 -0
  438. package/dist/lib/tmux/orphan-reap.d.ts +316 -0
  439. package/dist/lib/tmux/orphan-reap.js +638 -0
  440. package/dist/lib/tmux/session.d.ts +68 -3
  441. package/dist/lib/tmux/session.js +96 -5
  442. package/dist/lib/triggers/handlers.d.ts +20 -0
  443. package/dist/lib/triggers/handlers.js +16 -1
  444. package/dist/lib/triggers/webhook.js +10 -0
  445. package/dist/lib/types.d.ts +47 -35
  446. package/dist/lib/usage-fleet.d.ts +32 -0
  447. package/dist/lib/usage-fleet.js +125 -0
  448. package/dist/lib/usage-refresh.d.ts +3 -3
  449. package/dist/lib/usage-refresh.js +19 -16
  450. package/dist/lib/usage.d.ts +51 -47
  451. package/dist/lib/usage.js +145 -153
  452. package/dist/lib/version-duplicates.js +2 -2
  453. package/dist/lib/versions.d.ts +56 -13
  454. package/dist/lib/versions.js +195 -45
  455. package/dist/lib/watchdog/log.d.ts +1 -1
  456. package/dist/lib/watchdog/log.js +3 -3
  457. package/dist/lib/watchdog/rotate.d.ts +6 -6
  458. package/dist/lib/watchdog/rotate.js +6 -6
  459. package/dist/lib/workflows.d.ts +1 -1
  460. package/dist/lib/yaml-io.d.ts +47 -0
  461. package/dist/lib/yaml-io.js +55 -0
  462. package/package.json +2 -1
  463. package/scripts/install-helper.js +2 -2
  464. package/scripts/postinstall.js +23 -20
  465. package/dist/commands/defaults.d.ts +0 -7
  466. package/dist/commands/defaults.js +0 -107
  467. package/dist/commands/export.d.ts +0 -11
  468. package/dist/commands/export.js +0 -215
  469. package/dist/commands/helper.d.ts +0 -12
  470. package/dist/commands/helper.js +0 -87
  471. package/dist/commands/hosts.d.ts +0 -11
  472. package/dist/commands/hosts.js +0 -330
  473. package/dist/commands/lock.d.ts +0 -12
  474. package/dist/commands/lock.js +0 -70
  475. package/dist/commands/pull.d.ts +0 -17
  476. package/dist/commands/pull.js +0 -39
  477. package/dist/commands/push.d.ts +0 -14
  478. package/dist/commands/push.js +0 -30
  479. package/dist/commands/set.d.ts +0 -15
  480. package/dist/commands/set.js +0 -79
  481. package/dist/commands/setup-share.d.ts +0 -17
  482. package/dist/commands/setup-share.js +0 -85
  483. package/dist/commands/wallet.d.ts +0 -20
  484. package/dist/commands/wallet.js +0 -216
  485. package/dist/commands/worktree.d.ts +0 -19
  486. package/dist/commands/worktree.js +0 -272
  487. package/dist/lib/account-labels.d.ts +0 -24
  488. package/dist/lib/account-labels.js +0 -72
  489. package/dist/lib/auto-dispatch-linear.d.ts +0 -18
  490. package/dist/lib/auto-dispatch-linear.js +0 -107
  491. package/dist/lib/auto-dispatch-provider.d.ts +0 -10
  492. package/dist/lib/auto-dispatch-provider.js +0 -30
  493. package/dist/lib/auto-dispatch.d.ts +0 -93
  494. package/dist/lib/auto-dispatch.js +0 -128
  495. package/dist/lib/export.d.ts +0 -72
  496. package/dist/lib/export.js +0 -269
  497. package/dist/lib/lock.d.ts +0 -93
  498. package/dist/lib/lock.js +0 -207
  499. package/dist/lib/wallet/index.d.ts +0 -78
  500. package/dist/lib/wallet/index.js +0 -253
@@ -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,11 +694,12 @@ 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)')
702
701
  .option('-u, --url <url>', 'Open URL in first tab')
702
+ .option('--fresh', 'Always open a new tab, skipping the reclaim of a tab an abandoned task is holding on that URL')
703
703
  .option('--no-skills', 'Skip auto-discovery of site-specific SKILL.md from ~/.agents/skills/browser/domain-skills/')
704
704
  .option('--record', 'Start recording right after the tab opens (shorthand for `agents browser record start` as a follow-up)')
705
705
  .option('--fps <n>', 'Recording frames per second (with --record; 1–30, default 5)', (v) => parseInt(v, 10))
@@ -792,12 +792,18 @@ function registerTaskCommands(browser) {
792
792
  url: opts.url,
793
793
  endpoint: opts.endpoint,
794
794
  skipDomainSkill: opts.skills === false,
795
+ fresh: opts.fresh === true,
795
796
  // Forward the caller's identity: the browser daemon is shared, so it
796
797
  // cannot resolve who/which-run called `start`. `resolveActor()` runs
797
798
  // here in the CLI (the caller's process); `$AGENT_LAUNCH_ID` is the
798
799
  // per-run id exec.ts injects for every harness.
799
800
  actor: resolveActor().id,
800
801
  launchId: process.env.AGENT_LAUNCH_ID,
802
+ // The agent session that drove this task — what makes the capture
803
+ // traceable back to a conversation (RUSH-2549). Sent alongside, not
804
+ // instead of, launchId: a launch id is absent on most agent processes,
805
+ // a session id is not.
806
+ sessionId: process.env.AGENT_SESSION_ID || process.env.AGENTS_SESSION_ID,
801
807
  });
802
808
  if (!response.ok) {
803
809
  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>;
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Interactive, task-first `agents computer sessions` / `agents sessions
3
+ * --computer` view (RUSH-2432) — the computer counterpart of
4
+ * `browser-sessions-picker.ts` (RUSH-2407). Backs the TTY path only —
5
+ * non-TTY, `--json`, and `--no-interactive` all fall straight through to the
6
+ * flat printer in `lib/computer/sessions-list.ts` (unchanged, so `--json`
7
+ * stays a stable surface).
8
+ *
9
+ * Reuses the same `itemPicker` + `buildPreview` primitives as the ordinary
10
+ * session picker (`sessions-picker.ts`) and the browser task picker — same
11
+ * search/filter/quit help, and the preview pane for a linked run IS the
12
+ * canonical session digest, not a second renderer. Unlike a browser task, a
13
+ * computer run has no on-disk artifact of its own to open (see
14
+ * `lib/computer/sessions-list.ts`'s module docblock), so `enter` prints the
15
+ * run's full action list rather than opening a file, and the picker keeps
16
+ * browsing afterward instead of exiting.
17
+ */
18
+ import chalk from 'chalk';
19
+ import { itemPicker } from '../lib/picker.js';
20
+ import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
21
+ import { buildPreview } from './sessions-picker.js';
22
+ import { runComputerSessions, printComputerSessionRows, buildComputerSessionRows, matchesComputerSessionRow, formatRowActions, } from '../lib/computer/sessions-list.js';
23
+ import { formatRelativeTime } from '../lib/session/relative-time.js';
24
+ /** True when the interactive picker should open instead of the printed table:
25
+ * a real TTY, no `--json`, and `--no-interactive` not set. */
26
+ export function shouldOpenInteractiveComputerSessions(opts, isTTY) {
27
+ return opts.interactive !== false && !opts.json && isTTY;
28
+ }
29
+ /**
30
+ * Shared entry point for `agents computer sessions` and `agents sessions
31
+ * --computer`. Mirrors `runBrowserSessionsCommand`'s interactive-routing
32
+ * split so both call sites stay in lockstep.
33
+ */
34
+ export async function runComputerSessionsCommand(opts) {
35
+ if (!shouldOpenInteractiveComputerSessions(opts, isInteractiveTerminal())) {
36
+ if (opts.rows)
37
+ printComputerSessionRows(opts.rows, { limit: opts.limit, json: opts.json });
38
+ else
39
+ runComputerSessions({ machine: opts.machine, limit: opts.limit, json: opts.json });
40
+ return;
41
+ }
42
+ const rows = opts.rows ?? buildComputerSessionRows({ machine: opts.machine });
43
+ if (rows.length === 0) {
44
+ console.log(`No computer actions recorded${opts.machine ? ` for machine "${opts.machine}"` : ''}.`);
45
+ return;
46
+ }
47
+ await browseComputerSessions(rows);
48
+ }
49
+ function rowLinkSummary(row) {
50
+ if (row.linkStatus === 'linked' && row.linkedSession) {
51
+ const s = row.linkedSession;
52
+ return chalk.cyan(s.agent) + ' — ' + (s.label || s.topic || s.shortId);
53
+ }
54
+ if (row.linkStatus === 'unresolved') {
55
+ return chalk.yellow(`owner ${row.agent ?? 'unknown'} (session not indexed here)`);
56
+ }
57
+ return chalk.gray('unlinked');
58
+ }
59
+ function formatRowLabel(row) {
60
+ // Pad the raw text first, THEN colorize — padEnd on an already-chalked
61
+ // string counts the ANSI escape bytes as width and misaligns the column.
62
+ const rawName = row.task ?? row.bundle ?? (row.pid ? `pid ${row.pid}` : 'recovered run');
63
+ const name = rawName.slice(0, 40).padEnd(40);
64
+ const coloredName = row.task ? name : chalk.gray(name);
65
+ const where = (row.remoteHost ? `${row.machine} -> ${row.remoteHost}` : row.machine).padEnd(24);
66
+ const age = formatRelativeTime(new Date(row.endMs).toISOString());
67
+ const counts = formatRowActions(row);
68
+ return [coloredName, where, age.padEnd(11), counts.padEnd(24), rowLinkSummary(row)].join(' ');
69
+ }
70
+ const PREVIEW_ACTION_LIMIT = 12;
71
+ function buildRowPreview(row) {
72
+ const parts = [];
73
+ if (row.linkStatus === 'linked' && row.linkedSession) {
74
+ parts.push(buildPreview(row.linkedSession));
75
+ }
76
+ else if (row.linkStatus === 'unresolved') {
77
+ parts.push(chalk.yellow(`owner ${row.agent ?? 'unknown'} — session ${row.sessionId ?? row.launchId} has no indexed session on this machine.`));
78
+ }
79
+ else {
80
+ parts.push(chalk.gray('Unlinked — no owning agent session is known for this run (no session/launch identity recorded).'));
81
+ }
82
+ if (row.task) {
83
+ parts.push('');
84
+ parts.push(chalk.bold('Task:') + ` ${row.task}`);
85
+ }
86
+ parts.push('');
87
+ parts.push(chalk.bold(`Actions (${row.recoveredActionCount ?? row.actions.length})`) + ` ${formatRowActions(row)}`);
88
+ for (const a of row.actions.slice(0, PREVIEW_ACTION_LIMIT)) {
89
+ parts.push(` ${formatActionLabel(a)}`);
90
+ }
91
+ const more = row.actions.length - PREVIEW_ACTION_LIMIT;
92
+ if (more > 0)
93
+ parts.push(chalk.gray(` … (${more} more)`));
94
+ return parts.join('\n');
95
+ }
96
+ function formatActionLabel(a) {
97
+ const age = formatRelativeTime(new Date(a.tsMs).toISOString());
98
+ const target = a.bundle ?? (a.targetPid != null ? `pid ${a.targetPid}` : '-');
99
+ return `${age.padEnd(11)} ${a.verb.padEnd(14)} ${target}`;
100
+ }
101
+ /** Print one run's full action list (no truncation) — the `enter` action,
102
+ * since a computer run has no on-disk artifact to open. */
103
+ function printRunDetail(row) {
104
+ console.log('');
105
+ console.log(chalk.bold(row.task ?? row.bundle ?? `pid ${row.pid}`));
106
+ console.log(row.remoteHost ? `${row.machine} -> ${row.remoteHost}` : row.machine);
107
+ console.log('');
108
+ for (const a of row.actions)
109
+ console.log(formatActionLabel(a));
110
+ if (row.actions.length === 0)
111
+ console.log('(no driving actions recorded)');
112
+ console.log('');
113
+ }
114
+ /** Run-level picker with an action-list preview. Loops until the user quits
115
+ * (esc) so a session's whole run history can be browsed repeatedly in one
116
+ * sitting — mirroring `browseAndOpen`'s loop, minus the artifact drill-down
117
+ * a computer run has none of. */
118
+ async function browseComputerSessions(rows) {
119
+ for (;;) {
120
+ let picked;
121
+ try {
122
+ picked = await itemPicker({
123
+ message: 'Computer sessions:',
124
+ items: rows,
125
+ filter: (query) => (query.trim() ? rows.filter((r) => matchesComputerSessionRow(r, query)) : rows),
126
+ labelFor: (row) => formatRowLabel(row),
127
+ buildPreview: (row) => buildRowPreview(row),
128
+ emptyMessage: 'No computer sessions match.',
129
+ enterHint: 'view actions',
130
+ });
131
+ }
132
+ catch (err) {
133
+ if (isPromptCancelled(err))
134
+ return;
135
+ throw err;
136
+ }
137
+ if (!picked)
138
+ return;
139
+ printRunDetail(picked.item);
140
+ }
141
+ }
@@ -38,6 +38,22 @@ export declare function reconcileScreenshotExt(outPath: string, buf: Buffer): {
38
38
  export declare function registerComputerCommand(program: Command): void;
39
39
  export declare function registerComputerSubcommands(program: Command): void;
40
40
  export declare function buildRestartTaskScript(taskName: string, exeName: string): string;
41
+ /**
42
+ * Emit a `computer.action` marker for `computer run`'s whole loop process, so
43
+ * `agents computer sessions` groups every verb the loop drives under one
44
+ * task-labeled row instead of a bare pid with no task text (see
45
+ * lib/computer/sessions-list.ts's "Grouping key" docblock note). The task
46
+ * text is bounded to `TASK_PREVIEW_MAX_CHARS` — never the full unbounded
47
+ * `--task` string — matching that module's retention/privacy note. Exported
48
+ * so the truncation behavior is directly unit-testable against the real
49
+ * event ledger, the same seam `computer-actions.test.ts` already uses for
50
+ * `emitComputerAction`.
51
+ */
52
+ export declare function emitComputerRunTaskMarker(opts: {
53
+ task: string;
54
+ bundle?: string;
55
+ host?: string;
56
+ }): void;
41
57
  /**
42
58
  * Install the macOS helper locally: resolve (or download + verify) the signed,
43
59
  * notarized .app, copy it to /Applications, verify the destination signature,
@@ -11,6 +11,9 @@ import { registerActionCommands, withClient, unwrap, pickTarget, emitComputerAct
11
11
  import { runComputerLoop } from '../lib/computer/loop.js';
12
12
  import { makeVerbDispatcher } from '../lib/computer/dispatch.js';
13
13
  import { makeClaudeResponder, resolveApiKey, DEFAULT_CLAUDE_MODEL, DEFAULT_CLAUDE_BASE_URL } from '../lib/computer/model.js';
14
+ import { TASK_PREVIEW_MAX_CHARS } from '../lib/computer/sessions-list.js';
15
+ import { runComputerSessionsCommand } from './computer-sessions-picker.js';
16
+ import { truncate } from '../lib/events.js';
14
17
  // Help groups — mirror `agents browser` so the mental model carries over.
15
18
  const COMPUTER_HELP_GROUPS = [
16
19
  { title: 'Installation', names: ['setup'] },
@@ -18,6 +21,7 @@ const COMPUTER_HELP_GROUPS = [
18
21
  { title: 'Autonomous', names: ['run'] },
19
22
  { title: 'Observe', names: ['apps', 'describe', 'screenshot', 'get-text'] },
20
23
  { title: 'Interact', names: ['launch', 'raise', 'click', 'right-click', 'type', 'type-text', 'key', 'drag', 'scroll', 'ax-action', 'focus', 'wait'] },
24
+ { title: 'History and discovery', names: ['sessions'] },
21
25
  ];
22
26
  // Subcommands that manage the `--host` remote path themselves (provisioning /
23
27
  // tunnel lifecycle, or daemon-state reporting that must degrade gracefully
@@ -109,6 +113,7 @@ export function registerComputerSubcommands(program) {
109
113
  registerRunCommand(program);
110
114
  registerScreenshotCommand(program);
111
115
  registerActionCommands(program);
116
+ registerSessionsCommand(program);
112
117
  registerCommandGroups(program, COMPUTER_HELP_GROUPS);
113
118
  }
114
119
  function registerStatusCommand(program) {
@@ -300,6 +305,7 @@ function registerRunCommand(program) {
300
305
  model: opts.model,
301
306
  maxTokens: opts.maxTokens,
302
307
  });
308
+ emitComputerRunTaskMarker({ task: opts.task, bundle: opts.bundle, host: opts.host });
303
309
  await withClient(async (client) => {
304
310
  const dispatch = makeVerbDispatcher(client, { host: opts.host });
305
311
  const targetInput = opts.bundle ? { bundle: opts.bundle } : {};
@@ -324,6 +330,37 @@ function registerRunCommand(program) {
324
330
  });
325
331
  });
326
332
  }
333
+ // sessions — task-first history over the computer.action event ledger (RUSH-2432),
334
+ // the computer counterpart of `agents browser sessions` (RUSH-2407). `agents
335
+ // sessions --computer` (sessions.ts) routes to the same runComputerSessionsCommand.
336
+ function registerSessionsCommand(program) {
337
+ program
338
+ .command('sessions')
339
+ .description('Browse computer-driving history, grouped by run — one row per `agents computer` invocation')
340
+ .option('--machine <name>', 'Only rows invoked from/driving this machine (hostname, machineId, or --host device)')
341
+ .option('--limit <n>', 'Cap the flat/--no-interactive table at this many rows (default 50; --json is unbounded)', (v) => parseInt(v, 10))
342
+ .option('--json', 'Emit machine-readable JSON')
343
+ .option('--no-interactive', 'Print the flat listing instead of opening the interactive run browser')
344
+ .action(async (opts) => {
345
+ await runComputerSessionsCommand({ machine: opts.machine, limit: opts.limit, json: opts.json, interactive: opts.interactive });
346
+ });
347
+ }
348
+ /**
349
+ * Emit a `computer.action` marker for `computer run`'s whole loop process, so
350
+ * `agents computer sessions` groups every verb the loop drives under one
351
+ * task-labeled row instead of a bare pid with no task text (see
352
+ * lib/computer/sessions-list.ts's "Grouping key" docblock note). The task
353
+ * text is bounded to `TASK_PREVIEW_MAX_CHARS` — never the full unbounded
354
+ * `--task` string — matching that module's retention/privacy note. Exported
355
+ * so the truncation behavior is directly unit-testable against the real
356
+ * event ledger, the same seam `computer-actions.test.ts` already uses for
357
+ * `emitComputerAction`.
358
+ */
359
+ export function emitComputerRunTaskMarker(opts) {
360
+ emitComputerAction('run', undefined, { bundle: opts.bundle, host: opts.host }, {
361
+ task: truncate(opts.task, TASK_PREVIEW_MAX_CHARS),
362
+ });
363
+ }
327
364
  // Fold the target bundle into the task text so the model biases toward it.
328
365
  function describeTaskWithTarget(task, bundle) {
329
366
  return bundle ? `${task}\n(Target app bundle id: ${bundle})` : task;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Unified configuration command barrel.
3
+ *
4
+ * `agents config` consolidates the fragmented config surface into one namespace:
5
+ * - run defaults (model, mode, effort)
6
+ * - tier overrides (folded into the run namespace)
7
+ * - interactive host
8
+ * - usage primary host
9
+ * - browser profile
10
+ * - local projects root
11
+ * - per-device config keys
12
+ *
13
+ * The underlying YAML schema is unchanged; this command translates the new key
14
+ * grammar into reads/writes of the existing stores.
15
+ */
16
+ import type { Command } from 'commander';
17
+ export declare function registerConfigCommand(program: Command): void;