@phnx-labs/agents-cli 1.22.38 → 1.22.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/CHANGELOG.md +302 -0
  2. package/README.md +111 -70
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.js +46 -27
  5. package/dist/browser.js +2 -2
  6. package/dist/cli/command-registry.d.ts +135 -0
  7. package/dist/cli/command-registry.js +260 -0
  8. package/dist/commands/accounts.d.ts +20 -0
  9. package/dist/commands/accounts.js +186 -25
  10. package/dist/commands/apply.d.ts +3 -3
  11. package/dist/commands/apply.js +20 -63
  12. package/dist/commands/browser.js +206 -94
  13. package/dist/commands/budget.d.ts +7 -6
  14. package/dist/commands/budget.js +8 -7
  15. package/dist/commands/cloud.js +17 -20
  16. package/dist/commands/commands.js +1 -1
  17. package/dist/commands/computer-actions.d.ts +1 -35
  18. package/dist/commands/computer-actions.js +13 -181
  19. package/dist/commands/computer.d.ts +28 -3
  20. package/dist/commands/computer.js +93 -65
  21. package/dist/commands/config.js +47 -4
  22. package/dist/commands/cost.d.ts +2 -1
  23. package/dist/commands/cost.js +7 -6
  24. package/dist/commands/daemon.js +151 -4
  25. package/dist/commands/detach.js +1 -1
  26. package/dist/commands/doctor.js +19 -11
  27. package/dist/commands/events.js +1 -1
  28. package/dist/commands/exec.d.ts +2 -50
  29. package/dist/commands/exec.js +161 -216
  30. package/dist/commands/factory.js +1 -1
  31. package/dist/commands/feed.d.ts +2 -2
  32. package/dist/commands/feed.js +9 -12
  33. package/dist/commands/fleet-capture.js +25 -27
  34. package/dist/commands/focus.d.ts +2 -3
  35. package/dist/commands/focus.js +34 -9
  36. package/dist/commands/go.js +15 -5
  37. package/dist/commands/harness.d.ts +3 -3
  38. package/dist/commands/harness.js +53 -5
  39. package/dist/commands/hooks.js +1 -1
  40. package/dist/commands/import.js +2 -2
  41. package/dist/commands/insights.d.ts +5 -5
  42. package/dist/commands/insights.js +15 -9
  43. package/dist/commands/inspect.d.ts +2 -3
  44. package/dist/commands/inspect.js +4 -16
  45. package/dist/commands/logs.d.ts +2 -2
  46. package/dist/commands/logs.js +9 -9
  47. package/dist/commands/mcp.js +2 -2
  48. package/dist/commands/memory.js +1 -1
  49. package/dist/commands/message.d.ts +1 -1
  50. package/dist/commands/message.js +7 -7
  51. package/dist/commands/mine.d.ts +11 -8
  52. package/dist/commands/mine.js +11 -10
  53. package/dist/commands/models.js +1 -1
  54. package/dist/commands/modes.js +1 -1
  55. package/dist/commands/monitors.js +23 -6
  56. package/dist/commands/output.d.ts +7 -6
  57. package/dist/commands/output.js +11 -10
  58. package/dist/commands/packages.js +4 -4
  59. package/dist/commands/perf.js +1 -1
  60. package/dist/commands/permissions.js +49 -32
  61. package/dist/commands/plugins.d.ts +1 -1
  62. package/dist/commands/plugins.js +3 -3
  63. package/dist/commands/profiles.d.ts +6 -9
  64. package/dist/commands/profiles.js +8 -321
  65. package/dist/commands/projects.d.ts +9 -0
  66. package/dist/commands/projects.js +140 -8
  67. package/dist/commands/prune.js +5 -13
  68. package/dist/commands/refresh-rules.js +1 -1
  69. package/dist/commands/repo.d.ts +5 -7
  70. package/dist/commands/repo.js +34 -18
  71. package/dist/commands/resource-view.js +4 -0
  72. package/dist/commands/resume.d.ts +11 -7
  73. package/dist/commands/resume.js +82 -98
  74. package/dist/commands/route.d.ts +12 -0
  75. package/dist/commands/route.js +261 -0
  76. package/dist/commands/routines.d.ts +2 -3
  77. package/dist/commands/routines.js +120 -145
  78. package/dist/commands/rules.js +1 -1
  79. package/dist/commands/run-account-picker.d.ts +1 -1
  80. package/dist/commands/run-account-picker.js +2 -2
  81. package/dist/commands/run-broadcast.d.ts +21 -0
  82. package/dist/commands/run-broadcast.js +89 -0
  83. package/dist/commands/run-cloud.js +1 -1
  84. package/dist/commands/secrets-vault.d.ts +10 -0
  85. package/dist/commands/{login.js → secrets-vault.js} +34 -14
  86. package/dist/commands/secrets.d.ts +4 -4
  87. package/dist/commands/secrets.js +72 -63
  88. package/dist/commands/sessions-backfill.js +1 -1
  89. package/dist/commands/sessions-browser.d.ts +1 -1
  90. package/dist/commands/sessions-browser.js +9 -5
  91. package/dist/commands/sessions-export.js +2 -2
  92. package/dist/commands/sessions-inject.js +4 -5
  93. package/dist/commands/sessions-migrate.js +16 -27
  94. package/dist/commands/sessions-picker.d.ts +13 -0
  95. package/dist/commands/sessions-picker.js +182 -8
  96. package/dist/commands/sessions-resume.d.ts +7 -3
  97. package/dist/commands/sessions-resume.js +81 -33
  98. package/dist/commands/sessions-stats.js +2 -2
  99. package/dist/commands/sessions.d.ts +75 -68
  100. package/dist/commands/sessions.js +142 -180
  101. package/dist/commands/setup-computer.js +1 -1
  102. package/dist/commands/setup-fleet.js +3 -0
  103. package/dist/commands/setup-mine.d.ts +7 -3
  104. package/dist/commands/setup-mine.js +13 -8
  105. package/dist/commands/setup-secrets.js +2 -2
  106. package/dist/commands/setup-watchdog.js +2 -2
  107. package/dist/commands/setup.js +7 -2
  108. package/dist/commands/share.d.ts +65 -0
  109. package/dist/commands/share.js +253 -20
  110. package/dist/commands/skills.js +3 -3
  111. package/dist/commands/snapshot.d.ts +2 -2
  112. package/dist/commands/snapshot.js +9 -9
  113. package/dist/commands/ssh.d.ts +1 -1
  114. package/dist/commands/ssh.js +318 -48
  115. package/dist/commands/subagents.js +1 -1
  116. package/dist/commands/sync.js +24 -9
  117. package/dist/commands/teams.d.ts +2 -2
  118. package/dist/commands/teams.js +9 -18
  119. package/dist/commands/tmux.js +5 -1
  120. package/dist/commands/trash.js +1 -1
  121. package/dist/commands/usage.d.ts +1 -1
  122. package/dist/commands/usage.js +2 -2
  123. package/dist/commands/utils.d.ts +4 -14
  124. package/dist/commands/utils.js +6 -27
  125. package/dist/commands/versions.js +2 -2
  126. package/dist/commands/view.d.ts +9 -77
  127. package/dist/commands/view.js +23 -8
  128. package/dist/commands/watchdog.js +1 -1
  129. package/dist/commands/webhook.js +11 -25
  130. package/dist/commands/workflows.js +1 -1
  131. package/dist/index.js +1 -1
  132. package/dist/lib/account-capabilities.d.ts +39 -0
  133. package/dist/lib/account-capabilities.js +59 -0
  134. package/dist/lib/account-catalog.js +1 -1
  135. package/dist/lib/account-registry.d.ts +66 -0
  136. package/dist/lib/account-registry.js +151 -5
  137. package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
  138. package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
  139. package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
  140. package/dist/lib/{usage.js → accounting/usage.js} +11 -11
  141. package/dist/lib/agent-spec/provider.js +1 -1
  142. package/dist/lib/agents.d.ts +72 -4
  143. package/dist/lib/agents.js +231 -199
  144. package/dist/lib/answer-router.d.ts +2 -2
  145. package/dist/lib/ask-classifier.d.ts +1 -1
  146. package/dist/lib/ask-classifier.js +1 -1
  147. package/dist/lib/audit/log.js +1 -1
  148. package/dist/lib/auth-health.d.ts +1 -1
  149. package/dist/lib/auth-health.js +2 -2
  150. package/dist/lib/brand.js +1 -1
  151. package/dist/lib/browser/caller-identity.d.ts +28 -0
  152. package/dist/lib/browser/caller-identity.js +156 -0
  153. package/dist/lib/browser/cdp.js +1 -1
  154. package/dist/lib/browser/drivers/ssh.d.ts +1 -1
  155. package/dist/lib/browser/drivers/ssh.js +2 -2
  156. package/dist/lib/browser/hygiene.d.ts +10 -2
  157. package/dist/lib/browser/hygiene.js +7 -4
  158. package/dist/lib/browser/ipc.d.ts +22 -2
  159. package/dist/lib/browser/ipc.js +185 -21
  160. package/dist/lib/browser/profiles.d.ts +67 -3
  161. package/dist/lib/browser/profiles.js +129 -7
  162. package/dist/lib/browser/remote-control.d.ts +2 -2
  163. package/dist/lib/browser/remote-control.js +3 -3
  164. package/dist/lib/browser/runtime-state.d.ts +79 -0
  165. package/dist/lib/browser/runtime-state.js +119 -1
  166. package/dist/lib/browser/service.d.ts +113 -1
  167. package/dist/lib/browser/service.js +454 -40
  168. package/dist/lib/browser/sessions-list.d.ts +2 -1
  169. package/dist/lib/browser/sessions-list.js +4 -13
  170. package/dist/lib/browser/types.d.ts +18 -0
  171. package/dist/lib/budget/config.js +1 -1
  172. package/dist/lib/budget/ledger.js +1 -1
  173. package/dist/lib/byok-usage.js +1 -1
  174. package/dist/lib/capabilities.js +3 -15
  175. package/dist/lib/catchup.d.ts +1 -1
  176. package/dist/lib/catchup.js +1 -1
  177. package/dist/lib/cloud/dispatch.js +1 -1
  178. package/dist/lib/cloud/host.d.ts +3 -3
  179. package/dist/lib/cloud/host.js +5 -5
  180. package/dist/lib/cloud/rush.d.ts +9 -21
  181. package/dist/lib/cloud/rush.js +33 -120
  182. package/dist/lib/cloud/types.d.ts +2 -2
  183. package/dist/lib/commands.js +3 -13
  184. package/dist/lib/computer/actions.d.ts +36 -0
  185. package/dist/lib/computer/actions.js +162 -0
  186. package/dist/lib/computer/dispatch.d.ts +2 -2
  187. package/dist/lib/computer/dispatch.js +2 -2
  188. package/dist/lib/computer/sessions-list.d.ts +3 -3
  189. package/dist/lib/computer/sessions-list.js +2 -2
  190. package/dist/lib/config-keys.d.ts +12 -3
  191. package/dist/lib/config-keys.js +29 -6
  192. package/dist/lib/config-machine-keys.d.ts +4 -2
  193. package/dist/lib/config-machine-keys.js +6 -2
  194. package/dist/lib/crabbox/lease.js +9 -1
  195. package/dist/lib/crabbox/runtimes.d.ts +32 -7
  196. package/dist/lib/crabbox/runtimes.js +72 -30
  197. package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
  198. package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
  199. package/dist/lib/daemon-services.d.ts +1 -1
  200. package/dist/lib/daemon-services.js +5 -0
  201. package/dist/lib/daemon-ticks.d.ts +25 -0
  202. package/dist/lib/daemon-ticks.js +31 -1
  203. package/dist/lib/daemon-webhooks.d.ts +102 -0
  204. package/dist/lib/daemon-webhooks.js +210 -0
  205. package/dist/lib/device-config.d.ts +116 -72
  206. package/dist/lib/device-config.js +366 -132
  207. package/dist/lib/devices/config-migration.d.ts +29 -34
  208. package/dist/lib/devices/config-migration.js +209 -130
  209. package/dist/lib/devices/connect.d.ts +2 -2
  210. package/dist/lib/devices/connect.js +2 -2
  211. package/dist/lib/devices/discovery-policy.d.ts +30 -0
  212. package/dist/lib/devices/discovery-policy.js +101 -0
  213. package/dist/lib/devices/fleet-inventory.js +8 -3
  214. package/dist/lib/devices/harness-inventory.d.ts +1 -1
  215. package/dist/lib/devices/harness-inventory.js +12 -3
  216. package/dist/lib/devices/known-hosts.js +1 -1
  217. package/dist/lib/devices/pool.d.ts +61 -0
  218. package/dist/lib/devices/pool.js +83 -0
  219. package/dist/lib/devices/registry.d.ts +1 -1
  220. package/dist/lib/devices/registry.js +1 -1
  221. package/dist/lib/devices/resolve-profile.d.ts +2 -2
  222. package/dist/lib/devices/resolve-profile.js +2 -2
  223. package/dist/lib/devices/resolve-target.d.ts +1 -1
  224. package/dist/lib/devices/resolve-target.js +4 -4
  225. package/dist/lib/devices/self-host.d.ts +1 -1
  226. package/dist/lib/devices/self-host.js +3 -3
  227. package/dist/lib/devices/ssh-config.d.ts +1 -1
  228. package/dist/lib/devices/stats-cache.js +1 -1
  229. package/dist/lib/devices/sync.d.ts +3 -1
  230. package/dist/lib/devices/sync.js +3 -3
  231. package/dist/lib/doctor-diff.js +4 -4
  232. package/dist/lib/drift-sync.js +2 -2
  233. package/dist/lib/drift.js +2 -2
  234. package/dist/lib/event-families.d.ts +1 -1
  235. package/dist/lib/event-stream.d.ts +1 -1
  236. package/dist/lib/event-stream.js +2 -2
  237. package/dist/lib/events-ingest.js +2 -2
  238. package/dist/lib/exec.d.ts +8 -5
  239. package/dist/lib/exec.js +19 -13
  240. package/dist/lib/factory/snapshot.d.ts +1 -1
  241. package/dist/lib/factory/snapshot.js +1 -1
  242. package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
  243. package/dist/lib/{activity.js → feed/activity.js} +7 -7
  244. package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
  245. package/dist/lib/{events.js → feed/events.js} +5 -5
  246. package/dist/lib/{feed.js → feed/feed.js} +4 -4
  247. package/dist/lib/feed-outcome.d.ts +1 -1
  248. package/dist/lib/feed-policy.d.ts +1 -1
  249. package/dist/lib/feed-policy.js +1 -1
  250. package/dist/lib/feed-post.d.ts +1 -1
  251. package/dist/lib/feed-post.js +1 -1
  252. package/dist/lib/feed-ranking.d.ts +1 -1
  253. package/dist/lib/fleet/apply.d.ts +0 -6
  254. package/dist/lib/fleet/apply.js +18 -45
  255. package/dist/lib/fleet/auth-sync.d.ts +16 -35
  256. package/dist/lib/fleet/auth-sync.js +16 -75
  257. package/dist/lib/fleet/capture.js +8 -6
  258. package/dist/lib/fleet/manifest.js +23 -11
  259. package/dist/lib/fleet/types.d.ts +19 -7
  260. package/dist/lib/fleet-cache.d.ts +1 -1
  261. package/dist/lib/fleet-cache.js +1 -1
  262. package/dist/lib/format.d.ts +19 -0
  263. package/dist/lib/format.js +44 -1
  264. package/dist/lib/friction-heuristics.d.ts +1 -1
  265. package/dist/lib/git.d.ts +24 -1
  266. package/dist/lib/git.js +82 -38
  267. package/dist/lib/heal.js +3 -3
  268. package/dist/lib/hooks.d.ts +18 -0
  269. package/dist/lib/hooks.js +113 -1
  270. package/dist/lib/hosts/credentials.d.ts +30 -10
  271. package/dist/lib/hosts/credentials.js +38 -26
  272. package/dist/lib/hosts/dispatch.d.ts +3 -3
  273. package/dist/lib/hosts/dispatch.js +3 -3
  274. package/dist/lib/hosts/option.d.ts +3 -3
  275. package/dist/lib/hosts/option.js +7 -8
  276. package/dist/lib/hosts/passthrough.d.ts +17 -17
  277. package/dist/lib/hosts/passthrough.js +67 -50
  278. package/dist/lib/hosts/providers/devices.d.ts +1 -1
  279. package/dist/lib/hosts/providers/devices.js +1 -1
  280. package/dist/lib/hosts/reconcile.d.ts +1 -1
  281. package/dist/lib/hosts/reconcile.js +1 -1
  282. package/dist/lib/hosts/reconnect.d.ts +1 -1
  283. package/dist/lib/hosts/reconnect.js +2 -2
  284. package/dist/lib/hosts/registry.d.ts +5 -5
  285. package/dist/lib/hosts/registry.js +5 -5
  286. package/dist/lib/hosts/remote-cmd.d.ts +10 -10
  287. package/dist/lib/hosts/remote-cmd.js +25 -18
  288. package/dist/lib/hosts/remote-os.d.ts +4 -4
  289. package/dist/lib/hosts/remote-os.js +4 -4
  290. package/dist/lib/hosts/remote-session-id.d.ts +2 -2
  291. package/dist/lib/hosts/remote-session-id.js +2 -2
  292. package/dist/lib/hosts/routing-flag.d.ts +3 -3
  293. package/dist/lib/hosts/routing-flag.js +4 -5
  294. package/dist/lib/hosts/run-target.d.ts +4 -4
  295. package/dist/lib/hosts/run-target.js +4 -4
  296. package/dist/lib/hosts/session-index.d.ts +2 -2
  297. package/dist/lib/hosts/session-index.js +1 -1
  298. package/dist/lib/hosts/session-marker.d.ts +1 -1
  299. package/dist/lib/hosts/session-marker.js +1 -1
  300. package/dist/lib/hosts/types.d.ts +2 -2
  301. package/dist/lib/hosts/types.js +2 -2
  302. package/dist/lib/import.js +1 -1
  303. package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +49 -1
  304. package/dist/lib/{migrate.js → installations/migrate.js} +265 -38
  305. package/dist/lib/installations/resolve.js +1 -1
  306. package/dist/lib/installations/strategies.js +1 -1
  307. package/dist/lib/installations/update.js +2 -2
  308. package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
  309. package/dist/lib/{versions.js → installations/versions.js} +51 -31
  310. package/dist/lib/isolation-boundary-report.js +1 -1
  311. package/dist/lib/linear-projects.d.ts +28 -0
  312. package/dist/lib/linear-projects.js +30 -0
  313. package/dist/lib/loop.js +1 -1
  314. package/dist/lib/mailbox-gc.js +1 -1
  315. package/dist/lib/mailbox.js +1 -1
  316. package/dist/lib/mcp-registry.d.ts +62 -0
  317. package/dist/lib/mcp-registry.js +177 -0
  318. package/dist/lib/mcp.d.ts +5 -0
  319. package/dist/lib/mcp.js +124 -307
  320. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  321. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  322. package/dist/lib/menubar/install-menubar.d.ts +7 -0
  323. package/dist/lib/menubar/install-menubar.js +24 -6
  324. package/dist/lib/menubar/snapshot.d.ts +7 -0
  325. package/dist/lib/menubar/snapshot.js +8 -6
  326. package/dist/lib/models.js +1 -1
  327. package/dist/lib/monitors/config.d.ts +12 -0
  328. package/dist/lib/monitors/config.js +3 -0
  329. package/dist/lib/monitors/dispatch.js +26 -5
  330. package/dist/lib/monitors/engine.js +10 -0
  331. package/dist/lib/monitors/sources/webhook.d.ts +1 -1
  332. package/dist/lib/monitors/state.d.ts +42 -0
  333. package/dist/lib/monitors/state.js +30 -0
  334. package/dist/lib/notify.d.ts +1 -1
  335. package/dist/lib/observe-aliases.d.ts +2 -2
  336. package/dist/lib/observe-aliases.js +2 -11
  337. package/dist/lib/output/git-output.js +2 -2
  338. package/dist/lib/overdue.d.ts +1 -1
  339. package/dist/lib/overdue.js +1 -1
  340. package/dist/lib/permissions-registry.d.ts +65 -0
  341. package/dist/lib/permissions-registry.js +599 -0
  342. package/dist/lib/permissions.d.ts +24 -13
  343. package/dist/lib/permissions.js +52 -271
  344. package/dist/lib/picker.d.ts +16 -0
  345. package/dist/lib/picker.js +33 -3
  346. package/dist/lib/placement.d.ts +1 -1
  347. package/dist/lib/placement.js +4 -4
  348. package/dist/lib/platform/paths.d.ts +8 -0
  349. package/dist/lib/platform/paths.js +11 -0
  350. package/dist/lib/platform/posixpath.js +3 -3
  351. package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
  352. package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
  353. package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
  354. package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
  355. package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
  356. package/dist/lib/{skills.js → plugins/skills.js} +7 -7
  357. package/dist/lib/pricing/cost.d.ts +1 -1
  358. package/dist/lib/pricing/cost.js +1 -1
  359. package/dist/lib/profiles-presets.d.ts +1 -1
  360. package/dist/lib/profiles-presets.js +1 -1
  361. package/dist/lib/profiles.js +2 -2
  362. package/dist/lib/project-import.js +4 -1
  363. package/dist/lib/project-launch.d.ts +1 -1
  364. package/dist/lib/project-launch.js +3 -3
  365. package/dist/lib/project-pull.d.ts +128 -0
  366. package/dist/lib/project-pull.js +384 -0
  367. package/dist/lib/project-root.d.ts +2 -2
  368. package/dist/lib/project-root.js +2 -2
  369. package/dist/lib/project-status.js +1 -1
  370. package/dist/lib/projects.d.ts +23 -0
  371. package/dist/lib/projects.js +29 -6
  372. package/dist/lib/refresh.d.ts +12 -1
  373. package/dist/lib/refresh.js +16 -9
  374. package/dist/lib/registry.d.ts +9 -2
  375. package/dist/lib/registry.js +11 -4
  376. package/dist/lib/resources.d.ts +2 -2
  377. package/dist/lib/resources.js +2 -2
  378. package/dist/lib/routers.d.ts +81 -0
  379. package/dist/lib/routers.js +153 -0
  380. package/dist/lib/routine-context.d.ts +1 -0
  381. package/dist/lib/routine-context.js +7 -2
  382. package/dist/lib/routine-notify-owner.d.ts +1 -1
  383. package/dist/lib/routine-notify.d.ts +1 -1
  384. package/dist/lib/routine-notify.js +1 -1
  385. package/dist/lib/routine-process-cleanup.d.ts +1 -1
  386. package/dist/lib/routine-readiness.d.ts +1 -1
  387. package/dist/lib/routine-readiness.js +11 -4
  388. package/dist/lib/routines-placement.d.ts +12 -2
  389. package/dist/lib/routines-placement.js +20 -3
  390. package/dist/lib/routines-project.d.ts +1 -1
  391. package/dist/lib/routines-project.js +1 -1
  392. package/dist/lib/rules/compile.d.ts +1 -0
  393. package/dist/lib/rules/compile.js +10 -2
  394. package/dist/lib/rules/rules.js +1 -1
  395. package/dist/lib/run-notify.js +1 -1
  396. package/dist/lib/runner.d.ts +80 -2
  397. package/dist/lib/runner.js +241 -62
  398. package/dist/lib/sandbox.d.ts +1 -1
  399. package/dist/lib/scheduler.d.ts +1 -1
  400. package/dist/lib/scheduler.js +1 -1
  401. package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
  402. package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
  403. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  404. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  405. package/dist/lib/secrets/agent.js +2 -2
  406. package/dist/lib/secrets/audit.js +1 -1
  407. package/dist/lib/secrets/bundles.d.ts +3 -3
  408. package/dist/lib/secrets/bundles.js +7 -7
  409. package/dist/lib/secrets/index.js +1 -1
  410. package/dist/lib/secrets/list-filter.d.ts +1 -1
  411. package/dist/lib/secrets/list-filter.js +2 -2
  412. package/dist/lib/secrets/push.d.ts +1 -1
  413. package/dist/lib/secrets/push.js +10 -12
  414. package/dist/lib/secrets/remote.d.ts +12 -10
  415. package/dist/lib/secrets/remote.js +21 -14
  416. package/dist/lib/secrets/vault.js +2 -2
  417. package/dist/lib/self-heal/checks/shadowing.js +1 -1
  418. package/dist/lib/self-heal/checks/shims.js +1 -1
  419. package/dist/lib/self-update.d.ts +39 -4
  420. package/dist/lib/self-update.js +78 -25
  421. package/dist/lib/serve/control.d.ts +1 -1
  422. package/dist/lib/serve/control.js +4 -4
  423. package/dist/lib/serve/data.d.ts +1 -1
  424. package/dist/lib/serve/data.js +1 -1
  425. package/dist/lib/serve/stream.js +1 -1
  426. package/dist/lib/service-manifest.d.ts +29 -0
  427. package/dist/lib/service-manifest.js +80 -0
  428. package/dist/lib/session/active.d.ts +59 -7
  429. package/dist/lib/session/active.js +158 -17
  430. package/dist/lib/session/bash-command.js +1 -1
  431. package/dist/lib/session/claude-accounts.d.ts +1 -1
  432. package/dist/lib/session/claude-accounts.js +1 -1
  433. package/dist/lib/session/db.d.ts +10 -2
  434. package/dist/lib/session/db.js +25 -6
  435. package/dist/lib/session/discover.d.ts +77 -0
  436. package/dist/lib/session/discover.js +130 -25
  437. package/dist/lib/session/fork.js +1 -1
  438. package/dist/lib/session/inject.d.ts +1 -1
  439. package/dist/lib/session/insights.d.ts +1 -1
  440. package/dist/lib/session/insights.js +1 -1
  441. package/dist/lib/session/live-metadata.d.ts +15 -0
  442. package/dist/lib/session/live-metadata.js +76 -0
  443. package/dist/lib/session/migrate-targets.d.ts +1 -1
  444. package/dist/lib/session/recovery.d.ts +1 -1
  445. package/dist/lib/session/recovery.js +2 -2
  446. package/dist/lib/session/remote-active.d.ts +10 -1
  447. package/dist/lib/session/remote-active.js +8 -3
  448. package/dist/lib/session/remote-bundle.d.ts +1 -1
  449. package/dist/lib/session/remote-bundle.js +2 -2
  450. package/dist/lib/session/remote-list.d.ts +15 -4
  451. package/dist/lib/session/remote-list.js +40 -3
  452. package/dist/lib/session/remote.d.ts +5 -5
  453. package/dist/lib/session/remote.js +13 -17
  454. package/dist/lib/session/resume-command.d.ts +3 -2
  455. package/dist/lib/session/resume-command.js +4 -3
  456. package/dist/lib/session/resume-owner.d.ts +3 -3
  457. package/dist/lib/session/resume-owner.js +3 -3
  458. package/dist/lib/session/session-cache.d.ts +12 -0
  459. package/dist/lib/session/session-cache.js +2 -0
  460. package/dist/lib/session/shell-programs.js +1 -1
  461. package/dist/lib/session/state.js +5 -5
  462. package/dist/lib/session/team-filter.d.ts +1 -1
  463. package/dist/lib/session/team-filter.js +1 -1
  464. package/dist/lib/session/types.d.ts +3 -3
  465. package/dist/lib/session/width.d.ts +2 -2
  466. package/dist/lib/session/width.js +2 -2
  467. package/dist/lib/share/delete.d.ts +21 -0
  468. package/dist/lib/share/delete.js +42 -0
  469. package/dist/lib/share/publish.d.ts +82 -0
  470. package/dist/lib/share/publish.js +170 -18
  471. package/dist/lib/share/worker-template.js +172 -9
  472. package/dist/lib/shims.js +35 -7
  473. package/dist/lib/smart-launch.d.ts +36 -6
  474. package/dist/lib/smart-launch.js +65 -8
  475. package/dist/lib/snapshot.d.ts +4 -4
  476. package/dist/lib/snapshot.js +2 -2
  477. package/dist/lib/ssh-exec.d.ts +1 -1
  478. package/dist/lib/ssh-exec.js +2 -2
  479. package/dist/lib/ssh-tunnel.d.ts +10 -10
  480. package/dist/lib/ssh-tunnel.js +12 -12
  481. package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
  482. package/dist/lib/staleness/checkers/hooks.js +1 -1
  483. package/dist/lib/staleness/detectors/permissions.js +0 -23
  484. package/dist/lib/staleness/detectors/plugins.js +1 -1
  485. package/dist/lib/staleness/fingerprint.js +1 -1
  486. package/dist/lib/staleness/layers.d.ts +1 -1
  487. package/dist/lib/staleness/layers.js +1 -1
  488. package/dist/lib/staleness/writers/mcp.js +3 -1
  489. package/dist/lib/staleness/writers/plugins.js +1 -1
  490. package/dist/lib/staleness/writers/types.d.ts +8 -0
  491. package/dist/lib/startup/command-registry.d.ts +5 -147
  492. package/dist/lib/startup/command-registry.js +38 -303
  493. package/dist/lib/startup/dev-build.d.ts +0 -21
  494. package/dist/lib/startup/dev-build.js +29 -8
  495. package/dist/lib/state.d.ts +19 -1
  496. package/dist/lib/state.js +120 -51
  497. package/dist/lib/subagents.js +1 -1
  498. package/dist/lib/sync-status.js +1 -1
  499. package/dist/lib/sync-umbrella.d.ts +6 -1
  500. package/dist/lib/sync-umbrella.js +9 -4
  501. package/dist/lib/teams/agents.js +2 -2
  502. package/dist/lib/teams/registry.js +1 -1
  503. package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
  504. package/dist/lib/terminal/engine.js +1 -1
  505. package/dist/lib/terminal/index.d.ts +4 -0
  506. package/dist/lib/terminal/index.js +3 -0
  507. package/dist/lib/terminal/inject.d.ts +2 -2
  508. package/dist/lib/terminal/inject.js +2 -2
  509. package/dist/lib/terminal/transport.js +1 -1
  510. package/dist/lib/tmux/index.d.ts +1 -1
  511. package/dist/lib/tmux/index.js +1 -1
  512. package/dist/lib/tmux/session.d.ts +21 -5
  513. package/dist/lib/tmux/session.js +76 -22
  514. package/dist/lib/triggers/handlers.d.ts +1 -1
  515. package/dist/lib/triggers/handlers.js +2 -2
  516. package/dist/lib/triggers/webhook.d.ts +36 -2
  517. package/dist/lib/triggers/webhook.js +97 -42
  518. package/dist/lib/types.d.ts +18 -6
  519. package/dist/lib/usage-fleet.d.ts +1 -1
  520. package/dist/lib/usage-fleet.js +1 -1
  521. package/dist/lib/usage-refresh.d.ts +1 -1
  522. package/dist/lib/usage-refresh.js +3 -3
  523. package/dist/lib/version-duplicates.js +2 -2
  524. package/dist/lib/view-types.d.ts +56 -0
  525. package/dist/lib/view-types.js +1 -0
  526. package/dist/lib/watchdog/rotate.d.ts +2 -2
  527. package/dist/lib/watchdog/rotate.js +3 -3
  528. package/dist/lib/watchdog/runner.d.ts +2 -3
  529. package/dist/lib/watchdog/runner.js +3 -4
  530. package/dist/lib/workflows.js +1 -1
  531. package/package.json +2 -1
  532. package/scripts/postinstall.js +2 -2
  533. package/dist/commands/bench.d.ts +0 -2
  534. package/dist/commands/bench.js +0 -101
  535. package/dist/commands/cp.d.ts +0 -84
  536. package/dist/commands/cp.js +0 -231
  537. package/dist/commands/login.d.ts +0 -2
  538. package/dist/lib/resources/commands.d.ts +0 -46
  539. package/dist/lib/resources/commands.js +0 -211
  540. package/dist/lib/resources/hooks.d.ts +0 -16
  541. package/dist/lib/resources/hooks.js +0 -153
  542. package/dist/lib/resources/mcp.d.ts +0 -34
  543. package/dist/lib/resources/mcp.js +0 -250
  544. package/dist/lib/resources/memory.d.ts +0 -15
  545. package/dist/lib/resources/memory.js +0 -46
  546. package/dist/lib/resources/permissions.d.ts +0 -13
  547. package/dist/lib/resources/permissions.js +0 -202
  548. package/dist/lib/resources/rules.d.ts +0 -46
  549. package/dist/lib/resources/rules.js +0 -179
  550. package/dist/lib/resources/skills.d.ts +0 -37
  551. package/dist/lib/resources/skills.js +0 -247
  552. package/dist/lib/resources/subagents.d.ts +0 -46
  553. package/dist/lib/resources/subagents.js +0 -202
  554. /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
@@ -8,10 +8,11 @@
8
8
  * FleetInventory} that both the local baseline and every remote box serialize
9
9
  * into their doctor payload; the comparator then diffs those payloads.
10
10
  */
11
- import { getAvailableResources, getVersionHomePath, isVersionIsolated, listInstalledVersions } from '../versions.js';
11
+ import { getAvailableResources, getVersionHomePath, isVersionIsolated, listInstalledVersions } from '../installations/versions.js';
12
12
  import { supports } from '../capabilities.js';
13
13
  import { checkVersionHookWiring } from '../hooks.js';
14
- import { getUserAgentsDir, getSystemAgentsDir } from '../state.js';
14
+ import { getUserAgentsDir, getSystemAgentsDir, readMeta } from '../state.js';
15
+ import { listNativeAccounts } from '../account-registry.js';
15
16
  import { readRepoState } from '../git.js';
16
17
  import { ALL_AGENT_IDS, accountDisplayLabel, credentialPresence, getAccountInfo, supportsAccountInspection, } from '../agents.js';
17
18
  import { FLEET_RESOURCE_KINDS, } from './fleet-divergence.js';
@@ -43,7 +44,11 @@ export async function collectLocalFleetSignIn() {
43
44
  try {
44
45
  const info = await getAccountInfo(agent, home);
45
46
  signedIn = info.signedIn;
46
- account = accountDisplayLabel(info) || null;
47
+ // Prefix the durable account name when this identity has been named.
48
+ const display = accountDisplayLabel(info);
49
+ const identityKey = info.accountKey ?? info.email?.toLowerCase();
50
+ const saved = identityKey ? listNativeAccounts(readMeta()).find(item => item.agent === agent && item.identityKey === identityKey) : undefined;
51
+ account = (saved ? `${saved.name} · ${display || saved.identityLabel || identityKey}` : display) || null;
47
52
  }
48
53
  catch {
49
54
  /* advisory only — treat as logged out, provability decided below */
@@ -1,6 +1,6 @@
1
1
  import { type AccountInfo } from '../agents.js';
2
2
  import type { AgentId } from '../types.js';
3
- import { type UsageSnapshot } from '../usage.js';
3
+ import { type UsageSnapshot } from '../accounting/usage.js';
4
4
  /** An account's usage headroom rolled into one glanceable summary. */
5
5
  export interface QuotaSummary {
6
6
  /**
@@ -15,8 +15,10 @@
15
15
  */
16
16
  import chalk from 'chalk';
17
17
  import { ALL_AGENT_IDS, accountDisplayLabel, getAccountInfo, } from '../agents.js';
18
- import { deriveUsageStatusFromSnapshot, getUsageInfoByIdentity, getUsageLookupKey, } from '../usage.js';
19
- import { getVersionHomePath, listInstalledVersions } from '../versions.js';
18
+ import { deriveUsageStatusFromSnapshot, getUsageInfoByIdentity, getUsageLookupKey, } from '../accounting/usage.js';
19
+ import { getVersionHomePath, listInstalledVersions } from '../installations/versions.js';
20
+ import { readMeta } from '../state.js';
21
+ import { listNativeAccounts } from '../account-registry.js';
20
22
  /**
21
23
  * Roll one usage snapshot into a {@link QuotaSummary}. Mirrors the blocking-window
22
24
  * selection of {@link deriveUsageStatusFromSnapshot} (the model-specific
@@ -99,6 +101,7 @@ export async function collectLocalHarnessInventory(opts) {
99
101
  const usageByKey = usageInputs.length
100
102
  ? (await getUsageInfoByIdentity(usageInputs, opts?.refresh ? { forceRefresh: true } : undefined)).usageByKey
101
103
  : new Map();
104
+ const savedNative = listNativeAccounts(readMeta());
102
105
  return pending.map(({ agent, version, info }) => {
103
106
  const key = getUsageLookupKey(info);
104
107
  const usage = key ? usageByKey.get(key) : undefined;
@@ -106,7 +109,10 @@ export async function collectLocalHarnessInventory(opts) {
106
109
  const quota = summarizeQuota(snapshot, usage?.error ?? null, info?.usageStatus ?? null);
107
110
  const signedIn = !!info?.signedIn;
108
111
  const { ready, reason } = computeReady(signedIn, quota);
109
- const account = info ? accountDisplayLabel(info) || null : null;
112
+ const display = info ? accountDisplayLabel(info) || null : null;
113
+ const identityKey = info?.accountKey ?? info?.email?.toLowerCase();
114
+ const saved = identityKey ? savedNative.find(item => item.agent === agent && item.identityKey === identityKey) : undefined;
115
+ const account = saved ? `${saved.name} · ${display || saved.identityLabel || identityKey}` : display;
110
116
  return { agent, version, account, signedIn, quota, ready, reason };
111
117
  });
112
118
  }
@@ -121,6 +127,9 @@ export function groupByAccount(rows) {
121
127
  const order = [];
122
128
  const groups = new Map();
123
129
  for (const row of rows) {
130
+ // Signed-out rows share one bucket under a sentinel key. Use the NUL-prefixed
131
+ // literal (a TS `\0` escape, NOT a raw NUL byte in the source) so the key can
132
+ // never collide with a real account label named literally "signed-out".
124
133
  const key = row.account ?? '\0signed-out';
125
134
  if (!groups.has(key)) {
126
135
  groups.set(key, []);
@@ -12,7 +12,7 @@
12
12
  *
13
13
  * The learn-then-pin flow: the first `agents ssh`/fleet connection to a host is
14
14
  * still `accept-new`, but it writes the learned key into THIS store, which pins
15
- * it for every subsequent connect. Credential copies (`run --host --copy-creds`)
15
+ * it for every subsequent connect. Credential copies (`run --device --copy-creds`)
16
16
  * refuse to run against a host that isn't pinned here — see
17
17
  * `commands/exec.ts` — so tokens never ride an unverified first connect.
18
18
  */
@@ -0,0 +1,61 @@
1
+ /**
2
+ * The automatic-placement pool — which devices `--device auto` may pick from.
3
+ *
4
+ * One rule, in one place, so every automatic-placement path agrees: `agents run
5
+ * --device auto`, `agents teams add --device auto`, the generic host resolver,
6
+ * and the AGI EXT launch commands (which emit `--device auto` rather than
7
+ * scoring devices themselves) all draw from {@link filterAutoPool}.
8
+ *
9
+ * The pool is an ALLOWLIST the moment the operator marks a worker. Roles are
10
+ * stored in that device's tracked per-device doc
11
+ * (`devices/<name>/agents.yaml` `config.role`, see `lib/device-config.ts`)
12
+ * and sync with `agents repo push/pull`.
13
+ *
14
+ * | Fleet state | `--device auto` picks from |
15
+ * |---|---|
16
+ * | no device marked | every online device (unchanged behavior) |
17
+ * | some marked `worker` | ONLY those workers |
18
+ * | marked `personal` | never, under either state |
19
+ *
20
+ * `auto.pool all` turns the allowlist off; `personal` stays excluded, because a
21
+ * machine the user sits at is marked precisely so agents stay off it.
22
+ *
23
+ * Paired cockpits (an iPhone/iPad, `role: control` in the device registry, set
24
+ * by `agents devices pair-ios`) are excluded by the CALLER that reads the
25
+ * registry — `listOnlineDeviceNames` in `lib/smart-launch.ts` — not here. That
26
+ * role is machine-local by nature and already has a home; duplicating it in the
27
+ * shared config would be a second store for one concept.
28
+ */
29
+ import { type AutoPoolMode, type ConfiguredDeviceRole } from '../device-config.js';
30
+ export interface AutoPoolOptions {
31
+ /** Pool mode; defaults to the configured `auto.pool`. */
32
+ mode?: AutoPoolMode;
33
+ /** Configured roles by device name; defaults to the fleet-shared block. */
34
+ roles?: Record<string, ConfiguredDeviceRole>;
35
+ /**
36
+ * Device names to resolve roles for when `roles` is not given directly —
37
+ * so a fleet-wide role default reaches a device with no per-device doc of
38
+ * its own. Ignored once `roles` is supplied. See
39
+ * {@link listConfiguredDeviceRoles}.
40
+ */
41
+ roster?: string[];
42
+ }
43
+ /**
44
+ * Narrow a candidate host list to the devices automatic placement may pick.
45
+ *
46
+ * Returns the input order, minus the excluded devices. An empty result is a
47
+ * real answer — "you marked workers and none of them is a candidate right now"
48
+ * — and callers surface it as their own no-healthy-device error rather than
49
+ * quietly widening back to the full fleet.
50
+ */
51
+ export declare function filterAutoPool(pool: string[], opts?: AutoPoolOptions): string[];
52
+ /** True when this host is one automatic placement may pick. */
53
+ export declare function isAutoPoolMember(host: string, opts?: AutoPoolOptions): boolean;
54
+ /** Device names explicitly marked `worker`, in registry order. */
55
+ export declare function listWorkerDevices(opts?: Pick<AutoPoolOptions, 'roles'>): string[];
56
+ /**
57
+ * One line naming why the pool is what it is, for the `--device auto` banner and
58
+ * the no-healthy-device error. Empty string when no role narrows anything, so
59
+ * callers can append it unconditionally.
60
+ */
61
+ export declare function describeAutoPool(opts?: AutoPoolOptions): string;
@@ -0,0 +1,83 @@
1
+ /**
2
+ * The automatic-placement pool — which devices `--device auto` may pick from.
3
+ *
4
+ * One rule, in one place, so every automatic-placement path agrees: `agents run
5
+ * --device auto`, `agents teams add --device auto`, the generic host resolver,
6
+ * and the AGI EXT launch commands (which emit `--device auto` rather than
7
+ * scoring devices themselves) all draw from {@link filterAutoPool}.
8
+ *
9
+ * The pool is an ALLOWLIST the moment the operator marks a worker. Roles are
10
+ * stored in that device's tracked per-device doc
11
+ * (`devices/<name>/agents.yaml` `config.role`, see `lib/device-config.ts`)
12
+ * and sync with `agents repo push/pull`.
13
+ *
14
+ * | Fleet state | `--device auto` picks from |
15
+ * |---|---|
16
+ * | no device marked | every online device (unchanged behavior) |
17
+ * | some marked `worker` | ONLY those workers |
18
+ * | marked `personal` | never, under either state |
19
+ *
20
+ * `auto.pool all` turns the allowlist off; `personal` stays excluded, because a
21
+ * machine the user sits at is marked precisely so agents stay off it.
22
+ *
23
+ * Paired cockpits (an iPhone/iPad, `role: control` in the device registry, set
24
+ * by `agents devices pair-ios`) are excluded by the CALLER that reads the
25
+ * registry — `listOnlineDeviceNames` in `lib/smart-launch.ts` — not here. That
26
+ * role is machine-local by nature and already has a home; duplicating it in the
27
+ * shared config would be a second store for one concept.
28
+ */
29
+ import { autoPoolMode, listConfiguredDeviceRoles } from '../device-config.js';
30
+ import { normalizeHost } from '../machine-id.js';
31
+ /** Roles that automatic placement never picks, whatever the pool mode. */
32
+ const NEVER_AUTO = new Set(['personal']);
33
+ /**
34
+ * Narrow a candidate host list to the devices automatic placement may pick.
35
+ *
36
+ * Returns the input order, minus the excluded devices. An empty result is a
37
+ * real answer — "you marked workers and none of them is a candidate right now"
38
+ * — and callers surface it as their own no-healthy-device error rather than
39
+ * quietly widening back to the full fleet.
40
+ */
41
+ export function filterAutoPool(pool, opts = {}) {
42
+ const roles = opts.roles ?? listConfiguredDeviceRoles(opts.roster ?? pool);
43
+ const byHost = new Map(Object.entries(roles).map(([name, role]) => [normalizeHost(name), role]));
44
+ const roleOf = (host) => byHost.get(normalizeHost(host));
45
+ const eligible = pool.filter((host) => {
46
+ const role = roleOf(host);
47
+ return role === undefined || !NEVER_AUTO.has(role);
48
+ });
49
+ const mode = opts.mode ?? autoPoolMode();
50
+ if (mode === 'all')
51
+ return eligible;
52
+ const anyWorkerMarked = [...byHost.values()].some((role) => role === 'worker');
53
+ if (!anyWorkerMarked)
54
+ return eligible;
55
+ return eligible.filter((host) => roleOf(host) === 'worker');
56
+ }
57
+ /** True when this host is one automatic placement may pick. */
58
+ export function isAutoPoolMember(host, opts = {}) {
59
+ return filterAutoPool([host], opts).length > 0;
60
+ }
61
+ /** Device names explicitly marked `worker`, in registry order. */
62
+ export function listWorkerDevices(opts = {}) {
63
+ const roles = opts.roles ?? listConfiguredDeviceRoles();
64
+ return Object.entries(roles)
65
+ .filter(([, role]) => role === 'worker')
66
+ .map(([name]) => name);
67
+ }
68
+ /**
69
+ * One line naming why the pool is what it is, for the `--device auto` banner and
70
+ * the no-healthy-device error. Empty string when no role narrows anything, so
71
+ * callers can append it unconditionally.
72
+ */
73
+ export function describeAutoPool(opts = {}) {
74
+ const roles = opts.roles ?? listConfiguredDeviceRoles(opts.roster);
75
+ const mode = opts.mode ?? autoPoolMode();
76
+ const workers = listWorkerDevices({ roles });
77
+ if (mode === 'all') {
78
+ return workers.length > 0 ? 'auto.pool=all (worker marks ignored)' : '';
79
+ }
80
+ if (workers.length === 0)
81
+ return '';
82
+ return `workers: ${workers.join(', ')}`;
83
+ }
@@ -112,7 +112,7 @@ export declare function shellForPlatform(platform: DevicePlatform): DeviceShell;
112
112
  export declare function loadDevices(): Promise<DeviceRegistry>;
113
113
  /**
114
114
  * Synchronous {@link loadDevices} for callers already on a sync path (e.g. the
115
- * `agents sessions --host` fan-out builds its ssh command strings synchronously
115
+ * `agents sessions --device` fan-out builds its ssh command strings synchronously
116
116
  * and only needs the target's platform to pick POSIX vs PowerShell). Same
117
117
  * missing-file/corruption contract as {@link loadDevices}.
118
118
  */
@@ -164,7 +164,7 @@ export async function loadDevices() {
164
164
  }
165
165
  /**
166
166
  * Synchronous {@link loadDevices} for callers already on a sync path (e.g. the
167
- * `agents sessions --host` fan-out builds its ssh command strings synchronously
167
+ * `agents sessions --device` fan-out builds its ssh command strings synchronously
168
168
  * and only needs the target's platform to pick POSIX vs PowerShell). Same
169
169
  * missing-file/corruption contract as {@link loadDevices}.
170
170
  */
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The effective device profile: the registry's discovery record overlaid with
3
- * the operator's central config (`fleet.devices.<name>.config` in
4
- * `~/.agents/agents.yaml`).
3
+ * the operator's config (the per-device doc `devices/<name>/agents.yaml`
4
+ * `config:` block over central `fleet.defaults.config`).
5
5
  *
6
6
  * The registry (`~/.agents/.history/devices/registry.json`) stays the
7
7
  * discovery cache — address, Tailscale snapshot, reachability, createdAt. The
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The effective device profile: the registry's discovery record overlaid with
3
- * the operator's central config (`fleet.devices.<name>.config` in
4
- * `~/.agents/agents.yaml`).
3
+ * the operator's config (the per-device doc `devices/<name>/agents.yaml`
4
+ * `config:` block over central `fleet.defaults.config`).
5
5
  *
6
6
  * The registry (`~/.agents/.history/devices/registry.json`) stays the
7
7
  * discovery cache — address, Tailscale snapshot, reachability, createdAt. The
@@ -27,7 +27,7 @@ export interface ResolvedExplicitTargetSet {
27
27
  */
28
28
  export declare function resolveDeviceTarget(token: string, opts?: Pick<MatchHostOptions, 'resolveAuto'>): Promise<DeviceProfile | undefined>;
29
29
  /**
30
- * Resolve an explicit `--host`/`--device` list to dialable targets. A token that
30
+ * Resolve an explicit `--device`/`--device` list to dialable targets. A token that
31
31
  * fails the injection guard or names nothing reachable is skipped with a stderr
32
32
  * note (never fatal — one bad token must not blank the fan-out). Shared by every
33
33
  * cross-machine fan-out so they can never diverge onto two routes.
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * Fan-out + `agents ssh` adapters over the single host/device resolver.
3
3
  *
4
- * Every `--host` / `--device` token becomes a concrete target through one core,
4
+ * Every `--device` / `--device` token becomes a concrete target through one core,
5
5
  * {@link matchHost} in ../hosts/registry.ts — the merged directory that reads the
6
6
  * devices registry, the agents.yaml overlay, AND ssh_config (RUSH-1967). This
7
7
  * module is only the two thin adapters the fan-out and interactive-ssh paths
8
8
  * need on top of that core:
9
9
  * - {@link resolveExplicitTargets} — a token list → dialable `{target, machine,
10
- * name, os}` rows, so `sessions --host` / session bundles / remote agents-json
11
- * dial the exact same address (and machine id) `run --host` does.
10
+ * name, os}` rows, so `sessions --device` / session bundles / remote agents-json
11
+ * dial the exact same address (and machine id) `run --device` does.
12
12
  * - {@link resolveDeviceTarget} — a token → the full {@link DeviceProfile}
13
13
  * `agents ssh` needs (auth, shell, tailscale metadata), with the same
14
14
  * grammar; a bare unregistered alias returns undefined ("Unknown device").
@@ -98,7 +98,7 @@ export async function resolveDeviceTarget(token, opts = {}) {
98
98
  return undefined;
99
99
  }
100
100
  /**
101
- * Resolve an explicit `--host`/`--device` list to dialable targets. A token that
101
+ * Resolve an explicit `--device`/`--device` list to dialable targets. A token that
102
102
  * fails the injection guard or names nothing reachable is skipped with a stderr
103
103
  * note (never fatal — one bad token must not blank the fan-out). Shared by every
104
104
  * cross-machine fan-out so they can never diverge onto two routes.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * True when `name` refers to the local machine. Case-insensitive and
3
- * trailing-dot-tolerant. Use this everywhere a `--host`/fleet target is compared
3
+ * trailing-dot-tolerant. Use this everywhere a `--device`/fleet target is compared
4
4
  * against "self" so a tailscale-name reference short-circuits to a local run
5
5
  * instead of self-SSHing.
6
6
  */
@@ -2,11 +2,11 @@
2
2
  * "Is this hostname the local machine?" — matched against every identity the box
3
3
  * answers to, not just its short id.
4
4
  *
5
- * The self-checks that gate `--host` dispatch and the fleet-health fan-out used to
5
+ * The self-checks that gate `--device` dispatch and the fleet-health fan-out used to
6
6
  * compare only against {@link machineId} (the lowercased short hostname, e.g.
7
7
  * `zion`). A caller that referenced the box by its **tailscale MagicDNS name**
8
8
  * (`zion.tail1a85a1.ts.net`) — which is exactly what `fleetDialTarget` and the
9
- * Factory floor's `--host` probes use — slipped past the check and SSH'd to the
9
+ * Factory floor's `--device` probes use — slipped past the check and SSH'd to the
10
10
  * LOCAL box over its own tailscale name. On a loaded machine that self-SSH'd
11
11
  * `doctor --json` orphaned on timeout and piled up until the host was crushed
12
12
  * (RUSH-2114). Matching the full identity set closes that gap at the source.
@@ -45,7 +45,7 @@ function selfAliases() {
45
45
  }
46
46
  /**
47
47
  * True when `name` refers to the local machine. Case-insensitive and
48
- * trailing-dot-tolerant. Use this everywhere a `--host`/fleet target is compared
48
+ * trailing-dot-tolerant. Use this everywhere a `--device`/fleet target is compared
49
49
  * against "self" so a tailscale-name reference short-circuits to a local run
50
50
  * instead of self-SSHing.
51
51
  */
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Writing a managed include (e.g. `~/.ssh/config.d/agents`) makes every tool
5
5
  * that speaks ssh — plain `ssh`/`scp`/`rsync`/`git`, and `agents sessions
6
- * --host` — resolve the registry's logical device names transparently, without
6
+ * --device` — resolve the registry's logical device names transparently, without
7
7
  * each of them learning about the registry. `agents ssh` stays the value-add
8
8
  * layer (preflight, password-from-bundle auth, platform-aware exec) on top.
9
9
  *
@@ -15,7 +15,7 @@
15
15
  * - **`--refresh` / `--live`:** skip the cache and live-probe every device,
16
16
  * rewriting the cache.
17
17
  *
18
- * The daemon warms this cache (~every 3 min, see `lib/daemon.ts
18
+ * The daemon warms this cache (~every 3 min, see `lib/daemon/daemon.ts
19
19
  * runFleetCacheWarm`), so in steady state a default read has zero
20
20
  * remote ssh round-trips and returns immediately with data that is at most a
21
21
  * few minutes old — surfaced to the user as an "as of …" freshness note.
@@ -6,7 +6,7 @@ import type { PendingDevice } from './pending.js';
6
6
  * node's OS and address but NOT the account you ssh in as, so we materialize the
7
7
  * local operator's username — tailnet devices are overwhelmingly one person's
8
8
  * boxes, and this is exactly the account ssh would already fall back to. Pinning
9
- * it in the registry makes `--host <device>` dial that account no matter which
9
+ * it in the registry makes `--device <device>` dial that account no matter which
10
10
  * machine launches the fan-out (a peer whose local user differs otherwise dials
11
11
  * the wrong account). Returns undefined when the username isn't a safe ssh
12
12
  * identifier, so a weird value never lands in the registry. */
@@ -40,6 +40,8 @@ export interface DeviceSyncResult {
40
40
  ok: boolean;
41
41
  /** Number of tailscale nodes upserted into the registry. */
42
42
  synced: number;
43
+ /** Names upserted, for explicit onboarding surfaces to persist approval. */
44
+ syncedNames: string[];
43
45
  /** Nodes discovered but neither registered-before nor ignored (name+platform). */
44
46
  pending: PendingDevice[];
45
47
  /** Populated when ok is false: why discovery was skipped. */
@@ -22,7 +22,7 @@ import { nodeToDeviceInput, parseTailscaleStatus, tailscaleStatusJson, } from '.
22
22
  * node's OS and address but NOT the account you ssh in as, so we materialize the
23
23
  * local operator's username — tailnet devices are overwhelmingly one person's
24
24
  * boxes, and this is exactly the account ssh would already fall back to. Pinning
25
- * it in the registry makes `--host <device>` dial that account no matter which
25
+ * it in the registry makes `--device <device>` dial that account no matter which
26
26
  * machine launches the fan-out (a peer whose local user differs otherwise dials
27
27
  * the wrong account). Returns undefined when the username isn't a safe ssh
28
28
  * identifier, so a weird value never lands in the registry. */
@@ -138,11 +138,11 @@ export async function runDeviceSync(opts = {}) {
138
138
  const input = withDefaultUser(nodeToDeviceInput(node), registeredBefore[node.name]?.user, localUser);
139
139
  await upsertDevice(node.name, input);
140
140
  }
141
- return { ok: true, synced: toUpsert.length, pending };
141
+ return { ok: true, synced: toUpsert.length, syncedNames: toUpsert.map((node) => node.name), pending };
142
142
  }
143
143
  catch (err) {
144
144
  if (opts.soft) {
145
- return { ok: false, synced: 0, pending: [], reason: err?.message ?? String(err) };
145
+ return { ok: false, synced: 0, syncedNames: [], pending: [], reason: err?.message ?? String(err) };
146
146
  }
147
147
  throw err;
148
148
  }
@@ -24,15 +24,15 @@ import * as path from 'path';
24
24
  import { AGENTS, agentConfigDirName } from './agents.js';
25
25
  import { getProjectAgentsDir, getUserAgentsDir, getSystemAgentsDir, getEnabledExtraRepos, getResolvedRulesDir, getUserRulesDir, getEffectivePromptcutsPath, getActiveRulesPreset, } from './state.js';
26
26
  import { composeRulesFromState } from './rules/compose.js';
27
- import { getAvailableResources, getActuallySyncedResources, getVersionHomePath, compareVersions, } from './versions.js';
28
- import { discoverPlugins, marketplaceSpecForName } from './plugins.js';
29
- import { pluginInstallDir, repairableManifestFields } from './plugin-marketplace.js';
27
+ import { getAvailableResources, getActuallySyncedResources, getVersionHomePath, compareVersions, } from './installations/versions.js';
28
+ import { discoverPlugins, marketplaceSpecForName } from './plugins/plugins.js';
29
+ import { pluginInstallDir, repairableManifestFields } from './plugins/plugin-marketplace.js';
30
30
  import { markdownToToml } from './convert.js';
31
31
  import { listCommandsInVersionHome, getVersionCommandsDir, listPluginCommandNames } from './commands.js';
32
32
  import { shouldInstallCommandAsSkill, commandSkillMatches, commandSkillName } from './command-skills.js';
33
33
  import { gooseCommandMatches, gooseCommandsDir } from './goose-commands.js';
34
34
  import { supports } from './capabilities.js';
35
- import { listSkillsInVersionHome, getVersionSkillsDir } from './skills.js';
35
+ import { listSkillsInVersionHome, getVersionSkillsDir } from './plugins/skills.js';
36
36
  import { listHookEntriesFromDir } from './hooks.js';
37
37
  import { getResourceInventory } from './resource-inventory.js';
38
38
  const RULES_DOC_FILENAME = 'README.md';
@@ -20,8 +20,8 @@ import { select, confirm } from '@inquirer/prompts';
20
20
  import { AGENTS } from './agents.js';
21
21
  import { pullRepo } from './git.js';
22
22
  import { heal } from './heal.js';
23
- import { promptAgentVersionSelection } from './versions.js';
24
- import { isInteractiveTerminal, isPromptCancelled } from '../commands/utils.js';
23
+ import { promptAgentVersionSelection } from './installations/versions.js';
24
+ import { isInteractiveTerminal, isPromptCancelled } from './format.js';
25
25
  import { computeSyncStatus, } from './sync-status.js';
26
26
  const agentName = (id) => AGENTS[id]?.name ?? id;
27
27
  /** "claude@2.1.170 2 drifted · 1 missing" for one version. */
package/dist/lib/drift.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { ALL_AGENT_IDS } from './agents.js';
2
- import { getGlobalDefault, listInstalledVersions } from './versions.js';
2
+ import { getGlobalDefault, listInstalledVersions } from './installations/versions.js';
3
3
  import { loadManifest, isStale } from './staleness/index.js';
4
4
  import { diffVersionResources } from './doctor-diff.js';
5
5
  import { diffVersionCommands, iterCommandsCapableVersions } from './commands.js';
6
- import { diffVersionSkills, iterSkillsCapableVersions } from './skills.js';
6
+ import { diffVersionSkills, iterSkillsCapableVersions } from './plugins/skills.js';
7
7
  import { iterHooksCapableVersions, listUnmanagedHooksInVersionHome, checkVersionHookWiring } from './hooks.js';
8
8
  import { commitsBehindUpstream } from './git.js';
9
9
  import { getUserAgentsDir, getSystemAgentsDir, getEnabledExtraRepos } from './state.js';
@@ -3,7 +3,7 @@
3
3
  * event reader. One vocabulary maps onto existing filters (includeActivity,
4
4
  * eventTypes, level) so the engine stays single-path.
5
5
  */
6
- import type { EventType } from './events.js';
6
+ import type { EventType } from './feed/events.js';
7
7
  import type { UnifiedQuery } from './event-stream.js';
8
8
  export declare const EVENT_FAMILIES: readonly ["ops", "activity", "commands", "runs", "security"];
9
9
  export type EventFamily = (typeof EVENT_FAMILIES)[number];
@@ -11,7 +11,7 @@
11
11
  * per-session shards (high frequency, one writer each). This module is the
12
12
  * single READ surface that merges them; nothing here writes.
13
13
  */
14
- import { type EventRecord, type EventType, type EventLevel } from './events.js';
14
+ import { type EventRecord, type EventType, type EventLevel } from './feed/events.js';
15
15
  import { type EventFamily } from './event-families.js';
16
16
  export interface UnifiedQuery {
17
17
  startDate?: Date;
@@ -11,8 +11,8 @@
11
11
  * per-session shards (high frequency, one writer each). This module is the
12
12
  * single READ surface that merges them; nothing here writes.
13
13
  */
14
- import { query, levelFor } from './events.js';
15
- import { readActivityAsEventRecords } from './activity.js';
14
+ import { query, levelFor } from './feed/events.js';
15
+ import { readActivityAsEventRecords } from './feed/activity.js';
16
16
  import { applyFamilies } from './event-families.js';
17
17
  /** Apply the same filters query() applies, to an activity-derived record. */
18
18
  function matches(r, q) {
@@ -17,8 +17,8 @@
17
17
  * Pure except for the two writers it calls, so the routing and validation rules
18
18
  * below are unit-testable against a temp events path + activity root.
19
19
  */
20
- import { emit, isEventType, } from './events.js';
21
- import { appendActivityEvent, tierForEvent, } from './activity.js';
20
+ import { emit, isEventType, } from './feed/events.js';
21
+ import { appendActivityEvent, tierForEvent, } from './feed/activity.js';
22
22
  /** Envelope keys an incoming line may set directly; everything else is payload. */
23
23
  const ENVELOPE_KEYS = [
24
24
  'event', 'ts', 'sessionId', 'mailboxId', 'terminalId', 'launchId', 'tmuxPane',
@@ -161,7 +161,7 @@ export interface ExecOptions {
161
161
  captureStdoutTail?: boolean;
162
162
  /**
163
163
  * Print the run's resolved session id to stdout as a one-line sentinel once the
164
- * child exits (see hosts/session-marker.ts). Set by the `--host` dispatch so the
164
+ * child exits (see hosts/session-marker.ts). Set by the `--device` dispatch so the
165
165
  * LAUNCHER can relate the remote-created session back to itself — Claude's id is
166
166
  * forced up front, but every other agent coins its own id on the remote box, and
167
167
  * this marker is how that id rides the followed log home. Headless-only and inert
@@ -219,10 +219,10 @@ export declare function parseExecEnv(entries: string[]): Record<string, string>
219
219
  * alongside the agent's real session id (terminals/sessions/<pid>.json), so it
220
220
  * is what maps a launch to its exact session even when the hook runs under a
221
221
  * different pid (tmux pane leaf / cmd.exe wrapper) — and, across an SSH hop, what
222
- * lets a `--host` launcher resolve the remote-coined id for agents that never
222
+ * lets a `--device` launcher resolve the remote-coined id for agents that never
223
223
  * accept a forced `--session-id`.
224
224
  *
225
- * ADOPT a caller-supplied `AGENT_LAUNCH_ID` (a `--host` launcher forwards one via
225
+ * ADOPT a caller-supplied `AGENT_LAUNCH_ID` (a `--device` launcher forwards one via
226
226
  * `--env` so it controls the key end-to-end); MINT a fresh one otherwise (every
227
227
  * local run, which passes none). A malformed inbound value is ignored in favour
228
228
  * of a fresh mint — the key must be a real correlation id, never an empty string.
@@ -365,7 +365,7 @@ export declare function shouldRecapDeadPane(status: number | undefined, interact
365
365
  * Why this is not `status ?? 0`: an interactive run whose tmux server died mid-
366
366
  * work landed on exactly those unknown branches and returned 0, so `agents run`
367
367
  * printed a failure banner while handing its caller a success code. The same
368
- * "1 if unknown" rule already governs the `--host` follow path
368
+ * "1 if unknown" rule already governs the `--device` follow path
369
369
  * (`docs/specifications.md` §Agent execution, exit-code table).
370
370
  *
371
371
  * @param pane What `paneExitStatus` read back for the agent pane.
@@ -398,6 +398,8 @@ export interface TmuxWrapContext {
398
398
  raw: boolean;
399
399
  /** The AGENTS_NO_TMUX=1 escape hatch. */
400
400
  noTmuxEnv: boolean;
401
+ /** This device's `tmux.enabled` config — false turns the wrap off for every launch on this box. */
402
+ configEnabled: boolean;
401
403
  /** Whether a tmux binary is on PATH. */
402
404
  tmuxAvailable: boolean;
403
405
  }
@@ -410,12 +412,13 @@ export interface TmuxWrapContext {
410
412
  * focus` re-attach a live session without forking it. Pure so the gate is unit-
411
413
  * tested independently of the (side-effecting) spawn.
412
414
  *
413
- * All five guards must pass:
415
+ * All seven guards must pass:
414
416
  * - interactive — a headless `-p` run has no TTY to attach; keep bare spawn.
415
417
  * - not Windows — no tmux path on win32.
416
418
  * - not already in tmux — nesting tmux-in-tmux is pointless and confusing.
417
419
  * - not --raw — explicit opt-out.
418
420
  * - not AGENTS_NO_TMUX=1 — env opt-out (CI, scripts, the shim passthrough path).
421
+ * - tmux.enabled — this device's durable opt-out, for a box whose tmux is broken.
419
422
  * - tmux installed — otherwise there is nothing to wrap with.
420
423
  */
421
424
  export declare function shouldWrapInTmux(ctx: TmuxWrapContext): boolean;