@phnx-labs/agents-cli 1.22.34 → 1.22.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) hide show
  1. package/CHANGELOG.md +672 -2
  2. package/README.md +82 -35
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.d.ts +15 -0
  5. package/dist/bootstrap.js +1211 -0
  6. package/dist/commands/accounts.d.ts +4 -11
  7. package/dist/commands/accounts.js +159 -27
  8. package/dist/commands/attach.js +17 -4
  9. package/dist/commands/audit.d.ts +8 -8
  10. package/dist/commands/audit.js +57 -47
  11. package/dist/commands/browser.js +15 -11
  12. package/dist/commands/cloud.js +1 -1
  13. package/dist/commands/commands.js +0 -11
  14. package/dist/commands/computer-actions.js +33 -0
  15. package/dist/commands/computer-sessions-picker.d.ts +21 -0
  16. package/dist/commands/computer-sessions-picker.js +141 -0
  17. package/dist/commands/computer.d.ts +16 -0
  18. package/dist/commands/computer.js +37 -0
  19. package/dist/commands/config.d.ts +17 -0
  20. package/dist/commands/config.js +401 -0
  21. package/dist/commands/cp.d.ts +84 -0
  22. package/dist/commands/cp.js +231 -0
  23. package/dist/commands/daemon.js +243 -14
  24. package/dist/commands/detach-core.d.ts +1 -1
  25. package/dist/commands/detach-core.js +12 -2
  26. package/dist/commands/detach.js +1 -1
  27. package/dist/commands/doctor.js +64 -5
  28. package/dist/commands/events.d.ts +24 -12
  29. package/dist/commands/events.js +144 -28
  30. package/dist/commands/exec.js +85 -41
  31. package/dist/commands/feed.d.ts +1 -1
  32. package/dist/commands/feed.js +16 -8
  33. package/dist/commands/focus.d.ts +33 -1
  34. package/dist/commands/focus.js +177 -17
  35. package/dist/commands/funnel.d.ts +1 -1
  36. package/dist/commands/go.js +9 -8
  37. package/dist/commands/harness-wizard.d.ts +1 -0
  38. package/dist/commands/harness-wizard.js +18 -20
  39. package/dist/commands/harness.d.ts +2 -0
  40. package/dist/commands/harness.js +59 -26
  41. package/dist/commands/hooks.js +0 -11
  42. package/dist/commands/inspect.d.ts +94 -1
  43. package/dist/commands/inspect.js +866 -40
  44. package/dist/commands/lease.d.ts +4 -4
  45. package/dist/commands/lease.js +6 -6
  46. package/dist/commands/login.js +0 -13
  47. package/dist/commands/logs.d.ts +2 -2
  48. package/dist/commands/logs.js +2 -2
  49. package/dist/commands/mcp.js +7 -2
  50. package/dist/commands/memory.js +7 -2
  51. package/dist/commands/message.d.ts +1 -1
  52. package/dist/commands/message.js +37 -6
  53. package/dist/commands/models.js +4 -0
  54. package/dist/commands/monitors.d.ts +0 -1
  55. package/dist/commands/monitors.js +199 -16
  56. package/dist/commands/open.d.ts +18 -0
  57. package/dist/commands/open.js +57 -0
  58. package/dist/commands/packages.js +2 -107
  59. package/dist/commands/plugins.js +6 -3
  60. package/dist/commands/profiles.d.ts +1 -0
  61. package/dist/commands/profiles.js +16 -160
  62. package/dist/commands/projects.d.ts +28 -0
  63. package/dist/commands/projects.js +125 -5
  64. package/dist/commands/reconnect.js +9 -3
  65. package/dist/commands/repo.js +42 -1
  66. package/dist/commands/resource-view.d.ts +17 -0
  67. package/dist/commands/resource-view.js +36 -14
  68. package/dist/commands/resume.js +9 -2
  69. package/dist/commands/routines.d.ts +0 -2
  70. package/dist/commands/routines.js +473 -289
  71. package/dist/commands/secrets.js +52 -9
  72. package/dist/commands/sessions-export.d.ts +47 -0
  73. package/dist/commands/sessions-export.js +116 -6
  74. package/dist/commands/sessions-import.d.ts +17 -0
  75. package/dist/commands/sessions-import.js +114 -6
  76. package/dist/commands/sessions-migrate.d.ts +27 -0
  77. package/dist/commands/sessions-migrate.js +50 -9
  78. package/dist/commands/sessions-picker.js +23 -4
  79. package/dist/commands/sessions-resume.d.ts +5 -3
  80. package/dist/commands/sessions-resume.js +30 -8
  81. package/dist/commands/sessions-watch.d.ts +2 -0
  82. package/dist/commands/sessions-watch.js +53 -0
  83. package/dist/commands/sessions.d.ts +66 -3
  84. package/dist/commands/sessions.js +298 -47
  85. package/dist/commands/set.d.ts +1 -1
  86. package/dist/commands/set.js +2 -2
  87. package/dist/commands/setup-browser.js +2 -2
  88. package/dist/commands/setup-mine.js +0 -1
  89. package/dist/commands/setup-preferences.js +1 -1
  90. package/dist/commands/setup-share.js +34 -4
  91. package/dist/commands/setup.d.ts +5 -0
  92. package/dist/commands/setup.js +26 -0
  93. package/dist/commands/share.d.ts +85 -0
  94. package/dist/commands/share.js +379 -8
  95. package/dist/commands/skills.js +0 -11
  96. package/dist/commands/snapshot.js +1 -1
  97. package/dist/commands/ssh.d.ts +18 -0
  98. package/dist/commands/ssh.js +549 -210
  99. package/dist/commands/sync.d.ts +5 -0
  100. package/dist/commands/sync.js +212 -32
  101. package/dist/commands/teams.d.ts +13 -0
  102. package/dist/commands/teams.js +187 -30
  103. package/dist/commands/tickets.d.ts +2 -0
  104. package/dist/commands/tickets.js +43 -0
  105. package/dist/commands/update.js +2 -4
  106. package/dist/commands/usage.js +5 -3
  107. package/dist/commands/versions.js +11 -5
  108. package/dist/commands/view.js +15 -7
  109. package/dist/commands/webhook.d.ts +2 -2
  110. package/dist/commands/webhook.js +7 -7
  111. package/dist/index.d.ts +18 -2
  112. package/dist/index.js +53 -1264
  113. package/dist/lib/account-catalog.d.ts +18 -0
  114. package/dist/lib/account-catalog.js +38 -0
  115. package/dist/lib/account-provider-registry.d.ts +18 -0
  116. package/dist/lib/account-provider-registry.js +59 -0
  117. package/dist/lib/account-registry.d.ts +40 -0
  118. package/dist/lib/account-registry.js +239 -0
  119. package/dist/lib/account-schema.d.ts +44 -0
  120. package/dist/lib/account-schema.js +91 -0
  121. package/dist/lib/account-state-service.d.ts +21 -0
  122. package/dist/lib/account-state-service.js +60 -0
  123. package/dist/lib/activity.d.ts +1 -1
  124. package/dist/lib/activity.js +8 -1
  125. package/dist/lib/add-dir.d.ts +80 -0
  126. package/dist/lib/add-dir.js +241 -0
  127. package/dist/lib/agent-cli-commands.d.ts +11 -0
  128. package/dist/lib/agent-cli-commands.js +30 -0
  129. package/dist/lib/agents.js +44 -36
  130. package/dist/lib/answer-router.js +1 -1
  131. package/dist/lib/audit/log.d.ts +10 -27
  132. package/dist/lib/audit/log.js +20 -33
  133. package/dist/lib/auth-health.d.ts +9 -2
  134. package/dist/lib/auth-health.js +42 -9
  135. package/dist/lib/auto-pull-worker.js +7 -3
  136. package/dist/lib/auto-pull.d.ts +44 -3
  137. package/dist/lib/auto-pull.js +88 -5
  138. package/dist/lib/binary-shadow.d.ts +28 -0
  139. package/dist/lib/binary-shadow.js +121 -0
  140. package/dist/lib/brand.js +9 -3
  141. package/dist/lib/browser/ipc.d.ts +30 -0
  142. package/dist/lib/browser/ipc.js +81 -4
  143. package/dist/lib/browser/profiles.d.ts +3 -2
  144. package/dist/lib/browser/profiles.js +65 -22
  145. package/dist/lib/browser/service.d.ts +4 -0
  146. package/dist/lib/browser/service.js +30 -3
  147. package/dist/lib/browser/sessions-list.d.ts +22 -2
  148. package/dist/lib/browser/sessions-list.js +54 -6
  149. package/dist/lib/browser/stream.d.ts +2 -0
  150. package/dist/lib/browser/stream.js +1 -0
  151. package/dist/lib/browser/types.d.ts +19 -0
  152. package/dist/lib/byok-usage.d.ts +9 -2
  153. package/dist/lib/byok-usage.js +133 -31
  154. package/dist/lib/cli-entry.d.ts +11 -0
  155. package/dist/lib/cli-entry.js +46 -0
  156. package/dist/lib/cloud/host.d.ts +1 -1
  157. package/dist/lib/cloud/host.js +2 -2
  158. package/dist/lib/cloud/registry.js +1 -1
  159. package/dist/lib/cloud/types.d.ts +1 -1
  160. package/dist/lib/codex-policy.d.ts +9 -1
  161. package/dist/lib/codex-policy.js +17 -2
  162. package/dist/lib/commands.d.ts +2 -0
  163. package/dist/lib/commands.js +2 -0
  164. package/dist/lib/computer/sessions-list.d.ts +150 -0
  165. package/dist/lib/computer/sessions-list.js +363 -0
  166. package/dist/lib/config-keys.d.ts +86 -0
  167. package/dist/lib/config-keys.js +193 -0
  168. package/dist/lib/config-machine-keys.d.ts +12 -0
  169. package/dist/lib/config-machine-keys.js +17 -0
  170. package/dist/lib/config-transfer.js +3 -4
  171. package/dist/lib/crabbox/cli.d.ts +2 -2
  172. package/dist/lib/crabbox/cli.js +3 -3
  173. package/dist/lib/daemon-health.d.ts +22 -0
  174. package/dist/lib/daemon-health.js +33 -3
  175. package/dist/lib/daemon-services.d.ts +50 -0
  176. package/dist/lib/daemon-services.js +147 -0
  177. package/dist/lib/daemon-ticks.d.ts +35 -66
  178. package/dist/lib/daemon-ticks.js +77 -159
  179. package/dist/lib/daemon.d.ts +72 -4
  180. package/dist/lib/daemon.js +792 -202
  181. package/dist/lib/deeplink/register.d.ts +49 -0
  182. package/dist/lib/deeplink/register.js +253 -0
  183. package/dist/lib/deeplink/url.d.ts +34 -0
  184. package/dist/lib/deeplink/url.js +78 -0
  185. package/dist/lib/device-config.d.ts +124 -29
  186. package/dist/lib/device-config.js +346 -141
  187. package/dist/lib/devices/config-migration.d.ts +42 -0
  188. package/dist/lib/devices/config-migration.js +203 -0
  189. package/dist/lib/devices/connect.js +14 -7
  190. package/dist/lib/devices/doctor-findings.d.ts +4 -1
  191. package/dist/lib/devices/doctor-findings.js +20 -1
  192. package/dist/lib/devices/harness-inventory.d.ts +11 -2
  193. package/dist/lib/devices/harness-inventory.js +0 -0
  194. package/dist/lib/devices/health.d.ts +1 -1
  195. package/dist/lib/devices/health.js +1 -1
  196. package/dist/lib/devices/pending.d.ts +22 -1
  197. package/dist/lib/devices/pending.js +67 -2
  198. package/dist/lib/devices/registry.d.ts +0 -25
  199. package/dist/lib/devices/registry.js +2 -83
  200. package/dist/lib/devices/resolve-profile.d.ts +20 -0
  201. package/dist/lib/devices/resolve-profile.js +44 -0
  202. package/dist/lib/devices/rollout-verify.d.ts +101 -0
  203. package/dist/lib/devices/rollout-verify.js +193 -0
  204. package/dist/lib/devices/ssh-config.js +10 -6
  205. package/dist/lib/event-families.d.ts +28 -0
  206. package/dist/lib/event-families.js +159 -0
  207. package/dist/lib/event-stream.d.ts +9 -1
  208. package/dist/lib/event-stream.js +26 -9
  209. package/dist/lib/events.d.ts +9 -1
  210. package/dist/lib/events.js +21 -6
  211. package/dist/lib/exec.d.ts +30 -0
  212. package/dist/lib/exec.js +220 -122
  213. package/dist/lib/feed-broadcast.d.ts +25 -0
  214. package/dist/lib/feed-broadcast.js +33 -0
  215. package/dist/lib/feed.d.ts +1 -1
  216. package/dist/lib/feed.js +12 -2
  217. package/dist/lib/fleet/capture.js +15 -0
  218. package/dist/lib/fleet/manifest.js +9 -0
  219. package/dist/lib/fleet/types.d.ts +9 -0
  220. package/dist/lib/fleet-status.js +10 -8
  221. package/dist/lib/git.d.ts +20 -6
  222. package/dist/lib/git.js +121 -17
  223. package/dist/lib/hosts/dispatch.d.ts +8 -3
  224. package/dist/lib/hosts/dispatch.js +29 -3
  225. package/dist/lib/hosts/logs.d.ts +2 -2
  226. package/dist/lib/hosts/logs.js +2 -2
  227. package/dist/lib/hosts/option.js +1 -1
  228. package/dist/lib/hosts/passthrough.d.ts +2 -3
  229. package/dist/lib/hosts/passthrough.js +10 -24
  230. package/dist/lib/hosts/progress.js +2 -2
  231. package/dist/lib/hosts/providers/devices.d.ts +3 -3
  232. package/dist/lib/hosts/providers/devices.js +18 -12
  233. package/dist/lib/hosts/ready.d.ts +5 -1
  234. package/dist/lib/hosts/ready.js +9 -3
  235. package/dist/lib/hosts/reconcile.d.ts +2 -2
  236. package/dist/lib/hosts/reconcile.js +2 -2
  237. package/dist/lib/hosts/registry.js +14 -9
  238. package/dist/lib/hosts/remote-cmd.js +1 -1
  239. package/dist/lib/hosts/remote-os.d.ts +9 -6
  240. package/dist/lib/hosts/remote-os.js +13 -6
  241. package/dist/lib/hosts/routing-flag.d.ts +23 -0
  242. package/dist/lib/hosts/routing-flag.js +41 -0
  243. package/dist/lib/hosts/run-target.js +1 -1
  244. package/dist/lib/hosts/session-index.js +1 -1
  245. package/dist/lib/hosts/tasks.d.ts +6 -6
  246. package/dist/lib/hosts/tasks.js +4 -4
  247. package/dist/lib/hosts/types.js +1 -2
  248. package/dist/lib/installations/resolve.js +2 -8
  249. package/dist/lib/isolation-boundary-report.js +0 -1
  250. package/dist/lib/linear-cache.d.ts +7 -0
  251. package/dist/lib/linear-cache.js +31 -4
  252. package/dist/lib/linear-project-counts.d.ts +1 -1
  253. package/dist/lib/linear-project-counts.js +2 -3
  254. package/dist/lib/linear-projects.js +1 -1
  255. package/dist/lib/loop.d.ts +2 -2
  256. package/dist/lib/loop.js +1 -1
  257. package/dist/lib/mailbox-target.d.ts +1 -1
  258. package/dist/lib/mailbox-target.js +1 -1
  259. package/dist/lib/manifest.js +7 -4
  260. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  261. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  262. package/dist/lib/menubar/snapshot.d.ts +3 -2
  263. package/dist/lib/menubar/snapshot.js +6 -2
  264. package/dist/lib/migrate-fold.d.ts +33 -0
  265. package/dist/lib/migrate-fold.js +130 -0
  266. package/dist/lib/migrate.d.ts +34 -34
  267. package/dist/lib/migrate.js +106 -128
  268. package/dist/lib/model-tier-overrides.d.ts +1 -1
  269. package/dist/lib/model-tier-overrides.js +15 -2
  270. package/dist/lib/monitors/config.d.ts +17 -3
  271. package/dist/lib/monitors/config.js +52 -18
  272. package/dist/lib/monitors/engine.d.ts +32 -1
  273. package/dist/lib/monitors/engine.js +94 -11
  274. package/dist/lib/monitors/fingerprint.d.ts +46 -0
  275. package/dist/lib/monitors/fingerprint.js +100 -0
  276. package/dist/lib/monitors/remote.d.ts +47 -0
  277. package/dist/lib/monitors/remote.js +81 -0
  278. package/dist/lib/monitors/state.d.ts +39 -0
  279. package/dist/lib/monitors/state.js +56 -0
  280. package/dist/lib/onepassword.d.ts +17 -0
  281. package/dist/lib/onepassword.js +52 -22
  282. package/dist/lib/open-url.js +1 -1
  283. package/dist/lib/picker.d.ts +14 -2
  284. package/dist/lib/picker.js +35 -13
  285. package/dist/lib/placement.d.ts +1 -1
  286. package/dist/lib/placement.js +1 -1
  287. package/dist/lib/pr-land-detach.d.ts +32 -0
  288. package/dist/lib/pr-land-detach.js +79 -0
  289. package/dist/lib/profiles-presets.js +13 -0
  290. package/dist/lib/profiles.d.ts +2 -0
  291. package/dist/lib/profiles.js +44 -1
  292. package/dist/lib/project-focus.d.ts +1 -1
  293. package/dist/lib/project-focus.js +1 -1
  294. package/dist/lib/project-key.d.ts +17 -0
  295. package/dist/lib/project-key.js +26 -0
  296. package/dist/lib/project-probe.d.ts +4 -1
  297. package/dist/lib/project-probe.js +5 -4
  298. package/dist/lib/project-resources.js +2 -18
  299. package/dist/lib/project-root.d.ts +16 -0
  300. package/dist/lib/project-root.js +20 -2
  301. package/dist/lib/projects.d.ts +20 -1
  302. package/dist/lib/projects.js +78 -1
  303. package/dist/lib/refresh-coordinator.d.ts +24 -0
  304. package/dist/lib/refresh-coordinator.js +52 -0
  305. package/dist/lib/registry.d.ts +2 -2
  306. package/dist/lib/registry.js +1 -1
  307. package/dist/lib/resource-aliases.d.ts +13 -0
  308. package/dist/lib/resource-aliases.js +26 -0
  309. package/dist/lib/resources/types.d.ts +1 -1
  310. package/dist/lib/resources.d.ts +16 -0
  311. package/dist/lib/resources.js +66 -10
  312. package/dist/lib/rotate.d.ts +3 -4
  313. package/dist/lib/rotate.js +4 -5
  314. package/dist/lib/routine-activation.d.ts +22 -2
  315. package/dist/lib/routine-activation.js +63 -16
  316. package/dist/lib/routine-context.d.ts +9 -2
  317. package/dist/lib/routine-context.js +21 -6
  318. package/dist/lib/routines-project.d.ts +58 -48
  319. package/dist/lib/routines-project.js +190 -159
  320. package/dist/lib/routines.d.ts +41 -6
  321. package/dist/lib/routines.js +92 -34
  322. package/dist/lib/run-defaults.d.ts +5 -0
  323. package/dist/lib/run-defaults.js +11 -1
  324. package/dist/lib/runner.d.ts +10 -8
  325. package/dist/lib/runner.js +122 -39
  326. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  327. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  328. package/dist/lib/secrets/agent.d.ts +10 -3
  329. package/dist/lib/secrets/agent.js +43 -8
  330. package/dist/lib/secrets/bundles.d.ts +1 -0
  331. package/dist/lib/secrets/bundles.js +92 -80
  332. package/dist/lib/secrets/index.js +32 -9
  333. package/dist/lib/secrets/install-helper.d.ts +4 -4
  334. package/dist/lib/secrets/install-helper.js +4 -4
  335. package/dist/lib/secrets/push.d.ts +40 -6
  336. package/dist/lib/secrets/push.js +58 -11
  337. package/dist/lib/secrets/read-backoff.d.ts +1 -1
  338. package/dist/lib/secrets/read-backoff.js +1 -1
  339. package/dist/lib/secrets/remote.d.ts +24 -0
  340. package/dist/lib/secrets/remote.js +54 -4
  341. package/dist/lib/self-update.d.ts +108 -0
  342. package/dist/lib/self-update.js +276 -1
  343. package/dist/lib/session/active.d.ts +89 -5
  344. package/dist/lib/session/active.js +165 -10
  345. package/dist/lib/session/actor-sidecar.d.ts +1 -1
  346. package/dist/lib/session/actor-sidecar.js +2 -1
  347. package/dist/lib/session/db.d.ts +176 -2
  348. package/dist/lib/session/db.js +484 -17
  349. package/dist/lib/session/discover.js +27 -4
  350. package/dist/lib/session/hook-sessions.js +2 -2
  351. package/dist/lib/session/host-link.d.ts +2 -2
  352. package/dist/lib/session/host-link.js +2 -2
  353. package/dist/lib/session/pid-registry.d.ts +21 -0
  354. package/dist/lib/session/pid-registry.js +57 -0
  355. package/dist/lib/session/remote-active.js +15 -1
  356. package/dist/lib/session/remote.js +2 -2
  357. package/dist/lib/session/session-cache.d.ts +14 -7
  358. package/dist/lib/session/session-cache.js +51 -9
  359. package/dist/lib/session/state.d.ts +2 -2
  360. package/dist/lib/session/state.js +1 -1
  361. package/dist/lib/session/sync/config.d.ts +10 -10
  362. package/dist/lib/session/sync/config.js +10 -10
  363. package/dist/lib/session/sync/r2.d.ts +34 -0
  364. package/dist/lib/session/sync/r2.js +123 -0
  365. package/dist/lib/session/throughput.d.ts +1 -1
  366. package/dist/lib/session/throughput.js +1 -1
  367. package/dist/lib/session/types.d.ts +23 -1
  368. package/dist/lib/session/types.js +15 -0
  369. package/dist/lib/session/viewing-in.d.ts +1 -1
  370. package/dist/lib/session/viewing-in.js +1 -1
  371. package/dist/lib/session/watch.d.ts +101 -0
  372. package/dist/lib/session/watch.js +242 -0
  373. package/dist/lib/share/config.d.ts +4 -0
  374. package/dist/lib/share/config.js +1 -0
  375. package/dist/lib/share/delete.d.ts +93 -0
  376. package/dist/lib/share/delete.js +127 -0
  377. package/dist/lib/share/provision.d.ts +38 -0
  378. package/dist/lib/share/provision.js +50 -0
  379. package/dist/lib/share/publish.d.ts +40 -1
  380. package/dist/lib/share/publish.js +116 -3
  381. package/dist/lib/share/worker-template.js +71 -6
  382. package/dist/lib/shims.d.ts +17 -3
  383. package/dist/lib/shims.js +136 -27
  384. package/dist/lib/signin-badge.js +3 -2
  385. package/dist/lib/skills.js +2 -0
  386. package/dist/lib/smart-launch.d.ts +8 -8
  387. package/dist/lib/smart-launch.js +80 -59
  388. package/dist/lib/ssh-exec.d.ts +1 -1
  389. package/dist/lib/ssh-exec.js +1 -1
  390. package/dist/lib/staleness/prune.d.ts +88 -0
  391. package/dist/lib/staleness/prune.js +69 -0
  392. package/dist/lib/staleness/registry.d.ts +1 -1
  393. package/dist/lib/staleness/writers/commands.js +34 -2
  394. package/dist/lib/staleness/writers/hooks.js +16 -0
  395. package/dist/lib/staleness/writers/kinds.d.ts +6 -0
  396. package/dist/lib/staleness/writers/skills.js +19 -0
  397. package/dist/lib/staleness/writers/subagents.d.ts +2 -3
  398. package/dist/lib/staleness/writers/subagents.js +0 -4
  399. package/dist/lib/staleness/writers/types.d.ts +32 -0
  400. package/dist/lib/startup/command-registry.d.ts +6 -12
  401. package/dist/lib/startup/command-registry.js +14 -31
  402. package/dist/lib/startup/dev-build.d.ts +10 -0
  403. package/dist/lib/startup/dev-build.js +13 -1
  404. package/dist/lib/startup/spellcheck.d.ts +18 -0
  405. package/dist/lib/startup/spellcheck.js +45 -0
  406. package/dist/lib/state.d.ts +36 -9
  407. package/dist/lib/state.js +96 -46
  408. package/dist/lib/subagents-registry.d.ts +0 -7
  409. package/dist/lib/subagents-registry.js +38 -65
  410. package/dist/lib/subagents.d.ts +0 -33
  411. package/dist/lib/subagents.js +0 -75
  412. package/dist/lib/sync-umbrella.js +1 -1
  413. package/dist/lib/teams/agents.d.ts +41 -1
  414. package/dist/lib/teams/agents.js +187 -9
  415. package/dist/lib/teams/api.d.ts +11 -1
  416. package/dist/lib/teams/api.js +11 -2
  417. package/dist/lib/teams/delivery.d.ts +41 -0
  418. package/dist/lib/teams/delivery.js +60 -0
  419. package/dist/lib/teams/registry.d.ts +14 -0
  420. package/dist/lib/teams/registry.js +51 -1
  421. package/dist/lib/teams/remoteWorktree.d.ts +19 -0
  422. package/dist/lib/teams/remoteWorktree.js +29 -0
  423. package/dist/lib/teams/scheduler.d.ts +1 -1
  424. package/dist/lib/teams/scheduler.js +1 -1
  425. package/dist/lib/teams/worktree.d.ts +24 -0
  426. package/dist/lib/teams/worktree.js +42 -0
  427. package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
  428. package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
  429. package/dist/lib/terminal/engine.d.ts +4 -0
  430. package/dist/lib/terminal/engine.js +8 -2
  431. package/dist/lib/terminal/types.d.ts +21 -2
  432. package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
  433. package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
  434. package/dist/lib/tickets/list.d.ts +53 -0
  435. package/dist/lib/tickets/list.js +153 -0
  436. package/dist/lib/tmux/orphan-reap.d.ts +320 -0
  437. package/dist/lib/tmux/orphan-reap.js +644 -0
  438. package/dist/lib/tmux/session.d.ts +68 -3
  439. package/dist/lib/tmux/session.js +95 -5
  440. package/dist/lib/triggers/handlers.d.ts +20 -0
  441. package/dist/lib/triggers/handlers.js +6 -1
  442. package/dist/lib/types.d.ts +46 -34
  443. package/dist/lib/usage-fleet.d.ts +32 -0
  444. package/dist/lib/usage-fleet.js +125 -0
  445. package/dist/lib/usage-refresh.d.ts +3 -3
  446. package/dist/lib/usage-refresh.js +19 -16
  447. package/dist/lib/usage.d.ts +51 -47
  448. package/dist/lib/usage.js +145 -153
  449. package/dist/lib/version-duplicates.js +2 -2
  450. package/dist/lib/versions.d.ts +56 -13
  451. package/dist/lib/versions.js +195 -45
  452. package/dist/lib/watchdog/log.d.ts +1 -1
  453. package/dist/lib/watchdog/log.js +3 -3
  454. package/dist/lib/watchdog/rotate.d.ts +6 -6
  455. package/dist/lib/watchdog/rotate.js +6 -6
  456. package/dist/lib/workflows.d.ts +1 -1
  457. package/dist/lib/yaml-io.d.ts +47 -0
  458. package/dist/lib/yaml-io.js +55 -0
  459. package/package.json +2 -1
  460. package/scripts/install-helper.js +2 -2
  461. package/scripts/postinstall.js +23 -20
  462. package/dist/commands/defaults.d.ts +0 -7
  463. package/dist/commands/defaults.js +0 -107
  464. package/dist/commands/export.d.ts +0 -11
  465. package/dist/commands/export.js +0 -215
  466. package/dist/commands/helper.d.ts +0 -12
  467. package/dist/commands/helper.js +0 -87
  468. package/dist/commands/hosts.d.ts +0 -11
  469. package/dist/commands/hosts.js +0 -330
  470. package/dist/commands/lock.d.ts +0 -12
  471. package/dist/commands/lock.js +0 -70
  472. package/dist/commands/pull.d.ts +0 -17
  473. package/dist/commands/pull.js +0 -39
  474. package/dist/commands/push.d.ts +0 -14
  475. package/dist/commands/push.js +0 -30
  476. package/dist/commands/wallet.d.ts +0 -20
  477. package/dist/commands/wallet.js +0 -216
  478. package/dist/commands/worktree.d.ts +0 -19
  479. package/dist/commands/worktree.js +0 -272
  480. package/dist/lib/account-labels.d.ts +0 -24
  481. package/dist/lib/account-labels.js +0 -72
  482. package/dist/lib/auto-dispatch-linear.d.ts +0 -18
  483. package/dist/lib/auto-dispatch-linear.js +0 -107
  484. package/dist/lib/auto-dispatch-provider.d.ts +0 -10
  485. package/dist/lib/auto-dispatch-provider.js +0 -30
  486. package/dist/lib/auto-dispatch.d.ts +0 -93
  487. package/dist/lib/auto-dispatch.js +0 -128
  488. package/dist/lib/export.d.ts +0 -72
  489. package/dist/lib/export.js +0 -269
  490. package/dist/lib/lock.d.ts +0 -93
  491. package/dist/lib/lock.js +0 -207
  492. package/dist/lib/wallet/index.d.ts +0 -78
  493. package/dist/lib/wallet/index.js +0 -253
@@ -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
@@ -1,7 +1,15 @@
1
1
  export type CodexPolicyMode = 'plan' | 'edit' | 'skip';
2
2
  export declare const CODEX_PLAN_PROFILE = "agents-plan";
3
3
  export declare const CODEX_EDIT_PROFILE = "agents-edit";
4
- export declare function codexEditWritableRoots(): string[];
4
+ /**
5
+ * Writable roots for Codex's `edit` profile: the managed user `.agents` dir, the
6
+ * baseline toolchain caches, and — when `cwd` is inside a repo — that repo's
7
+ * `.agents` directory. The last entry is what lets an in-repo build write under
8
+ * `.agents/worktrees/`; Codex's `workspace-write` sandbox hardcodes `.agents/`
9
+ * read-only, and naming the directory as an explicit writable root is the only
10
+ * thing that overrides it (a nested sub-path does not — bwrap refuses the mount).
11
+ */
12
+ export declare function codexEditWritableRoots(cwd?: string): string[];
5
13
  export declare function codexPermissionProfileConfig(mode: Exclude<CodexPolicyMode, 'skip'>, writableRoots?: string[]): string;
6
14
  /**
7
15
  * Canonical Codex safety policy used by every native launch path.
@@ -1,12 +1,27 @@
1
+ import * as fs from 'fs';
1
2
  import { getUserAgentsDir } from './state.js';
2
3
  import { codexDefaultWritableRoots } from './permissions.js';
4
+ import { repoAgentsDirForCwd } from './project-key.js';
3
5
  export const CODEX_PLAN_PROFILE = 'agents-plan';
4
6
  export const CODEX_EDIT_PROFILE = 'agents-edit';
5
7
  function unique(values) {
6
8
  return [...new Set(values)];
7
9
  }
8
- export function codexEditWritableRoots() {
9
- return unique([getUserAgentsDir(), ...codexDefaultWritableRoots()]);
10
+ /**
11
+ * Writable roots for Codex's `edit` profile: the managed user `.agents` dir, the
12
+ * baseline toolchain caches, and — when `cwd` is inside a repo — that repo's
13
+ * `.agents` directory. The last entry is what lets an in-repo build write under
14
+ * `.agents/worktrees/`; Codex's `workspace-write` sandbox hardcodes `.agents/`
15
+ * read-only, and naming the directory as an explicit writable root is the only
16
+ * thing that overrides it (a nested sub-path does not — bwrap refuses the mount).
17
+ */
18
+ export function codexEditWritableRoots(cwd) {
19
+ const repoAgents = repoAgentsDirForCwd(cwd);
20
+ // Only widen the sandbox for a `.agents` that actually exists — most repos
21
+ // have none, and there is no point naming a directory that isn't there. (Codex
22
+ // tolerates a missing writable root, so this is tidiness, not a hard guard.)
23
+ const repoRoots = repoAgents && fs.existsSync(repoAgents) ? [repoAgents] : [];
24
+ return unique([getUserAgentsDir(), ...codexDefaultWritableRoots(), ...repoRoots]);
10
25
  }
11
26
  function inlineWorkspaceRoots(roots) {
12
27
  return roots.map((root) => `${JSON.stringify(root)} = true`).join(', ');
@@ -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;