@phnx-labs/agents-cli 1.22.39 → 1.22.41

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 (569) hide show
  1. package/CHANGELOG.md +316 -0
  2. package/README.md +116 -70
  3. package/dist/bin/agents +0 -0
  4. package/dist/bootstrap.js +45 -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 +259 -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.d.ts +15 -0
  13. package/dist/commands/browser.js +318 -131
  14. package/dist/commands/budget.d.ts +7 -6
  15. package/dist/commands/budget.js +8 -7
  16. package/dist/commands/cloud.js +17 -20
  17. package/dist/commands/commands.js +1 -1
  18. package/dist/commands/computer-actions.d.ts +1 -35
  19. package/dist/commands/computer-actions.js +13 -181
  20. package/dist/commands/computer.d.ts +28 -3
  21. package/dist/commands/computer.js +93 -65
  22. package/dist/commands/config.js +16 -3
  23. package/dist/commands/cost.d.ts +2 -1
  24. package/dist/commands/cost.js +7 -6
  25. package/dist/commands/daemon.js +151 -4
  26. package/dist/commands/detach.js +1 -1
  27. package/dist/commands/doctor.js +19 -11
  28. package/dist/commands/events.js +1 -1
  29. package/dist/commands/exec.d.ts +2 -50
  30. package/dist/commands/exec.js +160 -215
  31. package/dist/commands/factory.js +1 -1
  32. package/dist/commands/feed.d.ts +2 -2
  33. package/dist/commands/feed.js +12 -23
  34. package/dist/commands/fleet-capture.js +25 -27
  35. package/dist/commands/focus.d.ts +2 -3
  36. package/dist/commands/focus.js +34 -9
  37. package/dist/commands/go.js +15 -5
  38. package/dist/commands/harness.d.ts +3 -3
  39. package/dist/commands/harness.js +53 -5
  40. package/dist/commands/hooks.js +1 -1
  41. package/dist/commands/import.js +2 -2
  42. package/dist/commands/insights.d.ts +5 -5
  43. package/dist/commands/insights.js +15 -9
  44. package/dist/commands/inspect.d.ts +2 -3
  45. package/dist/commands/inspect.js +4 -16
  46. package/dist/commands/logs.d.ts +2 -2
  47. package/dist/commands/logs.js +9 -9
  48. package/dist/commands/mcp.js +2 -2
  49. package/dist/commands/memory.js +1 -1
  50. package/dist/commands/message.d.ts +1 -1
  51. package/dist/commands/message.js +7 -7
  52. package/dist/commands/mine.d.ts +11 -8
  53. package/dist/commands/mine.js +11 -10
  54. package/dist/commands/models.js +1 -1
  55. package/dist/commands/modes.js +1 -1
  56. package/dist/commands/monitors.js +23 -6
  57. package/dist/commands/output.d.ts +7 -6
  58. package/dist/commands/output.js +11 -10
  59. package/dist/commands/packages.js +4 -4
  60. package/dist/commands/perf.js +1 -1
  61. package/dist/commands/permissions.js +49 -32
  62. package/dist/commands/plugins.d.ts +1 -1
  63. package/dist/commands/plugins.js +3 -3
  64. package/dist/commands/profiles.d.ts +6 -9
  65. package/dist/commands/profiles.js +8 -321
  66. package/dist/commands/projects.d.ts +9 -0
  67. package/dist/commands/projects.js +140 -8
  68. package/dist/commands/prune.js +5 -13
  69. package/dist/commands/refresh-rules.js +1 -1
  70. package/dist/commands/repo.d.ts +5 -7
  71. package/dist/commands/repo.js +34 -18
  72. package/dist/commands/resource-view.js +4 -0
  73. package/dist/commands/resume.d.ts +11 -7
  74. package/dist/commands/resume.js +82 -98
  75. package/dist/commands/route.d.ts +12 -0
  76. package/dist/commands/route.js +261 -0
  77. package/dist/commands/routines.d.ts +2 -3
  78. package/dist/commands/routines.js +120 -145
  79. package/dist/commands/rules.js +1 -1
  80. package/dist/commands/run-account-picker.d.ts +1 -1
  81. package/dist/commands/run-account-picker.js +2 -2
  82. package/dist/commands/run-broadcast.d.ts +21 -0
  83. package/dist/commands/run-broadcast.js +89 -0
  84. package/dist/commands/run-cloud.js +1 -1
  85. package/dist/commands/secrets-vault.d.ts +10 -0
  86. package/dist/commands/{login.js → secrets-vault.js} +34 -14
  87. package/dist/commands/secrets.d.ts +4 -4
  88. package/dist/commands/secrets.js +158 -159
  89. package/dist/commands/sessions-backfill.js +1 -1
  90. package/dist/commands/sessions-browser.d.ts +1 -1
  91. package/dist/commands/sessions-browser.js +9 -5
  92. package/dist/commands/sessions-export.js +2 -2
  93. package/dist/commands/sessions-inject.js +4 -5
  94. package/dist/commands/sessions-migrate.js +16 -27
  95. package/dist/commands/sessions-picker.d.ts +14 -0
  96. package/dist/commands/sessions-picker.js +209 -13
  97. package/dist/commands/sessions-resume.d.ts +7 -3
  98. package/dist/commands/sessions-resume.js +81 -33
  99. package/dist/commands/sessions-share.d.ts +25 -0
  100. package/dist/commands/sessions-share.js +166 -0
  101. package/dist/commands/sessions-stats.js +2 -2
  102. package/dist/commands/sessions.d.ts +75 -68
  103. package/dist/commands/sessions.js +144 -180
  104. package/dist/commands/setup-browser.js +1 -1
  105. package/dist/commands/setup-computer.js +1 -1
  106. package/dist/commands/setup-fleet.js +3 -0
  107. package/dist/commands/setup-mine.d.ts +7 -3
  108. package/dist/commands/setup-mine.js +13 -8
  109. package/dist/commands/setup-preferences.js +2 -2
  110. package/dist/commands/setup-secrets.js +2 -2
  111. package/dist/commands/setup-watchdog.js +2 -2
  112. package/dist/commands/setup.js +7 -2
  113. package/dist/commands/share.d.ts +65 -0
  114. package/dist/commands/share.js +253 -20
  115. package/dist/commands/skills.js +3 -3
  116. package/dist/commands/snapshot.d.ts +2 -2
  117. package/dist/commands/snapshot.js +9 -9
  118. package/dist/commands/ssh.d.ts +1 -1
  119. package/dist/commands/ssh.js +186 -64
  120. package/dist/commands/subagents.js +1 -1
  121. package/dist/commands/sync.js +24 -9
  122. package/dist/commands/teams.d.ts +2 -2
  123. package/dist/commands/teams.js +9 -18
  124. package/dist/commands/tmux.js +5 -1
  125. package/dist/commands/trash.js +1 -1
  126. package/dist/commands/usage.d.ts +1 -1
  127. package/dist/commands/usage.js +2 -2
  128. package/dist/commands/utils.d.ts +4 -14
  129. package/dist/commands/utils.js +6 -27
  130. package/dist/commands/versions.js +2 -2
  131. package/dist/commands/view.d.ts +9 -77
  132. package/dist/commands/view.js +23 -8
  133. package/dist/commands/watchdog.js +1 -1
  134. package/dist/commands/webhook.js +25 -34
  135. package/dist/commands/workflows.js +1 -1
  136. package/dist/index.js +1 -1
  137. package/dist/lib/account-capabilities.d.ts +39 -0
  138. package/dist/lib/account-capabilities.js +59 -0
  139. package/dist/lib/account-catalog.js +1 -1
  140. package/dist/lib/account-registry.d.ts +66 -0
  141. package/dist/lib/account-registry.js +151 -5
  142. package/dist/lib/{rotate.d.ts → accounting/rotate.d.ts} +4 -4
  143. package/dist/lib/{rotate.js → accounting/rotate.js} +8 -8
  144. package/dist/lib/{usage.d.ts → accounting/usage.d.ts} +4 -4
  145. package/dist/lib/{usage.js → accounting/usage.js} +11 -11
  146. package/dist/lib/agent-spec/provider.js +1 -1
  147. package/dist/lib/agents.d.ts +72 -4
  148. package/dist/lib/agents.js +231 -199
  149. package/dist/lib/answer-router.d.ts +2 -2
  150. package/dist/lib/ask-classifier.d.ts +1 -1
  151. package/dist/lib/ask-classifier.js +1 -1
  152. package/dist/lib/audit/log.js +1 -1
  153. package/dist/lib/auth-health.d.ts +1 -1
  154. package/dist/lib/auth-health.js +2 -2
  155. package/dist/lib/brand.js +1 -1
  156. package/dist/lib/browser/caller-identity.d.ts +28 -0
  157. package/dist/lib/browser/caller-identity.js +156 -0
  158. package/dist/lib/browser/cdp.js +5 -1
  159. package/dist/lib/browser/chrome.js +12 -1
  160. package/dist/lib/browser/drivers/ssh.d.ts +1 -1
  161. package/dist/lib/browser/drivers/ssh.js +3 -2
  162. package/dist/lib/browser/hygiene.d.ts +10 -2
  163. package/dist/lib/browser/hygiene.js +7 -4
  164. package/dist/lib/browser/ipc.d.ts +22 -2
  165. package/dist/lib/browser/ipc.js +185 -21
  166. package/dist/lib/browser/profiles.d.ts +69 -5
  167. package/dist/lib/browser/profiles.js +135 -13
  168. package/dist/lib/browser/remote-control.d.ts +2 -2
  169. package/dist/lib/browser/remote-control.js +3 -3
  170. package/dist/lib/browser/runtime-state.d.ts +79 -0
  171. package/dist/lib/browser/runtime-state.js +119 -1
  172. package/dist/lib/browser/service.d.ts +137 -2
  173. package/dist/lib/browser/service.js +492 -54
  174. package/dist/lib/browser/sessions-list.d.ts +2 -1
  175. package/dist/lib/browser/sessions-list.js +4 -13
  176. package/dist/lib/browser/types.d.ts +19 -1
  177. package/dist/lib/budget/config.js +1 -1
  178. package/dist/lib/budget/ledger.js +1 -1
  179. package/dist/lib/byok-usage.js +1 -1
  180. package/dist/lib/capabilities.js +3 -15
  181. package/dist/lib/catchup.d.ts +1 -1
  182. package/dist/lib/catchup.js +1 -1
  183. package/dist/lib/cloud/dispatch.js +1 -1
  184. package/dist/lib/cloud/host.d.ts +3 -3
  185. package/dist/lib/cloud/host.js +5 -5
  186. package/dist/lib/cloud/rush.d.ts +9 -21
  187. package/dist/lib/cloud/rush.js +33 -120
  188. package/dist/lib/cloud/types.d.ts +2 -2
  189. package/dist/lib/commands.js +3 -13
  190. package/dist/lib/computer/actions.d.ts +36 -0
  191. package/dist/lib/computer/actions.js +162 -0
  192. package/dist/lib/computer/dispatch.d.ts +2 -2
  193. package/dist/lib/computer/dispatch.js +2 -2
  194. package/dist/lib/computer/sessions-list.d.ts +3 -3
  195. package/dist/lib/computer/sessions-list.js +2 -2
  196. package/dist/lib/config-keys.d.ts +2 -1
  197. package/dist/lib/config-keys.js +8 -4
  198. package/dist/lib/config-machine-keys.d.ts +4 -2
  199. package/dist/lib/config-machine-keys.js +5 -2
  200. package/dist/lib/crabbox/lease.js +9 -1
  201. package/dist/lib/crabbox/runtimes.d.ts +32 -7
  202. package/dist/lib/crabbox/runtimes.js +72 -30
  203. package/dist/lib/{daemon.d.ts → daemon/daemon.d.ts} +59 -1
  204. package/dist/lib/{daemon.js → daemon/daemon.js} +237 -49
  205. package/dist/lib/daemon-services.d.ts +1 -1
  206. package/dist/lib/daemon-services.js +5 -0
  207. package/dist/lib/daemon-ticks.d.ts +25 -0
  208. package/dist/lib/daemon-ticks.js +31 -1
  209. package/dist/lib/daemon-webhooks.d.ts +104 -0
  210. package/dist/lib/daemon-webhooks.js +215 -0
  211. package/dist/lib/device-config.d.ts +85 -75
  212. package/dist/lib/device-config.js +280 -142
  213. package/dist/lib/devices/config-migration.d.ts +29 -34
  214. package/dist/lib/devices/config-migration.js +209 -130
  215. package/dist/lib/devices/connect.d.ts +2 -2
  216. package/dist/lib/devices/connect.js +2 -2
  217. package/dist/lib/devices/discovery-policy.d.ts +30 -0
  218. package/dist/lib/devices/discovery-policy.js +101 -0
  219. package/dist/lib/devices/fleet-inventory.js +8 -3
  220. package/dist/lib/devices/harness-inventory.d.ts +1 -1
  221. package/dist/lib/devices/harness-inventory.js +12 -3
  222. package/dist/lib/devices/known-hosts.js +1 -1
  223. package/dist/lib/devices/pool.d.ts +10 -5
  224. package/dist/lib/devices/pool.js +5 -7
  225. package/dist/lib/devices/registry.d.ts +1 -1
  226. package/dist/lib/devices/registry.js +1 -1
  227. package/dist/lib/devices/resolve-profile.d.ts +2 -2
  228. package/dist/lib/devices/resolve-profile.js +2 -2
  229. package/dist/lib/devices/resolve-target.d.ts +1 -1
  230. package/dist/lib/devices/resolve-target.js +4 -4
  231. package/dist/lib/devices/self-host.d.ts +1 -1
  232. package/dist/lib/devices/self-host.js +3 -3
  233. package/dist/lib/devices/ssh-config.d.ts +1 -1
  234. package/dist/lib/devices/stats-cache.js +1 -1
  235. package/dist/lib/devices/sync.d.ts +3 -1
  236. package/dist/lib/devices/sync.js +3 -3
  237. package/dist/lib/doctor-diff.js +4 -4
  238. package/dist/lib/drift-sync.js +2 -2
  239. package/dist/lib/drift.js +2 -2
  240. package/dist/lib/event-families.d.ts +1 -1
  241. package/dist/lib/event-stream.d.ts +1 -1
  242. package/dist/lib/event-stream.js +2 -2
  243. package/dist/lib/events-ingest.js +2 -2
  244. package/dist/lib/exec.d.ts +4 -4
  245. package/dist/lib/exec.js +11 -11
  246. package/dist/lib/factory/snapshot.d.ts +1 -1
  247. package/dist/lib/factory/snapshot.js +1 -1
  248. package/dist/lib/{activity.d.ts → feed/activity.d.ts} +1 -1
  249. package/dist/lib/{activity.js → feed/activity.js} +7 -7
  250. package/dist/lib/{events.d.ts → feed/events.d.ts} +2 -2
  251. package/dist/lib/{events.js → feed/events.js} +5 -5
  252. package/dist/lib/{feed.js → feed/feed.js} +4 -4
  253. package/dist/lib/feed-outcome.d.ts +1 -1
  254. package/dist/lib/feed-policy.d.ts +1 -1
  255. package/dist/lib/feed-policy.js +1 -1
  256. package/dist/lib/feed-post.d.ts +1 -1
  257. package/dist/lib/feed-post.js +1 -1
  258. package/dist/lib/feed-ranking.d.ts +1 -1
  259. package/dist/lib/fleet/apply.d.ts +0 -6
  260. package/dist/lib/fleet/apply.js +18 -45
  261. package/dist/lib/fleet/auth-sync.d.ts +16 -35
  262. package/dist/lib/fleet/auth-sync.js +16 -75
  263. package/dist/lib/fleet/capture.js +8 -6
  264. package/dist/lib/fleet/manifest.js +23 -11
  265. package/dist/lib/fleet/types.d.ts +19 -7
  266. package/dist/lib/fleet-cache.d.ts +1 -1
  267. package/dist/lib/fleet-cache.js +1 -1
  268. package/dist/lib/format.d.ts +19 -0
  269. package/dist/lib/format.js +44 -1
  270. package/dist/lib/friction-heuristics.d.ts +1 -1
  271. package/dist/lib/git.d.ts +24 -1
  272. package/dist/lib/git.js +82 -38
  273. package/dist/lib/heal.js +3 -3
  274. package/dist/lib/hooks.d.ts +18 -0
  275. package/dist/lib/hooks.js +113 -1
  276. package/dist/lib/hosts/credentials.d.ts +30 -10
  277. package/dist/lib/hosts/credentials.js +38 -26
  278. package/dist/lib/hosts/dispatch.d.ts +3 -3
  279. package/dist/lib/hosts/dispatch.js +3 -3
  280. package/dist/lib/hosts/option.d.ts +3 -3
  281. package/dist/lib/hosts/option.js +7 -8
  282. package/dist/lib/hosts/passthrough.d.ts +17 -17
  283. package/dist/lib/hosts/passthrough.js +67 -50
  284. package/dist/lib/hosts/providers/devices.d.ts +1 -1
  285. package/dist/lib/hosts/providers/devices.js +1 -1
  286. package/dist/lib/hosts/reconcile.d.ts +1 -1
  287. package/dist/lib/hosts/reconcile.js +1 -1
  288. package/dist/lib/hosts/reconnect.d.ts +1 -1
  289. package/dist/lib/hosts/reconnect.js +2 -2
  290. package/dist/lib/hosts/registry.d.ts +5 -5
  291. package/dist/lib/hosts/registry.js +5 -5
  292. package/dist/lib/hosts/remote-cmd.d.ts +10 -10
  293. package/dist/lib/hosts/remote-cmd.js +25 -18
  294. package/dist/lib/hosts/remote-os.d.ts +4 -4
  295. package/dist/lib/hosts/remote-os.js +4 -4
  296. package/dist/lib/hosts/remote-session-id.d.ts +2 -2
  297. package/dist/lib/hosts/remote-session-id.js +2 -2
  298. package/dist/lib/hosts/routing-flag.d.ts +3 -3
  299. package/dist/lib/hosts/routing-flag.js +4 -5
  300. package/dist/lib/hosts/run-target.d.ts +4 -4
  301. package/dist/lib/hosts/run-target.js +4 -4
  302. package/dist/lib/hosts/session-index.d.ts +2 -2
  303. package/dist/lib/hosts/session-index.js +1 -1
  304. package/dist/lib/hosts/session-marker.d.ts +1 -1
  305. package/dist/lib/hosts/session-marker.js +1 -1
  306. package/dist/lib/hosts/types.d.ts +2 -2
  307. package/dist/lib/hosts/types.js +2 -2
  308. package/dist/lib/import.js +1 -1
  309. package/dist/lib/{migrate.d.ts → installations/migrate.d.ts} +13 -1
  310. package/dist/lib/{migrate.js → installations/migrate.js} +160 -40
  311. package/dist/lib/installations/resolve.js +1 -1
  312. package/dist/lib/installations/strategies.js +1 -1
  313. package/dist/lib/installations/update.js +2 -2
  314. package/dist/lib/{versions.d.ts → installations/versions.d.ts} +12 -3
  315. package/dist/lib/{versions.js → installations/versions.js} +51 -31
  316. package/dist/lib/isolation-boundary-report.js +1 -1
  317. package/dist/lib/linear-projects.d.ts +28 -0
  318. package/dist/lib/linear-projects.js +30 -0
  319. package/dist/lib/loop.js +1 -1
  320. package/dist/lib/mailbox-gc.js +1 -1
  321. package/dist/lib/mailbox.js +1 -1
  322. package/dist/lib/mcp-registry.d.ts +62 -0
  323. package/dist/lib/mcp-registry.js +177 -0
  324. package/dist/lib/mcp.d.ts +5 -0
  325. package/dist/lib/mcp.js +124 -307
  326. package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
  327. package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
  328. package/dist/lib/menubar/install-menubar.d.ts +7 -0
  329. package/dist/lib/menubar/install-menubar.js +24 -6
  330. package/dist/lib/menubar/snapshot.d.ts +7 -0
  331. package/dist/lib/menubar/snapshot.js +8 -6
  332. package/dist/lib/models.js +1 -1
  333. package/dist/lib/monitors/config.d.ts +12 -0
  334. package/dist/lib/monitors/config.js +3 -0
  335. package/dist/lib/monitors/dispatch.js +26 -5
  336. package/dist/lib/monitors/engine.js +10 -0
  337. package/dist/lib/monitors/sources/webhook.d.ts +1 -1
  338. package/dist/lib/monitors/state.d.ts +42 -0
  339. package/dist/lib/monitors/state.js +30 -0
  340. package/dist/lib/notify.d.ts +1 -1
  341. package/dist/lib/observe-aliases.d.ts +3 -3
  342. package/dist/lib/observe-aliases.js +3 -21
  343. package/dist/lib/output/git-output.js +2 -2
  344. package/dist/lib/overdue.d.ts +1 -1
  345. package/dist/lib/overdue.js +1 -1
  346. package/dist/lib/permissions-registry.d.ts +65 -0
  347. package/dist/lib/permissions-registry.js +599 -0
  348. package/dist/lib/permissions.d.ts +24 -13
  349. package/dist/lib/permissions.js +52 -271
  350. package/dist/lib/picker.d.ts +16 -0
  351. package/dist/lib/picker.js +33 -3
  352. package/dist/lib/placement.d.ts +1 -1
  353. package/dist/lib/placement.js +4 -4
  354. package/dist/lib/platform/paths.d.ts +8 -0
  355. package/dist/lib/platform/paths.js +11 -0
  356. package/dist/lib/platform/posixpath.js +3 -3
  357. package/dist/lib/{plugin-marketplace.d.ts → plugins/plugin-marketplace.d.ts} +1 -1
  358. package/dist/lib/{plugin-marketplace.js → plugins/plugin-marketplace.js} +2 -2
  359. package/dist/lib/{plugins.d.ts → plugins/plugins.d.ts} +1 -1
  360. package/dist/lib/{plugins.js → plugins/plugins.js} +7 -7
  361. package/dist/lib/{skills.d.ts → plugins/skills.d.ts} +1 -1
  362. package/dist/lib/{skills.js → plugins/skills.js} +7 -7
  363. package/dist/lib/pricing/cost.d.ts +1 -1
  364. package/dist/lib/pricing/cost.js +1 -1
  365. package/dist/lib/profiles-presets.d.ts +1 -1
  366. package/dist/lib/profiles-presets.js +1 -1
  367. package/dist/lib/profiles.js +2 -2
  368. package/dist/lib/project-import.js +4 -1
  369. package/dist/lib/project-key.js +7 -0
  370. package/dist/lib/project-launch.d.ts +1 -1
  371. package/dist/lib/project-launch.js +3 -3
  372. package/dist/lib/project-pull.d.ts +128 -0
  373. package/dist/lib/project-pull.js +384 -0
  374. package/dist/lib/project-root.d.ts +2 -2
  375. package/dist/lib/project-root.js +2 -2
  376. package/dist/lib/project-status.js +1 -1
  377. package/dist/lib/projects.d.ts +23 -0
  378. package/dist/lib/projects.js +29 -6
  379. package/dist/lib/refresh.d.ts +12 -1
  380. package/dist/lib/refresh.js +16 -9
  381. package/dist/lib/registry.d.ts +9 -2
  382. package/dist/lib/registry.js +11 -4
  383. package/dist/lib/resources.d.ts +2 -2
  384. package/dist/lib/resources.js +2 -2
  385. package/dist/lib/routers.d.ts +81 -0
  386. package/dist/lib/routers.js +153 -0
  387. package/dist/lib/routine-context.d.ts +1 -0
  388. package/dist/lib/routine-context.js +7 -2
  389. package/dist/lib/routine-notify-owner.d.ts +1 -1
  390. package/dist/lib/routine-notify.d.ts +1 -1
  391. package/dist/lib/routine-notify.js +1 -1
  392. package/dist/lib/routine-process-cleanup.d.ts +1 -1
  393. package/dist/lib/routine-readiness.d.ts +1 -1
  394. package/dist/lib/routine-readiness.js +11 -4
  395. package/dist/lib/routines-placement.d.ts +12 -2
  396. package/dist/lib/routines-placement.js +20 -3
  397. package/dist/lib/routines-project.d.ts +1 -1
  398. package/dist/lib/routines-project.js +1 -1
  399. package/dist/lib/rules/compile.d.ts +1 -0
  400. package/dist/lib/rules/compile.js +10 -2
  401. package/dist/lib/rules/rules.js +1 -1
  402. package/dist/lib/run-notify.js +1 -1
  403. package/dist/lib/runner.d.ts +80 -2
  404. package/dist/lib/runner.js +261 -67
  405. package/dist/lib/sandbox.d.ts +1 -1
  406. package/dist/lib/scheduler.d.ts +1 -1
  407. package/dist/lib/scheduler.js +1 -1
  408. package/dist/lib/{routines.d.ts → scheduling/routines.d.ts} +54 -9
  409. package/dist/lib/{routines.js → scheduling/routines.js} +173 -14
  410. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  411. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  412. package/dist/lib/secrets/agent.js +2 -2
  413. package/dist/lib/secrets/audit.js +1 -1
  414. package/dist/lib/secrets/bundles.d.ts +4 -4
  415. package/dist/lib/secrets/bundles.js +8 -8
  416. package/dist/lib/secrets/headless.d.ts +16 -0
  417. package/dist/lib/secrets/headless.js +21 -0
  418. package/dist/lib/secrets/index.js +1 -1
  419. package/dist/lib/secrets/list-filter.d.ts +1 -1
  420. package/dist/lib/secrets/list-filter.js +2 -2
  421. package/dist/lib/secrets/push.d.ts +1 -1
  422. package/dist/lib/secrets/push.js +10 -12
  423. package/dist/lib/secrets/remote.d.ts +21 -17
  424. package/dist/lib/secrets/remote.js +39 -23
  425. package/dist/lib/secrets/vault.js +2 -2
  426. package/dist/lib/self-heal/checks/shadowing.js +1 -1
  427. package/dist/lib/self-heal/checks/shims.js +1 -1
  428. package/dist/lib/self-update.d.ts +39 -4
  429. package/dist/lib/self-update.js +78 -25
  430. package/dist/lib/serve/control.d.ts +1 -1
  431. package/dist/lib/serve/control.js +4 -4
  432. package/dist/lib/serve/data.d.ts +1 -1
  433. package/dist/lib/serve/data.js +1 -1
  434. package/dist/lib/serve/stream.js +1 -1
  435. package/dist/lib/service-manifest.d.ts +29 -0
  436. package/dist/lib/service-manifest.js +80 -0
  437. package/dist/lib/session/active.d.ts +59 -7
  438. package/dist/lib/session/active.js +158 -17
  439. package/dist/lib/session/bash-command.js +1 -1
  440. package/dist/lib/session/claude-accounts.d.ts +1 -1
  441. package/dist/lib/session/claude-accounts.js +1 -1
  442. package/dist/lib/session/db.d.ts +10 -2
  443. package/dist/lib/session/db.js +25 -6
  444. package/dist/lib/session/discover.d.ts +77 -0
  445. package/dist/lib/session/discover.js +130 -25
  446. package/dist/lib/session/fork.js +1 -1
  447. package/dist/lib/session/inject.d.ts +1 -1
  448. package/dist/lib/session/insights.d.ts +1 -1
  449. package/dist/lib/session/insights.js +1 -1
  450. package/dist/lib/session/live-metadata.d.ts +15 -0
  451. package/dist/lib/session/live-metadata.js +76 -0
  452. package/dist/lib/session/migrate-targets.d.ts +1 -1
  453. package/dist/lib/session/recovery.d.ts +1 -1
  454. package/dist/lib/session/recovery.js +2 -2
  455. package/dist/lib/session/remote-active.d.ts +10 -1
  456. package/dist/lib/session/remote-active.js +8 -3
  457. package/dist/lib/session/remote-bundle.d.ts +1 -1
  458. package/dist/lib/session/remote-bundle.js +2 -2
  459. package/dist/lib/session/remote-list.d.ts +15 -4
  460. package/dist/lib/session/remote-list.js +40 -3
  461. package/dist/lib/session/remote.d.ts +5 -5
  462. package/dist/lib/session/remote.js +13 -17
  463. package/dist/lib/session/resume-command.d.ts +3 -2
  464. package/dist/lib/session/resume-command.js +4 -3
  465. package/dist/lib/session/resume-owner.d.ts +3 -3
  466. package/dist/lib/session/resume-owner.js +3 -3
  467. package/dist/lib/session/session-cache.d.ts +12 -0
  468. package/dist/lib/session/session-cache.js +2 -0
  469. package/dist/lib/session/share-html.d.ts +55 -0
  470. package/dist/lib/session/share-html.js +319 -0
  471. package/dist/lib/session/shell-programs.js +1 -1
  472. package/dist/lib/session/state.js +5 -5
  473. package/dist/lib/session/team-filter.d.ts +1 -1
  474. package/dist/lib/session/team-filter.js +1 -1
  475. package/dist/lib/session/types.d.ts +3 -3
  476. package/dist/lib/session/width.d.ts +2 -2
  477. package/dist/lib/session/width.js +2 -2
  478. package/dist/lib/settings-manifest.d.ts +2 -0
  479. package/dist/lib/settings-manifest.js +81 -3
  480. package/dist/lib/share/delete.d.ts +21 -0
  481. package/dist/lib/share/delete.js +42 -0
  482. package/dist/lib/share/publish.d.ts +120 -0
  483. package/dist/lib/share/publish.js +243 -18
  484. package/dist/lib/share/worker-template.js +172 -9
  485. package/dist/lib/shims.js +35 -7
  486. package/dist/lib/smart-launch.d.ts +4 -4
  487. package/dist/lib/smart-launch.js +6 -4
  488. package/dist/lib/snapshot.d.ts +4 -4
  489. package/dist/lib/snapshot.js +2 -2
  490. package/dist/lib/ssh-exec.d.ts +1 -1
  491. package/dist/lib/ssh-exec.js +2 -2
  492. package/dist/lib/ssh-tunnel.d.ts +10 -10
  493. package/dist/lib/ssh-tunnel.js +12 -12
  494. package/dist/lib/staleness/checkers/hooks.d.ts +1 -1
  495. package/dist/lib/staleness/checkers/hooks.js +1 -1
  496. package/dist/lib/staleness/detectors/permissions.js +0 -23
  497. package/dist/lib/staleness/detectors/plugins.js +1 -1
  498. package/dist/lib/staleness/fingerprint.js +1 -1
  499. package/dist/lib/staleness/layers.d.ts +1 -1
  500. package/dist/lib/staleness/layers.js +1 -1
  501. package/dist/lib/staleness/writers/mcp.js +3 -1
  502. package/dist/lib/staleness/writers/plugins.js +1 -1
  503. package/dist/lib/staleness/writers/types.d.ts +8 -0
  504. package/dist/lib/startup/command-registry.d.ts +6 -147
  505. package/dist/lib/startup/command-registry.js +40 -303
  506. package/dist/lib/startup/dev-build.d.ts +0 -21
  507. package/dist/lib/startup/dev-build.js +29 -8
  508. package/dist/lib/state.d.ts +19 -1
  509. package/dist/lib/state.js +120 -51
  510. package/dist/lib/subagents.js +1 -1
  511. package/dist/lib/sync-status.js +1 -1
  512. package/dist/lib/sync-umbrella.d.ts +6 -1
  513. package/dist/lib/sync-umbrella.js +9 -4
  514. package/dist/lib/teams/agents.js +2 -2
  515. package/dist/lib/teams/registry.js +1 -1
  516. package/dist/lib/terminal/backends/vscodium-agent.js +1 -1
  517. package/dist/lib/terminal/engine.js +1 -1
  518. package/dist/lib/terminal/index.d.ts +4 -0
  519. package/dist/lib/terminal/index.js +3 -0
  520. package/dist/lib/terminal/inject.d.ts +2 -2
  521. package/dist/lib/terminal/inject.js +2 -2
  522. package/dist/lib/terminal/transport.js +1 -1
  523. package/dist/lib/tmux/index.d.ts +1 -1
  524. package/dist/lib/tmux/index.js +1 -1
  525. package/dist/lib/tmux/session.d.ts +21 -5
  526. package/dist/lib/tmux/session.js +76 -22
  527. package/dist/lib/triggers/handlers.d.ts +38 -3
  528. package/dist/lib/triggers/handlers.js +58 -7
  529. package/dist/lib/triggers/webhook.d.ts +113 -5
  530. package/dist/lib/triggers/webhook.js +223 -44
  531. package/dist/lib/types.d.ts +19 -7
  532. package/dist/lib/usage-fleet.d.ts +1 -1
  533. package/dist/lib/usage-fleet.js +1 -1
  534. package/dist/lib/usage-refresh.d.ts +1 -1
  535. package/dist/lib/usage-refresh.js +3 -3
  536. package/dist/lib/version-duplicates.js +2 -2
  537. package/dist/lib/view-types.d.ts +56 -0
  538. package/dist/lib/view-types.js +1 -0
  539. package/dist/lib/watchdog/rotate.d.ts +2 -2
  540. package/dist/lib/watchdog/rotate.js +3 -3
  541. package/dist/lib/watchdog/runner.d.ts +2 -3
  542. package/dist/lib/watchdog/runner.js +3 -4
  543. package/dist/lib/workflows.js +1 -1
  544. package/dist/lib/wrap.d.ts +33 -0
  545. package/dist/lib/wrap.js +70 -0
  546. package/package.json +2 -1
  547. package/scripts/postinstall.js +2 -2
  548. package/dist/commands/bench.d.ts +0 -2
  549. package/dist/commands/bench.js +0 -101
  550. package/dist/commands/cp.d.ts +0 -84
  551. package/dist/commands/cp.js +0 -231
  552. package/dist/commands/login.d.ts +0 -2
  553. package/dist/lib/resources/commands.d.ts +0 -46
  554. package/dist/lib/resources/commands.js +0 -211
  555. package/dist/lib/resources/hooks.d.ts +0 -16
  556. package/dist/lib/resources/hooks.js +0 -153
  557. package/dist/lib/resources/mcp.d.ts +0 -34
  558. package/dist/lib/resources/mcp.js +0 -250
  559. package/dist/lib/resources/memory.d.ts +0 -15
  560. package/dist/lib/resources/memory.js +0 -46
  561. package/dist/lib/resources/permissions.d.ts +0 -13
  562. package/dist/lib/resources/permissions.js +0 -202
  563. package/dist/lib/resources/rules.d.ts +0 -46
  564. package/dist/lib/resources/rules.js +0 -179
  565. package/dist/lib/resources/skills.d.ts +0 -37
  566. package/dist/lib/resources/skills.js +0 -247
  567. package/dist/lib/resources/subagents.d.ts +0 -46
  568. package/dist/lib/resources/subagents.js +0 -202
  569. /package/dist/lib/{feed.d.ts → feed/feed.d.ts} +0 -0
@@ -6,9 +6,16 @@
6
6
  * run metadata persistence, prompt variable expansion, and one-shot "at" time
7
7
  * scheduling.
8
8
  */
9
- import { type ResolvedExecutionContext, type ProjectResolution, type PlacementMode, type RoutineKind, type ContextFsProbe } from './routine-context.js';
10
- import type { AgentId } from './types.js';
11
- import type { LoopConfig } from './loop.js';
9
+ import { type ResolvedExecutionContext, type ProjectResolution, type PlacementMode, type RoutineKind, type ContextFsProbe } from '../routine-context.js';
10
+ import type { AgentId, RunStrategy } from '../types.js';
11
+ import type { LoopConfig } from '../loop.js';
12
+ import { JobScheduler } from '../scheduler.js';
13
+ export declare function fireConditionLabel(job: JobConfig): string;
14
+ export declare function nextRunForDisplay(job: JobConfig, scheduler: JobScheduler): Date | null;
15
+ export declare function nextRunLabel(job: JobConfig, scheduler: JobScheduler, now: Date): string;
16
+ export declare function localLatestRun(job: JobConfig): RunMeta | null;
17
+ export declare function listJobsForDisplay(cwd?: string): JobConfig[];
18
+ export declare function buildRoutineListJson(): Record<string, unknown>[];
12
19
  /** Tool/site/directory allow-list for sandboxed job execution. */
13
20
  export interface JobAllowConfig {
14
21
  tools?: string[];
@@ -17,7 +24,7 @@ export interface JobAllowConfig {
17
24
  }
18
25
  /**
19
26
  * Where a routine's job body executes when the daemon fires it.
20
- * Distinct from `devices` (which daemon may *fire*) and from the CLI `--host`
27
+ * Distinct from `devices` (which daemon may *fire*) and from the CLI `--device`
21
28
  * remote-management passthrough (manage routines *on* another machine).
22
29
  */
23
30
  export type HostStrategy = 'local' | 'host' | 'fleet' | 'cloud';
@@ -184,7 +191,7 @@ export interface JobConfig {
184
191
  * registered host, device, capability tag, or user@host) instead of locally.
185
192
  * Distinct from `devices`: `devices` says which daemon may FIRE the job,
186
193
  * `host` says where the dispatched run EXECUTES. CLI flag: `--run-on`
187
- * (`--host` on routines commands already means "manage routines on that
194
+ * (`--device` on routines commands already means "manage routines on that
188
195
  * machine" via the remote passthrough).
189
196
  *
190
197
  * When `hostStrategy` is set, it owns placement semantics; `host` is then
@@ -200,7 +207,7 @@ export interface JobConfig {
200
207
  * double-fire; the firing pin stays on `devices`)
201
208
  * - `cloud` — dispatch via the agent's native cloud provider
202
209
  *
203
- * CLI flag: `--placement` (not `--host`, which is the remote-management
210
+ * CLI flag: `--placement` (not `--device`, which is the remote-management
204
211
  * passthrough). Omitted strategy falls back to `host` when `host:` is set,
205
212
  * otherwise `local`.
206
213
  */
@@ -218,6 +225,16 @@ export interface JobConfig {
218
225
  allow?: JobAllowConfig;
219
226
  config?: Record<string, unknown>;
220
227
  version?: string;
228
+ /**
229
+ * Explicit per-routine version/account selection strategy — the same
230
+ * vocabulary as `agents run --strategy` (RUN_STRATEGIES). Overrides
231
+ * `run.<agent>.strategy` from the FIRING device's own agents.yaml
232
+ * (getConfiguredRunStrategy) so a routine's selection policy travels with the
233
+ * definition instead of depending on whichever box happens to fire it.
234
+ * Conflicts with `version:` (an exact pin leaves nothing to select) —
235
+ * validateJob rejects the pair.
236
+ */
237
+ strategy?: RunStrategy;
221
238
  /**
222
239
  * Pin this routine to a signed-in account by identity (its login email, or its
223
240
  * account key) instead of rotating. At launch it resolves to whichever
@@ -268,6 +285,29 @@ export interface JobConfig {
268
285
  * - Absent/empty — routine belongs to no project ("Operations" group).
269
286
  */
270
287
  projects?: string[];
288
+ /**
289
+ * Set only by `lib/monitors/dispatch.ts` on the one-off job it synthesizes for
290
+ * a monitor's `run` action. Such a job is NOT a routine: it has no definition
291
+ * file, `agents routines` never lists it, and its name can therefore never
292
+ * appear in this device's routine activation manifest
293
+ * (`~/.agents/devices/<machine>/agents.yaml` → `routines:`). Gating it on that
294
+ * manifest refused every monitor action fleet-wide with `wrong_owner` and an
295
+ * empty allowlist (RUSH-2681), so {@link jobRunsOnThisDevice} skips the
296
+ * manifest for it. Exactly-once ownership is already resolved BEFORE dispatch
297
+ * by the monitor's own `device:` pin (`monitorRunsOnThisDevice`,
298
+ * `lib/monitors/config.ts`) — re-gating here was double-gating on the wrong
299
+ * key.
300
+ *
301
+ * Deliberately narrow: a monitor's `routine` action fires a REAL routine, which
302
+ * keeps its activation gate, so a routine defined but not activated on this
303
+ * device is still refused.
304
+ *
305
+ * Runtime-only, enforced at both ends of the schema boundary: `writeJob`
306
+ * strips it, and `readJobFileResult` refuses a definition that carries it
307
+ * (a hand-authored one would otherwise fire on every box regardless of
308
+ * activation, since the daemon's load path never calls `validateJob`).
309
+ */
310
+ dispatchedBy?: 'monitor';
271
311
  }
272
312
  /**
273
313
  * Canonical form of a routine's `projects` field: drop non-string and empty
@@ -463,8 +503,13 @@ export declare function finalizeRunMeta(meta: RunMeta, status: RunMeta['status']
463
503
  * `normalizeHost` so `Yosemite-S0`, `yosemite-s0.tailnet.ts.net`, and
464
504
  * `yosemite-s0` all agree. Every fire path (cron scheduler, webhook,
465
505
  * catchup/overdue, manual run) gates on this.
506
+ *
507
+ * A monitor-dispatched job ({@link JobConfig.dispatchedBy} `=== 'monitor'`) skips
508
+ * the routine activation manifest: it is not a routine, so its name can never be
509
+ * a member and the lookup could only ever answer "not activated here"
510
+ * (RUSH-2681). Its ownership was already decided by the monitor's `device:` pin.
466
511
  */
467
- export declare function jobRunsOnThisDevice(config: Pick<JobConfig, 'name' | 'devices'>): boolean;
512
+ export declare function jobRunsOnThisDevice(config: Pick<JobConfig, 'name' | 'devices' | 'dispatchedBy'>): boolean;
468
513
  /**
469
514
  * The ONE device that owns a routine — the single daemon allowed to fire it.
470
515
  *
@@ -528,7 +573,7 @@ export declare function placementRequiresFiringPin(strategy: HostStrategy): bool
528
573
  export interface JobEligibilityResult {
529
574
  /** Full human message, e.g. "Job 'NAME' can only run on: a, b". */
530
575
  message: string;
531
- /** One-line copy-paste suggestion, e.g. "agents routines run NAME --host a". */
576
+ /** One-line copy-paste suggestion, e.g. "agents routines run NAME --device a". */
532
577
  suggestion: string;
533
578
  /** Comma-separated allowed devices label, e.g. "a, b". */
534
579
  allowedLabel: string;
@@ -541,7 +586,7 @@ export interface JobEligibilityResult {
541
586
  * construction so manual run, executeJob, and executeJobDetached stay in
542
587
  * sync. Scheduler/webhook/overdue paths continue to use jobRunsOnThisDevice.
543
588
  */
544
- export declare function checkJobDeviceEligibility(config: Pick<JobConfig, 'name' | 'devices'>): JobEligibilityResult | null;
589
+ export declare function checkJobDeviceEligibility(config: Pick<JobConfig, 'name' | 'devices' | 'dispatchedBy'>): JobEligibilityResult | null;
545
590
  /**
546
591
  * List all job configs, scanning project > user > system routine dirs.
547
592
  * Higher layers shadow lower ones of the same name (first-seen wins): a project
@@ -10,17 +10,137 @@ import * as fs from 'fs';
10
10
  import * as path from 'path';
11
11
  import * as yaml from 'yaml';
12
12
  import { Cron } from 'croner';
13
- import { getRoutinesDir, getSystemRoutinesDir, getRunsDir, ensureAgentsDir, getProjectRoutinesDir } from './state.js';
13
+ import { getRoutinesDir, getSystemRoutinesDir, getRunsDir, ensureAgentsDir, getProjectRoutinesDir } from '../state.js';
14
14
  import * as os from 'os';
15
- import { safeJoin, isSafeSegmentName } from './paths.js';
16
- import { isSafeProjectName, loadProjectDef, projectBasePath } from './projects.js';
17
- import { resolveRoutineExecutionContext, } from './routine-context.js';
18
- import { atomicWriteFileSync } from './fs-atomic.js';
19
- import { ALL_AGENT_IDS, ROUTINE_AGENT_IDS } from './agents.js';
20
- import { machineId, normalizeHost } from './machine-id.js';
21
- import { resolveActor } from './actor.js';
22
- import { percentile } from './percentile.js';
23
- import { enabledRoutineNames, replaceEnabledRoutines, routineEnabledOnThisDevice, setRoutineEnabledOnThisDevice, } from './routine-activation.js';
15
+ import { safeJoin, isSafeSegmentName } from '../paths.js';
16
+ import { isSafeProjectName, loadProjectDef, projectBasePath } from '../projects.js';
17
+ import { resolveRoutineExecutionContext, } from '../routine-context.js';
18
+ import { atomicWriteFileSync } from '../fs-atomic.js';
19
+ import { ALL_AGENT_IDS, ROUTINE_AGENT_IDS } from '../agents.js';
20
+ import { RUN_STRATEGIES } from '../accounting/rotate.js';
21
+ import { machineId, normalizeHost } from '../machine-id.js';
22
+ import { resolveActor } from '../actor.js';
23
+ import { percentile } from '../percentile.js';
24
+ import { enabledRoutineNames, devicesWithRoutineEnabled, replaceEnabledRoutines, routineEnabledOnThisDevice, setRoutineEnabledOnThisDevice, } from '../routine-activation.js';
25
+ import { humanizeCron, humanizeNextRun } from '../routines-format.js';
26
+ import { discoverProjectRoutines } from '../routines-project.js';
27
+ import { listProjectDefs } from '../projects.js';
28
+ import { monitorRunningJobs } from '../runner.js';
29
+ import { JobScheduler } from '../scheduler.js';
30
+ import { detectOverdueJobs } from '../overdue.js';
31
+ export function fireConditionLabel(job) {
32
+ if (job.schedule)
33
+ return humanizeCron(job.schedule, job.timezone);
34
+ if (job.trigger) {
35
+ if (job.trigger.type === 'github_event') {
36
+ const scope = job.trigger.repo
37
+ ? ` (${job.trigger.repo}${job.trigger.branch ? `@${job.trigger.branch}` : ''})`
38
+ : '';
39
+ const filters = [
40
+ job.trigger.action ? `action=${job.trigger.action}` : null,
41
+ job.trigger.label ? `label=${job.trigger.label}` : null,
42
+ ].filter(Boolean).join(', ');
43
+ return `on github:${job.trigger.event}${scope}${filters ? ` (${filters})` : ''}`;
44
+ }
45
+ const filters = [
46
+ job.trigger.action ? `action=${job.trigger.action}` : null,
47
+ job.trigger.teamKey ? `team=${job.trigger.teamKey}` : null,
48
+ job.trigger.label ? `label=${job.trigger.label}` : null,
49
+ job.trigger.stateTo ? `stateTo=${job.trigger.stateTo}` : null,
50
+ job.trigger.stateFrom ? `stateFrom=${job.trigger.stateFrom}` : null,
51
+ ].filter(Boolean).join(', ');
52
+ return `on linear:${job.trigger.event}${filters ? ` (${filters})` : ''}`;
53
+ }
54
+ return '-';
55
+ }
56
+ export function nextRunForDisplay(job, scheduler) {
57
+ if (isPastOneShotRoutine(job))
58
+ return null;
59
+ return scheduler.getNextRun(job.name);
60
+ }
61
+ export function nextRunLabel(job, scheduler, now) {
62
+ if (isPastOneShotRoutine(job))
63
+ return 'expired';
64
+ return humanizeNextRun(scheduler.getNextRun(job.name) ?? null, now, job.timezone);
65
+ }
66
+ export function localLatestRun(job) {
67
+ return jobRunsOnThisDevice(job) ? getLatestRun(job.name) : null;
68
+ }
69
+ export function listJobsForDisplay(cwd) {
70
+ const jobs = listJobs(cwd);
71
+ const seen = new Set(jobs.map((j) => j.name));
72
+ for (const discovered of discoverProjectRoutines()) {
73
+ if (seen.has(discovered.name))
74
+ continue;
75
+ seen.add(discovered.name);
76
+ jobs.push(discovered.config);
77
+ }
78
+ return jobs;
79
+ }
80
+ export function buildRoutineListJson() {
81
+ try {
82
+ monitorRunningJobs();
83
+ }
84
+ catch { /* best-effort orphan reap */ }
85
+ const jobs = listJobsForDisplay(process.cwd());
86
+ if (jobs.length === 0)
87
+ return [];
88
+ const scheduler = new JobScheduler(async () => { });
89
+ scheduler.loadAll();
90
+ try {
91
+ const overdueSet = new Set();
92
+ try {
93
+ for (const job of detectOverdueJobs())
94
+ overdueSet.add(job.name);
95
+ }
96
+ catch {
97
+ // Best-effort indicator; never block the list on detection errors.
98
+ }
99
+ const now = new Date();
100
+ const knownProjectNames = new Set(listProjectDefs().map((project) => project.name));
101
+ return jobs.map((job) => {
102
+ const latestRun = localLatestRun(job);
103
+ const enabledDevices = devicesWithRoutineEnabled(job.name);
104
+ return {
105
+ name: job.name,
106
+ agent: job.agent ?? null,
107
+ workflow: job.workflow ?? null,
108
+ command: job.command ?? null,
109
+ repo: job.repo ?? null,
110
+ schedule: job.schedule ?? null,
111
+ scheduleHuman: fireConditionLabel(job),
112
+ trigger: job.trigger ?? null,
113
+ timezone: job.timezone ?? null,
114
+ devices: enabledDevices,
115
+ enabledDevices,
116
+ host: job.host ?? null,
117
+ hostStrategy: resolveHostStrategy(job),
118
+ source: job.source ?? null,
119
+ sourceRepo: job.source?.repo ?? job.repo ?? null,
120
+ sourceBranch: job.source?.branch ?? null,
121
+ runOnce: Boolean(job.runOnce),
122
+ catchup: job.catchup !== false,
123
+ oneShot: isOneShotRoutine(job),
124
+ expired: isPastOneShotRoutine(job, now),
125
+ runsHere: jobRunsOnThisDevice(job),
126
+ enabled: job.enabled,
127
+ overdue: overdueSet.has(job.name),
128
+ nextRun: nextRunForDisplay(job, scheduler)?.toISOString() ?? null,
129
+ nextRunHuman: nextRunLabel(job, scheduler, now),
130
+ lastStatus: latestRun?.status ?? null,
131
+ exitCode: latestRun?.exitCode ?? null,
132
+ failureReason: latestRun?.errorMessage ?? null,
133
+ lastRunStartedAt: latestRun?.startedAt ?? null,
134
+ lastRunCompletedAt: latestRun?.completedAt ?? null,
135
+ projects: job.projects ?? [],
136
+ projectGroup: computeProjectGroup(job.projects, knownProjectNames),
137
+ };
138
+ });
139
+ }
140
+ finally {
141
+ scheduler.stopAll();
142
+ }
143
+ }
24
144
  export const HOST_STRATEGIES = ['local', 'host', 'fleet', 'cloud'];
25
145
  /** Canonical set of accepted GitHub trigger events — single source for validation. */
26
146
  export const GITHUB_TRIGGER_EVENTS = [
@@ -230,11 +350,18 @@ export function finalizeRunMeta(meta, status, exitCode, opts) {
230
350
  * `normalizeHost` so `Yosemite-S0`, `yosemite-s0.tailnet.ts.net`, and
231
351
  * `yosemite-s0` all agree. Every fire path (cron scheduler, webhook,
232
352
  * catchup/overdue, manual run) gates on this.
353
+ *
354
+ * A monitor-dispatched job ({@link JobConfig.dispatchedBy} `=== 'monitor'`) skips
355
+ * the routine activation manifest: it is not a routine, so its name can never be
356
+ * a member and the lookup could only ever answer "not activated here"
357
+ * (RUSH-2681). Its ownership was already decided by the monitor's `device:` pin.
233
358
  */
234
359
  export function jobRunsOnThisDevice(config) {
235
- const activated = routineEnabledOnThisDevice(config.name);
236
- if (activated !== null)
237
- return activated;
360
+ if (config.dispatchedBy !== 'monitor') {
361
+ const activated = routineEnabledOnThisDevice(config.name);
362
+ if (activated !== null)
363
+ return activated;
364
+ }
238
365
  const owner = routineOwnerDevice(config);
239
366
  // Unrestricted: no pin means fleet-wide by design (`watchdog`, `check-updates`).
240
367
  if (owner === null)
@@ -346,7 +473,7 @@ export function checkJobDeviceEligibility(config) {
346
473
  // refuse the run for exactly the same reason.
347
474
  const firstHost = routineOwnerDevice(config) ?? allowed[0] ?? 'HOST';
348
475
  const message = `Job '${config.name}' can only run on: ${allowedLabel}`;
349
- const suggestion = `agents routines run ${config.name} --host ${firstHost}`;
476
+ const suggestion = `agents routines run ${config.name} --device ${firstHost}`;
350
477
  return { message, suggestion, allowedLabel, firstHost };
351
478
  }
352
479
  /** Default values applied to every job config when fields are omitted. */
@@ -499,6 +626,18 @@ export function readJobFileResult(filePath) {
499
626
  && !Array.isArray(parsed.devices)) {
500
627
  return { config: null, problem: '`devices:` must be a list — routine is inert' };
501
628
  }
629
+ // Fail closed on `dispatchedBy`. It is a runtime-only marker set by
630
+ // lib/monitors/dispatch.ts on a job that has no definition file, and it makes
631
+ // `jobRunsOnThisDevice` SKIP this device's routine activation manifest. A
632
+ // routine YAML carrying it would therefore fire on every box regardless of
633
+ // activation, on every path (scheduler, overdue, webhook) — the same
634
+ // unrestricted-and-silent outcome the `devices:` guard above exists to
635
+ // prevent, and the daemon's load path never calls validateJob. It is never
636
+ // written back (writeJob deletes it), so its presence here means hand-authored
637
+ // state, not drift.
638
+ if (Object.prototype.hasOwnProperty.call(parsed, 'dispatchedBy')) {
639
+ return { config: null, problem: '`dispatchedBy:` is a runtime-only monitor marker, not a routine field — routine is inert' };
640
+ }
502
641
  return {
503
642
  config: {
504
643
  ...JOB_DEFAULTS,
@@ -556,6 +695,10 @@ export function writeJob(config) {
556
695
  if (output.catchup === true || output.catchup === undefined)
557
696
  delete output.catchup;
558
697
  delete output.devices;
698
+ // Runtime-only monitor marker — a definition on disk must never carry it (see
699
+ // the read-side guard in readJobFileResult), so strip it at the one schema
700
+ // boundary rather than trusting every caller.
701
+ delete output.dispatchedBy;
559
702
  // Persist projects in canonical form: deduplicated, first-seen order, field
560
703
  // omitted when nothing survives. This is the schema boundary, so a routine
561
704
  // written from any path (add, edit, enable/disable re-write) lands canonical
@@ -739,6 +882,17 @@ export function validateJob(config) {
739
882
  errors.push(`resume is only supported for agents with native --resume (${RESUMABLE_AGENTS.join(', ')}); got '${config.agent}'`);
740
883
  }
741
884
  }
885
+ if (config.strategy !== undefined) {
886
+ if (!RUN_STRATEGIES.includes(config.strategy)) {
887
+ errors.push(`strategy must be one of: ${RUN_STRATEGIES.join(', ')}`);
888
+ }
889
+ if (!hasAgent) {
890
+ errors.push('strategy only applies to agent routines (drop it for workflow/command routines)');
891
+ }
892
+ if (config.version) {
893
+ errors.push(`strategy ${config.strategy} conflicts with version ${config.version} — an exact pin leaves nothing to select; drop strategy or the version pin`);
894
+ }
895
+ }
742
896
  if (config.mode && !['plan', 'edit', 'auto', 'skip', 'full'].includes(config.mode)) {
743
897
  errors.push("mode must be plan, edit, auto, or skip ('full' accepted as alias for skip)");
744
898
  }
@@ -773,6 +927,11 @@ export function validateJob(config) {
773
927
  if (strategy === 'host' && (!config.host || config.host.trim() === '')) {
774
928
  errors.push("hostStrategy: host requires host: (set via --run-on or host: in YAML)");
775
929
  }
930
+ // `host: auto` is fire-time fleet placement (resolveDeviceAuto), never a
931
+ // literal SSH target — it is only meaningful under hostStrategy: fleet.
932
+ if (config.host === 'auto' && strategy !== 'fleet') {
933
+ errors.push("host: auto requires hostStrategy: fleet (set via --run-on auto) — 'auto' is a fire-time device pick, not a machine name");
934
+ }
776
935
  // Remote placement (host/fleet/cloud) can't carry workflow/loop/command yet —
777
936
  // those live on the firing machine.
778
937
  if (strategy === 'host' || strategy === 'fleet' || strategy === 'cloud') {
@@ -1439,7 +1439,7 @@ export async function ensureAgentRunning(timeoutMs = 5000) {
1439
1439
  // hosts it and it holds no unlocks. Evicting a daemon-hosted broker orphans
1440
1440
  // the daemon's socket and starts the Touch ID storm — see
1441
1441
  // shouldClientEvictSkewedBroker.
1442
- const { isDaemonRunning } = await import('../daemon.js');
1442
+ const { isDaemonRunning } = await import('../daemon/daemon.js');
1443
1443
  if (!shouldClientEvictSkewedBroker(isDaemonRunning(), (await agentStatus()).length))
1444
1444
  return true;
1445
1445
  await teardownStaleBroker();
@@ -1454,7 +1454,7 @@ export async function ensureAgentRunning(timeoutMs = 5000) {
1454
1454
  // backbone rather than a separate launchd service. If bringing the daemon up
1455
1455
  // makes the broker answer, we're done.
1456
1456
  try {
1457
- const { ensureDaemonStarted } = await import('../daemon.js');
1457
+ const { ensureDaemonStarted } = await import('../daemon/daemon.js');
1458
1458
  if (ensureDaemonStarted()) {
1459
1459
  const d0 = Date.now() + timeoutMs;
1460
1460
  while (Date.now() < d0) {
@@ -33,7 +33,7 @@
33
33
  * underlying resolve emits its own `secrets.get`.
34
34
  * - `secrets.view` — a bundle's (masked) metadata was inspected via `view`.
35
35
  */
36
- import { emit } from '../events.js';
36
+ import { emit } from '../feed/events.js';
37
37
  import { recordSecretUsage } from './usage-db.js';
38
38
  /**
39
39
  * Map each audit event onto the usage-DB kind it is counted as. `secrets.get` is
@@ -14,7 +14,7 @@
14
14
  * bytes land. A file-backed bundle is discovered by the presence of its
15
15
  * metadata item in the file store.
16
16
  * - `vault`: a single age-encrypted ~/.agents/vault.age file unlocked by
17
- * `agents login`; intended for user-managed cross-machine file sync.
17
+ * `agents secrets vault unlock`; intended for user-managed cross-machine file sync.
18
18
  *
19
19
  * Server-backed cross-machine sync is handled by src/lib/secrets/sync.ts via
20
20
  * an explicit encrypted export/import flow; the bundle layer also supports the
@@ -281,13 +281,13 @@ export declare function filterAgentHitBySubsetAndExpiry(hit: {
281
281
  env: Record<string, string>;
282
282
  };
283
283
  /**
284
- * Guard for remote-bundle callers (`bundle@host` / `--host`) — the SSH
284
+ * Guard for remote-bundle callers (`bundle@host` / `--device`) — the SSH
285
285
  * resolver in `remoteResolveEnv` does not thread --keys or --allow-expired
286
286
  * yet. Silently applying them would inject the full remote env or an expired
287
287
  * value, defeating the least-privilege intent, so we fail loud.
288
288
  *
289
289
  * Exported so `agents run --secrets bundle@host` and `agents secrets exec
290
- * --host` share the exact same error text; the tests exercise this helper
290
+ * --device` share the exact same error text; the tests exercise this helper
291
291
  * directly instead of driving the whole CLI.
292
292
  */
293
293
  export declare function assertRemoteBundleFlagsUnsupported(bundleName: string, host: string, opts: {
@@ -305,7 +305,7 @@ export declare function resolveBundleEnv(bundle: SecretsBundle, _opts?: ResolveB
305
305
  * path in index.ts can share it without a bundles↔index import cycle. See that
306
306
  * module for the full contract.
307
307
  */
308
- export { isHeadlessSecretsContext } from './headless.js';
308
+ export { isHeadlessSecretsContext, isAgentInvocationContext } from './headless.js';
309
309
  /**
310
310
  * Read a bundle's metadata AND resolve its env in a single Touch ID prompt.
311
311
  *
@@ -14,7 +14,7 @@
14
14
  * bytes land. A file-backed bundle is discovered by the presence of its
15
15
  * metadata item in the file store.
16
16
  * - `vault`: a single age-encrypted ~/.agents/vault.age file unlocked by
17
- * `agents login`; intended for user-managed cross-machine file sync.
17
+ * `agents secrets vault unlock`; intended for user-managed cross-machine file sync.
18
18
  *
19
19
  * Server-backed cross-machine sync is handled by src/lib/secrets/sync.ts via
20
20
  * an explicit encrypted export/import flow; the bundle layer also supports the
@@ -27,7 +27,7 @@ import * as yaml from 'yaml';
27
27
  import { deleteKeychainToken, getKeychainToken, getKeychainTokens, hasKeychainToken, isKeychainBackendOverridden, keychainServiceAlias, keychainUsesFileFallback, listKeychainItems, parseBundleValue, resolveRef, secretsKeychainItem, setKeychainToken, } from './index.js';
28
28
  import { fileStore } from './filestore.js';
29
29
  import { getVaultSession, vaultDeleteItem, vaultExists, vaultGetItems, vaultGetItem, vaultHasItem, vaultListItems, vaultSetItems, vaultSetItem, } from './vault.js';
30
- import { emit } from '../events.js';
30
+ import { emit } from '../feed/events.js';
31
31
  import { emitSecretAudit } from './audit.js';
32
32
  import { readMeta, getHelpersDir } from '../state.js';
33
33
  import { assertNameActiveInResourceProfile, filterNamesForActiveResourceProfile } from '../resource-profiles.js';
@@ -111,7 +111,7 @@ export function bundleBackend(name) {
111
111
  function assertVaultBackendUsable(name) {
112
112
  if (getVaultSession().loggedIn)
113
113
  return;
114
- throw new Error(`Synced bundle '${name}' needs an active login. Run: agents login`);
114
+ throw new Error(`Synced bundle '${name}' needs an active login. Run: agents secrets vault unlock`);
115
115
  }
116
116
  /** Allowed values for a secret's `type` metadata field. */
117
117
  export const SECRET_TYPES = [
@@ -280,7 +280,7 @@ export function readBundle(name) {
280
280
  throw new BundleUndecryptableError(`Bundle '${name}': failed to decrypt — wrong AGENTS_SECRETS_PASSPHRASE or tampered file store. (${err.message})`);
281
281
  }
282
282
  if (vaultExists() && !getVaultSession().loggedIn) {
283
- throw new Error(`Synced secrets are locked. Run: agents login`);
283
+ throw new Error(`Synced secrets are locked. Run: agents secrets vault unlock`);
284
284
  }
285
285
  // Distinguish a genuinely-absent bundle from a present-but-unreadable one
286
286
  // (a locked login keychain, or a legacy ACL'd metadata item before first
@@ -1065,13 +1065,13 @@ export function filterAgentHitBySubsetAndExpiry(hit, opts) {
1065
1065
  return { bundle: hit.bundle, env };
1066
1066
  }
1067
1067
  /**
1068
- * Guard for remote-bundle callers (`bundle@host` / `--host`) — the SSH
1068
+ * Guard for remote-bundle callers (`bundle@host` / `--device`) — the SSH
1069
1069
  * resolver in `remoteResolveEnv` does not thread --keys or --allow-expired
1070
1070
  * yet. Silently applying them would inject the full remote env or an expired
1071
1071
  * value, defeating the least-privilege intent, so we fail loud.
1072
1072
  *
1073
1073
  * Exported so `agents run --secrets bundle@host` and `agents secrets exec
1074
- * --host` share the exact same error text; the tests exercise this helper
1074
+ * --device` share the exact same error text; the tests exercise this helper
1075
1075
  * directly instead of driving the whole CLI.
1076
1076
  */
1077
1077
  export function assertRemoteBundleFlagsUnsupported(bundleName, host, opts, flagLabels) {
@@ -1211,7 +1211,7 @@ export function resolveBundleEnv(bundle, _opts = {}) {
1211
1211
  * path in index.ts can share it without a bundles↔index import cycle. See that
1212
1212
  * module for the full contract.
1213
1213
  */
1214
- export { isHeadlessSecretsContext } from './headless.js';
1214
+ export { isHeadlessSecretsContext, isAgentInvocationContext } from './headless.js';
1215
1215
  /**
1216
1216
  * Read a bundle's metadata AND resolve its env in a single Touch ID prompt.
1217
1217
  *
@@ -1365,7 +1365,7 @@ export function readAndResolveBundleEnv(name, opts = {}) {
1365
1365
  const json = metaFetched.get(metaItem);
1366
1366
  if (json === undefined) {
1367
1367
  if (vaultExists() && !getVaultSession().loggedIn) {
1368
- throw new Error(`Synced secrets are locked. Run: agents login`);
1368
+ throw new Error(`Synced secrets are locked. Run: agents secrets vault unlock`);
1369
1369
  }
1370
1370
  throw new Error(`Secrets bundle '${name}' not found.`);
1371
1371
  }
@@ -25,3 +25,19 @@
25
25
  * the per-caller broker-only pattern used across the headless secrets readers.
26
26
  */
27
27
  export declare function isHeadlessSecretsContext(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): boolean;
28
+ /**
29
+ * True when this process runs structurally inside a coding-agent session: any
30
+ * `agents run` launch (AGENTS_RUNTIME / AGENT_SESSION_ID ride the child env —
31
+ * exec.ts buildExecEnv — and are inherited by every shell the agent spawns), or
32
+ * a harness's own tool shell launched outside agents-cli (Claude Code stamps
33
+ * CLAUDECODE on its Bash tool).
34
+ *
35
+ * Distinct from isHeadlessSecretsContext above on both axes: it is
36
+ * platform-independent (no biometry involved), and a TTY does not clear it (an
37
+ * agent inside tmux has one). Its job is the materialization boundary, not the
38
+ * prompt boundary: a command that would PRINT a plaintext value refuses under
39
+ * an agent, because anything printed lands in the agent's context and session
40
+ * transcript. The agent path to secret values is injection — `secrets exec`,
41
+ * `run --secrets` — which places them only in a child process env.
42
+ */
43
+ export declare function isAgentInvocationContext(env?: NodeJS.ProcessEnv): boolean;
@@ -33,3 +33,24 @@ export function isHeadlessSecretsContext(env = process.env, platform = process.p
33
33
  return true;
34
34
  return false;
35
35
  }
36
+ /**
37
+ * True when this process runs structurally inside a coding-agent session: any
38
+ * `agents run` launch (AGENTS_RUNTIME / AGENT_SESSION_ID ride the child env —
39
+ * exec.ts buildExecEnv — and are inherited by every shell the agent spawns), or
40
+ * a harness's own tool shell launched outside agents-cli (Claude Code stamps
41
+ * CLAUDECODE on its Bash tool).
42
+ *
43
+ * Distinct from isHeadlessSecretsContext above on both axes: it is
44
+ * platform-independent (no biometry involved), and a TTY does not clear it (an
45
+ * agent inside tmux has one). Its job is the materialization boundary, not the
46
+ * prompt boundary: a command that would PRINT a plaintext value refuses under
47
+ * an agent, because anything printed lands in the agent's context and session
48
+ * transcript. The agent path to secret values is injection — `secrets exec`,
49
+ * `run --secrets` — which places them only in a child process env.
50
+ */
51
+ export function isAgentInvocationContext(env = process.env) {
52
+ return Boolean(env.AGENTS_RUNTIME ||
53
+ env.AGENT_SESSION_ID ||
54
+ env.AGENTS_SESSION_ID ||
55
+ env.CLAUDECODE);
56
+ }
@@ -73,7 +73,7 @@ function spawnKeychainHelper(bin, args, opts, timeoutMs) {
73
73
  if (keychainDaemonBootEnabled && !keychainDaemonBootAttempted) {
74
74
  keychainDaemonBootAttempted = true;
75
75
  // Fire-and-forget: daemon start must not block the foreground secrets op.
76
- import('../daemon.js')
76
+ import('../daemon/daemon.js')
77
77
  .then(({ ensureDaemonStarted }) => ensureDaemonStarted())
78
78
  .catch(() => { });
79
79
  }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Filters for `agents secrets list`.
3
3
  *
4
- * The listing had no filtering at all: `--host`/`--device` pick a machine and
4
+ * The listing had no filtering at all: `--device`/`--device` pick a machine and
5
5
  * `--json` picks a format, but nothing selected over the bundles themselves. On
6
6
  * a fleet with fifty-odd bundles the answerable questions — which ones read with
7
7
  * no Touch ID at all, which hold a raw literal, which have already expired, what
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Filters for `agents secrets list`.
3
3
  *
4
- * The listing had no filtering at all: `--host`/`--device` pick a machine and
4
+ * The listing had no filtering at all: `--device`/`--device` pick a machine and
5
5
  * `--json` picks a format, but nothing selected over the bundles themselves. On
6
6
  * a fleet with fifty-odd bundles the answerable questions — which ones read with
7
7
  * no Touch ID at all, which hold a raw literal, which have already expired, what
@@ -17,7 +17,7 @@
17
17
  * unknown value is a loud error naming the valid set (never a silent ignore),
18
18
  * and every axis narrows independently so they AND-compose.
19
19
  */
20
- import { parseCommaSeparatedList } from '../../commands/utils.js';
20
+ import { parseCommaSeparatedList } from '../format.js';
21
21
  // From the leaf module, NOT discover.js — the latter imports `../sqlite.js`, so
22
22
  // reaching through it for one parser would pull node:sqlite into every `agents
23
23
  // secrets` invocation and print Node's SQLite ExperimentalWarning on stderr.
@@ -31,7 +31,7 @@ export interface PushBundleOptions {
31
31
  * what pushed operators toward exporting the master key fleet-wide (RUSH-1968).
32
32
  */
33
33
  passphrase?: string;
34
- /** Label for the audit trail — `export --host` vs `fleet apply`. */
34
+ /** Label for the audit trail — `export --device` vs `fleet apply`. */
35
35
  operation: string;
36
36
  /** Preserve an automation account's permanent prompt-free policy remotely. */
37
37
  policyNever?: boolean;