@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,10 +1,14 @@
1
- // `agents share` — publish an HTML file to your own Cloudflare R2 behind a tiny
2
- // Worker, and get a shareable link (~$0). See apps/cli/docs/share.md.
1
+ // `agents artifacts share` — publish an HTML file to your own Cloudflare R2
2
+ // behind a tiny Worker, and get a shareable link (~$0). See apps/cli/docs/share.md.
3
+ //
4
+ // Registered under the `artifacts` group by commands/artifacts.ts; the
5
+ // provisioning door lives beside it at `agents artifacts setup`
6
+ // (commands/artifacts-setup.ts), which calls `runShareProvision` below.
3
7
  import { existsSync } from 'node:fs';
4
8
  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';
9
+ 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';
10
+ import { addCustomDomain, configureBucketLifecycle, createBucket, deployWorker, enableWorkersDev, findZoneId, hashWorkerScript, updateWorker, setWorkerSecret, } from '../lib/share/provision.js';
11
+ import { publishFile, resolveShareUsername } from '../lib/share/publish.js';
8
12
  import { deleteShare } from '../lib/share/delete.js';
9
13
  import { renderWorkerScript } from '../lib/share/worker-template.js';
10
14
  import { analyticsEnabled } from '../lib/share/analytics.js';
@@ -18,8 +22,132 @@ export function formatSharePublishResult(result, json = false) {
18
22
  lines.push(chalk.dim(` cover ${result.coverUrl}`));
19
23
  if (result.expiresAt)
20
24
  lines.push(chalk.dim(` expires ${new Date(result.expiresAt).toLocaleString()}`));
25
+ else
26
+ lines.push(chalk.dim(' expires never'));
27
+ if (result.unlisted)
28
+ lines.push(chalk.dim(' unlisted (hidden from gallery / share list)'));
21
29
  return lines.join('\n');
22
30
  }
31
+ /** Compare the configured endpoint's last-deployed template hash against the
32
+ * hash of the CURRENT `worker-template.ts` render. A config with no recorded
33
+ * hash (every endpoint provisioned before this field existed) is "unknown" —
34
+ * never "current" or "outdated", since there is nothing to compare against. */
35
+ export function shareTemplateStatus(cfg) {
36
+ if (!cfg.templateHash)
37
+ return 'unknown';
38
+ return cfg.templateHash === hashWorkerScript(renderWorkerScript()) ? 'current' : 'outdated';
39
+ }
40
+ /** Shown whenever the deployed Worker has no `?format=json` listing route — an
41
+ * endpoint provisioned before this feature. Points at the RUSH-2449 update path
42
+ * (`agents artifacts share update`) instead of letting the caller hit a 404 or an
43
+ * HTML body and get a confusing parse error. */
44
+ const OUTDATED_TEMPLATE_HINT = 'Your deployed share Worker has no machine-readable listing route — it predates `agents artifacts share list`. ' +
45
+ 'Run `agents artifacts share update` to deploy the current Worker template, then retry (`agents artifacts share status` shows whether an update is due).';
46
+ async function defaultListingFetch(url) {
47
+ const res = await fetch(url, { headers: { accept: 'application/json' } });
48
+ return { status: res.status, contentType: res.headers.get('content-type') ?? '', body: await res.text() };
49
+ }
50
+ /** Parse the Worker's listing JSON into a validated result, failing loud (with the
51
+ * outdated-template hint) on any body that isn't the expected shape — an old Worker
52
+ * serves the HTML gallery for a non-empty namespace, which must not be silently
53
+ * accepted as "you have published nothing". */
54
+ export function parseShareListing(user, body) {
55
+ let data;
56
+ try {
57
+ data = JSON.parse(body);
58
+ }
59
+ catch {
60
+ throw new Error(OUTDATED_TEMPLATE_HINT);
61
+ }
62
+ const objectsRaw = data?.objects;
63
+ if (!data || typeof data !== 'object' || !Array.isArray(objectsRaw)) {
64
+ throw new Error(OUTDATED_TEMPLATE_HINT);
65
+ }
66
+ const objects = objectsRaw.map((o) => {
67
+ const item = o;
68
+ return {
69
+ slug: String(item.slug ?? ''),
70
+ url: String(item.url ?? ''),
71
+ size: typeof item.size === 'number' ? item.size : 0,
72
+ contentType: item.contentType == null ? null : String(item.contentType),
73
+ publishedAt: String(item.publishedAt ?? ''),
74
+ expiresAt: item.expiresAt == null ? null : String(item.expiresAt),
75
+ };
76
+ });
77
+ return { user, count: objects.length, objects };
78
+ }
79
+ /** Fetch and parse the machine-readable listing of the caller's namespace from the
80
+ * Worker's `?format=json` route. Fails loud when share was never configured, when
81
+ * the deployed template is known-outdated (RUSH-2449 templateHash), or when the
82
+ * live response proves the route is absent (404 or a non-JSON 200 = the old HTML
83
+ * gallery) — never a silent empty/wrong result. */
84
+ export async function runShareList(opts = {}) {
85
+ const cfg = opts.config ?? readShareConfig();
86
+ if (!cfg) {
87
+ throw new Error("Not set up yet. Run 'agents artifacts setup' (provision your own endpoint) or 'agents artifacts share join' (use an existing one).");
88
+ }
89
+ // A known-stale template can't have the listing route — say so before any network
90
+ // call. 'unknown' (provisioned before templateHash tracking) is attempted, then
91
+ // caught by the response checks below if the route turns out to be absent.
92
+ const templateStatus = shareTemplateStatus(cfg);
93
+ if (templateStatus === 'outdated') {
94
+ throw new Error(OUTDATED_TEMPLATE_HINT);
95
+ }
96
+ const user = await resolveShareUsername({ githubUser: opts.githubUser });
97
+ const listUrl = `${cfg.baseUrl.replace(/\/+$/, '')}/${encodeURIComponent(user)}?format=json`;
98
+ const fetchListing = opts.fetchListing ?? defaultListingFetch;
99
+ const res = await fetchListing(listUrl);
100
+ if (res.status === 404) {
101
+ // A single-segment path 404s either because the namespace is genuinely empty
102
+ // (current template — the listing route gates on the namespace holding objects,
103
+ // so a namespace with nothing falls through to an object GET) OR because the
104
+ // endpoint predates the listing route entirely. The recorded templateHash
105
+ // disambiguates: a 'current' template HAS the route, so its 404 means an empty
106
+ // namespace ("nothing published"); otherwise the route may be absent, so point
107
+ // at `agents artifacts share update`.
108
+ if (templateStatus === 'current') {
109
+ return { user, count: 0, objects: [] };
110
+ }
111
+ throw new Error(OUTDATED_TEMPLATE_HINT);
112
+ }
113
+ if (res.status !== 200) {
114
+ throw new Error(`Listing failed (${res.status}) for ${listUrl}. Check the endpoint is reachable, or that 'agents artifacts setup' completed.`);
115
+ }
116
+ if (!/application\/json/i.test(res.contentType)) {
117
+ // A 200 that isn't JSON means the old Worker ignored ?format=json and served
118
+ // the HTML gallery — the deployed template is outdated.
119
+ throw new Error(OUTDATED_TEMPLATE_HINT);
120
+ }
121
+ return parseShareListing(user, res.body);
122
+ }
123
+ /** Human-readable bytes, e.g. `1.2 KB`, `640 B`. */
124
+ function formatBytes(n) {
125
+ if (n < 1024)
126
+ return `${n} B`;
127
+ const units = ['KB', 'MB', 'GB'];
128
+ let value = n / 1024;
129
+ let unit = 0;
130
+ while (value >= 1024 && unit < units.length - 1) {
131
+ value /= 1024;
132
+ unit++;
133
+ }
134
+ return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[unit]}`;
135
+ }
136
+ export function formatShareList(result, json = false) {
137
+ if (json)
138
+ return JSON.stringify(result, null, 2);
139
+ if (result.count === 0) {
140
+ return chalk.dim(`No active pages published under @${result.user}.`);
141
+ }
142
+ const header = chalk.bold(`@${result.user}`) +
143
+ chalk.dim(` ${result.count} published ${result.count === 1 ? 'page' : 'pages'}`);
144
+ const rows = result.objects.map((o) => {
145
+ const when = o.publishedAt ? o.publishedAt.slice(0, 10) : 'unknown';
146
+ const meta = `${when} · ${formatBytes(o.size)}${o.expiresAt ? ` · expires ${o.expiresAt.slice(0, 10)}` : ''}`;
147
+ return `${chalk.cyan(o.slug)} ${chalk.dim(meta)}\n ${chalk.green(o.url)}`;
148
+ });
149
+ return [header, ...rows].join('\n');
150
+ }
23
151
  export function formatShareDeleteResult(result, json = false) {
24
152
  if (json)
25
153
  return JSON.stringify(result, null, 2);
@@ -33,8 +161,8 @@ export function formatShareDeleteResult(result, json = false) {
33
161
  }
34
162
  return lines.join('\n');
35
163
  }
36
- /** Shared handler for `agents share delete <targets...>` and the top-level
37
- * `agents unshare <targets...>` alias. Deletes each target independently and
164
+ /** Shared handler for `agents artifacts share delete <targets...>` and the
165
+ * top-level `agents unshare <targets...>` alias. Deletes each target independently and
38
166
  * continues past a failed one (rm-style), reporting all results and exiting
39
167
  * non-zero if any target failed to verify as gone.
40
168
  *
@@ -76,10 +204,10 @@ function registerShareDeleteOptions(cmd) {
76
204
  }
77
205
  const SHARE_DELETE_EXAMPLES = `
78
206
  # Delete by full URL — also takes down the sibling OG cover
79
- agents share delete https://share.agents-cli.sh/octocat/my-plan-a1b2
207
+ agents artifacts share delete https://share.agents-cli.sh/octocat/my-plan-a1b2
80
208
 
81
209
  # Delete by <user>/<slug>, or a bare slug in your own namespace
82
- agents share delete octocat/my-plan-a1b2
210
+ agents artifacts share delete octocat/my-plan-a1b2
83
211
  agents unshare my-plan-a1b2
84
212
 
85
213
  # Several at once
@@ -96,16 +224,25 @@ const SHARE_DELETE_NOTES = `
96
224
  Worker's DELETE is idempotent and returns {"ok":true} even for a key that was
97
225
  never there, so that response alone is never proof of a takedown.
98
226
 
99
- agents share delete === agents unshare (same command, different name).
227
+ agents artifacts share delete === agents unshare (same command, different name).
100
228
  `;
101
- export function registerShareCommands(program) {
102
- const shareCmd = program
229
+ /**
230
+ * Register the `share` subtree under its parent group — `agents artifacts share`
231
+ * (see commands/artifacts.ts). The top-level `agents unshare` alias is a sibling
232
+ * registration on the ROOT program, so it is {@link registerUnshareCommand}, not
233
+ * part of this subtree.
234
+ */
235
+ export function registerShareCommands(artifactsCmd) {
236
+ const shareCmd = artifactsCmd
103
237
  .command('share')
104
238
  .description('Publish an HTML file to your own Cloudflare R2 and get a shareable link (~$0).')
105
239
  .argument('[file]', 'file to publish (HTML or any static asset)')
106
240
  .option('--slug <slug>', 'custom URL slug under your namespace (default: <project>-<feature>-<hash>)')
107
241
  .option('--github-user <user>', 'GitHub username for the share namespace (default: resolved from gh/git config)')
108
- .option('--expire <spec>', 'auto-expire, e.g. 30d, 12h, or 2026-08-01')
242
+ .option('--expire <spec>', "auto-expire (default 30d). e.g. 12h, 30d, 2026-08-01, or 'never'")
243
+ .option('--unlisted', 'hide from the public gallery and `agents artifacts share list` (direct URL still works)')
244
+ .option('--private', 'alias of --unlisted')
245
+ .option('--force', 'publish even when the file contains emails or credential-shaped strings')
109
246
  .option('--no-cover', 'skip the OG preview image (HTML pages get one by default)')
110
247
  .option('--no-analytics', 'skip injecting the Cloudflare Web Analytics beacon')
111
248
  .option('--json', 'emit machine-readable publish result for plan-render hooks and scripts')
@@ -120,14 +257,16 @@ export function registerShareCommands(program) {
120
257
  return;
121
258
  }
122
259
  try {
123
- const { url, expiresAt, coverUrl } = await publishFile(file, {
260
+ const result = await publishFile(file, {
124
261
  slug: opts.slug,
125
262
  githubUser: opts.githubUser,
126
263
  expire: opts.expire,
264
+ unlisted: opts.unlisted === true || opts.private === true,
265
+ force: opts.force,
127
266
  cover: opts.cover,
128
267
  analytics: opts.analytics,
129
268
  });
130
- console.log(formatSharePublishResult({ url, expiresAt, coverUrl }, Boolean(opts.json)));
269
+ console.log(formatSharePublishResult(result, Boolean(opts.json)));
131
270
  }
132
271
  catch (e) {
133
272
  console.error(chalk.red(e.message));
@@ -136,17 +275,33 @@ export function registerShareCommands(program) {
136
275
  });
137
276
  setHelpSections(shareCmd, {
138
277
  examples: `
139
- # Publish an HTML file — gets an auto OG cover + a shareable link
140
- agents share ./out/plan.html
278
+ # Publish an HTML file — auto OG cover, default 30d expiry, shareable link
279
+ agents artifacts share ./out/plan.html
280
+
281
+ # Hide from the public gallery (direct URL still works) and expire sooner
282
+ agents artifacts share ./out/report.html --unlisted --expire 12h
283
+
284
+ # Permanent public page (opt out of the default 30d expiry)
285
+ agents artifacts share ./out/landing.html --slug landing --expire never
141
286
 
142
- # Custom slug, expiring in 30 days
143
- agents share ./out/report.html --slug q3-report --expire 30d
287
+ # Custom slug, expiring in 7 days
288
+ agents artifacts share ./out/report.html --slug q3-report --expire 7d
144
289
  ${SHARE_DELETE_EXAMPLES}
145
290
  # One-time setup (or join an existing endpoint)
146
- agents share setup
147
- agents share join https://share.agents-cli.sh
291
+ agents artifacts setup
292
+ agents artifacts share join https://share.agents-cli.sh
293
+
294
+ # Push a worker-template.ts change out to an already-provisioned endpoint
295
+ agents artifacts share update
296
+ `,
297
+ notes: `
298
+ Default expiry is 30d so an accidental publish decays. Pass --expire never for
299
+ a permanent link. --unlisted / --private hides the page from the public gallery
300
+ and agents artifacts share list; the direct URL is still world-readable
301
+ (unlisted, not secret). A pre-publish scan refuses emails and credential-shaped
302
+ strings unless --force is passed.
303
+ ${SHARE_DELETE_NOTES}
148
304
  `,
149
- notes: SHARE_DELETE_NOTES,
150
305
  });
151
306
  const shareDeleteCmd = registerShareDeleteOptions(shareCmd
152
307
  .command('delete <targets...>')
@@ -155,53 +310,68 @@ ${SHARE_DELETE_EXAMPLES}
155
310
  shareDeleteCmd.action(async (targets, opts) => {
156
311
  await runShareDelete(targets, opts);
157
312
  });
158
- const unshareCmd = registerShareDeleteOptions(program
159
- .command('unshare <targets...>')
160
- .description('Alias of `agents share delete` — take down a published page (and by default its OG cover).'));
161
- setHelpSections(unshareCmd, { examples: SHARE_DELETE_EXAMPLES, notes: SHARE_DELETE_NOTES });
162
- unshareCmd.action(async (targets, opts) => {
163
- await runShareDelete(targets, opts);
164
- });
165
313
  shareCmd
166
- .command('setup')
167
- .description('One-time: provision an R2 bucket + Worker on your Cloudflare and save the config.')
168
- .option('--bundle <name>', 'secrets bundle holding the Cloudflare API token', DEFAULT_CF_BUNDLE)
169
- .option('--worker <name>', 'Worker name', DEFAULT_WORKER_NAME)
170
- .option('--bucket <name>', 'R2 bucket name', DEFAULT_BUCKET_NAME)
171
- .option('--account <id>', 'Cloudflare account id (else read from the bundle / prompt)')
172
- .option('--token <t>', 'Cloudflare API token (else read from the --bundle)')
173
- .option('--domain <host>', `custom domain to map (default: ${DEFAULT_SHARE_DOMAIN}; workers.dev if zone is not visible)`)
174
- .option('--analytics-token <token>', 'Cloudflare Web Analytics token to inject into published HTML pages')
175
- .action(async (opts) => {
314
+ .command('join')
315
+ .description('Use an existing synced share endpoint and write token (no provisioning).')
316
+ .argument('[baseUrl]', 'base URL of the endpoint, e.g. https://share.agents-cli.sh')
317
+ .option('--token <token>', 'write token (else SHARE_WRITE_TOKEN env, existing bundle, or prompt)')
318
+ .action(async (baseUrl, opts) => {
176
319
  try {
177
- await runShareProvision(opts);
320
+ await runShareJoin(baseUrl, opts);
178
321
  }
179
322
  catch (e) {
180
323
  console.error(chalk.red(e.message));
181
324
  process.exitCode = 1;
182
325
  }
183
326
  });
184
- shareCmd
185
- .command('join')
186
- .description('Use an existing synced share endpoint and write token (no provisioning).')
187
- .argument('[baseUrl]', 'base URL of the endpoint, e.g. https://share.agents-cli.sh')
188
- .option('--token <token>', 'write token (else SHARE_WRITE_TOKEN env, existing bundle, or prompt)')
189
- .action(async (baseUrl, opts) => {
327
+ const shareUpdateCmd = shareCmd
328
+ .command('update')
329
+ .description('Re-deploy the Worker script to the current template on an already-provisioned endpoint (idempotent).')
330
+ .option('--bundle <name>', 'secrets bundle holding the Cloudflare API token', DEFAULT_CF_BUNDLE)
331
+ .option('--account <id>', 'Cloudflare account id override (default: the configured endpoint\'s account)')
332
+ .option('--token <t>', 'Cloudflare API token (else read from --bundle)')
333
+ .option('--force', 're-deploy even if the deployed template already matches')
334
+ .option('--json', 'emit a machine-readable result')
335
+ .action(async (opts) => {
190
336
  try {
191
- await runShareJoin(baseUrl, opts);
337
+ const result = await runShareUpdate(opts);
338
+ if (opts.json) {
339
+ console.log(JSON.stringify(result, null, 2));
340
+ return;
341
+ }
342
+ if (result.updated) {
343
+ console.log(chalk.green(`Worker '${result.workerName}' updated → template ${result.templateHash.slice(0, 12)}…`));
344
+ }
345
+ else {
346
+ console.log(chalk.dim(`Worker '${result.workerName}' already matches the current template — no-op.`));
347
+ }
192
348
  }
193
349
  catch (e) {
194
350
  console.error(chalk.red(e.message));
195
351
  process.exitCode = 1;
196
352
  }
197
353
  });
354
+ setHelpSections(shareUpdateCmd, {
355
+ examples: `
356
+ # Push a worker-template.ts change out to your already-provisioned endpoint
357
+ agents artifacts share update
358
+
359
+ # Force a re-deploy even though the template hash already matches
360
+ agents artifacts share update --force
361
+ `,
362
+ notes: `
363
+ Reuses the existing account/worker/bucket from 'agents artifacts share status' and the
364
+ existing write token — it never re-provisions a bucket, touches routes, or
365
+ regenerates the token. See 'agents artifacts share status' for whether an update is due.
366
+ `,
367
+ });
198
368
  shareCmd
199
369
  .command('status')
200
370
  .description('Show the configured share endpoint and namespace.')
201
371
  .action(async () => {
202
372
  const cfg = readShareConfig();
203
373
  if (!cfg) {
204
- console.log(chalk.dim("Not configured. Run 'agents share setup' or 'agents share join'."));
374
+ console.log(chalk.dim("Not configured. Run 'agents artifacts setup' or 'agents artifacts share join'."));
205
375
  return;
206
376
  }
207
377
  console.log(`${chalk.bold('endpoint')} ${chalk.green(cfg.baseUrl)}`);
@@ -209,6 +379,48 @@ ${SHARE_DELETE_EXAMPLES}
209
379
  const user = await resolveGitHubUsername();
210
380
  console.log(`${chalk.bold('namespace')} ${user ? chalk.cyan(`${cfg.baseUrl}/${user}`) : chalk.yellow('unknown — set gh auth or github.user')}`);
211
381
  console.log(`${chalk.bold('analytics')} ${analyticsEnabled(cfg) ? chalk.green('enabled') : chalk.dim('not configured')}`);
382
+ const templateStatus = shareTemplateStatus(cfg);
383
+ const templateLabel = templateStatus === 'current'
384
+ ? chalk.green('current')
385
+ : templateStatus === 'outdated'
386
+ ? chalk.yellow('outdated — run `agents artifacts share update`')
387
+ : chalk.dim("unknown — provisioned before version tracking; run `agents artifacts share update` to adopt it");
388
+ console.log(`${chalk.bold('template')} ${templateLabel}`);
389
+ });
390
+ const shareListCmd = shareCmd
391
+ .command('list')
392
+ .description("List the pages you've published to your share namespace (human table; --json for scripts).")
393
+ .option('--github-user <user>', 'GitHub username whose namespace to list (default: resolved from gh/git config)')
394
+ .option('--json', 'emit the machine-readable listing (slug, url, size, contentType, publishedAt, expiresAt)')
395
+ .action(async (opts) => {
396
+ try {
397
+ const result = await runShareList({ githubUser: opts.githubUser });
398
+ console.log(formatShareList(result, Boolean(opts.json)));
399
+ }
400
+ catch (e) {
401
+ console.error(chalk.red(e.message));
402
+ process.exitCode = 1;
403
+ }
404
+ });
405
+ setHelpSections(shareListCmd, {
406
+ examples: `
407
+ # Everything you've published, newest first
408
+ agents artifacts share list
409
+
410
+ # Machine-readable — e.g. pull every still-public URL with jq
411
+ agents artifacts share list --json | jq -r '.objects[].url'
412
+
413
+ # List another namespace
414
+ agents artifacts share list --github-user octocat
415
+ `,
416
+ notes: `
417
+ Lists the ACTIVE pages in your namespace — expired links and the sibling .png OG
418
+ covers are omitted (it mirrors the public gallery). It reads the endpoint's JSON
419
+ listing route, which ships with the current Worker template. If your deployed
420
+ Worker predates this feature the command says so and points you at 'agents
421
+ artifacts share update' (RUSH-2449) rather than returning a wrong or empty result
422
+ — see 'agents artifacts share status' for whether an update is due.
423
+ `,
212
424
  });
213
425
  shareCmd
214
426
  .command('analytics')
@@ -216,7 +428,7 @@ ${SHARE_DELETE_EXAMPLES}
216
428
  .action(async () => {
217
429
  const cfg = readShareConfig();
218
430
  if (!cfg) {
219
- console.log(chalk.dim("Not configured. Run 'agents share setup' or 'agents share join'."));
431
+ console.log(chalk.dim("Not configured. Run 'agents artifacts setup' or 'agents artifacts share join'."));
220
432
  return;
221
433
  }
222
434
  if (!analyticsEnabled(cfg)) {
@@ -236,9 +448,24 @@ ${SHARE_DELETE_EXAMPLES}
236
448
  }
237
449
  });
238
450
  }
451
+ /**
452
+ * Register the top-level `agents unshare <targets...>` alias of
453
+ * `agents artifacts share delete`. It takes the ROOT program (not the artifacts
454
+ * group) because it is deliberately a top-level convenience verb — taking a page
455
+ * down is the one artifact action typed often enough to keep at the root.
456
+ */
457
+ export function registerUnshareCommand(program) {
458
+ const unshareCmd = registerShareDeleteOptions(program
459
+ .command('unshare <targets...>')
460
+ .description('Alias of `agents artifacts share delete` — take down a published page (and by default its OG cover).'));
461
+ setHelpSections(unshareCmd, { examples: SHARE_DELETE_EXAMPLES, notes: SHARE_DELETE_NOTES });
462
+ unshareCmd.action(async (targets, opts) => {
463
+ await runShareDelete(targets, opts);
464
+ });
465
+ }
239
466
  /** Provision a fresh R2 bucket + Worker on the user's Cloudflare and persist the
240
- * endpoint config + write token. Shared by `agents share setup` and the unified
241
- * `agents setup share` wizard. */
467
+ * endpoint config + write token. Shared by both modes of `agents artifacts setup`
468
+ * (the flag-driven provision and the interactive wizard). */
242
469
  export async function runShareProvision(opts) {
243
470
  const { default: ora } = await import('ora');
244
471
  const { input } = await import('@inquirer/prompts');
@@ -253,6 +480,7 @@ export async function runShareProvision(opts) {
253
480
  const bucketName = opts.bucket;
254
481
  const token = generateWriteToken();
255
482
  const requestedDomain = cleanHostname(opts.domain) ?? DEFAULT_SHARE_DOMAIN;
483
+ const script = renderWorkerScript();
256
484
  const spin = ora('Provisioning on Cloudflare…').start();
257
485
  try {
258
486
  const provisionOpts = opts.request ? { request: opts.request } : {};
@@ -260,7 +488,7 @@ export async function runShareProvision(opts) {
260
488
  spin.text = `R2 bucket '${bucketName}' ready`;
261
489
  await configureBucketLifecycle(apiToken, accountId, bucketName, provisionOpts);
262
490
  spin.text = `R2 bucket '${bucketName}' lifecycle ready`;
263
- await deployWorker(apiToken, accountId, workerName, renderWorkerScript(), bucketName, provisionOpts);
491
+ await deployWorker(apiToken, accountId, workerName, script, bucketName, provisionOpts);
264
492
  spin.text = `Worker '${workerName}' deployed`;
265
493
  await setWorkerSecret(apiToken, accountId, workerName, token, provisionOpts);
266
494
  spin.text = `Worker '${workerName}' write token set`;
@@ -280,11 +508,19 @@ export async function runShareProvision(opts) {
280
508
  }
281
509
  }
282
510
  spin.succeed('Provisioned');
283
- const cfg = { baseUrl, accountId, workerName, bucketName, domain, analyticsToken: opts.analyticsToken };
511
+ const cfg = {
512
+ baseUrl,
513
+ accountId,
514
+ workerName,
515
+ bucketName,
516
+ domain,
517
+ analyticsToken: opts.analyticsToken,
518
+ templateHash: hashWorkerScript(script),
519
+ };
284
520
  writeShareConfig(cfg);
285
521
  storeWriteToken(token);
286
522
  console.log(chalk.green(`\nShare endpoint ready → ${chalk.bold(baseUrl)}`));
287
- console.log(chalk.dim('Publish with: ') + chalk.cyan('agents share <file>'));
523
+ console.log(chalk.dim('Publish with: ') + chalk.cyan('agents artifacts share <file>'));
288
524
  console.log(chalk.dim(`Fleet: push the token with 'agents secrets export share --host <box>' and pull config with 'agents repo pull'.`));
289
525
  }
290
526
  catch (e) {
@@ -292,6 +528,32 @@ export async function runShareProvision(opts) {
292
528
  throw e;
293
529
  }
294
530
  }
531
+ /** Re-deploy the Worker script on an ALREADY-provisioned endpoint to match the
532
+ * current `worker-template.ts`. Reuses the existing account/worker/bucket and
533
+ * write token from `readShareConfig()`/the `share` bundle — never creates a
534
+ * bucket, touches routes/domains, or regenerates the token (see
535
+ * `updateWorker` in `lib/share/provision.ts` for how the token survives the
536
+ * re-upload). Idempotent: no-ops when the deployed hash already matches
537
+ * unless `force`. */
538
+ export async function runShareUpdate(opts = {}) {
539
+ const cfg = readShareConfig();
540
+ if (!cfg) {
541
+ throw new Error("Not configured. Run 'agents artifacts setup' (to provision) or 'agents artifacts share join' first.");
542
+ }
543
+ const { apiToken, accountId: acctFromBundle } = readCloudflareCreds(opts.bundle ?? DEFAULT_CF_BUNDLE, {
544
+ apiToken: opts.token,
545
+ accountId: opts.account,
546
+ });
547
+ const accountId = opts.account || acctFromBundle || cfg.accountId;
548
+ const writeToken = readWriteToken();
549
+ const script = renderWorkerScript();
550
+ const provisionOpts = { ...(opts.request ? { request: opts.request } : {}), force: opts.force };
551
+ const result = await updateWorker(apiToken, accountId, cfg.workerName, cfg.bucketName, script, writeToken, cfg.templateHash, provisionOpts);
552
+ if (!result.skipped) {
553
+ writeShareConfig({ ...cfg, templateHash: result.templateHash });
554
+ }
555
+ return { updated: !result.skipped, templateHash: result.templateHash, baseUrl: cfg.baseUrl, workerName: cfg.workerName };
556
+ }
295
557
  function cleanHostname(domain) {
296
558
  const raw = domain?.trim().replace(/\/+$/, '');
297
559
  if (!raw)
@@ -305,14 +567,14 @@ function cleanHostname(domain) {
305
567
  }
306
568
  }
307
569
  /** Join an existing share endpoint (no provisioning): prompt for the endpoint
308
- * details + write token and persist them. Shared by `agents share join` and the
309
- * unified `agents setup share` wizard. */
570
+ * details + write token and persist them. Shared by `agents artifacts share join`
571
+ * and the `agents artifacts setup` wizard. */
310
572
  export async function runShareJoin(baseUrl, opts = {}) {
311
573
  const { password, input } = await import('@inquirer/prompts');
312
574
  const existing = readShareConfig();
313
575
  const clean = baseUrl?.replace(/\/+$/, '');
314
576
  if (!clean && !existing) {
315
- throw new Error("No synced share endpoint found. Pull config first with 'agents repo pull', or pass the endpoint URL: agents share join <baseUrl>.");
577
+ throw new Error("No synced share endpoint found. Pull config first with 'agents repo pull', or pass the endpoint URL: agents artifacts share join <baseUrl>.");
316
578
  }
317
579
  let cfg;
318
580
  if (existing && (!clean || clean === existing.baseUrl)) {
@@ -345,5 +607,5 @@ export async function runShareJoin(baseUrl, opts = {}) {
345
607
  throw new Error('A write token is required to join.');
346
608
  writeShareConfig(cfg);
347
609
  storeWriteToken(token);
348
- console.log(chalk.green(`Joined ${chalk.bold(cfg.baseUrl)} — publish with `) + chalk.cyan('agents share <file>'));
610
+ console.log(chalk.green(`Joined ${chalk.bold(cfg.baseUrl)} — publish with `) + chalk.cyan('agents artifacts share <file>'));
349
611
  }
@@ -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;