@phnx-labs/agents-cli 1.22.39 → 1.22.41

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 (569) hide show
  1. package/CHANGELOG.md +316 -0
  2. package/README.md +116 -70
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.js +45 -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 +259 -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.d.ts +15 -0
  13. package/dist/commands/browser.js +318 -131
  14. package/dist/commands/budget.d.ts +7 -6
  15. package/dist/commands/budget.js +8 -7
  16. package/dist/commands/cloud.js +17 -20
  17. package/dist/commands/commands.js +1 -1
  18. package/dist/commands/computer-actions.d.ts +1 -35
  19. package/dist/commands/computer-actions.js +13 -181
  20. package/dist/commands/computer.d.ts +28 -3
  21. package/dist/commands/computer.js +93 -65
  22. package/dist/commands/config.js +16 -3
  23. package/dist/commands/cost.d.ts +2 -1
  24. package/dist/commands/cost.js +7 -6
  25. package/dist/commands/daemon.js +151 -4
  26. package/dist/commands/detach.js +1 -1
  27. package/dist/commands/doctor.js +19 -11
  28. package/dist/commands/events.js +1 -1
  29. package/dist/commands/exec.d.ts +2 -50
  30. package/dist/commands/exec.js +160 -215
  31. package/dist/commands/factory.js +1 -1
  32. package/dist/commands/feed.d.ts +2 -2
  33. package/dist/commands/feed.js +12 -23
  34. package/dist/commands/fleet-capture.js +25 -27
  35. package/dist/commands/focus.d.ts +2 -3
  36. package/dist/commands/focus.js +34 -9
  37. package/dist/commands/go.js +15 -5
  38. package/dist/commands/harness.d.ts +3 -3
  39. package/dist/commands/harness.js +53 -5
  40. package/dist/commands/hooks.js +1 -1
  41. package/dist/commands/import.js +2 -2
  42. package/dist/commands/insights.d.ts +5 -5
  43. package/dist/commands/insights.js +15 -9
  44. package/dist/commands/inspect.d.ts +2 -3
  45. package/dist/commands/inspect.js +4 -16
  46. package/dist/commands/logs.d.ts +2 -2
  47. package/dist/commands/logs.js +9 -9
  48. package/dist/commands/mcp.js +2 -2
  49. package/dist/commands/memory.js +1 -1
  50. package/dist/commands/message.d.ts +1 -1
  51. package/dist/commands/message.js +7 -7
  52. package/dist/commands/mine.d.ts +11 -8
  53. package/dist/commands/mine.js +11 -10
  54. package/dist/commands/models.js +1 -1
  55. package/dist/commands/modes.js +1 -1
  56. package/dist/commands/monitors.js +23 -6
  57. package/dist/commands/output.d.ts +7 -6
  58. package/dist/commands/output.js +11 -10
  59. package/dist/commands/packages.js +4 -4
  60. package/dist/commands/perf.js +1 -1
  61. package/dist/commands/permissions.js +49 -32
  62. package/dist/commands/plugins.d.ts +1 -1
  63. package/dist/commands/plugins.js +3 -3
  64. package/dist/commands/profiles.d.ts +6 -9
  65. package/dist/commands/profiles.js +8 -321
  66. package/dist/commands/projects.d.ts +9 -0
  67. package/dist/commands/projects.js +140 -8
  68. package/dist/commands/prune.js +5 -13
  69. package/dist/commands/refresh-rules.js +1 -1
  70. package/dist/commands/repo.d.ts +5 -7
  71. package/dist/commands/repo.js +34 -18
  72. package/dist/commands/resource-view.js +4 -0
  73. package/dist/commands/resume.d.ts +11 -7
  74. package/dist/commands/resume.js +82 -98
  75. package/dist/commands/route.d.ts +12 -0
  76. package/dist/commands/route.js +261 -0
  77. package/dist/commands/routines.d.ts +2 -3
  78. package/dist/commands/routines.js +120 -145
  79. package/dist/commands/rules.js +1 -1
  80. package/dist/commands/run-account-picker.d.ts +1 -1
  81. package/dist/commands/run-account-picker.js +2 -2
  82. package/dist/commands/run-broadcast.d.ts +21 -0
  83. package/dist/commands/run-broadcast.js +89 -0
  84. package/dist/commands/run-cloud.js +1 -1
  85. package/dist/commands/secrets-vault.d.ts +10 -0
  86. package/dist/commands/{login.js → secrets-vault.js} +34 -14
  87. package/dist/commands/secrets.d.ts +4 -4
  88. package/dist/commands/secrets.js +158 -159
  89. package/dist/commands/sessions-backfill.js +1 -1
  90. package/dist/commands/sessions-browser.d.ts +1 -1
  91. package/dist/commands/sessions-browser.js +9 -5
  92. package/dist/commands/sessions-export.js +2 -2
  93. package/dist/commands/sessions-inject.js +4 -5
  94. package/dist/commands/sessions-migrate.js +16 -27
  95. package/dist/commands/sessions-picker.d.ts +14 -0
  96. package/dist/commands/sessions-picker.js +209 -13
  97. package/dist/commands/sessions-resume.d.ts +7 -3
  98. package/dist/commands/sessions-resume.js +81 -33
  99. package/dist/commands/sessions-share.d.ts +25 -0
  100. package/dist/commands/sessions-share.js +166 -0
  101. package/dist/commands/sessions-stats.js +2 -2
  102. package/dist/commands/sessions.d.ts +75 -68
  103. package/dist/commands/sessions.js +144 -180
  104. package/dist/commands/setup-browser.js +1 -1
  105. package/dist/commands/setup-computer.js +1 -1
  106. package/dist/commands/setup-fleet.js +3 -0
  107. package/dist/commands/setup-mine.d.ts +7 -3
  108. package/dist/commands/setup-mine.js +13 -8
  109. package/dist/commands/setup-preferences.js +2 -2
  110. package/dist/commands/setup-secrets.js +2 -2
  111. package/dist/commands/setup-watchdog.js +2 -2
  112. package/dist/commands/setup.js +7 -2
  113. package/dist/commands/share.d.ts +65 -0
  114. package/dist/commands/share.js +253 -20
  115. package/dist/commands/skills.js +3 -3
  116. package/dist/commands/snapshot.d.ts +2 -2
  117. package/dist/commands/snapshot.js +9 -9
  118. package/dist/commands/ssh.d.ts +1 -1
  119. package/dist/commands/ssh.js +186 -64
  120. package/dist/commands/subagents.js +1 -1
  121. package/dist/commands/sync.js +24 -9
  122. package/dist/commands/teams.d.ts +2 -2
  123. package/dist/commands/teams.js +9 -18
  124. package/dist/commands/tmux.js +5 -1
  125. package/dist/commands/trash.js +1 -1
  126. package/dist/commands/usage.d.ts +1 -1
  127. package/dist/commands/usage.js +2 -2
  128. package/dist/commands/utils.d.ts +4 -14
  129. package/dist/commands/utils.js +6 -27
  130. package/dist/commands/versions.js +2 -2
  131. package/dist/commands/view.d.ts +9 -77
  132. package/dist/commands/view.js +23 -8
  133. package/dist/commands/watchdog.js +1 -1
  134. package/dist/commands/webhook.js +25 -34
  135. package/dist/commands/workflows.js +1 -1
  136. package/dist/index.js +1 -1
  137. package/dist/lib/account-capabilities.d.ts +39 -0
  138. package/dist/lib/account-capabilities.js +59 -0
  139. package/dist/lib/account-catalog.js +1 -1
  140. package/dist/lib/account-registry.d.ts +66 -0
  141. package/dist/lib/account-registry.js +151 -5
  142. package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
  143. package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
  144. package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
  145. package/dist/lib/{usage.js → accounting/usage.js} +11 -11
  146. package/dist/lib/agent-spec/provider.js +1 -1
  147. package/dist/lib/agents.d.ts +72 -4
  148. package/dist/lib/agents.js +231 -199
  149. package/dist/lib/answer-router.d.ts +2 -2
  150. package/dist/lib/ask-classifier.d.ts +1 -1
  151. package/dist/lib/ask-classifier.js +1 -1
  152. package/dist/lib/audit/log.js +1 -1
  153. package/dist/lib/auth-health.d.ts +1 -1
  154. package/dist/lib/auth-health.js +2 -2
  155. package/dist/lib/brand.js +1 -1
  156. package/dist/lib/browser/caller-identity.d.ts +28 -0
  157. package/dist/lib/browser/caller-identity.js +156 -0
  158. package/dist/lib/browser/cdp.js +5 -1
  159. package/dist/lib/browser/chrome.js +12 -1
  160. package/dist/lib/browser/drivers/ssh.d.ts +1 -1
  161. package/dist/lib/browser/drivers/ssh.js +3 -2
  162. package/dist/lib/browser/hygiene.d.ts +10 -2
  163. package/dist/lib/browser/hygiene.js +7 -4
  164. package/dist/lib/browser/ipc.d.ts +22 -2
  165. package/dist/lib/browser/ipc.js +185 -21
  166. package/dist/lib/browser/profiles.d.ts +69 -5
  167. package/dist/lib/browser/profiles.js +135 -13
  168. package/dist/lib/browser/remote-control.d.ts +2 -2
  169. package/dist/lib/browser/remote-control.js +3 -3
  170. package/dist/lib/browser/runtime-state.d.ts +79 -0
  171. package/dist/lib/browser/runtime-state.js +119 -1
  172. package/dist/lib/browser/service.d.ts +137 -2
  173. package/dist/lib/browser/service.js +492 -54
  174. package/dist/lib/browser/sessions-list.d.ts +2 -1
  175. package/dist/lib/browser/sessions-list.js +4 -13
  176. package/dist/lib/browser/types.d.ts +19 -1
  177. package/dist/lib/budget/config.js +1 -1
  178. package/dist/lib/budget/ledger.js +1 -1
  179. package/dist/lib/byok-usage.js +1 -1
  180. package/dist/lib/capabilities.js +3 -15
  181. package/dist/lib/catchup.d.ts +1 -1
  182. package/dist/lib/catchup.js +1 -1
  183. package/dist/lib/cloud/dispatch.js +1 -1
  184. package/dist/lib/cloud/host.d.ts +3 -3
  185. package/dist/lib/cloud/host.js +5 -5
  186. package/dist/lib/cloud/rush.d.ts +9 -21
  187. package/dist/lib/cloud/rush.js +33 -120
  188. package/dist/lib/cloud/types.d.ts +2 -2
  189. package/dist/lib/commands.js +3 -13
  190. package/dist/lib/computer/actions.d.ts +36 -0
  191. package/dist/lib/computer/actions.js +162 -0
  192. package/dist/lib/computer/dispatch.d.ts +2 -2
  193. package/dist/lib/computer/dispatch.js +2 -2
  194. package/dist/lib/computer/sessions-list.d.ts +3 -3
  195. package/dist/lib/computer/sessions-list.js +2 -2
  196. package/dist/lib/config-keys.d.ts +2 -1
  197. package/dist/lib/config-keys.js +8 -4
  198. package/dist/lib/config-machine-keys.d.ts +4 -2
  199. package/dist/lib/config-machine-keys.js +5 -2
  200. package/dist/lib/crabbox/lease.js +9 -1
  201. package/dist/lib/crabbox/runtimes.d.ts +32 -7
  202. package/dist/lib/crabbox/runtimes.js +72 -30
  203. package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
  204. package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
  205. package/dist/lib/daemon-services.d.ts +1 -1
  206. package/dist/lib/daemon-services.js +5 -0
  207. package/dist/lib/daemon-ticks.d.ts +25 -0
  208. package/dist/lib/daemon-ticks.js +31 -1
  209. package/dist/lib/daemon-webhooks.d.ts +104 -0
  210. package/dist/lib/daemon-webhooks.js +215 -0
  211. package/dist/lib/device-config.d.ts +85 -75
  212. package/dist/lib/device-config.js +280 -142
  213. package/dist/lib/devices/config-migration.d.ts +29 -34
  214. package/dist/lib/devices/config-migration.js +209 -130
  215. package/dist/lib/devices/connect.d.ts +2 -2
  216. package/dist/lib/devices/connect.js +2 -2
  217. package/dist/lib/devices/discovery-policy.d.ts +30 -0
  218. package/dist/lib/devices/discovery-policy.js +101 -0
  219. package/dist/lib/devices/fleet-inventory.js +8 -3
  220. package/dist/lib/devices/harness-inventory.d.ts +1 -1
  221. package/dist/lib/devices/harness-inventory.js +12 -3
  222. package/dist/lib/devices/known-hosts.js +1 -1
  223. package/dist/lib/devices/pool.d.ts +10 -5
  224. package/dist/lib/devices/pool.js +5 -7
  225. package/dist/lib/devices/registry.d.ts +1 -1
  226. package/dist/lib/devices/registry.js +1 -1
  227. package/dist/lib/devices/resolve-profile.d.ts +2 -2
  228. package/dist/lib/devices/resolve-profile.js +2 -2
  229. package/dist/lib/devices/resolve-target.d.ts +1 -1
  230. package/dist/lib/devices/resolve-target.js +4 -4
  231. package/dist/lib/devices/self-host.d.ts +1 -1
  232. package/dist/lib/devices/self-host.js +3 -3
  233. package/dist/lib/devices/ssh-config.d.ts +1 -1
  234. package/dist/lib/devices/stats-cache.js +1 -1
  235. package/dist/lib/devices/sync.d.ts +3 -1
  236. package/dist/lib/devices/sync.js +3 -3
  237. package/dist/lib/doctor-diff.js +4 -4
  238. package/dist/lib/drift-sync.js +2 -2
  239. package/dist/lib/drift.js +2 -2
  240. package/dist/lib/event-families.d.ts +1 -1
  241. package/dist/lib/event-stream.d.ts +1 -1
  242. package/dist/lib/event-stream.js +2 -2
  243. package/dist/lib/events-ingest.js +2 -2
  244. package/dist/lib/exec.d.ts +4 -4
  245. package/dist/lib/exec.js +11 -11
  246. package/dist/lib/factory/snapshot.d.ts +1 -1
  247. package/dist/lib/factory/snapshot.js +1 -1
  248. package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
  249. package/dist/lib/{activity.js → feed/activity.js} +7 -7
  250. package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
  251. package/dist/lib/{events.js → feed/events.js} +5 -5
  252. package/dist/lib/{feed.js → feed/feed.js} +4 -4
  253. package/dist/lib/feed-outcome.d.ts +1 -1
  254. package/dist/lib/feed-policy.d.ts +1 -1
  255. package/dist/lib/feed-policy.js +1 -1
  256. package/dist/lib/feed-post.d.ts +1 -1
  257. package/dist/lib/feed-post.js +1 -1
  258. package/dist/lib/feed-ranking.d.ts +1 -1
  259. package/dist/lib/fleet/apply.d.ts +0 -6
  260. package/dist/lib/fleet/apply.js +18 -45
  261. package/dist/lib/fleet/auth-sync.d.ts +16 -35
  262. package/dist/lib/fleet/auth-sync.js +16 -75
  263. package/dist/lib/fleet/capture.js +8 -6
  264. package/dist/lib/fleet/manifest.js +23 -11
  265. package/dist/lib/fleet/types.d.ts +19 -7
  266. package/dist/lib/fleet-cache.d.ts +1 -1
  267. package/dist/lib/fleet-cache.js +1 -1
  268. package/dist/lib/format.d.ts +19 -0
  269. package/dist/lib/format.js +44 -1
  270. package/dist/lib/friction-heuristics.d.ts +1 -1
  271. package/dist/lib/git.d.ts +24 -1
  272. package/dist/lib/git.js +82 -38
  273. package/dist/lib/heal.js +3 -3
  274. package/dist/lib/hooks.d.ts +18 -0
  275. package/dist/lib/hooks.js +113 -1
  276. package/dist/lib/hosts/credentials.d.ts +30 -10
  277. package/dist/lib/hosts/credentials.js +38 -26
  278. package/dist/lib/hosts/dispatch.d.ts +3 -3
  279. package/dist/lib/hosts/dispatch.js +3 -3
  280. package/dist/lib/hosts/option.d.ts +3 -3
  281. package/dist/lib/hosts/option.js +7 -8
  282. package/dist/lib/hosts/passthrough.d.ts +17 -17
  283. package/dist/lib/hosts/passthrough.js +67 -50
  284. package/dist/lib/hosts/providers/devices.d.ts +1 -1
  285. package/dist/lib/hosts/providers/devices.js +1 -1
  286. package/dist/lib/hosts/reconcile.d.ts +1 -1
  287. package/dist/lib/hosts/reconcile.js +1 -1
  288. package/dist/lib/hosts/reconnect.d.ts +1 -1
  289. package/dist/lib/hosts/reconnect.js +2 -2
  290. package/dist/lib/hosts/registry.d.ts +5 -5
  291. package/dist/lib/hosts/registry.js +5 -5
  292. package/dist/lib/hosts/remote-cmd.d.ts +10 -10
  293. package/dist/lib/hosts/remote-cmd.js +25 -18
  294. package/dist/lib/hosts/remote-os.d.ts +4 -4
  295. package/dist/lib/hosts/remote-os.js +4 -4
  296. package/dist/lib/hosts/remote-session-id.d.ts +2 -2
  297. package/dist/lib/hosts/remote-session-id.js +2 -2
  298. package/dist/lib/hosts/routing-flag.d.ts +3 -3
  299. package/dist/lib/hosts/routing-flag.js +4 -5
  300. package/dist/lib/hosts/run-target.d.ts +4 -4
  301. package/dist/lib/hosts/run-target.js +4 -4
  302. package/dist/lib/hosts/session-index.d.ts +2 -2
  303. package/dist/lib/hosts/session-index.js +1 -1
  304. package/dist/lib/hosts/session-marker.d.ts +1 -1
  305. package/dist/lib/hosts/session-marker.js +1 -1
  306. package/dist/lib/hosts/types.d.ts +2 -2
  307. package/dist/lib/hosts/types.js +2 -2
  308. package/dist/lib/import.js +1 -1
  309. package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +13 -1
  310. package/dist/lib/{migrate.js → installations/migrate.js} +160 -40
  311. package/dist/lib/installations/resolve.js +1 -1
  312. package/dist/lib/installations/strategies.js +1 -1
  313. package/dist/lib/installations/update.js +2 -2
  314. package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
  315. package/dist/lib/{versions.js → installations/versions.js} +51 -31
  316. package/dist/lib/isolation-boundary-report.js +1 -1
  317. package/dist/lib/linear-projects.d.ts +28 -0
  318. package/dist/lib/linear-projects.js +30 -0
  319. package/dist/lib/loop.js +1 -1
  320. package/dist/lib/mailbox-gc.js +1 -1
  321. package/dist/lib/mailbox.js +1 -1
  322. package/dist/lib/mcp-registry.d.ts +62 -0
  323. package/dist/lib/mcp-registry.js +177 -0
  324. package/dist/lib/mcp.d.ts +5 -0
  325. package/dist/lib/mcp.js +124 -307
  326. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  327. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  328. package/dist/lib/menubar/install-menubar.d.ts +7 -0
  329. package/dist/lib/menubar/install-menubar.js +24 -6
  330. package/dist/lib/menubar/snapshot.d.ts +7 -0
  331. package/dist/lib/menubar/snapshot.js +8 -6
  332. package/dist/lib/models.js +1 -1
  333. package/dist/lib/monitors/config.d.ts +12 -0
  334. package/dist/lib/monitors/config.js +3 -0
  335. package/dist/lib/monitors/dispatch.js +26 -5
  336. package/dist/lib/monitors/engine.js +10 -0
  337. package/dist/lib/monitors/sources/webhook.d.ts +1 -1
  338. package/dist/lib/monitors/state.d.ts +42 -0
  339. package/dist/lib/monitors/state.js +30 -0
  340. package/dist/lib/notify.d.ts +1 -1
  341. package/dist/lib/observe-aliases.d.ts +3 -3
  342. package/dist/lib/observe-aliases.js +3 -21
  343. package/dist/lib/output/git-output.js +2 -2
  344. package/dist/lib/overdue.d.ts +1 -1
  345. package/dist/lib/overdue.js +1 -1
  346. package/dist/lib/permissions-registry.d.ts +65 -0
  347. package/dist/lib/permissions-registry.js +599 -0
  348. package/dist/lib/permissions.d.ts +24 -13
  349. package/dist/lib/permissions.js +52 -271
  350. package/dist/lib/picker.d.ts +16 -0
  351. package/dist/lib/picker.js +33 -3
  352. package/dist/lib/placement.d.ts +1 -1
  353. package/dist/lib/placement.js +4 -4
  354. package/dist/lib/platform/paths.d.ts +8 -0
  355. package/dist/lib/platform/paths.js +11 -0
  356. package/dist/lib/platform/posixpath.js +3 -3
  357. package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
  358. package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
  359. package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
  360. package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
  361. package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
  362. package/dist/lib/{skills.js → plugins/skills.js} +7 -7
  363. package/dist/lib/pricing/cost.d.ts +1 -1
  364. package/dist/lib/pricing/cost.js +1 -1
  365. package/dist/lib/profiles-presets.d.ts +1 -1
  366. package/dist/lib/profiles-presets.js +1 -1
  367. package/dist/lib/profiles.js +2 -2
  368. package/dist/lib/project-import.js +4 -1
  369. package/dist/lib/project-key.js +7 -0
  370. package/dist/lib/project-launch.d.ts +1 -1
  371. package/dist/lib/project-launch.js +3 -3
  372. package/dist/lib/project-pull.d.ts +128 -0
  373. package/dist/lib/project-pull.js +384 -0
  374. package/dist/lib/project-root.d.ts +2 -2
  375. package/dist/lib/project-root.js +2 -2
  376. package/dist/lib/project-status.js +1 -1
  377. package/dist/lib/projects.d.ts +23 -0
  378. package/dist/lib/projects.js +29 -6
  379. package/dist/lib/refresh.d.ts +12 -1
  380. package/dist/lib/refresh.js +16 -9
  381. package/dist/lib/registry.d.ts +9 -2
  382. package/dist/lib/registry.js +11 -4
  383. package/dist/lib/resources.d.ts +2 -2
  384. package/dist/lib/resources.js +2 -2
  385. package/dist/lib/routers.d.ts +81 -0
  386. package/dist/lib/routers.js +153 -0
  387. package/dist/lib/routine-context.d.ts +1 -0
  388. package/dist/lib/routine-context.js +7 -2
  389. package/dist/lib/routine-notify-owner.d.ts +1 -1
  390. package/dist/lib/routine-notify.d.ts +1 -1
  391. package/dist/lib/routine-notify.js +1 -1
  392. package/dist/lib/routine-process-cleanup.d.ts +1 -1
  393. package/dist/lib/routine-readiness.d.ts +1 -1
  394. package/dist/lib/routine-readiness.js +11 -4
  395. package/dist/lib/routines-placement.d.ts +12 -2
  396. package/dist/lib/routines-placement.js +20 -3
  397. package/dist/lib/routines-project.d.ts +1 -1
  398. package/dist/lib/routines-project.js +1 -1
  399. package/dist/lib/rules/compile.d.ts +1 -0
  400. package/dist/lib/rules/compile.js +10 -2
  401. package/dist/lib/rules/rules.js +1 -1
  402. package/dist/lib/run-notify.js +1 -1
  403. package/dist/lib/runner.d.ts +80 -2
  404. package/dist/lib/runner.js +261 -67
  405. package/dist/lib/sandbox.d.ts +1 -1
  406. package/dist/lib/scheduler.d.ts +1 -1
  407. package/dist/lib/scheduler.js +1 -1
  408. package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
  409. package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
  410. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  411. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  412. package/dist/lib/secrets/agent.js +2 -2
  413. package/dist/lib/secrets/audit.js +1 -1
  414. package/dist/lib/secrets/bundles.d.ts +4 -4
  415. package/dist/lib/secrets/bundles.js +8 -8
  416. package/dist/lib/secrets/headless.d.ts +16 -0
  417. package/dist/lib/secrets/headless.js +21 -0
  418. package/dist/lib/secrets/index.js +1 -1
  419. package/dist/lib/secrets/list-filter.d.ts +1 -1
  420. package/dist/lib/secrets/list-filter.js +2 -2
  421. package/dist/lib/secrets/push.d.ts +1 -1
  422. package/dist/lib/secrets/push.js +10 -12
  423. package/dist/lib/secrets/remote.d.ts +21 -17
  424. package/dist/lib/secrets/remote.js +39 -23
  425. package/dist/lib/secrets/vault.js +2 -2
  426. package/dist/lib/self-heal/checks/shadowing.js +1 -1
  427. package/dist/lib/self-heal/checks/shims.js +1 -1
  428. package/dist/lib/self-update.d.ts +39 -4
  429. package/dist/lib/self-update.js +78 -25
  430. package/dist/lib/serve/control.d.ts +1 -1
  431. package/dist/lib/serve/control.js +4 -4
  432. package/dist/lib/serve/data.d.ts +1 -1
  433. package/dist/lib/serve/data.js +1 -1
  434. package/dist/lib/serve/stream.js +1 -1
  435. package/dist/lib/service-manifest.d.ts +29 -0
  436. package/dist/lib/service-manifest.js +80 -0
  437. package/dist/lib/session/active.d.ts +59 -7
  438. package/dist/lib/session/active.js +158 -17
  439. package/dist/lib/session/bash-command.js +1 -1
  440. package/dist/lib/session/claude-accounts.d.ts +1 -1
  441. package/dist/lib/session/claude-accounts.js +1 -1
  442. package/dist/lib/session/db.d.ts +10 -2
  443. package/dist/lib/session/db.js +25 -6
  444. package/dist/lib/session/discover.d.ts +77 -0
  445. package/dist/lib/session/discover.js +130 -25
  446. package/dist/lib/session/fork.js +1 -1
  447. package/dist/lib/session/inject.d.ts +1 -1
  448. package/dist/lib/session/insights.d.ts +1 -1
  449. package/dist/lib/session/insights.js +1 -1
  450. package/dist/lib/session/live-metadata.d.ts +15 -0
  451. package/dist/lib/session/live-metadata.js +76 -0
  452. package/dist/lib/session/migrate-targets.d.ts +1 -1
  453. package/dist/lib/session/recovery.d.ts +1 -1
  454. package/dist/lib/session/recovery.js +2 -2
  455. package/dist/lib/session/remote-active.d.ts +10 -1
  456. package/dist/lib/session/remote-active.js +8 -3
  457. package/dist/lib/session/remote-bundle.d.ts +1 -1
  458. package/dist/lib/session/remote-bundle.js +2 -2
  459. package/dist/lib/session/remote-list.d.ts +15 -4
  460. package/dist/lib/session/remote-list.js +40 -3
  461. package/dist/lib/session/remote.d.ts +5 -5
  462. package/dist/lib/session/remote.js +13 -17
  463. package/dist/lib/session/resume-command.d.ts +3 -2
  464. package/dist/lib/session/resume-command.js +4 -3
  465. package/dist/lib/session/resume-owner.d.ts +3 -3
  466. package/dist/lib/session/resume-owner.js +3 -3
  467. package/dist/lib/session/session-cache.d.ts +12 -0
  468. package/dist/lib/session/session-cache.js +2 -0
  469. package/dist/lib/session/share-html.d.ts +55 -0
  470. package/dist/lib/session/share-html.js +319 -0
  471. package/dist/lib/session/shell-programs.js +1 -1
  472. package/dist/lib/session/state.js +5 -5
  473. package/dist/lib/session/team-filter.d.ts +1 -1
  474. package/dist/lib/session/team-filter.js +1 -1
  475. package/dist/lib/session/types.d.ts +3 -3
  476. package/dist/lib/session/width.d.ts +2 -2
  477. package/dist/lib/session/width.js +2 -2
  478. package/dist/lib/settings-manifest.d.ts +2 -0
  479. package/dist/lib/settings-manifest.js +81 -3
  480. package/dist/lib/share/delete.d.ts +21 -0
  481. package/dist/lib/share/delete.js +42 -0
  482. package/dist/lib/share/publish.d.ts +120 -0
  483. package/dist/lib/share/publish.js +243 -18
  484. package/dist/lib/share/worker-template.js +172 -9
  485. package/dist/lib/shims.js +35 -7
  486. package/dist/lib/smart-launch.d.ts +4 -4
  487. package/dist/lib/smart-launch.js +6 -4
  488. package/dist/lib/snapshot.d.ts +4 -4
  489. package/dist/lib/snapshot.js +2 -2
  490. package/dist/lib/ssh-exec.d.ts +1 -1
  491. package/dist/lib/ssh-exec.js +2 -2
  492. package/dist/lib/ssh-tunnel.d.ts +10 -10
  493. package/dist/lib/ssh-tunnel.js +12 -12
  494. package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
  495. package/dist/lib/staleness/checkers/hooks.js +1 -1
  496. package/dist/lib/staleness/detectors/permissions.js +0 -23
  497. package/dist/lib/staleness/detectors/plugins.js +1 -1
  498. package/dist/lib/staleness/fingerprint.js +1 -1
  499. package/dist/lib/staleness/layers.d.ts +1 -1
  500. package/dist/lib/staleness/layers.js +1 -1
  501. package/dist/lib/staleness/writers/mcp.js +3 -1
  502. package/dist/lib/staleness/writers/plugins.js +1 -1
  503. package/dist/lib/staleness/writers/types.d.ts +8 -0
  504. package/dist/lib/startup/command-registry.d.ts +6 -147
  505. package/dist/lib/startup/command-registry.js +40 -303
  506. package/dist/lib/startup/dev-build.d.ts +0 -21
  507. package/dist/lib/startup/dev-build.js +29 -8
  508. package/dist/lib/state.d.ts +19 -1
  509. package/dist/lib/state.js +120 -51
  510. package/dist/lib/subagents.js +1 -1
  511. package/dist/lib/sync-status.js +1 -1
  512. package/dist/lib/sync-umbrella.d.ts +6 -1
  513. package/dist/lib/sync-umbrella.js +9 -4
  514. package/dist/lib/teams/agents.js +2 -2
  515. package/dist/lib/teams/registry.js +1 -1
  516. package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
  517. package/dist/lib/terminal/engine.js +1 -1
  518. package/dist/lib/terminal/index.d.ts +4 -0
  519. package/dist/lib/terminal/index.js +3 -0
  520. package/dist/lib/terminal/inject.d.ts +2 -2
  521. package/dist/lib/terminal/inject.js +2 -2
  522. package/dist/lib/terminal/transport.js +1 -1
  523. package/dist/lib/tmux/index.d.ts +1 -1
  524. package/dist/lib/tmux/index.js +1 -1
  525. package/dist/lib/tmux/session.d.ts +21 -5
  526. package/dist/lib/tmux/session.js +76 -22
  527. package/dist/lib/triggers/handlers.d.ts +38 -3
  528. package/dist/lib/triggers/handlers.js +58 -7
  529. package/dist/lib/triggers/webhook.d.ts +113 -5
  530. package/dist/lib/triggers/webhook.js +223 -44
  531. package/dist/lib/types.d.ts +19 -7
  532. package/dist/lib/usage-fleet.d.ts +1 -1
  533. package/dist/lib/usage-fleet.js +1 -1
  534. package/dist/lib/usage-refresh.d.ts +1 -1
  535. package/dist/lib/usage-refresh.js +3 -3
  536. package/dist/lib/version-duplicates.js +2 -2
  537. package/dist/lib/view-types.d.ts +56 -0
  538. package/dist/lib/view-types.js +1 -0
  539. package/dist/lib/watchdog/rotate.d.ts +2 -2
  540. package/dist/lib/watchdog/rotate.js +3 -3
  541. package/dist/lib/watchdog/runner.d.ts +2 -3
  542. package/dist/lib/watchdog/runner.js +3 -4
  543. package/dist/lib/workflows.js +1 -1
  544. package/dist/lib/wrap.d.ts +33 -0
  545. package/dist/lib/wrap.js +70 -0
  546. package/package.json +2 -1
  547. package/scripts/postinstall.js +2 -2
  548. package/dist/commands/bench.d.ts +0 -2
  549. package/dist/commands/bench.js +0 -101
  550. package/dist/commands/cp.d.ts +0 -84
  551. package/dist/commands/cp.js +0 -231
  552. package/dist/commands/login.d.ts +0 -2
  553. package/dist/lib/resources/commands.d.ts +0 -46
  554. package/dist/lib/resources/commands.js +0 -211
  555. package/dist/lib/resources/hooks.d.ts +0 -16
  556. package/dist/lib/resources/hooks.js +0 -153
  557. package/dist/lib/resources/mcp.d.ts +0 -34
  558. package/dist/lib/resources/mcp.js +0 -250
  559. package/dist/lib/resources/memory.d.ts +0 -15
  560. package/dist/lib/resources/memory.js +0 -46
  561. package/dist/lib/resources/permissions.d.ts +0 -13
  562. package/dist/lib/resources/permissions.js +0 -202
  563. package/dist/lib/resources/rules.d.ts +0 -46
  564. package/dist/lib/resources/rules.js +0 -179
  565. package/dist/lib/resources/skills.d.ts +0 -37
  566. package/dist/lib/resources/skills.js +0 -247
  567. package/dist/lib/resources/subagents.d.ts +0 -46
  568. package/dist/lib/resources/subagents.js +0 -202
  569. /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)
@@ -0,0 +1,25 @@
1
+ import type { Command } from 'commander';
2
+ import type { SessionMeta } from '../lib/session/types.js';
3
+ import { type PublishOptions } from '../lib/share/publish.js';
4
+ interface ShareOptions {
5
+ public?: boolean;
6
+ slug?: string;
7
+ label?: string;
8
+ expire?: string;
9
+ reasoning: string;
10
+ force?: boolean;
11
+ cover?: boolean;
12
+ }
13
+ /** `session-<shortId>` — stable per session, so re-sharing updates the same URL. */
14
+ export declare function defaultSessionSlug(session: SessionMeta): string;
15
+ /**
16
+ * Map the command's flags onto {@link PublishOptions}.
17
+ *
18
+ * Extracted so the defaults are testable directly. `unlisted` in particular is the
19
+ * security-relevant one — it inverts the parent command's public-by-default
20
+ * behavior, and a test that re-implements this mapping would still pass with it
21
+ * flipped.
22
+ */
23
+ export declare function buildSharePublishOptions(session: SessionMeta, options: Pick<ShareOptions, 'public' | 'slug' | 'label' | 'expire' | 'force' | 'cover'>): PublishOptions;
24
+ export declare function registerSessionsShareCommand(sessionsCmd: Command): void;
25
+ export {};
@@ -0,0 +1,166 @@
1
+ /**
2
+ * `agents sessions share <id>` — publish one session transcript as a link.
3
+ *
4
+ * Composes three pieces that already existed but were never wired together:
5
+ * `renderSessionMarkdownDocument()` (redacted transcript),
6
+ * `renderSessionHtmlDocument()` (self-contained branded page), and
7
+ * `publishFile()` (the R2-backed share Worker). Before this, sharing a session
8
+ * meant three commands and a detour through the external artifacts-cli.
9
+ *
10
+ * Unlisted by default, unlike `agents artifacts share`. A transcript carries file
11
+ * paths, command output, error text, and whatever a tool printed — strictly more
12
+ * than a plan does — so it does not belong in the public `/<user>` gallery unless
13
+ * the operator asks for it with `--public`. The URL itself stays world-readable:
14
+ * unlisted is a capability URL, not a secret.
15
+ */
16
+ import * as fs from 'fs';
17
+ import * as os from 'os';
18
+ import * as path from 'path';
19
+ import chalk from 'chalk';
20
+ import { setHelpSections } from '../lib/help.js';
21
+ import { knownSecretValuesFromEnv } from '../lib/redact.js';
22
+ import { discoverSessions } from '../lib/session/discover.js';
23
+ import { renderSessionHtmlDocument } from '../lib/session/share-html.js';
24
+ import { publishFile, redactEmails } from '../lib/share/publish.js';
25
+ import { renderSessionMarkdownDocument } from './sessions-render.js';
26
+ import { selectSessions } from './sessions-export.js';
27
+ import { parseAgentFilter } from './sessions.js';
28
+ function parseReasoning(value) {
29
+ if (value === 'omit' || value === 'fold' || value === 'include')
30
+ return value;
31
+ throw new Error(`Unknown reasoning mode "${value}". Expected omit, fold, or include.`);
32
+ }
33
+ /** `session-<shortId>` — stable per session, so re-sharing updates the same URL. */
34
+ export function defaultSessionSlug(session) {
35
+ return `session-${session.shortId || session.id}`;
36
+ }
37
+ /**
38
+ * Map the command's flags onto {@link PublishOptions}.
39
+ *
40
+ * Extracted so the defaults are testable directly. `unlisted` in particular is the
41
+ * security-relevant one — it inverts the parent command's public-by-default
42
+ * behavior, and a test that re-implements this mapping would still pass with it
43
+ * flipped.
44
+ */
45
+ export function buildSharePublishOptions(session, options) {
46
+ return {
47
+ slug: options.slug ?? defaultSessionSlug(session),
48
+ unlisted: options.public !== true,
49
+ expire: options.expire,
50
+ force: options.force === true,
51
+ cover: options.cover !== false,
52
+ label: options.label,
53
+ meta: { kind: 'session' },
54
+ };
55
+ }
56
+ export function registerSessionsShareCommand(sessionsCmd) {
57
+ const cmd = sessionsCmd
58
+ .command('share <session>')
59
+ .description('Publish one session as a redacted, self-contained web page and print the link.')
60
+ .option('--public', 'List the page in your public share gallery (default: unlisted capability URL)')
61
+ .option('--slug <slug>', 'URL slug under your namespace (default: session-<shortId>)')
62
+ .option('--label <text>', 'Display title in the gallery and `agents artifacts share list`')
63
+ .option('--expire <spec>', 'Auto-expire window: 30d, 12h, a date, or never (default: 30d)')
64
+ .option('--reasoning <mode>', 'Reasoning visibility: omit, fold, or include', 'omit')
65
+ .option('--force', 'Publish despite the sensitive-content scan flagging the transcript')
66
+ .option('--no-cover', 'Skip generating the Open Graph preview image');
67
+ setHelpSections(cmd, {
68
+ examples: `# Share a session — prints an unlisted, redacted link
69
+ agents sessions share a1b2c3d4
70
+
71
+ # Put it in your public gallery at share.agents-cli.sh/<you>
72
+ agents sessions share a1b2c3d4 --public --label "How the retry bug got fixed"
73
+
74
+ # Keep the model's reasoning in collapsible sections
75
+ agents sessions share a1b2c3d4 --reasoning fold
76
+
77
+ # A link that does not decay
78
+ agents sessions share a1b2c3d4 --expire never`,
79
+ notes: `Requires a share endpoint: 'agents artifacts share status' shows it, 'agents artifacts setup'
80
+ provisions one, 'agents artifacts share join <baseUrl>' uses an existing one.
81
+
82
+ Unlisted by default — the URL is world-readable but the page stays out of your public
83
+ gallery and out of 'agents artifacts share list'. Pass --public to list it.
84
+
85
+ Secrets are redacted and the same pre-publish scan as 'agents artifacts share' runs on the
86
+ page, so a transcript carrying emails or credential-shaped strings is refused
87
+ unless you pass --force. --no-redact (the sessions-level flag) disables redaction
88
+ and is a bad idea for anything you publish.
89
+
90
+ Re-running with the same session updates the same URL and keeps the prior version
91
+ as a revision ('agents artifacts share revisions <slug>').
92
+
93
+ Manage published sessions with 'agents artifacts share list' and
94
+ 'agents artifacts share delete <slug>'.`,
95
+ });
96
+ cmd.action(async (selector, options, command) => {
97
+ const globals = command.optsWithGlobals();
98
+ const reasoning = parseReasoning(options.reasoning);
99
+ const limit = Math.max(1, Number.parseInt(globals.limit || '100', 10) || 100);
100
+ const agent = parseAgentFilter(globals.agent).agent;
101
+ const sessions = selectSessions(await discoverSessions({
102
+ all: globals.all !== false,
103
+ since: globals.since,
104
+ limit,
105
+ agent: agent ?? undefined,
106
+ }), [selector]);
107
+ if (sessions.length === 0) {
108
+ process.stderr.write(chalk.yellow(`No session matched "${selector}".\n`));
109
+ process.exitCode = 1;
110
+ return;
111
+ }
112
+ // One link per share: several sessions in one page would give the reader no
113
+ // way to reference just the one that matters, and the slug could only name one.
114
+ if (sessions.length > 1) {
115
+ process.stderr.write(chalk.yellow(`"${selector}" matched ${sessions.length} sessions. Share one at a time — pass a full or unique session id.\n`));
116
+ process.exitCode = 1;
117
+ return;
118
+ }
119
+ const session = sessions[0];
120
+ const redact = globals.redact !== false;
121
+ const markdown = renderSessionMarkdownDocument(session, {
122
+ redact,
123
+ reasoning,
124
+ knownSecrets: redact ? knownSecretValuesFromEnv() : undefined,
125
+ });
126
+ // Emails on top of what the renderer masks. Almost every real transcript
127
+ // carries a few — git author addresses, `gh api user`, a pasted log — and
128
+ // publishToEndpoint refuses a body containing any (RUSH-2428). Masking them
129
+ // means the published page genuinely does not carry them; the alternative,
130
+ // telling people to pass --force, would train everyone to bypass the gate
131
+ // that also catches real credentials.
132
+ //
133
+ // Applied to the RENDERED PAGE, not the Markdown, so the text that is masked
134
+ // is exactly the text `scanShareContent` will scan. Markdown escaping stands
135
+ // between the two: `foo\@example.com` hides from the pattern in the Markdown
136
+ // and reappears as a live address once marked drops the backslash.
137
+ const page = renderSessionHtmlDocument(session, markdown, { redacted: redact });
138
+ const html = redact ? redactEmails(page) : page;
139
+ // A real file on disk is what publishFile() takes, and the OG capturer opens
140
+ // it in a browser. 0600 + a per-run directory keeps the intermediate off a
141
+ // world-readable /tmp path while it exists.
142
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'agents-session-share-'));
143
+ const file = path.join(dir, `${defaultSessionSlug(session)}.html`);
144
+ try {
145
+ fs.writeFileSync(file, html, { mode: 0o600 });
146
+ const result = await publishFile(file, buildSharePublishOptions(session, options));
147
+ if (globals.json) {
148
+ process.stdout.write(JSON.stringify({
149
+ session: session.id,
150
+ agent: session.agent,
151
+ redacted: redact,
152
+ ...result,
153
+ }, null, 2) + '\n');
154
+ return;
155
+ }
156
+ process.stdout.write(`${result.url}\n`);
157
+ const bits = [result.unlisted ? 'unlisted' : 'public', redact ? 'redacted' : chalk.red('NOT redacted')];
158
+ if (result.expiresAt)
159
+ bits.push(`expires ${result.expiresAt.slice(0, 10)}`);
160
+ process.stderr.write(chalk.dim(`${bits.join(' · ')}\n`));
161
+ }
162
+ finally {
163
+ fs.rmSync(dir, { recursive: true, force: true });
164
+ }
165
+ });
166
+ }
@@ -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 = {};