@phnx-labs/agents-cli 1.22.38 → 1.22.40

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 (554) hide show
  1. package/CHANGELOG.md +302 -0
  2. package/README.md +111 -70
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.js +46 -27
  5. package/dist/browser.js +2 -2
  6. package/dist/cli/command-registry.d.ts +135 -0
  7. package/dist/cli/command-registry.js +260 -0
  8. package/dist/commands/accounts.d.ts +20 -0
  9. package/dist/commands/accounts.js +186 -25
  10. package/dist/commands/apply.d.ts +3 -3
  11. package/dist/commands/apply.js +20 -63
  12. package/dist/commands/browser.js +206 -94
  13. package/dist/commands/budget.d.ts +7 -6
  14. package/dist/commands/budget.js +8 -7
  15. package/dist/commands/cloud.js +17 -20
  16. package/dist/commands/commands.js +1 -1
  17. package/dist/commands/computer-actions.d.ts +1 -35
  18. package/dist/commands/computer-actions.js +13 -181
  19. package/dist/commands/computer.d.ts +28 -3
  20. package/dist/commands/computer.js +93 -65
  21. package/dist/commands/config.js +47 -4
  22. package/dist/commands/cost.d.ts +2 -1
  23. package/dist/commands/cost.js +7 -6
  24. package/dist/commands/daemon.js +151 -4
  25. package/dist/commands/detach.js +1 -1
  26. package/dist/commands/doctor.js +19 -11
  27. package/dist/commands/events.js +1 -1
  28. package/dist/commands/exec.d.ts +2 -50
  29. package/dist/commands/exec.js +161 -216
  30. package/dist/commands/factory.js +1 -1
  31. package/dist/commands/feed.d.ts +2 -2
  32. package/dist/commands/feed.js +9 -12
  33. package/dist/commands/fleet-capture.js +25 -27
  34. package/dist/commands/focus.d.ts +2 -3
  35. package/dist/commands/focus.js +34 -9
  36. package/dist/commands/go.js +15 -5
  37. package/dist/commands/harness.d.ts +3 -3
  38. package/dist/commands/harness.js +53 -5
  39. package/dist/commands/hooks.js +1 -1
  40. package/dist/commands/import.js +2 -2
  41. package/dist/commands/insights.d.ts +5 -5
  42. package/dist/commands/insights.js +15 -9
  43. package/dist/commands/inspect.d.ts +2 -3
  44. package/dist/commands/inspect.js +4 -16
  45. package/dist/commands/logs.d.ts +2 -2
  46. package/dist/commands/logs.js +9 -9
  47. package/dist/commands/mcp.js +2 -2
  48. package/dist/commands/memory.js +1 -1
  49. package/dist/commands/message.d.ts +1 -1
  50. package/dist/commands/message.js +7 -7
  51. package/dist/commands/mine.d.ts +11 -8
  52. package/dist/commands/mine.js +11 -10
  53. package/dist/commands/models.js +1 -1
  54. package/dist/commands/modes.js +1 -1
  55. package/dist/commands/monitors.js +23 -6
  56. package/dist/commands/output.d.ts +7 -6
  57. package/dist/commands/output.js +11 -10
  58. package/dist/commands/packages.js +4 -4
  59. package/dist/commands/perf.js +1 -1
  60. package/dist/commands/permissions.js +49 -32
  61. package/dist/commands/plugins.d.ts +1 -1
  62. package/dist/commands/plugins.js +3 -3
  63. package/dist/commands/profiles.d.ts +6 -9
  64. package/dist/commands/profiles.js +8 -321
  65. package/dist/commands/projects.d.ts +9 -0
  66. package/dist/commands/projects.js +140 -8
  67. package/dist/commands/prune.js +5 -13
  68. package/dist/commands/refresh-rules.js +1 -1
  69. package/dist/commands/repo.d.ts +5 -7
  70. package/dist/commands/repo.js +34 -18
  71. package/dist/commands/resource-view.js +4 -0
  72. package/dist/commands/resume.d.ts +11 -7
  73. package/dist/commands/resume.js +82 -98
  74. package/dist/commands/route.d.ts +12 -0
  75. package/dist/commands/route.js +261 -0
  76. package/dist/commands/routines.d.ts +2 -3
  77. package/dist/commands/routines.js +120 -145
  78. package/dist/commands/rules.js +1 -1
  79. package/dist/commands/run-account-picker.d.ts +1 -1
  80. package/dist/commands/run-account-picker.js +2 -2
  81. package/dist/commands/run-broadcast.d.ts +21 -0
  82. package/dist/commands/run-broadcast.js +89 -0
  83. package/dist/commands/run-cloud.js +1 -1
  84. package/dist/commands/secrets-vault.d.ts +10 -0
  85. package/dist/commands/{login.js → secrets-vault.js} +34 -14
  86. package/dist/commands/secrets.d.ts +4 -4
  87. package/dist/commands/secrets.js +72 -63
  88. package/dist/commands/sessions-backfill.js +1 -1
  89. package/dist/commands/sessions-browser.d.ts +1 -1
  90. package/dist/commands/sessions-browser.js +9 -5
  91. package/dist/commands/sessions-export.js +2 -2
  92. package/dist/commands/sessions-inject.js +4 -5
  93. package/dist/commands/sessions-migrate.js +16 -27
  94. package/dist/commands/sessions-picker.d.ts +13 -0
  95. package/dist/commands/sessions-picker.js +182 -8
  96. package/dist/commands/sessions-resume.d.ts +7 -3
  97. package/dist/commands/sessions-resume.js +81 -33
  98. package/dist/commands/sessions-stats.js +2 -2
  99. package/dist/commands/sessions.d.ts +75 -68
  100. package/dist/commands/sessions.js +142 -180
  101. package/dist/commands/setup-computer.js +1 -1
  102. package/dist/commands/setup-fleet.js +3 -0
  103. package/dist/commands/setup-mine.d.ts +7 -3
  104. package/dist/commands/setup-mine.js +13 -8
  105. package/dist/commands/setup-secrets.js +2 -2
  106. package/dist/commands/setup-watchdog.js +2 -2
  107. package/dist/commands/setup.js +7 -2
  108. package/dist/commands/share.d.ts +65 -0
  109. package/dist/commands/share.js +253 -20
  110. package/dist/commands/skills.js +3 -3
  111. package/dist/commands/snapshot.d.ts +2 -2
  112. package/dist/commands/snapshot.js +9 -9
  113. package/dist/commands/ssh.d.ts +1 -1
  114. package/dist/commands/ssh.js +318 -48
  115. package/dist/commands/subagents.js +1 -1
  116. package/dist/commands/sync.js +24 -9
  117. package/dist/commands/teams.d.ts +2 -2
  118. package/dist/commands/teams.js +9 -18
  119. package/dist/commands/tmux.js +5 -1
  120. package/dist/commands/trash.js +1 -1
  121. package/dist/commands/usage.d.ts +1 -1
  122. package/dist/commands/usage.js +2 -2
  123. package/dist/commands/utils.d.ts +4 -14
  124. package/dist/commands/utils.js +6 -27
  125. package/dist/commands/versions.js +2 -2
  126. package/dist/commands/view.d.ts +9 -77
  127. package/dist/commands/view.js +23 -8
  128. package/dist/commands/watchdog.js +1 -1
  129. package/dist/commands/webhook.js +11 -25
  130. package/dist/commands/workflows.js +1 -1
  131. package/dist/index.js +1 -1
  132. package/dist/lib/account-capabilities.d.ts +39 -0
  133. package/dist/lib/account-capabilities.js +59 -0
  134. package/dist/lib/account-catalog.js +1 -1
  135. package/dist/lib/account-registry.d.ts +66 -0
  136. package/dist/lib/account-registry.js +151 -5
  137. package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
  138. package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
  139. package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
  140. package/dist/lib/{usage.js → accounting/usage.js} +11 -11
  141. package/dist/lib/agent-spec/provider.js +1 -1
  142. package/dist/lib/agents.d.ts +72 -4
  143. package/dist/lib/agents.js +231 -199
  144. package/dist/lib/answer-router.d.ts +2 -2
  145. package/dist/lib/ask-classifier.d.ts +1 -1
  146. package/dist/lib/ask-classifier.js +1 -1
  147. package/dist/lib/audit/log.js +1 -1
  148. package/dist/lib/auth-health.d.ts +1 -1
  149. package/dist/lib/auth-health.js +2 -2
  150. package/dist/lib/brand.js +1 -1
  151. package/dist/lib/browser/caller-identity.d.ts +28 -0
  152. package/dist/lib/browser/caller-identity.js +156 -0
  153. package/dist/lib/browser/cdp.js +1 -1
  154. package/dist/lib/browser/drivers/ssh.d.ts +1 -1
  155. package/dist/lib/browser/drivers/ssh.js +2 -2
  156. package/dist/lib/browser/hygiene.d.ts +10 -2
  157. package/dist/lib/browser/hygiene.js +7 -4
  158. package/dist/lib/browser/ipc.d.ts +22 -2
  159. package/dist/lib/browser/ipc.js +185 -21
  160. package/dist/lib/browser/profiles.d.ts +67 -3
  161. package/dist/lib/browser/profiles.js +129 -7
  162. package/dist/lib/browser/remote-control.d.ts +2 -2
  163. package/dist/lib/browser/remote-control.js +3 -3
  164. package/dist/lib/browser/runtime-state.d.ts +79 -0
  165. package/dist/lib/browser/runtime-state.js +119 -1
  166. package/dist/lib/browser/service.d.ts +113 -1
  167. package/dist/lib/browser/service.js +454 -40
  168. package/dist/lib/browser/sessions-list.d.ts +2 -1
  169. package/dist/lib/browser/sessions-list.js +4 -13
  170. package/dist/lib/browser/types.d.ts +18 -0
  171. package/dist/lib/budget/config.js +1 -1
  172. package/dist/lib/budget/ledger.js +1 -1
  173. package/dist/lib/byok-usage.js +1 -1
  174. package/dist/lib/capabilities.js +3 -15
  175. package/dist/lib/catchup.d.ts +1 -1
  176. package/dist/lib/catchup.js +1 -1
  177. package/dist/lib/cloud/dispatch.js +1 -1
  178. package/dist/lib/cloud/host.d.ts +3 -3
  179. package/dist/lib/cloud/host.js +5 -5
  180. package/dist/lib/cloud/rush.d.ts +9 -21
  181. package/dist/lib/cloud/rush.js +33 -120
  182. package/dist/lib/cloud/types.d.ts +2 -2
  183. package/dist/lib/commands.js +3 -13
  184. package/dist/lib/computer/actions.d.ts +36 -0
  185. package/dist/lib/computer/actions.js +162 -0
  186. package/dist/lib/computer/dispatch.d.ts +2 -2
  187. package/dist/lib/computer/dispatch.js +2 -2
  188. package/dist/lib/computer/sessions-list.d.ts +3 -3
  189. package/dist/lib/computer/sessions-list.js +2 -2
  190. package/dist/lib/config-keys.d.ts +12 -3
  191. package/dist/lib/config-keys.js +29 -6
  192. package/dist/lib/config-machine-keys.d.ts +4 -2
  193. package/dist/lib/config-machine-keys.js +6 -2
  194. package/dist/lib/crabbox/lease.js +9 -1
  195. package/dist/lib/crabbox/runtimes.d.ts +32 -7
  196. package/dist/lib/crabbox/runtimes.js +72 -30
  197. package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
  198. package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
  199. package/dist/lib/daemon-services.d.ts +1 -1
  200. package/dist/lib/daemon-services.js +5 -0
  201. package/dist/lib/daemon-ticks.d.ts +25 -0
  202. package/dist/lib/daemon-ticks.js +31 -1
  203. package/dist/lib/daemon-webhooks.d.ts +102 -0
  204. package/dist/lib/daemon-webhooks.js +210 -0
  205. package/dist/lib/device-config.d.ts +116 -72
  206. package/dist/lib/device-config.js +366 -132
  207. package/dist/lib/devices/config-migration.d.ts +29 -34
  208. package/dist/lib/devices/config-migration.js +209 -130
  209. package/dist/lib/devices/connect.d.ts +2 -2
  210. package/dist/lib/devices/connect.js +2 -2
  211. package/dist/lib/devices/discovery-policy.d.ts +30 -0
  212. package/dist/lib/devices/discovery-policy.js +101 -0
  213. package/dist/lib/devices/fleet-inventory.js +8 -3
  214. package/dist/lib/devices/harness-inventory.d.ts +1 -1
  215. package/dist/lib/devices/harness-inventory.js +12 -3
  216. package/dist/lib/devices/known-hosts.js +1 -1
  217. package/dist/lib/devices/pool.d.ts +61 -0
  218. package/dist/lib/devices/pool.js +83 -0
  219. package/dist/lib/devices/registry.d.ts +1 -1
  220. package/dist/lib/devices/registry.js +1 -1
  221. package/dist/lib/devices/resolve-profile.d.ts +2 -2
  222. package/dist/lib/devices/resolve-profile.js +2 -2
  223. package/dist/lib/devices/resolve-target.d.ts +1 -1
  224. package/dist/lib/devices/resolve-target.js +4 -4
  225. package/dist/lib/devices/self-host.d.ts +1 -1
  226. package/dist/lib/devices/self-host.js +3 -3
  227. package/dist/lib/devices/ssh-config.d.ts +1 -1
  228. package/dist/lib/devices/stats-cache.js +1 -1
  229. package/dist/lib/devices/sync.d.ts +3 -1
  230. package/dist/lib/devices/sync.js +3 -3
  231. package/dist/lib/doctor-diff.js +4 -4
  232. package/dist/lib/drift-sync.js +2 -2
  233. package/dist/lib/drift.js +2 -2
  234. package/dist/lib/event-families.d.ts +1 -1
  235. package/dist/lib/event-stream.d.ts +1 -1
  236. package/dist/lib/event-stream.js +2 -2
  237. package/dist/lib/events-ingest.js +2 -2
  238. package/dist/lib/exec.d.ts +8 -5
  239. package/dist/lib/exec.js +19 -13
  240. package/dist/lib/factory/snapshot.d.ts +1 -1
  241. package/dist/lib/factory/snapshot.js +1 -1
  242. package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
  243. package/dist/lib/{activity.js → feed/activity.js} +7 -7
  244. package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
  245. package/dist/lib/{events.js → feed/events.js} +5 -5
  246. package/dist/lib/{feed.js → feed/feed.js} +4 -4
  247. package/dist/lib/feed-outcome.d.ts +1 -1
  248. package/dist/lib/feed-policy.d.ts +1 -1
  249. package/dist/lib/feed-policy.js +1 -1
  250. package/dist/lib/feed-post.d.ts +1 -1
  251. package/dist/lib/feed-post.js +1 -1
  252. package/dist/lib/feed-ranking.d.ts +1 -1
  253. package/dist/lib/fleet/apply.d.ts +0 -6
  254. package/dist/lib/fleet/apply.js +18 -45
  255. package/dist/lib/fleet/auth-sync.d.ts +16 -35
  256. package/dist/lib/fleet/auth-sync.js +16 -75
  257. package/dist/lib/fleet/capture.js +8 -6
  258. package/dist/lib/fleet/manifest.js +23 -11
  259. package/dist/lib/fleet/types.d.ts +19 -7
  260. package/dist/lib/fleet-cache.d.ts +1 -1
  261. package/dist/lib/fleet-cache.js +1 -1
  262. package/dist/lib/format.d.ts +19 -0
  263. package/dist/lib/format.js +44 -1
  264. package/dist/lib/friction-heuristics.d.ts +1 -1
  265. package/dist/lib/git.d.ts +24 -1
  266. package/dist/lib/git.js +82 -38
  267. package/dist/lib/heal.js +3 -3
  268. package/dist/lib/hooks.d.ts +18 -0
  269. package/dist/lib/hooks.js +113 -1
  270. package/dist/lib/hosts/credentials.d.ts +30 -10
  271. package/dist/lib/hosts/credentials.js +38 -26
  272. package/dist/lib/hosts/dispatch.d.ts +3 -3
  273. package/dist/lib/hosts/dispatch.js +3 -3
  274. package/dist/lib/hosts/option.d.ts +3 -3
  275. package/dist/lib/hosts/option.js +7 -8
  276. package/dist/lib/hosts/passthrough.d.ts +17 -17
  277. package/dist/lib/hosts/passthrough.js +67 -50
  278. package/dist/lib/hosts/providers/devices.d.ts +1 -1
  279. package/dist/lib/hosts/providers/devices.js +1 -1
  280. package/dist/lib/hosts/reconcile.d.ts +1 -1
  281. package/dist/lib/hosts/reconcile.js +1 -1
  282. package/dist/lib/hosts/reconnect.d.ts +1 -1
  283. package/dist/lib/hosts/reconnect.js +2 -2
  284. package/dist/lib/hosts/registry.d.ts +5 -5
  285. package/dist/lib/hosts/registry.js +5 -5
  286. package/dist/lib/hosts/remote-cmd.d.ts +10 -10
  287. package/dist/lib/hosts/remote-cmd.js +25 -18
  288. package/dist/lib/hosts/remote-os.d.ts +4 -4
  289. package/dist/lib/hosts/remote-os.js +4 -4
  290. package/dist/lib/hosts/remote-session-id.d.ts +2 -2
  291. package/dist/lib/hosts/remote-session-id.js +2 -2
  292. package/dist/lib/hosts/routing-flag.d.ts +3 -3
  293. package/dist/lib/hosts/routing-flag.js +4 -5
  294. package/dist/lib/hosts/run-target.d.ts +4 -4
  295. package/dist/lib/hosts/run-target.js +4 -4
  296. package/dist/lib/hosts/session-index.d.ts +2 -2
  297. package/dist/lib/hosts/session-index.js +1 -1
  298. package/dist/lib/hosts/session-marker.d.ts +1 -1
  299. package/dist/lib/hosts/session-marker.js +1 -1
  300. package/dist/lib/hosts/types.d.ts +2 -2
  301. package/dist/lib/hosts/types.js +2 -2
  302. package/dist/lib/import.js +1 -1
  303. package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +49 -1
  304. package/dist/lib/{migrate.js → installations/migrate.js} +265 -38
  305. package/dist/lib/installations/resolve.js +1 -1
  306. package/dist/lib/installations/strategies.js +1 -1
  307. package/dist/lib/installations/update.js +2 -2
  308. package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
  309. package/dist/lib/{versions.js → installations/versions.js} +51 -31
  310. package/dist/lib/isolation-boundary-report.js +1 -1
  311. package/dist/lib/linear-projects.d.ts +28 -0
  312. package/dist/lib/linear-projects.js +30 -0
  313. package/dist/lib/loop.js +1 -1
  314. package/dist/lib/mailbox-gc.js +1 -1
  315. package/dist/lib/mailbox.js +1 -1
  316. package/dist/lib/mcp-registry.d.ts +62 -0
  317. package/dist/lib/mcp-registry.js +177 -0
  318. package/dist/lib/mcp.d.ts +5 -0
  319. package/dist/lib/mcp.js +124 -307
  320. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  321. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  322. package/dist/lib/menubar/install-menubar.d.ts +7 -0
  323. package/dist/lib/menubar/install-menubar.js +24 -6
  324. package/dist/lib/menubar/snapshot.d.ts +7 -0
  325. package/dist/lib/menubar/snapshot.js +8 -6
  326. package/dist/lib/models.js +1 -1
  327. package/dist/lib/monitors/config.d.ts +12 -0
  328. package/dist/lib/monitors/config.js +3 -0
  329. package/dist/lib/monitors/dispatch.js +26 -5
  330. package/dist/lib/monitors/engine.js +10 -0
  331. package/dist/lib/monitors/sources/webhook.d.ts +1 -1
  332. package/dist/lib/monitors/state.d.ts +42 -0
  333. package/dist/lib/monitors/state.js +30 -0
  334. package/dist/lib/notify.d.ts +1 -1
  335. package/dist/lib/observe-aliases.d.ts +2 -2
  336. package/dist/lib/observe-aliases.js +2 -11
  337. package/dist/lib/output/git-output.js +2 -2
  338. package/dist/lib/overdue.d.ts +1 -1
  339. package/dist/lib/overdue.js +1 -1
  340. package/dist/lib/permissions-registry.d.ts +65 -0
  341. package/dist/lib/permissions-registry.js +599 -0
  342. package/dist/lib/permissions.d.ts +24 -13
  343. package/dist/lib/permissions.js +52 -271
  344. package/dist/lib/picker.d.ts +16 -0
  345. package/dist/lib/picker.js +33 -3
  346. package/dist/lib/placement.d.ts +1 -1
  347. package/dist/lib/placement.js +4 -4
  348. package/dist/lib/platform/paths.d.ts +8 -0
  349. package/dist/lib/platform/paths.js +11 -0
  350. package/dist/lib/platform/posixpath.js +3 -3
  351. package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
  352. package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
  353. package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
  354. package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
  355. package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
  356. package/dist/lib/{skills.js → plugins/skills.js} +7 -7
  357. package/dist/lib/pricing/cost.d.ts +1 -1
  358. package/dist/lib/pricing/cost.js +1 -1
  359. package/dist/lib/profiles-presets.d.ts +1 -1
  360. package/dist/lib/profiles-presets.js +1 -1
  361. package/dist/lib/profiles.js +2 -2
  362. package/dist/lib/project-import.js +4 -1
  363. package/dist/lib/project-launch.d.ts +1 -1
  364. package/dist/lib/project-launch.js +3 -3
  365. package/dist/lib/project-pull.d.ts +128 -0
  366. package/dist/lib/project-pull.js +384 -0
  367. package/dist/lib/project-root.d.ts +2 -2
  368. package/dist/lib/project-root.js +2 -2
  369. package/dist/lib/project-status.js +1 -1
  370. package/dist/lib/projects.d.ts +23 -0
  371. package/dist/lib/projects.js +29 -6
  372. package/dist/lib/refresh.d.ts +12 -1
  373. package/dist/lib/refresh.js +16 -9
  374. package/dist/lib/registry.d.ts +9 -2
  375. package/dist/lib/registry.js +11 -4
  376. package/dist/lib/resources.d.ts +2 -2
  377. package/dist/lib/resources.js +2 -2
  378. package/dist/lib/routers.d.ts +81 -0
  379. package/dist/lib/routers.js +153 -0
  380. package/dist/lib/routine-context.d.ts +1 -0
  381. package/dist/lib/routine-context.js +7 -2
  382. package/dist/lib/routine-notify-owner.d.ts +1 -1
  383. package/dist/lib/routine-notify.d.ts +1 -1
  384. package/dist/lib/routine-notify.js +1 -1
  385. package/dist/lib/routine-process-cleanup.d.ts +1 -1
  386. package/dist/lib/routine-readiness.d.ts +1 -1
  387. package/dist/lib/routine-readiness.js +11 -4
  388. package/dist/lib/routines-placement.d.ts +12 -2
  389. package/dist/lib/routines-placement.js +20 -3
  390. package/dist/lib/routines-project.d.ts +1 -1
  391. package/dist/lib/routines-project.js +1 -1
  392. package/dist/lib/rules/compile.d.ts +1 -0
  393. package/dist/lib/rules/compile.js +10 -2
  394. package/dist/lib/rules/rules.js +1 -1
  395. package/dist/lib/run-notify.js +1 -1
  396. package/dist/lib/runner.d.ts +80 -2
  397. package/dist/lib/runner.js +241 -62
  398. package/dist/lib/sandbox.d.ts +1 -1
  399. package/dist/lib/scheduler.d.ts +1 -1
  400. package/dist/lib/scheduler.js +1 -1
  401. package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
  402. package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
  403. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  404. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  405. package/dist/lib/secrets/agent.js +2 -2
  406. package/dist/lib/secrets/audit.js +1 -1
  407. package/dist/lib/secrets/bundles.d.ts +3 -3
  408. package/dist/lib/secrets/bundles.js +7 -7
  409. package/dist/lib/secrets/index.js +1 -1
  410. package/dist/lib/secrets/list-filter.d.ts +1 -1
  411. package/dist/lib/secrets/list-filter.js +2 -2
  412. package/dist/lib/secrets/push.d.ts +1 -1
  413. package/dist/lib/secrets/push.js +10 -12
  414. package/dist/lib/secrets/remote.d.ts +12 -10
  415. package/dist/lib/secrets/remote.js +21 -14
  416. package/dist/lib/secrets/vault.js +2 -2
  417. package/dist/lib/self-heal/checks/shadowing.js +1 -1
  418. package/dist/lib/self-heal/checks/shims.js +1 -1
  419. package/dist/lib/self-update.d.ts +39 -4
  420. package/dist/lib/self-update.js +78 -25
  421. package/dist/lib/serve/control.d.ts +1 -1
  422. package/dist/lib/serve/control.js +4 -4
  423. package/dist/lib/serve/data.d.ts +1 -1
  424. package/dist/lib/serve/data.js +1 -1
  425. package/dist/lib/serve/stream.js +1 -1
  426. package/dist/lib/service-manifest.d.ts +29 -0
  427. package/dist/lib/service-manifest.js +80 -0
  428. package/dist/lib/session/active.d.ts +59 -7
  429. package/dist/lib/session/active.js +158 -17
  430. package/dist/lib/session/bash-command.js +1 -1
  431. package/dist/lib/session/claude-accounts.d.ts +1 -1
  432. package/dist/lib/session/claude-accounts.js +1 -1
  433. package/dist/lib/session/db.d.ts +10 -2
  434. package/dist/lib/session/db.js +25 -6
  435. package/dist/lib/session/discover.d.ts +77 -0
  436. package/dist/lib/session/discover.js +130 -25
  437. package/dist/lib/session/fork.js +1 -1
  438. package/dist/lib/session/inject.d.ts +1 -1
  439. package/dist/lib/session/insights.d.ts +1 -1
  440. package/dist/lib/session/insights.js +1 -1
  441. package/dist/lib/session/live-metadata.d.ts +15 -0
  442. package/dist/lib/session/live-metadata.js +76 -0
  443. package/dist/lib/session/migrate-targets.d.ts +1 -1
  444. package/dist/lib/session/recovery.d.ts +1 -1
  445. package/dist/lib/session/recovery.js +2 -2
  446. package/dist/lib/session/remote-active.d.ts +10 -1
  447. package/dist/lib/session/remote-active.js +8 -3
  448. package/dist/lib/session/remote-bundle.d.ts +1 -1
  449. package/dist/lib/session/remote-bundle.js +2 -2
  450. package/dist/lib/session/remote-list.d.ts +15 -4
  451. package/dist/lib/session/remote-list.js +40 -3
  452. package/dist/lib/session/remote.d.ts +5 -5
  453. package/dist/lib/session/remote.js +13 -17
  454. package/dist/lib/session/resume-command.d.ts +3 -2
  455. package/dist/lib/session/resume-command.js +4 -3
  456. package/dist/lib/session/resume-owner.d.ts +3 -3
  457. package/dist/lib/session/resume-owner.js +3 -3
  458. package/dist/lib/session/session-cache.d.ts +12 -0
  459. package/dist/lib/session/session-cache.js +2 -0
  460. package/dist/lib/session/shell-programs.js +1 -1
  461. package/dist/lib/session/state.js +5 -5
  462. package/dist/lib/session/team-filter.d.ts +1 -1
  463. package/dist/lib/session/team-filter.js +1 -1
  464. package/dist/lib/session/types.d.ts +3 -3
  465. package/dist/lib/session/width.d.ts +2 -2
  466. package/dist/lib/session/width.js +2 -2
  467. package/dist/lib/share/delete.d.ts +21 -0
  468. package/dist/lib/share/delete.js +42 -0
  469. package/dist/lib/share/publish.d.ts +82 -0
  470. package/dist/lib/share/publish.js +170 -18
  471. package/dist/lib/share/worker-template.js +172 -9
  472. package/dist/lib/shims.js +35 -7
  473. package/dist/lib/smart-launch.d.ts +36 -6
  474. package/dist/lib/smart-launch.js +65 -8
  475. package/dist/lib/snapshot.d.ts +4 -4
  476. package/dist/lib/snapshot.js +2 -2
  477. package/dist/lib/ssh-exec.d.ts +1 -1
  478. package/dist/lib/ssh-exec.js +2 -2
  479. package/dist/lib/ssh-tunnel.d.ts +10 -10
  480. package/dist/lib/ssh-tunnel.js +12 -12
  481. package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
  482. package/dist/lib/staleness/checkers/hooks.js +1 -1
  483. package/dist/lib/staleness/detectors/permissions.js +0 -23
  484. package/dist/lib/staleness/detectors/plugins.js +1 -1
  485. package/dist/lib/staleness/fingerprint.js +1 -1
  486. package/dist/lib/staleness/layers.d.ts +1 -1
  487. package/dist/lib/staleness/layers.js +1 -1
  488. package/dist/lib/staleness/writers/mcp.js +3 -1
  489. package/dist/lib/staleness/writers/plugins.js +1 -1
  490. package/dist/lib/staleness/writers/types.d.ts +8 -0
  491. package/dist/lib/startup/command-registry.d.ts +5 -147
  492. package/dist/lib/startup/command-registry.js +38 -303
  493. package/dist/lib/startup/dev-build.d.ts +0 -21
  494. package/dist/lib/startup/dev-build.js +29 -8
  495. package/dist/lib/state.d.ts +19 -1
  496. package/dist/lib/state.js +120 -51
  497. package/dist/lib/subagents.js +1 -1
  498. package/dist/lib/sync-status.js +1 -1
  499. package/dist/lib/sync-umbrella.d.ts +6 -1
  500. package/dist/lib/sync-umbrella.js +9 -4
  501. package/dist/lib/teams/agents.js +2 -2
  502. package/dist/lib/teams/registry.js +1 -1
  503. package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
  504. package/dist/lib/terminal/engine.js +1 -1
  505. package/dist/lib/terminal/index.d.ts +4 -0
  506. package/dist/lib/terminal/index.js +3 -0
  507. package/dist/lib/terminal/inject.d.ts +2 -2
  508. package/dist/lib/terminal/inject.js +2 -2
  509. package/dist/lib/terminal/transport.js +1 -1
  510. package/dist/lib/tmux/index.d.ts +1 -1
  511. package/dist/lib/tmux/index.js +1 -1
  512. package/dist/lib/tmux/session.d.ts +21 -5
  513. package/dist/lib/tmux/session.js +76 -22
  514. package/dist/lib/triggers/handlers.d.ts +1 -1
  515. package/dist/lib/triggers/handlers.js +2 -2
  516. package/dist/lib/triggers/webhook.d.ts +36 -2
  517. package/dist/lib/triggers/webhook.js +97 -42
  518. package/dist/lib/types.d.ts +18 -6
  519. package/dist/lib/usage-fleet.d.ts +1 -1
  520. package/dist/lib/usage-fleet.js +1 -1
  521. package/dist/lib/usage-refresh.d.ts +1 -1
  522. package/dist/lib/usage-refresh.js +3 -3
  523. package/dist/lib/version-duplicates.js +2 -2
  524. package/dist/lib/view-types.d.ts +56 -0
  525. package/dist/lib/view-types.js +1 -0
  526. package/dist/lib/watchdog/rotate.d.ts +2 -2
  527. package/dist/lib/watchdog/rotate.js +3 -3
  528. package/dist/lib/watchdog/runner.d.ts +2 -3
  529. package/dist/lib/watchdog/runner.js +3 -4
  530. package/dist/lib/workflows.js +1 -1
  531. package/package.json +2 -1
  532. package/scripts/postinstall.js +2 -2
  533. package/dist/commands/bench.d.ts +0 -2
  534. package/dist/commands/bench.js +0 -101
  535. package/dist/commands/cp.d.ts +0 -84
  536. package/dist/commands/cp.js +0 -231
  537. package/dist/commands/login.d.ts +0 -2
  538. package/dist/lib/resources/commands.d.ts +0 -46
  539. package/dist/lib/resources/commands.js +0 -211
  540. package/dist/lib/resources/hooks.d.ts +0 -16
  541. package/dist/lib/resources/hooks.js +0 -153
  542. package/dist/lib/resources/mcp.d.ts +0 -34
  543. package/dist/lib/resources/mcp.js +0 -250
  544. package/dist/lib/resources/memory.d.ts +0 -15
  545. package/dist/lib/resources/memory.js +0 -46
  546. package/dist/lib/resources/permissions.d.ts +0 -13
  547. package/dist/lib/resources/permissions.js +0 -202
  548. package/dist/lib/resources/rules.d.ts +0 -46
  549. package/dist/lib/resources/rules.js +0 -179
  550. package/dist/lib/resources/skills.d.ts +0 -37
  551. package/dist/lib/resources/skills.js +0 -247
  552. package/dist/lib/resources/subagents.d.ts +0 -46
  553. package/dist/lib/resources/subagents.js +0 -202
  554. /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
@@ -2,10 +2,11 @@
2
2
  * `agents setup mine` — interactive wizard to white-label the CLI under your own
3
3
  * name. Pick a name, choose which features to turn off, and get a personally-
4
4
  * named binary (e.g. `jack`) that runs every agents verb as yours. Delegates the
5
- * actual minting to `initBrand` (see mine.ts); the `agents mine` group manages
6
- * brands afterward.
5
+ * actual minting to `initBrand` (see mine.ts). Manage verbs (init/list/toggle/
6
+ * remove) live under the same `setup mine` command.
7
7
  *
8
8
  * Idempotent: re-running for an existing brand offers to re-mint it.
9
+ * Bare `agents setup mine` (no subcommand) runs the wizard.
9
10
  */
10
11
  import type { Command } from 'commander';
11
12
  /**
@@ -14,5 +15,8 @@ import type { Command } from 'commander';
14
15
  * relies on that.
15
16
  */
16
17
  export declare function runMineWizard(): Promise<boolean>;
17
- /** Register `agents setup mine` under the parent `setup` command. */
18
+ /**
19
+ * Register `agents setup mine` under the parent `setup` command.
20
+ * Bare invocation runs the wizard; init/list/toggle/remove manage brands.
21
+ */
18
22
  export declare function registerSetupMineCommand(setupCmd: Command): void;
@@ -2,20 +2,21 @@
2
2
  * `agents setup mine` — interactive wizard to white-label the CLI under your own
3
3
  * name. Pick a name, choose which features to turn off, and get a personally-
4
4
  * named binary (e.g. `jack`) that runs every agents verb as yours. Delegates the
5
- * actual minting to `initBrand` (see mine.ts); the `agents mine` group manages
6
- * brands afterward.
5
+ * actual minting to `initBrand` (see mine.ts). Manage verbs (init/list/toggle/
6
+ * remove) live under the same `setup mine` command.
7
7
  *
8
8
  * Idempotent: re-running for an existing brand offers to re-mint it.
9
+ * Bare `agents setup mine` (no subcommand) runs the wizard.
9
10
  */
10
11
  import chalk from 'chalk';
11
- import { initBrand } from './mine.js';
12
+ import { initBrand, registerMineManageCommands } from './mine.js';
12
13
  import { validateBrandName, getBrandConfig } from '../lib/brand.js';
13
14
  import { isShimsInPath } from '../lib/shims.js';
14
15
  import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
15
16
  /**
16
17
  * Optional/heavier top-level commands a brand commonly turns off. Kept short so
17
18
  * the checkbox is scannable — anything can still be toggled later with
18
- * `agents mine toggle <name> --disable <cmd>`.
19
+ * `agents setup mine toggle <name> --disable <cmd>`.
19
20
  */
20
21
  const DISABLEABLE_FEATURES = [
21
22
  { name: 'teams', hint: 'coordinate multiple agents on shared work' },
@@ -34,7 +35,7 @@ const DISABLEABLE_FEATURES = [
34
35
  export async function runMineWizard() {
35
36
  if (!isInteractiveTerminal()) {
36
37
  console.log(chalk.dim('Non-interactive shell. Create a brand directly, e.g.:\n') +
37
- chalk.cyan(' agents mine init jack --disable teams cloud'));
38
+ chalk.cyan(' agents setup mine init jack --disable teams cloud'));
38
39
  return false;
39
40
  }
40
41
  const { input, checkbox, confirm } = await import('@inquirer/prompts');
@@ -79,14 +80,17 @@ function printNextSteps(name, pathWarning) {
79
80
  console.log(chalk.bold('\nTry it:'));
80
81
  console.log(' ' + chalk.cyan(`${name} --help`) + chalk.dim(` # your CLI, your name`));
81
82
  console.log(' ' + chalk.cyan(`${name} run claude "hello"`));
82
- console.log(chalk.dim(` Manage it later: agents mine toggle ${name} --disable <cmd> · agents mine list`));
83
+ console.log(chalk.dim(` Manage it later: agents setup mine toggle ${name} --disable <cmd> · agents setup mine list`));
83
84
  if (pathWarning) {
84
85
  console.log(chalk.yellow(`\n note: the shims dir isn't on your PATH yet — run 'agents setup' or open a new shell.`));
85
86
  }
86
87
  }
87
- /** Register `agents setup mine` under the parent `setup` command. */
88
+ /**
89
+ * Register `agents setup mine` under the parent `setup` command.
90
+ * Bare invocation runs the wizard; init/list/toggle/remove manage brands.
91
+ */
88
92
  export function registerSetupMineCommand(setupCmd) {
89
- setupCmd
93
+ const mineCmd = setupCmd
90
94
  .command('mine')
91
95
  .description('White-label the CLI — mint your own personally-named binary (e.g. `jack`).')
92
96
  .action(async () => {
@@ -102,4 +106,5 @@ export function registerSetupMineCommand(setupCmd) {
102
106
  process.exitCode = 1;
103
107
  }
104
108
  });
109
+ registerMineManageCommands(mineCmd);
105
110
  }
@@ -69,7 +69,7 @@ function printBackendNotes(backend) {
69
69
  console.log(chalk.gray('backend: file — encrypted at rest; headless reads need no passphrase by default, via a machine-local key at ~/.agents/.secrets-key/passphrase.'));
70
70
  }
71
71
  else {
72
- console.log(chalk.gray('backend: vault — synced ~/.agents/vault.age storage; unlock it with agents login.'));
72
+ console.log(chalk.gray('backend: vault — synced ~/.agents/vault.age storage; unlock it with `agents secrets vault unlock`.'));
73
73
  }
74
74
  }
75
75
  function runAgentsSubcommand(args) {
@@ -138,7 +138,7 @@ async function resolveInteractiveChoices(opts) {
138
138
  choices: [
139
139
  { name: 'keychain — local OS keychain; reads may ask for Touch ID/device password', value: 'keychain' },
140
140
  { name: 'file — passphrase-encrypted file store for headless machines', value: 'file' },
141
- { name: 'vault — synced ~/.agents/vault.age file; requires agents login', value: 'vault' },
141
+ { name: 'vault — synced ~/.agents/vault.age file; requires `agents secrets vault unlock`', value: 'vault' },
142
142
  ],
143
143
  });
144
144
  const policy = opts.policy ? parsePolicy(opts.policy) : await select({
@@ -10,7 +10,7 @@ export async function runWatchdogSetupWizard() {
10
10
  const devices = [...new Set([...Object.keys(registry), machineId()].map(normalizeHost))].sort();
11
11
  const enabled = new Set(devices.filter((device) => getConfigValue('watchdog.enabled', { device }).value === true));
12
12
  if (!process.stdin.isTTY || !process.stdout.isTTY) {
13
- requireInteractiveSelection('watchdog devices', ['agents watchdog on', 'agents watchdog on --host <device>']);
13
+ requireInteractiveSelection('watchdog devices', ['agents watchdog on', 'agents watchdog on --device <device>']);
14
14
  }
15
15
  try {
16
16
  const { checkbox } = await import('@inquirer/prompts');
@@ -25,7 +25,7 @@ export async function runWatchdogSetupWizard() {
25
25
  setConfigValue('watchdog.enabled', on);
26
26
  continue;
27
27
  }
28
- const launch = getCliLaunch(['watchdog', on ? 'on' : 'off', '--host', device]);
28
+ const launch = getCliLaunch(['watchdog', on ? 'on' : 'off', '--device', device]);
29
29
  const result = spawnSync(launch.command, launch.args, { stdio: 'inherit', env: process.env });
30
30
  if ((result.status ?? 1) !== 0)
31
31
  throw new Error(`Could not configure watchdog on ${device}`);
@@ -15,7 +15,7 @@ import { getAgentsDir, getVersionsDir, ensureAgentsDir } from '../lib/state.js';
15
15
  import { isGitRepo, cloneIntoExisting, pullRepo } from '../lib/git.js';
16
16
  import { isPromptCancelled, isInteractiveTerminal } from './utils.js';
17
17
  import { AGENTS, agentConfigDirName, getUnmanagedAgentInstalls, countSessionFiles, agentLabel } from '../lib/agents.js';
18
- import { setGlobalDefault } from '../lib/versions.js';
18
+ import { setGlobalDefault } from '../lib/installations/versions.js';
19
19
  import { ensureShimCurrent, switchHomeFileSymlinks, isShimsInPath, addShimsToPath, getPathSetupInstructions, assertIsolationBoundary } from '../lib/shims.js';
20
20
  import { setHelpSections } from '../lib/help.js';
21
21
  import { registerSetupBrowserCommand, runBrowserWizard } from './setup-browser.js';
@@ -137,7 +137,7 @@ export async function runSetup(program, options = {}) {
137
137
  : (await import('../lib/device-config.js')).isDaemonEnabled();
138
138
  if (enabled) {
139
139
  const start = options.startDaemonFn
140
- ?? (await import('../lib/daemon.js')).startDaemon;
140
+ ?? (await import('../lib/daemon/daemon.js')).startDaemon;
141
141
  const started = start();
142
142
  if (started.method !== 'already-running' && started.pid) {
143
143
  console.log(chalk.gray(`Started the always-on agents daemon (pid ${started.pid}).`));
@@ -150,6 +150,11 @@ export async function runSetup(program, options = {}) {
150
150
  // resolve to ok:false), so this can never block setup.
151
151
  const { runDeviceSync } = await import('../lib/devices/sync.js');
152
152
  const dev = await runDeviceSync({ soft: true });
153
+ if (dev.ok) {
154
+ const { setDeviceDiscoveryStatus } = await import('../lib/devices/discovery-policy.js');
155
+ for (const name of dev.syncedNames)
156
+ setDeviceDiscoveryStatus(name, 'approved');
157
+ }
153
158
  if (dev.ok && dev.synced > 0) {
154
159
  console.log(chalk.gray(`Discovered ${dev.synced} device${dev.synced === 1 ? '' : 's'} on your tailnet (agents devices list).`));
155
160
  }
@@ -21,6 +21,24 @@ export interface ShareListItem {
21
21
  publishedAt: string;
22
22
  /** ISO auto-expire timestamp, or null for a permanent share. */
23
23
  expiresAt: string | null;
24
+ /** Human display title (explicit `--label` or auto-derived), or null for a
25
+ * share published before this field existed. */
26
+ label: string | null;
27
+ /** Harness/agent name that published this (`AGENTS_AGENT_NAME`), or null. */
28
+ agent: string | null;
29
+ /** Session id that published this, or null. */
30
+ session: string | null;
31
+ /** Hostname the publish ran from, or null. */
32
+ host: string | null;
33
+ /** git repo name at publish time, or null (published outside a git repo, or
34
+ * before this field existed). */
35
+ repo: string | null;
36
+ /** Count of retained prior versions under this slug (see `share revisions`). */
37
+ revisionCount: number;
38
+ /** Arbitrary `--meta key=value` entries attached at publish time (RUSH-2683)
39
+ * — everything that isn't a reserved provenance/label key. `{}` when none
40
+ * were set, or when the deployed Worker predates this field. */
41
+ meta: Record<string, string>;
24
42
  }
25
43
  export interface ShareListResult {
26
44
  /** The namespace listed. */
@@ -48,11 +66,58 @@ export declare function runShareList(opts?: {
48
66
  githubUser?: string;
49
67
  config?: ShareConfig;
50
68
  fetchListing?: ListingFetchFn;
69
+ /** Only shares published by this agent/harness (case-insensitive, exact). */
70
+ agent?: string;
71
+ /** Only shares published from this session id (exact). */
72
+ session?: string;
73
+ /** Only shares whose label contains this text (case-insensitive substring). */
74
+ label?: string;
51
75
  }): Promise<ShareListResult>;
52
76
  export declare function formatShareList(result: ShareListResult, json?: boolean): string;
77
+ /** One retained prior version of a slug, as reported by the Worker's
78
+ * `?revisions=json` route. */
79
+ export interface ShareRevisionItem {
80
+ /** R2 object key, `<user>/<slug>/rev-<ts>-<rand>`. */
81
+ key: string;
82
+ url: string;
83
+ size: number;
84
+ contentType: string | null;
85
+ /** ISO timestamp this version was replaced (when the copy was made). */
86
+ uploadedAt: string;
87
+ expiresAt: string | null;
88
+ label: string | null;
89
+ agent: string | null;
90
+ session: string | null;
91
+ host: string | null;
92
+ repo: string | null;
93
+ /** Arbitrary `--meta key=value` entries attached at publish time (RUSH-2683)
94
+ * — everything that isn't a reserved provenance/label key. `{}` when none
95
+ * were set, or when the deployed Worker predates this field. */
96
+ meta: Record<string, string>;
97
+ }
98
+ export interface ShareRevisionsResult {
99
+ /** The canonical `<user>/<slug>` key these are revisions of. */
100
+ key: string;
101
+ count: number;
102
+ revisions: ShareRevisionItem[];
103
+ }
104
+ /** Parse the Worker's `?revisions=json` payload, failing loud (with the same
105
+ * outdated-template hint as {@link parseShareListing}) on an unexpected shape. */
106
+ export declare function parseShareRevisions(key: string, body: string): ShareRevisionsResult;
107
+ /** Fetch and parse the retained prior versions of one published slug. `target`
108
+ * accepts the same three forms as `agents unshare` (a full URL, `<user>/<slug>`,
109
+ * or a bare slug resolved against the caller's own namespace) — reuses
110
+ * {@link resolveDeleteTarget} rather than re-deriving the key. */
111
+ export declare function runShareRevisions(target: string, opts?: {
112
+ githubUser?: string;
113
+ config?: ShareConfig;
114
+ fetchListing?: ListingFetchFn;
115
+ }): Promise<ShareRevisionsResult>;
116
+ export declare function formatShareRevisions(result: ShareRevisionsResult, json?: boolean): string;
53
117
  export declare function formatShareDeleteResult(result: DeleteShareResult, json?: boolean): string;
54
118
  interface ShareDeleteCliOpts {
55
119
  keepCover?: boolean;
120
+ keepRevisions?: boolean;
56
121
  ifExists?: boolean;
57
122
  githubUser?: string;
58
123
  json?: boolean;
@@ -5,11 +5,12 @@
5
5
  // provisioning door lives beside it at `agents artifacts setup`
6
6
  // (commands/artifacts-setup.ts), which calls `runShareProvision` below.
7
7
  import { existsSync } from 'node:fs';
8
+ import { formatBytes } from '../lib/format.js';
8
9
  import chalk from 'chalk';
9
10
  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
11
  import { addCustomDomain, configureBucketLifecycle, createBucket, deployWorker, enableWorkersDev, findZoneId, hashWorkerScript, updateWorker, setWorkerSecret, } from '../lib/share/provision.js';
11
- import { publishFile, resolveShareUsername } from '../lib/share/publish.js';
12
- import { deleteShare } from '../lib/share/delete.js';
12
+ import { publishFile, resolveShareUsername, parseMetaEntries } from '../lib/share/publish.js';
13
+ import { deleteShare, resolveDeleteTarget } from '../lib/share/delete.js';
13
14
  import { renderWorkerScript } from '../lib/share/worker-template.js';
14
15
  import { analyticsEnabled } from '../lib/share/analytics.js';
15
16
  import { resolveGitHubUsername } from '../lib/git.js';
@@ -18,6 +19,10 @@ export function formatSharePublishResult(result, json = false) {
18
19
  if (json)
19
20
  return JSON.stringify(result, null, 2);
20
21
  const lines = [chalk.green(result.url)];
22
+ if (result.label) {
23
+ const hint = result.labelSource === 'derived' ? chalk.dim(' (derived — pass --label to set one)') : '';
24
+ lines.push(chalk.dim(` "${result.label}"`) + hint);
25
+ }
21
26
  if (result.coverUrl)
22
27
  lines.push(chalk.dim(` cover ${result.coverUrl}`));
23
28
  if (result.expiresAt)
@@ -47,6 +52,18 @@ async function defaultListingFetch(url) {
47
52
  const res = await fetch(url, { headers: { accept: 'application/json' } });
48
53
  return { status: res.status, contentType: res.headers.get('content-type') ?? '', body: await res.text() };
49
54
  }
55
+ /** Normalize the Worker's `meta` field (arbitrary `--meta key=value` entries,
56
+ * RUSH-2683) into a plain string record — `{}` for a missing/malformed field
57
+ * (a deployed Worker that predates it, or a non-object value), never throws. */
58
+ function parseMetaField(raw) {
59
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
60
+ return {};
61
+ const out = {};
62
+ for (const [k, v] of Object.entries(raw)) {
63
+ out[k] = String(v);
64
+ }
65
+ return out;
66
+ }
50
67
  /** Parse the Worker's listing JSON into a validated result, failing loud (with the
51
68
  * outdated-template hint) on any body that isn't the expected shape — an old Worker
52
69
  * serves the HTML gallery for a non-empty namespace, which must not be silently
@@ -72,6 +89,13 @@ export function parseShareListing(user, body) {
72
89
  contentType: item.contentType == null ? null : String(item.contentType),
73
90
  publishedAt: String(item.publishedAt ?? ''),
74
91
  expiresAt: item.expiresAt == null ? null : String(item.expiresAt),
92
+ label: item.label == null ? null : String(item.label),
93
+ agent: item.agent == null ? null : String(item.agent),
94
+ session: item.session == null ? null : String(item.session),
95
+ host: item.host == null ? null : String(item.host),
96
+ repo: item.repo == null ? null : String(item.repo),
97
+ revisionCount: typeof item.revisionCount === 'number' ? item.revisionCount : 0,
98
+ meta: parseMetaField(item.meta),
75
99
  };
76
100
  });
77
101
  return { user, count: objects.length, objects };
@@ -118,20 +142,38 @@ export async function runShareList(opts = {}) {
118
142
  // the HTML gallery — the deployed template is outdated.
119
143
  throw new Error(OUTDATED_TEMPLATE_HINT);
120
144
  }
121
- return parseShareListing(user, res.body);
145
+ const parsed = parseShareListing(user, res.body);
146
+ return applyShareListFilters(parsed, opts);
147
+ }
148
+ /** Client-side filtering over an already-fetched listing (RUSH-2683) — the
149
+ * Worker has no query surface for this, so it narrows the fetched set instead
150
+ * of a second round trip. `count` reflects the FILTERED set, matching what the
151
+ * caller actually sees. */
152
+ function applyShareListFilters(result, filters) {
153
+ let objects = result.objects;
154
+ if (filters.agent) {
155
+ const needle = filters.agent.toLowerCase();
156
+ objects = objects.filter((o) => (o.agent ?? '').toLowerCase() === needle);
157
+ }
158
+ if (filters.session) {
159
+ objects = objects.filter((o) => o.session === filters.session);
160
+ }
161
+ if (filters.label) {
162
+ const needle = filters.label.toLowerCase();
163
+ objects = objects.filter((o) => (o.label ?? '').toLowerCase().includes(needle));
164
+ }
165
+ return { user: result.user, count: objects.length, objects };
122
166
  }
123
167
  /** 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]}`;
168
+ /** Render an arbitrary `--meta` map as `k=v k2=v2` for a human table row, or
169
+ * undefined when there's nothing to show (RUSH-2683). */
170
+ function formatMetaPairs(meta) {
171
+ if (!meta)
172
+ return undefined;
173
+ const entries = Object.entries(meta);
174
+ if (entries.length === 0)
175
+ return undefined;
176
+ return entries.map(([k, v]) => `${k}=${v}`).join(' ');
135
177
  }
136
178
  export function formatShareList(result, json = false) {
137
179
  if (json)
@@ -143,8 +185,97 @@ export function formatShareList(result, json = false) {
143
185
  chalk.dim(` ${result.count} published ${result.count === 1 ? 'page' : 'pages'}`);
144
186
  const rows = result.objects.map((o) => {
145
187
  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)}`;
188
+ const bits = [when, formatBytes(o.size)];
189
+ if (o.agent)
190
+ bits.push(o.agent);
191
+ if (o.revisionCount > 0)
192
+ bits.push(`${o.revisionCount} ${o.revisionCount === 1 ? 'revision' : 'revisions'}`);
193
+ if (o.expiresAt)
194
+ bits.push(`expires ${o.expiresAt.slice(0, 10)}`);
195
+ const metaPairs = formatMetaPairs(o.meta);
196
+ if (metaPairs)
197
+ bits.push(metaPairs);
198
+ const line = bits.join(' · ');
199
+ const title = o.label ? `${chalk.bold(o.label)}\n ` : '';
200
+ return `${title}${chalk.cyan(o.slug)} ${chalk.dim(line)}\n ${chalk.green(o.url)}`;
201
+ });
202
+ return [header, ...rows].join('\n');
203
+ }
204
+ /** Parse the Worker's `?revisions=json` payload, failing loud (with the same
205
+ * outdated-template hint as {@link parseShareListing}) on an unexpected shape. */
206
+ export function parseShareRevisions(key, body) {
207
+ let data;
208
+ try {
209
+ data = JSON.parse(body);
210
+ }
211
+ catch {
212
+ throw new Error(OUTDATED_TEMPLATE_HINT);
213
+ }
214
+ const revisionsRaw = data?.revisions;
215
+ if (!data || typeof data !== 'object' || !Array.isArray(revisionsRaw)) {
216
+ throw new Error(OUTDATED_TEMPLATE_HINT);
217
+ }
218
+ const revisions = revisionsRaw.map((o) => {
219
+ const item = o;
220
+ return {
221
+ key: String(item.key ?? ''),
222
+ url: String(item.url ?? ''),
223
+ size: typeof item.size === 'number' ? item.size : 0,
224
+ contentType: item.contentType == null ? null : String(item.contentType),
225
+ uploadedAt: String(item.uploadedAt ?? ''),
226
+ expiresAt: item.expiresAt == null ? null : String(item.expiresAt),
227
+ label: item.label == null ? null : String(item.label),
228
+ agent: item.agent == null ? null : String(item.agent),
229
+ session: item.session == null ? null : String(item.session),
230
+ host: item.host == null ? null : String(item.host),
231
+ repo: item.repo == null ? null : String(item.repo),
232
+ meta: parseMetaField(item.meta),
233
+ };
234
+ });
235
+ return { key, count: revisions.length, revisions };
236
+ }
237
+ /** Fetch and parse the retained prior versions of one published slug. `target`
238
+ * accepts the same three forms as `agents unshare` (a full URL, `<user>/<slug>`,
239
+ * or a bare slug resolved against the caller's own namespace) — reuses
240
+ * {@link resolveDeleteTarget} rather than re-deriving the key. */
241
+ export async function runShareRevisions(target, opts = {}) {
242
+ const cfg = opts.config ?? readShareConfig();
243
+ if (!cfg) {
244
+ throw new Error("Not set up yet. Run 'agents artifacts setup' (provision your own endpoint) or 'agents artifacts share join' (use an existing one).");
245
+ }
246
+ const templateStatus = shareTemplateStatus(cfg);
247
+ if (templateStatus === 'outdated') {
248
+ throw new Error(OUTDATED_TEMPLATE_HINT);
249
+ }
250
+ const { key } = await resolveDeleteTarget(target, { githubUser: opts.githubUser });
251
+ const revUrl = `${cfg.baseUrl.replace(/\/+$/, '')}/${key}?revisions=json`;
252
+ const fetchListing = opts.fetchListing ?? defaultListingFetch;
253
+ const res = await fetchListing(revUrl);
254
+ if (res.status !== 200) {
255
+ throw new Error(`Revisions lookup failed (${res.status}) for ${revUrl}. Check the endpoint is reachable, or that 'agents artifacts setup' completed.`);
256
+ }
257
+ if (!/application\/json/i.test(res.contentType)) {
258
+ throw new Error(OUTDATED_TEMPLATE_HINT);
259
+ }
260
+ return parseShareRevisions(key, res.body);
261
+ }
262
+ export function formatShareRevisions(result, json = false) {
263
+ if (json)
264
+ return JSON.stringify(result, null, 2);
265
+ if (result.count === 0) {
266
+ return chalk.dim(`No retained revisions for ${result.key} (only the current version exists).`);
267
+ }
268
+ const header = chalk.bold(result.key) + chalk.dim(` ${result.count} retained ${result.count === 1 ? 'revision' : 'revisions'}`);
269
+ const rows = result.revisions.map((r) => {
270
+ const bits = [r.uploadedAt ? r.uploadedAt.slice(0, 10) : 'unknown', formatBytes(r.size)];
271
+ if (r.agent)
272
+ bits.push(r.agent);
273
+ if (r.label)
274
+ bits.push(r.label);
275
+ const metaPairs = formatMetaPairs(r.meta);
276
+ if (metaPairs)
277
+ bits.push(metaPairs);
278
+ return `${chalk.cyan(r.uploadedAt || r.key)} ${chalk.dim(bits.join(' · '))}\n ${chalk.green(r.url)}`;
148
279
  });
149
280
  return [header, ...rows].join('\n');
150
281
  }
@@ -159,6 +290,9 @@ export function formatShareDeleteResult(result, json = false) {
159
290
  ? chalk.dim(` cover deleted ${result.cover.url}`)
160
291
  : chalk.dim(` cover (none) ${result.cover.url}`));
161
292
  }
293
+ if (result.revisions?.length) {
294
+ lines.push(chalk.dim(` ${result.revisions.length} retained ${result.revisions.length === 1 ? 'revision' : 'revisions'} deleted`));
295
+ }
162
296
  return lines.join('\n');
163
297
  }
164
298
  /** Shared handler for `agents artifacts share delete <targets...>` and the
@@ -175,6 +309,7 @@ export async function runShareDelete(targets, opts, deleteFn = deleteShare) {
175
309
  try {
176
310
  const result = await deleteFn(target, {
177
311
  keepCover: opts.keepCover === true,
312
+ keepRevisions: opts.keepRevisions === true,
178
313
  ifExists: opts.ifExists === true,
179
314
  githubUser: opts.githubUser,
180
315
  });
@@ -198,12 +333,13 @@ export async function runShareDelete(targets, opts, deleteFn = deleteShare) {
198
333
  function registerShareDeleteOptions(cmd) {
199
334
  return cmd
200
335
  .option('--keep-cover', 'leave the sibling <slug>.png OG cover in place (default: delete it too)')
336
+ .option('--keep-revisions', 'leave retained revisions (<slug>/rev-*) in place (default: delete them too)')
201
337
  .option('--if-exists', 'treat an already-missing target as a no-op success instead of an error')
202
338
  .option('--github-user <user>', 'GitHub username for resolving a bare-slug target (default: resolved from gh/git config)')
203
339
  .option('--json', 'emit machine-readable results');
204
340
  }
205
341
  const SHARE_DELETE_EXAMPLES = `
206
- # Delete by full URL — also takes down the sibling OG cover
342
+ # Delete by full URL — also takes down the sibling OG cover and any retained revisions
207
343
  agents artifacts share delete https://share.agents-cli.sh/octocat/my-plan-a1b2
208
344
 
209
345
  # Delete by <user>/<slug>, or a bare slug in your own namespace
@@ -216,6 +352,9 @@ const SHARE_DELETE_EXAMPLES = `
216
352
  # Keep the cover image up (rare — you usually want both gone)
217
353
  agents unshare my-plan-a1b2 --keep-cover
218
354
 
355
+ # Keep retained revisions up too (rare — they're world-readable by URL like the page itself)
356
+ agents unshare my-plan-a1b2 --keep-revisions
357
+
219
358
  # Don't error if it's already gone
220
359
  agents unshare my-plan-a1b2 --if-exists
221
360
  `;
@@ -224,6 +363,12 @@ const SHARE_DELETE_NOTES = `
224
363
  Worker's DELETE is idempotent and returns {"ok":true} even for a key that was
225
364
  never there, so that response alone is never proof of a takedown.
226
365
 
366
+ Also deletes any retained revisions of the target (RUSH-2683) — a share that was
367
+ republished at least once leaves its prior version(s) live at their own URL until
368
+ they're purged too, so leaving them up would defeat the point of taking the page
369
+ down. Pass --keep-revisions to leave them (they still expire via the bucket's
370
+ lifecycle rule on their own schedule either way).
371
+
227
372
  agents artifacts share delete === agents unshare (same command, different name).
228
373
  `;
229
374
  /**
@@ -245,6 +390,10 @@ export function registerShareCommands(artifactsCmd) {
245
390
  .option('--force', 'publish even when the file contains emails or credential-shaped strings')
246
391
  .option('--no-cover', 'skip the OG preview image (HTML pages get one by default)')
247
392
  .option('--no-analytics', 'skip injecting the Cloudflare Web Analytics beacon')
393
+ .option('--label <text>', 'human display title, shown in the gallery and `share list` (default: derived from the HTML <title>, frontmatter title, or filename)')
394
+ .option('--title <text>', 'alias of --label')
395
+ .option('--meta <key=value>', 'structured metadata (repeatable), e.g. --meta kind=plan --meta ticket=RUSH-2683. Recommended keys: kind (plan|report|visual|screenshot|recording|deck|doc), project, ticket, status (draft|final). Reserved (set automatically, not settable): agent, session, host, repo, date, label', (val, prev) => [...prev, val], [])
396
+ .option('--no-revision', "overwrite an existing slug in place — skip keeping the prior version as a <slug>/rev-<ts> backup (default: keep it, see 'agents artifacts share revisions')")
248
397
  .option('--json', 'emit machine-readable publish result for plan-render hooks and scripts')
249
398
  .action(async (file, opts) => {
250
399
  if (!file) {
@@ -257,6 +406,7 @@ export function registerShareCommands(artifactsCmd) {
257
406
  return;
258
407
  }
259
408
  try {
409
+ const meta = parseMetaEntries(opts.meta);
260
410
  const result = await publishFile(file, {
261
411
  slug: opts.slug,
262
412
  githubUser: opts.githubUser,
@@ -265,6 +415,9 @@ export function registerShareCommands(artifactsCmd) {
265
415
  force: opts.force,
266
416
  cover: opts.cover,
267
417
  analytics: opts.analytics,
418
+ label: opts.label ?? opts.title,
419
+ meta,
420
+ noRevision: opts.revision === false,
268
421
  });
269
422
  console.log(formatSharePublishResult(result, Boolean(opts.json)));
270
423
  }
@@ -286,6 +439,12 @@ export function registerShareCommands(artifactsCmd) {
286
439
 
287
440
  # Custom slug, expiring in 7 days
288
441
  agents artifacts share ./out/report.html --slug q3-report --expire 7d
442
+
443
+ # Human title + structured metadata, shown in the gallery and share list
444
+ agents artifacts share ./out/plan.html --label "Q3 fleet plan" --meta kind=plan --meta ticket=RUSH-2683
445
+
446
+ # Republish without keeping the previous version as a revision
447
+ agents artifacts share ./out/plan.html --slug q3-report --no-revision
289
448
  ${SHARE_DELETE_EXAMPLES}
290
449
  # One-time setup (or join an existing endpoint)
291
450
  agents artifacts setup
@@ -300,6 +459,13 @@ ${SHARE_DELETE_EXAMPLES}
300
459
  and agents artifacts share list; the direct URL is still world-readable
301
460
  (unlisted, not secret). A pre-publish scan refuses emails and credential-shaped
302
461
  strings unless --force is passed.
462
+
463
+ Every publish carries provenance auto-captured from the exec env/git/clock
464
+ (agent, session, host, repo, date) — never invented, only sent when present —
465
+ plus a label (explicit --label/--title, else derived from the HTML <title>,
466
+ frontmatter title, or filename; never blocks on a prompt) and any --meta
467
+ key=value pairs. Republishing an existing slug keeps the prior version as a
468
+ retained revision by default; see 'agents artifacts share revisions'.
303
469
  ${SHARE_DELETE_NOTES}
304
470
  `,
305
471
  });
@@ -391,10 +557,25 @@ ${SHARE_DELETE_NOTES}
391
557
  .command('list')
392
558
  .description("List the pages you've published to your share namespace (human table; --json for scripts).")
393
559
  .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)')
560
+ .option('--agent <name>', 'filter to shares published by this agent/harness (case-insensitive)')
561
+ .option('--session <id>', 'filter to shares published from this session id')
562
+ // Named --label-contains, not --label: `share <file>` (the parent) already owns
563
+ // `--label`/`--title`, and commander's argv scanner resolves an option name
564
+ // against the WHOLE ancestor chain, not per-command — a same-named child option
565
+ // is silently dropped (verified; see RUSH-2683 PR notes). Fixing that properly
566
+ // needs `enablePositionalOptions()` on the root program, a CLI-wide change out
567
+ // of scope here (a pre-existing instance of it already affects --json/
568
+ // --github-user on list/update/delete — tracked as a follow-up).
569
+ .option('--label-contains <substr>', 'filter to shares whose label contains this text (case-insensitive)')
570
+ .option('--json', 'emit the machine-readable listing (slug, url, size, contentType, publishedAt, expiresAt, label, agent, session, host, repo, revisionCount, meta)')
395
571
  .action(async (opts) => {
396
572
  try {
397
- const result = await runShareList({ githubUser: opts.githubUser });
573
+ const result = await runShareList({
574
+ githubUser: opts.githubUser,
575
+ agent: opts.agent,
576
+ session: opts.session,
577
+ label: opts.labelContains,
578
+ });
398
579
  console.log(formatShareList(result, Boolean(opts.json)));
399
580
  }
400
581
  catch (e) {
@@ -412,6 +593,10 @@ ${SHARE_DELETE_NOTES}
412
593
 
413
594
  # List another namespace
414
595
  agents artifacts share list --github-user octocat
596
+
597
+ # Narrow by who/what published it
598
+ agents artifacts share list --agent claude
599
+ agents artifacts share list --label-contains "fleet plan"
415
600
  `,
416
601
  notes: `
417
602
  Lists the ACTIVE pages in your namespace — expired links and the sibling .png OG
@@ -420,6 +605,54 @@ ${SHARE_DELETE_NOTES}
420
605
  Worker predates this feature the command says so and points you at 'agents
421
606
  artifacts share update' (RUSH-2449) rather than returning a wrong or empty result
422
607
  — see 'agents artifacts share status' for whether an update is due.
608
+
609
+ --agent/--session/--label-contains filter the fetched listing client-side; --json's
610
+ count reflects the filtered set.
611
+ `,
612
+ });
613
+ const shareRevisionsCmd = shareCmd
614
+ .command('revisions <target>')
615
+ .description('Show the retained prior versions of a published slug, newest first (human table; --revisions-json for scripts).')
616
+ // Named --for-user / --revisions-json, not --github-user / --json: `share
617
+ // <file>` (the parent) already owns both those long names, and commander's
618
+ // argv scanner resolves an option name against the WHOLE ancestor chain —
619
+ // a same-named child option is silently dropped even when it parses alone
620
+ // (verified with a real program.parseAsync(), see share.test.ts). Unlike
621
+ // `list`'s pre-existing --json/--github-user collision (RUSH-2687, left
622
+ // as a tracked follow-up because it predates this diff), `revisions` is
623
+ // brand-new here, so it gets non-colliding names from the start instead
624
+ // of shipping a silently-broken flag.
625
+ .option('--for-user <user>', 'GitHub username for resolving a bare-slug target (default: resolved from gh/git config)')
626
+ .option('--revisions-json', 'emit the machine-readable revision list')
627
+ .action(async (target, opts) => {
628
+ try {
629
+ const result = await runShareRevisions(target, { githubUser: opts.forUser });
630
+ console.log(formatShareRevisions(result, Boolean(opts.revisionsJson)));
631
+ }
632
+ catch (e) {
633
+ console.error(chalk.red(e.message));
634
+ process.exitCode = 1;
635
+ }
636
+ });
637
+ setHelpSections(shareRevisionsCmd, {
638
+ examples: `
639
+ # Prior versions kept under this slug (bare slug — your own namespace)
640
+ agents artifacts share revisions q3-report
641
+
642
+ # By <user>/<slug> or full URL, same target forms as 'agents unshare'
643
+ agents artifacts share revisions octocat/q3-report
644
+ agents artifacts share revisions https://share.agents-cli.sh/octocat/q3-report
645
+
646
+ # Machine-readable, and a bare slug resolved against another namespace
647
+ agents artifacts share revisions q3-report --revisions-json
648
+ agents artifacts share revisions q3-report --for-user octocat
649
+ `,
650
+ notes: `
651
+ A revision is created automatically on every republish of an existing slug
652
+ (pass --no-revision at publish time to skip it) — this is history, never
653
+ shown on the public gallery or in 'agents artifacts share list' beyond its
654
+ count. Each revision's own URL is still directly reachable and honors its own
655
+ recorded expiry.
423
656
  `,
424
657
  });
425
658
  shareCmd
@@ -521,7 +754,7 @@ export async function runShareProvision(opts) {
521
754
  storeWriteToken(token);
522
755
  console.log(chalk.green(`\nShare endpoint ready → ${chalk.bold(baseUrl)}`));
523
756
  console.log(chalk.dim('Publish with: ') + chalk.cyan('agents artifacts share <file>'));
524
- console.log(chalk.dim(`Fleet: push the token with 'agents secrets export share --host <box>' and pull config with 'agents repo pull'.`));
757
+ console.log(chalk.dim(`Fleet: push the token with 'agents secrets export share --device <box>' and pull config with 'agents repo pull'.`));
525
758
  }
526
759
  catch (e) {
527
760
  spin.fail('Provisioning failed');