@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
@@ -17,6 +17,10 @@ import { safeJoin } from './paths.js';
17
17
  import { agentConfigDirName } from './agents.js';
18
18
  import { supports } from './capabilities.js';
19
19
  import { updateGeminiSettings } from './gemini-settings.js';
20
+ // The canonical<->native tool vocabularies live in the registry, which also owns
21
+ // the reverse projections — so the serializers below and the readers there can
22
+ // never disagree about what `fs_read` or `developer__shell` means.
23
+ import { ANTIGRAVITY_ACTION_BY_TOOL, CANONICAL_TO_OPENCLAW_TOOL, stripJsonComments, GROK_TOOL_BY_CANONICAL, KIRO_CAPABILITY_BY_TOOL, PERMISSION_TARGETS, readCanonicalPermissions, } from './permissions-registry.js';
20
24
  const HOME = os.homedir();
21
25
  // PERMISSIONS_CAPABLE_AGENTS removed — use `capableAgents('allowlist')`
22
26
  // from lib/capabilities.ts. The capability matrix on AgentConfig is the
@@ -622,19 +626,6 @@ export function convertToDroidFormat(set) {
622
626
  commandDenylist: commands(set.deny ?? []),
623
627
  };
624
628
  }
625
- /**
626
- * Canonical tool -> OpenClaw tool id. OpenClaw gates at TOOL granularity only
627
- * (no sub-command/path/domain patterns), so only these whole-tool ids exist.
628
- * Any canonical tool not in this map is unsupported and skipped.
629
- */
630
- const CANONICAL_TO_OPENCLAW_TOOL = {
631
- bash: 'exec',
632
- read: 'read',
633
- write: 'write',
634
- edit: 'write',
635
- webfetch: 'web_fetch',
636
- websearch: 'web_search',
637
- };
638
629
  /**
639
630
  * Convert canonical permission set to OpenClaw's `tools.alsoAllow`/`tools.deny`.
640
631
  *
@@ -740,55 +731,6 @@ function serializeAntigravityEntries(perms) {
740
731
  }
741
732
  return Array.from(out);
742
733
  }
743
- const ANTIGRAVITY_ACTION_BY_TOOL = {
744
- bash: 'command',
745
- read: 'read_file',
746
- write: 'write_file',
747
- webfetch: 'read_url',
748
- };
749
- const GOOSE_TOOL_BY_CANONICAL = {
750
- bash: 'developer__shell',
751
- read: 'developer__text_editor',
752
- write: 'developer__text_editor',
753
- edit: 'developer__text_editor',
754
- grep: 'developer__analyze',
755
- glob: 'developer__analyze',
756
- webfetch: 'developer__fetch',
757
- mcp: undefined,
758
- };
759
- function canonicalToGooseTool(permission) {
760
- if (BLANKET_BASH_FORMS.has(permission))
761
- return 'developer__shell';
762
- const parsed = parseCanonicalPattern(permission);
763
- if (!parsed)
764
- return null;
765
- return GOOSE_TOOL_BY_CANONICAL[parsed.tool] ?? null;
766
- }
767
- /** Convert canonical permissions to Goose's per-tool permission.yaml shape. */
768
- export function convertToGooseFormat(set) {
769
- const alwaysAllow = new Set();
770
- const neverAllow = new Set();
771
- for (const permission of set.allow) {
772
- const tool = canonicalToGooseTool(permission);
773
- if (tool)
774
- alwaysAllow.add(tool);
775
- }
776
- for (const permission of set.deny ?? []) {
777
- const tool = canonicalToGooseTool(permission);
778
- if (tool)
779
- neverAllow.add(tool);
780
- }
781
- for (const tool of neverAllow) {
782
- alwaysAllow.delete(tool);
783
- }
784
- return {
785
- user: {
786
- always_allow: Array.from(alwaysAllow).sort(),
787
- ask_before: [],
788
- never_allow: Array.from(neverAllow).sort(),
789
- },
790
- };
791
- }
792
734
  /**
793
735
  * Convert canonical permission set to Grok format.
794
736
  * Grok reads ~/.grok/config.toml with
@@ -813,13 +755,6 @@ export function convertToGrokFormat(set) {
813
755
  }
814
756
  return { permission: { rules } };
815
757
  }
816
- const GROK_TOOL_BY_CANONICAL = {
817
- bash: 'bash',
818
- read: 'read',
819
- write: 'edit',
820
- grep: 'grep',
821
- webfetch: 'webfetch',
822
- };
823
758
  function canonicalToGrokRule(perm, action) {
824
759
  if (BLANKET_BASH_FORMS.has(perm)) {
825
760
  return { action, tool: 'bash', pattern: '*' };
@@ -873,20 +808,6 @@ function canonicalToKiroRule(perm, effect) {
873
808
  : parsed.pattern;
874
809
  return { capability, effect, match: [pattern] };
875
810
  }
876
- const KIRO_CAPABILITY_BY_TOOL = {
877
- bash: 'shell',
878
- read: 'fs_read',
879
- grep: 'fs_read',
880
- glob: 'fs_read',
881
- write: 'fs_write',
882
- edit: 'fs_write',
883
- notebookedit: 'fs_write',
884
- webfetch: 'web_fetch',
885
- websearch: 'web_search',
886
- mcp: 'mcp',
887
- subagent: 'subagent',
888
- skill: 'skill',
889
- };
890
811
  /**
891
812
  * Parse a canonical permission string preserving the tool's original casing.
892
813
  * `parseCanonicalPattern` lowercases the tool name, which is fine for Grok
@@ -1100,56 +1021,6 @@ export function convertToCodexFormat(set, cwd) {
1100
1021
  // ============================================================================
1101
1022
  // Read agent permissions from native configs
1102
1023
  // ============================================================================
1103
- /**
1104
- * Strip JSON comments for JSONC parsing.
1105
- */
1106
- function stripJsonComments(content) {
1107
- let result = '';
1108
- let inString = false;
1109
- let escape = false;
1110
- let i = 0;
1111
- while (i < content.length) {
1112
- const char = content[i];
1113
- const next = content[i + 1];
1114
- if (escape) {
1115
- result += char;
1116
- escape = false;
1117
- i++;
1118
- continue;
1119
- }
1120
- if (char === '\\' && inString) {
1121
- result += char;
1122
- escape = true;
1123
- i++;
1124
- continue;
1125
- }
1126
- if (char === '"') {
1127
- inString = !inString;
1128
- result += char;
1129
- i++;
1130
- continue;
1131
- }
1132
- if (!inString) {
1133
- if (char === '/' && next === '/') {
1134
- while (i < content.length && content[i] !== '\n') {
1135
- i++;
1136
- }
1137
- continue;
1138
- }
1139
- if (char === '/' && next === '*') {
1140
- i += 2;
1141
- while (i < content.length && !(content[i] === '*' && content[i + 1] === '/')) {
1142
- i++;
1143
- }
1144
- i += 2;
1145
- continue;
1146
- }
1147
- }
1148
- result += char;
1149
- i++;
1150
- }
1151
- return result;
1152
- }
1153
1024
  /**
1154
1025
  * Read Claude's current permissions from settings.json.
1155
1026
  */
@@ -1238,7 +1109,17 @@ function readCodexPermissions(scope = 'user', cwd, options) {
1238
1109
  }
1239
1110
  }
1240
1111
  /**
1241
- * Read agent permissions based on agent ID.
1112
+ * Read an agent's currently installed permissions.
1113
+ *
1114
+ * claude/opencode/codex return their NATIVE shape, because `agents permissions
1115
+ * list` renders those three specially — Codex especially, whose config records a
1116
+ * sandbox mode rather than a rule list, so its own fields say more than the
1117
+ * blanket grants that mode widens into.
1118
+ *
1119
+ * Every other allowlist-capable harness returns the canonical `PermissionSet`
1120
+ * that `PERMISSION_TARGETS` reads back. Before RUSH-2676 they returned `null`,
1121
+ * so permissions written for cursor, antigravity, grok, kimi, droid,
1122
+ * copilot, kiro, openclaw and hermes were reported as absent.
1242
1123
  */
1243
1124
  export function readAgentPermissions(agentId, scope = 'user', cwd, options) {
1244
1125
  switch (agentId) {
@@ -1249,7 +1130,7 @@ export function readAgentPermissions(agentId, scope = 'user', cwd, options) {
1249
1130
  case 'codex':
1250
1131
  return readCodexPermissions(scope, cwd, options);
1251
1132
  default:
1252
- return null;
1133
+ return readCanonicalPermissions(agentId, scope, cwd, options?.home);
1253
1134
  }
1254
1135
  }
1255
1136
  // ============================================================================
@@ -1582,47 +1463,6 @@ export function applyPermissionsToVersion(agentId, set, versionHome, merge = tru
1582
1463
  fs.writeFileSync(configPath, TOML.stringify(config), 'utf-8');
1583
1464
  return { success: true };
1584
1465
  }
1585
- if (agentId === 'goose') {
1586
- const permissionsPath = path.join(versionHome, '.config', 'goose', 'permission.yaml');
1587
- let config = {};
1588
- if (fs.existsSync(permissionsPath)) {
1589
- const parsed = yaml.parse(fs.readFileSync(permissionsPath, 'utf-8'));
1590
- if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
1591
- config = parsed;
1592
- }
1593
- }
1594
- const converted = convertToGooseFormat(set).user;
1595
- const user = (typeof config.user === 'object' && config.user !== null && !Array.isArray(config.user))
1596
- ? config.user
1597
- : {};
1598
- const currentAlways = Array.isArray(user.always_allow) ? user.always_allow.filter((v) => typeof v === 'string') : [];
1599
- const currentAsk = Array.isArray(user.ask_before) ? user.ask_before.filter((v) => typeof v === 'string') : [];
1600
- const currentNever = Array.isArray(user.never_allow) ? user.never_allow.filter((v) => typeof v === 'string') : [];
1601
- if (merge) {
1602
- const incomingAlways = new Set(converted.always_allow);
1603
- const incomingNever = new Set(converted.never_allow);
1604
- const touched = new Set([...incomingAlways, ...incomingNever]);
1605
- const always = new Set(currentAlways.filter(tool => !touched.has(tool)));
1606
- const ask = new Set(currentAsk.filter(tool => !touched.has(tool)));
1607
- const never = new Set(currentNever.filter(tool => !touched.has(tool)));
1608
- for (const tool of incomingAlways)
1609
- always.add(tool);
1610
- for (const tool of incomingNever)
1611
- never.add(tool);
1612
- user.always_allow = Array.from(always).sort();
1613
- user.ask_before = Array.from(ask).sort();
1614
- user.never_allow = Array.from(never).sort();
1615
- }
1616
- else {
1617
- user.always_allow = converted.always_allow;
1618
- user.ask_before = converted.ask_before;
1619
- user.never_allow = converted.never_allow;
1620
- }
1621
- config.user = user;
1622
- fs.mkdirSync(path.dirname(permissionsPath), { recursive: true });
1623
- fs.writeFileSync(permissionsPath, yaml.stringify(config), 'utf-8');
1624
- return { success: true };
1625
- }
1626
1466
  if (agentId === 'kimi') {
1627
1467
  const configPath = path.join(versionHome, '.kimi-code', 'config.toml');
1628
1468
  let config = {};
@@ -1918,109 +1758,50 @@ export function codexToCanonical(perms) {
1918
1758
  };
1919
1759
  }
1920
1760
  /**
1921
- * Export agent's current permissions to canonical format.
1761
+ * Export permissions from a specific config file path to canonical format,
1762
+ * auto-detecting the harness from the path.
1763
+ *
1764
+ * Detection walks `PERMISSION_TARGETS` and matches each harness's own declared
1765
+ * filename + parent directory, so it covers all 13 rather than the three
1766
+ * hardcoded `.claude`/`.opencode`/`.codex` fragments it used to know about.
1922
1767
  */
1923
- function exportAgentPermissions(agentId, scope = 'user', cwd) {
1924
- const perms = readAgentPermissions(agentId, scope, cwd);
1925
- if (!perms)
1768
+ export function exportPermissionsFromPath(filePath) {
1769
+ if (!fs.existsSync(filePath))
1926
1770
  return null;
1927
- switch (agentId) {
1928
- case 'claude':
1929
- return claudeToCanonical(perms);
1930
- case 'opencode':
1931
- return openCodeToCanonical(perms);
1932
- case 'codex':
1933
- return codexToCanonical(perms);
1934
- default:
1935
- return null;
1936
- }
1771
+ const agentId = detectPermissionAgentFromPath(filePath);
1772
+ if (!agentId)
1773
+ return null;
1774
+ return PERMISSION_TARGETS[agentId].toCanonical(filePath);
1937
1775
  }
1938
1776
  /**
1939
- * Export permissions from a specific config file path to canonical format.
1940
- * Auto-detects agent type from file path/name.
1777
+ * Which harness owns `filePath`, by comparing against the trailing path segments
1778
+ * each registry target declares. Longer (more specific) suffixes win, so
1779
+ * `.kiro/settings/permissions.yaml` is never mistaken for a bare `permissions.yaml`.
1941
1780
  */
1942
- export function exportPermissionsFromPath(filePath) {
1943
- if (!fs.existsSync(filePath)) {
1944
- return null;
1945
- }
1946
- const content = fs.readFileSync(filePath, 'utf-8');
1947
- const fileName = path.basename(filePath);
1948
- const parentDir = path.basename(path.dirname(filePath));
1949
- // Detect agent type from path
1950
- let agentId = null;
1951
- if (fileName === 'settings.json' && parentDir === '.claude') {
1952
- agentId = 'claude';
1953
- }
1954
- else if (fileName === 'opencode.jsonc' || fileName === 'opencode.json' || parentDir === 'opencode' || parentDir === '.opencode') {
1955
- agentId = 'opencode';
1956
- }
1957
- else if (fileName === 'config.toml' && parentDir === '.codex') {
1958
- agentId = 'codex';
1959
- }
1960
- else if (filePath.includes('.claude')) {
1961
- agentId = 'claude';
1962
- }
1963
- else if (filePath.includes('.opencode')) {
1964
- agentId = 'opencode';
1965
- }
1966
- else if (filePath.includes('.codex')) {
1967
- agentId = 'codex';
1968
- }
1969
- if (!agentId) {
1970
- return null;
1971
- }
1972
- try {
1973
- switch (agentId) {
1974
- case 'claude': {
1975
- const config = JSON.parse(content);
1976
- if (config.permissions) {
1977
- return claudeToCanonical({
1978
- permissions: {
1979
- allow: config.permissions.allow || [],
1980
- deny: config.permissions.deny || [],
1981
- },
1982
- });
1983
- }
1984
- return null;
1985
- }
1986
- case 'opencode': {
1987
- // Strip JSONC comments
1988
- const jsonContent = content.replace(/\/\/.*$/gm, '').replace(/\/\*[\s\S]*?\*\//g, '');
1989
- const config = JSON.parse(jsonContent);
1990
- if (config.permission) {
1991
- return openCodeToCanonical({
1992
- permission: {
1993
- bash: config.permission.bash || {},
1994
- },
1995
- });
1996
- }
1997
- return null;
1998
- }
1999
- case 'codex': {
2000
- const config = TOML.parse(content);
2001
- const perms = {};
2002
- if (config.approval_policy) {
2003
- perms.approval_policy = config.approval_policy;
2004
- }
2005
- if (config.sandbox_mode) {
2006
- perms.sandbox_mode = config.sandbox_mode;
2007
- }
2008
- if (config.sandbox_workspace_write) {
2009
- const sw = config.sandbox_workspace_write;
2010
- perms.sandbox_workspace_write = {
2011
- network_access: sw.network_access,
2012
- writable_roots: sw.writable_roots,
2013
- };
2014
- }
2015
- return codexToCanonical(perms);
1781
+ export function detectPermissionAgentFromPath(filePath) {
1782
+ const normalized = path.resolve(filePath).split(path.sep).join('/');
1783
+ let best = null;
1784
+ for (const [agent, target] of Object.entries(PERMISSION_TARGETS)) {
1785
+ const agentId = agent;
1786
+ // `altSuffixes` first: home()/project() may probe the filesystem to choose
1787
+ // between accepted spellings, and with an empty root that probe resolves
1788
+ // against process.cwd() -- so detection must not depend on it.
1789
+ const candidates = [
1790
+ ...(target.altSuffixes ?? []),
1791
+ target.home(''),
1792
+ ...(target.project ? [target.project('')] : []),
1793
+ ];
1794
+ for (const candidate of candidates) {
1795
+ const suffix = candidate.split(path.sep).join('/').replace(/^\/+/, '');
1796
+ if (!suffix)
1797
+ continue;
1798
+ if (normalized === suffix || normalized.endsWith(`/${suffix}`)) {
1799
+ if (!best || suffix.length > best.length)
1800
+ best = { agentId, length: suffix.length };
2016
1801
  }
2017
- default:
2018
- return null;
2019
1802
  }
2020
1803
  }
2021
- catch {
2022
- return null;
2023
- }
1804
+ return best?.agentId ?? null;
2024
1805
  }
2025
1806
  /**
2026
1807
  * Save a permission set to central storage.
@@ -26,7 +26,21 @@ export interface PickerConfig<T> {
26
26
  filter: (query: string) => Array<T | Separator>;
27
27
  labelFor: (item: T, query: string) => string;
28
28
  buildPreview?: (item: T) => string;
29
+ /**
30
+ * Called once with a repaint trigger for the open prompt. An async preview
31
+ * source (e.g. a remote row's digest arriving over SSH) invokes the trigger
32
+ * when data `buildPreview` reported as pending is now ready, so the pane
33
+ * refreshes without a keypress. The trigger is inert after the prompt closes.
34
+ */
35
+ registerPreviewRepaint?: (repaint: () => void) => void;
29
36
  shortIdFor?: (item: T) => string;
37
+ /**
38
+ * Prefix each selectable row with its 1-based position in the current
39
+ * filtered list (` 1.`, ` 12.`), right-aligned so the labels stay columnar
40
+ * and a user scanning a long list can tell where they are. Separators are
41
+ * never numbered.
42
+ */
43
+ numbered?: boolean;
30
44
  pageSize?: number;
31
45
  initialSearch?: string;
32
46
  emptyMessage?: string;
@@ -120,6 +134,8 @@ export interface DynamicPickerConfig<T, F, A = never> {
120
134
  /** Client-side text filter over the loaded pool (the `S` search). */
121
135
  matches?: (item: T, query: string) => boolean;
122
136
  buildPreview?: (item: T) => string;
137
+ /** See {@link PickerConfig.registerPreviewRepaint}. */
138
+ registerPreviewRepaint?: (repaint: () => void) => void;
123
139
  /** Dim summary of the current filter state, rendered in the header. */
124
140
  headerFor?: (filter: F) => string;
125
141
  /** The hotkey-legend help line; receives the mode so it can adapt. */
@@ -136,12 +136,35 @@ export function itemPicker(config) {
136
136
  const [status, setStatus] = useState('idle');
137
137
  const [searchTerm, setSearchTerm] = useState(cfg.initialSearch ?? '');
138
138
  const [previewOpen, setPreviewOpen] = useState(Boolean(cfg.buildPreview));
139
+ // An async preview source repaints the pane by bumping this nonce; the
140
+ // counter lives in a ref because the trigger closure would otherwise hold a
141
+ // stale value and the second repaint would silently no-op (the same
142
+ // stale-closure trap dynamicPicker's reloadNonce documents).
143
+ const [, setPreviewNonce] = useState(0);
144
+ const previewNonce = useRef(0);
145
+ useEffect(() => {
146
+ cfg.registerPreviewRepaint?.(() => setPreviewNonce((previewNonce.current += 1)));
147
+ }, []);
139
148
  const prefix = usePrefix({ status, theme });
140
149
  const results = useMemo(() => {
141
150
  const filtered = cfg.filter(searchTerm).slice(0, 50);
142
- return filtered.map((item) => Separator.isSeparator(item)
143
- ? item
144
- : { value: item, label: cfg.labelFor(item, searchTerm) });
151
+ // Ordinals count only selectable rows, in filtered order, and are padded
152
+ // to the widest index so single- and double-digit rows stay aligned.
153
+ const selectableCount = filtered.filter((it) => !Separator.isSeparator(it)).length;
154
+ const ordinalWidth = String(Math.max(1, selectableCount)).length;
155
+ let ordinal = 0;
156
+ return filtered.map((item) => {
157
+ if (Separator.isSeparator(item))
158
+ return item;
159
+ const label = cfg.labelFor(item, searchTerm);
160
+ if (!cfg.numbered)
161
+ return { value: item, label };
162
+ ordinal += 1;
163
+ return {
164
+ value: item,
165
+ label: `${chalk.gray(`${String(ordinal).padStart(ordinalWidth)}.`)} ${label}`,
166
+ };
167
+ });
145
168
  }, [searchTerm]);
146
169
  // A row is selectable unless it is a divider (Separator). Navigation and the
147
170
  // initial cursor skip dividers, and enter never resolves one.
@@ -472,6 +495,13 @@ export function dynamicPicker(config) {
472
495
  // changed) can keep the cursor where the user left it. Snapping back to the
473
496
  // top every time you star a row would make the key unusable for a second one.
474
497
  const loadedFilter = useRef(undefined);
498
+ // Async preview repaint — same ref-counter shape as reloadNonce above, but
499
+ // it only re-renders (buildPreview runs in render) without re-running load.
500
+ const [, setPreviewNonce] = useState(0);
501
+ const previewNonce = useRef(0);
502
+ useEffect(() => {
503
+ cfg.registerPreviewRepaint?.(() => setPreviewNonce((previewNonce.current += 1)));
504
+ }, []);
475
505
  useEffect(() => {
476
506
  const my = ++gen.current;
477
507
  const filterChanged = loadedFilter.current !== filter;
@@ -2,7 +2,7 @@
2
2
  * Placement — one model for "where does the body run?"
3
3
  *
4
4
  * The CLI grew several doors that all mean execution target:
5
- * run --host / --device / --lease / --box / --cloud
5
+ * run --device / --lease / --box / --cloud
6
6
  * routines --placement / --run-on / hostStrategy
7
7
  * monitors --run-on (body) vs --device (owner — NOT placement)
8
8
  * teams --device (teammate pin)
@@ -2,7 +2,7 @@
2
2
  * Placement — one model for "where does the body run?"
3
3
  *
4
4
  * The CLI grew several doors that all mean execution target:
5
- * run --host / --device / --lease / --box / --cloud
5
+ * run --device / --lease / --box / --cloud
6
6
  * routines --placement / --run-on / hostStrategy
7
7
  * monitors --run-on (body) vs --device (owner — NOT placement)
8
8
  * teams --device (teammate pin)
@@ -98,7 +98,7 @@ export function placementFromRunFlags(flags) {
98
98
  if (where)
99
99
  placementFlags.push('--where');
100
100
  if (hostT)
101
- placementFlags.push('--host/--device');
101
+ placementFlags.push('--device');
102
102
  if (hasLease)
103
103
  placementFlags.push('--lease');
104
104
  if (hasBox)
@@ -120,7 +120,7 @@ export function placementFromRunFlags(flags) {
120
120
  return { kind: 'lease', target: backend, source: '--lease' };
121
121
  }
122
122
  if (hostT)
123
- return { kind: 'device', target: hostT, source: '--host/--device' };
123
+ return { kind: 'device', target: hostT, source: '--device' };
124
124
  return { kind: 'local', source: 'default' };
125
125
  }
126
126
  /**
@@ -182,7 +182,7 @@ export const PLACEMENT_MATRIX = `
182
182
  Intent Flag / path
183
183
  ───────────────────────────── ──────────────────────────────────────────
184
184
  This machine (default) or --where local
185
- Named fleet box --where device:<name> (= --host / --device)
185
+ Named fleet box --where device:<name> (= --device)
186
186
  Affinity pick (14d usage) --where auto (= --device auto)
187
187
  Disposable cloud box --where lease (= --lease)
188
188
  Reuse warm crabbox --box <slug>
@@ -34,6 +34,14 @@ export declare function isWindowsAbsolutePath(p: string): boolean;
34
34
  * (no backslashes) it returns the value unchanged.
35
35
  */
36
36
  export declare function toPosix(p: string): string;
37
+ /**
38
+ * Fold forward slashes to the platform's native separator. The inverse of
39
+ * {@link toPosix}: use when a path from a source that emits POSIX separators on
40
+ * every OS — notably `git`, whose `rev-parse` prints `C:/Users/...` on Windows —
41
+ * must become a native filesystem path so it compares equal to one built with
42
+ * `path.*`. On POSIX (`path.sep === '/'`) it returns the value unchanged.
43
+ */
44
+ export declare function toNativePath(p: string, sep?: string): string;
37
45
  /**
38
46
  * Derive a filesystem-safe key/slug from an absolute path. Drops the Windows
39
47
  * drive colon (`:` is illegal in NTFS filenames / is the ADS separator) and
@@ -2,6 +2,7 @@
2
2
  * Path classification + normalization, platform-aware.
3
3
  */
4
4
  import * as os from 'os';
5
+ import * as path from 'path';
5
6
  /** Windows drive-letter absolute path: `C:\` or `C:/`. */
6
7
  const WIN_DRIVE_RE = /^[a-zA-Z]:[\\/]/;
7
8
  /**
@@ -65,6 +66,16 @@ export function isWindowsAbsolutePath(p) {
65
66
  export function toPosix(p) {
66
67
  return p.replace(/\\/g, '/');
67
68
  }
69
+ /**
70
+ * Fold forward slashes to the platform's native separator. The inverse of
71
+ * {@link toPosix}: use when a path from a source that emits POSIX separators on
72
+ * every OS — notably `git`, whose `rev-parse` prints `C:/Users/...` on Windows —
73
+ * must become a native filesystem path so it compares equal to one built with
74
+ * `path.*`. On POSIX (`path.sep === '/'`) it returns the value unchanged.
75
+ */
76
+ export function toNativePath(p, sep = path.sep) {
77
+ return sep === '/' ? p : p.replace(/\//g, sep);
78
+ }
68
79
  /**
69
80
  * Derive a filesystem-safe key/slug from an absolute path. Drops the Windows
70
81
  * drive colon (`:` is illegal in NTFS filenames / is the ADS separator) and
@@ -5,9 +5,9 @@
5
5
  * bin symlink into the npm global-bin dir; under nvm (and other per-user node
6
6
  * prefixes) that dir is absent from a *non-interactive login* shell's PATH, so
7
7
  * `bash -lc 'agents …'` fails with command-not-found. That breaks every
8
- * consumer that drives a login shell on the box: `agents secrets export --host`
8
+ * consumer that drives a login shell on the box: `agents secrets export --device`
9
9
  * (which runs `bash -lc 'agents secrets import …'` on the remote) and the
10
- * routines daemon (`src/lib/daemon.ts`, which falls back to bare `agents`).
10
+ * routines daemon (`src/lib/daemon/daemon.ts`, which falls back to bare `agents`).
11
11
  *
12
12
  * The fix mirrors the Windows postinstall branch (which registers npm's
13
13
  * global-bin dir on the user PATH): symlink the entrypoint into ~/.local/bin —
@@ -65,7 +65,7 @@ export function ensureLocalBinSymlink(name, target, dir = localBinDir()) {
65
65
  /**
66
66
  * Absolute path to `bash`. We probe bash specifically — NOT the user's $SHELL —
67
67
  * because the consumers we are healing run `bash -lc` regardless of login shell:
68
- * `secrets export --host` builds `bash -lc 'agents secrets import …'` for the
68
+ * `secrets export --device` builds `bash -lc 'agents secrets import …'` for the
69
69
  * remote, and the routines daemon resolves `agents` the same way. On a box whose
70
70
  * login shell is zsh, zsh's login PATH may lack ~/.local/bin while bash's
71
71
  * includes it (Debian/Ubuntu ~/.profile) — so probing $SHELL would give the
@@ -25,7 +25,7 @@
25
25
  * / registerMarketplace / syncAllMarketplaces) all key off a MarketplaceSpec so
26
26
  * the catalog name and on-disk layout are derived, never hard-coded per call.
27
27
  */
28
- import type { AgentId, DiscoveredPlugin, MarketplaceSpec, DiscoveredMarketplace } from './types.js';
28
+ import type { AgentId, DiscoveredPlugin, MarketplaceSpec, DiscoveredMarketplace } from '../types.js';
29
29
  /**
30
30
  * Canonical name for the user-repo marketplace (~/.agents/plugins/). Kept as an
31
31
  * exported constant for callers that operate on the user repo directly and for
@@ -26,9 +26,9 @@
26
26
  * the catalog name and on-disk layout are derived, never hard-coded per call.
27
27
  */
28
28
  import * as fs from 'fs';
29
- import { agentConfigDirName } from './agents.js';
29
+ import { agentConfigDirName } from '../agents.js';
30
30
  import * as path from 'path';
31
- import { getPluginsDir, getEnabledExtraRepos, getProjectPluginsDir, getSystemPluginsDir } from './state.js';
31
+ import { getPluginsDir, getEnabledExtraRepos, getProjectPluginsDir, getSystemPluginsDir } from '../state.js';
32
32
  /**
33
33
  * Canonical name for the user-repo marketplace (~/.agents/plugins/). Kept as an
34
34
  * exported constant for callers that operate on the user repo directly and for
@@ -9,7 +9,7 @@
9
9
  * contents into agent version homes. Workflows under a plugin’s workflows/
10
10
  * are resolved at run time by resolveWorkflowRef (Phase 5 packaging).
11
11
  */
12
- import type { AgentId, DiscoveredPlugin, PluginManifest, MarketplaceSpec } from './types.js';
12
+ import type { AgentId, DiscoveredPlugin, PluginManifest, MarketplaceSpec } from '../types.js';
13
13
  export interface PluginCapabilities {
14
14
  hasHooks: boolean;
15
15
  hasMcp: boolean;
@@ -13,13 +13,13 @@ import * as fs from 'fs';
13
13
  import * as path from 'path';
14
14
  import * as yaml from 'yaml';
15
15
  import { execFileSync } from 'child_process';
16
- import { getPluginsDir, getTrashPluginsDir, getExtraPluginsDir, getProjectPluginsDir, getSystemPluginsDir } from './state.js';
17
- import { IS_WINDOWS, isWindowsAbsolutePath, homeDir } from './platform/index.js';
18
- import { assertSafeGitTransport, resolveSnapshotSha } from './git.js';
19
- import { listInstalledVersions, getVersionHomePath } from './versions.js';
20
- import { AGENTS, agentConfigDirName } from './agents.js';
21
- import { capableAgents, isCapable } from './capabilities.js';
22
- import { shouldInstallCommandAsSkill, installCommandSkillToVersion } from './command-skills.js';
16
+ import { getPluginsDir, getTrashPluginsDir, getExtraPluginsDir, getProjectPluginsDir, getSystemPluginsDir } from '../state.js';
17
+ import { IS_WINDOWS, isWindowsAbsolutePath, homeDir } from '../platform/index.js';
18
+ import { assertSafeGitTransport, resolveSnapshotSha } from '../git.js';
19
+ import { listInstalledVersions, getVersionHomePath } from '../installations/versions.js';
20
+ import { AGENTS, agentConfigDirName } from '../agents.js';
21
+ import { capableAgents, isCapable } from '../capabilities.js';
22
+ import { shouldInstallCommandAsSkill, installCommandSkillToVersion } from '../command-skills.js';
23
23
  import { copyPluginToMarketplace, syncMarketplaceManifest, registerMarketplace, unregisterMarketplace, addPluginToSettings, removePluginFromSettings, removePluginFromMarketplace, registerDroidInstalledPlugin, unregisterDroidInstalledPlugin, isDroidPluginInstalled, registerCopilotInstalledPlugin, unregisterCopilotInstalledPlugin, marketplaceIsEmpty, removeEmptyMarketplaceDir, isInstalledInMarketplace, marketplaceRoot, discoverMarketplaces, marketplaceNameFor, MARKETPLACE_NAME, PROJECT_MARKETPLACE_NAME, SYSTEM_MARKETPLACE_NAME, } from './plugin-marketplace.js';
24
24
  const PLUGIN_MANIFEST_DIR = '.claude-plugin';
25
25
  const PLUGIN_MANIFEST_FILE = 'plugin.json';
@@ -6,7 +6,7 @@
6
6
  * (rules/, examples/, etc.). This module handles parsing skill metadata,
7
7
  * installing skills into agent version homes, and tracking installation state.
8
8
  */
9
- import type { AgentId, SkillMetadata, InstalledSkill } from './types.js';
9
+ import type { AgentId, SkillMetadata, InstalledSkill } from '../types.js';
10
10
  /** User-scoped skills dir (~/.agents/skills/). Used for installs. */
11
11
  export declare function getSkillsDir(): string;
12
12
  export declare function ensureCentralSkillsDir(): void;