@phnx-labs/agents-cli 1.22.35 → 1.22.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/CHANGELOG.md +708 -2
  2. package/README.md +83 -43
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.d.ts +15 -0
  5. package/dist/bootstrap.js +1212 -0
  6. package/dist/commands/accounts.d.ts +4 -11
  7. package/dist/commands/accounts.js +159 -27
  8. package/dist/commands/artifacts-setup.d.ts +53 -0
  9. package/dist/commands/artifacts-setup.js +161 -0
  10. package/dist/commands/artifacts.d.ts +18 -0
  11. package/dist/commands/artifacts.js +58 -0
  12. package/dist/commands/attach.js +17 -4
  13. package/dist/commands/audit.d.ts +8 -8
  14. package/dist/commands/audit.js +57 -47
  15. package/dist/commands/browser.js +17 -11
  16. package/dist/commands/cloud.js +1 -1
  17. package/dist/commands/commands.js +0 -11
  18. package/dist/commands/computer-actions.js +33 -0
  19. package/dist/commands/computer-sessions-picker.d.ts +21 -0
  20. package/dist/commands/computer-sessions-picker.js +141 -0
  21. package/dist/commands/computer.d.ts +16 -0
  22. package/dist/commands/computer.js +37 -0
  23. package/dist/commands/config.d.ts +17 -0
  24. package/dist/commands/config.js +401 -0
  25. package/dist/commands/cp.d.ts +84 -0
  26. package/dist/commands/cp.js +231 -0
  27. package/dist/commands/daemon.js +243 -14
  28. package/dist/commands/detach-core.d.ts +1 -1
  29. package/dist/commands/detach-core.js +12 -2
  30. package/dist/commands/detach.js +1 -1
  31. package/dist/commands/doctor.js +64 -5
  32. package/dist/commands/events.d.ts +24 -12
  33. package/dist/commands/events.js +144 -28
  34. package/dist/commands/exec.js +86 -42
  35. package/dist/commands/feed.d.ts +1 -1
  36. package/dist/commands/feed.js +16 -8
  37. package/dist/commands/focus.d.ts +33 -1
  38. package/dist/commands/focus.js +177 -17
  39. package/dist/commands/funnel.d.ts +1 -1
  40. package/dist/commands/go.js +9 -8
  41. package/dist/commands/harness-wizard.d.ts +1 -0
  42. package/dist/commands/harness-wizard.js +18 -20
  43. package/dist/commands/harness.d.ts +2 -0
  44. package/dist/commands/harness.js +59 -26
  45. package/dist/commands/hooks.js +0 -11
  46. package/dist/commands/inspect.d.ts +94 -1
  47. package/dist/commands/inspect.js +866 -40
  48. package/dist/commands/lease.d.ts +4 -4
  49. package/dist/commands/lease.js +6 -6
  50. package/dist/commands/login.js +0 -13
  51. package/dist/commands/logs.d.ts +2 -2
  52. package/dist/commands/logs.js +2 -2
  53. package/dist/commands/mcp.js +7 -2
  54. package/dist/commands/memory.js +7 -2
  55. package/dist/commands/message.d.ts +1 -1
  56. package/dist/commands/message.js +37 -6
  57. package/dist/commands/models.js +71 -0
  58. package/dist/commands/monitors.d.ts +0 -1
  59. package/dist/commands/monitors.js +199 -16
  60. package/dist/commands/open.d.ts +18 -0
  61. package/dist/commands/open.js +57 -0
  62. package/dist/commands/packages.js +2 -107
  63. package/dist/commands/plugins.js +6 -3
  64. package/dist/commands/profiles.d.ts +1 -0
  65. package/dist/commands/profiles.js +16 -160
  66. package/dist/commands/projects.d.ts +28 -0
  67. package/dist/commands/projects.js +125 -5
  68. package/dist/commands/reconnect.js +9 -3
  69. package/dist/commands/repo.js +42 -1
  70. package/dist/commands/resource-view.d.ts +17 -0
  71. package/dist/commands/resource-view.js +36 -14
  72. package/dist/commands/resume.js +9 -2
  73. package/dist/commands/routines.d.ts +0 -2
  74. package/dist/commands/routines.js +473 -289
  75. package/dist/commands/secrets.js +52 -9
  76. package/dist/commands/sessions-export.d.ts +47 -0
  77. package/dist/commands/sessions-export.js +116 -6
  78. package/dist/commands/sessions-import.d.ts +17 -0
  79. package/dist/commands/sessions-import.js +114 -6
  80. package/dist/commands/sessions-migrate.d.ts +27 -0
  81. package/dist/commands/sessions-migrate.js +50 -9
  82. package/dist/commands/sessions-picker.js +23 -4
  83. package/dist/commands/sessions-resume.d.ts +5 -3
  84. package/dist/commands/sessions-resume.js +30 -8
  85. package/dist/commands/sessions-watch.d.ts +2 -0
  86. package/dist/commands/sessions-watch.js +53 -0
  87. package/dist/commands/sessions.d.ts +66 -3
  88. package/dist/commands/sessions.js +298 -47
  89. package/dist/commands/setup-browser.js +2 -2
  90. package/dist/commands/setup-mine.js +0 -1
  91. package/dist/commands/setup-preferences.js +1 -1
  92. package/dist/commands/setup.d.ts +5 -0
  93. package/dist/commands/setup.js +31 -5
  94. package/dist/commands/share.d.ts +87 -7
  95. package/dist/commands/share.js +320 -58
  96. package/dist/commands/skills.js +0 -11
  97. package/dist/commands/snapshot.js +1 -1
  98. package/dist/commands/ssh.d.ts +18 -0
  99. package/dist/commands/ssh.js +549 -210
  100. package/dist/commands/sync.d.ts +5 -0
  101. package/dist/commands/sync.js +212 -32
  102. package/dist/commands/teams.d.ts +13 -0
  103. package/dist/commands/teams.js +187 -30
  104. package/dist/commands/tickets.d.ts +2 -0
  105. package/dist/commands/tickets.js +43 -0
  106. package/dist/commands/update.js +2 -4
  107. package/dist/commands/usage.js +5 -3
  108. package/dist/commands/versions.js +11 -5
  109. package/dist/commands/view.js +15 -7
  110. package/dist/commands/webhook.d.ts +2 -2
  111. package/dist/commands/webhook.js +7 -7
  112. package/dist/index.d.ts +18 -2
  113. package/dist/index.js +53 -1264
  114. package/dist/lib/account-catalog.d.ts +18 -0
  115. package/dist/lib/account-catalog.js +38 -0
  116. package/dist/lib/account-provider-registry.d.ts +18 -0
  117. package/dist/lib/account-provider-registry.js +59 -0
  118. package/dist/lib/account-registry.d.ts +40 -0
  119. package/dist/lib/account-registry.js +239 -0
  120. package/dist/lib/account-schema.d.ts +44 -0
  121. package/dist/lib/account-schema.js +91 -0
  122. package/dist/lib/account-state-service.d.ts +21 -0
  123. package/dist/lib/account-state-service.js +60 -0
  124. package/dist/lib/activity.d.ts +1 -1
  125. package/dist/lib/activity.js +8 -1
  126. package/dist/lib/add-dir.d.ts +80 -0
  127. package/dist/lib/add-dir.js +241 -0
  128. package/dist/lib/agent-cli-commands.d.ts +11 -0
  129. package/dist/lib/agent-cli-commands.js +30 -0
  130. package/dist/lib/agents.js +44 -36
  131. package/dist/lib/answer-router.js +1 -1
  132. package/dist/lib/audit/log.d.ts +10 -27
  133. package/dist/lib/audit/log.js +20 -33
  134. package/dist/lib/auth-health.d.ts +9 -2
  135. package/dist/lib/auth-health.js +42 -9
  136. package/dist/lib/auto-pull-worker.js +7 -3
  137. package/dist/lib/auto-pull.d.ts +44 -3
  138. package/dist/lib/auto-pull.js +88 -5
  139. package/dist/lib/binary-shadow.d.ts +28 -0
  140. package/dist/lib/binary-shadow.js +121 -0
  141. package/dist/lib/brand.js +9 -3
  142. package/dist/lib/browser/hygiene.d.ts +90 -0
  143. package/dist/lib/browser/hygiene.js +146 -0
  144. package/dist/lib/browser/ipc.d.ts +30 -0
  145. package/dist/lib/browser/ipc.js +93 -4
  146. package/dist/lib/browser/profiles.d.ts +3 -2
  147. package/dist/lib/browser/profiles.js +65 -22
  148. package/dist/lib/browser/service.d.ts +79 -1
  149. package/dist/lib/browser/service.js +231 -14
  150. package/dist/lib/browser/sessions-list.d.ts +22 -2
  151. package/dist/lib/browser/sessions-list.js +54 -6
  152. package/dist/lib/browser/stream.d.ts +2 -0
  153. package/dist/lib/browser/stream.js +1 -0
  154. package/dist/lib/browser/types.d.ts +63 -1
  155. package/dist/lib/byok-usage.d.ts +9 -2
  156. package/dist/lib/byok-usage.js +133 -31
  157. package/dist/lib/cli-entry.d.ts +11 -0
  158. package/dist/lib/cli-entry.js +46 -0
  159. package/dist/lib/cloud/host.d.ts +1 -1
  160. package/dist/lib/cloud/host.js +2 -2
  161. package/dist/lib/cloud/registry.js +1 -1
  162. package/dist/lib/cloud/types.d.ts +1 -1
  163. package/dist/lib/commands.d.ts +2 -0
  164. package/dist/lib/commands.js +2 -0
  165. package/dist/lib/computer/sessions-list.d.ts +150 -0
  166. package/dist/lib/computer/sessions-list.js +363 -0
  167. package/dist/lib/config-keys.d.ts +86 -0
  168. package/dist/lib/config-keys.js +193 -0
  169. package/dist/lib/config-machine-keys.d.ts +12 -0
  170. package/dist/lib/config-machine-keys.js +17 -0
  171. package/dist/lib/config-transfer.js +3 -4
  172. package/dist/lib/crabbox/cli.d.ts +2 -2
  173. package/dist/lib/crabbox/cli.js +3 -3
  174. package/dist/lib/daemon-health.d.ts +22 -0
  175. package/dist/lib/daemon-health.js +33 -3
  176. package/dist/lib/daemon-services.d.ts +50 -0
  177. package/dist/lib/daemon-services.js +147 -0
  178. package/dist/lib/daemon-ticks.d.ts +35 -66
  179. package/dist/lib/daemon-ticks.js +77 -159
  180. package/dist/lib/daemon.d.ts +72 -4
  181. package/dist/lib/daemon.js +792 -202
  182. package/dist/lib/deeplink/register.d.ts +49 -0
  183. package/dist/lib/deeplink/register.js +253 -0
  184. package/dist/lib/deeplink/url.d.ts +34 -0
  185. package/dist/lib/deeplink/url.js +78 -0
  186. package/dist/lib/device-config.d.ts +124 -29
  187. package/dist/lib/device-config.js +346 -141
  188. package/dist/lib/devices/config-migration.d.ts +42 -0
  189. package/dist/lib/devices/config-migration.js +203 -0
  190. package/dist/lib/devices/connect.js +14 -7
  191. package/dist/lib/devices/doctor-findings.d.ts +4 -1
  192. package/dist/lib/devices/doctor-findings.js +20 -1
  193. package/dist/lib/devices/harness-inventory.d.ts +11 -2
  194. package/dist/lib/devices/harness-inventory.js +0 -0
  195. package/dist/lib/devices/health.d.ts +1 -1
  196. package/dist/lib/devices/health.js +1 -1
  197. package/dist/lib/devices/pending.d.ts +22 -1
  198. package/dist/lib/devices/pending.js +67 -2
  199. package/dist/lib/devices/registry.d.ts +0 -25
  200. package/dist/lib/devices/registry.js +2 -83
  201. package/dist/lib/devices/resolve-profile.d.ts +20 -0
  202. package/dist/lib/devices/resolve-profile.js +44 -0
  203. package/dist/lib/devices/rollout-verify.d.ts +101 -0
  204. package/dist/lib/devices/rollout-verify.js +193 -0
  205. package/dist/lib/devices/ssh-config.js +10 -6
  206. package/dist/lib/event-families.d.ts +28 -0
  207. package/dist/lib/event-families.js +159 -0
  208. package/dist/lib/event-stream.d.ts +9 -1
  209. package/dist/lib/event-stream.js +26 -9
  210. package/dist/lib/events.d.ts +9 -1
  211. package/dist/lib/events.js +21 -6
  212. package/dist/lib/exec.d.ts +30 -0
  213. package/dist/lib/exec.js +219 -121
  214. package/dist/lib/feed-broadcast.d.ts +25 -0
  215. package/dist/lib/feed-broadcast.js +33 -0
  216. package/dist/lib/feed.d.ts +1 -1
  217. package/dist/lib/feed.js +12 -2
  218. package/dist/lib/fleet/capture.js +15 -0
  219. package/dist/lib/fleet/manifest.js +9 -0
  220. package/dist/lib/fleet/types.d.ts +9 -0
  221. package/dist/lib/fleet-status.js +10 -8
  222. package/dist/lib/git.d.ts +21 -7
  223. package/dist/lib/git.js +122 -18
  224. package/dist/lib/hosts/dispatch.d.ts +8 -3
  225. package/dist/lib/hosts/dispatch.js +29 -3
  226. package/dist/lib/hosts/logs.d.ts +2 -2
  227. package/dist/lib/hosts/logs.js +2 -2
  228. package/dist/lib/hosts/option.js +1 -1
  229. package/dist/lib/hosts/passthrough.d.ts +2 -3
  230. package/dist/lib/hosts/passthrough.js +10 -24
  231. package/dist/lib/hosts/progress.js +2 -2
  232. package/dist/lib/hosts/providers/devices.d.ts +3 -3
  233. package/dist/lib/hosts/providers/devices.js +18 -12
  234. package/dist/lib/hosts/ready.d.ts +5 -1
  235. package/dist/lib/hosts/ready.js +9 -3
  236. package/dist/lib/hosts/reconcile.d.ts +2 -2
  237. package/dist/lib/hosts/reconcile.js +2 -2
  238. package/dist/lib/hosts/registry.js +14 -9
  239. package/dist/lib/hosts/remote-cmd.js +1 -1
  240. package/dist/lib/hosts/remote-os.d.ts +9 -6
  241. package/dist/lib/hosts/remote-os.js +13 -6
  242. package/dist/lib/hosts/routing-flag.d.ts +23 -0
  243. package/dist/lib/hosts/routing-flag.js +41 -0
  244. package/dist/lib/hosts/run-target.js +1 -1
  245. package/dist/lib/hosts/session-index.js +1 -1
  246. package/dist/lib/hosts/tasks.d.ts +6 -6
  247. package/dist/lib/hosts/tasks.js +4 -4
  248. package/dist/lib/hosts/types.js +1 -2
  249. package/dist/lib/installations/resolve.js +2 -8
  250. package/dist/lib/isolation-boundary-report.js +0 -1
  251. package/dist/lib/linear-cache.d.ts +7 -0
  252. package/dist/lib/linear-cache.js +31 -4
  253. package/dist/lib/linear-project-counts.d.ts +1 -1
  254. package/dist/lib/linear-project-counts.js +2 -3
  255. package/dist/lib/linear-projects.js +1 -1
  256. package/dist/lib/loop.d.ts +2 -2
  257. package/dist/lib/loop.js +1 -1
  258. package/dist/lib/mailbox-target.d.ts +1 -1
  259. package/dist/lib/mailbox-target.js +1 -1
  260. package/dist/lib/manifest.js +7 -4
  261. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  262. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  263. package/dist/lib/menubar/snapshot.d.ts +3 -2
  264. package/dist/lib/menubar/snapshot.js +6 -2
  265. package/dist/lib/migrate-fold.d.ts +33 -0
  266. package/dist/lib/migrate-fold.js +130 -0
  267. package/dist/lib/migrate.d.ts +34 -34
  268. package/dist/lib/migrate.js +106 -128
  269. package/dist/lib/model-tier-overrides.d.ts +1 -1
  270. package/dist/lib/model-tier-overrides.js +15 -2
  271. package/dist/lib/monitors/config.d.ts +17 -3
  272. package/dist/lib/monitors/config.js +52 -18
  273. package/dist/lib/monitors/engine.d.ts +32 -1
  274. package/dist/lib/monitors/engine.js +94 -11
  275. package/dist/lib/monitors/fingerprint.d.ts +46 -0
  276. package/dist/lib/monitors/fingerprint.js +100 -0
  277. package/dist/lib/monitors/remote.d.ts +47 -0
  278. package/dist/lib/monitors/remote.js +81 -0
  279. package/dist/lib/monitors/state.d.ts +39 -0
  280. package/dist/lib/monitors/state.js +56 -0
  281. package/dist/lib/onepassword.d.ts +17 -0
  282. package/dist/lib/onepassword.js +52 -22
  283. package/dist/lib/open-url.js +1 -1
  284. package/dist/lib/picker.d.ts +14 -2
  285. package/dist/lib/picker.js +35 -13
  286. package/dist/lib/placement.d.ts +1 -1
  287. package/dist/lib/placement.js +1 -1
  288. package/dist/lib/pr-land-detach.d.ts +32 -0
  289. package/dist/lib/pr-land-detach.js +79 -0
  290. package/dist/lib/profiles-presets.js +13 -0
  291. package/dist/lib/profiles.d.ts +2 -0
  292. package/dist/lib/profiles.js +44 -1
  293. package/dist/lib/project-focus.d.ts +1 -1
  294. package/dist/lib/project-focus.js +1 -1
  295. package/dist/lib/project-probe.d.ts +4 -1
  296. package/dist/lib/project-probe.js +5 -4
  297. package/dist/lib/project-resources.js +2 -18
  298. package/dist/lib/project-root.d.ts +16 -0
  299. package/dist/lib/project-root.js +20 -2
  300. package/dist/lib/projects.d.ts +20 -1
  301. package/dist/lib/projects.js +78 -1
  302. package/dist/lib/refresh-coordinator.d.ts +24 -0
  303. package/dist/lib/refresh-coordinator.js +52 -0
  304. package/dist/lib/registry.d.ts +2 -2
  305. package/dist/lib/registry.js +1 -1
  306. package/dist/lib/resource-aliases.d.ts +13 -0
  307. package/dist/lib/resource-aliases.js +26 -0
  308. package/dist/lib/resources/types.d.ts +1 -1
  309. package/dist/lib/resources.d.ts +16 -0
  310. package/dist/lib/resources.js +66 -10
  311. package/dist/lib/rotate.d.ts +3 -4
  312. package/dist/lib/rotate.js +4 -5
  313. package/dist/lib/routine-activation.d.ts +22 -2
  314. package/dist/lib/routine-activation.js +63 -16
  315. package/dist/lib/routine-context.d.ts +9 -2
  316. package/dist/lib/routine-context.js +21 -6
  317. package/dist/lib/routines-project.d.ts +58 -48
  318. package/dist/lib/routines-project.js +190 -159
  319. package/dist/lib/routines.d.ts +44 -7
  320. package/dist/lib/routines.js +92 -34
  321. package/dist/lib/run-defaults.d.ts +5 -0
  322. package/dist/lib/run-defaults.js +11 -1
  323. package/dist/lib/runner.d.ts +10 -8
  324. package/dist/lib/runner.js +122 -39
  325. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  326. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  327. package/dist/lib/secrets/agent.d.ts +10 -3
  328. package/dist/lib/secrets/agent.js +43 -8
  329. package/dist/lib/secrets/bundles.d.ts +1 -0
  330. package/dist/lib/secrets/bundles.js +92 -80
  331. package/dist/lib/secrets/index.js +32 -9
  332. package/dist/lib/secrets/install-helper.d.ts +4 -4
  333. package/dist/lib/secrets/install-helper.js +4 -4
  334. package/dist/lib/secrets/push.d.ts +40 -6
  335. package/dist/lib/secrets/push.js +58 -11
  336. package/dist/lib/secrets/read-backoff.d.ts +1 -1
  337. package/dist/lib/secrets/read-backoff.js +1 -1
  338. package/dist/lib/secrets/remote.d.ts +24 -0
  339. package/dist/lib/secrets/remote.js +54 -4
  340. package/dist/lib/self-update.d.ts +108 -0
  341. package/dist/lib/self-update.js +276 -1
  342. package/dist/lib/session/active.d.ts +89 -5
  343. package/dist/lib/session/active.js +165 -10
  344. package/dist/lib/session/actor-sidecar.d.ts +1 -1
  345. package/dist/lib/session/actor-sidecar.js +2 -1
  346. package/dist/lib/session/db.d.ts +176 -2
  347. package/dist/lib/session/db.js +484 -17
  348. package/dist/lib/session/discover.js +27 -4
  349. package/dist/lib/session/hook-sessions.js +2 -2
  350. package/dist/lib/session/host-link.d.ts +2 -2
  351. package/dist/lib/session/host-link.js +2 -2
  352. package/dist/lib/session/pid-registry.d.ts +21 -0
  353. package/dist/lib/session/pid-registry.js +57 -0
  354. package/dist/lib/session/remote-active.js +15 -1
  355. package/dist/lib/session/remote.js +2 -2
  356. package/dist/lib/session/session-cache.d.ts +14 -7
  357. package/dist/lib/session/session-cache.js +51 -9
  358. package/dist/lib/session/state.d.ts +2 -2
  359. package/dist/lib/session/state.js +1 -1
  360. package/dist/lib/session/sync/config.d.ts +10 -10
  361. package/dist/lib/session/sync/config.js +10 -10
  362. package/dist/lib/session/sync/r2.d.ts +34 -0
  363. package/dist/lib/session/sync/r2.js +123 -0
  364. package/dist/lib/session/throughput.d.ts +1 -1
  365. package/dist/lib/session/throughput.js +1 -1
  366. package/dist/lib/session/types.d.ts +23 -1
  367. package/dist/lib/session/types.js +15 -0
  368. package/dist/lib/session/viewing-in.d.ts +1 -1
  369. package/dist/lib/session/viewing-in.js +1 -1
  370. package/dist/lib/session/watch.d.ts +101 -0
  371. package/dist/lib/session/watch.js +242 -0
  372. package/dist/lib/share/analytics.js +1 -1
  373. package/dist/lib/share/capture.d.ts +1 -1
  374. package/dist/lib/share/capture.js +3 -3
  375. package/dist/lib/share/config.d.ts +6 -2
  376. package/dist/lib/share/config.js +6 -5
  377. package/dist/lib/share/delete.js +3 -3
  378. package/dist/lib/share/provision.d.ts +38 -0
  379. package/dist/lib/share/provision.js +51 -1
  380. package/dist/lib/share/publish.d.ts +40 -1
  381. package/dist/lib/share/publish.js +119 -6
  382. package/dist/lib/share/worker-template.d.ts +12 -1
  383. package/dist/lib/share/worker-template.js +83 -7
  384. package/dist/lib/shims.d.ts +17 -3
  385. package/dist/lib/shims.js +98 -26
  386. package/dist/lib/signin-badge.js +3 -2
  387. package/dist/lib/skills.js +2 -0
  388. package/dist/lib/smart-launch.d.ts +8 -8
  389. package/dist/lib/smart-launch.js +80 -59
  390. package/dist/lib/ssh-exec.d.ts +1 -1
  391. package/dist/lib/ssh-exec.js +1 -1
  392. package/dist/lib/staleness/prune.d.ts +88 -0
  393. package/dist/lib/staleness/prune.js +69 -0
  394. package/dist/lib/staleness/registry.d.ts +1 -1
  395. package/dist/lib/staleness/writers/commands.js +34 -2
  396. package/dist/lib/staleness/writers/hooks.js +16 -0
  397. package/dist/lib/staleness/writers/kinds.d.ts +6 -0
  398. package/dist/lib/staleness/writers/skills.js +19 -0
  399. package/dist/lib/staleness/writers/subagents.d.ts +2 -3
  400. package/dist/lib/staleness/writers/subagents.js +0 -4
  401. package/dist/lib/staleness/writers/types.d.ts +32 -0
  402. package/dist/lib/startup/command-registry.d.ts +16 -14
  403. package/dist/lib/startup/command-registry.js +26 -37
  404. package/dist/lib/startup/dev-build.d.ts +10 -0
  405. package/dist/lib/startup/dev-build.js +13 -1
  406. package/dist/lib/startup/spellcheck.d.ts +18 -0
  407. package/dist/lib/startup/spellcheck.js +45 -0
  408. package/dist/lib/state.d.ts +36 -9
  409. package/dist/lib/state.js +96 -46
  410. package/dist/lib/subagents-registry.d.ts +0 -7
  411. package/dist/lib/subagents-registry.js +38 -65
  412. package/dist/lib/subagents.d.ts +0 -33
  413. package/dist/lib/subagents.js +0 -75
  414. package/dist/lib/sync-umbrella.js +1 -1
  415. package/dist/lib/teams/agents.d.ts +41 -1
  416. package/dist/lib/teams/agents.js +187 -9
  417. package/dist/lib/teams/api.d.ts +11 -1
  418. package/dist/lib/teams/api.js +11 -2
  419. package/dist/lib/teams/delivery.d.ts +41 -0
  420. package/dist/lib/teams/delivery.js +60 -0
  421. package/dist/lib/teams/registry.d.ts +14 -0
  422. package/dist/lib/teams/registry.js +51 -1
  423. package/dist/lib/teams/remoteWorktree.d.ts +19 -0
  424. package/dist/lib/teams/remoteWorktree.js +29 -0
  425. package/dist/lib/teams/scheduler.d.ts +1 -1
  426. package/dist/lib/teams/scheduler.js +1 -1
  427. package/dist/lib/teams/worktree.d.ts +24 -0
  428. package/dist/lib/teams/worktree.js +42 -0
  429. package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
  430. package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
  431. package/dist/lib/terminal/engine.d.ts +4 -0
  432. package/dist/lib/terminal/engine.js +8 -2
  433. package/dist/lib/terminal/types.d.ts +21 -2
  434. package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
  435. package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
  436. package/dist/lib/tickets/list.d.ts +53 -0
  437. package/dist/lib/tickets/list.js +153 -0
  438. package/dist/lib/tmux/orphan-reap.d.ts +316 -0
  439. package/dist/lib/tmux/orphan-reap.js +638 -0
  440. package/dist/lib/tmux/session.d.ts +68 -3
  441. package/dist/lib/tmux/session.js +96 -5
  442. package/dist/lib/triggers/handlers.d.ts +20 -0
  443. package/dist/lib/triggers/handlers.js +16 -1
  444. package/dist/lib/triggers/webhook.js +10 -0
  445. package/dist/lib/types.d.ts +47 -35
  446. package/dist/lib/usage-fleet.d.ts +32 -0
  447. package/dist/lib/usage-fleet.js +125 -0
  448. package/dist/lib/usage-refresh.d.ts +3 -3
  449. package/dist/lib/usage-refresh.js +19 -16
  450. package/dist/lib/usage.d.ts +51 -47
  451. package/dist/lib/usage.js +145 -153
  452. package/dist/lib/version-duplicates.js +2 -2
  453. package/dist/lib/versions.d.ts +56 -13
  454. package/dist/lib/versions.js +195 -45
  455. package/dist/lib/watchdog/log.d.ts +1 -1
  456. package/dist/lib/watchdog/log.js +3 -3
  457. package/dist/lib/watchdog/rotate.d.ts +6 -6
  458. package/dist/lib/watchdog/rotate.js +6 -6
  459. package/dist/lib/workflows.d.ts +1 -1
  460. package/dist/lib/yaml-io.d.ts +47 -0
  461. package/dist/lib/yaml-io.js +55 -0
  462. package/package.json +2 -1
  463. package/scripts/install-helper.js +2 -2
  464. package/scripts/postinstall.js +23 -20
  465. package/dist/commands/defaults.d.ts +0 -7
  466. package/dist/commands/defaults.js +0 -107
  467. package/dist/commands/export.d.ts +0 -11
  468. package/dist/commands/export.js +0 -215
  469. package/dist/commands/helper.d.ts +0 -12
  470. package/dist/commands/helper.js +0 -87
  471. package/dist/commands/hosts.d.ts +0 -11
  472. package/dist/commands/hosts.js +0 -330
  473. package/dist/commands/lock.d.ts +0 -12
  474. package/dist/commands/lock.js +0 -70
  475. package/dist/commands/pull.d.ts +0 -17
  476. package/dist/commands/pull.js +0 -39
  477. package/dist/commands/push.d.ts +0 -14
  478. package/dist/commands/push.js +0 -30
  479. package/dist/commands/set.d.ts +0 -15
  480. package/dist/commands/set.js +0 -79
  481. package/dist/commands/setup-share.d.ts +0 -17
  482. package/dist/commands/setup-share.js +0 -85
  483. package/dist/commands/wallet.d.ts +0 -20
  484. package/dist/commands/wallet.js +0 -216
  485. package/dist/commands/worktree.d.ts +0 -19
  486. package/dist/commands/worktree.js +0 -272
  487. package/dist/lib/account-labels.d.ts +0 -24
  488. package/dist/lib/account-labels.js +0 -72
  489. package/dist/lib/auto-dispatch-linear.d.ts +0 -18
  490. package/dist/lib/auto-dispatch-linear.js +0 -107
  491. package/dist/lib/auto-dispatch-provider.d.ts +0 -10
  492. package/dist/lib/auto-dispatch-provider.js +0 -30
  493. package/dist/lib/auto-dispatch.d.ts +0 -93
  494. package/dist/lib/auto-dispatch.js +0 -128
  495. package/dist/lib/export.d.ts +0 -72
  496. package/dist/lib/export.js +0 -269
  497. package/dist/lib/lock.d.ts +0 -93
  498. package/dist/lib/lock.js +0 -207
  499. package/dist/lib/wallet/index.d.ts +0 -78
  500. package/dist/lib/wallet/index.js +0 -253
@@ -1,13 +1,6 @@
1
1
  import type { Command } from 'commander';
2
- import type { AgentId } from '../lib/types.js';
3
- import { listInstalledVersions } from '../lib/versions.js';
4
- import { discoverAccounts } from '../lib/account-labels.js';
5
- export declare function fingerprintFromSource(raw: string, deps?: {
6
- installedVersions?: typeof listInstalledVersions;
7
- discover?: typeof discoverAccounts;
8
- }): Promise<{
9
- agent: AgentId;
10
- fingerprint: string;
11
- versions: string[];
12
- }>;
2
+ export declare function parseBundleKey(raw: string): {
3
+ bundle: string;
4
+ key: string;
5
+ };
13
6
  export declare function registerAccountsCommand(program: Command): void;
@@ -1,32 +1,164 @@
1
1
  import chalk from 'chalk';
2
- import { select } from '@inquirer/prompts';
3
- import { resolveAgentName, formatAgentError } from '../lib/agents.js';
4
- import { listInstalledVersions } from '../lib/versions.js';
5
- import { discoverAccounts, nameAccount, removeAccountLabel, renameAccountLabel } from '../lib/account-labels.js';
2
+ import { password } from '@inquirer/prompts';
6
3
  import { setHelpSections } from '../lib/help.js';
7
- function parseSource(raw) { const at = raw.lastIndexOf('@'); if (at < 1 || at === raw.length - 1)
8
- throw new Error(`Expected <agent>@<version>, got '${raw}'.`); const name = raw.slice(0, at); const agent = resolveAgentName(name); if (!agent)
9
- throw new Error(formatAgentError(name)); return { agent, version: raw.slice(at + 1) }; }
10
- export async function fingerprintFromSource(raw, deps = {}) {
11
- const { agent, version } = parseSource(raw);
12
- if (!(deps.installedVersions ?? listInstalledVersions)(agent).includes(version))
13
- throw new Error(`${raw} is not installed.`);
14
- const account = (await (deps.discover ?? discoverAccounts)([agent])).find(candidate => candidate.versions.includes(version));
15
- if (!account)
16
- throw new Error(`${raw} has no stable signed-in account. Run it and complete its normal login first.`);
17
- return { agent, fingerprint: account.fingerprint, versions: account.versions };
4
+ import { updateMeta } from '../lib/state.js';
5
+ import { ALL_AGENT_IDS } from '../lib/agents.js';
6
+ import { pushBundleToHost } from '../lib/secrets/push.js';
7
+ import { resolveRemoteOsSync } from '../lib/hosts/remote-os.js';
8
+ import { runDevicesAccounts } from './ssh.js';
9
+ import { discoverNativeAccounts } from '../lib/account-catalog.js';
10
+ import { readAndResolveBundleEnv } from '../lib/secrets/bundles.js';
11
+ import { getAccountProvider, listAccountProviders } from '../lib/account-provider-registry.js';
12
+ import { addAccount, findAccount, inspectAccount, readAccountRegistry, removeAccount, renameAccount, setAccountSecret } from '../lib/account-registry.js';
13
+ export function parseBundleKey(raw) {
14
+ const colon = raw.indexOf(':');
15
+ if (colon < 1 || colon === raw.length - 1)
16
+ throw new Error(`Expected bundle:key, got '${raw}'.`);
17
+ return { bundle: raw.slice(0, colon), key: raw.slice(colon + 1) };
18
+ }
19
+ function secretFromBundle(raw) {
20
+ const { bundle, key } = parseBundleKey(raw);
21
+ return readAndResolveBundleEnv(bundle, { keys: [key], keyMode: 'storage', agentOnly: true, caller: 'accounts import' }).env[key];
22
+ }
23
+ function publicAccount(account) {
24
+ return { kind: 'provider', id: account.id, name: account.name, provider: account.provider, auth: account.auth, baseUrl: account.baseUrl, policy: account.policy, secretPresent: account.secretPresent };
25
+ }
26
+ async function printAccounts(json, fleet = false) {
27
+ if (fleet)
28
+ return runDevicesAccounts({ json });
29
+ const records = Object.values(readAccountRegistry().accounts).sort((a, b) => a.name.localeCompare(b.name));
30
+ const native = await discoverNativeAccounts();
31
+ if (json) {
32
+ console.log(JSON.stringify([...records.map(account => publicAccount(inspectAccount(account.name))), ...native], null, 2));
33
+ return;
34
+ }
35
+ console.log(chalk.bold('Provider account bundles\n'));
36
+ if (!records.length)
37
+ console.log(chalk.gray(" None. Add one with 'agents accounts add <name> --provider <provider> --auth <type>'."));
38
+ for (const account of records) {
39
+ const present = inspectAccount(account.name).secretPresent ? chalk.green('ready') : chalk.red('missing on this device');
40
+ console.log(` ${chalk.cyan(account.name)} ${account.provider} ${account.auth} ${present}`);
41
+ }
42
+ console.log(chalk.bold('\nNative harness logins\n'));
43
+ if (!native.length)
44
+ console.log(chalk.gray(' No signed-in native accounts found.'));
45
+ for (const account of native)
46
+ console.log(` ${chalk.cyan(account.display)} ${account.agent} ${account.versions.join(', ')}`);
47
+ }
48
+ function parseAuth(raw) {
49
+ if (raw === 'api-key' || raw === 'setup-token' || raw === 'bearer-token')
50
+ return raw;
51
+ throw new Error(`Unsupported auth type '${raw}'. Use api-key, setup-token, or bearer-token.`);
18
52
  }
19
- async function printAccounts(json) { const accounts = await discoverAccounts(); if (json)
20
- return console.log(JSON.stringify(accounts, null, 2)); if (!accounts.length)
21
- return console.log(chalk.gray('No signed-in accounts found. Run an installed agent and complete its normal login first.')); console.log(chalk.bold('Signed-in accounts\n')); for (const account of accounts)
22
- console.log(` ${account.label ? chalk.cyan(account.label) : chalk.gray('(unnamed)')} ${account.agent} ${account.display}\n ${account.versions.length} installed version${account.versions.length === 1 ? '' : 's'}: ${account.versions.join(', ')}`); }
23
- async function chooseAccount() { const accounts = await discoverAccounts(); if (!accounts.length)
24
- throw new Error('No signed-in accounts found. Run an installed agent and complete its normal login first.'); return select({ message: 'Which signed-in account do you want to name?', choices: accounts.map(account => ({ name: `${account.agent} ${account.display} (${account.versions.length} version${account.versions.length === 1 ? '' : 's'})${account.label ? ` currently “${account.label}”` : ''}`, value: account })) }); }
25
53
  export function registerAccountsCommand(program) {
26
- const accounts = program.command('accounts').description('Browse and name signed-in harness accounts').option('--json', 'Machine-readable discovered accounts').action(async (o) => printAccounts(!!o.json));
27
- accounts.command('list').description('Alias for accounts').option('--json', 'Machine-readable discovered accounts').action((o) => printAccounts(!!o.json));
28
- accounts.command('name <label>').description('Name one signed-in account; matching installed versions are found automatically').option('--from <agent@version>', 'Non-interactive identity source').action(async (label, o) => { const picked = o.from ? await fingerprintFromSource(o.from) : await chooseAccount(); nameAccount(label, picked.agent, picked.fingerprint); console.log(chalk.green(`Named the ${picked.agent} account '${label}'.`)); console.log(chalk.gray(`Found it in ${picked.versions.length} installed version${picked.versions.length === 1 ? '' : 's'}: ${picked.versions.join(', ')}`)); });
29
- accounts.command('rename <old> <new>').description('Rename a saved account label').action((oldLabel, newLabel) => renameAccountLabel(oldLabel, newLabel));
30
- accounts.command('remove <label>').description('Remove a saved account label').action((label) => removeAccountLabel(label));
31
- setHelpSections(accounts, { examples: `agents accounts\nagents accounts name work\nagents accounts name work --from claude@2.1.220\nagents run claude --account work`, notes: 'First run the harness and complete its normal login. A label names one provider account; every matching installed version is discovered automatically. OAuth credentials are never copied or shared.' });
54
+ const accounts = program.command('accounts').description('Browse native logins and manage provider account bundles')
55
+ .option('--json', 'Machine-readable account metadata')
56
+ .option('--fleet', 'Show harness-native signed-in identities across reachable devices')
57
+ .action((o) => printAccounts(!!o.json, !!o.fleet));
58
+ accounts.command('list').description('List credential accounts').option('--json', 'Machine-readable account metadata').action((o, command) => printAccounts(!!(o.json || command.optsWithGlobals().json)));
59
+ accounts.command('add <name>')
60
+ .description('Add a durable API key, setup token, or bearer token')
61
+ .requiredOption('--provider <provider>', `Credential provider (${listAccountProviders().join(', ')})`)
62
+ .requiredOption('--auth <type>', 'Credential type: api-key | setup-token | bearer-token')
63
+ .option('--base-url <url>', 'Optional endpoint override stored with the account')
64
+ .option('--from-secrets <bundle:key>', 'Import from an existing agents secrets entry')
65
+ .action(async (name, o) => {
66
+ const auth = parseAuth(o.auth);
67
+ const provider = getAccountProvider(o.provider);
68
+ if (!provider.authKinds.includes(auth))
69
+ throw new Error(`Provider '${provider.provider}' does not support ${auth}. Supported: ${provider.authKinds.join(', ')}.`);
70
+ const secret = o.fromSecrets ? secretFromBundle(o.fromSecrets) : await password({ message: `Enter ${provider.provider} ${auth} for '${name}':` });
71
+ const account = addAccount(name, provider.provider, auth, secret, undefined, { baseUrl: o.baseUrl });
72
+ console.log(chalk.green(`Added ${account.provider} ${account.auth} account '${account.name}'.`));
73
+ console.log(chalk.gray(`Secret bundle '${account.name}' is the account and uses policy never, so agent launches never request Touch ID.`));
74
+ });
75
+ accounts.command('set-key <name>')
76
+ .description('Rotate an account credential without changing its identity')
77
+ .option('--from-secrets <bundle:key>', 'Import from an existing agents secrets entry')
78
+ .action(async (name, o) => {
79
+ const account = findAccount(name);
80
+ if (!account)
81
+ throw new Error(`Unknown account '${name}'.`);
82
+ const secret = o.fromSecrets ? secretFromBundle(o.fromSecrets) : await password({ message: `Enter new ${account.provider} ${account.auth} for '${name}':` });
83
+ setAccountSecret(name, secret);
84
+ console.log(chalk.green(`Updated credential for account '${name}'.`));
85
+ });
86
+ accounts.command('inspect <name>').description('Show safe account metadata').option('--json', 'Machine-readable output').action((name, o, command) => {
87
+ const account = publicAccount(inspectAccount(name));
88
+ if (o.json || command.optsWithGlobals().json)
89
+ return console.log(JSON.stringify(account, null, 2));
90
+ console.log(`${chalk.bold(account.name)} ${account.provider}`);
91
+ console.log(` auth: ${account.auth}`);
92
+ console.log(` id: ${account.id}`);
93
+ console.log(` policy: ${account.policy}`);
94
+ if (account.baseUrl)
95
+ console.log(` base url: ${account.baseUrl}`);
96
+ console.log(` credential: ${account.secretPresent ? 'present on this device' : 'missing on this device'}`);
97
+ });
98
+ accounts.command('rename <old> <new>').description('Rename an account without changing its stable id').action((oldName, newName) => renameAccount(oldName, newName));
99
+ accounts.command('remove <name>').description('Remove an account and its device-local credential').action((name) => removeAccount(name));
100
+ accounts.command('set-default <agent> <name>')
101
+ .description('Use a provider account for a harness when --account is omitted')
102
+ .action((agentRaw, name) => {
103
+ if (!ALL_AGENT_IDS.includes(agentRaw))
104
+ throw new Error(`Unknown agent '${agentRaw}'.`);
105
+ const agent = agentRaw;
106
+ const account = findAccount(name);
107
+ if (!account)
108
+ throw new Error(`Unknown provider account '${name}'.`);
109
+ getAccountProvider(account.provider).envFor(agent, account.auth);
110
+ // Defaults follow the stable account id, so renaming the bundle cannot
111
+ // strand bare runs on a deleted label. findAccount accepts ids and names.
112
+ updateMeta(meta => ({ ...meta, accounts: { ...meta.accounts, defaults: { ...meta.accounts?.defaults, [agent]: account.id } } }));
113
+ console.log(chalk.green(`${agent} now uses account '${account.name}' unless --account overrides it.`));
114
+ });
115
+ accounts.command('clear-default <agent>')
116
+ .description('Return a harness to native login or balanced account selection')
117
+ .action((agentRaw) => {
118
+ if (!ALL_AGENT_IDS.includes(agentRaw))
119
+ throw new Error(`Unknown agent '${agentRaw}'.`);
120
+ updateMeta(meta => {
121
+ const defaults = { ...meta.accounts?.defaults };
122
+ delete defaults[agentRaw];
123
+ return { ...meta, accounts: { ...meta.accounts, defaults } };
124
+ });
125
+ console.log(chalk.green(`Cleared the default account for ${agentRaw}.`));
126
+ });
127
+ accounts.command('sync <name>')
128
+ .description('Copy one provider account bundle to a worker device')
129
+ .requiredOption('--device <device>', 'Destination device or SSH host')
130
+ .option('--force', 'Replace matching keys on the destination')
131
+ .action((name, o) => {
132
+ const account = findAccount(name);
133
+ if (!account)
134
+ throw new Error(`Unknown provider account '${name}'.`);
135
+ const remoteBackend = resolveRemoteOsSync(o.device) === 'win32' ? 'keychain' : 'file';
136
+ const literalValues = {
137
+ ACCOUNT_ID: account.id,
138
+ PROVIDER: account.provider,
139
+ AUTH_TYPE: account.auth,
140
+ ...(account.baseUrl ? { BASE_URL: account.baseUrl } : {}),
141
+ };
142
+ const result = pushBundleToHost(account.name, o.device, {
143
+ remoteBackend,
144
+ force: o.force,
145
+ operation: 'accounts sync',
146
+ policyNever: true,
147
+ agentOnly: false,
148
+ literalValues,
149
+ });
150
+ if (!result.ok)
151
+ throw new Error(`${result.message}\nRetry: agents accounts sync ${account.name} --device ${o.device}${o.force ? ' --force' : ''}`);
152
+ console.log(chalk.green(`${account.name} synced to ${o.device} (${result.keyCount} keys, ${remoteBackend} backend, policy never).`));
153
+ });
154
+ setHelpSections(accounts, {
155
+ examples: `agents accounts add work --provider anthropic --auth setup-token
156
+ agents accounts add openrouter-work --provider openrouter --auth api-key --from-secrets openrouter.ai:OPENROUTER_API_KEY
157
+ agents accounts set-key work
158
+ agents accounts inspect work --json
159
+ agents accounts set-default claude work
160
+ agents accounts sync work --device yosemite-s0
161
+ agents run claude --account work`,
162
+ notes: 'Provider accounts are durable credentials independent of agent versions. Harness-native auth remains managed by each harness and is not copied or renamed by agents-cli.',
163
+ });
32
164
  }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * `agents artifacts setup` — configure the artifact share endpoint (Cloudflare
3
+ * R2 + Worker) that backs `agents artifacts share`.
4
+ *
5
+ * One door, two modes, because it replaces two commands that used to be
6
+ * separate (RUSH-2580): the interactive wizard formerly at `agents setup share`
7
+ * and the flag-driven provisioner formerly at `agents share setup`. On a TTY
8
+ * with no provisioning flags TYPED it runs the wizard (provision or join, and
9
+ * offers a Worker update when an endpoint already exists); with any provisioning
10
+ * flag typed, or on a non-TTY, it provisions directly. Both modes call the same
11
+ * `runShareProvision` / `runShareJoin` in commands/share.ts, so there is a
12
+ * single source of truth for provisioning.
13
+ *
14
+ * "Typed", not "present", is load-bearing — see {@link isDirectProvisionRequest}.
15
+ *
16
+ * Idempotent: re-running shows the current endpoint and offers to reconfigure.
17
+ */
18
+ import type { Command } from 'commander';
19
+ /**
20
+ * Interactive share setup. Returns true if the user configured (or already had)
21
+ * an endpoint, false if they skipped. Never throws on user cancel — callers
22
+ * (the `agents setup` hub) rely on that to keep the fresh-machine flow going.
23
+ */
24
+ export declare function runShareWizard(): Promise<boolean>;
25
+ /** Parsed `agents artifacts setup` options — the retired `agents share setup` flag set. */
26
+ interface ArtifactsSetupOpts {
27
+ bundle: string;
28
+ worker: string;
29
+ bucket: string;
30
+ account?: string;
31
+ token?: string;
32
+ domain?: string;
33
+ analyticsToken?: string;
34
+ }
35
+ /** The provisioning flags, by their commander option-value keys. */
36
+ declare const PROVISION_FLAGS: readonly ["bundle", "worker", "bucket", "account", "token", "domain", "analyticsToken"];
37
+ /**
38
+ * True when the invocation named a Cloudflare endpoint detail, i.e. the caller
39
+ * is driving the old `agents share setup` provisioning path rather than asking
40
+ * for the wizard.
41
+ *
42
+ * `--bundle`/`--worker`/`--bucket` carry commander defaults, so their mere
43
+ * PRESENCE proves nothing — the question is whether the user typed them, which
44
+ * only `wasTyped` (backed by commander's `getOptionValueSource`) can answer.
45
+ * Reading presence alone would classify `agents artifacts setup --bundle
46
+ * cloudflare-work` as a wizard run and then silently provision against the
47
+ * DEFAULT bundle, i.e. someone else's Cloudflare account. The other four flags
48
+ * have no default, so presence is proof for them.
49
+ */
50
+ export declare function isDirectProvisionRequest(opts: ArtifactsSetupOpts, wasTyped?: (flag: (typeof PROVISION_FLAGS)[number]) => boolean): boolean;
51
+ /** Register `agents artifacts setup` under the parent `artifacts` command. */
52
+ export declare function registerArtifactsSetupCommand(artifactsCmd: Command): void;
53
+ export {};
@@ -0,0 +1,161 @@
1
+ /**
2
+ * `agents artifacts setup` — configure the artifact share endpoint (Cloudflare
3
+ * R2 + Worker) that backs `agents artifacts share`.
4
+ *
5
+ * One door, two modes, because it replaces two commands that used to be
6
+ * separate (RUSH-2580): the interactive wizard formerly at `agents setup share`
7
+ * and the flag-driven provisioner formerly at `agents share setup`. On a TTY
8
+ * with no provisioning flags TYPED it runs the wizard (provision or join, and
9
+ * offers a Worker update when an endpoint already exists); with any provisioning
10
+ * flag typed, or on a non-TTY, it provisions directly. Both modes call the same
11
+ * `runShareProvision` / `runShareJoin` in commands/share.ts, so there is a
12
+ * single source of truth for provisioning.
13
+ *
14
+ * "Typed", not "present", is load-bearing — see {@link isDirectProvisionRequest}.
15
+ *
16
+ * Idempotent: re-running shows the current endpoint and offers to reconfigure.
17
+ */
18
+ import chalk from 'chalk';
19
+ import { DEFAULT_BUCKET_NAME, DEFAULT_CF_BUNDLE, DEFAULT_SHARE_DOMAIN, DEFAULT_WORKER_NAME, readShareConfig, } from '../lib/share/config.js';
20
+ import { runShareProvision, runShareJoin, runShareUpdate, shareTemplateStatus } from './share.js';
21
+ import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
22
+ /**
23
+ * Interactive share setup. Returns true if the user configured (or already had)
24
+ * an endpoint, false if they skipped. Never throws on user cancel — callers
25
+ * (the `agents setup` hub) rely on that to keep the fresh-machine flow going.
26
+ */
27
+ export async function runShareWizard() {
28
+ if (!isInteractiveTerminal()) {
29
+ console.error(chalk.red('The artifact share wizard needs an interactive terminal. ' +
30
+ 'Non-interactively, use `agents artifacts setup --account <id> --token <t>` (provision) ' +
31
+ 'or `agents artifacts share join <baseUrl> --token <t>`.'));
32
+ return false;
33
+ }
34
+ const existing = readShareConfig();
35
+ if (existing) {
36
+ console.log(chalk.dim(`Share is already configured → ${chalk.green(existing.baseUrl)}`));
37
+ console.log(chalk.dim(` worker ${existing.workerName} · bucket ${existing.bucketName} · account ${existing.accountId}`));
38
+ const templateStatus = shareTemplateStatus(existing);
39
+ console.log(chalk.dim(` template ${templateStatus}`));
40
+ const { select } = await import('@inquirer/prompts');
41
+ const action = await select({
42
+ message: 'Share is already configured. What do you want to do?',
43
+ choices: [
44
+ { name: 'Keep as is', value: 'keep' },
45
+ {
46
+ name: 'Update the deployed Worker to the latest template',
47
+ value: 'update',
48
+ description: templateStatus === 'current'
49
+ ? 'Already current — this re-deploys anyway and refreshes the token in place.'
50
+ : 'Re-deploys the Worker script on your existing endpoint (same account/worker/bucket, same write token).',
51
+ },
52
+ {
53
+ name: 'Reconfigure from scratch (provision or join again)',
54
+ value: 'reconfigure',
55
+ },
56
+ ],
57
+ default: templateStatus === 'outdated' || templateStatus === 'unknown' ? 'update' : 'keep',
58
+ });
59
+ if (action === 'keep') {
60
+ console.log(chalk.dim('Keeping the current endpoint.'));
61
+ return true;
62
+ }
63
+ if (action === 'update') {
64
+ // When the template is already current, the description below promises a
65
+ // re-deploy anyway — force it, or runShareUpdate's own no-op would silently
66
+ // contradict what was just said.
67
+ const result = await runShareUpdate({ force: templateStatus === 'current' });
68
+ console.log(result.updated
69
+ ? chalk.green(`Worker '${result.workerName}' updated → template ${result.templateHash.slice(0, 12)}…`)
70
+ : chalk.dim(`Worker '${result.workerName}' already matches the current template — no-op.`));
71
+ return true;
72
+ }
73
+ // action === 'reconfigure' — fall through to the provision/join flow below.
74
+ }
75
+ const { select } = await import('@inquirer/prompts');
76
+ const mode = await select({
77
+ message: 'How do you want to publish shared links?',
78
+ choices: [
79
+ {
80
+ name: 'Provision my own (Cloudflare R2 + Worker)',
81
+ value: 'provision',
82
+ description: 'One-time: creates a bucket + Worker on your Cloudflare account (~$0). Needs a Cloudflare API token.',
83
+ },
84
+ {
85
+ name: 'Join an existing endpoint (a teammate already provisioned one)',
86
+ value: 'join',
87
+ description: 'Use synced config when present, or paste the base URL + write token from the endpoint owner.',
88
+ },
89
+ ],
90
+ });
91
+ if (mode === 'provision') {
92
+ await runShareProvision({
93
+ bundle: DEFAULT_CF_BUNDLE,
94
+ worker: DEFAULT_WORKER_NAME,
95
+ bucket: DEFAULT_BUCKET_NAME,
96
+ });
97
+ return true;
98
+ }
99
+ const { input } = await import('@inquirer/prompts');
100
+ const baseUrl = await input({
101
+ message: 'Endpoint base URL (e.g. https://share.agents-cli.sh)',
102
+ validate: (v) => (v.trim().startsWith('http') ? true : 'Enter the full https:// URL of the endpoint.'),
103
+ });
104
+ await runShareJoin(baseUrl.trim());
105
+ return true;
106
+ }
107
+ /** The provisioning flags, by their commander option-value keys. */
108
+ const PROVISION_FLAGS = ['bundle', 'worker', 'bucket', 'account', 'token', 'domain', 'analyticsToken'];
109
+ /**
110
+ * True when the invocation named a Cloudflare endpoint detail, i.e. the caller
111
+ * is driving the old `agents share setup` provisioning path rather than asking
112
+ * for the wizard.
113
+ *
114
+ * `--bundle`/`--worker`/`--bucket` carry commander defaults, so their mere
115
+ * PRESENCE proves nothing — the question is whether the user typed them, which
116
+ * only `wasTyped` (backed by commander's `getOptionValueSource`) can answer.
117
+ * Reading presence alone would classify `agents artifacts setup --bundle
118
+ * cloudflare-work` as a wizard run and then silently provision against the
119
+ * DEFAULT bundle, i.e. someone else's Cloudflare account. The other four flags
120
+ * have no default, so presence is proof for them.
121
+ */
122
+ export function isDirectProvisionRequest(opts, wasTyped = () => false) {
123
+ if (opts.account || opts.token || opts.domain || opts.analyticsToken)
124
+ return true;
125
+ return PROVISION_FLAGS.some((flag) => wasTyped(flag));
126
+ }
127
+ /** Register `agents artifacts setup` under the parent `artifacts` command. */
128
+ export function registerArtifactsSetupCommand(artifactsCmd) {
129
+ artifactsCmd
130
+ .command('setup')
131
+ .description('Provision (or join) the Cloudflare R2 + Worker endpoint that backs `agents artifacts share`.')
132
+ .option('--bundle <name>', 'secrets bundle holding the Cloudflare API token', DEFAULT_CF_BUNDLE)
133
+ .option('--worker <name>', 'Worker name', DEFAULT_WORKER_NAME)
134
+ .option('--bucket <name>', 'R2 bucket name', DEFAULT_BUCKET_NAME)
135
+ .option('--account <id>', 'Cloudflare account id (else read from the bundle / prompt)')
136
+ .option('--token <t>', 'Cloudflare API token (else read from the --bundle)')
137
+ .option('--domain <host>', `custom domain to map (default: ${DEFAULT_SHARE_DOMAIN}; workers.dev if zone is not visible)`)
138
+ .option('--analytics-token <token>', 'Cloudflare Web Analytics token to inject into published HTML pages')
139
+ .action(async (opts, cmd) => {
140
+ try {
141
+ // Named endpoint details, or no terminal to prompt on, means provision
142
+ // directly — the wizard has nothing to ask that was not already given,
143
+ // and it would provision against its own hardcoded defaults, dropping
144
+ // whatever the caller named.
145
+ const wasTyped = (flag) => cmd.getOptionValueSource(flag) === 'cli';
146
+ if (isDirectProvisionRequest(opts, wasTyped) || !isInteractiveTerminal()) {
147
+ await runShareProvision(opts);
148
+ return;
149
+ }
150
+ await runShareWizard();
151
+ }
152
+ catch (err) {
153
+ if (isPromptCancelled(err)) {
154
+ console.log(chalk.yellow('\nCancelled'));
155
+ return;
156
+ }
157
+ console.error(chalk.red(err.message));
158
+ process.exitCode = 1;
159
+ }
160
+ });
161
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `agents artifacts` — the group that owns everything an agent publishes for a
3
+ * human to open: HTML plans, reports, rendered visuals, screenshots.
4
+ *
5
+ * RUSH-2580 nested the former top-level `agents share` here. `artifacts` is the
6
+ * noun, `share` is the action on it, so the surface reads noun-then-action like
7
+ * the rest of the CLI:
8
+ *
9
+ * agents artifacts share <file> publish
10
+ * agents artifacts share list|delete|analytics|join|status|update
11
+ * agents artifacts setup provision (or join) the endpoint
12
+ *
13
+ * The subtree itself lives in commands/share.ts (publish + its subcommands) and
14
+ * commands/artifacts-setup.ts (the provisioning door); this module only assembles
15
+ * the group, so there is one place that says what `agents artifacts` contains.
16
+ */
17
+ import type { Command } from 'commander';
18
+ export declare function registerArtifactsCommands(program: Command): void;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * `agents artifacts` — the group that owns everything an agent publishes for a
3
+ * human to open: HTML plans, reports, rendered visuals, screenshots.
4
+ *
5
+ * RUSH-2580 nested the former top-level `agents share` here. `artifacts` is the
6
+ * noun, `share` is the action on it, so the surface reads noun-then-action like
7
+ * the rest of the CLI:
8
+ *
9
+ * agents artifacts share <file> publish
10
+ * agents artifacts share list|delete|analytics|join|status|update
11
+ * agents artifacts setup provision (or join) the endpoint
12
+ *
13
+ * The subtree itself lives in commands/share.ts (publish + its subcommands) and
14
+ * commands/artifacts-setup.ts (the provisioning door); this module only assembles
15
+ * the group, so there is one place that says what `agents artifacts` contains.
16
+ */
17
+ import { setHelpSections } from '../lib/help.js';
18
+ import { registerShareCommands, registerUnshareCommand } from './share.js';
19
+ import { registerArtifactsSetupCommand } from './artifacts-setup.js';
20
+ export function registerArtifactsCommands(program) {
21
+ const artifactsCmd = program
22
+ .command('artifacts')
23
+ .description('Publish agent-made artifacts (plans, reports, visuals) to your own Cloudflare R2 and get a shareable link (~$0).');
24
+ registerArtifactsSetupCommand(artifactsCmd);
25
+ registerShareCommands(artifactsCmd);
26
+ setHelpSections(artifactsCmd, {
27
+ examples: `
28
+ # One-time: provision your own endpoint (or join a teammate's)
29
+ agents artifacts setup
30
+ agents artifacts share join https://share.agents-cli.sh
31
+
32
+ # Publish — auto OG cover, default 30d expiry, shareable link
33
+ agents artifacts share ./out/plan.html
34
+
35
+ # What's live in your namespace, and taking one down
36
+ agents artifacts share list
37
+ agents unshare my-plan-a1b2
38
+
39
+ # Endpoint health, and pushing a new Worker template to it
40
+ agents artifacts share status
41
+ agents artifacts share update
42
+ `,
43
+ notes: `
44
+ agents artifacts share is the publish action; agents artifacts setup is the
45
+ one-time endpoint provisioning. It runs the interactive wizard only when you
46
+ type NO endpoint flag on a TTY; type any of --bundle/--worker/--bucket/
47
+ --account/--token/--domain/--analytics-token, or run non-interactively, and it
48
+ provisions directly with what you named.
49
+
50
+ agents unshare <targets...> stays a top-level alias of
51
+ agents artifacts share delete.
52
+
53
+ Full reference: apps/cli/docs/share.md.
54
+ `,
55
+ });
56
+ // Top-level, deliberately: see registerUnshareCommand in commands/share.ts.
57
+ registerUnshareCommand(program);
58
+ }
@@ -4,19 +4,32 @@ import { sessionRecoveryPeer } from '../lib/session/recovery.js';
4
4
  import { resolveSessionMetadataValue, resumeSessionInPlace } from './sessions.js';
5
5
  import { readDetachRecord, clearDetachRecord, isHeadlessAlive } from '../lib/session/detached.js';
6
6
  export function registerAttachCommand(program) {
7
+ // Deprecated: superseded by `agents sessions resume`, which detects the state
8
+ // (live pane / headless / ended) instead of making the caller pick a verb.
9
+ // Hidden from help; kept as a warned, functional alias for one release so old
10
+ // muscle-memory and scripts don't break.
7
11
  program
8
- .command('attach')
12
+ .command('attach', { hidden: true })
9
13
  .argument('<id>', 'Short or full id of the backgrounded/parked session to resume interactively')
10
- .description('Bring a backgrounded agent to the foreground — resume it interactively here')
14
+ .description('Deprecated use `agents sessions resume <id>` instead.')
11
15
  .action(async (id) => {
16
+ console.warn(chalk.yellow('`agents sessions attach` is deprecated — use `agents sessions resume` instead:'));
17
+ console.warn(chalk.gray(` agents sessions resume ${id}`));
12
18
  await attachAction(id);
13
19
  });
14
20
  }
15
21
  export async function attachAction(id) {
16
22
  const outcome = await resolveSessionMetadataValue(id);
17
23
  if (outcome.kind === 'partial') {
18
- console.error(chalk.red(`Could not resolve session while these devices were unavailable: ${outcome.failedPeers.join(', ')}`));
19
- process.exitCode = 2;
24
+ // RUSH-2492: an unreachable peer is a warning, not a hard failure. The
25
+ // resolver already resolves an id found on the reachable fleet (SES-9a), so
26
+ // reaching here means the session was not found on any device we COULD reach
27
+ // — it may live on one of the unreachable peers, which we could not check.
28
+ const offline = outcome.failedPeers;
29
+ console.error(chalk.yellow(`Warning: ${offline.length} device(s) unreachable, not checked: ${offline.join(', ')}`));
30
+ console.error(chalk.red(`No session matching "${id}" on any reachable device (${offline.length} unreachable, not checked).`));
31
+ console.error(chalk.gray(' If it lives on an offline box, wake it (agents devices) or run there: agents ssh <device>'));
32
+ process.exitCode = 1;
20
33
  return;
21
34
  }
22
35
  if (outcome.kind === 'not-found') {
@@ -1,14 +1,14 @@
1
1
  /**
2
- * `agents audit` — inspect the tamper-evident audit log of dispatched runs.
2
+ * `agents audit` — thin alias of `agents events --include runs`.
3
3
  *
4
- * Every run that reaches the exec dispatch chokepoint appends one hash-chained
5
- * record (see src/lib/audit/log.ts). This command walks that chain:
4
+ * New run-dispatch outcomes land in the unified event stream as `run.dispatched`
5
+ * (see lib/audit/log.ts::recordDispatchedRun). This command does not own a
6
+ * separate store or query path — it only sets the default family filter.
6
7
  *
7
- * agents audit verify Confirm the chain is intact; report the first break.
8
- * agents audit list Print recent records (newest last).
9
- *
10
- * `verify` exits non-zero when the chain is broken so it can gate CI / governance
11
- * checks.
8
+ * agents audit agents events --include runs
9
+ * agents audit list same
10
+ * agents audit verify walks the legacy hash-chain file if present
11
+ * (pre-unification history only)
12
12
  */
13
13
  import type { Command } from 'commander';
14
14
  export declare function registerAuditCommands(program: Command): void;