@travisennis/acai 0.0.8 → 0.0.10

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 (386) hide show
  1. package/README.md +48 -729
  2. package/bin/acai +52 -0
  3. package/dist/agent/index.d.ts +12 -2
  4. package/dist/agent/index.d.ts.map +1 -1
  5. package/dist/agent/index.js +378 -168
  6. package/dist/agent/sub-agent.d.ts +23 -0
  7. package/dist/agent/sub-agent.d.ts.map +1 -0
  8. package/dist/agent/sub-agent.js +109 -0
  9. package/dist/cli/index.d.ts +26 -0
  10. package/dist/cli/index.d.ts.map +1 -0
  11. package/dist/{cli.js → cli/index.js} +84 -76
  12. package/dist/cli/stdin.d.ts +9 -0
  13. package/dist/cli/stdin.d.ts.map +1 -0
  14. package/dist/cli/stdin.js +37 -0
  15. package/dist/commands/copy/index.js +2 -2
  16. package/dist/commands/copy/utils.d.ts.map +1 -1
  17. package/dist/commands/copy/utils.js +15 -13
  18. package/dist/commands/generate-rules/index.d.ts +1 -1
  19. package/dist/commands/generate-rules/index.d.ts.map +1 -1
  20. package/dist/commands/generate-rules/index.js +16 -100
  21. package/dist/commands/generate-rules/service.d.ts +21 -0
  22. package/dist/commands/generate-rules/service.d.ts.map +1 -0
  23. package/dist/commands/generate-rules/service.js +103 -0
  24. package/dist/commands/handoff/index.js +2 -2
  25. package/dist/commands/health/index.js +1 -1
  26. package/dist/commands/health/utils.d.ts.map +1 -1
  27. package/dist/commands/health/utils.js +6 -0
  28. package/dist/commands/history/index.d.ts +1 -1
  29. package/dist/commands/history/index.d.ts.map +1 -1
  30. package/dist/commands/history/index.js +17 -18
  31. package/dist/commands/history/types.d.ts +38 -0
  32. package/dist/commands/history/types.d.ts.map +1 -1
  33. package/dist/commands/history/utils.d.ts.map +1 -1
  34. package/dist/commands/history/utils.js +63 -58
  35. package/dist/commands/init/index.d.ts.map +1 -1
  36. package/dist/commands/init/index.js +3 -8
  37. package/dist/commands/init-project/index.d.ts.map +1 -1
  38. package/dist/commands/init-project/index.js +3 -3
  39. package/dist/commands/init-project/utils.d.ts.map +1 -1
  40. package/dist/commands/init-project/utils.js +10 -2
  41. package/dist/commands/list-tools/index.d.ts.map +1 -1
  42. package/dist/commands/list-tools/index.js +7 -31
  43. package/dist/commands/manager.d.ts +2 -2
  44. package/dist/commands/manager.d.ts.map +1 -1
  45. package/dist/commands/manager.js +57 -33
  46. package/dist/commands/model/index.d.ts.map +1 -1
  47. package/dist/commands/model/index.js +20 -151
  48. package/dist/commands/model/model-panel.d.ts +4 -0
  49. package/dist/commands/model/model-panel.d.ts.map +1 -0
  50. package/dist/commands/model/model-panel.js +144 -0
  51. package/dist/commands/paste/index.d.ts.map +1 -1
  52. package/dist/commands/paste/index.js +59 -62
  53. package/dist/commands/paste/utils.d.ts.map +1 -1
  54. package/dist/commands/paste/utils.js +88 -58
  55. package/dist/commands/pickup/index.d.ts.map +1 -1
  56. package/dist/commands/pickup/index.js +6 -3
  57. package/dist/commands/pickup/utils.js +3 -3
  58. package/dist/commands/resources/index.d.ts.map +1 -1
  59. package/dist/commands/resources/index.js +33 -50
  60. package/dist/commands/review/index.d.ts.map +1 -1
  61. package/dist/commands/review/index.js +3 -117
  62. package/dist/commands/review/review-panel.d.ts +3 -0
  63. package/dist/commands/review/review-panel.d.ts.map +1 -0
  64. package/dist/commands/review/review-panel.js +186 -0
  65. package/dist/commands/review/utils.d.ts +9 -0
  66. package/dist/commands/review/utils.d.ts.map +1 -1
  67. package/dist/commands/review/utils.js +127 -68
  68. package/dist/commands/session/index.d.ts +1 -1
  69. package/dist/commands/session/index.d.ts.map +1 -1
  70. package/dist/commands/session/index.js +134 -112
  71. package/dist/commands/session/types.d.ts +7 -0
  72. package/dist/commands/session/types.d.ts.map +1 -1
  73. package/dist/commands/share/html-renderer.d.ts +25 -0
  74. package/dist/commands/share/html-renderer.d.ts.map +1 -0
  75. package/dist/commands/share/html-renderer.js +384 -0
  76. package/dist/commands/share/index.d.ts +3 -0
  77. package/dist/commands/share/index.d.ts.map +1 -0
  78. package/dist/commands/share/index.js +122 -0
  79. package/dist/commands/shell/index.d.ts.map +1 -1
  80. package/dist/commands/shell/index.js +16 -1
  81. package/dist/commands/types.d.ts +2 -2
  82. package/dist/commands/types.d.ts.map +1 -1
  83. package/dist/{config.d.ts → config/index.d.ts} +20 -9
  84. package/dist/config/index.d.ts.map +1 -0
  85. package/dist/{config.js → config/index.js} +43 -42
  86. package/dist/execution/index.d.ts.map +1 -1
  87. package/dist/execution/index.js +75 -55
  88. package/dist/index.d.ts +1 -0
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +170 -127
  91. package/dist/middleware/cache.d.ts.map +1 -1
  92. package/dist/middleware/cache.js +18 -36
  93. package/dist/models/ai-config.d.ts +1 -0
  94. package/dist/models/ai-config.d.ts.map +1 -1
  95. package/dist/models/ai-config.js +4 -3
  96. package/dist/models/anthropic-provider.d.ts +2 -5
  97. package/dist/models/anthropic-provider.d.ts.map +1 -1
  98. package/dist/models/anthropic-provider.js +3 -70
  99. package/dist/models/deepseek-provider.d.ts +1 -0
  100. package/dist/models/deepseek-provider.d.ts.map +1 -1
  101. package/dist/models/google-provider.d.ts +2 -3
  102. package/dist/models/google-provider.d.ts.map +1 -1
  103. package/dist/models/google-provider.js +0 -26
  104. package/dist/models/groq-provider.d.ts +1 -0
  105. package/dist/models/groq-provider.d.ts.map +1 -1
  106. package/dist/models/manager.d.ts +13 -2
  107. package/dist/models/manager.d.ts.map +1 -1
  108. package/dist/models/manager.js +20 -8
  109. package/dist/models/openai-provider.d.ts +5 -5
  110. package/dist/models/openai-provider.d.ts.map +1 -1
  111. package/dist/models/openai-provider.js +27 -40
  112. package/dist/models/opencode-zen-provider.d.ts +8 -3
  113. package/dist/models/opencode-zen-provider.d.ts.map +1 -1
  114. package/dist/models/opencode-zen-provider.js +68 -11
  115. package/dist/models/openrouter-provider.d.ts +24 -30
  116. package/dist/models/openrouter-provider.d.ts.map +1 -1
  117. package/dist/models/openrouter-provider.js +92 -177
  118. package/dist/models/providers.d.ts +1 -1
  119. package/dist/models/providers.d.ts.map +1 -1
  120. package/dist/models/xai-provider.d.ts +4 -3
  121. package/dist/models/xai-provider.d.ts.map +1 -1
  122. package/dist/models/xai-provider.js +18 -18
  123. package/dist/modes/manager.d.ts +23 -0
  124. package/dist/modes/manager.d.ts.map +1 -0
  125. package/dist/modes/manager.js +77 -0
  126. package/dist/modes/prompts.d.ts +2 -0
  127. package/dist/modes/prompts.d.ts.map +1 -0
  128. package/dist/modes/prompts.js +143 -0
  129. package/dist/prompts/mentions.d.ts +11 -0
  130. package/dist/prompts/mentions.d.ts.map +1 -0
  131. package/dist/{mentions.js → prompts/mentions.js} +21 -80
  132. package/dist/prompts/system-prompt.d.ts +26 -0
  133. package/dist/prompts/system-prompt.d.ts.map +1 -0
  134. package/dist/{prompts.js → prompts/system-prompt.js} +50 -22
  135. package/dist/repl/index.d.ts +174 -0
  136. package/dist/repl/index.d.ts.map +1 -0
  137. package/dist/{repl-new.js → repl/index.js} +399 -76
  138. package/dist/repl/project-status.d.ts +1 -0
  139. package/dist/repl/project-status.d.ts.map +1 -1
  140. package/dist/repl/project-status.js +4 -1
  141. package/dist/sessions/manager.d.ts +93 -1
  142. package/dist/sessions/manager.d.ts.map +1 -1
  143. package/dist/sessions/manager.js +264 -9
  144. package/dist/sessions/summary.d.ts +4 -0
  145. package/dist/sessions/summary.d.ts.map +1 -0
  146. package/dist/sessions/summary.js +30 -0
  147. package/dist/{skills.d.ts → skills/index.d.ts} +14 -2
  148. package/dist/skills/index.d.ts.map +1 -0
  149. package/dist/skills/index.js +294 -0
  150. package/dist/subagents/index.d.ts +15 -0
  151. package/dist/subagents/index.d.ts.map +1 -0
  152. package/dist/subagents/index.js +231 -0
  153. package/dist/terminal/control.d.ts +1 -1
  154. package/dist/terminal/control.d.ts.map +1 -1
  155. package/dist/terminal/control.js +30 -9
  156. package/dist/terminal/east-asian-width.d.ts.map +1 -1
  157. package/dist/terminal/east-asian-width.js +404 -351
  158. package/dist/terminal/keys.d.ts +17 -0
  159. package/dist/terminal/keys.d.ts.map +1 -1
  160. package/dist/terminal/keys.js +37 -0
  161. package/dist/terminal/select-prompt.d.ts.map +1 -1
  162. package/dist/terminal/select-prompt.js +24 -12
  163. package/dist/terminal/string-width.d.ts.map +1 -1
  164. package/dist/terminal/string-width.js +25 -27
  165. package/dist/terminal/style.d.ts.map +1 -1
  166. package/dist/terminal/style.js +4 -7
  167. package/dist/terminal/supports-color.d.ts.map +1 -1
  168. package/dist/terminal/supports-color.js +41 -27
  169. package/dist/terminal/table/cell.d.ts +12 -0
  170. package/dist/terminal/table/cell.d.ts.map +1 -1
  171. package/dist/terminal/table/cell.js +40 -25
  172. package/dist/terminal/table/layout-manager.d.ts.map +1 -1
  173. package/dist/terminal/table/layout-manager.js +100 -68
  174. package/dist/terminal/table/utils.d.ts.map +1 -1
  175. package/dist/terminal/table/utils.js +17 -10
  176. package/dist/terminal/wrap-ansi.d.ts.map +1 -1
  177. package/dist/terminal/wrap-ansi.js +172 -103
  178. package/dist/tokens/tracker.d.ts +1 -0
  179. package/dist/tokens/tracker.d.ts.map +1 -1
  180. package/dist/tokens/tracker.js +3 -0
  181. package/dist/tools/agent.d.ts +27 -0
  182. package/dist/tools/agent.d.ts.map +1 -0
  183. package/dist/tools/agent.js +81 -0
  184. package/dist/tools/bash.d.ts +4 -3
  185. package/dist/tools/bash.d.ts.map +1 -1
  186. package/dist/tools/bash.js +343 -121
  187. package/dist/tools/code-search.d.ts +41 -0
  188. package/dist/tools/code-search.d.ts.map +1 -0
  189. package/dist/tools/code-search.js +195 -0
  190. package/dist/tools/directory-tree.d.ts +3 -3
  191. package/dist/tools/directory-tree.d.ts.map +1 -1
  192. package/dist/tools/directory-tree.js +8 -5
  193. package/dist/tools/dynamic-tool-loader.d.ts +2 -5
  194. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  195. package/dist/tools/dynamic-tool-loader.js +20 -4
  196. package/dist/tools/edit-file.d.ts +7 -7
  197. package/dist/tools/edit-file.d.ts.map +1 -1
  198. package/dist/tools/edit-file.js +164 -66
  199. package/dist/tools/glob.d.ts +6 -6
  200. package/dist/tools/glob.d.ts.map +1 -1
  201. package/dist/tools/glob.js +95 -55
  202. package/dist/tools/grep.d.ts +15 -12
  203. package/dist/tools/grep.d.ts.map +1 -1
  204. package/dist/tools/grep.js +300 -192
  205. package/dist/tools/index.d.ts +143 -5
  206. package/dist/tools/index.d.ts.map +1 -1
  207. package/dist/tools/index.js +39 -24
  208. package/dist/tools/ls.d.ts +2 -2
  209. package/dist/tools/ls.d.ts.map +1 -1
  210. package/dist/tools/ls.js +7 -5
  211. package/dist/tools/read-file.d.ts +3 -3
  212. package/dist/tools/read-file.d.ts.map +1 -1
  213. package/dist/tools/read-file.js +74 -34
  214. package/dist/tools/save-file.d.ts +3 -3
  215. package/dist/tools/save-file.d.ts.map +1 -1
  216. package/dist/tools/save-file.js +11 -11
  217. package/dist/tools/skill.d.ts +23 -0
  218. package/dist/tools/skill.d.ts.map +1 -0
  219. package/dist/tools/skill.js +65 -0
  220. package/dist/tools/think.d.ts.map +1 -1
  221. package/dist/tools/think.js +2 -9
  222. package/dist/tools/utils.d.ts +2 -0
  223. package/dist/tools/utils.d.ts.map +1 -1
  224. package/dist/tools/utils.js +12 -0
  225. package/dist/tools/web-fetch.d.ts +62 -0
  226. package/dist/tools/web-fetch.d.ts.map +1 -0
  227. package/dist/tools/web-fetch.js +429 -0
  228. package/dist/tools/web-search.d.ts +62 -0
  229. package/dist/tools/web-search.d.ts.map +1 -0
  230. package/dist/tools/web-search.js +226 -0
  231. package/dist/tui/autocomplete/attachment-provider.d.ts +3 -6
  232. package/dist/tui/autocomplete/attachment-provider.d.ts.map +1 -1
  233. package/dist/tui/autocomplete/attachment-provider.js +25 -78
  234. package/dist/tui/autocomplete/base-provider.d.ts +1 -0
  235. package/dist/tui/autocomplete/base-provider.d.ts.map +1 -1
  236. package/dist/tui/autocomplete/combined-provider.d.ts +1 -4
  237. package/dist/tui/autocomplete/combined-provider.d.ts.map +1 -1
  238. package/dist/tui/autocomplete/combined-provider.js +3 -17
  239. package/dist/tui/autocomplete/command-provider.d.ts +1 -0
  240. package/dist/tui/autocomplete/command-provider.d.ts.map +1 -1
  241. package/dist/tui/autocomplete/command-provider.js +3 -0
  242. package/dist/tui/autocomplete/file-search-provider.d.ts +2 -1
  243. package/dist/tui/autocomplete/file-search-provider.d.ts.map +1 -1
  244. package/dist/tui/autocomplete/file-search-provider.js +36 -16
  245. package/dist/tui/autocomplete/skill-provider.d.ts +17 -0
  246. package/dist/tui/autocomplete/skill-provider.d.ts.map +1 -0
  247. package/dist/tui/autocomplete/skill-provider.js +49 -0
  248. package/dist/tui/autocomplete.d.ts +2 -2
  249. package/dist/tui/autocomplete.d.ts.map +1 -1
  250. package/dist/tui/autocomplete.js +3 -5
  251. package/dist/tui/components/assistant-message.d.ts.map +1 -1
  252. package/dist/tui/components/assistant-message.js +0 -4
  253. package/dist/tui/components/editor.d.ts +21 -2
  254. package/dist/tui/components/editor.d.ts.map +1 -1
  255. package/dist/tui/components/editor.js +228 -236
  256. package/dist/tui/components/footer.d.ts +6 -4
  257. package/dist/tui/components/footer.d.ts.map +1 -1
  258. package/dist/tui/components/footer.js +49 -25
  259. package/dist/tui/components/markdown.d.ts +8 -5
  260. package/dist/tui/components/markdown.d.ts.map +1 -1
  261. package/dist/tui/components/markdown.js +57 -39
  262. package/dist/tui/components/modal.d.ts.map +1 -1
  263. package/dist/tui/components/modal.js +35 -33
  264. package/dist/tui/components/notification.d.ts +13 -2
  265. package/dist/tui/components/notification.d.ts.map +1 -1
  266. package/dist/tui/components/notification.js +37 -2
  267. package/dist/tui/components/progress-bar.js +1 -1
  268. package/dist/tui/components/select-list.d.ts +1 -0
  269. package/dist/tui/components/select-list.d.ts.map +1 -1
  270. package/dist/tui/components/select-list.js +14 -11
  271. package/dist/tui/components/text.d.ts +16 -0
  272. package/dist/tui/components/text.d.ts.map +1 -1
  273. package/dist/tui/components/text.js +72 -57
  274. package/dist/tui/components/thinking-block.d.ts +9 -0
  275. package/dist/tui/components/thinking-block.d.ts.map +1 -1
  276. package/dist/tui/components/thinking-block.js +43 -11
  277. package/dist/tui/components/tool-execution.d.ts +5 -1
  278. package/dist/tui/components/tool-execution.d.ts.map +1 -1
  279. package/dist/tui/components/tool-execution.js +19 -10
  280. package/dist/tui/components/user-message.d.ts.map +1 -1
  281. package/dist/tui/components/user-message.js +0 -3
  282. package/dist/tui/components/welcome.js +2 -2
  283. package/dist/tui/editor-launcher.d.ts +13 -0
  284. package/dist/tui/editor-launcher.d.ts.map +1 -0
  285. package/dist/tui/editor-launcher.js +39 -0
  286. package/dist/tui/index.d.ts +3 -1
  287. package/dist/tui/index.d.ts.map +1 -1
  288. package/dist/tui/index.js +1 -0
  289. package/dist/tui/terminal.d.ts +27 -0
  290. package/dist/tui/terminal.d.ts.map +1 -1
  291. package/dist/tui/terminal.js +144 -15
  292. package/dist/tui/tui.d.ts +43 -0
  293. package/dist/tui/tui.d.ts.map +1 -1
  294. package/dist/tui/tui.js +172 -41
  295. package/dist/utils/bash/parse.d.ts +19 -0
  296. package/dist/utils/bash/parse.d.ts.map +1 -0
  297. package/dist/utils/bash/parse.js +223 -0
  298. package/dist/utils/bash/quote.d.ts +6 -0
  299. package/dist/utils/bash/quote.d.ts.map +1 -0
  300. package/dist/utils/bash/quote.js +23 -0
  301. package/dist/utils/bash.d.ts.map +1 -1
  302. package/dist/utils/bash.js +211 -126
  303. package/dist/utils/command-protection.d.ts +28 -0
  304. package/dist/utils/command-protection.d.ts.map +1 -0
  305. package/dist/utils/command-protection.js +324 -0
  306. package/dist/utils/dedent.d.ts.map +1 -0
  307. package/dist/utils/env-expand.d.ts +2 -0
  308. package/dist/utils/env-expand.d.ts.map +1 -0
  309. package/dist/utils/env-expand.js +8 -0
  310. package/dist/utils/filesystem/path-display.d.ts +11 -0
  311. package/dist/utils/filesystem/path-display.d.ts.map +1 -0
  312. package/dist/utils/filesystem/path-display.js +32 -0
  313. package/dist/utils/filesystem/security.d.ts +2 -2
  314. package/dist/utils/filesystem/security.d.ts.map +1 -1
  315. package/dist/utils/filesystem/security.js +32 -31
  316. package/dist/utils/formatting.d.ts.map +1 -0
  317. package/dist/{formatting.js → utils/formatting.js} +1 -1
  318. package/dist/utils/git.d.ts +4 -0
  319. package/dist/utils/git.d.ts.map +1 -1
  320. package/dist/utils/git.js +30 -0
  321. package/dist/utils/glob.d.ts +1 -1
  322. package/dist/utils/glob.d.ts.map +1 -1
  323. package/dist/utils/logger.d.ts.map +1 -0
  324. package/dist/{logger.js → utils/logger.js} +1 -1
  325. package/dist/utils/parsing.d.ts.map +1 -0
  326. package/dist/utils/process.d.ts.map +1 -1
  327. package/dist/utils/process.js +90 -37
  328. package/dist/utils/templates.d.ts +2 -0
  329. package/dist/utils/templates.d.ts.map +1 -0
  330. package/dist/utils/templates.js +24 -0
  331. package/dist/utils/version.d.ts.map +1 -0
  332. package/dist/{version.js → utils/version.js} +1 -1
  333. package/package.json +34 -25
  334. package/dist/cli.d.ts +0 -23
  335. package/dist/cli.d.ts.map +0 -1
  336. package/dist/commands/exit/index.d.ts +0 -10
  337. package/dist/commands/exit/index.d.ts.map +0 -1
  338. package/dist/commands/exit/index.js +0 -21
  339. package/dist/commands/exit/types.d.ts +0 -8
  340. package/dist/commands/exit/types.d.ts.map +0 -1
  341. package/dist/commands/exit/types.js +0 -1
  342. package/dist/commands/exit/utils.d.ts +0 -2
  343. package/dist/commands/exit/utils.d.ts.map +0 -1
  344. package/dist/commands/exit/utils.js +0 -13
  345. package/dist/commands/prompt/index.d.ts +0 -5
  346. package/dist/commands/prompt/index.d.ts.map +0 -1
  347. package/dist/commands/prompt/index.js +0 -126
  348. package/dist/commands/prompt/types.d.ts +0 -15
  349. package/dist/commands/prompt/types.d.ts.map +0 -1
  350. package/dist/commands/prompt/types.js +0 -1
  351. package/dist/commands/prompt/utils.d.ts +0 -12
  352. package/dist/commands/prompt/utils.d.ts.map +0 -1
  353. package/dist/commands/prompt/utils.js +0 -107
  354. package/dist/commands/reset/index.d.ts +0 -3
  355. package/dist/commands/reset/index.d.ts.map +0 -1
  356. package/dist/commands/reset/index.js +0 -25
  357. package/dist/commands/reset/types.d.ts +0 -1
  358. package/dist/commands/reset/types.d.ts.map +0 -1
  359. package/dist/commands/reset/types.js +0 -3
  360. package/dist/commands/save/index.d.ts +0 -3
  361. package/dist/commands/save/index.d.ts.map +0 -1
  362. package/dist/commands/save/index.js +0 -19
  363. package/dist/config.d.ts.map +0 -1
  364. package/dist/dedent.d.ts.map +0 -1
  365. package/dist/formatting.d.ts.map +0 -1
  366. package/dist/logger.d.ts.map +0 -1
  367. package/dist/mentions.d.ts +0 -14
  368. package/dist/mentions.d.ts.map +0 -1
  369. package/dist/parsing.d.ts.map +0 -1
  370. package/dist/prompts.d.ts +0 -10
  371. package/dist/prompts.d.ts.map +0 -1
  372. package/dist/repl-new.d.ts +0 -62
  373. package/dist/repl-new.d.ts.map +0 -1
  374. package/dist/skills.d.ts.map +0 -1
  375. package/dist/skills.js +0 -233
  376. package/dist/tui/autocomplete/path-provider.d.ts +0 -21
  377. package/dist/tui/autocomplete/path-provider.d.ts.map +0 -1
  378. package/dist/tui/autocomplete/path-provider.js +0 -164
  379. package/dist/version.d.ts.map +0 -1
  380. /package/dist/{dedent.d.ts → utils/dedent.d.ts} +0 -0
  381. /package/dist/{dedent.js → utils/dedent.js} +0 -0
  382. /package/dist/{formatting.d.ts → utils/formatting.d.ts} +0 -0
  383. /package/dist/{logger.d.ts → utils/logger.d.ts} +0 -0
  384. /package/dist/{parsing.d.ts → utils/parsing.d.ts} +0 -0
  385. /package/dist/{parsing.js → utils/parsing.js} +0 -0
  386. /package/dist/{version.d.ts → utils/version.d.ts} +0 -0
package/dist/index.js CHANGED
@@ -2,36 +2,40 @@
2
2
  import { mkdirSync } from "node:fs";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
- import { text } from "node:stream/consumers";
6
5
  import { parseArgs } from "node:util";
7
6
  import { asyncTry, isFailure, syncTry } from "@travisennis/stdlib/try";
8
7
  import { isDefined } from "@travisennis/stdlib/typeguards";
9
8
  import { Agent } from "./agent/index.js";
10
- import { Cli } from "./cli.js";
9
+ import { Cli } from "./cli/index.js";
10
+ import { readStdinWithLimits } from "./cli/stdin.js";
11
11
  import { CommandManager } from "./commands/manager.js";
12
- import { config, } from "./config.js";
13
- import { logger } from "./logger.js";
14
- import { PromptError, processPrompt } from "./mentions.js";
12
+ import { config } from "./config/index.js";
15
13
  import { ModelManager } from "./models/manager.js";
16
14
  import { isSupportedModel } from "./models/providers.js";
17
15
  import { PromptManager } from "./prompts/manager.js";
18
- import { systemPrompt } from "./prompts.js";
19
- import { NewRepl } from "./repl-new.js";
16
+ import { processPrompt } from "./prompts/mentions.js";
17
+ import { systemPrompt } from "./prompts/system-prompt.js";
18
+ import { Repl } from "./repl/index.js";
20
19
  import { SessionManager } from "./sessions/manager.js";
20
+ import { writeExitSummary } from "./sessions/summary.js";
21
21
  import { setTerminalTitle } from "./terminal/control.js";
22
22
  import { select } from "./terminal/select-prompt.js";
23
23
  import { TokenCounter } from "./tokens/counter.js";
24
24
  import { TokenTracker } from "./tokens/tracker.js";
25
25
  import { initTools } from "./tools/index.js";
26
- import { getPackageVersion } from "./version.js";
26
+ import { logger } from "./utils/logger.js";
27
+ import { getPackageVersion } from "./utils/version.js";
27
28
  // Create workspace context from CLI arguments
28
29
  export function createWorkspaceContext(addDirArgs = []) {
29
30
  const primaryDir = process.cwd();
30
31
  mkdirSync("/tmp/acai", { recursive: true });
31
32
  const allowedDirs = [
32
33
  primaryDir,
34
+ "/tmp",
33
35
  "/tmp/acai",
36
+ "/var/folders",
34
37
  path.join(os.homedir(), ".acai"),
38
+ path.join(os.homedir(), ".agents"),
35
39
  ...addDirArgs,
36
40
  ];
37
41
  // Remove duplicates while preserving order
@@ -52,7 +56,7 @@ Options
52
56
  --resume Resume a specific session by ID, or most recent if no ID given
53
57
  --add-dir Add additional working directory (can be used multiple times)
54
58
  --no-skills Disable skills discovery and loading
55
-
59
+ --no-session Don't save session to disk
56
60
 
57
61
  --help, -h Show help
58
62
  --version, -v Show version
@@ -73,6 +77,7 @@ const parsed = syncTry(() => parseArgs({
73
77
  resume: { type: "boolean", default: false },
74
78
  "add-dir": { type: "string", multiple: true },
75
79
  "no-skills": { type: "boolean", default: false },
80
+ "no-session": { type: "boolean", default: false },
76
81
  help: { type: "boolean", short: "h" },
77
82
  version: { type: "boolean", short: "v" },
78
83
  },
@@ -96,49 +101,42 @@ export function handleError(error) {
96
101
  logger.error({ error: error }, error.message);
97
102
  }
98
103
  // Configuration constants
99
- const DEFAULT_HISTORY_LIMIT = 10;
100
- const CONTINUE_HISTORY_LIMIT = 1;
104
+ const DEFAULT_HISTORY_LIMIT = 20; // the amount of sessions to retrieve from session history
101
105
  // Helper functions for main()
102
- async function initializeAppState(appConfig, initialPromptInput, stdInPrompt, hasContinueOrResume, resumeSessionId) {
106
+ async function initializeAppState(appConfig, initialPromptInput, stdinContent, hasContinueOrResume, resumeSessionId) {
103
107
  const appDir = config.app;
104
108
  // Parallelize independent async operations
105
- const [messageHistoryDir, modelManager] = await Promise.all([
106
- appDir.ensurePath("message-history"),
109
+ const [sessionsDir, modelManager] = await Promise.all([
110
+ appDir.ensurePath("sessions"),
107
111
  initializeModelManager(appDir),
108
112
  ]);
109
113
  // Initialize synchronous components
110
114
  const tokenTracker = new TokenTracker();
111
115
  const tokenCounter = new TokenCounter();
112
116
  // Initialize dependent components
113
- const sessionManager = await initializeSessionManager(messageHistoryDir, modelManager, tokenTracker);
117
+ const sessionManager = await initializeSessionManager(sessionsDir, modelManager, tokenTracker);
114
118
  // Handle conversation history loading
115
- await handleConversationHistory(sessionManager, messageHistoryDir, hasContinueOrResume, resumeSessionId);
119
+ await handleConversationHistory(sessionManager, sessionsDir, hasContinueOrResume, resumeSessionId);
116
120
  // Setup prompt manager
117
121
  const promptManager = new PromptManager(tokenCounter);
118
122
  if (!hasContinueOrResume && isDefined(initialPromptInput)) {
119
- try {
120
- const modelConfig = modelManager.getModelMetadata("repl");
121
- const processedPrompt = await processPrompt(initialPromptInput, {
122
- baseDir: process.cwd(),
123
- model: modelConfig,
124
- });
125
- for (const context of processedPrompt.context) {
126
- promptManager.addContext(context);
127
- }
128
- promptManager.set(processedPrompt.message);
129
- }
130
- catch (error) {
131
- if (error instanceof PromptError) {
132
- logger.error(`Prompt mention error: ${error.message}`);
133
- promptManager.set(initialPromptInput);
134
- }
135
- else {
136
- throw new Error("Failed to process prompt.", { cause: error });
137
- }
123
+ const modelConfig = modelManager.getModelMetadata("repl");
124
+ const processedPrompt = await processPrompt(initialPromptInput, {
125
+ baseDir: process.cwd(),
126
+ model: modelConfig,
127
+ });
128
+ for (const context of processedPrompt.context) {
129
+ promptManager.addContext(context);
138
130
  }
131
+ promptManager.set(processedPrompt.message);
139
132
  }
140
- if (stdInPrompt) {
141
- promptManager.addContext(stdInPrompt);
133
+ if (stdinContent && stdinContent.trim().length > 0) {
134
+ if (isDefined(initialPromptInput)) {
135
+ promptManager.addContext(stdinContent);
136
+ }
137
+ else {
138
+ promptManager.set(stdinContent);
139
+ }
142
140
  }
143
141
  const promptHistory = [];
144
142
  const commands = new CommandManager({
@@ -195,17 +193,14 @@ function validateCliArguments() {
195
193
  async function determineInitialPrompt() {
196
194
  const hasContinueOrResume = flags.continue === true || flags.resume === true;
197
195
  const positionalPrompt = input.at(0);
198
- let stdInPrompt;
199
- // Check if there's data available on stdin
200
- if (!process.stdin.isTTY) {
201
- try {
202
- stdInPrompt = await text(process.stdin);
203
- }
204
- catch (error) {
205
- console.error(`Error reading stdin: ${error.message}`);
206
- }
196
+ const { content: stdinContent, wasPiped } = await readStdinWithLimits();
197
+ if (wasPiped &&
198
+ (!stdinContent || stdinContent.trim().length === 0) &&
199
+ !flags.prompt &&
200
+ !positionalPrompt) {
201
+ console.error("No input provided via stdin.");
202
+ process.exit(0);
207
203
  }
208
- // Check for session ID with --resume
209
204
  const resumeSessionId = flags.resume === true && input.length > 0 ? input[0] : undefined;
210
205
  const initialPromptInput = typeof flags.prompt === "string" && flags.prompt.length > 0
211
206
  ? flags.prompt
@@ -218,7 +213,7 @@ async function determineInitialPrompt() {
218
213
  }
219
214
  return {
220
215
  initialPromptInput,
221
- stdInPrompt,
216
+ stdinContent,
222
217
  hasContinueOrResume,
223
218
  resumeSessionId,
224
219
  };
@@ -226,41 +221,42 @@ async function determineInitialPrompt() {
226
221
  async function initializeModelManager(appDir) {
227
222
  const chosenModel = isSupportedModel(flags.model)
228
223
  ? flags.model
229
- : "opencode:minimax-m2-1";
224
+ : "opencode:minimax-m2.5-free";
225
+ const projectConfig = await config.getConfig();
226
+ const devtoolsEnabled = projectConfig.devtools?.enabled ?? false;
230
227
  const modelManager = new ModelManager({
231
228
  stateDir: await appDir.ensurePath("audit"),
229
+ devtoolsEnabled,
232
230
  });
233
231
  modelManager.setModel("repl", chosenModel);
234
232
  modelManager.setModel("cli", chosenModel);
235
233
  modelManager.setModel("title-conversation", chosenModel);
236
234
  modelManager.setModel("conversation-summarizer", chosenModel);
237
- modelManager.setModel("tool-repair", chosenModel);
235
+ modelManager.setModel("tool-repair", "openai:gpt-5.1-codex-mini");
238
236
  modelManager.setModel("conversation-analyzer", chosenModel);
239
237
  modelManager.setModel("init-project", chosenModel);
240
- modelManager.setModel("task-agent", chosenModel);
241
238
  modelManager.setModel("handoff-agent", chosenModel);
242
- modelManager.setModel("edit-fix", chosenModel);
243
239
  return modelManager;
244
240
  }
245
- async function initializeSessionManager(messageHistoryDir, modelManager, tokenTracker) {
246
- const messageHistory = new SessionManager({
247
- stateDir: messageHistoryDir,
241
+ async function initializeSessionManager(sessionsDir, modelManager, tokenTracker) {
242
+ const sessionManager = new SessionManager({
243
+ stateDir: sessionsDir,
248
244
  modelManager,
249
245
  tokenTracker,
250
246
  });
251
- messageHistory.on("update-title", (title) => setTerminalTitle(title));
247
+ sessionManager.on("update-title", (title) => setTerminalTitle(title));
252
248
  // Listen for model changes and update session manager when repl model changes
253
249
  modelManager.on("set-model", (app, _model) => {
254
250
  if (app === "repl") {
255
251
  const modelId = modelManager.getModel("repl").modelId;
256
- messageHistory.setModelId(modelId);
252
+ sessionManager.setModelId(modelId);
257
253
  }
258
254
  });
259
- return messageHistory;
255
+ return sessionManager;
260
256
  }
261
- async function handleConversationHistory(messageHistory, messageHistoryDir, _hasContinueOrResume, resumeSessionId) {
257
+ async function handleConversationHistory(sessionManager, sessionsDir, _hasContinueOrResume, resumeSessionId) {
262
258
  if (flags.continue === true) {
263
- const histories = await SessionManager.load(messageHistoryDir, DEFAULT_HISTORY_LIMIT);
259
+ const histories = await SessionManager.load(sessionsDir, DEFAULT_HISTORY_LIMIT);
264
260
  if (histories.length > 0) {
265
261
  try {
266
262
  const choice = await select({
@@ -273,7 +269,7 @@ async function handleConversationHistory(messageHistory, messageHistoryDir, _has
273
269
  });
274
270
  const selectedHistory = histories.at(choice);
275
271
  if (selectedHistory) {
276
- messageHistory.restore(selectedHistory);
272
+ sessionManager.restore(selectedHistory);
277
273
  logger.info(`Resuming conversation: ${selectedHistory.title}`);
278
274
  setTerminalTitle(selectedHistory.title || `acai: ${process.cwd()}`);
279
275
  }
@@ -298,10 +294,10 @@ async function handleConversationHistory(messageHistory, messageHistoryDir, _has
298
294
  }
299
295
  else if (flags.resume === true) {
300
296
  if (resumeSessionId) {
301
- const histories = await SessionManager.load(messageHistoryDir, DEFAULT_HISTORY_LIMIT);
297
+ const histories = await SessionManager.load(sessionsDir, DEFAULT_HISTORY_LIMIT);
302
298
  const targetHistory = histories.find((h) => h.sessionId === resumeSessionId);
303
299
  if (targetHistory) {
304
- messageHistory.restore(targetHistory);
300
+ sessionManager.restore(targetHistory);
305
301
  logger.info(`Resuming conversation: ${targetHistory.title}`);
306
302
  setTerminalTitle(targetHistory.title || `acai: ${process.cwd()}`);
307
303
  }
@@ -311,10 +307,10 @@ async function handleConversationHistory(messageHistory, messageHistoryDir, _has
311
307
  }
312
308
  }
313
309
  else {
314
- const histories = await SessionManager.load(messageHistoryDir, CONTINUE_HISTORY_LIMIT);
310
+ const histories = await SessionManager.load(sessionsDir, 1); // read the most recent session
315
311
  const latestHistory = histories.at(0);
316
312
  if (latestHistory) {
317
- messageHistory.restore(latestHistory);
313
+ sessionManager.restore(latestHistory);
318
314
  console.info(`Resuming conversation: ${latestHistory.title}`);
319
315
  setTerminalTitle(latestHistory.title || `acai: ${process.cwd()}`);
320
316
  }
@@ -324,99 +320,134 @@ async function handleConversationHistory(messageHistory, messageHistoryDir, _has
324
320
  }
325
321
  }
326
322
  }
327
- async function runCliMode(state) {
328
- const skillsEnabled = !flags["no-skills"] && (await config.getSkillsEnabled());
323
+ async function runCliMode(state, noSession) {
329
324
  const cliProcess = new Cli({
330
325
  promptManager: state.promptManager,
331
- messageHistory: state.sessionManager,
326
+ sessionManager: state.sessionManager,
332
327
  modelManager: state.modelManager,
333
328
  tokenTracker: state.tokenTracker,
334
329
  tokenCounter: state.tokenCounter,
335
330
  workspace,
336
- skillsEnabled,
331
+ noSession,
337
332
  });
338
333
  (await asyncTry(cliProcess.run())).recover(handleError);
339
334
  }
340
- async function runReplMode(state) {
341
- // Initialize tools before creating REPL (needed for session reload reconstruction)
342
- const tools = await initTools({
343
- workspace,
344
- });
345
- const agent = new Agent({
346
- sessionManager: state.sessionManager,
347
- modelManager: state.modelManager,
348
- tokenTracker: state.tokenTracker,
349
- });
350
- const repl = new NewRepl({
351
- agent,
352
- promptManager: state.promptManager,
353
- config: state.appConfig,
354
- messageHistory: state.sessionManager,
355
- modelManager: state.modelManager,
356
- tokenTracker: state.tokenTracker,
357
- commands: state.commands,
358
- tokenCounter: state.tokenCounter,
359
- promptHistory: state.promptHistory,
360
- workspace,
361
- tools,
362
- });
363
- // Initialize TUI
364
- await repl.init();
365
- // Reconstruct session display if there are existing messages
366
- if (!state.sessionManager.isEmpty()) {
367
- await repl.rerender();
368
- }
369
- state.sessionManager.on("clear-history", () => {
335
+ function setupReplEventHandlers(repl, agent, sessionManager, noSession) {
336
+ sessionManager.on("clear-history", async () => {
370
337
  logger.info("Resetting agent state.");
371
338
  agent.resetState();
339
+ agent.setConfig(await config.getConfig());
372
340
  void repl.rerender();
373
341
  });
374
- // Set interrupt callback
375
342
  repl.setInterruptCallback(async () => {
376
- try {
377
- await state.sessionManager.save();
378
- }
379
- catch (error) {
380
- // Log but don't throw - we still want to abort the agent
381
- logger.warn({ error }, "Failed to save message history on interrupt");
343
+ if (!noSession) {
344
+ try {
345
+ await sessionManager.save();
346
+ }
347
+ catch (error) {
348
+ logger.warn({ error }, "Failed to save message history on interrupt");
349
+ }
382
350
  }
383
351
  agent.abort();
384
352
  });
385
- // Set exit callback
386
- repl.setExitCallback((sessionId) => {
387
- if (!state.sessionManager.isEmpty()) {
388
- console.info(`\nTo resume this session call acai --resume ${sessionId}`);
353
+ repl.setExitCallback(async (_sessionId) => {
354
+ if (!sessionManager.isEmpty()) {
355
+ await repl.triggerRuleGeneration();
356
+ writeExitSummary(sessionManager, noSession);
389
357
  }
390
358
  });
391
- // Interactive loop
359
+ }
360
+ async function handleStdinPrompt(state, agent, repl, tools, activeTools, systemPromptResult, noSession) {
361
+ if (!state.promptManager.isPending()) {
362
+ return false;
363
+ }
364
+ try {
365
+ const promptText = state.promptManager.get();
366
+ const userMessage = state.promptManager.getUserMessage();
367
+ state.sessionManager.appendUserMessage(userMessage);
368
+ const results = agent.run({
369
+ systemPrompt: systemPromptResult.prompt,
370
+ input: promptText,
371
+ tools,
372
+ activeTools,
373
+ abortSignal: agent.abortSignal,
374
+ maxIterations: state.appConfig.loop.maxIterations,
375
+ });
376
+ for await (const result of results) {
377
+ await repl.handle(result, agent.state);
378
+ }
379
+ if (!noSession) {
380
+ await state.sessionManager.save();
381
+ }
382
+ return true;
383
+ }
384
+ catch {
385
+ return false;
386
+ }
387
+ }
388
+ async function runInteractiveLoop(repl, agent, tools, activeTools, systemPromptResult, noSession, sessionManager, maxIterations) {
392
389
  while (true) {
393
390
  const userInput = await repl.getUserInput();
394
- const projectConfig = await config.getConfig();
395
- const activeTools = projectConfig.tools.activeTools;
396
- const skillsEnabled = !flags["no-skills"] && (projectConfig.skills?.enabled ?? true);
397
391
  try {
398
392
  const results = agent.run({
399
- systemPrompt: await systemPrompt({
400
- activeTools,
401
- allowedDirs: workspace.allowedDirs,
402
- skillsEnabled,
403
- }),
393
+ systemPrompt: systemPromptResult.prompt,
404
394
  input: userInput,
405
395
  tools,
406
396
  activeTools,
407
397
  abortSignal: agent.abortSignal,
398
+ maxIterations,
408
399
  });
409
400
  for await (const result of results) {
410
401
  await repl.handle(result, agent.state);
411
402
  }
412
- await state.sessionManager.save();
403
+ if (!noSession) {
404
+ await sessionManager.save();
405
+ }
413
406
  }
414
- catch (_error) {
415
- // Display error in the TUI by adding an error message to the chat
416
- // repl.showError((error as Error).message || "Unknown error occurred");
407
+ catch {
408
+ // Error displayed in the TUI
417
409
  }
418
410
  }
419
411
  }
412
+ async function runReplMode(state, stdinWasPiped, noSession) {
413
+ const tools = await initTools({ workspace });
414
+ const agent = new Agent({
415
+ config: state.appConfig,
416
+ sessionManager: state.sessionManager,
417
+ modelManager: state.modelManager,
418
+ tokenTracker: state.tokenTracker,
419
+ });
420
+ const repl = new Repl({
421
+ agent,
422
+ promptManager: state.promptManager,
423
+ configManager: config,
424
+ sessionManager: state.sessionManager,
425
+ modelManager: state.modelManager,
426
+ tokenTracker: state.tokenTracker,
427
+ commands: state.commands,
428
+ tokenCounter: state.tokenCounter,
429
+ promptHistory: state.promptHistory,
430
+ workspace,
431
+ tools,
432
+ terminalOptions: { useTty: stdinWasPiped },
433
+ noSession,
434
+ });
435
+ await repl.init();
436
+ if (!state.sessionManager.isEmpty()) {
437
+ await repl.rerender();
438
+ }
439
+ setupReplEventHandlers(repl, agent, state.sessionManager, noSession);
440
+ const activeTools = state.appConfig.tools.activeTools;
441
+ const skillsEnabled = !flags["no-skills"] && (state.appConfig.skills?.enabled ?? true);
442
+ const systemPromptResult = await systemPrompt({
443
+ activeTools,
444
+ allowedDirs: workspace.allowedDirs,
445
+ logsPath: state.appConfig.logs?.path,
446
+ skillsEnabled,
447
+ });
448
+ await handleStdinPrompt(state, agent, repl, tools, activeTools, systemPromptResult, noSession);
449
+ await runInteractiveLoop(repl, agent, tools, activeTools, systemPromptResult, noSession, state.sessionManager, state.appConfig.loop.maxIterations);
450
+ }
420
451
  async function main() {
421
452
  try {
422
453
  const appConfig = await config.ensureDefaultConfig("acai");
@@ -428,17 +459,29 @@ async function main() {
428
459
  // Validate CLI arguments
429
460
  validateCliArguments();
430
461
  // Determine initial prompt
431
- const { initialPromptInput, stdInPrompt, hasContinueOrResume, resumeSessionId, } = await determineInitialPrompt();
462
+ const { initialPromptInput, stdinContent, hasContinueOrResume, resumeSessionId, } = await determineInitialPrompt();
432
463
  // Initialize application state
433
- const state = await initializeAppState(appConfig, initialPromptInput, stdInPrompt, hasContinueOrResume, resumeSessionId);
464
+ const state = await initializeAppState(appConfig, initialPromptInput, stdinContent, hasContinueOrResume, resumeSessionId);
465
+ // Add logs directory to allowed directories if configured
466
+ const logsPath = (await config.getConfig()).logs?.path;
467
+ if (logsPath) {
468
+ // Expand ~ to home directory before resolving
469
+ const expandedLogsPath = logsPath.startsWith("~/") || logsPath === "~"
470
+ ? path.join(os.homedir(), logsPath.slice(1))
471
+ : logsPath;
472
+ const logsDir = path.dirname(path.resolve(expandedLogsPath));
473
+ if (!workspace.allowedDirs.includes(logsDir)) {
474
+ workspace.allowedDirs.push(logsDir);
475
+ }
476
+ }
434
477
  // Set terminal title after all validation is complete
435
478
  setTerminalTitle(`acai: ${workspace.primaryDir}`);
436
479
  // Handle CLI mode if initial prompt provided
437
480
  if (isDefined(initialPromptInput)) {
438
- return await runCliMode(state);
481
+ return await runCliMode(state, flags["no-session"] === true);
439
482
  }
440
483
  // Setup REPL mode
441
- return await runReplMode(state);
484
+ return await runReplMode(state, stdinContent !== null, flags["no-session"] === true);
442
485
  }
443
486
  catch (error) {
444
487
  handleError(error);
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../source/middleware/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,yBAAyB,EAE1B,MAAM,kBAAkB,CAAC;AA+F1B,eAAO,MAAM,eAAe,EAAE,yBAqF7B,CAAC"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../source/middleware/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,yBAAyB,EAE1B,MAAM,kBAAkB,CAAC;AAyE1B,eAAO,MAAM,eAAe,EAAE,yBA+E7B,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import { logger } from "../logger.js";
2
+ import { logger } from "../utils/logger.js";
3
3
  function applyCaching(input, options = {}) {
4
4
  const { ttl } = options;
5
5
  input.providerOptions = {
@@ -27,53 +27,37 @@ function generateCacheKey(text, salt) {
27
27
  function estimateTokens(text) {
28
28
  return Math.ceil(text.length / 4);
29
29
  }
30
- function getMinTokenThreshold(provider, modelId) {
31
- if (provider === "anthropic") {
32
- if (modelId?.includes("haiku"))
33
- return 2048;
34
- if (modelId?.includes("opus"))
35
- return 1024;
36
- return 1024; // Default for Claude models
37
- }
38
- return 1024; // Default threshold
30
+ function getMinTokenThreshold(modelId) {
31
+ if (modelId?.includes("haiku"))
32
+ return 4096;
33
+ if (modelId?.includes("opus"))
34
+ return 4096;
35
+ if (modelId?.includes("sonnet"))
36
+ return 1024;
37
+ return 1024;
39
38
  }
40
- function isEligibleForCaching(text, provider, modelId) {
39
+ function isEligibleForCaching(text, modelId) {
41
40
  const tokenCount = estimateTokens(text);
42
- const minThreshold = getMinTokenThreshold(provider, modelId);
41
+ const minThreshold = getMinTokenThreshold(modelId ?? "");
43
42
  if (tokenCount < minThreshold) {
44
- logger.info(`[Cache] Ineligible: ${tokenCount} tokens < ${minThreshold} threshold`);
45
43
  return false;
46
44
  }
47
45
  return true;
48
46
  }
49
- function detectProvider(providerId, modelId) {
50
- if (providerId === "anthropic" ||
51
- modelId.includes("anthropic") ||
52
- modelId.includes("claude")) {
47
+ function detectProvider(modelId) {
48
+ if (modelId.includes("sonnet") ||
49
+ modelId.includes("opus") ||
50
+ modelId.includes("haiku")) {
53
51
  return "anthropic";
54
52
  }
55
- if (providerId === "openai" || modelId.includes("gpt-")) {
56
- return "openai";
57
- }
58
- if (providerId === "bedrock" ||
59
- modelId.includes("bedrock") ||
60
- modelId.includes("amazon")) {
61
- return "bedrock";
62
- }
63
- if (modelId.includes("openrouter")) {
64
- return "openrouter";
65
- }
66
53
  return "unknown";
67
54
  }
68
55
  export const cacheMiddleware = {
69
56
  specificationVersion: "v3",
70
57
  transformParams: async ({ params, model }) => {
71
- const providerId = model.provider;
72
58
  const modelId = model.modelId;
73
- const provider = detectProvider(providerId, modelId);
74
- logger.info(`[Cache] Detected provider: ${provider}, model: ${modelId}`);
59
+ const provider = detectProvider(modelId);
75
60
  if (provider === "unknown") {
76
- logger.info("[Cache] Unknown provider, skipping caching");
77
61
  return params;
78
62
  }
79
63
  const msgs = params.prompt;
@@ -89,14 +73,12 @@ export const cacheMiddleware = {
89
73
  : "")
90
74
  .join("\n");
91
75
  // Check if system prompt is eligible for caching
92
- const isEligible = isEligibleForCaching(systemText, provider, modelId);
76
+ const isEligible = isEligibleForCaching(systemText, modelId);
93
77
  if (!isEligible) {
94
- logger.info("[Cache] System prompt not eligible for caching");
95
78
  return params;
96
79
  }
97
80
  // Generate deterministic cache key
98
81
  const cacheKey = generateCacheKey(systemText, provider);
99
- logger.info(`[Cache] Generated cache key: ${cacheKey.substring(0, 8)}...`);
100
82
  // Apply caching to system messages
101
83
  for (const systemMsg of systemMessages) {
102
84
  applyCaching(systemMsg, { ttl: "1h" });
@@ -128,7 +110,7 @@ export const cacheMiddleware = {
128
110
  provider,
129
111
  eligible: isEligible,
130
112
  systemTokens: estimateTokens(systemText),
131
- threshold: getMinTokenThreshold(provider, modelId),
113
+ threshold: getMinTokenThreshold(modelId),
132
114
  timestamp: Date.now(),
133
115
  };
134
116
  logger.info(`[Cache] Applied caching for ${provider} model`);
@@ -3,6 +3,7 @@ import type { ModelMetadata } from "./providers.ts";
3
3
  export declare class AiConfig {
4
4
  private modelMetadata;
5
5
  private prompt;
6
+ private thinkingLevel;
6
7
  constructor({ modelMetadata, prompt, }: {
7
8
  modelMetadata: ModelMetadata;
8
9
  prompt: string;
@@ -1 +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;CA+D5C"}
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;IACvB,OAAO,CAAC,aAAa,CAA0C;gBAEnD,EACV,aAAa,EACb,MAAM,GACP,EAAE;QAAE,aAAa,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAMnD,eAAe;IASf,WAAW;IAKX,IAAI;IAMJ,eAAe,IAAI,wBAAwB;CA+D5C"}
@@ -30,15 +30,16 @@ function calculateThinkingLevel(userInput) {
30
30
  export class AiConfig {
31
31
  modelMetadata;
32
32
  prompt;
33
+ thinkingLevel;
33
34
  constructor({ modelMetadata, prompt, }) {
34
35
  this.modelMetadata = modelMetadata;
35
36
  this.prompt = prompt;
37
+ this.thinkingLevel = calculateThinkingLevel(this.prompt);
36
38
  }
37
39
  maxOutputTokens() {
38
40
  const modelConfig = this.modelMetadata;
39
- const thinkingLevel = calculateThinkingLevel(this.prompt);
40
41
  const maxTokens = modelConfig.provider === "anthropic" && modelConfig.supportsReasoning
41
- ? modelConfig.maxOutputTokens - thinkingLevel.tokenBudget
42
+ ? modelConfig.maxOutputTokens - this.thinkingLevel.tokenBudget
42
43
  : modelConfig.maxOutputTokens;
43
44
  return modelConfig.provider === "opencode" ? 8000 : maxTokens;
44
45
  }
@@ -54,7 +55,7 @@ export class AiConfig {
54
55
  }
55
56
  providerOptions() {
56
57
  const modelConfig = this.modelMetadata;
57
- const thinkingLevel = calculateThinkingLevel(this.prompt);
58
+ const thinkingLevel = this.thinkingLevel;
58
59
  const meta = {
59
60
  [modelConfig.provider]: {},
60
61
  };
@@ -2,22 +2,19 @@ import type { ModelMetadata } from "./providers.ts";
2
2
  declare const anthropicModels: {
3
3
  readonly opus: import("@ai-sdk/provider").LanguageModelV3;
4
4
  readonly sonnet: import("@ai-sdk/provider").LanguageModelV3;
5
- readonly sonnet37: import("@ai-sdk/provider").LanguageModelV3;
6
- readonly "sonnet37-token-efficient-tools": import("@ai-sdk/provider").LanguageModelV3;
7
- readonly "sonnet37-128k": import("@ai-sdk/provider").LanguageModelV3;
8
- readonly sonnet35: import("@ai-sdk/provider").LanguageModelV3;
9
5
  readonly haiku: import("@ai-sdk/provider").LanguageModelV3;
10
6
  };
11
7
  type ModelName = `anthropic:${keyof typeof anthropicModels}`;
12
8
  export declare const anthropicModelNames: ModelName[];
13
9
  export declare const anthropicProvider: {
14
10
  anthropic: import("@ai-sdk/provider").ProviderV3 & {
15
- languageModel(modelId: "opus" | "sonnet" | "sonnet37" | "sonnet37-token-efficient-tools" | "sonnet37-128k" | "sonnet35" | "haiku"): import("@ai-sdk/provider").LanguageModelV3;
11
+ languageModel(modelId: "opus" | "sonnet" | "haiku"): import("@ai-sdk/provider").LanguageModelV3;
16
12
  embeddingModel(modelId: string): import("@ai-sdk/provider").EmbeddingModelV3;
17
13
  imageModel(modelId: string): import("@ai-sdk/provider").ImageModelV3;
18
14
  transcriptionModel(modelId: string): import("@ai-sdk/provider").TranscriptionModelV3;
19
15
  rerankingModel(modelId: string): import("@ai-sdk/provider").RerankingModelV3;
20
16
  speechModel(modelId: string): import("@ai-sdk/provider").SpeechModelV3;
17
+ videoModel(modelId: string): import("@ai-sdk/provider").Experimental_VideoModelV3;
21
18
  };
22
19
  };
23
20
  export declare const anthropicModelRegistry: {