@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
@@ -2,12 +2,14 @@
2
2
  // Worker, and get a shareable link (~$0). See apps/cli/docs/share.md.
3
3
  import { existsSync } from 'node:fs';
4
4
  import chalk from 'chalk';
5
- import { DEFAULT_BUCKET_NAME, DEFAULT_CF_BUNDLE, DEFAULT_SHARE_DOMAIN, DEFAULT_WORKER_NAME, generateWriteToken, readCloudflareCreds, readShareConfig, readWriteTokenEnv, readWriteTokenFromBundle, storeWriteToken, writeShareConfig, } from '../lib/share/config.js';
6
- import { addCustomDomain, configureBucketLifecycle, createBucket, deployWorker, enableWorkersDev, findZoneId, setWorkerSecret, } from '../lib/share/provision.js';
7
- import { publishFile } from '../lib/share/publish.js';
5
+ import { DEFAULT_BUCKET_NAME, DEFAULT_CF_BUNDLE, DEFAULT_SHARE_DOMAIN, DEFAULT_WORKER_NAME, generateWriteToken, readCloudflareCreds, readShareConfig, readWriteToken, readWriteTokenEnv, readWriteTokenFromBundle, storeWriteToken, writeShareConfig, } from '../lib/share/config.js';
6
+ import { addCustomDomain, configureBucketLifecycle, createBucket, deployWorker, enableWorkersDev, findZoneId, hashWorkerScript, updateWorker, setWorkerSecret, } from '../lib/share/provision.js';
7
+ import { publishFile, resolveShareUsername } from '../lib/share/publish.js';
8
+ import { deleteShare } from '../lib/share/delete.js';
8
9
  import { renderWorkerScript } from '../lib/share/worker-template.js';
9
10
  import { analyticsEnabled } from '../lib/share/analytics.js';
10
11
  import { resolveGitHubUsername } from '../lib/git.js';
12
+ import { setHelpSections } from '../lib/help.js';
11
13
  export function formatSharePublishResult(result, json = false) {
12
14
  if (json)
13
15
  return JSON.stringify(result, null, 2);
@@ -16,8 +18,210 @@ export function formatSharePublishResult(result, json = false) {
16
18
  lines.push(chalk.dim(` cover ${result.coverUrl}`));
17
19
  if (result.expiresAt)
18
20
  lines.push(chalk.dim(` expires ${new Date(result.expiresAt).toLocaleString()}`));
21
+ else
22
+ lines.push(chalk.dim(' expires never'));
23
+ if (result.unlisted)
24
+ lines.push(chalk.dim(' unlisted (hidden from gallery / share list)'));
19
25
  return lines.join('\n');
20
26
  }
27
+ /** Compare the configured endpoint's last-deployed template hash against the
28
+ * hash of the CURRENT `worker-template.ts` render. A config with no recorded
29
+ * hash (every endpoint provisioned before this field existed) is "unknown" —
30
+ * never "current" or "outdated", since there is nothing to compare against. */
31
+ export function shareTemplateStatus(cfg) {
32
+ if (!cfg.templateHash)
33
+ return 'unknown';
34
+ return cfg.templateHash === hashWorkerScript(renderWorkerScript()) ? 'current' : 'outdated';
35
+ }
36
+ /** Shown whenever the deployed Worker has no `?format=json` listing route — an
37
+ * endpoint provisioned before this feature. Points at the RUSH-2449 update path
38
+ * (`agents share update`) instead of letting the caller hit a 404 or an HTML body
39
+ * and get a confusing parse error. */
40
+ const OUTDATED_TEMPLATE_HINT = 'Your deployed share Worker has no machine-readable listing route — it predates `agents share list`. ' +
41
+ 'Run `agents share update` to deploy the current Worker template, then retry (`agents share status` shows whether an update is due).';
42
+ async function defaultListingFetch(url) {
43
+ const res = await fetch(url, { headers: { accept: 'application/json' } });
44
+ return { status: res.status, contentType: res.headers.get('content-type') ?? '', body: await res.text() };
45
+ }
46
+ /** Parse the Worker's listing JSON into a validated result, failing loud (with the
47
+ * outdated-template hint) on any body that isn't the expected shape — an old Worker
48
+ * serves the HTML gallery for a non-empty namespace, which must not be silently
49
+ * accepted as "you have published nothing". */
50
+ export function parseShareListing(user, body) {
51
+ let data;
52
+ try {
53
+ data = JSON.parse(body);
54
+ }
55
+ catch {
56
+ throw new Error(OUTDATED_TEMPLATE_HINT);
57
+ }
58
+ const objectsRaw = data?.objects;
59
+ if (!data || typeof data !== 'object' || !Array.isArray(objectsRaw)) {
60
+ throw new Error(OUTDATED_TEMPLATE_HINT);
61
+ }
62
+ const objects = objectsRaw.map((o) => {
63
+ const item = o;
64
+ return {
65
+ slug: String(item.slug ?? ''),
66
+ url: String(item.url ?? ''),
67
+ size: typeof item.size === 'number' ? item.size : 0,
68
+ contentType: item.contentType == null ? null : String(item.contentType),
69
+ publishedAt: String(item.publishedAt ?? ''),
70
+ expiresAt: item.expiresAt == null ? null : String(item.expiresAt),
71
+ };
72
+ });
73
+ return { user, count: objects.length, objects };
74
+ }
75
+ /** Fetch and parse the machine-readable listing of the caller's namespace from the
76
+ * Worker's `?format=json` route. Fails loud when share was never configured, when
77
+ * the deployed template is known-outdated (RUSH-2449 templateHash), or when the
78
+ * live response proves the route is absent (404 or a non-JSON 200 = the old HTML
79
+ * gallery) — never a silent empty/wrong result. */
80
+ export async function runShareList(opts = {}) {
81
+ const cfg = opts.config ?? readShareConfig();
82
+ if (!cfg) {
83
+ throw new Error("Not set up yet. Run 'agents share setup' (provision your own endpoint) or 'agents share join' (use an existing one).");
84
+ }
85
+ // A known-stale template can't have the listing route — say so before any network
86
+ // call. 'unknown' (provisioned before templateHash tracking) is attempted, then
87
+ // caught by the response checks below if the route turns out to be absent.
88
+ const templateStatus = shareTemplateStatus(cfg);
89
+ if (templateStatus === 'outdated') {
90
+ throw new Error(OUTDATED_TEMPLATE_HINT);
91
+ }
92
+ const user = await resolveShareUsername({ githubUser: opts.githubUser });
93
+ const listUrl = `${cfg.baseUrl.replace(/\/+$/, '')}/${encodeURIComponent(user)}?format=json`;
94
+ const fetchListing = opts.fetchListing ?? defaultListingFetch;
95
+ const res = await fetchListing(listUrl);
96
+ if (res.status === 404) {
97
+ // A single-segment path 404s either because the namespace is genuinely empty
98
+ // (current template — the listing route gates on the namespace holding objects,
99
+ // so a namespace with nothing falls through to an object GET) OR because the
100
+ // endpoint predates the listing route entirely. The recorded templateHash
101
+ // disambiguates: a 'current' template HAS the route, so its 404 means an empty
102
+ // namespace ("nothing published"); otherwise the route may be absent, so point
103
+ // at `agents share update`.
104
+ if (templateStatus === 'current') {
105
+ return { user, count: 0, objects: [] };
106
+ }
107
+ throw new Error(OUTDATED_TEMPLATE_HINT);
108
+ }
109
+ if (res.status !== 200) {
110
+ throw new Error(`Listing failed (${res.status}) for ${listUrl}. Check the endpoint is reachable, or that 'agents share setup' completed.`);
111
+ }
112
+ if (!/application\/json/i.test(res.contentType)) {
113
+ // A 200 that isn't JSON means the old Worker ignored ?format=json and served
114
+ // the HTML gallery — the deployed template is outdated.
115
+ throw new Error(OUTDATED_TEMPLATE_HINT);
116
+ }
117
+ return parseShareListing(user, res.body);
118
+ }
119
+ /** Human-readable bytes, e.g. `1.2 KB`, `640 B`. */
120
+ function formatBytes(n) {
121
+ if (n < 1024)
122
+ return `${n} B`;
123
+ const units = ['KB', 'MB', 'GB'];
124
+ let value = n / 1024;
125
+ let unit = 0;
126
+ while (value >= 1024 && unit < units.length - 1) {
127
+ value /= 1024;
128
+ unit++;
129
+ }
130
+ return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[unit]}`;
131
+ }
132
+ export function formatShareList(result, json = false) {
133
+ if (json)
134
+ return JSON.stringify(result, null, 2);
135
+ if (result.count === 0) {
136
+ return chalk.dim(`No active pages published under @${result.user}.`);
137
+ }
138
+ const header = chalk.bold(`@${result.user}`) +
139
+ chalk.dim(` ${result.count} published ${result.count === 1 ? 'page' : 'pages'}`);
140
+ const rows = result.objects.map((o) => {
141
+ const when = o.publishedAt ? o.publishedAt.slice(0, 10) : 'unknown';
142
+ const meta = `${when} · ${formatBytes(o.size)}${o.expiresAt ? ` · expires ${o.expiresAt.slice(0, 10)}` : ''}`;
143
+ return `${chalk.cyan(o.slug)} ${chalk.dim(meta)}\n ${chalk.green(o.url)}`;
144
+ });
145
+ return [header, ...rows].join('\n');
146
+ }
147
+ export function formatShareDeleteResult(result, json = false) {
148
+ if (json)
149
+ return JSON.stringify(result, null, 2);
150
+ if (result.skipped)
151
+ return chalk.dim(`skipped — ${result.url} was already gone`);
152
+ const lines = [chalk.green(`deleted ${result.url}`)];
153
+ if (result.cover) {
154
+ lines.push(result.cover.existedBefore
155
+ ? chalk.dim(` cover deleted ${result.cover.url}`)
156
+ : chalk.dim(` cover (none) ${result.cover.url}`));
157
+ }
158
+ return lines.join('\n');
159
+ }
160
+ /** Shared handler for `agents share delete <targets...>` and the top-level
161
+ * `agents unshare <targets...>` alias. Deletes each target independently and
162
+ * continues past a failed one (rm-style), reporting all results and exiting
163
+ * non-zero if any target failed to verify as gone.
164
+ *
165
+ * `deleteFn` is a DI seam for tests (defaults to the real `deleteShare`) — it is
166
+ * never exposed as a CLI flag, only used to inject a fake config/checker/deleter
167
+ * without touching the keychain or a live endpoint. */
168
+ export async function runShareDelete(targets, opts, deleteFn = deleteShare) {
169
+ const results = [];
170
+ for (const target of targets) {
171
+ try {
172
+ const result = await deleteFn(target, {
173
+ keepCover: opts.keepCover === true,
174
+ ifExists: opts.ifExists === true,
175
+ githubUser: opts.githubUser,
176
+ });
177
+ results.push({ target, result });
178
+ if (!opts.json)
179
+ console.log(formatShareDeleteResult(result));
180
+ }
181
+ catch (e) {
182
+ results.push({ target, error: e.message });
183
+ if (!opts.json)
184
+ console.error(chalk.red(`${target}: ${e.message}`));
185
+ }
186
+ }
187
+ if (opts.json) {
188
+ console.log(JSON.stringify(results, null, 2));
189
+ }
190
+ if (results.some((r) => r.error)) {
191
+ process.exitCode = 1;
192
+ }
193
+ }
194
+ function registerShareDeleteOptions(cmd) {
195
+ return cmd
196
+ .option('--keep-cover', 'leave the sibling <slug>.png OG cover in place (default: delete it too)')
197
+ .option('--if-exists', 'treat an already-missing target as a no-op success instead of an error')
198
+ .option('--github-user <user>', 'GitHub username for resolving a bare-slug target (default: resolved from gh/git config)')
199
+ .option('--json', 'emit machine-readable results');
200
+ }
201
+ const SHARE_DELETE_EXAMPLES = `
202
+ # Delete by full URL — also takes down the sibling OG cover
203
+ agents share delete https://share.agents-cli.sh/octocat/my-plan-a1b2
204
+
205
+ # Delete by <user>/<slug>, or a bare slug in your own namespace
206
+ agents share delete octocat/my-plan-a1b2
207
+ agents unshare my-plan-a1b2
208
+
209
+ # Several at once
210
+ agents unshare my-plan-a1b2 old-report-9f3c
211
+
212
+ # Keep the cover image up (rare — you usually want both gone)
213
+ agents unshare my-plan-a1b2 --keep-cover
214
+
215
+ # Don't error if it's already gone
216
+ agents unshare my-plan-a1b2 --if-exists
217
+ `;
218
+ const SHARE_DELETE_NOTES = `
219
+ A follow-up GET is required to resolve 404 before this reports success — the
220
+ Worker's DELETE is idempotent and returns {"ok":true} even for a key that was
221
+ never there, so that response alone is never proof of a takedown.
222
+
223
+ agents share delete === agents unshare (same command, different name).
224
+ `;
21
225
  export function registerShareCommands(program) {
22
226
  const shareCmd = program
23
227
  .command('share')
@@ -25,7 +229,10 @@ export function registerShareCommands(program) {
25
229
  .argument('[file]', 'file to publish (HTML or any static asset)')
26
230
  .option('--slug <slug>', 'custom URL slug under your namespace (default: <project>-<feature>-<hash>)')
27
231
  .option('--github-user <user>', 'GitHub username for the share namespace (default: resolved from gh/git config)')
28
- .option('--expire <spec>', 'auto-expire, e.g. 30d, 12h, or 2026-08-01')
232
+ .option('--expire <spec>', "auto-expire (default 30d). e.g. 12h, 30d, 2026-08-01, or 'never'")
233
+ .option('--unlisted', 'hide from the public gallery and `agents share list` (direct URL still works)')
234
+ .option('--private', 'alias of --unlisted')
235
+ .option('--force', 'publish even when the file contains emails or credential-shaped strings')
29
236
  .option('--no-cover', 'skip the OG preview image (HTML pages get one by default)')
30
237
  .option('--no-analytics', 'skip injecting the Cloudflare Web Analytics beacon')
31
238
  .option('--json', 'emit machine-readable publish result for plan-render hooks and scripts')
@@ -40,20 +247,66 @@ export function registerShareCommands(program) {
40
247
  return;
41
248
  }
42
249
  try {
43
- const { url, expiresAt, coverUrl } = await publishFile(file, {
250
+ const result = await publishFile(file, {
44
251
  slug: opts.slug,
45
252
  githubUser: opts.githubUser,
46
253
  expire: opts.expire,
254
+ unlisted: opts.unlisted === true || opts.private === true,
255
+ force: opts.force,
47
256
  cover: opts.cover,
48
257
  analytics: opts.analytics,
49
258
  });
50
- console.log(formatSharePublishResult({ url, expiresAt, coverUrl }, Boolean(opts.json)));
259
+ console.log(formatSharePublishResult(result, Boolean(opts.json)));
51
260
  }
52
261
  catch (e) {
53
262
  console.error(chalk.red(e.message));
54
263
  process.exitCode = 1;
55
264
  }
56
265
  });
266
+ setHelpSections(shareCmd, {
267
+ examples: `
268
+ # Publish an HTML file — auto OG cover, default 30d expiry, shareable link
269
+ agents share ./out/plan.html
270
+
271
+ # Hide from the public gallery (direct URL still works) and expire sooner
272
+ agents share ./out/report.html --unlisted --expire 12h
273
+
274
+ # Permanent public page (opt out of the default 30d expiry)
275
+ agents share ./out/landing.html --slug landing --expire never
276
+
277
+ # Custom slug, expiring in 7 days
278
+ agents share ./out/report.html --slug q3-report --expire 7d
279
+ ${SHARE_DELETE_EXAMPLES}
280
+ # One-time setup (or join an existing endpoint)
281
+ agents share setup
282
+ agents share join https://share.agents-cli.sh
283
+
284
+ # Push a worker-template.ts change out to an already-provisioned endpoint
285
+ agents share update
286
+ `,
287
+ notes: `
288
+ Default expiry is 30d so an accidental publish decays. Pass --expire never for
289
+ a permanent link. --unlisted / --private hides the page from the public gallery
290
+ and agents share list; the direct URL is still world-readable (unlisted, not
291
+ secret). A pre-publish scan refuses emails and credential-shaped strings
292
+ unless --force is passed.
293
+ ${SHARE_DELETE_NOTES}
294
+ `,
295
+ });
296
+ const shareDeleteCmd = registerShareDeleteOptions(shareCmd
297
+ .command('delete <targets...>')
298
+ .description('Take down a published page (and by default its OG cover). Verifies the page 404s before reporting success. Top-level alias: agents unshare.'));
299
+ setHelpSections(shareDeleteCmd, { examples: SHARE_DELETE_EXAMPLES, notes: SHARE_DELETE_NOTES });
300
+ shareDeleteCmd.action(async (targets, opts) => {
301
+ await runShareDelete(targets, opts);
302
+ });
303
+ const unshareCmd = registerShareDeleteOptions(program
304
+ .command('unshare <targets...>')
305
+ .description('Alias of `agents share delete` — take down a published page (and by default its OG cover).'));
306
+ setHelpSections(unshareCmd, { examples: SHARE_DELETE_EXAMPLES, notes: SHARE_DELETE_NOTES });
307
+ unshareCmd.action(async (targets, opts) => {
308
+ await runShareDelete(targets, opts);
309
+ });
57
310
  shareCmd
58
311
  .command('setup')
59
312
  .description('One-time: provision an R2 bucket + Worker on your Cloudflare and save the config.')
@@ -87,6 +340,47 @@ export function registerShareCommands(program) {
87
340
  process.exitCode = 1;
88
341
  }
89
342
  });
343
+ const shareUpdateCmd = shareCmd
344
+ .command('update')
345
+ .description('Re-deploy the Worker script to the current template on an already-provisioned endpoint (idempotent).')
346
+ .option('--bundle <name>', 'secrets bundle holding the Cloudflare API token', DEFAULT_CF_BUNDLE)
347
+ .option('--account <id>', 'Cloudflare account id override (default: the configured endpoint\'s account)')
348
+ .option('--token <t>', 'Cloudflare API token (else read from --bundle)')
349
+ .option('--force', 're-deploy even if the deployed template already matches')
350
+ .option('--json', 'emit a machine-readable result')
351
+ .action(async (opts) => {
352
+ try {
353
+ const result = await runShareUpdate(opts);
354
+ if (opts.json) {
355
+ console.log(JSON.stringify(result, null, 2));
356
+ return;
357
+ }
358
+ if (result.updated) {
359
+ console.log(chalk.green(`Worker '${result.workerName}' updated → template ${result.templateHash.slice(0, 12)}…`));
360
+ }
361
+ else {
362
+ console.log(chalk.dim(`Worker '${result.workerName}' already matches the current template — no-op.`));
363
+ }
364
+ }
365
+ catch (e) {
366
+ console.error(chalk.red(e.message));
367
+ process.exitCode = 1;
368
+ }
369
+ });
370
+ setHelpSections(shareUpdateCmd, {
371
+ examples: `
372
+ # Push a worker-template.ts change out to your already-provisioned endpoint
373
+ agents share update
374
+
375
+ # Force a re-deploy even though the template hash already matches
376
+ agents share update --force
377
+ `,
378
+ notes: `
379
+ Reuses the existing account/worker/bucket from 'agents share status' and the
380
+ existing write token — it never re-provisions a bucket, touches routes, or
381
+ regenerates the token. See 'agents share status' for whether an update is due.
382
+ `,
383
+ });
90
384
  shareCmd
91
385
  .command('status')
92
386
  .description('Show the configured share endpoint and namespace.')
@@ -101,6 +395,48 @@ export function registerShareCommands(program) {
101
395
  const user = await resolveGitHubUsername();
102
396
  console.log(`${chalk.bold('namespace')} ${user ? chalk.cyan(`${cfg.baseUrl}/${user}`) : chalk.yellow('unknown — set gh auth or github.user')}`);
103
397
  console.log(`${chalk.bold('analytics')} ${analyticsEnabled(cfg) ? chalk.green('enabled') : chalk.dim('not configured')}`);
398
+ const templateStatus = shareTemplateStatus(cfg);
399
+ const templateLabel = templateStatus === 'current'
400
+ ? chalk.green('current')
401
+ : templateStatus === 'outdated'
402
+ ? chalk.yellow('outdated — run `agents share update`')
403
+ : chalk.dim("unknown — provisioned before version tracking; run `agents share update` to adopt it");
404
+ console.log(`${chalk.bold('template')} ${templateLabel}`);
405
+ });
406
+ const shareListCmd = shareCmd
407
+ .command('list')
408
+ .description("List the pages you've published to your share namespace (human table; --json for scripts).")
409
+ .option('--github-user <user>', 'GitHub username whose namespace to list (default: resolved from gh/git config)')
410
+ .option('--json', 'emit the machine-readable listing (slug, url, size, contentType, publishedAt, expiresAt)')
411
+ .action(async (opts) => {
412
+ try {
413
+ const result = await runShareList({ githubUser: opts.githubUser });
414
+ console.log(formatShareList(result, Boolean(opts.json)));
415
+ }
416
+ catch (e) {
417
+ console.error(chalk.red(e.message));
418
+ process.exitCode = 1;
419
+ }
420
+ });
421
+ setHelpSections(shareListCmd, {
422
+ examples: `
423
+ # Everything you've published, newest first
424
+ agents share list
425
+
426
+ # Machine-readable — e.g. pull every still-public URL with jq
427
+ agents share list --json | jq -r '.objects[].url'
428
+
429
+ # List another namespace
430
+ agents share list --github-user octocat
431
+ `,
432
+ notes: `
433
+ Lists the ACTIVE pages in your namespace — expired links and the sibling .png OG
434
+ covers are omitted (it mirrors the public gallery). It reads the endpoint's JSON
435
+ listing route, which ships with the current Worker template. If your deployed
436
+ Worker predates this feature the command says so and points you at 'agents share
437
+ update' (RUSH-2449) rather than returning a wrong or empty result — see 'agents
438
+ share status' for whether an update is due.
439
+ `,
104
440
  });
105
441
  shareCmd
106
442
  .command('analytics')
@@ -145,6 +481,7 @@ export async function runShareProvision(opts) {
145
481
  const bucketName = opts.bucket;
146
482
  const token = generateWriteToken();
147
483
  const requestedDomain = cleanHostname(opts.domain) ?? DEFAULT_SHARE_DOMAIN;
484
+ const script = renderWorkerScript();
148
485
  const spin = ora('Provisioning on Cloudflare…').start();
149
486
  try {
150
487
  const provisionOpts = opts.request ? { request: opts.request } : {};
@@ -152,7 +489,7 @@ export async function runShareProvision(opts) {
152
489
  spin.text = `R2 bucket '${bucketName}' ready`;
153
490
  await configureBucketLifecycle(apiToken, accountId, bucketName, provisionOpts);
154
491
  spin.text = `R2 bucket '${bucketName}' lifecycle ready`;
155
- await deployWorker(apiToken, accountId, workerName, renderWorkerScript(), bucketName, provisionOpts);
492
+ await deployWorker(apiToken, accountId, workerName, script, bucketName, provisionOpts);
156
493
  spin.text = `Worker '${workerName}' deployed`;
157
494
  await setWorkerSecret(apiToken, accountId, workerName, token, provisionOpts);
158
495
  spin.text = `Worker '${workerName}' write token set`;
@@ -172,7 +509,15 @@ export async function runShareProvision(opts) {
172
509
  }
173
510
  }
174
511
  spin.succeed('Provisioned');
175
- const cfg = { baseUrl, accountId, workerName, bucketName, domain, analyticsToken: opts.analyticsToken };
512
+ const cfg = {
513
+ baseUrl,
514
+ accountId,
515
+ workerName,
516
+ bucketName,
517
+ domain,
518
+ analyticsToken: opts.analyticsToken,
519
+ templateHash: hashWorkerScript(script),
520
+ };
176
521
  writeShareConfig(cfg);
177
522
  storeWriteToken(token);
178
523
  console.log(chalk.green(`\nShare endpoint ready → ${chalk.bold(baseUrl)}`));
@@ -184,6 +529,32 @@ export async function runShareProvision(opts) {
184
529
  throw e;
185
530
  }
186
531
  }
532
+ /** Re-deploy the Worker script on an ALREADY-provisioned endpoint to match the
533
+ * current `worker-template.ts`. Reuses the existing account/worker/bucket and
534
+ * write token from `readShareConfig()`/the `share` bundle — never creates a
535
+ * bucket, touches routes/domains, or regenerates the token (see
536
+ * `updateWorker` in `lib/share/provision.ts` for how the token survives the
537
+ * re-upload). Idempotent: no-ops when the deployed hash already matches
538
+ * unless `force`. */
539
+ export async function runShareUpdate(opts = {}) {
540
+ const cfg = readShareConfig();
541
+ if (!cfg) {
542
+ throw new Error("Not configured. Run 'agents share setup' (to provision) or 'agents share join' first.");
543
+ }
544
+ const { apiToken, accountId: acctFromBundle } = readCloudflareCreds(opts.bundle ?? DEFAULT_CF_BUNDLE, {
545
+ apiToken: opts.token,
546
+ accountId: opts.account,
547
+ });
548
+ const accountId = opts.account || acctFromBundle || cfg.accountId;
549
+ const writeToken = readWriteToken();
550
+ const script = renderWorkerScript();
551
+ const provisionOpts = { ...(opts.request ? { request: opts.request } : {}), force: opts.force };
552
+ const result = await updateWorker(apiToken, accountId, cfg.workerName, cfg.bucketName, script, writeToken, cfg.templateHash, provisionOpts);
553
+ if (!result.skipped) {
554
+ writeShareConfig({ ...cfg, templateHash: result.templateHash });
555
+ }
556
+ return { updated: !result.skipped, templateHash: result.templateHash, baseUrl: cfg.baseUrl, workerName: cfg.workerName };
557
+ }
187
558
  function cleanHostname(domain) {
188
559
  const raw = domain?.trim().replace(/\/+$/, '');
189
560
  if (!raw)
@@ -406,17 +406,6 @@ Examples:
406
406
  console.log(chalk.gray('Central source unchanged. Skills will re-sync on next agent launch.'));
407
407
  }
408
408
  });
409
- // `skills sync` is gone — sync runs automatically when the agent launches.
410
- skillsCmd
411
- .command('sync', { hidden: true })
412
- .allowUnknownOption()
413
- .allowExcessArguments()
414
- .action(() => {
415
- console.error(chalk.red('"agents skills sync" is gone.'));
416
- console.error(chalk.gray('Sync runs automatically when you launch the agent.'));
417
- console.error(chalk.gray('To remove orphans, use: agents prune cleanup skills'));
418
- process.exit(1);
419
- });
420
409
  // `skills prune` moved to the top-level `agents prune cleanup` command.
421
410
  skillsCmd
422
411
  .command('prune', { hidden: true })
@@ -82,7 +82,7 @@ export function registerSnapshotCommand(program) {
82
82
  # Fleet-wide active sessions (matches sessions --active scope)
83
83
  agents snapshot --json --all-hosts
84
84
 
85
- # Inventory for one harness only (Factory-style usage poll)
85
+ # Inventory for one harness only (an AGI EXT-style usage poll)
86
86
  agents snapshot --json --agent claude
87
87
 
88
88
  # Run the whole snapshot on another device
@@ -11,6 +11,8 @@
11
11
  */
12
12
  import type { Command } from 'commander';
13
13
  import { type FanOutDeviceTarget } from '../lib/devices/fleet.js';
14
+ import type { AgentId } from '../lib/types.js';
15
+ import { type HostHarnessResult } from '../lib/devices/harness-inventory.js';
14
16
  import { type CrabboxBox } from '../lib/crabbox/cli.js';
15
17
  /**
16
18
  * Live "Leased boxes" section for `agents devices` (F4, RUSH-1923), computed
@@ -43,5 +45,21 @@ export declare function showLeasedBoxesSection(opts: {
43
45
  * instead of reimplementing the logic.
44
46
  */
45
47
  export declare function raceFleetPingDeadline<T, Target extends FanOutDeviceTarget>(fanOut: Promise<import('../lib/devices/fleet.js').FanOutDeviceResult<T>[]>, remoteTargets: Target[], overallTimeoutMs: number): Promise<import('../lib/devices/fleet.js').FanOutDeviceResult<T>[]>;
48
+ export interface HarnessInventoryOpts {
49
+ agents?: AgentId[];
50
+ devices?: string[];
51
+ refresh?: boolean;
52
+ json?: boolean;
53
+ local?: boolean;
54
+ }
55
+ /**
56
+ * Gather harness rows across the fleet: THIS host in process, every reachable
57
+ * peer over SSH. Shared by both `harnesses` and `accounts` (they differ only in
58
+ * how the rows are rendered). Honors an optional `--device` allowlist on both
59
+ * the local and remote rows. Bounded by the same per-device + overall deadlines
60
+ * as `fleet ping`, so one unreachable box can never stall the glance.
61
+ */
62
+ export declare function collectFleetHarnesses(opts: HarnessInventoryOpts): Promise<HostHarnessResult[]>;
63
+ export declare function runDevicesAccounts(opts: HarnessInventoryOpts): Promise<void>;
46
64
  /** Register both `agents ssh` and `agents devices`. */
47
65
  export declare function registerSshCommands(program: Command): void;