@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
@@ -21,7 +21,7 @@ import { getActiveSessions } from '../lib/session/active.js';
21
21
  import { gatherRemoteActive } from '../lib/session/remote-active.js';
22
22
  import { gatherRemoteAgentsJson } from '../lib/remote-agents-json.js';
23
23
  import { formatFleetSummary, formatFleetWorkspaces, parseRemoteProbe, probeProjectWorkspaces, workspaceTargetsForDef, workspaceWarnings, } from '../lib/project-probe.js';
24
- import { listProjectDefs, loadProjectDef, writeProjectDef, removeProjectDef, projectDefPath, isSafeProjectName, validateProjectDef, } from '../lib/projects.js';
24
+ import { listProjectDefs, loadProjectDef, writeProjectDef, removeProjectDef, projectDefPath, isSafeProjectName, validateProjectDef, projectNameForCwd, } from '../lib/projects.js';
25
25
  import { rollupSessionsByProject, withDefaultMachine, isDeadStatus, formatDeadSummary, liveDeadSplit, enrichProjectSignals, formatProjectMembersByHost, formatProjectWarnings, } from '../lib/project-status.js';
26
26
  import { fetchLinearProjectCounts } from '../lib/linear-project-counts.js';
27
27
  import { listLinearProjects, pickLinearProject } from '../lib/linear-projects.js';
@@ -33,6 +33,18 @@ import { buildLinearImportCandidates, validateImportOpts, } from '../lib/project
33
33
  export const PROJECTS_NO_FANOUT_ENV = 'AGENTS_PROJECTS_LOCAL';
34
34
  /** Max peers named in the skipped note before the rest collapse to `+N`. */
35
35
  const SKIPPED_NAME_LIMIT = 4;
36
+ /**
37
+ * Render `agents projects for-cwd`'s output for a resolved (or absent)
38
+ * project name — `--json` always prints `{"name": ...}` even on no match, so
39
+ * a scripted caller can distinguish "ran and found nothing" from a crash;
40
+ * the plain-text form prints nothing on no match. Returns '' when nothing
41
+ * should be printed.
42
+ */
43
+ export function formatForCwdOutput(name, json) {
44
+ if (json)
45
+ return JSON.stringify({ name: name ?? null });
46
+ return name ?? '';
47
+ }
36
48
  /**
37
49
  * One compact trailing note for peers that didn't answer the `--fleet`
38
50
  * fan-out — unreachable, running an agents-cli too old to carry `projects
@@ -88,6 +100,34 @@ export function originSlug(cwd) {
88
100
  return undefined;
89
101
  }
90
102
  }
103
+ /**
104
+ * Turn a `--dir` / `--add-dir` value into a `repos[]` row.
105
+ *
106
+ * The slug comes from the DIRECTORY'S OWN origin remote, never from its path:
107
+ * a checkout at `~/src/github.com/muqsitnawaz/agents-cli` whose origin is
108
+ * `phnx-labs/agents-cli` must record the remote it actually pushes to. Pass
109
+ * `slugOverride` for a directory with no origin (a vendored tree, a fresh
110
+ * `git init`).
111
+ *
112
+ * The stored `path` is left for `writeProjectDef` to normalize home-relative,
113
+ * so the same definition re-roots on every machine.
114
+ */
115
+ export function projectRepoFromDir(dir, slugOverride) {
116
+ const abs = path.resolve(expandLocalHome(dir));
117
+ if (!fs.existsSync(abs))
118
+ return { ok: false, error: `No such directory: ${abs}` };
119
+ if (!fs.statSync(abs).isDirectory())
120
+ return { ok: false, error: `Not a directory: ${abs}` };
121
+ const slug = slugOverride ?? originSlug(abs);
122
+ if (!slug) {
123
+ return {
124
+ ok: false,
125
+ error: `${abs} has no origin remote, so its slug cannot be inferred.\n` +
126
+ ` Name it explicitly: --add-dir ${dir} --slug <owner/repo>`,
127
+ };
128
+ }
129
+ return { ok: true, repo: { slug, path: toHomeRelative(abs) } };
130
+ }
91
131
  /**
92
132
  * List the workspace's Linear projects and plan their import, binding each to a
93
133
  * local checkout under the configured projects root when the names match
@@ -411,9 +451,12 @@ export function registerProjectsCommands(program) {
411
451
  examples: `
412
452
  agents projects import --from-linear # the projects you actually track
413
453
  agents projects add rush --repo phnx-labs/rush --path apps/web
454
+ agents projects add rush --root ~/src/rush --dir ~/src/rush-infra # bind another dir
455
+ agents projects set rush --add-dir ~/.agents/.system # bind one more
456
+ agents projects set rush --rm-dir ~/src/rush-infra # unbind it again
414
457
  agents projects list # definitions only (no session scan)
415
458
  agents projects list --with-agents # opt-in local active counts
416
- agents projects list --json # machine-readable defs (Factory uses this)
459
+ agents projects list --json # machine-readable defs (AGI EXT uses this)
417
460
  echo '{...}' | agents projects save --json # create/update one def from stdin
418
461
  agents projects rm rush --json # machine-readable delete
419
462
  agents projects status # every project, across the whole fleet
@@ -425,8 +468,14 @@ export function registerProjectsCommands(program) {
425
468
  `,
426
469
  notes: `
427
470
  Definitions are hand-editable YAML in ~/.agents/projects/ and sync across
428
- machines with 'agents push/pull'. Factory reads and writes only through
429
- these commands — never ~/.agents/factory/projects.json.
471
+ machines with 'agents repo push user' / 'agents repo pull user'. AGI EXT
472
+ reads and writes only through these commands — never
473
+ ~/.agents/factory/projects.json.
474
+
475
+ A project may bind several directories ('--dir' / '--add-dir'). The cwd an
476
+ agent lands in is 'defaultPath' (else 'root') — set it with --root/--path,
477
+ not with --dir. Every bound directory other than that cwd rides along as
478
+ an --add-dir grant (Claude, Codex, Cursor, Kimi, Grok consume it; others ignore).
430
479
  `,
431
480
  });
432
481
  // ---- list ----
@@ -465,6 +514,17 @@ export function registerProjectsCommands(program) {
465
514
  console.log(` ${chalk.bold(row.name.padEnd(w.name))} ${chalk.dim(row.path.padEnd(w.path))} ${chalk.cyan(row.repo.padEnd(w.repo))}${agentsSuffix}`);
466
515
  }
467
516
  });
517
+ // ---- for-cwd ----
518
+ projects
519
+ .command('for-cwd [cwd]')
520
+ .description('Resolve a directory to its defined project name (root or a repos[].path/subpath match). Defaults to the current directory.')
521
+ .option('--json', 'Machine-readable output: {"name": string | null}')
522
+ .action((cwdArg, opts) => {
523
+ const name = projectNameForCwd(cwdArg ?? process.cwd(), listProjectDefs());
524
+ const out = formatForCwdOutput(name, !!opts.json);
525
+ if (out)
526
+ console.log(out);
527
+ });
468
528
  // ---- add ----
469
529
  projects
470
530
  .command('add <name>')
@@ -472,6 +532,7 @@ export function registerProjectsCommands(program) {
472
532
  .option('--root <path>', 'Repo / monorepo root (defaults to the current git repo root)')
473
533
  .option('--path <subdir>', 'Default cwd for agents (a monorepo subdir)')
474
534
  .option('--repo <owner/repo>', 'Primary GitHub slug (defaults to the origin remote)')
535
+ .option('--dir <path...>', 'A directory this project binds; slug read from its origin. Repeatable')
475
536
  .option('--context <path:purpose...>', 'A described starting point; repeatable')
476
537
  .option('--goal <objective:measure...>', 'An outcome the project serves; repeatable')
477
538
  .option('--linear <url-or-id>', 'Linear project URL or id')
@@ -502,6 +563,18 @@ export function registerProjectsCommands(program) {
502
563
  def.defaultPath = `${root.replace(/\/$/, '')}/${opts.path.replace(/^\//, '')}`;
503
564
  if (repo)
504
565
  def.repo = repo;
566
+ if (opts.dir?.length) {
567
+ const repos = [];
568
+ for (const d of opts.dir) {
569
+ const r = projectRepoFromDir(d);
570
+ if (!r.ok) {
571
+ console.error(chalk.red(r.error));
572
+ process.exit(1);
573
+ }
574
+ repos.push(r.repo);
575
+ }
576
+ def.repos = repos;
577
+ }
505
578
  if (opts.context?.length)
506
579
  def.contexts = opts.context.map(parseContextFlag);
507
580
  if (opts.goal?.length)
@@ -513,6 +586,8 @@ export function registerProjectsCommands(program) {
513
586
  console.log(chalk.green(`Defined project "${name}"`));
514
587
  console.log(chalk.gray(` ${target}`));
515
588
  console.log(chalk.gray(` root ${def.root}${def.repo ? ` · repo ${def.repo}` : ''}`));
589
+ for (const r of def.repos ?? [])
590
+ console.log(chalk.gray(` dir ${r.path} · ${r.slug}`));
516
591
  });
517
592
  /** Merge `--device a b` (variadic) and `--devices a,b,c` (comma list) into one
518
593
  * deduped device filter; undefined when neither was given (= whole fleet). */
@@ -748,6 +823,9 @@ export function registerProjectsCommands(program) {
748
823
  .option('--path <subdir>', 'Default cwd for agents (a monorepo subdir)')
749
824
  .option('--description <text>', 'One-line description shown on the card')
750
825
  .option('--goal <objective:measure...>', 'Replace the goals this project serves; repeatable')
826
+ .option('--add-dir <path>', 'Bind another directory to this project; repeatable', (val, prev) => [...prev, val], [])
827
+ .option('--rm-dir <path>', 'Unbind a directory from this project; repeatable', (val, prev) => [...prev, val], [])
828
+ .option('--slug <owner/repo>', 'Slug for a single --add-dir whose origin cannot be read')
751
829
  .action((name, opts) => {
752
830
  const def = loadProjectDef(name);
753
831
  if (!def) {
@@ -755,10 +833,17 @@ export function registerProjectsCommands(program) {
755
833
  process.exit(1);
756
834
  }
757
835
  const fields = ['repo', 'root', 'path', 'description'].filter((k) => opts[k] !== undefined);
758
- if (fields.length === 0 && !opts.goal?.length) {
836
+ const dirWork = opts.addDir.length > 0 || opts.rmDir.length > 0;
837
+ if (fields.length === 0 && !opts.goal?.length && !dirWork) {
759
838
  console.error(chalk.red('Nothing to set. Pass a field, e.g. --repo <owner/repo>.'));
760
839
  process.exit(1);
761
840
  }
841
+ // One --slug cannot name two directories. Refuse rather than guess which
842
+ // --add-dir it was meant for.
843
+ if (opts.slug && opts.addDir.length !== 1) {
844
+ console.error(chalk.red('--slug names a single --add-dir; pass exactly one --add-dir with it.'));
845
+ process.exit(1);
846
+ }
762
847
  // Load, mutate the named fields, write back — the `link` pattern. NEVER
763
848
  // the `add --force` pattern, which rebuilds the def from flags alone and
764
849
  // silently drops linear/contexts/integrations that were not re-passed.
@@ -784,12 +869,47 @@ export function registerProjectsCommands(program) {
784
869
  }
785
870
  def.defaultPath = `${base}/${opts.path.replace(/^\//, '')}`;
786
871
  }
872
+ // --rm-dir before --add-dir, so re-pointing one directory in a single
873
+ // command (`--rm-dir old --add-dir new`) does what it reads like.
874
+ const removed = [];
875
+ for (const d of opts.rmDir) {
876
+ const target = path.resolve(expandLocalHome(d));
877
+ const before = def.repos?.length ?? 0;
878
+ def.repos = (def.repos ?? []).filter((r) => !r.path || path.resolve(expandLocalHome(r.path)) !== target);
879
+ if ((def.repos.length ?? 0) === before) {
880
+ console.error(chalk.red(`"${def.name}" does not bind ${target} — nothing to remove.`));
881
+ process.exit(1);
882
+ }
883
+ removed.push(target);
884
+ }
885
+ const added = [];
886
+ for (const d of opts.addDir) {
887
+ const r = projectRepoFromDir(d, opts.slug);
888
+ if (!r.ok) {
889
+ console.error(chalk.red(r.error));
890
+ process.exit(1);
891
+ }
892
+ const target = path.resolve(expandLocalHome(r.repo.path));
893
+ const dup = (def.repos ?? []).some((x) => x.path && path.resolve(expandLocalHome(x.path)) === target);
894
+ if (dup) {
895
+ console.error(chalk.red(`"${def.name}" already binds ${target}.`));
896
+ process.exit(1);
897
+ }
898
+ def.repos = [...(def.repos ?? []), r.repo];
899
+ added.push(r.repo);
900
+ }
901
+ if (def.repos?.length === 0)
902
+ delete def.repos;
787
903
  writeProjectDef(def);
788
904
  console.log(chalk.green(`Updated ${def.name}`));
789
905
  for (const f of fields)
790
906
  console.log(chalk.gray(` ${f} ${f === 'path' ? def.defaultPath : def[f]}`));
791
907
  if (opts.goal?.length)
792
908
  console.log(chalk.gray(` goals ${def.goals?.map((g) => g.objective).join(' · ')}`));
909
+ for (const r of removed)
910
+ console.log(chalk.gray(` - dir ${toHomeRelative(r)}`));
911
+ for (const r of added)
912
+ console.log(chalk.gray(` + dir ${r.path} · ${r.slug}`));
793
913
  });
794
914
  // ---- link ----
795
915
  projects
@@ -81,11 +81,17 @@ export async function reconnectAction(id) {
81
81
  await focusAction(recent.id, {});
82
82
  }
83
83
  export function registerReconnectCommand(program) {
84
+ // Deprecated: superseded by `agents sessions resume`, which does the same
85
+ // attach-else-recover and additionally takes a tmux alias. Hidden + warned +
86
+ // functional for one release. Bare `reconnect` targeted the most recent
87
+ // session in this directory; that default now lives on `resume`'s picker.
84
88
  const cmd = program
85
- .command('reconnect')
89
+ .command('reconnect', { hidden: true })
86
90
  .argument('[session-id]', 'Session id/prefix to reconnect (default: the most recent session started here)')
87
- .description('Re-enter a dropped agent terminal: attach the live pane if it survived, else resume the session')
91
+ .description('Deprecated use `agents sessions resume` instead.')
88
92
  .action(async (id) => {
93
+ console.warn(chalk.yellow('`agents reconnect` is deprecated — use `agents sessions resume` instead:'));
94
+ console.warn(chalk.gray(` agents sessions resume${id ? ` ${id}` : ''}`));
89
95
  await reconnectAction(id);
90
96
  });
91
97
  setHelpSections(cmd, {
@@ -103,7 +109,7 @@ export function registerReconnectCommand(program) {
103
109
  - Best-effort recovery: a living remote tmux pane is JOINED (a second client, no fork); a dropped one is RESUMED on its origin device (a copy if it was mid-run, a /continue if idle).
104
110
  - With no id, targets the most recent session started from this directory (the terminal that most likely just dropped), not the full fleet picker. Falls back to the most recent session anywhere when this directory has none.
105
111
  - This is the manual companion to the automatic reconnect that runs during a live 'agents run --device <box>' when the network blinks; use it after that gave up or the terminal tab closed.
106
- - Related: 'agents sessions focus' (attach/recover with a picker) and 'agents sessions resume' (multi-select history -> tabs).
112
+ - Deprecated: use 'agents sessions resume' it attaches a live pane, foregrounds a headless session, or recovers an ended one.
107
113
  `,
108
114
  });
109
115
  }
@@ -29,7 +29,7 @@ function resolveRepoPath(target) {
29
29
  return path.join(HOME, `.agents-${trimmed}`);
30
30
  }
31
31
  import { applyExtraAliasToVersions, ensureAgentsDir, getExtraRepoDir, getSystemAgentsDir, getUserAgentsDir, readMeta, resolveExtraRepoDir, updateMeta, } from '../lib/state.js';
32
- import { parseSource, pullRepo, commitAndPush, isGitRepo, isSystemRepoOrigin, adoptRepo, getRemoteUrl, sameGitRemote, displayHomePath, } from '../lib/git.js';
32
+ import { parseSource, pullRepo, commitAndPush, isGitRepo, isSystemRepoOrigin, adoptRepo, getRemoteUrl, sameGitRemote, displayHomePath, syncRepoGit, } from '../lib/git.js';
33
33
  import { DEFAULT_SYSTEM_REPO } from '../lib/types.js';
34
34
  import { ALL_AGENT_IDS, isAgentName, resolveAgentName } from '../lib/agents.js';
35
35
  import { refresh } from '../lib/refresh.js';
@@ -1089,6 +1089,47 @@ export function registerRepoCommands(program) {
1089
1089
  }
1090
1090
  }
1091
1091
  });
1092
+ // agents repo sync <name> — git-level sync for a single DotAgents repo.
1093
+ // Replaces the git portion of the old `agents sync <repo>` verb.
1094
+ // Semantics: system is pull-only (push: false); user and enabled extras push.
1095
+ repoCmd
1096
+ .command('sync <alias>')
1097
+ .description('Git-sync a repo: pull (and push for user/extras). Aliases: "system", "user", or a registered extra.')
1098
+ .addHelpText('after', `
1099
+ Examples:
1100
+ # Pull the system repo (read-only mirror)
1101
+ agents repo sync system
1102
+
1103
+ # Pull and push the user repo
1104
+ agents repo sync user
1105
+
1106
+ # Sync a registered extra
1107
+ agents repo sync work
1108
+ `)
1109
+ .action(async (alias) => {
1110
+ const targets = collectRepoTargets(alias);
1111
+ if (!targets) {
1112
+ process.exitCode = 1;
1113
+ return;
1114
+ }
1115
+ for (const t of targets) {
1116
+ if (!fs.existsSync(t.dir) || !isGitRepo(t.dir)) {
1117
+ console.log(chalk.yellow(` ${t.alias}: not a git repo, skipping`));
1118
+ continue;
1119
+ }
1120
+ const push = t.alias !== 'system';
1121
+ const spinner = ora(`Syncing ${formatRepoTarget(t.alias, t.dir)}...`).start();
1122
+ const result = await syncRepoGit(t.dir, { push });
1123
+ if (result.success) {
1124
+ const pushed = result.pushed ? ' (pushed)' : '';
1125
+ spinner.succeed(`${formatRepoTarget(t.alias, t.dir)}: ${result.commit}${pushed}`);
1126
+ }
1127
+ else {
1128
+ spinner.fail(`${formatRepoTarget(t.alias, t.dir)}: ${result.error}`);
1129
+ process.exitCode = 1;
1130
+ }
1131
+ }
1132
+ });
1092
1133
  // Deprecated: superseded by `agents sync`. `agents sync --local` runs the same
1093
1134
  // reconcile stage (sync-umbrella.ts calls this exact `refresh()`), and `agents
1094
1135
  // sync <agent>` targets one agent — with the added reach `refresh` lacks
@@ -35,6 +35,23 @@ export interface ResourceViewOptions {
35
35
  filterVersion?: string;
36
36
  /** Emit machine-readable JSON instead of the picker/table (for agents/scripts). */
37
37
  json?: boolean;
38
+ /**
39
+ * Show the "Synced" column. Default true — the central-storage commands all
40
+ * answer "which agent versions have this?". `agents inspect <repo>` does not:
41
+ * there the repo IS the source, and empty `targets` would render the
42
+ * misleading "no installed versions". Set false to drop the column entirely.
43
+ */
44
+ showSync?: boolean;
45
+ /**
46
+ * Cap for the Name column. Defaults to NAME_CAP (22), which suits the
47
+ * central-storage commands. Kinds whose rows have no description — hooks are
48
+ * all script names and no prose — want a wider cap, otherwise four pairs of
49
+ * `00-agent-verify-work-complete…` truncate to the same string while the
50
+ * empty Description column wastes the rest of the terminal.
51
+ */
52
+ nameCap?: number;
53
+ /** Per-row OSC-8 link target, keyed by row name; makes names clickable. */
54
+ linkFor?: (row: ResourceRow) => string | undefined;
38
55
  }
39
56
  /** Display a resource list: interactive picker in TTY mode, plain table otherwise. */
40
57
  export declare function showResourceList(opts: ResourceViewOptions): Promise<void>;
@@ -7,11 +7,15 @@
7
7
  * filtering, and paging.
8
8
  */
9
9
  import chalk from 'chalk';
10
- import { truncate, padVisible } from '../lib/format.js';
10
+ import { truncate, padVisible, termLink } from '../lib/format.js';
11
11
  import { agentLabel } from '../lib/agents.js';
12
12
  import { itemPicker } from '../lib/picker.js';
13
13
  import { isInteractiveTerminal, isPromptCancelled, printWithPager } from './utils.js';
14
14
  import { terminalWidth, truncateToWidth, padToWidth, stringWidth, stripAnsi } from '../lib/session/width.js';
15
+ /** Whether the Synced column renders for this view. */
16
+ function syncEnabled(opts) {
17
+ return opts.showSync !== false;
18
+ }
15
19
  /** Display a resource list: interactive picker in TTY mode, plain table otherwise. */
16
20
  export async function showResourceList(opts) {
17
21
  if (opts.json) {
@@ -74,7 +78,12 @@ function filterRows(rows, query) {
74
78
  }
75
79
  /** Row label rendered inside the picker list. */
76
80
  function formatPickerRow(row, opts) {
77
- const name = chalk.cyan(padVisible(row.name, 22));
81
+ // Link here, not in the wide table: that renders only when stdout is NOT a
82
+ // TTY, and termLink is a no-op off-TTY — so a link there could never appear.
83
+ // The picker is the TTY path, which is where the pre-picker list had one.
84
+ const linkTarget = opts.linkFor?.(row);
85
+ const padded = chalk.cyan(padVisible(row.name, opts.nameCap ?? 22));
86
+ const name = linkTarget ? termLink(padded, linkTarget) : padded;
78
87
  const extra = opts.extraLabel
79
88
  ? chalk.gray(padVisible(row.extra ?? '-', 10))
80
89
  : '';
@@ -82,6 +91,10 @@ function formatPickerRow(row, opts) {
82
91
  ? chalk.gray(padVisible(row.extra2 ?? '-', 16))
83
92
  : '';
84
93
  const descRaw = row.description ? truncate(row.description, 40) : '';
94
+ if (!syncEnabled(opts)) {
95
+ // No sync column: give the reclaimed width back to the description.
96
+ return `${name} ${extra}${extra2}${chalk.gray(row.description ? truncate(row.description, 84) : '')}`;
97
+ }
85
98
  const desc = padVisible(chalk.gray(descRaw), 42);
86
99
  const sync = formatSyncSummary(row.targets, opts);
87
100
  return `${name} ${extra}${extra2}${desc} ${sync}`;
@@ -100,7 +113,9 @@ export function resourceLayout(cols, o) {
100
113
  const extraW = o.hasExtra ? 10 : 0;
101
114
  const extra2W = o.hasExtra2 ? 16 : 0;
102
115
  // Cap Sync so a long "missing on …" tail can't starve the description.
103
- const syncW = Math.min(o.syncW, Math.max(14, Math.floor(cols * 0.32)));
116
+ // syncW 0 means the caller dropped the column — keep it 0 rather than
117
+ // floor it to 14, which would reserve width for a column we never draw.
118
+ const syncW = o.syncW === 0 ? 0 : Math.min(o.syncW, Math.max(14, Math.floor(cols * 0.32)));
104
119
  const fixed = o.nameW + 1 + (extraW ? extraW + 1 : 0) + (extra2W ? extra2W + 1 : 0) + 1 + syncW;
105
120
  const descW = cols - fixed;
106
121
  return {
@@ -116,8 +131,10 @@ export function resourceLayout(cols, o) {
116
131
  function printResourceTable(opts) {
117
132
  const cols = terminalWidth();
118
133
  const syncStrings = opts.rows.map((r) => formatSyncSummary(r.targets, opts));
119
- const nameW = Math.min(NAME_CAP, Math.max('Name'.length, ...opts.rows.map((r) => stringWidth(r.name))));
120
- const syncMax = Math.max('Synced'.length, ...syncStrings.map((s) => stringWidth(s)));
134
+ const nameW = Math.min(opts.nameCap ?? NAME_CAP, Math.max('Name'.length, ...opts.rows.map((r) => stringWidth(r.name))));
135
+ const syncMax = syncEnabled(opts)
136
+ ? Math.max('Synced'.length, ...syncStrings.map((s) => stringWidth(s)))
137
+ : 0;
121
138
  const layout = resourceLayout(cols, {
122
139
  hasExtra: Boolean(opts.extraLabel),
123
140
  hasExtra2: Boolean(opts.extra2Label),
@@ -153,28 +170,33 @@ function renderResourceWideTable(opts, L, syncStrings) {
153
170
  if (L.extra2W)
154
171
  headerParts.push(cell(opts.extra2Label ?? '', L.extra2W, chalk.bold));
155
172
  headerParts.push(cell('Description', L.descW, chalk.bold));
156
- headerParts.push(chalk.bold('Synced'));
157
- console.log(headerParts.join(' '));
158
- const contentW = L.nameW + 1 + (L.extraW ? L.extraW + 1 : 0) + (L.extra2W ? L.extra2W + 1 : 0) + L.descW + 1 + L.syncW;
173
+ if (L.syncW)
174
+ headerParts.push(chalk.bold('Synced'));
175
+ console.log(headerParts.join(' ').trimEnd());
176
+ const contentW = L.nameW + 1 + (L.extraW ? L.extraW + 1 : 0) + (L.extra2W ? L.extra2W + 1 : 0) + L.descW + (L.syncW ? 1 + L.syncW : 0);
159
177
  console.log(chalk.gray('─'.repeat(Math.min(contentW, terminalWidth()))));
160
178
  opts.rows.forEach((row, i) => {
179
+ // No link here: this path renders only when stdout is not a TTY, where
180
+ // termLink is a no-op. The picker (formatPickerRow) carries the link.
161
181
  const parts = [cell(row.name, L.nameW, chalk.cyan)];
162
182
  if (L.extraW)
163
183
  parts.push(cell(row.extra ?? '-', L.extraW));
164
184
  if (L.extra2W)
165
185
  parts.push(cell(row.extra2 ?? '-', L.extra2W));
166
186
  parts.push(cell(row.description ?? '-', L.descW, chalk.gray));
167
- let sync = syncStrings[i] ?? '';
168
- if (stringWidth(sync) > L.syncW)
169
- sync = chalk.gray(truncateToWidth(sync, L.syncW));
170
- parts.push(sync);
171
- console.log(parts.join(' '));
187
+ if (L.syncW) {
188
+ let sync = syncStrings[i] ?? '';
189
+ if (stringWidth(sync) > L.syncW)
190
+ sync = chalk.gray(truncateToWidth(sync, L.syncW));
191
+ parts.push(sync);
192
+ }
193
+ console.log(parts.join(' ').trimEnd());
172
194
  });
173
195
  }
174
196
  /** Stacked cards for narrow terminals: name + meta on one line, description below. */
175
197
  function renderResourceCards(opts, cols, syncStrings) {
176
198
  opts.rows.forEach((row, i) => {
177
- const meta = [row.extra, row.extra2, stripAnsi(syncStrings[i] ?? '')]
199
+ const meta = [row.extra, row.extra2, syncEnabled(opts) ? stripAnsi(syncStrings[i] ?? '') : '']
178
200
  .filter((s) => Boolean(s && s.trim()))
179
201
  .join(' · ');
180
202
  const metaBudget = Math.max(8, cols - stringWidth(row.name) - 2);
@@ -59,8 +59,15 @@ export function registerResumeCommand(program) {
59
59
  const pinnedHere = consumeResumePinned() || !!options.here;
60
60
  const outcome = await resolveSessionMetadataValue(sessionId.trim());
61
61
  if (outcome.kind === 'partial') {
62
- console.error(chalk.red(`Could not resolve session while these devices were unavailable: ${outcome.failedPeers.join(', ')}`));
63
- process.exitCode = 2;
62
+ // RUSH-2492: an unreachable peer is a warning, not a hard failure. The
63
+ // resolver already resolves an id found on the reachable fleet (SES-9a),
64
+ // so reaching here means the session was not found on any device we COULD
65
+ // reach — it may live on an unreachable peer, which we could not check.
66
+ const offline = outcome.failedPeers;
67
+ console.error(chalk.yellow(`Warning: ${offline.length} device(s) unreachable, not checked: ${offline.join(', ')}`));
68
+ console.error(chalk.red(`No session matching "${sessionId}" on any reachable device (${offline.length} unreachable, not checked).`));
69
+ console.error(chalk.gray(' If it lives on an offline box, wake it (agents devices) or run there: agents ssh <device>'));
70
+ process.exitCode = 1;
64
71
  return;
65
72
  }
66
73
  if (outcome.kind === 'not-found') {
@@ -46,8 +46,6 @@ export declare function groupRoutineJobsByDevice(jobs: JobConfig[], registry: De
46
46
  */
47
47
  export declare function groupRoutineJobsByProject(jobs: JobConfig[], knownProjectNames: Set<string>): RoutineListGroup[];
48
48
  export declare function buildRunsJson(runs: RunMeta[]): Record<string, unknown>[];
49
- /** Build the exact structured routine rows shared by `routines list --json`
50
- * and the one-process AGI Menu snapshot. */
51
49
  export declare function buildRoutineListJson(): Record<string, unknown>[];
52
50
  /** Register the `agents routines` command tree. */
53
51
  export declare function registerRoutinesCommands(program: Command): void;