@phnx-labs/agents-cli 1.22.39 → 1.22.40

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 (554) hide show
  1. package/CHANGELOG.md +294 -0
  2. package/README.md +111 -70
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.js +45 -26
  5. package/dist/browser.js +2 -2
  6. package/dist/cli/command-registry.d.ts +135 -0
  7. package/dist/cli/command-registry.js +260 -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.js +206 -94
  13. package/dist/commands/budget.d.ts +7 -6
  14. package/dist/commands/budget.js +8 -7
  15. package/dist/commands/cloud.js +17 -20
  16. package/dist/commands/commands.js +1 -1
  17. package/dist/commands/computer-actions.d.ts +1 -35
  18. package/dist/commands/computer-actions.js +13 -181
  19. package/dist/commands/computer.d.ts +28 -3
  20. package/dist/commands/computer.js +93 -65
  21. package/dist/commands/config.js +16 -3
  22. package/dist/commands/cost.d.ts +2 -1
  23. package/dist/commands/cost.js +7 -6
  24. package/dist/commands/daemon.js +151 -4
  25. package/dist/commands/detach.js +1 -1
  26. package/dist/commands/doctor.js +19 -11
  27. package/dist/commands/events.js +1 -1
  28. package/dist/commands/exec.d.ts +2 -50
  29. package/dist/commands/exec.js +160 -215
  30. package/dist/commands/factory.js +1 -1
  31. package/dist/commands/feed.d.ts +2 -2
  32. package/dist/commands/feed.js +9 -12
  33. package/dist/commands/fleet-capture.js +25 -27
  34. package/dist/commands/focus.d.ts +2 -3
  35. package/dist/commands/focus.js +34 -9
  36. package/dist/commands/go.js +15 -5
  37. package/dist/commands/harness.d.ts +3 -3
  38. package/dist/commands/harness.js +53 -5
  39. package/dist/commands/hooks.js +1 -1
  40. package/dist/commands/import.js +2 -2
  41. package/dist/commands/insights.d.ts +5 -5
  42. package/dist/commands/insights.js +15 -9
  43. package/dist/commands/inspect.d.ts +2 -3
  44. package/dist/commands/inspect.js +4 -16
  45. package/dist/commands/logs.d.ts +2 -2
  46. package/dist/commands/logs.js +9 -9
  47. package/dist/commands/mcp.js +2 -2
  48. package/dist/commands/memory.js +1 -1
  49. package/dist/commands/message.d.ts +1 -1
  50. package/dist/commands/message.js +7 -7
  51. package/dist/commands/mine.d.ts +11 -8
  52. package/dist/commands/mine.js +11 -10
  53. package/dist/commands/models.js +1 -1
  54. package/dist/commands/modes.js +1 -1
  55. package/dist/commands/monitors.js +23 -6
  56. package/dist/commands/output.d.ts +7 -6
  57. package/dist/commands/output.js +11 -10
  58. package/dist/commands/packages.js +4 -4
  59. package/dist/commands/perf.js +1 -1
  60. package/dist/commands/permissions.js +49 -32
  61. package/dist/commands/plugins.d.ts +1 -1
  62. package/dist/commands/plugins.js +3 -3
  63. package/dist/commands/profiles.d.ts +6 -9
  64. package/dist/commands/profiles.js +8 -321
  65. package/dist/commands/projects.d.ts +9 -0
  66. package/dist/commands/projects.js +140 -8
  67. package/dist/commands/prune.js +5 -13
  68. package/dist/commands/refresh-rules.js +1 -1
  69. package/dist/commands/repo.d.ts +5 -7
  70. package/dist/commands/repo.js +34 -18
  71. package/dist/commands/resource-view.js +4 -0
  72. package/dist/commands/resume.d.ts +11 -7
  73. package/dist/commands/resume.js +82 -98
  74. package/dist/commands/route.d.ts +12 -0
  75. package/dist/commands/route.js +261 -0
  76. package/dist/commands/routines.d.ts +2 -3
  77. package/dist/commands/routines.js +120 -145
  78. package/dist/commands/rules.js +1 -1
  79. package/dist/commands/run-account-picker.d.ts +1 -1
  80. package/dist/commands/run-account-picker.js +2 -2
  81. package/dist/commands/run-broadcast.d.ts +21 -0
  82. package/dist/commands/run-broadcast.js +89 -0
  83. package/dist/commands/run-cloud.js +1 -1
  84. package/dist/commands/secrets-vault.d.ts +10 -0
  85. package/dist/commands/{login.js → secrets-vault.js} +34 -14
  86. package/dist/commands/secrets.d.ts +4 -4
  87. package/dist/commands/secrets.js +72 -63
  88. package/dist/commands/sessions-backfill.js +1 -1
  89. package/dist/commands/sessions-browser.d.ts +1 -1
  90. package/dist/commands/sessions-browser.js +9 -5
  91. package/dist/commands/sessions-export.js +2 -2
  92. package/dist/commands/sessions-inject.js +4 -5
  93. package/dist/commands/sessions-migrate.js +16 -27
  94. package/dist/commands/sessions-picker.d.ts +13 -0
  95. package/dist/commands/sessions-picker.js +182 -8
  96. package/dist/commands/sessions-resume.d.ts +7 -3
  97. package/dist/commands/sessions-resume.js +81 -33
  98. package/dist/commands/sessions-stats.js +2 -2
  99. package/dist/commands/sessions.d.ts +75 -68
  100. package/dist/commands/sessions.js +142 -180
  101. package/dist/commands/setup-computer.js +1 -1
  102. package/dist/commands/setup-fleet.js +3 -0
  103. package/dist/commands/setup-mine.d.ts +7 -3
  104. package/dist/commands/setup-mine.js +13 -8
  105. package/dist/commands/setup-secrets.js +2 -2
  106. package/dist/commands/setup-watchdog.js +2 -2
  107. package/dist/commands/setup.js +7 -2
  108. package/dist/commands/share.d.ts +65 -0
  109. package/dist/commands/share.js +253 -20
  110. package/dist/commands/skills.js +3 -3
  111. package/dist/commands/snapshot.d.ts +2 -2
  112. package/dist/commands/snapshot.js +9 -9
  113. package/dist/commands/ssh.d.ts +1 -1
  114. package/dist/commands/ssh.js +186 -64
  115. package/dist/commands/subagents.js +1 -1
  116. package/dist/commands/sync.js +24 -9
  117. package/dist/commands/teams.d.ts +2 -2
  118. package/dist/commands/teams.js +9 -18
  119. package/dist/commands/tmux.js +5 -1
  120. package/dist/commands/trash.js +1 -1
  121. package/dist/commands/usage.d.ts +1 -1
  122. package/dist/commands/usage.js +2 -2
  123. package/dist/commands/utils.d.ts +4 -14
  124. package/dist/commands/utils.js +6 -27
  125. package/dist/commands/versions.js +2 -2
  126. package/dist/commands/view.d.ts +9 -77
  127. package/dist/commands/view.js +23 -8
  128. package/dist/commands/watchdog.js +1 -1
  129. package/dist/commands/webhook.js +11 -25
  130. package/dist/commands/workflows.js +1 -1
  131. package/dist/index.js +1 -1
  132. package/dist/lib/account-capabilities.d.ts +39 -0
  133. package/dist/lib/account-capabilities.js +59 -0
  134. package/dist/lib/account-catalog.js +1 -1
  135. package/dist/lib/account-registry.d.ts +66 -0
  136. package/dist/lib/account-registry.js +151 -5
  137. package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
  138. package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
  139. package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
  140. package/dist/lib/{usage.js → accounting/usage.js} +11 -11
  141. package/dist/lib/agent-spec/provider.js +1 -1
  142. package/dist/lib/agents.d.ts +72 -4
  143. package/dist/lib/agents.js +231 -199
  144. package/dist/lib/answer-router.d.ts +2 -2
  145. package/dist/lib/ask-classifier.d.ts +1 -1
  146. package/dist/lib/ask-classifier.js +1 -1
  147. package/dist/lib/audit/log.js +1 -1
  148. package/dist/lib/auth-health.d.ts +1 -1
  149. package/dist/lib/auth-health.js +2 -2
  150. package/dist/lib/brand.js +1 -1
  151. package/dist/lib/browser/caller-identity.d.ts +28 -0
  152. package/dist/lib/browser/caller-identity.js +156 -0
  153. package/dist/lib/browser/cdp.js +1 -1
  154. package/dist/lib/browser/drivers/ssh.d.ts +1 -1
  155. package/dist/lib/browser/drivers/ssh.js +2 -2
  156. package/dist/lib/browser/hygiene.d.ts +10 -2
  157. package/dist/lib/browser/hygiene.js +7 -4
  158. package/dist/lib/browser/ipc.d.ts +22 -2
  159. package/dist/lib/browser/ipc.js +185 -21
  160. package/dist/lib/browser/profiles.d.ts +67 -3
  161. package/dist/lib/browser/profiles.js +129 -7
  162. package/dist/lib/browser/remote-control.d.ts +2 -2
  163. package/dist/lib/browser/remote-control.js +3 -3
  164. package/dist/lib/browser/runtime-state.d.ts +79 -0
  165. package/dist/lib/browser/runtime-state.js +119 -1
  166. package/dist/lib/browser/service.d.ts +113 -1
  167. package/dist/lib/browser/service.js +454 -40
  168. package/dist/lib/browser/sessions-list.d.ts +2 -1
  169. package/dist/lib/browser/sessions-list.js +4 -13
  170. package/dist/lib/browser/types.d.ts +18 -0
  171. package/dist/lib/budget/config.js +1 -1
  172. package/dist/lib/budget/ledger.js +1 -1
  173. package/dist/lib/byok-usage.js +1 -1
  174. package/dist/lib/capabilities.js +3 -15
  175. package/dist/lib/catchup.d.ts +1 -1
  176. package/dist/lib/catchup.js +1 -1
  177. package/dist/lib/cloud/dispatch.js +1 -1
  178. package/dist/lib/cloud/host.d.ts +3 -3
  179. package/dist/lib/cloud/host.js +5 -5
  180. package/dist/lib/cloud/rush.d.ts +9 -21
  181. package/dist/lib/cloud/rush.js +33 -120
  182. package/dist/lib/cloud/types.d.ts +2 -2
  183. package/dist/lib/commands.js +3 -13
  184. package/dist/lib/computer/actions.d.ts +36 -0
  185. package/dist/lib/computer/actions.js +162 -0
  186. package/dist/lib/computer/dispatch.d.ts +2 -2
  187. package/dist/lib/computer/dispatch.js +2 -2
  188. package/dist/lib/computer/sessions-list.d.ts +3 -3
  189. package/dist/lib/computer/sessions-list.js +2 -2
  190. package/dist/lib/config-keys.d.ts +2 -1
  191. package/dist/lib/config-keys.js +8 -4
  192. package/dist/lib/config-machine-keys.d.ts +4 -2
  193. package/dist/lib/config-machine-keys.js +5 -2
  194. package/dist/lib/crabbox/lease.js +9 -1
  195. package/dist/lib/crabbox/runtimes.d.ts +32 -7
  196. package/dist/lib/crabbox/runtimes.js +72 -30
  197. package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
  198. package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
  199. package/dist/lib/daemon-services.d.ts +1 -1
  200. package/dist/lib/daemon-services.js +5 -0
  201. package/dist/lib/daemon-ticks.d.ts +25 -0
  202. package/dist/lib/daemon-ticks.js +31 -1
  203. package/dist/lib/daemon-webhooks.d.ts +102 -0
  204. package/dist/lib/daemon-webhooks.js +210 -0
  205. package/dist/lib/device-config.d.ts +85 -75
  206. package/dist/lib/device-config.js +279 -141
  207. package/dist/lib/devices/config-migration.d.ts +29 -34
  208. package/dist/lib/devices/config-migration.js +209 -130
  209. package/dist/lib/devices/connect.d.ts +2 -2
  210. package/dist/lib/devices/connect.js +2 -2
  211. package/dist/lib/devices/discovery-policy.d.ts +30 -0
  212. package/dist/lib/devices/discovery-policy.js +101 -0
  213. package/dist/lib/devices/fleet-inventory.js +8 -3
  214. package/dist/lib/devices/harness-inventory.d.ts +1 -1
  215. package/dist/lib/devices/harness-inventory.js +12 -3
  216. package/dist/lib/devices/known-hosts.js +1 -1
  217. package/dist/lib/devices/pool.d.ts +10 -5
  218. package/dist/lib/devices/pool.js +5 -7
  219. package/dist/lib/devices/registry.d.ts +1 -1
  220. package/dist/lib/devices/registry.js +1 -1
  221. package/dist/lib/devices/resolve-profile.d.ts +2 -2
  222. package/dist/lib/devices/resolve-profile.js +2 -2
  223. package/dist/lib/devices/resolve-target.d.ts +1 -1
  224. package/dist/lib/devices/resolve-target.js +4 -4
  225. package/dist/lib/devices/self-host.d.ts +1 -1
  226. package/dist/lib/devices/self-host.js +3 -3
  227. package/dist/lib/devices/ssh-config.d.ts +1 -1
  228. package/dist/lib/devices/stats-cache.js +1 -1
  229. package/dist/lib/devices/sync.d.ts +3 -1
  230. package/dist/lib/devices/sync.js +3 -3
  231. package/dist/lib/doctor-diff.js +4 -4
  232. package/dist/lib/drift-sync.js +2 -2
  233. package/dist/lib/drift.js +2 -2
  234. package/dist/lib/event-families.d.ts +1 -1
  235. package/dist/lib/event-stream.d.ts +1 -1
  236. package/dist/lib/event-stream.js +2 -2
  237. package/dist/lib/events-ingest.js +2 -2
  238. package/dist/lib/exec.d.ts +4 -4
  239. package/dist/lib/exec.js +11 -11
  240. package/dist/lib/factory/snapshot.d.ts +1 -1
  241. package/dist/lib/factory/snapshot.js +1 -1
  242. package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
  243. package/dist/lib/{activity.js → feed/activity.js} +7 -7
  244. package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
  245. package/dist/lib/{events.js → feed/events.js} +5 -5
  246. package/dist/lib/{feed.js → feed/feed.js} +4 -4
  247. package/dist/lib/feed-outcome.d.ts +1 -1
  248. package/dist/lib/feed-policy.d.ts +1 -1
  249. package/dist/lib/feed-policy.js +1 -1
  250. package/dist/lib/feed-post.d.ts +1 -1
  251. package/dist/lib/feed-post.js +1 -1
  252. package/dist/lib/feed-ranking.d.ts +1 -1
  253. package/dist/lib/fleet/apply.d.ts +0 -6
  254. package/dist/lib/fleet/apply.js +18 -45
  255. package/dist/lib/fleet/auth-sync.d.ts +16 -35
  256. package/dist/lib/fleet/auth-sync.js +16 -75
  257. package/dist/lib/fleet/capture.js +8 -6
  258. package/dist/lib/fleet/manifest.js +23 -11
  259. package/dist/lib/fleet/types.d.ts +19 -7
  260. package/dist/lib/fleet-cache.d.ts +1 -1
  261. package/dist/lib/fleet-cache.js +1 -1
  262. package/dist/lib/format.d.ts +19 -0
  263. package/dist/lib/format.js +44 -1
  264. package/dist/lib/friction-heuristics.d.ts +1 -1
  265. package/dist/lib/git.d.ts +24 -1
  266. package/dist/lib/git.js +82 -38
  267. package/dist/lib/heal.js +3 -3
  268. package/dist/lib/hooks.d.ts +18 -0
  269. package/dist/lib/hooks.js +113 -1
  270. package/dist/lib/hosts/credentials.d.ts +30 -10
  271. package/dist/lib/hosts/credentials.js +38 -26
  272. package/dist/lib/hosts/dispatch.d.ts +3 -3
  273. package/dist/lib/hosts/dispatch.js +3 -3
  274. package/dist/lib/hosts/option.d.ts +3 -3
  275. package/dist/lib/hosts/option.js +7 -8
  276. package/dist/lib/hosts/passthrough.d.ts +17 -17
  277. package/dist/lib/hosts/passthrough.js +67 -50
  278. package/dist/lib/hosts/providers/devices.d.ts +1 -1
  279. package/dist/lib/hosts/providers/devices.js +1 -1
  280. package/dist/lib/hosts/reconcile.d.ts +1 -1
  281. package/dist/lib/hosts/reconcile.js +1 -1
  282. package/dist/lib/hosts/reconnect.d.ts +1 -1
  283. package/dist/lib/hosts/reconnect.js +2 -2
  284. package/dist/lib/hosts/registry.d.ts +5 -5
  285. package/dist/lib/hosts/registry.js +5 -5
  286. package/dist/lib/hosts/remote-cmd.d.ts +10 -10
  287. package/dist/lib/hosts/remote-cmd.js +25 -18
  288. package/dist/lib/hosts/remote-os.d.ts +4 -4
  289. package/dist/lib/hosts/remote-os.js +4 -4
  290. package/dist/lib/hosts/remote-session-id.d.ts +2 -2
  291. package/dist/lib/hosts/remote-session-id.js +2 -2
  292. package/dist/lib/hosts/routing-flag.d.ts +3 -3
  293. package/dist/lib/hosts/routing-flag.js +4 -5
  294. package/dist/lib/hosts/run-target.d.ts +4 -4
  295. package/dist/lib/hosts/run-target.js +4 -4
  296. package/dist/lib/hosts/session-index.d.ts +2 -2
  297. package/dist/lib/hosts/session-index.js +1 -1
  298. package/dist/lib/hosts/session-marker.d.ts +1 -1
  299. package/dist/lib/hosts/session-marker.js +1 -1
  300. package/dist/lib/hosts/types.d.ts +2 -2
  301. package/dist/lib/hosts/types.js +2 -2
  302. package/dist/lib/import.js +1 -1
  303. package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +13 -1
  304. package/dist/lib/{migrate.js → installations/migrate.js} +160 -40
  305. package/dist/lib/installations/resolve.js +1 -1
  306. package/dist/lib/installations/strategies.js +1 -1
  307. package/dist/lib/installations/update.js +2 -2
  308. package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
  309. package/dist/lib/{versions.js → installations/versions.js} +51 -31
  310. package/dist/lib/isolation-boundary-report.js +1 -1
  311. package/dist/lib/linear-projects.d.ts +28 -0
  312. package/dist/lib/linear-projects.js +30 -0
  313. package/dist/lib/loop.js +1 -1
  314. package/dist/lib/mailbox-gc.js +1 -1
  315. package/dist/lib/mailbox.js +1 -1
  316. package/dist/lib/mcp-registry.d.ts +62 -0
  317. package/dist/lib/mcp-registry.js +177 -0
  318. package/dist/lib/mcp.d.ts +5 -0
  319. package/dist/lib/mcp.js +124 -307
  320. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  321. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  322. package/dist/lib/menubar/install-menubar.d.ts +7 -0
  323. package/dist/lib/menubar/install-menubar.js +24 -6
  324. package/dist/lib/menubar/snapshot.d.ts +7 -0
  325. package/dist/lib/menubar/snapshot.js +8 -6
  326. package/dist/lib/models.js +1 -1
  327. package/dist/lib/monitors/config.d.ts +12 -0
  328. package/dist/lib/monitors/config.js +3 -0
  329. package/dist/lib/monitors/dispatch.js +26 -5
  330. package/dist/lib/monitors/engine.js +10 -0
  331. package/dist/lib/monitors/sources/webhook.d.ts +1 -1
  332. package/dist/lib/monitors/state.d.ts +42 -0
  333. package/dist/lib/monitors/state.js +30 -0
  334. package/dist/lib/notify.d.ts +1 -1
  335. package/dist/lib/observe-aliases.d.ts +2 -2
  336. package/dist/lib/observe-aliases.js +2 -11
  337. package/dist/lib/output/git-output.js +2 -2
  338. package/dist/lib/overdue.d.ts +1 -1
  339. package/dist/lib/overdue.js +1 -1
  340. package/dist/lib/permissions-registry.d.ts +65 -0
  341. package/dist/lib/permissions-registry.js +599 -0
  342. package/dist/lib/permissions.d.ts +24 -13
  343. package/dist/lib/permissions.js +52 -271
  344. package/dist/lib/picker.d.ts +16 -0
  345. package/dist/lib/picker.js +33 -3
  346. package/dist/lib/placement.d.ts +1 -1
  347. package/dist/lib/placement.js +4 -4
  348. package/dist/lib/platform/paths.d.ts +8 -0
  349. package/dist/lib/platform/paths.js +11 -0
  350. package/dist/lib/platform/posixpath.js +3 -3
  351. package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
  352. package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
  353. package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
  354. package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
  355. package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
  356. package/dist/lib/{skills.js → plugins/skills.js} +7 -7
  357. package/dist/lib/pricing/cost.d.ts +1 -1
  358. package/dist/lib/pricing/cost.js +1 -1
  359. package/dist/lib/profiles-presets.d.ts +1 -1
  360. package/dist/lib/profiles-presets.js +1 -1
  361. package/dist/lib/profiles.js +2 -2
  362. package/dist/lib/project-import.js +4 -1
  363. package/dist/lib/project-launch.d.ts +1 -1
  364. package/dist/lib/project-launch.js +3 -3
  365. package/dist/lib/project-pull.d.ts +128 -0
  366. package/dist/lib/project-pull.js +384 -0
  367. package/dist/lib/project-root.d.ts +2 -2
  368. package/dist/lib/project-root.js +2 -2
  369. package/dist/lib/project-status.js +1 -1
  370. package/dist/lib/projects.d.ts +23 -0
  371. package/dist/lib/projects.js +29 -6
  372. package/dist/lib/refresh.d.ts +12 -1
  373. package/dist/lib/refresh.js +16 -9
  374. package/dist/lib/registry.d.ts +9 -2
  375. package/dist/lib/registry.js +11 -4
  376. package/dist/lib/resources.d.ts +2 -2
  377. package/dist/lib/resources.js +2 -2
  378. package/dist/lib/routers.d.ts +81 -0
  379. package/dist/lib/routers.js +153 -0
  380. package/dist/lib/routine-context.d.ts +1 -0
  381. package/dist/lib/routine-context.js +7 -2
  382. package/dist/lib/routine-notify-owner.d.ts +1 -1
  383. package/dist/lib/routine-notify.d.ts +1 -1
  384. package/dist/lib/routine-notify.js +1 -1
  385. package/dist/lib/routine-process-cleanup.d.ts +1 -1
  386. package/dist/lib/routine-readiness.d.ts +1 -1
  387. package/dist/lib/routine-readiness.js +11 -4
  388. package/dist/lib/routines-placement.d.ts +12 -2
  389. package/dist/lib/routines-placement.js +20 -3
  390. package/dist/lib/routines-project.d.ts +1 -1
  391. package/dist/lib/routines-project.js +1 -1
  392. package/dist/lib/rules/compile.d.ts +1 -0
  393. package/dist/lib/rules/compile.js +10 -2
  394. package/dist/lib/rules/rules.js +1 -1
  395. package/dist/lib/run-notify.js +1 -1
  396. package/dist/lib/runner.d.ts +80 -2
  397. package/dist/lib/runner.js +241 -62
  398. package/dist/lib/sandbox.d.ts +1 -1
  399. package/dist/lib/scheduler.d.ts +1 -1
  400. package/dist/lib/scheduler.js +1 -1
  401. package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
  402. package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
  403. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  404. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  405. package/dist/lib/secrets/agent.js +2 -2
  406. package/dist/lib/secrets/audit.js +1 -1
  407. package/dist/lib/secrets/bundles.d.ts +3 -3
  408. package/dist/lib/secrets/bundles.js +7 -7
  409. package/dist/lib/secrets/index.js +1 -1
  410. package/dist/lib/secrets/list-filter.d.ts +1 -1
  411. package/dist/lib/secrets/list-filter.js +2 -2
  412. package/dist/lib/secrets/push.d.ts +1 -1
  413. package/dist/lib/secrets/push.js +10 -12
  414. package/dist/lib/secrets/remote.d.ts +12 -10
  415. package/dist/lib/secrets/remote.js +21 -14
  416. package/dist/lib/secrets/vault.js +2 -2
  417. package/dist/lib/self-heal/checks/shadowing.js +1 -1
  418. package/dist/lib/self-heal/checks/shims.js +1 -1
  419. package/dist/lib/self-update.d.ts +39 -4
  420. package/dist/lib/self-update.js +78 -25
  421. package/dist/lib/serve/control.d.ts +1 -1
  422. package/dist/lib/serve/control.js +4 -4
  423. package/dist/lib/serve/data.d.ts +1 -1
  424. package/dist/lib/serve/data.js +1 -1
  425. package/dist/lib/serve/stream.js +1 -1
  426. package/dist/lib/service-manifest.d.ts +29 -0
  427. package/dist/lib/service-manifest.js +80 -0
  428. package/dist/lib/session/active.d.ts +59 -7
  429. package/dist/lib/session/active.js +158 -17
  430. package/dist/lib/session/bash-command.js +1 -1
  431. package/dist/lib/session/claude-accounts.d.ts +1 -1
  432. package/dist/lib/session/claude-accounts.js +1 -1
  433. package/dist/lib/session/db.d.ts +10 -2
  434. package/dist/lib/session/db.js +25 -6
  435. package/dist/lib/session/discover.d.ts +77 -0
  436. package/dist/lib/session/discover.js +130 -25
  437. package/dist/lib/session/fork.js +1 -1
  438. package/dist/lib/session/inject.d.ts +1 -1
  439. package/dist/lib/session/insights.d.ts +1 -1
  440. package/dist/lib/session/insights.js +1 -1
  441. package/dist/lib/session/live-metadata.d.ts +15 -0
  442. package/dist/lib/session/live-metadata.js +76 -0
  443. package/dist/lib/session/migrate-targets.d.ts +1 -1
  444. package/dist/lib/session/recovery.d.ts +1 -1
  445. package/dist/lib/session/recovery.js +2 -2
  446. package/dist/lib/session/remote-active.d.ts +10 -1
  447. package/dist/lib/session/remote-active.js +8 -3
  448. package/dist/lib/session/remote-bundle.d.ts +1 -1
  449. package/dist/lib/session/remote-bundle.js +2 -2
  450. package/dist/lib/session/remote-list.d.ts +15 -4
  451. package/dist/lib/session/remote-list.js +40 -3
  452. package/dist/lib/session/remote.d.ts +5 -5
  453. package/dist/lib/session/remote.js +13 -17
  454. package/dist/lib/session/resume-command.d.ts +3 -2
  455. package/dist/lib/session/resume-command.js +4 -3
  456. package/dist/lib/session/resume-owner.d.ts +3 -3
  457. package/dist/lib/session/resume-owner.js +3 -3
  458. package/dist/lib/session/session-cache.d.ts +12 -0
  459. package/dist/lib/session/session-cache.js +2 -0
  460. package/dist/lib/session/shell-programs.js +1 -1
  461. package/dist/lib/session/state.js +5 -5
  462. package/dist/lib/session/team-filter.d.ts +1 -1
  463. package/dist/lib/session/team-filter.js +1 -1
  464. package/dist/lib/session/types.d.ts +3 -3
  465. package/dist/lib/session/width.d.ts +2 -2
  466. package/dist/lib/session/width.js +2 -2
  467. package/dist/lib/share/delete.d.ts +21 -0
  468. package/dist/lib/share/delete.js +42 -0
  469. package/dist/lib/share/publish.d.ts +82 -0
  470. package/dist/lib/share/publish.js +170 -18
  471. package/dist/lib/share/worker-template.js +172 -9
  472. package/dist/lib/shims.js +35 -7
  473. package/dist/lib/smart-launch.d.ts +4 -4
  474. package/dist/lib/smart-launch.js +6 -4
  475. package/dist/lib/snapshot.d.ts +4 -4
  476. package/dist/lib/snapshot.js +2 -2
  477. package/dist/lib/ssh-exec.d.ts +1 -1
  478. package/dist/lib/ssh-exec.js +2 -2
  479. package/dist/lib/ssh-tunnel.d.ts +10 -10
  480. package/dist/lib/ssh-tunnel.js +12 -12
  481. package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
  482. package/dist/lib/staleness/checkers/hooks.js +1 -1
  483. package/dist/lib/staleness/detectors/permissions.js +0 -23
  484. package/dist/lib/staleness/detectors/plugins.js +1 -1
  485. package/dist/lib/staleness/fingerprint.js +1 -1
  486. package/dist/lib/staleness/layers.d.ts +1 -1
  487. package/dist/lib/staleness/layers.js +1 -1
  488. package/dist/lib/staleness/writers/mcp.js +3 -1
  489. package/dist/lib/staleness/writers/plugins.js +1 -1
  490. package/dist/lib/staleness/writers/types.d.ts +8 -0
  491. package/dist/lib/startup/command-registry.d.ts +5 -147
  492. package/dist/lib/startup/command-registry.js +38 -303
  493. package/dist/lib/startup/dev-build.d.ts +0 -21
  494. package/dist/lib/startup/dev-build.js +29 -8
  495. package/dist/lib/state.d.ts +19 -1
  496. package/dist/lib/state.js +120 -51
  497. package/dist/lib/subagents.js +1 -1
  498. package/dist/lib/sync-status.js +1 -1
  499. package/dist/lib/sync-umbrella.d.ts +6 -1
  500. package/dist/lib/sync-umbrella.js +9 -4
  501. package/dist/lib/teams/agents.js +2 -2
  502. package/dist/lib/teams/registry.js +1 -1
  503. package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
  504. package/dist/lib/terminal/engine.js +1 -1
  505. package/dist/lib/terminal/index.d.ts +4 -0
  506. package/dist/lib/terminal/index.js +3 -0
  507. package/dist/lib/terminal/inject.d.ts +2 -2
  508. package/dist/lib/terminal/inject.js +2 -2
  509. package/dist/lib/terminal/transport.js +1 -1
  510. package/dist/lib/tmux/index.d.ts +1 -1
  511. package/dist/lib/tmux/index.js +1 -1
  512. package/dist/lib/tmux/session.d.ts +21 -5
  513. package/dist/lib/tmux/session.js +76 -22
  514. package/dist/lib/triggers/handlers.d.ts +1 -1
  515. package/dist/lib/triggers/handlers.js +2 -2
  516. package/dist/lib/triggers/webhook.d.ts +36 -2
  517. package/dist/lib/triggers/webhook.js +97 -42
  518. package/dist/lib/types.d.ts +18 -6
  519. package/dist/lib/usage-fleet.d.ts +1 -1
  520. package/dist/lib/usage-fleet.js +1 -1
  521. package/dist/lib/usage-refresh.d.ts +1 -1
  522. package/dist/lib/usage-refresh.js +3 -3
  523. package/dist/lib/version-duplicates.js +2 -2
  524. package/dist/lib/view-types.d.ts +56 -0
  525. package/dist/lib/view-types.js +1 -0
  526. package/dist/lib/watchdog/rotate.d.ts +2 -2
  527. package/dist/lib/watchdog/rotate.js +3 -3
  528. package/dist/lib/watchdog/runner.d.ts +2 -3
  529. package/dist/lib/watchdog/runner.js +3 -4
  530. package/dist/lib/workflows.js +1 -1
  531. package/package.json +2 -1
  532. package/scripts/postinstall.js +2 -2
  533. package/dist/commands/bench.d.ts +0 -2
  534. package/dist/commands/bench.js +0 -101
  535. package/dist/commands/cp.d.ts +0 -84
  536. package/dist/commands/cp.js +0 -231
  537. package/dist/commands/login.d.ts +0 -2
  538. package/dist/lib/resources/commands.d.ts +0 -46
  539. package/dist/lib/resources/commands.js +0 -211
  540. package/dist/lib/resources/hooks.d.ts +0 -16
  541. package/dist/lib/resources/hooks.js +0 -153
  542. package/dist/lib/resources/mcp.d.ts +0 -34
  543. package/dist/lib/resources/mcp.js +0 -250
  544. package/dist/lib/resources/memory.d.ts +0 -15
  545. package/dist/lib/resources/memory.js +0 -46
  546. package/dist/lib/resources/permissions.d.ts +0 -13
  547. package/dist/lib/resources/permissions.js +0 -202
  548. package/dist/lib/resources/rules.d.ts +0 -46
  549. package/dist/lib/resources/rules.js +0 -179
  550. package/dist/lib/resources/skills.d.ts +0 -37
  551. package/dist/lib/resources/skills.js +0 -247
  552. package/dist/lib/resources/subagents.d.ts +0 -46
  553. package/dist/lib/resources/subagents.js +0 -202
  554. /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
@@ -8,23 +8,24 @@ import * as fs from 'fs';
8
8
  import * as path from 'path';
9
9
  import * as os from 'os';
10
10
  import * as yaml from 'yaml';
11
- import { stringifyDoc } from './yaml-io.js';
11
+ import { stringifyDoc } from '../yaml-io.js';
12
12
  import { execSync } from 'child_process';
13
- import { atomicWriteFileSync } from './fs-atomic.js';
14
- import { machineId } from './machine-id.js';
15
- import { AGENTS, agentConfigDirName, findInPath } from './agents.js';
16
- import { createLink } from './platform/index.js';
17
- import { foldLegacySystemRepo, copyDirSkipExisting } from './migrate-fold.js';
18
- export { foldLegacySystemRepo } from './migrate-fold.js';
19
- import { migrateLegacyRoutineActivation, listJobs, validateJob } from './routines.js';
20
- import { setConfigValue } from './device-config.js';
21
- import { enabledRoutineNames, replaceEnabledRoutines } from './routine-activation.js';
22
- import { evaluateActivationReadiness } from './routine-readiness.js';
23
- import { migrateDeviceConfigToCentral } from './devices/config-migration.js';
13
+ import { atomicWriteFileSync } from '../fs-atomic.js';
14
+ import { machineId } from '../machine-id.js';
15
+ import { AGENTS, agentConfigDirName, findInPath } from '../agents.js';
16
+ import { createLink } from '../platform/index.js';
17
+ import { foldLegacySystemRepo, copyDirSkipExisting } from '../migrate-fold.js';
18
+ export { foldLegacySystemRepo } from '../migrate-fold.js';
19
+ import { migrateLegacyRoutineActivation, listJobs, validateJob } from '../scheduling/routines.js';
20
+ import { setConfigValue } from '../device-config.js';
21
+ import { enabledRoutineNames, replaceEnabledRoutines } from '../routine-activation.js';
22
+ import { evaluateActivationReadiness } from '../routine-readiness.js';
23
+ import { migrateDeviceConfigStores } from '../devices/config-migration.js';
24
24
  // Two constants only, never the read/write API — migrations still operate on raw
25
25
  // YAML so they never take the meta lock or prime the meta cache mid-migration.
26
- import { DEFAULT_BROWSER_PROFILE_NAME } from './browser/profiles.js';
27
- import { META_HEADER as DEVICE_META_HEADER } from './state.js';
26
+ import { DEFAULT_BROWSER_PROFILE_NAME } from '../browser/profiles.js';
27
+ import { META_HEADER as DEVICE_META_HEADER } from '../state.js';
28
+ import { COMPILED_HEADER_PROJECT } from '../rules/compile.js';
28
29
  const HOME = process.env.HOME ?? os.homedir();
29
30
  const USER_DIR = path.join(HOME, '.agents');
30
31
  /** Canonical system-repo location (post-fold). */
@@ -644,11 +645,28 @@ function migratePermissionSetsToPresets() {
644
645
  * switching is owned by `agents use`, not the migrator.
645
646
  */
646
647
  function repairAgentConfigSymlinks() {
647
- // Version pins live in the per-device file post-split (~/.agents/devices/<machine>/
648
- // agents.yaml); central agents.yaml may still carry them mid-transition. Read
649
- // device first (authoritative), then central, first-seen-agent wins.
648
+ // Version pins live in the machine-local pins JSON (~/.agents/.history/
649
+ // devices/pins-<machine>.json); the tracked device doc and central
650
+ // agents.yaml may still carry them mid-transition. Read pins first
651
+ // (authoritative), then the legacy locations, first-seen-agent wins.
650
652
  const defaults = [];
651
- const collectPins = (file) => {
653
+ const seen = new Set();
654
+ const collectJsonPins = (file) => {
655
+ let pins;
656
+ try {
657
+ pins = JSON.parse(fs.readFileSync(file, 'utf-8'));
658
+ }
659
+ catch {
660
+ return;
661
+ }
662
+ for (const [agent, version] of Object.entries(pins?.agents ?? {})) {
663
+ if (!seen.has(agent)) {
664
+ seen.add(agent);
665
+ defaults.push({ agent, version });
666
+ }
667
+ }
668
+ };
669
+ const collectYamlPins = (file) => {
652
670
  let text;
653
671
  try {
654
672
  text = fs.readFileSync(file, 'utf-8');
@@ -661,12 +679,15 @@ function repairAgentConfigSymlinks() {
661
679
  return;
662
680
  for (const line of block[1].split('\n')) {
663
681
  const m = line.match(/^\s+([a-z][a-z0-9_-]*):\s*([^\s#]+)/);
664
- if (m && !defaults.some((d) => d.agent === m[1]))
682
+ if (m && !seen.has(m[1])) {
683
+ seen.add(m[1]);
665
684
  defaults.push({ agent: m[1], version: m[2] });
685
+ }
666
686
  }
667
687
  };
668
- collectPins(path.join(USER_DIR, 'devices', machineId(), 'agents.yaml'));
669
- collectPins(path.join(USER_DIR, 'agents.yaml'));
688
+ collectJsonPins(path.join(USER_DIR, '.history', 'devices', `pins-${machineId()}.json`));
689
+ collectYamlPins(path.join(USER_DIR, 'devices', machineId(), 'agents.yaml'));
690
+ collectYamlPins(path.join(USER_DIR, 'agents.yaml'));
670
691
  if (defaults.length === 0)
671
692
  return;
672
693
  let repaired = 0;
@@ -1131,7 +1152,7 @@ async function mergeSqliteDb(src, dest) {
1131
1152
  // every user table. Dynamic import keeps the sqlite shim off the hot path
1132
1153
  // for CLI starts that don't actually need a merge.
1133
1154
  try {
1134
- const sqliteMod = (await import('./sqlite.js'));
1155
+ const sqliteMod = (await import('../sqlite.js'));
1135
1156
  const Database = sqliteMod.default;
1136
1157
  const db = new Database(dest);
1137
1158
  try {
@@ -1628,8 +1649,8 @@ function migrateVersionResourcesToPatterns() {
1628
1649
  /**
1629
1650
  * Split the machine-local fields out of the committed central agents.yaml so it
1630
1651
  * becomes portable and syncs cleanly (no more skip-worktree band-aid):
1631
- * agents: -> ~/.agents/devices/<machineId>/agents.yaml (committed, per-device)
1632
- * versions: -> ~/.agents/.history/version-resources.json (gitignored, machine-local)
1652
+ * agents: -> ~/.agents/.history/devices/pins-<machineId>.json (untracked, machine-local)
1653
+ * versions: -> ~/.agents/.history/version-resources.json (gitignored, machine-local)
1633
1654
  * Then clear any externally-set skip-worktree bit. Idempotent: no-op once central
1634
1655
  * carries neither field. Operates on raw YAML (never through state.ts).
1635
1656
  */
@@ -1651,18 +1672,16 @@ function migrateSplitDeviceLocalMeta() {
1651
1672
  // Only rewrite central when it actually carries machine-local fields — a
1652
1673
  // machine whose agents.yaml is already portable-only is left untouched.
1653
1674
  if (hasLocal) {
1654
- // agents: -> per-device file (merge, existing device entries win).
1675
+ // agents: -> machine-local pins JSON (merge, existing pins win).
1655
1676
  if (agents && Object.keys(agents).length > 0) {
1656
- const devicePath = path.join(USER_DIR, 'devices', machineId(), 'agents.yaml');
1677
+ const pinsPath = path.join(USER_DIR, '.history', 'devices', `pins-${machineId()}.json`);
1657
1678
  let existing = {};
1658
1679
  try {
1659
- const dm = yaml.parse(fs.readFileSync(devicePath, 'utf-8'));
1660
- if (dm?.agents)
1661
- existing = dm.agents;
1680
+ existing = JSON.parse(fs.readFileSync(pinsPath, 'utf-8')) || {};
1662
1681
  }
1663
1682
  catch { /* absent */ }
1664
- fs.mkdirSync(path.dirname(devicePath), { recursive: true });
1665
- atomicWriteFileSync(devicePath, HEADER + yaml.stringify({ agents: { ...agents, ...existing } }));
1683
+ fs.mkdirSync(path.dirname(pinsPath), { recursive: true });
1684
+ atomicWriteFileSync(pinsPath, JSON.stringify({ ...existing, agents: { ...agents, ...existing.agents } }, null, 2) + '\n');
1666
1685
  }
1667
1686
  // versions: -> machine-local history JSON (merge, existing wins).
1668
1687
  if (versions && Object.keys(versions).length > 0) {
@@ -1676,7 +1695,7 @@ function migrateSplitDeviceLocalMeta() {
1676
1695
  atomicWriteFileSync(vrPath, JSON.stringify({ ...versions, ...existing }, null, 2) + '\n');
1677
1696
  }
1678
1697
  // Strip machine-local fields from central and rewrite (portable only) — after
1679
- // the device/history writes above, so a crash never loses data.
1698
+ // the pins/history writes above, so a crash never loses data.
1680
1699
  delete meta.agents;
1681
1700
  delete meta.versions;
1682
1701
  atomicWriteFileSync(metaFile, HEADER + yaml.stringify(meta));
@@ -1689,7 +1708,7 @@ function migrateSplitDeviceLocalMeta() {
1689
1708
  }
1690
1709
  catch { /* not a git repo / bit not set */ }
1691
1710
  if (hasLocal) {
1692
- console.error('Split agents.yaml: agents: -> devices/, versions: -> .history/version-resources.json');
1711
+ console.error('Split agents.yaml: agents: -> .history/devices/pins-*.json, versions: -> .history/version-resources.json');
1693
1712
  }
1694
1713
  }
1695
1714
  /**
@@ -2361,6 +2380,88 @@ export function migrateKimiSubagentsToMarkdown(versionsDir) {
2361
2380
  console.error(`Removed ${removed} pre-markdown Kimi subagent file(s); run 'agents sync kimi' to write the new format`);
2362
2381
  }
2363
2382
  }
2383
+ /**
2384
+ * Remove the compiled "project" ruleset the compiler used to write into $HOME
2385
+ * (RUSH-2725). `compileRulesForProject` treated any cwd with `.agents/rules`
2386
+ * as a project — and the user layer at ~/.agents satisfies that test — so it
2387
+ * wrote ~/AGENTS.md plus per-agent symlinks, and every session under $HOME
2388
+ * then loaded the entire ruleset twice (global memory + "project" memory).
2389
+ * The compiler now refuses reserved roots; this removes the artifact already
2390
+ * on disk. Only files we provably own are touched: an AGENTS.md carrying the
2391
+ * compiled-project header, symlinks pointing at it, and copy-fallback files
2392
+ * (symlink-less filesystems) carrying the same header.
2393
+ */
2394
+ export function removeHomeCompiledProjectRules(homeDir = HOME) {
2395
+ const agentsPath = path.join(homeDir, 'AGENTS.md');
2396
+ let agentsLstat;
2397
+ try {
2398
+ agentsLstat = fs.lstatSync(agentsPath);
2399
+ }
2400
+ catch {
2401
+ return;
2402
+ }
2403
+ if (!agentsLstat.isFile())
2404
+ return;
2405
+ let content = '';
2406
+ try {
2407
+ content = fs.readFileSync(agentsPath, 'utf8');
2408
+ }
2409
+ catch {
2410
+ return;
2411
+ }
2412
+ if (!content.startsWith(COMPILED_HEADER_PROJECT))
2413
+ return;
2414
+ const seen = new Set(['AGENTS.md']);
2415
+ for (const agent of Object.values(AGENTS)) {
2416
+ const fname = agent.instructionsFile;
2417
+ if (seen.has(fname) || fname.includes('/') || fname.includes('\\'))
2418
+ continue;
2419
+ seen.add(fname);
2420
+ const linkPath = path.join(homeDir, fname);
2421
+ let lstat;
2422
+ try {
2423
+ lstat = fs.lstatSync(linkPath);
2424
+ }
2425
+ catch {
2426
+ continue;
2427
+ }
2428
+ if (lstat.isSymbolicLink()) {
2429
+ let target = '';
2430
+ try {
2431
+ target = fs.readlinkSync(linkPath);
2432
+ }
2433
+ catch {
2434
+ continue;
2435
+ }
2436
+ if (target === 'AGENTS.md') {
2437
+ try {
2438
+ fs.unlinkSync(linkPath);
2439
+ }
2440
+ catch { /* next run retries */ }
2441
+ }
2442
+ }
2443
+ else if (lstat.isFile()) {
2444
+ // Symlink-less filesystems got a copy of AGENTS.md instead — same header.
2445
+ let copy = '';
2446
+ try {
2447
+ copy = fs.readFileSync(linkPath, 'utf8');
2448
+ }
2449
+ catch {
2450
+ continue;
2451
+ }
2452
+ if (copy.startsWith(COMPILED_HEADER_PROJECT)) {
2453
+ try {
2454
+ fs.unlinkSync(linkPath);
2455
+ }
2456
+ catch { /* next run retries */ }
2457
+ }
2458
+ }
2459
+ }
2460
+ try {
2461
+ fs.unlinkSync(agentsPath);
2462
+ }
2463
+ catch { /* next run retries */ }
2464
+ }
2364
2465
  /** Run all idempotent migrations. Safe to call multiple times. */
2365
2466
  export async function runMigration() {
2366
2467
  // MUST run first: every other migrator reads SYSTEM_DIR (the new path).
@@ -2406,13 +2507,14 @@ export async function runMigration() {
2406
2507
  // migrateSplitDeviceLocalMeta so the device file is already in its canonical
2407
2508
  // location before this merges an entry into it.
2408
2509
  migrateMachineLocalBrowserProfileOutOfCentral();
2409
- // Fold per-device operator config (device-doc config:/defaultBrowserProfile
2410
- // and .history/devices/auto-launch.json) into the central
2411
- // fleet.devices.<name>.config block. After migrateSplitDeviceLocalMeta so the
2412
- // device docs are in their canonical location. Also invoked on daemon boot
2413
- // and on the first device-config read/write in a process, so sentinel'd
2414
- // installs (which skip this whole run) still converge.
2415
- migrateDeviceConfigToCentral();
2510
+ // Converge the device-config/pins stores: fold the central
2511
+ // fleet.devices.<name>.config block + legacy auto-launch.json into the
2512
+ // per-device docs' config:, and extract pins from tracked docs into the
2513
+ // untracked pins JSON. After migrateSplitDeviceLocalMeta so the pins file is
2514
+ // in its canonical location. Also invoked on daemon boot and on the first
2515
+ // device-config read/write in a process, so sentinel'd installs (which skip
2516
+ // this whole run) still converge.
2517
+ migrateDeviceConfigStores();
2416
2518
  // Bucket moves: collapse runtime state into ~/.agents/.history and ~/.agents/.cache.
2417
2519
  migrateRuntimeToHistory();
2418
2520
  migrateLegacySessionMarkersToBookmarks();
@@ -2450,6 +2552,10 @@ export async function runMigration() {
2450
2552
  // Fold the legacy watchdog enable sentinel into `watchdog.enabled` config so a
2451
2553
  // user who opted in under the old build stays opted in after upgrading.
2452
2554
  migrateWatchdogSentinelToConfig();
2555
+ // Delete the compiled "project" ruleset older builds wrote into $HOME — the
2556
+ // duplicate-injection artifact of RUSH-2725. The compiler no longer writes
2557
+ // it; this cleans up what is already on every machine.
2558
+ removeHomeCompiledProjectRules();
2453
2559
  // Deactivate any routine whose execution context no longer resolves ready, so
2454
2560
  // an anchor-less agent/workflow routine cannot keep firing-and-failing after the
2455
2561
  // fold (RUSH-2290). Runs AFTER the tick/watchdog routines are added so those
@@ -2461,4 +2567,18 @@ export async function runMigration() {
2461
2567
  // infinite-exec-loop). Also runs after the bucket moves so it scans the
2462
2568
  // canonical HISTORY_DIR/versions tree.
2463
2569
  repairSelfReferentialBinShims();
2570
+ // Version-skew one-shot (RUSH-2435): retrofit the current pane-died hook
2571
+ // onto any managed tmux session an older binary left with a stale one. Runs
2572
+ // at upgrade time in addition to the daemon-startup call (daemon.ts) so a
2573
+ // machine that upgrades without immediately restarting its daemon still
2574
+ // repairs on the next `agents` invocation. Idempotent/non-destructive.
2575
+ try {
2576
+ const { reconcileSessionHooks } = await import('../tmux/session.js');
2577
+ const { isTmuxInstalled } = await import('../tmux/binary.js');
2578
+ if (isTmuxInstalled())
2579
+ await reconcileSessionHooks();
2580
+ }
2581
+ catch {
2582
+ // best-effort — a migration must never fail because tmux wasn't reachable
2583
+ }
2464
2584
  }
@@ -1,5 +1,5 @@
1
1
  import { AGENTS } from '../agents.js';
2
- import { getGlobalDefault } from '../versions.js';
2
+ import { getGlobalDefault } from './versions.js';
3
3
  import { listInstallations } from './store.js';
4
4
  /**
5
5
  * Addressing a frozen installation.
@@ -6,7 +6,7 @@ import * as path from 'path';
6
6
  import { AGENTS, findInPath, isSelfUpdatingAgent } from '../agents.js';
7
7
  import { VERSION_RE } from '../agent-spec/primitives.js';
8
8
  import { importInstallScriptBinary } from '../import.js';
9
- import { getBinaryPath, getLatestNpmVersion, getOldestNpmVersion, getLiveVersion, getVersionHomePath, invalidateLiveVersionCache, isGlobalBinaryAgent, } from '../versions.js';
9
+ import { getBinaryPath, getLatestNpmVersion, getOldestNpmVersion, getLiveVersion, getVersionHomePath, invalidateLiveVersionCache, isGlobalBinaryAgent, } from './versions.js';
10
10
  import { installationDir } from './store.js';
11
11
  const execAsync = promisify(exec);
12
12
  const execFileAsync = promisify(execFile);
@@ -1,7 +1,7 @@
1
1
  import * as fs from 'fs';
2
2
  import { AGENTS, isAgentHardDeprecated, hardDeprecationError } from '../agents.js';
3
- import { emit } from '../events.js';
4
- import { getBinaryPath, invalidateInstalledVersionsCache, invalidateLiveVersionCache, verifyBinaryLaunches, } from '../versions.js';
3
+ import { emit } from '../feed/events.js';
4
+ import { getBinaryPath, invalidateInstalledVersionsCache, invalidateLiveVersionCache, verifyBinaryLaunches, } from './versions.js';
5
5
  import { assertValidRelease, selectUpdateStrategy, } from './strategies.js';
6
6
  import { listInstallations, recordRelease } from './store.js';
7
7
  /**
@@ -1,6 +1,6 @@
1
- import type { AgentId } from './types.js';
2
- import { compareVersions } from './agent-spec/primitives.js';
3
- import { type PrunableKind } from './staleness/prune.js';
1
+ import type { AgentId } from '../types.js';
2
+ import { compareVersions } from '../agent-spec/primitives.js';
3
+ import { type PrunableKind } from '../staleness/prune.js';
4
4
  /**
5
5
  * Resource selection for syncing to a version.
6
6
  * Each field can be:
@@ -519,6 +519,15 @@ export interface SyncResult {
519
519
  * repo-scope reconcile that ran the prune pass; empty otherwise.
520
520
  */
521
521
  pruned: Record<PrunableKind, string[]>;
522
+ /**
523
+ * Resources this sync refused to write, as user-facing sentences (RUSH-2677).
524
+ *
525
+ * An empty `mcp`/`subagents`/… list means "nothing to write"; it cannot also
526
+ * mean "declined and here is why", which is how a harness with no config
527
+ * writer reported a clean sync while writing nothing. The rendering command
528
+ * MUST surface these — a decline nobody prints is the silent no-op again.
529
+ */
530
+ declined: string[];
522
531
  }
523
532
  /**
524
533
  * Enumerate the DotAgent repo names that resources can be scoped to:
@@ -21,36 +21,36 @@ import { exec, execFile } from 'child_process';
21
21
  import { promisify } from 'util';
22
22
  import chalk from 'chalk';
23
23
  import { checkbox, select } from '@inquirer/prompts';
24
- import { getVersionsDir, ensureAgentsDir, readMeta, writeMeta, getSkillsDir, getResolvedRulesDir, getUserRulesDir, getVersionResources, ensureVersionResourcePatterns, getProjectAgentsDir, getPromptcutsPath, getUserPromptcutsPath, getEnabledExtraRepos, getAgentsDir, getUserAgentsDir, getTrashVersionsDir, getActiveRulesPreset, getHomeDir } from './state.js';
25
- import { defaultPatterns, expandPatterns } from './resource-patterns.js';
26
- import { listResources } from './resources.js';
27
- import { activeRulesPreset, filterNamesForActiveResourceProfile } from './resource-profiles.js';
24
+ import { getVersionsDir, ensureAgentsDir, readMeta, writeMeta, getSkillsDir, getResolvedRulesDir, getUserRulesDir, getVersionResources, ensureVersionResourcePatterns, getProjectAgentsDir, getPromptcutsPath, getUserPromptcutsPath, getEnabledExtraRepos, getAgentsDir, getUserAgentsDir, getTrashVersionsDir, getActiveRulesPreset, getHomeDir } from '../state.js';
25
+ import { defaultPatterns, expandPatterns } from '../resource-patterns.js';
26
+ import { listResources } from '../resources.js';
27
+ import { activeRulesPreset, filterNamesForActiveResourceProfile } from '../resource-profiles.js';
28
28
  // VERSION_RE + compareVersions are owned by the agent-spec engine primitives
29
29
  // (single source of truth). Re-exported below so existing importers of
30
30
  // `compareVersions` from './versions.js' keep working.
31
- import { VERSION_RE, compareVersions } from './agent-spec/primitives.js';
32
- import { AGENTS, agentConfigDirName, getAccountEmail, resolveAgentName, formatAgentError, findInPath, isSelfUpdatingAgent, isAgentHardDeprecated, hardDeprecationError } from './agents.js';
33
- import { discoverPermissionGroups, getActivePermissionPresetName, readPermissionPresetRecipe, PERMISSION_PRESET_ENV_VAR } from './permissions.js';
34
- import { parseMcpConfigForScan, isProjectMcpTrusted } from './mcp.js';
35
- import { createVersionedAlias, removeVersionedAlias, getConfigSymlinkVersion, ensureClaudeInsideSymlink, assertIsolationBoundary, } from './shims.js';
36
- import { importInstallScriptBinary } from './import.js';
37
- import { createInstallation } from './installations/store.js';
38
- import { INSTALLATION_RECORD_FILE } from './installations/types.js';
39
- import { IS_WINDOWS, composeWin32CommandLine } from './platform/index.js';
40
- import { listInstalledSubagents } from './subagents.js';
41
- import { listInstalledWorkflows } from './workflows.js';
42
- import { parseHookManifest, registerHooksToSettings, selectHookManifest, pruneVersionHomeHookEntriesFromSettings } from './hooks.js';
43
- import { supports, explainSkip } from './capabilities.js';
44
- import { discoverPlugins, syncPluginToVersion, pluginSupportsAgent, cleanOrphanedPluginSkills, marketplaceSpecForName } from './plugins.js';
45
- import { loadManifest, saveManifest, buildManifest as buildSyncManifest, isStale } from './staleness/index.js';
46
- import { pruneRemovedResources } from './staleness/prune.js';
47
- import { emit } from './events.js';
48
- import { safeJoin } from './paths.js';
49
- import { readSkillSourceCommandMarker, shouldAlsoInstallCommandAsSkill, shouldInstallCommandAsSkill, } from './command-skills.js';
50
- import { getWriter, getDetector } from './staleness/registry.js';
51
- import { syncMemoryToVersionHome } from './memory.js';
52
- import { listPluginSkillNames, resolveCommandSource, resolveSkillSource } from './staleness/writers/sources.js';
53
- import { syncProjectResourcesToAgent } from './project-resources.js';
31
+ import { VERSION_RE, compareVersions } from '../agent-spec/primitives.js';
32
+ import { AGENTS, agentConfigDirName, getAccountEmail, resolveAgentName, formatAgentError, findInPath, isSelfUpdatingAgent, isAgentHardDeprecated, hardDeprecationError } from '../agents.js';
33
+ import { discoverPermissionGroups, getActivePermissionPresetName, readPermissionPresetRecipe, PERMISSION_PRESET_ENV_VAR } from '../permissions.js';
34
+ import { parseMcpConfigForScan, isProjectMcpTrusted } from '../mcp.js';
35
+ import { createVersionedAlias, removeVersionedAlias, getConfigSymlinkVersion, ensureClaudeInsideSymlink, assertIsolationBoundary, } from '../shims.js';
36
+ import { importInstallScriptBinary } from '../import.js';
37
+ import { createInstallation } from './store.js';
38
+ import { INSTALLATION_RECORD_FILE } from './types.js';
39
+ import { IS_WINDOWS, composeWin32CommandLine } from '../platform/index.js';
40
+ import { listInstalledSubagents } from '../subagents.js';
41
+ import { listInstalledWorkflows } from '../workflows.js';
42
+ import { parseHookManifest, registerHooksToSettings, selectHookManifest, pruneVersionHomeHookEntriesFromSettings, installSessionTrackerHookSync, installSessionTrackerHook } from '../hooks.js';
43
+ import { supports, explainSkip } from '../capabilities.js';
44
+ import { discoverPlugins, syncPluginToVersion, pluginSupportsAgent, cleanOrphanedPluginSkills, marketplaceSpecForName } from '../plugins/plugins.js';
45
+ import { loadManifest, saveManifest, buildManifest as buildSyncManifest, isStale } from '../staleness/index.js';
46
+ import { pruneRemovedResources } from '../staleness/prune.js';
47
+ import { emit } from '../feed/events.js';
48
+ import { safeJoin } from '../paths.js';
49
+ import { readSkillSourceCommandMarker, shouldAlsoInstallCommandAsSkill, shouldInstallCommandAsSkill, } from '../command-skills.js';
50
+ import { getWriter, getDetector } from '../staleness/registry.js';
51
+ import { syncMemoryToVersionHome } from '../memory.js';
52
+ import { listPluginSkillNames, resolveCommandSource, resolveSkillSource } from '../staleness/writers/sources.js';
53
+ import { syncProjectResourcesToAgent } from '../project-resources.js';
54
54
  /** Promisified exec for running shell commands. */
55
55
  const execAsync = promisify(exec);
56
56
  const execFileAsync = promisify(execFile);
@@ -1638,6 +1638,10 @@ export async function installVersion(agent, version, onProgress, opts) {
1638
1638
  // here on; the release it carries is recorded separately so `agents update`
1639
1639
  // can move the release without invalidating any reference to the label.
1640
1640
  createInstallation(agent, installedVersion, installedVersion);
1641
+ const trackerInstall = await installSessionTrackerHook(agent, installedVersion);
1642
+ if (!trackerInstall.installed && trackerInstall.error) {
1643
+ console.warn(`agents: SessionStart hook not installed for ${agent}@${installedVersion}: ${trackerInstall.error}`);
1644
+ }
1641
1645
  // The self-updating binary just changed on disk — drop the cached
1642
1646
  // `--version` so `agents view` reflects the freshly-installed release.
1643
1647
  invalidateLiveVersionCache(agent);
@@ -1797,6 +1801,10 @@ export async function installVersion(agent, version, onProgress, opts) {
1797
1801
  }
1798
1802
  // Freeze this installation's identity (see the installScript branch above).
1799
1803
  createInstallation(agent, healthyVersion, healthyVersion);
1804
+ const trackerInstall = await installSessionTrackerHook(agent, healthyVersion);
1805
+ if (!trackerInstall.installed && trackerInstall.error) {
1806
+ console.warn(`agents: SessionStart hook not installed for ${agent}@${healthyVersion}: ${trackerInstall.error}`);
1807
+ }
1800
1808
  emit('version.install', { agent, version: healthyVersion });
1801
1809
  return { success: true, installedVersion: healthyVersion };
1802
1810
  }
@@ -1924,7 +1932,7 @@ async function reconcileGlobalBinaryVersions(agent) {
1924
1932
  const staleDir = getVersionDir(agent, version);
1925
1933
  const trashPath = softDeleteVersionDir(agent, version);
1926
1934
  if (trashPath) {
1927
- const { updateSessionFilePaths } = await import('./session/db.js');
1935
+ const { updateSessionFilePaths } = await import('../session/db.js');
1928
1936
  updateSessionFilePaths(staleDir, trashPath);
1929
1937
  foldedAny = true;
1930
1938
  }
@@ -1962,7 +1970,7 @@ export async function reconcileStaleLatestDir(agent, installedVersion) {
1962
1970
  // harness can't statically transform, so it must stay out of the eager graph.
1963
1971
  const trashPath = softDeleteVersionDir(agent, 'latest');
1964
1972
  if (trashPath) {
1965
- const { updateSessionFilePaths } = await import('./session/db.js');
1973
+ const { updateSessionFilePaths } = await import('../session/db.js');
1966
1974
  updateSessionFilePaths(staleLatestDir, trashPath);
1967
1975
  }
1968
1976
  return 'trashed';
@@ -2711,7 +2719,7 @@ export function mergeRepoScopedSelections(repos, cwd = process.cwd()) {
2711
2719
  */
2712
2720
  export function syncResourcesToVersion(agent, version, selection, options = {}) {
2713
2721
  if (isAgentHardDeprecated(agent)) {
2714
- return { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [], pruned: { commands: [], skills: [] } };
2722
+ return { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [], pruned: { commands: [], skills: [] }, declined: [] };
2715
2723
  }
2716
2724
  const agentConfig = AGENTS[agent];
2717
2725
  const versionHome = getVersionHomePath(agent, version);
@@ -2722,7 +2730,7 @@ export function syncResourcesToVersion(agent, version, selection, options = {})
2722
2730
  // care about the ORIGINAL intent: a caller passing no selection means
2723
2731
  // "full sync; persist the staleness manifest after."
2724
2732
  const userPassedSelection = selection !== undefined;
2725
- const result = { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [], pruned: { commands: [], skills: [] } };
2733
+ const result = { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [], pruned: { commands: [], skills: [] }, declined: [] };
2726
2734
  const cwd = options.cwd || process.cwd();
2727
2735
  const projectAgentsDir = options.projectDir || getProjectAgentsDir(cwd);
2728
2736
  const userAgentsDir = getUserAgentsDir();
@@ -2734,6 +2742,16 @@ export function syncResourcesToVersion(agent, version, selection, options = {})
2734
2742
  if (projectAgentsDir) {
2735
2743
  result.projectSkipped = syncProjectResourcesToAgent(agent, version, projectAgentsDir).skipped;
2736
2744
  }
2745
+ // Install the shared SessionStart state-writer hook for every hook-capable
2746
+ // harness. This must run even when the rest of the sync is skipped by the
2747
+ // staleness guard, because the hook is registered in the harness's native
2748
+ // config (not in the version-home resource tree the manifest tracks).
2749
+ if (supports(agent, 'hooks', version).ok) {
2750
+ const trackerResult = installSessionTrackerHookSync(agent, version);
2751
+ if (!trackerResult.installed && trackerResult.error) {
2752
+ console.warn(`agents: SessionStart hook not installed for ${agent}@${version}: ${trackerResult.error}`);
2753
+ }
2754
+ }
2737
2755
  // Fast guard BEFORE getAvailableResources / pattern expansion /
2738
2756
  // ensureVersionResourcePatterns. Guard needs only loadManifest + isStale
2739
2757
  // (~6 ms); the work that used to sit ahead of it was ~12.5 ms of the 21.5 ms
@@ -3104,6 +3122,8 @@ export function syncResourcesToVersion(agent, version, selection, options = {})
3104
3122
  if (mcpToSync.length > 0 && mcpWriter) {
3105
3123
  const r = mcpWriter.write({ version, versionHome, selection: mcpToSync, cwd });
3106
3124
  result.mcp = r.synced;
3125
+ if (r.errors?.length)
3126
+ result.declined.push(...r.errors.map((e) => `mcp: ${e}`));
3107
3127
  // mcp patterns already written via ensureVersionResourcePatterns above.
3108
3128
  }
3109
3129
  // Sync subagents — dispatch through WRITERS.subagents. listInstalledSubagents
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
2
  import { IsolationBoundaryError } from './shims.js';
3
- import { listInstalledVersions } from './versions.js';
3
+ import { listInstalledVersions } from './installations/versions.js';
4
4
  /**
5
5
  * Turn an {@link IsolationBoundaryError} into guidance. The boundary is enforced by a
6
6
  * throw so it cannot be forgotten; this is what keeps that from surfacing as a stack
@@ -60,3 +60,31 @@ export declare function pickLinearProject(query: string, projects: LinearProject
60
60
  * the user down a wrong "no matches" path.
61
61
  */
62
62
  export declare function listLinearProjects(): LinearProjectLite[];
63
+ /**
64
+ * The `linear` block a def should carry after binding it to `project`.
65
+ *
66
+ * Pure so the write rule is testable without a `linear` CLI or a filesystem —
67
+ * `agents projects link` is the only caller and does nothing else to the field.
68
+ *
69
+ * Two rules, both learned from real drift:
70
+ *
71
+ * - `name` is REFRESHED, never merely preserved. It used to be written by
72
+ * spreading `prior`, so a project renamed on the board kept its old label in
73
+ * the YAML forever — and that label is what the status card, the AGI EXT
74
+ * Fleet panel (`linearProjectName`), and agents naming the work all read.
75
+ * - `url` is dropped when the projectId CHANGES and the incoming row has none.
76
+ * Carrying it over would leave a def pointing at the previous project's page
77
+ * beside the new project's name, and the status card prefers `url` over the
78
+ * id — so the one field a reader clicks would go to the wrong project.
79
+ * Re-linking the SAME id keeps a previously stored url, since the CLI's list
80
+ * row omitting `url` says nothing about whether the project has one.
81
+ */
82
+ export declare function nextLinearLink(prior: {
83
+ projectId?: string;
84
+ url?: string;
85
+ name?: string;
86
+ } | undefined, project: LinearProjectLite): {
87
+ projectId: string;
88
+ url?: string;
89
+ name: string;
90
+ };
@@ -142,3 +142,33 @@ export function listLinearProjects() {
142
142
  return [];
143
143
  });
144
144
  }
145
+ /**
146
+ * The `linear` block a def should carry after binding it to `project`.
147
+ *
148
+ * Pure so the write rule is testable without a `linear` CLI or a filesystem —
149
+ * `agents projects link` is the only caller and does nothing else to the field.
150
+ *
151
+ * Two rules, both learned from real drift:
152
+ *
153
+ * - `name` is REFRESHED, never merely preserved. It used to be written by
154
+ * spreading `prior`, so a project renamed on the board kept its old label in
155
+ * the YAML forever — and that label is what the status card, the AGI EXT
156
+ * Fleet panel (`linearProjectName`), and agents naming the work all read.
157
+ * - `url` is dropped when the projectId CHANGES and the incoming row has none.
158
+ * Carrying it over would leave a def pointing at the previous project's page
159
+ * beside the new project's name, and the status card prefers `url` over the
160
+ * id — so the one field a reader clicks would go to the wrong project.
161
+ * Re-linking the SAME id keeps a previously stored url, since the CLI's list
162
+ * row omitting `url` says nothing about whether the project has one.
163
+ */
164
+ export function nextLinearLink(prior, project) {
165
+ const next = { projectId: project.id, name: project.name };
166
+ // A stored url is kept ONLY when the prior block names the same project. Not
167
+ // `prior.projectId && prior.projectId !== id`: `projects add --linear <url>`
168
+ // writes `{ url }` with no projectId at all, and treating that as "same
169
+ // project" carried a url belonging to whatever the user had pasted.
170
+ const url = project.url ?? (prior?.projectId === project.id ? prior?.url : undefined);
171
+ if (url)
172
+ next.url = url;
173
+ return next;
174
+ }
package/dist/lib/loop.js CHANGED
@@ -24,7 +24,7 @@ import * as fs from 'fs';
24
24
  import * as path from 'path';
25
25
  import { buildExecCommand, buildExecEnv } from './exec.js';
26
26
  import { extractUsageEvents } from './budget/enforce.js';
27
- import { parseTimeout } from './routines.js';
27
+ import { parseTimeout } from './scheduling/routines.js';
28
28
  import { writeCheckpoint } from './checkpoint.js';
29
29
  import { mailboxDir } from './mailbox.js';
30
30
  import { composeWin32CommandLine } from './platform/index.js';
@@ -10,7 +10,7 @@ import * as fs from 'fs';
10
10
  import * as path from 'path';
11
11
  import { getFeedDir, getMailboxRootDir } from './state.js';
12
12
  import { mailboxDir, isValidMailboxId, readMessage, sweepExpired, } from './mailbox.js';
13
- import { listBlocks, removeBlock, recordMessageReceipt } from './feed.js';
13
+ import { listBlocks, removeBlock, recordMessageReceipt } from './feed/feed.js';
14
14
  const DEFAULT_MAX_CONSUMED_AGE_MINUTES = 24 * 60;
15
15
  function consumedAgeMinutes(file, now) {
16
16
  try {
@@ -19,7 +19,7 @@ import * as fs from 'fs';
19
19
  import * as path from 'path';
20
20
  import { randomUUID } from 'crypto';
21
21
  import { getMailboxRootDir } from './state.js';
22
- import { recordMessageReceipt } from './feed.js';
22
+ import { recordMessageReceipt } from './feed/feed.js';
23
23
  import { parseDuration } from './hooks/cache.js';
24
24
  /** Default delivery TTL for messages enqueued without an explicit one (24 hours). */
25
25
  export const DEFAULT_TTL_SECONDS = 24 * 60 * 60;