@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
package/dist/lib/state.js CHANGED
@@ -267,14 +267,27 @@ function isUserOrSystemRepoCheckout(agentsPath) {
267
267
  return false;
268
268
  return canonicalDotAgentsRepoSlugs().has(origin);
269
269
  }
270
+ /**
271
+ * True when `agentsPath` is a reserved `.agents` root that must never be
272
+ * treated as a project layer: the user repo (~/.agents), the system repo
273
+ * (~/.agents/.system), or a git checkout of either canonical DotAgents repo.
274
+ * `getProjectAgentsDir` skips these while walking up; direct-cwd callers
275
+ * (`compileRulesForProject`) consult the same predicate so `$HOME` — whose
276
+ * `.agents/rules` is the user layer itself — can never compile as a
277
+ * "project" (RUSH-2725).
278
+ */
279
+ export function isReservedAgentsDir(agentsPath) {
280
+ return isSamePath(agentsPath, SYSTEM_AGENTS_DIR)
281
+ || isSamePath(agentsPath, USER_AGENTS_DIR)
282
+ || isUserOrSystemRepoCheckout(agentsPath);
283
+ }
270
284
  /** Walk up from startPath to find a project-scoped .agents/ directory (skipping both roots). */
271
285
  export function getProjectAgentsDir(startPath = process.cwd()) {
272
286
  let dir = path.resolve(startPath);
273
287
  while (true) {
274
288
  const agentsPath = path.join(dir, '.agents');
275
289
  if (fs.existsSync(agentsPath) && fs.statSync(agentsPath).isDirectory()) {
276
- if (!isSamePath(agentsPath, SYSTEM_AGENTS_DIR) && !isSamePath(agentsPath, USER_AGENTS_DIR)
277
- && !isUserOrSystemRepoCheckout(agentsPath)) {
290
+ if (!isReservedAgentsDir(agentsPath)) {
278
291
  return agentsPath;
279
292
  }
280
293
  }
@@ -564,8 +577,15 @@ function getDevicesDir() {
564
577
  export function getDevicesRegistryPath() { return path.join(getDevicesDir(), 'registry.json'); }
565
578
  /** Path to the device ignore-list — tailscale node names the user dismissed, so auto-discovery never re-suggests them. Per-machine, same dir as the registry. */
566
579
  export function getDevicesIgnoredPath() { return path.join(getDevicesDir(), 'ignored.json'); }
567
- /** Path to the LEGACY device auto-launch preference file — which registered devices are eligible/preferred for the ext's auto-host selection. Superseded by the central `fleet.devices.<name>.config` block; only lib/devices/config-migration.ts still reads it (to fold + remove it). */
580
+ /** Path to the LEGACY device auto-launch preference file — which registered devices are eligible/preferred for the ext's auto-host selection. Superseded by the per-device doc `config:` block; only lib/devices/config-migration.ts still reads it (to fold + remove it). */
568
581
  export function getDevicesAutoLaunchPath() { return path.join(getDevicesDir(), 'auto-launch.json'); }
582
+ /** Path to THIS machine's agent pins — the `agents:` global defaults and
583
+ * `isolatedAgents:` pointers. Each pin names a version installed on THIS
584
+ * machine, so it is machine-local runtime state and lives beside the device
585
+ * registry under `.history/devices/` (untracked) — NOT in the tracked
586
+ * per-device doc, where auto-written pins caused commit churn on every
587
+ * `agents use` / install. Read at call time like the other devices-dir paths. */
588
+ export function getDevicePinsPath() { return path.join(getDevicesDir(), `pins-${machineId()}.json`); }
569
589
  /** Dir of "pending device" sentinels (~/.agents/.cache/state/devices-pending/) — one empty-ish file per newly-discovered, not-yet-approved tailnet node. Written by the daemon probe, read by the menu-bar helper (mirrors the attention sentinel dir). */
570
590
  export function getDevicesPendingDir() { return path.join(getRuntimeStateDir(), 'devices-pending'); }
571
591
  /** Path to cloud dispatch cache (~/.agents/.cache/cloud/). */
@@ -779,6 +799,7 @@ function currentMetaStamp() {
779
799
  return safeMtimeMs(META_FILE)
780
800
  + '|' + safeMtimeMs(SYSTEM_META_FILE)
781
801
  + '|' + safeMtimeMs(getDeviceMetaPath())
802
+ + '|' + safeMtimeMs(getDevicePinsPath())
782
803
  + '|' + safeMtimeMs(getVersionResourcesPath());
783
804
  }
784
805
  /** Memoize a parsed Meta against the current file mtimes. */
@@ -786,7 +807,7 @@ function rememberMeta(meta) {
786
807
  metaCache = { stamp: currentMetaStamp(), meta };
787
808
  return meta;
788
809
  }
789
- function withMetaLock(fn) {
810
+ export function withMetaLock(fn) {
790
811
  ensureAgentsDir();
791
812
  if (metaLockDepth > 0) {
792
813
  metaLockDepth++;
@@ -821,12 +842,15 @@ function writeIfChanged(filePath, content) {
821
842
  atomicWriteFileSync(filePath, content);
822
843
  }
823
844
  /**
824
- * Partition the in-memory Meta across three files by sync-domain:
845
+ * Partition the in-memory Meta across four files by sync-domain:
825
846
  * - central `~/.agents/agents.yaml` — portable, everything else
826
- * (including the user-scope `config:` block and the per-device
827
- * operator config under `fleet.devices.<name>.config`)
828
- * - device `~/.agents/devices/<machine>/agents.yaml` — `agents:` pins +
829
- * `routines:` (all per-machine)
847
+ * (including the user-scope `config:` block and the fleet-wide
848
+ * config defaults under `fleet.defaults.config`)
849
+ * - device `~/.agents/devices/<machine>/agents.yaml` — TRACKED operator doc:
850
+ * `routines:` + `config:` (per-device operator settings) + machine-local
851
+ * `browser:` / `projectRoot` (never synced)
852
+ * - pins `~/.agents/.history/devices/pins-<host>.json` — `agents:` +
853
+ * `isolatedAgents:` (machine-local runtime, untracked)
830
854
  * - history `~/.agents/.history/version-resources.json` — `versions:` (machine-local)
831
855
  * All callers funnel through writeMeta → here, so nothing else changes. Empty
832
856
  * `agents:` / `versions:` are not written (no empty committed files).
@@ -952,48 +976,83 @@ function writeMetaUnlocked(meta) {
952
976
  const { agents, isolatedAgents, versions, deviceRoutines, deviceConfig, deviceBrowser, projectRoot, ...central } = meta;
953
977
  // Write the machine-local files FIRST, then strip central — so a crash mid-write
954
978
  // never removes pins/versions from central before they're persisted elsewhere.
955
- const devicePath = getDeviceMetaPath();
956
979
  const hasAgents = !!agents && Object.keys(agents).length > 0;
957
980
  // The isolated pointer names a version installed on THIS machine, exactly like a
958
- // global pin, so it belongs beside `agents:` in the device file rather than in the
981
+ // global pin, so it belongs beside `agents` in the pins file rather than in the
959
982
  // central doc that syncs — otherwise another machine inherits a pointer to a copy
960
983
  // it does not have.
961
984
  const hasIsolatedAgents = !!isolatedAgents && Object.keys(isolatedAgents).length > 0;
962
- const hasDeviceRoutines = Array.isArray(deviceRoutines);
963
- // Machine-visibility operator config. Lives here rather than in the synced
964
- // central file because nothing off-box reads it and because
965
- // browser.remote-control is a consent flag that must not propagate on pull.
985
+ // Pins (`agents:` defaults + `isolatedAgents:`) are machine-local runtime
986
+ // state they live in the untracked .history pins JSON, never in the tracked
987
+ // per-device doc (auto-written pins there caused commit churn on every
988
+ // `agents use` / install).
989
+ const pinsPath = getDevicePinsPath();
990
+ if (hasAgents || hasIsolatedAgents) {
991
+ const pins = {};
992
+ if (hasAgents)
993
+ pins.agents = agents;
994
+ if (hasIsolatedAgents)
995
+ pins.isolatedAgents = isolatedAgents;
996
+ fs.mkdirSync(path.dirname(pinsPath), { recursive: true });
997
+ writeIfChanged(pinsPath, JSON.stringify(pins, null, 2) + '\n');
998
+ }
999
+ else if (fs.existsSync(pinsPath)) {
1000
+ // Every pin was cleared. Persist the emptied file instead of skipping the
1001
+ // write — otherwise the stale pins file survives and overlayMachineLocal
1002
+ // re-applies the removed pin on the next read.
1003
+ writeIfChanged(pinsPath, '{}\n');
1004
+ }
1005
+ // The tracked per-device doc carries operator-owned fields: `routines:`
1006
+ // (device-local activation) from here, `config:` from lib/device-config.ts,
1007
+ // and machine-local browser defaults / projectRoot (never fleet policy).
1008
+ // Merge over the existing doc so a `config:` block written outside this path
1009
+ // is never clobbered. Pins are stripped defensively — they belong to the pins
1010
+ // file now (the migration strips them too; a hand-edited doc converges on the
1011
+ // next write).
1012
+ const devicePath = getDeviceMetaPath();
1013
+ let doc = {};
1014
+ if (fs.existsSync(devicePath)) {
1015
+ try {
1016
+ const parsed = yaml.parse(fs.readFileSync(devicePath, 'utf-8'));
1017
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
1018
+ doc = parsed;
1019
+ }
1020
+ }
1021
+ catch { /* preserve the existing tolerance for malformed legacy device YAML */ }
1022
+ }
1023
+ delete doc.agents;
1024
+ delete doc.isolatedAgents;
1025
+ if (Array.isArray(deviceRoutines))
1026
+ doc.routines = deviceRoutines;
1027
+ else
1028
+ delete doc.routines;
966
1029
  const hasDeviceConfig = !!deviceConfig && Object.keys(deviceConfig).length > 0;
1030
+ if (hasDeviceConfig)
1031
+ doc.config = deviceConfig;
1032
+ else
1033
+ delete doc.config;
967
1034
  const hasDeviceBrowser = !!deviceBrowser && Object.keys(deviceBrowser).length > 0;
968
- // An inferred local filesystem path — machine state, never fleet policy.
1035
+ if (hasDeviceBrowser)
1036
+ doc.browser = deviceBrowser;
1037
+ else
1038
+ delete doc.browser;
969
1039
  const hasProjectRoot = typeof projectRoot === 'string' && projectRoot.length > 0;
970
- if (hasAgents || hasIsolatedAgents || hasDeviceRoutines || hasDeviceConfig || hasDeviceBrowser || hasProjectRoot) {
971
- // Device-local doc carries `agents:` pins and `routines:` — per-machine and
972
- // must never land in central agents.yaml (which syncs). Operator config
973
- // used to ride this doc under `config:`; it now lives centrally under
974
- // `fleet.devices.<name>.config` (see lib/device-config.ts).
975
- const deviceDoc = {};
976
- if (hasAgents)
977
- deviceDoc.agents = agents;
978
- if (hasIsolatedAgents)
979
- deviceDoc.isolatedAgents = isolatedAgents;
980
- if (hasDeviceRoutines)
981
- deviceDoc.routines = deviceRoutines;
982
- if (hasDeviceConfig)
983
- deviceDoc.config = deviceConfig;
984
- if (hasDeviceBrowser)
985
- deviceDoc.browser = deviceBrowser;
986
- if (hasProjectRoot)
987
- deviceDoc.projectRoot = projectRoot;
1040
+ if (hasProjectRoot)
1041
+ doc.projectRoot = projectRoot;
1042
+ else
1043
+ delete doc.projectRoot;
1044
+ if (Object.keys(doc).length > 0) {
988
1045
  fs.mkdirSync(path.dirname(devicePath), { recursive: true });
989
- writeIfChanged(devicePath, META_HEADER + yaml.stringify(deviceDoc));
1046
+ writeIfChanged(devicePath, META_HEADER + yaml.stringify(doc));
990
1047
  }
991
1048
  else if (fs.existsSync(devicePath)) {
992
- // Every device-local value was cleared. Persist the emptied doc instead of
993
- // skipping the write — otherwise the stale device file survives and
994
- // overlayMachineLocal re-applies the removed pin/default on the next read,
995
- // leaving a dangling value (e.g. a default pointing at a deleted profile).
996
- writeIfChanged(devicePath, META_HEADER + yaml.stringify({ agents: {} }));
1049
+ // Nothing operator-owned remains remove the doc rather than leaving an
1050
+ // empty tracked file behind.
1051
+ fs.rmSync(devicePath, { force: true });
1052
+ try {
1053
+ fs.rmdirSync(path.dirname(devicePath));
1054
+ }
1055
+ catch { /* not empty — other files live in the device dir */ }
997
1056
  }
998
1057
  if (versions && Object.keys(versions).length > 0) {
999
1058
  const vrPath = getVersionResourcesPath();
@@ -1005,20 +1064,27 @@ function writeMetaUnlocked(meta) {
1005
1064
  }
1006
1065
  /**
1007
1066
  * Overlay this machine's local state onto a central-portable Meta:
1008
- * - `agents:` and `isolatedAgents:` from the device file (device wins; the union
1067
+ * - `agents:` and `isolatedAgents:` from the pins file (device wins; the union
1009
1068
  * both preserves the one-level merge and self-heals a pre-migration central that
1010
1069
  * still has pins)
1011
- * - `routines:` from the device file into `deviceRoutines` (device-local
1012
- * routine activation)
1070
+ * - `routines:` / machine-local `browser:` / `projectRoot` from the tracked device
1071
+ * doc (device-local; the doc's `config:` block is read by lib/device-config.ts,
1072
+ * not overlaid here)
1013
1073
  * - `versions:` from the history JSON (wholesale replace; falls back to
1014
1074
  * whatever central carried when the history file doesn't exist yet)
1015
- *
1016
- * (Device operator config is NOT overlaid here: it lives centrally under
1017
- * `fleet.devices.<name>.config` — see lib/device-config.ts. The legacy
1018
- * `config:`/`defaultBrowserProfile:` keys in a device doc are folded into the
1019
- * central block by lib/devices/config-migration.ts.)
1020
1075
  */
1021
1076
  function overlayMachineLocal(meta) {
1077
+ const pinsPath = getDevicePinsPath();
1078
+ if (fs.existsSync(pinsPath)) {
1079
+ try {
1080
+ const pins = JSON.parse(fs.readFileSync(pinsPath, 'utf-8'));
1081
+ if (pins?.agents)
1082
+ meta.agents = { ...meta.agents, ...pins.agents };
1083
+ if (pins?.isolatedAgents)
1084
+ meta.isolatedAgents = { ...meta.isolatedAgents, ...pins.isolatedAgents };
1085
+ }
1086
+ catch { /* ignore malformed pins file */ }
1087
+ }
1022
1088
  const devicePath = getDeviceMetaPath();
1023
1089
  if (fs.existsSync(devicePath)) {
1024
1090
  let dm = null;
@@ -1027,10 +1093,13 @@ function overlayMachineLocal(meta) {
1027
1093
  }
1028
1094
  catch { /* preserve the existing tolerance for malformed legacy device YAML */ }
1029
1095
  if (dm) {
1096
+ // Pre-migration pins may still live in the tracked doc — honor them until
1097
+ // migrateDeviceConfigStores strips them. Pins-file values already applied
1098
+ // above win on key conflict.
1030
1099
  if (dm?.agents)
1031
- meta.agents = { ...meta.agents, ...dm.agents };
1100
+ meta.agents = { ...dm.agents, ...meta.agents };
1032
1101
  if (dm?.isolatedAgents)
1033
- meta.isolatedAgents = { ...meta.isolatedAgents, ...dm.isolatedAgents };
1102
+ meta.isolatedAgents = { ...dm.isolatedAgents, ...meta.isolatedAgents };
1034
1103
  if (typeof dm?.projectRoot === 'string')
1035
1104
  meta.projectRoot = dm.projectRoot;
1036
1105
  if (dm?.browser && typeof dm.browser === 'object' && !Array.isArray(dm.browser)) {
@@ -1039,7 +1108,7 @@ function overlayMachineLocal(meta) {
1039
1108
  if (dm?.config && typeof dm.config === 'object' && !Array.isArray(dm.config)) {
1040
1109
  meta.deviceConfig = { ...meta.deviceConfig, ...dm.config };
1041
1110
  }
1042
- if (dm && Object.prototype.hasOwnProperty.call(dm, 'routines')) {
1111
+ if (Object.prototype.hasOwnProperty.call(dm, 'routines')) {
1043
1112
  if (!Array.isArray(dm.routines) || dm.routines.some((name) => typeof name !== 'string')) {
1044
1113
  throw new Error(`Device config corrupted at ${devicePath}: routines must be a string list.`);
1045
1114
  }
@@ -11,7 +11,7 @@ import * as path from 'path';
11
11
  import * as yaml from 'yaml';
12
12
  import { capableAgents } from './capabilities.js';
13
13
  import { getSubagentsDir, getUserSubagentsDir, getTrashSubagentsDir } from './state.js';
14
- import { listInstalledVersions, getVersionHomePath } from './versions.js';
14
+ import { listInstalledVersions, getVersionHomePath } from './installations/versions.js';
15
15
  import { safeJoin } from './paths.js';
16
16
  import { subagentTarget, writeSubagentToHome, listInstalledSubagentNames, listInstalledSubagentsRich, removeSubagentFromHome, trashSubagentFromHome, copyDirWithRename, } from './subagents-registry.js';
17
17
  /**
@@ -21,7 +21,7 @@
21
21
  import simpleGit from 'simple-git';
22
22
  import { ALL_AGENT_IDS } from './agents.js';
23
23
  import { diffVersionResources, } from './doctor-diff.js';
24
- import { listInstalledVersions, getGlobalDefault } from './versions.js';
24
+ import { listInstalledVersions, getGlobalDefault } from './installations/versions.js';
25
25
  import { loadManifest } from './staleness/index.js';
26
26
  import { getSystemAgentsDir } from './state.js';
27
27
  import { isGitRepo } from './git.js';
@@ -12,7 +12,7 @@
12
12
  * repos -> git pull of ~/.agents + enabled ~/.agents-* extras (pullRepo)
13
13
  * secrets -> listRemoteBundles + pullBundle (needs a passphrase; skipped
14
14
  * cleanly when none is available — tokenized non-interactive auth
15
- * arrives with `agents login`, #366/#367)
15
+ * arrives with `agents secrets vault unlock`, #366/#367)
16
16
  * reconcile-> refresh({ skipPrompts }) — re-materialize resources into homes
17
17
  */
18
18
  /** The umbrella flags off `agents sync`. */
@@ -59,6 +59,11 @@ export interface UmbrellaResult {
59
59
  skipped: boolean;
60
60
  };
61
61
  reconciled: boolean;
62
+ /**
63
+ * Resources the reconcile stage refused to write, as user-facing sentences.
64
+ * Empty when nothing was declined — never conflated with "nothing to do".
65
+ */
66
+ declined: string[];
62
67
  }
63
68
  export interface RunUmbrellaArgs {
64
69
  flags: UmbrellaFlags;
@@ -12,7 +12,7 @@
12
12
  * repos -> git pull of ~/.agents + enabled ~/.agents-* extras (pullRepo)
13
13
  * secrets -> listRemoteBundles + pullBundle (needs a passphrase; skipped
14
14
  * cleanly when none is available — tokenized non-interactive auth
15
- * arrives with `agents login`, #366/#367)
15
+ * arrives with `agents secrets vault unlock`, #366/#367)
16
16
  * reconcile-> refresh({ skipPrompts }) — re-materialize resources into homes
17
17
  */
18
18
  import { pullRepo } from './git.js';
@@ -55,7 +55,7 @@ export function planUmbrellaStages(f) {
55
55
  export async function runUmbrellaSync(args) {
56
56
  const { flags, log, yes, passphrase, quiet = false } = args;
57
57
  const plan = planUmbrellaStages(flags);
58
- const result = { plan, reconciled: false };
58
+ const result = { plan, reconciled: false, declined: [] };
59
59
  if (plan.fetchRepos) {
60
60
  const dirs = [
61
61
  { alias: 'user', dir: getUserAgentsDir() },
@@ -74,13 +74,17 @@ export async function runUmbrellaSync(args) {
74
74
  }
75
75
  }
76
76
  result.repos = { pulled, errors };
77
+ if (!errors.some((error) => error.startsWith('user:'))) {
78
+ const { reconcileDeviceDiscoveryPolicies } = await import('./devices/discovery-policy.js');
79
+ await reconcileDeviceDiscoveryPolicies();
80
+ }
77
81
  }
78
82
  if (plan.fetchSecrets) {
79
83
  if (!passphrase) {
80
84
  result.secrets = {
81
85
  pulled: 0,
82
86
  skipped: true,
83
- reason: `no passphrase — set ${SYNC_PASSPHRASE_ENV} or run \`agents login\` (#366)`,
87
+ reason: `no passphrase — set ${SYNC_PASSPHRASE_ENV} or run \`agents secrets vault unlock\` (#366)`,
84
88
  errors: [],
85
89
  };
86
90
  log(`secrets: skipped (no passphrase — set ${SYNC_PASSPHRASE_ENV})`);
@@ -109,8 +113,9 @@ export async function runUmbrellaSync(args) {
109
113
  }
110
114
  if (plan.reconcile) {
111
115
  const { refresh } = await import('./refresh.js');
112
- await refresh({ skipPrompts: yes, quiet });
116
+ const refreshed = await refresh({ skipPrompts: yes, quiet });
113
117
  result.reconciled = true;
118
+ result.declined = refreshed.declined;
114
119
  // Keep already-registered devices' reachability current, and surface newly
115
120
  // appeared tailnet nodes as "pending" for the menu-bar Register/Ignore gate
116
121
  // rather than silently adding them (refresh mode). Soft: a machine without
@@ -8,7 +8,7 @@
8
8
  * multiple permission modes (plan, edit, full).
9
9
  */
10
10
  import { spawn, execSync } from 'child_process';
11
- import { getAgentsInvocation } from '../daemon.js';
11
+ import { getAgentsInvocation } from '../daemon/daemon.js';
12
12
  import * as fs from 'fs/promises';
13
13
  import * as fsSync from 'fs';
14
14
  import * as path from 'path';
@@ -20,7 +20,7 @@ import { normalizeEvents } from './parsers.js';
20
20
  import { debug } from './debug.js';
21
21
  import { getAgentsDir as getSystemAgentsDir, getShimsDir } from '../state.js';
22
22
  import { AGENTS, getAccountInfo } from '../agents.js';
23
- import { resolveVersion, isVersionInstalled, verifyInstalledBinaryLaunches } from '../versions.js';
23
+ import { resolveVersion, isVersionInstalled, verifyInstalledBinaryLaunches } from '../installations/versions.js';
24
24
  import { sanitizeProcessEnv } from '../secrets/bundles.js';
25
25
  import { resolveActor, actorEnv } from '../actor.js';
26
26
  import { recordRunName } from '../session/run-names.js';
@@ -13,7 +13,7 @@ import * as path from 'path';
13
13
  import { randomBytes } from 'crypto';
14
14
  import lockfile from 'proper-lockfile';
15
15
  import { getTeamsRegistryPath } from '../state.js';
16
- import { emit } from '../events.js';
16
+ import { emit } from '../feed/events.js';
17
17
  async function registryPath() {
18
18
  return getTeamsRegistryPath();
19
19
  }
@@ -7,7 +7,7 @@
7
7
  * the editor CLI's `--open-url` flag. The extension opens an editor-tab terminal
8
8
  * in `cwd`, runs `command`, and its shell-adoption promotes a resume command
9
9
  * (e.g. `claude --resume <id>`) to the matching agent chip. Driving the editor
10
- * CLI (not macOS `open`) means this works over `--host` SSH and on Linux, needs
10
+ * CLI (not macOS `open`) means this works over `--device` SSH and on Linux, needs
11
11
  * no OS URL-scheme handler registration, and sends the command into an
12
12
  * already-interactive login shell — so no `zsh -ilc` wrap (the other backends'
13
13
  * wrapper) is applied here.
@@ -19,7 +19,7 @@ export function specForRequest(req) {
19
19
  export async function openSurface(req, opts = {}) {
20
20
  try {
21
21
  // Both can throw: specForRequest on an unknown backend, runSpec when the
22
- // SSH transport rejects an invalid --host target. Keep them inside the
22
+ // SSH transport rejects an invalid --device target. Keep them inside the
23
23
  // catch so a bad request degrades to a per-surface failure, never a throw.
24
24
  const spec = specForRequest(req);
25
25
  const res = await runSpec(spec, req.host, opts.resolveHost);
@@ -16,3 +16,7 @@ export { specForRequest, buildRequests, openSurface, openSurfaces, type OpenOpti
16
16
  export { runLocal, runRemote, runSpec, remoteCommand, type HostResolver, type RunResult } from './transport.js';
17
17
  export { injectIntoTerminal, tmuxSendKeysArgv, tmuxInjectSpecs, itermInjectScript, ghosttyInjectScript, appleScriptInjectSpec, vscodiumInjectUri, vscodiumInjectSpec, type InjectTarget, type InjectBackend, type InjectOptions, type InjectResult, } from './inject.js';
18
18
  export { resolveInjectTarget, resolveInjectTargetForSession, type InjectResolution, type InjectRail, type ResolveOptions, } from './resolve.js';
19
+ export { iLoginShell } from './shell.js';
20
+ export { shellQuote } from './quote.js';
21
+ export { parseTerminalFlag, stripTerminalFlag, buildRunCommand, openRunInTerminal, toHostSamples, TERMINAL_FLAG_BACKENDS } from './run-surface.js';
22
+ export type { OpenRunSurfaceParams, OpenRunSurfaceResult } from './run-surface.js';
@@ -7,3 +7,6 @@ export { specForRequest, buildRequests, openSurface, openSurfaces, } from './eng
7
7
  export { runLocal, runRemote, runSpec, remoteCommand } from './transport.js';
8
8
  export { injectIntoTerminal, tmuxSendKeysArgv, tmuxInjectSpecs, itermInjectScript, ghosttyInjectScript, appleScriptInjectSpec, vscodiumInjectUri, vscodiumInjectSpec, } from './inject.js';
9
9
  export { resolveInjectTarget, resolveInjectTargetForSession, } from './resolve.js';
10
+ export { iLoginShell } from './shell.js';
11
+ export { shellQuote } from './quote.js';
12
+ export { parseTerminalFlag, stripTerminalFlag, buildRunCommand, openRunInTerminal, toHostSamples, TERMINAL_FLAG_BACKENDS } from './run-surface.js';
@@ -12,7 +12,7 @@
12
12
  * It mirrors the engine's shape exactly: pure per-backend spec builders (like
13
13
  * `tmuxTabArgv` / `itermTabScript`) produce a `LaunchSpec` (argv), and the same
14
14
  * `runSpec` transport runs it — so injection inherits the engine's local/remote
15
- * (`--host` over SSH) execution for free. A `LaunchSpec` never opens anything;
15
+ * (`--device` over SSH) execution for free. A `LaunchSpec` never opens anything;
16
16
  * building one is side-effect-free and unit-testable without a display.
17
17
  *
18
18
  * Backends (each addresses the EXACT split, not the frontmost surface):
@@ -27,7 +27,7 @@
27
27
  * into the swarmify `swarm-ext` extension's `/inject` verb, targeting
28
28
  * a live-terminals.json terminal by id. Focus-independent, exact
29
29
  * terminal, and (like the launch backend, src/lib/terminal/backends/
30
- * vscodium-agent.ts) works over `--host` SSH and on Linux.
30
+ * vscodium-agent.ts) works over `--device` SSH and on Linux.
31
31
  * - ghostty (macOS) → COARSE only: Ghostty has no scripting dictionary, so
32
32
  * there is no per-split addressing — this raises a window and types
33
33
  * via System Events keystrokes, stealing focus. The resolver refuses
@@ -12,7 +12,7 @@
12
12
  * It mirrors the engine's shape exactly: pure per-backend spec builders (like
13
13
  * `tmuxTabArgv` / `itermTabScript`) produce a `LaunchSpec` (argv), and the same
14
14
  * `runSpec` transport runs it — so injection inherits the engine's local/remote
15
- * (`--host` over SSH) execution for free. A `LaunchSpec` never opens anything;
15
+ * (`--device` over SSH) execution for free. A `LaunchSpec` never opens anything;
16
16
  * building one is side-effect-free and unit-testable without a display.
17
17
  *
18
18
  * Backends (each addresses the EXACT split, not the frontmost surface):
@@ -27,7 +27,7 @@
27
27
  * into the swarmify `swarm-ext` extension's `/inject` verb, targeting
28
28
  * a live-terminals.json terminal by id. Focus-independent, exact
29
29
  * terminal, and (like the launch backend, src/lib/terminal/backends/
30
- * vscodium-agent.ts) works over `--host` SSH and on Linux.
30
+ * vscodium-agent.ts) works over `--device` SSH and on Linux.
31
31
  * - ghostty (macOS) → COARSE only: Ghostty has no scripting dictionary, so
32
32
  * there is no per-split addressing — this raises a window and types
33
33
  * via System Events keystrokes, stealing focus. The resolver refuses
@@ -5,7 +5,7 @@
5
5
  * are short-lived commands that create the surface and return, so waiting gives
6
6
  * a real success/failure. Remote: serialize the argv into one shell string and
7
7
  * hand it to `sshExec` — the same hardened SSH primitive `agents sessions
8
- * --host` and the browser driver use (target-injection guard, POSIX quoting,
8
+ * --device` and the browser driver use (target-injection guard, POSIX quoting,
9
9
  * connection multiplexing).
10
10
  */
11
11
  import { spawn } from 'child_process';
@@ -5,4 +5,4 @@
5
5
  */
6
6
  export { findTmuxBinary, isTmuxInstalled, getTmuxVersion, isTmuxVersionSupported, MIN_TMUX_VERSION, assertTmuxAvailable, TmuxUnavailableError, TmuxCommandError, runTmux, attachTmux, } from './binary.js';
7
7
  export { getDefaultSocketPath, getSessionMetaPath, ensureTmuxDir, } from './paths.js';
8
- export { assertValidSessionName, slugifyName, hasSession, createSession, killSession, killAll, listSessions, splitPane, sendKeys, capturePane, readSessionMeta, TmuxSessionError, type SessionMeta, type CreateSessionOptions, type ListedSession, type SplitOptions, type SendOptions, type CaptureOptions, } from './session.js';
8
+ export { assertValidSessionName, slugifyName, hasSession, createSession, killSession, killAll, listSessions, splitPane, sendKeys, capturePane, readSessionMeta, TmuxSessionError, reconcileSessionHooks, ensureSessionHookRepaired, type SessionMeta, type CreateSessionOptions, type ListedSession, type SplitOptions, type SendOptions, type CaptureOptions, } from './session.js';
@@ -5,4 +5,4 @@
5
5
  */
6
6
  export { findTmuxBinary, isTmuxInstalled, getTmuxVersion, isTmuxVersionSupported, MIN_TMUX_VERSION, assertTmuxAvailable, TmuxUnavailableError, TmuxCommandError, runTmux, attachTmux, } from './binary.js';
7
7
  export { getDefaultSocketPath, getSessionMetaPath, ensureTmuxDir, } from './paths.js';
8
- export { assertValidSessionName, slugifyName, hasSession, createSession, killSession, killAll, listSessions, splitPane, sendKeys, capturePane, readSessionMeta, TmuxSessionError, } from './session.js';
8
+ export { assertValidSessionName, slugifyName, hasSession, createSession, killSession, killAll, listSessions, splitPane, sendKeys, capturePane, readSessionMeta, TmuxSessionError, reconcileSessionHooks, ensureSessionHookRepaired, } from './session.js';
@@ -188,7 +188,7 @@ export declare function paneExitStatus(pane: string, socket?: string): Promise<P
188
188
  * Best-effort — returns false when tmux rejects the hook so callers do not
189
189
  * stamp a schema marker and daemon reconciliation can retry later.
190
190
  */
191
- export declare function setSessionHook(name: string, hook: string, command: string, socket?: string): Promise<boolean>;
191
+ export declare function setSessionHook(name: string, hook: string, command: string, socket?: string, timeoutMs?: number): Promise<boolean>;
192
192
  /**
193
193
  * Schema version of the `pane-died` hook installed on managed `agents run`
194
194
  * sessions. Bump whenever the hook's SHAPE changes so the daemon reconcile
@@ -231,7 +231,7 @@ export declare const AGENT_HOOK_SCHEMA = 5;
231
231
  */
232
232
  export declare function agentPaneDiedHook(sessionName: string, agentPane: string): string;
233
233
  /** Stamp a session's hook-schema marker to the current version. */
234
- export declare function markSessionHookSchema(name: string, socket?: string): Promise<void>;
234
+ export declare function markSessionHookSchema(name: string, socket?: string, timeoutMs?: number): Promise<void>;
235
235
  /**
236
236
  * The outcome of {@link prepareSessionForResume}. `attach` carries the pane it
237
237
  * positively resolved so the caller can read that pane's exit status back after
@@ -261,15 +261,30 @@ export declare function prepareSessionForResume(name: string, socket?: string):
261
261
  * exited a split — self-heals in place, without waiting for those agents to exit
262
262
  * or for the server to be recycled.
263
263
  *
264
- * The daemon calls this on a light interval. The per-session `@ag_hook_schema`
265
- * marker makes steady-state a cheap no-op: a session already at the current
266
- * schema is skipped. Only run-wrapped sessions (`ag-` prefix) are touched an
264
+ * NOT a daemon poll the 5-minute `tmux-reconcile` routine that used to call this
265
+ * was deleted (RUSH-2495). It survives as the version-skew ONE-SHOT: the daemon
266
+ * calls it once at startup (`runDaemon` in `../daemon.js`) and once from the
267
+ * upgrade-time migration (`runMigration` in `../migrate.js`), so a session a
268
+ * pre-fix binary left with a stale hook still self-heals without a live poller.
269
+ * `ensureSessionHookRepaired` covers the steady-state gap between those two
270
+ * points by repairing a single session right before it's attached to. The
271
+ * per-session `@ag_hook_schema` marker makes both paths a cheap no-op once a
272
+ * session is current. Only run-wrapped sessions (`ag-` prefix) are touched — an
267
273
  * externally-created session on the socket keeps whatever hook it set.
268
274
  */
269
275
  export declare function reconcileSessionHooks(socket?: string): Promise<{
270
276
  scanned: number;
271
277
  reconciled: number;
272
278
  }>;
279
+ /**
280
+ * Repair a single managed session's `pane-died` hook right before it is
281
+ * attached to, so a legacy session left by a pre-fix binary self-heals on the
282
+ * next touch instead of waiting for the next daemon-startup/upgrade one-shot
283
+ * (RUSH-2435). Only `ag-`-prefixed (run-wrapped) sessions are touched; a no-op
284
+ * for anything else. Best-effort — never throws, so a repair failure can never
285
+ * block the attach it is protecting.
286
+ */
287
+ export declare function ensureSessionHookRepaired(name: string, socket?: string): Promise<void>;
273
288
  /**
274
289
  * List live sessions on the socket. Reconciles meta JSONs against tmux's view:
275
290
  * - tmux session with no meta → returned without `meta` (external session)
@@ -277,6 +292,7 @@ export declare function reconcileSessionHooks(socket?: string): Promise<{
277
292
  */
278
293
  export declare function listSessions(opts?: {
279
294
  socket?: string;
295
+ timeoutMs?: number;
280
296
  }): Promise<ListedSession[]>;
281
297
  export interface SplitOptions {
282
298
  name: string;