@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
@@ -77,6 +77,20 @@ export interface Task {
77
77
  tabs: Record<string, string>;
78
78
  currentTabId?: string;
79
79
  createdAt: number;
80
+ /**
81
+ * When this task last did anything. Stamped at creation (equal to
82
+ * `createdAt`) and refreshed by every task-scoped action, because every one
83
+ * of them resolves the task through `BrowserService.findTask`.
84
+ *
85
+ * Read by the idle half of the abandoned-task reaper (`hygiene.ts`): a task
86
+ * nobody has driven for `idleMs` is stopped so its tabs stop piling up in the
87
+ * profile window (RUSH-2622).
88
+ *
89
+ * Persisted in tasks.json. Tasks written before RUSH-2622 carry none;
90
+ * `loadTaskState` normalizes those to `createdAt` on read, so every task in
91
+ * memory has one and the reaper never has to guess.
92
+ */
93
+ lastActionAt: number;
80
94
  pid: number;
81
95
  /**
82
96
  * Resolved actor id (`resolveActor().id`) stamped at task start — WHO launched
@@ -93,6 +107,13 @@ export interface Task {
93
107
  * from the caller over IPC. Optional: tasks from before this shipped carry none.
94
108
  */
95
109
  launchId?: string;
110
+ /**
111
+ * The agent session that started this task (`$AGENT_SESSION_ID`), forwarded
112
+ * from the caller at `start`. The durable copy lives in the `browser_sessions`
113
+ * table, which survives `stop`; this in-memory/tasks.json copy is the live one
114
+ * (RUSH-2549).
115
+ */
116
+ sessionId?: string;
96
117
  /**
97
118
  * Per-tab snapshot of the last ref listing captured for that tab
98
119
  * (shortId -> {descriptors, opts}). Persisted to tasks.json so a later
@@ -144,7 +165,24 @@ export interface HistoricalTask {
144
165
  /** Actor id who launched the task (RUSH-2020); absent for pre-RUSH-2020 history. */
145
166
  owner?: string;
146
167
  }
147
- export type IPCAction = 'start' | 'record-start' | 'record-stop' | 'done' | 'stop' | 'status' | 'history' | 'navigate' | 'tab-add' | 'tab-focus' | 'tab-close' | 'tab-list' | 'evaluate' | 'screenshot' | 'pdf' | 'refs' | 'click' | 'type' | 'press' | 'hover' | 'scroll' | 'set-viewport' | 'set-device' | 'console' | 'errors' | 'requests' | 'response-body' | 'wait' | 'set-download-path' | 'wait-download' | 'upload' | 'getAppLogs' | 'version';
168
+ /**
169
+ * Why the reaper stopped a task. `session-dead` — the agent session (or run)
170
+ * that started it is provably gone; `idle` — nothing has driven it for the
171
+ * idle window. See `hygiene.ts`.
172
+ */
173
+ export type ReapReason = 'session-dead' | 'idle';
174
+ /** One task the reaper stopped (or, under `dryRun`, would have stopped). */
175
+ export interface ReapedTask {
176
+ task: string;
177
+ profile: string;
178
+ reason: ReapReason;
179
+ }
180
+ export interface ReapResult {
181
+ closed: ReapedTask[];
182
+ /** Tasks left alone this pass: still live, still inside the idle window, or recording. */
183
+ skipped: number;
184
+ }
185
+ export type IPCAction = 'start' | 'gc' | 'record-start' | 'record-stop' | 'done' | 'stop' | 'status' | 'history' | 'navigate' | 'tab-add' | 'tab-focus' | 'tab-close' | 'tab-list' | 'evaluate' | 'screenshot' | 'pdf' | 'refs' | 'click' | 'type' | 'press' | 'hover' | 'scroll' | 'set-viewport' | 'set-device' | 'console' | 'errors' | 'requests' | 'response-body' | 'wait' | 'set-download-path' | 'wait-download' | 'upload' | 'getAppLogs' | 'version';
148
186
  export interface IPCRequest {
149
187
  action: IPCAction;
150
188
  task?: string;
@@ -194,8 +232,30 @@ export interface IPCRequest {
194
232
  until?: string;
195
233
  appLevel?: string;
196
234
  skipDomainSkill?: boolean;
235
+ /**
236
+ * Browser start: always open a new tab. Without it, `start --url` reclaims a
237
+ * tab that an ABANDONED task is still holding on this exact URL rather than
238
+ * opening a duplicate (RUSH-2622). A tab held by a live task, or one nobody's
239
+ * task owns (the user's own), is never taken either way — set this when the
240
+ * caller wants its own tab regardless.
241
+ */
242
+ fresh?: boolean;
243
+ idleMinutes?: number;
244
+ dryRun?: boolean;
197
245
  actor?: string;
198
246
  launchId?: string;
247
+ /**
248
+ * The calling agent session (`$AGENT_SESSION_ID` / `$AGENTS_SESSION_ID`) —
249
+ * the id that answers "which agent drove this task" and the one persisted to
250
+ * `browser_sessions` (RUSH-2549).
251
+ *
252
+ * This is the primary identity, not a spare: `launchId` alone was the join
253
+ * key, and a fleet measurement found it present on only 2 of 5 live agent
254
+ * processes while a session id was on 5 of 5 — every agent reaching the
255
+ * browser carries one. It is the same env `stampProvenance()` already reads
256
+ * for `computer.action` events, so both tool surfaces key on one signal.
257
+ */
258
+ sessionId?: string;
199
259
  }
200
260
  /** Subset of IPCResponse describing a recording start result. */
201
261
  export interface RecordStartFields {
@@ -217,6 +277,8 @@ export interface IPCResponse {
217
277
  tabs?: TabInfo[];
218
278
  profiles?: ProfileStatus[];
219
279
  history?: HistoricalTask[];
280
+ /** `gc`: what the abandoned-task reaper closed (or would close under dryRun). */
281
+ reaped?: ReapResult;
220
282
  result?: unknown;
221
283
  path?: string;
222
284
  bytes?: number;
@@ -20,6 +20,8 @@ export interface ByokUsageResult {
20
20
  error: string | null;
21
21
  }
22
22
  export declare function setByokFetchForTest(fn: typeof globalThis.fetch): void;
23
+ export declare const BYOK_REFRESH_INTERVAL_MS: number;
24
+ export declare function setByokCachePathForTest(value: string | null): string | null;
23
25
  export declare function resetByokCacheForTest(): void;
24
26
  export declare function hasByokProvider(provider: string): boolean;
25
27
  export declare function renderByokBar(result: ByokUsageResult): string;
@@ -30,9 +32,14 @@ export declare function renderByokBar(result: ByokUsageResult): string;
30
32
  * Returns a `ByokUsageResult` with `budget: null` when the token is absent
31
33
  * from the keychain (so the caller can skip rendering a bar without error).
32
34
  *
33
- * Results are SWR-cached per `keychainItem` so harnesses sharing one API key
34
- * deduplicate to a single network request.
35
+ * Ordinary reads are cache-only. Explicit refreshes are serialized per provider
36
+ * credential across every agents-cli process on the device.
35
37
  */
36
38
  export declare function getByokUsageForHarness(profile: Profile, opts?: {
37
39
  forceRefresh?: boolean;
38
40
  }): Promise<ByokUsageResult | null>;
41
+ /** Refresh each configured BYOK credential when its daemon-owned snapshot is due. */
42
+ export declare function refreshDueByokUsage(profiles: Profile[], now?: number): Promise<{
43
+ refreshed: number;
44
+ skipped: number;
45
+ }>;
@@ -8,31 +8,81 @@
8
8
  * API rather than the CLI's own usage tracking.
9
9
  */
10
10
  import { hasKeychainToken, getKeychainToken } from './secrets/profiles.js';
11
- import { renderBar, getUsageColor, USAGE_CACHE_FRESH_MS, USAGE_CACHE_SWR_MS } from './usage.js';
11
+ import { renderBar, getUsageColor } from './usage.js';
12
+ import * as fs from 'node:fs';
13
+ import * as path from 'node:path';
14
+ import { createHash } from 'node:crypto';
15
+ import { getCacheDir } from './state.js';
16
+ import { atomicWriteFileSync, ensureLockTarget, withFileLock } from './fs-atomic.js';
17
+ import { withRefreshLease } from './refresh-coordinator.js';
18
+ import { findAccount, resolveCredentialAccount } from './account-registry.js';
19
+ import { getAccountProvider } from './account-provider-registry.js';
12
20
  // ─── Injectable fetch seam (tests only) ──────────────────────────────────────
13
21
  let _fetch = globalThis.fetch;
14
22
  export function setByokFetchForTest(fn) {
15
23
  _fetch = fn;
16
24
  }
17
- const _cache = new Map();
18
- export function resetByokCacheForTest() {
19
- _cache.clear();
25
+ let cachePathOverride = null;
26
+ function cachePath() {
27
+ return cachePathOverride ?? path.join(getCacheDir(), 'byok-usage.json');
20
28
  }
21
- async function fetchOpenRouter(keychainItem) {
29
+ function readCache() {
22
30
  try {
23
- if (!hasKeychainToken(keychainItem))
24
- return { budget: null, error: null };
31
+ const parsed = JSON.parse(fs.readFileSync(cachePath(), 'utf-8'));
32
+ return parsed?.version === 1 && parsed.entries ? parsed.entries : {};
25
33
  }
26
34
  catch {
27
- return { budget: null, error: null };
35
+ return {};
36
+ }
37
+ }
38
+ function writeCacheEntry(key, entry) {
39
+ const target = cachePath();
40
+ ensureLockTarget(target, JSON.stringify({ version: 1, entries: {} }));
41
+ withFileLock(target, () => {
42
+ atomicWriteFileSync(target, JSON.stringify({ version: 1, entries: { ...readCache(), [key]: entry } }));
43
+ });
44
+ }
45
+ function byokCacheKey(profile) {
46
+ return createHash('sha256').update(`${profile.provider}\0${profile.account ?? profile.auth?.keychainItem ?? ''}`).digest('hex');
47
+ }
48
+ export const BYOK_REFRESH_INTERVAL_MS = 5 * 60_000;
49
+ export function setByokCachePathForTest(value) {
50
+ const previous = cachePathOverride;
51
+ cachePathOverride = value;
52
+ return previous;
53
+ }
54
+ export function resetByokCacheForTest() {
55
+ try {
56
+ fs.unlinkSync(cachePath());
57
+ }
58
+ catch { /* absent */ }
59
+ }
60
+ function resolveByokToken(profile) {
61
+ if (profile.account) {
62
+ try {
63
+ const account = findAccount(profile.account);
64
+ if (!account)
65
+ return null;
66
+ const resolved = resolveCredentialAccount(profile.account, profile.host.agent, profile.provider);
67
+ return resolved.env[getAccountProvider(account.provider).envFor(profile.host.agent, account.auth)] ?? null;
68
+ }
69
+ catch {
70
+ return null;
71
+ }
28
72
  }
29
- let token;
73
+ const keychainItem = profile.auth?.keychainItem;
74
+ if (!keychainItem)
75
+ return null;
30
76
  try {
31
- token = getKeychainToken(keychainItem);
77
+ if (!hasKeychainToken(keychainItem))
78
+ return null;
79
+ return getKeychainToken(keychainItem);
32
80
  }
33
81
  catch {
34
- return { budget: null, error: null };
82
+ return null;
35
83
  }
84
+ }
85
+ async function fetchOpenRouter(token) {
36
86
  try {
37
87
  const res = await _fetch('https://openrouter.ai/api/v1/key', {
38
88
  headers: { Authorization: `Bearer ${token}` },
@@ -59,8 +109,37 @@ async function fetchOpenRouter(keychainItem) {
59
109
  return { budget: null, error: String(err) };
60
110
  }
61
111
  }
112
+ async function fetchDeepInfra(token) {
113
+ try {
114
+ const res = await _fetch('https://api.deepinfra.com/payment/checklist', {
115
+ headers: { Authorization: `Bearer ${token}` },
116
+ });
117
+ if (!res.ok)
118
+ return { budget: null, error: `HTTP ${res.status}` };
119
+ const json = (await res.json());
120
+ const limitUsd = json.limit !== null && json.limit >= 0 ? json.limit : null;
121
+ const usedUsd = json.recent;
122
+ const remainingUsd = limitUsd !== null
123
+ ? Math.max(0, limitUsd - usedUsd)
124
+ : json.stripe_balance < 0 ? -json.stripe_balance : null;
125
+ return {
126
+ budget: {
127
+ limitUsd,
128
+ remainingUsd,
129
+ usedUsd,
130
+ usedPercent: limitUsd !== null && limitUsd > 0 ? (usedUsd / limitUsd) * 100 : null,
131
+ fetchedAt: new Date(),
132
+ },
133
+ error: null,
134
+ };
135
+ }
136
+ catch (err) {
137
+ return { budget: null, error: String(err) };
138
+ }
139
+ }
62
140
  const BYOK_REGISTRY = {
63
141
  openrouter: { fetch: fetchOpenRouter },
142
+ deepinfra: { fetch: fetchDeepInfra },
64
143
  };
65
144
  export function hasByokProvider(provider) {
66
145
  return Object.prototype.hasOwnProperty.call(BYOK_REGISTRY, provider);
@@ -72,7 +151,8 @@ export function renderByokBar(result) {
72
151
  const { budget } = result;
73
152
  if (budget.limitUsd === null) {
74
153
  const bar = renderBar(0, 10, 0);
75
- return `$: ${bar} $${budget.usedUsd.toFixed(2)} used (unlimited)`;
154
+ const credit = budget.remainingUsd !== null ? `$${budget.remainingUsd.toFixed(2)} credit, ` : '';
155
+ return `$: ${bar} ${credit}$${budget.usedUsd.toFixed(2)} used (no spending limit)`;
76
156
  }
77
157
  const pct = budget.usedPercent ?? 0;
78
158
  const bar = renderBar(pct, 10, pct > 0 ? 1 : 0);
@@ -89,29 +169,51 @@ export function renderByokBar(result) {
89
169
  * Returns a `ByokUsageResult` with `budget: null` when the token is absent
90
170
  * from the keychain (so the caller can skip rendering a bar without error).
91
171
  *
92
- * Results are SWR-cached per `keychainItem` so harnesses sharing one API key
93
- * deduplicate to a single network request.
172
+ * Ordinary reads are cache-only. Explicit refreshes are serialized per provider
173
+ * credential across every agents-cli process on the device.
94
174
  */
95
175
  export async function getByokUsageForHarness(profile, opts) {
96
- if (!profile.provider || !hasByokProvider(profile.provider) || !profile.auth)
176
+ if (!profile.provider || !hasByokProvider(profile.provider) || (!profile.auth && !profile.account))
97
177
  return null;
98
- const keychainItem = profile.auth.keychainItem;
99
178
  const provider = BYOK_REGISTRY[profile.provider];
100
- const now = Date.now();
101
- const cached = _cache.get(keychainItem);
102
- if (!opts?.forceRefresh && cached) {
103
- const age = now - cached.fetchedAt;
104
- if (age < USAGE_CACHE_FRESH_MS) {
105
- return cached.result;
106
- }
107
- if (age < USAGE_CACHE_SWR_MS) {
108
- void provider.fetch(keychainItem).then((result) => {
109
- _cache.set(keychainItem, { result, fetchedAt: Date.now() });
110
- });
111
- return cached.result;
179
+ const cacheKey = byokCacheKey(profile);
180
+ const cached = readCache()[cacheKey];
181
+ if (!opts?.forceRefresh)
182
+ return cached?.result ?? { budget: null, error: 'stale' };
183
+ const previousFetchedAt = cached?.fetchedAt ?? 0;
184
+ return withRefreshLease({
185
+ scope: 'byok-usage',
186
+ key: cacheKey,
187
+ readCompleted: () => readCache()[cacheKey] ?? null,
188
+ isCompleted: (entry) => entry.fetchedAt > previousFetchedAt,
189
+ refresh: async () => {
190
+ const token = resolveByokToken(profile);
191
+ const result = token ? await provider.fetch(token) : { budget: null, error: null };
192
+ const entry = { result, fetchedAt: Math.max(Date.now(), previousFetchedAt + 1) };
193
+ writeCacheEntry(cacheKey, entry);
194
+ return entry;
195
+ },
196
+ }).then((entry) => entry.result);
197
+ }
198
+ /** Refresh each configured BYOK credential when its daemon-owned snapshot is due. */
199
+ export async function refreshDueByokUsage(profiles, now = Date.now()) {
200
+ const due = new Map();
201
+ for (const profile of profiles) {
202
+ if (!profile.provider || (!profile.auth && !profile.account) || !hasByokProvider(profile.provider))
203
+ continue;
204
+ due.set(byokCacheKey(profile), profile);
205
+ }
206
+ let refreshed = 0;
207
+ let skipped = 0;
208
+ const cache = readCache();
209
+ for (const [key, profile] of due) {
210
+ const entry = cache[key];
211
+ if (entry && now - entry.fetchedAt < BYOK_REFRESH_INTERVAL_MS) {
212
+ skipped += 1;
213
+ continue;
112
214
  }
215
+ await getByokUsageForHarness(profile, { forceRefresh: true });
216
+ refreshed += 1;
113
217
  }
114
- const result = await provider.fetch(keychainItem);
115
- _cache.set(keychainItem, { result, fetchedAt: now });
116
- return result;
218
+ return { refreshed, skipped };
117
219
  }
@@ -1,5 +1,16 @@
1
1
  export declare const BUN_VIRTUAL_ROOT: RegExp;
2
2
  export declare function getAgentsBinPath(argv1?: string | undefined, execPath?: string): string;
3
+ /**
4
+ * Directory that contains the `agents` launcher usable for PATH resolution.
5
+ *
6
+ * When the running entry IS the launcher (a compiled binary or an extension-less
7
+ * shim named `agents`), this is just `dirname(getAgentsBinPath())`. When the
8
+ * running entry is a script inside `dist/` reached via a symlink/shim elsewhere
9
+ * (the npm global-install shape), we look for a launcher whose realpath points at
10
+ * the same entry and return that launcher's directory. Falls back to the entry's
11
+ * own directory when no launcher is found.
12
+ */
13
+ export declare function getAgentsBinDir(): string;
3
14
  /**
4
15
  * A CLI entry must be launched through the Node runtime when it is a Node
5
16
  * script — a `.js`/`.cjs`/`.mjs` file, OR a symlink/extension-less shim whose
@@ -19,6 +19,7 @@
19
19
  */
20
20
  import { execFileSync } from 'child_process';
21
21
  import * as fs from 'fs';
22
+ import * as os from 'os';
22
23
  import * as path from 'path';
23
24
  export const BUN_VIRTUAL_ROOT = /[/\\]\$bunfs[/\\]root[/\\]/;
24
25
  function resolveBunStandaloneEntry(entry, execPath) {
@@ -61,6 +62,51 @@ export function getAgentsBinPath(argv1 = process.argv[1], execPath = process.exe
61
62
  return 'agents';
62
63
  }
63
64
  }
65
+ /**
66
+ * Directory that contains the `agents` launcher usable for PATH resolution.
67
+ *
68
+ * When the running entry IS the launcher (a compiled binary or an extension-less
69
+ * shim named `agents`), this is just `dirname(getAgentsBinPath())`. When the
70
+ * running entry is a script inside `dist/` reached via a symlink/shim elsewhere
71
+ * (the npm global-install shape), we look for a launcher whose realpath points at
72
+ * the same entry and return that launcher's directory. Falls back to the entry's
73
+ * own directory when no launcher is found.
74
+ */
75
+ export function getAgentsBinDir() {
76
+ const bin = getAgentsBinPath();
77
+ const base = path.basename(bin);
78
+ if (base === 'agents' || base === 'agents.exe' || base === 'agents.cmd') {
79
+ return path.dirname(bin);
80
+ }
81
+ const realBin = (() => {
82
+ try {
83
+ return fs.realpathSync(bin);
84
+ }
85
+ catch {
86
+ return bin;
87
+ }
88
+ })();
89
+ const home = os.homedir();
90
+ const candidates = [
91
+ path.join(home, '.local', 'bin'),
92
+ '/usr/local/bin',
93
+ '/opt/homebrew/bin',
94
+ path.join(home, '.npm-global', 'bin'),
95
+ path.join(home, '.bun', 'bin'),
96
+ path.dirname(process.execPath),
97
+ ];
98
+ for (const dir of candidates) {
99
+ for (const name of ['agents', 'agents.exe', 'agents.cmd']) {
100
+ const launcher = path.join(dir, name);
101
+ try {
102
+ if (fs.realpathSync(launcher) === realBin)
103
+ return dir;
104
+ }
105
+ catch { /* ignore */ }
106
+ }
107
+ }
108
+ return path.dirname(bin);
109
+ }
64
110
  /**
65
111
  * A CLI entry must be launched through the Node runtime when it is a Node
66
112
  * script — a `.js`/`.cjs`/`.mjs` file, OR a symlink/extension-less shim whose
@@ -4,7 +4,7 @@
4
4
  * A thin adapter over the hosts subsystem (lib/hosts/*): `agents cloud run
5
5
  * --provider host --host <name>` dispatches through the SAME detached-SSH
6
6
  * launch as `agents run --host`, and the resulting task shows up in BOTH
7
- * `agents cloud ps` and `agents hosts ps` — one store (the host-task sidecars
7
+ * `agents cloud ps` and `agents devices ps` — one store (the host-task sidecars
8
8
  * under ~/.agents/.cache/hosts/), two views. No new transport, no relay: SSH
9
9
  * is the only wire, exactly like the rest of the hosts design (docs/hosts.md).
10
10
  *
@@ -4,7 +4,7 @@
4
4
  * A thin adapter over the hosts subsystem (lib/hosts/*): `agents cloud run
5
5
  * --provider host --host <name>` dispatches through the SAME detached-SSH
6
6
  * launch as `agents run --host`, and the resulting task shows up in BOTH
7
- * `agents cloud ps` and `agents hosts ps` — one store (the host-task sidecars
7
+ * `agents cloud ps` and `agents devices ps` — one store (the host-task sidecars
8
8
  * under ~/.agents/.cache/hosts/), two views. No new transport, no relay: SSH
9
9
  * is the only wire, exactly like the rest of the hosts design (docs/hosts.md).
10
10
  *
@@ -77,7 +77,7 @@ export class HostCloudProvider {
77
77
  async dispatch(options) {
78
78
  const hostName = options.providerOptions?.host;
79
79
  if (!hostName) {
80
- throw new MissingTargetError('host', 'No host given. Pass --host <name> (a registered host, a device, a capability tag, or user@host).', 'List your machines: agents hosts list · register more: agents devices sync / agents hosts add');
80
+ throw new MissingTargetError('host', 'No host given. Pass --host <name> (a registered host, a device, a capability tag, or user@host).', 'List your machines: agents devices list · register more: agents devices sync');
81
81
  }
82
82
  if (resolveDispatchRepos(options).length > 0) {
83
83
  throw new Error('--repo has no meaning for --provider host — the run executes in a directory on the machine, not a cloned repo. ' +
@@ -46,7 +46,7 @@ function initProviders() {
46
46
  providers.set('factory', new FactoryCloudProvider(config.providers?.factory));
47
47
  providers.set('antigravity', new AntigravityCloudProvider(config.providers?.antigravity));
48
48
  providers.set('cursor', new CursorCloudProvider(config.providers?.cursor));
49
- // Your own machines (agents hosts / agents devices) over SSH. No agent
49
+ // Your own machines (agents devices) over SSH. No agent
50
50
  // auto-routes here — it's always an explicit --provider host / --host choice.
51
51
  providers.set('host', new HostCloudProvider());
52
52
  }
@@ -15,7 +15,7 @@ import type { JobTrigger } from '../routines.js';
15
15
  * - `factory` — Factory Droid Computers (`droid computer ssh` + remote `droid exec`)
16
16
  * - `antigravity` — Google Gemini Managed Agents (Interactions API)
17
17
  * - `cursor` — Cursor Cloud Agents REST API
18
- * - `host` — a machine you own (`agents hosts` / `agents devices`), over SSH
18
+ * - `host` — a machine you own (`agents devices`), over SSH
19
19
  *
20
20
  * Agents route to their native cloud automatically (see `cloudProvider` in the
21
21
  * agent registry); `--provider` overrides. Nothing auto-routes to `host` — it
@@ -19,6 +19,8 @@ export interface CommandMetadata {
19
19
  since?: string;
20
20
  /** Exclusive upper bound on agent CLI version for this command. */
21
21
  until?: string;
22
+ /** Alternate names this command also resolves under (frontmatter `aliases:`). */
23
+ aliases?: string[];
22
24
  }
23
25
  export type CommandApplyFailReason = 'unsupported' | 'agent_excluded' | 'too_old' | 'too_new';
24
26
  export type CommandApplyResult = {
@@ -12,6 +12,7 @@ import * as yaml from 'yaml';
12
12
  import { AGENTS, ensureCommandsDir, agentConfigDirName, resolveAgentName } from './agents.js';
13
13
  import { capableAgents, isCapable, supports } from './capabilities.js';
14
14
  import { isDirectoryDoc } from './resources.js';
15
+ import { normalizeAliases } from './resource-aliases.js';
15
16
  import { markdownToToml } from './convert.js';
16
17
  import { getCommandsDir, getUserCommandsDir, getEnabledExtraRepos, getProjectAgentsDir, getSkillsDir, getTrashCommandsDir } from './state.js';
17
18
  import { getEffectiveHome, getVersionHomePath, listInstalledVersions, resolveVersion } from './versions.js';
@@ -102,6 +103,7 @@ export function parseCommandMetadata(filePath) {
102
103
  agents: parseAgentsField(parsed.agents),
103
104
  since: typeof parsed.since === 'string' ? parsed.since : undefined,
104
105
  until: typeof parsed.until === 'string' ? parsed.until : undefined,
106
+ aliases: normalizeAliases(parsed.aliases),
105
107
  };
106
108
  }
107
109
  }
@@ -0,0 +1,150 @@
1
+ import type { SessionMeta } from '../session/types.js';
2
+ /** Max chars of a `run --task` description persisted to the ledger — see the
3
+ * module docblock's retention/privacy note. */
4
+ export declare const TASK_PREVIEW_MAX_CHARS = 200;
5
+ /** One `computer.action` ledger entry, narrowed to the fields this module
6
+ * renders or groups by. */
7
+ export interface ComputerAction {
8
+ /** CLI verb: `click`, `type`, `screenshot`, … or `run` for the task marker
9
+ * `registerRunCommand` emits before entering the model loop. */
10
+ verb: string;
11
+ ts: string;
12
+ tsMs: number;
13
+ /** The emitting CLI process's own pid — the run/task grouping key. */
14
+ pid: number;
15
+ /** Unique for the emitting CLI process; absent only on legacy ledger rows. */
16
+ invocationId?: string;
17
+ /** The driven app's pid, when resolved. */
18
+ targetPid?: number;
19
+ bundle?: string;
20
+ /** `--host <device>` target when this action drove a remote daemon. */
21
+ host?: string;
22
+ /** Truncated `--task` text; only ever present on a `verb: 'run'` marker. */
23
+ task?: string;
24
+ sessionId?: string;
25
+ launchId?: string;
26
+ agent?: string;
27
+ machineId?: string;
28
+ hostname?: string;
29
+ }
30
+ /** Read `computer.action` events straight from the durable event ledger,
31
+ * newest first, bounded by `limit`. Malformed/legacy records (missing
32
+ * `command` or `pid`, or an unparseable `ts`) are skipped, never thrown —
33
+ * the ledger is a plain rotated JSONL file another process can be mid-write
34
+ * or mid-rotate against. */
35
+ export declare function listComputerActions(opts?: {
36
+ limit?: number;
37
+ }): ComputerAction[];
38
+ /** Why a row carries no session digest: `linked` resolved one, `unresolved`
39
+ * has a sessionId/launchId but no matching indexed session, `unlinked` has
40
+ * neither (a bare terminal invocation with no agent session env at all). */
41
+ export type ComputerRunLinkStatus = 'linked' | 'unresolved' | 'unlinked';
42
+ /** One task-first row: every `computer.action` emitted by one CLI process
43
+ * (see the module docblock's "Grouping key" note), plus the agent session
44
+ * it links to when resolvable. */
45
+ export interface ComputerRunRow {
46
+ /** Invoking CLI process's pid. Absent on a run recovered from the DB after
47
+ * the ledger pruned — that process is long gone and its pid unknowable. */
48
+ pid?: number;
49
+ invocationId?: string;
50
+ /**
51
+ * Total actions for a run recovered from the DB after the event ledger
52
+ * pruned its individual actions. Set ONLY on such rows: when it is present,
53
+ * `actions`/`counts` are empty because the per-verb detail is genuinely gone,
54
+ * and this total is all that survived. Live ledger rows leave it undefined
55
+ * and report real per-verb `counts` instead.
56
+ */
57
+ recoveredActionCount?: number;
58
+ /** Truncated task description — present only for a `computer run --task`
59
+ * invocation; a bare verb call has none. */
60
+ task?: string;
61
+ /** Invoking machine's hostname — the CLI's own machine, not necessarily
62
+ * the driven one (see `remoteHost`). */
63
+ machine: string;
64
+ machineId?: string;
65
+ /** `--host <device>` target when the run drove a remote (Windows) daemon. */
66
+ remoteHost?: string;
67
+ /** Best-known target app bundle across the run's actions. */
68
+ bundle?: string;
69
+ agent?: string;
70
+ sessionId?: string;
71
+ launchId?: string;
72
+ linkStatus: ComputerRunLinkStatus;
73
+ linkedSession?: SessionMeta;
74
+ /** Newest first; excludes the `run` task marker itself. */
75
+ actions: ComputerAction[];
76
+ /** Per-verb counts over `actions` (never includes the `run` marker). */
77
+ counts: Record<string, number>;
78
+ /** Oldest action's mtime — the row's start. */
79
+ startMs: number;
80
+ /** Newest action's mtime — the row's sort/age key. */
81
+ endMs: number;
82
+ }
83
+ /**
84
+ * Group flat ledger actions into task-first rows, newest first. Pure:
85
+ * session resolvers are passed in, so this has no filesystem/session-index
86
+ * dependency and is unit-testable with synthetic data (see
87
+ * {@link buildComputerSessionRows} for the impure disk/index-reading caller).
88
+ */
89
+ export declare function groupIntoComputerRuns(actions: ComputerAction[], resolveSession?: (sessionId: string) => SessionMeta | null, resolveLaunch?: (launchId: string) => SessionMeta | null): ComputerRunRow[];
90
+ /** Build task-first rows from the real ledger, resolving each row's owning
91
+ * session against the live indexes. The interactive picker's (and the
92
+ * flat/`--json` printer's) data source. `machine` narrows to rows whose
93
+ * invoking hostname, machineId, or `--host` target contains the substring. */
94
+ export declare function buildComputerSessionRows(opts?: {
95
+ limit?: number;
96
+ machine?: string;
97
+ }): ComputerRunRow[];
98
+ /**
99
+ * Search predicate for the interactive picker: task text, machine/remote
100
+ * host, target bundle, the linked session's agent/topic/label, or any
101
+ * driven verb in the row.
102
+ */
103
+ export declare function matchesComputerSessionRow(row: ComputerRunRow, queryText: string): boolean;
104
+ /** Human one-line summary of a row's per-verb action counts, most frequent
105
+ * first — shared by the flat table and the interactive picker's label. */
106
+ /**
107
+ * One row's action summary — the single renderer every surface should use.
108
+ *
109
+ * A run recovered from the DB after the ledger pruned has no per-verb detail,
110
+ * only a total. Rendering it through the per-verb formatter printed
111
+ * "(no actions)", which is indistinguishable from a run that did nothing — so a
112
+ * 40-action run read as empty. Report the surviving total, and say plainly that
113
+ * the breakdown is gone rather than implying we still have it.
114
+ */
115
+ export declare function formatRowActions(row: ComputerRunRow): string;
116
+ export declare function formatActionCounts(counts: Record<string, number>): string;
117
+ /** Human table for the CLI. Returns lines (no trailing newline). */
118
+ export declare function renderComputerSessionRows(rows: ComputerRunRow[]): string;
119
+ /** Default row cap for the flat/non-interactive table. A computer row is
120
+ * much finer-grained than a browser task — real usage is mostly one
121
+ * standalone verb per CLI invocation, not a `run --task` loop, so an
122
+ * unbounded flat dump against real history reads as hundreds of one-action
123
+ * rows (confirmed against a real machine's history while building this).
124
+ * The interactive picker has no such cap (it's searchable); only the
125
+ * static table needs one. `--limit` overrides. */
126
+ export declare const DEFAULT_ROW_DISPLAY_LIMIT = 50;
127
+ /** Slice `rows` to at most `limit` (newest first, rows are already sorted),
128
+ * and report how many were dropped — pure, so the cap arithmetic and the
129
+ * trailer condition are unit-testable without a console spy. */
130
+ export declare function applyRowDisplayLimit(rows: ComputerRunRow[], limit?: number): {
131
+ shown: ComputerRunRow[];
132
+ more: number;
133
+ };
134
+ /**
135
+ * Shared CLI action for `agents computer sessions` and `agents sessions
136
+ * --computer`. Non-interactive by design (the interactive routing decision
137
+ * lives in `commands/computer-sessions-picker.ts`, mirroring
138
+ * `runBrowserSessions`/`runBrowserSessionsCommand`'s split).
139
+ */
140
+ export declare function runComputerSessions(opts: {
141
+ machine?: string;
142
+ json?: boolean;
143
+ limit?: number;
144
+ }): void;
145
+ /** Print already-collected rows. Fleet callers use this after merging local and
146
+ * remote JSON so text, limits, and JSON keep exactly one renderer. */
147
+ export declare function printComputerSessionRows(rows: ComputerRunRow[], opts: {
148
+ json?: boolean;
149
+ limit?: number;
150
+ }): void;