@travisennis/acai 0.0.4 → 0.0.6

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 (433) hide show
  1. package/README.md +229 -8
  2. package/dist/agent/index.d.ts +119 -0
  3. package/dist/agent/index.d.ts.map +1 -0
  4. package/dist/agent/index.js +406 -0
  5. package/dist/agent/manual-loop.d.ts +41 -0
  6. package/dist/agent/manual-loop.d.ts.map +1 -0
  7. package/dist/agent/manual-loop.js +278 -0
  8. package/dist/api/exa/index.d.ts +177 -0
  9. package/dist/api/exa/index.d.ts.map +1 -0
  10. package/dist/api/exa/index.js +439 -0
  11. package/dist/cli.d.ts +5 -2
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +27 -33
  14. package/dist/commands/add-directory-command.d.ts +3 -0
  15. package/dist/commands/add-directory-command.d.ts.map +1 -0
  16. package/dist/commands/add-directory-command.js +85 -0
  17. package/dist/commands/application-log-command.d.ts +1 -0
  18. package/dist/commands/application-log-command.d.ts.map +1 -0
  19. package/dist/commands/application-log-command.js +39 -3
  20. package/dist/commands/clear-command.d.ts +1 -0
  21. package/dist/commands/clear-command.d.ts.map +1 -0
  22. package/dist/commands/clear-command.js +10 -3
  23. package/dist/commands/compact-command.d.ts +1 -0
  24. package/dist/commands/compact-command.d.ts.map +1 -0
  25. package/dist/commands/compact-command.js +16 -3
  26. package/dist/commands/context-command.d.ts +3 -0
  27. package/dist/commands/context-command.d.ts.map +1 -0
  28. package/dist/commands/context-command.js +183 -0
  29. package/dist/commands/copy-command.d.ts +1 -0
  30. package/dist/commands/copy-command.d.ts.map +1 -0
  31. package/dist/commands/copy-command.js +31 -2
  32. package/dist/commands/edit-command.d.ts +1 -0
  33. package/dist/commands/edit-command.d.ts.map +1 -0
  34. package/dist/commands/edit-command.js +40 -5
  35. package/dist/commands/edit-prompt-command.d.ts +2 -1
  36. package/dist/commands/edit-prompt-command.d.ts.map +1 -0
  37. package/dist/commands/edit-prompt-command.js +43 -7
  38. package/dist/commands/exit-command.d.ts +13 -2
  39. package/dist/commands/exit-command.d.ts.map +1 -0
  40. package/dist/commands/exit-command.js +34 -2
  41. package/dist/commands/files-command.d.ts +1 -0
  42. package/dist/commands/files-command.d.ts.map +1 -0
  43. package/dist/commands/files-command.js +66 -8
  44. package/dist/commands/generate-rules-command.d.ts +1 -0
  45. package/dist/commands/generate-rules-command.d.ts.map +1 -0
  46. package/dist/commands/generate-rules-command.js +315 -4
  47. package/dist/commands/handoff-command.d.ts +3 -0
  48. package/dist/commands/handoff-command.d.ts.map +1 -0
  49. package/dist/commands/handoff-command.js +202 -0
  50. package/dist/commands/health-command.d.ts +3 -1
  51. package/dist/commands/health-command.d.ts.map +1 -0
  52. package/dist/commands/health-command.js +160 -6
  53. package/dist/commands/help-command.d.ts +1 -0
  54. package/dist/commands/help-command.d.ts.map +1 -0
  55. package/dist/commands/help-command.js +30 -3
  56. package/dist/commands/history-command.d.ts +3 -0
  57. package/dist/commands/history-command.d.ts.map +1 -0
  58. package/dist/commands/history-command.js +534 -0
  59. package/dist/commands/init-command.d.ts +2 -1
  60. package/dist/commands/init-command.d.ts.map +1 -0
  61. package/dist/commands/init-command.js +56 -20
  62. package/dist/commands/last-log-command.d.ts +1 -0
  63. package/dist/commands/last-log-command.d.ts.map +1 -0
  64. package/dist/commands/last-log-command.js +39 -17
  65. package/dist/commands/list-directories-command.d.ts +3 -0
  66. package/dist/commands/list-directories-command.d.ts.map +1 -0
  67. package/dist/commands/list-directories-command.js +48 -0
  68. package/dist/commands/list-tools-command.d.ts +3 -0
  69. package/dist/commands/list-tools-command.d.ts.map +1 -0
  70. package/dist/commands/list-tools-command.js +124 -0
  71. package/dist/commands/manager.d.ts +20 -3
  72. package/dist/commands/manager.d.ts.map +1 -0
  73. package/dist/commands/manager.js +123 -26
  74. package/dist/commands/model-command.d.ts +23 -0
  75. package/dist/commands/model-command.d.ts.map +1 -0
  76. package/dist/commands/model-command.js +261 -5
  77. package/dist/commands/paste-command.d.ts +1 -0
  78. package/dist/commands/paste-command.d.ts.map +1 -0
  79. package/dist/commands/paste-command.js +98 -5
  80. package/dist/commands/pickup-command.d.ts +3 -0
  81. package/dist/commands/pickup-command.d.ts.map +1 -0
  82. package/dist/commands/pickup-command.js +161 -0
  83. package/dist/commands/prompt-command.d.ts +2 -1
  84. package/dist/commands/prompt-command.d.ts.map +1 -0
  85. package/dist/commands/prompt-command.js +178 -9
  86. package/dist/commands/remove-directory-command.d.ts +3 -0
  87. package/dist/commands/remove-directory-command.d.ts.map +1 -0
  88. package/dist/commands/remove-directory-command.js +87 -0
  89. package/dist/commands/reset-command.d.ts +2 -1
  90. package/dist/commands/reset-command.d.ts.map +1 -0
  91. package/dist/commands/reset-command.js +14 -3
  92. package/dist/commands/rules-command.d.ts +1 -0
  93. package/dist/commands/rules-command.d.ts.map +1 -0
  94. package/dist/commands/rules-command.js +70 -3
  95. package/dist/commands/save-command.d.ts +1 -0
  96. package/dist/commands/save-command.d.ts.map +1 -0
  97. package/dist/commands/save-command.js +13 -1
  98. package/dist/commands/shell-command.d.ts +3 -0
  99. package/dist/commands/shell-command.d.ts.map +1 -0
  100. package/dist/commands/shell-command.js +128 -0
  101. package/dist/commands/types.d.ts +16 -8
  102. package/dist/commands/types.d.ts.map +1 -0
  103. package/dist/commands/usage-command.d.ts +1 -0
  104. package/dist/commands/usage-command.d.ts.map +1 -0
  105. package/dist/commands/usage-command.js +24 -3
  106. package/dist/config.d.ts +21 -34
  107. package/dist/config.d.ts.map +1 -0
  108. package/dist/config.js +55 -15
  109. package/dist/dedent.d.ts +1 -0
  110. package/dist/dedent.d.ts.map +1 -0
  111. package/dist/execution/index.d.ts +112 -0
  112. package/dist/execution/index.d.ts.map +1 -0
  113. package/dist/execution/index.js +432 -0
  114. package/dist/formatting.d.ts +107 -10
  115. package/dist/formatting.d.ts.map +1 -0
  116. package/dist/formatting.js +150 -62
  117. package/dist/index.d.ts +8 -2
  118. package/dist/index.d.ts.map +1 -0
  119. package/dist/index.js +150 -38
  120. package/dist/logger.d.ts +1 -0
  121. package/dist/logger.d.ts.map +1 -0
  122. package/dist/logger.js +47 -18
  123. package/dist/mentions.d.ts +6 -1
  124. package/dist/mentions.d.ts.map +1 -0
  125. package/dist/mentions.js +58 -11
  126. package/dist/messages.d.ts +16 -20
  127. package/dist/messages.d.ts.map +1 -0
  128. package/dist/messages.js +89 -72
  129. package/dist/middleware/audit-message.d.ts +1 -0
  130. package/dist/middleware/audit-message.d.ts.map +1 -0
  131. package/dist/middleware/cache.d.ts +3 -0
  132. package/dist/middleware/cache.d.ts.map +1 -0
  133. package/dist/middleware/cache.js +53 -0
  134. package/dist/middleware/index.d.ts +2 -0
  135. package/dist/middleware/index.d.ts.map +1 -0
  136. package/dist/middleware/index.js +1 -0
  137. package/dist/middleware/rate-limit.d.ts +1 -0
  138. package/dist/middleware/rate-limit.d.ts.map +1 -0
  139. package/dist/models/ai-config.d.ts +5 -2
  140. package/dist/models/ai-config.d.ts.map +1 -0
  141. package/dist/models/ai-config.js +12 -2
  142. package/dist/models/anthropic-provider.d.ts +1 -0
  143. package/dist/models/anthropic-provider.d.ts.map +1 -0
  144. package/dist/models/anthropic-provider.js +3 -60
  145. package/dist/models/deepseek-provider.d.ts +1 -0
  146. package/dist/models/deepseek-provider.d.ts.map +1 -0
  147. package/dist/models/google-provider.d.ts +1 -0
  148. package/dist/models/google-provider.d.ts.map +1 -0
  149. package/dist/models/groq-provider.d.ts +20 -0
  150. package/dist/models/groq-provider.d.ts.map +1 -0
  151. package/dist/models/groq-provider.js +31 -0
  152. package/dist/models/manager.d.ts +3 -1
  153. package/dist/models/manager.d.ts.map +1 -0
  154. package/dist/models/manager.js +26 -2
  155. package/dist/models/openai-provider.d.ts +2 -1
  156. package/dist/models/openai-provider.d.ts.map +1 -0
  157. package/dist/models/openrouter-provider.d.ts +25 -23
  158. package/dist/models/openrouter-provider.d.ts.map +1 -0
  159. package/dist/models/openrouter-provider.js +181 -122
  160. package/dist/models/providers.d.ts +4 -5
  161. package/dist/models/providers.d.ts.map +1 -0
  162. package/dist/models/providers.js +7 -3
  163. package/dist/models/xai-provider.d.ts +1 -0
  164. package/dist/models/xai-provider.d.ts.map +1 -0
  165. package/dist/parsing.d.ts +2 -1
  166. package/dist/parsing.d.ts.map +1 -0
  167. package/dist/prompts/manager.d.ts +14 -2
  168. package/dist/prompts/manager.d.ts.map +1 -0
  169. package/dist/prompts.d.ts +2 -0
  170. package/dist/prompts.d.ts.map +1 -0
  171. package/dist/prompts.js +65 -12
  172. package/dist/repl/display-tool-messages.d.ts +4 -0
  173. package/dist/repl/display-tool-messages.d.ts.map +1 -0
  174. package/dist/repl/display-tool-messages.js +58 -0
  175. package/dist/repl/display-tool-use.d.ts +14 -0
  176. package/dist/repl/display-tool-use.d.ts.map +1 -0
  177. package/dist/repl/display-tool-use.js +63 -0
  178. package/dist/repl/get-prompt-header.d.ts +8 -0
  179. package/dist/repl/get-prompt-header.d.ts.map +1 -0
  180. package/dist/repl/get-prompt-header.js +9 -0
  181. package/dist/repl/project-status-line.d.ts +2 -0
  182. package/dist/repl/project-status-line.d.ts.map +1 -0
  183. package/dist/repl/project-status-line.js +31 -0
  184. package/dist/repl/prompt.d.ts +21 -0
  185. package/dist/repl/prompt.d.ts.map +1 -0
  186. package/dist/{repl-prompt.js → repl/prompt.js} +119 -22
  187. package/dist/repl/tool-call-repair.d.ts +4 -0
  188. package/dist/repl/tool-call-repair.d.ts.map +1 -0
  189. package/dist/repl/tool-call-repair.js +54 -0
  190. package/dist/repl-new.d.ts +53 -0
  191. package/dist/repl-new.d.ts.map +1 -0
  192. package/dist/repl-new.js +374 -0
  193. package/dist/repl.d.ts +9 -7
  194. package/dist/repl.d.ts.map +1 -0
  195. package/dist/repl.js +142 -378
  196. package/dist/terminal/ansi-styles.d.ts +77 -0
  197. package/dist/terminal/ansi-styles.d.ts.map +1 -0
  198. package/dist/terminal/ansi-styles.js +215 -0
  199. package/dist/terminal/checkbox-prompt.d.ts +36 -0
  200. package/dist/terminal/checkbox-prompt.d.ts.map +1 -0
  201. package/dist/terminal/checkbox-prompt.js +368 -0
  202. package/dist/terminal/default-theme.d.ts +6 -0
  203. package/dist/terminal/default-theme.d.ts.map +1 -0
  204. package/dist/terminal/default-theme.js +182 -0
  205. package/dist/terminal/east-asian-width.d.ts +8 -0
  206. package/dist/terminal/east-asian-width.d.ts.map +1 -0
  207. package/dist/terminal/east-asian-width.js +409 -0
  208. package/dist/terminal/editor-prompt.d.ts +10 -0
  209. package/dist/terminal/editor-prompt.d.ts.map +1 -0
  210. package/dist/terminal/editor-prompt.js +61 -0
  211. package/dist/terminal/errors.d.ts +19 -0
  212. package/dist/terminal/errors.d.ts.map +1 -0
  213. package/dist/terminal/errors.js +37 -0
  214. package/dist/terminal/formatting.d.ts +1 -11
  215. package/dist/terminal/formatting.d.ts.map +1 -0
  216. package/dist/terminal/formatting.js +4 -20
  217. package/dist/terminal/highlight/index.d.ts +53 -0
  218. package/dist/terminal/highlight/index.d.ts.map +1 -0
  219. package/dist/terminal/highlight/index.js +90 -0
  220. package/dist/terminal/highlight/theme.d.ts +233 -0
  221. package/dist/terminal/highlight/theme.d.ts.map +1 -0
  222. package/dist/terminal/highlight/theme.js +83 -0
  223. package/dist/terminal/index.d.ts +23 -9
  224. package/dist/terminal/index.d.ts.map +1 -0
  225. package/dist/terminal/index.js +136 -126
  226. package/dist/terminal/input-prompt.d.ts +17 -0
  227. package/dist/terminal/input-prompt.d.ts.map +1 -0
  228. package/dist/terminal/input-prompt.js +181 -0
  229. package/dist/terminal/markdown-utils.d.ts +1 -0
  230. package/dist/terminal/markdown-utils.d.ts.map +1 -0
  231. package/dist/terminal/markdown.d.ts +1 -0
  232. package/dist/terminal/markdown.d.ts.map +1 -0
  233. package/dist/terminal/markdown.js +20 -12
  234. package/dist/terminal/search-prompt.d.ts +20 -0
  235. package/dist/terminal/search-prompt.d.ts.map +1 -0
  236. package/dist/terminal/search-prompt.js +280 -0
  237. package/dist/terminal/select-prompt.d.ts +26 -0
  238. package/dist/terminal/select-prompt.d.ts.map +1 -0
  239. package/dist/terminal/select-prompt.js +306 -0
  240. package/dist/terminal/string-width.d.ts +7 -0
  241. package/dist/terminal/string-width.d.ts.map +1 -0
  242. package/dist/terminal/string-width.js +61 -0
  243. package/dist/terminal/strip-ansi.d.ts +2 -0
  244. package/dist/terminal/strip-ansi.d.ts.map +1 -0
  245. package/dist/terminal/strip-ansi.js +20 -0
  246. package/dist/terminal/style.d.ts +191 -0
  247. package/dist/terminal/style.d.ts.map +1 -0
  248. package/dist/terminal/style.js +259 -0
  249. package/dist/terminal/supports-color.d.ts +1 -0
  250. package/dist/terminal/supports-color.d.ts.map +1 -0
  251. package/dist/terminal/supports-hyperlinks.d.ts +1 -3
  252. package/dist/terminal/supports-hyperlinks.d.ts.map +1 -0
  253. package/dist/terminal/supports-hyperlinks.js +1 -1
  254. package/dist/terminal/types.d.ts +1 -37
  255. package/dist/terminal/types.d.ts.map +1 -0
  256. package/dist/terminal/wrap-ansi.d.ts +8 -0
  257. package/dist/terminal/wrap-ansi.d.ts.map +1 -0
  258. package/dist/terminal/wrap-ansi.js +190 -0
  259. package/dist/{token-utils.d.ts → tokens/counter.d.ts} +1 -0
  260. package/dist/tokens/counter.d.ts.map +1 -0
  261. package/dist/{token-utils.js → tokens/counter.js} +1 -1
  262. package/dist/tokens/threshold.d.ts +35 -0
  263. package/dist/tokens/threshold.d.ts.map +1 -0
  264. package/dist/tokens/threshold.js +85 -0
  265. package/dist/{token-tracker.d.ts → tokens/tracker.d.ts} +1 -0
  266. package/dist/tokens/tracker.d.ts.map +1 -0
  267. package/dist/tools/advanced-edit-file.d.ts +69 -0
  268. package/dist/tools/advanced-edit-file.d.ts.map +1 -0
  269. package/dist/tools/advanced-edit-file.js +281 -0
  270. package/dist/tools/agent.d.ts +19 -7
  271. package/dist/tools/agent.d.ts.map +1 -0
  272. package/dist/tools/agent.js +70 -54
  273. package/dist/tools/bash-utils.d.ts +7 -0
  274. package/dist/tools/bash-utils.d.ts.map +1 -0
  275. package/dist/tools/bash-utils.js +220 -0
  276. package/dist/tools/bash.d.ts +25 -14
  277. package/dist/tools/bash.d.ts.map +1 -0
  278. package/dist/tools/bash.js +87 -251
  279. package/dist/tools/code-interpreter.d.ts +22 -10
  280. package/dist/tools/code-interpreter.d.ts.map +1 -0
  281. package/dist/tools/code-interpreter.js +146 -210
  282. package/dist/tools/delete-file.d.ts +18 -9
  283. package/dist/tools/delete-file.d.ts.map +1 -0
  284. package/dist/tools/delete-file.js +55 -85
  285. package/dist/tools/directory-tree.d.ts +26 -6
  286. package/dist/tools/directory-tree.d.ts.map +1 -0
  287. package/dist/tools/directory-tree.js +109 -28
  288. package/dist/tools/dynamic-tool-loader.d.ts +22 -0
  289. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -0
  290. package/dist/tools/dynamic-tool-loader.js +272 -0
  291. package/dist/tools/dynamic-tool-parser.d.ts +21 -0
  292. package/dist/tools/dynamic-tool-parser.d.ts.map +1 -0
  293. package/dist/tools/dynamic-tool-parser.js +22 -0
  294. package/dist/tools/edit-file.d.ts +41 -13
  295. package/dist/tools/edit-file.d.ts.map +1 -0
  296. package/dist/tools/edit-file.js +173 -96
  297. package/dist/tools/filesystem-utils.d.ts +7 -21
  298. package/dist/tools/filesystem-utils.d.ts.map +1 -0
  299. package/dist/tools/filesystem-utils.js +111 -149
  300. package/dist/tools/git-utils.d.ts +1 -0
  301. package/dist/tools/git-utils.d.ts.map +1 -0
  302. package/dist/tools/glob.d.ts +36 -0
  303. package/dist/tools/glob.d.ts.map +1 -0
  304. package/dist/tools/glob.js +143 -0
  305. package/dist/tools/grep.d.ts +76 -13
  306. package/dist/tools/grep.d.ts.map +1 -0
  307. package/dist/tools/grep.js +420 -135
  308. package/dist/tools/index.d.ts +207 -133
  309. package/dist/tools/index.d.ts.map +1 -0
  310. package/dist/tools/index.js +245 -127
  311. package/dist/tools/llm-edit-fixer.d.ts +25 -0
  312. package/dist/tools/llm-edit-fixer.d.ts.map +1 -0
  313. package/dist/tools/llm-edit-fixer.js +150 -0
  314. package/dist/tools/move-file.d.ts +20 -7
  315. package/dist/tools/move-file.d.ts.map +1 -0
  316. package/dist/tools/move-file.js +43 -29
  317. package/dist/tools/read-file.d.ts +49 -10
  318. package/dist/tools/read-file.d.ts.map +1 -0
  319. package/dist/tools/read-file.js +79 -67
  320. package/dist/tools/read-multiple-files.d.ts +19 -7
  321. package/dist/tools/read-multiple-files.d.ts.map +1 -0
  322. package/dist/tools/read-multiple-files.js +117 -33
  323. package/dist/tools/save-file.d.ts +46 -11
  324. package/dist/tools/save-file.d.ts.map +1 -0
  325. package/dist/tools/save-file.js +63 -78
  326. package/dist/tools/think.d.ts +16 -7
  327. package/dist/tools/think.d.ts.map +1 -0
  328. package/dist/tools/think.js +34 -22
  329. package/dist/tools/types.d.ts +18 -11
  330. package/dist/tools/types.d.ts.map +1 -0
  331. package/dist/tools/types.js +9 -0
  332. package/dist/tools/utils.d.ts +14 -0
  333. package/dist/tools/utils.d.ts.map +1 -0
  334. package/dist/tools/utils.js +16 -0
  335. package/dist/tools/web-fetch.d.ts +15 -6
  336. package/dist/tools/web-fetch.d.ts.map +1 -0
  337. package/dist/tools/web-fetch.js +40 -39
  338. package/dist/tools/web-search.d.ts +17 -7
  339. package/dist/tools/web-search.d.ts.map +1 -0
  340. package/dist/tools/web-search.js +86 -33
  341. package/dist/tui/autocomplete.d.ts +44 -0
  342. package/dist/tui/autocomplete.d.ts.map +1 -0
  343. package/dist/tui/autocomplete.js +466 -0
  344. package/dist/tui/components/assistant-message.d.ts +18 -0
  345. package/dist/tui/components/assistant-message.d.ts.map +1 -0
  346. package/dist/tui/components/assistant-message.js +29 -0
  347. package/dist/tui/components/editor.d.ts +51 -0
  348. package/dist/tui/components/editor.d.ts.map +1 -0
  349. package/dist/tui/components/editor.js +758 -0
  350. package/dist/tui/components/footer.d.ts +24 -0
  351. package/dist/tui/components/footer.d.ts.map +1 -0
  352. package/dist/tui/components/footer.js +197 -0
  353. package/dist/tui/components/input.d.ts +14 -0
  354. package/dist/tui/components/input.d.ts.map +1 -0
  355. package/dist/tui/components/input.js +122 -0
  356. package/dist/tui/components/loader.d.ts +19 -0
  357. package/dist/tui/components/loader.d.ts.map +1 -0
  358. package/dist/tui/components/loader.js +45 -0
  359. package/dist/tui/components/markdown.d.ts +103 -0
  360. package/dist/tui/components/markdown.d.ts.map +1 -0
  361. package/dist/tui/components/markdown.js +533 -0
  362. package/dist/tui/components/modal.d.ts +40 -0
  363. package/dist/tui/components/modal.d.ts.map +1 -0
  364. package/dist/tui/components/modal.js +292 -0
  365. package/dist/tui/components/prompt-status.d.ts +16 -0
  366. package/dist/tui/components/prompt-status.d.ts.map +1 -0
  367. package/dist/tui/components/prompt-status.js +21 -0
  368. package/dist/tui/components/select-list.d.ts +22 -0
  369. package/dist/tui/components/select-list.d.ts.map +1 -0
  370. package/dist/tui/components/select-list.js +143 -0
  371. package/dist/tui/components/spacer.d.ts +16 -0
  372. package/dist/tui/components/spacer.d.ts.map +1 -0
  373. package/dist/tui/components/spacer.js +27 -0
  374. package/dist/tui/components/text.d.ts +26 -0
  375. package/dist/tui/components/text.d.ts.map +1 -0
  376. package/dist/tui/components/text.js +143 -0
  377. package/dist/tui/components/thinking-block.d.ts +14 -0
  378. package/dist/tui/components/thinking-block.d.ts.map +1 -0
  379. package/dist/tui/components/thinking-block.js +30 -0
  380. package/dist/tui/components/tool-execution.d.ts +17 -0
  381. package/dist/tui/components/tool-execution.d.ts.map +1 -0
  382. package/dist/tui/components/tool-execution.js +153 -0
  383. package/dist/tui/components/user-message.d.ts +9 -0
  384. package/dist/tui/components/user-message.d.ts.map +1 -0
  385. package/dist/tui/components/user-message.js +21 -0
  386. package/dist/tui/components/welcome.d.ts +6 -0
  387. package/dist/tui/components/welcome.d.ts.map +1 -0
  388. package/dist/tui/components/welcome.js +30 -0
  389. package/dist/tui/index.d.ts +14 -0
  390. package/dist/tui/index.d.ts.map +1 -0
  391. package/dist/tui/index.js +18 -0
  392. package/dist/tui/terminal.d.ts +37 -0
  393. package/dist/tui/terminal.d.ts.map +1 -0
  394. package/dist/tui/terminal.js +104 -0
  395. package/dist/tui/tui.d.ts +67 -0
  396. package/dist/tui/tui.d.ts.map +1 -0
  397. package/dist/tui/tui.js +184 -0
  398. package/dist/tui/utils.d.ts +19 -0
  399. package/dist/tui/utils.d.ts.map +1 -0
  400. package/dist/tui/utils.js +31 -0
  401. package/dist/utils/filesystem.d.ts +23 -0
  402. package/dist/utils/filesystem.d.ts.map +1 -0
  403. package/dist/utils/filesystem.js +140 -0
  404. package/dist/utils/filetype-detection.d.ts +3 -0
  405. package/dist/utils/filetype-detection.d.ts.map +1 -0
  406. package/dist/utils/filetype-detection.js +112 -0
  407. package/dist/utils/generators.d.ts +3 -0
  408. package/dist/utils/generators.d.ts.map +1 -0
  409. package/dist/utils/generators.js +25 -0
  410. package/dist/utils/glob.d.ts +52 -0
  411. package/dist/utils/glob.d.ts.map +1 -0
  412. package/dist/utils/glob.js +376 -0
  413. package/dist/utils/ignore.d.ts +104 -0
  414. package/dist/utils/ignore.d.ts.map +1 -0
  415. package/dist/utils/ignore.js +649 -0
  416. package/dist/utils/iterables.d.ts +2 -0
  417. package/dist/utils/iterables.d.ts.map +1 -0
  418. package/dist/utils/iterables.js +6 -0
  419. package/dist/utils/process.d.ts +3 -2
  420. package/dist/utils/process.d.ts.map +1 -0
  421. package/dist/utils/process.js +17 -2
  422. package/dist/utils/zod-utils.d.ts +4 -0
  423. package/dist/utils/zod-utils.d.ts.map +1 -0
  424. package/dist/utils/zod-utils.js +7 -0
  425. package/dist/version.d.ts +1 -0
  426. package/dist/version.d.ts.map +1 -0
  427. package/package.json +34 -32
  428. package/dist/conversation-analyzer.d.ts +0 -10
  429. package/dist/conversation-analyzer.js +0 -88
  430. package/dist/repl-prompt.d.ts +0 -14
  431. package/dist/tools/command-validation.d.ts +0 -11
  432. package/dist/tools/command-validation.js +0 -45
  433. /package/dist/{token-tracker.js → tokens/tracker.js} +0 -0
package/dist/mentions.js CHANGED
@@ -1,9 +1,27 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { isString } from "@travisennis/stdlib/typeguards";
4
+ import { initExecutionEnvironment } from "./execution/index.js";
4
5
  import { formatFile, formatUrl } from "./formatting.js";
5
6
  import { readUrl } from "./tools/web-fetch.js";
6
- import { executeCommand } from "./utils/process.js";
7
+ class ShellCommandError extends Error {
8
+ command;
9
+ exitCode;
10
+ output;
11
+ constructor(message, command, exitCode, output) {
12
+ super(message);
13
+ this.name = "ShellCommandError";
14
+ this.command = command;
15
+ this.exitCode = exitCode;
16
+ this.output = output;
17
+ }
18
+ }
19
+ export class PromptError extends Error {
20
+ constructor(message, cause) {
21
+ super(message, { cause });
22
+ this.name = "PromptError";
23
+ }
24
+ }
7
25
  // Helper function to recursively read all files in a directory
8
26
  async function readDirectoryRecursive(dirPath, format) {
9
27
  const allContents = [];
@@ -77,19 +95,23 @@ async function processFileCommand(context) {
77
95
  }
78
96
  async function processShellCommand(command) {
79
97
  try {
80
- const { stdout, stderr, code } = await executeCommand(command, {
81
- shell: false,
98
+ const execEnv = await initExecutionEnvironment();
99
+ const { output, exitCode } = await execEnv.executeCommand(command, {
100
+ throwOnError: true,
82
101
  });
83
- if (code === 0) {
84
- return stdout;
102
+ if (exitCode === 0) {
103
+ return output;
85
104
  }
86
- return `Error executing command: ${command}\n${stderr}`;
105
+ throw new ShellCommandError(`Command failed with exit code ${exitCode}`, command, exitCode, output);
87
106
  }
88
107
  catch (error) {
108
+ if (error instanceof ShellCommandError) {
109
+ throw error;
110
+ }
89
111
  if (error instanceof Error) {
90
- return `Error executing command ${command}: ${error.message}`;
112
+ throw new ShellCommandError(`Command execution failed: ${error.message}`, command, undefined, undefined);
91
113
  }
92
- return `Error executing command ${command}: An unknown error occurred.`;
114
+ throw new ShellCommandError("Command execution failed with unknown error", command, undefined, undefined);
93
115
  }
94
116
  }
95
117
  // Returns the formatted string or an error message string
@@ -115,7 +137,7 @@ async function processUrlCommand(context) {
115
137
  };
116
138
  }
117
139
  }
118
- export async function processPrompt(message, { baseDir, model }) {
140
+ export async function processPrompt(message, { baseDir, model, pasteStore, }) {
119
141
  const fileRegex = /@([^\s@]+(?:\.[\w\d]+))/g;
120
142
  const urlRegex = /@(https?:\/\/[^\s]+)/g;
121
143
  const shellRegex = /!`([^`]+)`/g;
@@ -149,12 +171,37 @@ export async function processPrompt(message, { baseDir, model }) {
149
171
  }
150
172
  }
151
173
  let processedMessage = message;
174
+ // Process paste placeholders
175
+ if (pasteStore && pasteStore.size > 0) {
176
+ const pasteRegex = /\[Paste #(\d+), (\d+) characters\]/g;
177
+ let match = pasteRegex.exec(processedMessage);
178
+ while (match !== null) {
179
+ const pasteId = Number.parseInt(match[1], 10);
180
+ const pasteContent = pasteStore.get(pasteId);
181
+ if (pasteContent) {
182
+ processedMessage = processedMessage.replace(match[0], pasteContent);
183
+ // Reset regex lastIndex since we modified the string
184
+ pasteRegex.lastIndex = 0;
185
+ }
186
+ match = pasteRegex.exec(processedMessage);
187
+ }
188
+ }
152
189
  // Process shell commands
153
190
  for (const match of shellMatches) {
154
191
  const command = match[1];
155
192
  if (command) {
156
- const output = await processShellCommand(command);
157
- processedMessage = processedMessage.replace(match[0], output);
193
+ try {
194
+ const output = await processShellCommand(command);
195
+ processedMessage = processedMessage.replace(match[0], output);
196
+ }
197
+ catch (error) {
198
+ if (error instanceof ShellCommandError) {
199
+ // Wrap shell command errors in PromptError
200
+ throw new PromptError(`Shell command failed: ${error.message}`, error);
201
+ }
202
+ // For other errors, wrap them in PromptError
203
+ throw new PromptError(`Unexpected error executing command: ${error instanceof Error ? error.message : "Unknown error"}`, error instanceof Error ? error : undefined);
204
+ }
158
205
  }
159
206
  }
160
207
  // Wait for all mentions to be processed
@@ -2,16 +2,18 @@ import EventEmitter from "node:events";
2
2
  import { type AssistantModelMessage, type ImagePart, // Added ImagePart
3
3
  type ModelMessage, type ToolModelMessage, type UserModelMessage } from "ai";
4
4
  import type { ModelManager } from "./models/manager.ts";
5
- import type { TokenTracker } from "./token-tracker.ts";
5
+ import type { TokenTracker } from "./tokens/tracker.ts";
6
6
  export type UserMessageContentItem = string | ImagePart;
7
7
  export declare function createUserMessage(contentItems: UserMessageContentItem[], prompt?: string): UserModelMessage;
8
- export declare function createAssistantMessage(content: string): AssistantModelMessage;
9
8
  /**
10
9
  A message that was generated during the generation process.
11
10
  It can be either an assistant message or a tool message.
12
11
  */
13
12
  type ResponseMessage = AssistantModelMessage | ToolModelMessage;
14
- export type SavedMessageHistory = {
13
+ type SavedMessageHistory = {
14
+ project: string;
15
+ sessionId: string;
16
+ modelId: string;
15
17
  title: string;
16
18
  createdAt: Date;
17
19
  updatedAt: Date;
@@ -23,6 +25,8 @@ interface MessageHistoryEvents {
23
25
  }
24
26
  export declare class MessageHistory extends EventEmitter<MessageHistoryEvents> {
25
27
  private history;
28
+ private sessionId;
29
+ private modelId;
26
30
  private title;
27
31
  private createdAt;
28
32
  private updatedAt;
@@ -34,6 +38,7 @@ export declare class MessageHistory extends EventEmitter<MessageHistoryEvents> {
34
38
  modelManager: ModelManager;
35
39
  tokenTracker: TokenTracker;
36
40
  });
41
+ create(modelId: string): void;
37
42
  private validMessage;
38
43
  get(): ModelMessage[];
39
44
  clear(): void;
@@ -41,29 +46,20 @@ export declare class MessageHistory extends EventEmitter<MessageHistoryEvents> {
41
46
  appendUserMessage(msg: UserModelMessage): void;
42
47
  appendAssistantMessage(msg: string): void;
43
48
  appendAssistantMessage(msg: AssistantModelMessage): void;
49
+ appendToolMessages(toolResultMessages: ToolModelMessage[]): void;
44
50
  appendResponseMessages(responseMessages: ResponseMessage[]): void;
45
51
  isEmpty(): boolean;
46
52
  save(): Promise<void>;
47
53
  private generateTitle;
48
54
  getFirstUserMessage(): UserModelMessage | undefined;
55
+ getLastUserMessage(): UserModelMessage | undefined;
56
+ /**
57
+ * Extracts the last message from the conversation history for display purposes.
58
+ * Prioritizes assistant messages, falls back to user messages if no assistant messages exist.
59
+ */
60
+ getLastMessage(): string | null;
49
61
  static load(stateDir: string, count?: number): Promise<SavedMessageHistory[]>;
50
62
  restore(savedHistory: SavedMessageHistory): void;
51
63
  }
52
- /**
53
- * Normalizes an array of messages for API consumption by:
54
- * 1. Filtering out progress-type messages
55
- * 2. Processing user and assistant messages
56
- * 3. Handling tool results by either:
57
- * - Adding them as new messages if they're the first tool result
58
- * - Adding them as new messages if the previous message wasn't a tool result
59
- * - Merging them with the previous message if it was also a tool result
60
- *
61
- * This consolidation of sequential tool results into a single message
62
- * ensures proper formatting for API consumption while maintaining the
63
- * logical flow of the conversation.
64
- *
65
- * @param messages - Array of messages to normalize
66
- * @returns Normalized array of user and assistant messages ready for API
67
- */
68
- export declare function normalizeMessagesForApi(messages: ModelMessage[]): ModelMessage[];
69
64
  export {};
65
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../source/messages.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,MAAM,aAAa,CAAC;AAIvC,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,SAAS,EAAE,kBAAkB;AAClC,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,IAAI,CAAC;AACZ,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,SAAS,CAAC;AAExD,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,sBAAsB,EAAE,EACtC,MAAM,CAAC,EAAE,MAAM,GACd,gBAAgB,CAuBlB;AAcD;;;GAGG;AACH,KAAK,eAAe,GAAG,qBAAqB,GAAG,gBAAgB,CAAC;AAEhE,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B,CAAC;AAUF,UAAU,oBAAoB;IAC5B,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC;IACzB,eAAe,EAAE,EAAE,CAAC;CACrB;AAED,qBAAa,cAAe,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IACpE,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAe;gBAEvB,EACV,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,YAAY,CAAC;QAC3B,YAAY,EAAE,YAAY,CAAC;KAC5B;IAaD,MAAM,CAAC,OAAO,EAAE,MAAM;IAStB,OAAO,CAAC,YAAY;IAoBpB,GAAG;IAIH,KAAK;IAKL,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACpC,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI;IAmB9C,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACzC,sBAAsB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI;IAOxD,kBAAkB,CAAC,kBAAkB,EAAE,gBAAgB,EAAE;IAKzD,sBAAsB,CAAC,gBAAgB,EAAE,eAAe,EAAE;IAO1D,OAAO;IAID,IAAI;YAoBI,aAAa;IA6B3B,mBAAmB,IAAI,gBAAgB,GAAG,SAAS;IAOnD,kBAAkB,IAAI,gBAAgB,GAAG,SAAS;IAOlD;;;OAGG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;WA2ClB,IAAI,CACf,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAK,GACT,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA6EjC,OAAO,CAAC,YAAY,EAAE,mBAAmB,GAAG,IAAI;CAajD"}
package/dist/messages.js CHANGED
@@ -1,6 +1,7 @@
1
+ import { randomUUID } from "node:crypto";
1
2
  import EventEmitter from "node:events";
2
- import { readdir, readFile, writeFile } from "node:fs/promises";
3
- import { join } from "node:path";
3
+ import { readdir, readFile, stat, writeFile } from "node:fs/promises";
4
+ import { basename, join } from "node:path";
4
5
  import { isString } from "@travisennis/stdlib/typeguards";
5
6
  import { generateText, } from "ai";
6
7
  export function createUserMessage(contentItems, prompt) {
@@ -25,7 +26,7 @@ export function createUserMessage(contentItems, prompt) {
25
26
  content: messageParts,
26
27
  };
27
28
  }
28
- export function createAssistantMessage(content) {
29
+ function createAssistantMessage(content) {
29
30
  return {
30
31
  role: "assistant",
31
32
  content: [
@@ -38,6 +39,8 @@ export function createAssistantMessage(content) {
38
39
  }
39
40
  export class MessageHistory extends EventEmitter {
40
41
  history;
42
+ sessionId;
43
+ modelId;
41
44
  title;
42
45
  createdAt;
43
46
  updatedAt;
@@ -47,6 +50,8 @@ export class MessageHistory extends EventEmitter {
47
50
  constructor({ stateDir, modelManager, tokenTracker, }) {
48
51
  super();
49
52
  this.history = [];
53
+ this.sessionId = randomUUID();
54
+ this.modelId = "";
50
55
  this.title = "";
51
56
  this.createdAt = new Date();
52
57
  this.updatedAt = new Date();
@@ -54,6 +59,14 @@ export class MessageHistory extends EventEmitter {
54
59
  this.modelManager = modelManager;
55
60
  this.tokenTracker = tokenTracker;
56
61
  }
62
+ create(modelId) {
63
+ this.clear();
64
+ this.modelId = modelId;
65
+ this.sessionId = randomUUID();
66
+ this.title = "";
67
+ this.createdAt = new Date();
68
+ this.updatedAt = new Date();
69
+ }
57
70
  validMessage(msg) {
58
71
  // Filter out messages with empty content arrays
59
72
  if (Array.isArray(msg.content) && msg.content.length === 0) {
@@ -96,6 +109,10 @@ export class MessageHistory extends EventEmitter {
96
109
  const msgObj = isString(msg) ? createAssistantMessage(msg) : msg;
97
110
  this.history.push(msgObj);
98
111
  }
112
+ appendToolMessages(toolResultMessages) {
113
+ this.updatedAt = new Date();
114
+ this.history.push(...toolResultMessages);
115
+ }
99
116
  appendResponseMessages(responseMessages) {
100
117
  this.updatedAt = new Date();
101
118
  // Filter out messages with empty content arrays
@@ -107,10 +124,13 @@ export class MessageHistory extends EventEmitter {
107
124
  }
108
125
  async save() {
109
126
  const msgHistoryDir = this.stateDir;
110
- const timestamp = new Date().toISOString().replace(/:/g, "-");
111
- const fileName = `message-history-${timestamp}.json`;
127
+ const fileName = `message-history-${this.sessionId}.json`;
112
128
  const filePath = join(msgHistoryDir, fileName);
129
+ const project = basename(process.cwd());
113
130
  const output = {
131
+ project,
132
+ sessionId: this.sessionId,
133
+ modelId: this.modelId,
114
134
  title: this.title,
115
135
  createdAt: this.createdAt,
116
136
  updatedAt: this.updatedAt,
@@ -129,6 +149,7 @@ export class MessageHistory extends EventEmitter {
129
149
  const { text, usage } = await generateText({
130
150
  model: this.modelManager.getModel(app),
131
151
  system: systemPrompt,
152
+ maxOutputTokens: 100,
132
153
  prompt: `Request:\n${message}\nTitle:`,
133
154
  });
134
155
  this.tokenTracker.trackUsage(app, usage);
@@ -145,19 +166,70 @@ export class MessageHistory extends EventEmitter {
145
166
  const firstUser = this.get().find((msg) => msg.role === "user");
146
167
  return firstUser;
147
168
  }
169
+ getLastUserMessage() {
170
+ const userMsg = this.history.findLast((value) => value.role === "user");
171
+ return userMsg;
172
+ }
173
+ /**
174
+ * Extracts the last message from the conversation history for display purposes.
175
+ * Prioritizes assistant messages, falls back to user messages if no assistant messages exist.
176
+ */
177
+ getLastMessage() {
178
+ const messages = this.get();
179
+ if (messages.length === 0) {
180
+ return null;
181
+ }
182
+ // Find the last assistant message, or fall back to last user message
183
+ const reversedMessages = [...messages].reverse();
184
+ const lastAssistant = reversedMessages.find((msg) => msg.role === "assistant");
185
+ const lastUser = reversedMessages.find((msg) => msg.role === "user");
186
+ const targetMessage = lastAssistant || lastUser;
187
+ if (!targetMessage) {
188
+ return null;
189
+ }
190
+ // Extract text content from the message
191
+ if (Array.isArray(targetMessage.content)) {
192
+ const textParts = targetMessage.content.filter((part) => part.type === "text" && part.text.trim().length > 0);
193
+ if (textParts.length === 0) {
194
+ return null;
195
+ }
196
+ return textParts.map((part) => part.text).join("\n");
197
+ }
198
+ // Handle string content (though this should be rare with current implementation)
199
+ if (typeof targetMessage.content === "string" &&
200
+ targetMessage.content.trim().length > 0) {
201
+ return targetMessage.content;
202
+ }
203
+ return null;
204
+ }
148
205
  static async load(stateDir, count = 10) {
149
206
  try {
150
207
  const files = await readdir(stateDir);
151
- const messageHistoryFiles = files
152
- .filter((file) => file.startsWith("message-history-") && file.endsWith(".json"))
153
- .sort((a, b) => {
154
- // Extract timestamps and compare in reverse order (newest first)
155
- const timeA = a.replace("message-history-", "").replace(".json", "");
156
- const timeB = b.replace("message-history-", "").replace(".json", "");
157
- return timeB.localeCompare(timeA); // Newest first
158
- })
159
- .slice(0, count); // Use the count parameter here
160
- const fileReadPromises = messageHistoryFiles.map(async (fileName) => {
208
+ const messageHistoryFiles = files.filter((file) => file.startsWith("message-history-") && file.endsWith(".json"));
209
+ // Get file stats and sort by modification time (newest first)
210
+ const fileStatsPromises = messageHistoryFiles.map(async (fileName) => {
211
+ const filePath = join(stateDir, fileName);
212
+ try {
213
+ const fileStat = await stat(filePath);
214
+ return {
215
+ fileName,
216
+ filePath,
217
+ modifiedTime: fileStat.mtime,
218
+ };
219
+ }
220
+ catch (error) {
221
+ console.error(`Error getting stats for file ${filePath}:`, error);
222
+ return null;
223
+ }
224
+ });
225
+ const fileStats = await Promise.all(fileStatsPromises);
226
+ // Filter out null results and sort by modification time (newest first)
227
+ const sortedFiles = fileStats
228
+ .filter((stat) => stat !== null)
229
+ .sort((a, b) => b.modifiedTime.getTime() - a.modifiedTime.getTime())
230
+ .slice(0, count)
231
+ .map((stat) => stat.fileName);
232
+ const fileReadPromises = sortedFiles.map(async (fileName) => {
161
233
  const filePath = join(stateDir, fileName);
162
234
  try {
163
235
  const content = await readFile(filePath, "utf-8");
@@ -177,11 +249,8 @@ export class MessageHistory extends EventEmitter {
177
249
  return null; // Return null for failed reads/parses
178
250
  });
179
251
  const results = await Promise.all(fileReadPromises);
180
- // Filter out null results (failed reads/parses)
181
- //sort results by result.updatedAt which is a Date
182
- return results
183
- .filter((result) => result !== null)
184
- .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
252
+ // Filter out null results and return them (already sorted by file modification time)
253
+ return results.filter((result) => result !== null);
185
254
  }
186
255
  catch (error) {
187
256
  // Handle cases where the directory might not exist or other readdir errors
@@ -207,55 +276,3 @@ export class MessageHistory extends EventEmitter {
207
276
  this.history = [...savedHistory.messages]; // Use the correct internal property name and create a copy
208
277
  }
209
278
  }
210
- /**
211
- * Normalizes an array of messages for API consumption by:
212
- * 1. Filtering out progress-type messages
213
- * 2. Processing user and assistant messages
214
- * 3. Handling tool results by either:
215
- * - Adding them as new messages if they're the first tool result
216
- * - Adding them as new messages if the previous message wasn't a tool result
217
- * - Merging them with the previous message if it was also a tool result
218
- *
219
- * This consolidation of sequential tool results into a single message
220
- * ensures proper formatting for API consumption while maintaining the
221
- * logical flow of the conversation.
222
- *
223
- * @param messages - Array of messages to normalize
224
- * @returns Normalized array of user and assistant messages ready for API
225
- */
226
- export function normalizeMessagesForApi(messages) {
227
- const result = [];
228
- for (const message of messages) {
229
- switch (message.role) {
230
- case "user": {
231
- result.push(message);
232
- continue;
233
- }
234
- case "tool": {
235
- // If the last message is not a tool result, add it to the result
236
- const lastMessage = result.at(-1);
237
- if (!lastMessage ||
238
- lastMessage.role === "assistant" ||
239
- !Array.isArray(lastMessage.content) ||
240
- lastMessage.content[0]?.type !== "tool-result") {
241
- result.push(message);
242
- continue;
243
- }
244
- // Otherwise, merge the current message with the last message
245
- result[result.indexOf(lastMessage)] = {
246
- ...lastMessage,
247
- // biome-ignore lint/suspicious/noExplicitAny: can't figure out type
248
- content: [...lastMessage.content, ...message.content], // #FIXME figure out what type this should be
249
- };
250
- continue;
251
- }
252
- case "assistant": {
253
- result.push(message);
254
- continue;
255
- }
256
- default:
257
- continue;
258
- }
259
- }
260
- return result;
261
- }
@@ -3,3 +3,4 @@ export declare const auditMessage: ({ filePath, app, }: {
3
3
  filePath: string;
4
4
  app: string;
5
5
  }) => LanguageModelV2Middleware;
6
+ //# sourceMappingURL=audit-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-message.d.ts","sourceRoot":"","sources":["../../source/middleware/audit-message.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,yBAAyB,EAI1B,MAAM,kBAAkB,CAAC;AAmC1B,eAAO,MAAM,YAAY,GAAI,oBAG1B;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb,8BAoFA,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LanguageModelV2Middleware } from "@ai-sdk/provider";
2
+ export declare const cacheMiddleware: LanguageModelV2Middleware;
3
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../source/middleware/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EAE1B,MAAM,kBAAkB,CAAC;AAsB1B,eAAO,MAAM,eAAe,EAAE,yBAyC7B,CAAC"}
@@ -0,0 +1,53 @@
1
+ function applyCaching(input) {
2
+ input.providerOptions = {
3
+ anthropic: { cacheControl: { type: "ephemeral" } },
4
+ openrouter: {
5
+ // biome-ignore lint/style/useNamingConvention: third-party
6
+ cache_control: { type: "ephemeral" },
7
+ cacheControl: { type: "ephemeral" },
8
+ },
9
+ bedrock: {
10
+ cachePoint: { type: "ephemeral" },
11
+ },
12
+ openaiCompatible: {
13
+ // biome-ignore lint/style/useNamingConvention: third-party
14
+ cache_control: { type: "ephemeral" },
15
+ },
16
+ };
17
+ }
18
+ export const cacheMiddleware = {
19
+ transformParams: async ({ params, model }) => {
20
+ const providerId = model.provider;
21
+ const modelId = model.modelId;
22
+ if (providerId === "anthropic" ||
23
+ modelId.includes("anthropic") ||
24
+ modelId.includes("claude")) {
25
+ const msgs = params.prompt;
26
+ const system = msgs.filter((msg) => msg.role === "system").at(0);
27
+ if (system) {
28
+ applyCaching(system);
29
+ }
30
+ // Get the last two user messages for caching
31
+ const userMessages = msgs.filter((msg) => msg.role === "user");
32
+ const lastTwoUserMessages = userMessages.slice(-2);
33
+ // Mark both the latest and second-to-last user messages as ephemeral
34
+ for (const userMessage of lastTwoUserMessages) {
35
+ const content = userMessage.content;
36
+ if (Array.isArray(content)) {
37
+ const finalContent = content.at(-1);
38
+ if (finalContent) {
39
+ applyCaching(finalContent);
40
+ }
41
+ }
42
+ }
43
+ const tools = params.tools;
44
+ if (tools) {
45
+ const lastTool = tools.at(-1);
46
+ if (lastTool?.type === "function") {
47
+ applyCaching(lastTool);
48
+ }
49
+ }
50
+ }
51
+ return params;
52
+ },
53
+ };
@@ -1,2 +1,4 @@
1
1
  export { auditMessage } from "./audit-message.ts";
2
+ export { cacheMiddleware } from "./cache.ts";
2
3
  export { createRateLimitMiddleware } from "./rate-limit.ts";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export { auditMessage } from "./audit-message.js";
2
+ export { cacheMiddleware } from "./cache.js";
2
3
  export { createRateLimitMiddleware } from "./rate-limit.js";
@@ -2,3 +2,4 @@ import type { LanguageModelV2Middleware } from "@ai-sdk/provider";
2
2
  export declare const createRateLimitMiddleware: ({ requestsPerMinute, }: {
3
3
  requestsPerMinute: number;
4
4
  }) => LanguageModelV2Middleware;
5
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../source/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAGlE,eAAO,MAAM,yBAAyB,GAAI,wBAEvC;IACD,iBAAiB,EAAE,MAAM,CAAC;CAC3B,KAAG,yBAgBH,CAAC"}
@@ -7,6 +7,9 @@ export declare class AiConfig {
7
7
  modelMetadata: ModelMetadata;
8
8
  prompt: string;
9
9
  });
10
- getMaxTokens(): number;
11
- getProviderOptions(): SharedV2ProviderMetadata;
10
+ maxOutputTokens(): number;
11
+ temperature(): number | undefined;
12
+ topP(): 1 | undefined;
13
+ providerOptions(): SharedV2ProviderMetadata;
12
14
  }
15
+ //# sourceMappingURL=ai-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-config.d.ts","sourceRoot":"","sources":["../../source/models/ai-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA2CpD,qBAAa,QAAQ;IACnB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAS;gBACX,EACV,aAAa,EACb,MAAM,GACP,EAAE;QAAE,aAAa,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAKnD,eAAe;IAUf,WAAW;IAKX,IAAI;IAMJ,eAAe,IAAI,wBAAwB;CA2C5C"}
@@ -34,7 +34,7 @@ export class AiConfig {
34
34
  this.modelMetadata = modelMetadata;
35
35
  this.prompt = prompt;
36
36
  }
37
- getMaxTokens() {
37
+ maxOutputTokens() {
38
38
  const modelConfig = this.modelMetadata;
39
39
  const thinkingLevel = calculateThinkingLevel(this.prompt);
40
40
  const maxTokens = modelConfig.provider === "anthropic" && modelConfig.supportsReasoning
@@ -42,7 +42,17 @@ export class AiConfig {
42
42
  : modelConfig.maxOutputTokens;
43
43
  return maxTokens;
44
44
  }
45
- getProviderOptions() {
45
+ temperature() {
46
+ const temp = this.modelMetadata.defaultTemperature;
47
+ return temp > -1 ? temp : undefined;
48
+ }
49
+ topP() {
50
+ const modelId = this.modelMetadata.id;
51
+ if (modelId.toLowerCase().includes("qwen"))
52
+ return 1;
53
+ return undefined;
54
+ }
55
+ providerOptions() {
46
56
  const modelConfig = this.modelMetadata;
47
57
  const thinkingLevel = calculateThinkingLevel(this.prompt);
48
58
  if (modelConfig.supportsReasoning && thinkingLevel.effort !== "none") {
@@ -23,3 +23,4 @@ export declare const anthropicModelRegistry: {
23
23
  [K in ModelName]: ModelMetadata<ModelName>;
24
24
  };
25
25
  export {};
26
+ //# sourceMappingURL=anthropic-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../source/models/anthropic-provider.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,QAAA,MAAM,eAAe;;;;;;;;CAuBX,CAAC;AAEX,KAAK,SAAS,GAAG,aAAa,MAAM,OAAO,eAAe,EAAE,CAAC;AAE7D,eAAO,MAAM,mBAAmB,EAAE,SAAS,EAE1C,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;CAK7B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE;KAClC,CAAC,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;CA6F3C,CAAC"}