@phnx-labs/agents-cli 1.22.35 → 1.22.38

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 (500) hide show
  1. package/CHANGELOG.md +708 -2
  2. package/README.md +83 -43
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.d.ts +15 -0
  5. package/dist/bootstrap.js +1212 -0
  6. package/dist/commands/accounts.d.ts +4 -11
  7. package/dist/commands/accounts.js +159 -27
  8. package/dist/commands/artifacts-setup.d.ts +53 -0
  9. package/dist/commands/artifacts-setup.js +161 -0
  10. package/dist/commands/artifacts.d.ts +18 -0
  11. package/dist/commands/artifacts.js +58 -0
  12. package/dist/commands/attach.js +17 -4
  13. package/dist/commands/audit.d.ts +8 -8
  14. package/dist/commands/audit.js +57 -47
  15. package/dist/commands/browser.js +17 -11
  16. package/dist/commands/cloud.js +1 -1
  17. package/dist/commands/commands.js +0 -11
  18. package/dist/commands/computer-actions.js +33 -0
  19. package/dist/commands/computer-sessions-picker.d.ts +21 -0
  20. package/dist/commands/computer-sessions-picker.js +141 -0
  21. package/dist/commands/computer.d.ts +16 -0
  22. package/dist/commands/computer.js +37 -0
  23. package/dist/commands/config.d.ts +17 -0
  24. package/dist/commands/config.js +401 -0
  25. package/dist/commands/cp.d.ts +84 -0
  26. package/dist/commands/cp.js +231 -0
  27. package/dist/commands/daemon.js +243 -14
  28. package/dist/commands/detach-core.d.ts +1 -1
  29. package/dist/commands/detach-core.js +12 -2
  30. package/dist/commands/detach.js +1 -1
  31. package/dist/commands/doctor.js +64 -5
  32. package/dist/commands/events.d.ts +24 -12
  33. package/dist/commands/events.js +144 -28
  34. package/dist/commands/exec.js +86 -42
  35. package/dist/commands/feed.d.ts +1 -1
  36. package/dist/commands/feed.js +16 -8
  37. package/dist/commands/focus.d.ts +33 -1
  38. package/dist/commands/focus.js +177 -17
  39. package/dist/commands/funnel.d.ts +1 -1
  40. package/dist/commands/go.js +9 -8
  41. package/dist/commands/harness-wizard.d.ts +1 -0
  42. package/dist/commands/harness-wizard.js +18 -20
  43. package/dist/commands/harness.d.ts +2 -0
  44. package/dist/commands/harness.js +59 -26
  45. package/dist/commands/hooks.js +0 -11
  46. package/dist/commands/inspect.d.ts +94 -1
  47. package/dist/commands/inspect.js +866 -40
  48. package/dist/commands/lease.d.ts +4 -4
  49. package/dist/commands/lease.js +6 -6
  50. package/dist/commands/login.js +0 -13
  51. package/dist/commands/logs.d.ts +2 -2
  52. package/dist/commands/logs.js +2 -2
  53. package/dist/commands/mcp.js +7 -2
  54. package/dist/commands/memory.js +7 -2
  55. package/dist/commands/message.d.ts +1 -1
  56. package/dist/commands/message.js +37 -6
  57. package/dist/commands/models.js +71 -0
  58. package/dist/commands/monitors.d.ts +0 -1
  59. package/dist/commands/monitors.js +199 -16
  60. package/dist/commands/open.d.ts +18 -0
  61. package/dist/commands/open.js +57 -0
  62. package/dist/commands/packages.js +2 -107
  63. package/dist/commands/plugins.js +6 -3
  64. package/dist/commands/profiles.d.ts +1 -0
  65. package/dist/commands/profiles.js +16 -160
  66. package/dist/commands/projects.d.ts +28 -0
  67. package/dist/commands/projects.js +125 -5
  68. package/dist/commands/reconnect.js +9 -3
  69. package/dist/commands/repo.js +42 -1
  70. package/dist/commands/resource-view.d.ts +17 -0
  71. package/dist/commands/resource-view.js +36 -14
  72. package/dist/commands/resume.js +9 -2
  73. package/dist/commands/routines.d.ts +0 -2
  74. package/dist/commands/routines.js +473 -289
  75. package/dist/commands/secrets.js +52 -9
  76. package/dist/commands/sessions-export.d.ts +47 -0
  77. package/dist/commands/sessions-export.js +116 -6
  78. package/dist/commands/sessions-import.d.ts +17 -0
  79. package/dist/commands/sessions-import.js +114 -6
  80. package/dist/commands/sessions-migrate.d.ts +27 -0
  81. package/dist/commands/sessions-migrate.js +50 -9
  82. package/dist/commands/sessions-picker.js +23 -4
  83. package/dist/commands/sessions-resume.d.ts +5 -3
  84. package/dist/commands/sessions-resume.js +30 -8
  85. package/dist/commands/sessions-watch.d.ts +2 -0
  86. package/dist/commands/sessions-watch.js +53 -0
  87. package/dist/commands/sessions.d.ts +66 -3
  88. package/dist/commands/sessions.js +298 -47
  89. package/dist/commands/setup-browser.js +2 -2
  90. package/dist/commands/setup-mine.js +0 -1
  91. package/dist/commands/setup-preferences.js +1 -1
  92. package/dist/commands/setup.d.ts +5 -0
  93. package/dist/commands/setup.js +31 -5
  94. package/dist/commands/share.d.ts +87 -7
  95. package/dist/commands/share.js +320 -58
  96. package/dist/commands/skills.js +0 -11
  97. package/dist/commands/snapshot.js +1 -1
  98. package/dist/commands/ssh.d.ts +18 -0
  99. package/dist/commands/ssh.js +549 -210
  100. package/dist/commands/sync.d.ts +5 -0
  101. package/dist/commands/sync.js +212 -32
  102. package/dist/commands/teams.d.ts +13 -0
  103. package/dist/commands/teams.js +187 -30
  104. package/dist/commands/tickets.d.ts +2 -0
  105. package/dist/commands/tickets.js +43 -0
  106. package/dist/commands/update.js +2 -4
  107. package/dist/commands/usage.js +5 -3
  108. package/dist/commands/versions.js +11 -5
  109. package/dist/commands/view.js +15 -7
  110. package/dist/commands/webhook.d.ts +2 -2
  111. package/dist/commands/webhook.js +7 -7
  112. package/dist/index.d.ts +18 -2
  113. package/dist/index.js +53 -1264
  114. package/dist/lib/account-catalog.d.ts +18 -0
  115. package/dist/lib/account-catalog.js +38 -0
  116. package/dist/lib/account-provider-registry.d.ts +18 -0
  117. package/dist/lib/account-provider-registry.js +59 -0
  118. package/dist/lib/account-registry.d.ts +40 -0
  119. package/dist/lib/account-registry.js +239 -0
  120. package/dist/lib/account-schema.d.ts +44 -0
  121. package/dist/lib/account-schema.js +91 -0
  122. package/dist/lib/account-state-service.d.ts +21 -0
  123. package/dist/lib/account-state-service.js +60 -0
  124. package/dist/lib/activity.d.ts +1 -1
  125. package/dist/lib/activity.js +8 -1
  126. package/dist/lib/add-dir.d.ts +80 -0
  127. package/dist/lib/add-dir.js +241 -0
  128. package/dist/lib/agent-cli-commands.d.ts +11 -0
  129. package/dist/lib/agent-cli-commands.js +30 -0
  130. package/dist/lib/agents.js +44 -36
  131. package/dist/lib/answer-router.js +1 -1
  132. package/dist/lib/audit/log.d.ts +10 -27
  133. package/dist/lib/audit/log.js +20 -33
  134. package/dist/lib/auth-health.d.ts +9 -2
  135. package/dist/lib/auth-health.js +42 -9
  136. package/dist/lib/auto-pull-worker.js +7 -3
  137. package/dist/lib/auto-pull.d.ts +44 -3
  138. package/dist/lib/auto-pull.js +88 -5
  139. package/dist/lib/binary-shadow.d.ts +28 -0
  140. package/dist/lib/binary-shadow.js +121 -0
  141. package/dist/lib/brand.js +9 -3
  142. package/dist/lib/browser/hygiene.d.ts +90 -0
  143. package/dist/lib/browser/hygiene.js +146 -0
  144. package/dist/lib/browser/ipc.d.ts +30 -0
  145. package/dist/lib/browser/ipc.js +93 -4
  146. package/dist/lib/browser/profiles.d.ts +3 -2
  147. package/dist/lib/browser/profiles.js +65 -22
  148. package/dist/lib/browser/service.d.ts +79 -1
  149. package/dist/lib/browser/service.js +231 -14
  150. package/dist/lib/browser/sessions-list.d.ts +22 -2
  151. package/dist/lib/browser/sessions-list.js +54 -6
  152. package/dist/lib/browser/stream.d.ts +2 -0
  153. package/dist/lib/browser/stream.js +1 -0
  154. package/dist/lib/browser/types.d.ts +63 -1
  155. package/dist/lib/byok-usage.d.ts +9 -2
  156. package/dist/lib/byok-usage.js +133 -31
  157. package/dist/lib/cli-entry.d.ts +11 -0
  158. package/dist/lib/cli-entry.js +46 -0
  159. package/dist/lib/cloud/host.d.ts +1 -1
  160. package/dist/lib/cloud/host.js +2 -2
  161. package/dist/lib/cloud/registry.js +1 -1
  162. package/dist/lib/cloud/types.d.ts +1 -1
  163. package/dist/lib/commands.d.ts +2 -0
  164. package/dist/lib/commands.js +2 -0
  165. package/dist/lib/computer/sessions-list.d.ts +150 -0
  166. package/dist/lib/computer/sessions-list.js +363 -0
  167. package/dist/lib/config-keys.d.ts +86 -0
  168. package/dist/lib/config-keys.js +193 -0
  169. package/dist/lib/config-machine-keys.d.ts +12 -0
  170. package/dist/lib/config-machine-keys.js +17 -0
  171. package/dist/lib/config-transfer.js +3 -4
  172. package/dist/lib/crabbox/cli.d.ts +2 -2
  173. package/dist/lib/crabbox/cli.js +3 -3
  174. package/dist/lib/daemon-health.d.ts +22 -0
  175. package/dist/lib/daemon-health.js +33 -3
  176. package/dist/lib/daemon-services.d.ts +50 -0
  177. package/dist/lib/daemon-services.js +147 -0
  178. package/dist/lib/daemon-ticks.d.ts +35 -66
  179. package/dist/lib/daemon-ticks.js +77 -159
  180. package/dist/lib/daemon.d.ts +72 -4
  181. package/dist/lib/daemon.js +792 -202
  182. package/dist/lib/deeplink/register.d.ts +49 -0
  183. package/dist/lib/deeplink/register.js +253 -0
  184. package/dist/lib/deeplink/url.d.ts +34 -0
  185. package/dist/lib/deeplink/url.js +78 -0
  186. package/dist/lib/device-config.d.ts +124 -29
  187. package/dist/lib/device-config.js +346 -141
  188. package/dist/lib/devices/config-migration.d.ts +42 -0
  189. package/dist/lib/devices/config-migration.js +203 -0
  190. package/dist/lib/devices/connect.js +14 -7
  191. package/dist/lib/devices/doctor-findings.d.ts +4 -1
  192. package/dist/lib/devices/doctor-findings.js +20 -1
  193. package/dist/lib/devices/harness-inventory.d.ts +11 -2
  194. package/dist/lib/devices/harness-inventory.js +0 -0
  195. package/dist/lib/devices/health.d.ts +1 -1
  196. package/dist/lib/devices/health.js +1 -1
  197. package/dist/lib/devices/pending.d.ts +22 -1
  198. package/dist/lib/devices/pending.js +67 -2
  199. package/dist/lib/devices/registry.d.ts +0 -25
  200. package/dist/lib/devices/registry.js +2 -83
  201. package/dist/lib/devices/resolve-profile.d.ts +20 -0
  202. package/dist/lib/devices/resolve-profile.js +44 -0
  203. package/dist/lib/devices/rollout-verify.d.ts +101 -0
  204. package/dist/lib/devices/rollout-verify.js +193 -0
  205. package/dist/lib/devices/ssh-config.js +10 -6
  206. package/dist/lib/event-families.d.ts +28 -0
  207. package/dist/lib/event-families.js +159 -0
  208. package/dist/lib/event-stream.d.ts +9 -1
  209. package/dist/lib/event-stream.js +26 -9
  210. package/dist/lib/events.d.ts +9 -1
  211. package/dist/lib/events.js +21 -6
  212. package/dist/lib/exec.d.ts +30 -0
  213. package/dist/lib/exec.js +219 -121
  214. package/dist/lib/feed-broadcast.d.ts +25 -0
  215. package/dist/lib/feed-broadcast.js +33 -0
  216. package/dist/lib/feed.d.ts +1 -1
  217. package/dist/lib/feed.js +12 -2
  218. package/dist/lib/fleet/capture.js +15 -0
  219. package/dist/lib/fleet/manifest.js +9 -0
  220. package/dist/lib/fleet/types.d.ts +9 -0
  221. package/dist/lib/fleet-status.js +10 -8
  222. package/dist/lib/git.d.ts +21 -7
  223. package/dist/lib/git.js +122 -18
  224. package/dist/lib/hosts/dispatch.d.ts +8 -3
  225. package/dist/lib/hosts/dispatch.js +29 -3
  226. package/dist/lib/hosts/logs.d.ts +2 -2
  227. package/dist/lib/hosts/logs.js +2 -2
  228. package/dist/lib/hosts/option.js +1 -1
  229. package/dist/lib/hosts/passthrough.d.ts +2 -3
  230. package/dist/lib/hosts/passthrough.js +10 -24
  231. package/dist/lib/hosts/progress.js +2 -2
  232. package/dist/lib/hosts/providers/devices.d.ts +3 -3
  233. package/dist/lib/hosts/providers/devices.js +18 -12
  234. package/dist/lib/hosts/ready.d.ts +5 -1
  235. package/dist/lib/hosts/ready.js +9 -3
  236. package/dist/lib/hosts/reconcile.d.ts +2 -2
  237. package/dist/lib/hosts/reconcile.js +2 -2
  238. package/dist/lib/hosts/registry.js +14 -9
  239. package/dist/lib/hosts/remote-cmd.js +1 -1
  240. package/dist/lib/hosts/remote-os.d.ts +9 -6
  241. package/dist/lib/hosts/remote-os.js +13 -6
  242. package/dist/lib/hosts/routing-flag.d.ts +23 -0
  243. package/dist/lib/hosts/routing-flag.js +41 -0
  244. package/dist/lib/hosts/run-target.js +1 -1
  245. package/dist/lib/hosts/session-index.js +1 -1
  246. package/dist/lib/hosts/tasks.d.ts +6 -6
  247. package/dist/lib/hosts/tasks.js +4 -4
  248. package/dist/lib/hosts/types.js +1 -2
  249. package/dist/lib/installations/resolve.js +2 -8
  250. package/dist/lib/isolation-boundary-report.js +0 -1
  251. package/dist/lib/linear-cache.d.ts +7 -0
  252. package/dist/lib/linear-cache.js +31 -4
  253. package/dist/lib/linear-project-counts.d.ts +1 -1
  254. package/dist/lib/linear-project-counts.js +2 -3
  255. package/dist/lib/linear-projects.js +1 -1
  256. package/dist/lib/loop.d.ts +2 -2
  257. package/dist/lib/loop.js +1 -1
  258. package/dist/lib/mailbox-target.d.ts +1 -1
  259. package/dist/lib/mailbox-target.js +1 -1
  260. package/dist/lib/manifest.js +7 -4
  261. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  262. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  263. package/dist/lib/menubar/snapshot.d.ts +3 -2
  264. package/dist/lib/menubar/snapshot.js +6 -2
  265. package/dist/lib/migrate-fold.d.ts +33 -0
  266. package/dist/lib/migrate-fold.js +130 -0
  267. package/dist/lib/migrate.d.ts +34 -34
  268. package/dist/lib/migrate.js +106 -128
  269. package/dist/lib/model-tier-overrides.d.ts +1 -1
  270. package/dist/lib/model-tier-overrides.js +15 -2
  271. package/dist/lib/monitors/config.d.ts +17 -3
  272. package/dist/lib/monitors/config.js +52 -18
  273. package/dist/lib/monitors/engine.d.ts +32 -1
  274. package/dist/lib/monitors/engine.js +94 -11
  275. package/dist/lib/monitors/fingerprint.d.ts +46 -0
  276. package/dist/lib/monitors/fingerprint.js +100 -0
  277. package/dist/lib/monitors/remote.d.ts +47 -0
  278. package/dist/lib/monitors/remote.js +81 -0
  279. package/dist/lib/monitors/state.d.ts +39 -0
  280. package/dist/lib/monitors/state.js +56 -0
  281. package/dist/lib/onepassword.d.ts +17 -0
  282. package/dist/lib/onepassword.js +52 -22
  283. package/dist/lib/open-url.js +1 -1
  284. package/dist/lib/picker.d.ts +14 -2
  285. package/dist/lib/picker.js +35 -13
  286. package/dist/lib/placement.d.ts +1 -1
  287. package/dist/lib/placement.js +1 -1
  288. package/dist/lib/pr-land-detach.d.ts +32 -0
  289. package/dist/lib/pr-land-detach.js +79 -0
  290. package/dist/lib/profiles-presets.js +13 -0
  291. package/dist/lib/profiles.d.ts +2 -0
  292. package/dist/lib/profiles.js +44 -1
  293. package/dist/lib/project-focus.d.ts +1 -1
  294. package/dist/lib/project-focus.js +1 -1
  295. package/dist/lib/project-probe.d.ts +4 -1
  296. package/dist/lib/project-probe.js +5 -4
  297. package/dist/lib/project-resources.js +2 -18
  298. package/dist/lib/project-root.d.ts +16 -0
  299. package/dist/lib/project-root.js +20 -2
  300. package/dist/lib/projects.d.ts +20 -1
  301. package/dist/lib/projects.js +78 -1
  302. package/dist/lib/refresh-coordinator.d.ts +24 -0
  303. package/dist/lib/refresh-coordinator.js +52 -0
  304. package/dist/lib/registry.d.ts +2 -2
  305. package/dist/lib/registry.js +1 -1
  306. package/dist/lib/resource-aliases.d.ts +13 -0
  307. package/dist/lib/resource-aliases.js +26 -0
  308. package/dist/lib/resources/types.d.ts +1 -1
  309. package/dist/lib/resources.d.ts +16 -0
  310. package/dist/lib/resources.js +66 -10
  311. package/dist/lib/rotate.d.ts +3 -4
  312. package/dist/lib/rotate.js +4 -5
  313. package/dist/lib/routine-activation.d.ts +22 -2
  314. package/dist/lib/routine-activation.js +63 -16
  315. package/dist/lib/routine-context.d.ts +9 -2
  316. package/dist/lib/routine-context.js +21 -6
  317. package/dist/lib/routines-project.d.ts +58 -48
  318. package/dist/lib/routines-project.js +190 -159
  319. package/dist/lib/routines.d.ts +44 -7
  320. package/dist/lib/routines.js +92 -34
  321. package/dist/lib/run-defaults.d.ts +5 -0
  322. package/dist/lib/run-defaults.js +11 -1
  323. package/dist/lib/runner.d.ts +10 -8
  324. package/dist/lib/runner.js +122 -39
  325. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  326. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  327. package/dist/lib/secrets/agent.d.ts +10 -3
  328. package/dist/lib/secrets/agent.js +43 -8
  329. package/dist/lib/secrets/bundles.d.ts +1 -0
  330. package/dist/lib/secrets/bundles.js +92 -80
  331. package/dist/lib/secrets/index.js +32 -9
  332. package/dist/lib/secrets/install-helper.d.ts +4 -4
  333. package/dist/lib/secrets/install-helper.js +4 -4
  334. package/dist/lib/secrets/push.d.ts +40 -6
  335. package/dist/lib/secrets/push.js +58 -11
  336. package/dist/lib/secrets/read-backoff.d.ts +1 -1
  337. package/dist/lib/secrets/read-backoff.js +1 -1
  338. package/dist/lib/secrets/remote.d.ts +24 -0
  339. package/dist/lib/secrets/remote.js +54 -4
  340. package/dist/lib/self-update.d.ts +108 -0
  341. package/dist/lib/self-update.js +276 -1
  342. package/dist/lib/session/active.d.ts +89 -5
  343. package/dist/lib/session/active.js +165 -10
  344. package/dist/lib/session/actor-sidecar.d.ts +1 -1
  345. package/dist/lib/session/actor-sidecar.js +2 -1
  346. package/dist/lib/session/db.d.ts +176 -2
  347. package/dist/lib/session/db.js +484 -17
  348. package/dist/lib/session/discover.js +27 -4
  349. package/dist/lib/session/hook-sessions.js +2 -2
  350. package/dist/lib/session/host-link.d.ts +2 -2
  351. package/dist/lib/session/host-link.js +2 -2
  352. package/dist/lib/session/pid-registry.d.ts +21 -0
  353. package/dist/lib/session/pid-registry.js +57 -0
  354. package/dist/lib/session/remote-active.js +15 -1
  355. package/dist/lib/session/remote.js +2 -2
  356. package/dist/lib/session/session-cache.d.ts +14 -7
  357. package/dist/lib/session/session-cache.js +51 -9
  358. package/dist/lib/session/state.d.ts +2 -2
  359. package/dist/lib/session/state.js +1 -1
  360. package/dist/lib/session/sync/config.d.ts +10 -10
  361. package/dist/lib/session/sync/config.js +10 -10
  362. package/dist/lib/session/sync/r2.d.ts +34 -0
  363. package/dist/lib/session/sync/r2.js +123 -0
  364. package/dist/lib/session/throughput.d.ts +1 -1
  365. package/dist/lib/session/throughput.js +1 -1
  366. package/dist/lib/session/types.d.ts +23 -1
  367. package/dist/lib/session/types.js +15 -0
  368. package/dist/lib/session/viewing-in.d.ts +1 -1
  369. package/dist/lib/session/viewing-in.js +1 -1
  370. package/dist/lib/session/watch.d.ts +101 -0
  371. package/dist/lib/session/watch.js +242 -0
  372. package/dist/lib/share/analytics.js +1 -1
  373. package/dist/lib/share/capture.d.ts +1 -1
  374. package/dist/lib/share/capture.js +3 -3
  375. package/dist/lib/share/config.d.ts +6 -2
  376. package/dist/lib/share/config.js +6 -5
  377. package/dist/lib/share/delete.js +3 -3
  378. package/dist/lib/share/provision.d.ts +38 -0
  379. package/dist/lib/share/provision.js +51 -1
  380. package/dist/lib/share/publish.d.ts +40 -1
  381. package/dist/lib/share/publish.js +119 -6
  382. package/dist/lib/share/worker-template.d.ts +12 -1
  383. package/dist/lib/share/worker-template.js +83 -7
  384. package/dist/lib/shims.d.ts +17 -3
  385. package/dist/lib/shims.js +98 -26
  386. package/dist/lib/signin-badge.js +3 -2
  387. package/dist/lib/skills.js +2 -0
  388. package/dist/lib/smart-launch.d.ts +8 -8
  389. package/dist/lib/smart-launch.js +80 -59
  390. package/dist/lib/ssh-exec.d.ts +1 -1
  391. package/dist/lib/ssh-exec.js +1 -1
  392. package/dist/lib/staleness/prune.d.ts +88 -0
  393. package/dist/lib/staleness/prune.js +69 -0
  394. package/dist/lib/staleness/registry.d.ts +1 -1
  395. package/dist/lib/staleness/writers/commands.js +34 -2
  396. package/dist/lib/staleness/writers/hooks.js +16 -0
  397. package/dist/lib/staleness/writers/kinds.d.ts +6 -0
  398. package/dist/lib/staleness/writers/skills.js +19 -0
  399. package/dist/lib/staleness/writers/subagents.d.ts +2 -3
  400. package/dist/lib/staleness/writers/subagents.js +0 -4
  401. package/dist/lib/staleness/writers/types.d.ts +32 -0
  402. package/dist/lib/startup/command-registry.d.ts +16 -14
  403. package/dist/lib/startup/command-registry.js +26 -37
  404. package/dist/lib/startup/dev-build.d.ts +10 -0
  405. package/dist/lib/startup/dev-build.js +13 -1
  406. package/dist/lib/startup/spellcheck.d.ts +18 -0
  407. package/dist/lib/startup/spellcheck.js +45 -0
  408. package/dist/lib/state.d.ts +36 -9
  409. package/dist/lib/state.js +96 -46
  410. package/dist/lib/subagents-registry.d.ts +0 -7
  411. package/dist/lib/subagents-registry.js +38 -65
  412. package/dist/lib/subagents.d.ts +0 -33
  413. package/dist/lib/subagents.js +0 -75
  414. package/dist/lib/sync-umbrella.js +1 -1
  415. package/dist/lib/teams/agents.d.ts +41 -1
  416. package/dist/lib/teams/agents.js +187 -9
  417. package/dist/lib/teams/api.d.ts +11 -1
  418. package/dist/lib/teams/api.js +11 -2
  419. package/dist/lib/teams/delivery.d.ts +41 -0
  420. package/dist/lib/teams/delivery.js +60 -0
  421. package/dist/lib/teams/registry.d.ts +14 -0
  422. package/dist/lib/teams/registry.js +51 -1
  423. package/dist/lib/teams/remoteWorktree.d.ts +19 -0
  424. package/dist/lib/teams/remoteWorktree.js +29 -0
  425. package/dist/lib/teams/scheduler.d.ts +1 -1
  426. package/dist/lib/teams/scheduler.js +1 -1
  427. package/dist/lib/teams/worktree.d.ts +24 -0
  428. package/dist/lib/teams/worktree.js +42 -0
  429. package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
  430. package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
  431. package/dist/lib/terminal/engine.d.ts +4 -0
  432. package/dist/lib/terminal/engine.js +8 -2
  433. package/dist/lib/terminal/types.d.ts +21 -2
  434. package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
  435. package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
  436. package/dist/lib/tickets/list.d.ts +53 -0
  437. package/dist/lib/tickets/list.js +153 -0
  438. package/dist/lib/tmux/orphan-reap.d.ts +316 -0
  439. package/dist/lib/tmux/orphan-reap.js +638 -0
  440. package/dist/lib/tmux/session.d.ts +68 -3
  441. package/dist/lib/tmux/session.js +96 -5
  442. package/dist/lib/triggers/handlers.d.ts +20 -0
  443. package/dist/lib/triggers/handlers.js +16 -1
  444. package/dist/lib/triggers/webhook.js +10 -0
  445. package/dist/lib/types.d.ts +47 -35
  446. package/dist/lib/usage-fleet.d.ts +32 -0
  447. package/dist/lib/usage-fleet.js +125 -0
  448. package/dist/lib/usage-refresh.d.ts +3 -3
  449. package/dist/lib/usage-refresh.js +19 -16
  450. package/dist/lib/usage.d.ts +51 -47
  451. package/dist/lib/usage.js +145 -153
  452. package/dist/lib/version-duplicates.js +2 -2
  453. package/dist/lib/versions.d.ts +56 -13
  454. package/dist/lib/versions.js +195 -45
  455. package/dist/lib/watchdog/log.d.ts +1 -1
  456. package/dist/lib/watchdog/log.js +3 -3
  457. package/dist/lib/watchdog/rotate.d.ts +6 -6
  458. package/dist/lib/watchdog/rotate.js +6 -6
  459. package/dist/lib/workflows.d.ts +1 -1
  460. package/dist/lib/yaml-io.d.ts +47 -0
  461. package/dist/lib/yaml-io.js +55 -0
  462. package/package.json +2 -1
  463. package/scripts/install-helper.js +2 -2
  464. package/scripts/postinstall.js +23 -20
  465. package/dist/commands/defaults.d.ts +0 -7
  466. package/dist/commands/defaults.js +0 -107
  467. package/dist/commands/export.d.ts +0 -11
  468. package/dist/commands/export.js +0 -215
  469. package/dist/commands/helper.d.ts +0 -12
  470. package/dist/commands/helper.js +0 -87
  471. package/dist/commands/hosts.d.ts +0 -11
  472. package/dist/commands/hosts.js +0 -330
  473. package/dist/commands/lock.d.ts +0 -12
  474. package/dist/commands/lock.js +0 -70
  475. package/dist/commands/pull.d.ts +0 -17
  476. package/dist/commands/pull.js +0 -39
  477. package/dist/commands/push.d.ts +0 -14
  478. package/dist/commands/push.js +0 -30
  479. package/dist/commands/set.d.ts +0 -15
  480. package/dist/commands/set.js +0 -79
  481. package/dist/commands/setup-share.d.ts +0 -17
  482. package/dist/commands/setup-share.js +0 -85
  483. package/dist/commands/wallet.d.ts +0 -20
  484. package/dist/commands/wallet.js +0 -216
  485. package/dist/commands/worktree.d.ts +0 -19
  486. package/dist/commands/worktree.js +0 -272
  487. package/dist/lib/account-labels.d.ts +0 -24
  488. package/dist/lib/account-labels.js +0 -72
  489. package/dist/lib/auto-dispatch-linear.d.ts +0 -18
  490. package/dist/lib/auto-dispatch-linear.js +0 -107
  491. package/dist/lib/auto-dispatch-provider.d.ts +0 -10
  492. package/dist/lib/auto-dispatch-provider.js +0 -30
  493. package/dist/lib/auto-dispatch.d.ts +0 -93
  494. package/dist/lib/auto-dispatch.js +0 -128
  495. package/dist/lib/export.d.ts +0 -72
  496. package/dist/lib/export.js +0 -269
  497. package/dist/lib/lock.d.ts +0 -93
  498. package/dist/lib/lock.js +0 -207
  499. package/dist/lib/wallet/index.d.ts +0 -78
  500. package/dist/lib/wallet/index.js +0 -253
@@ -41,8 +41,9 @@ import { listInstalledSubagents } from './subagents.js';
41
41
  import { listInstalledWorkflows } from './workflows.js';
42
42
  import { parseHookManifest, registerHooksToSettings, selectHookManifest, pruneVersionHomeHookEntriesFromSettings } from './hooks.js';
43
43
  import { supports, explainSkip } from './capabilities.js';
44
- import { discoverPlugins, marketplaceSpecForName } from './plugins.js';
44
+ import { discoverPlugins, syncPluginToVersion, pluginSupportsAgent, cleanOrphanedPluginSkills, marketplaceSpecForName } from './plugins.js';
45
45
  import { loadManifest, saveManifest, buildManifest as buildSyncManifest, isStale } from './staleness/index.js';
46
+ import { pruneRemovedResources } from './staleness/prune.js';
46
47
  import { emit } from './events.js';
47
48
  import { safeJoin } from './paths.js';
48
49
  import { readSkillSourceCommandMarker, shouldAlsoInstallCommandAsSkill, shouldInstallCommandAsSkill, } from './command-skills.js';
@@ -896,6 +897,59 @@ export function parseAgentSpec(spec) {
896
897
  export function getVersionDir(agent, version) {
897
898
  return path.join(getVersionsDir(), agent, version);
898
899
  }
900
+ /**
901
+ * Grok binaries are never trusted below this size when picking among several
902
+ * `grok-*` candidates with no exact version match (see
903
+ * {@link resolveGrokFallbackBinary}). Grok's real native binary is ~100MB+; a
904
+ * stray non-binary artifact sharing the `grok-*` naming pattern (a wrapper or
905
+ * alias script) is at most a few hundred bytes, so 1MB comfortably separates
906
+ * the two without depending on file content.
907
+ */
908
+ const MIN_GROK_BINARY_BYTES = 1_000_000;
909
+ /**
910
+ * Pick the real grok binary among `grok-*` entries in `downloadsDir` when NO
911
+ * filename carries the pinned version string. Grok self-updates its binary in
912
+ * place while running under the shim, so a version-home's downloads dir can
913
+ * accumulate several `grok-*` files whose names have drifted away from that
914
+ * version-home's pinned version (RUSH-2459: on yosemite-s0, version-home
915
+ * `0.2.82` held `grok-1.0.0-linux-aarch64` after grok self-updated, plus a
916
+ * stale, unrelated 99-byte `grok-0.2.118-linux-aarch64` wrapper script that
917
+ * happened to sort alphabetically first).
918
+ *
919
+ * Never blindly take whatever `fs.readdirSync` returns first — that is exactly
920
+ * the bug this replaces. Instead: exclude anything under
921
+ * {@link MIN_GROK_BINARY_BYTES} (rejects wrapper/alias artifacts on size
922
+ * alone, no content sniffing needed) and, among the survivors, prefer the most
923
+ * recently modified — the file grok's self-updater actually wrote last.
924
+ * Returns null (fail loud, never guess) when nothing survives the size filter.
925
+ */
926
+ export function resolveGrokFallbackBinary(downloadsDir) {
927
+ let entries;
928
+ try {
929
+ entries = fs.readdirSync(downloadsDir);
930
+ }
931
+ catch {
932
+ return null;
933
+ }
934
+ let best = null;
935
+ for (const entry of entries) {
936
+ if (!entry.startsWith('grok-'))
937
+ continue;
938
+ const full = path.join(downloadsDir, entry);
939
+ let stat;
940
+ try {
941
+ stat = fs.statSync(full);
942
+ }
943
+ catch {
944
+ continue;
945
+ }
946
+ if (!stat.isFile() || stat.size < MIN_GROK_BINARY_BYTES)
947
+ continue;
948
+ if (!best || stat.mtimeMs > best.mtimeMs)
949
+ best = { name: entry, mtimeMs: stat.mtimeMs };
950
+ }
951
+ return best ? path.join(downloadsDir, best.name) : null;
952
+ }
899
953
  /**
900
954
  * Get the binary path for a specific agent version.
901
955
  */
@@ -909,15 +963,15 @@ export function getBinaryPath(agent, version) {
909
963
  const match = entries.find((e) => e.includes(version) && e.startsWith('grok-'));
910
964
  if (match)
911
965
  return path.join(grokDownloads, match);
912
- const first = entries.find((e) => e.startsWith('grok-'));
913
- if (first)
914
- return path.join(grokDownloads, first);
915
966
  }
916
967
  catch { }
968
+ const fallback = resolveGrokFallbackBinary(grokDownloads);
969
+ if (fallback)
970
+ return fallback;
917
971
  return path.join(grokDownloads, `grok-${version}`);
918
972
  }
919
973
  if (agent === 'droid') {
920
- // Factory's installer drops a standalone native binary (no npm package,
974
+ // Factory.ai's installer drops a standalone native binary (no npm package,
921
975
  // nothing in node_modules/.bin). The binary is global, not per-version —
922
976
  // config isolation rides the ~/.factory symlink switch, not a separate
923
977
  // binary per version. Install location is platform-specific:
@@ -941,19 +995,18 @@ export function getBinaryPath(agent, version) {
941
995
  : path.join(getHomeDir(), '.local', 'bin', 'muse');
942
996
  }
943
997
  if (agent === 'warp') {
944
- // Warp Agent CLI installs a single global, self-updating `oz` binary — brew
945
- // cask on macOS, the `oz-stable` apt|yum|pacman package on Linux so, unlike
946
- // droid/muse (which land at ~/.local/bin), its install location is
947
- // platform/package specific. Resolve the real binary on PATH (findInPath
948
- // skips our own shims dir) so isVersionInstalled / agents view agree with
949
- // what executes. When oz is not installed, fall back to a deterministic path
950
- // that won't exist, so isVersionInstalled reports uninstalled honestly.
951
- const onPath = findInPath('oz');
998
+ // Warp Agent CLI installs a single global, self-updating `warp` binary at
999
+ // ~/.local/bin/warp via the curl installer (Windows: the agent-cli.ps1)
1000
+ // like droid/muse. Resolve the real binary on PATH (findInPath skips our own
1001
+ // shims dir) so isVersionInstalled / agents view agree with what executes.
1002
+ // When warp is not installed, fall back to its default install path so
1003
+ // isVersionInstalled reports uninstalled honestly.
1004
+ const onPath = findInPath('warp');
952
1005
  if (onPath)
953
1006
  return onPath;
954
1007
  return IS_WINDOWS
955
- ? path.join(getHomeDir(), 'bin', 'oz.exe')
956
- : '/opt/warpdotdev/oz-stable/oz';
1008
+ ? path.join(getHomeDir(), 'bin', 'warp.exe')
1009
+ : path.join(getHomeDir(), '.local', 'bin', 'warp');
957
1010
  }
958
1011
  const versionDir = getVersionDir(agent, version);
959
1012
  return path.join(versionDir, 'node_modules', '.bin', agentConfig.cliCommand);
@@ -2528,36 +2581,89 @@ function resourceSourceMap(kind, cwd, available) {
2528
2581
  }
2529
2582
  }
2530
2583
  }
2584
+ /**
2585
+ * Build a ResourceSelection from source-pattern expansion and an optional
2586
+ * per-kind name filter. Both dimensions are optional and compose:
2587
+ *
2588
+ * patterns only → resources from those source layers (all matching names)
2589
+ * kindFilter only → only those specific kinds / names, no source restriction
2590
+ * both combined → patterns scope the source layer; kindFilter further
2591
+ * limits which names within each kind are included
2592
+ *
2593
+ * Typical callers:
2594
+ * `--repo system` → buildSelection(['system:*'])
2595
+ * `--plugin` → buildSelection([], { plugins: 'all' })
2596
+ * `--plugin fleet` → buildSelection([], { plugins: ['fleet'] })
2597
+ * no flags → buildSelection([]) → full selection
2598
+ *
2599
+ * Memory (`kindFilter.memory`):
2600
+ * - Always `'all'` when patterns are active (repo scope must recompile the
2601
+ * composed file from all layers, RUSH-1354).
2602
+ * - `'all'` when `kindFilter.memory` is set (--rule / --memory flag).
2603
+ * - Absent (skipped) when kindFilter is given but does not include memory,
2604
+ * so `--plugin fleet` does NOT trigger a memory recompile.
2605
+ * - `'all'` when no kindFilter is given (full sync includes everything).
2606
+ */
2607
+ export function buildSelection(patterns, kindFilter, cwd = process.cwd()) {
2608
+ const hasPatterns = patterns.length > 0;
2609
+ const hasKindFilter = kindFilter !== undefined;
2610
+ // Fast path: no restrictions → sync every kind
2611
+ if (!hasPatterns && !hasKindFilter) {
2612
+ return {
2613
+ commands: 'all', skills: 'all', hooks: 'all',
2614
+ subagents: 'all', permissions: 'all', mcp: 'all',
2615
+ plugins: 'all', workflows: 'all', memory: 'all',
2616
+ };
2617
+ }
2618
+ const selection = {};
2619
+ const allKinds = [
2620
+ 'commands', 'skills', 'hooks', 'subagents',
2621
+ 'permissions', 'mcp', 'plugins', 'workflows',
2622
+ ];
2623
+ const available = hasPatterns ? getAvailableResources(cwd) : undefined;
2624
+ for (const kind of allKinds) {
2625
+ const filterVal = kindFilter?.[kind];
2626
+ // When a kind filter is active, skip kinds not listed in it
2627
+ if (hasKindFilter && filterVal === undefined)
2628
+ continue;
2629
+ if (hasPatterns) {
2630
+ const sourceMap = resourceSourceMap(kind, cwd, available);
2631
+ const patternNames = expandPatterns(patterns, sourceMap);
2632
+ if (patternNames.length === 0)
2633
+ continue;
2634
+ if (!filterVal || filterVal === 'all') {
2635
+ selection[kind] = patternNames;
2636
+ }
2637
+ else {
2638
+ // Intersect pattern-expanded names with the caller's name filter
2639
+ const filterSet = new Set(filterVal);
2640
+ const intersected = patternNames.filter(n => filterSet.has(n));
2641
+ if (intersected.length > 0)
2642
+ selection[kind] = intersected;
2643
+ }
2644
+ }
2645
+ else {
2646
+ // Kind filter only — no pattern restriction; use the filter value directly
2647
+ selection[kind] = filterVal === 'all' || !filterVal ? 'all' : filterVal;
2648
+ }
2649
+ }
2650
+ // Memory is always 'all' when patterns are active (RUSH-1354), when the
2651
+ // memory/rule flag was given, or when no kind filter restricts what is synced.
2652
+ const memoryRequested = hasPatterns || kindFilter?.memory !== undefined || !hasKindFilter;
2653
+ if (memoryRequested)
2654
+ selection.memory = 'all';
2655
+ return selection;
2656
+ }
2531
2657
  /**
2532
2658
  * Build a ResourceSelection scoped to a single DotAgent repo (`system`,
2533
- * `user`, `project`, or an extra-repo alias). Every resource kind is filtered
2534
- * to the entries whose source layer matches `repo`, reusing the same
2535
- * name→source maps and `source:*` pattern expansion the persisted-pattern
2536
- * sync path uses. Passing the result as an explicit `selection` means the sync
2537
- * touches only that repo's resources — no orphan-sweep of the other layers.
2659
+ * `user`, `project`, or an extra-repo alias). Delegates to `buildSelection`
2660
+ * so the source-map and pattern-expansion logic stays in one place.
2538
2661
  *
2539
- * `memory` is set to `'all'`, NOT `[]`: the composed rules-memory file is a
2540
- * merge of ALL layers, so scoping the sync to a single repo must still
2541
- * recompile it in the same pass (RUSH-1354). Leaving it out — or using the
2542
- * `[]` skip-sentinel — silently strands the memory file at its old content
2543
- * whenever a repo-scoped sync runs after a rules change. `'all'` makes
2544
- * `syncResourcesToVersion` recompose from every layer via the active preset,
2545
- * exactly as an unscoped full reconcile does.
2662
+ * `memory` is always `'all'`: the composed rules-memory file spans all layers
2663
+ * and must be recompiled in the same pass (RUSH-1354).
2546
2664
  */
2547
2665
  export function buildRepoScopedSelection(repo, cwd = process.cwd()) {
2548
- const patterns = [`${repo}:*`];
2549
- const available = getAvailableResources(cwd);
2550
- const selection = {};
2551
- const kinds = ['commands', 'skills', 'hooks', 'subagents', 'permissions', 'mcp', 'plugins', 'workflows'];
2552
- for (const kind of kinds) {
2553
- const names = expandPatterns(patterns, resourceSourceMap(kind, cwd, available));
2554
- if (names.length > 0)
2555
- selection[kind] = names;
2556
- }
2557
- // Recompile the memory file from all layers even under a repo scope — it is
2558
- // composed, not a per-repo artifact (see skipMemory below and RUSH-1354).
2559
- selection.memory = 'all';
2560
- return selection;
2666
+ return buildSelection([`${repo}:*`], undefined, cwd);
2561
2667
  }
2562
2668
  /**
2563
2669
  * Union several ResourceSelections into one, deduping names per kind. Pure — no
@@ -2605,7 +2711,7 @@ export function mergeRepoScopedSelections(repos, cwd = process.cwd()) {
2605
2711
  */
2606
2712
  export function syncResourcesToVersion(agent, version, selection, options = {}) {
2607
2713
  if (isAgentHardDeprecated(agent)) {
2608
- return { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [] };
2714
+ return { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [], pruned: { commands: [], skills: [] } };
2609
2715
  }
2610
2716
  const agentConfig = AGENTS[agent];
2611
2717
  const versionHome = getVersionHomePath(agent, version);
@@ -2616,7 +2722,7 @@ export function syncResourcesToVersion(agent, version, selection, options = {})
2616
2722
  // care about the ORIGINAL intent: a caller passing no selection means
2617
2723
  // "full sync; persist the staleness manifest after."
2618
2724
  const userPassedSelection = selection !== undefined;
2619
- const result = { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [] };
2725
+ const result = { commands: false, skills: false, hooks: false, memory: [], permissions: false, mcp: [], subagents: [], plugins: [], workflows: [], projectSkipped: [], pruned: { commands: [], skills: [] } };
2620
2726
  const cwd = options.cwd || process.cwd();
2621
2727
  const projectAgentsDir = options.projectDir || getProjectAgentsDir(cwd);
2622
2728
  const userAgentsDir = getUserAgentsDir();
@@ -3037,10 +3143,27 @@ export function syncResourcesToVersion(agent, version, selection, options = {})
3037
3143
  }
3038
3144
  }
3039
3145
  }
3040
- // Sync plugins — dispatch through WRITERS.plugins.
3146
+ // Sync plugins — dispatch through WRITERS.plugins (or directly via
3147
+ // syncPluginToVersion when allowExecSurfaces is requested, since WriteArgs
3148
+ // has no channel for that option).
3041
3149
  if (pluginsToSync.length > 0 && pluginsWriter) {
3042
- const r = pluginsWriter.write({ version, versionHome, selection: pluginsToSync, cwd });
3043
- result.plugins.push(...r.synced);
3150
+ if (options.allowExecSurfaces) {
3151
+ const allPlugins = discoverPlugins();
3152
+ cleanOrphanedPluginSkills(agent, versionHome, new Set(allPlugins.map(p => p.name)));
3153
+ const pluginMap = new Map(allPlugins.map(p => [p.name, p]));
3154
+ for (const name of pluginsToSync) {
3155
+ const plugin = pluginMap.get(name);
3156
+ if (!plugin || !pluginSupportsAgent(plugin, agent))
3157
+ continue;
3158
+ const r = syncPluginToVersion(plugin, agent, versionHome, { version, allowExecSurfaces: true });
3159
+ if (r.success)
3160
+ result.plugins.push(name);
3161
+ }
3162
+ }
3163
+ else {
3164
+ const r = pluginsWriter.write({ version, versionHome, selection: pluginsToSync, cwd });
3165
+ result.plugins.push(...r.synced);
3166
+ }
3044
3167
  }
3045
3168
  // Sync workflows — dispatch through WRITERS.workflows.
3046
3169
  const workflowsWriter = getWriter('workflows', agent);
@@ -3068,6 +3191,33 @@ export function syncResourcesToVersion(agent, version, selection, options = {})
3068
3191
  if (supports(agent, 'memory', version).ok) {
3069
3192
  syncMemoryToVersionHome(agent, versionHome, cwd);
3070
3193
  }
3194
+ // Prune resources deleted from source (RUSH-2438). Runs only on a repo-scope
3195
+ // reconcile (`options.prune`) with a caller selection — a full sync
3196
+ // (`!userPassedSelection`) already sweeps orphans above, and an additive
3197
+ // interactive/`agents add` selection must not delete anything. The prune is
3198
+ // manifest-bounded: only names the last full sync recorded are candidates,
3199
+ // and only when they are gone from ALL source layers — so a user-authored
3200
+ // file the sync never placed, or a same-named resource still provided by
3201
+ // another layer, is never removed. No manifest → fail loud (delete nothing).
3202
+ if (options.prune && userPassedSelection) {
3203
+ const previousManifest = loadManifest(agent, version);
3204
+ const outcome = pruneRemovedResources({
3205
+ agent,
3206
+ version,
3207
+ versionHome,
3208
+ cwd,
3209
+ previousManifest,
3210
+ sourceNames: {
3211
+ commands: available.commands,
3212
+ skills: available.skills,
3213
+ },
3214
+ });
3215
+ result.pruned = outcome.pruned;
3216
+ if (outcome.skippedNoManifest) {
3217
+ console.warn(`agents: prune skipped for ${agent}@${version} — no sync manifest yet, so no removed resources were pruned. ` +
3218
+ `Run 'agents sync ${agent}@${version}' (a full sync) to establish the baseline.`);
3219
+ }
3220
+ }
3071
3221
  // Write manifest after a full sync (no user-passed selection) so the next
3072
3222
  // launch can skip the slow path. Pattern-derived selections still count as
3073
3223
  // "full" — the agents.yaml patterns describe the intended scope, not a
@@ -1,4 +1,4 @@
1
- /** Same path the Factory reader pulls (apps/factory/src/core/watchdogLog.ts). */
1
+ /** Same path the Fleet reader pulls (apps/ext/src/core/watchdogLog.ts). */
2
2
  export declare const WATCHDOG_LOG_PATH: string;
3
3
  /** Kinds the Factory reader accepts. Keep in lockstep with watchdogLog.ts. */
4
4
  export type WatchdogEventKind = 'tick' | 'decision' | 'nudge' | 'rotate' | 'error';
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Canonical watchdog event log (watchdog-brain-v2).
3
3
  *
4
- * The Factory Floor renders a read-only "Watchdog activity" card from the JSONL
4
+ * The Fleet renders a read-only "Watchdog activity" card from the JSONL
5
5
  * feed at ~/.agents/.cache/logs/watchdog.log. That feed was historically written
6
6
  * by the retired extension-side watchdog; now the always-on CLI watchdog owns it.
7
7
  *
8
8
  * The event SHAPE here is a deliberate, verbatim replica of the reader in
9
- * apps/factory/src/core/watchdogLog.ts (WatchdogEvent / WatchdogEventKind /
9
+ * apps/ext/src/core/watchdogLog.ts (WatchdogEvent / WatchdogEventKind /
10
10
  * WATCHDOG_LOG_PATH / the trim cap). The repo forbids cross-app imports
11
11
  * (CLAUDE.md repo map), so the two files are kept in sync by hand — a change to
12
12
  * the Factory reader's shape must be mirrored here. There is no import between
@@ -16,7 +16,7 @@ import * as fs from 'fs';
16
16
  import * as os from 'os';
17
17
  import * as path from 'path';
18
18
  import { withFileLock, atomicWriteFileSync, ensureLockTarget } from '../fs-atomic.js';
19
- /** Same path the Factory reader pulls (apps/factory/src/core/watchdogLog.ts). */
19
+ /** Same path the Fleet reader pulls (apps/ext/src/core/watchdogLog.ts). */
20
20
  export const WATCHDOG_LOG_PATH = path.join(os.homedir(), '.agents', '.cache', 'logs', 'watchdog.log');
21
21
  const WATCHDOG_EVENT_KINDS = new Set(['tick', 'decision', 'nudge', 'rotate', 'error']);
22
22
  /** Parse the audit log without letting a partial final append hide valid rows. */
@@ -7,13 +7,13 @@
7
7
  * weekly limit · resets …"), the daemon watchdog rotates it instead of nudging:
8
8
  *
9
9
  * 1. DETECT — classifyTailForRotate() matches the tail against the limit
10
- * patterns (ported from apps/factory/src/core/autoRotate.ts) and parses the
10
+ * patterns (ported from apps/ext/src/core/autoRotate.ts) and parses the
11
11
  * `resets <time>` clause when present.
12
12
  * 2. GATE — defaultRotateGate() runs the SAME first-party selection
13
13
  * `agents run auto` would (collectHarnessCandidates + pickHarnessWeighted,
14
14
  * ../rotate.ts). Zero healthy → ONE `rotate` skip event per cooldown window
15
15
  * and the terminal is left untouched. No `agents view` subprocess anywhere.
16
- * 3. RELAUNCH — the per-harness exit sequence (ported from apps/factory
16
+ * 3. RELAUNCH — the per-harness exit sequence (ported from apps/ext
17
17
  * prewarm.ts PREWARM_CONFIGS) is injected, then
18
18
  * `agents run auto --interactive --session-id <uuid>`.
19
19
  * 4. REPLAY — when the new session's TUI is live (bounded wait, default
@@ -31,7 +31,7 @@ import type { InjectTarget } from '../terminal/inject.js';
31
31
  import type { ActiveSession } from '../session/active.js';
32
32
  /**
33
33
  * Agent-reported hard-limit texts, matched against a session transcript tail.
34
- * Ported verbatim from apps/factory/src/core/autoRotate.ts RATE_LIMIT_PATTERNS —
34
+ * Ported verbatim from apps/ext/src/core/autoRotate.ts RATE_LIMIT_PATTERNS —
35
35
  * kept specific on purpose: a transcript carries prose, so a loose "rate limit"
36
36
  * match would rotate terminals whose agent merely DISCUSSED limits. The first
37
37
  * two patterns cover the weekly/session variants, including claude's
@@ -54,7 +54,7 @@ export type RotateTailVerdict = {
54
54
  export declare function classifyTailForRotate(tailLines: string[], nowMs: number): RotateTailVerdict;
55
55
  /**
56
56
  * Parse the `resets <time>` clause of a limit line into an epoch-ms horizon.
57
- * Ported from apps/factory/src/core/autoRotate.ts parseResetTimeMs (behavior
57
+ * Ported from apps/ext/src/core/autoRotate.ts parseResetTimeMs (behavior
58
58
  * verbatim): the ISO form (milliseconds + Z) is matched EXPLICITLY and first —
59
59
  * a generic capture stops at the milliseconds dot and drops the Z, which makes
60
60
  * Date.parse read LOCAL time (the suppression would end hours off). Time-of-day
@@ -64,7 +64,7 @@ export declare function classifyTailForRotate(tailLines: string[], nowMs: number
64
64
  */
65
65
  export declare function parseRotateResetMs(text: string, nowMs: number): number | undefined;
66
66
  /**
67
- * Clean-exit key sequences per harness, ported verbatim from apps/factory
67
+ * Clean-exit key sequences per harness, ported verbatim from apps/ext
68
68
  * prewarm.ts PREWARM_CONFIGS. Injected as RAW BYTES with no trailing Enter — a
69
69
  * literal \x03 written to the pty IS Ctrl+C (SIGINT), \x1b IS Esc. claude's Ink
70
70
  * TUI needs the Esc first to leave any open mode before the interrupt pair.
@@ -76,7 +76,7 @@ export declare function exitSequenceFor(agent: string): string[];
76
76
  /**
77
77
  * The rotate relaunch, typed into the same tab: full auto — the CLI resolves
78
78
  * host (affinity) → harness (cross-harness headroom) → account (balanced) and
79
- * exits nonzero when every layer is exhausted. Ported from apps/factory
79
+ * exits nonzero when every layer is exhausted. Ported from apps/ext
80
80
  * autoRotate.ts buildAutoRotateLaunchCommand. A terminal on a REMOTE device
81
81
  * rotates ON that device (`--host`); a local terminal omits it. `--session-id`
82
82
  * is honored only when the CLI picks claude (existing claude-only semantics)
@@ -7,13 +7,13 @@
7
7
  * weekly limit · resets …"), the daemon watchdog rotates it instead of nudging:
8
8
  *
9
9
  * 1. DETECT — classifyTailForRotate() matches the tail against the limit
10
- * patterns (ported from apps/factory/src/core/autoRotate.ts) and parses the
10
+ * patterns (ported from apps/ext/src/core/autoRotate.ts) and parses the
11
11
  * `resets <time>` clause when present.
12
12
  * 2. GATE — defaultRotateGate() runs the SAME first-party selection
13
13
  * `agents run auto` would (collectHarnessCandidates + pickHarnessWeighted,
14
14
  * ../rotate.ts). Zero healthy → ONE `rotate` skip event per cooldown window
15
15
  * and the terminal is left untouched. No `agents view` subprocess anywhere.
16
- * 3. RELAUNCH — the per-harness exit sequence (ported from apps/factory
16
+ * 3. RELAUNCH — the per-harness exit sequence (ported from apps/ext
17
17
  * prewarm.ts PREWARM_CONFIGS) is injected, then
18
18
  * `agents run auto --interactive --session-id <uuid>`.
19
19
  * 4. REPLAY — when the new session's TUI is live (bounded wait, default
@@ -35,7 +35,7 @@ import { resolveWatchdogSessionPath } from './read.js';
35
35
  // --- detection ---------------------------------------------------------------
36
36
  /**
37
37
  * Agent-reported hard-limit texts, matched against a session transcript tail.
38
- * Ported verbatim from apps/factory/src/core/autoRotate.ts RATE_LIMIT_PATTERNS —
38
+ * Ported verbatim from apps/ext/src/core/autoRotate.ts RATE_LIMIT_PATTERNS —
39
39
  * kept specific on purpose: a transcript carries prose, so a loose "rate limit"
40
40
  * match would rotate terminals whose agent merely DISCUSSED limits. The first
41
41
  * two patterns cover the weekly/session variants, including claude's
@@ -66,7 +66,7 @@ export function classifyTailForRotate(tailLines, nowMs) {
66
66
  }
67
67
  /**
68
68
  * Parse the `resets <time>` clause of a limit line into an epoch-ms horizon.
69
- * Ported from apps/factory/src/core/autoRotate.ts parseResetTimeMs (behavior
69
+ * Ported from apps/ext/src/core/autoRotate.ts parseResetTimeMs (behavior
70
70
  * verbatim): the ISO form (milliseconds + Z) is matched EXPLICITLY and first —
71
71
  * a generic capture stops at the milliseconds dot and drops the Z, which makes
72
72
  * Date.parse read LOCAL time (the suppression would end hours off). Time-of-day
@@ -137,7 +137,7 @@ function nextOccurrenceMs(hour, minute, timeZone, nowMs) {
137
137
  }
138
138
  // --- exit sequences ------------------------------------------------------------
139
139
  /**
140
- * Clean-exit key sequences per harness, ported verbatim from apps/factory
140
+ * Clean-exit key sequences per harness, ported verbatim from apps/ext
141
141
  * prewarm.ts PREWARM_CONFIGS. Injected as RAW BYTES with no trailing Enter — a
142
142
  * literal \x03 written to the pty IS Ctrl+C (SIGINT), \x1b IS Esc. claude's Ink
143
143
  * TUI needs the Esc first to leave any open mode before the interrupt pair.
@@ -158,7 +158,7 @@ export function exitSequenceFor(agent) {
158
158
  /**
159
159
  * The rotate relaunch, typed into the same tab: full auto — the CLI resolves
160
160
  * host (affinity) → harness (cross-harness headroom) → account (balanced) and
161
- * exits nonzero when every layer is exhausted. Ported from apps/factory
161
+ * exits nonzero when every layer is exhausted. Ported from apps/ext
162
162
  * autoRotate.ts buildAutoRotateLaunchCommand. A terminal on a REMOTE device
163
163
  * rotates ON that device (`--host`); a local terminal omits it. `--session-id`
164
164
  * is honored only when the CLI picks claude (existing claude-only semantics)
@@ -9,7 +9,7 @@ import type { AgentId } from './types.js';
9
9
  /**
10
10
  * The `loop:` block as it appears in WORKFLOW.md frontmatter (YAML, snake_case).
11
11
  * Parsed defensively and translated to the camelCase LoopConfig the driver
12
- * consumes (src/lib/loop.ts). See docs/07-entrypoints-and-loops.md.
12
+ * consumes (src/lib/loop.ts). See docs/entrypoints-and-loops.md.
13
13
  */
14
14
  export interface LoopConfigRaw {
15
15
  /** Stop condition. Only `signal` is supported today. */
@@ -0,0 +1,47 @@
1
+ import * as yaml from 'yaml';
2
+ /**
3
+ * The single serialization used by every writer that edits a shared, committed
4
+ * YAML document in place.
5
+ *
6
+ * RUSH-2505 had two halves. The first: the `yaml` emitter pads flow collections
7
+ * by default, so a round trip rewrote
8
+ *
9
+ * command: [agents, notify, "{message}"]
10
+ * as
11
+ * command: [ agents, notify, "{message}" ]
12
+ *
13
+ * The second, which outlived the first fix: `agents.yaml` has five in-place
14
+ * writers, and they did not agree on collection style. `state.ts` and
15
+ * `manifest.ts` forced block while `feed.ts`, `activity.ts` and `migrate.ts`
16
+ * took the defaults, so an empty map came out as
17
+ *
18
+ * mcp: from two of them, and mcp: {}
19
+ * {} from the other three,
20
+ *
21
+ * and each group rewrote the other's output on the next command.
22
+ *
23
+ * Both diffs are semantically no-ops, which is what made them dangerous. The
24
+ * working tree went permanently dirty, then `agents repo pull` refused
25
+ * ("Blocked by local changes") and `git merge --ff-only` refused, so the box
26
+ * silently stopped receiving fleet config. Seven boxes fell 37-52 commits
27
+ * behind and nothing reported it.
28
+ *
29
+ * Two constraints pull in opposite directions, and both are real:
30
+ *
31
+ * - Forcing `collectionStyle: 'block'` unconditionally flattens a committed
32
+ * flow sequence into a block list — its own dirtying diff, asserted against
33
+ * by the RUSH-2505 case in `feed.test.ts`.
34
+ * - Never forcing it regresses what `state.ts` and `manifest.ts` were guarding:
35
+ * when the document ROOT is flow (a legacy `{}` or `{a: 1}` file), every
36
+ * edited node inherits flow, so a `doc.set()` yields
37
+ * `{a: 1, disabledCommands: [teams]}` instead of a block mapping.
38
+ *
39
+ * So block is forced exactly when the root is flow, which is the only case that
40
+ * needs it, and left alone otherwise. Every writer gets the same rule, so the
41
+ * same document can only produce one result and there is nothing left to
42
+ * oscillate.
43
+ *
44
+ * Caller options merge last, so a writer with a genuine reason to differ still
45
+ * can — but it then owns the drift it causes.
46
+ */
47
+ export declare function stringifyDoc(doc: yaml.Document, options?: yaml.ToStringOptions): string;
@@ -0,0 +1,55 @@
1
+ /**
2
+ * The single serialization used by every writer that edits a shared, committed
3
+ * YAML document in place.
4
+ *
5
+ * RUSH-2505 had two halves. The first: the `yaml` emitter pads flow collections
6
+ * by default, so a round trip rewrote
7
+ *
8
+ * command: [agents, notify, "{message}"]
9
+ * as
10
+ * command: [ agents, notify, "{message}" ]
11
+ *
12
+ * The second, which outlived the first fix: `agents.yaml` has five in-place
13
+ * writers, and they did not agree on collection style. `state.ts` and
14
+ * `manifest.ts` forced block while `feed.ts`, `activity.ts` and `migrate.ts`
15
+ * took the defaults, so an empty map came out as
16
+ *
17
+ * mcp: from two of them, and mcp: {}
18
+ * {} from the other three,
19
+ *
20
+ * and each group rewrote the other's output on the next command.
21
+ *
22
+ * Both diffs are semantically no-ops, which is what made them dangerous. The
23
+ * working tree went permanently dirty, then `agents repo pull` refused
24
+ * ("Blocked by local changes") and `git merge --ff-only` refused, so the box
25
+ * silently stopped receiving fleet config. Seven boxes fell 37-52 commits
26
+ * behind and nothing reported it.
27
+ *
28
+ * Two constraints pull in opposite directions, and both are real:
29
+ *
30
+ * - Forcing `collectionStyle: 'block'` unconditionally flattens a committed
31
+ * flow sequence into a block list — its own dirtying diff, asserted against
32
+ * by the RUSH-2505 case in `feed.test.ts`.
33
+ * - Never forcing it regresses what `state.ts` and `manifest.ts` were guarding:
34
+ * when the document ROOT is flow (a legacy `{}` or `{a: 1}` file), every
35
+ * edited node inherits flow, so a `doc.set()` yields
36
+ * `{a: 1, disabledCommands: [teams]}` instead of a block mapping.
37
+ *
38
+ * So block is forced exactly when the root is flow, which is the only case that
39
+ * needs it, and left alone otherwise. Every writer gets the same rule, so the
40
+ * same document can only produce one result and there is nothing left to
41
+ * oscillate.
42
+ *
43
+ * Caller options merge last, so a writer with a genuine reason to differ still
44
+ * can — but it then owns the drift it causes.
45
+ */
46
+ export function stringifyDoc(doc, options = {}) {
47
+ // A flow root makes every edited node render flow; normalize the whole doc to
48
+ // block in that case only. `contents.flow` is undefined for a block root.
49
+ const rootIsFlow = doc.contents?.flow === true;
50
+ return doc.toString({
51
+ flowCollectionPadding: false,
52
+ ...(rootIsFlow ? { collectionStyle: 'block' } : {}),
53
+ ...options,
54
+ });
55
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phnx-labs/agents-cli",
3
- "version": "1.22.35",
3
+ "version": "1.22.38",
4
4
  "description": "One CLI for all your AI coding agents - versions, config, cloud dispatch, sessions, and teams (now with first-class Grok Build CLI support)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -95,6 +95,7 @@
95
95
  "@zed-industries/agent-client-protocol": "0.4.5",
96
96
  "acorn": "8.18.0",
97
97
  "age-encryption": "0.3.0",
98
+ "aws4fetch": "1.0.20",
98
99
  "chalk": "5.6.2",
99
100
  "commander": "15.0.0",
100
101
  "croner": "10.0.1",
@@ -72,8 +72,8 @@ function main() {
72
72
  if (!src) {
73
73
  // No source bundle to install. Stay silent during postinstall so we don't
74
74
  // create noise on Linux/Windows or on builds that intentionally omit the
75
- // helper. `agents helper install` surfaces a clearer error if a user
76
- // actually needs the helper.
75
+ // helper. The lazy staleness check in getKeychainHelperPath() surfaces a
76
+ // clearer error if a user actually needs the helper.
77
77
  return;
78
78
  }
79
79