@travisennis/acai 0.0.9 → 0.0.11

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 (403) hide show
  1. package/README.md +51 -760
  2. package/bin/acai +52 -0
  3. package/dist/agent/index.d.ts +12 -2
  4. package/dist/agent/index.d.ts.map +1 -1
  5. package/dist/agent/index.js +380 -199
  6. package/dist/agent/sub-agent.d.ts +23 -0
  7. package/dist/agent/sub-agent.d.ts.map +1 -0
  8. package/dist/agent/sub-agent.js +109 -0
  9. package/dist/cli/index.d.ts +26 -0
  10. package/dist/cli/index.d.ts.map +1 -0
  11. package/dist/{cli.js → cli/index.js} +84 -77
  12. package/dist/{stdin.d.ts → cli/stdin.d.ts} +2 -1
  13. package/dist/cli/stdin.d.ts.map +1 -0
  14. package/dist/{stdin.js → cli/stdin.js} +11 -0
  15. package/dist/commands/copy/index.js +2 -2
  16. package/dist/commands/copy/utils.d.ts.map +1 -1
  17. package/dist/commands/copy/utils.js +15 -13
  18. package/dist/commands/generate-rules/index.d.ts +1 -1
  19. package/dist/commands/generate-rules/index.d.ts.map +1 -1
  20. package/dist/commands/generate-rules/index.js +16 -101
  21. package/dist/commands/generate-rules/service.d.ts +22 -0
  22. package/dist/commands/generate-rules/service.d.ts.map +1 -0
  23. package/dist/commands/generate-rules/service.js +103 -0
  24. package/dist/commands/handoff/index.js +2 -2
  25. package/dist/commands/health/index.js +1 -1
  26. package/dist/commands/health/utils.d.ts +3 -2
  27. package/dist/commands/health/utils.d.ts.map +1 -1
  28. package/dist/commands/health/utils.js +6 -0
  29. package/dist/commands/history/index.d.ts +1 -1
  30. package/dist/commands/history/index.d.ts.map +1 -1
  31. package/dist/commands/history/index.js +17 -18
  32. package/dist/commands/history/types.d.ts +38 -0
  33. package/dist/commands/history/types.d.ts.map +1 -1
  34. package/dist/commands/history/utils.d.ts.map +1 -1
  35. package/dist/commands/history/utils.js +63 -58
  36. package/dist/commands/init/index.d.ts.map +1 -1
  37. package/dist/commands/init/index.js +3 -8
  38. package/dist/commands/init-project/index.d.ts.map +1 -1
  39. package/dist/commands/init-project/index.js +3 -3
  40. package/dist/commands/init-project/utils.d.ts +2 -1
  41. package/dist/commands/init-project/utils.d.ts.map +1 -1
  42. package/dist/commands/init-project/utils.js +10 -2
  43. package/dist/commands/list-tools/index.d.ts.map +1 -1
  44. package/dist/commands/list-tools/index.js +7 -31
  45. package/dist/commands/manager.d.ts +2 -2
  46. package/dist/commands/manager.d.ts.map +1 -1
  47. package/dist/commands/manager.js +55 -33
  48. package/dist/commands/model/index.d.ts.map +1 -1
  49. package/dist/commands/model/index.js +20 -151
  50. package/dist/commands/model/model-panel.d.ts +4 -0
  51. package/dist/commands/model/model-panel.d.ts.map +1 -0
  52. package/dist/commands/model/model-panel.js +144 -0
  53. package/dist/commands/paste/index.d.ts.map +1 -1
  54. package/dist/commands/paste/index.js +59 -62
  55. package/dist/commands/paste/utils.d.ts.map +1 -1
  56. package/dist/commands/paste/utils.js +88 -58
  57. package/dist/commands/pickup/index.d.ts.map +1 -1
  58. package/dist/commands/pickup/index.js +6 -3
  59. package/dist/commands/pickup/utils.js +3 -3
  60. package/dist/commands/resources/index.d.ts.map +1 -1
  61. package/dist/commands/resources/index.js +33 -50
  62. package/dist/commands/review/index.d.ts.map +1 -1
  63. package/dist/commands/review/index.js +3 -117
  64. package/dist/commands/review/review-panel.d.ts +3 -0
  65. package/dist/commands/review/review-panel.d.ts.map +1 -0
  66. package/dist/commands/review/review-panel.js +186 -0
  67. package/dist/commands/review/utils.d.ts +15 -1
  68. package/dist/commands/review/utils.d.ts.map +1 -1
  69. package/dist/commands/review/utils.js +127 -68
  70. package/dist/commands/session/index.d.ts +1 -1
  71. package/dist/commands/session/index.d.ts.map +1 -1
  72. package/dist/commands/session/index.js +124 -135
  73. package/dist/commands/shell/index.d.ts.map +1 -1
  74. package/dist/commands/shell/index.js +16 -1
  75. package/dist/commands/types.d.ts +2 -2
  76. package/dist/commands/types.d.ts.map +1 -1
  77. package/dist/{config.d.ts → config/index.d.ts} +20 -9
  78. package/dist/config/index.d.ts.map +1 -0
  79. package/dist/{config.js → config/index.js} +43 -42
  80. package/dist/execution/index.d.ts.map +1 -1
  81. package/dist/execution/index.js +75 -55
  82. package/dist/index.d.ts +1 -0
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +148 -141
  85. package/dist/middleware/cache.d.ts.map +1 -1
  86. package/dist/middleware/cache.js +18 -36
  87. package/dist/models/ai-config.d.ts +1 -0
  88. package/dist/models/ai-config.d.ts.map +1 -1
  89. package/dist/models/ai-config.js +4 -3
  90. package/dist/models/anthropic-provider.d.ts +2 -5
  91. package/dist/models/anthropic-provider.d.ts.map +1 -1
  92. package/dist/models/anthropic-provider.js +3 -70
  93. package/dist/models/deepseek-provider.d.ts +1 -0
  94. package/dist/models/deepseek-provider.d.ts.map +1 -1
  95. package/dist/models/google-provider.d.ts +2 -3
  96. package/dist/models/google-provider.d.ts.map +1 -1
  97. package/dist/models/google-provider.js +0 -26
  98. package/dist/models/groq-provider.d.ts +1 -0
  99. package/dist/models/groq-provider.d.ts.map +1 -1
  100. package/dist/models/manager.d.ts +13 -2
  101. package/dist/models/manager.d.ts.map +1 -1
  102. package/dist/models/manager.js +20 -8
  103. package/dist/models/openai-provider.d.ts +2 -5
  104. package/dist/models/openai-provider.d.ts.map +1 -1
  105. package/dist/models/openai-provider.js +0 -52
  106. package/dist/models/opencode-go-provider.d.ts +25 -0
  107. package/dist/models/opencode-go-provider.d.ts.map +1 -0
  108. package/dist/models/opencode-go-provider.js +78 -0
  109. package/dist/models/opencode-zen-provider.d.ts +7 -3
  110. package/dist/models/opencode-zen-provider.d.ts.map +1 -1
  111. package/dist/models/opencode-zen-provider.js +49 -10
  112. package/dist/models/openrouter-provider.d.ts +27 -31
  113. package/dist/models/openrouter-provider.d.ts.map +1 -1
  114. package/dist/models/openrouter-provider.js +121 -180
  115. package/dist/models/providers.d.ts +3 -3
  116. package/dist/models/providers.d.ts.map +1 -1
  117. package/dist/models/providers.js +6 -0
  118. package/dist/models/xai-provider.d.ts +4 -3
  119. package/dist/models/xai-provider.d.ts.map +1 -1
  120. package/dist/models/xai-provider.js +18 -18
  121. package/dist/modes/manager.d.ts +24 -0
  122. package/dist/modes/manager.d.ts.map +1 -0
  123. package/dist/modes/manager.js +77 -0
  124. package/dist/modes/prompts.d.ts +2 -0
  125. package/dist/modes/prompts.d.ts.map +1 -0
  126. package/dist/modes/prompts.js +142 -0
  127. package/dist/prompts/mentions.d.ts +11 -0
  128. package/dist/prompts/mentions.d.ts.map +1 -0
  129. package/dist/{mentions.js → prompts/mentions.js} +55 -85
  130. package/dist/{prompts.d.ts → prompts/system-prompt.d.ts} +7 -2
  131. package/dist/prompts/system-prompt.d.ts.map +1 -0
  132. package/dist/{prompts.js → prompts/system-prompt.js} +31 -16
  133. package/dist/repl/index.d.ts +174 -0
  134. package/dist/repl/index.d.ts.map +1 -0
  135. package/dist/{repl-new.js → repl/index.js} +397 -76
  136. package/dist/repl/project-status.d.ts +1 -0
  137. package/dist/repl/project-status.d.ts.map +1 -1
  138. package/dist/repl/project-status.js +4 -1
  139. package/dist/sessions/manager.d.ts +92 -0
  140. package/dist/sessions/manager.d.ts.map +1 -1
  141. package/dist/sessions/manager.js +262 -9
  142. package/dist/sessions/summary.d.ts +4 -0
  143. package/dist/sessions/summary.d.ts.map +1 -0
  144. package/dist/sessions/summary.js +30 -0
  145. package/dist/skills/index.d.ts +29 -0
  146. package/dist/skills/index.d.ts.map +1 -0
  147. package/dist/skills/index.js +294 -0
  148. package/dist/subagents/index.d.ts +16 -0
  149. package/dist/subagents/index.d.ts.map +1 -0
  150. package/dist/subagents/index.js +231 -0
  151. package/dist/terminal/control.d.ts +1 -1
  152. package/dist/terminal/control.d.ts.map +1 -1
  153. package/dist/terminal/control.js +3 -3
  154. package/dist/terminal/east-asian-width.d.ts.map +1 -1
  155. package/dist/terminal/east-asian-width.js +404 -351
  156. package/dist/terminal/keys.d.ts +17 -0
  157. package/dist/terminal/keys.d.ts.map +1 -1
  158. package/dist/terminal/keys.js +37 -0
  159. package/dist/terminal/select-prompt.d.ts.map +1 -1
  160. package/dist/terminal/select-prompt.js +24 -12
  161. package/dist/terminal/string-width.d.ts.map +1 -1
  162. package/dist/terminal/string-width.js +25 -27
  163. package/dist/terminal/style.d.ts.map +1 -1
  164. package/dist/terminal/style.js +4 -7
  165. package/dist/terminal/supports-color.d.ts.map +1 -1
  166. package/dist/terminal/supports-color.js +41 -27
  167. package/dist/terminal/table/cell.d.ts +12 -0
  168. package/dist/terminal/table/cell.d.ts.map +1 -1
  169. package/dist/terminal/table/cell.js +40 -25
  170. package/dist/terminal/table/layout-manager.d.ts.map +1 -1
  171. package/dist/terminal/table/layout-manager.js +100 -68
  172. package/dist/terminal/table/utils.d.ts +1 -1
  173. package/dist/terminal/table/utils.d.ts.map +1 -1
  174. package/dist/terminal/table/utils.js +17 -10
  175. package/dist/terminal/wrap-ansi.d.ts.map +1 -1
  176. package/dist/terminal/wrap-ansi.js +174 -105
  177. package/dist/tokens/tracker.d.ts +1 -0
  178. package/dist/tokens/tracker.d.ts.map +1 -1
  179. package/dist/tokens/tracker.js +3 -0
  180. package/dist/tools/agent.d.ts +27 -0
  181. package/dist/tools/agent.d.ts.map +1 -0
  182. package/dist/tools/agent.js +81 -0
  183. package/dist/tools/apply-patch.d.ts +62 -0
  184. package/dist/tools/apply-patch.d.ts.map +1 -0
  185. package/dist/tools/apply-patch.js +377 -0
  186. package/dist/tools/bash.d.ts +4 -3
  187. package/dist/tools/bash.d.ts.map +1 -1
  188. package/dist/tools/bash.js +349 -141
  189. package/dist/tools/directory-tree.d.ts +3 -3
  190. package/dist/tools/directory-tree.d.ts.map +1 -1
  191. package/dist/tools/directory-tree.js +8 -5
  192. package/dist/tools/dynamic-tool-loader.d.ts +3 -6
  193. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  194. package/dist/tools/dynamic-tool-loader.js +20 -4
  195. package/dist/tools/edit-file.d.ts +7 -7
  196. package/dist/tools/edit-file.d.ts.map +1 -1
  197. package/dist/tools/edit-file.js +292 -85
  198. package/dist/tools/glob.d.ts +6 -6
  199. package/dist/tools/glob.d.ts.map +1 -1
  200. package/dist/tools/glob.js +110 -63
  201. package/dist/tools/grep.d.ts +15 -12
  202. package/dist/tools/grep.d.ts.map +1 -1
  203. package/dist/tools/grep.js +315 -193
  204. package/dist/tools/index.d.ts +114 -9
  205. package/dist/tools/index.d.ts.map +1 -1
  206. package/dist/tools/index.js +39 -24
  207. package/dist/tools/ls.d.ts +2 -2
  208. package/dist/tools/ls.d.ts.map +1 -1
  209. package/dist/tools/ls.js +7 -5
  210. package/dist/tools/read-file.d.ts +4 -6
  211. package/dist/tools/read-file.d.ts.map +1 -1
  212. package/dist/tools/read-file.js +84 -39
  213. package/dist/tools/save-file.d.ts +3 -3
  214. package/dist/tools/save-file.d.ts.map +1 -1
  215. package/dist/tools/save-file.js +36 -31
  216. package/dist/tools/skill.d.ts +23 -0
  217. package/dist/tools/skill.d.ts.map +1 -0
  218. package/dist/tools/skill.js +65 -0
  219. package/dist/tools/think.d.ts.map +1 -1
  220. package/dist/tools/think.js +2 -9
  221. package/dist/tools/utils.d.ts +2 -0
  222. package/dist/tools/utils.d.ts.map +1 -1
  223. package/dist/tools/utils.js +12 -0
  224. package/dist/tools/web-fetch.d.ts +50 -0
  225. package/dist/tools/web-fetch.d.ts.map +1 -0
  226. package/dist/tools/web-fetch.js +446 -0
  227. package/dist/tools/web-search.d.ts +44 -0
  228. package/dist/tools/web-search.d.ts.map +1 -0
  229. package/dist/tools/web-search.js +226 -0
  230. package/dist/tui/autocomplete/attachment-provider.d.ts +3 -6
  231. package/dist/tui/autocomplete/attachment-provider.d.ts.map +1 -1
  232. package/dist/tui/autocomplete/attachment-provider.js +25 -78
  233. package/dist/tui/autocomplete/base-provider.d.ts +1 -0
  234. package/dist/tui/autocomplete/base-provider.d.ts.map +1 -1
  235. package/dist/tui/autocomplete/combined-provider.d.ts +1 -4
  236. package/dist/tui/autocomplete/combined-provider.d.ts.map +1 -1
  237. package/dist/tui/autocomplete/combined-provider.js +3 -17
  238. package/dist/tui/autocomplete/command-provider.d.ts +1 -0
  239. package/dist/tui/autocomplete/command-provider.d.ts.map +1 -1
  240. package/dist/tui/autocomplete/command-provider.js +3 -0
  241. package/dist/tui/autocomplete/file-search-provider.d.ts +2 -1
  242. package/dist/tui/autocomplete/file-search-provider.d.ts.map +1 -1
  243. package/dist/tui/autocomplete/file-search-provider.js +37 -17
  244. package/dist/tui/autocomplete/skill-provider.d.ts +17 -0
  245. package/dist/tui/autocomplete/skill-provider.d.ts.map +1 -0
  246. package/dist/tui/autocomplete/skill-provider.js +49 -0
  247. package/dist/tui/autocomplete/utils.d.ts +2 -1
  248. package/dist/tui/autocomplete/utils.d.ts.map +1 -1
  249. package/dist/tui/autocomplete/utils.js +25 -23
  250. package/dist/tui/autocomplete.d.ts +2 -2
  251. package/dist/tui/autocomplete.d.ts.map +1 -1
  252. package/dist/tui/autocomplete.js +3 -5
  253. package/dist/tui/components/assistant-message.d.ts.map +1 -1
  254. package/dist/tui/components/assistant-message.js +0 -4
  255. package/dist/tui/components/editor.d.ts +18 -3
  256. package/dist/tui/components/editor.d.ts.map +1 -1
  257. package/dist/tui/components/editor.js +211 -237
  258. package/dist/tui/components/footer.d.ts +6 -4
  259. package/dist/tui/components/footer.d.ts.map +1 -1
  260. package/dist/tui/components/footer.js +49 -25
  261. package/dist/tui/components/markdown.d.ts +10 -7
  262. package/dist/tui/components/markdown.d.ts.map +1 -1
  263. package/dist/tui/components/markdown.js +57 -39
  264. package/dist/tui/components/modal.d.ts.map +1 -1
  265. package/dist/tui/components/modal.js +35 -33
  266. package/dist/tui/components/notification.d.ts +13 -2
  267. package/dist/tui/components/notification.d.ts.map +1 -1
  268. package/dist/tui/components/notification.js +36 -2
  269. package/dist/tui/components/progress-bar.js +1 -1
  270. package/dist/tui/components/select-list.d.ts +1 -0
  271. package/dist/tui/components/select-list.d.ts.map +1 -1
  272. package/dist/tui/components/select-list.js +14 -11
  273. package/dist/tui/components/text.d.ts +16 -0
  274. package/dist/tui/components/text.d.ts.map +1 -1
  275. package/dist/tui/components/text.js +72 -57
  276. package/dist/tui/components/thinking-block.d.ts +9 -0
  277. package/dist/tui/components/thinking-block.d.ts.map +1 -1
  278. package/dist/tui/components/thinking-block.js +43 -11
  279. package/dist/tui/components/tool-execution.d.ts +5 -1
  280. package/dist/tui/components/tool-execution.d.ts.map +1 -1
  281. package/dist/tui/components/tool-execution.js +19 -10
  282. package/dist/tui/components/user-message.d.ts.map +1 -1
  283. package/dist/tui/components/user-message.js +0 -3
  284. package/dist/tui/components/welcome.d.ts +2 -1
  285. package/dist/tui/components/welcome.d.ts.map +1 -1
  286. package/dist/tui/components/welcome.js +2 -2
  287. package/dist/tui/editor-launcher.d.ts +3 -2
  288. package/dist/tui/editor-launcher.d.ts.map +1 -1
  289. package/dist/tui/index.d.ts +0 -1
  290. package/dist/tui/index.d.ts.map +1 -1
  291. package/dist/tui/terminal.d.ts.map +1 -1
  292. package/dist/tui/terminal.js +10 -2
  293. package/dist/tui/tui.d.ts +43 -0
  294. package/dist/tui/tui.d.ts.map +1 -1
  295. package/dist/tui/tui.js +166 -41
  296. package/dist/tui/utils.d.ts +1 -5
  297. package/dist/tui/utils.d.ts.map +1 -1
  298. package/dist/tui/utils.js +271 -44
  299. package/dist/utils/bash/parse.d.ts +19 -0
  300. package/dist/utils/bash/parse.d.ts.map +1 -0
  301. package/dist/utils/bash/parse.js +223 -0
  302. package/dist/utils/bash/quote.d.ts +6 -0
  303. package/dist/utils/bash/quote.d.ts.map +1 -0
  304. package/dist/utils/bash/quote.js +23 -0
  305. package/dist/utils/bash.d.ts.map +1 -1
  306. package/dist/utils/bash.js +211 -126
  307. package/dist/utils/command-protection.d.ts +28 -0
  308. package/dist/utils/command-protection.d.ts.map +1 -0
  309. package/dist/utils/command-protection.js +324 -0
  310. package/dist/utils/dedent.d.ts.map +1 -0
  311. package/dist/utils/env-expand.d.ts +2 -0
  312. package/dist/utils/env-expand.d.ts.map +1 -0
  313. package/dist/utils/env-expand.js +8 -0
  314. package/dist/utils/filesystem/path-display.d.ts +11 -0
  315. package/dist/utils/filesystem/path-display.d.ts.map +1 -0
  316. package/dist/utils/filesystem/path-display.js +32 -0
  317. package/dist/utils/filesystem/security.d.ts +2 -2
  318. package/dist/utils/filesystem/security.d.ts.map +1 -1
  319. package/dist/utils/filesystem/security.js +28 -30
  320. package/dist/utils/formatting.d.ts.map +1 -0
  321. package/dist/{formatting.js → utils/formatting.js} +1 -1
  322. package/dist/utils/git.d.ts +4 -0
  323. package/dist/utils/git.d.ts.map +1 -1
  324. package/dist/utils/git.js +30 -0
  325. package/dist/utils/glob.d.ts +1 -1
  326. package/dist/utils/glob.d.ts.map +1 -1
  327. package/dist/utils/logger.d.ts.map +1 -0
  328. package/dist/{logger.js → utils/logger.js} +1 -1
  329. package/dist/utils/parsing.d.ts.map +1 -0
  330. package/dist/utils/process.d.ts.map +1 -1
  331. package/dist/utils/process.js +90 -37
  332. package/dist/utils/templates.d.ts +2 -0
  333. package/dist/utils/templates.d.ts.map +1 -0
  334. package/dist/utils/templates.js +24 -0
  335. package/dist/utils/version.d.ts.map +1 -0
  336. package/dist/{version.js → utils/version.js} +1 -1
  337. package/package.json +35 -26
  338. package/dist/cli.d.ts +0 -23
  339. package/dist/cli.d.ts.map +0 -1
  340. package/dist/commands/add-directory/types.d.ts +0 -6
  341. package/dist/commands/add-directory/types.d.ts.map +0 -1
  342. package/dist/commands/add-directory/types.js +0 -1
  343. package/dist/commands/copy/types.d.ts +0 -3
  344. package/dist/commands/copy/types.d.ts.map +0 -1
  345. package/dist/commands/copy/types.js +0 -1
  346. package/dist/commands/exit/index.d.ts +0 -10
  347. package/dist/commands/exit/index.d.ts.map +0 -1
  348. package/dist/commands/exit/index.js +0 -21
  349. package/dist/commands/exit/types.d.ts +0 -8
  350. package/dist/commands/exit/types.d.ts.map +0 -1
  351. package/dist/commands/exit/types.js +0 -1
  352. package/dist/commands/exit/utils.d.ts +0 -2
  353. package/dist/commands/exit/utils.d.ts.map +0 -1
  354. package/dist/commands/exit/utils.js +0 -13
  355. package/dist/commands/prompt/index.d.ts +0 -5
  356. package/dist/commands/prompt/index.d.ts.map +0 -1
  357. package/dist/commands/prompt/index.js +0 -122
  358. package/dist/commands/prompt/types.d.ts +0 -15
  359. package/dist/commands/prompt/types.d.ts.map +0 -1
  360. package/dist/commands/prompt/types.js +0 -1
  361. package/dist/commands/prompt/utils.d.ts +0 -12
  362. package/dist/commands/prompt/utils.d.ts.map +0 -1
  363. package/dist/commands/prompt/utils.js +0 -107
  364. package/dist/commands/reset/index.d.ts +0 -3
  365. package/dist/commands/reset/index.d.ts.map +0 -1
  366. package/dist/commands/reset/index.js +0 -25
  367. package/dist/commands/reset/types.d.ts +0 -1
  368. package/dist/commands/reset/types.d.ts.map +0 -1
  369. package/dist/commands/reset/types.js +0 -3
  370. package/dist/commands/review/types.d.ts +0 -12
  371. package/dist/commands/review/types.d.ts.map +0 -1
  372. package/dist/commands/review/types.js +0 -1
  373. package/dist/commands/save/index.d.ts +0 -3
  374. package/dist/commands/save/index.d.ts.map +0 -1
  375. package/dist/commands/save/index.js +0 -19
  376. package/dist/config.d.ts.map +0 -1
  377. package/dist/dedent.d.ts.map +0 -1
  378. package/dist/formatting.d.ts.map +0 -1
  379. package/dist/logger.d.ts.map +0 -1
  380. package/dist/mentions.d.ts +0 -14
  381. package/dist/mentions.d.ts.map +0 -1
  382. package/dist/parsing.d.ts.map +0 -1
  383. package/dist/prompts.d.ts.map +0 -1
  384. package/dist/repl-new.d.ts +0 -65
  385. package/dist/repl-new.d.ts.map +0 -1
  386. package/dist/skills.d.ts +0 -16
  387. package/dist/skills.d.ts.map +0 -1
  388. package/dist/skills.js +0 -233
  389. package/dist/stdin.d.ts.map +0 -1
  390. package/dist/tui/autocomplete/path-provider.d.ts +0 -21
  391. package/dist/tui/autocomplete/path-provider.d.ts.map +0 -1
  392. package/dist/tui/autocomplete/path-provider.js +0 -164
  393. package/dist/utils/iterables.d.ts +0 -2
  394. package/dist/utils/iterables.d.ts.map +0 -1
  395. package/dist/utils/iterables.js +0 -6
  396. package/dist/version.d.ts.map +0 -1
  397. /package/dist/{dedent.d.ts → utils/dedent.d.ts} +0 -0
  398. /package/dist/{dedent.js → utils/dedent.js} +0 -0
  399. /package/dist/{formatting.d.ts → utils/formatting.d.ts} +0 -0
  400. /package/dist/{logger.d.ts → utils/logger.d.ts} +0 -0
  401. /package/dist/{parsing.d.ts → utils/parsing.d.ts} +0 -0
  402. /package/dist/{parsing.js → utils/parsing.js} +0 -0
  403. /package/dist/{version.d.ts → utils/version.d.ts} +0 -0
@@ -4,7 +4,7 @@ import { Modal, Container as ModalContainer, ModalText, TableComponent, } from "
4
4
  export function listToolsCommand(options) {
5
5
  return {
6
6
  command: "/list-tools",
7
- description: "List all available static and dynamic tools.",
7
+ description: "List all available tools.",
8
8
  aliases: ["/lt"],
9
9
  getSubCommands: async () => [],
10
10
  async handle(_args, { tui, editor }) {
@@ -16,17 +16,6 @@ export function listToolsCommand(options) {
16
16
  workspace: options.workspace,
17
17
  });
18
18
  const toolNames = Object.keys(tools).sort();
19
- // Separate static and dynamic tools
20
- const staticTools = [];
21
- const dynamicTools = [];
22
- for (const toolName of toolNames) {
23
- if (toolName.startsWith("dynamic-")) {
24
- dynamicTools.push(toolName);
25
- }
26
- else {
27
- staticTools.push(toolName);
28
- }
29
- }
30
19
  // Build modal content
31
20
  const modalContent = new ModalContainer();
32
21
  if (toolNames.length === 0) {
@@ -35,34 +24,21 @@ export function listToolsCommand(options) {
35
24
  else {
36
25
  // Create table data
37
26
  const tableData = [];
38
- // Add static tools
39
- for (const toolName of staticTools) {
40
- const isActive = activeTools === undefined || activeTools.includes(toolName);
41
- tableData.push([
42
- toolName,
43
- "Static",
44
- isActive ? "Active" : "Inactive",
45
- ]);
46
- }
47
- // Add dynamic tools
48
- for (const toolName of dynamicTools) {
27
+ // Add tools
28
+ for (const toolName of toolNames) {
49
29
  const isActive = activeTools === undefined || activeTools.includes(toolName);
50
- tableData.push([
51
- toolName,
52
- "Dynamic",
53
- isActive ? "Active" : "Inactive",
54
- ]);
30
+ tableData.push([toolName, isActive ? "Active" : "Inactive"]);
55
31
  }
56
32
  modalContent.addChild(new TableComponent(tableData, {
57
- headers: ["Tool Name", "Type", "Status"],
58
- colWidths: [60, 20, 20],
33
+ headers: ["Tool Name", "Status"],
34
+ colWidths: [60, 20],
59
35
  }));
60
36
  // Add summary
61
37
  modalContent.addChild(new ModalText("", 0, 1)); // Spacer
62
38
  const activeCount = activeTools === undefined
63
39
  ? toolNames.length
64
40
  : toolNames.filter((tool) => activeTools.includes(tool)).length;
65
- modalContent.addChild(new ModalText(`Total: ${staticTools.length} static, ${dynamicTools.length} dynamic, ${activeCount} active`, 0, 1));
41
+ modalContent.addChild(new ModalText(`Total: ${toolNames.length} tools, ${activeCount} active`, 0, 1));
66
42
  }
67
43
  // Create and show modal
68
44
  const modal = new Modal("Available Tools", modalContent, true, () => {
@@ -11,8 +11,9 @@ export declare class CommandManager {
11
11
  private promptHistory;
12
12
  private workspace;
13
13
  private initialized;
14
- constructor({ promptManager, modelManager, sessionManager: messageHistory, tokenTracker, config, tokenCounter, promptHistory, workspace, }: CommandOptions);
14
+ constructor({ promptManager, modelManager, sessionManager, tokenTracker, config, tokenCounter, promptHistory, workspace, }: CommandOptions);
15
15
  initializeCommmands(): Promise<void>;
16
+ private registerSkillCommands;
16
17
  private ensureInitialized;
17
18
  getCompletions(): Promise<SlashCommand[]>;
18
19
  getCommands(): string[];
@@ -26,7 +27,6 @@ export declare class CommandManager {
26
27
  editor: Editor;
27
28
  }): Promise<{
28
29
  continue: boolean;
29
- break: boolean;
30
30
  }>;
31
31
  }
32
32
  //# sourceMappingURL=manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../source/commands/manager.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,SAAS,EACT,MAAM,EACN,YAAY,EACZ,GAAG,EACJ,MAAM,iBAAiB,CAAC;AA0BzB,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAE9D,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,WAAW,CAAU;gBAEjB,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EAAE,cAAc,EAC9B,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,aAAa,EACb,SAAS,GACV,EAAE,cAAc;IAaX,mBAAmB;IAsFzB,OAAO,CAAC,iBAAiB;IAQnB,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAuB/C,WAAW;IAKL,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlD,MAAM,CACV,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EACpC,OAAO,EAAE;QACP,GAAG,EAAE,GAAG,CAAC;QACT,SAAS,EAAE,SAAS,CAAC;QACrB,cAAc,EAAE,SAAS,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC;KAChB;;;;CA8BJ"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../source/commands/manager.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,SAAS,EACT,MAAM,EACN,YAAY,EACZ,GAAG,EACJ,MAAM,iBAAiB,CAAC;AA2BzB,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAE9D,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,WAAW,CAAU;gBAEjB,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,aAAa,EACb,SAAS,GACV,EAAE,cAAc;IAaX,mBAAmB;YA0DX,qBAAqB;IA0EnC,OAAO,CAAC,iBAAiB;IAQnB,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAuB/C,WAAW;IAKL,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlD,MAAM,CACV,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EACpC,OAAO,EAAE;QACP,GAAG,EAAE,GAAG,CAAC;QACT,SAAS,EAAE,SAAS,CAAC;QACrB,cAAc,EAAE,SAAS,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC;KAChB;;;CAsBJ"}
@@ -1,7 +1,14 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { processPrompt } from "../prompts/mentions.js";
3
+ import { loadSkills } from "../skills/index.js";
4
+ import style from "../terminal/style.js";
5
+ import { Spacer, Text } from "../tui/index.js";
6
+ import { logger } from "../utils/logger.js";
7
+ import { replaceArgumentPlaceholders } from "../utils/templates.js";
8
+ import { parseFrontMatter } from "../utils/yaml.js";
1
9
  import { addDirectoryCommand } from "./add-directory/index.js";
2
10
  import { clearCommand } from "./clear/index.js";
3
11
  import { copyCommand } from "./copy/index.js";
4
- import { exitCommand } from "./exit/index.js";
5
12
  import { generateRulesCommand } from "./generate-rules/index.js";
6
13
  import { handoffCommand } from "./handoff/index.js";
7
14
  import { healthCommand } from "./health/index.js";
@@ -14,12 +21,9 @@ import { listToolsCommand } from "./list-tools/index.js";
14
21
  import { modelCommand } from "./model/index.js";
15
22
  import { pasteCommand } from "./paste/index.js";
16
23
  import { pickupCommand } from "./pickup/index.js";
17
- import { loadPrompts, promptCommand } from "./prompt/index.js";
18
24
  import { removeDirectoryCommand } from "./remove-directory/index.js";
19
- import { resetCommand } from "./reset/index.js";
20
25
  import { resourcesCommand } from "./resources/index.js";
21
26
  import { reviewCommand } from "./review/index.js";
22
- import { saveCommand } from "./save/index.js";
23
27
  import { sessionCommand } from "./session/index.js";
24
28
  import { shareCommand } from "./share/index.js";
25
29
  import { shellCommand } from "./shell/index.js";
@@ -34,11 +38,11 @@ export class CommandManager {
34
38
  promptHistory;
35
39
  workspace;
36
40
  initialized;
37
- constructor({ promptManager, modelManager, sessionManager: messageHistory, tokenTracker, config, tokenCounter, promptHistory, workspace, }) {
41
+ constructor({ promptManager, modelManager, sessionManager, tokenTracker, config, tokenCounter, promptHistory, workspace, }) {
38
42
  this.commands = new Map();
39
43
  this.promptManager = promptManager;
40
44
  this.modelManager = modelManager;
41
- this.sessionManager = messageHistory;
45
+ this.sessionManager = sessionManager;
42
46
  this.tokenTracker = tokenTracker;
43
47
  this.config = config;
44
48
  this.tokenCounter = tokenCounter;
@@ -65,7 +69,6 @@ export class CommandManager {
65
69
  const cmds = [
66
70
  addDirectoryCommand(options),
67
71
  clearCommand(options),
68
- exitCommand(options),
69
72
  healthCommand(options),
70
73
  historyCommand(options),
71
74
  initCommand(options),
@@ -73,11 +76,8 @@ export class CommandManager {
73
76
  listDirectoriesCommand(options),
74
77
  pasteCommand(options),
75
78
  pickupCommand(options),
76
- promptCommand(options),
77
79
  removeDirectoryCommand(options),
78
- resetCommand(options),
79
80
  reviewCommand(options),
80
- saveCommand(options),
81
81
  modelCommand(options),
82
82
  sessionCommand(options),
83
83
  generateRulesCommand(options),
@@ -99,23 +99,53 @@ export class CommandManager {
99
99
  // this.commands.set(alias, cmd);
100
100
  // }
101
101
  }
102
- const promptCmd = this.commands.get("/prompt");
103
- if (promptCmd) {
104
- const promptSubmCommands = await promptCmd.getSubCommands();
105
- const prompts = await loadPrompts(options.config);
106
- for (const cmd of promptSubmCommands) {
107
- const prompt = prompts.get(cmd);
108
- this.commands.set(`/${cmd}`, {
109
- command: `/${cmd}`,
110
- description: prompt?.description ?? "",
111
- getSubCommands: () => Promise.resolve([]),
112
- async handle(args, options) {
113
- return promptCmd.handle([cmd, ...args], options);
114
- },
115
- });
102
+ await this.registerSkillCommands(options);
103
+ this.initialized = true;
104
+ }
105
+ async registerSkillCommands(options) {
106
+ const skills = await loadSkills();
107
+ const userInvocableSkills = skills.getUserInvocable();
108
+ for (const skill of userInvocableSkills) {
109
+ const commandName = `/${skill.name}`;
110
+ if (this.commands.has(commandName)) {
111
+ logger.warn(`Skill "${skill.name}" conflicts with built-in command "${commandName}", skipping skill registration`);
112
+ continue;
116
113
  }
114
+ const { promptManager, modelManager, promptHistory, workspace } = options;
115
+ const skillFilePath = skill.filePath;
116
+ const skillDescription = skill.description;
117
+ this.commands.set(commandName, {
118
+ command: commandName,
119
+ description: skillDescription,
120
+ getSubCommands: () => Promise.resolve([]),
121
+ async handle(args, { tui, container, editor, }) {
122
+ try {
123
+ const fileContent = await readFile(skillFilePath, "utf8");
124
+ const { content: body } = parseFrontMatter(fileContent);
125
+ const content = replaceArgumentPlaceholders(body.trim(), args);
126
+ container.addChild(new Spacer(1));
127
+ const processedPrompt = await processPrompt(content.trim(), {
128
+ baseDir: workspace.primaryDir,
129
+ model: modelManager.getModelMetadata("repl"),
130
+ });
131
+ for (const context of processedPrompt.context) {
132
+ promptManager.addContext(context);
133
+ }
134
+ promptManager.set(processedPrompt.message);
135
+ promptHistory.push(processedPrompt.message);
136
+ tui.requestRender();
137
+ editor.setText("");
138
+ return "use";
139
+ }
140
+ catch (error) {
141
+ container.addChild(new Text(style.red(`Error loading skill: ${error.message}`), 1, 0));
142
+ tui.requestRender();
143
+ editor.setText("");
144
+ return "continue";
145
+ }
146
+ },
147
+ });
117
148
  }
118
- this.initialized = true;
119
149
  }
120
150
  ensureInitialized() {
121
151
  if (!this.initialized) {
@@ -160,20 +190,12 @@ export class CommandManager {
160
190
  if (result === "continue") {
161
191
  return {
162
192
  continue: true,
163
- break: false,
164
- };
165
- }
166
- if (result === "break") {
167
- return {
168
- continue: false,
169
- break: true,
170
193
  };
171
194
  }
172
195
  }
173
196
  }
174
197
  return {
175
198
  continue: false,
176
- break: false,
177
199
  };
178
200
  }
179
201
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/model/index.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/D,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CAqHjE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/model/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAqB/D,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CAoEjE"}
@@ -1,8 +1,17 @@
1
1
  import { isValidModel, modelRegistry, models, } from "../../models/providers.js";
2
- import { getTerminalSize, isArrowDown, isArrowUp, isEnter, isEscape, } from "../../terminal/control.js";
3
2
  import style from "../../terminal/style.js";
4
- import { Container, Input, Spacer, Text, } from "../../tui/index.js";
5
- import { hideModelSelector } from "./utils.js";
3
+ import { Text, } from "../../tui/index.js";
4
+ import { showModelSelector } from "./model-panel.js";
5
+ function getCapabilityWarnings(current, next) {
6
+ const warnings = [];
7
+ if (current.supportsToolCalling && !next.supportsToolCalling) {
8
+ warnings.push("The new model doesn't support tool calling, which may limit functionality.");
9
+ }
10
+ if (current.supportsReasoning && !next.supportsReasoning) {
11
+ warnings.push("The new model doesn't support reasoning, which may change response quality.");
12
+ }
13
+ return warnings;
14
+ }
6
15
  export function modelCommand(options) {
7
16
  const { modelManager } = options;
8
17
  return {
@@ -11,50 +20,27 @@ export function modelCommand(options) {
11
20
  getSubCommands: () => Promise.resolve(models),
12
21
  async handle(args, { tui, container, inputContainer, editor, }) {
13
22
  const arg = args.join(" ").trim();
14
- const modelConfig = modelManager.getModelMetadata("repl");
15
23
  if (!arg) {
16
- const modelSelector = new ModelSelectorComponent(modelConfig.id, (model) => {
17
- modelManager.setModel("repl", model);
18
- hideModelSelector(inputContainer, editor, tui);
19
- tui.requestRender();
20
- }, () => {
21
- hideModelSelector(inputContainer, editor, tui);
22
- tui.requestRender();
23
- });
24
- inputContainer.clear();
25
- inputContainer.addChild(modelSelector);
26
- tui.setFocus(modelSelector);
27
- tui.requestRender();
24
+ showModelSelector(tui, inputContainer, editor, modelManager);
28
25
  return "continue";
29
26
  }
30
27
  if (isValidModel(arg)) {
31
28
  try {
32
- const currentModelConfig = modelManager.getModelMetadata("repl");
33
29
  const newModelConfig = modelRegistry[arg];
34
30
  if (newModelConfig === undefined) {
35
31
  container.addChild(new Text(style.red(`Model configuration not found for: ${arg}`), 1, 0));
36
- tui.requestRender();
37
- editor.setText("");
38
- return "continue";
39
- }
40
- if (currentModelConfig.supportsToolCalling &&
41
- !newModelConfig.supportsToolCalling) {
42
- container.addChild(new Text(style.yellow("The new model doesn't support tool calling, which may limit functionality."), 1, 0));
43
32
  }
44
- if (currentModelConfig.supportsReasoning &&
45
- !newModelConfig.supportsReasoning) {
46
- container.addChild(new Text(style.yellow("The new model doesn't support reasoning, which may change response quality."), 2, 0));
33
+ else {
34
+ const currentModelConfig = modelManager.getModelMetadata("repl");
35
+ const warnings = getCapabilityWarnings(currentModelConfig, newModelConfig);
36
+ for (const warning of warnings) {
37
+ container.addChild(new Text(style.yellow(warning), 1, 0));
38
+ }
39
+ modelManager.setModel("repl", arg);
47
40
  }
48
- modelManager.setModel("repl", arg);
49
- tui.requestRender();
50
- editor.setText("");
51
- return "continue";
52
41
  }
53
42
  catch (error) {
54
43
  container.addChild(new Text(style.red(`Failed to switch model: ${error.message}`), 0, 0));
55
- tui.requestRender();
56
- editor.setText("");
57
- return "continue";
58
44
  }
59
45
  }
60
46
  tui.requestRender();
@@ -63,120 +49,3 @@ export function modelCommand(options) {
63
49
  },
64
50
  };
65
51
  }
66
- class ModelSelectorComponent extends Container {
67
- searchInput;
68
- listContainer;
69
- allModels = [];
70
- filteredModels = [];
71
- selectedIndex = 0;
72
- currentModel;
73
- onSelectCallback;
74
- onCancelCallback;
75
- constructor(currentModel, onSelect, onCancel) {
76
- super();
77
- this.currentModel = currentModel;
78
- this.onSelectCallback = onSelect;
79
- this.onCancelCallback = onCancel;
80
- this.loadModels();
81
- const { columns } = getTerminalSize();
82
- this.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
83
- this.addChild(new Spacer(1));
84
- this.searchInput = new Input();
85
- this.searchInput.onSubmit = () => {
86
- const model = this.filteredModels[this.selectedIndex];
87
- if (model !== undefined) {
88
- this.handleSelect(model);
89
- }
90
- };
91
- this.addChild(this.searchInput);
92
- this.addChild(new Spacer(1));
93
- this.listContainer = new Container();
94
- this.addChild(this.listContainer);
95
- this.addChild(new Spacer(1));
96
- this.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
97
- this.updateList();
98
- }
99
- loadModels() {
100
- this.allModels = models;
101
- this.filteredModels = models;
102
- }
103
- filterModels(query) {
104
- if (!query.trim()) {
105
- this.filteredModels = this.allModels;
106
- }
107
- else {
108
- const searchTokens = query
109
- .toLowerCase()
110
- .split(/\s+/)
111
- .filter((t) => t);
112
- this.filteredModels = this.allModels.filter((model) => {
113
- const searchText = `${model}`.toLowerCase();
114
- return searchTokens.every((token) => searchText.includes(token));
115
- });
116
- }
117
- this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredModels.length - 1));
118
- this.updateList();
119
- }
120
- updateList() {
121
- this.listContainer.clear();
122
- const maxVisible = 10;
123
- const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(maxVisible / 2), this.filteredModels.length - maxVisible));
124
- const endIndex = Math.min(startIndex + maxVisible, this.filteredModels.length);
125
- for (let i = startIndex; i < endIndex; i++) {
126
- const item = this.filteredModels[i];
127
- if (item === undefined)
128
- continue;
129
- const isSelected = i === this.selectedIndex;
130
- const isCurrent = this.currentModel === item;
131
- let line = "";
132
- if (isSelected) {
133
- const prefix = style.blue("→ ");
134
- const modelText = `${item}`;
135
- const checkmark = isCurrent ? style.green(" ✓") : "";
136
- line = `${prefix + style.blue(modelText)} ${checkmark}`;
137
- }
138
- else {
139
- const modelText = ` ${item}`;
140
- const checkmark = isCurrent ? style.green(" ✓") : "";
141
- line = `${modelText} ${checkmark}`;
142
- }
143
- this.listContainer.addChild(new Text(line, 0, 0));
144
- }
145
- if (startIndex > 0 || endIndex < this.filteredModels.length) {
146
- const scrollInfo = style.gray(` (${this.selectedIndex + 1}/${this.filteredModels.length})`);
147
- this.listContainer.addChild(new Text(scrollInfo, 0, 0));
148
- }
149
- if (this.filteredModels.length === 0) {
150
- this.listContainer.addChild(new Text(style.gray(" No matching models"), 0, 0));
151
- }
152
- }
153
- handleInput(keyData) {
154
- if (isArrowUp(keyData)) {
155
- this.selectedIndex = Math.max(0, this.selectedIndex - 1);
156
- this.updateList();
157
- }
158
- else if (isArrowDown(keyData)) {
159
- this.selectedIndex = Math.min(this.filteredModels.length - 1, this.selectedIndex + 1);
160
- this.updateList();
161
- }
162
- else if (isEnter(keyData)) {
163
- const selectedModel = this.filteredModels[this.selectedIndex];
164
- if (selectedModel !== undefined) {
165
- this.handleSelect(selectedModel);
166
- }
167
- }
168
- else if (isEscape(keyData)) {
169
- this.onCancelCallback();
170
- }
171
- else {
172
- this.searchInput.handleInput(keyData);
173
- this.filterModels(this.searchInput.getValue());
174
- }
175
- }
176
- handleSelect(model) {
177
- this.onSelectCallback(model);
178
- }
179
- getSearchInput() {
180
- return this.searchInput;
181
- }
182
- }
@@ -0,0 +1,4 @@
1
+ import type { ModelManager } from "../../models/manager.ts";
2
+ import { Container, type Editor, type TUI } from "../../tui/index.ts";
3
+ export declare function showModelSelector(tui: TUI, inputContainer: Container, editor: Editor, modelManager: ModelManager): void;
4
+ //# sourceMappingURL=model-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-panel.d.ts","sourceRoot":"","sources":["../../../source/commands/model/model-panel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAY5D,OAAO,EACL,SAAS,EACT,KAAK,MAAM,EAIX,KAAK,GAAG,EACT,MAAM,oBAAoB,CAAC;AAG5B,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,SAAS,EACzB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,GACzB,IAAI,CAoBN"}
@@ -0,0 +1,144 @@
1
+ import { models } from "../../models/providers.js";
2
+ import { getTerminalSize, isArrowDown, isArrowUp, isEnter, isEscape, } from "../../terminal/control.js";
3
+ import { isShiftTab, isTab } from "../../terminal/keys.js";
4
+ import style from "../../terminal/style.js";
5
+ import { Container, Input, Spacer, Text, } from "../../tui/index.js";
6
+ import { hideModelSelector } from "./utils.js";
7
+ export function showModelSelector(tui, inputContainer, editor, modelManager) {
8
+ const modelConfig = modelManager.getModelMetadata("repl");
9
+ const modelSelector = new ModelSelectorComponent(modelConfig.id, (model) => {
10
+ modelManager.setModel("repl", model);
11
+ hideModelSelector(inputContainer, editor, tui);
12
+ tui.requestRender();
13
+ }, () => {
14
+ hideModelSelector(inputContainer, editor, tui);
15
+ tui.requestRender();
16
+ });
17
+ inputContainer.clear();
18
+ inputContainer.addChild(modelSelector);
19
+ tui.setFocus(modelSelector);
20
+ tui.requestRender();
21
+ }
22
+ class ModelSelectorComponent extends Container {
23
+ searchInput;
24
+ listContainer;
25
+ allModels = [];
26
+ filteredModels = [];
27
+ selectedIndex = 0;
28
+ currentModel;
29
+ onSelectCallback;
30
+ onCancelCallback;
31
+ constructor(currentModel, onSelect, onCancel) {
32
+ super();
33
+ this.currentModel = currentModel;
34
+ this.onSelectCallback = onSelect;
35
+ this.onCancelCallback = onCancel;
36
+ this.loadModels();
37
+ const { columns } = getTerminalSize();
38
+ this.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
39
+ this.addChild(new Spacer(1));
40
+ this.searchInput = new Input();
41
+ this.searchInput.onSubmit = () => {
42
+ const model = this.filteredModels[this.selectedIndex];
43
+ if (model !== undefined) {
44
+ this.handleSelect(model);
45
+ }
46
+ };
47
+ this.addChild(this.searchInput);
48
+ this.addChild(new Spacer(1));
49
+ this.listContainer = new Container();
50
+ this.addChild(this.listContainer);
51
+ this.addChild(new Spacer(1));
52
+ this.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
53
+ this.updateList();
54
+ }
55
+ loadModels() {
56
+ this.allModels = models;
57
+ this.filteredModels = models;
58
+ }
59
+ filterModels(query) {
60
+ if (!query.trim()) {
61
+ this.filteredModels = this.allModels;
62
+ }
63
+ else {
64
+ const searchTokens = query
65
+ .toLowerCase()
66
+ .split(/\s+/)
67
+ .filter((t) => t);
68
+ this.filteredModels = this.allModels.filter((model) => {
69
+ const searchText = `${model}`.toLowerCase();
70
+ return searchTokens.every((token) => searchText.includes(token));
71
+ });
72
+ }
73
+ this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredModels.length - 1));
74
+ this.updateList();
75
+ }
76
+ updateList() {
77
+ this.listContainer.clear();
78
+ const maxVisible = 10;
79
+ const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(maxVisible / 2), this.filteredModels.length - maxVisible));
80
+ const endIndex = Math.min(startIndex + maxVisible, this.filteredModels.length);
81
+ for (let i = startIndex; i < endIndex; i++) {
82
+ const item = this.filteredModels[i];
83
+ if (item === undefined)
84
+ continue;
85
+ const isSelected = i === this.selectedIndex;
86
+ const isCurrent = this.currentModel === item;
87
+ let line = "";
88
+ if (isSelected) {
89
+ const prefix = style.blue("→ ");
90
+ const modelText = `${item}`;
91
+ const checkmark = isCurrent ? style.green(" ✓") : "";
92
+ line = `${prefix + style.blue(modelText)} ${checkmark}`;
93
+ }
94
+ else {
95
+ const modelText = ` ${item}`;
96
+ const checkmark = isCurrent ? style.green(" ✓") : "";
97
+ line = `${modelText} ${checkmark}`;
98
+ }
99
+ this.listContainer.addChild(new Text(line, 0, 0));
100
+ }
101
+ if (startIndex > 0 || endIndex < this.filteredModels.length) {
102
+ const scrollInfo = style.gray(` (${this.selectedIndex + 1}/${this.filteredModels.length})`);
103
+ this.listContainer.addChild(new Text(scrollInfo, 0, 0));
104
+ }
105
+ if (this.filteredModels.length === 0) {
106
+ this.listContainer.addChild(new Text(style.gray(" No matching models"), 0, 0));
107
+ }
108
+ }
109
+ handleInput(keyData) {
110
+ const enterKeyCodes = ["\r", "\n", "\x1b[13u", "\x0d"];
111
+ const isEnterKey = enterKeyCodes.includes(keyData) || isEnter(keyData);
112
+ if (isEnterKey) {
113
+ const selectedModel = this.filteredModels[this.selectedIndex];
114
+ if (selectedModel !== undefined) {
115
+ this.handleSelect(selectedModel);
116
+ }
117
+ return;
118
+ }
119
+ if (isArrowUp(keyData) || isShiftTab(keyData)) {
120
+ this.selectedIndex = Math.max(0, this.selectedIndex - 1);
121
+ this.updateList();
122
+ }
123
+ else if (isArrowDown(keyData) || isTab(keyData)) {
124
+ this.selectedIndex = Math.min(this.filteredModels.length - 1, this.selectedIndex + 1);
125
+ this.updateList();
126
+ }
127
+ else if (isEscape(keyData)) {
128
+ this.onCancelCallback();
129
+ }
130
+ else {
131
+ this.searchInput.handleInput(keyData);
132
+ this.filterModels(this.searchInput.getValue());
133
+ }
134
+ }
135
+ handleSelect(model) {
136
+ this.onSelectCallback(model);
137
+ }
138
+ wantsNavigationKeys() {
139
+ return true;
140
+ }
141
+ getSearchInput() {
142
+ return this.searchInput;
143
+ }
144
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/paste/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO/D,eAAO,MAAM,YAAY,GAAI,gDAI1B,cAAc,KAAG,WAiKnB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/paste/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAmG/D,eAAO,MAAM,YAAY,GAAI,gDAI1B,cAAc,KAAG,WA2DnB,CAAC"}