@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,9 +1,9 @@
1
1
  /**
2
2
  * Push one bundle's values to a remote host over SSH — the provisioning
3
- * primitive behind `agents secrets export --host` and, from RUSH-1968, behind
3
+ * primitive behind `agents secrets export --device` and, from RUSH-1968, behind
4
4
  * `agents fleet apply --provision-secrets`.
5
5
  *
6
- * This logic used to live inline in the `export --host` command action. It moved
6
+ * This logic used to live inline in the `export --device` command action. It moved
7
7
  * here because `lib/fleet/apply.ts` needs it and a lib MUST NOT import a command
8
8
  * module — and because the absence of a callable primitive is part of why
9
9
  * `fleet apply` never provisioned secrets at all, leaving an operator to
@@ -17,7 +17,7 @@
17
17
  * interleaving stray lines into it.
18
18
  * - **Resolve once, push N times.** `resolveBundleForPush` is separate because
19
19
  * reading a bundle can prompt (Touch ID); doing it per host would prompt per
20
- * host. `export --host a,b,c` resolves once and pushes three times.
20
+ * host. `export --device a,b,c` resolves once and pushes three times.
21
21
  */
22
22
  import { sshExec } from '../ssh-exec.js';
23
23
  import { remoteShellFor, buildWindowsStdinImportCommand } from '../hosts/remote-cmd.js';
@@ -89,6 +89,7 @@ export function planPushTransport(resolved, bundle, host, opts) {
89
89
  const { remoteCmd, input } = buildRemoteFileImportCommand(bundle, resolved.dotenv, {
90
90
  passphrase: opts.passphrase ?? '',
91
91
  force: opts.force,
92
+ policyNever: opts.policyNever,
92
93
  });
93
94
  return { kind: 'ssh', remoteCmd, input, multiplex: false };
94
95
  }
@@ -100,7 +101,7 @@ export function planPushTransport(resolved, bundle, host, opts) {
100
101
  // the wire over ssh stdin.
101
102
  return {
102
103
  kind: 'ssh',
103
- remoteCmd: buildWindowsStdinImportCommand(bundle, { force: opts.force }),
104
+ remoteCmd: buildWindowsStdinImportCommand(bundle, { force: opts.force, policyNever: opts.policyNever }),
104
105
  input: resolved.dotenv,
105
106
  multiplex: false,
106
107
  };
@@ -110,7 +111,11 @@ export function planPushTransport(resolved, bundle, host, opts) {
110
111
  // path the READ inverse (`remoteResolveEnv`) uses.
111
112
  return {
112
113
  kind: 'remote-secrets',
113
- args: ['import', bundle, '--from', '-', ...(opts.force ? ['--force'] : [])],
114
+ args: [
115
+ 'import', bundle, '--from', '-',
116
+ ...(opts.force ? ['--force'] : []),
117
+ ...(opts.policyNever ? ['--policy', 'never', '--i-understand'] : []),
118
+ ],
114
119
  input: resolved.dotenv,
115
120
  multiplex: false,
116
121
  };
@@ -158,13 +163,6 @@ export function pushResolvedBundleToHost(resolved, bundle, host, opts) {
158
163
  : `pushed '${bundle}' but could not verify it on the remote: ${verdict.reason}`);
159
164
  }
160
165
  }
161
- if (opts.policyNever) {
162
- const policy = remoteSecretsRaw(host, ['policy', bundle, 'never', '--i-understand'], { osLookupName: host, secret: true });
163
- if (policy.code !== 0) {
164
- const msg = (policy.stderr || policy.stdout || '').trim();
165
- return fail(`pushed '${bundle}' but could not set remote policy never${msg ? `: ${msg}` : ''}`);
166
- }
167
- }
168
166
  for (const step of planLiteralRestoration(bundle, opts.literalValues)) {
169
167
  const removed = remoteSecretsRaw(host, step.removeArgs, { osLookupName: host, secret: true });
170
168
  if (removed.code !== 0) {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Remote secrets — read and use `agents secrets` bundles that live on another
3
- * host, over the same hardened SSH path that `agents secrets export --host`
3
+ * host, over the same hardened SSH path that `agents secrets export --device`
4
4
  * (the write inverse) already uses.
5
5
  *
6
6
  * This is the READ / USE direction:
@@ -10,7 +10,7 @@
10
10
  * inject it ephemerally — never written to this machine's keychain.
11
11
  *
12
12
  * Trust model: relies on the operator's existing SSH access to the host (same
13
- * boundary as `export --host` / `run --host`). Bundle names are shell-quoted
13
+ * boundary as `export --device` / `run --device`). Bundle names are shell-quoted
14
14
  * into the remote command; resolved VALUES return over ssh stdout; a forwarded
15
15
  * file-backend passphrase travels over ssh stdin (first line) so it never lands
16
16
  * in argv / `ps` / remote shell history. Nothing is persisted locally.
@@ -27,9 +27,8 @@ import { type SshExecResult } from '../ssh-exec.js';
27
27
  * - **Managed pinned host keys.** Verify against the CLI-owned known_hosts
28
28
  * store (`known-hosts.ts`), not `~/.ssh/known_hosts`. A CHANGED key on a
29
29
  * known host is refused (`StrictHostKeyChecking` `yes` once pinned,
30
- * `accept-new` which still refuses a changed key, only learns a genuinely
31
- * new one before that). So a machine-in-the-middle swapping a pinned host's
32
- * key can never receive or return a secret.
30
+ * `accept-new` before that). Callers that copy durable provider credentials
31
+ * must separately require an existing pin before invoking this transport.
33
32
  * - **No multiplex reuse.** `multiplex: false` — a credential channel never
34
33
  * leaves a persistent `ControlMaster` socket lingering (60s `ControlPersist`)
35
34
  * that any other `agents` invocation to that host would silently reuse.
@@ -38,6 +37,8 @@ export declare function credentialTransportSshOpts(target: string): {
38
37
  hostKeyOpts: string[];
39
38
  multiplex: false;
40
39
  };
40
+ /** Refuse durable credential transfer until the destination SSH key is pinned. */
41
+ export declare function assertCredentialTransportHostPinned(target: string, pinned?: boolean): void;
41
42
  /**
42
43
  * Trust boundary for a remote-resolved env map. A peer's `secrets export` output
43
44
  * is untrusted input: a compromised or misconfigured host could return keys that
@@ -56,9 +57,9 @@ export declare function credentialTransportSshOpts(target: string): {
56
57
  */
57
58
  export declare function isDangerousRemoteEnvKey(name: string): boolean;
58
59
  /**
59
- * Resolve a `--host` value to an ssh target STRING for the remote-secrets path.
60
+ * Resolve a `--device` value to an ssh target STRING for the remote-secrets path.
60
61
  * Delegates to the single host/device resolver (`resolveHost`, RUSH-1967) so a
61
- * name here dials the exact same box `run --host` does; on a miss, treats the
62
+ * name here dials the exact same box `run --device` does; on a miss, treats the
62
63
  * value as a raw ssh target and validates it against injection. Named distinctly
63
64
  * from `../devices/resolve-target.ts` (which returns richer shapes) so importing
64
65
  * the wrong one can't silently change which machine you dial.
@@ -67,7 +68,7 @@ export declare function resolveHostSshTarget(nameOrAlias: string): Promise<strin
67
68
  /**
68
69
  * Merge `--host <single>` / `--hosts <a,b,c>` (and their `--device` / `--devices`
69
70
  * aliases) into an ordered, de-duplicated list. All four flags compose; any alone
70
- * works. `--device`/`--devices` resolve identically to `--host`/`--hosts` so the
71
+ * works. `--device`/`--devices` resolve identically to `--device`/`--hosts` so the
71
72
  * fleet-wide `--device` vocabulary (see `agents run --device`, `agents feed --host`)
72
73
  * works on the secrets remote commands too. Empty when none is set.
73
74
  */
@@ -109,7 +110,7 @@ export declare function remoteSecretsRaw(target: string, args: string[], opts?:
109
110
  * appear (the macOS file-store guard then hard-errors "needs
110
111
  * AGENTS_SECRETS_PASSPHRASE") — this inherits the caller's real terminal, so the
111
112
  * remote sees a genuine TTY and its hidden passphrase prompt surfaces and reads
112
- * the keystrokes. This is the transport for `unlock --host`: you type the remote
113
+ * the keystrokes. This is the transport for `unlock --device`: you type the remote
113
114
  * bundle's passphrase at your own terminal. Output is NOT captured (it streams
114
115
  * to the terminal); only the exit code is returned.
115
116
  */
@@ -168,9 +169,10 @@ export type RemoteKeychainWriteVerification = {
168
169
  * metadata `noAcl` last — bundles.ts writeBundleWithItems). The metadata-only bundle
169
170
  * then fails every later read with the confusing `Bundle '<b>' key '<k>': stored
170
171
  * item '<item>' not found` (bundles.ts resolveBundleEnv). We catch it by reading
171
- * the bundle back the same way a release will (`secrets export --plaintext --format
172
- * json`, driven headlessly on the remote so its `agentOnly` guard FAILS FAST before
173
- * any keychain read — no Touch ID prompt) and confirming every pushed key returned.
172
+ * the bundle back the same way a later `secrets exec`/resolve will (the marker-gated
173
+ * json transport, driven headlessly on the remote so its `agentOnly` guard FAILS FAST
174
+ * before any keychain read — no Touch ID prompt) and confirming every pushed key
175
+ * returned.
174
176
  *
175
177
  * Pure so both branches are unit-testable without a real locked keychain: inject the
176
178
  * "read-back failed / key absent" condition through `readBack`.
@@ -192,10 +194,11 @@ export declare function keychainWriteFailureMessage(host: string, bundle: string
192
194
  /**
193
195
  * Read a bundle back from a remote over SSH (headlessly, so it fails fast rather
194
196
  * than prompting Touch ID) and confirm the pushed keys materialized. Drives the
195
- * remote's own `secrets export <bundle> --plaintext --format json` — the same read
196
- * a headless release performs but keeps only the KEY NAMES; the plaintext values
197
- * are dropped immediately and never retained or logged. Returns a verification
198
- * verdict; the caller renders `keychainWriteFailureMessage` on failure.
197
+ * remote's marker-gated json transport (`secrets export <bundle> --plaintext
198
+ * --format json` under AGENTS_SECRETS_REMOTE_TRANSPORT) but keeps only the KEY
199
+ * NAMES; the plaintext values are dropped immediately and never retained or
200
+ * logged. Returns a verification verdict; the caller renders
201
+ * `keychainWriteFailureMessage` on failure.
199
202
  */
200
203
  export declare function verifyRemoteKeychainPush(target: string, bundle: string, pushedKeys: string[], opts?: {
201
204
  osLookupName?: string;
@@ -203,7 +206,7 @@ export declare function verifyRemoteKeychainPush(target: string, bundle: string,
203
206
  }): RemoteKeychainWriteVerification;
204
207
  /**
205
208
  * The `bash -lc` command + stdin payload that drives a **file-backed** remote
206
- * import for `secrets export --host … --remote-backend file`.
209
+ * import for `secrets export --device … --remote-backend file`.
207
210
  *
208
211
  * The file store is passphrase-free by default: with `AGENTS_SECRETS_PASSPHRASE`
209
212
  * unset the remote `agents secrets import --backend file` auto-provisions the
@@ -226,6 +229,7 @@ export declare function verifyRemoteKeychainPush(target: string, bundle: string,
226
229
  export declare function buildRemoteFileImportCommand(bundle: string, dotenv: string, opts?: {
227
230
  passphrase?: string;
228
231
  force?: boolean;
232
+ policyNever?: boolean;
229
233
  }): {
230
234
  remoteCmd: string;
231
235
  input: string;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Remote secrets — read and use `agents secrets` bundles that live on another
3
- * host, over the same hardened SSH path that `agents secrets export --host`
3
+ * host, over the same hardened SSH path that `agents secrets export --device`
4
4
  * (the write inverse) already uses.
5
5
  *
6
6
  * This is the READ / USE direction:
@@ -10,7 +10,7 @@
10
10
  * inject it ephemerally — never written to this machine's keychain.
11
11
  *
12
12
  * Trust model: relies on the operator's existing SSH access to the host (same
13
- * boundary as `export --host` / `run --host`). Bundle names are shell-quoted
13
+ * boundary as `export --device` / `run --device`). Bundle names are shell-quoted
14
14
  * into the remote command; resolved VALUES return over ssh stdout; a forwarded
15
15
  * file-backend passphrase travels over ssh stdin (first line) so it never lands
16
16
  * in argv / `ps` / remote shell history. Nothing is persisted locally.
@@ -39,9 +39,8 @@ function hostKeyLookupName(target) {
39
39
  * - **Managed pinned host keys.** Verify against the CLI-owned known_hosts
40
40
  * store (`known-hosts.ts`), not `~/.ssh/known_hosts`. A CHANGED key on a
41
41
  * known host is refused (`StrictHostKeyChecking` `yes` once pinned,
42
- * `accept-new` which still refuses a changed key, only learns a genuinely
43
- * new one before that). So a machine-in-the-middle swapping a pinned host's
44
- * key can never receive or return a secret.
42
+ * `accept-new` before that). Callers that copy durable provider credentials
43
+ * must separately require an existing pin before invoking this transport.
45
44
  * - **No multiplex reuse.** `multiplex: false` — a credential channel never
46
45
  * leaves a persistent `ControlMaster` socket lingering (60s `ControlPersist`)
47
46
  * that any other `agents` invocation to that host would silently reuse.
@@ -49,6 +48,13 @@ function hostKeyLookupName(target) {
49
48
  export function credentialTransportSshOpts(target) {
50
49
  return { hostKeyOpts: hostKeyCheckingOpts(isHostPinned(hostKeyLookupName(target))), multiplex: false };
51
50
  }
51
+ /** Refuse durable credential transfer until the destination SSH key is pinned. */
52
+ export function assertCredentialTransportHostPinned(target, pinned = isHostPinned(hostKeyLookupName(target))) {
53
+ if (pinned)
54
+ return;
55
+ throw new Error(`Refusing to transfer provider credentials to '${target}' before its SSH host key is pinned. ` +
56
+ `Connect once with 'agents ssh ${target}' and verify the host, then retry.`);
57
+ }
52
58
  /**
53
59
  * Trust boundary for a remote-resolved env map. A peer's `secrets export` output
54
60
  * is untrusted input: a compromised or misconfigured host could return keys that
@@ -85,9 +91,9 @@ function osForTarget(target, lookupName) {
85
91
  return byName ?? resolveRemoteOsSync(target.split('@').pop() ?? target);
86
92
  }
87
93
  /**
88
- * Resolve a `--host` value to an ssh target STRING for the remote-secrets path.
94
+ * Resolve a `--device` value to an ssh target STRING for the remote-secrets path.
89
95
  * Delegates to the single host/device resolver (`resolveHost`, RUSH-1967) so a
90
- * name here dials the exact same box `run --host` does; on a miss, treats the
96
+ * name here dials the exact same box `run --device` does; on a miss, treats the
91
97
  * value as a raw ssh target and validates it against injection. Named distinctly
92
98
  * from `../devices/resolve-target.ts` (which returns richer shapes) so importing
93
99
  * the wrong one can't silently change which machine you dial.
@@ -102,7 +108,7 @@ export async function resolveHostSshTarget(nameOrAlias) {
102
108
  /**
103
109
  * Merge `--host <single>` / `--hosts <a,b,c>` (and their `--device` / `--devices`
104
110
  * aliases) into an ordered, de-duplicated list. All four flags compose; any alone
105
- * works. `--device`/`--devices` resolve identically to `--host`/`--hosts` so the
111
+ * works. `--device`/`--devices` resolve identically to `--device`/`--hosts` so the
106
112
  * fleet-wide `--device` vocabulary (see `agents run --device`, `agents feed --host`)
107
113
  * works on the secrets remote commands too. Empty when none is set.
108
114
  */
@@ -158,7 +164,7 @@ export function remoteSecretsRaw(target, args, opts = {}) {
158
164
  // to multiplex — see `credentialTransportSshOpts` (RUSH-2527). A `-tt` session
159
165
  // (a remote reveal/passphrase prompt) additionally allocates a PTY and never
160
166
  // multiplexes, and it COMPOSES with the secret posture: a `view --reveal` over
161
- // `--host` both prompts AND streams the plaintext value back over ssh stdout,
167
+ // `--device` both prompts AND streams the plaintext value back over ssh stdout,
162
168
  // so it needs the managed host-key pin too — `tty` must not short-circuit past
163
169
  // `secret`. A plain browse `list` passes neither and keeps the shared baseline.
164
170
  const posture = opts.secret ? credentialTransportSshOpts(target) : {};
@@ -180,13 +186,13 @@ export function remoteSecretsRaw(target, args, opts = {}) {
180
186
  * appear (the macOS file-store guard then hard-errors "needs
181
187
  * AGENTS_SECRETS_PASSPHRASE") — this inherits the caller's real terminal, so the
182
188
  * remote sees a genuine TTY and its hidden passphrase prompt surfaces and reads
183
- * the keystrokes. This is the transport for `unlock --host`: you type the remote
189
+ * the keystrokes. This is the transport for `unlock --device`: you type the remote
184
190
  * bundle's passphrase at your own terminal. Output is NOT captured (it streams
185
191
  * to the terminal); only the exit code is returned.
186
192
  */
187
193
  export function remoteSecretsStream(target, args, opts = {}) {
188
194
  const remoteCmd = buildRemoteAgentsInvocation(['secrets', ...args], undefined, osForTarget(target, opts.osLookupName));
189
- // `unlock --host` carries the remote bundle's passphrase to the destination over
195
+ // `unlock --device` carries the remote bundle's passphrase to the destination over
190
196
  // this interactive channel, so it is secret-bearing: pin the managed host key
191
197
  // (a changed key is refused) and never multiplex (RUSH-2527).
192
198
  return sshStream(target, remoteCmd, { tty: true, ...credentialTransportSshOpts(target) });
@@ -206,7 +212,12 @@ export function remoteSecretsStream(target, args, opts = {}) {
206
212
  */
207
213
  export async function remoteResolveEnv(target, bundle, opts = {}) {
208
214
  assertValidSshTarget(target);
209
- const remoteCmd = buildRemoteAgentsInvocation(['secrets', 'export', bundle, '--plaintext', '--format', 'json'], undefined, osForTarget(target, opts.osLookupName));
215
+ // AGENTS_SECRETS_REMOTE_TRANSPORT is the marker that lets the remote's
216
+ // `export --plaintext --format json` emit at all — the public shell-eval
217
+ // export mode was removed (RUSH-2774), and this machine-to-machine resolve is
218
+ // the only surviving caller of the JSON emitter. Riding the legacy argv keeps
219
+ // a new driver compatible with an old remote during a fleet rollout.
220
+ const remoteCmd = buildRemoteAgentsInvocation(['secrets', 'export', bundle, '--plaintext', '--format', 'json'], undefined, osForTarget(target, opts.osLookupName), { AGENTS_SECRETS_REMOTE_TRANSPORT: '1' });
210
221
  // Resolving a remote bundle streams its plaintext values back over ssh stdout,
211
222
  // so this read is secret-bearing: pin the managed host key and never leave a
212
223
  // reusable control master to the source (RUSH-2527, `credentialTransportSshOpts`).
@@ -293,9 +304,10 @@ function isLockedKeychainReadBackError(stderr) {
293
304
  * metadata `noAcl` last — bundles.ts writeBundleWithItems). The metadata-only bundle
294
305
  * then fails every later read with the confusing `Bundle '<b>' key '<k>': stored
295
306
  * item '<item>' not found` (bundles.ts resolveBundleEnv). We catch it by reading
296
- * the bundle back the same way a release will (`secrets export --plaintext --format
297
- * json`, driven headlessly on the remote so its `agentOnly` guard FAILS FAST before
298
- * any keychain read — no Touch ID prompt) and confirming every pushed key returned.
307
+ * the bundle back the same way a later `secrets exec`/resolve will (the marker-gated
308
+ * json transport, driven headlessly on the remote so its `agentOnly` guard FAILS FAST
309
+ * before any keychain read — no Touch ID prompt) and confirming every pushed key
310
+ * returned.
299
311
  *
300
312
  * Pure so both branches are unit-testable without a real locked keychain: inject the
301
313
  * "read-back failed / key absent" condition through `readBack`.
@@ -346,20 +358,23 @@ export function keychainWriteFailureMessage(host, bundle, reason) {
346
358
  `A macOS login keychain is LOCKED under headless SSH, so a keychain-backed write ` +
347
359
  `lands the bundle metadata but no readable secret items, and later reads fail with ` +
348
360
  `"stored item '…' not found". Re-run with a headless-readable backend:\n` +
349
- ` agents secrets export ${bundle} --host ${host} --remote-backend file\n` +
361
+ ` agents secrets export ${bundle} --device ${host} --remote-backend file\n` +
350
362
  `(needs AGENTS_SECRETS_PASSPHRASE set locally), or unlock the remote keychain first ` +
351
363
  `(e.g. an interactive login / \`agents secrets unlock\` on ${host}) and retry.`);
352
364
  }
353
365
  /**
354
366
  * Read a bundle back from a remote over SSH (headlessly, so it fails fast rather
355
367
  * than prompting Touch ID) and confirm the pushed keys materialized. Drives the
356
- * remote's own `secrets export <bundle> --plaintext --format json` — the same read
357
- * a headless release performs but keeps only the KEY NAMES; the plaintext values
358
- * are dropped immediately and never retained or logged. Returns a verification
359
- * verdict; the caller renders `keychainWriteFailureMessage` on failure.
368
+ * remote's marker-gated json transport (`secrets export <bundle> --plaintext
369
+ * --format json` under AGENTS_SECRETS_REMOTE_TRANSPORT) but keeps only the KEY
370
+ * NAMES; the plaintext values are dropped immediately and never retained or
371
+ * logged. Returns a verification verdict; the caller renders
372
+ * `keychainWriteFailureMessage` on failure.
360
373
  */
361
374
  export function verifyRemoteKeychainPush(target, bundle, pushedKeys, opts = {}) {
362
- const remoteCmd = buildRemoteAgentsInvocation(['secrets', 'export', bundle, '--plaintext', '--format', 'json'], undefined, osForTarget(target, opts.osLookupName));
375
+ const remoteCmd = buildRemoteAgentsInvocation(['secrets', 'export', bundle, '--plaintext', '--format', 'json'], undefined, osForTarget(target, opts.osLookupName),
376
+ // Same transport marker as remoteResolveEnv — see the comment there (RUSH-2774).
377
+ { AGENTS_SECRETS_REMOTE_TRANSPORT: '1' });
363
378
  // This read-back streams the just-pushed plaintext over ssh stdout, so it is
364
379
  // as secret-bearing as the push itself — the push path passes `secret: true`
365
380
  // so it too pins the managed host key and leaves no reusable control master to
@@ -400,7 +415,7 @@ export function verifyRemoteKeychainPush(target, bundle, pushedKeys, opts = {})
400
415
  }
401
416
  /**
402
417
  * The `bash -lc` command + stdin payload that drives a **file-backed** remote
403
- * import for `secrets export --host … --remote-backend file`.
418
+ * import for `secrets export --device … --remote-backend file`.
404
419
  *
405
420
  * The file store is passphrase-free by default: with `AGENTS_SECRETS_PASSPHRASE`
406
421
  * unset the remote `agents secrets import --backend file` auto-provisions the
@@ -422,7 +437,8 @@ export function verifyRemoteKeychainPush(target, bundle, pushedKeys, opts = {})
422
437
  */
423
438
  export function buildRemoteFileImportCommand(bundle, dotenv, opts = {}) {
424
439
  const force = opts.force ? ' --force' : '';
425
- const importCmd = `agents secrets import ${shellQuote(bundle)} --from - --backend file${force}`;
440
+ const policy = opts.policyNever ? ' --policy never --i-understand' : '';
441
+ const importCmd = `agents secrets import ${shellQuote(bundle)} --from - --backend file${force}${policy}`;
426
442
  const passphrase = opts.passphrase ?? '';
427
443
  if (passphrase) {
428
444
  // Opt-in shared passphrase: read it off the FIRST stdin line, export it, then
@@ -237,7 +237,7 @@ export function getVaultSession() {
237
237
  function requireVaultKey() {
238
238
  const session = getVaultSession();
239
239
  if (!session.loggedIn) {
240
- throw new Error('Not logged in. Run: agents login');
240
+ throw new Error('Synced secrets locked. Run: agents secrets vault unlock');
241
241
  }
242
242
  return session.key;
243
243
  }
@@ -259,7 +259,7 @@ function parseVaultItem(item) {
259
259
  function vaultMissingError(file) {
260
260
  return new Error(`Vault file is missing: ${file}. A vault was created but the file is gone` +
261
261
  ' (a sync conflict, an undownloaded placeholder, or an accidental move/delete).' +
262
- ' Restore it before writing, or run: agents login --create --force to start over.');
262
+ ' Restore it before writing, or run: agents secrets vault unlock --create --force to start over.');
263
263
  }
264
264
  function readVaultData() {
265
265
  const file = vaultPath();
@@ -6,7 +6,7 @@
6
6
  import { resultOf } from '../types.js';
7
7
  import { AGENTS } from '../../agents.js';
8
8
  import { getPathShadowingExecutable, adoptShadowingLauncher, listAgentsWithNonIsolatedInstalledVersions, } from '../../shims.js';
9
- import { getGlobalDefault } from '../../versions.js';
9
+ import { getGlobalDefault } from '../../installations/versions.js';
10
10
  export const shadowingCheck = {
11
11
  id: 'shadowing',
12
12
  title: 'Launcher shadowing the version-managed shim',
@@ -5,7 +5,7 @@
5
5
  import { resultOf } from '../types.js';
6
6
  import { AGENTS } from '../../agents.js';
7
7
  import { createShim, ensureShimCurrent, ensureVersionedAliasCurrent, isShimCurrent, isVersionedAliasCurrent, removeShim, shimExists, shimPointsAtLiveInstall, removeLegacyUserShim, listAgentsWithInstalledVersions, listAgentsWithNonIsolatedInstalledVersions, listShimFileNames, pruneOrphanedCommandShim, } from '../../shims.js';
8
- import { listInstalledVersions } from '../../versions.js';
8
+ import { listInstalledVersions } from '../../installations/versions.js';
9
9
  export const shimsCheck = {
10
10
  id: 'shims',
11
11
  title: 'Dispatch shims + versioned aliases',
@@ -200,7 +200,24 @@ export interface MultiInstallInventoryEntry {
200
200
  packageRoot: string;
201
201
  version: string;
202
202
  note: string;
203
+ /** True for the copy that is currently executing. */
204
+ running: boolean;
205
+ /**
206
+ * True when a bare `agents doctor --fix` deletes this copy (RUSH-2415:
207
+ * npx-cache / unsafe-legacy / pre-1.22.30 with a fixed peer). False for the
208
+ * running copy and for any duplicate --fix will not touch — a healthy
209
+ * >=1.22.30 peer, or a pre-1.22.30 copy with no fixed peer to fall back to;
210
+ * both need the manual command from manualUninstallCommand() (RUSH-2705/2713).
211
+ */
212
+ autoPurgeable: boolean;
203
213
  }
214
+ /**
215
+ * The exact shell command that removes the install at `packageRoot` by hand —
216
+ * the remedy for duplicates `doctor --fix` deliberately will not purge
217
+ * (RUSH-2705). `--prefix` pins the target tree no matter which npm binary
218
+ * PATH resolves, mirroring installPackageIntoPrefix.
219
+ */
220
+ export declare function manualUninstallCommand(packageRoot: string): string;
204
221
  export declare function buildMultiInstallInventory(runningRoot: string, runningVersion: string, installs: AgentsCliInstall[]): MultiInstallInventoryEntry[];
205
222
  /** Why a discovered install is safe to delete without an interactive confirm. */
206
223
  export type RemovableInstallReason = 'npx-cache' | 'unsafe-legacy-helper' | 'pre-fixed-version';
@@ -250,6 +267,27 @@ export declare function purgeRemovableAgentsCliInstalls(candidates: RemovableAge
250
267
  dryRun?: boolean;
251
268
  runningRoot?: string;
252
269
  }): PurgeRemovableInstallsResult;
270
+ /** A detected duplicate that `doctor --fix` will not purge (RUSH-2705). */
271
+ export interface UnresolvedDuplicateInstall {
272
+ packageRoot: string;
273
+ version: string;
274
+ /** Exact shell command that removes this copy by hand. */
275
+ manualRemoveCommand: string;
276
+ }
277
+ export interface RemediateStaleInstallsResult extends PurgeRemovableInstallsResult {
278
+ inventory: MultiInstallInventoryEntry[];
279
+ candidates: RemovableAgentsCliInstall[];
280
+ /**
281
+ * Duplicates detected but NOT auto-purged, for either reason:
282
+ * 1. a healthy >=1.22.30 global (safe, just redundant), or
283
+ * 2. a pre-1.22.30 copy left alone only because no fixed peer exists to fall
284
+ * back to (the anti-stranding guard) — this one is genuinely vulnerable,
285
+ * not healthy.
286
+ * Either way the caller must surface manualRemoveCommand — otherwise the
287
+ * multi-install warning keeps firing with no working remedy (RUSH-2705/2713).
288
+ */
289
+ unresolved: UnresolvedDuplicateInstall[];
290
+ }
253
291
  /**
254
292
  * Scan + classify + purge in one call. Used by `agents doctor --fix` and
255
293
  * `agents upgrade` so both paths remediate the same set of latent copies.
@@ -260,10 +298,7 @@ export declare function remediateStaleAgentsCliInstalls(opts: {
260
298
  pathEnv?: string;
261
299
  findOpts?: FindAgentsCliInstallsOptions;
262
300
  dryRun?: boolean;
263
- }): PurgeRemovableInstallsResult & {
264
- inventory: MultiInstallInventoryEntry[];
265
- candidates: RemovableAgentsCliInstall[];
266
- };
301
+ }): RemediateStaleInstallsResult;
267
302
  /**
268
303
  * Resolve every `agents` entrypoint on PATH, then inspect the bounded global
269
304
  * install layouts used by NVM, fnm, Volta, Bun, npm, and npx. More than one
@@ -145,6 +145,13 @@ export function readMultiInstallScanCache(file) {
145
145
  !Array.isArray(raw.inventory)) {
146
146
  return null;
147
147
  }
148
+ // A cache written before the entries carried running/autoPurgeable
149
+ // (RUSH-2705) cannot drive the banner's remedy choice — treat it as
150
+ // corrupt so the caller re-scans rather than mis-advertising --fix.
151
+ const entries = raw.inventory;
152
+ if (entries.some((entry) => typeof entry?.running !== 'boolean' || typeof entry?.autoPurgeable !== 'boolean')) {
153
+ return null;
154
+ }
148
155
  return raw;
149
156
  }
150
157
  catch {
@@ -415,11 +422,67 @@ function packageRootForEntry(real) {
415
422
  }
416
423
  return null;
417
424
  }
425
+ /** Best-effort canonical path; keeps the input when realpath fails. */
426
+ function canonicalPath(p) {
427
+ try {
428
+ return fs.realpathSync(p);
429
+ }
430
+ catch {
431
+ return p;
432
+ }
433
+ }
434
+ /**
435
+ * Ensure the running copy participates in classification (the "has a fixed
436
+ * peer" check) even when the PATH scan missed it — a source tree or unusual
437
+ * layout. The running root is never deleted regardless.
438
+ */
439
+ function withRunningInstall(installs, runningRoot, runningVersion) {
440
+ const runningCanonical = canonicalPath(runningRoot);
441
+ const already = installs.some((install) => canonicalPath(install.packageRoot) === runningCanonical);
442
+ if (already)
443
+ return installs;
444
+ return [...installs, {
445
+ packageRoot: runningRoot,
446
+ version: runningVersion,
447
+ // Unknown for a synthetic entry — classify only uses version for the
448
+ // fixed-peer check; the running root is never deleted regardless.
449
+ atomicHelperInstall: true,
450
+ }];
451
+ }
452
+ /**
453
+ * The exact shell command that removes the install at `packageRoot` by hand —
454
+ * the remedy for duplicates `doctor --fix` deliberately will not purge
455
+ * (RUSH-2705). `--prefix` pins the target tree no matter which npm binary
456
+ * PATH resolves, mirroring installPackageIntoPrefix.
457
+ */
458
+ export function manualUninstallCommand(packageRoot) {
459
+ const resolved = path.resolve(packageRoot);
460
+ if (detectPackageManager(resolved) === 'bun') {
461
+ return `bun remove -g ${NPM_PACKAGE_NAME}`;
462
+ }
463
+ try {
464
+ return `npm uninstall -g --prefix '${deriveGlobalPrefix(resolved)}' ${NPM_PACKAGE_NAME}`;
465
+ }
466
+ catch {
467
+ // Not inside a node_modules tree — no npm prefix owns it; deleting the
468
+ // directory is the only removal there is.
469
+ return `rm -rf '${resolved}'`;
470
+ }
471
+ }
418
472
  export function buildMultiInstallInventory(runningRoot, runningVersion, installs) {
473
+ const runningCanonical = canonicalPath(runningRoot);
474
+ const removableRoots = new Set(classifyRemovableAgentsCliInstalls(runningRoot, withRunningInstall(installs, runningRoot, runningVersion)).map((candidate) => candidate.packageRoot));
419
475
  const byRoot = new Map();
420
- byRoot.set(runningRoot, { packageRoot: runningRoot, version: runningVersion, note: 'running' });
476
+ byRoot.set(runningRoot, {
477
+ packageRoot: runningRoot,
478
+ version: runningVersion,
479
+ note: 'running',
480
+ running: true,
481
+ autoPurgeable: false,
482
+ });
421
483
  for (const install of installs) {
422
- const notes = [install.packageRoot === runningRoot
484
+ const running = canonicalPath(install.packageRoot) === runningCanonical;
485
+ const notes = [running
423
486
  ? 'running'
424
487
  : install.binPath
425
488
  ? `agents on PATH: ${install.binPath}`
@@ -430,6 +493,8 @@ export function buildMultiInstallInventory(runningRoot, runningVersion, installs
430
493
  packageRoot: install.packageRoot,
431
494
  version: install.version,
432
495
  note: notes.join('; '),
496
+ running,
497
+ autoPurgeable: !running && removableRoots.has(canonicalPath(install.packageRoot)),
433
498
  });
434
499
  }
435
500
  return [...byRoot.values()];
@@ -588,38 +653,26 @@ export function purgeRemovableAgentsCliInstalls(candidates, opts = {}) {
588
653
  */
589
654
  export function remediateStaleAgentsCliInstalls(opts) {
590
655
  const pathEnv = opts.pathEnv ?? (process.env.PATH || '');
591
- const installs = findAgentsCliInstalls(pathEnv, opts.findOpts);
656
+ let installs = findAgentsCliInstalls(pathEnv, opts.findOpts);
592
657
  // Ensure the running root participates in "has a fixed peer" even when the
593
658
  // PATH scan missed it (source tree, unusual layout).
594
659
  if (opts.runningVersion) {
595
- const already = installs.some((i) => {
596
- try {
597
- return fs.realpathSync(i.packageRoot) === fs.realpathSync(opts.runningRoot);
598
- }
599
- catch {
600
- return i.packageRoot === opts.runningRoot;
601
- }
602
- });
603
- if (!already) {
604
- installs.push({
605
- packageRoot: opts.runningRoot,
606
- version: opts.runningVersion,
607
- // Unknown for a synthetic entry — classify only uses version for the
608
- // fixed-peer check; the running root is never deleted regardless.
609
- atomicHelperInstall: true,
610
- });
611
- }
660
+ installs = withRunningInstall(installs, opts.runningRoot, opts.runningVersion);
612
661
  }
613
662
  const candidates = classifyRemovableAgentsCliInstalls(opts.runningRoot, installs);
614
663
  const purge = purgeRemovableAgentsCliInstalls(candidates, {
615
664
  dryRun: opts.dryRun,
616
665
  runningRoot: opts.runningRoot,
617
666
  });
618
- return {
619
- ...purge,
620
- candidates,
621
- inventory: buildMultiInstallInventory(opts.runningRoot, opts.runningVersion ?? 'unknown', installs),
622
- };
667
+ const inventory = buildMultiInstallInventory(opts.runningRoot, opts.runningVersion ?? 'unknown', installs);
668
+ const unresolved = inventory
669
+ .filter((entry) => !entry.running && !entry.autoPurgeable)
670
+ .map((entry) => ({
671
+ packageRoot: entry.packageRoot,
672
+ version: entry.version,
673
+ manualRemoveCommand: manualUninstallCommand(entry.packageRoot),
674
+ }));
675
+ return { ...purge, candidates, inventory, unresolved };
623
676
  }
624
677
  function childDirectories(parent) {
625
678
  try {
@@ -77,7 +77,7 @@ export declare function spawnDetached(command: string, args: string[], stdio?: S
77
77
  /**
78
78
  * Default run dispatcher: re-invoke `agents run` with a server-minted id so the
79
79
  * run is addressable, detached so it outlives this request (and the anchor
80
- * process). Local runs detach here; `--host` runs detach on the executor via
80
+ * process). Local runs detach here; `--device` runs detach on the executor via
81
81
  * the existing dispatch path.
82
82
  */
83
83
  export declare const defaultRunner: RunDispatcher;
@@ -2,7 +2,7 @@ import { createServer } from 'http';
2
2
  import fs from 'fs';
3
3
  import { spawn } from 'child_process';
4
4
  import { randomUUID, randomBytes } from 'crypto';
5
- import { getAgentsInvocation } from '../daemon.js';
5
+ import { getAgentsInvocation } from '../daemon/daemon.js';
6
6
  import { handleServeGet, resolveServeContext } from './server.js';
7
7
  import { verifyControlToken } from './token.js';
8
8
  import { readNewEvents, streamDir, streamLogPath } from './stream.js';
@@ -127,7 +127,7 @@ export function spawnDetached(command, args, stdio = 'ignore') {
127
127
  /**
128
128
  * Default run dispatcher: re-invoke `agents run` with a server-minted id so the
129
129
  * run is addressable, detached so it outlives this request (and the anchor
130
- * process). Local runs detach here; `--host` runs detach on the executor via
130
+ * process). Local runs detach here; `--device` runs detach on the executor via
131
131
  * the existing dispatch path.
132
132
  */
133
133
  export const defaultRunner = async (req) => {
@@ -144,7 +144,7 @@ export const defaultRunner = async (req) => {
144
144
  if (req.mode)
145
145
  argv.push('--mode', req.mode);
146
146
  if (req.host)
147
- argv.push('--host', req.host);
147
+ argv.push('--device', req.host);
148
148
  if (req.cwd)
149
149
  argv.push('--cwd', req.cwd);
150
150
  const inv = getAgentsInvocation(argv);
@@ -152,7 +152,7 @@ export const defaultRunner = async (req) => {
152
152
  // unhandled 'error' that crashes the anchor for every other session.
153
153
  //
154
154
  // For an anchor-local run, capture the `--json` NDJSON to a per-session file
155
- // so `GET /api/session/:id/stream` can offset-tail it. A `--host` run emits
155
+ // so `GET /api/session/:id/stream` can offset-tail it. A `--device` run emits
156
156
  // its NDJSON on the remote box (streaming that reuses pullRemoteLogDelta — a
157
157
  // follow-up), so we don't capture the local dispatcher's output.
158
158
  if (req.host) {
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import { AgentManager } from '../teams/agents.js';
17
17
  import type { AgentStatusSummary } from '../teams/api.js';
18
- import type { JobConfig } from '../routines.js';
18
+ import type { JobConfig } from '../scheduling/routines.js';
19
19
  import type { CloudTask } from '../cloud/types.js';
20
20
  /** One teammate's worktree and its current uncommitted diff. */
21
21
  export interface WorktreeDiff {