@phnx-labs/agents-cli 1.22.35 → 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 (487) hide show
  1. package/CHANGELOG.md +666 -2
  2. package/README.md +75 -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 +67 -0
  94. package/dist/commands/share.js +275 -12
  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/commands.d.ts +2 -0
  161. package/dist/lib/commands.js +2 -0
  162. package/dist/lib/computer/sessions-list.d.ts +150 -0
  163. package/dist/lib/computer/sessions-list.js +363 -0
  164. package/dist/lib/config-keys.d.ts +86 -0
  165. package/dist/lib/config-keys.js +193 -0
  166. package/dist/lib/config-machine-keys.d.ts +12 -0
  167. package/dist/lib/config-machine-keys.js +17 -0
  168. package/dist/lib/config-transfer.js +3 -4
  169. package/dist/lib/crabbox/cli.d.ts +2 -2
  170. package/dist/lib/crabbox/cli.js +3 -3
  171. package/dist/lib/daemon-health.d.ts +22 -0
  172. package/dist/lib/daemon-health.js +33 -3
  173. package/dist/lib/daemon-services.d.ts +50 -0
  174. package/dist/lib/daemon-services.js +147 -0
  175. package/dist/lib/daemon-ticks.d.ts +35 -66
  176. package/dist/lib/daemon-ticks.js +77 -159
  177. package/dist/lib/daemon.d.ts +72 -4
  178. package/dist/lib/daemon.js +792 -202
  179. package/dist/lib/deeplink/register.d.ts +49 -0
  180. package/dist/lib/deeplink/register.js +253 -0
  181. package/dist/lib/deeplink/url.d.ts +34 -0
  182. package/dist/lib/deeplink/url.js +78 -0
  183. package/dist/lib/device-config.d.ts +124 -29
  184. package/dist/lib/device-config.js +346 -141
  185. package/dist/lib/devices/config-migration.d.ts +42 -0
  186. package/dist/lib/devices/config-migration.js +203 -0
  187. package/dist/lib/devices/connect.js +14 -7
  188. package/dist/lib/devices/doctor-findings.d.ts +4 -1
  189. package/dist/lib/devices/doctor-findings.js +20 -1
  190. package/dist/lib/devices/harness-inventory.d.ts +11 -2
  191. package/dist/lib/devices/harness-inventory.js +0 -0
  192. package/dist/lib/devices/health.d.ts +1 -1
  193. package/dist/lib/devices/health.js +1 -1
  194. package/dist/lib/devices/pending.d.ts +22 -1
  195. package/dist/lib/devices/pending.js +67 -2
  196. package/dist/lib/devices/registry.d.ts +0 -25
  197. package/dist/lib/devices/registry.js +2 -83
  198. package/dist/lib/devices/resolve-profile.d.ts +20 -0
  199. package/dist/lib/devices/resolve-profile.js +44 -0
  200. package/dist/lib/devices/rollout-verify.d.ts +101 -0
  201. package/dist/lib/devices/rollout-verify.js +193 -0
  202. package/dist/lib/devices/ssh-config.js +10 -6
  203. package/dist/lib/event-families.d.ts +28 -0
  204. package/dist/lib/event-families.js +159 -0
  205. package/dist/lib/event-stream.d.ts +9 -1
  206. package/dist/lib/event-stream.js +26 -9
  207. package/dist/lib/events.d.ts +9 -1
  208. package/dist/lib/events.js +21 -6
  209. package/dist/lib/exec.d.ts +30 -0
  210. package/dist/lib/exec.js +219 -121
  211. package/dist/lib/feed-broadcast.d.ts +25 -0
  212. package/dist/lib/feed-broadcast.js +33 -0
  213. package/dist/lib/feed.d.ts +1 -1
  214. package/dist/lib/feed.js +12 -2
  215. package/dist/lib/fleet/capture.js +15 -0
  216. package/dist/lib/fleet/manifest.js +9 -0
  217. package/dist/lib/fleet/types.d.ts +9 -0
  218. package/dist/lib/fleet-status.js +10 -8
  219. package/dist/lib/git.d.ts +20 -6
  220. package/dist/lib/git.js +121 -17
  221. package/dist/lib/hosts/dispatch.d.ts +8 -3
  222. package/dist/lib/hosts/dispatch.js +29 -3
  223. package/dist/lib/hosts/logs.d.ts +2 -2
  224. package/dist/lib/hosts/logs.js +2 -2
  225. package/dist/lib/hosts/option.js +1 -1
  226. package/dist/lib/hosts/passthrough.d.ts +2 -3
  227. package/dist/lib/hosts/passthrough.js +10 -24
  228. package/dist/lib/hosts/progress.js +2 -2
  229. package/dist/lib/hosts/providers/devices.d.ts +3 -3
  230. package/dist/lib/hosts/providers/devices.js +18 -12
  231. package/dist/lib/hosts/ready.d.ts +5 -1
  232. package/dist/lib/hosts/ready.js +9 -3
  233. package/dist/lib/hosts/reconcile.d.ts +2 -2
  234. package/dist/lib/hosts/reconcile.js +2 -2
  235. package/dist/lib/hosts/registry.js +14 -9
  236. package/dist/lib/hosts/remote-cmd.js +1 -1
  237. package/dist/lib/hosts/remote-os.d.ts +9 -6
  238. package/dist/lib/hosts/remote-os.js +13 -6
  239. package/dist/lib/hosts/routing-flag.d.ts +23 -0
  240. package/dist/lib/hosts/routing-flag.js +41 -0
  241. package/dist/lib/hosts/run-target.js +1 -1
  242. package/dist/lib/hosts/session-index.js +1 -1
  243. package/dist/lib/hosts/tasks.d.ts +6 -6
  244. package/dist/lib/hosts/tasks.js +4 -4
  245. package/dist/lib/hosts/types.js +1 -2
  246. package/dist/lib/installations/resolve.js +2 -8
  247. package/dist/lib/isolation-boundary-report.js +0 -1
  248. package/dist/lib/linear-cache.d.ts +7 -0
  249. package/dist/lib/linear-cache.js +31 -4
  250. package/dist/lib/linear-project-counts.d.ts +1 -1
  251. package/dist/lib/linear-project-counts.js +2 -3
  252. package/dist/lib/linear-projects.js +1 -1
  253. package/dist/lib/loop.d.ts +2 -2
  254. package/dist/lib/loop.js +1 -1
  255. package/dist/lib/mailbox-target.d.ts +1 -1
  256. package/dist/lib/mailbox-target.js +1 -1
  257. package/dist/lib/manifest.js +7 -4
  258. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  259. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  260. package/dist/lib/menubar/snapshot.d.ts +3 -2
  261. package/dist/lib/menubar/snapshot.js +6 -2
  262. package/dist/lib/migrate-fold.d.ts +33 -0
  263. package/dist/lib/migrate-fold.js +130 -0
  264. package/dist/lib/migrate.d.ts +34 -34
  265. package/dist/lib/migrate.js +106 -128
  266. package/dist/lib/model-tier-overrides.d.ts +1 -1
  267. package/dist/lib/model-tier-overrides.js +15 -2
  268. package/dist/lib/monitors/config.d.ts +17 -3
  269. package/dist/lib/monitors/config.js +52 -18
  270. package/dist/lib/monitors/engine.d.ts +32 -1
  271. package/dist/lib/monitors/engine.js +94 -11
  272. package/dist/lib/monitors/fingerprint.d.ts +46 -0
  273. package/dist/lib/monitors/fingerprint.js +100 -0
  274. package/dist/lib/monitors/remote.d.ts +47 -0
  275. package/dist/lib/monitors/remote.js +81 -0
  276. package/dist/lib/monitors/state.d.ts +39 -0
  277. package/dist/lib/monitors/state.js +56 -0
  278. package/dist/lib/onepassword.d.ts +17 -0
  279. package/dist/lib/onepassword.js +52 -22
  280. package/dist/lib/open-url.js +1 -1
  281. package/dist/lib/picker.d.ts +14 -2
  282. package/dist/lib/picker.js +35 -13
  283. package/dist/lib/placement.d.ts +1 -1
  284. package/dist/lib/placement.js +1 -1
  285. package/dist/lib/pr-land-detach.d.ts +32 -0
  286. package/dist/lib/pr-land-detach.js +79 -0
  287. package/dist/lib/profiles-presets.js +13 -0
  288. package/dist/lib/profiles.d.ts +2 -0
  289. package/dist/lib/profiles.js +44 -1
  290. package/dist/lib/project-focus.d.ts +1 -1
  291. package/dist/lib/project-focus.js +1 -1
  292. package/dist/lib/project-probe.d.ts +4 -1
  293. package/dist/lib/project-probe.js +5 -4
  294. package/dist/lib/project-resources.js +2 -18
  295. package/dist/lib/project-root.d.ts +16 -0
  296. package/dist/lib/project-root.js +20 -2
  297. package/dist/lib/projects.d.ts +20 -1
  298. package/dist/lib/projects.js +78 -1
  299. package/dist/lib/refresh-coordinator.d.ts +24 -0
  300. package/dist/lib/refresh-coordinator.js +52 -0
  301. package/dist/lib/registry.d.ts +2 -2
  302. package/dist/lib/registry.js +1 -1
  303. package/dist/lib/resource-aliases.d.ts +13 -0
  304. package/dist/lib/resource-aliases.js +26 -0
  305. package/dist/lib/resources/types.d.ts +1 -1
  306. package/dist/lib/resources.d.ts +16 -0
  307. package/dist/lib/resources.js +66 -10
  308. package/dist/lib/rotate.d.ts +3 -4
  309. package/dist/lib/rotate.js +4 -5
  310. package/dist/lib/routine-activation.d.ts +22 -2
  311. package/dist/lib/routine-activation.js +63 -16
  312. package/dist/lib/routine-context.d.ts +9 -2
  313. package/dist/lib/routine-context.js +21 -6
  314. package/dist/lib/routines-project.d.ts +58 -48
  315. package/dist/lib/routines-project.js +190 -159
  316. package/dist/lib/routines.d.ts +41 -6
  317. package/dist/lib/routines.js +92 -34
  318. package/dist/lib/run-defaults.d.ts +5 -0
  319. package/dist/lib/run-defaults.js +11 -1
  320. package/dist/lib/runner.d.ts +10 -8
  321. package/dist/lib/runner.js +122 -39
  322. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  323. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  324. package/dist/lib/secrets/agent.d.ts +10 -3
  325. package/dist/lib/secrets/agent.js +43 -8
  326. package/dist/lib/secrets/bundles.d.ts +1 -0
  327. package/dist/lib/secrets/bundles.js +92 -80
  328. package/dist/lib/secrets/index.js +32 -9
  329. package/dist/lib/secrets/install-helper.d.ts +4 -4
  330. package/dist/lib/secrets/install-helper.js +4 -4
  331. package/dist/lib/secrets/push.d.ts +40 -6
  332. package/dist/lib/secrets/push.js +58 -11
  333. package/dist/lib/secrets/read-backoff.d.ts +1 -1
  334. package/dist/lib/secrets/read-backoff.js +1 -1
  335. package/dist/lib/secrets/remote.d.ts +24 -0
  336. package/dist/lib/secrets/remote.js +54 -4
  337. package/dist/lib/self-update.d.ts +108 -0
  338. package/dist/lib/self-update.js +276 -1
  339. package/dist/lib/session/active.d.ts +89 -5
  340. package/dist/lib/session/active.js +165 -10
  341. package/dist/lib/session/actor-sidecar.d.ts +1 -1
  342. package/dist/lib/session/actor-sidecar.js +2 -1
  343. package/dist/lib/session/db.d.ts +176 -2
  344. package/dist/lib/session/db.js +484 -17
  345. package/dist/lib/session/discover.js +27 -4
  346. package/dist/lib/session/hook-sessions.js +2 -2
  347. package/dist/lib/session/host-link.d.ts +2 -2
  348. package/dist/lib/session/host-link.js +2 -2
  349. package/dist/lib/session/pid-registry.d.ts +21 -0
  350. package/dist/lib/session/pid-registry.js +57 -0
  351. package/dist/lib/session/remote-active.js +15 -1
  352. package/dist/lib/session/remote.js +2 -2
  353. package/dist/lib/session/session-cache.d.ts +14 -7
  354. package/dist/lib/session/session-cache.js +51 -9
  355. package/dist/lib/session/state.d.ts +2 -2
  356. package/dist/lib/session/state.js +1 -1
  357. package/dist/lib/session/sync/config.d.ts +10 -10
  358. package/dist/lib/session/sync/config.js +10 -10
  359. package/dist/lib/session/sync/r2.d.ts +34 -0
  360. package/dist/lib/session/sync/r2.js +123 -0
  361. package/dist/lib/session/throughput.d.ts +1 -1
  362. package/dist/lib/session/throughput.js +1 -1
  363. package/dist/lib/session/types.d.ts +23 -1
  364. package/dist/lib/session/types.js +15 -0
  365. package/dist/lib/session/viewing-in.d.ts +1 -1
  366. package/dist/lib/session/viewing-in.js +1 -1
  367. package/dist/lib/session/watch.d.ts +101 -0
  368. package/dist/lib/session/watch.js +242 -0
  369. package/dist/lib/share/config.d.ts +4 -0
  370. package/dist/lib/share/config.js +1 -0
  371. package/dist/lib/share/provision.d.ts +38 -0
  372. package/dist/lib/share/provision.js +50 -0
  373. package/dist/lib/share/publish.d.ts +40 -1
  374. package/dist/lib/share/publish.js +116 -3
  375. package/dist/lib/share/worker-template.js +71 -6
  376. package/dist/lib/shims.d.ts +17 -3
  377. package/dist/lib/shims.js +98 -26
  378. package/dist/lib/signin-badge.js +3 -2
  379. package/dist/lib/skills.js +2 -0
  380. package/dist/lib/smart-launch.d.ts +8 -8
  381. package/dist/lib/smart-launch.js +80 -59
  382. package/dist/lib/ssh-exec.d.ts +1 -1
  383. package/dist/lib/ssh-exec.js +1 -1
  384. package/dist/lib/staleness/prune.d.ts +88 -0
  385. package/dist/lib/staleness/prune.js +69 -0
  386. package/dist/lib/staleness/registry.d.ts +1 -1
  387. package/dist/lib/staleness/writers/commands.js +34 -2
  388. package/dist/lib/staleness/writers/hooks.js +16 -0
  389. package/dist/lib/staleness/writers/kinds.d.ts +6 -0
  390. package/dist/lib/staleness/writers/skills.js +19 -0
  391. package/dist/lib/staleness/writers/subagents.d.ts +2 -3
  392. package/dist/lib/staleness/writers/subagents.js +0 -4
  393. package/dist/lib/staleness/writers/types.d.ts +32 -0
  394. package/dist/lib/startup/command-registry.d.ts +6 -12
  395. package/dist/lib/startup/command-registry.js +11 -31
  396. package/dist/lib/startup/dev-build.d.ts +10 -0
  397. package/dist/lib/startup/dev-build.js +13 -1
  398. package/dist/lib/startup/spellcheck.d.ts +18 -0
  399. package/dist/lib/startup/spellcheck.js +45 -0
  400. package/dist/lib/state.d.ts +36 -9
  401. package/dist/lib/state.js +96 -46
  402. package/dist/lib/subagents-registry.d.ts +0 -7
  403. package/dist/lib/subagents-registry.js +38 -65
  404. package/dist/lib/subagents.d.ts +0 -33
  405. package/dist/lib/subagents.js +0 -75
  406. package/dist/lib/sync-umbrella.js +1 -1
  407. package/dist/lib/teams/agents.d.ts +41 -1
  408. package/dist/lib/teams/agents.js +187 -9
  409. package/dist/lib/teams/api.d.ts +11 -1
  410. package/dist/lib/teams/api.js +11 -2
  411. package/dist/lib/teams/delivery.d.ts +41 -0
  412. package/dist/lib/teams/delivery.js +60 -0
  413. package/dist/lib/teams/registry.d.ts +14 -0
  414. package/dist/lib/teams/registry.js +51 -1
  415. package/dist/lib/teams/remoteWorktree.d.ts +19 -0
  416. package/dist/lib/teams/remoteWorktree.js +29 -0
  417. package/dist/lib/teams/scheduler.d.ts +1 -1
  418. package/dist/lib/teams/scheduler.js +1 -1
  419. package/dist/lib/teams/worktree.d.ts +24 -0
  420. package/dist/lib/teams/worktree.js +42 -0
  421. package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
  422. package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
  423. package/dist/lib/terminal/engine.d.ts +4 -0
  424. package/dist/lib/terminal/engine.js +8 -2
  425. package/dist/lib/terminal/types.d.ts +21 -2
  426. package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
  427. package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
  428. package/dist/lib/tickets/list.d.ts +53 -0
  429. package/dist/lib/tickets/list.js +153 -0
  430. package/dist/lib/tmux/orphan-reap.d.ts +320 -0
  431. package/dist/lib/tmux/orphan-reap.js +644 -0
  432. package/dist/lib/tmux/session.d.ts +68 -3
  433. package/dist/lib/tmux/session.js +95 -5
  434. package/dist/lib/triggers/handlers.d.ts +20 -0
  435. package/dist/lib/triggers/handlers.js +6 -1
  436. package/dist/lib/types.d.ts +46 -34
  437. package/dist/lib/usage-fleet.d.ts +32 -0
  438. package/dist/lib/usage-fleet.js +125 -0
  439. package/dist/lib/usage-refresh.d.ts +3 -3
  440. package/dist/lib/usage-refresh.js +19 -16
  441. package/dist/lib/usage.d.ts +51 -47
  442. package/dist/lib/usage.js +145 -153
  443. package/dist/lib/version-duplicates.js +2 -2
  444. package/dist/lib/versions.d.ts +56 -13
  445. package/dist/lib/versions.js +195 -45
  446. package/dist/lib/watchdog/log.d.ts +1 -1
  447. package/dist/lib/watchdog/log.js +3 -3
  448. package/dist/lib/watchdog/rotate.d.ts +6 -6
  449. package/dist/lib/watchdog/rotate.js +6 -6
  450. package/dist/lib/workflows.d.ts +1 -1
  451. package/dist/lib/yaml-io.d.ts +47 -0
  452. package/dist/lib/yaml-io.js +55 -0
  453. package/package.json +2 -1
  454. package/scripts/install-helper.js +2 -2
  455. package/scripts/postinstall.js +23 -20
  456. package/dist/commands/defaults.d.ts +0 -7
  457. package/dist/commands/defaults.js +0 -107
  458. package/dist/commands/export.d.ts +0 -11
  459. package/dist/commands/export.js +0 -215
  460. package/dist/commands/helper.d.ts +0 -12
  461. package/dist/commands/helper.js +0 -87
  462. package/dist/commands/hosts.d.ts +0 -11
  463. package/dist/commands/hosts.js +0 -330
  464. package/dist/commands/lock.d.ts +0 -12
  465. package/dist/commands/lock.js +0 -70
  466. package/dist/commands/pull.d.ts +0 -17
  467. package/dist/commands/pull.js +0 -39
  468. package/dist/commands/push.d.ts +0 -14
  469. package/dist/commands/push.js +0 -30
  470. package/dist/commands/wallet.d.ts +0 -20
  471. package/dist/commands/wallet.js +0 -216
  472. package/dist/commands/worktree.d.ts +0 -19
  473. package/dist/commands/worktree.js +0 -272
  474. package/dist/lib/account-labels.d.ts +0 -24
  475. package/dist/lib/account-labels.js +0 -72
  476. package/dist/lib/auto-dispatch-linear.d.ts +0 -18
  477. package/dist/lib/auto-dispatch-linear.js +0 -107
  478. package/dist/lib/auto-dispatch-provider.d.ts +0 -10
  479. package/dist/lib/auto-dispatch-provider.js +0 -30
  480. package/dist/lib/auto-dispatch.d.ts +0 -93
  481. package/dist/lib/auto-dispatch.js +0 -128
  482. package/dist/lib/export.d.ts +0 -72
  483. package/dist/lib/export.js +0 -269
  484. package/dist/lib/lock.d.ts +0 -93
  485. package/dist/lib/lock.js +0 -207
  486. package/dist/lib/wallet/index.d.ts +0 -78
  487. package/dist/lib/wallet/index.js +0 -253
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import chalk from 'chalk';
10
10
  import { DEFAULT_BUCKET_NAME, DEFAULT_CF_BUNDLE, DEFAULT_WORKER_NAME, readShareConfig, } from '../lib/share/config.js';
11
- import { runShareProvision, runShareJoin } from './share.js';
11
+ import { runShareProvision, runShareJoin, runShareUpdate, shareTemplateStatus } from './share.js';
12
12
  import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
13
13
  /**
14
14
  * Interactive share setup. Returns true if the user configured (or already had)
@@ -25,12 +25,42 @@ export async function runShareWizard() {
25
25
  if (existing) {
26
26
  console.log(chalk.dim(`Share is already configured → ${chalk.green(existing.baseUrl)}`));
27
27
  console.log(chalk.dim(` worker ${existing.workerName} · bucket ${existing.bucketName} · account ${existing.accountId}`));
28
- const { confirm } = await import('@inquirer/prompts');
29
- const reconfigure = await confirm({ message: 'Reconfigure the share endpoint?', default: false });
30
- if (!reconfigure) {
28
+ const templateStatus = shareTemplateStatus(existing);
29
+ console.log(chalk.dim(` template ${templateStatus}`));
30
+ const { select } = await import('@inquirer/prompts');
31
+ const action = await select({
32
+ message: 'Share is already configured. What do you want to do?',
33
+ choices: [
34
+ { name: 'Keep as is', value: 'keep' },
35
+ {
36
+ name: 'Update the deployed Worker to the latest template',
37
+ value: 'update',
38
+ description: templateStatus === 'current'
39
+ ? 'Already current — this re-deploys anyway and refreshes the token in place.'
40
+ : 'Re-deploys the Worker script on your existing endpoint (same account/worker/bucket, same write token).',
41
+ },
42
+ {
43
+ name: 'Reconfigure from scratch (provision or join again)',
44
+ value: 'reconfigure',
45
+ },
46
+ ],
47
+ default: templateStatus === 'outdated' || templateStatus === 'unknown' ? 'update' : 'keep',
48
+ });
49
+ if (action === 'keep') {
31
50
  console.log(chalk.dim('Keeping the current endpoint.'));
32
51
  return true;
33
52
  }
53
+ if (action === 'update') {
54
+ // When the template is already current, the description below promises a
55
+ // re-deploy anyway — force it, or runShareUpdate's own no-op would silently
56
+ // contradict what was just said.
57
+ const result = await runShareUpdate({ force: templateStatus === 'current' });
58
+ console.log(result.updated
59
+ ? chalk.green(`Worker '${result.workerName}' updated → template ${result.templateHash.slice(0, 12)}…`)
60
+ : chalk.dim(`Worker '${result.workerName}' already matches the current template — no-op.`));
61
+ return true;
62
+ }
63
+ // action === 'reconfigure' — fall through to the provision/join flow below.
34
64
  }
35
65
  const { select } = await import('@inquirer/prompts');
36
66
  const mode = await select({
@@ -10,6 +10,11 @@ interface RunSetupOptions {
10
10
  suppressFooter?: boolean;
11
11
  systemRepo?: boolean;
12
12
  runHub?: () => Promise<void>;
13
+ startDaemonFn?: () => {
14
+ pid: number | null;
15
+ method: string;
16
+ };
17
+ isDaemonEnabledFn?: () => boolean;
13
18
  }
14
19
  /** First-run setup. Clones ~/.agents/.system/ from the system repo if needed. */
15
20
  export declare function runSetup(program: Command, options?: RunSetupOptions): Promise<void>;
@@ -131,6 +131,20 @@ export async function runSetup(program, options = {}) {
131
131
  spinner.succeed(`Cloned ${systemRepoSlug(systemRepo)} (${result.commit})`);
132
132
  }
133
133
  }
134
+ try {
135
+ const enabled = options.isDaemonEnabledFn
136
+ ? options.isDaemonEnabledFn()
137
+ : (await import('../lib/device-config.js')).isDaemonEnabled();
138
+ if (enabled) {
139
+ const start = options.startDaemonFn
140
+ ?? (await import('../lib/daemon.js')).startDaemon;
141
+ const started = start();
142
+ if (started.method !== 'already-running' && started.pid) {
143
+ console.log(chalk.gray(`Started the always-on agents daemon (pid ${started.pid}).`));
144
+ }
145
+ }
146
+ }
147
+ catch { /* best effort */ }
134
148
  // Populate the device registry from the tailnet on first setup. Soft mode is
135
149
  // guaranteed non-throwing (no tailscale / corrupt file / lock contention all
136
150
  // resolve to ok:false), so this can never block setup.
@@ -195,6 +209,18 @@ export async function runSetup(program, options = {}) {
195
209
  }
196
210
  }
197
211
  }
212
+ // Register the agents:// URL scheme so deep links in rendered artifacts can
213
+ // resume a session (RUSH — session deep links). Best-effort and idempotent:
214
+ // never fails setup, only registers when missing.
215
+ try {
216
+ const { registerAgentsUrlScheme } = await import('../lib/deeplink/register.js');
217
+ const scheme = registerAgentsUrlScheme({ ifMissing: true });
218
+ if (scheme.registered)
219
+ console.log(chalk.gray('Registered the agents:// URL scheme (artifact session deep links).'));
220
+ }
221
+ catch {
222
+ // non-fatal — the user can run `agents open register` later.
223
+ }
198
224
  if (options.suppressFooter)
199
225
  return;
200
226
  // Fresh-machine hub: offer to set up the optional capabilities that need their
@@ -1,8 +1,55 @@
1
1
  import type { Command } from 'commander';
2
+ import { type ShareConfig } from '../lib/share/config.js';
2
3
  import { type CloudflareRequester } from '../lib/share/provision.js';
3
4
  import { type PublishResult } from '../lib/share/publish.js';
4
5
  import { deleteShare, type DeleteShareResult } from '../lib/share/delete.js';
5
6
  export declare function formatSharePublishResult(result: PublishResult, json?: boolean): string;
7
+ /** Compare the configured endpoint's last-deployed template hash against the
8
+ * hash of the CURRENT `worker-template.ts` render. A config with no recorded
9
+ * hash (every endpoint provisioned before this field existed) is "unknown" —
10
+ * never "current" or "outdated", since there is nothing to compare against. */
11
+ export declare function shareTemplateStatus(cfg: ShareConfig): 'current' | 'outdated' | 'unknown';
12
+ /** One published object as reported by the Worker's `?format=json` listing route. */
13
+ export interface ShareListItem {
14
+ slug: string;
15
+ url: string;
16
+ /** Object size in bytes. */
17
+ size: number;
18
+ /** Stored content type, or null if the Worker had none recorded. */
19
+ contentType: string | null;
20
+ /** ISO timestamp the object was last written (R2 `uploaded`). */
21
+ publishedAt: string;
22
+ /** ISO auto-expire timestamp, or null for a permanent share. */
23
+ expiresAt: string | null;
24
+ }
25
+ export interface ShareListResult {
26
+ /** The namespace listed. */
27
+ user: string;
28
+ count: number;
29
+ objects: ShareListItem[];
30
+ }
31
+ /** DI seam for tests — override the real HTTP GET of the JSON listing route. */
32
+ export type ListingFetchFn = (url: string) => Promise<{
33
+ status: number;
34
+ contentType: string;
35
+ body: string;
36
+ }>;
37
+ /** Parse the Worker's listing JSON into a validated result, failing loud (with the
38
+ * outdated-template hint) on any body that isn't the expected shape — an old Worker
39
+ * serves the HTML gallery for a non-empty namespace, which must not be silently
40
+ * accepted as "you have published nothing". */
41
+ export declare function parseShareListing(user: string, body: string): ShareListResult;
42
+ /** Fetch and parse the machine-readable listing of the caller's namespace from the
43
+ * Worker's `?format=json` route. Fails loud when share was never configured, when
44
+ * the deployed template is known-outdated (RUSH-2449 templateHash), or when the
45
+ * live response proves the route is absent (404 or a non-JSON 200 = the old HTML
46
+ * gallery) — never a silent empty/wrong result. */
47
+ export declare function runShareList(opts?: {
48
+ githubUser?: string;
49
+ config?: ShareConfig;
50
+ fetchListing?: ListingFetchFn;
51
+ }): Promise<ShareListResult>;
52
+ export declare function formatShareList(result: ShareListResult, json?: boolean): string;
6
53
  export declare function formatShareDeleteResult(result: DeleteShareResult, json?: boolean): string;
7
54
  interface ShareDeleteCliOpts {
8
55
  keepCover?: boolean;
@@ -33,6 +80,26 @@ export declare function runShareProvision(opts: {
33
80
  analyticsToken?: string;
34
81
  request?: CloudflareRequester;
35
82
  }): Promise<void>;
83
+ export interface ShareUpdateResult {
84
+ updated: boolean;
85
+ templateHash: string;
86
+ baseUrl: string;
87
+ workerName: string;
88
+ }
89
+ /** Re-deploy the Worker script on an ALREADY-provisioned endpoint to match the
90
+ * current `worker-template.ts`. Reuses the existing account/worker/bucket and
91
+ * write token from `readShareConfig()`/the `share` bundle — never creates a
92
+ * bucket, touches routes/domains, or regenerates the token (see
93
+ * `updateWorker` in `lib/share/provision.ts` for how the token survives the
94
+ * re-upload). Idempotent: no-ops when the deployed hash already matches
95
+ * unless `force`. */
96
+ export declare function runShareUpdate(opts?: {
97
+ bundle?: string;
98
+ account?: string;
99
+ token?: string;
100
+ force?: boolean;
101
+ request?: CloudflareRequester;
102
+ }): Promise<ShareUpdateResult>;
36
103
  /** Join an existing share endpoint (no provisioning): prompt for the endpoint
37
104
  * details + write token and persist them. Shared by `agents share join` and the
38
105
  * unified `agents setup share` wizard. */
@@ -2,9 +2,9 @@
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
8
  import { deleteShare } from '../lib/share/delete.js';
9
9
  import { renderWorkerScript } from '../lib/share/worker-template.js';
10
10
  import { analyticsEnabled } from '../lib/share/analytics.js';
@@ -18,8 +18,132 @@ export function formatSharePublishResult(result, json = false) {
18
18
  lines.push(chalk.dim(` cover ${result.coverUrl}`));
19
19
  if (result.expiresAt)
20
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)'));
21
25
  return lines.join('\n');
22
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
+ }
23
147
  export function formatShareDeleteResult(result, json = false) {
24
148
  if (json)
25
149
  return JSON.stringify(result, null, 2);
@@ -105,7 +229,10 @@ export function registerShareCommands(program) {
105
229
  .argument('[file]', 'file to publish (HTML or any static asset)')
106
230
  .option('--slug <slug>', 'custom URL slug under your namespace (default: <project>-<feature>-<hash>)')
107
231
  .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')
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')
109
236
  .option('--no-cover', 'skip the OG preview image (HTML pages get one by default)')
110
237
  .option('--no-analytics', 'skip injecting the Cloudflare Web Analytics beacon')
111
238
  .option('--json', 'emit machine-readable publish result for plan-render hooks and scripts')
@@ -120,14 +247,16 @@ export function registerShareCommands(program) {
120
247
  return;
121
248
  }
122
249
  try {
123
- const { url, expiresAt, coverUrl } = await publishFile(file, {
250
+ const result = await publishFile(file, {
124
251
  slug: opts.slug,
125
252
  githubUser: opts.githubUser,
126
253
  expire: opts.expire,
254
+ unlisted: opts.unlisted === true || opts.private === true,
255
+ force: opts.force,
127
256
  cover: opts.cover,
128
257
  analytics: opts.analytics,
129
258
  });
130
- console.log(formatSharePublishResult({ url, expiresAt, coverUrl }, Boolean(opts.json)));
259
+ console.log(formatSharePublishResult(result, Boolean(opts.json)));
131
260
  }
132
261
  catch (e) {
133
262
  console.error(chalk.red(e.message));
@@ -136,17 +265,33 @@ export function registerShareCommands(program) {
136
265
  });
137
266
  setHelpSections(shareCmd, {
138
267
  examples: `
139
- # Publish an HTML file — gets an auto OG cover + a shareable link
268
+ # Publish an HTML file — auto OG cover, default 30d expiry, shareable link
140
269
  agents share ./out/plan.html
141
270
 
142
- # Custom slug, expiring in 30 days
143
- agents share ./out/report.html --slug q3-report --expire 30d
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
144
279
  ${SHARE_DELETE_EXAMPLES}
145
280
  # One-time setup (or join an existing endpoint)
146
281
  agents share setup
147
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}
148
294
  `,
149
- notes: SHARE_DELETE_NOTES,
150
295
  });
151
296
  const shareDeleteCmd = registerShareDeleteOptions(shareCmd
152
297
  .command('delete <targets...>')
@@ -195,6 +340,47 @@ ${SHARE_DELETE_EXAMPLES}
195
340
  process.exitCode = 1;
196
341
  }
197
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
+ });
198
384
  shareCmd
199
385
  .command('status')
200
386
  .description('Show the configured share endpoint and namespace.')
@@ -209,6 +395,48 @@ ${SHARE_DELETE_EXAMPLES}
209
395
  const user = await resolveGitHubUsername();
210
396
  console.log(`${chalk.bold('namespace')} ${user ? chalk.cyan(`${cfg.baseUrl}/${user}`) : chalk.yellow('unknown — set gh auth or github.user')}`);
211
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
+ `,
212
440
  });
213
441
  shareCmd
214
442
  .command('analytics')
@@ -253,6 +481,7 @@ export async function runShareProvision(opts) {
253
481
  const bucketName = opts.bucket;
254
482
  const token = generateWriteToken();
255
483
  const requestedDomain = cleanHostname(opts.domain) ?? DEFAULT_SHARE_DOMAIN;
484
+ const script = renderWorkerScript();
256
485
  const spin = ora('Provisioning on Cloudflare…').start();
257
486
  try {
258
487
  const provisionOpts = opts.request ? { request: opts.request } : {};
@@ -260,7 +489,7 @@ export async function runShareProvision(opts) {
260
489
  spin.text = `R2 bucket '${bucketName}' ready`;
261
490
  await configureBucketLifecycle(apiToken, accountId, bucketName, provisionOpts);
262
491
  spin.text = `R2 bucket '${bucketName}' lifecycle ready`;
263
- await deployWorker(apiToken, accountId, workerName, renderWorkerScript(), bucketName, provisionOpts);
492
+ await deployWorker(apiToken, accountId, workerName, script, bucketName, provisionOpts);
264
493
  spin.text = `Worker '${workerName}' deployed`;
265
494
  await setWorkerSecret(apiToken, accountId, workerName, token, provisionOpts);
266
495
  spin.text = `Worker '${workerName}' write token set`;
@@ -280,7 +509,15 @@ export async function runShareProvision(opts) {
280
509
  }
281
510
  }
282
511
  spin.succeed('Provisioned');
283
- 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
+ };
284
521
  writeShareConfig(cfg);
285
522
  storeWriteToken(token);
286
523
  console.log(chalk.green(`\nShare endpoint ready → ${chalk.bold(baseUrl)}`));
@@ -292,6 +529,32 @@ export async function runShareProvision(opts) {
292
529
  throw e;
293
530
  }
294
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
+ }
295
558
  function cleanHostname(domain) {
296
559
  const raw = domain?.trim().replace(/\/+$/, '');
297
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;