@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,12 +1,14 @@
1
1
  /**
2
- * `agents sessions resume` — multi-select sessions and fan each one out into a
3
- * terminal surface via the terminal launch engine (src/lib/terminal).
2
+ * `agents sessions resume` — the one resume surface.
4
3
  *
5
- * Unlike the single-select picker behind bare `agents sessions` (which resumes
6
- * one session in place), this opens a checkbox picker, then asks where the
7
- * chosen sessions should resume. By default each session opens in its own tab in
8
- * the terminal you're in iTerm / Ghostty / tmux, locally or on a remote host
9
- * via --host. `--splits` opts into packing two sessions side by side per tab.
4
+ * - Strict single-session: `sessions resume <id> [prompt]` with optional
5
+ * --mode/--headless/--interactive/--cwd/--quiet/--here (formerly top-level
6
+ * `agents resume`). Identity resolution + owner-device hop live in resume.ts.
7
+ * - Multi-select: bare `sessions resume` opens a checkbox picker and fans each
8
+ * pick into a terminal tab/split via the terminal launch engine.
9
+ * - Direct id/alias always takes the strict path; live-pane attach is
10
+ * `sessions focus`.
11
+ * - `--device` opens the terminal surface on the session origin only.
10
12
  */
11
13
  import * as fs from 'fs';
12
14
  import chalk from 'chalk';
@@ -25,29 +27,42 @@ import { spawn } from 'node:child_process';
25
27
  import { looksLikeSessionId } from '../lib/session/discover.js';
26
28
  import { machineId } from '../lib/session/sync/config.js';
27
29
  import { sessionOriginDevice, sessionRecoveryDestinationMatches } from '../lib/session/recovery.js';
30
+ import { runStrictResume, wantsStrictResume } from './resume.js';
28
31
  /** Opening more than this many live sessions at once asks for confirmation first. */
29
32
  export const CONFIRM_THRESHOLD = 5;
30
33
  export function registerSessionsResumeCommand(sessionsCmd) {
31
34
  const cmd = sessionsCmd
32
35
  .command('resume')
33
- .argument('[query]', 'Session id/tmux alias to reopen directly, or text that filters the picker')
34
- .description('Reopen one session by canonical identity, or multi-select history into terminal tabs/splits.')
36
+ .argument('[query]', 'Session id/tmux alias/label for strict resume, or text that filters the picker')
37
+ .argument('[prompt]', 'Optional follow-up prompt (strict resume with original harness/version/device)')
38
+ .description('Resume a session by id (strict), or multi-select history into terminal tabs/splits.')
35
39
  .option('-a, --agent <agent>', 'Filter by agent type and version (e.g., claude, codex@0.116.0)')
36
40
  .option('--all', 'Include sessions from every directory (not just current project)')
37
41
  .option('--teams', 'Include team-spawned sessions (hidden by default)')
38
42
  .option('--since <time>', 'Only sessions newer than this (e.g., 2h, 7d, 4w, or ISO date)')
39
43
  .option('-n, --limit <n>', 'Maximum number of sessions to load into the picker', '200')
40
- .option('--host <alias>', 'Open on the session origin host over SSH; the host must match every selected session')
44
+ .option('--device <alias>', 'Open on the session origin device over SSH; the device must match every selected session')
41
45
  .option('--iterm', 'Force the iTerm backend')
42
46
  .option('--ghostty', 'Force the Ghostty backend')
43
47
  .option('--tmux', 'Force the tmux backend')
44
48
  .option('--vscodium', 'Force the VSCodium agent-terminal backend (swarm-ext)')
45
49
  .option('--terminal-app', 'Force macOS Terminal.app (no split support — panes become tabs)')
50
+ .option('--splits', 'Pack two sessions side by side per tab (default: one tab per session)')
51
+ .option('-m, --mode <mode>', 'Strict resume: override the recorded launch mode')
52
+ .option('-i, --interactive', 'Strict resume: interactive even when a prompt is provided')
53
+ .option('--headless', 'Strict resume: headless (a prompt is required)')
54
+ .option('--cwd <path>', 'Strict resume: override the recorded working directory')
55
+ .option('-q, --quiet', 'Strict resume: suppress routing banners')
56
+ .option('--here', 'Strict resume: run on this machine even if the session belongs to another device')
46
57
  .option('--local', 'Only this machine (skip the cross-host sweep)')
47
- .option('--attach-only', 'With an id/alias: attach a living pane only — never resume a copy')
48
- .option('--splits', 'Pack two sessions side by side per tab (default: one tab per session)');
58
+ .option('--attach-only', 'With an id/alias: attach a living pane only — never resume a copy');
49
59
  setHelpSections(cmd, {
50
60
  examples: `
61
+ # Strict resume by full id (former top-level agents resume)
62
+ agents sessions resume 019fd0c8-b3e9-77a2-a1a4-444698c4d897
63
+ agents sessions resume 019fd0c8-b3e9-77a2-a1a4-444698c4d897 "finish the tests"
64
+ agents sessions resume ag-codex-c1f3d813 --mode edit
65
+
51
66
  # Pick several sessions; each opens in its own tab
52
67
  agents sessions resume
53
68
 
@@ -65,9 +80,11 @@ export function registerSessionsResumeCommand(sessionsCmd) {
65
80
  agents sessions resume --ghostty
66
81
  agents sessions resume --vscodium
67
82
  agents sessions resume --splits
68
- agents sessions resume --host zion --tmux
83
+ agents sessions resume --device zion --tmux
69
84
  `,
70
85
  notes: `
86
+ - Strict path (id/tmux alias/label + optional prompt/--mode/--headless/--here): restores original harness, version, device, account, cwd, and mode. Searches the fleet; a local full-id hit resumes with zero SSH. Replaces the former top-level agents sessions resume.
87
+ - Attach a live pane without forking: agents sessions focus <id>.
71
88
  - This is the ONE verb for getting back in. It detects the state: a live tmux pane is attached, a headless session comes to the foreground, an ended one recovers on its owning device.
72
89
  - A UUID/prefix or ag-<agent>-<suffix> alias bypasses the picker. A live alias attaches by name even when the session index cannot attribute it.
73
90
  - Retired spellings still work for one release and print the replacement: sessions attach, sessions go, reconnect.
@@ -75,23 +92,40 @@ export function registerSessionsResumeCommand(sessionsCmd) {
75
92
  - With no identity selector, space toggles a session, enter confirms, and tab toggles the preview pane.
76
93
  - Layout: one tab per session by default. --splits packs session pairs side by side in each tab.
77
94
  - Backend: auto-detected from the terminal you're in (iTerm / Ghostty / tmux); override with --iterm/--ghostty/--tmux/--vscodium.
78
- - --vscodium opens each session as an agent terminal tab in VSCodium via the swarm-ext extension (works with --host too).
79
- - --host <alias> opens the terminal surface on that host only when it is the selected sessions' origin; recovery never migrates a session to another device.
95
+ - --vscodium opens each session as an agent terminal tab in VSCodium via the swarm-ext extension (works with --device too).
96
+ - --device <alias> opens the terminal surface on that device only when it is the selected sessions' origin; recovery never migrates a session to another device.
80
97
  - Recovery runs on the session's origin device: exact healthy origin uses native resume; otherwise a healthy version of the same harness receives /continue <id>.
81
98
  `,
82
99
  });
83
- cmd.action(async (query, options) => {
84
- await sessionsResumeAction(query, options);
100
+ cmd.action(async (query, prompt, options) => {
101
+ await sessionsResumeAction(query, prompt, options);
85
102
  });
86
103
  }
87
- async function sessionsResumeAction(query, options) {
88
- if (!isInteractiveTerminal()) {
89
- console.error(chalk.red('sessions resume needs an interactive terminal.'));
90
- process.exitCode = 1;
104
+ async function sessionsResumeAction(query, prompt, options) {
105
+ const strictOpts = {
106
+ mode: options.mode,
107
+ interactive: options.interactive,
108
+ headless: options.headless,
109
+ cwd: options.cwd,
110
+ quiet: options.quiet,
111
+ here: options.here,
112
+ };
113
+ // Direct id/alias (or label with prompt/strict flags) → strict resume
114
+ // (former top-level `agents sessions resume`). `--attach-only` / `--local`
115
+ // must go through sessions focus so they cannot silently fork a copy
116
+ // (AGI EXT still shells `sessions resume <id> --local`).
117
+ if (query && (isDirectResumeSelector(query) || wantsStrictResume(prompt, strictOpts))) {
118
+ if (resumeUsesLifecycleDispatch(query, prompt, options)) {
119
+ const hosts = options.device ? [options.device] : [];
120
+ await dispatchSessionLifecycleInPlace(query.trim(), hosts, !!options.attachOnly, !!options.local);
121
+ return;
122
+ }
123
+ await runStrictResume(query.trim(), prompt, strictOpts);
91
124
  return;
92
125
  }
93
- if (query && isDirectResumeSelector(query)) {
94
- await dispatchSessionLifecycleInPlace(query.trim(), options.host ? [options.host] : [], options.attachOnly === true, options.local === true);
126
+ if (!isInteractiveTerminal()) {
127
+ console.error(chalk.red('sessions resume needs an interactive terminal (or pass a session id for strict resume).'));
128
+ process.exitCode = 1;
95
129
  return;
96
130
  }
97
131
  const { agent, version } = parseAgentFilter(options.agent);
@@ -138,8 +172,8 @@ async function sessionsResumeAction(query, options) {
138
172
  }
139
173
  if (!chosen || chosen.length === 0)
140
174
  return;
141
- if (options.host) {
142
- const requestedHost = options.host;
175
+ if (options.device) {
176
+ const requestedHost = options.device;
143
177
  const mismatches = chosen
144
178
  .map((session) => resumeHostMismatch(session, requestedHost))
145
179
  .filter((message) => message !== null);
@@ -153,7 +187,7 @@ async function sessionsResumeAction(query, options) {
153
187
  // 2. Route every selection through the owning device's recovery resolver.
154
188
  const items = [];
155
189
  for (const s of chosen) {
156
- const command = buildSessionRecoveryCommand(s, !!options.host);
190
+ const command = buildSessionRecoveryCommand(s, !!options.device);
157
191
  const cwd = s.cwd && fs.existsSync(s.cwd) ? s.cwd : process.cwd();
158
192
  items.push({ session: s, cwd, command });
159
193
  }
@@ -183,7 +217,7 @@ async function sessionsResumeAction(query, options) {
183
217
  // 5b. Fan out through the engine. Full-width tabs are the default for batch
184
218
  // recovery; callers can explicitly opt into pairs of side-by-side panes.
185
219
  const packing = resolveResumePacking(options);
186
- const where = options.host ? `${backend} on ${options.host}` : backend;
220
+ const where = options.device ? `${backend} on ${options.device}` : backend;
187
221
  // Terminal.app has no scriptable split, so its buildSplit opens a tab. Say so
188
222
  // when the user actually asked for panes — the layout silently not happening
189
223
  // is worse than one line of warning.
@@ -199,7 +233,7 @@ async function sessionsResumeAction(query, options) {
199
233
  agent: it.session.agent || undefined,
200
234
  sessionId: it.session.id || undefined,
201
235
  title: it.session.label || it.session.topic || undefined,
202
- })), { backend, host: options.host, packing });
236
+ })), { backend, host: options.device, packing });
203
237
  let opened = 0;
204
238
  results.forEach((r, i) => {
205
239
  const s = items[i].session;
@@ -220,21 +254,35 @@ export function isDirectResumeSelector(query) {
220
254
  const selector = query.trim();
221
255
  return looksLikeSessionId(selector) || isAgentTmuxAlias(selector);
222
256
  }
223
- /** Re-enter through the top-level command so fleet routing and harness policy
257
+ /** Re-enter through sessions resume so fleet routing and harness policy
224
258
  * stay centralized. The child inherits this terminal for a real interactive resume. */
225
259
  export async function resumeSelectorInPlace(selector) {
226
- await spawnCliInPlace(['resume', selector]);
260
+ await spawnCliInPlace(['sessions', 'resume', selector]);
227
261
  }
228
262
  /** Direct identities use focus as the lifecycle dispatcher: it rechecks the
229
263
  * live fleet, attaches a healthy pane, and falls through to `agents resume`
230
264
  * only when the process is no longer attachable. */
265
+ /** True when `sessions resume <id> --attach-only|--local` must go through
266
+ * `sessions focus` instead of `runStrictResume` (which can fork a copy). */
267
+ export function resumeUsesLifecycleDispatch(query, prompt, options) {
268
+ if (!query || !isDirectResumeSelector(query))
269
+ return false;
270
+ if (!options.attachOnly && !options.local)
271
+ return false;
272
+ return !wantsStrictResume(prompt, {
273
+ mode: options.mode,
274
+ interactive: options.interactive,
275
+ headless: options.headless,
276
+ here: options.here,
277
+ });
278
+ }
231
279
  export async function dispatchSessionLifecycleInPlace(selector, hosts = [], attachOnly = false, local = false) {
232
280
  await spawnCliInPlace(buildSessionLifecycleArgs(selector, hosts, attachOnly, local));
233
281
  }
234
282
  export function buildSessionLifecycleArgs(selector, hosts = [], attachOnly = false, local = false) {
235
283
  return [
236
284
  'sessions', 'focus', selector,
237
- ...hosts.flatMap(host => ['--host', host]),
285
+ ...hosts.flatMap(host => ['--device', host]),
238
286
  ...(attachOnly ? ['--attach-only'] : []),
239
287
  ...(local ? ['--local'] : []),
240
288
  ];
@@ -257,7 +305,7 @@ export function resumeHostMismatch(session, requestedHost, self = machineId()) {
257
305
  const origin = sessionOriginDevice(session, self);
258
306
  return sessionRecoveryDestinationMatches(session, requestedHost, self)
259
307
  ? null
260
- : `Session ${session.shortId} originated on ${origin}; --host ${requestedHost} cannot move recovery to another device.`;
308
+ : `Session ${session.shortId} originated on ${origin}; --device ${requestedHost} cannot move recovery to another device.`;
261
309
  }
262
310
  /**
263
311
  * Decide which backend to launch into. Returns a concrete backend, `'inplace'`
@@ -274,7 +322,7 @@ export async function resolveBackend(options, ctx, count) {
274
322
  if (forced)
275
323
  return forced;
276
324
  // Remote defaults to tmux (headless, no GUI session assumptions); override with a backend flag.
277
- if (options.host)
325
+ if (options.device)
278
326
  return 'tmux';
279
327
  const available = availableBackends(ctx);
280
328
  if (available.length === 0)
@@ -2,7 +2,7 @@ import chalk from 'chalk';
2
2
  import { discoverSessions, parseTimeFilter } from '../lib/session/discover.js';
3
3
  import { queryResourceUsageStats, resourceUsageCoverage, } from '../lib/session/db.js';
4
4
  import { listResources } from '../lib/resources.js';
5
- import { discoverPlugins } from '../lib/plugins.js';
5
+ import { discoverPlugins } from '../lib/plugins/plugins.js';
6
6
  import { setHelpSections } from '../lib/help.js';
7
7
  import { terminalWidth, truncateToWidth, padToWidth, stringWidth } from '../lib/session/width.js';
8
8
  const DEFAULT_TOP = 20;
@@ -100,7 +100,7 @@ async function statsAction(cmd) {
100
100
  const kind = normalizeKind(opts.kind);
101
101
  const sinceMs = opts.since ? parseTimeFilter(opts.since) : undefined;
102
102
  const top = resolveTop(opts.top);
103
- // Warm the incremental index (like `agents cost`) so recent sessions' usage is
103
+ // Warm the incremental index (like `agents insights cost`) so recent sessions' usage is
104
104
  // current before we read. Historical gaps still need the explicit backfill.
105
105
  await discoverSessions({ all: true, since: opts.since, limit: 1 });
106
106
  const filter = {};
@@ -2,9 +2,11 @@ import { type Command } from 'commander';
2
2
  import { type ProjectDef } from '../lib/projects.js';
3
3
  import type { SessionAgentId, SessionMeta, ViewMode } from '../lib/session/types.js';
4
4
  import { type ActiveSession } from '../lib/session/active.js';
5
+ export { activeSessionProjectKey, backfillActiveRowsFromIndex, backfillActiveRowsFromMeta, isRunningLiveSession, serializeActiveSessionsForJson, serializeSessionsJson, type BackfillMeta } from '../lib/session/active.js';
6
+ import { loadLocalActiveSessions } from '../lib/session/session-cache.js';
5
7
  import { gatherRemoteList, runOnPeer } from '../lib/session/remote-list.js';
6
8
  import { type RemoteAgentsJsonParseResult } from '../lib/remote-agents-json.js';
7
- import { type RunMeta } from '../lib/routines.js';
9
+ import { type RunMeta } from '../lib/scheduling/routines.js';
8
10
  import { type PickedSession } from './sessions-picker.js';
9
11
  import { type ComputerRunRow } from '../lib/computer/sessions-list.js';
10
12
  import { type ToolSearchEnvelope, type ToolProgramCountEnvelope } from '../lib/session/tool-index.js';
@@ -70,7 +72,7 @@ interface SessionsOptions extends SessionFilterOptions {
70
72
  /** Force local-only: skip the cross-machine SSH fan-out (both the default
71
73
  * listing and --active). */
72
74
  local?: boolean;
73
- /** --device <target...> — alias for --host; resolves against the device registry. */
75
+ /** --device <target...> — values from the `--device` flag; resolves against the device registry. */
74
76
  device?: string[];
75
77
  /** --devices <target...> — plural alias for --device; a bare `all`/`fleet` value
76
78
  * means "search the whole fleet" (already the default), so it never errors. */
@@ -142,19 +144,6 @@ export declare function formatActiveRowDescription(s: ActiveSession): string;
142
144
  * can't be correlated back to a transcript on disk.
143
145
  */
144
146
  export declare function indexActiveBySessionId(active: ActiveSession[]): Map<string, ActiveSession>;
145
- /** The SessionMeta fields the live-row backfill reads — the enrichment a running process cannot report. */
146
- export type BackfillMeta = Pick<SessionMeta, 'version' | 'timestamp' | 'label' | 'ticketId' | 'prUrl' | 'prNumber' | 'origin' | 'routineName'>;
147
- /**
148
- * Backfill display-only fields onto live rows from the indexed SessionMeta, by
149
- * full session id (RUSH-2205). A running process reports no agent version, and a
150
- * live orphan row usually carries no ticket/PR/label/start-time; the historical
151
- * index does. Only a field the live row LACKS is filled — the live signal always
152
- * wins when present. Pure (no I/O) so the join is unit-tested against fixtures;
153
- * the DB read that builds `metaById` is the caller's concern.
154
- */
155
- export declare function backfillActiveRowsFromMeta(sessions: ActiveSession[], metaById: Map<string, BackfillMeta>): void;
156
- /** Add indexed display metadata to active rows for non-renderer consumers. */
157
- export declare function backfillActiveRowsFromIndex(sessions: ActiveSession[]): void;
158
147
  /**
159
148
  * The live decoration for a listing row: a status glyph and the latest-turn
160
149
  * preview, when the session is still running. `●` running / `◐` waiting on the
@@ -198,36 +187,6 @@ export declare function liveStatusWord(a: ActiveSession | undefined): string;
198
187
  * stays excluded rather than inventing a human who can answer.
199
188
  */
200
189
  export declare function isAwaitingUser(s: ActiveSession): boolean;
201
- /**
202
- * Whether a row belongs in an unqualified `--active` view (RUSH-2336) — the
203
- * ONE canonical selector every bare-active surface shares: the CLI's grouped
204
- * table and `--json` (`renderActiveSessions`), the interactive browser's
205
- * `--active` filter ({@link applyFilters} in `sessions-browser.ts`), `focus`'s
206
- * attach gate (`isAttachableLiveSession`), and the menubar snapshot
207
- * ({@link computeMenubarSnapshot}).
208
- *
209
- * The live registry deliberately retains terminally-dead AND not-yet-started
210
- * rows long enough for `--closed` / `--crashed` / `--queued` and recovery to
211
- * find them. Presence in that registry therefore is not, by itself, evidence
212
- * that a session is CURRENTLY active. Explicit lifecycle filters bypass this
213
- * predicate and select those retained rows through {@link matchesLiveStatus}
214
- * instead — this function only decides the unqualified default.
215
- *
216
- * - `queued` / `closed` / `crashed` are never active here: queued hasn't
217
- * started yet, closed/crashed are unconditionally dead. All three stay
218
- * reachable through their explicit filter.
219
- * - A cloud row carries no local pid at all — it is active on the
220
- * provider's own word (`cloudProvider` + `cloudTaskId`), never a
221
- * fabricated pid.
222
- * - Every other row is a real OS process (terminal/tmux/headless/team). It
223
- * is active only when the row names the machine it runs on, carries a
224
- * positive pid, AND has POSITIVELY verified that pid is alive
225
- * (`pidAlive === true` — not merely "not known dead"). A live orphaned
226
- * row, or a live-but-stuck abandoned row, still qualifies this way since
227
- * both carry a genuinely alive pid; unknown liveness (an older peer's
228
- * row, or a pid that could never be resolved) does not.
229
- */
230
- export declare function isRunningLiveSession(s: ActiveSession): boolean;
231
190
  /**
232
191
  * The tracker/PR ref for a session's dedicated column: the ticket id when known,
233
192
  * else `PR#<n>`, else empty. Pulled out of the trailing badge blob so refs align
@@ -236,26 +195,36 @@ export declare function isRunningLiveSession(s: ActiveSession): boolean;
236
195
  export declare function ticketLabel(s: Pick<SessionMeta, 'ticketId' | 'prNumber'>): string;
237
196
  export declare function linkTicketCell(s: Pick<SessionMeta, 'ticketId' | 'prNumber' | 'prUrl'>, label: string): string;
238
197
  export declare function linkCwdCell(s: Pick<SessionMeta, 'cwd' | '_remote'>, label: string): string;
198
+ /**
199
+ * The single project/group key for an active session row (RUSH-2688). It is the
200
+ * ONE derivation every project-grouped consumer of `--active`/the menubar snapshot
201
+ * shares, so a session is bucketed the same way everywhere:
202
+ *
203
+ * - A real working dir → its `basename` — the same key SessionMeta derives (see
204
+ * discover.ts), so the active view and the history view join identically on
205
+ * (ticketId + project).
206
+ * - A row with NO local cwd (a cloud task, a provider-run job) → an explicit
207
+ * bucket keyed by context: `cloud` for a cloud row, else `other`.
208
+ *
209
+ * It never falls back to `kind` (the harness — 'codex', 'claude') or `machine`
210
+ * (the box it runs on): neither is a project, and letting either stand in for the
211
+ * key is exactly what leaked a Codex cloud task under a 'codex' group and a bogus
212
+ * machine label in the menubar. No fallback chain — one explicit bucket.
213
+ */
239
214
  /**
240
215
  * The row shape `agents sessions --active --json` emits. RUSH-1981: a watcher
241
216
  * joins active sessions on ticketId + project, but the raw ActiveSession nests
242
217
  * the ticket (`ticket.id`) and carries no `project` at all — so a naive join
243
218
  * silently drops every row. Emit both as flat, always-present top-level keys
244
- * (null when unknown) alongside the raw fields, so every active row is joinable.
245
- * `project` uses the same derivation SessionMeta does — basename(cwd) (see
246
- * discover.ts) so the active view and the history view join identically.
219
+ * alongside the raw fields, so every active row is joinable. `project` is the
220
+ * canonical {@link activeSessionProjectKey} — basename(cwd), or an explicit
221
+ * `cloud`/`other` bucket for a row with no local cwd, never the harness/machine.
247
222
  *
248
223
  * `viewingIn` flattens to the same display string the row renderer prints —
249
224
  * `'codium tab 3'` / `'detached'` / null — so a consumer can tell a watched
250
225
  * session from an orphaned one (its terminal died, the agent is still running)
251
226
  * without re-implementing the tmux client lookup.
252
227
  */
253
- export declare function serializeActiveSessionsForJson(sessions: ActiveSession[]): Array<Omit<ActiveSession, 'viewingIn'> & {
254
- ticketId: string | null;
255
- project: string | null;
256
- prLink: string | null;
257
- viewingIn: string | null;
258
- }>;
259
228
  export interface SessionPickerJsonRow extends SessionMeta {
260
229
  state: ActiveSession['status'] | 'inactive';
261
230
  resumable: boolean;
@@ -351,7 +320,7 @@ export declare function groupSessionsByMachine(sessions: ActiveSession[], localM
351
320
  */
352
321
  export declare function dedupeByMachineSession(sessions: ActiveSession[]): ActiveSession[];
353
322
  /**
354
- * Narrow a gathered live set to the machines an explicit `--host`/`--device`
323
+ * Narrow a gathered live set to the machines an explicit `--device`
355
324
  * scope named. The gather picks which boxes to ASK; this asserts what the answer
356
325
  * may contain, and the two are not the same question: a host-dispatched run is
357
326
  * reported by the box that dispatched it while executing somewhere else, so
@@ -378,7 +347,6 @@ export declare function mergeLocalFirst(sessions: SessionMeta[], localMachine: s
378
347
  * newline. The single seam shared by the local `--json` path and the
379
348
  * `--json --host` remote fan-out so both emit byte-identical row shapes.
380
349
  */
381
- export declare function serializeSessionsJson(sessions: SessionMeta[]): string;
382
350
  /** The intentionally small metadata contract emitted by `sessions --resolve`.
383
351
  * It includes only launch identity needed to route/resume. Transcript paths,
384
352
  * extracted plans, costs, and content stay on the machine that owns them. */
@@ -393,14 +361,14 @@ export declare function parseRemoteComputerSessionRows(stdout: string, machine:
393
361
  export declare function gatherRemoteComputerSessionRows(hosts?: string[]): Promise<ComputerRunRow[]>;
394
362
  /**
395
363
  * Whether the local machine's sessions belong in an `--active` view. Local is
396
- * included by default; an explicit `--host`/`--device` list scopes the view to
364
+ * included by default; an explicit `--device` list scopes the view to
397
365
  * exactly those machines, so local is dropped unless it is itself named (by
398
366
  * alias or `user@host`, matched on the normalized machine id). Exported for
399
367
  * unit testing without touching SSH or the live process table.
400
368
  */
401
369
  export declare function shouldIncludeLocal(hosts: string[] | undefined, self: string): boolean;
402
370
  /**
403
- * The peers to dial for an `--active` view. No `--host` → `undefined`, which
371
+ * The peers to dial for an `--active` view. No `--device` → `undefined`, which
404
372
  * tells `gatherRemoteActive` to sweep the registered online devices. An
405
373
  * explicit list → exactly those, minus this machine (its sessions come from the
406
374
  * local seed, so dialing self would be a wasted SSH and a spurious "unreachable"
@@ -412,9 +380,9 @@ export declare function remoteHostsToDial(hosts: string[] | undefined, self: str
412
380
  /**
413
381
  * The fleet-wide live-session set behind every `--active` surface. Local sessions
414
382
  * come from `getActiveSessions()` and (unless `--local`) the registered online
415
- * devices from `ag devices` are folded in over SSH. An explicit `--host`/`--device`
383
+ * devices from `ag devices` are folded in over SSH. An explicit `--device`
416
384
  * list SCOPES the sweep to exactly those machines — the local machine is included
417
- * only when it is itself named — so `--host` is a filter, not an addition.
385
+ * only when it is itself named — so `--device` is a filter, not an addition.
418
386
  *
419
387
  * This is the single gather: the static renderer AND the interactive browser both
420
388
  * call it, so the browser can never disagree with `--active --json` about which
@@ -424,7 +392,7 @@ export declare function remoteHostsToDial(hosts: string[] | undefined, self: str
424
392
  * RUSH-2062: default path is cache-first against the daemon-warmed shared
425
393
  * snapshot (`session-cache.ts`). Menubar / Factory / watchdog / CLI share one
426
394
  * warm result instead of each re-running the full SSH fan-out. `forceRefresh`
427
- * (or `AGENTS_SESSIONS_FORCE_REFRESH=1`) re-gathers live; scoped `--host` lists
395
+ * (or `AGENTS_SESSIONS_FORCE_REFRESH=1`) re-gathers live; scoped `--device` lists
428
396
  * always gather live so a filter never returns a wrong unscoped snapshot.
429
397
  */
430
398
  export declare function gatherActiveSessions(opts?: {
@@ -434,6 +402,9 @@ export declare function gatherActiveSessions(opts?: {
434
402
  }): Promise<{
435
403
  sessions: ActiveSession[];
436
404
  remoteDeviceCount: number;
405
+ /** Peer names that went unheard on this gather (RUSH-2507). Undefined when unknown (e.g. a cache hit). */
406
+ remoteSkipped?: string[];
407
+ remoteDiscoveryFailed?: boolean;
437
408
  }>;
438
409
  /** Apply the routine selector to enriched live rows for every non-browser active view. */
439
410
  export declare function filterActiveSessionsByRoutine(sessions: ActiveSession[], routine: boolean | string | undefined): ActiveSession[];
@@ -445,8 +416,8 @@ export declare function requestedLiveStatuses(options: SessionsOptions): LiveSta
445
416
  /**
446
417
  * A bare interactive fleet listing — no query, no render/filter flag — that the
447
418
  * `runSessionBrowser` picker can represent. The single predicate shared by the
448
- * bare-browser branch and the `--host` early-return guard so they can't drift:
449
- * when this holds, an explicit `--host`/`--device` scope is folded into the
419
+ * bare-browser branch and the `--device` early-return guard so they can't drift:
420
+ * when this holds, an explicit `--device` scope is folded into the
450
421
  * browser (preview-rich, selectable) instead of the legacy per-host raw stream.
451
422
  */
452
423
  export declare function isBareBrowserListing(options: SessionsOptions, query: string | undefined): boolean;
@@ -907,14 +878,51 @@ export declare function metadataResolveOutcome(localMatches: SessionMeta[], remo
907
878
  sessions: SessionMeta[];
908
879
  unreachable: string[];
909
880
  }, selector: string): MetadataResolveOutcome;
910
- /** Reusable local-first resolver for `agents run --resume` and `agents resume`.
881
+ /** Injectable dependency for the live-registry cold-miss fallback (RUSH-2682). */
882
+ export type LiveMetadataDeps = {
883
+ loadActive?: typeof loadLocalActiveSessions;
884
+ };
885
+ /**
886
+ * Local metadata candidates for a selector: the indexed SQLite rows, plus — when
887
+ * an id-shaped selector misses the index entirely — the live-session registry
888
+ * (RUSH-2682).
889
+ *
890
+ * Indexing is lazy (it only runs inside `discoverSessions`), so a session THIS
891
+ * box just started is "running" in `agents sessions --active` minutes before its
892
+ * transcript reaches the local index. Every id resolver (`preview`, `resume`,
893
+ * `focus`, and the fan-out peer that answers `--resolve-safe-v1`) therefore
894
+ * consults the SAME live registry `--active` reads before declaring a running
895
+ * session non-existent. It reshapes process state the registry already computed;
896
+ * it parses no transcript and renders nothing. The live path is entered ONLY on a
897
+ * cold id miss, so an indexed hit keeps its richer row and keyword resolution is
898
+ * unchanged.
899
+ */
900
+ export declare function computeLocalMetadataMatches(selector: string, scope: {
901
+ agent?: string;
902
+ project?: string;
903
+ local?: boolean;
904
+ hosts?: string[];
905
+ }, deps?: LiveMetadataDeps): Promise<SessionMeta[]>;
906
+ /**
907
+ * Resolve an id-shaped selector against the local live-session registry
908
+ * (RUSH-2682). Reads the daemon-warmed active snapshot first (cheap); if that
909
+ * snapshot predates a just-started session and misses, it forces ONE fresh
910
+ * gather before conceding, so a session started seconds ago resolves
911
+ * synchronously. Never throws — a degraded registry read yields no candidates,
912
+ * so the caller falls through to the ordinary not-found path.
913
+ */
914
+ export declare function liveMetadataMatches(selector: string, scope: {
915
+ agent?: string;
916
+ project?: string;
917
+ }, self: string, deps?: LiveMetadataDeps): Promise<SessionMeta[]>;
918
+ /** Reusable local-first resolver for `agents run --resume` and `agents sessions resume`.
911
919
  * Full UUIDs hit the local SQLite index without any SSH fan-out. */
912
920
  export declare function resolveSessionMetadataValue(selector: string, scope?: {
913
921
  agent?: string;
914
922
  project?: string;
915
923
  local?: boolean;
916
924
  hosts?: string[];
917
- }, deps?: Pick<FleetResolveDeps, 'gatherRemoteList'>): Promise<MetadataResolveOutcome>;
925
+ }, deps?: Pick<FleetResolveDeps, 'gatherRemoteList'> & LiveMetadataDeps): Promise<MetadataResolveOutcome>;
918
926
  /** Resolve one selector to indexed metadata across the fleet without reading or
919
927
  * rendering transcript events. A peer answering the parent sweep returns every
920
928
  * local candidate; the parent performs the one logical-session uniqueness gate.
@@ -926,7 +934,7 @@ export declare function resolveSessionMetadata(selector: string, scope: {
926
934
  project?: string;
927
935
  local?: boolean;
928
936
  hosts?: string[];
929
- }, deps?: Pick<FleetResolveDeps, 'gatherRemoteList'>): Promise<void>;
937
+ }, deps?: Pick<FleetResolveDeps, 'gatherRemoteList'> & LiveMetadataDeps): Promise<void>;
930
938
  /**
931
939
  * Locate a full session id or short id prefix across the online fleet and render it from the machine
932
940
  * that holds it. The local disk already missed; this fans `sessions <id> --json
@@ -934,7 +942,7 @@ export declare function resolveSessionMetadata(selector: string, scope: {
934
942
  * groups the rows to distinct machines, then:
935
943
  *
936
944
  * - exactly one logical session → delegate rendering to one peer via `runOnPeer`
937
- * (its transcript and agent binary live there — a local `--host` hop would
945
+ * (its transcript and agent binary live there — a local `--device` hop would
938
946
  * re-discover locally and dead-end), returning `'rendered'`.
939
947
  * - more than one logical session → print every full-id candidate with its
940
948
  * machine labels, returning `{ kind: 'conflict' }`.
@@ -961,4 +969,3 @@ export type FleetResolveResult = {
961
969
  export declare function resolveSessionAcrossFleet(query: string, mode: ViewMode, hosts?: string[], deps?: FleetResolveDeps): Promise<FleetResolveResult>;
962
970
  /** Register the `agents sessions` command with all its options and help text. */
963
971
  export declare function registerSessionsCommands(program: Command): void;
964
- export {};