@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
@@ -10,9 +10,9 @@
10
10
  * This module picks the delivery mechanism from (open feed block × session
11
11
  * liveness × runtime rail). Pure — unit-testable without a live PTY.
12
12
  */
13
- import type { OpenBlock, BlockOption } from './feed.js';
13
+ import type { OpenBlock, BlockOption } from './feed/feed.js';
14
14
  import type { ActiveSession } from './session/active.js';
15
- import type { InjectTarget } from './terminal/inject.js';
15
+ import type { InjectTarget } from './terminal/index.js';
16
16
  export type AnswerRouteKind = 'mailbox' | 'pty' | 'tmux' | 'iterm' | 'resume' | 'refuse';
17
17
  export interface AnswerRoute {
18
18
  kind: AnswerRouteKind;
@@ -13,7 +13,7 @@
13
13
  * Rules-based on stable high-volume shapes. Pure classify/match; suppression has
14
14
  * side effects via the feed store when applied.
15
15
  */
16
- import type { OpenBlock } from './feed.js';
16
+ import type { OpenBlock } from './feed/feed.js';
17
17
  /** Taxonomy for a published ask. Exactly one class per block. */
18
18
  export type AskClass = 'decision' | 'approval' | 'clarification' | 'stall' | 'fyi';
19
19
  export interface Classification {
@@ -1,4 +1,4 @@
1
- import { recordAnswer, recordMessageReceipt, removeBlock } from './feed.js';
1
+ import { recordAnswer, recordMessageReceipt, removeBlock } from './feed/feed.js';
2
2
  import { enqueue, mailboxDir } from './mailbox.js';
3
3
  /** Scan text used for classification. */
4
4
  export function askScanText(block) {
@@ -14,7 +14,7 @@ import { spawnSync } from 'child_process';
14
14
  import { sha256 } from '../staleness/fingerprint.js';
15
15
  import { getHistoryDir } from '../state.js';
16
16
  import { ensureLockTarget, withFileLock } from '../fs-atomic.js';
17
- import { emit } from '../events.js';
17
+ import { emit } from '../feed/events.js';
18
18
  /** First record's `prevHash` — a fixed anchor so the chain has a root. */
19
19
  export const GENESIS_HASH = 'GENESIS';
20
20
  /**
@@ -1,6 +1,6 @@
1
1
  import { type AccountInfo } from './agents.js';
2
2
  import type { AgentId } from './types.js';
3
- import { type ProviderProbe } from './usage.js';
3
+ import { type ProviderProbe } from './accounting/usage.js';
4
4
  /**
5
5
  * - `live` — completed an authenticated request (200).
6
6
  * - `revoked` — the server rejected the token (401/403), except Claude
@@ -20,8 +20,8 @@ import * as fs from 'fs';
20
20
  import * as path from 'path';
21
21
  import { ALL_AGENT_IDS, getAccountInfo } from './agents.js';
22
22
  import { getCacheDir } from './state.js';
23
- import { probeClaudeStatus, probeDroidStatus, probeKimiStatus, USAGE_HEADLESS_SCOPE_MARKER, } from './usage.js';
24
- import { getVersionHomePath, listInstalledVersions } from './versions.js';
23
+ import { probeClaudeStatus, probeDroidStatus, probeKimiStatus, USAGE_HEADLESS_SCOPE_MARKER, } from './accounting/usage.js';
24
+ import { getVersionHomePath, listInstalledVersions } from './installations/versions.js';
25
25
  import { atomicWriteFileSync, ensureLockTarget, withFileLock } from './fs-atomic.js';
26
26
  /** Agents with a live network probe wired up today. The rest are best-effort. */
27
27
  export const LIVE_PROBE_AGENTS = new Set(['claude', 'kimi', 'droid']);
package/dist/lib/brand.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * personally-named binary (e.g. `jack` instead of `agents`), skinned with their
4
4
  * name and pinned to the exact feature set they enable.
5
5
  *
6
- * A brand is minted by `agents setup mine` / `agents mine init <name>`, which
6
+ * A brand is minted by `agents setup mine` / `agents setup mine init <name>`, which
7
7
  * writes a pure pass-through shim (`~/.agents/.cache/shims/<name>`) that sets
8
8
  * `AGENTS_BRAND=<name>` then execs the real agents-cli entrypoint. The entrypoint
9
9
  * reads `AGENTS_BRAND` to (a) present its own name/help/errors as the brand, and
@@ -0,0 +1,28 @@
1
+ export interface CallerIdentity {
2
+ actor: string;
3
+ launchId?: string;
4
+ sessionId?: string;
5
+ /** Agent pid when identity came from the process-table anchor. */
6
+ agentPid?: number;
7
+ }
8
+ /**
9
+ * Resolve caller identity once per CLI process for browser IPC stamping.
10
+ *
11
+ * Starts from `process.ppid` — the shell or harness that launched this
12
+ * `agents browser` invocation — and walks up until a state file or known
13
+ * agent comm is found.
14
+ */
15
+ export declare function resolveCallerIdentity(env?: NodeJS.ProcessEnv): CallerIdentity;
16
+ /**
17
+ * True when a live task belongs to this caller. Match on sessionId or
18
+ * launchId — either is enough. A task with no recorded identity never
19
+ * matches a caller that has one (and vice versa for the no-identity case
20
+ * handled separately by the resolver).
21
+ */
22
+ export declare function taskMatchesCaller(task: {
23
+ sessionId?: string;
24
+ launchId?: string;
25
+ }, caller: {
26
+ sessionId?: string;
27
+ launchId?: string;
28
+ }): boolean;
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Resolve the agent identity of whoever invoked `agents browser`.
3
+ *
4
+ * The browser daemon is shared and long-lived, so identity must be captured in
5
+ * the CLI process and forwarded over IPC. Order:
6
+ *
7
+ * 1. Env already set by `agents run` (`AGENT_SESSION_ID` / `AGENT_LAUNCH_ID`)
8
+ * 2. Session-tracker state file under `~/.agents/.cache/terminals/sessions/`
9
+ * (and the deployed fleet path under `state/sessions/`), keyed by
10
+ * process.ppid and walked up the ancestor chain
11
+ * 3. Process-table anchor — nearest ancestor whose comm maps to a known
12
+ * harness via `agentKindFromComm` (derived from SESSION_AGENTS)
13
+ *
14
+ * No per-harness env-var table: the state-file reader and the process-table
15
+ * classifier cover every harness by construction.
16
+ */
17
+ import { execFileSync } from 'child_process';
18
+ import { resolveActor } from '../actor.js';
19
+ import { agentKindFromComm } from '../session/active.js';
20
+ import { loadHookSessionIndex, readStateSessionRecord, } from '../session/hook-sessions.js';
21
+ const MAX_ANCESTOR_WALK = 16;
22
+ /**
23
+ * Read pid→ppid→comm for one process. Returns null when the process is gone
24
+ * or `ps` fails.
25
+ */
26
+ function readProc(pid) {
27
+ if (!pid || pid <= 1)
28
+ return null;
29
+ try {
30
+ const out = execFileSync('ps', ['-p', String(pid), '-o', 'pid=,ppid=,comm='], {
31
+ encoding: 'utf8',
32
+ timeout: 1000,
33
+ }).trim();
34
+ const m = out.match(/^(\d+)\s+(\d+)\s+(.+)$/);
35
+ if (!m)
36
+ return null;
37
+ return {
38
+ pid: parseInt(m[1], 10),
39
+ ppid: parseInt(m[2], 10),
40
+ comm: m[3].trim(),
41
+ };
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ /**
48
+ * Walk ancestors starting at `startPid` (inclusive). Yields each pid once.
49
+ */
50
+ function* ancestorPids(startPid) {
51
+ let cur = startPid;
52
+ const seen = new Set();
53
+ for (let i = 0; i < MAX_ANCESTOR_WALK && cur > 1 && !seen.has(cur); i++) {
54
+ seen.add(cur);
55
+ yield cur;
56
+ const proc = readProc(cur);
57
+ if (!proc)
58
+ return;
59
+ cur = proc.ppid;
60
+ }
61
+ }
62
+ /**
63
+ * Look up a session-tracker / deployed-hook state record for `pid`.
64
+ * Prefers the richer terminals/sessions index; falls back to the fleet
65
+ * state/sessions path (RUSH-2007).
66
+ */
67
+ function stateForPid(pid, index) {
68
+ const fromIndex = index.byPid.get(pid);
69
+ if (fromIndex?.session_id)
70
+ return fromIndex;
71
+ return readStateSessionRecord(pid);
72
+ }
73
+ /**
74
+ * Resolve caller identity once per CLI process for browser IPC stamping.
75
+ *
76
+ * Starts from `process.ppid` — the shell or harness that launched this
77
+ * `agents browser` invocation — and walks up until a state file or known
78
+ * agent comm is found.
79
+ */
80
+ export function resolveCallerIdentity(env = process.env) {
81
+ const actor = resolveActor().id;
82
+ let sessionId = env.AGENT_SESSION_ID || env.AGENTS_SESSION_ID || undefined;
83
+ let launchId = env.AGENT_LAUNCH_ID || undefined;
84
+ let agentPid;
85
+ if (sessionId && launchId) {
86
+ return { actor, sessionId, launchId };
87
+ }
88
+ // Start at ppid: when an agent runs a Bash tool call, the browser CLI's
89
+ // parent is that shell (or the agent itself when launched directly).
90
+ const startPid = typeof process.ppid === 'number' && process.ppid > 0 ? process.ppid : 0;
91
+ if (startPid > 0) {
92
+ let index;
93
+ try {
94
+ index = loadHookSessionIndex();
95
+ }
96
+ catch {
97
+ index = undefined;
98
+ }
99
+ for (const pid of ancestorPids(startPid)) {
100
+ if (index) {
101
+ const rec = stateForPid(pid, index);
102
+ if (rec?.session_id) {
103
+ sessionId = sessionId || rec.session_id;
104
+ launchId = launchId || rec.launch_id;
105
+ agentPid = pid;
106
+ break;
107
+ }
108
+ }
109
+ else {
110
+ const rec = readStateSessionRecord(pid);
111
+ if (rec?.session_id) {
112
+ sessionId = sessionId || rec.session_id;
113
+ launchId = launchId || rec.launch_id;
114
+ agentPid = pid;
115
+ break;
116
+ }
117
+ }
118
+ }
119
+ // Process-table anchor: nearest ancestor whose comm is a known harness.
120
+ // Covers harnesses with no SessionStart hook (and sessions the hook missed).
121
+ //
122
+ // IMPORTANT: stamp as launchId, NEVER as sessionId. A synthetic
123
+ // `agent-pid:<n>` is not a real agent session UUID — if it lands in
124
+ // sessionId, hygiene.taskOwnerIsGone treats it as a dead session (the
125
+ // process-table session probe rejects non-UUID shapes) and reaps the
126
+ // task mid-run. launchId-only tasks are never session-reaped
127
+ // (hygiene.ts: launchId alone is not proof of death).
128
+ if (!sessionId && !launchId) {
129
+ for (const pid of ancestorPids(startPid)) {
130
+ const proc = readProc(pid);
131
+ if (!proc)
132
+ continue;
133
+ const kind = agentKindFromComm(proc.comm);
134
+ if (kind) {
135
+ launchId = `agent-pid:${pid}`;
136
+ agentPid = pid;
137
+ break;
138
+ }
139
+ }
140
+ }
141
+ }
142
+ return { actor, sessionId, launchId, agentPid };
143
+ }
144
+ /**
145
+ * True when a live task belongs to this caller. Match on sessionId or
146
+ * launchId — either is enough. A task with no recorded identity never
147
+ * matches a caller that has one (and vice versa for the no-identity case
148
+ * handled separately by the resolver).
149
+ */
150
+ export function taskMatchesCaller(task, caller) {
151
+ if (caller.sessionId && task.sessionId && caller.sessionId === task.sessionId)
152
+ return true;
153
+ if (caller.launchId && task.launchId && caller.launchId === task.launchId)
154
+ return true;
155
+ return false;
156
+ }
@@ -4,7 +4,7 @@
4
4
  // with code 1006 ("Max decompressed message size exceeded") while the command
5
5
  // is pending. `ws` offers no permessage-deflate by default and takes an
6
6
  // explicit payload cap. (Reproduced live against a remote Edge over
7
- // `browser --host`: fresh blank newtab passed, reused content-rich newtab
7
+ // `browser --device`: fresh blank newtab passed, reused content-rich newtab
8
8
  // failed on every Page.captureScreenshot.)
9
9
  import WSWebSocket from 'ws';
10
10
  const pipeTransports = new Map();
@@ -227,6 +227,10 @@ export function verifyBrowserIdentity(reported, expected, port, host = 'localhos
227
227
  // doesn't override the Chromium branding. Accept chrome here so attaching
228
228
  // to a Comet instance doesn't trip a false "identity mismatch".
229
229
  comet: ['comet', 'chrome'],
230
+ // Arc reports itself as plain "Chrome/<version>" in /json/version (verified
231
+ // live: Arc 1.15x → "Chrome/151"), so accept chrome to avoid a false
232
+ // identity mismatch when attaching to a real Arc.
233
+ arc: ['arc', 'chrome'],
230
234
  brave: ['brave', 'brave-browser', 'chrome'],
231
235
  // Windows/Chromium Edge reports its /json/version "Browser" field as
232
236
  // "Edg/<version>" (the `Edg` token, not `Edge`), which normalizeBrowserName
@@ -23,6 +23,7 @@ const BROWSER_PATHS = {
23
23
  chromium: ['/Applications/Chromium.app/Contents/MacOS/Chromium'],
24
24
  brave: ['/Applications/Brave Browser.app/Contents/MacOS/Brave Browser'],
25
25
  edge: ['/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge'],
26
+ arc: ['/Applications/Arc.app/Contents/MacOS/Arc'],
26
27
  custom: [],
27
28
  },
28
29
  linux: {
@@ -31,6 +32,8 @@ const BROWSER_PATHS = {
31
32
  chromium: ['/usr/bin/chromium', '/usr/bin/chromium-browser', '/snap/bin/chromium'],
32
33
  brave: ['/usr/bin/brave-browser', '/usr/bin/brave'],
33
34
  edge: ['/usr/bin/microsoft-edge'],
35
+ // Arc has no Linux build (macOS + Windows only).
36
+ arc: [],
34
37
  custom: [],
35
38
  },
36
39
  win32: {
@@ -57,6 +60,9 @@ const BROWSER_PATHS = {
57
60
  `${WIN_PROGRAMFILES_X86}\\Microsoft\\Edge\\Application\\msedge.exe`,
58
61
  `${WIN_LOCALAPPDATA}\\Microsoft\\Edge\\Application\\msedge.exe`,
59
62
  ],
63
+ // Arc ships a Windows build, but its install path is not yet verified here;
64
+ // leave unlisted (undetected) rather than guess a path that false-positives.
65
+ arc: [],
60
66
  custom: [],
61
67
  },
62
68
  };
@@ -162,6 +168,9 @@ export function findBrowserPath(browserType, customBinary) {
162
168
  if (browserType === 'comet' && platform === 'linux') {
163
169
  throw new Error('Browser "comet" is not available on Linux (Comet ships macOS and Windows builds only). Use chrome, chromium, brave, or edge on this platform.');
164
170
  }
171
+ if (browserType === 'arc' && platform === 'linux') {
172
+ throw new Error('Browser "arc" is not available on Linux (Arc ships macOS and Windows builds only). Use chrome, chromium, brave, or edge on this platform.');
173
+ }
165
174
  throw new Error(`Browser "${browserType}" not found. Install it first.`);
166
175
  }
167
176
  // Per-platform Chromium-family priority list for "no --profile" auto-pick.
@@ -170,7 +179,9 @@ export function findBrowserPath(browserType, customBinary) {
170
179
  // way cdp.ts expects, so they'd need separate drivers.
171
180
  const DEFAULT_BROWSER_PRIORITY = {
172
181
  // macOS: Chrome leads (>70% of dev machines), then the rest of the family.
173
- darwin: ['chrome', 'brave', 'edge', 'chromium', 'comet'],
182
+ // Arc is last: it's in maintenance mode and needs a blank tab to drive, so it
183
+ // shouldn't win auto-pick over a mainstream browser.
184
+ darwin: ['chrome', 'brave', 'edge', 'chromium', 'comet', 'arc'],
174
185
  // Linux: Chrome/Chromium first (apt/snap), then Brave/Edge if present.
175
186
  linux: ['chrome', 'chromium', 'brave', 'edge'],
176
187
  // Windows: Edge is preinstalled on every supported build, so it's the
@@ -54,7 +54,7 @@ export declare function buildWindowsLaunchScript(browserType: string, port: numb
54
54
  * killing only the port-owning main process orphans its children. The orphans
55
55
  * keep the profile's SingletonLock, so every later launch against the same
56
56
  * `--user-data-dir` delegates to the zombie tree, exits, and never binds the
57
- * CDP port — `browser start --host` then fails until someone hand-cleans the
57
+ * CDP port — `browser start --device` then fails until someone hand-cleans the
58
58
  * box (found live on win-mini by the #561 e2e suite).
59
59
  */
60
60
  export declare function buildWindowsKillScript(port: number): string;
@@ -8,7 +8,7 @@ import { writeProfileRuntime, clearProfileRuntime } from '../runtime-state.js';
8
8
  // so existing importers of `shellQuote` from this module keep working.
9
9
  import { shellQuote, assertValidSshTarget, controlOpts, sshConnectOpts } from '../../ssh-exec.js';
10
10
  export { shellQuote };
11
- // The `ssh -L` tunnel spawn is shared with `agents computer --host`; it lives in
11
+ // The `ssh -L` tunnel spawn is shared with `agents computer --device`; it lives in
12
12
  // the single ssh-tunnel helper. Calling it with no options preserves this
13
13
  // driver's original foreground, stderr-captured behavior exactly.
14
14
  import { startSSHTunnel } from '../../ssh-tunnel.js';
@@ -142,6 +142,7 @@ const POSIX_BROWSER_PATHS = {
142
142
  chromium: '/Applications/Chromium.app/Contents/MacOS/Chromium',
143
143
  brave: '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser',
144
144
  edge: '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge',
145
+ arc: '/Applications/Arc.app/Contents/MacOS/Arc',
145
146
  };
146
147
  // Windows App Paths registry keys per browser. CreateProcess (used by WMI
147
148
  // Win32_Process.Create) does not honor App Paths the way ShellExecute/`start`
@@ -244,7 +245,7 @@ export function buildWindowsLaunchScript(browserType, port, customBinary) {
244
245
  * killing only the port-owning main process orphans its children. The orphans
245
246
  * keep the profile's SingletonLock, so every later launch against the same
246
247
  * `--user-data-dir` delegates to the zombie tree, exits, and never binds the
247
- * CDP port — `browser start --host` then fails until someone hand-cleans the
248
+ * CDP port — `browser start --device` then fails until someone hand-cleans the
248
249
  * box (found live on win-mini by the #561 e2e suite).
249
250
  */
250
251
  export function buildWindowsKillScript(port) {
@@ -33,8 +33,16 @@ export interface ReapDeps {
33
33
  sessionLiveOnProcessTable?: (sessionId: string) => Promise<boolean>;
34
34
  }
35
35
  export interface ReapOptions {
36
- /** Idle window in ms. Default {@link DEFAULT_IDLE_MS}. */
37
- idleMs?: number;
36
+ /**
37
+ * Idle window in ms. Default {@link DEFAULT_IDLE_MS}.
38
+ *
39
+ * `null` is the explicit "idle reaping is off" signal
40
+ * (`browser.task-idle-minutes=0`) — session-dead reaping below is
41
+ * unaffected. A caller-supplied `0` is a DIFFERENT thing and still throws
42
+ * (see the guard below): it is far likelier to be a bug (a value that
43
+ * survived `??` unset) than an intentional "reap everything immediately."
44
+ */
45
+ idleMs?: number | null;
38
46
  /** Clock, injectable for tests. Default `Date.now()`. */
39
47
  now?: number;
40
48
  /** Report what would be closed without closing anything. */
@@ -98,12 +98,15 @@ export async function taskOwnerIsGone(task, live, deps = {}) {
98
98
  * asked for, and an in-flight recording is itself proof the task is in use.
99
99
  */
100
100
  export async function reapAbandonedTasks(service, opts = {}) {
101
- const idleMs = opts.idleMs ?? DEFAULT_IDLE_MS;
101
+ const idleDisabled = opts.idleMs === null;
102
+ const idleMs = idleDisabled ? undefined : (opts.idleMs ?? DEFAULT_IDLE_MS);
102
103
  // Fail loud rather than reap everything. A caller-supplied `0` survives `??`
103
104
  // and would close every task including one created a millisecond ago; a
104
105
  // non-numeric value makes every `>=` comparison false and silently disables
105
- // idle reaping. Both are worse than an error.
106
- if (!Number.isFinite(idleMs) || idleMs <= 0) {
106
+ // idle reaping. Both are worse than an error. `null` (idleDisabled) skips
107
+ // this check entirely that is the one deliberate way to turn idle
108
+ // reaping off, distinct from an accidental `0`.
109
+ if (!idleDisabled && (!Number.isFinite(idleMs) || idleMs <= 0)) {
107
110
  throw new Error(`idleMs must be a positive number of milliseconds, got ${String(idleMs)}`);
108
111
  }
109
112
  const now = opts.now ?? Date.now();
@@ -120,7 +123,7 @@ export async function reapAbandonedTasks(service, opts = {}) {
120
123
  if (await taskOwnerIsGone(task, live, deps)) {
121
124
  reason = 'session-dead';
122
125
  }
123
- else if (now - (task.lastActionAt ?? task.createdAt) >= idleMs) {
126
+ else if (!idleDisabled && now - (task.lastActionAt ?? task.createdAt) >= idleMs) {
124
127
  reason = 'idle';
125
128
  }
126
129
  if (!reason) {
@@ -67,16 +67,36 @@ export declare class BrowserIPCServer {
67
67
  private doStop;
68
68
  /** Release the listening binding, resolving only once it is genuinely gone. */
69
69
  private closeServer;
70
+ /**
71
+ * Resolve `request.task` from caller identity when omitted. Page verbs may
72
+ * create; done/stop never create. Returns an error response to short-circuit
73
+ * the action, or undefined when the request is ready (task filled in).
74
+ */
75
+ private bindTask;
70
76
  private handleRequest;
71
77
  }
72
78
  /**
73
- * Decide whether a running daemon is stale and must be restarted. A daemon
74
- * is stale when it reports a concrete version that differs from this CLI's.
79
+ * Decide whether a running daemon is stale and must be restarted.
80
+ *
81
+ * FORWARD ONLY: restart when the daemon is *older* than this CLI so a newer
82
+ * install loads current code. An older CLI rides a newer daemon instead of
83
+ * evicting it — two installs sharing one daemon dir (keyed off $HOME) must
84
+ * not flap the daemon indefinitely.
85
+ *
75
86
  * `undefined`/`'unknown'` means the daemon is too old to answer the `version`
76
87
  * action reliably — don't churn it on that ambiguous signal.
88
+ *
89
+ * When numeric compare cannot order two distinct strings (e.g. two
90
+ * `0.0.0-dev.*` builds), treat the mismatch as a restart so a concrete
91
+ * code change still loads.
77
92
  */
78
93
  export declare function shouldRestartStaleDaemon(daemonVersion: string | undefined, clientVersion: string): boolean;
79
94
  export declare function sendIPCRequest(request: IPCRequest, opts?: IPCRequestOptions): Promise<IPCResponse>;
95
+ /**
96
+ * Fill actor / launchId / sessionId from the calling process when the request
97
+ * left them blank. Explicit values on the request always win.
98
+ */
99
+ export declare function stampCallerIdentity(request: IPCRequest): IPCRequest;
80
100
  /**
81
101
  * Open one connection that can serve many browser operations. This uses the
82
102
  * same daemon readiness and version-reconciliation path as sendIPCRequest;