@travisennis/acai 0.0.7 → 0.0.8

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 (471) hide show
  1. package/README.md +42 -25
  2. package/dist/agent/index.d.ts +21 -25
  3. package/dist/agent/index.d.ts.map +1 -1
  4. package/dist/agent/index.js +115 -104
  5. package/dist/cli.d.ts +2 -2
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +21 -16
  8. package/dist/commands/add-directory/index.d.ts +3 -0
  9. package/dist/commands/add-directory/index.d.ts.map +1 -0
  10. package/dist/commands/{add-directory-command.js → add-directory/index.js} +6 -10
  11. package/dist/commands/add-directory/types.d.ts +6 -0
  12. package/dist/commands/add-directory/types.d.ts.map +1 -0
  13. package/dist/commands/add-directory/types.js +1 -0
  14. package/dist/commands/add-directory/utils.d.ts +3 -0
  15. package/dist/commands/add-directory/utils.d.ts.map +1 -0
  16. package/dist/commands/add-directory/utils.js +15 -0
  17. package/dist/commands/clear/index.d.ts +3 -0
  18. package/dist/commands/clear/index.d.ts.map +1 -0
  19. package/dist/commands/{clear-command.js → clear/index.js} +0 -2
  20. package/dist/commands/copy/index.d.ts +3 -0
  21. package/dist/commands/copy/index.d.ts.map +1 -0
  22. package/dist/commands/{copy-command.js → copy/index.js} +4 -26
  23. package/dist/commands/copy/types.d.ts +3 -0
  24. package/dist/commands/copy/types.d.ts.map +1 -0
  25. package/dist/commands/copy/types.js +1 -0
  26. package/dist/commands/copy/utils.d.ts +3 -0
  27. package/dist/commands/copy/utils.d.ts.map +1 -0
  28. package/dist/commands/copy/utils.js +22 -0
  29. package/dist/commands/{exit-command.d.ts → exit/index.d.ts} +4 -4
  30. package/dist/commands/exit/index.d.ts.map +1 -0
  31. package/dist/commands/exit/index.js +21 -0
  32. package/dist/commands/exit/types.d.ts +8 -0
  33. package/dist/commands/exit/types.d.ts.map +1 -0
  34. package/dist/commands/exit/types.js +1 -0
  35. package/dist/commands/exit/utils.d.ts +2 -0
  36. package/dist/commands/exit/utils.d.ts.map +1 -0
  37. package/dist/commands/exit/utils.js +13 -0
  38. package/dist/commands/generate-rules/index.d.ts +3 -0
  39. package/dist/commands/generate-rules/index.d.ts.map +1 -0
  40. package/dist/commands/{generate-rules-command.js → generate-rules/index.js} +55 -95
  41. package/dist/commands/generate-rules/utils.d.ts +5 -0
  42. package/dist/commands/generate-rules/utils.d.ts.map +1 -0
  43. package/dist/commands/generate-rules/utils.js +25 -0
  44. package/dist/commands/handoff/index.d.ts +3 -0
  45. package/dist/commands/handoff/index.d.ts.map +1 -0
  46. package/dist/commands/handoff/index.js +97 -0
  47. package/dist/commands/handoff/utils.d.ts +4 -0
  48. package/dist/commands/handoff/utils.d.ts.map +1 -0
  49. package/dist/commands/{handoff-command.js → handoff/utils.js} +24 -92
  50. package/dist/commands/health/index.d.ts +3 -0
  51. package/dist/commands/health/index.d.ts.map +1 -0
  52. package/dist/commands/health/index.js +56 -0
  53. package/dist/commands/health/utils.d.ts +15 -0
  54. package/dist/commands/health/utils.d.ts.map +1 -0
  55. package/dist/commands/health/utils.js +52 -0
  56. package/dist/commands/{help-command.d.ts → help/index.d.ts} +2 -2
  57. package/dist/commands/help/index.d.ts.map +1 -0
  58. package/dist/commands/{help-command.js → help/index.js} +1 -1
  59. package/dist/commands/history/index.d.ts +3 -0
  60. package/dist/commands/history/index.d.ts.map +1 -0
  61. package/dist/commands/{history-command.js → history/index.js} +16 -100
  62. package/dist/commands/history/types.d.ts +11 -0
  63. package/dist/commands/history/types.d.ts.map +1 -0
  64. package/dist/commands/history/types.js +1 -0
  65. package/dist/commands/history/utils.d.ts +4 -0
  66. package/dist/commands/history/utils.d.ts.map +1 -0
  67. package/dist/commands/history/utils.js +86 -0
  68. package/dist/commands/init/index.d.ts +3 -0
  69. package/dist/commands/init/index.d.ts.map +1 -0
  70. package/dist/commands/{init-command.js → init/index.js} +16 -7
  71. package/dist/commands/init-project/index.d.ts +3 -0
  72. package/dist/commands/init-project/index.d.ts.map +1 -0
  73. package/dist/commands/init-project/index.js +51 -0
  74. package/dist/commands/init-project/utils.d.ts +9 -0
  75. package/dist/commands/init-project/utils.d.ts.map +1 -0
  76. package/dist/commands/init-project/utils.js +43 -0
  77. package/dist/commands/list-directories/index.d.ts +3 -0
  78. package/dist/commands/list-directories/index.d.ts.map +1 -0
  79. package/dist/commands/{list-directories-command.js → list-directories/index.js} +1 -1
  80. package/dist/commands/list-tools/index.d.ts +3 -0
  81. package/dist/commands/list-tools/index.d.ts.map +1 -0
  82. package/dist/commands/{list-tools-command.js → list-tools/index.js} +4 -16
  83. package/dist/commands/manager.d.ts +2 -2
  84. package/dist/commands/manager.d.ts.map +1 -1
  85. package/dist/commands/manager.js +33 -43
  86. package/dist/commands/model/index.d.ts +3 -0
  87. package/dist/commands/model/index.d.ts.map +1 -0
  88. package/dist/commands/{model-command.js → model/index.js} +15 -52
  89. package/dist/commands/model/utils.d.ts +3 -0
  90. package/dist/commands/model/utils.d.ts.map +1 -0
  91. package/dist/commands/model/utils.js +5 -0
  92. package/dist/commands/{paste-command.d.ts → paste/index.d.ts} +2 -2
  93. package/dist/commands/paste/index.d.ts.map +1 -0
  94. package/dist/commands/{paste-command.js → paste/index.js} +6 -111
  95. package/dist/commands/paste/utils.d.ts +5 -0
  96. package/dist/commands/paste/utils.d.ts.map +1 -0
  97. package/dist/commands/paste/utils.js +86 -0
  98. package/dist/commands/pickup/index.d.ts +3 -0
  99. package/dist/commands/pickup/index.d.ts.map +1 -0
  100. package/dist/commands/pickup/index.js +138 -0
  101. package/dist/commands/pickup/types.d.ts +6 -0
  102. package/dist/commands/pickup/types.d.ts.map +1 -0
  103. package/dist/commands/pickup/types.js +1 -0
  104. package/dist/commands/pickup/utils.d.ts +7 -0
  105. package/dist/commands/pickup/utils.d.ts.map +1 -0
  106. package/dist/commands/pickup/utils.js +56 -0
  107. package/dist/commands/prompt/index.d.ts +5 -0
  108. package/dist/commands/prompt/index.d.ts.map +1 -0
  109. package/dist/commands/prompt/index.js +126 -0
  110. package/dist/commands/prompt/types.d.ts +15 -0
  111. package/dist/commands/prompt/types.d.ts.map +1 -0
  112. package/dist/commands/prompt/types.js +1 -0
  113. package/dist/commands/prompt/utils.d.ts +12 -0
  114. package/dist/commands/prompt/utils.d.ts.map +1 -0
  115. package/dist/commands/prompt/utils.js +107 -0
  116. package/dist/commands/remove-directory/index.d.ts +3 -0
  117. package/dist/commands/remove-directory/index.d.ts.map +1 -0
  118. package/dist/commands/{remove-directory-command.js → remove-directory/index.js} +2 -2
  119. package/dist/commands/reset/index.d.ts +3 -0
  120. package/dist/commands/reset/index.d.ts.map +1 -0
  121. package/dist/commands/{reset-command.js → reset/index.js} +7 -2
  122. package/dist/commands/reset/types.d.ts +1 -0
  123. package/dist/commands/reset/types.d.ts.map +1 -0
  124. package/dist/commands/reset/types.js +3 -0
  125. package/dist/commands/resources/index.d.ts +3 -0
  126. package/dist/commands/resources/index.d.ts.map +1 -0
  127. package/dist/commands/resources/index.js +84 -0
  128. package/dist/commands/review/index.d.ts +3 -0
  129. package/dist/commands/review/index.d.ts.map +1 -0
  130. package/dist/commands/review/index.js +126 -0
  131. package/dist/commands/review/types.d.ts +12 -0
  132. package/dist/commands/review/types.d.ts.map +1 -0
  133. package/dist/commands/review/types.js +1 -0
  134. package/dist/commands/review/utils.d.ts +4 -0
  135. package/dist/commands/review/utils.d.ts.map +1 -0
  136. package/dist/commands/review/utils.js +87 -0
  137. package/dist/commands/save/index.d.ts +3 -0
  138. package/dist/commands/save/index.d.ts.map +1 -0
  139. package/dist/commands/{save-command.js → save/index.js} +3 -3
  140. package/dist/commands/session/index.d.ts +3 -0
  141. package/dist/commands/session/index.d.ts.map +1 -0
  142. package/dist/commands/session/index.js +197 -0
  143. package/dist/commands/session/types.d.ts +13 -0
  144. package/dist/commands/session/types.d.ts.map +1 -0
  145. package/dist/commands/session/types.js +7 -0
  146. package/dist/commands/shell/index.d.ts +3 -0
  147. package/dist/commands/shell/index.d.ts.map +1 -0
  148. package/dist/commands/{shell-command.js → shell/index.js} +3 -3
  149. package/dist/commands/types.d.ts +2 -2
  150. package/dist/commands/types.d.ts.map +1 -1
  151. package/dist/config.d.ts +25 -7
  152. package/dist/config.d.ts.map +1 -1
  153. package/dist/config.js +45 -20
  154. package/dist/dedent.d.ts.map +1 -1
  155. package/dist/dedent.js +7 -7
  156. package/dist/execution/index.d.ts +1 -0
  157. package/dist/execution/index.d.ts.map +1 -1
  158. package/dist/execution/index.js +60 -64
  159. package/dist/formatting.d.ts +27 -0
  160. package/dist/formatting.d.ts.map +1 -1
  161. package/dist/formatting.js +40 -0
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +138 -75
  164. package/dist/logger.d.ts.map +1 -1
  165. package/dist/logger.js +4 -11
  166. package/dist/mentions.d.ts.map +1 -1
  167. package/dist/mentions.js +3 -53
  168. package/dist/middleware/audit-message.d.ts +2 -2
  169. package/dist/middleware/audit-message.d.ts.map +1 -1
  170. package/dist/middleware/audit-message.js +40 -2
  171. package/dist/middleware/cache.d.ts +2 -2
  172. package/dist/middleware/cache.d.ts.map +1 -1
  173. package/dist/middleware/cache.js +111 -27
  174. package/dist/middleware/rate-limit.d.ts +2 -2
  175. package/dist/middleware/rate-limit.d.ts.map +1 -1
  176. package/dist/middleware/rate-limit.js +1 -0
  177. package/dist/models/ai-config.d.ts.map +1 -1
  178. package/dist/models/ai-config.js +46 -29
  179. package/dist/models/anthropic-provider.d.ts +14 -13
  180. package/dist/models/anthropic-provider.d.ts.map +1 -1
  181. package/dist/models/deepseek-provider.d.ts +9 -8
  182. package/dist/models/deepseek-provider.d.ts.map +1 -1
  183. package/dist/models/google-provider.d.ts +10 -9
  184. package/dist/models/google-provider.d.ts.map +1 -1
  185. package/dist/models/groq-provider.d.ts +8 -7
  186. package/dist/models/groq-provider.d.ts.map +1 -1
  187. package/dist/models/manager.d.ts +7 -4
  188. package/dist/models/manager.d.ts.map +1 -1
  189. package/dist/models/manager.js +5 -25
  190. package/dist/models/openai-provider.d.ts +11 -10
  191. package/dist/models/openai-provider.d.ts.map +1 -1
  192. package/dist/models/opencode-zen-provider.d.ts +23 -0
  193. package/dist/models/opencode-zen-provider.d.ts.map +1 -0
  194. package/dist/models/opencode-zen-provider.js +76 -0
  195. package/dist/models/openrouter-provider.d.ts +34 -29
  196. package/dist/models/openrouter-provider.d.ts.map +1 -1
  197. package/dist/models/openrouter-provider.js +95 -80
  198. package/dist/models/providers.d.ts +4 -4
  199. package/dist/models/providers.d.ts.map +1 -1
  200. package/dist/models/providers.js +7 -1
  201. package/dist/models/xai-provider.d.ts +9 -8
  202. package/dist/models/xai-provider.d.ts.map +1 -1
  203. package/dist/prompts/manager.d.ts +1 -1
  204. package/dist/prompts/manager.d.ts.map +1 -1
  205. package/dist/prompts/manager.js +1 -1
  206. package/dist/prompts.d.ts +0 -1
  207. package/dist/prompts.d.ts.map +1 -1
  208. package/dist/prompts.js +56 -406
  209. package/dist/repl/project-status.d.ts +19 -0
  210. package/dist/repl/project-status.d.ts.map +1 -0
  211. package/dist/repl/project-status.js +78 -0
  212. package/dist/repl-new.d.ts +15 -4
  213. package/dist/repl-new.d.ts.map +1 -1
  214. package/dist/repl-new.js +245 -42
  215. package/dist/{messages.d.ts → sessions/manager.d.ts} +10 -4
  216. package/dist/sessions/manager.d.ts.map +1 -0
  217. package/dist/{messages.js → sessions/manager.js} +60 -14
  218. package/dist/skills.d.ts +0 -4
  219. package/dist/skills.d.ts.map +1 -1
  220. package/dist/skills.js +100 -59
  221. package/dist/terminal/control.d.ts +1 -0
  222. package/dist/terminal/control.d.ts.map +1 -1
  223. package/dist/terminal/control.js +2 -0
  224. package/dist/terminal/formatting.d.ts +1 -2
  225. package/dist/terminal/formatting.d.ts.map +1 -1
  226. package/dist/terminal/formatting.js +1 -2
  227. package/dist/terminal/keys.d.ts +211 -0
  228. package/dist/terminal/keys.d.ts.map +1 -0
  229. package/dist/terminal/keys.js +546 -0
  230. package/dist/terminal/segmenter.d.ts +6 -0
  231. package/dist/terminal/segmenter.d.ts.map +1 -0
  232. package/dist/terminal/segmenter.js +11 -0
  233. package/dist/terminal/select-prompt.d.ts.map +1 -1
  234. package/dist/terminal/select-prompt.js +9 -21
  235. package/dist/terminal/string-width.d.ts.map +1 -1
  236. package/dist/terminal/string-width.js +40 -21
  237. package/dist/terminal/strip-ansi.d.ts.map +1 -1
  238. package/dist/terminal/strip-ansi.js +9 -15
  239. package/dist/tokens/tracker.d.ts.map +1 -1
  240. package/dist/tokens/tracker.js +58 -16
  241. package/dist/tools/bash.d.ts +9 -11
  242. package/dist/tools/bash.d.ts.map +1 -1
  243. package/dist/tools/bash.js +69 -123
  244. package/dist/tools/directory-tree.d.ts +9 -7
  245. package/dist/tools/directory-tree.d.ts.map +1 -1
  246. package/dist/tools/directory-tree.js +89 -70
  247. package/dist/tools/dynamic-tool-loader.d.ts +22 -4
  248. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  249. package/dist/tools/dynamic-tool-loader.js +39 -44
  250. package/dist/tools/edit-file.d.ts +6 -16
  251. package/dist/tools/edit-file.d.ts.map +1 -1
  252. package/dist/tools/edit-file.js +19 -76
  253. package/dist/tools/glob.d.ts +15 -16
  254. package/dist/tools/glob.d.ts.map +1 -1
  255. package/dist/tools/glob.js +77 -119
  256. package/dist/tools/grep.d.ts +19 -22
  257. package/dist/tools/grep.d.ts.map +1 -1
  258. package/dist/tools/grep.js +61 -108
  259. package/dist/tools/index.d.ts +200 -179
  260. package/dist/tools/index.d.ts.map +1 -1
  261. package/dist/tools/index.js +17 -315
  262. package/dist/tools/ls.d.ts +26 -0
  263. package/dist/tools/ls.d.ts.map +1 -0
  264. package/dist/tools/ls.js +80 -0
  265. package/dist/tools/read-file.d.ts +15 -15
  266. package/dist/tools/read-file.d.ts.map +1 -1
  267. package/dist/tools/read-file.js +49 -82
  268. package/dist/tools/save-file.d.ts +4 -4
  269. package/dist/tools/save-file.d.ts.map +1 -1
  270. package/dist/tools/save-file.js +37 -66
  271. package/dist/tools/think.d.ts +4 -4
  272. package/dist/tools/think.d.ts.map +1 -1
  273. package/dist/tools/think.js +9 -38
  274. package/dist/tools/types.d.ts +5 -25
  275. package/dist/tools/types.d.ts.map +1 -1
  276. package/dist/tools/types.js +0 -9
  277. package/dist/tui/autocomplete/attachment-provider.d.ts +18 -0
  278. package/dist/tui/autocomplete/attachment-provider.d.ts.map +1 -0
  279. package/dist/tui/autocomplete/attachment-provider.js +159 -0
  280. package/dist/tui/autocomplete/base-provider.d.ts +17 -0
  281. package/dist/tui/autocomplete/base-provider.d.ts.map +1 -0
  282. package/dist/tui/autocomplete/base-provider.js +1 -0
  283. package/dist/tui/autocomplete/combined-provider.d.ts +20 -0
  284. package/dist/tui/autocomplete/combined-provider.d.ts.map +1 -0
  285. package/dist/tui/autocomplete/combined-provider.js +61 -0
  286. package/dist/tui/autocomplete/command-provider.d.ts +20 -0
  287. package/dist/tui/autocomplete/command-provider.d.ts.map +1 -0
  288. package/dist/tui/autocomplete/command-provider.js +90 -0
  289. package/dist/tui/autocomplete/file-search-provider.d.ts +16 -0
  290. package/dist/tui/autocomplete/file-search-provider.d.ts.map +1 -0
  291. package/dist/tui/autocomplete/file-search-provider.js +123 -0
  292. package/dist/tui/autocomplete/path-provider.d.ts +21 -0
  293. package/dist/tui/autocomplete/path-provider.d.ts.map +1 -0
  294. package/dist/tui/autocomplete/path-provider.js +164 -0
  295. package/dist/tui/autocomplete/utils.d.ts +16 -0
  296. package/dist/tui/autocomplete/utils.d.ts.map +1 -0
  297. package/dist/tui/autocomplete/utils.js +137 -0
  298. package/dist/tui/autocomplete.d.ts +12 -43
  299. package/dist/tui/autocomplete.d.ts.map +1 -1
  300. package/dist/tui/autocomplete.js +20 -465
  301. package/dist/tui/components/box.d.ts.map +1 -1
  302. package/dist/tui/components/box.js +16 -10
  303. package/dist/tui/components/editor.d.ts +1 -2
  304. package/dist/tui/components/editor.d.ts.map +1 -1
  305. package/dist/tui/components/editor.js +148 -107
  306. package/dist/tui/components/footer.d.ts +20 -7
  307. package/dist/tui/components/footer.d.ts.map +1 -1
  308. package/dist/tui/components/footer.js +89 -196
  309. package/dist/tui/components/input.d.ts.map +1 -1
  310. package/dist/tui/components/input.js +8 -7
  311. package/dist/tui/components/loader.d.ts +2 -1
  312. package/dist/tui/components/loader.d.ts.map +1 -1
  313. package/dist/tui/components/loader.js +7 -2
  314. package/dist/tui/components/markdown.d.ts +5 -4
  315. package/dist/tui/components/markdown.d.ts.map +1 -1
  316. package/dist/tui/components/markdown.js +51 -40
  317. package/dist/tui/components/modal.d.ts.map +1 -1
  318. package/dist/tui/components/modal.js +9 -8
  319. package/dist/tui/components/notification.d.ts +28 -0
  320. package/dist/tui/components/notification.d.ts.map +1 -0
  321. package/dist/tui/components/notification.js +63 -0
  322. package/dist/tui/components/progress-bar.d.ts.map +1 -1
  323. package/dist/tui/components/progress-bar.js +3 -15
  324. package/dist/tui/components/select-list.d.ts +0 -15
  325. package/dist/tui/components/select-list.d.ts.map +1 -1
  326. package/dist/tui/components/select-list.js +5 -28
  327. package/dist/tui/components/tool-execution.d.ts +3 -6
  328. package/dist/tui/components/tool-execution.d.ts.map +1 -1
  329. package/dist/tui/components/tool-execution.js +26 -38
  330. package/dist/tui/components/welcome.d.ts +8 -1
  331. package/dist/tui/components/welcome.d.ts.map +1 -1
  332. package/dist/tui/components/welcome.js +45 -6
  333. package/dist/tui/index.d.ts +4 -2
  334. package/dist/tui/index.d.ts.map +1 -1
  335. package/dist/tui/index.js +2 -2
  336. package/dist/tui/terminal.d.ts +2 -2
  337. package/dist/tui/terminal.d.ts.map +1 -1
  338. package/dist/tui/terminal.js +23 -19
  339. package/dist/tui/tui.d.ts +1 -0
  340. package/dist/tui/tui.d.ts.map +1 -1
  341. package/dist/tui/tui.js +24 -29
  342. package/dist/tui/utils.d.ts.map +1 -1
  343. package/dist/tui/utils.js +2 -3
  344. package/dist/utils/yaml.d.ts +11 -0
  345. package/dist/utils/yaml.d.ts.map +1 -0
  346. package/dist/utils/yaml.js +207 -0
  347. package/dist/utils/zod.d.ts +1 -0
  348. package/dist/utils/zod.d.ts.map +1 -1
  349. package/dist/utils/zod.js +17 -0
  350. package/package.json +31 -29
  351. package/bin/acai-wrapper.js +0 -26
  352. package/dist/api/exa/index.d.ts +0 -177
  353. package/dist/api/exa/index.d.ts.map +0 -1
  354. package/dist/api/exa/index.js +0 -439
  355. package/dist/commands/add-directory-command.d.ts +0 -3
  356. package/dist/commands/add-directory-command.d.ts.map +0 -1
  357. package/dist/commands/application-log-command.d.ts +0 -3
  358. package/dist/commands/application-log-command.d.ts.map +0 -1
  359. package/dist/commands/application-log-command.js +0 -43
  360. package/dist/commands/clear-command.d.ts +0 -3
  361. package/dist/commands/clear-command.d.ts.map +0 -1
  362. package/dist/commands/compact-command.d.ts +0 -3
  363. package/dist/commands/compact-command.d.ts.map +0 -1
  364. package/dist/commands/compact-command.js +0 -55
  365. package/dist/commands/context-command.d.ts +0 -3
  366. package/dist/commands/context-command.d.ts.map +0 -1
  367. package/dist/commands/context-command.js +0 -124
  368. package/dist/commands/copy-command.d.ts +0 -3
  369. package/dist/commands/copy-command.d.ts.map +0 -1
  370. package/dist/commands/edit-command.d.ts +0 -3
  371. package/dist/commands/edit-command.d.ts.map +0 -1
  372. package/dist/commands/edit-command.js +0 -42
  373. package/dist/commands/edit-prompt-command.d.ts +0 -3
  374. package/dist/commands/edit-prompt-command.d.ts.map +0 -1
  375. package/dist/commands/edit-prompt-command.js +0 -36
  376. package/dist/commands/exit-command.d.ts.map +0 -1
  377. package/dist/commands/exit-command.js +0 -30
  378. package/dist/commands/files-command.d.ts +0 -3
  379. package/dist/commands/files-command.d.ts.map +0 -1
  380. package/dist/commands/files-command.js +0 -68
  381. package/dist/commands/generate-rules-command.d.ts +0 -3
  382. package/dist/commands/generate-rules-command.d.ts.map +0 -1
  383. package/dist/commands/handoff-command.d.ts +0 -3
  384. package/dist/commands/handoff-command.d.ts.map +0 -1
  385. package/dist/commands/health-command.d.ts +0 -4
  386. package/dist/commands/health-command.d.ts.map +0 -1
  387. package/dist/commands/health-command.js +0 -118
  388. package/dist/commands/help-command.d.ts.map +0 -1
  389. package/dist/commands/history-command.d.ts +0 -3
  390. package/dist/commands/history-command.d.ts.map +0 -1
  391. package/dist/commands/init-command.d.ts +0 -3
  392. package/dist/commands/init-command.d.ts.map +0 -1
  393. package/dist/commands/last-log-command.d.ts +0 -3
  394. package/dist/commands/last-log-command.d.ts.map +0 -1
  395. package/dist/commands/last-log-command.js +0 -71
  396. package/dist/commands/list-directories-command.d.ts +0 -3
  397. package/dist/commands/list-directories-command.d.ts.map +0 -1
  398. package/dist/commands/list-tools-command.d.ts +0 -3
  399. package/dist/commands/list-tools-command.d.ts.map +0 -1
  400. package/dist/commands/model-command.d.ts +0 -3
  401. package/dist/commands/model-command.d.ts.map +0 -1
  402. package/dist/commands/paste-command.d.ts.map +0 -1
  403. package/dist/commands/pickup-command.d.ts +0 -3
  404. package/dist/commands/pickup-command.d.ts.map +0 -1
  405. package/dist/commands/pickup-command.js +0 -109
  406. package/dist/commands/prompt-command.d.ts +0 -21
  407. package/dist/commands/prompt-command.d.ts.map +0 -1
  408. package/dist/commands/prompt-command.js +0 -258
  409. package/dist/commands/remove-directory-command.d.ts +0 -3
  410. package/dist/commands/remove-directory-command.d.ts.map +0 -1
  411. package/dist/commands/reset-command.d.ts +0 -3
  412. package/dist/commands/reset-command.d.ts.map +0 -1
  413. package/dist/commands/rules-command.d.ts +0 -3
  414. package/dist/commands/rules-command.d.ts.map +0 -1
  415. package/dist/commands/rules-command.js +0 -73
  416. package/dist/commands/save-command.d.ts +0 -3
  417. package/dist/commands/save-command.d.ts.map +0 -1
  418. package/dist/commands/shell-command.d.ts +0 -3
  419. package/dist/commands/shell-command.d.ts.map +0 -1
  420. package/dist/commands/usage-command.d.ts +0 -3
  421. package/dist/commands/usage-command.d.ts.map +0 -1
  422. package/dist/commands/usage-command.js +0 -31
  423. package/dist/messages.d.ts.map +0 -1
  424. package/dist/repl/project-status-line.d.ts +0 -3
  425. package/dist/repl/project-status-line.d.ts.map +0 -1
  426. package/dist/repl/project-status-line.js +0 -61
  427. package/dist/repl/tool-call-repair.d.ts +0 -4
  428. package/dist/repl/tool-call-repair.d.ts.map +0 -1
  429. package/dist/repl/tool-call-repair.js +0 -54
  430. package/dist/terminal/markdown.d.ts +0 -2
  431. package/dist/terminal/markdown.d.ts.map +0 -1
  432. package/dist/terminal/markdown.js +0 -120
  433. package/dist/tokens/threshold.d.ts +0 -20
  434. package/dist/tokens/threshold.d.ts.map +0 -1
  435. package/dist/tokens/threshold.js +0 -67
  436. package/dist/tools/advanced-edit-file.d.ts +0 -69
  437. package/dist/tools/advanced-edit-file.d.ts.map +0 -1
  438. package/dist/tools/advanced-edit-file.js +0 -285
  439. package/dist/tools/agent.d.ts +0 -29
  440. package/dist/tools/agent.d.ts.map +0 -1
  441. package/dist/tools/agent.js +0 -117
  442. package/dist/tools/batch.d.ts +0 -34
  443. package/dist/tools/batch.d.ts.map +0 -1
  444. package/dist/tools/batch.js +0 -174
  445. package/dist/tools/code-interpreter.d.ts +0 -25
  446. package/dist/tools/code-interpreter.d.ts.map +0 -1
  447. package/dist/tools/code-interpreter.js +0 -183
  448. package/dist/tools/delete-file.d.ts +0 -24
  449. package/dist/tools/delete-file.d.ts.map +0 -1
  450. package/dist/tools/delete-file.js +0 -77
  451. package/dist/tools/dynamic-tool-parser.d.ts +0 -21
  452. package/dist/tools/dynamic-tool-parser.d.ts.map +0 -1
  453. package/dist/tools/dynamic-tool-parser.js +0 -22
  454. package/dist/tools/llm-edit-fixer.d.ts +0 -24
  455. package/dist/tools/llm-edit-fixer.d.ts.map +0 -1
  456. package/dist/tools/llm-edit-fixer.js +0 -136
  457. package/dist/tools/move-file.d.ts +0 -26
  458. package/dist/tools/move-file.d.ts.map +0 -1
  459. package/dist/tools/move-file.js +0 -65
  460. package/dist/tools/read-multiple-files.d.ts +0 -26
  461. package/dist/tools/read-multiple-files.d.ts.map +0 -1
  462. package/dist/tools/read-multiple-files.js +0 -196
  463. package/dist/tools/web-fetch.d.ts +0 -56
  464. package/dist/tools/web-fetch.d.ts.map +0 -1
  465. package/dist/tools/web-fetch.js +0 -247
  466. package/dist/tools/web-search.d.ts +0 -23
  467. package/dist/tools/web-search.d.ts.map +0 -1
  468. package/dist/tools/web-search.js +0 -148
  469. package/dist/tui/components/prompt-status.d.ts +0 -17
  470. package/dist/tui/components/prompt-status.d.ts.map +0 -1
  471. package/dist/tui/components/prompt-status.js +0 -26
@@ -1,48 +1,43 @@
1
- import { addDirectoryCommand } from "./add-directory-command.js";
2
- // import { applicationLogCommand } from "./application-log-command.ts";
3
- import { clearCommand } from "./clear-command.js";
4
- // import { compactCommand } from "./compact-command.ts";
5
- import { contextCommand } from "./context-command.js";
6
- import { copyCommand } from "./copy-command.js";
7
- // import { editCommand } from "./edit-command.ts";
8
- // import { editPromptCommand } from "./edit-prompt-command.ts";
9
- import { exitCommand } from "./exit-command.js";
10
- // import { filesCommand } from "./files-command.ts";
11
- import { generateRulesCommand } from "./generate-rules-command.js";
12
- import { handoffCommand } from "./handoff-command.js";
13
- import { healthCommand } from "./health-command.js";
14
- import { helpCommand } from "./help-command.js";
15
- import { historyCommand } from "./history-command.js";
16
- import { initCommand } from "./init-command.js";
17
- // import { lastLogCommand } from "./last-log-command.ts";
18
- import { listDirectoriesCommand } from "./list-directories-command.js";
19
- import { listToolsCommand } from "./list-tools-command.js";
20
- import { modelCommand } from "./model-command.js";
21
- import { pasteCommand } from "./paste-command.js";
22
- import { pickupCommand } from "./pickup-command.js";
23
- import { loadPrompts, promptCommand } from "./prompt-command.js";
24
- import { removeDirectoryCommand } from "./remove-directory-command.js";
25
- import { resetCommand } from "./reset-command.js";
26
- // import { rulesCommand } from "./rules-command.ts";
27
- import { saveCommand } from "./save-command.js";
28
- import { shellCommand } from "./shell-command.js";
29
- import { usageCommand } from "./usage-command.js";
1
+ import { addDirectoryCommand } from "./add-directory/index.js";
2
+ import { clearCommand } from "./clear/index.js";
3
+ import { copyCommand } from "./copy/index.js";
4
+ import { exitCommand } from "./exit/index.js";
5
+ import { generateRulesCommand } from "./generate-rules/index.js";
6
+ import { handoffCommand } from "./handoff/index.js";
7
+ import { healthCommand } from "./health/index.js";
8
+ import { helpCommand } from "./help/index.js";
9
+ import { historyCommand } from "./history/index.js";
10
+ import { initCommand } from "./init/index.js";
11
+ import { initProjectCommand } from "./init-project/index.js";
12
+ import { listDirectoriesCommand } from "./list-directories/index.js";
13
+ import { listToolsCommand } from "./list-tools/index.js";
14
+ import { modelCommand } from "./model/index.js";
15
+ import { pasteCommand } from "./paste/index.js";
16
+ import { pickupCommand } from "./pickup/index.js";
17
+ import { loadPrompts, promptCommand } from "./prompt/index.js";
18
+ import { removeDirectoryCommand } from "./remove-directory/index.js";
19
+ import { resetCommand } from "./reset/index.js";
20
+ import { resourcesCommand } from "./resources/index.js";
21
+ import { reviewCommand } from "./review/index.js";
22
+ import { saveCommand } from "./save/index.js";
23
+ import { sessionCommand } from "./session/index.js";
24
+ import { shellCommand } from "./shell/index.js";
30
25
  export class CommandManager {
31
26
  commands;
32
27
  promptManager;
33
28
  modelManager;
34
- messageHistory;
29
+ sessionManager;
35
30
  tokenTracker;
36
31
  config;
37
32
  tokenCounter;
38
33
  promptHistory;
39
34
  workspace;
40
35
  initialized;
41
- constructor({ promptManager, modelManager, messageHistory, tokenTracker, config, tokenCounter, promptHistory, workspace, }) {
36
+ constructor({ promptManager, modelManager, sessionManager: messageHistory, tokenTracker, config, tokenCounter, promptHistory, workspace, }) {
42
37
  this.commands = new Map();
43
38
  this.promptManager = promptManager;
44
39
  this.modelManager = modelManager;
45
- this.messageHistory = messageHistory;
40
+ this.sessionManager = messageHistory;
46
41
  this.tokenTracker = tokenTracker;
47
42
  this.config = config;
48
43
  this.tokenCounter = tokenCounter;
@@ -58,7 +53,7 @@ export class CommandManager {
58
53
  const options = {
59
54
  promptManager: this.promptManager,
60
55
  modelManager: this.modelManager,
61
- messageHistory: this.messageHistory,
56
+ sessionManager: this.sessionManager,
62
57
  tokenTracker: this.tokenTracker,
63
58
  config: this.config,
64
59
  tokenCounter: this.tokenCounter,
@@ -69,31 +64,26 @@ export class CommandManager {
69
64
  const cmds = [
70
65
  addDirectoryCommand(options),
71
66
  clearCommand(options),
72
- // compactCommand(options),
73
- contextCommand(options),
74
- // editCommand(options),
75
- // editPromptCommand(options),
76
67
  exitCommand(options),
77
- // filesCommand(options),
78
68
  healthCommand(options),
79
69
  historyCommand(options),
80
70
  initCommand(options),
71
+ initProjectCommand(options),
81
72
  listDirectoriesCommand(options),
82
73
  pasteCommand(options),
83
74
  pickupCommand(options),
84
75
  promptCommand(options),
85
76
  removeDirectoryCommand(options),
86
77
  resetCommand(options),
78
+ reviewCommand(options),
87
79
  saveCommand(options),
88
- // rulesCommand(options),
89
80
  modelCommand(options),
90
- usageCommand(options),
91
- // lastLogCommand(options),
81
+ sessionCommand(options),
92
82
  generateRulesCommand(options),
93
83
  handoffCommand(options),
94
- // applicationLogCommand(options),
95
84
  copyCommand(options),
96
85
  listToolsCommand(options),
86
+ resourcesCommand(options),
97
87
  shellCommand(options),
98
88
  ];
99
89
  // Add help command with access to all commands
@@ -161,7 +151,7 @@ export class CommandManager {
161
151
  const commandArgs = userInput.split(" ");
162
152
  const command = commandArgs.at(0);
163
153
  const args = commandArgs.slice(1);
164
- if (command) {
154
+ if (command !== undefined) {
165
155
  const replCommand = this.commands.get(command);
166
156
  if (replCommand) {
167
157
  const result = await replCommand.handle(args, options);
@@ -0,0 +1,3 @@
1
+ import type { CommandOptions, ReplCommand } from "../types.ts";
2
+ export declare function modelCommand(options: CommandOptions): ReplCommand;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,7 +1,8 @@
1
- import { isValidModel, modelRegistry, models, } from "../models/providers.js";
2
- import { getTerminalSize } from "../terminal/formatting.js";
3
- import style from "../terminal/style.js";
4
- import { Container, Input, Spacer, Text, } from "../tui/index.js";
1
+ import { isValidModel, modelRegistry, models, } from "../../models/providers.js";
2
+ import { getTerminalSize, isArrowDown, isArrowUp, isEnter, isEscape, } from "../../terminal/control.js";
3
+ import style from "../../terminal/style.js";
4
+ import { Container, Input, Spacer, Text, } from "../../tui/index.js";
5
+ import { hideModelSelector } from "./utils.js";
5
6
  export function modelCommand(options) {
6
7
  const { modelManager } = options;
7
8
  return {
@@ -11,40 +12,31 @@ export function modelCommand(options) {
11
12
  async handle(args, { tui, container, inputContainer, editor, }) {
12
13
  const arg = args.join(" ").trim();
13
14
  const modelConfig = modelManager.getModelMetadata("repl");
14
- // No args - display model selector
15
15
  if (!arg) {
16
- // Create model selector with current model
17
16
  const modelSelector = new ModelSelectorComponent(modelConfig.id, (model) => {
18
- // Apply the selected model
19
17
  modelManager.setModel("repl", model);
20
- // Hide selector and show editor again
21
18
  hideModelSelector(inputContainer, editor, tui);
22
19
  tui.requestRender();
23
20
  }, () => {
24
- // Just hide the selector
25
21
  hideModelSelector(inputContainer, editor, tui);
26
22
  tui.requestRender();
27
23
  });
28
- // Replace editor with selector
29
24
  inputContainer.clear();
30
25
  inputContainer.addChild(modelSelector);
31
26
  tui.setFocus(modelSelector);
32
27
  tui.requestRender();
33
28
  return "continue";
34
29
  }
35
- // Switch to a specific model
36
30
  if (isValidModel(arg)) {
37
31
  try {
38
- // Get current and new model configs
39
32
  const currentModelConfig = modelManager.getModelMetadata("repl");
40
33
  const newModelConfig = modelRegistry[arg];
41
- if (!newModelConfig) {
34
+ if (newModelConfig === undefined) {
42
35
  container.addChild(new Text(style.red(`Model configuration not found for: ${arg}`), 1, 0));
43
36
  tui.requestRender();
44
37
  editor.setText("");
45
38
  return "continue";
46
39
  }
47
- // Check for capability differences
48
40
  if (currentModelConfig.supportsToolCalling &&
49
41
  !newModelConfig.supportsToolCalling) {
50
42
  container.addChild(new Text(style.yellow("The new model doesn't support tool calling, which may limit functionality."), 1, 0));
@@ -53,11 +45,7 @@ export function modelCommand(options) {
53
45
  !newModelConfig.supportsReasoning) {
54
46
  container.addChild(new Text(style.yellow("The new model doesn't support reasoning, which may change response quality."), 2, 0));
55
47
  }
56
- // Update model in ModelManager
57
48
  modelManager.setModel("repl", arg);
58
- // container.addChild(
59
- // new Text(style.green(`Model set to ${arg}.`), 3, 0),
60
- // );
61
49
  tui.requestRender();
62
50
  editor.setText("");
63
51
  return "continue";
@@ -75,15 +63,6 @@ export function modelCommand(options) {
75
63
  },
76
64
  };
77
65
  }
78
- function hideModelSelector(editorContainer, editor, tui) {
79
- // Replace selector with editor in the container
80
- editorContainer.clear();
81
- editorContainer.addChild(editor);
82
- tui.setFocus(editor);
83
- }
84
- /**
85
- * Component that renders a model selector with search
86
- */
87
66
  class ModelSelectorComponent extends Container {
88
67
  searchInput;
89
68
  listContainer;
@@ -98,29 +77,23 @@ class ModelSelectorComponent extends Container {
98
77
  this.currentModel = currentModel;
99
78
  this.onSelectCallback = onSelect;
100
79
  this.onCancelCallback = onCancel;
101
- // Load all models
102
80
  this.loadModels();
103
81
  const { columns } = getTerminalSize();
104
- // Add top border
105
82
  this.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
106
83
  this.addChild(new Spacer(1));
107
- // Create search input
108
84
  this.searchInput = new Input();
109
85
  this.searchInput.onSubmit = () => {
110
- // Enter on search input selects the first filtered item
111
- if (this.filteredModels[this.selectedIndex]) {
112
- this.handleSelect(this.filteredModels[this.selectedIndex]);
86
+ const model = this.filteredModels[this.selectedIndex];
87
+ if (model !== undefined) {
88
+ this.handleSelect(model);
113
89
  }
114
90
  };
115
91
  this.addChild(this.searchInput);
116
92
  this.addChild(new Spacer(1));
117
- // Create list container
118
93
  this.listContainer = new Container();
119
94
  this.addChild(this.listContainer);
120
95
  this.addChild(new Spacer(1));
121
- // Add bottom border
122
96
  this.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
123
- // Initial render
124
97
  this.updateList();
125
98
  }
126
99
  loadModels() {
@@ -149,10 +122,9 @@ class ModelSelectorComponent extends Container {
149
122
  const maxVisible = 10;
150
123
  const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(maxVisible / 2), this.filteredModels.length - maxVisible));
151
124
  const endIndex = Math.min(startIndex + maxVisible, this.filteredModels.length);
152
- // Show visible slice of filtered models
153
125
  for (let i = startIndex; i < endIndex; i++) {
154
126
  const item = this.filteredModels[i];
155
- if (!item)
127
+ if (item === undefined)
156
128
  continue;
157
129
  const isSelected = i === this.selectedIndex;
158
130
  const isCurrent = this.currentModel === item;
@@ -160,51 +132,42 @@ class ModelSelectorComponent extends Container {
160
132
  if (isSelected) {
161
133
  const prefix = style.blue("→ ");
162
134
  const modelText = `${item}`;
163
- // const providerBadge = style.gray(`[${item.provider}]`);
164
135
  const checkmark = isCurrent ? style.green(" ✓") : "";
165
136
  line = `${prefix + style.blue(modelText)} ${checkmark}`;
166
137
  }
167
138
  else {
168
139
  const modelText = ` ${item}`;
169
- // const providerBadge = style.gray(`[${item.provider}]`);
170
140
  const checkmark = isCurrent ? style.green(" ✓") : "";
171
141
  line = `${modelText} ${checkmark}`;
172
142
  }
173
143
  this.listContainer.addChild(new Text(line, 0, 0));
174
144
  }
175
- // Add scroll indicator if needed
176
145
  if (startIndex > 0 || endIndex < this.filteredModels.length) {
177
146
  const scrollInfo = style.gray(` (${this.selectedIndex + 1}/${this.filteredModels.length})`);
178
147
  this.listContainer.addChild(new Text(scrollInfo, 0, 0));
179
148
  }
180
- // Show "no results" if empty
181
149
  if (this.filteredModels.length === 0) {
182
150
  this.listContainer.addChild(new Text(style.gray(" No matching models"), 0, 0));
183
151
  }
184
152
  }
185
153
  handleInput(keyData) {
186
- // Up arrow
187
- if (keyData === "\x1b[A") {
154
+ if (isArrowUp(keyData)) {
188
155
  this.selectedIndex = Math.max(0, this.selectedIndex - 1);
189
156
  this.updateList();
190
157
  }
191
- // Down arrow
192
- else if (keyData === "\x1b[B") {
158
+ else if (isArrowDown(keyData)) {
193
159
  this.selectedIndex = Math.min(this.filteredModels.length - 1, this.selectedIndex + 1);
194
160
  this.updateList();
195
161
  }
196
- // Enter
197
- else if (keyData === "\r") {
162
+ else if (isEnter(keyData)) {
198
163
  const selectedModel = this.filteredModels[this.selectedIndex];
199
- if (selectedModel) {
164
+ if (selectedModel !== undefined) {
200
165
  this.handleSelect(selectedModel);
201
166
  }
202
167
  }
203
- // Escape
204
- else if (keyData === "\x1b") {
168
+ else if (isEscape(keyData)) {
205
169
  this.onCancelCallback();
206
170
  }
207
- // Pass everything else to search input
208
171
  else {
209
172
  this.searchInput.handleInput(keyData);
210
173
  this.filterModels(this.searchInput.getValue());
@@ -0,0 +1,3 @@
1
+ import type { Container, Editor, TUI } from "../../tui/index.ts";
2
+ export declare function hideModelSelector(editorContainer: Container, editor: Editor, tui: TUI): void;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/commands/model/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEjE,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,SAAS,EAC1B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,GACP,IAAI,CAIN"}
@@ -0,0 +1,5 @@
1
+ export function hideModelSelector(editorContainer, editor, tui) {
2
+ editorContainer.clear();
3
+ editorContainer.addChild(editor);
4
+ tui.setFocus(editor);
5
+ }
@@ -1,3 +1,3 @@
1
- import type { CommandOptions, ReplCommand } from "./types.ts";
1
+ import type { CommandOptions, ReplCommand } from "../types.ts";
2
2
  export declare const pasteCommand: ({ modelManager, promptManager, tokenCounter, }: CommandOptions) => ReplCommand;
3
- //# sourceMappingURL=paste-command.d.ts.map
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,105 +1,9 @@
1
1
  import Clipboard from "@crosscopy/clipboard";
2
- import { formatBlock } from "../formatting.js";
3
- import { logger } from "../logger.js";
4
- import style from "../terminal/style.js";
5
- import { Text } from "../tui/index.js";
6
- function extractBase64Content(dataUrl) {
7
- return dataUrl.replace(/^data:.*?;base64,/, "");
8
- }
9
- function isValidBase64(str) {
10
- try {
11
- // Remove data URL prefix if present
12
- const base64Content = extractBase64Content(str);
13
- // Try to decode the base64 string
14
- const decoded = Buffer.from(base64Content, "base64");
15
- // Re-encode to verify it's valid base64
16
- const reEncoded = decoded.toString("base64");
17
- // Remove padding for comparison
18
- const normalizedOriginal = base64Content.replace(/=/g, "");
19
- const normalizedReEncoded = reEncoded.replace(/=/g, "");
20
- return normalizedOriginal === normalizedReEncoded;
21
- }
22
- catch {
23
- return false;
24
- }
25
- }
26
- function detectImageFormatFromBase64(base64Content) {
27
- try {
28
- const buffer = Buffer.from(base64Content, "base64");
29
- // Check for JPEG signature (FF D8 FF)
30
- if (buffer.length >= 3 &&
31
- buffer[0] === 0xff &&
32
- buffer[1] === 0xd8 &&
33
- buffer[2] === 0xff) {
34
- return "image/jpeg";
35
- }
36
- // Check for PNG signature (89 50 4E 47 0D 0A 1A 0A)
37
- if (buffer.length >= 8 &&
38
- buffer[0] === 0x89 &&
39
- buffer[1] === 0x50 &&
40
- buffer[2] === 0x4e &&
41
- buffer[3] === 0x47 &&
42
- buffer[4] === 0x0d &&
43
- buffer[5] === 0x0a &&
44
- buffer[6] === 0x1a &&
45
- buffer[7] === 0x0a) {
46
- return "image/png";
47
- }
48
- // Check for GIF signature (GIF87a or GIF89a)
49
- if (buffer.length >= 6 &&
50
- ((buffer[0] === 0x47 &&
51
- buffer[1] === 0x49 &&
52
- buffer[2] === 0x46 &&
53
- buffer[3] === 0x38 &&
54
- buffer[4] === 0x37 &&
55
- buffer[5] === 0x61) ||
56
- (buffer[0] === 0x47 &&
57
- buffer[1] === 0x49 &&
58
- buffer[2] === 0x46 &&
59
- buffer[3] === 0x38 &&
60
- buffer[4] === 0x39 &&
61
- buffer[5] === 0x61))) {
62
- return "image/gif";
63
- }
64
- // Check for WebP signature (RIFF .... WEBP)
65
- if (buffer.length >= 12 &&
66
- buffer[0] === 0x52 &&
67
- buffer[1] === 0x49 &&
68
- buffer[2] === 0x46 &&
69
- buffer[3] === 0x46 &&
70
- buffer[8] === 0x57 &&
71
- buffer[9] === 0x45 &&
72
- buffer[10] === 0x42 &&
73
- buffer[11] === 0x50) {
74
- return "image/webp";
75
- }
76
- // Check for BMP signature (BM)
77
- if (buffer.length >= 2 && buffer[0] === 0x42 && buffer[1] === 0x4d) {
78
- return "image/bmp";
79
- }
80
- // Check for TIFF signatures (II* or MM*)
81
- if (buffer.length >= 4 &&
82
- ((buffer[0] === 0x49 &&
83
- buffer[1] === 0x49 &&
84
- buffer[2] === 0x2a &&
85
- buffer[3] === 0x00) ||
86
- (buffer[0] === 0x4d &&
87
- buffer[1] === 0x4d &&
88
- buffer[2] === 0x00 &&
89
- buffer[3] === 0x2a))) {
90
- return "image/tiff";
91
- }
92
- // If no known signature found, fall back to the data URL MIME type
93
- return "unknown";
94
- }
95
- catch {
96
- return "unknown";
97
- }
98
- }
99
- function extractMimeTypeFromDataUrl(dataUrl) {
100
- const match = dataUrl.match(/^data:([^;]+);base64,/);
101
- return match?.[1] ? match[1] : "image/png";
102
- }
2
+ import { formatBlock } from "../../formatting.js";
3
+ import { logger } from "../../logger.js";
4
+ import style from "../../terminal/style.js";
5
+ import { Text } from "../../tui/index.js";
6
+ import { detectImageFormatFromBase64, extractMimeTypeFromDataUrl, isValidBase64, } from "./utils.js";
103
7
  export const pasteCommand = ({ modelManager, promptManager, tokenCounter, }) => {
104
8
  return {
105
9
  command: "/paste",
@@ -109,25 +13,19 @@ export const pasteCommand = ({ modelManager, promptManager, tokenCounter, }) =>
109
13
  try {
110
14
  if (Clipboard.hasImage()) {
111
15
  const base64DataUrl = await Clipboard.getImageBase64();
112
- // Validate the base64 data
113
16
  if (!isValidBase64(base64DataUrl)) {
114
17
  container.addChild(new Text(style.red("Invalid base64 data in clipboard. The image data may be corrupted."), 1, 0));
115
18
  tui.requestRender();
116
19
  editor.setText("");
117
20
  return "continue";
118
21
  }
119
- // Extract MIME type with better error handling and actual image format detection
120
22
  let mimeType;
121
23
  try {
122
- // First, try to get MIME type from data URL
123
24
  const dataUrlMimeType = extractMimeTypeFromDataUrl(base64DataUrl);
124
- // Then, detect actual image format from base64 content
125
- const base64Content = extractBase64Content(base64DataUrl);
25
+ const base64Content = base64DataUrl.replace(/^data:.*?;base64,/, "");
126
26
  const detectedFormat = detectImageFormatFromBase64(base64Content);
127
- // Use detected format if available, otherwise fall back to data URL MIME type
128
27
  if (detectedFormat !== "unknown") {
129
28
  mimeType = detectedFormat;
130
- // Log if there's a mismatch between data URL and actual format
131
29
  if (dataUrlMimeType !== detectedFormat) {
132
30
  logger.warn(`Clipboard library reported ${dataUrlMimeType} but actual image format is ${detectedFormat}. Using detected format.`);
133
31
  }
@@ -141,12 +39,9 @@ export const pasteCommand = ({ modelManager, promptManager, tokenCounter, }) =>
141
39
  logger.warn(`Failed to extract MIME type from clipboard image: ${error}`);
142
40
  mimeType = "image/png";
143
41
  }
144
- // Ensure the data URL format is correct
145
42
  if (!base64DataUrl.startsWith(`data:${mimeType};base64,`)) {
146
- // Fix malformed data URLs
147
43
  const base64Content = base64DataUrl.replace(/^data:.*?;base64,/, "");
148
44
  const correctedDataUrl = `data:${mimeType};base64,${base64Content}`;
149
- // Final validation
150
45
  if (!isValidBase64(correctedDataUrl)) {
151
46
  container.addChild(new Text(style.red("Failed to correct base64 data format. The image data may be corrupted."), 1, 0));
152
47
  tui.requestRender();
@@ -0,0 +1,5 @@
1
+ export declare function extractBase64Content(dataUrl: string): string;
2
+ export declare function isValidBase64(str: string): boolean;
3
+ export declare function detectImageFormatFromBase64(base64Content: string): string;
4
+ export declare function extractMimeTypeFromDataUrl(dataUrl: string): string;
5
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/commands/paste/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWlD;AAED,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAiFzE;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGlE"}
@@ -0,0 +1,86 @@
1
+ export function extractBase64Content(dataUrl) {
2
+ return dataUrl.replace(/^data:.*?;base64,/, "");
3
+ }
4
+ export function isValidBase64(str) {
5
+ try {
6
+ const base64Content = extractBase64Content(str);
7
+ const decoded = Buffer.from(base64Content, "base64");
8
+ const reEncoded = decoded.toString("base64");
9
+ const normalizedOriginal = base64Content.replace(/=/g, "");
10
+ const normalizedReEncoded = reEncoded.replace(/=/g, "");
11
+ return normalizedOriginal === normalizedReEncoded;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ export function detectImageFormatFromBase64(base64Content) {
18
+ try {
19
+ const buffer = Buffer.from(base64Content, "base64");
20
+ if (buffer.length >= 3 &&
21
+ buffer[0] === 0xff &&
22
+ buffer[1] === 0xd8 &&
23
+ buffer[2] === 0xff) {
24
+ return "image/jpeg";
25
+ }
26
+ if (buffer.length >= 8 &&
27
+ buffer[0] === 0x89 &&
28
+ buffer[1] === 0x50 &&
29
+ buffer[2] === 0x4e &&
30
+ buffer[3] === 0x47 &&
31
+ buffer[4] === 0x0d &&
32
+ buffer[5] === 0x0a &&
33
+ buffer[6] === 0x1a &&
34
+ buffer[7] === 0x0a) {
35
+ return "image/png";
36
+ }
37
+ if (buffer.length >= 6 &&
38
+ ((buffer[0] === 0x47 &&
39
+ buffer[1] === 0x49 &&
40
+ buffer[2] === 0x46 &&
41
+ buffer[3] === 0x38 &&
42
+ buffer[4] === 0x37 &&
43
+ buffer[5] === 0x61) ||
44
+ (buffer[0] === 0x47 &&
45
+ buffer[1] === 0x49 &&
46
+ buffer[2] === 0x46 &&
47
+ buffer[3] === 0x38 &&
48
+ buffer[4] === 0x39 &&
49
+ buffer[5] === 0x61))) {
50
+ return "image/gif";
51
+ }
52
+ if (buffer.length >= 12 &&
53
+ buffer[0] === 0x52 &&
54
+ buffer[1] === 0x49 &&
55
+ buffer[2] === 0x46 &&
56
+ buffer[3] === 0x46 &&
57
+ buffer[8] === 0x57 &&
58
+ buffer[9] === 0x45 &&
59
+ buffer[10] === 0x42 &&
60
+ buffer[11] === 0x50) {
61
+ return "image/webp";
62
+ }
63
+ if (buffer.length >= 2 && buffer[0] === 0x42 && buffer[1] === 0x4d) {
64
+ return "image/bmp";
65
+ }
66
+ if (buffer.length >= 4 &&
67
+ ((buffer[0] === 0x49 &&
68
+ buffer[1] === 0x49 &&
69
+ buffer[2] === 0x2a &&
70
+ buffer[3] === 0x00) ||
71
+ (buffer[0] === 0x4d &&
72
+ buffer[1] === 0x4d &&
73
+ buffer[2] === 0x00 &&
74
+ buffer[3] === 0x2a))) {
75
+ return "image/tiff";
76
+ }
77
+ return "unknown";
78
+ }
79
+ catch {
80
+ return "unknown";
81
+ }
82
+ }
83
+ export function extractMimeTypeFromDataUrl(dataUrl) {
84
+ const match = dataUrl.match(/^data:([^;]+);base64,/);
85
+ return match?.[1] ?? "image/png";
86
+ }
@@ -0,0 +1,3 @@
1
+ import type { CommandOptions, ReplCommand } from "../types.ts";
2
+ export declare const pickupCommand: (options: CommandOptions) => ReplCommand;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/pickup/index.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ/D,eAAO,MAAM,aAAa,GAAI,SAAS,cAAc,KAAG,WA0DvD,CAAC"}