@phnx-labs/agents-cli 1.22.113 → 1.22.115

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 (802) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/README.md +32 -113
  3. package/dist/browser.js +0 -0
  4. package/dist/cli/command-registry.d.ts +0 -60
  5. package/dist/cli/command-registry.js +57 -66
  6. package/dist/commands/accounts.d.ts +3 -77
  7. package/dist/commands/accounts.js +13 -366
  8. package/dist/commands/apply.d.ts +0 -4
  9. package/dist/commands/apply.js +3 -3
  10. package/dist/commands/audit.js +1 -1
  11. package/dist/commands/auth.js +0 -2
  12. package/dist/commands/browser-picker.d.ts +3 -6
  13. package/dist/commands/browser-picker.js +2 -2
  14. package/dist/commands/browser-sessions-picker.d.ts +2 -1
  15. package/dist/commands/browser.d.ts +53 -0
  16. package/dist/commands/browser.js +199 -9
  17. package/dist/commands/computer-sessions-picker.d.ts +2 -1
  18. package/dist/commands/computer.d.ts +14 -19
  19. package/dist/commands/computer.js +65 -10
  20. package/dist/commands/config.js +46 -2
  21. package/dist/commands/daemon.d.ts +0 -23
  22. package/dist/commands/daemon.js +1 -1
  23. package/dist/commands/detach-core.d.ts +2 -1
  24. package/dist/commands/detach.d.ts +0 -3
  25. package/dist/commands/detach.js +3 -3
  26. package/dist/commands/doctor.d.ts +2 -3
  27. package/dist/commands/doctor.js +0 -11
  28. package/dist/commands/events.d.ts +1 -3
  29. package/dist/commands/events.js +4 -7
  30. package/dist/commands/exec.d.ts +0 -1
  31. package/dist/commands/exec.js +2 -7
  32. package/dist/commands/feed-watch.js +52 -8
  33. package/dist/commands/feed.d.ts +3 -3
  34. package/dist/commands/feed.js +1 -1
  35. package/dist/commands/focus.d.ts +4 -4
  36. package/dist/commands/focus.js +1 -1
  37. package/dist/commands/go.d.ts +0 -17
  38. package/dist/commands/go.js +2 -19
  39. package/dist/commands/harness-hooks.d.ts +0 -7
  40. package/dist/commands/harness-hooks.js +1 -1
  41. package/dist/commands/harness-wizard.d.ts +2 -2
  42. package/dist/commands/harness.d.ts +3 -8
  43. package/dist/commands/harness.js +1 -1
  44. package/dist/commands/inspect.d.ts +2 -3
  45. package/dist/commands/inspect.js +1 -1
  46. package/dist/commands/logs.js +1 -1
  47. package/dist/commands/mcp.js +8 -83
  48. package/dist/commands/memory.js +4 -47
  49. package/dist/commands/message.d.ts +1 -1
  50. package/dist/commands/message.js +7 -7
  51. package/dist/commands/plugins.js +1 -93
  52. package/dist/commands/projects.d.ts +2 -18
  53. package/dist/commands/projects.js +89 -3
  54. package/dist/commands/repo.js +0 -44
  55. package/dist/commands/resource-view.d.ts +3 -2
  56. package/dist/commands/resume.d.ts +0 -1
  57. package/dist/commands/resume.js +5 -2
  58. package/dist/commands/routines.d.ts +1 -3
  59. package/dist/commands/routines.js +1 -1
  60. package/dist/commands/run-account-picker.d.ts +2 -1
  61. package/dist/commands/run-broadcast.d.ts +2 -1
  62. package/dist/commands/run-device-picker.d.ts +2 -1
  63. package/dist/commands/secrets-passthrough.d.ts +14 -0
  64. package/dist/commands/secrets-passthrough.js +23 -4
  65. package/dist/commands/send.d.ts +4 -4
  66. package/dist/commands/send.js +6 -51
  67. package/dist/commands/sessions-backfill.d.ts +2 -35
  68. package/dist/commands/sessions-backfill.js +1 -1
  69. package/dist/commands/sessions-backup-setup.js +1 -1
  70. package/dist/commands/sessions-bookmark.d.ts +0 -10
  71. package/dist/commands/sessions-bookmark.js +1 -1
  72. package/dist/commands/sessions-inject.d.ts +2 -3
  73. package/dist/commands/sessions-inject.js +8 -17
  74. package/dist/commands/sessions-picker-factory.d.ts +4 -14
  75. package/dist/commands/sessions-picker-factory.js +2 -2
  76. package/dist/commands/sessions-picker.d.ts +3 -9
  77. package/dist/commands/sessions-picker.js +2 -2
  78. package/dist/commands/sessions-resume.d.ts +2 -4
  79. package/dist/commands/sessions-resume.js +0 -6
  80. package/dist/commands/sessions-share.d.ts +5 -7
  81. package/dist/commands/sessions-share.js +98 -49
  82. package/dist/commands/sessions-stats.d.ts +2 -1
  83. package/dist/commands/sessions-stop.d.ts +0 -3
  84. package/dist/commands/sessions-stop.js +1 -1
  85. package/dist/commands/sessions-tail.d.ts +2 -1
  86. package/dist/commands/sessions-trace.d.ts +4 -6
  87. package/dist/commands/sessions-trace.js +1 -1
  88. package/dist/commands/sessions.d.ts +13 -104
  89. package/dist/commands/sessions.js +11 -18
  90. package/dist/commands/setup-browser.js +18 -2
  91. package/dist/commands/setup-computer.js +20 -6
  92. package/dist/commands/setup-mine.d.ts +0 -6
  93. package/dist/commands/setup-mine.js +1 -1
  94. package/dist/commands/setup-secrets.js +24 -4
  95. package/dist/commands/setup-terminal.d.ts +3 -0
  96. package/dist/commands/setup-terminal.js +22 -0
  97. package/dist/commands/setup.d.ts +3 -4
  98. package/dist/commands/setup.js +21 -11
  99. package/dist/commands/skills.js +0 -8
  100. package/dist/commands/ssh.d.ts +6 -0
  101. package/dist/commands/ssh.js +92 -233
  102. package/dist/commands/sync.js +14 -5
  103. package/dist/commands/teams-picker.d.ts +2 -5
  104. package/dist/commands/teams-picker.js +2 -2
  105. package/dist/commands/teams.d.ts +1 -7
  106. package/dist/commands/teams.js +2 -2
  107. package/dist/commands/tmux.d.ts +1 -1
  108. package/dist/commands/tmux.js +1 -1
  109. package/dist/commands/traces.js +1 -1
  110. package/dist/commands/upgrade.d.ts +2 -1
  111. package/dist/commands/utils.d.ts +1 -1
  112. package/dist/commands/utils.js +1 -1
  113. package/dist/lib/account-capabilities.d.ts +2 -1
  114. package/dist/lib/account-catalog.d.ts +4 -13
  115. package/dist/lib/account-catalog.js +1 -1
  116. package/dist/lib/account-registry.d.ts +3 -4
  117. package/dist/lib/account-registry.js +1 -1
  118. package/dist/lib/accounting/account-launch.d.ts +4 -3
  119. package/dist/lib/accounting/account-pool.d.ts +2 -1
  120. package/dist/lib/accounting/rotate.d.ts +3 -9
  121. package/dist/lib/accounting/rotate.js +2 -14
  122. package/dist/lib/accounting/usage-sync.d.ts +5 -4
  123. package/dist/lib/accounting/usage.d.ts +7 -31
  124. package/dist/lib/accounting/usage.js +4 -4
  125. package/dist/lib/accounts/add.d.ts +0 -5
  126. package/dist/lib/accounts/add.js +1 -7
  127. package/dist/lib/accounts/migrate.d.ts +8 -8
  128. package/dist/lib/accounts/migrate.js +1 -1
  129. package/dist/lib/acp/client.d.ts +3 -2
  130. package/dist/lib/acp/harnesses.d.ts +2 -2
  131. package/dist/lib/acp/harnesses.js +1 -1
  132. package/dist/lib/acp/run.d.ts +2 -1
  133. package/dist/lib/actor.d.ts +3 -2
  134. package/dist/lib/add-dir.d.ts +2 -17
  135. package/dist/lib/add-dir.js +2 -6
  136. package/dist/lib/address.d.ts +56 -0
  137. package/dist/lib/address.js +143 -0
  138. package/dist/lib/agent-spec/agents.d.ts +12 -28
  139. package/dist/lib/agent-spec/agents.js +2 -6
  140. package/dist/lib/agent-spec/primitives.d.ts +0 -7
  141. package/dist/lib/agent-spec/primitives.js +0 -6
  142. package/dist/lib/agent-spec/types.d.ts +2 -1
  143. package/dist/lib/analytics/dashboard.d.ts +1 -5
  144. package/dist/lib/analytics/dashboard.js +0 -2
  145. package/dist/lib/analytics/mix-commands.d.ts +0 -7
  146. package/dist/lib/analytics/mix-commands.js +3 -3
  147. package/dist/lib/analytics/recipes.d.ts +0 -12
  148. package/dist/lib/analytics/recipes.js +7 -31
  149. package/dist/lib/analytics/usage-db.d.ts +5 -32
  150. package/dist/lib/analytics/usage-db.js +1 -70
  151. package/dist/lib/answer-router.d.ts +7 -6
  152. package/dist/lib/answer-router.js +5 -11
  153. package/dist/lib/artifact-actions.d.ts +0 -4
  154. package/dist/lib/artifacts-client.d.ts +20 -0
  155. package/dist/lib/artifacts-client.js +46 -0
  156. package/dist/lib/ask-classifier.d.ts +3 -4
  157. package/dist/lib/ask-classifier.js +0 -7
  158. package/dist/lib/auth-health.d.ts +3 -46
  159. package/dist/lib/auth-health.js +3 -3
  160. package/dist/lib/auth-mint.d.ts +6 -6
  161. package/dist/lib/auth-mint.js +7 -7
  162. package/dist/lib/bench/runner.d.ts +2 -2
  163. package/dist/lib/bench/runner.js +1 -1
  164. package/dist/lib/bench/storage.d.ts +0 -1
  165. package/dist/lib/bench/storage.js +1 -1
  166. package/dist/lib/boot-profile.d.ts +0 -2
  167. package/dist/lib/boot-profile.js +0 -4
  168. package/dist/lib/brand.d.ts +0 -6
  169. package/dist/lib/brand.js +1 -1
  170. package/dist/lib/browser/arc-discovery.d.ts +4 -12
  171. package/dist/lib/browser/arc-discovery.js +1 -1
  172. package/dist/lib/browser/cdp.d.ts +1 -1
  173. package/dist/lib/browser/chrome.d.ts +2 -2
  174. package/dist/lib/browser/chrome.js +0 -4
  175. package/dist/lib/browser/chromium-discovery.d.ts +3 -2
  176. package/dist/lib/browser/drivers/arc.d.ts +3 -20
  177. package/dist/lib/browser/drivers/arc.js +2 -7
  178. package/dist/lib/browser/drivers/firefox.d.ts +2 -6
  179. package/dist/lib/browser/drivers/firefox.js +1 -1
  180. package/dist/lib/browser/drivers/local.d.ts +2 -1
  181. package/dist/lib/browser/drivers/ssh.d.ts +2 -3
  182. package/dist/lib/browser/drivers/ssh.js +0 -7
  183. package/dist/lib/browser/firefox-discovery.d.ts +4 -3
  184. package/dist/lib/browser/har.d.ts +8 -7
  185. package/dist/lib/browser/hygiene.d.ts +2 -3
  186. package/dist/lib/browser/hygiene.js +1 -1
  187. package/dist/lib/browser/ipc.d.ts +4 -3
  188. package/dist/lib/browser/ipc.js +1 -1
  189. package/dist/lib/browser/login-detection.d.ts +1 -8
  190. package/dist/lib/browser/registry.d.ts +2 -1
  191. package/dist/lib/browser/remote-control.d.ts +0 -7
  192. package/dist/lib/browser/remote-control.js +2 -2
  193. package/dist/lib/browser/resolve-target.d.ts +2 -6
  194. package/dist/lib/browser/resolve-target.js +3 -3
  195. package/dist/lib/browser/runtime-state.d.ts +59 -4
  196. package/dist/lib/browser/runtime-state.js +99 -18
  197. package/dist/lib/browser/service.d.ts +4 -4
  198. package/dist/lib/browser/service.js +21 -1
  199. package/dist/lib/browser/sessions-list.d.ts +0 -10
  200. package/dist/lib/browser/sessions-list.js +3 -3
  201. package/dist/lib/browser/stream.d.ts +2 -1
  202. package/dist/lib/browser/task-index.d.ts +4 -4
  203. package/dist/lib/browser/task-index.js +1 -1
  204. package/dist/lib/browser/types.d.ts +0 -20
  205. package/dist/lib/browser/types.js +1 -34
  206. package/dist/lib/browser/upload.d.ts +0 -27
  207. package/dist/lib/budget/ledger.d.ts +0 -2
  208. package/dist/lib/budget/ledger.js +1 -1
  209. package/dist/lib/budget/live-cloud.d.ts +2 -1
  210. package/dist/lib/budget/preflight.d.ts +3 -5
  211. package/dist/lib/budget/preflight.js +1 -1
  212. package/dist/lib/catchup.d.ts +2 -1
  213. package/dist/lib/channels/owner-forward.d.ts +5 -4
  214. package/dist/lib/channels/owner-sink.js +2 -2
  215. package/dist/lib/channels/providers/desktop.js +1 -1
  216. package/dist/lib/channels/providers/rush.d.ts +2 -1
  217. package/dist/lib/channels/registry.d.ts +1 -1
  218. package/dist/lib/channels/registry.js +1 -1
  219. package/dist/lib/channels/resolve.d.ts +3 -2
  220. package/dist/lib/channels/send.d.ts +5 -4
  221. package/dist/lib/cli-resources.d.ts +3 -9
  222. package/dist/lib/cli-resources.js +4 -2
  223. package/dist/lib/cloud/cursor.d.ts +1 -2
  224. package/dist/lib/cloud/cursor.js +1 -1
  225. package/dist/lib/cloud/dispatch.d.ts +2 -1
  226. package/dist/lib/cloud/dispatch.js +1 -1
  227. package/dist/lib/cloud/factory.d.ts +0 -2
  228. package/dist/lib/cloud/factory.js +1 -1
  229. package/dist/lib/cloud/rush.d.ts +3 -11
  230. package/dist/lib/cloud/rush.js +1 -1
  231. package/dist/lib/cloud/session-index.d.ts +2 -1
  232. package/dist/lib/cloud/types.d.ts +2 -1
  233. package/dist/lib/cloudflare/creds.d.ts +10 -0
  234. package/dist/lib/cloudflare/creds.js +46 -0
  235. package/dist/lib/cloudflare/provision.d.ts +35 -0
  236. package/dist/lib/cloudflare/provision.js +144 -0
  237. package/dist/lib/codex-policy.d.ts +2 -1
  238. package/dist/lib/commands.d.ts +7 -7
  239. package/dist/lib/commands.js +1 -1
  240. package/dist/lib/comms-render.d.ts +1 -1
  241. package/dist/lib/computer/context.d.ts +11 -3
  242. package/dist/lib/computer/context.js +2 -2
  243. package/dist/lib/computer/policy.d.ts +0 -12
  244. package/dist/lib/computer/policy.js +1 -1
  245. package/dist/lib/computer/sessions-list.d.ts +55 -0
  246. package/dist/lib/computer/sessions-list.js +168 -1
  247. package/dist/lib/computer-client.d.ts +3 -3
  248. package/dist/lib/computer-client.js +0 -1
  249. package/dist/lib/concurrency.d.ts +2 -1
  250. package/dist/lib/config-keys.d.ts +16 -3
  251. package/dist/lib/config-keys.js +47 -2
  252. package/dist/lib/convert.d.ts +0 -12
  253. package/dist/lib/convert.js +1 -12
  254. package/dist/lib/crabbox/cli.d.ts +6 -24
  255. package/dist/lib/crabbox/cli.js +2 -28
  256. package/dist/lib/crabbox/lease.d.ts +5 -6
  257. package/dist/lib/crabbox/lease.js +1 -1
  258. package/dist/lib/crabbox/progress.d.ts +2 -1
  259. package/dist/lib/crabbox/setup-copy.d.ts +2 -3
  260. package/dist/lib/crabbox/setup-copy.js +1 -1
  261. package/dist/lib/daemon/account-state-daemon-service.d.ts +1 -1
  262. package/dist/lib/daemon/attention-notify-service.d.ts +2 -1
  263. package/dist/lib/daemon/catchup-service.d.ts +2 -1
  264. package/dist/lib/daemon/daemon.d.ts +4 -4
  265. package/dist/lib/daemon/daemon.js +9 -2
  266. package/dist/lib/daemon/feed-stream-service.d.ts +23 -0
  267. package/dist/lib/daemon/feed-stream-service.js +40 -0
  268. package/dist/lib/daemon/harness-update-service.d.ts +2 -19
  269. package/dist/lib/daemon/harness-update-service.js +3 -3
  270. package/dist/lib/daemon/runner.d.ts +3 -3
  271. package/dist/lib/daemon/self-update-service.d.ts +1 -16
  272. package/dist/lib/daemon/self-update-service.js +6 -6
  273. package/dist/lib/daemon/state-dir-check-service.d.ts +2 -1
  274. package/dist/lib/daemon/supervisor.d.ts +3 -2
  275. package/dist/lib/daemon-services.d.ts +3 -2
  276. package/dist/lib/daemon-services.js +5 -0
  277. package/dist/lib/daemon-webhooks.d.ts +1 -1
  278. package/dist/lib/deeplink/register.d.ts +3 -13
  279. package/dist/lib/deeplink/register.js +3 -3
  280. package/dist/lib/deeplink/url.d.ts +3 -2
  281. package/dist/lib/device-config.d.ts +4 -15
  282. package/dist/lib/device-config.js +164 -8
  283. package/dist/lib/devices/connect.d.ts +51 -6
  284. package/dist/lib/devices/connect.js +169 -21
  285. package/dist/lib/devices/discovery-policy.d.ts +3 -2
  286. package/dist/lib/devices/doctor-findings.js +1 -1
  287. package/dist/lib/devices/doctor-overview-cache.d.ts +3 -2
  288. package/dist/lib/devices/fleet-divergence.d.ts +2 -1
  289. package/dist/lib/devices/fleet.d.ts +3 -4
  290. package/dist/lib/devices/fleet.js +1 -1
  291. package/dist/lib/devices/harness-inventory.d.ts +3 -2
  292. package/dist/lib/devices/health-report.d.ts +3 -2
  293. package/dist/lib/devices/health.d.ts +1 -8
  294. package/dist/lib/devices/health.js +1 -1
  295. package/dist/lib/devices/interactive-host.d.ts +0 -2
  296. package/dist/lib/devices/interactive-host.js +1 -1
  297. package/dist/lib/devices/known-hosts.d.ts +2 -20
  298. package/dist/lib/devices/known-hosts.js +2 -2
  299. package/dist/lib/devices/pool.d.ts +2 -1
  300. package/dist/lib/devices/resolve-target.d.ts +2 -2
  301. package/dist/lib/devices/rollout-verify.d.ts +3 -2
  302. package/dist/lib/devices/stats-cache.d.ts +3 -2
  303. package/dist/lib/devices/sync.d.ts +6 -5
  304. package/dist/lib/devices/worker-pick.d.ts +3 -12
  305. package/dist/lib/devices/worker-pick.js +1 -1
  306. package/dist/lib/diff-text.d.ts +2 -1
  307. package/dist/lib/doctor-diff.d.ts +2 -1
  308. package/dist/lib/drift-sync.d.ts +3 -2
  309. package/dist/lib/drift.d.ts +3 -3
  310. package/dist/lib/drift.js +1 -1
  311. package/dist/lib/event-families.d.ts +0 -6
  312. package/dist/lib/event-families.js +3 -3
  313. package/dist/lib/event-provenance.d.ts +2 -1
  314. package/dist/lib/events-ingest.d.ts +4 -3
  315. package/dist/lib/exec-account-home.d.ts +2 -4
  316. package/dist/lib/exec-account-home.js +1 -1
  317. package/dist/lib/exec-bounded.d.ts +3 -4
  318. package/dist/lib/exec-bounded.js +1 -1
  319. package/dist/lib/exec.d.ts +6 -18
  320. package/dist/lib/exec.js +1 -1
  321. package/dist/lib/factory/snapshot.d.ts +2 -2
  322. package/dist/lib/factory/snapshot.js +1 -1
  323. package/dist/lib/feed/activity-stream.d.ts +2 -5
  324. package/dist/lib/feed/activity-stream.js +2 -2
  325. package/dist/lib/feed/activity.d.ts +8 -33
  326. package/dist/lib/feed/activity.js +8 -8
  327. package/dist/lib/feed/answer.d.ts +3 -2
  328. package/dist/lib/feed/attention.js +5 -1
  329. package/dist/lib/feed/envelope.d.ts +79 -0
  330. package/dist/lib/feed/envelope.js +23 -0
  331. package/dist/lib/feed/events.d.ts +8 -47
  332. package/dist/lib/feed/events.js +9 -141
  333. package/dist/lib/feed/feed.d.ts +9 -42
  334. package/dist/lib/feed/feed.js +1 -60
  335. package/dist/lib/feed/hub-server.d.ts +86 -0
  336. package/dist/lib/feed/hub-server.js +334 -0
  337. package/dist/lib/feed/hub.d.ts +95 -0
  338. package/dist/lib/feed/hub.js +255 -0
  339. package/dist/lib/feed/pr-status.d.ts +0 -2
  340. package/dist/lib/feed/pr-status.js +1 -5
  341. package/dist/lib/feed/tool-activity.d.ts +108 -0
  342. package/dist/lib/feed/tool-activity.js +313 -0
  343. package/dist/lib/feed/tools.d.ts +198 -0
  344. package/dist/lib/feed/tools.js +265 -0
  345. package/dist/lib/feed/watch.d.ts +51 -52
  346. package/dist/lib/feed/watch.js +147 -17
  347. package/dist/lib/feed-broadcast.d.ts +5 -47
  348. package/dist/lib/feed-broadcast.js +9 -9
  349. package/dist/lib/feed-outcome.d.ts +3 -6
  350. package/dist/lib/feed-outcome.js +2 -2
  351. package/dist/lib/feed-policy.d.ts +5 -6
  352. package/dist/lib/feed-policy.js +2 -2
  353. package/dist/lib/feed-post.d.ts +3 -4
  354. package/dist/lib/feed-post.js +1 -1
  355. package/dist/lib/feed-ranking.d.ts +2 -2
  356. package/dist/lib/feed-ranking.js +1 -1
  357. package/dist/lib/fleet/apply.d.ts +5 -6
  358. package/dist/lib/fleet/apply.js +4 -4
  359. package/dist/lib/fleet/manifest.d.ts +2 -1
  360. package/dist/lib/fleet/remote-login.d.ts +18 -36
  361. package/dist/lib/fleet/remote-login.js +20 -19
  362. package/dist/lib/fleet/types.d.ts +0 -8
  363. package/dist/lib/fleet-cache.d.ts +1 -18
  364. package/dist/lib/fleet-cache.js +0 -5
  365. package/dist/lib/fleet-shared-repo-sync.d.ts +3 -3
  366. package/dist/lib/fleet-shared-repo-sync.js +1 -1
  367. package/dist/lib/fleet-shared-state.d.ts +3 -2
  368. package/dist/lib/format.d.ts +3 -2
  369. package/dist/lib/format.js +1 -1
  370. package/dist/lib/friction-heuristics.d.ts +2 -1
  371. package/dist/lib/fs-walk.d.ts +2 -1
  372. package/dist/lib/fuzzy.d.ts +2 -1
  373. package/dist/lib/gemini-settings.d.ts +0 -1
  374. package/dist/lib/gemini-settings.js +1 -1
  375. package/dist/lib/git.d.ts +7 -81
  376. package/dist/lib/git.js +2 -199
  377. package/dist/lib/github/gh-overload.d.ts +0 -4
  378. package/dist/lib/github/gh-overload.js +2 -2
  379. package/dist/lib/github/project-prs.d.ts +118 -0
  380. package/dist/lib/github/project-prs.js +173 -0
  381. package/dist/lib/github/rest.d.ts +2 -1
  382. package/dist/lib/harness/exec-config-version.d.ts +2 -1
  383. package/dist/lib/harness-auth-capabilities.d.ts +5 -4
  384. package/dist/lib/harness-connection-test.d.ts +2 -1
  385. package/dist/lib/heal.d.ts +3 -20
  386. package/dist/lib/heal.js +2 -39
  387. package/dist/lib/help.d.ts +3 -2
  388. package/dist/lib/helper-download.d.ts +0 -12
  389. package/dist/lib/helper-download.js +2 -2
  390. package/dist/lib/helper-versions.d.ts +2 -1
  391. package/dist/lib/helper-versions.js +1 -1
  392. package/dist/lib/hooks/install.d.ts +8 -49
  393. package/dist/lib/hooks/install.js +2 -96
  394. package/dist/lib/hooks/match.d.ts +2 -1
  395. package/dist/lib/hosts/credential-transport.d.ts +0 -2
  396. package/dist/lib/hosts/credential-transport.js +1 -1
  397. package/dist/lib/hosts/dispatch.d.ts +2 -24
  398. package/dist/lib/hosts/dispatch.js +2 -2
  399. package/dist/lib/hosts/logs.d.ts +2 -1
  400. package/dist/lib/hosts/passthrough.d.ts +1 -1
  401. package/dist/lib/hosts/passthrough.js +0 -1
  402. package/dist/lib/hosts/progress.d.ts +0 -5
  403. package/dist/lib/hosts/progress.js +1 -1
  404. package/dist/lib/hosts/ready.d.ts +3 -4
  405. package/dist/lib/hosts/ready.js +0 -8
  406. package/dist/lib/hosts/reconcile.d.ts +2 -8
  407. package/dist/lib/hosts/reconcile.js +1 -1
  408. package/dist/lib/hosts/reconnect.d.ts +4 -11
  409. package/dist/lib/hosts/reconnect.js +2 -2
  410. package/dist/lib/hosts/registry.d.ts +1 -1
  411. package/dist/lib/hosts/remote-cmd.d.ts +55 -4
  412. package/dist/lib/hosts/remote-cmd.js +125 -8
  413. package/dist/lib/hosts/remote-cmd.test-fixture.d.ts +2 -0
  414. package/dist/lib/hosts/remote-cmd.test-fixture.js +22 -0
  415. package/dist/lib/hosts/session-index.d.ts +3 -2
  416. package/dist/lib/hosts/ssh-config.d.ts +2 -3
  417. package/dist/lib/hosts/ssh-config.js +0 -10
  418. package/dist/lib/humans.d.ts +0 -2
  419. package/dist/lib/humans.js +2 -2
  420. package/dist/lib/import.d.ts +4 -3
  421. package/dist/lib/installations/installation-lock.d.ts +0 -2
  422. package/dist/lib/installations/installation-lock.js +2 -2
  423. package/dist/lib/installations/launch-gate.d.ts +0 -9
  424. package/dist/lib/installations/launch-gate.js +1 -1
  425. package/dist/lib/installations/migrate.d.ts +0 -11
  426. package/dist/lib/installations/migrate.js +1 -1
  427. package/dist/lib/installations/shims.d.ts +1 -1
  428. package/dist/lib/installations/shims.js +2 -2
  429. package/dist/lib/installations/update-runtime.js +1 -1
  430. package/dist/lib/linear-cache.d.ts +2 -1
  431. package/dist/lib/linux-userns.d.ts +2 -3
  432. package/dist/lib/linux-userns.js +0 -4
  433. package/dist/lib/loop.d.ts +2 -1
  434. package/dist/lib/mailbox-gc.d.ts +2 -1
  435. package/dist/lib/mailbox-target.d.ts +2 -1
  436. package/dist/lib/mailbox.d.ts +0 -6
  437. package/dist/lib/mailbox.js +1 -1
  438. package/dist/lib/manifest.d.ts +0 -14
  439. package/dist/lib/manifest.js +2 -2
  440. package/dist/lib/mcp-registry.d.ts +2 -1
  441. package/dist/lib/mcp.js +17 -11
  442. package/dist/lib/memory.d.ts +2 -13
  443. package/dist/lib/memory.js +4 -4
  444. package/dist/lib/menubar/download-menubar.d.ts +0 -2
  445. package/dist/lib/menubar/download-menubar.js +1 -5
  446. package/dist/lib/menubar/install-menubar.d.ts +3 -14
  447. package/dist/lib/menubar/install-menubar.js +3 -3
  448. package/dist/lib/menubar/migrate-prefs.d.ts +53 -0
  449. package/dist/lib/menubar/migrate-prefs.js +168 -0
  450. package/dist/lib/menubar/resolve-version.d.ts +1 -9
  451. package/dist/lib/menubar/resolve-version.js +4 -4
  452. package/dist/lib/menubar/snapshot.d.ts +24 -2
  453. package/dist/lib/menubar/snapshot.js +26 -0
  454. package/dist/lib/model-tier-overrides.d.ts +3 -2
  455. package/dist/lib/monitors/config.d.ts +0 -2
  456. package/dist/lib/monitors/config.js +0 -4
  457. package/dist/lib/monitors/engine.d.ts +1 -1
  458. package/dist/lib/monitors/remote.d.ts +3 -2
  459. package/dist/lib/monitors/sources/webhook.d.ts +2 -15
  460. package/dist/lib/monitors/sources/webhook.js +1 -38
  461. package/dist/lib/monitors/state.d.ts +4 -7
  462. package/dist/lib/monitors/state.js +2 -2
  463. package/dist/lib/notify.d.ts +1 -1
  464. package/dist/lib/notify.js +1 -1
  465. package/dist/lib/onepassword.d.ts +5 -14
  466. package/dist/lib/onepassword.js +0 -64
  467. package/dist/lib/open-url.d.ts +3 -2
  468. package/dist/lib/openclaw-keychain.d.ts +4 -17
  469. package/dist/lib/openclaw-keychain.js +3 -33
  470. package/dist/lib/operator.d.ts +2 -2
  471. package/dist/lib/operator.js +1 -1
  472. package/dist/lib/output/git-output.d.ts +4 -14
  473. package/dist/lib/output/git-output.js +1 -1
  474. package/dist/lib/owner-message.d.ts +3 -29
  475. package/dist/lib/owner-message.js +3 -3
  476. package/dist/lib/packages/output-home.d.ts +2 -4
  477. package/dist/lib/packages/output-home.js +2 -2
  478. package/dist/lib/perf/db.d.ts +0 -2
  479. package/dist/lib/perf/db.js +2 -7
  480. package/dist/lib/permissions-registry.d.ts +2 -3
  481. package/dist/lib/permissions-registry.js +0 -4
  482. package/dist/lib/permissions.d.ts +6 -16
  483. package/dist/lib/permissions.js +2 -15
  484. package/dist/lib/picker.d.ts +6 -5
  485. package/dist/lib/placement.d.ts +3 -6
  486. package/dist/lib/placement.js +0 -17
  487. package/dist/lib/platform/posixpath.d.ts +2 -1
  488. package/dist/lib/platform/winpath.d.ts +2 -1
  489. package/dist/lib/plugins/plugin-marketplace.d.ts +2 -2
  490. package/dist/lib/plugins/plugin-marketplace.js +1 -1
  491. package/dist/lib/pr-land-detach.d.ts +2 -1
  492. package/dist/lib/probe.d.ts +4 -1
  493. package/dist/lib/probe.js +5 -2
  494. package/dist/lib/profiles-presets.d.ts +2 -1
  495. package/dist/lib/profiles.d.ts +3 -9
  496. package/dist/lib/profiles.js +1 -9
  497. package/dist/lib/project-doctor.d.ts +2 -1
  498. package/dist/lib/project-launch.d.ts +2 -2
  499. package/dist/lib/project-probe.d.ts +4 -3
  500. package/dist/lib/project-pull.d.ts +2 -1
  501. package/dist/lib/project-resources.d.ts +2 -2
  502. package/dist/lib/project-resources.js +1 -1
  503. package/dist/lib/project-root.d.ts +2 -6
  504. package/dist/lib/project-root.js +1 -1
  505. package/dist/lib/project-schedule.d.ts +2 -1
  506. package/dist/lib/project-status.d.ts +2 -16
  507. package/dist/lib/project-status.js +3 -3
  508. package/dist/lib/pwsh.d.ts +33 -0
  509. package/dist/lib/pwsh.js +56 -0
  510. package/dist/lib/reconcile-and-repair.d.ts +5 -4
  511. package/dist/lib/redact.d.ts +15 -1
  512. package/dist/lib/redact.js +105 -3
  513. package/dist/lib/refresh-coordinator.d.ts +2 -1
  514. package/dist/lib/refresh.d.ts +9 -4
  515. package/dist/lib/refresh.js +92 -72
  516. package/dist/lib/remote-agents-json.d.ts +3 -2
  517. package/dist/lib/reserved-stores.d.ts +0 -2
  518. package/dist/lib/reserved-stores.js +3 -5
  519. package/dist/lib/resource-content-diff.d.ts +0 -2
  520. package/dist/lib/resource-content-diff.js +1 -1
  521. package/dist/lib/resource-patterns.d.ts +2 -1
  522. package/dist/lib/resource-profiles.d.ts +2 -8
  523. package/dist/lib/resource-profiles.js +3 -27
  524. package/dist/lib/resources/workflows.d.ts +1 -1
  525. package/dist/lib/resources.d.ts +4 -9
  526. package/dist/lib/resources.js +1 -1
  527. package/dist/lib/routine-context.d.ts +2 -5
  528. package/dist/lib/routine-context.js +2 -2
  529. package/dist/lib/routine-notify-owner.d.ts +8 -7
  530. package/dist/lib/routine-notify-owner.js +5 -5
  531. package/dist/lib/routine-process-cleanup.d.ts +2 -1
  532. package/dist/lib/routine-readiness.d.ts +0 -2
  533. package/dist/lib/routine-readiness.js +0 -7
  534. package/dist/lib/routines-project.d.ts +3 -4
  535. package/dist/lib/routines-project.js +1 -1
  536. package/dist/lib/rules/compile.d.ts +3 -25
  537. package/dist/lib/rules/compile.js +1 -1
  538. package/dist/lib/rules/compose.d.ts +3 -9
  539. package/dist/lib/rules/rules.d.ts +4 -15
  540. package/dist/lib/rules/rules.js +1 -64
  541. package/dist/lib/run-defaults.d.ts +1 -1
  542. package/dist/lib/run-notify.d.ts +2 -1
  543. package/dist/lib/run-trace-sync.d.ts +1 -1
  544. package/dist/lib/run-trace-sync.js +1 -1
  545. package/dist/lib/scheduler.d.ts +2 -1
  546. package/dist/lib/scheduling/routines.d.ts +9 -21
  547. package/dist/lib/scheduling/routines.js +3 -46
  548. package/dist/lib/secrets-cli.d.ts +11 -0
  549. package/dist/lib/secrets-cli.js +30 -0
  550. package/dist/lib/secrets-client.d.ts +0 -17
  551. package/dist/lib/secrets-client.js +7 -28
  552. package/dist/lib/secrets-policy.d.ts +12 -17
  553. package/dist/lib/secrets-policy.js +5 -5
  554. package/dist/lib/secrets-types.d.ts +3 -2
  555. package/dist/lib/secrets-types.js +2 -1
  556. package/dist/lib/self-heal/checks/install-staging.js +1 -1
  557. package/dist/lib/self-heal/registry.d.ts +3 -2
  558. package/dist/lib/self-heal/types.d.ts +1 -1
  559. package/dist/lib/self-heal/types.js +1 -1
  560. package/dist/lib/self-update.d.ts +5 -5
  561. package/dist/lib/self-update.js +4 -4
  562. package/dist/lib/session/actor-sidecar.d.ts +3 -2
  563. package/dist/lib/session/artifacts.d.ts +0 -2
  564. package/dist/lib/session/artifacts.js +1 -1
  565. package/dist/lib/session/bash-command.d.ts +2 -7
  566. package/dist/lib/session/bundle.d.ts +4 -6
  567. package/dist/lib/session/bundle.js +1 -5
  568. package/dist/lib/session/cloud.d.ts +0 -4
  569. package/dist/lib/session/cloud.js +2 -15
  570. package/dist/lib/session/detached.d.ts +9 -1
  571. package/dist/lib/session/detached.js +31 -2
  572. package/dist/lib/session/digest.d.ts +2 -2
  573. package/dist/lib/session/digest.js +1 -1
  574. package/dist/lib/session/fork.d.ts +3 -2
  575. package/dist/lib/session/highlights.d.ts +6 -5
  576. package/dist/lib/session/hook-sessions.d.ts +2 -1
  577. package/dist/lib/session/host-link.d.ts +2 -1
  578. package/dist/lib/session/inject.d.ts +1 -1
  579. package/dist/lib/session/inject.js +1 -1
  580. package/dist/lib/session/insights.d.ts +3 -15
  581. package/dist/lib/session/insights.js +2 -2
  582. package/dist/lib/session/local-tmux-attach.d.ts +2 -18
  583. package/dist/lib/session/local-tmux-attach.js +1 -1
  584. package/dist/lib/session/migrations.d.ts +0 -1
  585. package/dist/lib/session/migrations.js +1 -1
  586. package/dist/lib/session/mirror.d.ts +5 -8
  587. package/dist/lib/session/mirror.js +2 -2
  588. package/dist/lib/session/parse.d.ts +1 -32
  589. package/dist/lib/session/parse.js +4 -4
  590. package/dist/lib/session/presence.d.ts +2 -1
  591. package/dist/lib/session/prompt.d.ts +3 -2
  592. package/dist/lib/session/prompt.js +38 -1
  593. package/dist/lib/session/recovery.d.ts +3 -2
  594. package/dist/lib/session/remote/peer-stream.d.ts +26 -7
  595. package/dist/lib/session/remote/peer-stream.js +35 -8
  596. package/dist/lib/session/remote/remote-bundle.d.ts +2 -1
  597. package/dist/lib/session/remote/remote-list.d.ts +5 -5
  598. package/dist/lib/session/remote/remote.d.ts +4 -3
  599. package/dist/lib/session/remote/watch.d.ts +2 -7
  600. package/dist/lib/session/remote/watch.js +3 -3
  601. package/dist/lib/session/remote-active.d.ts +2 -1
  602. package/dist/lib/session/render.d.ts +2 -2
  603. package/dist/lib/session/render.js +1 -1
  604. package/dist/lib/session/resume-owner.d.ts +1 -1
  605. package/dist/lib/session/resume-owner.js +1 -1
  606. package/dist/lib/session/run-names.d.ts +2 -1
  607. package/dist/lib/session/session-cache.d.ts +7 -26
  608. package/dist/lib/session/session-cache.js +2 -8
  609. package/dist/lib/session/share-html.d.ts +1 -21
  610. package/dist/lib/session/share-html.js +1 -1
  611. package/dist/lib/session/shell-programs.d.ts +2 -1
  612. package/dist/lib/session/state.d.ts +41 -8
  613. package/dist/lib/session/state.js +112 -11
  614. package/dist/lib/session/stream-render.d.ts +2 -1
  615. package/dist/lib/session/sync/agents.d.ts +0 -4
  616. package/dist/lib/session/sync/agents.js +0 -0
  617. package/dist/lib/session/sync/backend.d.ts +8 -8
  618. package/dist/lib/session/sync/backend.js +3 -3
  619. package/dist/lib/session/sync/managed-config.d.ts +0 -8
  620. package/dist/lib/session/sync/managed-key.d.ts +0 -2
  621. package/dist/lib/session/sync/managed-key.js +1 -1
  622. package/dist/lib/session/sync/provision.d.ts +1 -1
  623. package/dist/lib/session/sync/provision.js +2 -2
  624. package/dist/lib/session/sync/r2.d.ts +4 -1
  625. package/dist/lib/session/sync/r2.js +4 -7
  626. package/dist/lib/session/sync/transcript-crypto.d.ts +2 -1
  627. package/dist/lib/session/tail.d.ts +2 -1
  628. package/dist/lib/session/team-filter.d.ts +1 -1
  629. package/dist/lib/session/throughput.d.ts +2 -3
  630. package/dist/lib/session/throughput.js +1 -1
  631. package/dist/lib/session/timeline-pass.d.ts +3 -42
  632. package/dist/lib/session/timeline-pass.js +4 -4
  633. package/dist/lib/session/timeline.d.ts +3 -13
  634. package/dist/lib/session/timeline.js +3 -3
  635. package/dist/lib/session/tool-calls.d.ts +2 -2
  636. package/dist/lib/session/tool-calls.js +1 -1
  637. package/dist/lib/session/tool-index.d.ts +0 -8
  638. package/dist/lib/session/tool-index.js +2 -2
  639. package/dist/lib/session/tool-store.d.ts +2 -1
  640. package/dist/lib/session/trajectory-compare.d.ts +2 -1
  641. package/dist/lib/session/trajectory-lineage.d.ts +2 -1
  642. package/dist/lib/session/trajectory-text.d.ts +3 -2
  643. package/dist/lib/session/trajectory.d.ts +2 -1
  644. package/dist/lib/session/viewing-in.d.ts +2 -1
  645. package/dist/lib/sessions-client.js +0 -3
  646. package/dist/lib/settings-manifest.d.ts +2 -1
  647. package/dist/lib/setup-tool-install.d.ts +3 -0
  648. package/dist/lib/setup-tool-install.js +26 -0
  649. package/dist/lib/setup-tool-status.d.ts +22 -0
  650. package/dist/lib/setup-tool-status.js +215 -0
  651. package/dist/lib/share-runtime.d.ts +11 -0
  652. package/dist/lib/share-runtime.js +63 -0
  653. package/dist/lib/shim-heal.d.ts +1 -5
  654. package/dist/lib/shim-heal.js +0 -6
  655. package/dist/lib/smart-launch.d.ts +5 -10
  656. package/dist/lib/smart-launch.js +4 -12
  657. package/dist/lib/snapshot.d.ts +3 -2
  658. package/dist/lib/ssh-exec.d.ts +49 -4
  659. package/dist/lib/ssh-exec.js +119 -0
  660. package/dist/lib/ssh-tunnel.d.ts +3 -2
  661. package/dist/lib/staleness/checkers/permissions.d.ts +0 -2
  662. package/dist/lib/staleness/checkers/permissions.js +1 -1
  663. package/dist/lib/staleness/fingerprint.d.ts +0 -7
  664. package/dist/lib/staleness/fingerprint.js +1 -1
  665. package/dist/lib/staleness/prune.d.ts +3 -2
  666. package/dist/lib/staleness/registry.d.ts +1 -1
  667. package/dist/lib/staleness/writers/sources.d.ts +0 -8
  668. package/dist/lib/staleness/writers/sources.js +1 -1
  669. package/dist/lib/startup/command-registry.d.ts +6 -4
  670. package/dist/lib/startup/command-registry.js +11 -8
  671. package/dist/lib/state.d.ts +1 -3
  672. package/dist/lib/state.js +3 -6
  673. package/dist/lib/storage/selection.d.ts +2 -2
  674. package/dist/lib/storage/selection.js +2 -2
  675. package/dist/lib/subagents-registry.d.ts +4 -3
  676. package/dist/lib/subagents.d.ts +2 -1
  677. package/dist/lib/subagents.js +3 -2
  678. package/dist/lib/summarizer/pass.d.ts +3 -6
  679. package/dist/lib/summarizer/pass.js +2 -2
  680. package/dist/lib/summarizer/summarize.d.ts +4 -3
  681. package/dist/lib/sync-passphrase.d.ts +3 -2
  682. package/dist/lib/sync-status.d.ts +3 -16
  683. package/dist/lib/sync-status.js +2 -2
  684. package/dist/lib/sync-umbrella.d.ts +9 -3
  685. package/dist/lib/sync-umbrella.js +18 -10
  686. package/dist/lib/system-run-sync.d.ts +2 -1
  687. package/dist/lib/teams/agents.d.ts +2 -4
  688. package/dist/lib/teams/agents.js +1 -1
  689. package/dist/lib/teams/forEach.d.ts +3 -2
  690. package/dist/lib/teams/pr-watch.d.ts +4 -11
  691. package/dist/lib/teams/pr-watch.js +4 -4
  692. package/dist/lib/teams/registry.d.ts +2 -3
  693. package/dist/lib/teams/registry.js +1 -1
  694. package/dist/lib/teams/remoteWorktree.d.ts +0 -16
  695. package/dist/lib/teams/remoteWorktree.js +3 -3
  696. package/dist/lib/teams/scheduler.d.ts +6 -5
  697. package/dist/lib/teams/scheduler.js +1 -1
  698. package/dist/lib/teams/supervisor.d.ts +4 -3
  699. package/dist/lib/teams/worktree.d.ts +0 -9
  700. package/dist/lib/teams/worktree.js +0 -32
  701. package/dist/lib/term-client.d.ts +44 -0
  702. package/dist/lib/term-client.js +117 -0
  703. package/dist/lib/terminal/inject.d.ts +3 -16
  704. package/dist/lib/terminal/inject.js +1 -29
  705. package/dist/lib/terminal/resolve.d.ts +3 -9
  706. package/dist/lib/terminal/resolve.js +3 -7
  707. package/dist/lib/tmux/binary.d.ts +2 -1
  708. package/dist/lib/tmux/orphan-reap.d.ts +6 -7
  709. package/dist/lib/tmux/orphan-reap.js +1 -1
  710. package/dist/lib/tmux/session.d.ts +4 -3
  711. package/dist/lib/traces/backend.d.ts +1 -2
  712. package/dist/lib/traces/backend.js +1 -2
  713. package/dist/lib/traces/classify.d.ts +3 -2
  714. package/dist/lib/traces/config.d.ts +0 -8
  715. package/dist/lib/traces/insights.d.ts +2 -1
  716. package/dist/lib/traces/phenotype.d.ts +3 -3
  717. package/dist/lib/traces/provision.d.ts +2 -4
  718. package/dist/lib/traces/provision.js +3 -3
  719. package/dist/lib/traces/schema2-build.d.ts +1 -1
  720. package/dist/lib/traces/schema2-danger.d.ts +2 -1
  721. package/dist/lib/traces/schema2.d.ts +5 -4
  722. package/dist/lib/traces/segments.d.ts +4 -20
  723. package/dist/lib/traces/segments.js +3 -3
  724. package/dist/lib/traces/sync.d.ts +2 -3
  725. package/dist/lib/traces/sync.js +1 -1
  726. package/dist/lib/triggers/handlers.d.ts +4 -13
  727. package/dist/lib/triggers/handlers.js +1 -1
  728. package/dist/lib/triggers/webhook.d.ts +5 -27
  729. package/dist/lib/triggers/webhook.js +4 -4
  730. package/dist/lib/types.d.ts +11 -9
  731. package/dist/lib/usage-refresh.d.ts +4 -10
  732. package/dist/lib/usage-refresh.js +3 -8
  733. package/dist/lib/verbs.d.ts +2 -1
  734. package/dist/lib/version-duplicates.d.ts +2 -3
  735. package/dist/lib/version-duplicates.js +3 -33
  736. package/dist/lib/version.d.ts +2 -1
  737. package/dist/lib/warn-unpushed.d.ts +2 -1
  738. package/dist/lib/watchdog/history.d.ts +3 -2
  739. package/dist/lib/watchdog/log.d.ts +0 -6
  740. package/dist/lib/watchdog/log.js +1 -1
  741. package/dist/lib/watchdog/rotate.d.ts +2 -26
  742. package/dist/lib/watchdog/rotate.js +4 -12
  743. package/dist/lib/watchdog/runner.d.ts +0 -7
  744. package/dist/lib/watchdog/runner.js +4 -4
  745. package/dist/lib/watchdog/service.d.ts +2 -2
  746. package/dist/lib/watchdog/service.js +1 -1
  747. package/dist/lib/watchdog/watchdog-agent.d.ts +2 -1
  748. package/dist/lib/watchdog/watchdog.d.ts +2 -1
  749. package/dist/lib/watchdog/watchdogTail.d.ts +2 -1
  750. package/dist/lib/workflows-registry.d.ts +3 -2
  751. package/dist/lib/workflows.d.ts +4 -7
  752. package/dist/lib/workflows.js +1 -1
  753. package/dist/lib/worktree/held.d.ts +4 -28
  754. package/dist/lib/worktree/held.js +3 -3
  755. package/package.json +3 -5
  756. package/scripts/postinstall.js +5 -4
  757. package/dist/commands/artifacts-setup.d.ts +0 -53
  758. package/dist/commands/artifacts-setup.js +0 -161
  759. package/dist/commands/artifacts.d.ts +0 -18
  760. package/dist/commands/artifacts.js +0 -58
  761. package/dist/commands/attach.d.ts +0 -12
  762. package/dist/commands/attach.js +0 -86
  763. package/dist/commands/auth-mint.d.ts +0 -12
  764. package/dist/commands/auth-mint.js +0 -108
  765. package/dist/commands/pty.d.ts +0 -20
  766. package/dist/commands/pty.js +0 -404
  767. package/dist/commands/reconnect.d.ts +0 -46
  768. package/dist/commands/reconnect.js +0 -115
  769. package/dist/commands/share.d.ts +0 -293
  770. package/dist/commands/share.js +0 -1424
  771. package/dist/lib/config-machine-keys.d.ts +0 -14
  772. package/dist/lib/config-machine-keys.js +0 -21
  773. package/dist/lib/pty-client.d.ts +0 -49
  774. package/dist/lib/pty-client.js +0 -315
  775. package/dist/lib/pty-server.d.ts +0 -59
  776. package/dist/lib/pty-server.js +0 -653
  777. package/dist/lib/share/analytics.d.ts +0 -13
  778. package/dist/lib/share/analytics.js +0 -45
  779. package/dist/lib/share/backend.d.ts +0 -120
  780. package/dist/lib/share/backend.js +0 -176
  781. package/dist/lib/share/capture.d.ts +0 -31
  782. package/dist/lib/share/capture.js +0 -174
  783. package/dist/lib/share/config.d.ts +0 -72
  784. package/dist/lib/share/config.js +0 -211
  785. package/dist/lib/share/delete.d.ts +0 -122
  786. package/dist/lib/share/delete.js +0 -173
  787. package/dist/lib/share/html.d.ts +0 -22
  788. package/dist/lib/share/html.js +0 -88
  789. package/dist/lib/share/http-error.d.ts +0 -52
  790. package/dist/lib/share/http-error.js +0 -65
  791. package/dist/lib/share/og.d.ts +0 -25
  792. package/dist/lib/share/og.js +0 -84
  793. package/dist/lib/share/provision.d.ts +0 -127
  794. package/dist/lib/share/provision.js +0 -285
  795. package/dist/lib/share/publish.d.ts +0 -388
  796. package/dist/lib/share/publish.js +0 -818
  797. package/dist/lib/share/worker-template.d.ts +0 -27
  798. package/dist/lib/share/worker-template.js +0 -2424
  799. package/dist/lib/storage/index.d.ts +0 -14
  800. package/dist/lib/storage/index.js +0 -14
  801. package/dist/lib/storage/visibility.d.ts +0 -82
  802. package/dist/lib/storage/visibility.js +0 -99
@@ -1,7 +1,60 @@
1
1
  import { Command } from 'commander';
2
2
  import { type BrowserProfile } from '../lib/browser/profiles.js';
3
3
  import { listInstalledBrowsers } from '../lib/browser/chrome.js';
4
+ import type { DeviceProfile } from '../lib/devices/registry.js';
4
5
  export declare function remoteStartTaskName(stdout: string, explicit?: string): string | undefined;
6
+ /**
7
+ * Fetch an absolute remote file into a private local path, bounded.
8
+ *
9
+ * Bounded for real, not by a pre-flight `stat`: the byte budget is enforced on the
10
+ * stream as it arrives (`sshExecRawStream` + `cat`), so a file that grows between
11
+ * a size check and the copy — or a peer that lies about the size — still cannot
12
+ * spend more than the budget. `scp` could not do this; it would transfer
13
+ * everything before this process got a chance to refuse.
14
+ *
15
+ * The local file is written 0600 inside a 0700 directory, because a capture can
16
+ * show anything that was on the peer's screen and a world-readable temp path
17
+ * would publish it to every local user.
18
+ */
19
+ /**
20
+ * The command that streams one file's RAW BYTES to stdout on the device's shell.
21
+ *
22
+ * Platform-correct, not one command with a portable-looking name. On Windows
23
+ * `cat` is an alias for `Get-Content`, which is a TEXT reader: it decodes the
24
+ * file, splits it into lines, and re-encodes on output — so a screenshot arrives
25
+ * corrupted rather than merely reordered. The .NET path opens a `FileStream` and
26
+ * copies it into the raw stdout handle, bypassing PowerShell's object/text
27
+ * pipeline entirely, which is the only way binary survives.
28
+ */
29
+ export declare function remoteReadFileArgv(remotePath: string, shell: DeviceProfile['shell']): string[];
30
+ /**
31
+ * Largest capture `browser show --device` will pull. A capture is a screenshot,
32
+ * a PDF or a short recording; anything past this is not something a viewer should
33
+ * stream over ssh, and the cap is what makes the transfer BOUNDED rather than
34
+ * "however big the peer's file happens to be".
35
+ */
36
+ export declare const REMOTE_VIEW_MAX_BYTES: number;
37
+ /**
38
+ * Fetch an absolute remote file into a private local path, bounded.
39
+ *
40
+ * Auth is the CANONICAL device path, not a hand-rolled ssh: `buildSshInvocation`
41
+ * supplies the askpass shim for a password-auth box, `-i`/`IdentitiesOnly` for an
42
+ * explicit identity file, and the managed known-hosts pinning. Building the ssh
43
+ * args here instead meant a password-auth device could not be reached at all and
44
+ * an explicit `identityFile` was silently ignored.
45
+ *
46
+ * Bounded for real, not by a pre-flight `stat`: the byte budget is enforced on the
47
+ * stream as it arrives, so a file that grows between a size check and the copy — or
48
+ * a peer that misreports its size — still cannot spend more than the budget.
49
+ *
50
+ * The local file is written 0600 inside a 0700 directory, because a capture can
51
+ * show anything that was on the peer's screen and a world-readable temp path
52
+ * would publish it to every local user.
53
+ */
54
+ export declare function fetchRemoteFileForViewing(device: string, remotePath: string, localPath: string, opts?: {
55
+ maxBytes?: number;
56
+ timeoutMs?: number;
57
+ }): Promise<void>;
5
58
  /**
6
59
  * The fleet browser hub this box drives by default (`browser.device`), or
7
60
  * undefined to drive locally. It is one fleet-synced value in the central
@@ -25,7 +25,11 @@ import { withActorEnv } from '../lib/hosts/dispatch.js';
25
25
  import { streamAgentsOnHost, passthroughSshOptions, } from '../lib/hosts/passthrough.js';
26
26
  import { buildRemoteAgentsInvocation, HOST_ROUTING_SPECS, stripRoutingFlags, } from '../lib/hosts/remote-cmd.js';
27
27
  import { resolveRemoteOsSync } from '../lib/hosts/remote-os.js';
28
- import { sshExec, SSH_OPTS } from '../lib/ssh-exec.js';
28
+ import { sshExec, SSH_OPTS, sshStreamWithArgs } from '../lib/ssh-exec.js';
29
+ import { getBrowserRuntimeDir } from '../lib/state.js';
30
+ import { buildSshInvocation, writeAskpassShim } from '../lib/devices/connect.js';
31
+ import { resolveDeviceProfile } from '../lib/devices/resolve-profile.js';
32
+ import { resolveDeviceTarget } from '../lib/devices/resolve-target.js';
29
33
  import { flagValue } from '../lib/hosts/routing-flag.js';
30
34
  import { browserTaskPicker } from './browser-picker.js';
31
35
  import { assertRemoteControlAllowed, isFleetRemoteInvocation } from '../lib/browser/remote-control.js';
@@ -35,7 +39,7 @@ import { registerCommandGroups, setHelpSections } from '../lib/help.js';
35
39
  import { buildHar } from '../lib/browser/har.js';
36
40
  import { getCliVersion } from '../lib/version.js';
37
41
  import { runBrowserIPCStream } from '../lib/browser/stream.js';
38
- import { machineId } from '../lib/machine-id.js';
42
+ import { machineId, normalizeHost } from '../lib/machine-id.js';
39
43
  import { isArcRunning } from '../lib/browser/drivers/arc.js';
40
44
  import { resolveBrowserTarget } from '../lib/browser/resolve-target.js';
41
45
  /**
@@ -179,6 +183,158 @@ export function remoteStartTaskName(stdout, explicit) {
179
183
  }
180
184
  return trimmed.split('\n').map((line) => line.trim()).find(Boolean);
181
185
  }
186
+ /**
187
+ * Fetch an absolute remote file into a private local path, bounded.
188
+ *
189
+ * Bounded for real, not by a pre-flight `stat`: the byte budget is enforced on the
190
+ * stream as it arrives (`sshExecRawStream` + `cat`), so a file that grows between
191
+ * a size check and the copy — or a peer that lies about the size — still cannot
192
+ * spend more than the budget. `scp` could not do this; it would transfer
193
+ * everything before this process got a chance to refuse.
194
+ *
195
+ * The local file is written 0600 inside a 0700 directory, because a capture can
196
+ * show anything that was on the peer's screen and a world-readable temp path
197
+ * would publish it to every local user.
198
+ */
199
+ /**
200
+ * The command that streams one file's RAW BYTES to stdout on the device's shell.
201
+ *
202
+ * Platform-correct, not one command with a portable-looking name. On Windows
203
+ * `cat` is an alias for `Get-Content`, which is a TEXT reader: it decodes the
204
+ * file, splits it into lines, and re-encodes on output — so a screenshot arrives
205
+ * corrupted rather than merely reordered. The .NET path opens a `FileStream` and
206
+ * copies it into the raw stdout handle, bypassing PowerShell's object/text
207
+ * pipeline entirely, which is the only way binary survives.
208
+ */
209
+ export function remoteReadFileArgv(remotePath, shell) {
210
+ if (shell === 'powershell') {
211
+ // Single-quoted inside the script with pwsh's own doubling, because this whole
212
+ // script is ONE argv token to the outer powershell.
213
+ const literal = remotePath.replace(/'/g, "''");
214
+ return ['powershell', '-NoProfile', '-Command', [
215
+ '$ErrorActionPreference=' + "'Stop';",
216
+ `$in=[System.IO.File]::OpenRead('${literal}');`,
217
+ 'try{$out=[System.Console]::OpenStandardOutput();$in.CopyTo($out);$out.Flush()}finally{$in.Dispose()}',
218
+ ].join(' ')];
219
+ }
220
+ // `--` so a path that begins with a dash is a path, not an option.
221
+ return ['cat', '--', remotePath];
222
+ }
223
+ /**
224
+ * Largest capture `browser show --device` will pull. A capture is a screenshot,
225
+ * a PDF or a short recording; anything past this is not something a viewer should
226
+ * stream over ssh, and the cap is what makes the transfer BOUNDED rather than
227
+ * "however big the peer's file happens to be".
228
+ */
229
+ export const REMOTE_VIEW_MAX_BYTES = 64 * 1024 * 1024;
230
+ /** Write a whole buffer, looping until it is all out. */
231
+ function writeFully(handle, chunk) {
232
+ let offset = 0;
233
+ while (offset < chunk.length) {
234
+ // `writeSync` may write FEWER bytes than asked (a signal, a pipe boundary),
235
+ // and ignoring the return value silently truncated the file mid-capture.
236
+ const wrote = fs.writeSync(handle, chunk, offset, chunk.length - offset);
237
+ if (wrote <= 0)
238
+ throw new Error('local write made no progress');
239
+ offset += wrote;
240
+ }
241
+ }
242
+ /**
243
+ * Fetch an absolute remote file into a private local path, bounded.
244
+ *
245
+ * Auth is the CANONICAL device path, not a hand-rolled ssh: `buildSshInvocation`
246
+ * supplies the askpass shim for a password-auth box, `-i`/`IdentitiesOnly` for an
247
+ * explicit identity file, and the managed known-hosts pinning. Building the ssh
248
+ * args here instead meant a password-auth device could not be reached at all and
249
+ * an explicit `identityFile` was silently ignored.
250
+ *
251
+ * Bounded for real, not by a pre-flight `stat`: the byte budget is enforced on the
252
+ * stream as it arrives, so a file that grows between a size check and the copy — or
253
+ * a peer that misreports its size — still cannot spend more than the budget.
254
+ *
255
+ * The local file is written 0600 inside a 0700 directory, because a capture can
256
+ * show anything that was on the peer's screen and a world-readable temp path
257
+ * would publish it to every local user.
258
+ */
259
+ export async function fetchRemoteFileForViewing(device, remotePath, localPath, opts = {}) {
260
+ const posixAbsolute = path.posix.isAbsolute(remotePath);
261
+ const windowsAbsolute = /^[A-Za-z]:[\\/]/.test(remotePath) || /^\\\\/.test(remotePath);
262
+ if (!posixAbsolute && !windowsAbsolute) {
263
+ throw new Error(`Remote path must be absolute: got "${remotePath}".\n`
264
+ + 'This machine cannot resolve the peer\'s working directory, so a relative path\n'
265
+ + 'would name a different file there than you meant here.');
266
+ }
267
+ // `resolveDeviceTarget` is the SAME resolver `agents ssh` uses, so it yields the
268
+ // full device profile — platform, shell and auth — that `buildSshInvocation`
269
+ // needs. `resolveHost` returns a hosts-registry `Host`, which carries none of
270
+ // that: with it, a password-auth device could not be reached and an explicit
271
+ // identityFile was silently dropped.
272
+ const resolved = await resolveDeviceTarget(device);
273
+ if (!resolved)
274
+ throw new Error(`Unknown device "${device}". Next: agents devices list`);
275
+ const profile = resolveDeviceProfile(resolved);
276
+ const maxBytes = opts.maxBytes ?? REMOTE_VIEW_MAX_BYTES;
277
+ // A POSIX device cannot read a Windows path and vice versa; saying so here beats
278
+ // a confusing shell error from the peer.
279
+ if (profile.shell === 'powershell' && posixAbsolute && !windowsAbsolute) {
280
+ throw new Error(`"${remotePath}" is a POSIX path but ${device} runs PowerShell. Pass the Windows path (e.g. C:\\Users\\…).`);
281
+ }
282
+ if (profile.shell !== 'powershell' && windowsAbsolute) {
283
+ throw new Error(`"${remotePath}" is a Windows path but ${device} is a POSIX host. Pass the absolute POSIX path.`);
284
+ }
285
+ const resolvedLocal = path.resolve(localPath);
286
+ const dir = path.dirname(resolvedLocal);
287
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
288
+ fs.chmodSync(dir, 0o700);
289
+ const handle = fs.openSync(resolvedLocal, 'w', 0o600);
290
+ let written = 0;
291
+ let overflow = false;
292
+ const controller = new AbortController();
293
+ try {
294
+ // `argv: true` is what makes a path containing a space or a quote survive —
295
+ // the same exact-token delivery `agents ssh --argv` exposes.
296
+ const { args, env } = buildSshInvocation(profile, remoteReadFileArgv(remotePath, profile.shell), writeAskpassShim(), {}, { argv: true });
297
+ const result = await sshStreamWithArgs({
298
+ args,
299
+ env,
300
+ timeoutMs: opts.timeoutMs ?? 120_000,
301
+ signal: controller.signal,
302
+ onStdout: (chunk) => {
303
+ if (overflow)
304
+ return;
305
+ if (written + chunk.length > maxBytes) {
306
+ overflow = true;
307
+ controller.abort();
308
+ return;
309
+ }
310
+ writeFully(handle, chunk);
311
+ written += chunk.length;
312
+ },
313
+ });
314
+ if (overflow) {
315
+ throw new Error(`Refusing to pull ${device}:${remotePath}: larger than the ${maxBytes}-byte view budget.`);
316
+ }
317
+ if (result.timedOut)
318
+ throw new Error(`Timed out pulling ${device}:${remotePath}.`);
319
+ if (result.code !== 0) {
320
+ const detail = result.stderr.toString('utf8').trim();
321
+ throw new Error(`Failed to read ${device}:${remotePath}${detail ? `: ${detail}` : ` (ssh exited ${result.code})`}`);
322
+ }
323
+ if (written === 0)
324
+ throw new Error(`${device}:${remotePath} is empty or was not readable.`);
325
+ }
326
+ catch (error) {
327
+ // Never leave a partial file behind for a viewer to open as if it were whole.
328
+ try {
329
+ fs.unlinkSync(resolvedLocal);
330
+ }
331
+ catch { /* nothing to clean */ }
332
+ throw error;
333
+ }
334
+ finally {
335
+ fs.closeSync(handle);
336
+ }
337
+ }
182
338
  async function pullRemoteFile(device, remotePath, localPath) {
183
339
  const host = await resolveHost(device);
184
340
  if (!host) {
@@ -2071,8 +2227,14 @@ function registerTaskCommands(browser) {
2071
2227
  });
2072
2228
  browser
2073
2229
  .command('show <url>')
2074
- .description('Open a URL for a human to read: goes to browser.viewer (default: browser.profile), and binds no task')
2230
+ .description('Open a URL or local file for a human to read: goes to browser.viewer (default: browser.profile), and binds no task')
2075
2231
  .option('--os-browser', 'Use the OS default handler instead of the configured viewer')
2232
+ // `--device` here names WHERE THE FILE IS, not where to open it. `show` is the
2233
+ // one browser verb narrowly exempt from the task-routing refusal
2234
+ // (`REJECT_DEVICE_MESSAGE`) because it binds no task and has nothing to route:
2235
+ // it is a local viewer, so the flag can only mean "the source lives there".
2236
+ // Every other verb still refuses `--device` — a task is bound at `start`.
2237
+ .option('--device <name>', 'fetch the file from this device, then view it locally (absolute path only)')
2076
2238
  .option('--json', 'Output machine-readable JSON')
2077
2239
  .action(async (url, opts) => {
2078
2240
  // The entry point external tools need. `navigate` binds a task, which the
@@ -2083,20 +2245,48 @@ function registerTaskCommands(browser) {
2083
2245
  // drive letter (`C:\Users\me\plan.html`), so a real path was treated as a
2084
2246
  // URL. A scheme is at least two characters.
2085
2247
  const isLocalFile = !/^[a-z][a-z0-9+.-]+:/i.test(url);
2086
- const outcome = isLocalFile
2087
- ? await showFile(path.resolve(url), { osBrowser: opts.osBrowser })
2248
+ let localTarget = isLocalFile ? path.resolve(url) : undefined;
2249
+ let fetched;
2250
+ if (opts.device) {
2251
+ // A URL is already reachable from here, so `--device` with one is a
2252
+ // contradiction rather than a no-op: it says the source is remote while
2253
+ // naming something that is not a file on that peer.
2254
+ if (!isLocalFile) {
2255
+ console.error(`--device names the device holding a FILE, so it cannot be combined with a URL.\n Drop --device to open ${url} here, or pass an absolute path on ${opts.device}.`);
2256
+ process.exit(1);
2257
+ }
2258
+ // The peer's path, verbatim — NOT path.resolve()'d, which would rewrite it
2259
+ // against this machine's cwd and name a different file there.
2260
+ const remotePath = url;
2261
+ const dir = path.join(getBrowserRuntimeDir(), 'remote-views');
2262
+ fetched = path.join(dir, `${normalizeHost(opts.device)}-${Date.now()}-${path.basename(remotePath) || 'capture'}`);
2263
+ try {
2264
+ await fetchRemoteFileForViewing(opts.device, remotePath, fetched);
2265
+ }
2266
+ catch (error) {
2267
+ console.error(error.message);
2268
+ process.exit(1);
2269
+ }
2270
+ localTarget = fetched;
2271
+ }
2272
+ const outcome = localTarget
2273
+ ? await showFile(localTarget, { osBrowser: opts.osBrowser })
2088
2274
  : await showUrl(url, { osBrowser: opts.osBrowser });
2275
+ // The fetched copy is what a viewer actually opened, so it is what the
2276
+ // caller is told about — pointing at the peer's path would name a file that
2277
+ // is not on this machine.
2278
+ const shown = fetched ?? url;
2089
2279
  if (opts.json) {
2090
- console.log(JSON.stringify(outcome, null, 2));
2280
+ console.log(JSON.stringify({ ...outcome, ...(fetched ? { source: `${opts.device}:${url}`, local: fetched } : {}) }, null, 2));
2091
2281
  }
2092
2282
  else if (outcome.via === 'none') {
2093
- console.error(`Could not open a browser — open this yourself:\n ${url}`);
2283
+ console.error(`Could not open a browser — open this yourself:\n ${shown}`);
2094
2284
  }
2095
2285
  else if (outcome.via === 'profile') {
2096
- console.log(`Shown in ${outcome.profile}: ${url}`);
2286
+ console.log(`Shown in ${outcome.profile}: ${shown}`);
2097
2287
  }
2098
2288
  else {
2099
- console.log(`Opened in the OS default browser: ${url}`);
2289
+ console.log(`Opened in the OS default browser: ${shown}`);
2100
2290
  }
2101
2291
  if (outcome.via === 'none')
2102
2292
  process.exit(1);
@@ -1,5 +1,5 @@
1
1
  import { type ComputerRunRow } from '../lib/computer/sessions-list.js';
2
- export interface ComputerSessionsCommandOpts {
2
+ interface ComputerSessionsCommandOpts {
3
3
  machine?: string;
4
4
  /** Row cap for the flat table only — the interactive picker is searchable
5
5
  * and shows every row regardless (see `runComputerSessions`). */
@@ -19,3 +19,4 @@ export declare function shouldOpenInteractiveComputerSessions(opts: ComputerSess
19
19
  * split so both call sites stay in lockstep.
20
20
  */
21
21
  export declare function runComputerSessionsCommand(opts: ComputerSessionsCommandOpts): Promise<void>;
22
+ export {};
@@ -39,6 +39,7 @@
39
39
  * own event ledger.
40
40
  */
41
41
  import { Command } from 'commander';
42
+ import { type ComputerTargetContext } from '../lib/computer/context.js';
42
43
  /**
43
44
  * The verb catalog. Descriptions are the consumer's (they appear in
44
45
  * `agents computer --help`); flags are the engine's.
@@ -65,38 +66,32 @@ export declare function shouldBlockOffPlatform(opts: {
65
66
  device?: string;
66
67
  }): boolean;
67
68
  /**
68
- * Put `--device <name>` back on the argv handed to the engine.
69
+ * Put `--host <address>` on the argv handed to the engine.
69
70
  *
70
71
  * commander CONSUMES the `--device` it declares, so a verb that only read
71
72
  * `opts.device` forwarded an argv with no remote selector in it and the engine
72
73
  * — which selects the remote path from its own argv — ran the invocation
73
74
  * LOCALLY. That is how `setup --device win-mini` installed the macOS helper on
74
75
  * the laptop. The flag is re-inserted immediately after the verb rather than
75
- * appended, so a verb whose operands are variadic cannot swallow it.
76
+ * appended, so a verb whose operands are variadic cannot swallow it. A `--host`
77
+ * the caller already typed always wins — it is never overwritten (PHNX-4090).
76
78
  *
77
79
  * Pure, so the re-insertion is testable without spawning the engine.
78
80
  */
79
- export declare function withDeviceFlag(argv: string[], device?: string): string[];
81
+ export declare function withHostFlag(argv: string[], host?: string): string[];
80
82
  /**
81
- * Forward one invocation to the engine and propagate its exit code.
82
- *
83
- * A missing standalone is the one failure agents-cli reports itself, because it
84
- * is the one the engine cannot: it prints the install line and exits 1. There is
85
- * no fallback engine to reach for — that is the point of the extraction.
83
+ * Resolve `--device <name>` to the `--host <address>` the engine actually
84
+ * speaks (PHNX-4090). A device's `computer.host` config (`agents config set
85
+ * devices.<name>.computer.host <address>`) wins when set — `vnc://`/`tcp://`
86
+ * carries no ssh identity, `ssh://` still resolves one against the fleet. With
87
+ * no `computer.host`, fall back to the fleet's ssh identity exactly as before
88
+ * (Windows-only — the tunnel this repo has always provisioned).
86
89
  */
87
- export declare function forwardToComputer(opts: {
88
- argv: string[];
89
- device?: string;
90
- /** Skip recording — lifecycle verbs are not user actions. */
91
- record?: boolean;
92
- /** Read the engine's stdout instead of letting it reach the terminal. */
93
- capture?: boolean;
94
- }): Promise<{
95
- exitCode: number;
96
- stdout: string;
90
+ export declare function resolveDeviceHost(device: string): Promise<{
91
+ host: string;
92
+ target: ComputerTargetContext;
97
93
  }>;
98
94
  export declare function registerComputerCommand(program: Command): void;
99
- export declare function registerComputerSubcommands(program: Command): void;
100
95
  /**
101
96
  * Install the macOS helper through the engine. Used by the `agents setup
102
97
  * computer` wizard, which still owns the TCC hand-holding — that is a
@@ -42,6 +42,9 @@ import { registerCommandGroups, setHelpSections } from '../lib/help.js';
42
42
  import { loadComputerAllowList, loadDefaultPeers, resolveTcpEndpoint, resolveVncEndpoint, } from '../lib/computer/policy.js';
43
43
  import { buildComputerContext } from '../lib/computer/context.js';
44
44
  import { recordComputerAction } from '../lib/computer/record.js';
45
+ import { resolveRemoteDevice } from '../lib/ssh-tunnel.js';
46
+ import { getConfigValue } from '../lib/device-config.js';
47
+ import { parseAddress, sshTarget } from '../lib/address.js';
45
48
  import { isComputerClientError, resolveComputerBin, runComputer, } from '../lib/computer-client.js';
46
49
  import { runComputerSessionsCommand } from './computer-sessions-picker.js';
47
50
  // Help groups — mirror `agents browser` so the mental model carries over.
@@ -99,22 +102,65 @@ export function shouldBlockOffPlatform(opts) {
99
102
  return true;
100
103
  }
101
104
  /**
102
- * Put `--device <name>` back on the argv handed to the engine.
105
+ * Put `--host <address>` on the argv handed to the engine.
103
106
  *
104
107
  * commander CONSUMES the `--device` it declares, so a verb that only read
105
108
  * `opts.device` forwarded an argv with no remote selector in it and the engine
106
109
  * — which selects the remote path from its own argv — ran the invocation
107
110
  * LOCALLY. That is how `setup --device win-mini` installed the macOS helper on
108
111
  * the laptop. The flag is re-inserted immediately after the verb rather than
109
- * appended, so a verb whose operands are variadic cannot swallow it.
112
+ * appended, so a verb whose operands are variadic cannot swallow it. A `--host`
113
+ * the caller already typed always wins — it is never overwritten (PHNX-4090).
110
114
  *
111
115
  * Pure, so the re-insertion is testable without spawning the engine.
112
116
  */
113
- export function withDeviceFlag(argv, device) {
114
- if (!device)
117
+ export function withHostFlag(argv, host) {
118
+ if (!host)
119
+ return argv;
120
+ if (argv.some((arg) => arg === '--host' || arg.startsWith('--host=')))
115
121
  return argv;
116
122
  const [verb, ...rest] = argv;
117
- return [verb, '--device', device, ...rest];
123
+ return [verb, '--host', host, ...rest];
124
+ }
125
+ /**
126
+ * Resolve `--device <name>` to the `--host <address>` the engine actually
127
+ * speaks (PHNX-4090). A device's `computer.host` config (`agents config set
128
+ * devices.<name>.computer.host <address>`) wins when set — `vnc://`/`tcp://`
129
+ * carries no ssh identity, `ssh://` still resolves one against the fleet. With
130
+ * no `computer.host`, fall back to the fleet's ssh identity exactly as before
131
+ * (Windows-only — the tunnel this repo has always provisioned).
132
+ */
133
+ export async function resolveDeviceHost(device) {
134
+ const configured = getConfigValue('computer.host', { device }).value;
135
+ if (configured) {
136
+ const addr = parseAddress(configured);
137
+ if (addr.scheme === 'vnc' || addr.scheme === 'tcp') {
138
+ // No ssh identity involved — the transport is RFB or a raw helper socket.
139
+ return { host: configured, target: { alias: device, host: addr.host, user: addr.user ?? '', hostname: addr.host, platform: addr.scheme, sshArgs: [] } };
140
+ }
141
+ // The configured address IS the connection target — an ssh:// override
142
+ // naming a different host/user/port than the device registry must actually
143
+ // take effect, not be silently replaced by the registry's own resolution.
144
+ // Only the ssh identity (key file flags) comes from the fleet; the target
145
+ // string forwarded on --host and the one recorded on fd-3 must be the same
146
+ // `sshTarget(addr)` the engine itself derives from that same --host value,
147
+ // or the engine's own context-vs-argv match (`resolveContextDevice`) misses
148
+ // and silently drops the identity args instead of failing loud.
149
+ const resolved = await resolveRemoteDevice(device, {});
150
+ const target = sshTarget(addr);
151
+ return {
152
+ host: configured,
153
+ target: { alias: device, host: target, user: addr.user ?? resolved.user, hostname: addr.host, platform: resolved.device.platform, sshArgs: resolved.identityArgs },
154
+ };
155
+ }
156
+ const resolved = await resolveRemoteDevice(device, {
157
+ expectPlatform: 'windows',
158
+ forWhat: '`agents computer --device` drives the Windows computer-helper daemon, so it',
159
+ });
160
+ return {
161
+ host: `ssh://${resolved.target}`,
162
+ target: { alias: device, host: resolved.target, user: resolved.user, hostname: resolved.host, platform: resolved.device.platform, sshArgs: resolved.identityArgs },
163
+ };
118
164
  }
119
165
  /**
120
166
  * Forward one invocation to the engine and propagate its exit code.
@@ -123,7 +169,7 @@ export function withDeviceFlag(argv, device) {
123
169
  * is the one the engine cannot: it prints the install line and exits 1. There is
124
170
  * no fallback engine to reach for — that is the point of the extraction.
125
171
  */
126
- export async function forwardToComputer(opts) {
172
+ async function forwardToComputer(opts) {
127
173
  let bin;
128
174
  try {
129
175
  bin = resolveComputerBin();
@@ -136,10 +182,19 @@ export async function forwardToComputer(opts) {
136
182
  throw err;
137
183
  }
138
184
  const hostFlag = opts.argv.findIndex(arg => arg === '--host' || arg.startsWith('--host='));
139
- const host = hostFlag < 0 ? undefined : (opts.argv[hostFlag].includes('=') ? opts.argv[hostFlag].slice(7) : opts.argv[hostFlag + 1]);
140
- const context = await buildComputerContext({ device: opts.device, host, computerBin: bin });
185
+ let host = hostFlag < 0 ? undefined : (opts.argv[hostFlag].includes('=') ? opts.argv[hostFlag].slice(7) : opts.argv[hostFlag + 1]);
186
+ let target;
187
+ // A device is resolved to --host here rather than forwarded as --device: the
188
+ // engine has no fleet registry of its own (PHNX-4090). An explicit --host on
189
+ // the command line always wins over --device, so this only runs without one.
190
+ if (!host && opts.device) {
191
+ const resolved = await resolveDeviceHost(opts.device);
192
+ host = resolved.host;
193
+ target = resolved.target;
194
+ }
195
+ const context = await buildComputerContext({ device: opts.device, host, target, computerBin: bin });
141
196
  return runComputer({
142
- argv: withDeviceFlag(opts.argv, opts.device),
197
+ argv: withHostFlag(opts.argv, host),
143
198
  context,
144
199
  capture: opts.capture,
145
200
  onEvent: opts.record === false
@@ -224,7 +279,7 @@ export function registerComputerCommand(program) {
224
279
  `,
225
280
  });
226
281
  }
227
- export function registerComputerSubcommands(program) {
282
+ function registerComputerSubcommands(program) {
228
283
  registerSetupCommand(program);
229
284
  registerStartCommand(program);
230
285
  registerStopCommand(program);
@@ -15,11 +15,11 @@
15
15
  import chalk from 'chalk';
16
16
  import { AGENTS } from '../lib/agents.js';
17
17
  import { setHelpSections } from '../lib/help.js';
18
- import { parseConfigKey, formatAgentVersion, devicePropertyToConfigName, configKeyStorageHint, } from '../lib/config-keys.js';
18
+ import { parseConfigKey, formatConfigKey, formatAgentVersion, devicePropertyToConfigName, configKeyStorageHint, MENUBAR_MENU_PROPERTIES, } from '../lib/config-keys.js';
19
19
  import { registerBudgetCommand } from './budget.js';
20
20
  import { resolveRunDefaults, setRunDefaultModel, setRunDefaultMode, setRunDefaultEffort, unsetRunDefault, } from '../lib/run-defaults.js';
21
21
  import { resolveTierOverride, setTierOverride, clearTierOverride } from '../lib/model-tier-overrides.js';
22
- import { getConfigValue, setConfigValue, unsetConfigValue, listConfig, } from '../lib/device-config.js';
22
+ import { getConfigValue, setConfigValue, unsetConfigValue, listConfig, configKeySpec, } from '../lib/device-config.js';
23
23
  import { readMeta, updateMeta } from '../lib/state.js';
24
24
  import { MODEL_TIERS } from '../lib/model-tiers.js';
25
25
  import { machineId } from '../lib/machine-id.js';
@@ -51,6 +51,20 @@ function parseValue(key, parsed, raw) {
51
51
  return parsed.property === 'enabled' ? parseBool(raw, key) : raw.trim();
52
52
  case 'updates':
53
53
  return parseBool(raw, key);
54
+ case 'menubar': {
55
+ // The type (and enum validation) live in the device-config spec; parse the
56
+ // raw string to that type here so setConfigValue's assertion passes.
57
+ const spec = configKeySpec(formatConfigKey(parsed));
58
+ if (spec.type === 'bool')
59
+ return parseBool(raw, key);
60
+ if (spec.type === 'int') {
61
+ if (!/^\d+$/.test(raw.trim())) {
62
+ throw new Error(`Config key '${key}' expects an integer, got '${raw}'.`);
63
+ }
64
+ return Number.parseInt(raw.trim(), 10);
65
+ }
66
+ return raw.trim();
67
+ }
54
68
  case 'device': {
55
69
  const property = parsed.property;
56
70
  switch (property) {
@@ -74,8 +88,11 @@ function parseValue(key, parsed, raw) {
74
88
  return Number.parseInt(raw.trim(), 10);
75
89
  case 'notes':
76
90
  return raw.trim();
91
+ case 'formFactor':
92
+ return raw.trim();
77
93
  case 'browser.profile':
78
94
  case 'browser.viewer':
95
+ case 'computer.host':
79
96
  return raw.trim();
80
97
  }
81
98
  // A device property with no arm above used to fall out of the switch and
@@ -143,6 +160,10 @@ function setConfig(parsed, value) {
143
160
  setGlobalAutoUpdateEnabled(value);
144
161
  return;
145
162
  }
163
+ case 'menubar': {
164
+ setConfigValue(formatConfigKey(parsed), value);
165
+ return;
166
+ }
146
167
  case 'device': {
147
168
  const configName = devicePropertyToConfigName(parsed.property);
148
169
  if (parsed.property === 'notes') {
@@ -217,6 +238,12 @@ function unsetConfig(parsed) {
217
238
  unsetGlobalAutoUpdateEnabled();
218
239
  return had;
219
240
  }
241
+ case 'menubar': {
242
+ const name = formatConfigKey(parsed);
243
+ const had = getConfigValue(name).value !== undefined;
244
+ unsetConfigValue(name);
245
+ return had;
246
+ }
220
247
  case 'device': {
221
248
  const configName = devicePropertyToConfigName(parsed.property);
222
249
  const had = getConfigValue(configName, { device: parsed.device }).value !== undefined;
@@ -251,6 +278,8 @@ function getConfig(parsed) {
251
278
  return getConfigValue(`summarizer.${parsed.property}`).value;
252
279
  case 'updates':
253
280
  return parsed.agent ? rawAgentAutoUpdateSetting(parsed.agent) : rawGlobalAutoUpdateSetting();
281
+ case 'menubar':
282
+ return getConfigValue(formatConfigKey(parsed)).value;
254
283
  case 'device': {
255
284
  const configName = devicePropertyToConfigName(parsed.property);
256
285
  return getConfigValue(configName, { device: parsed.device }).value;
@@ -345,6 +374,15 @@ function* listCentralConfigEntries() {
345
374
  yield { key, value, hint: configKeyStorageHint(parseConfigKey(key)) };
346
375
  }
347
376
  }
377
+ // AGI Menu preferences (PHNX-3999) — user scope, syncs fleet-wide. Only set
378
+ // keys are listed; the native menu falls back to its own defaults for the rest.
379
+ for (const prop of MENUBAR_MENU_PROPERTIES) {
380
+ const key = `menubar.menu.${prop}`;
381
+ const value = getConfigValue(key).value;
382
+ if (value !== undefined) {
383
+ yield { key, value, hint: configKeyStorageHint(parseConfigKey(key)) };
384
+ }
385
+ }
348
386
  }
349
387
  /** Collect device-scope config entries. */
350
388
  function* listDeviceConfigEntries(device) {
@@ -378,6 +416,9 @@ function* listDeviceConfigEntries(device) {
378
416
  case 'notes':
379
417
  key = `${prefix}notes`;
380
418
  break;
419
+ case 'formFactor':
420
+ key = `${prefix}formFactor`;
421
+ break;
381
422
  case 'browser.profile':
382
423
  // The self device's default browser profile is already surfaced as the
383
424
  // top-level `browser.profile` key; skip it here to avoid duplication.
@@ -391,6 +432,9 @@ function* listDeviceConfigEntries(device) {
391
432
  continue;
392
433
  key = `${prefix}browser.viewer`;
393
434
  break;
435
+ case 'computer.host':
436
+ key = `${prefix}computer.host`;
437
+ break;
394
438
  default:
395
439
  // A `default: continue` here silently drops any device property with no
396
440
  // arm — which is how browser.viewer was invisible to `config list` after
@@ -17,29 +17,6 @@
17
17
  * duplicating it.
18
18
  */
19
19
  import type { Command } from 'commander';
20
- import { type DaemonServiceId } from '../lib/daemon-services.js';
21
- /** Parse a `ps -o etime=` value (`[[dd-]hh:]mm:ss`) into elapsed seconds. */
22
- export declare function parseEtimeToSeconds(raw: string): number | null;
23
20
  /** Elapsed wall-clock seconds since `pid` started, or null if unavailable (best-effort, POSIX only). */
24
21
  export declare function uptimeSeconds(pid: number): number | null;
25
- /** One row of the roster every registered daemon service — supervisor-managed or legacy — renders in `agents daemon services`. */
26
- export interface DaemonServiceRow {
27
- id: DaemonServiceId;
28
- title: string;
29
- description: string;
30
- enabled: boolean;
31
- /**
32
- * `ServiceSupervisor`'s real lifecycle state when `supervised` is true
33
- * (`idle`/`running`/`parked`/`stopped`, written cross-process via
34
- * `recordSubsystemState`). A legacy `setInterval`-driven service has no such
35
- * record, so its state is inferred from `enabled` + whether the daemon
36
- * process is up — labelled distinctly so a reader can't mistake it for a
37
- * measured value.
38
- */
39
- state: string;
40
- supervised: boolean;
41
- lastRunMs: number | null;
42
- lastError: string | null;
43
- consecutiveFailures: number;
44
- }
45
22
  export declare function registerDaemonCommand(program: Command): void;
@@ -254,7 +254,7 @@ function registryScopedDuplicates(processes, ownerPid) {
254
254
  return processes.filter((p) => registered.has(p.pid));
255
255
  }
256
256
  /** Parse a `ps -o etime=` value (`[[dd-]hh:]mm:ss`) into elapsed seconds. */
257
- export function parseEtimeToSeconds(raw) {
257
+ function parseEtimeToSeconds(raw) {
258
258
  const m = raw.match(/^(?:(\d+)-)?(?:(\d+):)?(\d+):(\d+)$/);
259
259
  if (!m)
260
260
  return null;