@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,3 +1,5 @@
1
+ import { formatBytes } from '../format.js';
2
+ export { formatBytes };
1
3
  import type { SessionMeta } from '../session/types.js';
2
4
  export type ArtifactKind = 'screenshot' | 'pdf' | 'recording' | 'download';
3
5
  export interface BrowserArtifact {
@@ -20,7 +22,6 @@ export declare function listProfileArtifacts(profile: string): BrowserArtifact[]
20
22
  * when empty); otherwise every profile dir on disk that has at least one capture.
21
23
  */
22
24
  export declare function listBrowserSessions(only?: string): ProfileArtifacts[];
23
- export declare function formatBytes(n: number): string;
24
25
  /** Per-kind counts over a flat artifact list — shared by the printed table and
25
26
  * the interactive row labels. */
26
27
  export declare function countByKind(artifacts: BrowserArtifact[]): Record<ArtifactKind, number>;
@@ -15,6 +15,9 @@
15
15
  * `feed-post.ts` `resolvePostIdentity`), never a second parser.
16
16
  */
17
17
  import * as fs from 'fs';
18
+ import { formatBytes } from '../format.js';
19
+ // Re-exported for the picker, which lists artifacts from this module's rows.
20
+ export { formatBytes };
18
21
  import * as path from 'path';
19
22
  import { spawnSync } from 'child_process';
20
23
  import { getBrowserRuntimeDir, getProfileRuntimeDir } from './profiles.js';
@@ -22,7 +25,7 @@ import { formatRelativeTime } from '../session/relative-time.js';
22
25
  import { getSessionById, listBrowserSessionRecords, pruneToolSessions } from '../session/db.js';
23
26
  import { listPidSessionEntries } from '../session/pid-registry.js';
24
27
  import { loadHookSessionIndex } from '../session/hook-sessions.js';
25
- import { readRecentActivity } from '../activity.js';
28
+ import { readRecentActivity } from '../feed/activity.js';
26
29
  const EXT_KIND = {
27
30
  '.png': 'screenshot',
28
31
  '.jpg': 'screenshot',
@@ -113,18 +116,6 @@ export function listBrowserSessions(only) {
113
116
  .map((p) => ({ profile: p, artifacts: listProfileArtifacts(p) }))
114
117
  .filter((r) => !!only || r.artifacts.length > 0);
115
118
  }
116
- export function formatBytes(n) {
117
- if (n < 1024)
118
- return `${n} B`;
119
- const units = ['KB', 'MB', 'GB'];
120
- let val = n / 1024;
121
- let i = 0;
122
- while (val >= 1024 && i < units.length - 1) {
123
- val /= 1024;
124
- i++;
125
- }
126
- return `${val < 10 ? val.toFixed(1) : Math.round(val)} ${units[i]}`;
127
- }
128
119
  /** Per-kind counts over a flat artifact list — shared by the printed table and
129
120
  * the interactive row labels. */
130
121
  export function countByKind(artifacts) {
@@ -1,4 +1,4 @@
1
- export type BrowserType = 'chrome' | 'comet' | 'chromium' | 'brave' | 'edge' | 'custom';
1
+ export type BrowserType = 'chrome' | 'comet' | 'chromium' | 'brave' | 'edge' | 'arc' | 'custom';
2
2
  /**
3
3
  * A single named endpoint preset within a profile. Lets one profile cover
4
4
  * the local + remote variants of the same app (e.g. an Electron app on this
@@ -72,7 +72,18 @@ export interface ChromeOptions {
72
72
  }
73
73
  export interface Task {
74
74
  id: string;
75
+ /**
76
+ * Unique addressable handle used as the tasks map key, capture-dir name, and
77
+ * the value agents export as `$AGENTS_BROWSER_TASK`. Prefer the short `id`
78
+ * for auto-generated tasks; an explicit `--task` name still wins.
79
+ */
75
80
  name: string;
81
+ /**
82
+ * Human-readable label for `browser status`. Derived once from `--title`,
83
+ * else the first navigated host, else `untitled`. Distinct from `name` so a
84
+ * short machine id can stay addressable while status stays readable.
85
+ */
86
+ label?: string;
76
87
  profile: string;
77
88
  tabs: Record<string, string>;
78
89
  currentTabId?: string;
@@ -142,6 +153,8 @@ export interface ProfileStatus {
142
153
  export interface TaskStatus {
143
154
  id: string;
144
155
  name: string;
156
+ /** Human label for status tables; falls back to name when absent. */
157
+ label?: string;
145
158
  tabCount: number;
146
159
  currentTabId?: string;
147
160
  createdAt: number;
@@ -232,6 +245,11 @@ export interface IPCRequest {
232
245
  until?: string;
233
246
  appLevel?: string;
234
247
  skipDomainSkill?: boolean;
248
+ /**
249
+ * Explicit human label for a new task (`agents browser start --title …`).
250
+ * When omitted, the label is derived from the first navigated host.
251
+ */
252
+ title?: string;
235
253
  /**
236
254
  * Browser start: always open a new tab. Without it, `start --url` reclaims a
237
255
  * tab that an ABANDONED task is still holding on this exact URL rather than
@@ -8,7 +8,7 @@
8
8
  * `per_day`/`per_project`/`per_agent` rather than wiping them.
9
9
  *
10
10
  * This is the single resolver the pre-flight gate, the live watcher, and the
11
- * `agents budget` command all route through, so the effective cap set is
11
+ * `agents config budget` command all route through, so the effective cap set is
12
12
  * computed in exactly one place.
13
13
  */
14
14
  import * as fs from 'fs';
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Every dispatched run that produces token usage records one JSONL line under
5
5
  * `<history>/spend/ledger.jsonl`. The ledger is the shared artifact #323's
6
- * `agents cost` can later read for $ rollups, so the entry shape stays clean
6
+ * `agents insights cost` can later read for $ rollups, so the entry shape stays clean
7
7
  * and stable: one record = one usage observation attributed to a run.
8
8
  *
9
9
  * `costUsd` is computed at write time via the canonical pricing module
@@ -8,7 +8,7 @@
8
8
  * API rather than the CLI's own usage tracking.
9
9
  */
10
10
  import { hasKeychainToken, getKeychainToken } from './secrets/profiles.js';
11
- import { renderBar, getUsageColor } from './usage.js';
11
+ import { renderBar, getUsageColor } from './accounting/usage.js';
12
12
  import * as fs from 'node:fs';
13
13
  import * as path from 'node:path';
14
14
  import { createHash } from 'node:crypto';
@@ -8,21 +8,9 @@
8
8
  * reason instead of silently corrupting an older binary's settings file.
9
9
  */
10
10
  import { AGENTS, MANAGED_AGENT_IDS } from './agents.js';
11
- /**
12
- * Compare semver-like versions ("0.116.0" vs "0.115.9"). Local copy to avoid
13
- * importing versions.ts (which imports agents.ts, which imports this file).
14
- */
15
- function compareVersions(a, b) {
16
- const aParts = a.split('.').map((n) => parseInt(n, 10) || 0);
17
- const bParts = b.split('.').map((n) => parseInt(n, 10) || 0);
18
- for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
19
- const aVal = aParts[i] || 0;
20
- const bVal = bParts[i] || 0;
21
- if (aVal !== bVal)
22
- return aVal - bVal;
23
- }
24
- return 0;
25
- }
11
+ // agent-spec/primitives is a leaf module — importing it creates no cycle, and it
12
+ // is the only compareVersions that honors OpenClaw's `-N` rebuild suffix.
13
+ import { compareVersions } from './agent-spec/primitives.js';
26
14
  function getCapability(agent, cap) {
27
15
  // Guard against unknown agent ids (e.g. a caller passing "claude@2.1.168"
28
16
  // instead of "claude"). Without this, AGENTS[agent] is undefined and the
@@ -34,7 +34,7 @@
34
34
  * human running `agents routines catchup` — which neither an in-process flag
35
35
  * nor `withFileLock` (synchronous; this pass awaits a spawn) can cover.
36
36
  */
37
- import { type JobConfig, type RunMeta } from './routines.js';
37
+ import { type JobConfig, type RunMeta } from './scheduling/routines.js';
38
38
  import { type OverdueJob } from './overdue.js';
39
39
  /** What happened to one overdue routine on a catch-up pass. */
40
40
  export interface CatchupOutcome {
@@ -36,7 +36,7 @@
36
36
  */
37
37
  import * as fs from 'fs';
38
38
  import * as path from 'path';
39
- import { readJob, writeRunMeta, getRunDir, } from './routines.js';
39
+ import { readJob, writeRunMeta, getRunDir, } from './scheduling/routines.js';
40
40
  import { detectOverdueJobs } from './overdue.js';
41
41
  import { executeJobDetached } from './runner.js';
42
42
  /**
@@ -15,7 +15,7 @@ import { die } from '../format.js';
15
15
  import { insertTask, updateTaskStatus } from './store.js';
16
16
  import { renderStream } from './stream.js';
17
17
  import { MissingTargetError, MAX_IMAGES_PER_DISPATCH } from './types.js';
18
- import { emit } from '../events.js';
18
+ import { emit } from '../feed/events.js';
19
19
  import { shareRuntimeEnv } from '../share/config.js';
20
20
  /** Map a supported image file extension to its wire mimeType. Rejects anything else. */
21
21
  function imageMimeFromPath(file) {
@@ -2,8 +2,8 @@
2
2
  * Host cloud provider — your own machines as a task-execution backend.
3
3
  *
4
4
  * A thin adapter over the hosts subsystem (lib/hosts/*): `agents cloud run
5
- * --provider host --host <name>` dispatches through the SAME detached-SSH
6
- * launch as `agents run --host`, and the resulting task shows up in BOTH
5
+ * --provider host --device <name>` dispatches through the SAME detached-SSH
6
+ * launch as `agents run --device`, and the resulting task shows up in BOTH
7
7
  * `agents cloud ps` and `agents devices ps` — one store (the host-task sidecars
8
8
  * under ~/.agents/.cache/hosts/), two views. No new transport, no relay: SSH
9
9
  * is the only wire, exactly like the rest of the hosts design (docs/hosts.md).
@@ -43,7 +43,7 @@ export declare class HostCloudProvider implements CloudProvider {
43
43
  */
44
44
  private reconcileMemoized;
45
45
  /**
46
- * Offset-tail the remote log (the same one-round-trip fetch the `run --host`
46
+ * Offset-tail the remote log (the same one-round-trip fetch the `run --device`
47
47
  * follow uses) and yield it as `text` events until the `.exit` file lands.
48
48
  */
49
49
  stream(taskId: string): AsyncIterable<CloudEvent>;
@@ -2,8 +2,8 @@
2
2
  * Host cloud provider — your own machines as a task-execution backend.
3
3
  *
4
4
  * A thin adapter over the hosts subsystem (lib/hosts/*): `agents cloud run
5
- * --provider host --host <name>` dispatches through the SAME detached-SSH
6
- * launch as `agents run --host`, and the resulting task shows up in BOTH
5
+ * --provider host --device <name>` dispatches through the SAME detached-SSH
6
+ * launch as `agents run --device`, and the resulting task shows up in BOTH
7
7
  * `agents cloud ps` and `agents devices ps` — one store (the host-task sidecars
8
8
  * under ~/.agents/.cache/hosts/), two views. No new transport, no relay: SSH
9
9
  * is the only wire, exactly like the rest of the hosts design (docs/hosts.md).
@@ -77,7 +77,7 @@ export class HostCloudProvider {
77
77
  async dispatch(options) {
78
78
  const hostName = options.providerOptions?.host;
79
79
  if (!hostName) {
80
- throw new MissingTargetError('host', 'No host given. Pass --host <name> (a registered host, a device, a capability tag, or user@host).', 'List your machines: agents devices list · register more: agents devices sync');
80
+ throw new MissingTargetError('host', 'No host given. Pass --device <name> (a registered host, a device, a capability tag, or user@host).', 'List your machines: agents devices list · register more: agents devices sync');
81
81
  }
82
82
  if (resolveDispatchRepos(options).length > 0) {
83
83
  throw new Error('--repo has no meaning for --provider host — the run executes in a directory on the machine, not a cloned repo. ' +
@@ -131,7 +131,7 @@ export class HostCloudProvider {
131
131
  return updateTask(task.id, terminalPatch(st.code)) ?? task;
132
132
  }
133
133
  /**
134
- * Offset-tail the remote log (the same one-round-trip fetch the `run --host`
134
+ * Offset-tail the remote log (the same one-round-trip fetch the `run --device`
135
135
  * follow uses) and yield it as `text` events until the `.exit` file lands.
136
136
  */
137
137
  async *stream(taskId) {
@@ -193,7 +193,7 @@ export class HostCloudProvider {
193
193
  throw new Error(`Unknown host task: ${taskId}`);
194
194
  if (!task.sessionId) {
195
195
  throw new Error(`Host task ${taskId} has no session id to resume (only Claude runs capture one). ` +
196
- `Start a follow-up run instead: agents run ${task.agent} "<prompt>" --host ${task.host}`);
196
+ `Start a follow-up run instead: agents run ${task.agent} "<prompt>" --device ${task.host}`);
197
197
  }
198
198
  const host = await resolveHostRunTarget(task.host);
199
199
  await dispatchPromptToHost(host, {
@@ -5,30 +5,26 @@
5
5
  * Requires the Rush GitHub App installed on the target repo.
6
6
  */
7
7
  import type { CloudProvider, CloudTask, CloudTaskStatus, CloudEvent, DispatchOptions, ProviderCapabilities, ImageAttachment, SkillRef } from './types.js';
8
- export declare const RUSH_CONSENT_PATH: string;
9
- export declare function hasRushUploadConsent(accountFingerprint: string, opts?: DispatchOptions, consentPath?: string): boolean;
10
8
  /** One version's entry in the account manifest sent on every dispatch. */
11
9
  export interface AccountManifestEntry {
12
10
  version: string;
13
11
  email: string;
14
- cred_fp: string;
15
12
  }
16
13
  /**
17
- * Manifest of the user's local Claude accounts. Sent on every dispatch so the
18
- * server can detect "new account" or "token rotated" drift and ask the client
19
- * to upload the underlying credentials. The manifest itself contains no
20
- * secrets only public-ish identifiers + a hash of each token.
14
+ * Manifest of the user's local Claude accounts (version + account email only).
15
+ * Sent on a non-balanced dispatch so the server knows which accounts exist and
16
+ * can route to one. It carries **no credential material** and does NOT read the
17
+ * native OAuth login (RUSH-2527 / SING-1b): agents-cli never reads a harness's
18
+ * interactive login to build this. When the server asks for the underlying token
19
+ * (a new account, or a rotation it can't otherwise resolve), the client does NOT
20
+ * upload it — there is no consented path to copy a native OAuth login to the
21
+ * cloud. Dispatch fails loud and steers to a portable provider account instead
22
+ * (see the 401 handler in `dispatch()`).
21
23
  */
22
24
  export interface AccountManifest {
23
25
  fp: string;
24
26
  versions: AccountManifestEntry[];
25
27
  }
26
- /** Token blob uploaded on retry when the server detects drift. */
27
- export interface AccountTokenEntry {
28
- version: string;
29
- /** Stringified OAuth credentials JSON (Mac: keychain blob; Linux: .credentials.json). */
30
- credentials_json: string;
31
- }
32
28
  /**
33
29
  * Read the raw OAuth credentials for one Claude version. On Mac, prefer the
34
30
  * Keychain blob (canonical). On Linux/CI, fall back to `.claude/.credentials.json`
@@ -53,13 +49,6 @@ export declare function readClaudeCredentialsBlob(home: string): Promise<string
53
49
  * to the platform-wide key, current behavior).
54
50
  */
55
51
  export declare function buildAccountManifest(strategy?: string): Promise<AccountManifest | null>;
56
- /**
57
- * Re-load OAuth blobs for the given versions so they can be uploaded to the
58
- * server on a retry. Only the versions named in the manifest are loaded — we
59
- * never upload tokens for versions the server hasn't asked about.
60
- */
61
- export declare function buildAccountTokensPayload(versions: string[]): Promise<AccountTokenEntry[]>;
62
- export declare function accountTokensFingerprint(tokens: AccountTokenEntry[]): string;
63
52
  /**
64
53
  * Build the POST body for /api/v1/cloud-runs. Exported so tests can verify
65
54
  * the back-compat shape (singular fields + repos[]) without needing real
@@ -77,7 +66,6 @@ export declare function buildDispatchBody(input: {
77
66
  repo_name: string;
78
67
  }>;
79
68
  accountManifest?: AccountManifest | null;
80
- accountTokens?: AccountTokenEntry[] | null;
81
69
  /**
82
70
  * Skill ride-alongs so the cloud pod isn't context-blind. Forwarded verbatim
83
71
  * as `skills` so the Factory Floor can mount them by id/version before the
@@ -9,53 +9,14 @@ import * as path from 'path';
9
9
  import * as os from 'os';
10
10
  import * as crypto from 'crypto';
11
11
  import * as yaml from 'yaml';
12
- import { getCloudDir } from '../state.js';
13
12
  import { resolveDispatchRepos, normalizeProviderStatus, MAX_IMAGES_PER_DISPATCH } from './types.js';
14
13
  import { parseSSE } from './stream.js';
15
- import { listInstalledVersions, getVersionHomePath } from '../versions.js';
14
+ import { listInstalledVersions, getVersionHomePath } from '../installations/versions.js';
16
15
  import { getAccountInfo } from '../agents.js';
17
- import { loadClaudeOauth } from '../usage.js';
18
- import { selectBalancedVersion } from '../rotate.js';
16
+ import { loadClaudeOauth } from '../accounting/usage.js';
17
+ import { selectBalancedVersion } from '../accounting/rotate.js';
19
18
  const PROXY_BASE = process.env.RUSH_PROXY_BASE ?? 'https://api.prix.dev';
20
- const PROXY_HOST = new URL(PROXY_BASE).host;
21
19
  const USER_YAML = path.join(os.homedir(), '.rush', 'user.yaml');
22
- // Persistent consent record for uploading Claude OAuth blobs to Rush Cloud.
23
- // Created on first explicit consent (env var or flag); subsequent dispatches
24
- // see it and proceed without re-prompting.
25
- export const RUSH_CONSENT_PATH = path.join(getCloudDir(), 'rush-consent.json');
26
- const RUSH_CONSENT_ENV = 'AGENTS_RUSH_UPLOAD_TOKENS';
27
- export function hasRushUploadConsent(accountFingerprint, opts, consentPath = RUSH_CONSENT_PATH) {
28
- if (process.env[RUSH_CONSENT_ENV] === '1')
29
- return true;
30
- const po = opts?.providerOptions;
31
- if (po?.uploadAccountTokens === true)
32
- return true;
33
- try {
34
- if (!fs.existsSync(consentPath))
35
- return false;
36
- const body = JSON.parse(fs.readFileSync(consentPath, 'utf-8'));
37
- return body.host === PROXY_HOST && body.account_fingerprint === accountFingerprint;
38
- }
39
- catch {
40
- return false;
41
- }
42
- }
43
- function recordRushUploadConsent(grantedBy, accountFingerprint) {
44
- try {
45
- fs.mkdirSync(path.dirname(RUSH_CONSENT_PATH), { recursive: true });
46
- const body = {
47
- granted_at: new Date().toISOString(),
48
- granted_by: grantedBy,
49
- host: PROXY_HOST,
50
- account_fingerprint: accountFingerprint,
51
- };
52
- fs.writeFileSync(RUSH_CONSENT_PATH, JSON.stringify(body, null, 2), { mode: 0o600 });
53
- }
54
- catch {
55
- // Non-fatal: consent persistence is a UX optimization, not a security
56
- // boundary. Worst case, the user is asked to consent again next dispatch.
57
- }
58
- }
59
20
  /** Read the Rush session access token from ~/.rush/user.yaml. */
60
21
  function readToken() {
61
22
  if (!fs.existsSync(USER_YAML)) {
@@ -217,40 +178,24 @@ export async function buildAccountManifest(strategy) {
217
178
  }));
218
179
  candidateVersions = rows.filter((r) => r !== null);
219
180
  }
220
- const entries = [];
221
- for (const { version, email } of candidateVersions) {
222
- const home = getVersionHomePath('claude', version);
223
- const blob = await readClaudeCredentialsBlob(home);
224
- if (!blob)
225
- continue;
226
- entries.push({ version, email, cred_fp: sha256(blob) });
227
- }
181
+ // RUSH-2527 / SING-1b: do NOT read the native OAuth login to fingerprint it.
182
+ // The manifest carries version + account email only enough for the server to
183
+ // route to an account. If the server needs the token itself, the client does NOT
184
+ // upload it (there is no consented path to copy a native OAuth login to the
185
+ // cloud); dispatch fails loud and steers to a portable provider account.
186
+ const entries = candidateVersions
187
+ .map(({ version, email }) => ({ version, email }))
188
+ .sort((a, b) => a.version.localeCompare(b.version));
228
189
  if (entries.length === 0)
229
190
  return null;
230
- entries.sort((a, b) => a.version.localeCompare(b.version));
231
191
  const fp = sha256(JSON.stringify(entries));
232
192
  return { fp, versions: entries };
233
193
  }
234
- /**
235
- * Re-load OAuth blobs for the given versions so they can be uploaded to the
236
- * server on a retry. Only the versions named in the manifest are loaded — we
237
- * never upload tokens for versions the server hasn't asked about.
238
- */
239
- export async function buildAccountTokensPayload(versions) {
240
- const out = [];
241
- for (const version of versions) {
242
- const home = getVersionHomePath('claude', version);
243
- const blob = await readClaudeCredentialsBlob(home);
244
- if (!blob)
245
- continue;
246
- out.push({ version, credentials_json: blob });
247
- }
248
- return out;
249
- }
250
- export function accountTokensFingerprint(tokens) {
251
- const canonical = [...tokens].sort((a, b) => a.version.localeCompare(b.version));
252
- return sha256(JSON.stringify(canonical));
253
- }
194
+ // buildAccountTokensPayload / accountTokensFingerprint (which read every installed
195
+ // Claude version's native OAuth token to upload it to the cloud) were REMOVED
196
+ // SING-1b forbids reading or transferring a native OAuth / session login, even
197
+ // with consent. Cloud dispatch under a native login now fails loud and steers to a
198
+ // portable provider account (see the 401 handler in dispatch()).
254
199
  /**
255
200
  * Build the POST body for /api/v1/cloud-runs. Exported so tests can verify
256
201
  * the back-compat shape (singular fields + repos[]) without needing real
@@ -277,9 +222,6 @@ export function buildDispatchBody(input) {
277
222
  if (input.accountManifest) {
278
223
  body.account_manifest = input.accountManifest;
279
224
  }
280
- if (input.accountTokens && input.accountTokens.length > 0) {
281
- body.account_tokens = input.accountTokens;
282
- }
283
225
  if (input.skills && input.skills.length > 0) {
284
226
  body.skills = input.skills;
285
227
  }
@@ -364,56 +306,27 @@ export class RushCloudProvider {
364
306
  env: options.env,
365
307
  });
366
308
  let res = await api('POST', '/api/v1/cloud-runs', token, body);
367
- // Server detects drift (new account or rotated token) by comparing the
368
- // manifest's fp against what's stored. It returns 401 with a prompt_code
369
- // telling the client to re-upload the actual token blobs and retry once.
309
+ // The server asks the client to upload the underlying Claude OAuth token when
310
+ // it detects a new account or a rotation (401 + prompt_code). agents-cli NEVER
311
+ // reads or transfers a native OAuth / session login off this machine — not
312
+ // even with consent (SING-1b): a rotating token copied to the cloud is
313
+ // invalidated on its next refresh and logs the fleet out. Fail loud and steer
314
+ // to a portable provider account instead of exfiltrating the login.
370
315
  if (res.status === 401 && accountManifest) {
371
316
  const errBody = await res.clone().text();
372
317
  const promptCode = parsePromptCode(errBody);
373
318
  if (promptCode === 'NEW_ACCOUNT' || promptCode === 'TOKEN_ROTATED') {
374
- const accountTokens = await buildAccountTokensPayload(accountManifest.versions.map((v) => v.version));
375
- const accountFingerprint = accountTokensFingerprint(accountTokens);
376
- // Refuse to silently exfiltrate Claude OAuth credentials. The retry
377
- // path below reads accessToken+refreshToken from every installed
378
- // Claude version and POSTs them to api.prix.dev. That's an explicit
379
- // data-flow decision the user has to opt into.
380
- if (!hasRushUploadConsent(accountFingerprint, options)) {
381
- throw new Error([
382
- `Rush Cloud asked to sync your Claude credentials (reason: ${promptCode.toLowerCase()}).`,
383
- `This would upload accessToken + refreshToken from every installed Claude version`,
384
- `to ${PROXY_BASE} so Factory Floor pods can act as your Anthropic account.`,
385
- ``,
386
- `To consent, re-run with one of:`,
387
- ` AGENTS_RUSH_UPLOAD_TOKENS=1 agents cloud run ...`,
388
- ` agents cloud run --upload-account-tokens ...`,
389
- ``,
390
- `Consent will be recorded at ${RUSH_CONSENT_PATH} so you won't be asked again.`,
391
- `Remove that file to revoke.`,
392
- ].join('\n'));
393
- }
394
- // Always-on stderr notice (no isTTY gate). Scripts and CI need to see
395
- // this in their captured stderr / logs.
396
- const grantedBy = process.env[RUSH_CONSENT_ENV] === '1' ? 'env'
397
- : options.providerOptions?.uploadAccountTokens === true ? 'flag'
398
- : 'manual';
399
- process.stderr.write(`[rush] uploading ${accountTokens.length} account token(s) to ${PROXY_HOST}\n`);
400
- const retryBody = buildDispatchBody({
401
- agent: options.agent,
402
- prompt: options.prompt,
403
- mode: options.providerOptions?.mode,
404
- resolvedRepos,
405
- accountManifest,
406
- accountTokens,
407
- skills: options.skills,
408
- images: options.images,
409
- env: options.env,
410
- });
411
- res = await api('POST', '/api/v1/cloud-runs', token, retryBody);
412
- // Persist consent on first successful upload so we don't re-prompt
413
- // every time tokens rotate.
414
- if (res.ok && grantedBy !== 'manual') {
415
- recordRushUploadConsent(grantedBy, accountFingerprint);
416
- }
319
+ throw new Error([
320
+ `Rush Cloud asked to sync your Claude login (reason: ${promptCode.toLowerCase()}), but`,
321
+ `agents-cli never copies a native OAuth / session login off this machine (SING-1b) —`,
322
+ `a rotating token uploaded to the cloud is invalidated on its next refresh.`,
323
+ ``,
324
+ `Portable provider accounts can run locally or on a pinned fleet device, but cloud`,
325
+ `placement does not securely inject them yet. Create and sync one with:`,
326
+ ` agents accounts add <name> --provider anthropic --auth api-key # or: --auth setup-token`,
327
+ ` agents accounts sync <name> <device>`,
328
+ `then run locally or on that device with --account <name>. See docs/credential-management.md (SING-1b).`,
329
+ ].join('\n'));
417
330
  }
418
331
  }
419
332
  if (!res.ok) {
@@ -5,7 +5,7 @@
5
5
  * Factory) implement, plus the shared task and event types that flow through
6
6
  * the dispatch pipeline.
7
7
  */
8
- import type { JobTrigger } from '../routines.js';
8
+ import type { JobTrigger } from '../scheduling/routines.js';
9
9
  /**
10
10
  * Identifier for a supported cloud dispatch backend.
11
11
  *
@@ -19,7 +19,7 @@ import type { JobTrigger } from '../routines.js';
19
19
  *
20
20
  * Agents route to their native cloud automatically (see `cloudProvider` in the
21
21
  * agent registry); `--provider` overrides. Nothing auto-routes to `host` — it
22
- * is always an explicit `--provider host` (or `--host <name>`) choice.
22
+ * is always an explicit `--provider host` (or `--device <name>`) choice.
23
23
  */
24
24
  export type CloudProviderId = 'rush' | 'codex' | 'factory' | 'antigravity' | 'cursor' | 'host';
25
25
  /**
@@ -7,6 +7,7 @@
7
7
  * agent version homes.
8
8
  */
9
9
  import * as fs from 'fs';
10
+ import { compareVersions } from './agent-spec/primitives.js';
10
11
  import * as path from 'path';
11
12
  import * as yaml from 'yaml';
12
13
  import { AGENTS, ensureCommandsDir, agentConfigDirName, resolveAgentName } from './agents.js';
@@ -15,21 +16,10 @@ import { isDirectoryDoc } from './resources.js';
15
16
  import { normalizeAliases } from './resource-aliases.js';
16
17
  import { markdownToToml } from './convert.js';
17
18
  import { getCommandsDir, getUserCommandsDir, getEnabledExtraRepos, getProjectAgentsDir, getSkillsDir, getTrashCommandsDir } from './state.js';
18
- import { getEffectiveHome, getVersionHomePath, listInstalledVersions, resolveVersion } from './versions.js';
19
- import { discoverPlugins } from './plugins.js';
19
+ import { getEffectiveHome, getVersionHomePath, listInstalledVersions, resolveVersion } from './installations/versions.js';
20
+ import { discoverPlugins } from './plugins/plugins.js';
20
21
  import { commandSkillMatches, installCommandSkillToVersion, listCommandSkillsInVersion, removeCommandSkillFromVersion, shouldAlsoInstallCommandAsSkill, shouldInstallCommandAsSkill, } from './command-skills.js';
21
22
  import { installGooseCommandToVersion, listGooseCommandsInVersion, gooseCommandMatches, removeGooseCommandFromVersion, } from './goose-commands.js';
22
- function compareVersions(a, b) {
23
- const aParts = a.split('.').map((n) => parseInt(n, 10) || 0);
24
- const bParts = b.split('.').map((n) => parseInt(n, 10) || 0);
25
- for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
26
- const aVal = aParts[i] || 0;
27
- const bVal = bParts[i] || 0;
28
- if (aVal !== bVal)
29
- return aVal - bVal;
30
- }
31
- return 0;
32
- }
33
23
  function parseAgentsField(raw) {
34
24
  if (raw == null)
35
25
  return undefined;
@@ -0,0 +1,36 @@
1
+ import type { ComputerClient } from '../computer-rpc.js';
2
+ export interface AppInfo {
3
+ pid: number;
4
+ name: string;
5
+ bundle_id: string;
6
+ active: boolean;
7
+ }
8
+ export declare function pickTarget(list: AppInfo[], opts: {
9
+ pid?: number;
10
+ bundle?: string;
11
+ }): {
12
+ ok: true;
13
+ app: AppInfo;
14
+ } | {
15
+ ok: false;
16
+ error: string;
17
+ };
18
+ export declare function resolveTargetPidDecision(client: ComputerClient, opts: {
19
+ pid?: number;
20
+ bundle?: string;
21
+ }, gate?: {
22
+ verb?: string;
23
+ env?: NodeJS.ProcessEnv;
24
+ nowMs?: number;
25
+ }): Promise<{
26
+ ok: true;
27
+ pid: number;
28
+ source: 'pid' | 'list_apps' | 'session_admission';
29
+ } | {
30
+ ok: false;
31
+ error: string;
32
+ }>;
33
+ export declare function emitComputerAction(verb: string, targetPid: number | undefined, opts: {
34
+ bundle?: string;
35
+ device?: string;
36
+ }, extra?: Record<string, unknown>): void;