@phnx-labs/agents-cli 1.22.35 → 1.22.37

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 (487) hide show
  1. package/CHANGELOG.md +666 -2
  2. package/README.md +75 -35
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.d.ts +15 -0
  5. package/dist/bootstrap.js +1211 -0
  6. package/dist/commands/accounts.d.ts +4 -11
  7. package/dist/commands/accounts.js +159 -27
  8. package/dist/commands/attach.js +17 -4
  9. package/dist/commands/audit.d.ts +8 -8
  10. package/dist/commands/audit.js +57 -47
  11. package/dist/commands/browser.js +15 -11
  12. package/dist/commands/cloud.js +1 -1
  13. package/dist/commands/commands.js +0 -11
  14. package/dist/commands/computer-actions.js +33 -0
  15. package/dist/commands/computer-sessions-picker.d.ts +21 -0
  16. package/dist/commands/computer-sessions-picker.js +141 -0
  17. package/dist/commands/computer.d.ts +16 -0
  18. package/dist/commands/computer.js +37 -0
  19. package/dist/commands/config.d.ts +17 -0
  20. package/dist/commands/config.js +401 -0
  21. package/dist/commands/cp.d.ts +84 -0
  22. package/dist/commands/cp.js +231 -0
  23. package/dist/commands/daemon.js +243 -14
  24. package/dist/commands/detach-core.d.ts +1 -1
  25. package/dist/commands/detach-core.js +12 -2
  26. package/dist/commands/detach.js +1 -1
  27. package/dist/commands/doctor.js +64 -5
  28. package/dist/commands/events.d.ts +24 -12
  29. package/dist/commands/events.js +144 -28
  30. package/dist/commands/exec.js +85 -41
  31. package/dist/commands/feed.d.ts +1 -1
  32. package/dist/commands/feed.js +16 -8
  33. package/dist/commands/focus.d.ts +33 -1
  34. package/dist/commands/focus.js +177 -17
  35. package/dist/commands/funnel.d.ts +1 -1
  36. package/dist/commands/go.js +9 -8
  37. package/dist/commands/harness-wizard.d.ts +1 -0
  38. package/dist/commands/harness-wizard.js +18 -20
  39. package/dist/commands/harness.d.ts +2 -0
  40. package/dist/commands/harness.js +59 -26
  41. package/dist/commands/hooks.js +0 -11
  42. package/dist/commands/inspect.d.ts +94 -1
  43. package/dist/commands/inspect.js +866 -40
  44. package/dist/commands/lease.d.ts +4 -4
  45. package/dist/commands/lease.js +6 -6
  46. package/dist/commands/login.js +0 -13
  47. package/dist/commands/logs.d.ts +2 -2
  48. package/dist/commands/logs.js +2 -2
  49. package/dist/commands/mcp.js +7 -2
  50. package/dist/commands/memory.js +7 -2
  51. package/dist/commands/message.d.ts +1 -1
  52. package/dist/commands/message.js +37 -6
  53. package/dist/commands/models.js +4 -0
  54. package/dist/commands/monitors.d.ts +0 -1
  55. package/dist/commands/monitors.js +199 -16
  56. package/dist/commands/open.d.ts +18 -0
  57. package/dist/commands/open.js +57 -0
  58. package/dist/commands/packages.js +2 -107
  59. package/dist/commands/plugins.js +6 -3
  60. package/dist/commands/profiles.d.ts +1 -0
  61. package/dist/commands/profiles.js +16 -160
  62. package/dist/commands/projects.d.ts +28 -0
  63. package/dist/commands/projects.js +125 -5
  64. package/dist/commands/reconnect.js +9 -3
  65. package/dist/commands/repo.js +42 -1
  66. package/dist/commands/resource-view.d.ts +17 -0
  67. package/dist/commands/resource-view.js +36 -14
  68. package/dist/commands/resume.js +9 -2
  69. package/dist/commands/routines.d.ts +0 -2
  70. package/dist/commands/routines.js +473 -289
  71. package/dist/commands/secrets.js +52 -9
  72. package/dist/commands/sessions-export.d.ts +47 -0
  73. package/dist/commands/sessions-export.js +116 -6
  74. package/dist/commands/sessions-import.d.ts +17 -0
  75. package/dist/commands/sessions-import.js +114 -6
  76. package/dist/commands/sessions-migrate.d.ts +27 -0
  77. package/dist/commands/sessions-migrate.js +50 -9
  78. package/dist/commands/sessions-picker.js +23 -4
  79. package/dist/commands/sessions-resume.d.ts +5 -3
  80. package/dist/commands/sessions-resume.js +30 -8
  81. package/dist/commands/sessions-watch.d.ts +2 -0
  82. package/dist/commands/sessions-watch.js +53 -0
  83. package/dist/commands/sessions.d.ts +66 -3
  84. package/dist/commands/sessions.js +298 -47
  85. package/dist/commands/set.d.ts +1 -1
  86. package/dist/commands/set.js +2 -2
  87. package/dist/commands/setup-browser.js +2 -2
  88. package/dist/commands/setup-mine.js +0 -1
  89. package/dist/commands/setup-preferences.js +1 -1
  90. package/dist/commands/setup-share.js +34 -4
  91. package/dist/commands/setup.d.ts +5 -0
  92. package/dist/commands/setup.js +26 -0
  93. package/dist/commands/share.d.ts +67 -0
  94. package/dist/commands/share.js +275 -12
  95. package/dist/commands/skills.js +0 -11
  96. package/dist/commands/snapshot.js +1 -1
  97. package/dist/commands/ssh.d.ts +18 -0
  98. package/dist/commands/ssh.js +549 -210
  99. package/dist/commands/sync.d.ts +5 -0
  100. package/dist/commands/sync.js +212 -32
  101. package/dist/commands/teams.d.ts +13 -0
  102. package/dist/commands/teams.js +187 -30
  103. package/dist/commands/tickets.d.ts +2 -0
  104. package/dist/commands/tickets.js +43 -0
  105. package/dist/commands/update.js +2 -4
  106. package/dist/commands/usage.js +5 -3
  107. package/dist/commands/versions.js +11 -5
  108. package/dist/commands/view.js +15 -7
  109. package/dist/commands/webhook.d.ts +2 -2
  110. package/dist/commands/webhook.js +7 -7
  111. package/dist/index.d.ts +18 -2
  112. package/dist/index.js +53 -1264
  113. package/dist/lib/account-catalog.d.ts +18 -0
  114. package/dist/lib/account-catalog.js +38 -0
  115. package/dist/lib/account-provider-registry.d.ts +18 -0
  116. package/dist/lib/account-provider-registry.js +59 -0
  117. package/dist/lib/account-registry.d.ts +40 -0
  118. package/dist/lib/account-registry.js +239 -0
  119. package/dist/lib/account-schema.d.ts +44 -0
  120. package/dist/lib/account-schema.js +91 -0
  121. package/dist/lib/account-state-service.d.ts +21 -0
  122. package/dist/lib/account-state-service.js +60 -0
  123. package/dist/lib/activity.d.ts +1 -1
  124. package/dist/lib/activity.js +8 -1
  125. package/dist/lib/add-dir.d.ts +80 -0
  126. package/dist/lib/add-dir.js +241 -0
  127. package/dist/lib/agent-cli-commands.d.ts +11 -0
  128. package/dist/lib/agent-cli-commands.js +30 -0
  129. package/dist/lib/agents.js +44 -36
  130. package/dist/lib/answer-router.js +1 -1
  131. package/dist/lib/audit/log.d.ts +10 -27
  132. package/dist/lib/audit/log.js +20 -33
  133. package/dist/lib/auth-health.d.ts +9 -2
  134. package/dist/lib/auth-health.js +42 -9
  135. package/dist/lib/auto-pull-worker.js +7 -3
  136. package/dist/lib/auto-pull.d.ts +44 -3
  137. package/dist/lib/auto-pull.js +88 -5
  138. package/dist/lib/binary-shadow.d.ts +28 -0
  139. package/dist/lib/binary-shadow.js +121 -0
  140. package/dist/lib/brand.js +9 -3
  141. package/dist/lib/browser/ipc.d.ts +30 -0
  142. package/dist/lib/browser/ipc.js +81 -4
  143. package/dist/lib/browser/profiles.d.ts +3 -2
  144. package/dist/lib/browser/profiles.js +65 -22
  145. package/dist/lib/browser/service.d.ts +4 -0
  146. package/dist/lib/browser/service.js +30 -3
  147. package/dist/lib/browser/sessions-list.d.ts +22 -2
  148. package/dist/lib/browser/sessions-list.js +54 -6
  149. package/dist/lib/browser/stream.d.ts +2 -0
  150. package/dist/lib/browser/stream.js +1 -0
  151. package/dist/lib/browser/types.d.ts +19 -0
  152. package/dist/lib/byok-usage.d.ts +9 -2
  153. package/dist/lib/byok-usage.js +133 -31
  154. package/dist/lib/cli-entry.d.ts +11 -0
  155. package/dist/lib/cli-entry.js +46 -0
  156. package/dist/lib/cloud/host.d.ts +1 -1
  157. package/dist/lib/cloud/host.js +2 -2
  158. package/dist/lib/cloud/registry.js +1 -1
  159. package/dist/lib/cloud/types.d.ts +1 -1
  160. package/dist/lib/commands.d.ts +2 -0
  161. package/dist/lib/commands.js +2 -0
  162. package/dist/lib/computer/sessions-list.d.ts +150 -0
  163. package/dist/lib/computer/sessions-list.js +363 -0
  164. package/dist/lib/config-keys.d.ts +86 -0
  165. package/dist/lib/config-keys.js +193 -0
  166. package/dist/lib/config-machine-keys.d.ts +12 -0
  167. package/dist/lib/config-machine-keys.js +17 -0
  168. package/dist/lib/config-transfer.js +3 -4
  169. package/dist/lib/crabbox/cli.d.ts +2 -2
  170. package/dist/lib/crabbox/cli.js +3 -3
  171. package/dist/lib/daemon-health.d.ts +22 -0
  172. package/dist/lib/daemon-health.js +33 -3
  173. package/dist/lib/daemon-services.d.ts +50 -0
  174. package/dist/lib/daemon-services.js +147 -0
  175. package/dist/lib/daemon-ticks.d.ts +35 -66
  176. package/dist/lib/daemon-ticks.js +77 -159
  177. package/dist/lib/daemon.d.ts +72 -4
  178. package/dist/lib/daemon.js +792 -202
  179. package/dist/lib/deeplink/register.d.ts +49 -0
  180. package/dist/lib/deeplink/register.js +253 -0
  181. package/dist/lib/deeplink/url.d.ts +34 -0
  182. package/dist/lib/deeplink/url.js +78 -0
  183. package/dist/lib/device-config.d.ts +124 -29
  184. package/dist/lib/device-config.js +346 -141
  185. package/dist/lib/devices/config-migration.d.ts +42 -0
  186. package/dist/lib/devices/config-migration.js +203 -0
  187. package/dist/lib/devices/connect.js +14 -7
  188. package/dist/lib/devices/doctor-findings.d.ts +4 -1
  189. package/dist/lib/devices/doctor-findings.js +20 -1
  190. package/dist/lib/devices/harness-inventory.d.ts +11 -2
  191. package/dist/lib/devices/harness-inventory.js +0 -0
  192. package/dist/lib/devices/health.d.ts +1 -1
  193. package/dist/lib/devices/health.js +1 -1
  194. package/dist/lib/devices/pending.d.ts +22 -1
  195. package/dist/lib/devices/pending.js +67 -2
  196. package/dist/lib/devices/registry.d.ts +0 -25
  197. package/dist/lib/devices/registry.js +2 -83
  198. package/dist/lib/devices/resolve-profile.d.ts +20 -0
  199. package/dist/lib/devices/resolve-profile.js +44 -0
  200. package/dist/lib/devices/rollout-verify.d.ts +101 -0
  201. package/dist/lib/devices/rollout-verify.js +193 -0
  202. package/dist/lib/devices/ssh-config.js +10 -6
  203. package/dist/lib/event-families.d.ts +28 -0
  204. package/dist/lib/event-families.js +159 -0
  205. package/dist/lib/event-stream.d.ts +9 -1
  206. package/dist/lib/event-stream.js +26 -9
  207. package/dist/lib/events.d.ts +9 -1
  208. package/dist/lib/events.js +21 -6
  209. package/dist/lib/exec.d.ts +30 -0
  210. package/dist/lib/exec.js +219 -121
  211. package/dist/lib/feed-broadcast.d.ts +25 -0
  212. package/dist/lib/feed-broadcast.js +33 -0
  213. package/dist/lib/feed.d.ts +1 -1
  214. package/dist/lib/feed.js +12 -2
  215. package/dist/lib/fleet/capture.js +15 -0
  216. package/dist/lib/fleet/manifest.js +9 -0
  217. package/dist/lib/fleet/types.d.ts +9 -0
  218. package/dist/lib/fleet-status.js +10 -8
  219. package/dist/lib/git.d.ts +20 -6
  220. package/dist/lib/git.js +121 -17
  221. package/dist/lib/hosts/dispatch.d.ts +8 -3
  222. package/dist/lib/hosts/dispatch.js +29 -3
  223. package/dist/lib/hosts/logs.d.ts +2 -2
  224. package/dist/lib/hosts/logs.js +2 -2
  225. package/dist/lib/hosts/option.js +1 -1
  226. package/dist/lib/hosts/passthrough.d.ts +2 -3
  227. package/dist/lib/hosts/passthrough.js +10 -24
  228. package/dist/lib/hosts/progress.js +2 -2
  229. package/dist/lib/hosts/providers/devices.d.ts +3 -3
  230. package/dist/lib/hosts/providers/devices.js +18 -12
  231. package/dist/lib/hosts/ready.d.ts +5 -1
  232. package/dist/lib/hosts/ready.js +9 -3
  233. package/dist/lib/hosts/reconcile.d.ts +2 -2
  234. package/dist/lib/hosts/reconcile.js +2 -2
  235. package/dist/lib/hosts/registry.js +14 -9
  236. package/dist/lib/hosts/remote-cmd.js +1 -1
  237. package/dist/lib/hosts/remote-os.d.ts +9 -6
  238. package/dist/lib/hosts/remote-os.js +13 -6
  239. package/dist/lib/hosts/routing-flag.d.ts +23 -0
  240. package/dist/lib/hosts/routing-flag.js +41 -0
  241. package/dist/lib/hosts/run-target.js +1 -1
  242. package/dist/lib/hosts/session-index.js +1 -1
  243. package/dist/lib/hosts/tasks.d.ts +6 -6
  244. package/dist/lib/hosts/tasks.js +4 -4
  245. package/dist/lib/hosts/types.js +1 -2
  246. package/dist/lib/installations/resolve.js +2 -8
  247. package/dist/lib/isolation-boundary-report.js +0 -1
  248. package/dist/lib/linear-cache.d.ts +7 -0
  249. package/dist/lib/linear-cache.js +31 -4
  250. package/dist/lib/linear-project-counts.d.ts +1 -1
  251. package/dist/lib/linear-project-counts.js +2 -3
  252. package/dist/lib/linear-projects.js +1 -1
  253. package/dist/lib/loop.d.ts +2 -2
  254. package/dist/lib/loop.js +1 -1
  255. package/dist/lib/mailbox-target.d.ts +1 -1
  256. package/dist/lib/mailbox-target.js +1 -1
  257. package/dist/lib/manifest.js +7 -4
  258. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  259. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  260. package/dist/lib/menubar/snapshot.d.ts +3 -2
  261. package/dist/lib/menubar/snapshot.js +6 -2
  262. package/dist/lib/migrate-fold.d.ts +33 -0
  263. package/dist/lib/migrate-fold.js +130 -0
  264. package/dist/lib/migrate.d.ts +34 -34
  265. package/dist/lib/migrate.js +106 -128
  266. package/dist/lib/model-tier-overrides.d.ts +1 -1
  267. package/dist/lib/model-tier-overrides.js +15 -2
  268. package/dist/lib/monitors/config.d.ts +17 -3
  269. package/dist/lib/monitors/config.js +52 -18
  270. package/dist/lib/monitors/engine.d.ts +32 -1
  271. package/dist/lib/monitors/engine.js +94 -11
  272. package/dist/lib/monitors/fingerprint.d.ts +46 -0
  273. package/dist/lib/monitors/fingerprint.js +100 -0
  274. package/dist/lib/monitors/remote.d.ts +47 -0
  275. package/dist/lib/monitors/remote.js +81 -0
  276. package/dist/lib/monitors/state.d.ts +39 -0
  277. package/dist/lib/monitors/state.js +56 -0
  278. package/dist/lib/onepassword.d.ts +17 -0
  279. package/dist/lib/onepassword.js +52 -22
  280. package/dist/lib/open-url.js +1 -1
  281. package/dist/lib/picker.d.ts +14 -2
  282. package/dist/lib/picker.js +35 -13
  283. package/dist/lib/placement.d.ts +1 -1
  284. package/dist/lib/placement.js +1 -1
  285. package/dist/lib/pr-land-detach.d.ts +32 -0
  286. package/dist/lib/pr-land-detach.js +79 -0
  287. package/dist/lib/profiles-presets.js +13 -0
  288. package/dist/lib/profiles.d.ts +2 -0
  289. package/dist/lib/profiles.js +44 -1
  290. package/dist/lib/project-focus.d.ts +1 -1
  291. package/dist/lib/project-focus.js +1 -1
  292. package/dist/lib/project-probe.d.ts +4 -1
  293. package/dist/lib/project-probe.js +5 -4
  294. package/dist/lib/project-resources.js +2 -18
  295. package/dist/lib/project-root.d.ts +16 -0
  296. package/dist/lib/project-root.js +20 -2
  297. package/dist/lib/projects.d.ts +20 -1
  298. package/dist/lib/projects.js +78 -1
  299. package/dist/lib/refresh-coordinator.d.ts +24 -0
  300. package/dist/lib/refresh-coordinator.js +52 -0
  301. package/dist/lib/registry.d.ts +2 -2
  302. package/dist/lib/registry.js +1 -1
  303. package/dist/lib/resource-aliases.d.ts +13 -0
  304. package/dist/lib/resource-aliases.js +26 -0
  305. package/dist/lib/resources/types.d.ts +1 -1
  306. package/dist/lib/resources.d.ts +16 -0
  307. package/dist/lib/resources.js +66 -10
  308. package/dist/lib/rotate.d.ts +3 -4
  309. package/dist/lib/rotate.js +4 -5
  310. package/dist/lib/routine-activation.d.ts +22 -2
  311. package/dist/lib/routine-activation.js +63 -16
  312. package/dist/lib/routine-context.d.ts +9 -2
  313. package/dist/lib/routine-context.js +21 -6
  314. package/dist/lib/routines-project.d.ts +58 -48
  315. package/dist/lib/routines-project.js +190 -159
  316. package/dist/lib/routines.d.ts +41 -6
  317. package/dist/lib/routines.js +92 -34
  318. package/dist/lib/run-defaults.d.ts +5 -0
  319. package/dist/lib/run-defaults.js +11 -1
  320. package/dist/lib/runner.d.ts +10 -8
  321. package/dist/lib/runner.js +122 -39
  322. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  323. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  324. package/dist/lib/secrets/agent.d.ts +10 -3
  325. package/dist/lib/secrets/agent.js +43 -8
  326. package/dist/lib/secrets/bundles.d.ts +1 -0
  327. package/dist/lib/secrets/bundles.js +92 -80
  328. package/dist/lib/secrets/index.js +32 -9
  329. package/dist/lib/secrets/install-helper.d.ts +4 -4
  330. package/dist/lib/secrets/install-helper.js +4 -4
  331. package/dist/lib/secrets/push.d.ts +40 -6
  332. package/dist/lib/secrets/push.js +58 -11
  333. package/dist/lib/secrets/read-backoff.d.ts +1 -1
  334. package/dist/lib/secrets/read-backoff.js +1 -1
  335. package/dist/lib/secrets/remote.d.ts +24 -0
  336. package/dist/lib/secrets/remote.js +54 -4
  337. package/dist/lib/self-update.d.ts +108 -0
  338. package/dist/lib/self-update.js +276 -1
  339. package/dist/lib/session/active.d.ts +89 -5
  340. package/dist/lib/session/active.js +165 -10
  341. package/dist/lib/session/actor-sidecar.d.ts +1 -1
  342. package/dist/lib/session/actor-sidecar.js +2 -1
  343. package/dist/lib/session/db.d.ts +176 -2
  344. package/dist/lib/session/db.js +484 -17
  345. package/dist/lib/session/discover.js +27 -4
  346. package/dist/lib/session/hook-sessions.js +2 -2
  347. package/dist/lib/session/host-link.d.ts +2 -2
  348. package/dist/lib/session/host-link.js +2 -2
  349. package/dist/lib/session/pid-registry.d.ts +21 -0
  350. package/dist/lib/session/pid-registry.js +57 -0
  351. package/dist/lib/session/remote-active.js +15 -1
  352. package/dist/lib/session/remote.js +2 -2
  353. package/dist/lib/session/session-cache.d.ts +14 -7
  354. package/dist/lib/session/session-cache.js +51 -9
  355. package/dist/lib/session/state.d.ts +2 -2
  356. package/dist/lib/session/state.js +1 -1
  357. package/dist/lib/session/sync/config.d.ts +10 -10
  358. package/dist/lib/session/sync/config.js +10 -10
  359. package/dist/lib/session/sync/r2.d.ts +34 -0
  360. package/dist/lib/session/sync/r2.js +123 -0
  361. package/dist/lib/session/throughput.d.ts +1 -1
  362. package/dist/lib/session/throughput.js +1 -1
  363. package/dist/lib/session/types.d.ts +23 -1
  364. package/dist/lib/session/types.js +15 -0
  365. package/dist/lib/session/viewing-in.d.ts +1 -1
  366. package/dist/lib/session/viewing-in.js +1 -1
  367. package/dist/lib/session/watch.d.ts +101 -0
  368. package/dist/lib/session/watch.js +242 -0
  369. package/dist/lib/share/config.d.ts +4 -0
  370. package/dist/lib/share/config.js +1 -0
  371. package/dist/lib/share/provision.d.ts +38 -0
  372. package/dist/lib/share/provision.js +50 -0
  373. package/dist/lib/share/publish.d.ts +40 -1
  374. package/dist/lib/share/publish.js +116 -3
  375. package/dist/lib/share/worker-template.js +71 -6
  376. package/dist/lib/shims.d.ts +17 -3
  377. package/dist/lib/shims.js +98 -26
  378. package/dist/lib/signin-badge.js +3 -2
  379. package/dist/lib/skills.js +2 -0
  380. package/dist/lib/smart-launch.d.ts +8 -8
  381. package/dist/lib/smart-launch.js +80 -59
  382. package/dist/lib/ssh-exec.d.ts +1 -1
  383. package/dist/lib/ssh-exec.js +1 -1
  384. package/dist/lib/staleness/prune.d.ts +88 -0
  385. package/dist/lib/staleness/prune.js +69 -0
  386. package/dist/lib/staleness/registry.d.ts +1 -1
  387. package/dist/lib/staleness/writers/commands.js +34 -2
  388. package/dist/lib/staleness/writers/hooks.js +16 -0
  389. package/dist/lib/staleness/writers/kinds.d.ts +6 -0
  390. package/dist/lib/staleness/writers/skills.js +19 -0
  391. package/dist/lib/staleness/writers/subagents.d.ts +2 -3
  392. package/dist/lib/staleness/writers/subagents.js +0 -4
  393. package/dist/lib/staleness/writers/types.d.ts +32 -0
  394. package/dist/lib/startup/command-registry.d.ts +6 -12
  395. package/dist/lib/startup/command-registry.js +11 -31
  396. package/dist/lib/startup/dev-build.d.ts +10 -0
  397. package/dist/lib/startup/dev-build.js +13 -1
  398. package/dist/lib/startup/spellcheck.d.ts +18 -0
  399. package/dist/lib/startup/spellcheck.js +45 -0
  400. package/dist/lib/state.d.ts +36 -9
  401. package/dist/lib/state.js +96 -46
  402. package/dist/lib/subagents-registry.d.ts +0 -7
  403. package/dist/lib/subagents-registry.js +38 -65
  404. package/dist/lib/subagents.d.ts +0 -33
  405. package/dist/lib/subagents.js +0 -75
  406. package/dist/lib/sync-umbrella.js +1 -1
  407. package/dist/lib/teams/agents.d.ts +41 -1
  408. package/dist/lib/teams/agents.js +187 -9
  409. package/dist/lib/teams/api.d.ts +11 -1
  410. package/dist/lib/teams/api.js +11 -2
  411. package/dist/lib/teams/delivery.d.ts +41 -0
  412. package/dist/lib/teams/delivery.js +60 -0
  413. package/dist/lib/teams/registry.d.ts +14 -0
  414. package/dist/lib/teams/registry.js +51 -1
  415. package/dist/lib/teams/remoteWorktree.d.ts +19 -0
  416. package/dist/lib/teams/remoteWorktree.js +29 -0
  417. package/dist/lib/teams/scheduler.d.ts +1 -1
  418. package/dist/lib/teams/scheduler.js +1 -1
  419. package/dist/lib/teams/worktree.d.ts +24 -0
  420. package/dist/lib/teams/worktree.js +42 -0
  421. package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
  422. package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
  423. package/dist/lib/terminal/engine.d.ts +4 -0
  424. package/dist/lib/terminal/engine.js +8 -2
  425. package/dist/lib/terminal/types.d.ts +21 -2
  426. package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
  427. package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
  428. package/dist/lib/tickets/list.d.ts +53 -0
  429. package/dist/lib/tickets/list.js +153 -0
  430. package/dist/lib/tmux/orphan-reap.d.ts +320 -0
  431. package/dist/lib/tmux/orphan-reap.js +644 -0
  432. package/dist/lib/tmux/session.d.ts +68 -3
  433. package/dist/lib/tmux/session.js +95 -5
  434. package/dist/lib/triggers/handlers.d.ts +20 -0
  435. package/dist/lib/triggers/handlers.js +6 -1
  436. package/dist/lib/types.d.ts +46 -34
  437. package/dist/lib/usage-fleet.d.ts +32 -0
  438. package/dist/lib/usage-fleet.js +125 -0
  439. package/dist/lib/usage-refresh.d.ts +3 -3
  440. package/dist/lib/usage-refresh.js +19 -16
  441. package/dist/lib/usage.d.ts +51 -47
  442. package/dist/lib/usage.js +145 -153
  443. package/dist/lib/version-duplicates.js +2 -2
  444. package/dist/lib/versions.d.ts +56 -13
  445. package/dist/lib/versions.js +195 -45
  446. package/dist/lib/watchdog/log.d.ts +1 -1
  447. package/dist/lib/watchdog/log.js +3 -3
  448. package/dist/lib/watchdog/rotate.d.ts +6 -6
  449. package/dist/lib/watchdog/rotate.js +6 -6
  450. package/dist/lib/workflows.d.ts +1 -1
  451. package/dist/lib/yaml-io.d.ts +47 -0
  452. package/dist/lib/yaml-io.js +55 -0
  453. package/package.json +2 -1
  454. package/scripts/install-helper.js +2 -2
  455. package/scripts/postinstall.js +23 -20
  456. package/dist/commands/defaults.d.ts +0 -7
  457. package/dist/commands/defaults.js +0 -107
  458. package/dist/commands/export.d.ts +0 -11
  459. package/dist/commands/export.js +0 -215
  460. package/dist/commands/helper.d.ts +0 -12
  461. package/dist/commands/helper.js +0 -87
  462. package/dist/commands/hosts.d.ts +0 -11
  463. package/dist/commands/hosts.js +0 -330
  464. package/dist/commands/lock.d.ts +0 -12
  465. package/dist/commands/lock.js +0 -70
  466. package/dist/commands/pull.d.ts +0 -17
  467. package/dist/commands/pull.js +0 -39
  468. package/dist/commands/push.d.ts +0 -14
  469. package/dist/commands/push.js +0 -30
  470. package/dist/commands/wallet.d.ts +0 -20
  471. package/dist/commands/wallet.js +0 -216
  472. package/dist/commands/worktree.d.ts +0 -19
  473. package/dist/commands/worktree.js +0 -272
  474. package/dist/lib/account-labels.d.ts +0 -24
  475. package/dist/lib/account-labels.js +0 -72
  476. package/dist/lib/auto-dispatch-linear.d.ts +0 -18
  477. package/dist/lib/auto-dispatch-linear.js +0 -107
  478. package/dist/lib/auto-dispatch-provider.d.ts +0 -10
  479. package/dist/lib/auto-dispatch-provider.js +0 -30
  480. package/dist/lib/auto-dispatch.d.ts +0 -93
  481. package/dist/lib/auto-dispatch.js +0 -128
  482. package/dist/lib/export.d.ts +0 -72
  483. package/dist/lib/export.js +0 -269
  484. package/dist/lib/lock.d.ts +0 -93
  485. package/dist/lib/lock.js +0 -207
  486. package/dist/lib/wallet/index.d.ts +0 -78
  487. package/dist/lib/wallet/index.js +0 -253
@@ -8,84 +8,25 @@ 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
12
  import { execSync } from 'child_process';
12
13
  import { atomicWriteFileSync } from './fs-atomic.js';
13
14
  import { machineId } from './machine-id.js';
14
15
  import { AGENTS, agentConfigDirName, findInPath } from './agents.js';
15
16
  import { createLink } from './platform/index.js';
16
- import { migrateLegacyRoutineActivation, setJobEnabled, listJobs, validateJob } from './routines.js';
17
- import { addEnabledRoutinesOnUpgrade, enabledRoutineNames, replaceEnabledRoutines } from './routine-activation.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';
18
22
  import { evaluateActivationReadiness } from './routine-readiness.js';
19
- import { DAEMON_TICK_ROUTINE_NAMES } from './daemon-ticks.js';
23
+ import { migrateDeviceConfigToCentral } from './devices/config-migration.js';
20
24
  const HOME = process.env.HOME ?? os.homedir();
21
25
  const USER_DIR = path.join(HOME, '.agents');
22
26
  /** Canonical system-repo location (post-fold). */
23
27
  const SYSTEM_DIR = path.join(USER_DIR, '.system');
24
- /** Legacy system-repo location — folded into SYSTEM_DIR by foldLegacySystemRepo(). */
25
- const LEGACY_SYSTEM_DIR = path.join(HOME, '.agents-system');
26
28
  const HISTORY_DIR = path.join(USER_DIR, '.history');
27
29
  const CACHE_DIR = path.join(USER_DIR, '.cache');
28
- /**
29
- * Fold ~/.agents-system/ into ~/.agents/.system/.
30
- *
31
- * MUST run first in runMigration() — every other migrator reads SYSTEM_DIR
32
- * (the new path), so the contents have to be there before they execute.
33
- *
34
- * Strategy:
35
- * 1. If legacy dir doesn't exist or is already a symlink, no-op.
36
- * 2. If new path doesn't exist yet, rename in one shot (fast path).
37
- * 3. If both exist (mid-migration / re-run on partially-migrated state),
38
- * merge legacy → new with new winning on collision, then drop legacy.
39
- *
40
- * After the contents move, the legacy path becomes a symlink → SYSTEM_DIR
41
- * so external tooling that still references ~/.agents-system/ keeps
42
- * resolving correctly. The symlink is harmless on its own and can be
43
- * removed with `rm ~/.agents-system` once everything has updated.
44
- *
45
- * Idempotent: re-running converges to "contents at SYSTEM_DIR, symlink at
46
- * LEGACY_SYSTEM_DIR" without duplicating data.
47
- */
48
- export function foldLegacySystemRepo() {
49
- let legacyStat = null;
50
- try {
51
- legacyStat = fs.lstatSync(LEGACY_SYSTEM_DIR);
52
- }
53
- catch { /* missing */ }
54
- if (!legacyStat)
55
- return;
56
- if (legacyStat.isSymbolicLink())
57
- return;
58
- if (!legacyStat.isDirectory())
59
- return;
60
- try {
61
- fs.mkdirSync(USER_DIR, { recursive: true, mode: 0o700 });
62
- }
63
- catch { /* best-effort */ }
64
- if (!fs.existsSync(SYSTEM_DIR)) {
65
- try {
66
- fs.renameSync(LEGACY_SYSTEM_DIR, SYSTEM_DIR);
67
- try {
68
- createLink(SYSTEM_DIR, LEGACY_SYSTEM_DIR);
69
- }
70
- catch { /* best-effort */ }
71
- console.error('Folded ~/.agents-system/ into ~/.agents/.system/ (left back-compat symlink)');
72
- return;
73
- }
74
- catch {
75
- // Cross-device rename or perm issue — fall through to copy + remove.
76
- }
77
- }
78
- try {
79
- copyDirSkipExisting(LEGACY_SYSTEM_DIR, SYSTEM_DIR);
80
- fs.rmSync(LEGACY_SYSTEM_DIR, { recursive: true, force: true });
81
- try {
82
- createLink(SYSTEM_DIR, LEGACY_SYSTEM_DIR);
83
- }
84
- catch { /* best-effort */ }
85
- console.error('Merged ~/.agents-system/ into ~/.agents/.system/ (left back-compat symlink)');
86
- }
87
- catch { /* best-effort */ }
88
- }
89
30
  /** True when `relPath` is a file tracked by a git repo rooted at `repoDir`. */
90
31
  function isTrackedInGitRepo(repoDir, relPath) {
91
32
  try {
@@ -669,45 +610,6 @@ function mergeOverlappingVersionHomes() {
669
610
  console.error(`Merged ${mergedCount} overlapping version home${mergedCount === 1 ? '' : 's'} from legacy ~/.agents-system/versions/ into ~/.agents/versions/ (legacy moved to ~/.agents/.trash/versions/)`);
670
611
  }
671
612
  }
672
- function copyDirSkipExisting(src, dest) {
673
- let entries;
674
- try {
675
- entries = fs.readdirSync(src, { withFileTypes: true });
676
- }
677
- catch {
678
- return;
679
- }
680
- fs.mkdirSync(dest, { recursive: true, mode: 0o700 });
681
- for (const entry of entries) {
682
- const s = path.join(src, entry.name);
683
- const d = path.join(dest, entry.name);
684
- if (fs.existsSync(d)) {
685
- if (entry.isDirectory()) {
686
- const dStat = fs.lstatSync(d);
687
- if (dStat.isDirectory())
688
- copyDirSkipExisting(s, d);
689
- }
690
- continue;
691
- }
692
- try {
693
- fs.renameSync(s, d);
694
- }
695
- catch {
696
- try {
697
- if (entry.isDirectory()) {
698
- copyDirSkipExisting(s, d);
699
- }
700
- else if (entry.isSymbolicLink()) {
701
- fs.symlinkSync(fs.readlinkSync(s), d);
702
- }
703
- else {
704
- fs.copyFileSync(s, d);
705
- }
706
- }
707
- catch { /* best-effort */ }
708
- }
709
- }
710
- }
711
613
  /**
712
614
  * Rename ~/.agents/permissions/sets/ -> ~/.agents/permissions/presets/.
713
615
  * Also handles ~/.agents-system/permissions/sets/ for system repo.
@@ -810,7 +712,7 @@ function repairAgentConfigSymlinks() {
810
712
  /**
811
713
  * Repair self-referential agent binary symlinks.
812
714
  *
813
- * Some installScript-based agents — notably Factory's `droid`, whose installer
715
+ * Some installScript-based agents — notably Factory.ai's `droid`, whose installer
814
716
  * drops a standalone native binary at ~/.local/bin/droid — were registered at
815
717
  * install time by resolving the post-install binary with `which <cli>`. Because
816
718
  * ~/.agents/.cache/shims sits ahead of ~/.local/bin on PATH, `which` could
@@ -2091,35 +1993,37 @@ export function pauseUnreadyEnabledRoutines() {
2091
1993
  `(run 'agents routines doctor --all' to see why): ${paused.join(', ')}`);
2092
1994
  }
2093
1995
  /**
2094
- * Fold the legacy watchdog enable sentinel into the watchdog routine.
1996
+ * Fold the legacy watchdog enable sentinel into the `watchdog.enabled` config.
2095
1997
  *
2096
1998
  * The always-on watchdog used to be gated by a presence sentinel at
2097
- * `<runtime-state>/watchdog/enabled`; it is now a daemon routine. A user who had
2098
- * run `agents watchdog enable` under the old build has that file on disk — without
2099
- * this, upgrading would silently drop them back to OFF (the always-on nudge just
2100
- * stops), the worst failure mode for a "survives reboots" feature. If the sentinel
2101
- * exists, ensure the `watchdog` routine exists AND is enabled, then delete the
2102
- * sentinel so this runs exactly once. If ensuring the routine fails, the sentinel
2103
- * is left in place so a later run retries rather than silently losing the opt-in.
1999
+ * `<runtime-state>/watchdog/enabled`; it is now a daemon-owned timer (RUSH-2495)
2000
+ * gated by the `watchdog.enabled` device-config flag the same flag
2001
+ * `agents watchdog enable` writes. A user who had run `agents watchdog enable`
2002
+ * under the old build has that file on disk; without this, upgrading would
2003
+ * silently drop them back to OFF (the nudge just stops), the worst failure mode
2004
+ * for a "survives reboots" feature. If the sentinel exists, set
2005
+ * `watchdog.enabled: true`, then delete the sentinel so this runs exactly once.
2006
+ * If setting it fails, the sentinel is left in place so a later run retries
2007
+ * rather than silently losing the opt-in.
2104
2008
  *
2105
- * Both seams are injectable so the migration is unit-testable without touching the
2106
- * real routines dir (and without racing the routine module's own tests).
2009
+ * The setter seam is injectable so the migration is unit-testable without
2010
+ * touching the real device config.
2107
2011
  */
2108
- export function migrateWatchdogSentinelToRoutine(sentinelPath = path.join(CACHE_DIR, 'state', 'watchdog', 'enabled'), enable = setJobEnabled) {
2012
+ export function migrateWatchdogSentinelToConfig(sentinelPath = path.join(CACHE_DIR, 'state', 'watchdog', 'enabled'), enable = (value) => setConfigValue('watchdog.enabled', value)) {
2109
2013
  if (!fs.existsSync(sentinelPath))
2110
2014
  return;
2111
2015
  try {
2112
- enable('watchdog', true);
2016
+ enable(true);
2113
2017
  }
2114
2018
  catch (err) {
2115
- console.error(`watchdog sentinel migration: could not create the routine (${err.message}); leaving the sentinel for a later retry`);
2019
+ console.error(`watchdog sentinel migration: could not set watchdog.enabled (${err.message}); leaving the sentinel for a later retry`);
2116
2020
  return;
2117
2021
  }
2118
2022
  try {
2119
2023
  fs.rmSync(sentinelPath);
2120
2024
  }
2121
2025
  catch { /* already gone */ }
2122
- console.error('Migrated watchdog: legacy enable sentinel → watchdog routine (kept enabled)');
2026
+ console.error('Migrated watchdog: legacy enable sentinel → watchdog.enabled config (kept enabled)');
2123
2027
  }
2124
2028
  /**
2125
2029
  * Rename cli/ → clis/ in each of the given `.agents/` directories.
@@ -2245,7 +2149,10 @@ function migrateHumans() {
2245
2149
  if (notifyNode.items.length === 0)
2246
2150
  doc.delete('notify');
2247
2151
  }
2248
- fs.writeFileSync(agentsYamlPath, String(doc), 'utf-8');
2152
+ // `flowCollectionPadding: false` keeps committed flow sequences unpadded
2153
+ // (`[a, b]`, not `[ a, b ]`) so re-emitting agents.yaml here does not dirty
2154
+ // the synced ~/.agents tree and block pulls (RUSH-2505).
2155
+ fs.writeFileSync(agentsYamlPath, stringifyDoc(doc), 'utf-8');
2249
2156
  }
2250
2157
  catch { /* best-effort — leave the old key if we can't rewrite */ }
2251
2158
  }
@@ -2287,6 +2194,72 @@ export function seedActiveCursorLoginPerVersion() {
2287
2194
  }
2288
2195
  catch { /* best-effort — a failed seed just means one re-login */ }
2289
2196
  }
2197
+ /**
2198
+ * Fold the pre-markdown Kimi subagent layout out of every kimi version home.
2199
+ *
2200
+ * agents-cli used to write each Kimi subagent as a `<name>.yaml` +
2201
+ * `<name>.system.md` pair plus a managed `_agents-cli.yaml` index, against the
2202
+ * agentspec of `kimi-cli` — a different product from the `kimi-code` harness we
2203
+ * install, which never read any of it. Those files are inert, but not harmless:
2204
+ * `<name>.system.md` ends in `.md`, so the subagent enumerator would surface it
2205
+ * as a phantom subagent named `<name>.system`, and kimi-code logs
2206
+ * `Missing frontmatter` for it once per session.
2207
+ *
2208
+ * This is the ONE place that knows about the old layout — the registry target
2209
+ * describes only the current `<name>.md` shape. A pair is identified by its
2210
+ * signature (a `<name>.yaml` with a sibling `<name>.system.md`), so a subagent a
2211
+ * user legitimately named e.g. `foo.system` is never touched: it has no
2212
+ * `foo.yaml` beside it. Idempotent; a no-op once the dirs are clean.
2213
+ */
2214
+ export function migrateKimiSubagentsToMarkdown(versionsDir) {
2215
+ const kimiVersions = path.join(versionsDir ?? path.join(HISTORY_DIR, 'versions'), 'kimi');
2216
+ let versions;
2217
+ try {
2218
+ versions = fs.readdirSync(kimiVersions);
2219
+ }
2220
+ catch {
2221
+ return; // no kimi installed
2222
+ }
2223
+ let removed = 0;
2224
+ for (const version of versions) {
2225
+ const dir = path.join(kimiVersions, version, 'home', '.kimi-code', 'agents');
2226
+ let entries;
2227
+ try {
2228
+ entries = fs.readdirSync(dir);
2229
+ }
2230
+ catch {
2231
+ continue;
2232
+ }
2233
+ const present = new Set(entries);
2234
+ const doomed = [];
2235
+ for (const entry of entries) {
2236
+ if (entry === '_agents-cli.yaml') {
2237
+ doomed.push(entry); // reserved managed index, only ever written by us
2238
+ continue;
2239
+ }
2240
+ if (!entry.endsWith('.yaml'))
2241
+ continue;
2242
+ const base = entry.slice(0, -'.yaml'.length);
2243
+ // Only a genuine legacy pair — a bare .yaml with no sibling prompt is not
2244
+ // ours to delete.
2245
+ if (!present.has(`${base}.system.md`))
2246
+ continue;
2247
+ doomed.push(entry, `${base}.system.md`);
2248
+ }
2249
+ for (const entry of doomed) {
2250
+ try {
2251
+ fs.rmSync(path.join(dir, entry), { force: true });
2252
+ removed++;
2253
+ }
2254
+ catch {
2255
+ // leave it; the next run retries
2256
+ }
2257
+ }
2258
+ }
2259
+ if (removed > 0) {
2260
+ console.error(`Removed ${removed} pre-markdown Kimi subagent file(s); run 'agents sync kimi' to write the new format`);
2261
+ }
2262
+ }
2290
2263
  /** Run all idempotent migrations. Safe to call multiple times. */
2291
2264
  export async function runMigration() {
2292
2265
  // MUST run first: every other migrator reads SYSTEM_DIR (the new path).
@@ -2306,6 +2279,8 @@ export async function runMigration() {
2306
2279
  // Cursor runs now isolate the login per version home; preserve the current
2307
2280
  // login by seeding the active home's token from the legacy global copy.
2308
2281
  seedActiveCursorLoginPerVersion();
2282
+ // Drop the pre-markdown Kimi subagent files; the registry now writes <name>.md.
2283
+ migrateKimiSubagentsToMarkdown();
2309
2284
  migrateRunsIntoRoutines();
2310
2285
  migrateTrashToHidden();
2311
2286
  migrateBackupsToHidden();
@@ -2324,6 +2299,13 @@ export async function runMigration() {
2324
2299
  // agents.yaml. After migrateVersionResourcesToPatterns so versions: is already
2325
2300
  // in pattern form when it moves to the history file.
2326
2301
  migrateSplitDeviceLocalMeta();
2302
+ // Fold per-device operator config (device-doc config:/defaultBrowserProfile
2303
+ // and .history/devices/auto-launch.json) into the central
2304
+ // fleet.devices.<name>.config block. After migrateSplitDeviceLocalMeta so the
2305
+ // device docs are in their canonical location. Also invoked on daemon boot
2306
+ // and on the first device-config read/write in a process, so sentinel'd
2307
+ // installs (which skip this whole run) still converge.
2308
+ migrateDeviceConfigToCentral();
2327
2309
  // Bucket moves: collapse runtime state into ~/.agents/.history and ~/.agents/.cache.
2328
2310
  migrateRuntimeToHistory();
2329
2311
  migrateLegacySessionMarkersToBookmarks();
@@ -2358,13 +2340,9 @@ export async function runMigration() {
2358
2340
  // Fold legacy host-placement `remoteCwd` into the canonical portable `cwd`.
2359
2341
  migrateRoutineRemoteCwdToCwd();
2360
2342
  migrateLegacyRoutineActivation();
2361
- // These routines replace daemon timers that were always active. Devices with
2362
- // an existing activation manifest must retain that behavior after upgrade.
2363
- addEnabledRoutinesOnUpgrade(DAEMON_TICK_ROUTINE_NAMES);
2364
- // Fold the legacy watchdog enable sentinel into the watchdog routine so a user
2365
- // who opted in under the old build stays opted in after upgrading. After the
2366
- // routine rewrites above so the routines dir is in its canonical shape.
2367
- migrateWatchdogSentinelToRoutine();
2343
+ // Fold the legacy watchdog enable sentinel into `watchdog.enabled` config so a
2344
+ // user who opted in under the old build stays opted in after upgrading.
2345
+ migrateWatchdogSentinelToConfig();
2368
2346
  // Deactivate any routine whose execution context no longer resolves ready, so
2369
2347
  // an anchor-less agent/workflow routine cannot keep firing-and-failing after the
2370
2348
  // fold (RUSH-2290). Runs AFTER the tick/watchdog routines are added so those
@@ -38,6 +38,6 @@ export declare function resolveTierOverride(agent: AgentId, version?: string | n
38
38
  /** Every configured override entry, sorted by selector (for `agents models tier list`). */
39
39
  export declare function listTierOverrides(): TierOverrideEntry[];
40
40
  /** Pin `tier -> model` for a selector. Writes agents.yaml. */
41
- export declare function setTierOverride(selectorInput: string, tierInput: string, model: string): TierOverrideEntry;
41
+ export declare function setTierOverride(selectorInput: string, tierInput: string | ModelTier, model: string): TierOverrideEntry;
42
42
  /** Clear one tier (or all tiers when `tierInput` is omitted) for a selector. Returns true if anything changed. */
43
43
  export declare function clearTierOverride(selectorInput: string, tierInput?: string): boolean;
@@ -90,8 +90,21 @@ export function clearTierOverride(selectorInput, tierInput) {
90
90
  delete tiers[parsed.selector];
91
91
  changed = true;
92
92
  }
93
- model.tiers = tiers;
94
- return { ...meta, model };
93
+ // Drop the emptied container rather than leaving `model: {tiers: {}}` in the
94
+ // shared agents.yaml the same discipline lib/hosts/providers/local.ts uses
95
+ // for an emptied `hosts:`. A vestigial empty map is a real diff on a tracked
96
+ // file that every machine syncs, so clearing the last override would show up
97
+ // as a spurious local change on whichever box happened to run the command.
98
+ if (Object.keys(tiers).length > 0) {
99
+ model.tiers = tiers;
100
+ return { ...meta, model };
101
+ }
102
+ delete model.tiers;
103
+ if (Object.keys(model).length > 0)
104
+ return { ...meta, model };
105
+ const { model: _dropped, ...rest } = meta;
106
+ void _dropped;
107
+ return rest;
95
108
  });
96
109
  return changed;
97
110
  }
@@ -145,11 +145,25 @@ export declare function monitorRunsOnThisDevice(config: Pick<MonitorConfig, 'dev
145
145
  * per-type field/shape checks.
146
146
  */
147
147
  export declare function validateMonitor(config: Partial<MonitorConfig>): string[];
148
- /** List all monitor configs in ~/.agents/monitors/. */
148
+ /**
149
+ * List all monitor configs, unioning the user dir (~/.agents/monitors/) over the
150
+ * built-in system dir (~/.agents/.system/monitors/). Higher layer wins by name
151
+ * (first-seen), so a user monitor shadows a system built-in of the same name.
152
+ */
149
153
  export declare function listMonitors(): MonitorConfig[];
150
- /** Read a single monitor config by name. Returns null if not found or corrupt. */
154
+ /**
155
+ * Read a single monitor config by name, checking the user dir then the system
156
+ * dir (a user monitor shadows a system built-in). Returns null if not found or
157
+ * corrupt.
158
+ */
151
159
  export declare function readMonitor(name: string): MonitorConfig | null;
152
- /** Get the filesystem path of a monitor's YAML config, or null if not found. */
160
+ /**
161
+ * Get the filesystem path of a monitor's YAML config in the USER dir, or null.
162
+ * User-layer only by design — like routines' getJobPath (lib/routines.ts), its
163
+ * caller (`agents monitors edit`) writes to the returned path, and the system
164
+ * mirror is pull-only. To edit a system built-in, `edit` materializes a user
165
+ * copy (prefilled via readMonitor()) rather than opening the mirror.
166
+ */
153
167
  export declare function getMonitorPath(name: string): string | null;
154
168
  /** Write a monitor config to disk atomically, omitting fields that match defaults. */
155
169
  export declare function writeMonitor(config: MonitorConfig): void;
@@ -12,7 +12,7 @@
12
12
  import * as fs from 'fs';
13
13
  import * as path from 'path';
14
14
  import * as yaml from 'yaml';
15
- import { getMonitorsDir, ensureAgentsDir } from '../state.js';
15
+ import { getMonitorsDir, getSystemMonitorsDir, ensureAgentsDir } from '../state.js';
16
16
  import { safeJoin, isSafeSegmentName } from '../paths.js';
17
17
  import { atomicWriteFileSync } from '../fs-atomic.js';
18
18
  import { machineId, normalizeHost } from '../machine-id.js';
@@ -273,51 +273,85 @@ export function validateMonitor(config) {
273
273
  }
274
274
  return errors;
275
275
  }
276
- function readMonitorFile(filePath) {
276
+ /**
277
+ * Read and normalize a monitor file. `scope` decides the enabled default when
278
+ * the YAML has no explicit `enabled:` field: a `user` monitor defaults to
279
+ * enabled (MONITOR_DEFAULTS), while a `system` built-in stays opt-in (disabled)
280
+ * until the user enables it — mirroring how routines treat a fresh built-in
281
+ * (lib/routines.ts readJobFile).
282
+ */
283
+ function readMonitorFile(filePath, scope = 'user') {
277
284
  try {
278
285
  const content = fs.readFileSync(filePath, 'utf-8');
279
286
  const parsed = yaml.parse(content);
280
287
  if (!parsed || typeof parsed !== 'object')
281
288
  return null;
289
+ const hasEnabled = Object.prototype.hasOwnProperty.call(parsed, 'enabled');
282
290
  return {
283
291
  ...MONITOR_DEFAULTS,
284
292
  ...parsed,
285
293
  name: parsed.name || path.basename(filePath).replace(/\.ya?ml$/, ''),
294
+ // A system built-in with no explicit `enabled:` is opt-in until enabled;
295
+ // a user monitor keeps the enabled-by-default behavior.
296
+ enabled: hasEnabled ? parsed.enabled !== false : scope === 'system' ? false : (MONITOR_DEFAULTS.enabled ?? true),
286
297
  };
287
298
  }
288
299
  catch {
289
300
  return null;
290
301
  }
291
302
  }
292
- /** List all monitor configs in ~/.agents/monitors/. */
303
+ /** The layered monitor dirs, user before system so user shadows system by name. */
304
+ function monitorLayers() {
305
+ return [
306
+ { scope: 'user', path: getMonitorsDir() },
307
+ { scope: 'system', path: getSystemMonitorsDir() },
308
+ ];
309
+ }
310
+ /**
311
+ * List all monitor configs, unioning the user dir (~/.agents/monitors/) over the
312
+ * built-in system dir (~/.agents/.system/monitors/). Higher layer wins by name
313
+ * (first-seen), so a user monitor shadows a system built-in of the same name.
314
+ */
293
315
  export function listMonitors() {
294
316
  ensureAgentsDir();
295
- const dir = getMonitorsDir();
296
- if (!fs.existsSync(dir))
297
- return [];
298
317
  const monitors = [];
299
318
  const seen = new Set();
300
- for (const file of fs.readdirSync(dir).filter((f) => f.endsWith('.yml') || f.endsWith('.yaml'))) {
301
- const monitor = readMonitorFile(path.join(dir, file));
302
- if (!monitor || seen.has(monitor.name))
319
+ for (const { scope, path: dir } of monitorLayers()) {
320
+ if (!fs.existsSync(dir))
303
321
  continue;
304
- seen.add(monitor.name);
305
- monitors.push(monitor);
322
+ for (const file of fs.readdirSync(dir).filter((f) => f.endsWith('.yml') || f.endsWith('.yaml'))) {
323
+ const monitor = readMonitorFile(path.join(dir, file), scope);
324
+ if (!monitor || seen.has(monitor.name))
325
+ continue;
326
+ seen.add(monitor.name);
327
+ monitors.push(monitor);
328
+ }
306
329
  }
307
330
  return monitors;
308
331
  }
309
- /** Read a single monitor config by name. Returns null if not found or corrupt. */
332
+ /**
333
+ * Read a single monitor config by name, checking the user dir then the system
334
+ * dir (a user monitor shadows a system built-in). Returns null if not found or
335
+ * corrupt.
336
+ */
310
337
  export function readMonitor(name) {
311
338
  ensureAgentsDir();
312
- const dir = getMonitorsDir();
313
- for (const ext of ['.yml', '.yaml']) {
314
- const filePath = safeJoin(dir, name + ext);
315
- if (fs.existsSync(filePath))
316
- return readMonitorFile(filePath);
339
+ for (const { scope, path: dir } of monitorLayers()) {
340
+ for (const ext of ['.yml', '.yaml']) {
341
+ const filePath = safeJoin(dir, name + ext);
342
+ if (fs.existsSync(filePath))
343
+ return readMonitorFile(filePath, scope);
344
+ }
317
345
  }
318
346
  return null;
319
347
  }
320
- /** Get the filesystem path of a monitor's YAML config, or null if not found. */
348
+ /**
349
+ * Get the filesystem path of a monitor's YAML config in the USER dir, or null.
350
+ * User-layer only by design — like routines' getJobPath (lib/routines.ts), its
351
+ * caller (`agents monitors edit`) writes to the returned path, and the system
352
+ * mirror is pull-only. To edit a system built-in, `edit` materializes a user
353
+ * copy (prefilled via readMonitor()) rather than opening the mirror.
354
+ */
321
355
  export function getMonitorPath(name) {
322
356
  const dir = getMonitorsDir();
323
357
  for (const ext of ['.yml', '.yaml']) {
@@ -13,6 +13,19 @@
13
13
  */
14
14
  import { type MonitorConfig, type MonitorEvent } from './config.js';
15
15
  import { type Observation } from './sources/index.js';
16
+ /** Poll-model source types the engine actually evaluates on a cadence; ws/webhook are push-only and inert here. */
17
+ export declare const POLL_SOURCE_TYPES: Set<string>;
18
+ /**
19
+ * Whether a monitor's liveness has crossed into a drought worth notifying the
20
+ * owner about: enough consecutive failed checks, and not already notified for
21
+ * this drought. Pure so the branch is unit-testable without a real notify.
22
+ */
23
+ export declare function shouldEscalateDrought(liveness: MonitorLivenessLike): boolean;
24
+ /** The liveness fields the drought predicate reads. */
25
+ interface MonitorLivenessLike {
26
+ consecutiveErrors: number;
27
+ droughtNotifiedAt?: string;
28
+ }
16
29
  /** The fire/no-fire decision for one observation, plus what to persist. */
17
30
  export interface FireDecision {
18
31
  fire: boolean;
@@ -55,7 +68,25 @@ export declare class MonitorEngine {
55
68
  private isDue;
56
69
  /** Evaluate every due monitor once. Overlap-guarded so a slow cycle never stacks. */
57
70
  tick(): Promise<void>;
58
- private runMonitor;
71
+ /**
72
+ * Evaluate one monitor once and record the outcome. Public so the daemon tick
73
+ * and tests drive the exact same path. A "failed check" is an evaluation that
74
+ * produced no observation, threw, OR fired an action that failed — all three
75
+ * are "the monitor ran and accomplished nothing", the drought signal. A poll
76
+ * that observes and either fires cleanly or matches nothing is a success and
77
+ * resets the streak.
78
+ */
79
+ runMonitor(monitor: MonitorConfig): Promise<void>;
80
+ /**
81
+ * Record the poll heartbeat and, on a sustained failure streak, escalate a
82
+ * drought to the owner exactly once. The heartbeat is what makes a
83
+ * polling-but-not-matching monitor visibly distinct from one the engine never
84
+ * touched (RUSH-2485); the streak is what turns "every poll fails and the owner
85
+ * never hears about it" into one notification.
86
+ */
87
+ private afterCheck;
88
+ /** Notify the owner that an enabled monitor has failed N checks in a row and done nothing. */
89
+ private escalateDrought;
59
90
  private fire;
60
91
  }
61
92
  export {};