@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
@@ -13,7 +13,8 @@ import { makeVerbDispatcher } from '../lib/computer/dispatch.js';
13
13
  import { makeClaudeResponder, resolveApiKey, DEFAULT_CLAUDE_MODEL, DEFAULT_CLAUDE_BASE_URL } from '../lib/computer/model.js';
14
14
  import { TASK_PREVIEW_MAX_CHARS } from '../lib/computer/sessions-list.js';
15
15
  import { runComputerSessionsCommand } from './computer-sessions-picker.js';
16
- import { truncate } from '../lib/events.js';
16
+ import { truncate } from '../lib/feed/events.js';
17
+ import { namespacedServiceLabel, serviceManifestHomeEnv } from '../lib/service-manifest.js';
17
18
  // Help groups — mirror `agents browser` so the mental model carries over.
18
19
  const COMPUTER_HELP_GROUPS = [
19
20
  { title: 'Installation', names: ['setup'] },
@@ -23,16 +24,16 @@ const COMPUTER_HELP_GROUPS = [
23
24
  { title: 'Interact', names: ['launch', 'raise', 'click', 'right-click', 'type', 'type-text', 'key', 'drag', 'scroll', 'ax-action', 'focus', 'wait'] },
24
25
  { title: 'History and discovery', names: ['sessions'] },
25
26
  ];
26
- // Subcommands that manage the `--host` remote path themselves (provisioning /
27
+ // Subcommands that manage the `--device` remote path themselves (provisioning /
27
28
  // tunnel lifecycle, or daemon-state reporting that must degrade gracefully
28
- // when no tunnel is recorded). Every other `--host`-bearing subcommand is a
29
+ // when no tunnel is recorded). Every other `--device`-bearing subcommand is a
29
30
  // plain verb that just needs the TCP endpoint hydrated before it runs.
30
31
  const REMOTE_LIFECYCLE = new Set(['setup', 'start', 'stop', 'status', 'reload']);
31
32
  /**
32
33
  * Pure platform gate. The computer subsystem is macOS-only for LOCAL driving
33
34
  * (Accessibility / launchctl). It is NOT blocked off macOS when a remote daemon
34
35
  * is reachable — either a configured TCP endpoint (COMPUTER_HELPER_TCP, e.g. a
35
- * Windows daemon over a tunnel) or a `--host <device>` remote invocation. Kept
36
+ * Windows daemon over a tunnel) or a `--device <name>` remote invocation. Kept
36
37
  * pure so the gating rule is unit-testable without a live command tree.
37
38
  */
38
39
  export function shouldBlockOffPlatform(opts) {
@@ -40,7 +41,7 @@ export function shouldBlockOffPlatform(opts) {
40
41
  return false;
41
42
  if (opts.tcpConfigured)
42
43
  return false; // remote (Windows) daemon over a tunnel
43
- if (opts.host)
44
+ if (opts.device)
44
45
  return false; // remote path resolves its own endpoint
45
46
  return true;
46
47
  }
@@ -83,21 +84,21 @@ export function reconcileScreenshotExt(outPath, buf) {
83
84
  export function registerComputerCommand(program) {
84
85
  const computer = program
85
86
  .command('computer')
86
- .description('Drive macOS apps via Accessibility, or a remote Windows host with --host — list, screenshot, click, type')
87
+ .description('Drive macOS apps via Accessibility, or a remote Windows device with --device — list, screenshot, click, type')
87
88
  // The whole subsystem is macOS Accessibility / TCC for LOCAL driving. Off
88
89
  // macOS it still works against a remote daemon (COMPUTER_HELPER_TCP set, or
89
- // a `--host <device>` invocation). Fail fast with a clear message only when
90
+ // a `--device <name>` invocation). Fail fast with a clear message only when
90
91
  // neither remote path is available, instead of a downstream launchctl error.
91
92
  .hook('preAction', async (_thisCommand, actionCommand) => {
92
- const host = actionCommand.opts().host;
93
- // Verbs with --host reconnect to the tunnel `start --host` recorded; this
94
- // sets COMPUTER_HELPER_TCP so the shared client picks the TCP transport.
95
- if (host && !REMOTE_LIFECYCLE.has(actionCommand.name())) {
96
- hydrateRemoteEnvFromState(host);
93
+ const device = actionCommand.opts().device;
94
+ // Verbs with --device reconnect to the tunnel `start --device` recorded;
95
+ // this sets COMPUTER_HELPER_TCP so the shared client picks the TCP transport.
96
+ if (device && !REMOTE_LIFECYCLE.has(actionCommand.name())) {
97
+ hydrateRemoteEnvFromState(device);
97
98
  }
98
- if (shouldBlockOffPlatform({ platform: process.platform, tcpConfigured: resolveTcpEndpoint() != null, host })) {
99
+ if (shouldBlockOffPlatform({ platform: process.platform, tcpConfigured: resolveTcpEndpoint() != null, device })) {
99
100
  console.error('agents computer: macOS only for local driving — it uses the macOS Accessibility API.');
100
- console.error('For a remote Windows host: register it with `agents devices`, then use --host (or set COMPUTER_HELPER_TCP).');
101
+ console.error('For a remote Windows device: register it with `agents devices`, then use --device (or set COMPUTER_HELPER_TCP).');
101
102
  process.exit(1);
102
103
  }
103
104
  });
@@ -119,11 +120,11 @@ export function registerComputerSubcommands(program) {
119
120
  function registerStatusCommand(program) {
120
121
  program
121
122
  .command('status')
122
- .description('Report install state, daemon state, and Accessibility trust — or a remote Windows daemon with --host')
123
- .option('--host <device>', 'Report the remote Windows daemon (tunnel + liveness) instead of the local helper')
123
+ .description('Report install state, daemon state, and Accessibility trust — or a remote Windows daemon with --device')
124
+ .option('--device <name>', 'Report the remote Windows daemon (tunnel + liveness) instead of the local helper')
124
125
  .action(async (opts) => {
125
- if (opts.host) {
126
- await reportRemoteStatus(opts.host);
126
+ if (opts.device) {
127
+ await reportRemoteStatus(opts.device);
127
128
  return;
128
129
  }
129
130
  const socketPath = resolveSocketPath();
@@ -172,21 +173,21 @@ function registerStatusCommand(program) {
172
173
  }
173
174
  });
174
175
  }
175
- // status --host: the local checks (app install, launchd socket, policy files)
176
+ // status --device: the local checks (app install, launchd socket, policy files)
176
177
  // are macOS concepts — a remote Windows daemon is reported from what actually
177
178
  // exists for it: the recorded tunnel and a live trust_status probe through it.
178
- async function reportRemoteStatus(host) {
179
- console.log(`host: ${host}`);
180
- const state = readRemoteState(host);
179
+ async function reportRemoteStatus(device) {
180
+ console.log(`device: ${device}`);
181
+ const state = readRemoteState(device);
181
182
  if (!state) {
182
183
  console.log('tunnel: none');
183
184
  console.log('daemon: unknown (no tunnel to probe through)');
184
185
  console.log('');
185
- console.log(`Run: agents computer start --host ${host}`);
186
+ console.log(`Run: agents computer start --device ${device}`);
186
187
  process.exit(1);
187
188
  }
188
189
  console.log(`tunnel: 127.0.0.1:${state.localPort} -> ${state.target} (127.0.0.1:${state.remotePort})`);
189
- hydrateRemoteEnvFromState(host);
190
+ hydrateRemoteEnvFromState(device);
190
191
  try {
191
192
  const client = openComputerClient();
192
193
  try {
@@ -210,7 +211,7 @@ async function reportRemoteStatus(host) {
210
211
  console.log('daemon: unreachable');
211
212
  console.log(` ${err.message}`);
212
213
  console.log('');
213
- console.log(`Run: agents computer start --host ${host}`);
214
+ console.log(`Run: agents computer start --device ${device}`);
214
215
  process.exit(1);
215
216
  }
216
217
  }
@@ -227,12 +228,12 @@ export function buildRestartTaskScript(taskName, exeName) {
227
228
  `Write-Output 'restarted'`,
228
229
  ].join('; ');
229
230
  }
230
- // reload --host: the Windows daemon has no policy file to re-read (it
231
+ // reload --device: the Windows daemon has no policy file to re-read (it
231
232
  // enforces no allow-list — see TrustStatus in native/computer-win/Rpc.cs), so
232
233
  // reload means bounce the daemon via its scheduled task — the way to pick up
233
234
  // a freshly pushed exe — then prove it answers through the recorded tunnel.
234
- async function reloadRemoteHelper(host) {
235
- const { target } = await resolveRemoteDevice(host);
235
+ async function reloadRemoteHelper(device) {
236
+ const { target } = await resolveRemoteDevice(device);
236
237
  const script = buildRestartTaskScript(REMOTE_TASK_NAME, WIN_HELPER_EXE);
237
238
  const res = sshExec(target, `powershell -NoProfile -NonInteractive -EncodedCommand ${encodePowershell(script)}`, { timeoutMs: 60_000 });
238
239
  if (res.code !== 0) {
@@ -241,12 +242,12 @@ async function reloadRemoteHelper(host) {
241
242
  process.exit(1);
242
243
  }
243
244
  console.log(`task: restarted "${REMOTE_TASK_NAME}" on ${target}`);
244
- const state = readRemoteState(host);
245
+ const state = readRemoteState(device);
245
246
  if (!state) {
246
- console.log(`(no tunnel recorded — run \`agents computer start --host ${host}\` to drive it)`);
247
+ console.log(`(no tunnel recorded — run \`agents computer start --device ${device}\` to drive it)`);
247
248
  return;
248
249
  }
249
- hydrateRemoteEnvFromState(host);
250
+ hydrateRemoteEnvFromState(device);
250
251
  // The relaunched daemon needs a beat to rebind its port; poll through the
251
252
  // tunnel until it answers.
252
253
  const deadline = Date.now() + 15_000;
@@ -290,7 +291,7 @@ function registerRunCommand(program) {
290
291
  .option('--model <id>', `Model id (default: ${DEFAULT_CLAUDE_MODEL})`)
291
292
  .option('--max-steps <n>', 'Max model turns before giving up', (v) => parseInt(v, 10), 12)
292
293
  .option('--max-tokens <n>', 'Max tokens per model turn', (v) => parseInt(v, 10), 1024)
293
- .option('--host <device>', 'Drive a remote Windows device (requires `agents computer start --host <device>` first)')
294
+ .option('--device <name>', 'Drive a remote Windows device (requires `agents computer start --device <name>` first)')
294
295
  .option('--json', 'Emit the final loop result as JSON')
295
296
  .action(async (opts) => {
296
297
  const apiKey = resolveApiKey({ apiKey: undefined, baseUrl: opts.baseUrl });
@@ -305,9 +306,9 @@ function registerRunCommand(program) {
305
306
  model: opts.model,
306
307
  maxTokens: opts.maxTokens,
307
308
  });
308
- emitComputerRunTaskMarker({ task: opts.task, bundle: opts.bundle, host: opts.host });
309
+ emitComputerRunTaskMarker({ task: opts.task, bundle: opts.bundle, device: opts.device });
309
310
  await withClient(async (client) => {
310
- const dispatch = makeVerbDispatcher(client, { host: opts.host });
311
+ const dispatch = makeVerbDispatcher(client, { device: opts.device });
311
312
  const targetInput = opts.bundle ? { bundle: opts.bundle } : {};
312
313
  const result = await runComputerLoop({
313
314
  task: opts.task,
@@ -337,7 +338,7 @@ function registerSessionsCommand(program) {
337
338
  program
338
339
  .command('sessions')
339
340
  .description('Browse computer-driving history, grouped by run — one row per `agents computer` invocation')
340
- .option('--machine <name>', 'Only rows invoked from/driving this machine (hostname, machineId, or --host device)')
341
+ .option('--machine <name>', 'Only rows invoked from/driving this machine (hostname, machineId, or --device name)')
341
342
  .option('--limit <n>', 'Cap the flat/--no-interactive table at this many rows (default 50; --json is unbounded)', (v) => parseInt(v, 10))
342
343
  .option('--json', 'Emit machine-readable JSON')
343
344
  .option('--no-interactive', 'Print the flat listing instead of opening the interactive run browser')
@@ -357,7 +358,7 @@ function registerSessionsCommand(program) {
357
358
  * `emitComputerAction`.
358
359
  */
359
360
  export function emitComputerRunTaskMarker(opts) {
360
- emitComputerAction('run', undefined, { bundle: opts.bundle, host: opts.host }, {
361
+ emitComputerAction('run', undefined, { bundle: opts.bundle, device: opts.device }, {
361
362
  task: truncate(opts.task, TASK_PREVIEW_MAX_CHARS),
362
363
  });
363
364
  }
@@ -388,11 +389,11 @@ function registerScreenshotCommand(program) {
388
389
  .description('Capture a window (default: largest), enumerate windows (--list), or the whole display (--display)')
389
390
  .option('--bundle <id>', 'Bundle id to capture (default: frontmost allow-listed app)')
390
391
  .option('--pid <n>', 'Target pid directly (overrides --bundle)', (v) => parseInt(v, 10))
391
- .option('--host <device>', 'Drive a remote Windows device (requires `agents computer start --host <device>` first)')
392
+ .option('--device <name>', 'Drive a remote Windows device (requires `agents computer start --device <name>` first)')
392
393
  .option('--list', 'List the app\'s windows (id/title/layer/bounds) instead of capturing — reveals modals/popups')
393
394
  .option('--window-id <n>', 'Capture a specific window by id (from --list)', (v) => parseInt(v, 10))
394
395
  .option('--display', 'Capture the whole display the app is on (composites stacked modals)')
395
- .option('--out <path>', 'Output image path — extension auto-corrected to the encoded format (JPEG on macOS, PNG on a Windows --host)', './computer-screenshot.jpg')
396
+ .option('--out <path>', 'Output image path — extension auto-corrected to the encoded format (JPEG on macOS, PNG on a Windows --device)', './computer-screenshot.jpg')
396
397
  .option('--quality <n>', 'JPEG quality 1-100 (macOS capture only; the Windows helper encodes lossless PNG and ignores this)', (v) => parseInt(v, 10), 85)
397
398
  .option('--json', 'Emit JSON (metadata for captures; window list for --list)')
398
399
  .action(async (opts) => {
@@ -479,7 +480,16 @@ function registerScreenshotCommand(program) {
479
480
  const HELPER_BUNDLE_ID = 'com.phnx-labs.computer-helper';
480
481
  const HELPER_APP_NAME = 'Computer Helper.app';
481
482
  const HELPER_APP_DEST = `/Applications/${HELPER_APP_NAME}`;
482
- const HELPER_LABEL = HELPER_BUNDLE_ID;
483
+ /**
484
+ * launchd Label for this process's helper — the production identifier for a real
485
+ * invocation, namespaced under a redirected HOME (RUSH-2639). launchd routes
486
+ * bootout/bootstrap/kickstart/print by identifier alone, never by the plist's
487
+ * path, so without this a process running under a sandbox HOME tears down the
488
+ * operator's live helper.
489
+ */
490
+ export function helperLabel() {
491
+ return namespacedServiceLabel(HELPER_BUNDLE_ID);
492
+ }
483
493
  /**
484
494
  * Install the macOS helper locally: resolve (or download + verify) the signed,
485
495
  * notarized .app, copy it to /Applications, verify the destination signature,
@@ -499,7 +509,7 @@ export async function installComputerHelperMacLocal() {
499
509
  }
500
510
  const socketPath = resolveSocketPath();
501
511
  const logPath = resolveLogPath();
502
- const plistPath = path.join(os.homedir(), 'Library', 'LaunchAgents', `${HELPER_LABEL}.plist`);
512
+ const plistPath = path.join(os.homedir(), 'Library', 'LaunchAgents', `${helperLabel()}.plist`);
503
513
  console.log(`source: ${srcApp}`);
504
514
  console.log(`dest: ${HELPER_APP_DEST}`);
505
515
  // 1. Copy to /Applications/ via ditto (preserves xattrs + codesign metadata).
@@ -531,7 +541,7 @@ export async function installComputerHelperMacLocal() {
531
541
  fs.mkdirSync(path.dirname(logPath), { recursive: true });
532
542
  // 4. Write the LaunchAgent plist but DO NOT bootstrap it (opt-in via `start`).
533
543
  const execInsideApp = path.join(HELPER_APP_DEST, 'Contents', 'MacOS', 'ComputerHelper');
534
- const plistContent = renderLaunchAgentPlist({ label: HELPER_LABEL, exec: execInsideApp, socketPath, logPath });
544
+ const plistContent = renderLaunchAgentPlist({ label: helperLabel(), exec: execInsideApp, socketPath, logPath });
535
545
  fs.mkdirSync(path.dirname(plistPath), { recursive: true });
536
546
  fs.writeFileSync(plistPath, plistContent);
537
547
  console.log(`wrote plist: ${plistPath} (NOT activated)`);
@@ -544,7 +554,7 @@ export async function installComputerHelperMacLocal() {
544
554
  * Shared by `agents computer start` and the `agents setup computer` wizard.
545
555
  */
546
556
  export async function activateComputerHelperMacLocal() {
547
- const plistPath = path.join(os.homedir(), 'Library', 'LaunchAgents', `${HELPER_LABEL}.plist`);
557
+ const plistPath = path.join(os.homedir(), 'Library', 'LaunchAgents', `${helperLabel()}.plist`);
548
558
  const socketPath = resolveSocketPath();
549
559
  const logPath = resolveLogPath();
550
560
  if (!fs.existsSync(plistPath))
@@ -591,7 +601,7 @@ export async function activateComputerHelperMacLocal() {
591
601
  }
592
602
  // Force restart so we pick up the latest binary.
593
603
  try {
594
- execFileSync('/bin/launchctl', ['kickstart', '-k', `${domain}/${HELPER_LABEL}`], { stdio: 'pipe' });
604
+ execFileSync('/bin/launchctl', ['kickstart', '-k', `${domain}/${helperLabel()}`], { stdio: 'pipe' });
595
605
  }
596
606
  catch (err) {
597
607
  throw new Error(`launchctl kickstart failed: ${err.message}`);
@@ -650,16 +660,16 @@ function registerSetupCommand(program) {
650
660
  program
651
661
  .command('setup')
652
662
  .alias('install-helper')
653
- .description('Install the helper — locally to /Applications/ (macOS), or to a remote Windows host with --host')
654
- .option('--host <device>', 'Provision a remote Windows device (push the exe + register a LOGON task) instead of installing locally')
663
+ .description('Install the helper — locally to /Applications/ (macOS), or to a remote Windows device with --device')
664
+ .option('--device <name>', 'Provision a remote Windows device (push the exe + register a LOGON task) instead of installing locally')
655
665
  .action(async (opts) => {
656
- if (opts.host) {
666
+ if (opts.device) {
657
667
  try {
658
- const { target, taskName } = await setupRemoteHelper(opts.host);
668
+ const { target, taskName } = await setupRemoteHelper(opts.device);
659
669
  console.log(`pushed computer-helper-win.exe to ${target}`);
660
670
  console.log(`registered LOGON scheduled task "${taskName}" (interactive session, started now)`);
661
671
  console.log('');
662
- console.log(`Next: agents computer start --host ${opts.host}`);
672
+ console.log(`Next: agents computer start --device ${opts.device}`);
663
673
  }
664
674
  catch (err) {
665
675
  console.error(`error: ${err.message}`);
@@ -698,17 +708,17 @@ function registerSetupCommand(program) {
698
708
  function registerStartCommand(program) {
699
709
  program
700
710
  .command('start')
701
- .description('Activate the helper daemon — local launchd (macOS) or a remote Windows tunnel with --host')
702
- .option('--host <device>', 'Open a tunnel to the remote Windows daemon and record it for --host verbs')
711
+ .description('Activate the helper daemon — local launchd (macOS) or a remote Windows tunnel with --device')
712
+ .option('--device <name>', 'Open a tunnel to the remote Windows daemon and record it for --device verbs')
703
713
  .action(async (opts) => {
704
- if (opts.host) {
714
+ if (opts.device) {
705
715
  try {
706
- const state = await startRemoteTunnel(opts.host);
716
+ const state = await startRemoteTunnel(opts.device);
707
717
  console.log(`tunnel: 127.0.0.1:${state.localPort} -> ${state.target} (127.0.0.1:${state.remotePort})`);
708
718
  console.log(`daemon: answering (ssh pid ${state.tunnelPid})`);
709
719
  console.log('');
710
- console.log(`Drive it: agents computer apps --host ${opts.host}`);
711
- console.log(`Stop: agents computer stop --host ${opts.host}`);
720
+ console.log(`Drive it: agents computer apps --device ${opts.device}`);
721
+ console.log(`Stop: agents computer stop --device ${opts.device}`);
712
722
  }
713
723
  catch (err) {
714
724
  console.error(`error: ${err.message}`);
@@ -733,12 +743,12 @@ function registerStartCommand(program) {
733
743
  function registerReloadCommand(program) {
734
744
  program
735
745
  .command('reload')
736
- .description('Reload the allow-list policy (SIGHUP the local daemon) — or restart a remote Windows daemon with --host')
737
- .option('--host <device>', 'Restart the remote Windows daemon (its scheduled task) instead of SIGHUPing the local one')
746
+ .description('Reload the allow-list policy (SIGHUP the local daemon) — or restart a remote Windows daemon with --device')
747
+ .option('--device <name>', 'Restart the remote Windows daemon (its scheduled task) instead of SIGHUPing the local one')
738
748
  .action(async (opts) => {
739
- if (opts.host) {
749
+ if (opts.device) {
740
750
  try {
741
- await reloadRemoteHelper(opts.host);
751
+ await reloadRemoteHelper(opts.device);
742
752
  }
743
753
  catch (err) {
744
754
  console.error(`error: ${err.message}`);
@@ -771,7 +781,7 @@ function registerReloadCommand(program) {
771
781
  const domain = `gui/${uid}`;
772
782
  let pid = null;
773
783
  try {
774
- const out = execFileSync('/bin/launchctl', ['print', `${domain}/${HELPER_LABEL}`], { encoding: 'utf-8' });
784
+ const out = execFileSync('/bin/launchctl', ['print', `${domain}/${helperLabel()}`], { encoding: 'utf-8' });
775
785
  const m = out.match(/\bpid\s*=\s*(\d+)/);
776
786
  if (m)
777
787
  pid = parseInt(m[1], 10);
@@ -809,12 +819,12 @@ function registerReloadCommand(program) {
809
819
  function registerStopCommand(program) {
810
820
  program
811
821
  .command('stop')
812
- .description('Deactivate the helper daemon — local launchd (macOS) or a remote Windows tunnel with --host')
813
- .option('--host <device>', 'Tear down the remote tunnel and unregister the scheduled task')
822
+ .description('Deactivate the helper daemon — local launchd (macOS) or a remote Windows tunnel with --device')
823
+ .option('--device <name>', 'Tear down the remote tunnel and unregister the scheduled task')
814
824
  .action(async (opts) => {
815
- if (opts.host) {
825
+ if (opts.device) {
816
826
  try {
817
- const { tunnelKilled, taskRemoved } = await stopRemoteHelper(opts.host);
827
+ const { tunnelKilled, taskRemoved } = await stopRemoteHelper(opts.device);
818
828
  console.log(`tunnel: ${tunnelKilled ? 'closed' : 'not running'}`);
819
829
  console.log(`task: ${taskRemoved ? 'unregistered' : 'not removed (device offline?)'}`);
820
830
  }
@@ -825,7 +835,7 @@ function registerStopCommand(program) {
825
835
  return;
826
836
  }
827
837
  const home = os.homedir();
828
- const plistPath = path.join(home, 'Library', 'LaunchAgents', `${HELPER_LABEL}.plist`);
838
+ const plistPath = path.join(home, 'Library', 'LaunchAgents', `${helperLabel()}.plist`);
829
839
  const socketPath = resolveSocketPath();
830
840
  const uid = process.getuid?.();
831
841
  if (typeof uid !== 'number') {
@@ -851,7 +861,21 @@ function registerStopCommand(program) {
851
861
  }
852
862
  });
853
863
  }
854
- function renderLaunchAgentPlist(opts) {
864
+ /**
865
+ * The helper's launchd plist.
866
+ *
867
+ * The `EnvironmentVariables` dict carries HOME (RUSH-2639, see
868
+ * `lib/service-manifest.ts`): launchd applies this dict on top of the LOGIN
869
+ * SESSION's environment, never the environment of whoever called `launchctl
870
+ * bootstrap`, so a manifest that omits HOME hands the helper the account home no
871
+ * matter which home the caller resolved. That is a silent escape from any
872
+ * redirected HOME — the hermetic test harness's, and an agent's isolated version
873
+ * home alike.
874
+ */
875
+ export function renderLaunchAgentPlist(opts) {
876
+ const envXml = Object.entries(serviceManifestHomeEnv())
877
+ .map(([k, v]) => ` <key>${escapeXml(k)}</key>\n <string>${escapeXml(v)}</string>`)
878
+ .join('\n');
855
879
  return `<?xml version="1.0" encoding="UTF-8"?>
856
880
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
857
881
  <plist version="1.0">
@@ -864,6 +888,10 @@ function renderLaunchAgentPlist(opts) {
864
888
  <string>--socket</string>
865
889
  <string>${escapeXml(opts.socketPath)}</string>
866
890
  </array>
891
+ <key>EnvironmentVariables</key>
892
+ <dict>
893
+ ${envXml}
894
+ </dict>
867
895
  <key>RunAtLoad</key>
868
896
  <true/>
869
897
  <key>KeepAlive</key>
@@ -16,6 +16,7 @@
16
16
  import chalk from 'chalk';
17
17
  import { setHelpSections } from '../lib/help.js';
18
18
  import { parseConfigKey, formatAgentVersion, devicePropertyToConfigName, configKeyStorageHint, } from '../lib/config-keys.js';
19
+ import { registerBudgetCommand } from './budget.js';
19
20
  import { resolveRunDefaults, setRunDefaultModel, setRunDefaultMode, setRunDefaultEffort, unsetRunDefault, } from '../lib/run-defaults.js';
20
21
  import { resolveTierOverride, setTierOverride, clearTierOverride } from '../lib/model-tier-overrides.js';
21
22
  import { getConfigValue, setConfigValue, unsetConfigValue, listConfig, } from '../lib/device-config.js';
@@ -63,6 +64,11 @@ function parseValue(key, parsed, raw) {
63
64
  case 'tmux':
64
65
  case 'browser.remote-control':
65
66
  return parseBool(raw, key);
67
+ case 'browser.task-idle-minutes':
68
+ if (!/^\d+$/.test(raw.trim())) {
69
+ throw new Error(`Config key '${key}' expects a non-negative integer, got '${raw}'.`);
70
+ }
71
+ return Number.parseInt(raw.trim(), 10);
66
72
  case 'notes':
67
73
  return raw.trim();
68
74
  case 'browser.profile':
@@ -111,8 +117,8 @@ function setConfig(parsed, value) {
111
117
  return;
112
118
  }
113
119
  case 'browser': {
114
- // Device-local default lives in the central fleet.devices.<name>.config
115
- // block (same store `agents devices config` / getConfigValue use). Bare
120
+ // Device-local default lives in the per-device doc's config: block
121
+ // (same store `agents devices config` / getConfigValue use). Bare
116
122
  // browser.profile targets this machine; devices.<name>.browser.profile
117
123
  // targets a peer.
118
124
  setConfigValue('browser.profile', value, parsed.device ? { device: parsed.device } : undefined);
@@ -295,6 +301,9 @@ function* listDeviceConfigEntries(device) {
295
301
  case 'browser.remote-control':
296
302
  key = `${prefix}browser.remote-control`;
297
303
  break;
304
+ case 'browser.task-idle-minutes':
305
+ key = `${prefix}browser.task-idle-minutes`;
306
+ break;
298
307
  case 'notes':
299
308
  key = `${prefix}notes`;
300
309
  break;
@@ -314,7 +323,7 @@ function* listDeviceConfigEntries(device) {
314
323
  export function registerConfigCommand(program) {
315
324
  const config = program
316
325
  .command('config')
317
- .description('Get, set, list, and unset run defaults, tier overrides, the projects root, and device options.');
326
+ .description('Get, set, list, and unset run defaults, tier overrides, the projects root, device options, and spend caps.');
318
327
  setHelpSections(config, {
319
328
  examples: `
320
329
  agents config set run.claude@*.model best
@@ -331,11 +340,14 @@ export function registerConfigCommand(program) {
331
340
  agents config unset run.claude@*.tier.best
332
341
  agents config unset usage.primary-host
333
342
  agents config list
343
+ agents config budget
344
+ agents config budget set per_day 50
334
345
  `,
335
346
  notes: `
336
347
  Every agent/harness reference uses agent@version. Use * for all versions.
337
348
  Tier overrides are part of the run namespace: run.<agent@version>.tier.<tier>.
338
349
  Project root is auto-inferred from the current Git repository when unset.
350
+ Spend caps live under \`agents config budget\` (not a top-level command).
339
351
  `,
340
352
  });
341
353
  config
@@ -428,4 +440,5 @@ export function registerConfigCommand(program) {
428
440
  process.exit(1);
429
441
  }
430
442
  });
443
+ registerBudgetCommand(config);
431
444
  }
@@ -9,4 +9,5 @@
9
9
  * quota status per agent and is left untouched.
10
10
  */
11
11
  import type { Command } from 'commander';
12
- export declare function registerCostCommand(program: Command): void;
12
+ /** Register `agents insights cost` under the insights parent. */
13
+ export declare function registerCostCommand(insightsCmd: Command): void;
@@ -5,18 +5,19 @@ import { queryUsageRollup, topSessionsByCost, } from '../lib/session/db.js';
5
5
  import { formatUsd, PRICING_VERSION } from '../lib/pricing/index.js';
6
6
  import { formatDuration } from '../lib/session/render.js';
7
7
  import { terminalWidth, truncateToWidth, stringWidth, padToWidth } from '../lib/session/width.js';
8
- export function registerCostCommand(program) {
9
- addHostOption(program.command('cost'))
8
+ /** Register `agents insights cost` under the insights parent. */
9
+ export function registerCostCommand(insightsCmd) {
10
+ addHostOption(insightsCmd.command('cost'))
10
11
  .description('Roll up $ cost and duration across local agent sessions')
11
12
  .option('--json', 'Output the rollup as JSON')
12
13
  .option('--since <time>', 'Only sessions newer than this (e.g., 7d, 4w, or ISO date)')
13
14
  .option('--by <dimension>', 'Group the breakdown by: agent (default), project, day, or account (the Claude org that produced each session)')
14
15
  .addHelpText('after', `
15
16
  Examples:
16
- agents cost Daily histogram + top sessions + per-agent breakdown
17
- agents cost --since 30d Last 30 days only
18
- agents cost --by project Break down by project instead of agent
19
- agents cost --by day --json Machine-readable daily rollup
17
+ agents insights cost Daily histogram + top sessions + per-agent breakdown
18
+ agents insights cost --since 30d Last 30 days only
19
+ agents insights cost --by project Break down by project instead of agent
20
+ agents insights cost --by day --json Machine-readable daily rollup
20
21
 
21
22
  Cost is computed offline from a versioned per-model price table (${PRICING_VERSION}).
22
23
  `)