@travisennis/acai 0.0.1

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 (439) hide show
  1. package/.acai/acai.json +9 -0
  2. package/.acai/prompts/add-openrouter-model.md +13 -0
  3. package/.acai/prompts/project-status.md +4 -0
  4. package/.acai/prompts/update-architecture-document.md +9 -0
  5. package/.acai/rules/learned-rules.md +9 -0
  6. package/.ai/docs/available-tools.txt +3 -0
  7. package/.ai/docs/cognitive_complexity_refactoring_progress.md +65 -0
  8. package/.ai/docs/deleted_tools.md +168 -0
  9. package/.ai/docs/deleted_tools_88ced9ef.md +56 -0
  10. package/.ai/docs/image-pasting.md +46 -0
  11. package/.ai/docs/initialize-app.md +117 -0
  12. package/.ai/docs/issue-4-plan.md +44 -0
  13. package/.ai/docs/marked-renderer-debug.md +15 -0
  14. package/.ai/docs/marked-renderer-refactor-plan.md +64 -0
  15. package/.ai/docs/memory-use-cases.md +55 -0
  16. package/.ai/docs/prompt-consistency.md +31 -0
  17. package/.ai/docs/refactoring-tools.md +98 -0
  18. package/.ai/docs/system-prompt-update.md +174 -0
  19. package/.ai/docs/system_prompt.txt +210 -0
  20. package/.ai/docs/tasks.md +49 -0
  21. package/.ai/plan.md +131 -0
  22. package/.ai/prompt.md +1 -0
  23. package/.ai/scripts/fetch_models.js +27 -0
  24. package/.ai/scripts/generateSystemPrompt.ts +15 -0
  25. package/.ai/scripts/list-tools.mjs +4 -0
  26. package/.ai/scripts/p5_geometric_shapes.js +149 -0
  27. package/.husky/commit-msg +1 -0
  28. package/.husky/pre-commit +3 -0
  29. package/.husky/pre-push +1 -0
  30. package/.ignore +4 -0
  31. package/AGENTS.md +25 -0
  32. package/ARCHITECTURE.md +304 -0
  33. package/LICENSE +21 -0
  34. package/README.md +392 -0
  35. package/TODO.md +2 -0
  36. package/biome.json +61 -0
  37. package/commitlint.config.js +3 -0
  38. package/dist/cli.d.ts +19 -0
  39. package/dist/cli.js +116 -0
  40. package/dist/commands/application-log-command.d.ts +2 -0
  41. package/dist/commands/application-log-command.js +43 -0
  42. package/dist/commands/clear-command.d.ts +2 -0
  43. package/dist/commands/clear-command.js +12 -0
  44. package/dist/commands/compact-command.d.ts +2 -0
  45. package/dist/commands/compact-command.js +51 -0
  46. package/dist/commands/copy-command.d.ts +2 -0
  47. package/dist/commands/copy-command.js +51 -0
  48. package/dist/commands/edit-command.d.ts +2 -0
  49. package/dist/commands/edit-command.js +53 -0
  50. package/dist/commands/edit-prompt-command.d.ts +2 -0
  51. package/dist/commands/edit-prompt-command.js +25 -0
  52. package/dist/commands/exit-command.d.ts +2 -0
  53. package/dist/commands/exit-command.js +14 -0
  54. package/dist/commands/files-command.d.ts +2 -0
  55. package/dist/commands/files-command.js +63 -0
  56. package/dist/commands/generate-rules-command.d.ts +2 -0
  57. package/dist/commands/generate-rules-command.js +61 -0
  58. package/dist/commands/help-command.d.ts +2 -0
  59. package/dist/commands/help-command.js +19 -0
  60. package/dist/commands/init-command.d.ts +2 -0
  61. package/dist/commands/init-command.js +40 -0
  62. package/dist/commands/last-log-command.d.ts +2 -0
  63. package/dist/commands/last-log-command.js +76 -0
  64. package/dist/commands/manager.d.ts +22 -0
  65. package/dist/commands/manager.js +123 -0
  66. package/dist/commands/model-command.d.ts +2 -0
  67. package/dist/commands/model-command.js +84 -0
  68. package/dist/commands/paste-command.d.ts +2 -0
  69. package/dist/commands/paste-command.js +40 -0
  70. package/dist/commands/prompt-command.d.ts +2 -0
  71. package/dist/commands/prompt-command.js +111 -0
  72. package/dist/commands/reset-command.d.ts +2 -0
  73. package/dist/commands/reset-command.js +16 -0
  74. package/dist/commands/rules-command.d.ts +2 -0
  75. package/dist/commands/rules-command.js +68 -0
  76. package/dist/commands/save-command.d.ts +2 -0
  77. package/dist/commands/save-command.js +14 -0
  78. package/dist/commands/types.d.ts +26 -0
  79. package/dist/commands/types.js +1 -0
  80. package/dist/commands/usage-command.d.ts +2 -0
  81. package/dist/commands/usage-command.js +21 -0
  82. package/dist/config.d.ts +60 -0
  83. package/dist/config.js +193 -0
  84. package/dist/conversation-analyzer.d.ts +10 -0
  85. package/dist/conversation-analyzer.js +88 -0
  86. package/dist/dedent.d.ts +3 -0
  87. package/dist/dedent.js +38 -0
  88. package/dist/formatting.d.ts +17 -0
  89. package/dist/formatting.js +103 -0
  90. package/dist/index.d.ts +18 -0
  91. package/dist/index.js +213 -0
  92. package/dist/logger.d.ts +2 -0
  93. package/dist/logger.js +24 -0
  94. package/dist/mentions.d.ts +9 -0
  95. package/dist/mentions.js +182 -0
  96. package/dist/messages.d.ts +69 -0
  97. package/dist/messages.js +261 -0
  98. package/dist/middleware/audit-message.d.ts +5 -0
  99. package/dist/middleware/audit-message.js +95 -0
  100. package/dist/middleware/index.d.ts +2 -0
  101. package/dist/middleware/index.js +2 -0
  102. package/dist/middleware/rate-limit.d.ts +4 -0
  103. package/dist/middleware/rate-limit.js +17 -0
  104. package/dist/models/ai-config.d.ts +12 -0
  105. package/dist/models/ai-config.js +87 -0
  106. package/dist/models/anthropic-provider.d.ts +25 -0
  107. package/dist/models/anthropic-provider.js +184 -0
  108. package/dist/models/deepseek-provider.d.ts +20 -0
  109. package/dist/models/deepseek-provider.js +42 -0
  110. package/dist/models/google-provider.d.ts +19 -0
  111. package/dist/models/google-provider.js +56 -0
  112. package/dist/models/manager.d.ts +15 -0
  113. package/dist/models/manager.js +48 -0
  114. package/dist/models/openai-provider.d.ts +22 -0
  115. package/dist/models/openai-provider.js +70 -0
  116. package/dist/models/openrouter-provider.d.ts +36 -0
  117. package/dist/models/openrouter-provider.js +276 -0
  118. package/dist/models/providers.d.ts +33 -0
  119. package/dist/models/providers.js +116 -0
  120. package/dist/models/xai-provider.d.ts +20 -0
  121. package/dist/models/xai-provider.js +47 -0
  122. package/dist/parsing.d.ts +2 -0
  123. package/dist/parsing.js +18 -0
  124. package/dist/prompts/manager.d.ts +19 -0
  125. package/dist/prompts/manager.js +71 -0
  126. package/dist/prompts.d.ts +4 -0
  127. package/dist/prompts.js +158 -0
  128. package/dist/repl-prompt.d.ts +14 -0
  129. package/dist/repl-prompt.js +147 -0
  130. package/dist/repl.d.ts +27 -0
  131. package/dist/repl.js +431 -0
  132. package/dist/source/cli.d.ts +19 -0
  133. package/dist/source/cli.js +116 -0
  134. package/dist/source/commands/application-log-command.d.ts +2 -0
  135. package/dist/source/commands/application-log-command.js +43 -0
  136. package/dist/source/commands/clear-command.d.ts +2 -0
  137. package/dist/source/commands/clear-command.js +12 -0
  138. package/dist/source/commands/compact-command.d.ts +2 -0
  139. package/dist/source/commands/compact-command.js +51 -0
  140. package/dist/source/commands/copy-command.d.ts +2 -0
  141. package/dist/source/commands/copy-command.js +51 -0
  142. package/dist/source/commands/edit-command.d.ts +2 -0
  143. package/dist/source/commands/edit-command.js +53 -0
  144. package/dist/source/commands/edit-prompt-command.d.ts +2 -0
  145. package/dist/source/commands/edit-prompt-command.js +25 -0
  146. package/dist/source/commands/exit-command.d.ts +2 -0
  147. package/dist/source/commands/exit-command.js +14 -0
  148. package/dist/source/commands/files-command.d.ts +2 -0
  149. package/dist/source/commands/files-command.js +63 -0
  150. package/dist/source/commands/generate-rules-command.d.ts +2 -0
  151. package/dist/source/commands/generate-rules-command.js +61 -0
  152. package/dist/source/commands/help-command.d.ts +2 -0
  153. package/dist/source/commands/help-command.js +19 -0
  154. package/dist/source/commands/init-command.d.ts +2 -0
  155. package/dist/source/commands/init-command.js +40 -0
  156. package/dist/source/commands/last-log-command.d.ts +2 -0
  157. package/dist/source/commands/last-log-command.js +76 -0
  158. package/dist/source/commands/manager.d.ts +22 -0
  159. package/dist/source/commands/manager.js +123 -0
  160. package/dist/source/commands/model-command.d.ts +2 -0
  161. package/dist/source/commands/model-command.js +84 -0
  162. package/dist/source/commands/paste-command.d.ts +2 -0
  163. package/dist/source/commands/paste-command.js +40 -0
  164. package/dist/source/commands/prompt-command.d.ts +2 -0
  165. package/dist/source/commands/prompt-command.js +111 -0
  166. package/dist/source/commands/reset-command.d.ts +2 -0
  167. package/dist/source/commands/reset-command.js +16 -0
  168. package/dist/source/commands/rules-command.d.ts +2 -0
  169. package/dist/source/commands/rules-command.js +68 -0
  170. package/dist/source/commands/save-command.d.ts +2 -0
  171. package/dist/source/commands/save-command.js +14 -0
  172. package/dist/source/commands/types.d.ts +26 -0
  173. package/dist/source/commands/types.js +1 -0
  174. package/dist/source/commands/usage-command.d.ts +2 -0
  175. package/dist/source/commands/usage-command.js +21 -0
  176. package/dist/source/config.d.ts +60 -0
  177. package/dist/source/config.js +193 -0
  178. package/dist/source/conversation-analyzer.d.ts +10 -0
  179. package/dist/source/conversation-analyzer.js +88 -0
  180. package/dist/source/dedent.d.ts +3 -0
  181. package/dist/source/dedent.js +38 -0
  182. package/dist/source/formatting.d.ts +17 -0
  183. package/dist/source/formatting.js +103 -0
  184. package/dist/source/index.d.ts +18 -0
  185. package/dist/source/index.js +213 -0
  186. package/dist/source/logger.d.ts +2 -0
  187. package/dist/source/logger.js +24 -0
  188. package/dist/source/mentions.d.ts +9 -0
  189. package/dist/source/mentions.js +182 -0
  190. package/dist/source/messages.d.ts +69 -0
  191. package/dist/source/messages.js +261 -0
  192. package/dist/source/middleware/audit-message.d.ts +5 -0
  193. package/dist/source/middleware/audit-message.js +95 -0
  194. package/dist/source/middleware/index.d.ts +2 -0
  195. package/dist/source/middleware/index.js +2 -0
  196. package/dist/source/middleware/rate-limit.d.ts +4 -0
  197. package/dist/source/middleware/rate-limit.js +17 -0
  198. package/dist/source/models/ai-config.d.ts +12 -0
  199. package/dist/source/models/ai-config.js +87 -0
  200. package/dist/source/models/anthropic-provider.d.ts +25 -0
  201. package/dist/source/models/anthropic-provider.js +184 -0
  202. package/dist/source/models/deepseek-provider.d.ts +20 -0
  203. package/dist/source/models/deepseek-provider.js +42 -0
  204. package/dist/source/models/google-provider.d.ts +19 -0
  205. package/dist/source/models/google-provider.js +56 -0
  206. package/dist/source/models/manager.d.ts +15 -0
  207. package/dist/source/models/manager.js +48 -0
  208. package/dist/source/models/openai-provider.d.ts +22 -0
  209. package/dist/source/models/openai-provider.js +70 -0
  210. package/dist/source/models/openrouter-provider.d.ts +36 -0
  211. package/dist/source/models/openrouter-provider.js +276 -0
  212. package/dist/source/models/providers.d.ts +33 -0
  213. package/dist/source/models/providers.js +116 -0
  214. package/dist/source/models/xai-provider.d.ts +20 -0
  215. package/dist/source/models/xai-provider.js +47 -0
  216. package/dist/source/parsing.d.ts +2 -0
  217. package/dist/source/parsing.js +18 -0
  218. package/dist/source/prompts/manager.d.ts +19 -0
  219. package/dist/source/prompts/manager.js +71 -0
  220. package/dist/source/prompts.d.ts +4 -0
  221. package/dist/source/prompts.js +158 -0
  222. package/dist/source/repl-prompt.d.ts +14 -0
  223. package/dist/source/repl-prompt.js +147 -0
  224. package/dist/source/repl.d.ts +27 -0
  225. package/dist/source/repl.js +431 -0
  226. package/dist/source/terminal/formatting.d.ts +37 -0
  227. package/dist/source/terminal/formatting.js +106 -0
  228. package/dist/source/terminal/index.d.ts +94 -0
  229. package/dist/source/terminal/index.js +420 -0
  230. package/dist/source/terminal/markdown-utils.d.ts +2 -0
  231. package/dist/source/terminal/markdown-utils.js +81 -0
  232. package/dist/source/terminal/markdown.d.ts +1 -0
  233. package/dist/source/terminal/markdown.js +111 -0
  234. package/dist/source/terminal/types.d.ts +71 -0
  235. package/dist/source/terminal/types.js +1 -0
  236. package/dist/source/terminal-output.d.ts +8 -0
  237. package/dist/source/terminal-output.js +213 -0
  238. package/dist/source/terminal-output.test.d.ts +8 -0
  239. package/dist/source/terminal-output.test.js +213 -0
  240. package/dist/source/token-tracker.d.ts +14 -0
  241. package/dist/source/token-tracker.js +53 -0
  242. package/dist/source/token-utils.d.ts +7 -0
  243. package/dist/source/token-utils.js +13 -0
  244. package/dist/source/tools/agent.d.ts +17 -0
  245. package/dist/source/tools/agent.js +87 -0
  246. package/dist/source/tools/bash.d.ts +19 -0
  247. package/dist/source/tools/bash.js +294 -0
  248. package/dist/source/tools/code-interpreter.d.ts +12 -0
  249. package/dist/source/tools/code-interpreter.js +131 -0
  250. package/dist/source/tools/command-validation.d.ts +8 -0
  251. package/dist/source/tools/command-validation.js +69 -0
  252. package/dist/source/tools/delete-file.d.ts +12 -0
  253. package/dist/source/tools/delete-file.js +56 -0
  254. package/dist/source/tools/directory-tree.d.ts +12 -0
  255. package/dist/source/tools/directory-tree.js +38 -0
  256. package/dist/source/tools/edit-file.d.ts +19 -0
  257. package/dist/source/tools/edit-file.js +107 -0
  258. package/dist/source/tools/filesystem-utils.d.ts +22 -0
  259. package/dist/source/tools/filesystem-utils.js +191 -0
  260. package/dist/source/tools/git-utils.d.ts +14 -0
  261. package/dist/source/tools/git-utils.js +64 -0
  262. package/dist/source/tools/grep.d.ts +17 -0
  263. package/dist/source/tools/grep.js +138 -0
  264. package/dist/source/tools/index.d.ts +161 -0
  265. package/dist/source/tools/index.js +209 -0
  266. package/dist/source/tools/memory-read.d.ts +13 -0
  267. package/dist/source/tools/memory-read.js +135 -0
  268. package/dist/source/tools/memory-write.d.ts +12 -0
  269. package/dist/source/tools/memory-write.js +83 -0
  270. package/dist/source/tools/move-file.d.ts +13 -0
  271. package/dist/source/tools/move-file.js +44 -0
  272. package/dist/source/tools/read-file.d.ts +17 -0
  273. package/dist/source/tools/read-file.js +86 -0
  274. package/dist/source/tools/read-multiple-files.d.ts +14 -0
  275. package/dist/source/tools/read-multiple-files.js +55 -0
  276. package/dist/source/tools/save-file.d.ts +17 -0
  277. package/dist/source/tools/save-file.js +98 -0
  278. package/dist/source/tools/think.d.ts +11 -0
  279. package/dist/source/tools/think.js +45 -0
  280. package/dist/source/tools/types.d.ts +29 -0
  281. package/dist/source/tools/types.js +14 -0
  282. package/dist/source/tools/web-fetch.d.ts +47 -0
  283. package/dist/source/tools/web-fetch.js +246 -0
  284. package/dist/source/tools/web-search.d.ts +13 -0
  285. package/dist/source/tools/web-search.js +80 -0
  286. package/dist/source/utils/process.d.ts +36 -0
  287. package/dist/source/utils/process.js +75 -0
  288. package/dist/source/version.d.ts +1 -0
  289. package/dist/source/version.js +21 -0
  290. package/dist/terminal/formatting.d.ts +37 -0
  291. package/dist/terminal/formatting.js +106 -0
  292. package/dist/terminal/index.d.ts +94 -0
  293. package/dist/terminal/index.js +420 -0
  294. package/dist/terminal/markdown-utils.d.ts +2 -0
  295. package/dist/terminal/markdown-utils.js +81 -0
  296. package/dist/terminal/markdown.d.ts +1 -0
  297. package/dist/terminal/markdown.js +111 -0
  298. package/dist/terminal/types.d.ts +71 -0
  299. package/dist/terminal/types.js +1 -0
  300. package/dist/terminal-output.d.ts +8 -0
  301. package/dist/terminal-output.js +213 -0
  302. package/dist/token-tracker.d.ts +14 -0
  303. package/dist/token-tracker.js +53 -0
  304. package/dist/token-utils.d.ts +7 -0
  305. package/dist/token-utils.js +13 -0
  306. package/dist/tools/agent.d.ts +17 -0
  307. package/dist/tools/agent.js +87 -0
  308. package/dist/tools/bash.d.ts +19 -0
  309. package/dist/tools/bash.js +294 -0
  310. package/dist/tools/code-interpreter.d.ts +12 -0
  311. package/dist/tools/code-interpreter.js +131 -0
  312. package/dist/tools/command-validation.d.ts +8 -0
  313. package/dist/tools/command-validation.js +69 -0
  314. package/dist/tools/delete-file.d.ts +12 -0
  315. package/dist/tools/delete-file.js +56 -0
  316. package/dist/tools/directory-tree.d.ts +12 -0
  317. package/dist/tools/directory-tree.js +38 -0
  318. package/dist/tools/edit-file.d.ts +19 -0
  319. package/dist/tools/edit-file.js +107 -0
  320. package/dist/tools/filesystem-utils.d.ts +22 -0
  321. package/dist/tools/filesystem-utils.js +191 -0
  322. package/dist/tools/git-utils.d.ts +14 -0
  323. package/dist/tools/git-utils.js +64 -0
  324. package/dist/tools/grep.d.ts +17 -0
  325. package/dist/tools/grep.js +138 -0
  326. package/dist/tools/index.d.ts +161 -0
  327. package/dist/tools/index.js +209 -0
  328. package/dist/tools/memory-read.d.ts +13 -0
  329. package/dist/tools/memory-read.js +135 -0
  330. package/dist/tools/memory-write.d.ts +12 -0
  331. package/dist/tools/memory-write.js +83 -0
  332. package/dist/tools/move-file.d.ts +13 -0
  333. package/dist/tools/move-file.js +44 -0
  334. package/dist/tools/read-file.d.ts +17 -0
  335. package/dist/tools/read-file.js +86 -0
  336. package/dist/tools/read-multiple-files.d.ts +14 -0
  337. package/dist/tools/read-multiple-files.js +55 -0
  338. package/dist/tools/save-file.d.ts +17 -0
  339. package/dist/tools/save-file.js +98 -0
  340. package/dist/tools/think.d.ts +11 -0
  341. package/dist/tools/think.js +45 -0
  342. package/dist/tools/types.d.ts +29 -0
  343. package/dist/tools/types.js +14 -0
  344. package/dist/tools/web-fetch.d.ts +47 -0
  345. package/dist/tools/web-fetch.js +246 -0
  346. package/dist/tools/web-search.d.ts +13 -0
  347. package/dist/tools/web-search.js +80 -0
  348. package/dist/utils/process.d.ts +36 -0
  349. package/dist/utils/process.js +75 -0
  350. package/dist/version.d.ts +1 -0
  351. package/dist/version.js +21 -0
  352. package/knip.json +5 -0
  353. package/package.json +83 -0
  354. package/source/cli.ts +172 -0
  355. package/source/commands/application-log-command.ts +53 -0
  356. package/source/commands/clear-command.ts +14 -0
  357. package/source/commands/compact-command.ts +64 -0
  358. package/source/commands/copy-command.ts +55 -0
  359. package/source/commands/edit-command.ts +63 -0
  360. package/source/commands/edit-prompt-command.ts +31 -0
  361. package/source/commands/exit-command.ts +18 -0
  362. package/source/commands/files-command.ts +85 -0
  363. package/source/commands/generate-rules-command.ts +82 -0
  364. package/source/commands/help-command.ts +27 -0
  365. package/source/commands/init-command.ts +48 -0
  366. package/source/commands/last-log-command.ts +88 -0
  367. package/source/commands/manager.ts +151 -0
  368. package/source/commands/model-command.ts +123 -0
  369. package/source/commands/paste-command.ts +62 -0
  370. package/source/commands/prompt-command.ts +150 -0
  371. package/source/commands/reset-command.ts +22 -0
  372. package/source/commands/rules-command.ts +76 -0
  373. package/source/commands/save-command.ts +20 -0
  374. package/source/commands/types.ts +28 -0
  375. package/source/commands/usage-command.ts +26 -0
  376. package/source/config.ts +223 -0
  377. package/source/conversation-analyzer.ts +115 -0
  378. package/source/dedent.ts +53 -0
  379. package/source/formatting.ts +132 -0
  380. package/source/index.ts +240 -0
  381. package/source/logger.ts +29 -0
  382. package/source/mentions.ts +227 -0
  383. package/source/messages.ts +360 -0
  384. package/source/middleware/audit-message.ts +133 -0
  385. package/source/middleware/index.ts +2 -0
  386. package/source/middleware/rate-limit.ts +24 -0
  387. package/source/models/ai-config.ts +109 -0
  388. package/source/models/anthropic-provider.ts +199 -0
  389. package/source/models/deepseek-provider.ts +53 -0
  390. package/source/models/google-provider.ts +68 -0
  391. package/source/models/manager.ts +84 -0
  392. package/source/models/openai-provider.ts +81 -0
  393. package/source/models/openrouter-provider.ts +288 -0
  394. package/source/models/providers.ts +197 -0
  395. package/source/models/xai-provider.ts +59 -0
  396. package/source/parsing.ts +20 -0
  397. package/source/prompts/manager.ts +90 -0
  398. package/source/prompts.ts +172 -0
  399. package/source/repl-prompt.ts +196 -0
  400. package/source/repl.ts +572 -0
  401. package/source/terminal/formatting.ts +121 -0
  402. package/source/terminal/index.ts +518 -0
  403. package/source/terminal/markdown-utils.ts +89 -0
  404. package/source/terminal/markdown.ts +155 -0
  405. package/source/terminal/types.ts +84 -0
  406. package/source/terminal-output.test.ts +266 -0
  407. package/source/token-tracker.ts +78 -0
  408. package/source/token-utils.ts +17 -0
  409. package/source/tools/agent.ts +107 -0
  410. package/source/tools/bash.ts +367 -0
  411. package/source/tools/code-interpreter.ts +172 -0
  412. package/source/tools/command-validation.ts +81 -0
  413. package/source/tools/delete-file.ts +71 -0
  414. package/source/tools/directory-tree.ts +54 -0
  415. package/source/tools/edit-file.ts +155 -0
  416. package/source/tools/filesystem-utils.ts +265 -0
  417. package/source/tools/git-utils.ts +70 -0
  418. package/source/tools/grep.ts +184 -0
  419. package/source/tools/index.ts +278 -0
  420. package/source/tools/memory-read.ts +174 -0
  421. package/source/tools/memory-write.ts +105 -0
  422. package/source/tools/move-file.ts +59 -0
  423. package/source/tools/read-file.ts +129 -0
  424. package/source/tools/read-multiple-files.ts +80 -0
  425. package/source/tools/save-file.ts +147 -0
  426. package/source/tools/think.ts +51 -0
  427. package/source/tools/types.ts +58 -0
  428. package/source/tools/web-fetch.ts +327 -0
  429. package/source/tools/web-search.ts +101 -0
  430. package/source/utils/process.ts +121 -0
  431. package/source/version.ts +21 -0
  432. package/test/commands/copy-command.test.ts +69 -0
  433. package/test/config.test.ts +200 -0
  434. package/test/terminal/markdown-utils.test.ts +124 -0
  435. package/test/tools/bash-tool.test.ts +58 -0
  436. package/test/tools/code-interpreter.test.ts +91 -0
  437. package/test/tools/command-validation.test.ts +48 -0
  438. package/tsconfig.build.json +9 -0
  439. package/tsconfig.json +30 -0
@@ -0,0 +1,158 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { platform } from "node:os";
3
+ import path from "node:path";
4
+ import { config } from "./config.js";
5
+ import { dedent } from "./dedent.js";
6
+ import { AgentTool } from "./tools/agent.js";
7
+ import { BashTool } from "./tools/bash.js";
8
+ import { CodeInterpreterTool } from "./tools/code-interpreter.js";
9
+ import { DirectoryTreeTool } from "./tools/directory-tree.js";
10
+ import { EditFileTool } from "./tools/edit-file.js";
11
+ import { getCurrentBranch, inGitDirectory } from "./tools/git-utils.js";
12
+ import { GrepTool } from "./tools/grep.js";
13
+ import { ReadFileTool } from "./tools/read-file.js";
14
+ import { SaveFileTool } from "./tools/save-file.js";
15
+ import { ThinkTool } from "./tools/think.js";
16
+ import { WebFetchTool } from "./tools/web-fetch.js";
17
+ import { WebSearchTool } from "./tools/web-search.js";
18
+ function intro() {
19
+ return "You are acai, an AI-powered CLI assistant that accelerates software engineering workflows through intelligent command-line assistance.";
20
+ }
21
+ async function instructions() {
22
+ const systemMdPath = path.join(config.project.getPath(), "system.md");
23
+ try {
24
+ const content = await readFile(systemMdPath, "utf8");
25
+ if (content.trim()) {
26
+ return content;
27
+ }
28
+ }
29
+ catch {
30
+ // system.md doesn't exist or is empty, use default instructions
31
+ }
32
+ return `## Core Principles
33
+
34
+ - **CLI-Optimized**: Be concise and direct - responses appear in a terminal.
35
+ - **Progressive Problem Solving**: Work through problems methodically until resolution.
36
+ - **User Authority**: NEVER commit changes or add dependencies without explicit user approval.
37
+ - **Security-First**: Prioritize secure coding practices in all suggestions.
38
+ - **Completion Focus**: Continue working until the user's query is completely resolved.
39
+ - **Expert Level**: Assume the user is an experienced software engineer.
40
+
41
+ ## Response Format
42
+
43
+ - **Direct Answers**: One-word or concise answers when possible.
44
+ - **Code First**: Lead with code snippets for code-related queries.
45
+ - **No Fluff**: Avoid preambles or phrases like "Here is the content..."
46
+ - **Error Reporting**: Specify error, location, and fix (e.g., \`Error: TypeError at auth.ts:42. Fix: Add null check.\`).
47
+
48
+ ## Work Standards
49
+
50
+ ### Code Quality
51
+ - Match existing code conventions and patterns
52
+ - Use libraries/utilities already in the project
53
+ - Prioritize maintainable, readable code over clever solutions
54
+
55
+ ### Security & Error Handling
56
+ - Validate/sanitize all inputs and outputs
57
+ - Use parameterized queries for databases
58
+ - Never hardcode secrets; prevent injection attacks, XSS, unauthorized access
59
+ - Apply principle of least privilege in API integrations
60
+ - If a tool fails, ask the user how to proceed
61
+ - Report errors with specific locations and suggested fixes`;
62
+ }
63
+ function toolUsage() {
64
+ return `## Tool Usage Guidelines
65
+
66
+ ### Information Gathering
67
+ - Use \`${DirectoryTreeTool.name}\` for project structure
68
+ - Use \`${ReadFileTool.name}\` for file contents if filenames are provided in the prompt
69
+ - Use \`${GrepTool.name}\` for code pattern searches
70
+ - Use \`${WebFetchTool.name}\` for text-based URLs provided in the prompt
71
+ - Use \`${WebSearchTool.name}\` for external research (e.g., libraries, errors)
72
+ - Use \`${AgentTool.name}\` for iterative keyword/file searches
73
+ - If file contents or URLs are provided in the prompt, use them directly without re-fetching
74
+ - Always verify file contents before suggesting changes unless provided in the prompt
75
+
76
+ ### Code Modification
77
+ - Use \`${EditFileTool.name}\` for existing file edits (requires user approval)
78
+ - Use \`${SaveFileTool.name}\` for new files only
79
+
80
+ ### Planning & Complex Tasks
81
+ - Use \`${ThinkTool.name}\` for structured reasoning on complex problems
82
+ - Outline multi-step tasks before execution
83
+
84
+ ### Bash Commands (\`${BashTool.name}\`)
85
+ - Execute bash commands within project directory only
86
+ - Always specify absolute paths to avoid errors
87
+ - You have access to the Github CLI
88
+ - **Background Processes:** Use background processes (via \`&\`) for commands that are unlikely to stop on their own, e.g. \`node server.js &\`. If unsure, ask the user.
89
+ - **Interactive Commands:** Try to avoid shell commands that are likely to require user interaction (e.g. \`git rebase -i\`). Use non-interactive versions of commands (e.g. \`npm init -y\` instead of \`npm init\`) when available, and otherwise remind the user that interactive shell commands are not supported and may cause hangs until canceled by the user.
90
+
91
+ ### Code Interpreter (\`${CodeInterpreterTool.name}\`)
92
+ - Executes JavaScript code in a separate Node.js process using Node's Permission Model
93
+ - By default, the child process has no permissions except read/write within the current working directory
94
+ - Returns stdout, stderr, and exitCode
95
+ - Use console.log/console.error to produce outpu`;
96
+ }
97
+ function escalationProcedures() {
98
+ return `## Escalation
99
+
100
+ - If stuck, state the limitation, suggest alternatives, and ask the user for guidance`;
101
+ }
102
+ async function getRules() {
103
+ const rules = (await config.readAgentsFile()).trim();
104
+ const learnedRules = (await config.readProjectLearnedRulesFile()).trim();
105
+ let result = "";
106
+ if (rules) {
107
+ result += `## Project Rules:\n\n${rules}\n`;
108
+ }
109
+ if (learnedRules) {
110
+ if (!rules) {
111
+ result += "## Project Rules:\n\n";
112
+ }
113
+ result += `### Important rules to follow\n\n${learnedRules}`;
114
+ }
115
+ return result.trim();
116
+ }
117
+ async function environmentInfo() {
118
+ const gitDirectory = await inGitDirectory();
119
+ let gitSection = `- **Is directory a git repo**: ${gitDirectory ? "Yes" : "No"}`;
120
+ if (gitDirectory) {
121
+ gitSection += `\n- ** Current git branch**: ${await getCurrentBranch()}`;
122
+ }
123
+ return `## Environment
124
+
125
+ - **Current working directory**: ${process.cwd()}. [Use this value directly instead of calling the \`${BashTool.name}(pwd)\` tool unless you have a specific reason to verify it].
126
+ ${gitSection}
127
+ - **Platform**: ${platform()}
128
+ - **Today's date**: ${(new Date()).toISOString()}`;
129
+ }
130
+ export async function systemPrompt(options) {
131
+ const { supportsToolCalling = true } = options ?? {};
132
+ const prompt = dedent `
133
+ ${intro()}
134
+
135
+ ${await instructions()}
136
+
137
+ ${supportsToolCalling ? toolUsage() : ""}
138
+
139
+ ${escalationProcedures()}
140
+
141
+ ${await getRules()}
142
+
143
+ ${await environmentInfo()}
144
+ `;
145
+ return prompt;
146
+ }
147
+ export async function minSystemPrompt() {
148
+ const prompt = dedent `
149
+ ${intro()}
150
+
151
+ ${await instructions()}
152
+
153
+ ${await getRules()}
154
+
155
+ ${await environmentInfo()}
156
+ `;
157
+ return prompt;
158
+ }
@@ -0,0 +1,14 @@
1
+ import type { CommandManager } from "./commands/manager.ts";
2
+ export declare class ReplPrompt {
3
+ private keypressListener?;
4
+ private rl;
5
+ private history;
6
+ private maxHistory;
7
+ constructor({ commands, history, }: {
8
+ commands: CommandManager;
9
+ history: string[];
10
+ });
11
+ input(): Promise<string>;
12
+ close(): void;
13
+ [Symbol.dispose](): void;
14
+ }
@@ -0,0 +1,147 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import { parse, sep } from "node:path";
3
+ import { createInterface } from "node:readline/promises";
4
+ import Clipboard from "@crosscopy/clipboard";
5
+ import { asyncTry } from "@travisennis/stdlib/try";
6
+ import { logger } from "./logger.js";
7
+ const whitespaceRegex = /\s+/;
8
+ async function fileSystemCompleter(line) {
9
+ try {
10
+ const words = line.split(" ");
11
+ let last = words.at(-1);
12
+ if (!last) {
13
+ return [[], line];
14
+ }
15
+ const isAt = last.startsWith("@");
16
+ if (isAt) {
17
+ last = last.slice(1);
18
+ }
19
+ let { dir, base } = parse(last);
20
+ // If dir is empty, use current directory
21
+ if (!dir) {
22
+ dir = ".";
23
+ }
24
+ let tryAttempt = await asyncTry(readdir(dir, { withFileTypes: true }));
25
+ if (tryAttempt.isFailure) {
26
+ tryAttempt = await asyncTry(readdir(".", { withFileTypes: true }));
27
+ }
28
+ let dirEntries = tryAttempt.unwrap();
29
+ // for an exact match that is a directory, read the contents of the directory
30
+ if (dirEntries.find((entry) => entry.name === base && entry.isDirectory())) {
31
+ dir = dir === "/" || dir === sep ? `${dir}${base}` : `${dir}/${base}`;
32
+ dirEntries = await readdir(dir, { withFileTypes: true });
33
+ base = "";
34
+ }
35
+ else {
36
+ dirEntries = dirEntries.filter((entry) => entry.name.startsWith(base));
37
+ }
38
+ const hits = dirEntries
39
+ .filter((entry) => entry.isFile() || entry.isDirectory())
40
+ .map((entry) => {
41
+ const prefix = dir === "." ? "" : dir === sep || dir === "/" ? "" : `${dir}/`;
42
+ return `${isAt ? "@" : ""}${prefix}${entry.name}${entry.isDirectory() && !entry.name.endsWith("/") ? "/" : ""}`;
43
+ });
44
+ return [hits, `${isAt ? "@" : ""}${last}`];
45
+ }
46
+ catch (_error) {
47
+ logger.error(_error);
48
+ return [[], line];
49
+ }
50
+ }
51
+ export class ReplPrompt {
52
+ // biome-ignore lint/suspicious/noExplicitAny: Keypress listener signature
53
+ keypressListener;
54
+ rl;
55
+ history;
56
+ maxHistory = 25;
57
+ constructor({ commands, history, }) {
58
+ this.history = history;
59
+ this.rl = createInterface({
60
+ input: process.stdin,
61
+ output: process.stdout,
62
+ history: this.history,
63
+ historySize: this.maxHistory,
64
+ completer: async (line) => {
65
+ const completions = commands.getCommands();
66
+ const words = line.trim().split(whitespaceRegex);
67
+ const firstWord = words[0] ?? "";
68
+ const rest = words.slice(1).join(" ") ?? "";
69
+ const matchingCommands = completions.filter((c) => c.startsWith(firstWord));
70
+ if (matchingCommands.length === 1 && rest !== "") {
71
+ // Single command matched, try to get subcommands
72
+ const subCompletions = await commands.getSubCommands(matchingCommands[0] ?? "");
73
+ const hits = subCompletions.filter((sc) => sc.startsWith(rest) || rest === "*");
74
+ if (hits.length > 0) {
75
+ return [hits.map((h) => `${firstWord} ${h}`), line];
76
+ }
77
+ }
78
+ if (matchingCommands.length > 0 &&
79
+ (words.length === 1 || line.endsWith(" "))) {
80
+ return [matchingCommands, line];
81
+ }
82
+ return fileSystemCompleter(line); // [completions, line];
83
+ },
84
+ });
85
+ if (process.stdin.isTTY) {
86
+ this.keypressListener = async (_str, key) => {
87
+ // if (this.rl.closed) {
88
+ // if (this.keypressListener) {
89
+ // process.stdin.off("keypress", this.keypressListener);
90
+ // this.keypressListener = undefined;
91
+ // }
92
+ // return;
93
+ // }
94
+ if (key?.ctrl && key.name === "v" && !key.meta && !key.shift) {
95
+ try {
96
+ const clipboardText = await Clipboard.getText();
97
+ if (clipboardText) {
98
+ const currentLine = this.rl.line;
99
+ const cursorPos = this.rl.cursor;
100
+ const beforeCursor = currentLine.substring(0, cursorPos);
101
+ const afterCursor = currentLine.substring(cursorPos);
102
+ const newLine = beforeCursor + clipboardText + afterCursor;
103
+ // biome-ignore lint/suspicious/noExplicitAny: Accessing internal readline method
104
+ this.rl.line = newLine;
105
+ // biome-ignore lint/suspicious/noExplicitAny: Accessing internal readline method
106
+ this.rl.cursor = cursorPos + clipboardText.length;
107
+ // biome-ignore lint/suspicious/noExplicitAny: Accessing internal readline method
108
+ this.rl._refreshLine();
109
+ }
110
+ }
111
+ catch (error) {
112
+ logger.error(`Failed to paste from clipboard: ${error.message}`);
113
+ }
114
+ }
115
+ };
116
+ process.stdin.on("keypress", this.keypressListener);
117
+ }
118
+ }
119
+ async input() {
120
+ const input = await this.rl.question("> ");
121
+ // The readline interface automatically adds the input to the history.
122
+ // We need to handle two things:
123
+ // 1. Don't save empty lines.
124
+ // 2. Enforce max history size.
125
+ if (!input.trim()) {
126
+ // Last entry was this empty input, so remove it.
127
+ this.history.pop();
128
+ }
129
+ else {
130
+ // A valid command was added. Trim history if needed.
131
+ while (this.history.length > this.maxHistory) {
132
+ this.history.shift();
133
+ }
134
+ }
135
+ return input;
136
+ }
137
+ close() {
138
+ if (this.keypressListener) {
139
+ process.stdin.off("keypress", this.keypressListener);
140
+ this.keypressListener = undefined;
141
+ }
142
+ this.rl.close();
143
+ }
144
+ [Symbol.dispose]() {
145
+ this.close();
146
+ }
147
+ }
package/dist/repl.d.ts ADDED
@@ -0,0 +1,27 @@
1
+ import type { CommandManager } from "./commands/manager.ts";
2
+ import type { MessageHistory } from "./messages.ts";
3
+ import type { ModelManager } from "./models/manager.js";
4
+ import type { PromptManager } from "./prompts/manager.ts";
5
+ import type { Terminal } from "./terminal/index.ts";
6
+ import type { TokenTracker } from "./token-tracker.ts";
7
+ import type { TokenCounter } from "./token-utils.ts";
8
+ import type { Message } from "./tools/types.ts";
9
+ interface ReplOptions {
10
+ messageHistory: MessageHistory;
11
+ promptManager: PromptManager;
12
+ modelManager: ModelManager;
13
+ tokenTracker: TokenTracker;
14
+ terminal: Terminal;
15
+ commands: CommandManager;
16
+ config: Record<PropertyKey, unknown>;
17
+ tokenCounter: TokenCounter;
18
+ toolEvents: Map<string, Message[]>;
19
+ autoAcceptAll: boolean;
20
+ }
21
+ export declare class Repl {
22
+ private options;
23
+ constructor(options: ReplOptions);
24
+ run(): Promise<void>;
25
+ private displayToolUse;
26
+ }
27
+ export {};