@phnx-labs/agents-cli 1.12.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 (496) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/README.md +293 -300
  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 +10 -0
  8. package/dist/commands/cloud.js +408 -0
  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 +207 -20
  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 +45 -6
  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 +11 -0
  38. package/dist/commands/profiles.js +291 -0
  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 +93 -129
  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 +10 -0
  56. package/dist/commands/secrets.js +511 -0
  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 +288 -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 +353 -20
  83. package/dist/index.d.ts +7 -2
  84. package/dist/index.js +205 -38
  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 +207 -23
  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 +25 -0
  104. package/dist/lib/cloud/codex.js +250 -0
  105. package/dist/lib/cloud/factory.d.ts +31 -0
  106. package/dist/lib/cloud/factory.js +53 -0
  107. package/dist/lib/cloud/registry.d.ts +15 -0
  108. package/dist/lib/cloud/registry.js +67 -0
  109. package/dist/lib/cloud/rush.d.ts +75 -0
  110. package/dist/lib/cloud/rush.js +438 -0
  111. package/dist/lib/cloud/store.d.ts +22 -0
  112. package/dist/lib/cloud/store.js +115 -0
  113. package/dist/lib/cloud/stream.d.ts +23 -0
  114. package/dist/lib/cloud/stream.js +194 -0
  115. package/dist/lib/cloud/types.d.ts +205 -0
  116. package/dist/lib/cloud/types.js +34 -0
  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 +25 -5
  128. package/dist/lib/exec.js +72 -27
  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 +191 -21
  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 +25 -11
  156. package/dist/lib/models.js +405 -16
  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 +24 -0
  168. package/dist/lib/profiles-presets.js +103 -0
  169. package/dist/lib/profiles.d.ts +69 -0
  170. package/dist/lib/profiles.js +144 -0
  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 +79 -0
  180. package/dist/lib/rotate.js +285 -0
  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 +39 -0
  195. package/dist/lib/secrets/bundles.js +189 -0
  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 +16 -0
  203. package/dist/lib/session/artifacts.js +95 -0
  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 +24 -2
  219. package/dist/lib/session/types.js +10 -2
  220. package/dist/lib/shims.d.ts +93 -5
  221. package/dist/lib/shims.js +380 -67
  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 +114 -22
  227. package/dist/lib/state.js +323 -138
  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 +48 -1
  257. package/dist/lib/usage.js +97 -16
  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 +39 -4
  261. package/dist/lib/versions.js +401 -111
  262. package/package.json +33 -18
  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/commands.d.ts.map +0 -1
  269. package/dist/commands/commands.js.map +0 -1
  270. package/dist/commands/daemon.d.ts.map +0 -1
  271. package/dist/commands/daemon.js.map +0 -1
  272. package/dist/commands/drive.d.ts.map +0 -1
  273. package/dist/commands/drive.js.map +0 -1
  274. package/dist/commands/exec.d.ts.map +0 -1
  275. package/dist/commands/exec.js.map +0 -1
  276. package/dist/commands/fork.d.ts.map +0 -1
  277. package/dist/commands/fork.js.map +0 -1
  278. package/dist/commands/hooks.d.ts.map +0 -1
  279. package/dist/commands/hooks.js.map +0 -1
  280. package/dist/commands/init.d.ts.map +0 -1
  281. package/dist/commands/init.js.map +0 -1
  282. package/dist/commands/mcp.d.ts.map +0 -1
  283. package/dist/commands/mcp.js.map +0 -1
  284. package/dist/commands/models.d.ts.map +0 -1
  285. package/dist/commands/models.js.map +0 -1
  286. package/dist/commands/packages.d.ts.map +0 -1
  287. package/dist/commands/packages.js.map +0 -1
  288. package/dist/commands/permissions.d.ts.map +0 -1
  289. package/dist/commands/permissions.js.map +0 -1
  290. package/dist/commands/plugins.d.ts.map +0 -1
  291. package/dist/commands/plugins.js.map +0 -1
  292. package/dist/commands/pty.d.ts.map +0 -1
  293. package/dist/commands/pty.js.map +0 -1
  294. package/dist/commands/pull.d.ts.map +0 -1
  295. package/dist/commands/pull.js.map +0 -1
  296. package/dist/commands/push.d.ts +0 -3
  297. package/dist/commands/push.d.ts.map +0 -1
  298. package/dist/commands/push.js +0 -180
  299. package/dist/commands/push.js.map +0 -1
  300. package/dist/commands/refresh-memory.d.ts.map +0 -1
  301. package/dist/commands/refresh-memory.js.map +0 -1
  302. package/dist/commands/resource-view.d.ts.map +0 -1
  303. package/dist/commands/resource-view.js.map +0 -1
  304. package/dist/commands/routines.d.ts.map +0 -1
  305. package/dist/commands/routines.js.map +0 -1
  306. package/dist/commands/rules.d.ts.map +0 -1
  307. package/dist/commands/rules.js.map +0 -1
  308. package/dist/commands/sessions-picker.d.ts.map +0 -1
  309. package/dist/commands/sessions-picker.js.map +0 -1
  310. package/dist/commands/sessions.d.ts.map +0 -1
  311. package/dist/commands/sessions.js.map +0 -1
  312. package/dist/commands/skills.d.ts.map +0 -1
  313. package/dist/commands/skills.js.map +0 -1
  314. package/dist/commands/status.d.ts.map +0 -1
  315. package/dist/commands/status.js.map +0 -1
  316. package/dist/commands/subagents.d.ts.map +0 -1
  317. package/dist/commands/subagents.js.map +0 -1
  318. package/dist/commands/sync.d.ts.map +0 -1
  319. package/dist/commands/sync.js.map +0 -1
  320. package/dist/commands/teams-picker.d.ts.map +0 -1
  321. package/dist/commands/teams-picker.js.map +0 -1
  322. package/dist/commands/teams.d.ts.map +0 -1
  323. package/dist/commands/teams.js.map +0 -1
  324. package/dist/commands/utils.d.ts.map +0 -1
  325. package/dist/commands/utils.js.map +0 -1
  326. package/dist/commands/versions.d.ts.map +0 -1
  327. package/dist/commands/versions.js.map +0 -1
  328. package/dist/commands/view.d.ts.map +0 -1
  329. package/dist/commands/view.js.map +0 -1
  330. package/dist/index.d.ts.map +0 -1
  331. package/dist/index.js.map +0 -1
  332. package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
  333. package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
  334. package/dist/lib/__tests__/bugfixes.test.js +0 -192
  335. package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
  336. package/dist/lib/__tests__/exec.test.d.ts +0 -2
  337. package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
  338. package/dist/lib/__tests__/exec.test.js +0 -446
  339. package/dist/lib/__tests__/exec.test.js.map +0 -1
  340. package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
  341. package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
  342. package/dist/lib/__tests__/git-sync.test.js +0 -138
  343. package/dist/lib/__tests__/git-sync.test.js.map +0 -1
  344. package/dist/lib/__tests__/hooks.test.d.ts +0 -2
  345. package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
  346. package/dist/lib/__tests__/hooks.test.js +0 -203
  347. package/dist/lib/__tests__/hooks.test.js.map +0 -1
  348. package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
  349. package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
  350. package/dist/lib/__tests__/memory-compile.test.js +0 -95
  351. package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
  352. package/dist/lib/__tests__/models.test.d.ts +0 -2
  353. package/dist/lib/__tests__/models.test.d.ts.map +0 -1
  354. package/dist/lib/__tests__/models.test.js +0 -184
  355. package/dist/lib/__tests__/models.test.js.map +0 -1
  356. package/dist/lib/__tests__/usage.test.d.ts +0 -2
  357. package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
  358. package/dist/lib/__tests__/usage.test.js +0 -218
  359. package/dist/lib/__tests__/usage.test.js.map +0 -1
  360. package/dist/lib/agents.d.ts.map +0 -1
  361. package/dist/lib/agents.js.map +0 -1
  362. package/dist/lib/artifact-actions.d.ts.map +0 -1
  363. package/dist/lib/artifact-actions.js.map +0 -1
  364. package/dist/lib/commands.d.ts.map +0 -1
  365. package/dist/lib/commands.js.map +0 -1
  366. package/dist/lib/convert.d.ts.map +0 -1
  367. package/dist/lib/convert.js.map +0 -1
  368. package/dist/lib/daemon.d.ts.map +0 -1
  369. package/dist/lib/daemon.js.map +0 -1
  370. package/dist/lib/drive-sync.d.ts.map +0 -1
  371. package/dist/lib/drive-sync.js.map +0 -1
  372. package/dist/lib/exec.d.ts.map +0 -1
  373. package/dist/lib/exec.js.map +0 -1
  374. package/dist/lib/factory.d.ts +0 -57
  375. package/dist/lib/factory.d.ts.map +0 -1
  376. package/dist/lib/factory.js +0 -110
  377. package/dist/lib/factory.js.map +0 -1
  378. package/dist/lib/git.d.ts.map +0 -1
  379. package/dist/lib/git.js.map +0 -1
  380. package/dist/lib/help.d.ts.map +0 -1
  381. package/dist/lib/help.js.map +0 -1
  382. package/dist/lib/hooks.d.ts.map +0 -1
  383. package/dist/lib/hooks.js.map +0 -1
  384. package/dist/lib/manifest.d.ts.map +0 -1
  385. package/dist/lib/manifest.js.map +0 -1
  386. package/dist/lib/markdown.d.ts.map +0 -1
  387. package/dist/lib/markdown.js.map +0 -1
  388. package/dist/lib/mcp.d.ts.map +0 -1
  389. package/dist/lib/mcp.js.map +0 -1
  390. package/dist/lib/memory-compile.d.ts.map +0 -1
  391. package/dist/lib/memory-compile.js.map +0 -1
  392. package/dist/lib/memory.d.ts.map +0 -1
  393. package/dist/lib/memory.js.map +0 -1
  394. package/dist/lib/models.d.ts.map +0 -1
  395. package/dist/lib/models.js.map +0 -1
  396. package/dist/lib/permissions.d.ts.map +0 -1
  397. package/dist/lib/permissions.js.map +0 -1
  398. package/dist/lib/picker.d.ts.map +0 -1
  399. package/dist/lib/picker.js.map +0 -1
  400. package/dist/lib/plugins.d.ts.map +0 -1
  401. package/dist/lib/plugins.js.map +0 -1
  402. package/dist/lib/pty-client.d.ts.map +0 -1
  403. package/dist/lib/pty-client.js.map +0 -1
  404. package/dist/lib/pty-server.d.ts.map +0 -1
  405. package/dist/lib/pty-server.js.map +0 -1
  406. package/dist/lib/registry.d.ts.map +0 -1
  407. package/dist/lib/registry.js.map +0 -1
  408. package/dist/lib/resources.d.ts.map +0 -1
  409. package/dist/lib/resources.js.map +0 -1
  410. package/dist/lib/routines.d.ts.map +0 -1
  411. package/dist/lib/routines.js.map +0 -1
  412. package/dist/lib/runner.d.ts.map +0 -1
  413. package/dist/lib/runner.js.map +0 -1
  414. package/dist/lib/sandbox.d.ts.map +0 -1
  415. package/dist/lib/sandbox.js.map +0 -1
  416. package/dist/lib/scheduler.d.ts.map +0 -1
  417. package/dist/lib/scheduler.js.map +0 -1
  418. package/dist/lib/session/__tests__/db.test.d.ts +0 -2
  419. package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
  420. package/dist/lib/session/__tests__/db.test.js +0 -54
  421. package/dist/lib/session/__tests__/db.test.js.map +0 -1
  422. package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
  423. package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
  424. package/dist/lib/session/__tests__/discover.test.js +0 -63
  425. package/dist/lib/session/__tests__/discover.test.js.map +0 -1
  426. package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
  427. package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
  428. package/dist/lib/session/__tests__/prompt.test.js +0 -44
  429. package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
  430. package/dist/lib/session/__tests__/render.test.d.ts +0 -2
  431. package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
  432. package/dist/lib/session/__tests__/render.test.js +0 -602
  433. package/dist/lib/session/__tests__/render.test.js.map +0 -1
  434. package/dist/lib/session/db.d.ts.map +0 -1
  435. package/dist/lib/session/db.js.map +0 -1
  436. package/dist/lib/session/discover.d.ts.map +0 -1
  437. package/dist/lib/session/discover.js.map +0 -1
  438. package/dist/lib/session/parse.d.ts.map +0 -1
  439. package/dist/lib/session/parse.js.map +0 -1
  440. package/dist/lib/session/prompt.d.ts.map +0 -1
  441. package/dist/lib/session/prompt.js.map +0 -1
  442. package/dist/lib/session/prompt.test.d.ts +0 -2
  443. package/dist/lib/session/prompt.test.d.ts.map +0 -1
  444. package/dist/lib/session/prompt.test.js +0 -57
  445. package/dist/lib/session/prompt.test.js.map +0 -1
  446. package/dist/lib/session/render.d.ts.map +0 -1
  447. package/dist/lib/session/render.js.map +0 -1
  448. package/dist/lib/session/team-filter.d.ts.map +0 -1
  449. package/dist/lib/session/team-filter.js.map +0 -1
  450. package/dist/lib/session/team-filter.test.d.ts +0 -2
  451. package/dist/lib/session/team-filter.test.d.ts.map +0 -1
  452. package/dist/lib/session/team-filter.test.js +0 -157
  453. package/dist/lib/session/team-filter.test.js.map +0 -1
  454. package/dist/lib/session/types.d.ts.map +0 -1
  455. package/dist/lib/session/types.js.map +0 -1
  456. package/dist/lib/shims.d.ts.map +0 -1
  457. package/dist/lib/shims.js.map +0 -1
  458. package/dist/lib/skills.d.ts.map +0 -1
  459. package/dist/lib/skills.js.map +0 -1
  460. package/dist/lib/state.d.ts.map +0 -1
  461. package/dist/lib/state.js.map +0 -1
  462. package/dist/lib/subagents.d.ts.map +0 -1
  463. package/dist/lib/subagents.js.map +0 -1
  464. package/dist/lib/teams/agents.d.ts.map +0 -1
  465. package/dist/lib/teams/agents.js.map +0 -1
  466. package/dist/lib/teams/api.d.ts.map +0 -1
  467. package/dist/lib/teams/api.js.map +0 -1
  468. package/dist/lib/teams/cloud.d.ts +0 -11
  469. package/dist/lib/teams/cloud.d.ts.map +0 -1
  470. package/dist/lib/teams/cloud.js +0 -169
  471. package/dist/lib/teams/cloud.js.map +0 -1
  472. package/dist/lib/teams/debug.d.ts.map +0 -1
  473. package/dist/lib/teams/debug.js.map +0 -1
  474. package/dist/lib/teams/file_ops.d.ts.map +0 -1
  475. package/dist/lib/teams/file_ops.js.map +0 -1
  476. package/dist/lib/teams/parsers.d.ts.map +0 -1
  477. package/dist/lib/teams/parsers.js.map +0 -1
  478. package/dist/lib/teams/persistence.d.ts.map +0 -1
  479. package/dist/lib/teams/persistence.js.map +0 -1
  480. package/dist/lib/teams/ralph.d.ts +0 -8
  481. package/dist/lib/teams/ralph.d.ts.map +0 -1
  482. package/dist/lib/teams/ralph.js +0 -59
  483. package/dist/lib/teams/ralph.js.map +0 -1
  484. package/dist/lib/teams/registry.d.ts.map +0 -1
  485. package/dist/lib/teams/registry.js.map +0 -1
  486. package/dist/lib/teams/summarizer.d.ts.map +0 -1
  487. package/dist/lib/teams/summarizer.js.map +0 -1
  488. package/dist/lib/template.d.ts.map +0 -1
  489. package/dist/lib/template.js.map +0 -1
  490. package/dist/lib/types.d.ts.map +0 -1
  491. package/dist/lib/types.js.map +0 -1
  492. package/dist/lib/usage.d.ts.map +0 -1
  493. package/dist/lib/usage.js.map +0 -1
  494. package/dist/lib/versions.d.ts.map +0 -1
  495. package/dist/lib/versions.js.map +0 -1
  496. package/scripts/rebuild-sqlite.sh +0 -46
@@ -1,10 +1,16 @@
1
1
  import type { AgentId } from './types.js';
2
+ /** Agent execution modes controlling tool access and autonomy level. */
2
3
  export type ExecMode = 'plan' | 'edit' | 'full';
4
+ /** Reasoning effort levels passed to agents that support them. 'auto' defers to the agent's default. */
3
5
  export type ExecEffort = 'low' | 'medium' | 'high' | 'xhigh' | 'max' | 'auto';
6
+ /** Options for spawning an agent process. Omitting `prompt` launches the CLI interactively. */
4
7
  export interface ExecOptions {
5
8
  agent: AgentId;
6
9
  version?: string;
7
- prompt: string;
10
+ /** Omit to launch the CLI interactively -- no prompt, no --print, stdio fully inherited. */
11
+ prompt?: string;
12
+ /** Force interactive mode even when a prompt is provided. */
13
+ interactive?: boolean;
8
14
  mode: ExecMode;
9
15
  effort: ExecEffort;
10
16
  cwd?: string;
@@ -17,8 +23,15 @@ export interface ExecOptions {
17
23
  verbose?: boolean;
18
24
  env?: Record<string, string>;
19
25
  }
26
+ /** Parse an array of KEY=VALUE strings into an env record. Returns undefined for empty input. */
20
27
  export declare function parseExecEnv(entries: string[]): Record<string, string> | undefined;
28
+ /**
29
+ * Build the process environment for an agent invocation.
30
+ * Pins CLAUDE_CONFIG_DIR for Claude and CODEX_HOME for Codex; strips the
31
+ * other agent's env var so it doesn't leak into unrelated invocations.
32
+ */
21
33
  export declare function buildExecEnv(options: ExecOptions): NodeJS.ProcessEnv;
34
+ /** Describes how to translate ExecOptions into CLI arguments for a specific agent. */
22
35
  export interface AgentCommandTemplate {
23
36
  base: string[];
24
37
  promptFlag: 'positional' | string;
@@ -32,26 +45,34 @@ export interface AgentCommandTemplate {
32
45
  printFlags?: string[];
33
46
  verboseFlag?: string;
34
47
  }
48
+ /** CLI command templates for every supported agent. */
35
49
  export declare const AGENT_COMMANDS: Record<AgentId, AgentCommandTemplate>;
50
+ /** Assemble the full CLI argument array for an agent invocation. */
36
51
  export declare function buildExecCommand(options: ExecOptions): string[];
52
+ /** Spawn an agent and return its exit code. Convenience wrapper over spawnAgent. */
37
53
  export declare function execAgent(options: ExecOptions): Promise<number>;
38
54
  /**
39
55
  * Patterns that indicate a rate/usage limit. Matching is intentionally broad
40
- * because providers phrase these differently Anthropic uses "5-hour limit"
56
+ * because providers phrase these differently -- Anthropic uses "5-hour limit"
41
57
  * and "rate limit", OpenAI surfaces 429s, Google says "quota exceeded".
42
58
  * False positives here just trigger a fallback attempt; false negatives leave
43
59
  * the original error unhandled, which is worse.
44
60
  */
45
61
  export declare const RATE_LIMIT_PATTERNS: RegExp[];
62
+ /** Return true if the text contains any known rate-limit or overload indicator. */
46
63
  export declare function detectRateLimit(text: string): boolean;
64
+ /** An agent (with optional pinned version) in a fallback chain. */
47
65
  export interface FallbackEntry {
48
66
  agent: AgentId;
49
67
  /** Optional pinned version (e.g. '0.116.0'). When set, takes precedence over the active default. */
50
68
  version?: string;
51
69
  }
70
+ /** ExecOptions extended with a fallback chain for rate-limit cascading. */
52
71
  export interface FallbackOptions extends ExecOptions {
53
72
  /** Ordered list of agents to try if the primary (options.agent) hits a rate limit. */
54
73
  fallback: FallbackEntry[];
74
+ /** Fallback requires a prompt -- chain handoff doesn't apply to interactive sessions. */
75
+ prompt: string;
55
76
  }
56
77
  /**
57
78
  * Build the prompt handed to the fallback agent when the primary was stopped
@@ -60,7 +81,7 @@ export interface FallbackOptions extends ExecOptions {
60
81
  * When the prior agent was Claude we pin its session ID via `--session-id` so
61
82
  * `prevSessionId` is always defined; for other primaries we pass undefined and
62
83
  * get a simpler retry-with-context prompt. Claude understands `/continue <id>`
63
- * via its shipped skill other agents fall through to an explicit instruction
84
+ * via its shipped skill -- other agents fall through to an explicit instruction
64
85
  * that points at the version-agnostic `agents sessions <id>` reader.
65
86
  */
66
87
  export declare function buildFallbackPrompt(prevAgent: AgentId, prevSessionId: string | undefined, nextAgent: AgentId, originalPrompt: string): string;
@@ -69,7 +90,7 @@ export declare function buildFallbackPrompt(prevAgent: AgentId, prevSessionId: s
69
90
  *
70
91
  * The primary agent gets the original prompt. Subsequent agents get a
71
92
  * `/continue <id>`-style handoff (see buildFallbackPrompt) when we can pin a
72
- * session ID which today means Claude as primary (supports `--session-id`).
93
+ * session ID -- which today means Claude as primary (supports `--session-id`).
73
94
  * For other primaries, fallbacks run with the original prompt plus a
74
95
  * retry-with-context note, since we can't deterministically resolve their
75
96
  * auto-generated session IDs.
@@ -79,4 +100,3 @@ export declare function buildFallbackPrompt(prevAgent: AgentId, prevSessionId: s
79
100
  * instead of an opaque "all agents failed" message.
80
101
  */
81
102
  export declare function runWithFallback(options: FallbackOptions): Promise<number>;
82
- //# sourceMappingURL=exec.d.ts.map
package/dist/lib/exec.js CHANGED
@@ -1,10 +1,18 @@
1
+ /**
2
+ * Agent execution -- command building, process spawning, and rate-limit fallback.
3
+ *
4
+ * Translates high-level ExecOptions into CLI invocations for each supported agent,
5
+ * manages environment isolation per agent, and chains fallback agents on rate limits.
6
+ */
1
7
  import { spawn } from 'child_process';
2
8
  import { randomUUID } from 'crypto';
3
9
  import * as path from 'path';
4
10
  import { parseTimeout } from './routines.js';
5
11
  import { getVersionHomePath, isVersionInstalled, resolveVersion } from './versions.js';
6
12
  import { resolveModel, buildReasoningFlags } from './models.js';
13
+ /** Pattern for valid environment variable names (C identifier rules). */
7
14
  const EXEC_ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
15
+ /** Parse a single KEY=VALUE string into a tuple, validating the key name. */
8
16
  function parseExecEnvEntry(entry) {
9
17
  const separatorIndex = entry.indexOf('=');
10
18
  if (separatorIndex <= 0) {
@@ -17,34 +25,58 @@ function parseExecEnvEntry(entry) {
17
25
  }
18
26
  return [key, value];
19
27
  }
28
+ /** Parse an array of KEY=VALUE strings into an env record. Returns undefined for empty input. */
20
29
  export function parseExecEnv(entries) {
21
30
  if (entries.length === 0) {
22
31
  return undefined;
23
32
  }
24
33
  return Object.fromEntries(entries.map(parseExecEnvEntry));
25
34
  }
35
+ /**
36
+ * Build the process environment for an agent invocation.
37
+ * Pins CLAUDE_CONFIG_DIR for Claude and CODEX_HOME for Codex; strips the
38
+ * other agent's env var so it doesn't leak into unrelated invocations.
39
+ */
26
40
  export function buildExecEnv(options) {
27
41
  const result = { ...process.env };
28
- // CLAUDE_CONFIG_DIR is Claude-specific. When the caller is running inside
29
- // a Claude-managed shell, process.env already carries it; spreading into a
30
- // non-Claude agent's env would leak a config pointer that the target CLI
31
- // doesn't understand. Strip it unless we're actually invoking Claude, and
32
- // when we are, pin it to the resolved version's home.
42
+ // Config-dir env vars are agent-specific. When the caller is running inside
43
+ // an agent-managed shell, process.env already carries one; spreading into a
44
+ // different agent's env would leak a config pointer the target CLI doesn't
45
+ // understand. Strip foreign vars and pin the right one to the versioned home.
33
46
  if (options.agent === 'claude') {
34
47
  const cwd = options.cwd || process.cwd();
35
- const version = options.version || resolveVersion('claude', cwd);
36
- if (version && isVersionInstalled('claude', version)) {
48
+ const resolvedVersion = options.version ?? resolveVersion('claude', cwd);
49
+ // Use an explicitly pinned version unconditionally; for auto-resolved versions
50
+ // only inject the path when the version is actually installed on disk.
51
+ const version = options.version
52
+ ? resolvedVersion
53
+ : (resolvedVersion && isVersionInstalled('claude', resolvedVersion) ? resolvedVersion : null);
54
+ if (version) {
37
55
  result.CLAUDE_CONFIG_DIR = path.join(getVersionHomePath('claude', version), '.claude');
38
56
  }
57
+ delete result.CODEX_HOME;
58
+ }
59
+ else if (options.agent === 'codex') {
60
+ const cwd = options.cwd || process.cwd();
61
+ const resolvedVersion = options.version ?? resolveVersion('codex', cwd);
62
+ const version = options.version
63
+ ? resolvedVersion
64
+ : (resolvedVersion && isVersionInstalled('codex', resolvedVersion) ? resolvedVersion : null);
65
+ if (version) {
66
+ result.CODEX_HOME = path.join(getVersionHomePath('codex', version), '.codex');
67
+ }
68
+ delete result.CLAUDE_CONFIG_DIR;
39
69
  }
40
70
  else {
41
71
  delete result.CLAUDE_CONFIG_DIR;
72
+ delete result.CODEX_HOME;
42
73
  }
43
74
  return {
44
75
  ...result,
45
76
  ...options.env,
46
77
  };
47
78
  }
79
+ /** CLI command templates for every supported agent. */
48
80
  export const AGENT_COMMANDS = {
49
81
  claude: {
50
82
  base: ['claude'],
@@ -164,9 +196,11 @@ export const AGENT_COMMANDS = {
164
196
  modelFlag: '--model',
165
197
  },
166
198
  };
199
+ /** Assemble the full CLI argument array for an agent invocation. */
167
200
  export function buildExecCommand(options) {
168
201
  const template = AGENT_COMMANDS[options.agent];
169
202
  const cmd = [...template.base];
203
+ const interactive = options.interactive === true || options.prompt === undefined;
170
204
  // Use versioned alias if a specific version was requested (e.g., claude@2.1.98)
171
205
  if (options.version && cmd.length > 0) {
172
206
  cmd[0] = `${cmd[0]}@${options.version}`;
@@ -189,8 +223,10 @@ export function buildExecCommand(options) {
189
223
  // Add mode flags
190
224
  const modeFlags = template.modeFlags[options.mode];
191
225
  cmd.push(...modeFlags);
192
- // Add print/headless flags
193
- if (options.headless && template.printFlags) {
226
+ // Add print/headless flags only when a prompt is provided. Without a prompt
227
+ // the caller wants an interactive REPL -- passing --print would immediately
228
+ // wait on stdin and never render the TUI.
229
+ if (!interactive && options.headless && template.printFlags) {
194
230
  cmd.push(...template.printFlags);
195
231
  }
196
232
  // Add session ID (Claude only)
@@ -222,12 +258,16 @@ export function buildExecCommand(options) {
222
258
  cmd.push(template.verboseFlag);
223
259
  }
224
260
  }
225
- // Add prompt
226
- if (template.promptFlag === 'positional') {
227
- cmd.push(options.prompt);
228
- }
229
- else {
230
- cmd.push(template.promptFlag, options.prompt);
261
+ // Add prompt when provided. In pure interactive mode (no prompt) we skip this
262
+ // so the CLI launches its TUI. When --interactive is passed alongside a prompt
263
+ // we still forward the prompt so the agent receives it as the first message.
264
+ if (options.prompt !== undefined) {
265
+ if (template.promptFlag === 'positional') {
266
+ cmd.push(options.prompt);
267
+ }
268
+ else {
269
+ cmd.push(template.promptFlag, options.prompt);
270
+ }
231
271
  }
232
272
  // Claude-specific: add dirs
233
273
  if (options.agent === 'claude' && options.addDirs) {
@@ -237,6 +277,7 @@ export function buildExecCommand(options) {
237
277
  }
238
278
  return cmd;
239
279
  }
280
+ /** Spawn an agent and return its exit code. Convenience wrapper over spawnAgent. */
240
281
  export async function execAgent(options) {
241
282
  const { exitCode } = await spawnAgent(options);
242
283
  return exitCode;
@@ -245,7 +286,7 @@ export async function execAgent(options) {
245
286
  * Spawn an agent process and return its exit code plus a tee'd copy of stderr.
246
287
  *
247
288
  * Stderr is always piped so the caller can inspect it (e.g., for rate-limit
248
- * detection) while also forwarding every chunk to process.stderr in real time
289
+ * detection) while also forwarding every chunk to process.stderr in real time --
249
290
  * the user sees the same output they would with stdio: 'inherit'. Stdout keeps
250
291
  * the original behavior: 'pipe' when downstream output is piped (so `agents
251
292
  * run ... | ...` composes cleanly), otherwise 'inherit' so TTY output is
@@ -256,23 +297,27 @@ async function spawnAgent(options) {
256
297
  const [executable, ...args] = cmd;
257
298
  const timeoutMs = options.timeout ? parseTimeout(options.timeout) : undefined;
258
299
  const piped = !process.stdout.isTTY;
300
+ const interactive = options.interactive === true || options.prompt === undefined;
259
301
  return new Promise((resolve, reject) => {
302
+ // Interactive mode inherits all stdio so the CLI owns the TTY (TUI
303
+ // rendering, raw-mode keystrokes, colored output). Headless mode pipes
304
+ // stderr so we can scan for rate limits and feed fallback. stdout stays
305
+ // inherited for TTY, piped when the caller pipes us downstream.
306
+ const stdio = interactive
307
+ ? ['inherit', 'inherit', 'inherit']
308
+ : ['inherit', piped ? 'pipe' : 'inherit', 'pipe'];
260
309
  const child = spawn(executable, args, {
261
310
  cwd: options.cwd || process.cwd(),
262
- stdio: [
263
- 'inherit',
264
- piped ? 'pipe' : 'inherit',
265
- 'pipe',
266
- ],
311
+ stdio,
267
312
  env: buildExecEnv(options),
268
313
  shell: false,
269
314
  });
270
- if (piped && child.stdout) {
315
+ if (!interactive && piped && child.stdout) {
271
316
  child.stdout.pipe(process.stdout);
272
317
  }
273
318
  let stderrBuffer = '';
274
319
  const STDERR_BUFFER_CAP = 64 * 1024;
275
- if (child.stderr) {
320
+ if (!interactive && child.stderr) {
276
321
  child.stderr.on('data', (chunk) => {
277
322
  process.stderr.write(chunk);
278
323
  if (stderrBuffer.length < STDERR_BUFFER_CAP) {
@@ -304,7 +349,7 @@ async function spawnAgent(options) {
304
349
  }
305
350
  /**
306
351
  * Patterns that indicate a rate/usage limit. Matching is intentionally broad
307
- * because providers phrase these differently Anthropic uses "5-hour limit"
352
+ * because providers phrase these differently -- Anthropic uses "5-hour limit"
308
353
  * and "rate limit", OpenAI surfaces 429s, Google says "quota exceeded".
309
354
  * False positives here just trigger a fallback attempt; false negatives leave
310
355
  * the original error unhandled, which is worse.
@@ -319,6 +364,7 @@ export const RATE_LIMIT_PATTERNS = [
319
364
  /api[\s_-]?overloaded/i,
320
365
  /\boverloaded\b/i,
321
366
  ];
367
+ /** Return true if the text contains any known rate-limit or overload indicator. */
322
368
  export function detectRateLimit(text) {
323
369
  return RATE_LIMIT_PATTERNS.some(pattern => pattern.test(text));
324
370
  }
@@ -329,7 +375,7 @@ export function detectRateLimit(text) {
329
375
  * When the prior agent was Claude we pin its session ID via `--session-id` so
330
376
  * `prevSessionId` is always defined; for other primaries we pass undefined and
331
377
  * get a simpler retry-with-context prompt. Claude understands `/continue <id>`
332
- * via its shipped skill other agents fall through to an explicit instruction
378
+ * via its shipped skill -- other agents fall through to an explicit instruction
333
379
  * that points at the version-agnostic `agents sessions <id>` reader.
334
380
  */
335
381
  export function buildFallbackPrompt(prevAgent, prevSessionId, nextAgent, originalPrompt) {
@@ -350,7 +396,7 @@ export function buildFallbackPrompt(prevAgent, prevSessionId, nextAgent, origina
350
396
  *
351
397
  * The primary agent gets the original prompt. Subsequent agents get a
352
398
  * `/continue <id>`-style handoff (see buildFallbackPrompt) when we can pin a
353
- * session ID which today means Claude as primary (supports `--session-id`).
399
+ * session ID -- which today means Claude as primary (supports `--session-id`).
354
400
  * For other primaries, fallbacks run with the original prompt plus a
355
401
  * retry-with-context note, since we can't deterministically resolve their
356
402
  * auto-generated session IDs.
@@ -411,4 +457,3 @@ export async function runWithFallback(options) {
411
457
  }
412
458
  return 1;
413
459
  }
414
- //# sourceMappingURL=exec.js.map
@@ -0,0 +1,2 @@
1
+ /** Walk a directory recursively for files with a given extension. */
2
+ export declare function walkForFiles(dir: string, ext: string, limit: number): string[];
@@ -0,0 +1,40 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ /** Walk a directory recursively for files with a given extension. */
4
+ export function walkForFiles(dir, ext, limit) {
5
+ const results = [];
6
+ function walk(d, depth) {
7
+ if (depth > 5)
8
+ return;
9
+ let entries;
10
+ try {
11
+ entries = fs.readdirSync(d);
12
+ }
13
+ catch {
14
+ return;
15
+ }
16
+ for (const entry of entries) {
17
+ const full = path.join(d, entry);
18
+ const stat = safeStatSync(full);
19
+ if (!stat)
20
+ continue;
21
+ if (stat.isDirectory()) {
22
+ walk(full, depth + 1);
23
+ }
24
+ else if (entry.endsWith(ext)) {
25
+ results.push({ path: full, mtime: stat.mtimeMs });
26
+ }
27
+ }
28
+ }
29
+ walk(dir, 0);
30
+ results.sort((a, b) => b.mtime - a.mtime);
31
+ return results.slice(0, limit).map(r => r.path);
32
+ }
33
+ function safeStatSync(p) {
34
+ try {
35
+ return fs.statSync(p);
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Fuzzy string matching for user-provided identifiers.
3
+ * Auto-corrects typos like "cladue" -> "claude" based on Levenshtein distance.
4
+ */
5
+ /** Levenshtein edit distance between two strings. */
6
+ export declare function levenshtein(a: string, b: string): number;
7
+ export interface FuzzyOptions {
8
+ /** Absolute max edit distance allowed. */
9
+ maxDistance?: number;
10
+ /** Max ratio of distance to input length. If set, effective threshold = min(maxDistance, floor(len * maxRatio)). */
11
+ maxRatio?: number;
12
+ }
13
+ /**
14
+ * Fuzzy match an input string against a list of candidates.
15
+ * Returns the single best match within tolerance, or null if no match or ambiguous.
16
+ */
17
+ export declare function fuzzyMatch<T extends string>(input: string, candidates: readonly T[], options?: FuzzyOptions): T | null;
18
+ /**
19
+ * Preset configurations for different identifier types.
20
+ * Based on pairwise distance analysis of candidate pools.
21
+ */
22
+ export declare const FUZZY_PRESETS: {
23
+ /** Agents: min pairwise dist=3 (opencode/openclaw), safe tolerance=2 */
24
+ readonly agents: {
25
+ readonly maxDistance: 2;
26
+ };
27
+ /** Modes: plan/edit/full all at dist=4, lenient */
28
+ readonly modes: {
29
+ readonly maxDistance: 2;
30
+ };
31
+ /** Efforts: high/xhigh at dist=1, must be strict */
32
+ readonly efforts: {
33
+ readonly maxDistance: 1;
34
+ };
35
+ /** Strategies: pinned/available/rotate all far apart */
36
+ readonly strategies: {
37
+ readonly maxDistance: 2;
38
+ };
39
+ /** Beta features: drive/factory at dist=7, lenient */
40
+ readonly beta: {
41
+ readonly maxDistance: 2;
42
+ };
43
+ /** Dynamic/user-defined: profiles, commands, hooks, etc. */
44
+ readonly dynamic: {
45
+ readonly maxDistance: 2;
46
+ readonly maxRatio: 0.3;
47
+ };
48
+ /** Skills: often longer names, slightly more lenient */
49
+ readonly skills: {
50
+ readonly maxDistance: 3;
51
+ readonly maxRatio: 0.3;
52
+ };
53
+ };
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Fuzzy string matching for user-provided identifiers.
3
+ * Auto-corrects typos like "cladue" -> "claude" based on Levenshtein distance.
4
+ */
5
+ /** Levenshtein edit distance between two strings. */
6
+ export function levenshtein(a, b) {
7
+ const m = a.length, n = b.length;
8
+ if (m === 0)
9
+ return n;
10
+ if (n === 0)
11
+ return m;
12
+ const dp = Array.from({ length: m + 1 }, (_, i) => Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)));
13
+ for (let i = 1; i <= m; i++) {
14
+ for (let j = 1; j <= n; j++) {
15
+ dp[i][j] = a[i - 1] === b[j - 1]
16
+ ? dp[i - 1][j - 1]
17
+ : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
18
+ }
19
+ }
20
+ return dp[m][n];
21
+ }
22
+ /**
23
+ * Fuzzy match an input string against a list of candidates.
24
+ * Returns the single best match within tolerance, or null if no match or ambiguous.
25
+ */
26
+ export function fuzzyMatch(input, candidates, options = {}) {
27
+ const { maxDistance = 2, maxRatio } = options;
28
+ const lower = input.toLowerCase();
29
+ // Reject inputs that are too short - they're too ambiguous
30
+ if (lower.length < 3)
31
+ return null;
32
+ // Compute effective threshold
33
+ const threshold = maxRatio
34
+ ? Math.min(maxDistance, Math.floor(lower.length * maxRatio))
35
+ : maxDistance;
36
+ // Find all candidates within threshold (excluding exact matches)
37
+ const matches = [];
38
+ for (const candidate of candidates) {
39
+ const dist = levenshtein(lower, candidate.toLowerCase());
40
+ if (dist > 0 && dist <= threshold) {
41
+ matches.push({ candidate, dist });
42
+ }
43
+ }
44
+ if (matches.length === 0)
45
+ return null;
46
+ // Sort by distance
47
+ matches.sort((a, b) => a.dist - b.dist);
48
+ // Only return if exactly one candidate at the minimum distance (no ambiguity)
49
+ const minDist = matches[0].dist;
50
+ const atMinDist = matches.filter(m => m.dist === minDist);
51
+ return atMinDist.length === 1 ? atMinDist[0].candidate : null;
52
+ }
53
+ /**
54
+ * Preset configurations for different identifier types.
55
+ * Based on pairwise distance analysis of candidate pools.
56
+ */
57
+ export const FUZZY_PRESETS = {
58
+ /** Agents: min pairwise dist=3 (opencode/openclaw), safe tolerance=2 */
59
+ agents: { maxDistance: 2 },
60
+ /** Modes: plan/edit/full all at dist=4, lenient */
61
+ modes: { maxDistance: 2 },
62
+ /** Efforts: high/xhigh at dist=1, must be strict */
63
+ efforts: { maxDistance: 1 },
64
+ /** Strategies: pinned/available/rotate all far apart */
65
+ strategies: { maxDistance: 2 },
66
+ /** Beta features: drive/factory at dist=7, lenient */
67
+ beta: { maxDistance: 2 },
68
+ /** Dynamic/user-defined: profiles, commands, hooks, etc. */
69
+ dynamic: { maxDistance: 2, maxRatio: 0.3 },
70
+ /** Skills: often longer names, slightly more lenient */
71
+ skills: { maxDistance: 3, maxRatio: 0.3 },
72
+ };
@@ -0,0 +1,4 @@
1
+ export declare function readGeminiSettings(settingsPath: string): Record<string, unknown>;
2
+ export declare function writeGeminiSettings(settingsPath: string, settings: Record<string, unknown>): void;
3
+ export declare function updateGeminiSettings(settingsPath: string, mutate: (settings: Record<string, unknown>) => void): Record<string, unknown>;
4
+ export declare function setGeminiAutoUpdateDisabled(settings: Record<string, unknown>): void;
@@ -0,0 +1,33 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ function isRecord(value) {
4
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
5
+ }
6
+ export function readGeminiSettings(settingsPath) {
7
+ if (!fs.existsSync(settingsPath)) {
8
+ return {};
9
+ }
10
+ const raw = fs.readFileSync(settingsPath, 'utf-8');
11
+ const parsed = JSON.parse(raw);
12
+ if (!isRecord(parsed)) {
13
+ throw new Error(`Gemini settings must be a JSON object: ${settingsPath}`);
14
+ }
15
+ return parsed;
16
+ }
17
+ export function writeGeminiSettings(settingsPath, settings) {
18
+ fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
19
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
20
+ }
21
+ export function updateGeminiSettings(settingsPath, mutate) {
22
+ const settings = readGeminiSettings(settingsPath);
23
+ mutate(settings);
24
+ writeGeminiSettings(settingsPath, settings);
25
+ return settings;
26
+ }
27
+ export function setGeminiAutoUpdateDisabled(settings) {
28
+ const general = isRecord(settings.general) ? settings.general : {};
29
+ settings.general = {
30
+ ...general,
31
+ enableAutoUpdate: false,
32
+ };
33
+ }
package/dist/lib/git.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /** Parsed representation of a git source string (GitHub, generic URL, or local path). */
1
2
  export interface GitSource {
2
3
  type: 'github' | 'url' | 'local';
3
4
  url: string;
@@ -21,20 +22,24 @@ export interface GitSource {
21
22
  * ./relative/path -> local path
22
23
  */
23
24
  export declare function parseSource(source: string): GitSource;
25
+ /** Clone a remote repo or pull updates if it already exists locally. */
24
26
  export declare function cloneOrPull(source: GitSource, targetDir: string): Promise<{
25
27
  isNew: boolean;
26
28
  commit: string;
27
29
  }>;
30
+ /** Clone a repository from a source string, returning the local path and commit hash. */
28
31
  export declare function cloneRepo(source: string): Promise<{
29
32
  localPath: string;
30
33
  commit: string;
31
34
  isNew: boolean;
32
35
  }>;
36
+ /** Clone a package from a source string into the packages directory. */
33
37
  export declare function clonePackage(source: string): Promise<{
34
38
  localPath: string;
35
39
  commit: string;
36
40
  isNew: boolean;
37
41
  }>;
42
+ /** Get the short commit hash (8 chars) of the latest commit in a repo. */
38
43
  export declare function getRepoCommit(repoPath: string): Promise<string>;
39
44
  /**
40
45
  * Get the current GitHub username using gh CLI.
@@ -91,7 +96,7 @@ export declare function isSystemRepoOrigin(dir: string): Promise<boolean>;
91
96
  export declare function hasLocalChanges(dir: string): Promise<boolean>;
92
97
  /**
93
98
  * Pull changes in an existing repo.
94
- * Refuses to pull if the working tree is dirty user must commit or discard changes first.
99
+ * Refuses to pull if the working tree is dirty -- user must commit or discard changes first.
95
100
  */
96
101
  export declare function pullRepo(dir: string): Promise<{
97
102
  success: boolean;
@@ -103,12 +108,18 @@ export declare function pullRepo(dir: string): Promise<{
103
108
  * Returns files categorized by their status relative to HEAD.
104
109
  */
105
110
  export interface GitSyncStatus {
111
+ /** Tracked and unchanged files. */
106
112
  synced: string[];
113
+ /** Modified but not staged files. */
107
114
  modified: string[];
115
+ /** Untracked files. */
108
116
  new: string[];
117
+ /** Staged for commit. */
109
118
  staged: string[];
119
+ /** Deleted files. */
110
120
  deleted: string[];
111
121
  }
122
+ /** Compute the sync status of a git repo, optionally scoped to a subdirectory. */
112
123
  export declare function getGitSyncStatus(dir: string, subdir?: string): Promise<GitSyncStatus | null>;
113
124
  /**
114
125
  * Get list of files tracked by git in a directory.
@@ -143,4 +154,3 @@ export declare function tryAutoPull(dir: string): Promise<{
143
154
  pulled: boolean;
144
155
  error?: string;
145
156
  }>;
146
- //# sourceMappingURL=git.d.ts.map
package/dist/lib/git.js CHANGED
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Git operations for the agents-cli system repo and package repositories.
3
+ *
4
+ * Handles cloning, pulling, syncing, and inspecting git repos used by
5
+ * the agents version management and plugin/package system. Includes
6
+ * source parsing for GitHub shorthand, SSH, HTTPS, and local paths.
7
+ */
1
8
  import simpleGit from 'simple-git';
2
9
  import * as fs from 'fs';
3
10
  import * as path from 'path';
@@ -8,7 +15,7 @@ import { DEFAULT_SYSTEM_REPO, LEGACY_SYSTEM_REPO, systemRepoSlug } from './types
8
15
  *
9
16
  * Why: `git config core.hooksPath` is a known sandbox-escape vector and is
10
17
  * blocked by some sandboxed environments (e.g. Claude Code). Symlinks inside
11
- * `.git/hooks/` sidestep that restriction entirely Git runs them the same way.
18
+ * `.git/hooks/` sidestep that restriction entirely -- Git runs them the same way.
12
19
  */
13
20
  function installGithooksSymlinks(repoDir) {
14
21
  const githooksDir = path.join(repoDir, '.githooks');
@@ -149,6 +156,7 @@ export function parseSource(source) {
149
156
  }
150
157
  throw new Error(`Invalid source: ${source}. Supported formats: gh:owner/repo, owner/repo, github.com/owner/repo, https://github.com/owner/repo, or local path`);
151
158
  }
159
+ /** Clone a remote repo or pull updates if it already exists locally. */
152
160
  export async function cloneOrPull(source, targetDir) {
153
161
  const git = simpleGit();
154
162
  if (source.type === 'local') {
@@ -174,6 +182,7 @@ export async function cloneOrPull(source, targetDir) {
174
182
  const log = await repoGit.log({ maxCount: 1 });
175
183
  return { isNew: true, commit: log.latest?.hash.slice(0, 8) || 'unknown' };
176
184
  }
185
+ /** Clone a repository from a source string, returning the local path and commit hash. */
177
186
  export async function cloneRepo(source) {
178
187
  const parsed = parseSource(source);
179
188
  if (parsed.type === 'local') {
@@ -191,6 +200,7 @@ export async function cloneRepo(source) {
191
200
  isNew: result.isNew,
192
201
  };
193
202
  }
203
+ /** Clone a package from a source string into the packages directory. */
194
204
  export async function clonePackage(source) {
195
205
  const parsed = parseSource(source);
196
206
  if (parsed.type === 'local') {
@@ -208,6 +218,7 @@ export async function clonePackage(source) {
208
218
  isNew: result.isNew,
209
219
  };
210
220
  }
221
+ /** Get the short commit hash (8 chars) of the latest commit in a repo. */
211
222
  export async function getRepoCommit(repoPath) {
212
223
  try {
213
224
  const git = simpleGit(repoPath);
@@ -270,10 +281,10 @@ export async function setRemoteUrl(repoPath, url) {
270
281
  */
271
282
  export async function checkGitHubRepoExists(owner, repo) {
272
283
  try {
273
- const { exec } = await import('child_process');
284
+ const { execFile } = await import('child_process');
274
285
  const { promisify } = await import('util');
275
- const execAsync = promisify(exec);
276
- await execAsync(`gh repo view ${owner}/${repo} --json name`);
286
+ const execFileAsync = promisify(execFile);
287
+ await execFileAsync('gh', ['repo', 'view', `${owner}/${repo}`, '--json', 'name']);
277
288
  return true;
278
289
  }
279
290
  catch {
@@ -414,7 +425,7 @@ export async function hasLocalChanges(dir) {
414
425
  }
415
426
  /**
416
427
  * Pull changes in an existing repo.
417
- * Refuses to pull if the working tree is dirty user must commit or discard changes first.
428
+ * Refuses to pull if the working tree is dirty -- user must commit or discard changes first.
418
429
  */
419
430
  export async function pullRepo(dir) {
420
431
  try {
@@ -440,6 +451,7 @@ export async function pullRepo(dir) {
440
451
  return { success: false, commit: '', error: err.message };
441
452
  }
442
453
  }
454
+ /** Compute the sync status of a git repo, optionally scoped to a subdirectory. */
443
455
  export async function getGitSyncStatus(dir, subdir) {
444
456
  if (!isGitRepo(dir)) {
445
457
  return null;
@@ -632,4 +644,3 @@ export async function tryAutoPull(dir) {
632
644
  return { pulled: false, error: err.message };
633
645
  }
634
646
  }
635
- //# sourceMappingURL=git.js.map