@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
@@ -39,20 +39,19 @@ export const loadCli = async () => (await import('../../commands/cli.js')).regis
39
39
  export const loadSubagents = async () => (await import('../../commands/subagents.js')).registerSubagentsCommands;
40
40
  export const loadPlugins = async () => (await import('../../commands/plugins.js')).registerPluginsCommands;
41
41
  export const loadWorkflows = async () => (await import('../../commands/workflows.js')).registerWorkflowsCommands;
42
- export const loadWorktree = async () => (await import('../../commands/worktree.js')).registerWorktreeCommands;
43
42
  export const loadVersions = async () => (await import('../../commands/versions.js')).registerVersionsCommands;
44
43
  export const loadUpdate = async () => (await import('../../commands/update.js')).registerUpdateCommand;
45
44
  export const loadImport = async () => (await import('../../commands/import.js')).registerImportCommand;
46
- export const loadExport = async () => (await import('../../commands/export.js')).registerExportCommand;
47
45
  export const loadPackages = async () => (await import('../../commands/packages.js')).registerPackagesCommands;
48
46
  export const loadRoutines = async () => (await import('../../commands/routines.js')).registerRoutinesCommands;
49
47
  export const loadMonitors = async () => (await import('../../commands/monitors.js')).registerMonitorsCommands;
50
48
  export const loadProjects = async () => (await import('../../commands/projects.js')).registerProjectsCommands;
51
49
  export const loadRun = async () => (await import('../../commands/exec.js')).registerRunCommand;
52
50
  export const loadResume = async () => (await import('../../commands/resume.js')).registerResumeCommand;
51
+ export const loadOpen = async () => (await import('../../commands/open.js')).registerOpenCommand;
53
52
  export const loadReconnect = async () => (await import('../../commands/reconnect.js')).registerReconnectCommand;
54
53
  export const loadFork = async () => (await import('../../commands/fork.js')).registerForkCommand;
55
- export const loadDefaults = async () => (await import('../../commands/defaults.js')).registerDefaultsCommands;
54
+ export const loadConfig = async () => (await import('../../commands/config.js')).registerConfigCommand;
56
55
  export const loadSet = async () => (await import('../../commands/set.js')).registerSetCommand;
57
56
  export const loadModels = async () => (await import('../../commands/models.js')).registerModelsCommand;
58
57
  export const loadModes = async () => (await import('../../commands/modes.js')).registerModesCommand;
@@ -67,12 +66,9 @@ export const loadProfiles = async () => (await import('../../commands/profiles.j
67
66
  export const loadHarness = async () => (await import('../../commands/harness.js')).registerHarnessCommands;
68
67
  export const loadSecrets = async () => (await import('../../commands/secrets.js')).registerSecretsCommands;
69
68
  export const loadLogin = async () => (await import('../../commands/login.js')).registerLoginCommands;
70
- export const loadWallet = async () => (await import('../../commands/wallet.js')).registerWalletCommands;
71
- export const loadHelper = async () => (await import('../../commands/helper.js')).registerHelperCommand;
72
69
  export const loadMenubar = async () => (await import('../../commands/menubar.js')).registerMenubarCommands;
73
70
  export const loadBeta = async () => (await import('../../commands/beta.js')).registerBetaCommands;
74
71
  export const loadSync = async () => (await import('../../commands/sync.js')).registerSyncCommand;
75
- export const loadLock = async () => (await import('../../commands/lock.js')).registerLockCommand;
76
72
  export const loadRefreshRules = async () => (await import('../../commands/refresh-rules.js')).registerRefreshRulesCommand;
77
73
  export const loadFactory = async () => (await import('../../commands/factory.js')).registerFactoryCommands;
78
74
  export const loadUsage = async () => (await import('../../commands/usage.js')).registerUsageCommand;
@@ -91,19 +87,16 @@ export const loadTmux = async () => (await import('../../commands/tmux.js')).reg
91
87
  export const loadWatchdog = async () => (await import('../../commands/watchdog.js')).registerWatchdogCommand;
92
88
  export const loadBrowser = async () => (await import('../../commands/browser.js')).registerBrowserCommand;
93
89
  export const loadComputer = async () => (await import('../../commands/computer.js')).registerComputerCommand;
94
- export const loadHosts = async () => (await import('../../commands/hosts.js')).registerHostsCommand;
95
- export const loadLease = async () => (await import('../../commands/lease.js')).registerLeaseCommand;
96
90
  export const loadLogs = async () => (await import('../../commands/logs.js')).registerLogsCommand;
97
91
  export const loadEvents = async () => (await import('../../commands/events.js')).registerEventsCommand;
98
92
  export const loadSsh = async () => (await import('../../commands/ssh.js')).registerSshCommands;
99
- export const loadPull = async () => (await import('../../commands/pull.js')).registerPullCommand;
100
- export const loadPush = async () => (await import('../../commands/push.js')).registerPushCommand;
101
93
  export const loadRepo = async () => (await import('../../commands/repo.js')).registerRepoCommands;
102
94
  export const loadSetup = async () => (await import('../../commands/setup.js')).registerSetupCommand;
103
95
  export const loadUninstall = async () => (await import('../../commands/uninstall.js')).registerUninstallCommands;
104
96
  export const loadUpgrade = async () => (await import('../../commands/upgrade.js')).registerUpgradeCommand;
105
97
  export const loadSessions = async () => (await import('../../commands/sessions.js')).registerSessionsCommands;
106
98
  export const loadTeams = async () => (await import('../../commands/teams.js')).registerTeamsCommands;
99
+ export const loadTickets = async () => (await import('../../commands/tickets.js')).registerTicketsCommand;
107
100
  export const loadCloud = async () => (await import('../../commands/cloud.js')).registerCloudCommands;
108
101
  export const loadMessage = async () => (await import('../../commands/message.js')).registerMessageCommand;
109
102
  export const loadSend = async () => (await import('../../commands/send.js')).registerSendCommand;
@@ -112,11 +105,11 @@ export const loadMailboxes = async () => (await import('../../commands/mailboxes
112
105
  export const loadServe = async () => (await import('../../commands/serve.js')).registerServeCommand;
113
106
  export const loadShare = async () => (await import('../../commands/share.js')).registerShareCommands;
114
107
  export const loadAudit = async () => (await import('../../commands/audit.js')).registerAuditCommands;
115
- export const loadWebhook = async () => (await import('../../commands/webhook.js')).registerWebhookCommand;
116
- export const loadFunnel = async () => (await import('../../commands/funnel.js')).registerFunnelCommand;
108
+ export const loadWebhooks = async () => (await import('../../commands/webhook.js')).registerWebhooksCommand;
117
109
  export const loadHumans = async () => (await import('../../commands/humans.js')).registerHumansCommands;
118
110
  export const loadAccounts = async () => (await import('../../commands/accounts.js')).registerAccountsCommand;
119
111
  export const loadDaemon = async () => (await import('../../commands/daemon.js')).registerDaemonCommand;
112
+ export const loadCp = async () => (await import('../../commands/cp.js')).registerCpCommand;
120
113
  /**
121
114
  * Commands whose modules pull in the SQLite-backed session/cloud stack. They are
122
115
  * registered AFTER `applyGlobalHelpConventions` (mirroring main's order: help
@@ -166,7 +159,6 @@ export const COMMAND_LOADERS = {
166
159
  subagents: [loadSubagents],
167
160
  plugins: [loadPlugins],
168
161
  workflows: [loadWorkflows],
169
- worktree: [loadWorktree],
170
162
  add: [loadVersions],
171
163
  use: [loadVersions],
172
164
  list: [loadVersions],
@@ -176,23 +168,18 @@ export const COMMAND_LOADERS = {
176
168
  update: [loadUpdate],
177
169
  prune: [loadVersions, loadPrune],
178
170
  import: [loadImport],
179
- export: [loadExport],
180
171
  registry: [loadPackages],
181
172
  search: [loadPackages],
182
173
  install: [loadPackages],
183
- // packages.ts also registers `publish` at top level (commands/packages.ts:435).
184
- // It was missing here, so `agents publish` only worked via the unknown-command
185
- // fallback that registers the whole tree — and the --host router could not see
186
- // it as a real command at all (RUSH-2022).
187
- publish: [loadPackages],
188
174
  routines: [loadRoutines],
189
175
  monitors: [loadMonitors],
190
176
  projects: [loadProjects],
191
177
  run: [loadRun],
192
178
  resume: [loadResume],
179
+ open: [loadOpen],
193
180
  reconnect: [loadReconnect],
194
181
  fork: [loadFork],
195
- defaults: [loadDefaults],
182
+ config: [loadConfig],
196
183
  set: [loadSet],
197
184
  models: [loadModels],
198
185
  modes: [loadModes],
@@ -202,20 +189,15 @@ export const COMMAND_LOADERS = {
202
189
  apply: [loadApply],
203
190
  status: [loadStatus],
204
191
  snapshot: [loadSnapshot],
205
- profile: [loadProfiles],
206
192
  profiles: [loadProfiles],
207
193
  harness: [loadHarness],
208
194
  harnesses: [loadHarness],
209
195
  secrets: [loadSecrets],
210
196
  login: [loadLogin],
211
197
  logout: [loadLogin],
212
- whoami: [loadLogin],
213
- wallet: [loadWallet],
214
- helper: [loadHelper],
215
198
  menubar: [loadMenubar],
216
199
  beta: [loadBeta],
217
200
  sync: [loadSync],
218
- lock: [loadLock],
219
201
  'refresh-rules': [loadRefreshRules],
220
202
  factory: [loadFactory],
221
203
  usage: [loadUsage],
@@ -233,8 +215,6 @@ export const COMMAND_LOADERS = {
233
215
  watchdog: [loadWatchdog],
234
216
  browser: [loadBrowser],
235
217
  computer: [loadComputer],
236
- hosts: [loadHosts],
237
- lease: [loadLease],
238
218
  logs: [loadLogs],
239
219
  events: [loadEvents],
240
220
  ssh: [loadSsh],
@@ -242,8 +222,6 @@ export const COMMAND_LOADERS = {
242
222
  // `fleet` is a commander alias of `devices` (see commands/ssh.ts); list it so
243
223
  // lazy registration loads the devices tree when the user types `agents fleet`.
244
224
  fleet: [loadSsh],
245
- pull: [loadPull],
246
- push: [loadPush],
247
225
  // `repos` is the canonical command name; `repo` remains a convenience alias
248
226
  // (see commands/repo.ts). List both so lazy registration loads the tree
249
227
  // whichever the user types.
@@ -256,6 +234,7 @@ export const COMMAND_LOADERS = {
256
234
  // Observe-umbrella alias of sessions --active (same lazy module).
257
235
  roster: [loadSessions],
258
236
  teams: [loadTeams],
237
+ tickets: [loadTickets],
259
238
  cloud: [loadCloud],
260
239
  message: [loadMessage],
261
240
  send: [loadSend],
@@ -272,10 +251,10 @@ export const COMMAND_LOADERS = {
272
251
  // commands/share.ts) — same module, registered as its own program.command().
273
252
  unshare: [loadShare],
274
253
  audit: [loadAudit],
275
- webhook: [loadWebhook],
276
- funnel: [loadFunnel],
254
+ webhooks: [loadWebhooks],
277
255
  humans: [loadHumans],
278
256
  daemon: [loadDaemon],
257
+ cp: [loadCp],
279
258
  };
280
259
  /**
281
260
  * Top-level names that {@link COMMAND_LOADERS} does not carry because they are
@@ -309,6 +288,7 @@ export const KNOWN_TOP_LEVEL_COMMANDS = new Set([
309
288
  ...Object.keys(COMMAND_LOADERS),
310
289
  ...INLINE_COMMAND_NAMES,
311
290
  ]);
291
+ export const RETIRED_TOP_LEVEL_COMMANDS = new Set(['webhook']);
312
292
  /** Whether `name` is a top-level command this CLI registers. See {@link KNOWN_TOP_LEVEL_COMMANDS}. */
313
293
  export function isKnownTopLevelCommand(name) {
314
294
  return KNOWN_TOP_LEVEL_COMMANDS.has(name);
@@ -19,4 +19,14 @@
19
19
  * actually be the agents-cli package (its package.json `name`), not some
20
20
  * unrelated ancestor that happens to be version-controlled.
21
21
  */
22
+ /**
23
+ * Whether a version string is the `0.0.0-dev.<sha>[-dirty]` stamp
24
+ * `scripts/install.sh` writes for a side-by-side dev install (`install.sh:61`).
25
+ *
26
+ * Split out from {@link detectDevBuild} because a caller holding only a version
27
+ * string — a fleet rollout reading `agents --version` off a remote box — cannot
28
+ * run signal 2 (it needs that machine's filesystem), and must not re-spell the
29
+ * stamp prefix.
30
+ */
31
+ export declare function isDevVersionStamp(version: string): boolean;
22
32
  export declare function detectDevBuild(argv1: string, version: string): boolean;
@@ -21,8 +21,20 @@ import * as path from 'path';
21
21
  * actually be the agents-cli package (its package.json `name`), not some
22
22
  * unrelated ancestor that happens to be version-controlled.
23
23
  */
24
+ /**
25
+ * Whether a version string is the `0.0.0-dev.<sha>[-dirty]` stamp
26
+ * `scripts/install.sh` writes for a side-by-side dev install (`install.sh:61`).
27
+ *
28
+ * Split out from {@link detectDevBuild} because a caller holding only a version
29
+ * string — a fleet rollout reading `agents --version` off a remote box — cannot
30
+ * run signal 2 (it needs that machine's filesystem), and must not re-spell the
31
+ * stamp prefix.
32
+ */
33
+ export function isDevVersionStamp(version) {
34
+ return version.startsWith('0.0.0-dev');
35
+ }
24
36
  export function detectDevBuild(argv1, version) {
25
- if (version.startsWith('0.0.0-dev'))
37
+ if (isDevVersionStamp(version))
26
38
  return true;
27
39
  try {
28
40
  const cliPath = fs.realpathSync(argv1 || '');
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Top-level command spellcheck (RUSH-2329).
3
+ *
4
+ * Candidates are plain strings from KNOWN_TOP_LEVEL_COMMANDS — never the live
5
+ * commander registry — so an unknown / typo'd invocation does not pay for
6
+ * registerAllEagerCommands (~250-330ms of dynamic import + module eval).
7
+ */
8
+ /** Calculate the Levenshtein edit distance between two strings. */
9
+ export declare function levenshtein(a: string, b: string): number;
10
+ /**
11
+ * Closest top-level command name by Levenshtein distance.
12
+ * Iterates candidates in first-seen order so ties break the same way as the
13
+ * historical registerAllEagerCommands registration order (RUSH-2329).
14
+ */
15
+ export declare function closestTopLevelCommand(unknown: string, candidates: Iterable<string>): {
16
+ closest: string | null;
17
+ minDist: number;
18
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Top-level command spellcheck (RUSH-2329).
3
+ *
4
+ * Candidates are plain strings from KNOWN_TOP_LEVEL_COMMANDS — never the live
5
+ * commander registry — so an unknown / typo'd invocation does not pay for
6
+ * registerAllEagerCommands (~250-330ms of dynamic import + module eval).
7
+ */
8
+ /** Calculate the Levenshtein edit distance between two strings. */
9
+ export function levenshtein(a, b) {
10
+ const m = a.length;
11
+ const n = b.length;
12
+ const dp = Array(m + 1)
13
+ .fill(null)
14
+ .map(() => Array(n + 1).fill(0));
15
+ for (let i = 0; i <= m; i++)
16
+ dp[i][0] = i;
17
+ for (let j = 0; j <= n; j++)
18
+ dp[0][j] = j;
19
+ for (let i = 1; i <= m; i++) {
20
+ for (let j = 1; j <= n; j++) {
21
+ dp[i][j] =
22
+ a[i - 1] === b[j - 1]
23
+ ? dp[i - 1][j - 1]
24
+ : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
25
+ }
26
+ }
27
+ return dp[m][n];
28
+ }
29
+ /**
30
+ * Closest top-level command name by Levenshtein distance.
31
+ * Iterates candidates in first-seen order so ties break the same way as the
32
+ * historical registerAllEagerCommands registration order (RUSH-2329).
33
+ */
34
+ export function closestTopLevelCommand(unknown, candidates) {
35
+ let closest = null;
36
+ let minDist = Infinity;
37
+ for (const cmd of candidates) {
38
+ const dist = levenshtein(unknown, cmd);
39
+ if (dist < minDist) {
40
+ minDist = dist;
41
+ closest = cmd;
42
+ }
43
+ }
44
+ return { closest, minDist };
45
+ }
@@ -29,7 +29,7 @@ export declare function getHumansFilePath(): string;
29
29
  * Header prepended to every agents.yaml the CLI writes (central and per-device
30
30
  * docs). Carries the yaml-language-server schema hint so editors validate the
31
31
  * file against `schema/agents-yaml.schema.json`. Exported so
32
- * `lib/device-config.ts` writes a sibling device's doc with the same header.
32
+ * `lib/devices/config-migration.ts` rewrites a device doc with the same header.
33
33
  */
34
34
  export declare const META_HEADER = "# agents-cli metadata\n# Auto-generated - do not edit manually\n# https://github.com/phnx-labs/agents-cli\n# yaml-language-server: $schema=https://raw.githubusercontent.com/phnx-labs/agents-cli/main/apps/cli/schema/agents-yaml.schema.json\n\n";
35
35
  /** Root of the system data directory (~/.agents/.system/). */
@@ -140,6 +140,8 @@ export declare function getPackagesDir(): string;
140
140
  export declare function getRoutinesDir(): string;
141
141
  /** Path to named project definitions (~/.agents/projects/). */
142
142
  export declare function getProjectsDir(): string;
143
+ /** Path to daemon config directory (~/.agents/daemon/). Holds service toggles. */
144
+ export declare function getDaemonConfigDir(): string;
143
145
  /**
144
146
  * Path to webhook handler YAML definitions (~/.agents/webhooks/). Handlers are
145
147
  * one-off triggers for agents/workflows/commands/routines, layered the same way
@@ -164,12 +166,12 @@ export declare function getSystemWebhooksDir(): string;
164
166
  * or null when no project `.agents/` is found by walking up from cwd.
165
167
  *
166
168
  * Project routines participate in `list`/`view` for inspection always. Daemon
167
- * firing requires an explicit opt-in via `agents routines enable-project`
168
- * (writes `meta.routines.projects`); after opt-in, `agents routines sync`
169
- * materialises them into the user layer with `source:` provenance so the
170
- * daemon (which loads user + system only) can fire them safely. A project's
171
- * own `agents.yaml` `routines.enable: true` is a documentation signal only
172
- * it does not auto-enable firing. See `lib/routines-project.ts`.
169
+ * firing requires `agents routines enable <name>`, which materialises the
170
+ * routine into the user layer with `source:` provenance (so the daemon, which
171
+ * loads user + system only, can see it) and turns on the device flag in one
172
+ * step. Enablement lives solely in `meta.deviceRoutines`; a project YAML's own
173
+ * `enabled:` field never turns firing on, so a cloned repo cannot auto-run.
174
+ * See `lib/routines-project.ts`.
173
175
  */
174
176
  export declare function getProjectRoutinesDir(cwd?: string): string | null;
175
177
  /**
@@ -182,6 +184,16 @@ export declare function getProjectWebhooksDir(cwd?: string): string | null;
182
184
  export declare function getRunsDir(): string;
183
185
  /** Path to monitor YAML definitions (~/.agents/monitors/). */
184
186
  export declare function getMonitorsDir(): string;
187
+ /**
188
+ * Path to built-in monitor definitions shipped in the system repo
189
+ * (`~/.agents/.system/monitors/`). Unioned under the user monitors dir by
190
+ * listMonitors()/readMonitor(): a monitor shipped here is available on every
191
+ * install, and a user monitor of the same name overrides it. A built-in with no
192
+ * `enabled:` field is opt-in — it stays disabled until the user enables it,
193
+ * which materializes a user copy (writes never touch this pull-only mirror). The
194
+ * directory need not exist.
195
+ */
196
+ export declare function getSystemMonitorsDir(): string;
185
197
  /** Path to the durable per-monitor state-diff store + fire history
186
198
  * (~/.agents/.history/monitors/). */
187
199
  export declare function getMonitorsHistoryDir(): string;
@@ -238,7 +250,7 @@ export declare function getTeamsRegistryPath(): string;
238
250
  export declare function getDevicesRegistryPath(): string;
239
251
  /** Path to the device ignore-list — tailscale node names the user dismissed, so auto-discovery never re-suggests them. Per-machine, same dir as the registry. */
240
252
  export declare function getDevicesIgnoredPath(): string;
241
- /** Path to the device auto-launch preference file — which registered devices are eligible/preferred for Factory's auto-host selection. Per-machine, same dir as the registry. */
253
+ /** Path to the LEGACY device auto-launch preference file — which registered devices are eligible/preferred for the ext's auto-host selection. Superseded by the central `fleet.devices.<name>.config` block; only lib/devices/config-migration.ts still reads it (to fold + remove it). */
242
254
  export declare function getDevicesAutoLaunchPath(): string;
243
255
  /** Dir of "pending device" sentinels (~/.agents/.cache/state/devices-pending/) — one empty-ish file per newly-discovered, not-yet-approved tailnet node. Written by the daemon probe, read by the menu-bar helper (mirrors the attention sentinel dir). */
244
256
  export declare function getDevicesPendingDir(): string;
@@ -266,7 +278,22 @@ export declare function getPerfDir(): string;
266
278
  export declare function getPerfDbPath(): string;
267
279
  /** Path to the hook-shim NDJSON spool drained into perf.db on open. */
268
280
  export declare function getPerfSpoolPath(): string;
269
- /** Path to per-process runtime state (~/.agents/.cache/state/). */
281
+ /**
282
+ * Path to per-process runtime state (~/.agents/.cache/state/).
283
+ *
284
+ * `AGENTS_STATE_DIR` redirects it in tests — the same test-isolation escape
285
+ * hatch as `AGENTS_DEVICES_DIR` / `AGENTS_LOGS_DIR`, and resolved at call time
286
+ * for the same reason (a suite pins it after this module is imported).
287
+ *
288
+ * Without it the suite writes into the operator's LIVE state. Concretely: the
289
+ * device registry and ignore-list already redirect via `AGENTS_DEVICES_DIR`, so
290
+ * under test both read empty — and any code path reaching
291
+ * `reconcilePendingSentinels` then computed "every tailnet node is new" and
292
+ * wrote those sentinels into the real `devices-pending/`, which is exactly what
293
+ * the menu bar renders. Running the suite on a dev machine surfaced all 20
294
+ * tailnet nodes as NEW DEVICES, including registered and explicitly ignored
295
+ * ones, and looked like the operator's ignore list had been lost.
296
+ */
270
297
  export declare function getRuntimeStateDir(): string;
271
298
  /** Path to companion-extension scratch (~/.agents/.cache/companion/). */
272
299
  export declare function getCompanionDir(): string;
package/dist/lib/state.js CHANGED
@@ -26,6 +26,7 @@ import * as fs from 'fs';
26
26
  import * as path from 'path';
27
27
  import * as os from 'os';
28
28
  import * as yaml from 'yaml';
29
+ import { stringifyDoc } from './yaml-io.js';
29
30
  import { execFileSync } from 'child_process';
30
31
  import { ensureLockTarget, atomicWriteFileSync, withFileLock } from './fs-atomic.js';
31
32
  import { DEFAULT_SYSTEM_REPO, systemRepoSlug } from './types.js';
@@ -78,6 +79,11 @@ const SYSTEM_PLUGINS_DIR = path.join(SYSTEM_AGENTS_DIR, 'plugins');
78
79
  // Unioned under user routines by listJobs()/readJob() so a routine shipped here
79
80
  // fires for every install, while a user routine of the same name overrides it.
80
81
  const SYSTEM_ROUTINES_DIR = path.join(SYSTEM_AGENTS_DIR, 'routines');
82
+ // Built-in monitors shipped in the system repo (gh:phnx-labs/.agents-system).
83
+ // Unioned under user monitors by listMonitors()/readMonitor() so a monitor
84
+ // shipped here is available on every install, while a user monitor of the same
85
+ // name overrides it (a built-in with no `enabled:` field stays opt-in).
86
+ const SYSTEM_MONITORS_DIR = path.join(SYSTEM_AGENTS_DIR, 'monitors');
81
87
  const SYSTEM_WEBHOOKS_DIR = path.join(SYSTEM_AGENTS_DIR, 'webhooks');
82
88
  const SYSTEM_PROMPTCUTS_FILE = path.join(SYSTEM_AGENTS_DIR, 'hooks', 'promptcuts.yaml');
83
89
  const SYSTEM_MCP_CONFIG_FILE = path.join(SYSTEM_AGENTS_DIR, 'mcp.json');
@@ -97,6 +103,9 @@ const TEAMS_DIR = path.join(USER_AGENTS_DIR, 'teams');
97
103
  // Named project definitions (the layer above the --project convention). Sibling
98
104
  // of ROUTINES_DIR/TEAMS_DIR: hand-editable YAML, synced across machines by push/pull.
99
105
  const PROJECTS_DIR = path.join(USER_AGENTS_DIR, 'projects');
106
+ // Daemon service toggles and persistent daemon config. Top-level config/definitions
107
+ // dir like routines/webhooks; runtime state (pid/heartbeat/logs) stays in .cache.
108
+ const DAEMON_CONFIG_DIR = path.join(USER_AGENTS_DIR, 'daemon');
100
109
  // History bucket (durable).
101
110
  const SESSIONS_DIR = path.join(HISTORY_DIR, 'sessions');
102
111
  const SESSIONS_DB_PATH = path.join(SESSIONS_DIR, 'sessions.db');
@@ -154,7 +163,7 @@ const USER_PROMPTCUTS_FILE = path.join(USER_AGENTS_DIR, 'hooks', 'promptcuts.yam
154
163
  * Header prepended to every agents.yaml the CLI writes (central and per-device
155
164
  * docs). Carries the yaml-language-server schema hint so editors validate the
156
165
  * file against `schema/agents-yaml.schema.json`. Exported so
157
- * `lib/device-config.ts` writes a sibling device's doc with the same header.
166
+ * `lib/devices/config-migration.ts` rewrites a device doc with the same header.
158
167
  */
159
168
  export const META_HEADER = `# agents-cli metadata
160
169
  # Auto-generated - do not edit manually
@@ -411,6 +420,8 @@ export function getPackagesDir() { return PACKAGES_DIR; }
411
420
  export function getRoutinesDir() { return process.env.AGENTS_ROUTINES_DIR ?? ROUTINES_DIR; }
412
421
  /** Path to named project definitions (~/.agents/projects/). */
413
422
  export function getProjectsDir() { return process.env.AGENTS_PROJECTS_DIR ?? PROJECTS_DIR; }
423
+ /** Path to daemon config directory (~/.agents/daemon/). Holds service toggles. */
424
+ export function getDaemonConfigDir() { return process.env.AGENTS_DAEMON_CONFIG_DIR ?? DAEMON_CONFIG_DIR; }
414
425
  /**
415
426
  * Path to webhook handler YAML definitions (~/.agents/webhooks/). Handlers are
416
427
  * one-off triggers for agents/workflows/commands/routines, layered the same way
@@ -435,12 +446,12 @@ export function getSystemWebhooksDir() { return process.env.AGENTS_SYSTEM_WEBHOO
435
446
  * or null when no project `.agents/` is found by walking up from cwd.
436
447
  *
437
448
  * Project routines participate in `list`/`view` for inspection always. Daemon
438
- * firing requires an explicit opt-in via `agents routines enable-project`
439
- * (writes `meta.routines.projects`); after opt-in, `agents routines sync`
440
- * materialises them into the user layer with `source:` provenance so the
441
- * daemon (which loads user + system only) can fire them safely. A project's
442
- * own `agents.yaml` `routines.enable: true` is a documentation signal only
443
- * it does not auto-enable firing. See `lib/routines-project.ts`.
449
+ * firing requires `agents routines enable <name>`, which materialises the
450
+ * routine into the user layer with `source:` provenance (so the daemon, which
451
+ * loads user + system only, can see it) and turns on the device flag in one
452
+ * step. Enablement lives solely in `meta.deviceRoutines`; a project YAML's own
453
+ * `enabled:` field never turns firing on, so a cloned repo cannot auto-run.
454
+ * See `lib/routines-project.ts`.
444
455
  */
445
456
  export function getProjectRoutinesDir(cwd = process.cwd()) {
446
457
  const projectAgentsDir = getProjectAgentsDir(cwd);
@@ -462,7 +473,17 @@ export function getProjectWebhooksDir(cwd = process.cwd()) {
462
473
  /** Path to routine execution logs (~/.agents/.history/runs/). */
463
474
  export function getRunsDir() { return RUNS_DIR; }
464
475
  /** Path to monitor YAML definitions (~/.agents/monitors/). */
465
- export function getMonitorsDir() { return MONITORS_DIR; }
476
+ export function getMonitorsDir() { return process.env.AGENTS_MONITORS_DIR ?? MONITORS_DIR; }
477
+ /**
478
+ * Path to built-in monitor definitions shipped in the system repo
479
+ * (`~/.agents/.system/monitors/`). Unioned under the user monitors dir by
480
+ * listMonitors()/readMonitor(): a monitor shipped here is available on every
481
+ * install, and a user monitor of the same name overrides it. A built-in with no
482
+ * `enabled:` field is opt-in — it stays disabled until the user enables it,
483
+ * which materializes a user copy (writes never touch this pull-only mirror). The
484
+ * directory need not exist.
485
+ */
486
+ export function getSystemMonitorsDir() { return process.env.AGENTS_SYSTEM_MONITORS_DIR ?? SYSTEM_MONITORS_DIR; }
466
487
  /** Path to the durable per-monitor state-diff store + fire history
467
488
  * (~/.agents/.history/monitors/). */
468
489
  export function getMonitorsHistoryDir() { return MONITORS_HISTORY_DIR; }
@@ -543,10 +564,10 @@ function getDevicesDir() {
543
564
  export function getDevicesRegistryPath() { return path.join(getDevicesDir(), 'registry.json'); }
544
565
  /** Path to the device ignore-list — tailscale node names the user dismissed, so auto-discovery never re-suggests them. Per-machine, same dir as the registry. */
545
566
  export function getDevicesIgnoredPath() { return path.join(getDevicesDir(), 'ignored.json'); }
546
- /** Path to the device auto-launch preference file — which registered devices are eligible/preferred for Factory's auto-host selection. Per-machine, same dir as the registry. */
567
+ /** Path to the LEGACY device auto-launch preference file — which registered devices are eligible/preferred for the ext's auto-host selection. Superseded by the central `fleet.devices.<name>.config` block; only lib/devices/config-migration.ts still reads it (to fold + remove it). */
547
568
  export function getDevicesAutoLaunchPath() { return path.join(getDevicesDir(), 'auto-launch.json'); }
548
569
  /** Dir of "pending device" sentinels (~/.agents/.cache/state/devices-pending/) — one empty-ish file per newly-discovered, not-yet-approved tailnet node. Written by the daemon probe, read by the menu-bar helper (mirrors the attention sentinel dir). */
549
- export function getDevicesPendingDir() { return path.join(RUNTIME_STATE_DIR, 'devices-pending'); }
570
+ export function getDevicesPendingDir() { return path.join(getRuntimeStateDir(), 'devices-pending'); }
550
571
  /** Path to cloud dispatch cache (~/.agents/.cache/cloud/). */
551
572
  export function getCloudDir() { return CLOUD_DIR; }
552
573
  /** Path to terminal session metadata (~/.agents/.cache/terminals/). */
@@ -575,8 +596,23 @@ export function getPerfDir() {
575
596
  export function getPerfDbPath() { return path.join(getPerfDir(), 'perf.db'); }
576
597
  /** Path to the hook-shim NDJSON spool drained into perf.db on open. */
577
598
  export function getPerfSpoolPath() { return path.join(getPerfDir(), 'spool.jsonl'); }
578
- /** Path to per-process runtime state (~/.agents/.cache/state/). */
579
- export function getRuntimeStateDir() { return RUNTIME_STATE_DIR; }
599
+ /**
600
+ * Path to per-process runtime state (~/.agents/.cache/state/).
601
+ *
602
+ * `AGENTS_STATE_DIR` redirects it in tests — the same test-isolation escape
603
+ * hatch as `AGENTS_DEVICES_DIR` / `AGENTS_LOGS_DIR`, and resolved at call time
604
+ * for the same reason (a suite pins it after this module is imported).
605
+ *
606
+ * Without it the suite writes into the operator's LIVE state. Concretely: the
607
+ * device registry and ignore-list already redirect via `AGENTS_DEVICES_DIR`, so
608
+ * under test both read empty — and any code path reaching
609
+ * `reconcilePendingSentinels` then computed "every tailnet node is new" and
610
+ * wrote those sentinels into the real `devices-pending/`, which is exactly what
611
+ * the menu bar renders. Running the suite on a dev machine surfaced all 20
612
+ * tailnet nodes as NEW DEVICES, including registered and explicitly ignored
613
+ * ones, and looked like the operator's ignore list had been lost.
614
+ */
615
+ export function getRuntimeStateDir() { return process.env.AGENTS_STATE_DIR ?? RUNTIME_STATE_DIR; }
580
616
  /** Path to companion-extension scratch (~/.agents/.cache/companion/). */
581
617
  export function getCompanionDir() { return COMPANION_CACHE_DIR; }
582
618
  /** Path to browser runtime data — chrome-data, pids (~/.agents/.cache/browser/). */
@@ -787,9 +823,10 @@ function writeIfChanged(filePath, content) {
787
823
  /**
788
824
  * Partition the in-memory Meta across three files by sync-domain:
789
825
  * - central `~/.agents/agents.yaml` — portable, everything else
790
- * (including the user-scope `config:` block)
826
+ * (including the user-scope `config:` block and the per-device
827
+ * operator config under `fleet.devices.<name>.config`)
791
828
  * - device `~/.agents/devices/<machine>/agents.yaml` — `agents:` pins +
792
- * `defaultBrowserProfile:` + device-scope `config:` (all per-device)
829
+ * `routines:` (all per-machine)
793
830
  * - history `~/.agents/.history/version-resources.json` — `versions:` (machine-local)
794
831
  * All callers funnel through writeMeta → here, so nothing else changes. Empty
795
832
  * `agents:` / `versions:` are not written (no empty committed files).
@@ -810,10 +847,11 @@ const META_KEY_SCOPE = {
810
847
  agents: 'device',
811
848
  isolatedAgents: 'device',
812
849
  versions: 'device',
813
- defaultBrowserProfile: 'device',
814
- deviceConfig: 'device',
815
850
  deviceRoutines: 'device',
851
+ deviceConfig: 'device',
852
+ deviceBrowser: 'device',
816
853
  // Central — synced via agents.yaml.
854
+ accounts: 'central',
817
855
  run: 'central',
818
856
  model: 'central',
819
857
  watchdog: 'central',
@@ -825,7 +863,7 @@ const META_KEY_SCOPE = {
825
863
  registries: 'central',
826
864
  profiles: 'central',
827
865
  source: 'central',
828
- projectRoot: 'central',
866
+ projectRoot: 'device',
829
867
  extraRepos: 'central',
830
868
  brands: 'central',
831
869
  actors: 'central',
@@ -837,7 +875,6 @@ const META_KEY_SCOPE = {
837
875
  fleet: 'central',
838
876
  share: 'central',
839
877
  notify: 'central',
840
- routines: 'central',
841
878
  };
842
879
  /**
843
880
  * Every key this version models (central + device). serializeCentral deletes an
@@ -903,14 +940,16 @@ function serializeCentral(central) {
903
940
  if (!changed)
904
941
  return existing;
905
942
  // Everything cleared → header only (never leave a flow `{}` behind).
906
- // Otherwise force BLOCK style: an existing flow root (e.g. a legacy `{}`) would
907
- // otherwise make the edited nodes render flow (`disabledCommands: [ teams ]`
908
- // instead of a `- teams` block list). collectionStyle pins the whole doc block
909
- // while parseDocument still preserves comments + key ordering.
910
- return isEmpty ? META_HEADER : doc.toString({ collectionStyle: 'block' });
943
+ // Otherwise stringifyDoc: it still normalizes a legacy flow root (`{}`) to
944
+ // block, so edited nodes do not render flow (`disabledCommands: [ teams ]`
945
+ // instead of a `- teams` block list), but it no longer forces block on a
946
+ // normal document that flattened committed flow sequences and made this
947
+ // writer disagree with feed.ts/activity.ts/migrate.ts on the same file
948
+ // (RUSH-2505). parseDocument still preserves comments + key ordering.
949
+ return isEmpty ? META_HEADER : stringifyDoc(doc);
911
950
  }
912
951
  function writeMetaUnlocked(meta) {
913
- const { agents, isolatedAgents, versions, defaultBrowserProfile, deviceConfig, deviceRoutines, ...central } = meta;
952
+ const { agents, isolatedAgents, versions, deviceRoutines, deviceConfig, deviceBrowser, projectRoot, ...central } = meta;
914
953
  // Write the machine-local files FIRST, then strip central — so a crash mid-write
915
954
  // never removes pins/versions from central before they're persisted elsewhere.
916
955
  const devicePath = getDeviceMetaPath();
@@ -920,26 +959,32 @@ function writeMetaUnlocked(meta) {
920
959
  // central doc that syncs — otherwise another machine inherits a pointer to a copy
921
960
  // it does not have.
922
961
  const hasIsolatedAgents = !!isolatedAgents && Object.keys(isolatedAgents).length > 0;
923
- const hasDefaultBrowser = !!defaultBrowserProfile;
924
- // Device-scope config (`maxAgents`, `schedulerEnabled`, …) is per-machine, so it
925
- // rides the device doc under `config:` — never the central doc that syncs.
926
- const hasDeviceConfig = !!deviceConfig && Object.keys(deviceConfig).length > 0;
927
962
  const hasDeviceRoutines = Array.isArray(deviceRoutines);
928
- if (hasAgents || hasIsolatedAgents || hasDefaultBrowser || hasDeviceConfig || hasDeviceRoutines) {
929
- // Device-local doc carries `agents:` pins, `defaultBrowserProfile:`, and the
930
- // device-scope `config:` all per-machine and must never land in central
931
- // agents.yaml (which syncs).
963
+ // Machine-visibility operator config. Lives here rather than in the synced
964
+ // central file because nothing off-box reads it — and because
965
+ // browser.remote-control is a consent flag that must not propagate on pull.
966
+ const hasDeviceConfig = !!deviceConfig && Object.keys(deviceConfig).length > 0;
967
+ const hasDeviceBrowser = !!deviceBrowser && Object.keys(deviceBrowser).length > 0;
968
+ // An inferred local filesystem path — machine state, never fleet policy.
969
+ const hasProjectRoot = typeof projectRoot === 'string' && projectRoot.length > 0;
970
+ if (hasAgents || hasIsolatedAgents || hasDeviceRoutines || hasDeviceConfig || hasDeviceBrowser || hasProjectRoot) {
971
+ // Device-local doc carries `agents:` pins and `routines:` — per-machine and
972
+ // must never land in central agents.yaml (which syncs). Operator config
973
+ // used to ride this doc under `config:`; it now lives centrally under
974
+ // `fleet.devices.<name>.config` (see lib/device-config.ts).
932
975
  const deviceDoc = {};
933
976
  if (hasAgents)
934
977
  deviceDoc.agents = agents;
935
978
  if (hasIsolatedAgents)
936
979
  deviceDoc.isolatedAgents = isolatedAgents;
937
- if (hasDefaultBrowser)
938
- deviceDoc.defaultBrowserProfile = defaultBrowserProfile;
939
- if (hasDeviceConfig)
940
- deviceDoc.config = deviceConfig;
941
980
  if (hasDeviceRoutines)
942
981
  deviceDoc.routines = deviceRoutines;
982
+ if (hasDeviceConfig)
983
+ deviceDoc.config = deviceConfig;
984
+ if (hasDeviceBrowser)
985
+ deviceDoc.browser = deviceBrowser;
986
+ if (hasProjectRoot)
987
+ deviceDoc.projectRoot = projectRoot;
943
988
  fs.mkdirSync(path.dirname(devicePath), { recursive: true });
944
989
  writeIfChanged(devicePath, META_HEADER + yaml.stringify(deviceDoc));
945
990
  }
@@ -963,14 +1008,15 @@ function writeMetaUnlocked(meta) {
963
1008
  * - `agents:` and `isolatedAgents:` from the device file (device wins; the union
964
1009
  * both preserves the one-level merge and self-heals a pre-migration central that
965
1010
  * still has pins)
966
- * - `defaultBrowserProfile:` from the device file (device is the sole source;
967
- * the field is stripped from central on write, so nothing to merge against)
968
- * - `config:` from the device file into `deviceConfig` (device is the sole
969
- * source for device-scope config, same routing as `defaultBrowserProfile`;
970
- * the in-memory field is named `deviceConfig` so it can never collide with
971
- * the user-scope `config:` central carries)
1011
+ * - `routines:` from the device file into `deviceRoutines` (device-local
1012
+ * routine activation)
972
1013
  * - `versions:` from the history JSON (wholesale replace; falls back to
973
1014
  * whatever central carried when the history file doesn't exist yet)
1015
+ *
1016
+ * (Device operator config is NOT overlaid here: it lives centrally under
1017
+ * `fleet.devices.<name>.config` — see lib/device-config.ts. The legacy
1018
+ * `config:`/`defaultBrowserProfile:` keys in a device doc are folded into the
1019
+ * central block by lib/devices/config-migration.ts.)
974
1020
  */
975
1021
  function overlayMachineLocal(meta) {
976
1022
  const devicePath = getDeviceMetaPath();
@@ -985,10 +1031,14 @@ function overlayMachineLocal(meta) {
985
1031
  meta.agents = { ...meta.agents, ...dm.agents };
986
1032
  if (dm?.isolatedAgents)
987
1033
  meta.isolatedAgents = { ...meta.isolatedAgents, ...dm.isolatedAgents };
988
- if (dm?.defaultBrowserProfile)
989
- meta.defaultBrowserProfile = dm.defaultBrowserProfile;
990
- if (dm?.config)
991
- meta.deviceConfig = dm.config;
1034
+ if (typeof dm?.projectRoot === 'string')
1035
+ meta.projectRoot = dm.projectRoot;
1036
+ if (dm?.browser && typeof dm.browser === 'object' && !Array.isArray(dm.browser)) {
1037
+ meta.deviceBrowser = { ...meta.deviceBrowser, ...dm.browser };
1038
+ }
1039
+ if (dm?.config && typeof dm.config === 'object' && !Array.isArray(dm.config)) {
1040
+ meta.deviceConfig = { ...meta.deviceConfig, ...dm.config };
1041
+ }
992
1042
  if (dm && Object.prototype.hasOwnProperty.call(dm, 'routines')) {
993
1043
  if (!Array.isArray(dm.routines) || dm.routines.some((name) => typeof name !== 'string')) {
994
1044
  throw new Error(`Device config corrupted at ${devicePath}: routines must be a string list.`);