@phnx-labs/agents-cli 0.1.0 → 1.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/README.md +283 -372
  3. package/dist/commands/alias.d.ts +11 -0
  4. package/dist/commands/alias.js +117 -0
  5. package/dist/commands/beta.d.ts +2 -0
  6. package/dist/commands/beta.js +53 -0
  7. package/dist/commands/cloud.d.ts +8 -1
  8. package/dist/commands/cloud.js +108 -22
  9. package/dist/commands/commands.d.ts +9 -1
  10. package/dist/commands/commands.js +24 -172
  11. package/dist/commands/daemon.d.ts +8 -1
  12. package/dist/commands/daemon.js +13 -5
  13. package/dist/commands/doctor.d.ts +15 -0
  14. package/dist/commands/doctor.js +132 -0
  15. package/dist/commands/drive.d.ts +8 -1
  16. package/dist/commands/drive.js +20 -3
  17. package/dist/commands/exec.d.ts +8 -1
  18. package/dist/commands/exec.js +96 -27
  19. package/dist/commands/factory.d.ts +19 -0
  20. package/dist/commands/factory.js +71 -0
  21. package/dist/commands/fork.d.ts +8 -1
  22. package/dist/commands/fork.js +11 -4
  23. package/dist/commands/hooks.d.ts +9 -1
  24. package/dist/commands/hooks.js +30 -182
  25. package/dist/commands/init.d.ts +15 -1
  26. package/dist/commands/init.js +168 -74
  27. package/dist/commands/mcp.d.ts +9 -1
  28. package/dist/commands/mcp.js +11 -7
  29. package/dist/commands/models.d.ts +8 -1
  30. package/dist/commands/models.js +16 -4
  31. package/dist/commands/packages.d.ts +8 -1
  32. package/dist/commands/packages.js +13 -7
  33. package/dist/commands/permissions.d.ts +9 -1
  34. package/dist/commands/permissions.js +3 -3
  35. package/dist/commands/plugins.d.ts +8 -1
  36. package/dist/commands/plugins.js +13 -2
  37. package/dist/commands/profiles.d.ts +9 -1
  38. package/dist/commands/profiles.js +56 -7
  39. package/dist/commands/prune.d.ts +22 -0
  40. package/dist/commands/prune.js +191 -0
  41. package/dist/commands/pty.d.ts +1 -1
  42. package/dist/commands/pty.js +2 -1
  43. package/dist/commands/pull.d.ts +8 -1
  44. package/dist/commands/pull.js +58 -128
  45. package/dist/commands/refresh-memory.d.ts +7 -1
  46. package/dist/commands/refresh-memory.js +7 -1
  47. package/dist/commands/repo.d.ts +15 -0
  48. package/dist/commands/repo.js +570 -0
  49. package/dist/commands/resource-view.d.ts +10 -3
  50. package/dist/commands/resource-view.js +18 -5
  51. package/dist/commands/routines.d.ts +8 -1
  52. package/dist/commands/routines.js +17 -4
  53. package/dist/commands/rules.d.ts +9 -1
  54. package/dist/commands/rules.js +16 -11
  55. package/dist/commands/secrets.d.ts +8 -1
  56. package/dist/commands/secrets.js +235 -63
  57. package/dist/commands/sessions-picker.d.ts +2 -1
  58. package/dist/commands/sessions-picker.js +88 -11
  59. package/dist/commands/sessions-tail.d.ts +19 -0
  60. package/dist/commands/sessions-tail.js +235 -0
  61. package/dist/commands/sessions.d.ts +2 -1
  62. package/dist/commands/sessions.js +188 -7
  63. package/dist/commands/skills.d.ts +9 -1
  64. package/dist/commands/skills.js +28 -178
  65. package/dist/commands/status.d.ts +7 -1
  66. package/dist/commands/status.js +7 -1
  67. package/dist/commands/subagents.d.ts +8 -1
  68. package/dist/commands/subagents.js +11 -1
  69. package/dist/commands/sync.d.ts +8 -1
  70. package/dist/commands/sync.js +8 -1
  71. package/dist/commands/teams-picker.d.ts +4 -1
  72. package/dist/commands/teams-picker.js +55 -3
  73. package/dist/commands/teams.d.ts +15 -1
  74. package/dist/commands/teams.js +323 -69
  75. package/dist/commands/usage.d.ts +11 -0
  76. package/dist/commands/usage.js +60 -0
  77. package/dist/commands/utils.d.ts +6 -1
  78. package/dist/commands/utils.js +6 -1
  79. package/dist/commands/versions.d.ts +8 -1
  80. package/dist/commands/versions.js +4 -3
  81. package/dist/commands/view.d.ts +47 -2
  82. package/dist/commands/view.js +317 -24
  83. package/dist/index.d.ts +7 -2
  84. package/dist/index.js +172 -34
  85. package/dist/lib/acp/client.d.ts +31 -0
  86. package/dist/lib/acp/client.js +117 -0
  87. package/dist/lib/acp/harnesses.d.ts +26 -0
  88. package/dist/lib/acp/harnesses.js +65 -0
  89. package/dist/lib/acp/run.d.ts +18 -0
  90. package/dist/lib/acp/run.js +39 -0
  91. package/dist/lib/agents.d.ts +74 -2
  92. package/dist/lib/agents.js +197 -21
  93. package/dist/lib/artifact-actions.d.ts +8 -4
  94. package/dist/lib/artifact-actions.js +8 -6
  95. package/dist/lib/auto-pull-worker.d.ts +11 -0
  96. package/dist/lib/auto-pull-worker.js +121 -0
  97. package/dist/lib/auto-pull.d.ts +31 -0
  98. package/dist/lib/auto-pull.js +97 -0
  99. package/dist/lib/beta.d.ts +23 -0
  100. package/dist/lib/beta.js +90 -0
  101. package/dist/lib/capabilities.d.ts +29 -0
  102. package/dist/lib/capabilities.js +74 -0
  103. package/dist/lib/cloud/codex.d.ts +9 -3
  104. package/dist/lib/cloud/codex.js +53 -13
  105. package/dist/lib/cloud/factory.d.ts +8 -3
  106. package/dist/lib/cloud/factory.js +19 -3
  107. package/dist/lib/cloud/registry.d.ts +10 -1
  108. package/dist/lib/cloud/registry.js +14 -3
  109. package/dist/lib/cloud/rush.d.ts +63 -3
  110. package/dist/lib/cloud/rush.js +273 -20
  111. package/dist/lib/cloud/store.d.ts +13 -1
  112. package/dist/lib/cloud/store.js +23 -4
  113. package/dist/lib/cloud/stream.d.ts +6 -1
  114. package/dist/lib/cloud/stream.js +95 -39
  115. package/dist/lib/cloud/types.d.ts +153 -8
  116. package/dist/lib/cloud/types.js +34 -2
  117. package/dist/lib/command-skills.d.ts +20 -0
  118. package/dist/lib/command-skills.js +142 -0
  119. package/dist/lib/commands.d.ts +22 -2
  120. package/dist/lib/commands.js +51 -11
  121. package/dist/lib/convert.d.ts +10 -1
  122. package/dist/lib/convert.js +9 -1
  123. package/dist/lib/daemon.d.ts +21 -1
  124. package/dist/lib/daemon.js +97 -4
  125. package/dist/lib/drive-sync.d.ts +18 -1
  126. package/dist/lib/drive-sync.js +57 -15
  127. package/dist/lib/exec.d.ts +23 -6
  128. package/dist/lib/exec.js +53 -17
  129. package/dist/lib/fs-walk.d.ts +2 -0
  130. package/dist/lib/fs-walk.js +40 -0
  131. package/dist/lib/fuzzy.d.ts +53 -0
  132. package/dist/lib/fuzzy.js +72 -0
  133. package/dist/lib/gemini-settings.d.ts +4 -0
  134. package/dist/lib/gemini-settings.js +33 -0
  135. package/dist/lib/git.d.ts +12 -2
  136. package/dist/lib/git.js +17 -6
  137. package/dist/lib/help.d.ts +20 -1
  138. package/dist/lib/help.js +45 -6
  139. package/dist/lib/hooks/match.d.ts +32 -0
  140. package/dist/lib/hooks/match.js +120 -0
  141. package/dist/lib/hooks.d.ts +17 -4
  142. package/dist/lib/hooks.js +119 -101
  143. package/dist/lib/manifest.d.ts +6 -1
  144. package/dist/lib/manifest.js +15 -4
  145. package/dist/lib/markdown.d.ts +0 -1
  146. package/dist/lib/markdown.js +6 -1
  147. package/dist/lib/mcp.d.ts +0 -1
  148. package/dist/lib/mcp.js +29 -33
  149. package/dist/lib/memory-compile.d.ts +13 -3
  150. package/dist/lib/memory-compile.js +31 -9
  151. package/dist/lib/memory.d.ts +14 -7
  152. package/dist/lib/memory.js +67 -38
  153. package/dist/lib/migrate.d.ts +8 -0
  154. package/dist/lib/migrate.js +85 -0
  155. package/dist/lib/models.d.ts +10 -4
  156. package/dist/lib/models.js +36 -15
  157. package/dist/lib/onepassword.d.ts +63 -0
  158. package/dist/lib/onepassword.js +186 -0
  159. package/dist/lib/paths.d.ts +8 -0
  160. package/dist/lib/paths.js +20 -0
  161. package/dist/lib/permissions.d.ts +24 -2
  162. package/dist/lib/permissions.js +117 -48
  163. package/dist/lib/picker.d.ts +10 -1
  164. package/dist/lib/picker.js +15 -1
  165. package/dist/lib/plugins.d.ts +7 -1
  166. package/dist/lib/plugins.js +10 -1
  167. package/dist/lib/profiles-presets.d.ts +10 -1
  168. package/dist/lib/profiles-presets.js +9 -1
  169. package/dist/lib/profiles.d.ts +35 -1
  170. package/dist/lib/profiles.js +36 -15
  171. package/dist/lib/pty-client.d.ts +1 -1
  172. package/dist/lib/pty-client.js +0 -1
  173. package/dist/lib/pty-server.d.ts +16 -2
  174. package/dist/lib/pty-server.js +92 -3
  175. package/dist/lib/registry.d.ts +23 -3
  176. package/dist/lib/registry.js +153 -8
  177. package/dist/lib/resources.d.ts +28 -1
  178. package/dist/lib/resources.js +79 -1
  179. package/dist/lib/rotate.d.ts +40 -13
  180. package/dist/lib/rotate.js +238 -40
  181. package/dist/lib/routines.d.ts +29 -1
  182. package/dist/lib/routines.js +32 -5
  183. package/dist/lib/runner.d.ts +14 -1
  184. package/dist/lib/runner.js +22 -3
  185. package/dist/lib/sandbox.d.ts +16 -1
  186. package/dist/lib/sandbox.js +39 -16
  187. package/dist/lib/scheduler.d.ts +8 -1
  188. package/dist/lib/scheduler.js +8 -1
  189. package/dist/lib/secrets/AgentsKeychain.app/Contents/CodeResources +0 -0
  190. package/dist/lib/secrets/AgentsKeychain.app/Contents/Info.plist +22 -0
  191. package/dist/lib/secrets/AgentsKeychain.app/Contents/MacOS/AgentsKeychain +0 -0
  192. package/dist/lib/secrets/AgentsKeychain.app/Contents/_CodeSignature/CodeResources +123 -0
  193. package/dist/lib/secrets/AgentsKeychain.app/Contents/embedded.provisionprofile +0 -0
  194. package/dist/lib/{secrets-bundles.d.ts → secrets/bundles.d.ts} +12 -2
  195. package/dist/lib/{secrets-bundles.js → secrets/bundles.js} +38 -17
  196. package/dist/lib/secrets/index.d.ts +55 -0
  197. package/dist/lib/secrets/index.js +211 -0
  198. package/dist/lib/secrets/profiles.d.ts +10 -0
  199. package/dist/lib/secrets/profiles.js +13 -0
  200. package/dist/lib/session/active.d.ts +43 -0
  201. package/dist/lib/session/active.js +392 -0
  202. package/dist/lib/session/artifacts.d.ts +12 -1
  203. package/dist/lib/session/artifacts.js +25 -5
  204. package/dist/lib/session/cloud.d.ts +30 -0
  205. package/dist/lib/session/cloud.js +121 -0
  206. package/dist/lib/session/db.d.ts +23 -2
  207. package/dist/lib/session/db.js +76 -12
  208. package/dist/lib/session/discover.d.ts +19 -4
  209. package/dist/lib/session/discover.js +344 -48
  210. package/dist/lib/session/parse.d.ts +28 -1
  211. package/dist/lib/session/parse.js +267 -9
  212. package/dist/lib/session/prompt.d.ts +9 -1
  213. package/dist/lib/session/prompt.js +17 -3
  214. package/dist/lib/session/render.d.ts +13 -1
  215. package/dist/lib/session/render.js +20 -1
  216. package/dist/lib/session/team-filter.d.ts +9 -1
  217. package/dist/lib/session/team-filter.js +11 -2
  218. package/dist/lib/session/types.d.ts +16 -2
  219. package/dist/lib/session/types.js +10 -2
  220. package/dist/lib/shims.d.ts +64 -5
  221. package/dist/lib/shims.js +309 -47
  222. package/dist/lib/skills.d.ts +27 -2
  223. package/dist/lib/skills.js +127 -65
  224. package/dist/lib/sqlite.d.ts +43 -0
  225. package/dist/lib/sqlite.js +94 -0
  226. package/dist/lib/state.d.ts +112 -27
  227. package/dist/lib/state.js +320 -148
  228. package/dist/lib/subagents.d.ts +9 -1
  229. package/dist/lib/subagents.js +70 -63
  230. package/dist/lib/sync-manifest.d.ts +81 -0
  231. package/dist/lib/sync-manifest.js +450 -0
  232. package/dist/lib/teams/agents.d.ts +103 -5
  233. package/dist/lib/teams/agents.js +414 -91
  234. package/dist/lib/teams/api.d.ts +26 -3
  235. package/dist/lib/teams/api.js +63 -3
  236. package/dist/lib/teams/debug.d.ts +6 -1
  237. package/dist/lib/teams/debug.js +6 -1
  238. package/dist/lib/teams/file_ops.d.ts +7 -1
  239. package/dist/lib/teams/file_ops.js +7 -1
  240. package/dist/lib/teams/index.d.ts +15 -0
  241. package/dist/lib/teams/index.js +14 -0
  242. package/dist/lib/teams/parsers.d.ts +4 -1
  243. package/dist/lib/teams/parsers.js +11 -1
  244. package/dist/lib/teams/persistence.d.ts +15 -1
  245. package/dist/lib/teams/persistence.js +102 -20
  246. package/dist/lib/teams/registry.d.ts +12 -1
  247. package/dist/lib/teams/registry.js +116 -33
  248. package/dist/lib/teams/summarizer.d.ts +15 -1
  249. package/dist/lib/teams/summarizer.js +14 -1
  250. package/dist/lib/teams/supervisor.d.ts +48 -0
  251. package/dist/lib/teams/supervisor.js +73 -0
  252. package/dist/lib/template.d.ts +8 -6
  253. package/dist/lib/template.js +8 -6
  254. package/dist/lib/types.d.ts +147 -8
  255. package/dist/lib/types.js +26 -3
  256. package/dist/lib/usage.d.ts +32 -1
  257. package/dist/lib/usage.js +70 -6
  258. package/dist/lib/version-duplicates.d.ts +21 -0
  259. package/dist/lib/version-duplicates.js +90 -0
  260. package/dist/lib/versions.d.ts +33 -4
  261. package/dist/lib/versions.js +376 -108
  262. package/package.json +32 -17
  263. package/scripts/postinstall.js +126 -30
  264. package/dist/commands/__tests__/sessions.test.d.ts +0 -2
  265. package/dist/commands/__tests__/sessions.test.d.ts.map +0 -1
  266. package/dist/commands/__tests__/sessions.test.js +0 -636
  267. package/dist/commands/__tests__/sessions.test.js.map +0 -1
  268. package/dist/commands/cloud.d.ts.map +0 -1
  269. package/dist/commands/cloud.js.map +0 -1
  270. package/dist/commands/commands.d.ts.map +0 -1
  271. package/dist/commands/commands.js.map +0 -1
  272. package/dist/commands/daemon.d.ts.map +0 -1
  273. package/dist/commands/daemon.js.map +0 -1
  274. package/dist/commands/drive.d.ts.map +0 -1
  275. package/dist/commands/drive.js.map +0 -1
  276. package/dist/commands/exec.d.ts.map +0 -1
  277. package/dist/commands/exec.js.map +0 -1
  278. package/dist/commands/fork.d.ts.map +0 -1
  279. package/dist/commands/fork.js.map +0 -1
  280. package/dist/commands/hooks.d.ts.map +0 -1
  281. package/dist/commands/hooks.js.map +0 -1
  282. package/dist/commands/init.d.ts.map +0 -1
  283. package/dist/commands/init.js.map +0 -1
  284. package/dist/commands/mcp.d.ts.map +0 -1
  285. package/dist/commands/mcp.js.map +0 -1
  286. package/dist/commands/models.d.ts.map +0 -1
  287. package/dist/commands/models.js.map +0 -1
  288. package/dist/commands/packages.d.ts.map +0 -1
  289. package/dist/commands/packages.js.map +0 -1
  290. package/dist/commands/permissions.d.ts.map +0 -1
  291. package/dist/commands/permissions.js.map +0 -1
  292. package/dist/commands/plugins.d.ts.map +0 -1
  293. package/dist/commands/plugins.js.map +0 -1
  294. package/dist/commands/profiles.d.ts.map +0 -1
  295. package/dist/commands/profiles.js.map +0 -1
  296. package/dist/commands/pty.d.ts.map +0 -1
  297. package/dist/commands/pty.js.map +0 -1
  298. package/dist/commands/pull.d.ts.map +0 -1
  299. package/dist/commands/pull.js.map +0 -1
  300. package/dist/commands/push.d.ts +0 -3
  301. package/dist/commands/push.d.ts.map +0 -1
  302. package/dist/commands/push.js +0 -180
  303. package/dist/commands/push.js.map +0 -1
  304. package/dist/commands/refresh-memory.d.ts.map +0 -1
  305. package/dist/commands/refresh-memory.js.map +0 -1
  306. package/dist/commands/resource-view.d.ts.map +0 -1
  307. package/dist/commands/resource-view.js.map +0 -1
  308. package/dist/commands/routines.d.ts.map +0 -1
  309. package/dist/commands/routines.js.map +0 -1
  310. package/dist/commands/rules.d.ts.map +0 -1
  311. package/dist/commands/rules.js.map +0 -1
  312. package/dist/commands/secrets.d.ts.map +0 -1
  313. package/dist/commands/secrets.js.map +0 -1
  314. package/dist/commands/sessions-picker.d.ts.map +0 -1
  315. package/dist/commands/sessions-picker.js.map +0 -1
  316. package/dist/commands/sessions.d.ts.map +0 -1
  317. package/dist/commands/sessions.js.map +0 -1
  318. package/dist/commands/skills.d.ts.map +0 -1
  319. package/dist/commands/skills.js.map +0 -1
  320. package/dist/commands/status.d.ts.map +0 -1
  321. package/dist/commands/status.js.map +0 -1
  322. package/dist/commands/subagents.d.ts.map +0 -1
  323. package/dist/commands/subagents.js.map +0 -1
  324. package/dist/commands/sync.d.ts.map +0 -1
  325. package/dist/commands/sync.js.map +0 -1
  326. package/dist/commands/teams-picker.d.ts.map +0 -1
  327. package/dist/commands/teams-picker.js.map +0 -1
  328. package/dist/commands/teams.d.ts.map +0 -1
  329. package/dist/commands/teams.js.map +0 -1
  330. package/dist/commands/utils.d.ts.map +0 -1
  331. package/dist/commands/utils.js.map +0 -1
  332. package/dist/commands/versions.d.ts.map +0 -1
  333. package/dist/commands/versions.js.map +0 -1
  334. package/dist/commands/view.d.ts.map +0 -1
  335. package/dist/commands/view.js.map +0 -1
  336. package/dist/index.d.ts.map +0 -1
  337. package/dist/index.js.map +0 -1
  338. package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
  339. package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
  340. package/dist/lib/__tests__/bugfixes.test.js +0 -192
  341. package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
  342. package/dist/lib/__tests__/exec.test.d.ts +0 -2
  343. package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
  344. package/dist/lib/__tests__/exec.test.js +0 -446
  345. package/dist/lib/__tests__/exec.test.js.map +0 -1
  346. package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
  347. package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
  348. package/dist/lib/__tests__/git-sync.test.js +0 -138
  349. package/dist/lib/__tests__/git-sync.test.js.map +0 -1
  350. package/dist/lib/__tests__/hooks.test.d.ts +0 -2
  351. package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
  352. package/dist/lib/__tests__/hooks.test.js +0 -203
  353. package/dist/lib/__tests__/hooks.test.js.map +0 -1
  354. package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
  355. package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
  356. package/dist/lib/__tests__/memory-compile.test.js +0 -95
  357. package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
  358. package/dist/lib/__tests__/models.test.d.ts +0 -2
  359. package/dist/lib/__tests__/models.test.d.ts.map +0 -1
  360. package/dist/lib/__tests__/models.test.js +0 -239
  361. package/dist/lib/__tests__/models.test.js.map +0 -1
  362. package/dist/lib/__tests__/rotate.test.d.ts +0 -2
  363. package/dist/lib/__tests__/rotate.test.d.ts.map +0 -1
  364. package/dist/lib/__tests__/rotate.test.js +0 -80
  365. package/dist/lib/__tests__/rotate.test.js.map +0 -1
  366. package/dist/lib/__tests__/secrets-bundles.test.d.ts +0 -2
  367. package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +0 -1
  368. package/dist/lib/__tests__/secrets-bundles.test.js +0 -104
  369. package/dist/lib/__tests__/secrets-bundles.test.js.map +0 -1
  370. package/dist/lib/__tests__/secrets.test.d.ts +0 -2
  371. package/dist/lib/__tests__/secrets.test.d.ts.map +0 -1
  372. package/dist/lib/__tests__/secrets.test.js +0 -90
  373. package/dist/lib/__tests__/secrets.test.js.map +0 -1
  374. package/dist/lib/__tests__/shims.test.d.ts +0 -2
  375. package/dist/lib/__tests__/shims.test.d.ts.map +0 -1
  376. package/dist/lib/__tests__/shims.test.js +0 -39
  377. package/dist/lib/__tests__/shims.test.js.map +0 -1
  378. package/dist/lib/__tests__/usage.test.d.ts +0 -2
  379. package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
  380. package/dist/lib/__tests__/usage.test.js +0 -220
  381. package/dist/lib/__tests__/usage.test.js.map +0 -1
  382. package/dist/lib/__tests__/versions.test.d.ts +0 -2
  383. package/dist/lib/__tests__/versions.test.d.ts.map +0 -1
  384. package/dist/lib/__tests__/versions.test.js +0 -63
  385. package/dist/lib/__tests__/versions.test.js.map +0 -1
  386. package/dist/lib/agents.d.ts.map +0 -1
  387. package/dist/lib/agents.js.map +0 -1
  388. package/dist/lib/artifact-actions.d.ts.map +0 -1
  389. package/dist/lib/artifact-actions.js.map +0 -1
  390. package/dist/lib/cloud/codex.d.ts.map +0 -1
  391. package/dist/lib/cloud/codex.js.map +0 -1
  392. package/dist/lib/cloud/factory.d.ts.map +0 -1
  393. package/dist/lib/cloud/factory.js.map +0 -1
  394. package/dist/lib/cloud/registry.d.ts.map +0 -1
  395. package/dist/lib/cloud/registry.js.map +0 -1
  396. package/dist/lib/cloud/rush.d.ts.map +0 -1
  397. package/dist/lib/cloud/rush.js.map +0 -1
  398. package/dist/lib/cloud/store.d.ts.map +0 -1
  399. package/dist/lib/cloud/store.js.map +0 -1
  400. package/dist/lib/cloud/stream.d.ts.map +0 -1
  401. package/dist/lib/cloud/stream.js.map +0 -1
  402. package/dist/lib/cloud/types.d.ts.map +0 -1
  403. package/dist/lib/cloud/types.js.map +0 -1
  404. package/dist/lib/commands.d.ts.map +0 -1
  405. package/dist/lib/commands.js.map +0 -1
  406. package/dist/lib/convert.d.ts.map +0 -1
  407. package/dist/lib/convert.js.map +0 -1
  408. package/dist/lib/daemon.d.ts.map +0 -1
  409. package/dist/lib/daemon.js.map +0 -1
  410. package/dist/lib/drive-sync.d.ts.map +0 -1
  411. package/dist/lib/drive-sync.js.map +0 -1
  412. package/dist/lib/exec.d.ts.map +0 -1
  413. package/dist/lib/exec.js.map +0 -1
  414. package/dist/lib/factory.d.ts +0 -57
  415. package/dist/lib/factory.d.ts.map +0 -1
  416. package/dist/lib/factory.js +0 -110
  417. package/dist/lib/factory.js.map +0 -1
  418. package/dist/lib/git.d.ts.map +0 -1
  419. package/dist/lib/git.js.map +0 -1
  420. package/dist/lib/help.d.ts.map +0 -1
  421. package/dist/lib/help.js.map +0 -1
  422. package/dist/lib/hooks.d.ts.map +0 -1
  423. package/dist/lib/hooks.js.map +0 -1
  424. package/dist/lib/manifest.d.ts.map +0 -1
  425. package/dist/lib/manifest.js.map +0 -1
  426. package/dist/lib/markdown.d.ts.map +0 -1
  427. package/dist/lib/markdown.js.map +0 -1
  428. package/dist/lib/mcp.d.ts.map +0 -1
  429. package/dist/lib/mcp.js.map +0 -1
  430. package/dist/lib/memory-compile.d.ts.map +0 -1
  431. package/dist/lib/memory-compile.js.map +0 -1
  432. package/dist/lib/memory.d.ts.map +0 -1
  433. package/dist/lib/memory.js.map +0 -1
  434. package/dist/lib/models.d.ts.map +0 -1
  435. package/dist/lib/models.js.map +0 -1
  436. package/dist/lib/permissions.d.ts.map +0 -1
  437. package/dist/lib/permissions.js.map +0 -1
  438. package/dist/lib/picker.d.ts.map +0 -1
  439. package/dist/lib/picker.js.map +0 -1
  440. package/dist/lib/plugins.d.ts.map +0 -1
  441. package/dist/lib/plugins.js.map +0 -1
  442. package/dist/lib/profiles-keychain.d.ts +0 -3
  443. package/dist/lib/profiles-keychain.d.ts.map +0 -1
  444. package/dist/lib/profiles-keychain.js +0 -10
  445. package/dist/lib/profiles-keychain.js.map +0 -1
  446. package/dist/lib/profiles-presets.d.ts.map +0 -1
  447. package/dist/lib/profiles-presets.js.map +0 -1
  448. package/dist/lib/profiles.d.ts.map +0 -1
  449. package/dist/lib/profiles.js.map +0 -1
  450. package/dist/lib/pty-client.d.ts.map +0 -1
  451. package/dist/lib/pty-client.js.map +0 -1
  452. package/dist/lib/pty-server.d.ts.map +0 -1
  453. package/dist/lib/pty-server.js.map +0 -1
  454. package/dist/lib/registry.d.ts.map +0 -1
  455. package/dist/lib/registry.js.map +0 -1
  456. package/dist/lib/resources.d.ts.map +0 -1
  457. package/dist/lib/resources.js.map +0 -1
  458. package/dist/lib/rotate.d.ts.map +0 -1
  459. package/dist/lib/rotate.js.map +0 -1
  460. package/dist/lib/routines.d.ts.map +0 -1
  461. package/dist/lib/routines.js.map +0 -1
  462. package/dist/lib/runner.d.ts.map +0 -1
  463. package/dist/lib/runner.js.map +0 -1
  464. package/dist/lib/sandbox.d.ts.map +0 -1
  465. package/dist/lib/sandbox.js.map +0 -1
  466. package/dist/lib/scheduler.d.ts.map +0 -1
  467. package/dist/lib/scheduler.js.map +0 -1
  468. package/dist/lib/secrets-bundles.d.ts.map +0 -1
  469. package/dist/lib/secrets-bundles.js.map +0 -1
  470. package/dist/lib/secrets.d.ts +0 -27
  471. package/dist/lib/secrets.d.ts.map +0 -1
  472. package/dist/lib/secrets.js +0 -127
  473. package/dist/lib/secrets.js.map +0 -1
  474. package/dist/lib/session/__tests__/db.test.d.ts +0 -2
  475. package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
  476. package/dist/lib/session/__tests__/db.test.js +0 -54
  477. package/dist/lib/session/__tests__/db.test.js.map +0 -1
  478. package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
  479. package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
  480. package/dist/lib/session/__tests__/discover.test.js +0 -63
  481. package/dist/lib/session/__tests__/discover.test.js.map +0 -1
  482. package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
  483. package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
  484. package/dist/lib/session/__tests__/prompt.test.js +0 -44
  485. package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
  486. package/dist/lib/session/__tests__/render.test.d.ts +0 -2
  487. package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
  488. package/dist/lib/session/__tests__/render.test.js +0 -602
  489. package/dist/lib/session/__tests__/render.test.js.map +0 -1
  490. package/dist/lib/session/artifacts.d.ts.map +0 -1
  491. package/dist/lib/session/artifacts.js.map +0 -1
  492. package/dist/lib/session/db.d.ts.map +0 -1
  493. package/dist/lib/session/db.js.map +0 -1
  494. package/dist/lib/session/discover.d.ts.map +0 -1
  495. package/dist/lib/session/discover.js.map +0 -1
  496. package/dist/lib/session/parse.d.ts.map +0 -1
  497. package/dist/lib/session/parse.js.map +0 -1
  498. package/dist/lib/session/prompt.d.ts.map +0 -1
  499. package/dist/lib/session/prompt.js.map +0 -1
  500. package/dist/lib/session/prompt.test.d.ts +0 -2
  501. package/dist/lib/session/prompt.test.d.ts.map +0 -1
  502. package/dist/lib/session/prompt.test.js +0 -57
  503. package/dist/lib/session/prompt.test.js.map +0 -1
  504. package/dist/lib/session/render.d.ts.map +0 -1
  505. package/dist/lib/session/render.js.map +0 -1
  506. package/dist/lib/session/team-filter.d.ts.map +0 -1
  507. package/dist/lib/session/team-filter.js.map +0 -1
  508. package/dist/lib/session/team-filter.test.d.ts +0 -2
  509. package/dist/lib/session/team-filter.test.d.ts.map +0 -1
  510. package/dist/lib/session/team-filter.test.js +0 -157
  511. package/dist/lib/session/team-filter.test.js.map +0 -1
  512. package/dist/lib/session/types.d.ts.map +0 -1
  513. package/dist/lib/session/types.js.map +0 -1
  514. package/dist/lib/shims.d.ts.map +0 -1
  515. package/dist/lib/shims.js.map +0 -1
  516. package/dist/lib/skills.d.ts.map +0 -1
  517. package/dist/lib/skills.js.map +0 -1
  518. package/dist/lib/state.d.ts.map +0 -1
  519. package/dist/lib/state.js.map +0 -1
  520. package/dist/lib/subagents.d.ts.map +0 -1
  521. package/dist/lib/subagents.js.map +0 -1
  522. package/dist/lib/teams/agents.d.ts.map +0 -1
  523. package/dist/lib/teams/agents.js.map +0 -1
  524. package/dist/lib/teams/api.d.ts.map +0 -1
  525. package/dist/lib/teams/api.js.map +0 -1
  526. package/dist/lib/teams/cloud.d.ts +0 -11
  527. package/dist/lib/teams/cloud.d.ts.map +0 -1
  528. package/dist/lib/teams/cloud.js +0 -169
  529. package/dist/lib/teams/cloud.js.map +0 -1
  530. package/dist/lib/teams/debug.d.ts.map +0 -1
  531. package/dist/lib/teams/debug.js.map +0 -1
  532. package/dist/lib/teams/file_ops.d.ts.map +0 -1
  533. package/dist/lib/teams/file_ops.js.map +0 -1
  534. package/dist/lib/teams/parsers.d.ts.map +0 -1
  535. package/dist/lib/teams/parsers.js.map +0 -1
  536. package/dist/lib/teams/persistence.d.ts.map +0 -1
  537. package/dist/lib/teams/persistence.js.map +0 -1
  538. package/dist/lib/teams/ralph.d.ts +0 -8
  539. package/dist/lib/teams/ralph.d.ts.map +0 -1
  540. package/dist/lib/teams/ralph.js +0 -59
  541. package/dist/lib/teams/ralph.js.map +0 -1
  542. package/dist/lib/teams/registry.d.ts.map +0 -1
  543. package/dist/lib/teams/registry.js.map +0 -1
  544. package/dist/lib/teams/summarizer.d.ts.map +0 -1
  545. package/dist/lib/teams/summarizer.js.map +0 -1
  546. package/dist/lib/template.d.ts.map +0 -1
  547. package/dist/lib/template.js.map +0 -1
  548. package/dist/lib/types.d.ts.map +0 -1
  549. package/dist/lib/types.js.map +0 -1
  550. package/dist/lib/usage.d.ts.map +0 -1
  551. package/dist/lib/usage.js.map +0 -1
  552. package/dist/lib/versions.d.ts.map +0 -1
  553. package/dist/lib/versions.js.map +0 -1
  554. package/scripts/rebuild-sqlite.sh +0 -46
@@ -1,17 +1,27 @@
1
+ /**
2
+ * Permission management for AI coding agents.
3
+ *
4
+ * Provides a canonical permission format (PermissionSet with allow/deny rules)
5
+ * and converters to/from each agent's native format (Claude settings.json,
6
+ * OpenCode opencode.jsonc, Codex config.toml + .rules). Handles discovery,
7
+ * installation, removal, and merging of permission groups stored in
8
+ * ~/.agents/permissions/groups/.
9
+ */
1
10
  import * as fs from 'fs';
2
11
  import * as path from 'path';
3
12
  import * as os from 'os';
4
13
  import * as yaml from 'yaml';
5
14
  import * as TOML from 'smol-toml';
6
- import { getPermissionsDir, ensureAgentsDir } from './state.js';
15
+ import { getPermissionsDir, getUserPermissionsDir, ensureAgentsDir } from './state.js';
16
+ import { safeJoin } from './paths.js';
7
17
  const HOME = os.homedir();
8
- // Agents that support permissions
18
+ /** Agents that support the permissions subsystem. */
9
19
  export const PERMISSIONS_CAPABLE_AGENTS = ['claude', 'codex', 'opencode'];
10
- // Codex .rules file name for deny permissions
20
+ /** Filename used for Codex Starlark deny-rules generated from permission groups. */
11
21
  export const CODEX_RULES_FILENAME = 'agents-deny.rules';
12
22
  /**
13
23
  * Convert canonical deny rules to Codex Starlark .rules format.
14
- * E.g. "Bash(git reset:*)" prefix_rule(pattern=["git", "reset"], decision="forbidden")
24
+ * E.g. "Bash(git reset:*)" -> prefix_rule(pattern=["git", "reset"], decision="forbidden")
15
25
  */
16
26
  export function convertDenyToCodexRules(deny) {
17
27
  const rules = [];
@@ -24,7 +34,7 @@ export function convertDenyToCodexRules(deny) {
24
34
  if (!command)
25
35
  continue;
26
36
  const parts = command.split(/\s+/);
27
- const patternStr = parts.map(p => `"${p}"`).join(', ');
37
+ const patternStr = parts.map(p => JSON.stringify(p)).join(', ');
28
38
  rules.push(`prefix_rule(\n pattern = [${patternStr}],\n decision = "forbidden",\n)`);
29
39
  }
30
40
  if (rules.length === 0)
@@ -35,7 +45,7 @@ export function convertDenyToCodexRules(deny) {
35
45
  * Ensure central permissions directory exists.
36
46
  */
37
47
  export function ensurePermissionsDir() {
38
- const dir = getPermissionsDir();
48
+ const dir = getUserPermissionsDir();
39
49
  if (!fs.existsSync(dir)) {
40
50
  fs.mkdirSync(dir, { recursive: true });
41
51
  }
@@ -108,38 +118,37 @@ export function discoverPermissionsFromRepo(repoPath) {
108
118
  * Returns groups with their rule counts.
109
119
  */
110
120
  export function discoverPermissionGroups() {
111
- const groupsDir = path.join(getPermissionsDir(), 'groups');
112
- if (!fs.existsSync(groupsDir)) {
113
- return [];
114
- }
121
+ const seen = new Set();
115
122
  const groups = [];
116
- try {
117
- const entries = fs.readdirSync(groupsDir, { withFileTypes: true });
118
- for (const entry of entries) {
119
- if (!entry.isFile())
120
- continue;
121
- if (!entry.name.endsWith('.yml') && !entry.name.endsWith('.yaml'))
122
- continue;
123
- const filePath = path.join(groupsDir, entry.name);
124
- const name = entry.name.replace(/\.(yaml|yml)$/, '');
125
- // Count rules in this group
126
- let ruleCount = 0;
127
- try {
128
- const content = fs.readFileSync(filePath, 'utf-8');
129
- // Count lines that look like permission entries (start with - " after optional whitespace)
130
- const matches = content.match(/^\s*-\s*"/gm);
131
- ruleCount = matches ? matches.length : 0;
132
- }
133
- catch {
134
- // Skip files we can't read
123
+ // Search user dir first, then system (user wins on name collision)
124
+ for (const baseDir of [getUserPermissionsDir(), getPermissionsDir()]) {
125
+ const groupsDir = path.join(baseDir, 'groups');
126
+ if (!fs.existsSync(groupsDir))
127
+ continue;
128
+ try {
129
+ const entries = fs.readdirSync(groupsDir, { withFileTypes: true });
130
+ for (const entry of entries) {
131
+ if (!entry.isFile())
132
+ continue;
133
+ if (!entry.name.endsWith('.yml') && !entry.name.endsWith('.yaml'))
134
+ continue;
135
+ const name = entry.name.replace(/\.(yaml|yml)$/, '');
136
+ if (seen.has(name))
137
+ continue;
138
+ seen.add(name);
139
+ const filePath = path.join(groupsDir, entry.name);
140
+ let ruleCount = 0;
141
+ try {
142
+ const content = fs.readFileSync(filePath, 'utf-8');
143
+ const matches = content.match(/^\s*-\s*"/gm);
144
+ ruleCount = matches ? matches.length : 0;
145
+ }
146
+ catch { /* Skip files we can't read */ }
147
+ groups.push({ name, ruleCount, path: filePath });
135
148
  }
136
- groups.push({ name, ruleCount, path: filePath });
137
149
  }
150
+ catch { /* Skip inaccessible directory */ }
138
151
  }
139
- catch {
140
- // Skip inaccessible directory
141
- }
142
- // Sort by name (which sorts by numeric prefix)
143
152
  return groups.sort((a, b) => a.name.localeCompare(b.name));
144
153
  }
145
154
  /**
@@ -149,6 +158,45 @@ export function getTotalPermissionRuleCount() {
149
158
  const groups = discoverPermissionGroups();
150
159
  return groups.reduce((sum, g) => sum + g.ruleCount, 0);
151
160
  }
161
+ /** Env var that selects which set recipe to apply at sync time. */
162
+ export const PERMISSION_SET_ENV_VAR = 'AGENTS_PERMISSION_SET';
163
+ /**
164
+ * Read a permission set recipe by name from ~/.agents/permissions/sets/.
165
+ * Returns null if the recipe file is missing or malformed.
166
+ */
167
+ export function readPermissionSetRecipe(name) {
168
+ const setsDir = path.join(getPermissionsDir(), 'sets');
169
+ for (const ext of ['.yaml', '.yml']) {
170
+ const filePath = safeJoin(setsDir, name + ext);
171
+ if (!fs.existsSync(filePath))
172
+ continue;
173
+ try {
174
+ const content = fs.readFileSync(filePath, 'utf-8');
175
+ const parsed = yaml.parse(content);
176
+ if (!parsed || typeof parsed !== 'object')
177
+ return null;
178
+ if (!Array.isArray(parsed.includes))
179
+ return null;
180
+ return {
181
+ name: parsed.name || name,
182
+ description: parsed.description,
183
+ includes: parsed.includes.filter((v) => typeof v === 'string'),
184
+ };
185
+ }
186
+ catch {
187
+ return null;
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+ /**
193
+ * Return the active permission set name from AGENTS_PERMISSION_SET env var,
194
+ * or null if unset. Caller decides the default behavior when null.
195
+ */
196
+ export function getActivePermissionSetName() {
197
+ const v = process.env[PERMISSION_SET_ENV_VAR];
198
+ return v && v.trim() ? v.trim() : null;
199
+ }
152
200
  /**
153
201
  * Build a PermissionSet from selected groups.
154
202
  * Concatenates allow/deny rules from each group.
@@ -157,18 +205,25 @@ export function getTotalPermissionRuleCount() {
157
205
  * permission files often contain unescaped nested quotes that break YAML.
158
206
  */
159
207
  export function buildPermissionsFromGroups(groupNames) {
160
- const groupsDir = path.join(getPermissionsDir(), 'groups');
161
208
  const allAllow = [];
162
209
  const allDeny = [];
163
210
  for (const groupName of groupNames) {
164
- // Try both .yaml and .yml extensions
165
- let filePath = path.join(groupsDir, `${groupName}.yaml`);
166
- if (!fs.existsSync(filePath)) {
167
- filePath = path.join(groupsDir, `${groupName}.yml`);
211
+ // Search user dir first, then system dir
212
+ let filePath = null;
213
+ for (const baseDir of [getUserPermissionsDir(), getPermissionsDir()]) {
214
+ const groupsDir = path.join(baseDir, 'groups');
215
+ for (const ext of ['.yaml', '.yml']) {
216
+ const candidate = safeJoin(groupsDir, `${groupName}${ext}`);
217
+ if (fs.existsSync(candidate)) {
218
+ filePath = candidate;
219
+ break;
220
+ }
221
+ }
222
+ if (filePath)
223
+ break;
168
224
  }
169
- if (!fs.existsSync(filePath)) {
225
+ if (!filePath)
170
226
  continue;
171
- }
172
227
  try {
173
228
  const content = fs.readFileSync(filePath, 'utf-8');
174
229
  // Extract rules using line-by-line regex (more robust than YAML parsing)
@@ -241,7 +296,7 @@ export function listInstalledPermissions() {
241
296
  export function getPermissionSet(name) {
242
297
  const dir = getPermissionsDir();
243
298
  for (const ext of ['.yml', '.yaml']) {
244
- const filePath = path.join(dir, name + ext);
299
+ const filePath = safeJoin(dir, name + ext);
245
300
  if (fs.existsSync(filePath)) {
246
301
  const set = parsePermissionSet(filePath);
247
302
  if (set) {
@@ -260,7 +315,7 @@ export function installPermissionSet(sourcePath, name) {
260
315
  if (!set) {
261
316
  return { success: false, error: 'Invalid permission file' };
262
317
  }
263
- const targetPath = path.join(getPermissionsDir(), name + '.yml');
318
+ const targetPath = safeJoin(getPermissionsDir(), name + '.yml');
264
319
  try {
265
320
  fs.copyFileSync(sourcePath, targetPath);
266
321
  return { success: true };
@@ -275,7 +330,7 @@ export function installPermissionSet(sourcePath, name) {
275
330
  export function removePermissionSet(name) {
276
331
  const dir = getPermissionsDir();
277
332
  for (const ext of ['.yml', '.yaml']) {
278
- const filePath = path.join(dir, name + ext);
333
+ const filePath = safeJoin(dir, name + ext);
279
334
  if (fs.existsSync(filePath)) {
280
335
  try {
281
336
  fs.unlinkSync(filePath);
@@ -316,6 +371,8 @@ function parseCanonicalPattern(permission) {
316
371
  return null;
317
372
  return { tool: match[1].toLowerCase(), pattern: match[2] };
318
373
  }
374
+ /** Blanket-Bash canonical forms that mean "allow any bash command". */
375
+ const BLANKET_BASH_FORMS = new Set(['Bash', 'Bash(*)', 'Bash(**)']);
319
376
  /**
320
377
  * Convert canonical permission set to OpenCode format.
321
378
  * OpenCode uses: { permission: { bash: { "git *": "allow", "rm *": "deny" } } }
@@ -324,6 +381,12 @@ export function convertToOpenCodeFormat(set) {
324
381
  const bashPermissions = {};
325
382
  // Process allow list
326
383
  for (const perm of set.allow) {
384
+ if (BLANKET_BASH_FORMS.has(perm)) {
385
+ // Bare "Bash" has no parens so parseCanonicalPattern returns null;
386
+ // normalize all three blanket forms to "*".
387
+ bashPermissions['*'] = 'allow';
388
+ continue;
389
+ }
327
390
  const parsed = parseCanonicalPattern(perm);
328
391
  if (parsed && parsed.tool === 'bash') {
329
392
  bashPermissions[parsed.pattern] = 'allow';
@@ -350,10 +413,16 @@ export function convertToOpenCodeFormat(set) {
350
413
  */
351
414
  export function convertToCodexFormat(set, cwd) {
352
415
  const result = {};
353
- // Check for broad bash permissions -> suggest full-auto
416
+ // Check for broad bash permissions -> suggest full-auto.
417
+ // Treat the bare blanket form "Bash" the same as "Bash(*)" / "Bash(**)";
418
+ // parseCanonicalPattern requires parens so "Bash" alone wouldn't match
419
+ // otherwise — the difference determines whether a pod runs unattended
420
+ // (approval_policy: 'never') or stalls on interactive approvals.
354
421
  const hasBroadBash = set.allow.some((p) => {
422
+ if (BLANKET_BASH_FORMS.has(p))
423
+ return true;
355
424
  const parsed = parseCanonicalPattern(p);
356
- return parsed && parsed.tool === 'bash' && (parsed.pattern === '*' || parsed.pattern === '**');
425
+ return parsed !== null && parsed.tool === 'bash' && (parsed.pattern === '*' || parsed.pattern === '**');
357
426
  });
358
427
  if (hasBroadBash) {
359
428
  result.approval_policy = 'never';
@@ -946,7 +1015,7 @@ export function exportPermissionsFromPath(filePath) {
946
1015
  */
947
1016
  export function savePermissionSet(set) {
948
1017
  ensurePermissionsDir();
949
- const filePath = path.join(getPermissionsDir(), set.name + '.yml');
1018
+ const filePath = safeJoin(getUserPermissionsDir(), set.name + '.yml');
950
1019
  try {
951
1020
  const content = yaml.stringify({
952
1021
  name: set.name,
@@ -961,6 +1030,7 @@ export function savePermissionSet(set) {
961
1030
  return { success: false, error: err.message };
962
1031
  }
963
1032
  }
1033
+ /** Name used for the default permission set in central storage. */
964
1034
  const DEFAULT_PERMISSION_SET_NAME = 'default';
965
1035
  /**
966
1036
  * Get the default permission set from central storage.
@@ -1019,4 +1089,3 @@ export function saveDefaultPermissionSet(set) {
1019
1089
  set.name = DEFAULT_PERMISSION_SET_NAME;
1020
1090
  return savePermissionSet(set);
1021
1091
  }
1022
- //# sourceMappingURL=permissions.js.map
@@ -1,3 +1,11 @@
1
+ /**
2
+ * Interactive fuzzy-filter picker built on @inquirer/core.
3
+ *
4
+ * Provides a searchable, paginated list UI with optional preview pane
5
+ * for selecting items in the terminal. Used by session picker, command
6
+ * picker, and other interactive selection flows.
7
+ */
8
+ /** Configuration for the interactive picker prompt. */
1
9
  export interface PickerConfig<T> {
2
10
  message: string;
3
11
  items: T[];
@@ -10,8 +18,9 @@ export interface PickerConfig<T> {
10
18
  emptyMessage?: string;
11
19
  enterHint?: string;
12
20
  }
21
+ /** The result returned when the user selects an item. */
13
22
  export interface PickedItem<T> {
14
23
  item: T;
15
24
  }
25
+ /** Show an interactive fuzzy-filter picker and return the selected item, or null on cancel. */
16
26
  export declare function itemPicker<T>(config: PickerConfig<T>): Promise<PickedItem<T> | null>;
17
- //# sourceMappingURL=picker.d.ts.map
@@ -1,5 +1,20 @@
1
+ /**
2
+ * Interactive fuzzy-filter picker built on @inquirer/core.
3
+ *
4
+ * Provides a searchable, paginated list UI with optional preview pane
5
+ * for selecting items in the terminal. Used by session picker, command
6
+ * picker, and other interactive selection flows.
7
+ */
8
+ /**
9
+ * Custom inquirer prompt for searchable, scrollable selection lists.
10
+ *
11
+ * Extends @inquirer/core to support type-ahead filtering, column-aligned
12
+ * display, and keyboard navigation. Used by sessions, teams, and other
13
+ * interactive pickers throughout the CLI.
14
+ */
1
15
  import { createPrompt, useState, useKeypress, useEffect, useMemo, usePagination, usePrefix, makeTheme, isEnterKey, isUpKey, isDownKey, isSpaceKey, Separator, } from '@inquirer/core';
2
16
  import chalk from 'chalk';
17
+ /** Show an interactive fuzzy-filter picker and return the selected item, or null on cancel. */
3
18
  export function itemPicker(config) {
4
19
  const prompt = createPrompt((cfg, done) => {
5
20
  const theme = makeTheme({});
@@ -92,4 +107,3 @@ export function itemPicker(config) {
92
107
  });
93
108
  return prompt(config);
94
109
  }
95
- //# sourceMappingURL=picker.js.map
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Plugin discovery, validation, and syncing.
3
+ *
4
+ * Plugins are bundles in ~/.agents/plugins/ that package skills, hooks, and
5
+ * scripts under a single manifest (plugin.yaml). This module discovers plugins,
6
+ * validates their manifests, and syncs their contents into agent version homes.
7
+ */
1
8
  import type { AgentId, DiscoveredPlugin, PluginManifest } from './types.js';
2
9
  /**
3
10
  * Discover all plugins in ~/.agents/plugins/.
@@ -70,4 +77,3 @@ export declare function removePluginFromVersion(pluginName: string, pluginRoot:
70
77
  * where the plugin no longer exists in ~/.agents/plugins/.
71
78
  */
72
79
  export declare function cleanOrphanedPluginSkills(agent: AgentId, versionHome: string, activePluginNames: Set<string>): string[];
73
- //# sourceMappingURL=plugins.d.ts.map
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Plugin discovery, validation, and syncing.
3
+ *
4
+ * Plugins are bundles in ~/.agents/plugins/ that package skills, hooks, and
5
+ * scripts under a single manifest (plugin.yaml). This module discovers plugins,
6
+ * validates their manifests, and syncs their contents into agent version homes.
7
+ */
1
8
  import * as fs from 'fs';
2
9
  import * as path from 'path';
3
10
  import { getPluginsDir } from './state.js';
@@ -46,6 +53,9 @@ export function loadPluginManifest(pluginRoot) {
46
53
  const parsed = JSON.parse(content);
47
54
  if (!parsed.name || !parsed.version)
48
55
  return null;
56
+ if (/[/\\]/.test(parsed.name) || parsed.name.includes('..') || parsed.name.includes('\0')) {
57
+ return null;
58
+ }
49
59
  return parsed;
50
60
  }
51
61
  catch {
@@ -546,4 +556,3 @@ export function cleanOrphanedPluginSkills(agent, versionHome, activePluginNames)
546
556
  }
547
557
  return removed;
548
558
  }
549
- //# sourceMappingURL=plugins.js.map
@@ -1,4 +1,11 @@
1
+ /**
2
+ * Built-in profile presets for popular model providers.
3
+ *
4
+ * Each preset bundles a host CLI, API base URL, default model, and provider
5
+ * name so users can `agents profiles add kimi` without manual configuration.
6
+ */
1
7
  import type { AgentId } from './types.js';
8
+ /** A pre-configured profile template for a model provider. */
2
9
  export interface Preset {
3
10
  name: string;
4
11
  description: string;
@@ -9,7 +16,9 @@ export interface Preset {
9
16
  signupUrl?: string;
10
17
  }
11
18
  export declare const PRESETS: Preset[];
19
+ /** Look up a preset by name (case-sensitive). */
12
20
  export declare function getPreset(name: string): Preset | undefined;
21
+ /** Return a copy of all available presets. */
13
22
  export declare function listPresets(): Preset[];
23
+ /** Return the unique set of provider names across all presets. */
14
24
  export declare function listProviders(): string[];
15
- //# sourceMappingURL=profiles-presets.d.ts.map
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Built-in profile presets for popular model providers.
3
+ *
4
+ * Each preset bundles a host CLI, API base URL, default model, and provider
5
+ * name so users can `agents profiles add kimi` without manual configuration.
6
+ */
1
7
  // Model IDs verified against openrouter.ai/api/v1/models on 2026-04-20.
2
8
  // Presets target the top-ranked open-source model per provider based on
3
9
  // SWE-bench Verified, LiveCodeBench, HumanEval, and Chatbot Arena rankings.
@@ -83,13 +89,15 @@ export const PRESETS = [
83
89
  },
84
90
  },
85
91
  ];
92
+ /** Look up a preset by name (case-sensitive). */
86
93
  export function getPreset(name) {
87
94
  return PRESETS.find((p) => p.name === name);
88
95
  }
96
+ /** Return a copy of all available presets. */
89
97
  export function listPresets() {
90
98
  return [...PRESETS];
91
99
  }
100
+ /** Return the unique set of provider names across all presets. */
92
101
  export function listProviders() {
93
102
  return [...new Set(PRESETS.map((p) => p.provider))];
94
103
  }
95
- //# sourceMappingURL=profiles-presets.js.map
@@ -1,5 +1,13 @@
1
+ /**
2
+ * Profile management -- named bundles of (host CLI, endpoint, model, auth).
3
+ *
4
+ * Profiles let users run agents against alternative providers (OpenRouter,
5
+ * custom endpoints) without reconfiguring the agent CLI itself. Stored as
6
+ * YAML files under ~/.agents/profiles/.
7
+ */
1
8
  import type { AgentId } from './types.js';
2
9
  import { type Preset } from './profiles-presets.js';
10
+ /** A named profile binding an agent host, env vars, and optional keychain auth. */
3
11
  export interface Profile {
4
12
  name: string;
5
13
  host: {
@@ -15,21 +23,47 @@ export interface Profile {
15
23
  preset?: string;
16
24
  provider?: string;
17
25
  }
26
+ /** Get the directory where profile YAML files are stored. */
18
27
  export declare function getProfilesDir(): string;
28
+ /** Validate a profile name against the allowed pattern. Throws on invalid input. */
19
29
  export declare function validateProfileName(name: string): void;
30
+ /** Check whether a profile YAML file exists on disk. */
20
31
  export declare function profileExists(name: string): boolean;
32
+ /** Read and parse a profile from disk. Throws if not found or malformed. */
21
33
  export declare function readProfile(name: string): Profile;
34
+ /** Write a profile to disk atomically (write-to-tmp then rename). */
22
35
  export declare function writeProfile(profile: Profile): void;
36
+ /** Delete a profile from disk. Returns false if it did not exist. */
23
37
  export declare function deleteProfile(name: string): boolean;
38
+ /** List all valid profiles, sorted by name. Malformed files are silently skipped. */
24
39
  export declare function listProfiles(): Profile[];
40
+ /**
41
+ * Build a profile from a preset. The keychain item is shared across all
42
+ * profiles that point at the same provider, so adding kimi + deepseek prompts
43
+ * for the OpenRouter key exactly once.
44
+ */
25
45
  export declare function profileFromPreset(profileName: string, preset: Preset, version?: string): Profile;
46
+ /**
47
+ * Resolve a profile into the env block that should be injected into the
48
+ * spawned agent process. Reads the token from keychain at exec time so the
49
+ * profile YAML never holds secrets.
50
+ */
26
51
  export declare function resolveProfileEnv(profile: Profile): Record<string, string>;
52
+ /** Resolved profile data ready for spawning an agent process. */
27
53
  export interface ResolvedProfileRun {
28
54
  agent: AgentId;
29
55
  version?: string;
30
56
  env: Record<string, string>;
31
57
  profileName: string;
32
58
  }
59
+ /**
60
+ * Resolve a name into (agent, version, env). Throws if the name is not a
61
+ * profile. Callers are expected to try agent-id resolution first and fall
62
+ * back to this when that fails, so we don't need a "isProfile" probe.
63
+ */
33
64
  export declare function resolveProfileForRun(name: string): ResolvedProfileRun;
65
+ /**
66
+ * Look up the preset a profile was created from, if any. Used by
67
+ * `profiles view` to show upstream metadata like signup URLs.
68
+ */
34
69
  export declare function getPresetForProfile(profile: Profile): Preset | undefined;
35
- //# sourceMappingURL=profiles.d.ts.map
@@ -1,24 +1,35 @@
1
+ /**
2
+ * Profile management -- named bundles of (host CLI, endpoint, model, auth).
3
+ *
4
+ * Profiles let users run agents against alternative providers (OpenRouter,
5
+ * custom endpoints) without reconfiguring the agent CLI itself. Stored as
6
+ * YAML files under ~/.agents/profiles/.
7
+ */
1
8
  import * as fs from 'fs';
2
9
  import * as path from 'path';
3
10
  import * as yaml from 'yaml';
4
- import { getAgentsDir } from './state.js';
5
- import { getKeychainToken, keychainItemName } from './profiles-keychain.js';
11
+ import { getUserAgentsDir } from './state.js';
12
+ import { getKeychainToken, keychainItemName } from './secrets/profiles.js';
6
13
  import { getPreset } from './profiles-presets.js';
7
14
  const PROFILE_NAME_PATTERN = /^[a-z0-9][a-z0-9-_]{0,48}$/i;
15
+ /** Get the directory where profile YAML files are stored. */
8
16
  export function getProfilesDir() {
9
- return path.join(getAgentsDir(), 'profiles');
17
+ return path.join(getUserAgentsDir(), 'profiles');
10
18
  }
11
19
  function profilePath(name) {
12
20
  return path.join(getProfilesDir(), `${name}.yml`);
13
21
  }
22
+ /** Validate a profile name against the allowed pattern. Throws on invalid input. */
14
23
  export function validateProfileName(name) {
15
24
  if (!PROFILE_NAME_PATTERN.test(name)) {
16
25
  throw new Error(`Invalid profile name '${name}'. Use letters, digits, dash, underscore (max 48 chars).`);
17
26
  }
18
27
  }
28
+ /** Check whether a profile YAML file exists on disk. */
19
29
  export function profileExists(name) {
20
30
  return fs.existsSync(profilePath(name));
21
31
  }
32
+ /** Read and parse a profile from disk. Throws if not found or malformed. */
22
33
  export function readProfile(name) {
23
34
  validateProfileName(name);
24
35
  const file = profilePath(name);
@@ -40,6 +51,7 @@ export function readProfile(name) {
40
51
  }
41
52
  return parsed;
42
53
  }
54
+ /** Write a profile to disk atomically (write-to-tmp then rename). */
43
55
  export function writeProfile(profile) {
44
56
  validateProfileName(profile.name);
45
57
  const dir = getProfilesDir();
@@ -50,6 +62,7 @@ export function writeProfile(profile) {
50
62
  fs.writeFileSync(tmp, body, 'utf-8');
51
63
  fs.renameSync(tmp, file);
52
64
  }
65
+ /** Delete a profile from disk. Returns false if it did not exist. */
53
66
  export function deleteProfile(name) {
54
67
  validateProfileName(name);
55
68
  const file = profilePath(name);
@@ -58,6 +71,7 @@ export function deleteProfile(name) {
58
71
  fs.unlinkSync(file);
59
72
  return true;
60
73
  }
74
+ /** List all valid profiles, sorted by name. Malformed files are silently skipped. */
61
75
  export function listProfiles() {
62
76
  const dir = getProfilesDir();
63
77
  if (!fs.existsSync(dir))
@@ -75,9 +89,11 @@ export function listProfiles() {
75
89
  }
76
90
  return profiles.sort((a, b) => a.name.localeCompare(b.name));
77
91
  }
78
- // Build a profile from a preset. The keychain item is shared across all
79
- // profiles that point at the same provider, so adding kimi + deepseek prompts
80
- // for the OpenRouter key exactly once.
92
+ /**
93
+ * Build a profile from a preset. The keychain item is shared across all
94
+ * profiles that point at the same provider, so adding kimi + deepseek prompts
95
+ * for the OpenRouter key exactly once.
96
+ */
81
97
  export function profileFromPreset(profileName, preset, version) {
82
98
  return {
83
99
  name: profileName,
@@ -92,9 +108,11 @@ export function profileFromPreset(profileName, preset, version) {
92
108
  provider: preset.provider,
93
109
  };
94
110
  }
95
- // Resolve a profile into the env block that should be injected into the
96
- // spawned agent process. Reads the token from keychain at exec time so the
97
- // profile YAML never holds secrets.
111
+ /**
112
+ * Resolve a profile into the env block that should be injected into the
113
+ * spawned agent process. Reads the token from keychain at exec time so the
114
+ * profile YAML never holds secrets.
115
+ */
98
116
  export function resolveProfileEnv(profile) {
99
117
  const env = { ...profile.env };
100
118
  if (profile.auth) {
@@ -103,9 +121,11 @@ export function resolveProfileEnv(profile) {
103
121
  }
104
122
  return env;
105
123
  }
106
- // Resolve a name into (agent, version, env). Throws if the name is not a
107
- // profile. Callers are expected to try agent-id resolution first and fall
108
- // back to this when that fails, so we don't need a "isProfile" probe.
124
+ /**
125
+ * Resolve a name into (agent, version, env). Throws if the name is not a
126
+ * profile. Callers are expected to try agent-id resolution first and fall
127
+ * back to this when that fails, so we don't need a "isProfile" probe.
128
+ */
109
129
  export function resolveProfileForRun(name) {
110
130
  const profile = readProfile(name);
111
131
  return {
@@ -115,9 +135,10 @@ export function resolveProfileForRun(name) {
115
135
  profileName: profile.name,
116
136
  };
117
137
  }
118
- // Look up the preset a profile was created from, if any. Used by
119
- // `profiles view` to show upstream metadata like signup URLs.
138
+ /**
139
+ * Look up the preset a profile was created from, if any. Used by
140
+ * `profiles view` to show upstream metadata like signup URLs.
141
+ */
120
142
  export function getPresetForProfile(profile) {
121
143
  return profile.preset ? getPreset(profile.preset) : undefined;
122
144
  }
123
- //# sourceMappingURL=profiles.js.map
@@ -4,6 +4,7 @@
4
4
  * Thin client that connects to the PTY sidecar server over unix socket.
5
5
  * Each call opens a connection, sends a JSON request, reads the JSON response, and closes.
6
6
  */
7
+ /** JSON response envelope from the PTY server. */
7
8
  export interface PtyResponse {
8
9
  ok: boolean;
9
10
  error?: string;
@@ -19,4 +20,3 @@ export declare function ptyRequest(action: string, id?: string, params?: Record<
19
20
  * Handles: \n \r \t \e \xHH \\
20
21
  */
21
22
  export declare function unescapeInput(input: string): string;
22
- //# sourceMappingURL=pty-client.d.ts.map
@@ -178,4 +178,3 @@ export function unescapeInput(input) {
178
178
  }
179
179
  });
180
180
  }
181
- //# sourceMappingURL=pty-client.js.map
@@ -6,11 +6,25 @@
6
6
  * across multiple CLI invocations. Each session holds a real PTY (via node-pty)
7
7
  * and a headless terminal emulator (via @xterm/headless) for screen rendering.
8
8
  *
9
- * Protocol: newline-delimited JSON over ~/.agents/pty.sock
9
+ * Protocol: newline-delimited JSON over ~/.agents-system/pty.sock
10
10
  */
11
+ /**
12
+ * Capture a stable identifier for a process at the moment it was started.
13
+ * Used to defeat PID reuse: a kill(pid, ...) is only safe when the process
14
+ * still occupies the PID we observed at spawn time.
15
+ *
16
+ * Linux: field 22 of /proc/<pid>/stat (starttime in clock ticks since boot).
17
+ * macOS: output of `ps -o lstart= -p <pid>` (start time in human format).
18
+ * Returns null on any error so callers can skip the guard rather than crash.
19
+ */
20
+ export declare function captureProcessStartTime(pid: number): string | null;
21
+ /** Get the unix socket path for the PTY server. */
11
22
  export declare function getSocketPath(): string;
23
+ /** Get the path to the PTY server PID file. */
12
24
  export declare function getPtyPidPath(): string;
25
+ /** Get the path to the PTY server log file. */
13
26
  export declare function getPtyLogPath(): string;
27
+ /** Check if the PTY server process is alive by probing the stored PID. */
14
28
  export declare function isPtyServerRunning(): boolean;
29
+ /** Start the PTY sidecar server, listening on the unix socket for JSON requests. */
15
30
  export declare function runPtyServer(): Promise<void>;
16
- //# sourceMappingURL=pty-server.d.ts.map