@travisennis/acai 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/README.md +42 -25
  2. package/dist/agent/index.d.ts +21 -25
  3. package/dist/agent/index.d.ts.map +1 -1
  4. package/dist/agent/index.js +115 -104
  5. package/dist/cli.d.ts +2 -2
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +21 -16
  8. package/dist/commands/add-directory/index.d.ts +3 -0
  9. package/dist/commands/add-directory/index.d.ts.map +1 -0
  10. package/dist/commands/{add-directory-command.js → add-directory/index.js} +6 -10
  11. package/dist/commands/add-directory/types.d.ts +6 -0
  12. package/dist/commands/add-directory/types.d.ts.map +1 -0
  13. package/dist/commands/add-directory/types.js +1 -0
  14. package/dist/commands/add-directory/utils.d.ts +3 -0
  15. package/dist/commands/add-directory/utils.d.ts.map +1 -0
  16. package/dist/commands/add-directory/utils.js +15 -0
  17. package/dist/commands/clear/index.d.ts +3 -0
  18. package/dist/commands/clear/index.d.ts.map +1 -0
  19. package/dist/commands/{clear-command.js → clear/index.js} +0 -2
  20. package/dist/commands/copy/index.d.ts +3 -0
  21. package/dist/commands/copy/index.d.ts.map +1 -0
  22. package/dist/commands/{copy-command.js → copy/index.js} +4 -26
  23. package/dist/commands/copy/types.d.ts +3 -0
  24. package/dist/commands/copy/types.d.ts.map +1 -0
  25. package/dist/commands/copy/types.js +1 -0
  26. package/dist/commands/copy/utils.d.ts +3 -0
  27. package/dist/commands/copy/utils.d.ts.map +1 -0
  28. package/dist/commands/copy/utils.js +22 -0
  29. package/dist/commands/{exit-command.d.ts → exit/index.d.ts} +4 -4
  30. package/dist/commands/exit/index.d.ts.map +1 -0
  31. package/dist/commands/exit/index.js +21 -0
  32. package/dist/commands/exit/types.d.ts +8 -0
  33. package/dist/commands/exit/types.d.ts.map +1 -0
  34. package/dist/commands/exit/types.js +1 -0
  35. package/dist/commands/exit/utils.d.ts +2 -0
  36. package/dist/commands/exit/utils.d.ts.map +1 -0
  37. package/dist/commands/exit/utils.js +13 -0
  38. package/dist/commands/generate-rules/index.d.ts +3 -0
  39. package/dist/commands/generate-rules/index.d.ts.map +1 -0
  40. package/dist/commands/{generate-rules-command.js → generate-rules/index.js} +55 -95
  41. package/dist/commands/generate-rules/utils.d.ts +5 -0
  42. package/dist/commands/generate-rules/utils.d.ts.map +1 -0
  43. package/dist/commands/generate-rules/utils.js +25 -0
  44. package/dist/commands/handoff/index.d.ts +3 -0
  45. package/dist/commands/handoff/index.d.ts.map +1 -0
  46. package/dist/commands/handoff/index.js +97 -0
  47. package/dist/commands/handoff/utils.d.ts +4 -0
  48. package/dist/commands/handoff/utils.d.ts.map +1 -0
  49. package/dist/commands/{handoff-command.js → handoff/utils.js} +24 -92
  50. package/dist/commands/health/index.d.ts +3 -0
  51. package/dist/commands/health/index.d.ts.map +1 -0
  52. package/dist/commands/health/index.js +56 -0
  53. package/dist/commands/health/utils.d.ts +15 -0
  54. package/dist/commands/health/utils.d.ts.map +1 -0
  55. package/dist/commands/health/utils.js +52 -0
  56. package/dist/commands/{help-command.d.ts → help/index.d.ts} +2 -2
  57. package/dist/commands/help/index.d.ts.map +1 -0
  58. package/dist/commands/{help-command.js → help/index.js} +1 -1
  59. package/dist/commands/history/index.d.ts +3 -0
  60. package/dist/commands/history/index.d.ts.map +1 -0
  61. package/dist/commands/{history-command.js → history/index.js} +16 -100
  62. package/dist/commands/history/types.d.ts +11 -0
  63. package/dist/commands/history/types.d.ts.map +1 -0
  64. package/dist/commands/history/types.js +1 -0
  65. package/dist/commands/history/utils.d.ts +4 -0
  66. package/dist/commands/history/utils.d.ts.map +1 -0
  67. package/dist/commands/history/utils.js +86 -0
  68. package/dist/commands/init/index.d.ts +3 -0
  69. package/dist/commands/init/index.d.ts.map +1 -0
  70. package/dist/commands/{init-command.js → init/index.js} +16 -7
  71. package/dist/commands/init-project/index.d.ts +3 -0
  72. package/dist/commands/init-project/index.d.ts.map +1 -0
  73. package/dist/commands/init-project/index.js +51 -0
  74. package/dist/commands/init-project/utils.d.ts +9 -0
  75. package/dist/commands/init-project/utils.d.ts.map +1 -0
  76. package/dist/commands/init-project/utils.js +43 -0
  77. package/dist/commands/list-directories/index.d.ts +3 -0
  78. package/dist/commands/list-directories/index.d.ts.map +1 -0
  79. package/dist/commands/{list-directories-command.js → list-directories/index.js} +1 -1
  80. package/dist/commands/list-tools/index.d.ts +3 -0
  81. package/dist/commands/list-tools/index.d.ts.map +1 -0
  82. package/dist/commands/{list-tools-command.js → list-tools/index.js} +4 -16
  83. package/dist/commands/manager.d.ts +2 -2
  84. package/dist/commands/manager.d.ts.map +1 -1
  85. package/dist/commands/manager.js +33 -43
  86. package/dist/commands/model/index.d.ts +3 -0
  87. package/dist/commands/model/index.d.ts.map +1 -0
  88. package/dist/commands/{model-command.js → model/index.js} +15 -52
  89. package/dist/commands/model/utils.d.ts +3 -0
  90. package/dist/commands/model/utils.d.ts.map +1 -0
  91. package/dist/commands/model/utils.js +5 -0
  92. package/dist/commands/{paste-command.d.ts → paste/index.d.ts} +2 -2
  93. package/dist/commands/paste/index.d.ts.map +1 -0
  94. package/dist/commands/{paste-command.js → paste/index.js} +6 -111
  95. package/dist/commands/paste/utils.d.ts +5 -0
  96. package/dist/commands/paste/utils.d.ts.map +1 -0
  97. package/dist/commands/paste/utils.js +86 -0
  98. package/dist/commands/pickup/index.d.ts +3 -0
  99. package/dist/commands/pickup/index.d.ts.map +1 -0
  100. package/dist/commands/pickup/index.js +138 -0
  101. package/dist/commands/pickup/types.d.ts +6 -0
  102. package/dist/commands/pickup/types.d.ts.map +1 -0
  103. package/dist/commands/pickup/types.js +1 -0
  104. package/dist/commands/pickup/utils.d.ts +7 -0
  105. package/dist/commands/pickup/utils.d.ts.map +1 -0
  106. package/dist/commands/pickup/utils.js +56 -0
  107. package/dist/commands/prompt/index.d.ts +5 -0
  108. package/dist/commands/prompt/index.d.ts.map +1 -0
  109. package/dist/commands/prompt/index.js +126 -0
  110. package/dist/commands/prompt/types.d.ts +15 -0
  111. package/dist/commands/prompt/types.d.ts.map +1 -0
  112. package/dist/commands/prompt/types.js +1 -0
  113. package/dist/commands/prompt/utils.d.ts +12 -0
  114. package/dist/commands/prompt/utils.d.ts.map +1 -0
  115. package/dist/commands/prompt/utils.js +107 -0
  116. package/dist/commands/remove-directory/index.d.ts +3 -0
  117. package/dist/commands/remove-directory/index.d.ts.map +1 -0
  118. package/dist/commands/{remove-directory-command.js → remove-directory/index.js} +2 -2
  119. package/dist/commands/reset/index.d.ts +3 -0
  120. package/dist/commands/reset/index.d.ts.map +1 -0
  121. package/dist/commands/{reset-command.js → reset/index.js} +7 -2
  122. package/dist/commands/reset/types.d.ts +1 -0
  123. package/dist/commands/reset/types.d.ts.map +1 -0
  124. package/dist/commands/reset/types.js +3 -0
  125. package/dist/commands/resources/index.d.ts +3 -0
  126. package/dist/commands/resources/index.d.ts.map +1 -0
  127. package/dist/commands/resources/index.js +84 -0
  128. package/dist/commands/review/index.d.ts +3 -0
  129. package/dist/commands/review/index.d.ts.map +1 -0
  130. package/dist/commands/review/index.js +126 -0
  131. package/dist/commands/review/types.d.ts +12 -0
  132. package/dist/commands/review/types.d.ts.map +1 -0
  133. package/dist/commands/review/types.js +1 -0
  134. package/dist/commands/review/utils.d.ts +4 -0
  135. package/dist/commands/review/utils.d.ts.map +1 -0
  136. package/dist/commands/review/utils.js +87 -0
  137. package/dist/commands/save/index.d.ts +3 -0
  138. package/dist/commands/save/index.d.ts.map +1 -0
  139. package/dist/commands/{save-command.js → save/index.js} +3 -3
  140. package/dist/commands/session/index.d.ts +3 -0
  141. package/dist/commands/session/index.d.ts.map +1 -0
  142. package/dist/commands/session/index.js +197 -0
  143. package/dist/commands/session/types.d.ts +13 -0
  144. package/dist/commands/session/types.d.ts.map +1 -0
  145. package/dist/commands/session/types.js +7 -0
  146. package/dist/commands/shell/index.d.ts +3 -0
  147. package/dist/commands/shell/index.d.ts.map +1 -0
  148. package/dist/commands/{shell-command.js → shell/index.js} +3 -3
  149. package/dist/commands/types.d.ts +2 -2
  150. package/dist/commands/types.d.ts.map +1 -1
  151. package/dist/config.d.ts +25 -7
  152. package/dist/config.d.ts.map +1 -1
  153. package/dist/config.js +45 -20
  154. package/dist/dedent.d.ts.map +1 -1
  155. package/dist/dedent.js +7 -7
  156. package/dist/execution/index.d.ts +1 -0
  157. package/dist/execution/index.d.ts.map +1 -1
  158. package/dist/execution/index.js +60 -64
  159. package/dist/formatting.d.ts +27 -0
  160. package/dist/formatting.d.ts.map +1 -1
  161. package/dist/formatting.js +40 -0
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +138 -75
  164. package/dist/logger.d.ts.map +1 -1
  165. package/dist/logger.js +4 -11
  166. package/dist/mentions.d.ts.map +1 -1
  167. package/dist/mentions.js +3 -53
  168. package/dist/middleware/audit-message.d.ts +2 -2
  169. package/dist/middleware/audit-message.d.ts.map +1 -1
  170. package/dist/middleware/audit-message.js +40 -2
  171. package/dist/middleware/cache.d.ts +2 -2
  172. package/dist/middleware/cache.d.ts.map +1 -1
  173. package/dist/middleware/cache.js +111 -27
  174. package/dist/middleware/rate-limit.d.ts +2 -2
  175. package/dist/middleware/rate-limit.d.ts.map +1 -1
  176. package/dist/middleware/rate-limit.js +1 -0
  177. package/dist/models/ai-config.d.ts.map +1 -1
  178. package/dist/models/ai-config.js +46 -29
  179. package/dist/models/anthropic-provider.d.ts +14 -13
  180. package/dist/models/anthropic-provider.d.ts.map +1 -1
  181. package/dist/models/deepseek-provider.d.ts +9 -8
  182. package/dist/models/deepseek-provider.d.ts.map +1 -1
  183. package/dist/models/google-provider.d.ts +10 -9
  184. package/dist/models/google-provider.d.ts.map +1 -1
  185. package/dist/models/groq-provider.d.ts +8 -7
  186. package/dist/models/groq-provider.d.ts.map +1 -1
  187. package/dist/models/manager.d.ts +7 -4
  188. package/dist/models/manager.d.ts.map +1 -1
  189. package/dist/models/manager.js +5 -25
  190. package/dist/models/openai-provider.d.ts +11 -10
  191. package/dist/models/openai-provider.d.ts.map +1 -1
  192. package/dist/models/opencode-zen-provider.d.ts +23 -0
  193. package/dist/models/opencode-zen-provider.d.ts.map +1 -0
  194. package/dist/models/opencode-zen-provider.js +76 -0
  195. package/dist/models/openrouter-provider.d.ts +34 -29
  196. package/dist/models/openrouter-provider.d.ts.map +1 -1
  197. package/dist/models/openrouter-provider.js +95 -80
  198. package/dist/models/providers.d.ts +4 -4
  199. package/dist/models/providers.d.ts.map +1 -1
  200. package/dist/models/providers.js +7 -1
  201. package/dist/models/xai-provider.d.ts +9 -8
  202. package/dist/models/xai-provider.d.ts.map +1 -1
  203. package/dist/prompts/manager.d.ts +1 -1
  204. package/dist/prompts/manager.d.ts.map +1 -1
  205. package/dist/prompts/manager.js +1 -1
  206. package/dist/prompts.d.ts +0 -1
  207. package/dist/prompts.d.ts.map +1 -1
  208. package/dist/prompts.js +56 -406
  209. package/dist/repl/project-status.d.ts +19 -0
  210. package/dist/repl/project-status.d.ts.map +1 -0
  211. package/dist/repl/project-status.js +78 -0
  212. package/dist/repl-new.d.ts +15 -4
  213. package/dist/repl-new.d.ts.map +1 -1
  214. package/dist/repl-new.js +245 -42
  215. package/dist/{messages.d.ts → sessions/manager.d.ts} +10 -4
  216. package/dist/sessions/manager.d.ts.map +1 -0
  217. package/dist/{messages.js → sessions/manager.js} +60 -14
  218. package/dist/skills.d.ts +0 -4
  219. package/dist/skills.d.ts.map +1 -1
  220. package/dist/skills.js +100 -59
  221. package/dist/terminal/control.d.ts +1 -0
  222. package/dist/terminal/control.d.ts.map +1 -1
  223. package/dist/terminal/control.js +2 -0
  224. package/dist/terminal/formatting.d.ts +1 -2
  225. package/dist/terminal/formatting.d.ts.map +1 -1
  226. package/dist/terminal/formatting.js +1 -2
  227. package/dist/terminal/keys.d.ts +211 -0
  228. package/dist/terminal/keys.d.ts.map +1 -0
  229. package/dist/terminal/keys.js +546 -0
  230. package/dist/terminal/segmenter.d.ts +6 -0
  231. package/dist/terminal/segmenter.d.ts.map +1 -0
  232. package/dist/terminal/segmenter.js +11 -0
  233. package/dist/terminal/select-prompt.d.ts.map +1 -1
  234. package/dist/terminal/select-prompt.js +9 -21
  235. package/dist/terminal/string-width.d.ts.map +1 -1
  236. package/dist/terminal/string-width.js +40 -21
  237. package/dist/terminal/strip-ansi.d.ts.map +1 -1
  238. package/dist/terminal/strip-ansi.js +9 -15
  239. package/dist/tokens/tracker.d.ts.map +1 -1
  240. package/dist/tokens/tracker.js +58 -16
  241. package/dist/tools/bash.d.ts +9 -11
  242. package/dist/tools/bash.d.ts.map +1 -1
  243. package/dist/tools/bash.js +69 -123
  244. package/dist/tools/directory-tree.d.ts +9 -7
  245. package/dist/tools/directory-tree.d.ts.map +1 -1
  246. package/dist/tools/directory-tree.js +89 -70
  247. package/dist/tools/dynamic-tool-loader.d.ts +22 -4
  248. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  249. package/dist/tools/dynamic-tool-loader.js +39 -44
  250. package/dist/tools/edit-file.d.ts +6 -16
  251. package/dist/tools/edit-file.d.ts.map +1 -1
  252. package/dist/tools/edit-file.js +19 -76
  253. package/dist/tools/glob.d.ts +15 -16
  254. package/dist/tools/glob.d.ts.map +1 -1
  255. package/dist/tools/glob.js +77 -119
  256. package/dist/tools/grep.d.ts +19 -22
  257. package/dist/tools/grep.d.ts.map +1 -1
  258. package/dist/tools/grep.js +61 -108
  259. package/dist/tools/index.d.ts +200 -179
  260. package/dist/tools/index.d.ts.map +1 -1
  261. package/dist/tools/index.js +17 -315
  262. package/dist/tools/ls.d.ts +26 -0
  263. package/dist/tools/ls.d.ts.map +1 -0
  264. package/dist/tools/ls.js +80 -0
  265. package/dist/tools/read-file.d.ts +15 -15
  266. package/dist/tools/read-file.d.ts.map +1 -1
  267. package/dist/tools/read-file.js +49 -82
  268. package/dist/tools/save-file.d.ts +4 -4
  269. package/dist/tools/save-file.d.ts.map +1 -1
  270. package/dist/tools/save-file.js +37 -66
  271. package/dist/tools/think.d.ts +4 -4
  272. package/dist/tools/think.d.ts.map +1 -1
  273. package/dist/tools/think.js +9 -38
  274. package/dist/tools/types.d.ts +5 -25
  275. package/dist/tools/types.d.ts.map +1 -1
  276. package/dist/tools/types.js +0 -9
  277. package/dist/tui/autocomplete/attachment-provider.d.ts +18 -0
  278. package/dist/tui/autocomplete/attachment-provider.d.ts.map +1 -0
  279. package/dist/tui/autocomplete/attachment-provider.js +159 -0
  280. package/dist/tui/autocomplete/base-provider.d.ts +17 -0
  281. package/dist/tui/autocomplete/base-provider.d.ts.map +1 -0
  282. package/dist/tui/autocomplete/base-provider.js +1 -0
  283. package/dist/tui/autocomplete/combined-provider.d.ts +20 -0
  284. package/dist/tui/autocomplete/combined-provider.d.ts.map +1 -0
  285. package/dist/tui/autocomplete/combined-provider.js +61 -0
  286. package/dist/tui/autocomplete/command-provider.d.ts +20 -0
  287. package/dist/tui/autocomplete/command-provider.d.ts.map +1 -0
  288. package/dist/tui/autocomplete/command-provider.js +90 -0
  289. package/dist/tui/autocomplete/file-search-provider.d.ts +16 -0
  290. package/dist/tui/autocomplete/file-search-provider.d.ts.map +1 -0
  291. package/dist/tui/autocomplete/file-search-provider.js +123 -0
  292. package/dist/tui/autocomplete/path-provider.d.ts +21 -0
  293. package/dist/tui/autocomplete/path-provider.d.ts.map +1 -0
  294. package/dist/tui/autocomplete/path-provider.js +164 -0
  295. package/dist/tui/autocomplete/utils.d.ts +16 -0
  296. package/dist/tui/autocomplete/utils.d.ts.map +1 -0
  297. package/dist/tui/autocomplete/utils.js +137 -0
  298. package/dist/tui/autocomplete.d.ts +12 -43
  299. package/dist/tui/autocomplete.d.ts.map +1 -1
  300. package/dist/tui/autocomplete.js +20 -465
  301. package/dist/tui/components/box.d.ts.map +1 -1
  302. package/dist/tui/components/box.js +16 -10
  303. package/dist/tui/components/editor.d.ts +1 -2
  304. package/dist/tui/components/editor.d.ts.map +1 -1
  305. package/dist/tui/components/editor.js +148 -107
  306. package/dist/tui/components/footer.d.ts +20 -7
  307. package/dist/tui/components/footer.d.ts.map +1 -1
  308. package/dist/tui/components/footer.js +89 -196
  309. package/dist/tui/components/input.d.ts.map +1 -1
  310. package/dist/tui/components/input.js +8 -7
  311. package/dist/tui/components/loader.d.ts +2 -1
  312. package/dist/tui/components/loader.d.ts.map +1 -1
  313. package/dist/tui/components/loader.js +7 -2
  314. package/dist/tui/components/markdown.d.ts +5 -4
  315. package/dist/tui/components/markdown.d.ts.map +1 -1
  316. package/dist/tui/components/markdown.js +51 -40
  317. package/dist/tui/components/modal.d.ts.map +1 -1
  318. package/dist/tui/components/modal.js +9 -8
  319. package/dist/tui/components/notification.d.ts +28 -0
  320. package/dist/tui/components/notification.d.ts.map +1 -0
  321. package/dist/tui/components/notification.js +63 -0
  322. package/dist/tui/components/progress-bar.d.ts.map +1 -1
  323. package/dist/tui/components/progress-bar.js +3 -15
  324. package/dist/tui/components/select-list.d.ts +0 -15
  325. package/dist/tui/components/select-list.d.ts.map +1 -1
  326. package/dist/tui/components/select-list.js +5 -28
  327. package/dist/tui/components/tool-execution.d.ts +3 -6
  328. package/dist/tui/components/tool-execution.d.ts.map +1 -1
  329. package/dist/tui/components/tool-execution.js +26 -38
  330. package/dist/tui/components/welcome.d.ts +8 -1
  331. package/dist/tui/components/welcome.d.ts.map +1 -1
  332. package/dist/tui/components/welcome.js +45 -6
  333. package/dist/tui/index.d.ts +4 -2
  334. package/dist/tui/index.d.ts.map +1 -1
  335. package/dist/tui/index.js +2 -2
  336. package/dist/tui/terminal.d.ts +2 -2
  337. package/dist/tui/terminal.d.ts.map +1 -1
  338. package/dist/tui/terminal.js +23 -19
  339. package/dist/tui/tui.d.ts +1 -0
  340. package/dist/tui/tui.d.ts.map +1 -1
  341. package/dist/tui/tui.js +24 -29
  342. package/dist/tui/utils.d.ts.map +1 -1
  343. package/dist/tui/utils.js +2 -3
  344. package/dist/utils/yaml.d.ts +11 -0
  345. package/dist/utils/yaml.d.ts.map +1 -0
  346. package/dist/utils/yaml.js +207 -0
  347. package/dist/utils/zod.d.ts +1 -0
  348. package/dist/utils/zod.d.ts.map +1 -1
  349. package/dist/utils/zod.js +17 -0
  350. package/package.json +31 -29
  351. package/bin/acai-wrapper.js +0 -26
  352. package/dist/api/exa/index.d.ts +0 -177
  353. package/dist/api/exa/index.d.ts.map +0 -1
  354. package/dist/api/exa/index.js +0 -439
  355. package/dist/commands/add-directory-command.d.ts +0 -3
  356. package/dist/commands/add-directory-command.d.ts.map +0 -1
  357. package/dist/commands/application-log-command.d.ts +0 -3
  358. package/dist/commands/application-log-command.d.ts.map +0 -1
  359. package/dist/commands/application-log-command.js +0 -43
  360. package/dist/commands/clear-command.d.ts +0 -3
  361. package/dist/commands/clear-command.d.ts.map +0 -1
  362. package/dist/commands/compact-command.d.ts +0 -3
  363. package/dist/commands/compact-command.d.ts.map +0 -1
  364. package/dist/commands/compact-command.js +0 -55
  365. package/dist/commands/context-command.d.ts +0 -3
  366. package/dist/commands/context-command.d.ts.map +0 -1
  367. package/dist/commands/context-command.js +0 -124
  368. package/dist/commands/copy-command.d.ts +0 -3
  369. package/dist/commands/copy-command.d.ts.map +0 -1
  370. package/dist/commands/edit-command.d.ts +0 -3
  371. package/dist/commands/edit-command.d.ts.map +0 -1
  372. package/dist/commands/edit-command.js +0 -42
  373. package/dist/commands/edit-prompt-command.d.ts +0 -3
  374. package/dist/commands/edit-prompt-command.d.ts.map +0 -1
  375. package/dist/commands/edit-prompt-command.js +0 -36
  376. package/dist/commands/exit-command.d.ts.map +0 -1
  377. package/dist/commands/exit-command.js +0 -30
  378. package/dist/commands/files-command.d.ts +0 -3
  379. package/dist/commands/files-command.d.ts.map +0 -1
  380. package/dist/commands/files-command.js +0 -68
  381. package/dist/commands/generate-rules-command.d.ts +0 -3
  382. package/dist/commands/generate-rules-command.d.ts.map +0 -1
  383. package/dist/commands/handoff-command.d.ts +0 -3
  384. package/dist/commands/handoff-command.d.ts.map +0 -1
  385. package/dist/commands/health-command.d.ts +0 -4
  386. package/dist/commands/health-command.d.ts.map +0 -1
  387. package/dist/commands/health-command.js +0 -118
  388. package/dist/commands/help-command.d.ts.map +0 -1
  389. package/dist/commands/history-command.d.ts +0 -3
  390. package/dist/commands/history-command.d.ts.map +0 -1
  391. package/dist/commands/init-command.d.ts +0 -3
  392. package/dist/commands/init-command.d.ts.map +0 -1
  393. package/dist/commands/last-log-command.d.ts +0 -3
  394. package/dist/commands/last-log-command.d.ts.map +0 -1
  395. package/dist/commands/last-log-command.js +0 -71
  396. package/dist/commands/list-directories-command.d.ts +0 -3
  397. package/dist/commands/list-directories-command.d.ts.map +0 -1
  398. package/dist/commands/list-tools-command.d.ts +0 -3
  399. package/dist/commands/list-tools-command.d.ts.map +0 -1
  400. package/dist/commands/model-command.d.ts +0 -3
  401. package/dist/commands/model-command.d.ts.map +0 -1
  402. package/dist/commands/paste-command.d.ts.map +0 -1
  403. package/dist/commands/pickup-command.d.ts +0 -3
  404. package/dist/commands/pickup-command.d.ts.map +0 -1
  405. package/dist/commands/pickup-command.js +0 -109
  406. package/dist/commands/prompt-command.d.ts +0 -21
  407. package/dist/commands/prompt-command.d.ts.map +0 -1
  408. package/dist/commands/prompt-command.js +0 -258
  409. package/dist/commands/remove-directory-command.d.ts +0 -3
  410. package/dist/commands/remove-directory-command.d.ts.map +0 -1
  411. package/dist/commands/reset-command.d.ts +0 -3
  412. package/dist/commands/reset-command.d.ts.map +0 -1
  413. package/dist/commands/rules-command.d.ts +0 -3
  414. package/dist/commands/rules-command.d.ts.map +0 -1
  415. package/dist/commands/rules-command.js +0 -73
  416. package/dist/commands/save-command.d.ts +0 -3
  417. package/dist/commands/save-command.d.ts.map +0 -1
  418. package/dist/commands/shell-command.d.ts +0 -3
  419. package/dist/commands/shell-command.d.ts.map +0 -1
  420. package/dist/commands/usage-command.d.ts +0 -3
  421. package/dist/commands/usage-command.d.ts.map +0 -1
  422. package/dist/commands/usage-command.js +0 -31
  423. package/dist/messages.d.ts.map +0 -1
  424. package/dist/repl/project-status-line.d.ts +0 -3
  425. package/dist/repl/project-status-line.d.ts.map +0 -1
  426. package/dist/repl/project-status-line.js +0 -61
  427. package/dist/repl/tool-call-repair.d.ts +0 -4
  428. package/dist/repl/tool-call-repair.d.ts.map +0 -1
  429. package/dist/repl/tool-call-repair.js +0 -54
  430. package/dist/terminal/markdown.d.ts +0 -2
  431. package/dist/terminal/markdown.d.ts.map +0 -1
  432. package/dist/terminal/markdown.js +0 -120
  433. package/dist/tokens/threshold.d.ts +0 -20
  434. package/dist/tokens/threshold.d.ts.map +0 -1
  435. package/dist/tokens/threshold.js +0 -67
  436. package/dist/tools/advanced-edit-file.d.ts +0 -69
  437. package/dist/tools/advanced-edit-file.d.ts.map +0 -1
  438. package/dist/tools/advanced-edit-file.js +0 -285
  439. package/dist/tools/agent.d.ts +0 -29
  440. package/dist/tools/agent.d.ts.map +0 -1
  441. package/dist/tools/agent.js +0 -117
  442. package/dist/tools/batch.d.ts +0 -34
  443. package/dist/tools/batch.d.ts.map +0 -1
  444. package/dist/tools/batch.js +0 -174
  445. package/dist/tools/code-interpreter.d.ts +0 -25
  446. package/dist/tools/code-interpreter.d.ts.map +0 -1
  447. package/dist/tools/code-interpreter.js +0 -183
  448. package/dist/tools/delete-file.d.ts +0 -24
  449. package/dist/tools/delete-file.d.ts.map +0 -1
  450. package/dist/tools/delete-file.js +0 -77
  451. package/dist/tools/dynamic-tool-parser.d.ts +0 -21
  452. package/dist/tools/dynamic-tool-parser.d.ts.map +0 -1
  453. package/dist/tools/dynamic-tool-parser.js +0 -22
  454. package/dist/tools/llm-edit-fixer.d.ts +0 -24
  455. package/dist/tools/llm-edit-fixer.d.ts.map +0 -1
  456. package/dist/tools/llm-edit-fixer.js +0 -136
  457. package/dist/tools/move-file.d.ts +0 -26
  458. package/dist/tools/move-file.d.ts.map +0 -1
  459. package/dist/tools/move-file.js +0 -65
  460. package/dist/tools/read-multiple-files.d.ts +0 -26
  461. package/dist/tools/read-multiple-files.d.ts.map +0 -1
  462. package/dist/tools/read-multiple-files.js +0 -196
  463. package/dist/tools/web-fetch.d.ts +0 -56
  464. package/dist/tools/web-fetch.d.ts.map +0 -1
  465. package/dist/tools/web-fetch.js +0 -247
  466. package/dist/tools/web-search.d.ts +0 -23
  467. package/dist/tools/web-search.d.ts.map +0 -1
  468. package/dist/tools/web-search.js +0 -148
  469. package/dist/tui/components/prompt-status.d.ts +0 -17
  470. package/dist/tui/components/prompt-status.d.ts.map +0 -1
  471. package/dist/tui/components/prompt-status.js +0 -26
package/README.md CHANGED
@@ -26,15 +26,15 @@ Acai is a powerful **AI-driven command-line interface (CLI) tool** designed to a
26
26
  * **File & Directory Mentions:** Include file contents and entire directories in prompts using `@filename` and `@dirname` syntax.
27
27
  * **Code Navigation & Analysis:** Advanced file searching and code analysis capabilities.
28
28
  * **Git Workflow Automation:** Streamline commit messages and code reviews.
29
- * **Web Integration:** Perform web searches and fetch content from URLs.
30
- * **Extensible Commands:** A rich set of built-in commands (`/help`, `/model`, `/usage`, `/list-tools`, etc.).
31
- * **Token Usage Tracking:** Monitor AI token consumption.
29
+ * **Extensible Commands:** A rich set of built-in commands (`/help`, `/model`, `/session`, `/list-tools`, etc.).
30
+ * **Token Usage Tracking:** Monitor AI token consumption with comprehensive session overview.
32
31
  * **Configurable AI Models:** Easily switch between different LLM providers and models.
33
32
  * **Shell Integration:** Execute shell commands inline using `!`command`` syntax or via `/shell` command.
34
33
  * **Dynamic Tools:** Create and load custom tools from JavaScript files in your project or user directory.
35
34
  * **Multi-workspace Support:** Work across multiple project directories simultaneously.
36
35
  * **Skills System:** Discover and load specialized instruction files for specific tasks (PDF extraction, database migrations, etc.).
37
36
 
37
+
38
38
  ## 🛠️ Technologies Used
39
39
 
40
40
  Acai is built primarily with **TypeScript** and runs on **Node.js**. Key technologies and dependencies include:
@@ -132,17 +132,9 @@ X_AI_API_KEY=your_xai_api_key_here
132
132
 
133
133
  # OpenRouter (Access to multiple models)
134
134
  OPENROUTER_API_KEY=your_openrouter_api_key_here
135
- ```
136
-
137
- ### Web Service API Keys (Optional)
138
135
 
139
- ```bash
140
- # Exa (for enhanced web search functionality)
141
- # Optional: Falls back to DuckDuckGo search if not provided
142
- EXA_API_KEY=your_exa_api_key_here
143
-
144
- # Jina Reader (for enhanced web content extraction)
145
- JINA_READER_API_KEY=your_jina_api_key_here
136
+ # OpenCode Zen
137
+ OPENCODE_ZEN_API_TOKEN=your_opencode_zen_api_token_here
146
138
  ```
147
139
 
148
140
  ### Application Configuration
@@ -165,16 +157,12 @@ GOOGLE_GENERATIVE_AI_API_KEY=...
165
157
  GROQ_API_KEY=...
166
158
  OPENROUTER_API_KEY=sk-or-...
167
159
 
168
- # Optional: Web services (fallbacks available if not provided)
169
- EXA_API_KEY=... # Falls back to DuckDuckGo search
170
-
171
160
  # Optional: Application settings
172
161
  LOG_LEVEL=info
173
162
  ```
174
163
 
175
164
  **Note:** You need at least one AI provider API key to use Acai. The tool will work with any combination of the supported providers.
176
165
 
177
- **Web Search:** The web search functionality works without any API keys by using DuckDuckGo as a fallback. Providing an EXA_API_KEY enables enhanced search capabilities with more detailed content extraction.
178
166
 
179
167
  ### Usage
180
168
 
@@ -196,14 +184,27 @@ acai --no-skills
196
184
 
197
185
  # Add additional working directories
198
186
  acai --add-dir /path/to/project1 --add-dir /path/to/project2
187
+
188
+ # Resume a previous session by selecting from a list
189
+ acai --continue
190
+
191
+ # Resume the most recent session
192
+ acai --resume
193
+
194
+ # Resume a specific session by ID
195
+ acai --resume a1b2c3d4-e5f6-7890-1234-567890abcdef
196
+ ```
197
+
198
+ **Note:** When exiting a session with messages, Acai will display a resume command with the session ID:
199
+ ```
200
+ To resume this session call acai --resume <session-id>
199
201
  ```
200
202
 
201
203
  Once in the REPL, you can type your prompts or use commands:
202
204
 
203
205
  ```
204
206
  > How do I read a file in Node.js?
205
- > /files add source/index.ts
206
- > /edit source/cli.ts "Change this function name"
207
+ > @source/index.ts
207
208
  > /help
208
209
  ```
209
210
 
@@ -287,7 +288,7 @@ For a list of available commands, type `/help` within the REPL.
287
288
  - `/paste` - Add clipboard contents to the next prompt
288
289
  - `/prompt <name> [arguments...]` - Load saved prompts with optional arguments. Project prompts override user prompts. Supports argument placeholders (`$ARGUMENTS`, `$1`, `$2`, etc.) in prompt files.
289
290
  - `/model [provider:model|category|provider]` - List or switch models
290
- - `/usage` - Show token usage breakdown
291
+ - `/session` - Show comprehensive session information including usage and costs
291
292
  - `/clear` - Clears the terminal screen for the current session
292
293
  - `/generateRules` - Analyze the current conversation and suggest project rules
293
294
  - `/copy` - Copy the last assistant response to the system clipboard
@@ -295,14 +296,13 @@ For a list of available commands, type `/help` within the REPL.
295
296
  - `/add-dir <path>` - Add additional working directory
296
297
  - `/list-dirs` - List all working directories
297
298
  - `/remove-dir <path>` - Remove a working directory
298
- - `/context` - Manage context selections
299
299
  - `/health` - Check system health and dependencies
300
300
  - `/history` - View and manage conversation history
301
301
  - `/pickup` - Resume a previous conversation
302
302
  - `/handoff` - Hand off conversation to another agent
303
303
  - `/shell` - Execute shell commands
304
304
 
305
- **Note**: Some commands mentioned in older documentation (like `/files`, `/edit`, `/compact`, `/rules`, `/lastLog`, `/appLog`) are currently disabled in the codebase.
305
+ **Note**: Some commands mentioned in older documentation may no longer be available. Use `/help` to see current commands.
306
306
 
307
307
  Clipboard notes:
308
308
  - macOS: uses `pbcopy`
@@ -642,7 +642,10 @@ Acai supports project-specific configuration through a `.acai/acai.json` file in
642
642
  },
643
643
  "skills": {
644
644
  "enabled": true // Optional: Enable/disable skills discovery (default: true)
645
- }
645
+ },
646
+
647
+
648
+
646
649
  }
647
650
  ```
648
651
 
@@ -650,7 +653,8 @@ Acai supports project-specific configuration through a `.acai/acai.json` file in
650
653
 
651
654
  - **Rules/Guidelines**: Add project-specific AI behavior rules in `AGENTS.md`
652
655
  - **Custom Prompts**: Store reusable prompts in `.acai/prompts/`. Supports argument placeholders (`$ARGUMENTS`, `$1`, `$2`, etc.) for dynamic content.
653
- - **Context Selections**: Save file/directory selections in `.acai/context/`
656
+
657
+ - **File Selections**: Save file/directory selections in `.acai/selections/`
654
658
  - **Memory/Rules**: Persistent project rules stored in `.acai/rules/`
655
659
 
656
660
  ### Global Configuration
@@ -675,6 +679,19 @@ acai
675
679
  LOG_LEVEL=warn acai
676
680
  ```
677
681
 
682
+ ## Web Skills
683
+
684
+ Acai's web functionality has been moved to standalone skills that operate independently of the core codebase. These skills provide web-related capabilities while keeping the main acai-ts project lightweight and focused.
685
+
686
+ ### Skill Locations
687
+
688
+ Web skills are located in:
689
+ - `~/.acai/skills/web-fetch/` - User-level web fetch skill
690
+ - `~/.acai/skills/web-search/` - User-level web search skill
691
+ - `<project>/.acai/skills/web-fetch/` - Project-level web fetch skill
692
+ - `<project>/.acai/skills/web-search/` - Project-level web search skill
693
+
694
+
678
695
  ## ⚙️ Development
679
696
 
680
697
  ### Development Environment Setup
@@ -733,7 +750,7 @@ The project is organized as follows:
733
750
 
734
751
  ```
735
752
  .
736
- ├── .acai/ # Internal configuration, context, and temporary files
753
+ ├── .acai/ # Internal configuration and temporary files
737
754
  ├── source/ # Main application source code
738
755
  │ ├── agent/ # Agent loop and manual execution
739
756
  │ ├── api/ # External API integrations (e.g., Exa)
@@ -1,24 +1,20 @@
1
- import type { LanguageModelUsage, ToolExecuteFunction } from "ai";
2
- import { type ToolCallRepairFunction } from "ai";
3
- import type { MessageHistory } from "../messages.ts";
4
1
  import type { ModelManager } from "../models/manager.ts";
5
2
  import type { ModelMetadata } from "../models/providers.ts";
3
+ import type { SessionManager } from "../sessions/manager.ts";
6
4
  import type { TokenTracker } from "../tokens/tracker.ts";
7
5
  import type { CompleteToolNames, CompleteToolSet } from "../tools/index.ts";
8
6
  type AgentOptions = {
9
7
  modelManager: ModelManager;
10
8
  tokenTracker: TokenTracker;
11
- messageHistory: MessageHistory;
9
+ sessionManager: SessionManager;
12
10
  maxIterations?: number;
13
11
  maxRetries?: number;
14
- toolCallRepair?: ToolCallRepairFunction<CompleteToolSet>;
15
12
  };
16
13
  type RunOptions = {
17
14
  systemPrompt: string;
18
15
  input: string;
19
- toolDefs: CompleteToolSet;
16
+ tools: CompleteToolSet;
20
17
  activeTools?: CompleteToolNames[];
21
- executors: Map<keyof CompleteToolSet, ToolExecuteFunction<unknown, string>>;
22
18
  abortSignal?: AbortSignal;
23
19
  };
24
20
  export type ToolEvent = {
@@ -27,18 +23,6 @@ export type ToolEvent = {
27
23
  toolCallId: string;
28
24
  msg: string;
29
25
  args: unknown;
30
- } | {
31
- type: "tool-call-init";
32
- name: string;
33
- toolCallId: string;
34
- msg: string;
35
- args: unknown;
36
- } | {
37
- type: "tool-call-update";
38
- name: string;
39
- toolCallId: string;
40
- msg: string;
41
- args: unknown;
42
26
  } | {
43
27
  type: "tool-call-end";
44
28
  name: string;
@@ -94,6 +78,22 @@ export type AgentEvent = {
94
78
  role: "assistant";
95
79
  content: string;
96
80
  } | ToolCallLifeCycle;
81
+ type ModelUsage = {
82
+ inputTokens: number;
83
+ outputTokens: number;
84
+ totalTokens: number;
85
+ cachedInputTokens: number;
86
+ reasoningTokens: number;
87
+ inputTokenDetails: {
88
+ noCacheTokens: number;
89
+ cacheReadTokens: number;
90
+ cacheWriteTokens: number;
91
+ };
92
+ outputTokenDetails: {
93
+ textTokens: number;
94
+ reasoningTokens: number;
95
+ };
96
+ };
97
97
  export type AgentState = {
98
98
  modelId: string;
99
99
  modelConfig: ModelMetadata;
@@ -105,12 +105,8 @@ export type AgentState = {
105
105
  toolName: string;
106
106
  }>;
107
107
  }[];
108
- usage: {
109
- [K in keyof LanguageModelUsage]-?: number;
110
- };
111
- totalUsage: {
112
- [K in keyof LanguageModelUsage]-?: number;
113
- };
108
+ usage: ModelUsage;
109
+ totalUsage: ModelUsage;
114
110
  timestamps: {
115
111
  start: number;
116
112
  stop: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/agent/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/agent/index.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,7 @@
1
- import { NoOutputGeneratedError, streamText, } from "ai";
1
+ import { generateText, InvalidToolInputError, NoOutputGeneratedError, NoSuchToolError, Output, streamText, tool, } from "ai";
2
2
  import { config } from "../config.js";
3
3
  import { logger } from "../logger.js";
4
4
  import { AiConfig } from "../models/ai-config.js";
5
- import { isToolMessage } from "../tools/types.js";
6
- import { isAsyncIterable } from "../utils/iterables.js";
7
5
  export class Agent {
8
6
  opts;
9
7
  _state;
@@ -20,10 +18,10 @@ export class Agent {
20
18
  return this.abortController.signal;
21
19
  }
22
20
  async *run(args) {
23
- const { modelManager, messageHistory, tokenTracker, maxIterations = (await config.getConfig()).loop.maxIterations, maxRetries = 2, toolCallRepair, } = this.opts;
21
+ const { modelManager, sessionManager, tokenTracker, maxIterations = (await config.getConfig()).loop.maxIterations, maxRetries = 2, } = this.opts;
24
22
  this.resetState();
25
23
  this._state.timestamps.start = performance.now();
26
- const { systemPrompt, input, toolDefs, activeTools = undefined, executors, abortSignal, } = args;
24
+ const { systemPrompt, input, tools, activeTools, abortSignal } = args;
27
25
  const langModel = modelManager.getModel("repl");
28
26
  const modelConfig = modelManager.getModelMetadata("repl");
29
27
  const aiConfig = new AiConfig({
@@ -63,22 +61,34 @@ export class Agent {
63
61
  model: langModel,
64
62
  maxOutputTokens: aiConfig.maxOutputTokens(),
65
63
  system: systemPrompt,
66
- messages: messageHistory.get(),
64
+ messages: sessionManager.get(),
67
65
  temperature: aiConfig.temperature(),
68
66
  topP: aiConfig.topP(),
69
67
  maxRetries: 2,
70
68
  providerOptions: aiConfig.providerOptions(),
71
- tools: toolDefs,
69
+ tools: Object.fromEntries(
70
+ // biome-ignore lint/suspicious/noExplicitAny: temporary
71
+ Object.entries(tools).map((t) => [t[0], tool(t[1].toolDef)])),
72
72
  activeTools,
73
- // biome-ignore lint/style/useNamingConvention: third-party code
74
- experimental_repairToolCall: toolCallRepair,
73
+ // biome-ignore lint/style/useNamingConvention: third-party controlled
74
+ experimental_repairToolCall: toolCallRepair(modelManager),
75
75
  abortSignal,
76
76
  onAbort: ({ steps }) => {
77
77
  logger.debug(`Aborting and processing ${steps.length} steps`);
78
78
  steps.forEach((step) => {
79
- messageHistory.appendResponseMessages(step.response.messages);
79
+ sessionManager.appendResponseMessages(step.response.messages);
80
80
  });
81
81
  },
82
+ onError({ error }) {
83
+ if (typeof error === "object" &&
84
+ error != null &&
85
+ "message" in error) {
86
+ logger.error(error.message);
87
+ }
88
+ else {
89
+ logger.error(error);
90
+ }
91
+ },
82
92
  });
83
93
  let accumulatedText = "";
84
94
  let accumulatedReasoning = "";
@@ -134,11 +144,13 @@ export class Agent {
134
144
  else if (chunk.type === "tool-call") {
135
145
  const call = chunk;
136
146
  const toolName = call.toolName;
147
+ const iTool = tools[toolName];
137
148
  yield this.processToolEvent(toolsCalled, {
138
149
  type: "tool-call-start",
139
150
  name: toolName,
140
151
  toolCallId: call.toolCallId,
141
- msg: "",
152
+ // biome-ignore lint/suspicious/noExplicitAny: unknown
153
+ msg: iTool ? iTool.display(call.input) : "",
142
154
  args: call.input,
143
155
  });
144
156
  if (call.invalid) {
@@ -155,87 +167,26 @@ export class Agent {
155
167
  try {
156
168
  thisStepToolCalls.push({ toolName });
157
169
  thisStepToolResults.push({ toolName });
158
- const toolExec = executors.get(toolName);
159
- if (!toolExec) {
170
+ const iTool = tools[toolName];
171
+ if (!iTool) {
160
172
  resultOutput = `No executor for tool ${toolName}`;
161
173
  }
162
174
  else {
175
+ const toolExec = iTool.execute;
163
176
  try {
164
177
  const output = await toolExec(call.input, {
165
178
  toolCallId: call.toolCallId,
166
- messages: messageHistory.get(),
179
+ messages: sessionManager.get(),
167
180
  abortSignal,
168
181
  });
169
- if (isAsyncIterable(output)) {
170
- const toolResultValues = [];
171
- for await (const value of output) {
172
- if (isToolMessage(value)) {
173
- if (call.toolCallId !== value.id) {
174
- logger.debug(`Tool ${call.toolName} ids don't match: ${call.toolCallId} != ${value.id}`);
175
- }
176
- const event = value.event;
177
- switch (event) {
178
- case "tool-completion":
179
- yield this.processToolEvent(toolsCalled, {
180
- type: "tool-call-end",
181
- name: value.name,
182
- toolCallId: call.toolCallId,
183
- msg: value.data,
184
- args: call.input,
185
- });
186
- break;
187
- case "tool-error":
188
- yield this.processToolEvent(toolsCalled, {
189
- type: "tool-call-error",
190
- name: value.name,
191
- toolCallId: call.toolCallId,
192
- msg: value.data,
193
- args: call.input,
194
- });
195
- break;
196
- case "tool-update":
197
- yield this.processToolEvent(toolsCalled, {
198
- type: "tool-call-update",
199
- name: value.name,
200
- toolCallId: call.toolCallId,
201
- msg: value.data,
202
- args: call.input,
203
- });
204
- break;
205
- case "tool-init":
206
- yield this.processToolEvent(toolsCalled, {
207
- type: "tool-call-init",
208
- name: value.name,
209
- toolCallId: call.toolCallId,
210
- msg: value.data,
211
- args: call.input,
212
- });
213
- break;
214
- default:
215
- event;
216
- logger.debug(`Unhandled tool message event: ${event}`);
217
- break;
218
- }
219
- }
220
- else {
221
- toolResultValues.push(value);
222
- }
223
- }
224
- const finalValue = toolResultValues.length > 0
225
- ? toolResultValues.at(-1)
226
- : undefined;
227
- resultOutput = formatToolResult(finalValue);
228
- }
229
- else {
230
- resultOutput = formatToolResult(output);
231
- yield this.processToolEvent(toolsCalled, {
232
- type: "tool-call-end",
233
- name: call.toolName,
234
- toolCallId: call.toolCallId,
235
- msg: "success",
236
- args: null,
237
- });
238
- }
182
+ resultOutput = formatToolResult(output);
183
+ yield this.processToolEvent(toolsCalled, {
184
+ type: "tool-call-end",
185
+ name: call.toolName,
186
+ toolCallId: call.toolCallId,
187
+ msg: resultOutput,
188
+ args: call.input,
189
+ });
239
190
  }
240
191
  catch (err) {
241
192
  resultOutput = `Tool error: ${err instanceof Error ? err.message : String(err)}`;
@@ -278,21 +229,23 @@ export class Agent {
278
229
  // Get response and tool calls
279
230
  const response = await result.response;
280
231
  const responseMessages = response.messages;
281
- messageHistory.appendResponseMessages(responseMessages);
232
+ sessionManager.appendResponseMessages(responseMessages);
282
233
  const stepUsage = await result.usage;
283
234
  this._state.usage.inputTokens = stepUsage.inputTokens ?? 0;
284
235
  this._state.usage.outputTokens = stepUsage.outputTokens ?? 0;
285
236
  this._state.usage.totalTokens = stepUsage.totalTokens ?? 0;
286
- this._state.usage.cachedInputTokens = stepUsage.cachedInputTokens ?? 0;
287
- this._state.usage.reasoningTokens = stepUsage.reasoningTokens ?? 0;
288
- messageHistory.setContextWindow(stepUsage.totalTokens ?? 0);
237
+ this._state.usage.cachedInputTokens =
238
+ stepUsage.inputTokenDetails.cacheReadTokens ?? 0;
239
+ this._state.usage.reasoningTokens =
240
+ stepUsage.outputTokenDetails.reasoningTokens ?? 0;
241
+ sessionManager.setContextWindow(stepUsage.totalTokens ?? 0);
289
242
  this._state.totalUsage.inputTokens += stepUsage.inputTokens ?? 0;
290
243
  this._state.totalUsage.outputTokens += stepUsage.outputTokens ?? 0;
291
244
  this._state.totalUsage.totalTokens += stepUsage.totalTokens ?? 0;
292
245
  this._state.totalUsage.cachedInputTokens +=
293
- stepUsage.cachedInputTokens ?? 0;
246
+ stepUsage.inputTokenDetails.cacheReadTokens ?? 0;
294
247
  this._state.totalUsage.reasoningTokens +=
295
- stepUsage.reasoningTokens ?? 0;
248
+ stepUsage.outputTokenDetails.reasoningTokens ?? 0;
296
249
  // If finishReason is not tool-calls, break
297
250
  const finishReason = await result.finishReason;
298
251
  if (finishReason !== "tool-calls") {
@@ -302,7 +255,7 @@ export class Agent {
302
255
  hasEmittedTerminalEvent = true;
303
256
  break;
304
257
  }
305
- messageHistory.appendToolMessages(toolMessages);
258
+ sessionManager.appendToolMessages(toolMessages);
306
259
  // Consume the rest of the team if necessary
307
260
  // await result.consumeStream();
308
261
  yield {
@@ -313,18 +266,29 @@ export class Agent {
313
266
  }
314
267
  catch (error) {
315
268
  consecutiveErrors += 1;
316
- logger.error(error, // Log the full error object
317
- `Error on manual agent loop streamText (attempt ${consecutiveErrors}/${maxRetries + 1})`);
318
- const errorMsg = error.message.length > 100
319
- ? `${error.message.slice(0, 100)}...`
320
- : error.message;
321
- yield {
322
- type: "agent-error",
323
- message: errorMsg,
324
- };
325
- if (NoOutputGeneratedError.isInstance(error)) {
326
- hasEmittedTerminalEvent = true;
327
- break;
269
+ // Handle AI SDK invalid tool input errors gracefully
270
+ if (InvalidToolInputError.isInstance(error)) {
271
+ logger.warn(error, `Invalid tool input detected - returning error to allow recovery (attempt ${consecutiveErrors}/${maxRetries + 1})`);
272
+ yield {
273
+ type: "agent-error",
274
+ message: `Tool input validation failed: ${error.message}. Try again with valid arguments.`,
275
+ };
276
+ // Continue loop to allow user to provide corrected input
277
+ }
278
+ else {
279
+ logger.error(error, // Log the full error object
280
+ `Error on manual agent loop streamText (attempt ${consecutiveErrors}/${maxRetries + 1})`);
281
+ const errorMsg = error.message.length > 100
282
+ ? `${error.message.slice(0, 100)}...`
283
+ : error.message;
284
+ yield {
285
+ type: "agent-error",
286
+ message: errorMsg,
287
+ };
288
+ if (NoOutputGeneratedError.isInstance(error)) {
289
+ hasEmittedTerminalEvent = true;
290
+ break;
291
+ }
328
292
  }
329
293
  // Break loop if we exceed max retries
330
294
  if (consecutiveErrors > maxRetries) {
@@ -356,7 +320,7 @@ export class Agent {
356
320
  }
357
321
  resetState() {
358
322
  const { modelManager,
359
- // messageHistory,
323
+ // sessionManager,
360
324
  } = this.opts;
361
325
  this._state = {
362
326
  modelId: modelManager.getModel("repl").modelId,
@@ -367,6 +331,15 @@ export class Agent {
367
331
  totalTokens: 0,
368
332
  reasoningTokens: 0,
369
333
  cachedInputTokens: 0,
334
+ inputTokenDetails: {
335
+ noCacheTokens: 0,
336
+ cacheReadTokens: 0,
337
+ cacheWriteTokens: 0,
338
+ },
339
+ outputTokenDetails: {
340
+ textTokens: 0,
341
+ reasoningTokens: 0,
342
+ },
370
343
  },
371
344
  totalUsage: {
372
345
  inputTokens: 0,
@@ -374,6 +347,15 @@ export class Agent {
374
347
  totalTokens: 0,
375
348
  reasoningTokens: 0,
376
349
  cachedInputTokens: 0,
350
+ inputTokenDetails: {
351
+ noCacheTokens: 0,
352
+ cacheReadTokens: 0,
353
+ cacheWriteTokens: 0,
354
+ },
355
+ outputTokenDetails: {
356
+ textTokens: 0,
357
+ reasoningTokens: 0,
358
+ },
377
359
  },
378
360
  steps: [],
379
361
  timestamps: {
@@ -432,3 +414,32 @@ function formatToolResult(value) {
432
414
  }
433
415
  return String(value);
434
416
  }
417
+ const toolCallRepair = (modelManager) => {
418
+ const fn = async ({ toolCall, tools, inputSchema, error, }) => {
419
+ if (NoSuchToolError.isInstance(error)) {
420
+ return null; // do not attempt to fix invalid tool names
421
+ }
422
+ const tool = tools[toolCall.toolName];
423
+ try {
424
+ const { output: repairedArgs } = await generateText({
425
+ model: modelManager.getModel("tool-repair"),
426
+ output: Output.object({
427
+ schema: tool.inputSchema,
428
+ }),
429
+ prompt: [
430
+ `The model tried to call the tool "${toolCall.toolName}" with the following arguments:`,
431
+ JSON.stringify(toolCall.input),
432
+ "The tool accepts the following schema:",
433
+ JSON.stringify(inputSchema(toolCall)),
434
+ "Please fix the arguments.",
435
+ ].join("\n"),
436
+ });
437
+ return { ...toolCall, args: JSON.stringify(repairedArgs) };
438
+ }
439
+ catch (err) {
440
+ logger.error(err, `Failed to repair tool call: ${toolCall.toolName}.`);
441
+ return null;
442
+ }
443
+ };
444
+ return fn;
445
+ };
package/dist/cli.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import type { WorkspaceContext } from "./index.ts";
2
- import type { MessageHistory } from "./messages.ts";
3
2
  import type { ModelManager } from "./models/manager.js";
4
3
  import type { PromptManager } from "./prompts/manager.ts";
4
+ import type { SessionManager } from "./sessions/manager.ts";
5
5
  import type { TokenCounter } from "./tokens/counter.ts";
6
6
  import type { TokenTracker } from "./tokens/tracker.ts";
7
7
  interface CliOptions {
8
- messageHistory: MessageHistory;
8
+ messageHistory: SessionManager;
9
9
  promptManager: PromptManager;
10
10
  modelManager: ModelManager;
11
11
  tokenTracker: TokenTracker;
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASxD,UAAU,UAAU;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAWD,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,aAAa,CAAU;gBACnB,OAAO,EAAE,UAAU;IAKzB,GAAG;CAiHV"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../source/cli.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD,UAAU,UAAU;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAUD,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,aAAa,CAAU;gBACnB,OAAO,EAAE,UAAU;IAKzB,GAAG;CAsHV"}