@phnx-labs/agents-cli 1.22.34 → 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 (493) hide show
  1. package/CHANGELOG.md +672 -2
  2. package/README.md +82 -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 +85 -0
  94. package/dist/commands/share.js +379 -8
  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/codex-policy.d.ts +9 -1
  161. package/dist/lib/codex-policy.js +17 -2
  162. package/dist/lib/commands.d.ts +2 -0
  163. package/dist/lib/commands.js +2 -0
  164. package/dist/lib/computer/sessions-list.d.ts +150 -0
  165. package/dist/lib/computer/sessions-list.js +363 -0
  166. package/dist/lib/config-keys.d.ts +86 -0
  167. package/dist/lib/config-keys.js +193 -0
  168. package/dist/lib/config-machine-keys.d.ts +12 -0
  169. package/dist/lib/config-machine-keys.js +17 -0
  170. package/dist/lib/config-transfer.js +3 -4
  171. package/dist/lib/crabbox/cli.d.ts +2 -2
  172. package/dist/lib/crabbox/cli.js +3 -3
  173. package/dist/lib/daemon-health.d.ts +22 -0
  174. package/dist/lib/daemon-health.js +33 -3
  175. package/dist/lib/daemon-services.d.ts +50 -0
  176. package/dist/lib/daemon-services.js +147 -0
  177. package/dist/lib/daemon-ticks.d.ts +35 -66
  178. package/dist/lib/daemon-ticks.js +77 -159
  179. package/dist/lib/daemon.d.ts +72 -4
  180. package/dist/lib/daemon.js +792 -202
  181. package/dist/lib/deeplink/register.d.ts +49 -0
  182. package/dist/lib/deeplink/register.js +253 -0
  183. package/dist/lib/deeplink/url.d.ts +34 -0
  184. package/dist/lib/deeplink/url.js +78 -0
  185. package/dist/lib/device-config.d.ts +124 -29
  186. package/dist/lib/device-config.js +346 -141
  187. package/dist/lib/devices/config-migration.d.ts +42 -0
  188. package/dist/lib/devices/config-migration.js +203 -0
  189. package/dist/lib/devices/connect.js +14 -7
  190. package/dist/lib/devices/doctor-findings.d.ts +4 -1
  191. package/dist/lib/devices/doctor-findings.js +20 -1
  192. package/dist/lib/devices/harness-inventory.d.ts +11 -2
  193. package/dist/lib/devices/harness-inventory.js +0 -0
  194. package/dist/lib/devices/health.d.ts +1 -1
  195. package/dist/lib/devices/health.js +1 -1
  196. package/dist/lib/devices/pending.d.ts +22 -1
  197. package/dist/lib/devices/pending.js +67 -2
  198. package/dist/lib/devices/registry.d.ts +0 -25
  199. package/dist/lib/devices/registry.js +2 -83
  200. package/dist/lib/devices/resolve-profile.d.ts +20 -0
  201. package/dist/lib/devices/resolve-profile.js +44 -0
  202. package/dist/lib/devices/rollout-verify.d.ts +101 -0
  203. package/dist/lib/devices/rollout-verify.js +193 -0
  204. package/dist/lib/devices/ssh-config.js +10 -6
  205. package/dist/lib/event-families.d.ts +28 -0
  206. package/dist/lib/event-families.js +159 -0
  207. package/dist/lib/event-stream.d.ts +9 -1
  208. package/dist/lib/event-stream.js +26 -9
  209. package/dist/lib/events.d.ts +9 -1
  210. package/dist/lib/events.js +21 -6
  211. package/dist/lib/exec.d.ts +30 -0
  212. package/dist/lib/exec.js +220 -122
  213. package/dist/lib/feed-broadcast.d.ts +25 -0
  214. package/dist/lib/feed-broadcast.js +33 -0
  215. package/dist/lib/feed.d.ts +1 -1
  216. package/dist/lib/feed.js +12 -2
  217. package/dist/lib/fleet/capture.js +15 -0
  218. package/dist/lib/fleet/manifest.js +9 -0
  219. package/dist/lib/fleet/types.d.ts +9 -0
  220. package/dist/lib/fleet-status.js +10 -8
  221. package/dist/lib/git.d.ts +20 -6
  222. package/dist/lib/git.js +121 -17
  223. package/dist/lib/hosts/dispatch.d.ts +8 -3
  224. package/dist/lib/hosts/dispatch.js +29 -3
  225. package/dist/lib/hosts/logs.d.ts +2 -2
  226. package/dist/lib/hosts/logs.js +2 -2
  227. package/dist/lib/hosts/option.js +1 -1
  228. package/dist/lib/hosts/passthrough.d.ts +2 -3
  229. package/dist/lib/hosts/passthrough.js +10 -24
  230. package/dist/lib/hosts/progress.js +2 -2
  231. package/dist/lib/hosts/providers/devices.d.ts +3 -3
  232. package/dist/lib/hosts/providers/devices.js +18 -12
  233. package/dist/lib/hosts/ready.d.ts +5 -1
  234. package/dist/lib/hosts/ready.js +9 -3
  235. package/dist/lib/hosts/reconcile.d.ts +2 -2
  236. package/dist/lib/hosts/reconcile.js +2 -2
  237. package/dist/lib/hosts/registry.js +14 -9
  238. package/dist/lib/hosts/remote-cmd.js +1 -1
  239. package/dist/lib/hosts/remote-os.d.ts +9 -6
  240. package/dist/lib/hosts/remote-os.js +13 -6
  241. package/dist/lib/hosts/routing-flag.d.ts +23 -0
  242. package/dist/lib/hosts/routing-flag.js +41 -0
  243. package/dist/lib/hosts/run-target.js +1 -1
  244. package/dist/lib/hosts/session-index.js +1 -1
  245. package/dist/lib/hosts/tasks.d.ts +6 -6
  246. package/dist/lib/hosts/tasks.js +4 -4
  247. package/dist/lib/hosts/types.js +1 -2
  248. package/dist/lib/installations/resolve.js +2 -8
  249. package/dist/lib/isolation-boundary-report.js +0 -1
  250. package/dist/lib/linear-cache.d.ts +7 -0
  251. package/dist/lib/linear-cache.js +31 -4
  252. package/dist/lib/linear-project-counts.d.ts +1 -1
  253. package/dist/lib/linear-project-counts.js +2 -3
  254. package/dist/lib/linear-projects.js +1 -1
  255. package/dist/lib/loop.d.ts +2 -2
  256. package/dist/lib/loop.js +1 -1
  257. package/dist/lib/mailbox-target.d.ts +1 -1
  258. package/dist/lib/mailbox-target.js +1 -1
  259. package/dist/lib/manifest.js +7 -4
  260. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  261. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  262. package/dist/lib/menubar/snapshot.d.ts +3 -2
  263. package/dist/lib/menubar/snapshot.js +6 -2
  264. package/dist/lib/migrate-fold.d.ts +33 -0
  265. package/dist/lib/migrate-fold.js +130 -0
  266. package/dist/lib/migrate.d.ts +34 -34
  267. package/dist/lib/migrate.js +106 -128
  268. package/dist/lib/model-tier-overrides.d.ts +1 -1
  269. package/dist/lib/model-tier-overrides.js +15 -2
  270. package/dist/lib/monitors/config.d.ts +17 -3
  271. package/dist/lib/monitors/config.js +52 -18
  272. package/dist/lib/monitors/engine.d.ts +32 -1
  273. package/dist/lib/monitors/engine.js +94 -11
  274. package/dist/lib/monitors/fingerprint.d.ts +46 -0
  275. package/dist/lib/monitors/fingerprint.js +100 -0
  276. package/dist/lib/monitors/remote.d.ts +47 -0
  277. package/dist/lib/monitors/remote.js +81 -0
  278. package/dist/lib/monitors/state.d.ts +39 -0
  279. package/dist/lib/monitors/state.js +56 -0
  280. package/dist/lib/onepassword.d.ts +17 -0
  281. package/dist/lib/onepassword.js +52 -22
  282. package/dist/lib/open-url.js +1 -1
  283. package/dist/lib/picker.d.ts +14 -2
  284. package/dist/lib/picker.js +35 -13
  285. package/dist/lib/placement.d.ts +1 -1
  286. package/dist/lib/placement.js +1 -1
  287. package/dist/lib/pr-land-detach.d.ts +32 -0
  288. package/dist/lib/pr-land-detach.js +79 -0
  289. package/dist/lib/profiles-presets.js +13 -0
  290. package/dist/lib/profiles.d.ts +2 -0
  291. package/dist/lib/profiles.js +44 -1
  292. package/dist/lib/project-focus.d.ts +1 -1
  293. package/dist/lib/project-focus.js +1 -1
  294. package/dist/lib/project-key.d.ts +17 -0
  295. package/dist/lib/project-key.js +26 -0
  296. package/dist/lib/project-probe.d.ts +4 -1
  297. package/dist/lib/project-probe.js +5 -4
  298. package/dist/lib/project-resources.js +2 -18
  299. package/dist/lib/project-root.d.ts +16 -0
  300. package/dist/lib/project-root.js +20 -2
  301. package/dist/lib/projects.d.ts +20 -1
  302. package/dist/lib/projects.js +78 -1
  303. package/dist/lib/refresh-coordinator.d.ts +24 -0
  304. package/dist/lib/refresh-coordinator.js +52 -0
  305. package/dist/lib/registry.d.ts +2 -2
  306. package/dist/lib/registry.js +1 -1
  307. package/dist/lib/resource-aliases.d.ts +13 -0
  308. package/dist/lib/resource-aliases.js +26 -0
  309. package/dist/lib/resources/types.d.ts +1 -1
  310. package/dist/lib/resources.d.ts +16 -0
  311. package/dist/lib/resources.js +66 -10
  312. package/dist/lib/rotate.d.ts +3 -4
  313. package/dist/lib/rotate.js +4 -5
  314. package/dist/lib/routine-activation.d.ts +22 -2
  315. package/dist/lib/routine-activation.js +63 -16
  316. package/dist/lib/routine-context.d.ts +9 -2
  317. package/dist/lib/routine-context.js +21 -6
  318. package/dist/lib/routines-project.d.ts +58 -48
  319. package/dist/lib/routines-project.js +190 -159
  320. package/dist/lib/routines.d.ts +41 -6
  321. package/dist/lib/routines.js +92 -34
  322. package/dist/lib/run-defaults.d.ts +5 -0
  323. package/dist/lib/run-defaults.js +11 -1
  324. package/dist/lib/runner.d.ts +10 -8
  325. package/dist/lib/runner.js +122 -39
  326. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  327. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  328. package/dist/lib/secrets/agent.d.ts +10 -3
  329. package/dist/lib/secrets/agent.js +43 -8
  330. package/dist/lib/secrets/bundles.d.ts +1 -0
  331. package/dist/lib/secrets/bundles.js +92 -80
  332. package/dist/lib/secrets/index.js +32 -9
  333. package/dist/lib/secrets/install-helper.d.ts +4 -4
  334. package/dist/lib/secrets/install-helper.js +4 -4
  335. package/dist/lib/secrets/push.d.ts +40 -6
  336. package/dist/lib/secrets/push.js +58 -11
  337. package/dist/lib/secrets/read-backoff.d.ts +1 -1
  338. package/dist/lib/secrets/read-backoff.js +1 -1
  339. package/dist/lib/secrets/remote.d.ts +24 -0
  340. package/dist/lib/secrets/remote.js +54 -4
  341. package/dist/lib/self-update.d.ts +108 -0
  342. package/dist/lib/self-update.js +276 -1
  343. package/dist/lib/session/active.d.ts +89 -5
  344. package/dist/lib/session/active.js +165 -10
  345. package/dist/lib/session/actor-sidecar.d.ts +1 -1
  346. package/dist/lib/session/actor-sidecar.js +2 -1
  347. package/dist/lib/session/db.d.ts +176 -2
  348. package/dist/lib/session/db.js +484 -17
  349. package/dist/lib/session/discover.js +27 -4
  350. package/dist/lib/session/hook-sessions.js +2 -2
  351. package/dist/lib/session/host-link.d.ts +2 -2
  352. package/dist/lib/session/host-link.js +2 -2
  353. package/dist/lib/session/pid-registry.d.ts +21 -0
  354. package/dist/lib/session/pid-registry.js +57 -0
  355. package/dist/lib/session/remote-active.js +15 -1
  356. package/dist/lib/session/remote.js +2 -2
  357. package/dist/lib/session/session-cache.d.ts +14 -7
  358. package/dist/lib/session/session-cache.js +51 -9
  359. package/dist/lib/session/state.d.ts +2 -2
  360. package/dist/lib/session/state.js +1 -1
  361. package/dist/lib/session/sync/config.d.ts +10 -10
  362. package/dist/lib/session/sync/config.js +10 -10
  363. package/dist/lib/session/sync/r2.d.ts +34 -0
  364. package/dist/lib/session/sync/r2.js +123 -0
  365. package/dist/lib/session/throughput.d.ts +1 -1
  366. package/dist/lib/session/throughput.js +1 -1
  367. package/dist/lib/session/types.d.ts +23 -1
  368. package/dist/lib/session/types.js +15 -0
  369. package/dist/lib/session/viewing-in.d.ts +1 -1
  370. package/dist/lib/session/viewing-in.js +1 -1
  371. package/dist/lib/session/watch.d.ts +101 -0
  372. package/dist/lib/session/watch.js +242 -0
  373. package/dist/lib/share/config.d.ts +4 -0
  374. package/dist/lib/share/config.js +1 -0
  375. package/dist/lib/share/delete.d.ts +93 -0
  376. package/dist/lib/share/delete.js +127 -0
  377. package/dist/lib/share/provision.d.ts +38 -0
  378. package/dist/lib/share/provision.js +50 -0
  379. package/dist/lib/share/publish.d.ts +40 -1
  380. package/dist/lib/share/publish.js +116 -3
  381. package/dist/lib/share/worker-template.js +71 -6
  382. package/dist/lib/shims.d.ts +17 -3
  383. package/dist/lib/shims.js +136 -27
  384. package/dist/lib/signin-badge.js +3 -2
  385. package/dist/lib/skills.js +2 -0
  386. package/dist/lib/smart-launch.d.ts +8 -8
  387. package/dist/lib/smart-launch.js +80 -59
  388. package/dist/lib/ssh-exec.d.ts +1 -1
  389. package/dist/lib/ssh-exec.js +1 -1
  390. package/dist/lib/staleness/prune.d.ts +88 -0
  391. package/dist/lib/staleness/prune.js +69 -0
  392. package/dist/lib/staleness/registry.d.ts +1 -1
  393. package/dist/lib/staleness/writers/commands.js +34 -2
  394. package/dist/lib/staleness/writers/hooks.js +16 -0
  395. package/dist/lib/staleness/writers/kinds.d.ts +6 -0
  396. package/dist/lib/staleness/writers/skills.js +19 -0
  397. package/dist/lib/staleness/writers/subagents.d.ts +2 -3
  398. package/dist/lib/staleness/writers/subagents.js +0 -4
  399. package/dist/lib/staleness/writers/types.d.ts +32 -0
  400. package/dist/lib/startup/command-registry.d.ts +6 -12
  401. package/dist/lib/startup/command-registry.js +14 -31
  402. package/dist/lib/startup/dev-build.d.ts +10 -0
  403. package/dist/lib/startup/dev-build.js +13 -1
  404. package/dist/lib/startup/spellcheck.d.ts +18 -0
  405. package/dist/lib/startup/spellcheck.js +45 -0
  406. package/dist/lib/state.d.ts +36 -9
  407. package/dist/lib/state.js +96 -46
  408. package/dist/lib/subagents-registry.d.ts +0 -7
  409. package/dist/lib/subagents-registry.js +38 -65
  410. package/dist/lib/subagents.d.ts +0 -33
  411. package/dist/lib/subagents.js +0 -75
  412. package/dist/lib/sync-umbrella.js +1 -1
  413. package/dist/lib/teams/agents.d.ts +41 -1
  414. package/dist/lib/teams/agents.js +187 -9
  415. package/dist/lib/teams/api.d.ts +11 -1
  416. package/dist/lib/teams/api.js +11 -2
  417. package/dist/lib/teams/delivery.d.ts +41 -0
  418. package/dist/lib/teams/delivery.js +60 -0
  419. package/dist/lib/teams/registry.d.ts +14 -0
  420. package/dist/lib/teams/registry.js +51 -1
  421. package/dist/lib/teams/remoteWorktree.d.ts +19 -0
  422. package/dist/lib/teams/remoteWorktree.js +29 -0
  423. package/dist/lib/teams/scheduler.d.ts +1 -1
  424. package/dist/lib/teams/scheduler.js +1 -1
  425. package/dist/lib/teams/worktree.d.ts +24 -0
  426. package/dist/lib/teams/worktree.js +42 -0
  427. package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
  428. package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
  429. package/dist/lib/terminal/engine.d.ts +4 -0
  430. package/dist/lib/terminal/engine.js +8 -2
  431. package/dist/lib/terminal/types.d.ts +21 -2
  432. package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
  433. package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
  434. package/dist/lib/tickets/list.d.ts +53 -0
  435. package/dist/lib/tickets/list.js +153 -0
  436. package/dist/lib/tmux/orphan-reap.d.ts +320 -0
  437. package/dist/lib/tmux/orphan-reap.js +644 -0
  438. package/dist/lib/tmux/session.d.ts +68 -3
  439. package/dist/lib/tmux/session.js +95 -5
  440. package/dist/lib/triggers/handlers.d.ts +20 -0
  441. package/dist/lib/triggers/handlers.js +6 -1
  442. package/dist/lib/types.d.ts +46 -34
  443. package/dist/lib/usage-fleet.d.ts +32 -0
  444. package/dist/lib/usage-fleet.js +125 -0
  445. package/dist/lib/usage-refresh.d.ts +3 -3
  446. package/dist/lib/usage-refresh.js +19 -16
  447. package/dist/lib/usage.d.ts +51 -47
  448. package/dist/lib/usage.js +145 -153
  449. package/dist/lib/version-duplicates.js +2 -2
  450. package/dist/lib/versions.d.ts +56 -13
  451. package/dist/lib/versions.js +195 -45
  452. package/dist/lib/watchdog/log.d.ts +1 -1
  453. package/dist/lib/watchdog/log.js +3 -3
  454. package/dist/lib/watchdog/rotate.d.ts +6 -6
  455. package/dist/lib/watchdog/rotate.js +6 -6
  456. package/dist/lib/workflows.d.ts +1 -1
  457. package/dist/lib/yaml-io.d.ts +47 -0
  458. package/dist/lib/yaml-io.js +55 -0
  459. package/package.json +2 -1
  460. package/scripts/install-helper.js +2 -2
  461. package/scripts/postinstall.js +23 -20
  462. package/dist/commands/defaults.d.ts +0 -7
  463. package/dist/commands/defaults.js +0 -107
  464. package/dist/commands/export.d.ts +0 -11
  465. package/dist/commands/export.js +0 -215
  466. package/dist/commands/helper.d.ts +0 -12
  467. package/dist/commands/helper.js +0 -87
  468. package/dist/commands/hosts.d.ts +0 -11
  469. package/dist/commands/hosts.js +0 -330
  470. package/dist/commands/lock.d.ts +0 -12
  471. package/dist/commands/lock.js +0 -70
  472. package/dist/commands/pull.d.ts +0 -17
  473. package/dist/commands/pull.js +0 -39
  474. package/dist/commands/push.d.ts +0 -14
  475. package/dist/commands/push.js +0 -30
  476. package/dist/commands/wallet.d.ts +0 -20
  477. package/dist/commands/wallet.js +0 -216
  478. package/dist/commands/worktree.d.ts +0 -19
  479. package/dist/commands/worktree.js +0 -272
  480. package/dist/lib/account-labels.d.ts +0 -24
  481. package/dist/lib/account-labels.js +0 -72
  482. package/dist/lib/auto-dispatch-linear.d.ts +0 -18
  483. package/dist/lib/auto-dispatch-linear.js +0 -107
  484. package/dist/lib/auto-dispatch-provider.d.ts +0 -10
  485. package/dist/lib/auto-dispatch-provider.js +0 -30
  486. package/dist/lib/auto-dispatch.d.ts +0 -93
  487. package/dist/lib/auto-dispatch.js +0 -128
  488. package/dist/lib/export.d.ts +0 -72
  489. package/dist/lib/export.js +0 -269
  490. package/dist/lib/lock.d.ts +0 -93
  491. package/dist/lib/lock.js +0 -207
  492. package/dist/lib/wallet/index.d.ts +0 -78
  493. package/dist/lib/wallet/index.js +0 -253
@@ -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.`);
@@ -27,15 +27,8 @@ export interface SubagentTarget {
27
27
  names(dir: string): string[];
28
28
  /** On-disk paths subagent `name` occupies (for removal / soft-delete). */
29
29
  occupied(dir: string, name: string): OccupiedEntry[];
30
- /** Cross-item files this target owns outside any one subagent's occupied paths. */
31
- finalizeOccupied?(dir: string): OccupiedEntry[];
32
30
  /** Rich metadata for `name`; `null` skips it from the listing. */
33
31
  read(dir: string, name: string): SubagentMeta | null;
34
- /** Optional post-sync pass over the just-synced subagents (Kimi's parent index). */
35
- finalize?(dir: string, synced: Array<{
36
- name: string;
37
- path: string;
38
- }>): void;
39
32
  }
40
33
  /**
41
34
  * Copy every file in `src` into `dest` (created if missing), applying
@@ -14,16 +14,16 @@
14
14
  * every current agent, so most entries are a single call:
15
15
  *
16
16
  * - `flatFile` one `<name><ext>` file, body from a `transform` fn.
17
- * (claude, grok, droid, codex, opencode, copilot,
18
- * cursor, kiro, goose)
17
+ * (claude, grok, pi, droid, codex, opencode, copilot,
18
+ * cursor, kiro, goose, kimi)
19
19
  * - `dirFile` a `<name>/` directory holding one generated `<file>`.
20
20
  * (antigravity: `<name>/agent.md`)
21
21
  * - `dirCopy` copy the whole source directory to `<name>/`, applying
22
22
  * renames, detected by a `marker` file. (openclaw)
23
23
  *
24
- * Genuinely-bespoke agents keep an explicit handler in the same table -- Kimi
25
- * writes two files per subagent plus a managed parent index, so it is a hand
26
- * -written `SubagentTarget` rather than a builder call.
24
+ * Every agent now uses a builder; there are no bespoke handlers left. Legacy
25
+ * on-disk layouts are folded once by `lib/migrate.ts`, never by a target --
26
+ * a target describes the CURRENT shape and nothing else.
27
27
  *
28
28
  * The per-agent `transform`/metadata parsers are the escape hatch: they live in
29
29
  * `subagents.ts` and are referenced by the table, so the generic engine has zero
@@ -31,11 +31,12 @@
31
31
  */
32
32
  import * as fs from 'fs';
33
33
  import * as path from 'path';
34
+ import * as TOML from 'smol-toml';
34
35
  import * as yaml from 'yaml';
35
36
  import { safeJoin } from './paths.js';
36
- import { parseSubagentFrontmatter, transformSubagentForClaude, transformSubagentForCodex, transformSubagentForCopilot, transformSubagentForCursor, transformSubagentForDroid, transformSubagentForGoose, transformSubagentForKiro, transformSubagentForOpenCode, transformSubagentForAntigravity, writeKimiSubagentFiles, buildKimiSubagentsParentYaml, KIMI_SUBAGENTS_PARENT_FILE, } from './subagents.js';
37
+ import { parseSubagentFrontmatter, transformSubagentForClaude, transformSubagentForCodex, transformSubagentForCopilot, transformSubagentForCursor, transformSubagentForDroid, transformSubagentForGoose, transformSubagentForKiro, transformSubagentForOpenCode, transformSubagentForAntigravity, } from './subagents.js';
37
38
  // ── metadata readers (the per-format escape hatch) ───────────────────────────
38
- /** Frontmatter, skipping files that lack a valid block (claude/grok/droid/codex). */
39
+ /** Frontmatter, skipping files that lack a valid block (claude/grok/droid). */
39
40
  function metaFrontmatterSkip(filePath) {
40
41
  return parseSubagentFrontmatter(filePath);
41
42
  }
@@ -63,6 +64,24 @@ function metaGooseYaml(filePath, name) {
63
64
  return null;
64
65
  }
65
66
  }
67
+ /**
68
+ * Codex custom-agent TOML: name / description / model (optional).
69
+ * Codex writes no YAML frontmatter — without this reader, `flatFile.read`
70
+ * drops every installed `.toml` and `agents subagents list` reports codex
71
+ * targets as `missing` even when the files are present and Codex loads them.
72
+ */
73
+ function metaToml(filePath, name) {
74
+ try {
75
+ const cfg = TOML.parse(fs.readFileSync(filePath, 'utf-8'));
76
+ const tomlName = typeof cfg.name === 'string' ? cfg.name : '';
77
+ const description = typeof cfg.description === 'string' ? cfg.description : '';
78
+ const model = typeof cfg.model === 'string' ? cfg.model : undefined;
79
+ return { name: tomlName || name, description, model };
80
+ }
81
+ catch {
82
+ return null;
83
+ }
84
+ }
66
85
  // ── shared fs primitive ──────────────────────────────────────────────────────
67
86
  /**
68
87
  * Copy every file in `src` into `dest` (created if missing), applying
@@ -187,61 +206,6 @@ function dirCopy(opts) {
187
206
  },
188
207
  };
189
208
  }
190
- /**
191
- * Kimi (genuinely bespoke): each subagent is a `<name>.yaml` + sibling
192
- * `<name>.system.md`, and a managed `_agents-cli.yaml` parent lists them all for
193
- * `kimi --agent-file`. The parent index is a cross-item concern, so it is built
194
- * in `finalize`, not per-item.
195
- */
196
- const kimiTarget = {
197
- dir: (home) => path.join(home, '.kimi-code', 'agents'),
198
- write(dir, sub) {
199
- writeKimiSubagentFiles(dir, sub.path, sub.name);
200
- },
201
- names(dir) {
202
- if (!fs.existsSync(dir))
203
- return [];
204
- // The parent is `_agents-cli.yaml` (underscore-prefixed, reserved).
205
- return fs
206
- .readdirSync(dir)
207
- .filter((f) => f.endsWith('.yaml') && !f.startsWith('_'))
208
- .map((f) => f.slice(0, -'.yaml'.length));
209
- },
210
- occupied(dir, name) {
211
- return [
212
- { path: safeJoin(dir, `${name}.yaml`), kind: 'file' },
213
- { path: safeJoin(dir, `${name}.system.md`), kind: 'file' },
214
- ];
215
- },
216
- finalizeOccupied(dir) {
217
- return [{ path: safeJoin(dir, KIMI_SUBAGENTS_PARENT_FILE), kind: 'file' }];
218
- },
219
- read(dir, name) {
220
- const yamlPath = path.join(dir, `${name}.yaml`);
221
- if (!fs.existsSync(yamlPath) || !fs.statSync(yamlPath).isFile())
222
- return null;
223
- let description = '';
224
- try {
225
- const parsed = yaml.parse(fs.readFileSync(yamlPath, 'utf-8'));
226
- description = parsed?.agent?.description ?? '';
227
- }
228
- catch {
229
- /* leave description empty */
230
- }
231
- const files = [`${name}.yaml`];
232
- const promptFile = `${name}.system.md`;
233
- if (fs.existsSync(path.join(dir, promptFile)))
234
- files.push(promptFile);
235
- return { frontmatter: { name, description }, files, path: yamlPath };
236
- },
237
- finalize(dir, synced) {
238
- const entries = synced.map((sub) => {
239
- const fm = parseSubagentFrontmatter(path.join(sub.path, 'AGENT.md'));
240
- return { name: sub.name, description: fm?.description ?? sub.name, relativePath: `./${sub.name}.yaml` };
241
- });
242
- fs.writeFileSync(safeJoin(dir, KIMI_SUBAGENTS_PARENT_FILE), buildKimiSubagentsParentYaml(entries));
243
- },
244
- };
245
209
  // ── the registry ─────────────────────────────────────────────────────────────
246
210
  /**
247
211
  * Single source of truth for how each subagents-capable agent stores subagents.
@@ -257,7 +221,12 @@ export const SUBAGENT_TARGETS = {
257
221
  pi: flatFile({ subdir: ['.omp', 'agent', 'agents'], ext: '.md', transform: transformSubagentForClaude, readMeta: metaFrontmatterFallback }),
258
222
  droid: flatFile({ subdir: ['.factory', 'droids'], ext: '.md', transform: transformSubagentForDroid }),
259
223
  // Bespoke frontmatter/format, still one flat file.
260
- codex: flatFile({ subdir: ['.codex', 'agents'], ext: '.toml', transform: transformSubagentForCodex }),
224
+ codex: flatFile({
225
+ subdir: ['.codex', 'agents'],
226
+ ext: '.toml',
227
+ transform: transformSubagentForCodex,
228
+ readMeta: metaToml,
229
+ }),
261
230
  opencode: flatFile({
262
231
  subdir: ['.config', 'opencode', 'agents'],
263
232
  ext: '.md',
@@ -295,8 +264,12 @@ export const SUBAGENT_TARGETS = {
295
264
  transform: transformSubagentForAntigravity,
296
265
  }),
297
266
  openclaw: dirCopy({ subdir: ['.openclaw'], marker: 'AGENTS.md', rename: { 'AGENT.md': 'AGENTS.md' } }),
298
- // Bespoke multi-file + parent index.
299
- kimi: kimiTarget,
267
+ // Kimi discovers Claude-shaped agent markdown from its brand home's `agents/`
268
+ // dir (`USER_BRAND_DIRS = ["agents"]`, kimi-code >= 0.29.0). Frontmatter
269
+ // name/description + body, kebab-case name -- the same shape as claude/grok.
270
+ // The pre-markdown files agents-cli used to write here are swept once by
271
+ // `migrateKimiSubagentsToMarkdown` (lib/migrate.ts), not by this target.
272
+ kimi: flatFile({ subdir: ['.kimi-code', 'agents'], ext: '.md', transform: transformSubagentForClaude, readMeta: metaFrontmatterFallback }),
300
273
  };
301
274
  /** The registry entry for `agent`, or undefined if it stores no subagents. */
302
275
  export function subagentTarget(agent) {
@@ -97,39 +97,6 @@ export declare function transformSubagentForAntigravity(subagentDir: string): st
97
97
  * https://opencode.ai/docs/agents/
98
98
  */
99
99
  export declare function transformSubagentForOpenCode(subagentDir: string): string;
100
- /** Managed parent agent file for Kimi (underscore prefix avoids clobbering a user subagent named agents-cli). */
101
- export declare const KIMI_SUBAGENTS_PARENT_FILE = "_agents-cli.yaml";
102
- export interface KimiSubagentFiles {
103
- /** Agent YAML content (uses system_prompt_path, not inline system_prompt). */
104
- yaml: string;
105
- /** Markdown body written next to the YAML and referenced by system_prompt_path. */
106
- systemPrompt: string;
107
- /** Sibling prompt filename, e.g. `reviewer.system.md`. */
108
- systemPromptFileName: string;
109
- }
110
- /**
111
- * Transform a subagent into Kimi Code agent files.
112
- *
113
- * Kimi's schema (agentspec) only accepts `system_prompt_path` (path relative to
114
- * the agent YAML) — there is no inline `system_prompt` key. We write:
115
- * ~/.kimi-code/agents/<name>.yaml — agent YAML
116
- * ~/.kimi-code/agents/<name>.system.md — system prompt body
117
- * plus a managed parent `_agents-cli.yaml` that lists them under agent.subagents
118
- * for `kimi --agent-file …/_agents-cli.yaml`.
119
- * https://moonshotai.github.io/kimi-cli/en/customization/agents.html
120
- */
121
- export declare function transformSubagentForKimi(subagentDir: string, fileBaseName: string): KimiSubagentFiles;
122
- /**
123
- * Build the managed parent agent YAML that declares all installed subagents
124
- * so `kimi --agent-file ~/.kimi-code/agents/_agents-cli.yaml` can launch them.
125
- */
126
- export declare function buildKimiSubagentsParentYaml(entries: Array<{
127
- name: string;
128
- description: string;
129
- relativePath: string;
130
- }>): string;
131
- /** Write a Kimi subagent YAML + sibling system-prompt md into agentsDir. */
132
- export declare function writeKimiSubagentFiles(agentsDir: string, subagentDir: string, name: string): void;
133
100
  /**
134
101
  * Transform a subagent into a Codex custom-agent TOML file.
135
102
  *