@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,4 +1,5 @@
1
1
  import type { AgentId } from './types.js';
2
+ /** Model identifiers per cloud provider (used by Claude's multi-cloud routing). */
2
3
  export interface ModelPerCloud {
3
4
  firstParty: string;
4
5
  bedrock?: string;
@@ -7,10 +8,12 @@ export interface ModelPerCloud {
7
8
  anthropicAws?: string;
8
9
  mantle?: string | null;
9
10
  }
11
+ /** A reasoning effort level exposed by an agent's model. */
10
12
  export interface ReasoningLevel {
11
13
  effort: string;
12
14
  description?: string;
13
15
  }
16
+ /** Metadata for a single model within an agent's catalog. */
14
17
  export interface ModelInfo {
15
18
  id: string;
16
19
  displayName?: string;
@@ -26,29 +29,41 @@ export interface ModelInfo {
26
29
  /** Default reasoning level if applicable */
27
30
  defaultReasoningLevel?: string;
28
31
  }
32
+ /** The complete model catalog for a specific (agent, version) pair. */
29
33
  export interface ModelCatalog {
30
34
  agent: AgentId;
31
35
  version: string;
32
- source: 'bundle' | 'binary';
36
+ source: ModelSourceKind;
33
37
  sourcePath: string;
34
38
  models: ModelInfo[];
35
- /** Aliases from the CLI's alias map (claude only): { opus: "claude-opus-4-7", ... } */
39
+ /** Aliases that the CLI resolves to a canonical id (e.g. { opus: "claude-opus-4-7" } for claude, { flash: "gemini-3-flash-preview" } for gemini) */
36
40
  aliases: Record<string, string>;
37
41
  }
42
+ /** How the model catalog source was obtained. */
43
+ export type ModelSourceKind = 'bundle' | 'binary' | 'js' | 'cli';
44
+ /** Describes the location and extraction strategy for a model catalog source. */
45
+ export interface ModelSource {
46
+ path: string;
47
+ kind: ModelSourceKind;
48
+ }
38
49
  /**
39
- * Locate the bundle (cli.js) or native binary that holds the installed model
40
- * catalog for a given (agent, version). Returns null if not found.
50
+ * Locate the file that authoritatively describes the installed model catalog
51
+ * for a given (agent, version). The `kind` tells `getModelCatalog` how to
52
+ * read it:
53
+ * bundle/binary -- strings(1)-style extraction (claude/codex)
54
+ * js -- read + regex-parse an exported JS module (gemini)
55
+ * cli -- spawn the agent's own `models` command (opencode/cursor/openclaw)
56
+ *
57
+ * Returns null if nothing usable is found.
41
58
  */
42
- export declare function locateModelSource(agent: AgentId, version: string): {
43
- path: string;
44
- kind: 'bundle' | 'binary';
45
- } | null;
59
+ export declare function locateModelSource(agent: AgentId, version: string): ModelSource | null;
46
60
  /**
47
61
  * Build (or load from cache) the model catalog for a specific (agent, version).
48
- * Cache is keyed on binary mtime, so re-extracts automatically when the user
49
- * upgrades or reinstalls a version.
62
+ * Cache is keyed on source-file mtime (binary or js module), so re-extracts
63
+ * automatically when the user upgrades or reinstalls a version.
50
64
  */
51
65
  export declare function getModelCatalog(agent: AgentId, version: string): ModelCatalog | null;
66
+ /** The result of resolving a user-supplied model string against the catalog. */
52
67
  export interface ResolvedModel {
53
68
  /** The model string to forward to the CLI (canonical id when we can resolve, else passed through unchanged). */
54
69
  forwarded: string;
@@ -80,4 +95,3 @@ export declare function resolveModel(agent: AgentId, version: string, requested:
80
95
  * - 'auto' passes --effort auto to claude if supported.
81
96
  */
82
97
  export declare function buildReasoningFlags(agent: AgentId, level: string): string[];
83
- //# sourceMappingURL=models.d.ts.map
@@ -1,23 +1,47 @@
1
+ /**
2
+ * Model catalog extraction, caching, and resolution for all supported agents.
3
+ *
4
+ * Each agent ships its model list differently -- Claude and Codex embed it in
5
+ * compiled bundles/binaries, Gemini exports it from a JS module, and OpenCode/
6
+ * Cursor/OpenClaw expose it via CLI commands. This module provides a unified
7
+ * `getModelCatalog()` and `resolveModel()` interface over all of them, backed
8
+ * by a file-system cache keyed on source mtime.
9
+ */
1
10
  import * as fs from 'fs';
2
11
  import * as path from 'path';
3
- import * as os from 'os';
12
+ import { execFileSync } from 'child_process';
4
13
  import { getVersionDir } from './versions.js';
5
- const CACHE_PATH = path.join(os.homedir(), '.agents', '.models-cache.json');
14
+ import { getAgentsDir } from './state.js';
15
+ const CACHE_PATH = path.join(getAgentsDir(), '.models-cache.json');
16
+ /**
17
+ * Bump when the extractor logic changes shape in an incompatible way so cached
18
+ * catalogs from older agents-cli builds are re-extracted.
19
+ */
20
+ const CACHE_SCHEMA_VERSION = 2;
6
21
  let memoryCache = null;
7
22
  function cacheKey(agent, version) {
8
23
  return `${agent}@${version}`;
9
24
  }
25
+ /** Load the cache file from disk (or return the in-memory copy). */
10
26
  function loadCache() {
11
27
  if (memoryCache)
12
28
  return memoryCache;
13
29
  try {
14
- memoryCache = JSON.parse(fs.readFileSync(CACHE_PATH, 'utf-8'));
30
+ const raw = JSON.parse(fs.readFileSync(CACHE_PATH, 'utf-8'));
31
+ if (raw && raw.schema === CACHE_SCHEMA_VERSION && raw.entries) {
32
+ memoryCache = raw;
33
+ }
34
+ else {
35
+ // Legacy (pre-schema) or stale-schema cache -- drop it.
36
+ memoryCache = { schema: CACHE_SCHEMA_VERSION, entries: {} };
37
+ }
15
38
  }
16
39
  catch {
17
- memoryCache = {};
40
+ memoryCache = { schema: CACHE_SCHEMA_VERSION, entries: {} };
18
41
  }
19
42
  return memoryCache;
20
43
  }
44
+ /** Persist the in-memory cache to disk. Best-effort; failures are silent. */
21
45
  function saveCache() {
22
46
  if (!memoryCache)
23
47
  return;
@@ -32,8 +56,14 @@ function saveCache() {
32
56
  }
33
57
  }
34
58
  /**
35
- * Locate the bundle (cli.js) or native binary that holds the installed model
36
- * catalog for a given (agent, version). Returns null if not found.
59
+ * Locate the file that authoritatively describes the installed model catalog
60
+ * for a given (agent, version). The `kind` tells `getModelCatalog` how to
61
+ * read it:
62
+ * bundle/binary -- strings(1)-style extraction (claude/codex)
63
+ * js -- read + regex-parse an exported JS module (gemini)
64
+ * cli -- spawn the agent's own `models` command (opencode/cursor/openclaw)
65
+ *
66
+ * Returns null if nothing usable is found.
37
67
  */
38
68
  export function locateModelSource(agent, version) {
39
69
  const versionDir = getVersionDir(agent, version);
@@ -63,8 +93,64 @@ export function locateModelSource(agent, version) {
63
93
  }
64
94
  return null;
65
95
  }
96
+ if (agent === 'gemini') {
97
+ // Gemini ships a clean ES module with all constants and aliases -- no need
98
+ // to parse the minified CLI bundle.
99
+ const modelsJs = path.join(versionDir, 'node_modules', '@google', 'gemini-cli-core', 'dist', 'src', 'config', 'models.js');
100
+ if (fs.existsSync(modelsJs))
101
+ return { path: modelsJs, kind: 'js' };
102
+ return null;
103
+ }
104
+ if (agent === 'opencode') {
105
+ // The `opencode` shim under node_modules/.bin dispatches to a platform-
106
+ // specific native binary. We don't parse the 100MB binary; we let the CLI
107
+ // produce its own catalog via `opencode models --verbose`.
108
+ const cli = path.join(versionDir, 'node_modules', '.bin', 'opencode');
109
+ if (fs.existsSync(cli))
110
+ return { path: cli, kind: 'cli' };
111
+ return null;
112
+ }
113
+ if (agent === 'openclaw') {
114
+ const cli = path.join(versionDir, 'node_modules', '.bin', 'openclaw');
115
+ if (fs.existsSync(cli))
116
+ return { path: cli, kind: 'cli' };
117
+ // Fallback: installed outside agents-cli version management (e.g. global npm).
118
+ const pathBin = findOnPath('openclaw');
119
+ if (pathBin)
120
+ return { path: pathBin, kind: 'cli' };
121
+ return null;
122
+ }
123
+ if (agent === 'cursor') {
124
+ // cursor-agent is installed via curl script, not agents-cli. Version argument
125
+ // is accepted for API symmetry but ignored -- cursor lives on PATH.
126
+ const pathBin = findOnPath('cursor-agent');
127
+ if (pathBin)
128
+ return { path: pathBin, kind: 'cli' };
129
+ return null;
130
+ }
131
+ return null;
132
+ }
133
+ /** Search PATH for a command and return its absolute path, or null. */
134
+ function findOnPath(command) {
135
+ const pathEnv = process.env.PATH || '';
136
+ const exts = process.platform === 'win32' ? (process.env.PATHEXT || '').split(';') : [''];
137
+ for (const dir of pathEnv.split(path.delimiter)) {
138
+ if (!dir)
139
+ continue;
140
+ for (const ext of exts) {
141
+ const full = path.join(dir, command + ext);
142
+ try {
143
+ if (fs.statSync(full).isFile())
144
+ return full;
145
+ }
146
+ catch {
147
+ /* not here */
148
+ }
149
+ }
150
+ }
66
151
  return null;
67
152
  }
153
+ /** Map the current Node.js platform/arch pair to a Rust-style target triple. */
68
154
  function currentTargetTriple() {
69
155
  switch (`${process.platform}-${process.arch}`) {
70
156
  case 'darwin-arm64': return 'aarch64-apple-darwin';
@@ -199,10 +285,282 @@ function extractCodexCatalog(text) {
199
285
  }
200
286
  return { models, aliases: {} };
201
287
  }
288
+ /**
289
+ * Extract Gemini's model catalog from `@google/gemini-cli-core/.../config/models.js`.
290
+ *
291
+ * The module exports a set of named constants (e.g. `DEFAULT_GEMINI_MODEL`,
292
+ * `PREVIEW_GEMINI_FLASH_MODEL`) plus a `VALID_GEMINI_MODELS` Set and a handful
293
+ * of `GEMINI_MODEL_ALIAS_*` strings. We parse it with regex (a JS-module import
294
+ * would pollute the runtime and ES-module interop is awkward from a CJS build).
295
+ */
296
+ function extractGeminiCatalog(text) {
297
+ const constRe = /export\s+const\s+([A-Z0-9_]+)\s*=\s*'([^']+)'/g;
298
+ const constants = new Map();
299
+ let m;
300
+ while ((m = constRe.exec(text)) !== null) {
301
+ constants.set(m[1], m[2]);
302
+ }
303
+ // The set of ids the CLI accepts as "valid model names". Names (not values)
304
+ // are listed inside `new Set([...])`, so we expand them via the constants map.
305
+ const validIds = new Set();
306
+ const setBlock = text.match(/VALID_GEMINI_MODELS\s*=\s*new\s+Set\(\[([\s\S]*?)\]\)/);
307
+ if (setBlock) {
308
+ const nameRe = /([A-Z0-9_]+)/g;
309
+ let nm;
310
+ while ((nm = nameRe.exec(setBlock[1])) !== null) {
311
+ const id = constants.get(nm[1]);
312
+ if (id)
313
+ validIds.add(id);
314
+ }
315
+ }
316
+ // Fall back to any gemini-shaped id we saw in the constants map -- useful
317
+ // when the Set shape changes across gemini versions.
318
+ if (validIds.size === 0) {
319
+ for (const [name, value] of constants) {
320
+ if (/^(DEFAULT_|PREVIEW_)/.test(name) && /^gemini-/.test(value)) {
321
+ validIds.add(value);
322
+ }
323
+ }
324
+ }
325
+ // Aliases are exported as `GEMINI_MODEL_ALIAS_FLASH = 'flash'` etc. The alias
326
+ // is the *value*; the target model is resolved at runtime by `resolveModel()`.
327
+ // We replicate that logic here so callers get a concrete id per alias.
328
+ const defaultId = constants.get('DEFAULT_GEMINI_MODEL');
329
+ const previewPro = constants.get('PREVIEW_GEMINI_MODEL');
330
+ const previewFlash = constants.get('PREVIEW_GEMINI_FLASH_MODEL');
331
+ const flashLite = constants.get('DEFAULT_GEMINI_FLASH_LITE_MODEL');
332
+ const aliases = {};
333
+ if (previewPro) {
334
+ aliases.auto = previewPro;
335
+ aliases.pro = previewPro;
336
+ }
337
+ if (previewFlash)
338
+ aliases.flash = previewFlash;
339
+ if (flashLite)
340
+ aliases['flash-lite'] = flashLite;
341
+ const aliasReverse = {};
342
+ for (const [alias, id] of Object.entries(aliases)) {
343
+ (aliasReverse[id] ||= []).push(alias);
344
+ }
345
+ const defaults = new Set();
346
+ if (defaultId)
347
+ defaults.add(defaultId);
348
+ if (previewPro)
349
+ defaults.add(previewPro); // auto/pro alias resolves here
350
+ const displayNameFor = (id) => {
351
+ // Gemini has a `getDisplayString` for some aliases but the canonical id
352
+ // is human-readable enough ("gemini-3-pro-preview") -- no separate map.
353
+ return undefined;
354
+ };
355
+ const models = Array.from(validIds)
356
+ .sort()
357
+ .map((id) => ({
358
+ id,
359
+ displayName: displayNameFor(id),
360
+ alias: aliasReverse[id]?.[0],
361
+ isDefault: defaults.has(id),
362
+ }));
363
+ return { models, aliases };
364
+ }
365
+ /**
366
+ * Extract OpenCode's catalog by invoking `opencode models --verbose`. The
367
+ * output is a sequence of `<provider>/<id>\n{json}` blocks -- we parse every
368
+ * JSON block that follows a provider/id line.
369
+ *
370
+ * OpenCode caches the models.dev snapshot internally, so this is a local,
371
+ * non-network call after first launch.
372
+ */
373
+ function extractOpenCodeCatalog(binaryPath) {
374
+ let stdout;
375
+ try {
376
+ stdout = execFileSync(binaryPath, ['models', '--verbose'], {
377
+ encoding: 'utf-8',
378
+ stdio: ['ignore', 'pipe', 'ignore'],
379
+ timeout: 15_000,
380
+ maxBuffer: 64 * 1024 * 1024,
381
+ });
382
+ }
383
+ catch {
384
+ return { models: [], aliases: {} };
385
+ }
386
+ const models = [];
387
+ const seen = new Set();
388
+ // Blocks look like:
389
+ // provider/model-id
390
+ // {
391
+ // "id": "...", "providerID": "...", "name": "...", ...
392
+ // }
393
+ // Walk forward finding `{` at column 0 that terminates with a `}` at column 0.
394
+ const lines = stdout.split('\n');
395
+ for (let i = 0; i < lines.length; i++) {
396
+ const line = lines[i];
397
+ if (!/^[a-z0-9][a-z0-9.-]*\/[^\s]+$/i.test(line))
398
+ continue;
399
+ const fullKey = line;
400
+ // Find the opening `{` right after this line, collect until matching `}`.
401
+ let start = -1;
402
+ for (let j = i + 1; j < lines.length; j++) {
403
+ if (lines[j] === '{') {
404
+ start = j;
405
+ break;
406
+ }
407
+ if (lines[j].trim() !== '')
408
+ break;
409
+ }
410
+ if (start === -1)
411
+ continue;
412
+ let depth = 0;
413
+ let end = -1;
414
+ for (let j = start; j < lines.length; j++) {
415
+ for (const ch of lines[j]) {
416
+ if (ch === '{')
417
+ depth++;
418
+ else if (ch === '}')
419
+ depth--;
420
+ }
421
+ if (depth === 0) {
422
+ end = j;
423
+ break;
424
+ }
425
+ }
426
+ if (end === -1)
427
+ continue;
428
+ const json = lines.slice(start, end + 1).join('\n');
429
+ try {
430
+ const obj = JSON.parse(json);
431
+ if (seen.has(fullKey))
432
+ continue;
433
+ seen.add(fullKey);
434
+ // obj.status can be "active" | "deprecated" | "preview" -- surface only
435
+ // when it isn't the default so the consumer can flag stale models.
436
+ const nonDefaultStatus = obj.status && obj.status !== 'active' ? obj.status : undefined;
437
+ models.push({
438
+ id: fullKey,
439
+ displayName: obj.name,
440
+ description: nonDefaultStatus,
441
+ });
442
+ }
443
+ catch {
444
+ /* skip malformed block */
445
+ }
446
+ i = end;
447
+ }
448
+ // Second pass: if --verbose produced nothing, fall back to the plain list.
449
+ if (models.length === 0) {
450
+ try {
451
+ const plain = execFileSync(binaryPath, ['models'], {
452
+ encoding: 'utf-8',
453
+ stdio: ['ignore', 'pipe', 'ignore'],
454
+ timeout: 10_000,
455
+ maxBuffer: 16 * 1024 * 1024,
456
+ });
457
+ for (const raw of plain.split('\n')) {
458
+ const id = raw.trim();
459
+ if (!id || !/^[a-z0-9][a-z0-9.-]*\/[^\s]+$/i.test(id))
460
+ continue;
461
+ if (seen.has(id))
462
+ continue;
463
+ seen.add(id);
464
+ models.push({ id });
465
+ }
466
+ }
467
+ catch {
468
+ /* leave empty */
469
+ }
470
+ }
471
+ return { models, aliases: {} };
472
+ }
473
+ /**
474
+ * Extract Cursor's catalog via `cursor-agent --list-models`. Output lines look like:
475
+ * `auto - Auto`
476
+ * `composer-2-fast - Composer 2 Fast (current, default)`
477
+ * `gpt-5.3-codex - Codex 5.3`
478
+ */
479
+ function extractCursorCatalog(binaryPath) {
480
+ let stdout;
481
+ try {
482
+ stdout = execFileSync(binaryPath, ['--list-models'], {
483
+ encoding: 'utf-8',
484
+ stdio: ['ignore', 'pipe', 'ignore'],
485
+ timeout: 15_000,
486
+ maxBuffer: 8 * 1024 * 1024,
487
+ });
488
+ }
489
+ catch {
490
+ return { models: [], aliases: {} };
491
+ }
492
+ // Strip ANSI escape sequences; cursor renders a loading spinner.
493
+ // eslint-disable-next-line no-control-regex
494
+ const plain = stdout.replace(/\x1b\[[0-9;]*[A-Za-z]/g, '');
495
+ const models = [];
496
+ const seen = new Set();
497
+ for (const raw of plain.split('\n')) {
498
+ const line = raw.trim();
499
+ if (!line)
500
+ continue;
501
+ // Expect `id - display[ (flag1, flag2, ...)]`
502
+ const m = line.match(/^([A-Za-z0-9][A-Za-z0-9.\-_]*)\s+-\s+(.+)$/);
503
+ if (!m)
504
+ continue;
505
+ const id = m[1];
506
+ if (seen.has(id))
507
+ continue;
508
+ seen.add(id);
509
+ const rest = m[2];
510
+ const flagMatch = rest.match(/\s+\(([^)]+)\)\s*$/);
511
+ const flags = flagMatch ? flagMatch[1].split(',').map((s) => s.trim().toLowerCase()) : [];
512
+ const displayName = (flagMatch ? rest.slice(0, flagMatch.index) : rest).trim();
513
+ models.push({
514
+ id,
515
+ displayName,
516
+ isDefault: flags.includes('default'),
517
+ });
518
+ }
519
+ return { models, aliases: {} };
520
+ }
521
+ /**
522
+ * Extract OpenClaw's catalog via `openclaw models list --all --json`. OpenClaw
523
+ * bundles its own models.dev-like snapshot and exposes a stable JSON shape.
524
+ */
525
+ function extractOpenClawCatalog(binaryPath) {
526
+ let stdout;
527
+ try {
528
+ stdout = execFileSync(binaryPath, ['models', 'list', '--all', '--json'], {
529
+ encoding: 'utf-8',
530
+ stdio: ['ignore', 'pipe', 'ignore'],
531
+ timeout: 20_000,
532
+ maxBuffer: 64 * 1024 * 1024,
533
+ });
534
+ }
535
+ catch {
536
+ return { models: [], aliases: {} };
537
+ }
538
+ // OpenClaw prefaces output with a banner line on stderr; stdout should be
539
+ // pure JSON, but be defensive and skip preface text if any slipped through.
540
+ const firstBrace = stdout.indexOf('{');
541
+ if (firstBrace === -1)
542
+ return { models: [], aliases: {} };
543
+ let parsed;
544
+ try {
545
+ parsed = JSON.parse(stdout.slice(firstBrace));
546
+ }
547
+ catch {
548
+ return { models: [], aliases: {} };
549
+ }
550
+ const rawModels = Array.isArray(parsed?.models) ? parsed.models : [];
551
+ const models = rawModels
552
+ .filter((m) => typeof m?.key === 'string')
553
+ .map((m) => ({
554
+ id: m.key,
555
+ displayName: typeof m.name === 'string' ? m.name : undefined,
556
+ isDefault: m.available === true && m.tags?.includes?.('default'),
557
+ }));
558
+ return { models, aliases: {} };
559
+ }
202
560
  /**
203
561
  * Build (or load from cache) the model catalog for a specific (agent, version).
204
- * Cache is keyed on binary mtime, so re-extracts automatically when the user
205
- * upgrades or reinstalls a version.
562
+ * Cache is keyed on source-file mtime (binary or js module), so re-extracts
563
+ * automatically when the user upgrades or reinstalls a version.
206
564
  */
207
565
  export function getModelCatalog(agent, version) {
208
566
  const src = locateModelSource(agent, version);
@@ -217,14 +575,37 @@ export function getModelCatalog(agent, version) {
217
575
  }
218
576
  const cache = loadCache();
219
577
  const key = cacheKey(agent, version);
220
- const cached = cache[key];
578
+ const cached = cache.entries[key];
221
579
  if (cached && cached.sourcePath === src.path && cached.mtime === mtime) {
222
580
  return cached.catalog;
223
581
  }
224
- const text = extractStrings(src.path);
225
- const { models, aliases } = agent === 'claude' ? extractClaudeCatalog(text)
226
- : agent === 'codex' ? extractCodexCatalog(text)
227
- : { models: [], aliases: {} };
582
+ let models = [];
583
+ let aliases = {};
584
+ if (src.kind === 'bundle' || src.kind === 'binary') {
585
+ const text = extractStrings(src.path);
586
+ ({ models, aliases } =
587
+ agent === 'claude' ? extractClaudeCatalog(text)
588
+ : agent === 'codex' ? extractCodexCatalog(text)
589
+ : { models: [], aliases: {} });
590
+ }
591
+ else if (src.kind === 'js') {
592
+ try {
593
+ const text = fs.readFileSync(src.path, 'utf-8');
594
+ if (agent === 'gemini')
595
+ ({ models, aliases } = extractGeminiCatalog(text));
596
+ }
597
+ catch {
598
+ /* unreadable */
599
+ }
600
+ }
601
+ else if (src.kind === 'cli') {
602
+ if (agent === 'opencode')
603
+ ({ models, aliases } = extractOpenCodeCatalog(src.path));
604
+ else if (agent === 'cursor')
605
+ ({ models, aliases } = extractCursorCatalog(src.path));
606
+ else if (agent === 'openclaw')
607
+ ({ models, aliases } = extractOpenClawCatalog(src.path));
608
+ }
228
609
  const catalog = {
229
610
  agent,
230
611
  version,
@@ -233,8 +614,14 @@ export function getModelCatalog(agent, version) {
233
614
  models,
234
615
  aliases,
235
616
  };
236
- cache[key] = { sourcePath: src.path, mtime, catalog };
237
- saveCache();
617
+ // Don't cache empty CLI extractions: the CLI may have been mid-install,
618
+ // network-dependent, or transiently failing. Caching 0 models would mask
619
+ // the real catalog forever (mtime won't change). Bundle/binary/js sources
620
+ // are deterministic, so cache those even when empty.
621
+ if (src.kind !== 'cli' || models.length > 0) {
622
+ cache.entries[key] = { sourcePath: src.path, mtime, catalog };
623
+ saveCache();
624
+ }
238
625
  return catalog;
239
626
  }
240
627
  /**
@@ -274,6 +661,7 @@ export function resolveModel(agent, version, requested) {
274
661
  warning: `model "${requested}" not in known catalog for ${agent}@${version}; forwarding as-is${hint}`,
275
662
  };
276
663
  }
664
+ /** Find the closest matching model ids/aliases using edit distance. */
277
665
  function pickSuggestions(requested, catalog) {
278
666
  const all = [...catalog.models.map((m) => m.id), ...Object.keys(catalog.aliases)];
279
667
  return all
@@ -283,6 +671,7 @@ function pickSuggestions(requested, catalog) {
283
671
  .slice(0, 3)
284
672
  .map((s) => s.id);
285
673
  }
674
+ /** Normalized Levenshtein similarity (0..1, where 1 is identical). */
286
675
  function similarity(a, b) {
287
676
  const longer = a.length >= b.length ? a : b;
288
677
  const shorter = a.length >= b.length ? b : a;
@@ -291,6 +680,7 @@ function similarity(a, b) {
291
680
  const distance = levenshtein(longer, shorter);
292
681
  return (longer.length - distance) / longer.length;
293
682
  }
683
+ /** Standard Levenshtein edit distance between two strings. */
294
684
  function levenshtein(a, b) {
295
685
  const m = a.length;
296
686
  const n = b.length;
@@ -335,4 +725,3 @@ export function buildReasoningFlags(agent, level) {
335
725
  }
336
726
  return [];
337
727
  }
338
- //# sourceMappingURL=models.js.map
@@ -0,0 +1,63 @@
1
+ /**
2
+ * 1Password CLI (op) integration for importing secrets from vaults.
3
+ */
4
+ export interface OpVault {
5
+ id: string;
6
+ name: string;
7
+ }
8
+ export interface OpItemSummary {
9
+ id: string;
10
+ title: string;
11
+ category: string;
12
+ vault: {
13
+ id: string;
14
+ name: string;
15
+ };
16
+ }
17
+ export interface OpField {
18
+ id: string;
19
+ label: string;
20
+ type: string;
21
+ value?: string;
22
+ purpose?: string;
23
+ }
24
+ export interface OpItem extends OpItemSummary {
25
+ fields: OpField[];
26
+ }
27
+ export interface ImportableSecret {
28
+ envKey: string;
29
+ itemTitle: string;
30
+ fieldLabel: string;
31
+ value: string;
32
+ }
33
+ export interface SkippedField {
34
+ itemTitle: string;
35
+ fieldLabel: string;
36
+ reason: string;
37
+ }
38
+ export declare function assertOpAvailable(): void;
39
+ export declare function listVaults(): OpVault[];
40
+ export declare function listItems(vaultName: string): OpItemSummary[];
41
+ export declare function getItem(itemId: string, vaultName: string): OpItem;
42
+ export declare function toEnvKey(title: string): string;
43
+ export declare function slugify(name: string): string;
44
+ export declare function extractSecrets(items: OpItemSummary[], vaultName: string): {
45
+ secrets: ImportableSecret[];
46
+ skipped: SkippedField[];
47
+ };
48
+ export interface PasswordItemTemplate {
49
+ title: string;
50
+ category: 'PASSWORD';
51
+ tags: string[];
52
+ fields: Array<{
53
+ id: string;
54
+ type: 'CONCEALED';
55
+ purpose: 'PASSWORD';
56
+ label: string;
57
+ value: string;
58
+ }>;
59
+ }
60
+ export declare function buildPasswordItemTemplate(title: string, value: string): PasswordItemTemplate;
61
+ export declare function itemExistsByTitle(title: string, vaultName: string): boolean;
62
+ export declare function deleteItemByTitle(title: string, vaultName: string): void;
63
+ export declare function createPasswordItem(title: string, value: string, vaultName: string): void;