@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
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `agents sessions --host <target>` — run the session query on a remote machine
2
+ * `agents sessions --device <target>` — run the session query on a remote machine
3
3
  * over SSH and stream its output back. Session transcripts and the index DB live
4
4
  * on the machine that produced them (see `discover.ts`, all `os.homedir()`-rooted),
5
5
  * so instead of syncing the bytes here we invoke the *remote's own* `agents
@@ -18,7 +18,7 @@
18
18
  * banner. The cache is a byproduct of fetches you already made — freely
19
19
  * deletable — so the fetch-don't-replicate model holds.
20
20
  *
21
- * Mirrors the transport already used by `agents secrets export --host`
21
+ * Mirrors the transport already used by `agents secrets export --device`
22
22
  * (`src/commands/secrets.ts`): `ssh -o BatchMode=yes <host> bash -lc '<cmd>'`,
23
23
  * with `bash -lc` so the remote login PATH resolves `agents`.
24
24
  */
@@ -44,11 +44,11 @@ export function shellQuote(s) {
44
44
  return `'${s.replace(/'/g, `'\\''`)}'`;
45
45
  }
46
46
  /**
47
- * Strip the `--host`/`-H` flag (and its value) from a raw `agents sessions` argv,
47
+ * Strip the `--device`/`-D` flag (and its value) from a raw `agents sessions` argv,
48
48
  * leaving the args to forward to the remote unchanged. The remote runs the same
49
49
  * binary, so every other flag (`--since`, `--last`, `--json`, query, …) carries
50
- * over for free. Handles every form commander accepts: `--host h`, `--host=h`,
51
- * `-H h`, `-H=h`, and the glued short form `-Hh`.
50
+ * over for free. Handles every form commander accepts: `--device h`, `--device=h`,
51
+ * `-D h`, `-D=h`, and the glued short form `-Dh`.
52
52
  *
53
53
  * @param argv full process argv; the sessions args begin at index 2
54
54
  * (`[runtime, script, 'sessions', ...]`).
@@ -58,12 +58,10 @@ export function buildForwardedArgs(argv, hosts = new Set()) {
58
58
  const out = [];
59
59
  for (let i = 0; i < args.length; i++) {
60
60
  const a = args[i];
61
- if (a === '--host' || a === '-H' || a === '--device' || a === '--devices') {
62
- // Commander's `<target...>` variadic accepts both `--host a --host b` and
63
- // `--host a b` — consume every consecutive token that is a known host so
64
- // the variadic form doesn't leak the extra hosts into the remote argv.
65
- // `--device` is an alias for `--host` (its values are merged into the same
66
- // host set), so strip it the same way — else the peer would re-fan-out.
61
+ if (a === '--device' || a === '--devices') {
62
+ // Commander's `<target...>` variadic accepts both `--device a --device b`
63
+ // and `--device a b` — consume every consecutive token that is a known host
64
+ // so the variadic form doesn't leak the extra hosts into the remote argv.
67
65
  // Fall back to consuming the single next token when we have no host set
68
66
  // (e.g. malformed input) so the flag value never leaks either way.
69
67
  if (hosts.size > 0) {
@@ -75,10 +73,8 @@ export function buildForwardedArgs(argv, hosts = new Set()) {
75
73
  }
76
74
  continue;
77
75
  }
78
- if (a.startsWith('--host=') || a.startsWith('-H=') || a.startsWith('--device=') || a.startsWith('--devices='))
76
+ if (a.startsWith('--device=') || a.startsWith('--devices='))
79
77
  continue;
80
- if (/^-H.+/.test(a))
81
- continue; // glued short form: -Hyosemite-s1
82
78
  out.push(a);
83
79
  }
84
80
  return out;
@@ -87,9 +83,9 @@ export function buildForwardedArgs(argv, hosts = new Set()) {
87
83
  * Force a forwarded `agents sessions` listing to span the peer's WHOLE index.
88
84
  *
89
85
  * A remote listing runs in the peer's SSH-login cwd — its home dir — and the
90
- * default listing is silently cwd-scoped, so `sessions --host box` reads as
86
+ * default listing is silently cwd-scoped, so `sessions --device box` reads as
91
87
  * empty even when the box's index is full (`No sessions found for /home/<user>`).
92
- * Across SSH a peer's cwd is meaningless, so `--host` defaults to `--all`
88
+ * Across SSH a peer's cwd is meaningless, so `--device` defaults to `--all`
93
89
  * (whole-index) scope. This only drops the *cwd* narrowing — an explicit path
94
90
  * query, `--project`, `--since`, or `--agent` filter still narrows on top, and
95
91
  * a query that looks like a path takes precedence over `--all` on the remote.
@@ -110,7 +106,7 @@ export function ensureWholeIndex(forwardedArgs) {
110
106
  * remote renders its table to the local screen.
111
107
  */
112
108
  export function buildRemoteCommand(forwardedArgs, columns, os) {
113
- // `--host <box>` means "that box's own sessions" — so the peer must answer for
109
+ // `--device <box>` means "that box's own sessions" — so the peer must answer for
114
110
  // ITSELF and not re-sweep its fleet. Without this the remote `agents sessions`
115
111
  // fans back out to every device IT knows (including us), printing a spurious
116
112
  // `<this-machine>: unreachable`. AGENTS_SESSIONS_LOCAL=1 pins the peer local,
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * The one public command used by UI and lifecycle consumers to reopen a session.
3
- * `agents resume` owns identity resolution, source-device routing, version/home
4
- * selection, and harness-specific continuation; callers must not recreate it.
3
+ * `agents sessions resume` owns identity resolution, source-device routing,
4
+ * version/home selection, and harness-specific continuation; callers must not
5
+ * recreate it.
5
6
  */
6
7
  export declare function buildCanonicalResumeCommand(sessionId: string): string[];
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * The one public command used by UI and lifecycle consumers to reopen a session.
3
- * `agents resume` owns identity resolution, source-device routing, version/home
4
- * selection, and harness-specific continuation; callers must not recreate it.
3
+ * `agents sessions resume` owns identity resolution, source-device routing,
4
+ * version/home selection, and harness-specific continuation; callers must not
5
+ * recreate it.
5
6
  */
6
7
  export function buildCanonicalResumeCommand(sessionId) {
7
- return ['agents', 'resume', sessionId];
8
+ return ['agents', 'sessions', 'resume', sessionId];
8
9
  }
@@ -20,10 +20,10 @@
20
20
  * remote session resumed in whatever directory the user happened to be in.
21
21
  *
22
22
  * Callers act on the answer differently, and the difference is deliberate:
23
- * `agents resume` and `agents sessions attach` HOP to the owner over SSH, while
23
+ * `agents sessions resume` and `agents sessions attach` HOP to the owner over SSH, while
24
24
  * `resumeSessionInPlace` — the local takeover every routed caller reaches only
25
25
  * after deciding — REFUSES. The batch `sessions resume` needs no check of its
26
- * own: each of its tabs runs the canonical `agents resume <id>`
26
+ * own: each of its tabs runs the canonical `agents sessions resume <id>`
27
27
  * (lib/session/resume-command.ts), which routes itself.
28
28
  */
29
29
  import type { SessionMeta } from './types.js';
@@ -41,7 +41,7 @@ import type { SessionMeta } from './types.js';
41
41
  export declare const RESUME_PINNED_ENV = "AGENTS_RESUME_PINNED";
42
42
  /**
43
43
  * Whether this process was handed a resume by its owner-routing hop — read once,
44
- * then cleared so a nested `agents resume` inside the running agent still routes
44
+ * then cleared so a nested `agents sessions resume` inside the running agent still routes
45
45
  * normally.
46
46
  */
47
47
  export declare function consumeResumePinned(): boolean;
@@ -20,10 +20,10 @@
20
20
  * remote session resumed in whatever directory the user happened to be in.
21
21
  *
22
22
  * Callers act on the answer differently, and the difference is deliberate:
23
- * `agents resume` and `agents sessions attach` HOP to the owner over SSH, while
23
+ * `agents sessions resume` and `agents sessions attach` HOP to the owner over SSH, while
24
24
  * `resumeSessionInPlace` — the local takeover every routed caller reaches only
25
25
  * after deciding — REFUSES. The batch `sessions resume` needs no check of its
26
- * own: each of its tabs runs the canonical `agents resume <id>`
26
+ * own: each of its tabs runs the canonical `agents sessions resume <id>`
27
27
  * (lib/session/resume-command.ts), which routes itself.
28
28
  */
29
29
  import { isSelfHost } from '../devices/self-host.js';
@@ -41,7 +41,7 @@ import { isSelfHost } from '../devices/self-host.js';
41
41
  export const RESUME_PINNED_ENV = 'AGENTS_RESUME_PINNED';
42
42
  /**
43
43
  * Whether this process was handed a resume by its owner-routing hop — read once,
44
- * then cleared so a nested `agents resume` inside the running agent still routes
44
+ * then cleared so a nested `agents sessions resume` inside the running agent still routes
45
45
  * normally.
46
46
  */
47
47
  export function consumeResumePinned() {
@@ -154,6 +154,10 @@ export interface LoadFleetActiveSessionsOptions {
154
154
  gather: () => Promise<{
155
155
  sessions: ActiveSession[];
156
156
  remoteDeviceCount: number;
157
+ /** Peer names that went unheard on this gather (RUSH-2507). Undefined when the gather didn't compute it. */
158
+ remoteSkipped?: string[];
159
+ /** True when the device list itself could not be loaded — no peer was even attempted. */
160
+ remoteDiscoveryFailed?: boolean;
157
161
  }>;
158
162
  readCache?: typeof readActiveSessionsCache;
159
163
  writeCache?: typeof writeActiveSessionsCache;
@@ -163,6 +167,14 @@ export interface LoadFleetActiveSessionsResult {
163
167
  remoteDeviceCount: number;
164
168
  servedFromCache: boolean;
165
169
  capturedAt: number;
170
+ /**
171
+ * Diagnostics from the gather that produced this result. Only populated on a
172
+ * live gather (`servedFromCache: false`) — a cache hit serves a prior
173
+ * snapshot that never persisted these fields, so they read `undefined`
174
+ * ("not probed this call") rather than falsely claiming a clean fleet.
175
+ */
176
+ remoteSkipped?: string[];
177
+ remoteDiscoveryFailed?: boolean;
166
178
  }
167
179
  /**
168
180
  * Cache-first load of the fleet-wide active set. A prior gather (or any surface
@@ -442,6 +442,8 @@ export async function loadFleetActiveSessions(opts) {
442
442
  remoteDeviceCount: live.remoteDeviceCount,
443
443
  servedFromCache: false,
444
444
  capturedAt: snap.capturedAt,
445
+ remoteSkipped: live.remoteSkipped,
446
+ remoteDiscoveryFailed: live.remoteDiscoveryFailed,
445
447
  };
446
448
  }
447
449
  /**
@@ -4,7 +4,7 @@ const SHELL_WRAPPERS = new Set(['bash', 'sh', 'zsh', 'dash', 'ksh']);
4
4
  const PROGRAM_WRAPPERS = new Set(['command', 'builtin', 'env', 'nohup', 'sudo']);
5
5
  const MAX_NESTED_DEPTH = 3;
6
6
  const SUDO_OPTIONS_WITH_VALUE = new Set([
7
- '-C', '--close-from', '-D', '--chdir', '-g', '--group', '-h', '--host',
7
+ '-C', '--close-from', '-D', '--chdir', '-g', '--group', '-h', '--device',
8
8
  '-p', '--prompt', '-R', '--chroot', '-r', '--role', '-t', '--type',
9
9
  '-T', '--command-timeout', '-u', '--user',
10
10
  ]);
@@ -208,15 +208,15 @@ const GH_ISSUE_URL_RE = /https:\/\/github\.com\/[^\s"'()<>]+\/issues\/(\d+)/;
208
208
  * Flags of `teams create` / `teams add` that take a value, so the value is not
209
209
  * mistaken for the positional team name. Mirrors their value-taking flags in
210
210
  * `commands/teams.ts` — most are `.option('… <x>')` registrations, but
211
- * `--device`/`--host` come from `addHostOption`, so auditing this list against
212
- * `.option(` alone would wrongly drop them. A flag missing here degrades to "no
211
+ * `--device` comes from `addHostOption`, so auditing this list against
212
+ * `.option(` alone would wrongly drop it. A flag missing here degrades to "no
213
213
  * team detected", never to a wrong one.
214
214
  */
215
215
  const TEAM_VALUE_FLAGS = [
216
216
  '-d', '--description', '--use-worktree', '--devices', '--hosts', '--repo',
217
217
  '-n', '--name', '-m', '--mode', '-e', '--effort', '--model', '--env',
218
218
  '--cwd', '--worktree', '--after', '--task-type', '--cloud', '--branch',
219
- '--device', '--host',
219
+ '--device',
220
220
  ];
221
221
  /**
222
222
  * One flag value: a quoted string or a bare token. `-d "sessions lineage"` is the
@@ -319,11 +319,11 @@ export function detectSpawnedTeam(command) {
319
319
  if (!m)
320
320
  return undefined;
321
321
  const name = m[1];
322
- // A single character is a doc placeholder (`agents teams create t --host <box>`)
322
+ // A single character is a doc placeholder (`agents teams create t --device <box>`)
323
323
  // far more often than a real team, and an English article is prose. Both used to
324
324
  // land in the index as a team name, and now that the name is rendered on the row
325
325
  // a wrong one is worse than none.
326
- // A single character is a doc placeholder (`agents teams create t --host <name>`)
326
+ // A single character is a doc placeholder (`agents teams create t --device <name>`)
327
327
  // far more often than a real team; an all-digits token is a flag value or a list
328
328
  // index that leaked through, never a name someone typed. Both had reached the
329
329
  // index, and now that the name is rendered a wrong one is worse than none.
@@ -69,7 +69,7 @@ export declare function filterTeamSessions(sessions: SessionMeta[], showTeams: b
69
69
  * record backs the origin ({@link TeamOrigin.source} === `'meta'`).
70
70
  *
71
71
  * `source` is newer than the rest of {@link TeamOrigin}, so a row that arrived
72
- * from a pre-`source` peer over the `--host` fan-out carries none. There the
72
+ * from a pre-`source` peer over the `--device` fan-out carries none. There the
73
73
  * meta-only fields settle it: the entrypoint fallback is a bare `{ handle }`, so
74
74
  * any `team` / `mode` / `parentSessionId` / `startedAt` means a real teammate
75
75
  * record produced it — otherwise a genuine teammate from an unupgraded peer
@@ -184,7 +184,7 @@ export function filterTeamSessions(sessions, showTeams) {
184
184
  * record backs the origin ({@link TeamOrigin.source} === `'meta'`).
185
185
  *
186
186
  * `source` is newer than the rest of {@link TeamOrigin}, so a row that arrived
187
- * from a pre-`source` peer over the `--host` fan-out carries none. There the
187
+ * from a pre-`source` peer over the `--device` fan-out carries none. There the
188
188
  * meta-only fields settle it: the entrypoint fallback is a bare `{ handle }`, so
189
189
  * any `team` / `mode` / `parentSessionId` / `startedAt` means a real teammate
190
190
  * record produced it — otherwise a genuine teammate from an unupgraded peer
@@ -173,11 +173,11 @@ export interface SessionMeta {
173
173
  gitBranch?: string;
174
174
  messageCount?: number;
175
175
  tokenCount?: number;
176
- /** Real generated (output) tokens — excludes cache-read/-write context (issue: `agents output`). */
176
+ /** Real generated (output) tokens — excludes cache-read/-write context (issue: `agents insights output`). */
177
177
  outputTokens?: number;
178
178
  /**
179
179
  * Uncached input tokens, cache-read tokens, and cache-write (cache-creation)
180
- * tokens — the burn split `agents output` reports, kept only for harnesses that
180
+ * tokens — the burn split `agents insights output` reports, kept only for harnesses that
181
181
  * record a per-message cache split (Claude/Codex/Gemini/Droid). Undefined for
182
182
  * harnesses that expose no split (RUSH-2287).
183
183
  */
@@ -188,7 +188,7 @@ export interface SessionMeta {
188
188
  costUsd?: number;
189
189
  /**
190
190
  * USD cost priced as if caching were off — cache read/write billed at the full
191
- * input rate. Backs `agents output --pricing no-cache` (RUSH-2287). Undefined
191
+ * input rate. Backs `agents insights output --pricing no-cache` (RUSH-2287). Undefined
192
192
  * when the harness records no cache split (then no-cache == actual by definition).
193
193
  */
194
194
  costUsdNoCache?: number;
@@ -4,7 +4,7 @@
4
4
  * `String.length` is the wrong ruler for a terminal: it over-counts ANSI colour
5
5
  * escapes (chalk output) and under-counts wide glyphs (CJK, emoji) which occupy
6
6
  * two cells. The result is the drifting, wrapping session-table line users see
7
- * under tmux and over `--host` SSH. Every renderer that sizes a session-table
7
+ * under tmux and over `--device` SSH. Every renderer that sizes a session-table
8
8
  * cell measures and truncates through this module so alignment is computed once,
9
9
  * correctly, from the same source of truth.
10
10
  */
@@ -22,7 +22,7 @@ export declare function truncateToWidth(s: string, max: number): string;
22
22
  export declare function padToWidth(s: string, width: number): string;
23
23
  /**
24
24
  * Effective terminal width. Reads `$COLUMNS` first so it survives tmux and
25
- * `--host` SSH (where `process.stdout.columns` is unset or wrong), falls back to
25
+ * `--device` SSH (where `process.stdout.columns` is unset or wrong), falls back to
26
26
  * the TTY's reported width, then to `fallback`. Clamped to a sane band so a
27
27
  * bogus value can't produce a 0-wide or absurdly long table.
28
28
  */
@@ -4,7 +4,7 @@
4
4
  * `String.length` is the wrong ruler for a terminal: it over-counts ANSI colour
5
5
  * escapes (chalk output) and under-counts wide glyphs (CJK, emoji) which occupy
6
6
  * two cells. The result is the drifting, wrapping session-table line users see
7
- * under tmux and over `--host` SSH. Every renderer that sizes a session-table
7
+ * under tmux and over `--device` SSH. Every renderer that sizes a session-table
8
8
  * cell measures and truncates through this module so alignment is computed once,
9
9
  * correctly, from the same source of truth.
10
10
  */
@@ -88,7 +88,7 @@ export function padToWidth(s, width) {
88
88
  }
89
89
  /**
90
90
  * Effective terminal width. Reads `$COLUMNS` first so it survives tmux and
91
- * `--host` SSH (where `process.stdout.columns` is unset or wrong), falls back to
91
+ * `--device` SSH (where `process.stdout.columns` is unset or wrong), falls back to
92
92
  * the TTY's reported width, then to `fallback`. Clamped to a sane band so a
93
93
  * bogus value can't produce a 0-wide or absurdly long table.
94
94
  */
@@ -8,6 +8,12 @@ export type DeleteFn = (url: string, headers: Record<string, string>) => Promise
8
8
  export type CheckFn = (url: string) => Promise<{
9
9
  status: number;
10
10
  }>;
11
+ /** DI seam for tests — override the real HTTP GET of the revisions listing route. */
12
+ export type RevisionsFetchFn = (url: string) => Promise<{
13
+ status: number;
14
+ contentType: string;
15
+ body: string;
16
+ }>;
11
17
  export interface DeleteEndpoint {
12
18
  baseUrl: string;
13
19
  token: string;
@@ -59,6 +65,11 @@ export declare function deleteObject(endpoint: DeleteEndpoint, key: string, opts
59
65
  export interface DeleteShareOptions {
60
66
  /** Skip deleting the sibling `<slug>.png` OG cover (default: delete it too). */
61
67
  keepCover?: boolean;
68
+ /** Skip deleting the target's retained revisions (`<key>/rev-*`, RUSH-2683
69
+ * revision retention) — default: delete them too. A republished-then-deleted
70
+ * share would otherwise leave its prior world-readable versions live for up
71
+ * to the bucket's lifecycle max-age (see docs/share.md §Revisions). */
72
+ keepRevisions?: boolean;
62
73
  /** Treat an already-missing target as a no-op success instead of an error
63
74
  * (mirrors SQL's `DROP ... IF EXISTS`). Default: missing target is an error. */
64
75
  ifExists?: boolean;
@@ -72,6 +83,8 @@ export interface DeleteShareOptions {
72
83
  deleter?: DeleteFn;
73
84
  /** DI seam for tests — override the real HTTP existence check. */
74
85
  checker?: CheckFn;
86
+ /** DI seam for tests — override the real HTTP GET of the revisions listing route. */
87
+ fetchRevisions?: RevisionsFetchFn;
75
88
  }
76
89
  export interface DeleteShareResult {
77
90
  key: string;
@@ -86,6 +99,14 @@ export interface DeleteShareResult {
86
99
  existedBefore: boolean;
87
100
  verified404: boolean;
88
101
  };
102
+ /** Retained revisions of this target that were also deleted (omitted when
103
+ * there were none, or `keepRevisions` was passed). */
104
+ revisions?: Array<{
105
+ key: string;
106
+ url: string;
107
+ existedBefore: boolean;
108
+ verified404: boolean;
109
+ }>;
89
110
  }
90
111
  /** Delete one share target (page + by default its OG cover) and verify both
91
112
  * are gone. Throws on an unverified takedown — never reports success for an
@@ -61,6 +61,33 @@ async function defaultDelete(url, headers) {
61
61
  const res = await fetch(url, { method: 'DELETE', headers });
62
62
  return { ok: res.ok, status: res.status };
63
63
  }
64
+ async function defaultRevisionsFetch(url) {
65
+ const res = await fetch(url, { headers: { accept: 'application/json' } });
66
+ return { status: res.status, contentType: res.headers.get('content-type') ?? '', body: await res.text() };
67
+ }
68
+ /**
69
+ * List the R2 keys of a slug's retained revisions via the Worker's
70
+ * `?revisions=json` route (worker-template.ts `renderRevisions`). Best-effort:
71
+ * any failure to reach or parse the route (an endpoint provisioned before
72
+ * revisions existed, a network blip) yields an empty list rather than
73
+ * throwing — purging revisions is a safety improvement on top of the primary
74
+ * delete contract (take the canonical page down), never a reason to fail it.
75
+ */
76
+ async function listRevisionKeys(endpoint, key, fetchRevisions) {
77
+ try {
78
+ const url = `${endpoint.baseUrl.replace(/\/+$/, '')}/${key}?revisions=json`;
79
+ const res = await fetchRevisions(url);
80
+ if (res.status !== 200 || !/application\/json/i.test(res.contentType))
81
+ return [];
82
+ const data = JSON.parse(res.body);
83
+ if (!Array.isArray(data.revisions))
84
+ return [];
85
+ return data.revisions.map((r) => String(r.key ?? '')).filter(Boolean);
86
+ }
87
+ catch {
88
+ return [];
89
+ }
90
+ }
64
91
  /**
65
92
  * Delete one R2 object behind the share Worker and assert the postcondition.
66
93
  * `{"ok":true}` from the Worker is not evidence a page came down — R2 delete is
@@ -123,5 +150,20 @@ export async function deleteShare(target, opts = {}) {
123
150
  throw new Error(`Cover delete reported success but ${cover.url} still resolves — takedown NOT verified. Retry, or pass --keep-cover and delete it manually.`);
124
151
  }
125
152
  }
153
+ if (!opts.keepRevisions) {
154
+ const revisionKeys = await listRevisionKeys(endpoint, resolved.key, opts.fetchRevisions ?? defaultRevisionsFetch);
155
+ if (revisionKeys.length > 0) {
156
+ const revisions = [];
157
+ for (const revisionKey of revisionKeys) {
158
+ const rev = await deleteObject(endpoint, revisionKey, { deleter: opts.deleter, checker: opts.checker });
159
+ revisions.push({ key: rev.key, url: rev.url, existedBefore: rev.existedBefore, verified404: rev.verified404 });
160
+ }
161
+ result.revisions = revisions;
162
+ const stillUp = revisions.filter((r) => r.existedBefore && !r.verified404);
163
+ if (stillUp.length > 0) {
164
+ throw new Error(`Delete reported success but ${stillUp.length} retained revision(s) still resolve — takedown NOT verified. Retry, or pass --keep-revisions and delete them manually.`);
165
+ }
166
+ }
167
+ }
126
168
  return result;
127
169
  }
@@ -45,6 +45,27 @@ export interface PublishOptions {
45
45
  uploader?: PutFn;
46
46
  /** DI seam for tests — override cover capture (returns a PNG buffer or null). */
47
47
  capturer?: (htmlPath: string) => Promise<Buffer | null>;
48
+ /**
49
+ * Human display title, shown instead of the slug in the gallery and
50
+ * `agents artifacts share list`. When omitted, one is derived (HTML `<title>`,
51
+ * else a Markdown frontmatter `title:`, else the filename) — a share always
52
+ * carries a label, never a blocking prompt (see {@link deriveLabel}).
53
+ */
54
+ label?: string;
55
+ /**
56
+ * Structured metadata (`--meta key=value`, repeatable). Keys are validated by
57
+ * {@link parseMetaEntries} — lowercase `[a-z0-9-]`, and may not collide with
58
+ * {@link RESERVED_META_KEYS}, which the CLI sets automatically.
59
+ */
60
+ meta?: Record<string, string>;
61
+ /**
62
+ * Skip revision retention on this publish — overwrite an existing slug's
63
+ * object in place with no `<slug>/rev-<ts>` backup of the version it replaces
64
+ * (default: keep it; see docs/share.md §Revisions).
65
+ */
66
+ noRevision?: boolean;
67
+ /** DI seam for tests — override provenance auto-capture (agent/session/host/repo/date). */
68
+ provenance?: ShareProvenance;
48
69
  }
49
70
  export interface PublishResult {
50
71
  url: string;
@@ -52,7 +73,68 @@ export interface PublishResult {
52
73
  coverUrl?: string;
53
74
  /** True when the page was published with `visibility=unlisted`. */
54
75
  unlisted?: boolean;
76
+ /** The label stored with this share — explicit (`--label`) or derived. */
77
+ label?: string;
78
+ /** Whether `label` came from `--label` or was auto-derived. */
79
+ labelSource?: 'explicit' | 'derived';
80
+ }
81
+ export interface ShareProvenance {
82
+ /** Harness/agent name (`AGENTS_AGENT_NAME`), when publishing from an agent run. */
83
+ agent?: string;
84
+ /** Session id (`AGENTS_SESSION_ID` / `AGENT_SESSION_ID`), when publishing from an agent run. */
85
+ session?: string;
86
+ /** The machine the publish ran from (`os.hostname()`) — always present. */
87
+ host?: string;
88
+ /** git repo name at publish time, absent outside a git checkout — never invented. */
89
+ repo?: string;
90
+ /** ISO date (`yyyy-mm-dd`) this publish happened, from the local clock. */
91
+ date?: string;
55
92
  }
93
+ /**
94
+ * Reserved `customMetadata` keys the CLI sets automatically from the exec env,
95
+ * git, and the local clock (plus `label`/`label-source`) — a `--meta key=value`
96
+ * may not target any of these (see {@link parseMetaEntries}).
97
+ */
98
+ export declare const RESERVED_META_KEYS: readonly ["agent", "session", "host", "repo", "date", "label", "label-source"];
99
+ /**
100
+ * Auto-capture publish provenance from the exec env, git, and the local clock.
101
+ * Every field is present only when the environment genuinely carries it — a
102
+ * human running the command by hand outside a git repo yields `session`/`agent`/
103
+ * `repo` all undefined, never an invented value. `host` is always present
104
+ * (`os.hostname()` never fails to return something real about where the publish
105
+ * ran, so it isn't "invented" in the same sense).
106
+ */
107
+ export declare function resolveShareProvenance(opts?: {
108
+ env?: NodeJS.ProcessEnv;
109
+ hostname?: string;
110
+ dir?: string;
111
+ now?: Date;
112
+ }): ShareProvenance;
113
+ /**
114
+ * Parse repeated `--meta key=value` CLI args into a validated metadata record.
115
+ * Keys are lowercase `[a-z0-9-]`, up to 64 characters, and may not collide with
116
+ * {@link RESERVED_META_KEYS} (the provenance the CLI sets automatically, plus
117
+ * label/label-source) — throws naming the offending pair on any violation.
118
+ */
119
+ export declare function parseMetaEntries(pairs: string[]): Record<string, string>;
120
+ /** Throws when the combined `customMetadata` payload would exceed {@link MAX_METADATA_BYTES}. */
121
+ export declare function assertMetadataSize(customMetadata: Record<string, string>): void;
122
+ /**
123
+ * Collapse a label to a single line before it goes into the `x-share-label`
124
+ * header or public customMetadata. `<title>[^<]{1,200}</title>` matches
125
+ * newlines (`[^<]` excludes only `<`), and `.trim()` only strips leading/
126
+ * trailing whitespace, not embedded newlines — a multi-line `<title>` (or an
127
+ * explicit `--label`/`--title` the caller typed with a literal newline) was
128
+ * previously passed straight into `Headers.set()` unsanitized, which throws
129
+ * an unhandled `TypeError: Invalid value` and crashes the publish outright.
130
+ */
131
+ export declare function sanitizeLabel(text: string): string;
132
+ /**
133
+ * Best-effort human title when `--label` is omitted: the HTML `<title>`, else a
134
+ * Markdown frontmatter `title:`, else the filename. Always returns something —
135
+ * a headless publish must never hang waiting on a prompt for one.
136
+ */
137
+ export declare function deriveLabel(filePath: string, body: Buffer): string;
56
138
  /** Default auto-expire for unflagged publishes — accidental links decay (RUSH-2443). */
57
139
  export declare const DEFAULT_SHARE_EXPIRE = "30d";
58
140
  /** `30d` / `12h` / `2026-08-01` → an absolute ISO timestamp (or undefined). */