@travisennis/acai 0.0.3 → 0.0.5

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 (316) hide show
  1. package/README.md +225 -6
  2. package/dist/api/exa/index.d.ts +177 -0
  3. package/dist/api/exa/index.d.ts.map +1 -0
  4. package/dist/api/exa/index.js +439 -0
  5. package/dist/cli.d.ts +3 -2
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/commands/application-log-command.d.ts +1 -0
  8. package/dist/commands/application-log-command.d.ts.map +1 -0
  9. package/dist/commands/application-log-command.js +5 -3
  10. package/dist/commands/clear-command.d.ts +1 -0
  11. package/dist/commands/clear-command.d.ts.map +1 -0
  12. package/dist/commands/clear-command.js +2 -3
  13. package/dist/commands/compact-command.d.ts +1 -0
  14. package/dist/commands/compact-command.d.ts.map +1 -0
  15. package/dist/commands/compact-command.js +1 -1
  16. package/dist/commands/copy-command.d.ts +1 -0
  17. package/dist/commands/copy-command.d.ts.map +1 -0
  18. package/dist/commands/copy-command.js +3 -2
  19. package/dist/commands/edit-command.d.ts +1 -0
  20. package/dist/commands/edit-command.d.ts.map +1 -0
  21. package/dist/commands/edit-command.js +7 -5
  22. package/dist/commands/edit-prompt-command.d.ts +2 -1
  23. package/dist/commands/edit-prompt-command.d.ts.map +1 -0
  24. package/dist/commands/edit-prompt-command.js +15 -7
  25. package/dist/commands/exit-command.d.ts +13 -2
  26. package/dist/commands/exit-command.d.ts.map +1 -0
  27. package/dist/commands/exit-command.js +14 -2
  28. package/dist/commands/files-command.d.ts +1 -0
  29. package/dist/commands/files-command.d.ts.map +1 -0
  30. package/dist/commands/files-command.js +9 -8
  31. package/dist/commands/generate-rules-command.d.ts +1 -0
  32. package/dist/commands/generate-rules-command.d.ts.map +1 -0
  33. package/dist/commands/generate-rules-command.js +4 -3
  34. package/dist/commands/health-command.d.ts +3 -1
  35. package/dist/commands/health-command.d.ts.map +1 -0
  36. package/dist/commands/health-command.js +42 -5
  37. package/dist/commands/help-command.d.ts +1 -0
  38. package/dist/commands/help-command.d.ts.map +1 -0
  39. package/dist/commands/help-command.js +2 -3
  40. package/dist/commands/init-command.d.ts +1 -0
  41. package/dist/commands/init-command.d.ts.map +1 -0
  42. package/dist/commands/init-command.js +1 -2
  43. package/dist/commands/last-log-command.d.ts +1 -0
  44. package/dist/commands/last-log-command.d.ts.map +1 -0
  45. package/dist/commands/last-log-command.js +12 -17
  46. package/dist/commands/list-tools-command.d.ts +3 -0
  47. package/dist/commands/list-tools-command.d.ts.map +1 -0
  48. package/dist/commands/list-tools-command.js +61 -0
  49. package/dist/commands/manager.d.ts +7 -2
  50. package/dist/commands/manager.d.ts.map +1 -0
  51. package/dist/commands/manager.js +43 -6
  52. package/dist/commands/model-command.d.ts +1 -0
  53. package/dist/commands/model-command.d.ts.map +1 -0
  54. package/dist/commands/model-command.js +5 -5
  55. package/dist/commands/paste-command.d.ts +1 -0
  56. package/dist/commands/paste-command.d.ts.map +1 -0
  57. package/dist/commands/paste-command.js +6 -5
  58. package/dist/commands/prompt-command.d.ts +2 -1
  59. package/dist/commands/prompt-command.d.ts.map +1 -0
  60. package/dist/commands/prompt-command.js +62 -8
  61. package/dist/commands/reset-command.d.ts +1 -0
  62. package/dist/commands/reset-command.d.ts.map +1 -0
  63. package/dist/commands/reset-command.js +1 -1
  64. package/dist/commands/rules-command.d.ts +1 -0
  65. package/dist/commands/rules-command.d.ts.map +1 -0
  66. package/dist/commands/rules-command.js +5 -3
  67. package/dist/commands/save-command.d.ts +1 -0
  68. package/dist/commands/save-command.d.ts.map +1 -0
  69. package/dist/commands/save-command.js +1 -1
  70. package/dist/commands/shell-command.d.ts +3 -0
  71. package/dist/commands/shell-command.d.ts.map +1 -0
  72. package/dist/commands/shell-command.js +60 -0
  73. package/dist/commands/types.d.ts +9 -6
  74. package/dist/commands/types.d.ts.map +1 -0
  75. package/dist/commands/usage-command.d.ts +1 -0
  76. package/dist/commands/usage-command.d.ts.map +1 -0
  77. package/dist/commands/usage-command.js +2 -3
  78. package/dist/config.d.ts +22 -34
  79. package/dist/config.d.ts.map +1 -0
  80. package/dist/config.js +61 -15
  81. package/dist/conversation-analyzer.d.ts +2 -1
  82. package/dist/conversation-analyzer.d.ts.map +1 -0
  83. package/dist/dedent.d.ts +1 -0
  84. package/dist/dedent.d.ts.map +1 -0
  85. package/dist/execution/index.d.ts +112 -0
  86. package/dist/execution/index.d.ts.map +1 -0
  87. package/dist/execution/index.js +432 -0
  88. package/dist/formatting.d.ts +2 -13
  89. package/dist/formatting.d.ts.map +1 -0
  90. package/dist/formatting.js +5 -64
  91. package/dist/index.d.ts +1 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +14 -4
  94. package/dist/logger.d.ts +1 -0
  95. package/dist/logger.d.ts.map +1 -0
  96. package/dist/mentions.d.ts +4 -0
  97. package/dist/mentions.d.ts.map +1 -0
  98. package/dist/mentions.js +42 -10
  99. package/dist/messages.d.ts +8 -20
  100. package/dist/messages.d.ts.map +1 -0
  101. package/dist/messages.js +33 -53
  102. package/dist/middleware/audit-message.d.ts +1 -0
  103. package/dist/middleware/audit-message.d.ts.map +1 -0
  104. package/dist/middleware/index.d.ts +1 -0
  105. package/dist/middleware/index.d.ts.map +1 -0
  106. package/dist/middleware/rate-limit.d.ts +1 -0
  107. package/dist/middleware/rate-limit.d.ts.map +1 -0
  108. package/dist/models/ai-config.d.ts +1 -0
  109. package/dist/models/ai-config.d.ts.map +1 -0
  110. package/dist/models/anthropic-provider.d.ts +1 -0
  111. package/dist/models/anthropic-provider.d.ts.map +1 -0
  112. package/dist/models/deepseek-provider.d.ts +1 -0
  113. package/dist/models/deepseek-provider.d.ts.map +1 -0
  114. package/dist/models/google-provider.d.ts +1 -0
  115. package/dist/models/google-provider.d.ts.map +1 -0
  116. package/dist/models/groq-provider.d.ts +20 -0
  117. package/dist/models/groq-provider.d.ts.map +1 -0
  118. package/dist/models/groq-provider.js +31 -0
  119. package/dist/models/manager.d.ts +1 -0
  120. package/dist/models/manager.d.ts.map +1 -0
  121. package/dist/models/openai-provider.d.ts +2 -1
  122. package/dist/models/openai-provider.d.ts.map +1 -0
  123. package/dist/models/openrouter-provider.d.ts +31 -22
  124. package/dist/models/openrouter-provider.d.ts.map +1 -0
  125. package/dist/models/openrouter-provider.js +115 -1
  126. package/dist/models/providers.d.ts +4 -5
  127. package/dist/models/providers.d.ts.map +1 -0
  128. package/dist/models/providers.js +7 -3
  129. package/dist/models/xai-provider.d.ts +1 -0
  130. package/dist/models/xai-provider.d.ts.map +1 -0
  131. package/dist/parsing.d.ts +2 -1
  132. package/dist/parsing.d.ts.map +1 -0
  133. package/dist/prompts/manager.d.ts +14 -2
  134. package/dist/prompts/manager.d.ts.map +1 -0
  135. package/dist/prompts.d.ts +1 -0
  136. package/dist/prompts.d.ts.map +1 -0
  137. package/dist/prompts.js +17 -11
  138. package/dist/repl/display-tool-messages.d.ts +4 -0
  139. package/dist/repl/display-tool-messages.d.ts.map +1 -0
  140. package/dist/repl/display-tool-messages.js +55 -0
  141. package/dist/repl/display-tool-use.d.ts +14 -0
  142. package/dist/repl/display-tool-use.d.ts.map +1 -0
  143. package/dist/repl/display-tool-use.js +63 -0
  144. package/dist/repl/get-prompt-header.d.ts +8 -0
  145. package/dist/repl/get-prompt-header.d.ts.map +1 -0
  146. package/dist/repl/get-prompt-header.js +38 -0
  147. package/dist/repl/tool-call-repair.d.ts +4 -0
  148. package/dist/repl/tool-call-repair.d.ts.map +1 -0
  149. package/dist/repl/tool-call-repair.js +50 -0
  150. package/dist/repl-prompt.d.ts +1 -0
  151. package/dist/repl-prompt.d.ts.map +1 -0
  152. package/dist/repl.d.ts +8 -4
  153. package/dist/repl.d.ts.map +1 -0
  154. package/dist/repl.js +108 -252
  155. package/dist/terminal/ansi-styles.d.ts +77 -0
  156. package/dist/terminal/ansi-styles.d.ts.map +1 -0
  157. package/dist/terminal/ansi-styles.js +215 -0
  158. package/dist/terminal/checkbox-prompt.d.ts +36 -0
  159. package/dist/terminal/checkbox-prompt.d.ts.map +1 -0
  160. package/dist/terminal/checkbox-prompt.js +362 -0
  161. package/dist/terminal/default-theme.d.ts +6 -0
  162. package/dist/terminal/default-theme.d.ts.map +1 -0
  163. package/dist/terminal/default-theme.js +182 -0
  164. package/dist/terminal/east-asian-width.d.ts +8 -0
  165. package/dist/terminal/east-asian-width.d.ts.map +1 -0
  166. package/dist/terminal/east-asian-width.js +409 -0
  167. package/dist/terminal/editor-prompt.d.ts +10 -0
  168. package/dist/terminal/editor-prompt.d.ts.map +1 -0
  169. package/dist/terminal/editor-prompt.js +61 -0
  170. package/dist/terminal/errors.d.ts +19 -0
  171. package/dist/terminal/errors.d.ts.map +1 -0
  172. package/dist/terminal/errors.js +37 -0
  173. package/dist/terminal/formatting.d.ts +1 -11
  174. package/dist/terminal/formatting.d.ts.map +1 -0
  175. package/dist/terminal/formatting.js +4 -20
  176. package/dist/terminal/highlight/index.d.ts +53 -0
  177. package/dist/terminal/highlight/index.d.ts.map +1 -0
  178. package/dist/terminal/highlight/index.js +90 -0
  179. package/dist/terminal/highlight/theme.d.ts +233 -0
  180. package/dist/terminal/highlight/theme.d.ts.map +1 -0
  181. package/dist/terminal/highlight/theme.js +83 -0
  182. package/dist/terminal/index.d.ts +16 -9
  183. package/dist/terminal/index.d.ts.map +1 -0
  184. package/dist/terminal/index.js +42 -126
  185. package/dist/terminal/input-prompt.d.ts +16 -0
  186. package/dist/terminal/input-prompt.d.ts.map +1 -0
  187. package/dist/terminal/input-prompt.js +181 -0
  188. package/dist/terminal/markdown-utils.d.ts +1 -0
  189. package/dist/terminal/markdown-utils.d.ts.map +1 -0
  190. package/dist/terminal/markdown.d.ts +1 -0
  191. package/dist/terminal/markdown.d.ts.map +1 -0
  192. package/dist/terminal/markdown.js +17 -12
  193. package/dist/terminal/search-prompt.d.ts +20 -0
  194. package/dist/terminal/search-prompt.d.ts.map +1 -0
  195. package/dist/terminal/search-prompt.js +279 -0
  196. package/dist/terminal/select-prompt.d.ts +26 -0
  197. package/dist/terminal/select-prompt.d.ts.map +1 -0
  198. package/dist/terminal/select-prompt.js +298 -0
  199. package/dist/terminal/string-width.d.ts +7 -0
  200. package/dist/terminal/string-width.d.ts.map +1 -0
  201. package/dist/terminal/string-width.js +61 -0
  202. package/dist/terminal/strip-ansi.d.ts +2 -0
  203. package/dist/terminal/strip-ansi.d.ts.map +1 -0
  204. package/dist/terminal/strip-ansi.js +20 -0
  205. package/dist/terminal/style.d.ts +191 -0
  206. package/dist/terminal/style.d.ts.map +1 -0
  207. package/dist/terminal/style.js +259 -0
  208. package/dist/terminal/supports-color.d.ts +1 -0
  209. package/dist/terminal/supports-color.d.ts.map +1 -0
  210. package/dist/terminal/supports-hyperlinks.d.ts +1 -3
  211. package/dist/terminal/supports-hyperlinks.d.ts.map +1 -0
  212. package/dist/terminal/supports-hyperlinks.js +1 -1
  213. package/dist/terminal/types.d.ts +1 -37
  214. package/dist/terminal/types.d.ts.map +1 -0
  215. package/dist/terminal/wrap-ansi.d.ts +8 -0
  216. package/dist/terminal/wrap-ansi.d.ts.map +1 -0
  217. package/dist/terminal/wrap-ansi.js +190 -0
  218. package/dist/{token-utils.d.ts → tokens/counter.d.ts} +1 -0
  219. package/dist/tokens/counter.d.ts.map +1 -0
  220. package/dist/{token-utils.js → tokens/counter.js} +1 -1
  221. package/dist/tokens/manage-output.d.ts +34 -0
  222. package/dist/tokens/manage-output.d.ts.map +1 -0
  223. package/dist/tokens/manage-output.js +44 -0
  224. package/dist/{token-tracker.d.ts → tokens/tracker.d.ts} +1 -0
  225. package/dist/tokens/tracker.d.ts.map +1 -0
  226. package/dist/tool-executor.d.ts +28 -0
  227. package/dist/tool-executor.d.ts.map +1 -0
  228. package/dist/tool-executor.js +74 -0
  229. package/dist/tools/agent.d.ts +3 -2
  230. package/dist/tools/agent.d.ts.map +1 -0
  231. package/dist/tools/agent.js +7 -4
  232. package/dist/tools/bash-utils.d.ts +7 -0
  233. package/dist/tools/bash-utils.d.ts.map +1 -0
  234. package/dist/tools/bash-utils.js +212 -0
  235. package/dist/tools/bash.d.ts +9 -7
  236. package/dist/tools/bash.d.ts.map +1 -0
  237. package/dist/tools/bash.js +95 -212
  238. package/dist/tools/code-interpreter.d.ts +1 -0
  239. package/dist/tools/code-interpreter.d.ts.map +1 -0
  240. package/dist/tools/code-interpreter.js +33 -8
  241. package/dist/tools/delete-file.d.ts +5 -3
  242. package/dist/tools/delete-file.d.ts.map +1 -0
  243. package/dist/tools/delete-file.js +47 -33
  244. package/dist/tools/directory-tree.d.ts +10 -1
  245. package/dist/tools/directory-tree.d.ts.map +1 -0
  246. package/dist/tools/directory-tree.js +91 -8
  247. package/dist/tools/dynamic-tool-loader.d.ts +12 -0
  248. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -0
  249. package/dist/tools/dynamic-tool-loader.js +280 -0
  250. package/dist/tools/dynamic-tool-parser.d.ts +20 -0
  251. package/dist/tools/dynamic-tool-parser.d.ts.map +1 -0
  252. package/dist/tools/dynamic-tool-parser.js +21 -0
  253. package/dist/tools/edit-file.d.ts +10 -2
  254. package/dist/tools/edit-file.d.ts.map +1 -0
  255. package/dist/tools/edit-file.js +117 -40
  256. package/dist/tools/file-editing-utils.d.ts +2 -0
  257. package/dist/tools/file-editing-utils.d.ts.map +1 -0
  258. package/dist/tools/file-editing-utils.js +135 -0
  259. package/dist/tools/filesystem-utils.d.ts +6 -21
  260. package/dist/tools/filesystem-utils.d.ts.map +1 -0
  261. package/dist/tools/filesystem-utils.js +96 -148
  262. package/dist/tools/git-utils.d.ts +1 -0
  263. package/dist/tools/git-utils.d.ts.map +1 -0
  264. package/dist/tools/grep.d.ts +5 -3
  265. package/dist/tools/grep.d.ts.map +1 -0
  266. package/dist/tools/grep.js +67 -27
  267. package/dist/tools/index.d.ts +10 -14
  268. package/dist/tools/index.d.ts.map +1 -0
  269. package/dist/tools/index.js +33 -22
  270. package/dist/tools/move-file.d.ts +1 -0
  271. package/dist/tools/move-file.d.ts.map +1 -0
  272. package/dist/tools/move-file.js +12 -5
  273. package/dist/tools/read-file.d.ts +2 -1
  274. package/dist/tools/read-file.d.ts.map +1 -0
  275. package/dist/tools/read-file.js +13 -6
  276. package/dist/tools/read-multiple-files.d.ts +2 -1
  277. package/dist/tools/read-multiple-files.d.ts.map +1 -0
  278. package/dist/tools/read-multiple-files.js +90 -9
  279. package/dist/tools/save-file.d.ts +5 -3
  280. package/dist/tools/save-file.d.ts.map +1 -0
  281. package/dist/tools/save-file.js +64 -36
  282. package/dist/tools/think.d.ts +1 -0
  283. package/dist/tools/think.d.ts.map +1 -0
  284. package/dist/tools/think.js +5 -1
  285. package/dist/tools/types.d.ts +14 -1
  286. package/dist/tools/types.d.ts.map +1 -0
  287. package/dist/tools/web-fetch.d.ts +4 -2
  288. package/dist/tools/web-fetch.d.ts.map +1 -0
  289. package/dist/tools/web-fetch.js +2 -2
  290. package/dist/tools/web-search.d.ts +2 -1
  291. package/dist/tools/web-search.d.ts.map +1 -0
  292. package/dist/tools/web-search.js +46 -11
  293. package/dist/utils/filesystem.d.ts +23 -0
  294. package/dist/utils/filesystem.d.ts.map +1 -0
  295. package/dist/utils/filesystem.js +140 -0
  296. package/dist/utils/filetype-detection.d.ts +3 -0
  297. package/dist/utils/filetype-detection.d.ts.map +1 -0
  298. package/dist/utils/filetype-detection.js +112 -0
  299. package/dist/utils/glob.d.ts +52 -0
  300. package/dist/utils/glob.d.ts.map +1 -0
  301. package/dist/utils/glob.js +376 -0
  302. package/dist/utils/ignore.d.ts +104 -0
  303. package/dist/utils/ignore.d.ts.map +1 -0
  304. package/dist/utils/ignore.js +649 -0
  305. package/dist/utils/process.d.ts +10 -1
  306. package/dist/utils/process.d.ts.map +1 -0
  307. package/dist/utils/process.js +104 -5
  308. package/dist/utils/zod-utils.d.ts +4 -0
  309. package/dist/utils/zod-utils.d.ts.map +1 -0
  310. package/dist/utils/zod-utils.js +7 -0
  311. package/dist/version.d.ts +1 -0
  312. package/dist/version.d.ts.map +1 -0
  313. package/package.json +32 -30
  314. package/dist/tools/command-validation.d.ts +0 -12
  315. package/dist/tools/command-validation.js +0 -113
  316. /package/dist/{token-tracker.js → tokens/tracker.js} +0 -0
@@ -1,4 +1,6 @@
1
+ // import { createOpenAI } from "@ai-sdk/openai";
1
2
  import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
3
+ import { openrouter } from "@openrouter/ai-sdk-provider";
2
4
  import { objectKeys } from "@travisennis/stdlib/object";
3
5
  import { customProvider } from "ai";
4
6
  const openRouterClient = createOpenAICompatible({
@@ -11,6 +13,16 @@ const openRouterClient = createOpenAICompatible({
11
13
  "X-Title": "acai",
12
14
  },
13
15
  });
16
+ // const openRouterResponseClient = createOpenAI({
17
+ // // biome-ignore lint/style/useNamingConvention: third-party controlled
18
+ // baseURL: "https://openrouter.ai/api/alpha",
19
+ // name: "openrouter",
20
+ // apiKey: process.env["OPENROUTER_API_KEY"] ?? "",
21
+ // headers: {
22
+ // "HTTP-Referer": "https://github.com/travisennis/acai-ts",
23
+ // "X-Title": "acai",
24
+ // },
25
+ // });
14
26
  const openrouterModels = {
15
27
  "deepseek-v3": openRouterClient("deepseek/deepseek-chat-v3-0324"),
16
28
  "deepseek-v3-1": openRouterClient("deepseek/deepseek-chat-v3.1"),
@@ -20,19 +32,30 @@ const openrouterModels = {
20
32
  "gemini-flash25": openRouterClient("google/gemini-2.5-flash"),
21
33
  "gemini-pro25": openRouterClient("google/gemini-2.5-pro"),
22
34
  sonnet4: openRouterClient("anthropic/claude-sonnet-4"),
35
+ "sonnet-4.5": openRouterClient("anthropic/claude-sonnet-4.5"),
23
36
  opus4: openRouterClient("anthropic/claude-opus-4"),
24
37
  "opus-4.1": openRouterClient("anthropic/claude-opus-4.1"),
25
38
  "gpt-4.1": openRouterClient("openai/gpt-4.1"),
26
39
  "kimi-k2": openRouterClient("moonshotai/kimi-k2:nitro"),
27
40
  "kimi-k2-free": openRouterClient("moonshotai/kimi-k2:free"),
41
+ "kimi-k2-0905": openRouterClient("moonshotai/kimi-k2-0905"),
28
42
  "devstral-medium": openRouterClient("mistralai/devstral-medium"),
29
43
  "qwen3-coder": openRouterClient("qwen/qwen3-coder"),
30
44
  "qwen3-coder-free": openRouterClient("qwen/qwen3-coder:free"),
45
+ "qwen3-coder-plus": openRouterClient("qwen/qwen3-coder-plus"),
46
+ "qwen3-max": openRouterClient("qwen/qwen3-max"),
47
+ "glm-4.6": openRouterClient("z-ai/glm-4.6"),
31
48
  "glm-4.5": openRouterClient("z-ai/glm-4.5"),
32
49
  "gpt-5": openRouterClient("openai/gpt-5"),
33
50
  "gpt-5-mini": openRouterClient("openai/gpt-5-mini"),
34
51
  "gpt-oss-120b": openRouterClient("openai/gpt-oss-120b"),
35
- "grok-code-fast-1": openRouterClient("x-ai/grok-code-fast-1"),
52
+ "grok-code-fast-1": openrouter("x-ai/grok-code-fast-1", {
53
+ parallelToolCalls: false,
54
+ }),
55
+ "grok-4-fast-free": openrouter("x-ai/grok-4-fast:free", {
56
+ parallelToolCalls: false,
57
+ }),
58
+ "gpt-5-codex": openRouterClient("openai/gpt-5-codex"),
36
59
  };
37
60
  export const openrouterModelNames = objectKeys(openrouterModels).map((key) => `openrouter:${key}`);
38
61
  export const openrouterProvider = {
@@ -172,6 +195,19 @@ export const openrouterModelRegistry = {
172
195
  costPerOutputToken: 0,
173
196
  category: "balanced",
174
197
  },
198
+ "openrouter:sonnet-4.5": {
199
+ id: "openrouter:sonnet-4.5",
200
+ provider: "openrouter",
201
+ contextWindow: 1000000,
202
+ maxOutputTokens: 64000,
203
+ defaultTemperature: 1.0,
204
+ promptFormat: "markdown",
205
+ supportsReasoning: true,
206
+ supportsToolCalling: true,
207
+ costPerInputToken: 0.000003,
208
+ costPerOutputToken: 0.000015,
209
+ category: "powerful",
210
+ },
175
211
  "openrouter:gpt-4.1": {
176
212
  id: "openrouter:gpt-4.1",
177
213
  provider: "openrouter",
@@ -211,6 +247,19 @@ export const openrouterModelRegistry = {
211
247
  costPerOutputToken: 0,
212
248
  category: "balanced",
213
249
  },
250
+ "openrouter:kimi-k2-0905": {
251
+ id: "openrouter:kimi-k2-0905",
252
+ provider: "openrouter",
253
+ contextWindow: 262144,
254
+ maxOutputTokens: 8192,
255
+ defaultTemperature: 0.6,
256
+ promptFormat: "markdown",
257
+ supportsReasoning: false,
258
+ supportsToolCalling: true,
259
+ costPerInputToken: 0.0000006,
260
+ costPerOutputToken: 0.0000025,
261
+ category: "balanced",
262
+ },
214
263
  "openrouter:devstral-medium": {
215
264
  id: "openrouter:devstral-medium",
216
265
  provider: "openrouter",
@@ -250,6 +299,45 @@ export const openrouterModelRegistry = {
250
299
  costPerOutputToken: 0.000002,
251
300
  category: "balanced",
252
301
  },
302
+ "openrouter:qwen3-coder-plus": {
303
+ id: "openrouter:qwen3-coder-plus",
304
+ provider: "openrouter",
305
+ contextWindow: 128000,
306
+ maxOutputTokens: 65536,
307
+ defaultTemperature: 0.7,
308
+ promptFormat: "markdown",
309
+ supportsReasoning: false,
310
+ supportsToolCalling: true,
311
+ costPerInputToken: 0.000001,
312
+ costPerOutputToken: 0.000005,
313
+ category: "powerful",
314
+ },
315
+ "openrouter:qwen3-max": {
316
+ id: "openrouter:qwen3-max",
317
+ provider: "openrouter",
318
+ contextWindow: 256000,
319
+ maxOutputTokens: 32768,
320
+ defaultTemperature: 0.7,
321
+ promptFormat: "markdown",
322
+ supportsReasoning: false,
323
+ supportsToolCalling: true,
324
+ costPerInputToken: 0.0000012,
325
+ costPerOutputToken: 0.000006,
326
+ category: "powerful",
327
+ },
328
+ "openrouter:glm-4.6": {
329
+ id: "openrouter:glm-4.6",
330
+ provider: "openrouter",
331
+ contextWindow: 200000,
332
+ maxOutputTokens: 128000,
333
+ defaultTemperature: 0.6,
334
+ promptFormat: "markdown",
335
+ supportsReasoning: true,
336
+ supportsToolCalling: true,
337
+ costPerInputToken: 0.0000006,
338
+ costPerOutputToken: 0.0000022,
339
+ category: "balanced",
340
+ },
253
341
  "openrouter:glm-4.5": {
254
342
  id: "openrouter:glm-4.5",
255
343
  provider: "openrouter",
@@ -276,6 +364,19 @@ export const openrouterModelRegistry = {
276
364
  costPerOutputToken: 0.00001,
277
365
  category: "powerful",
278
366
  },
367
+ "openrouter:gpt-5-codex": {
368
+ id: "openrouter:gpt-5-codex",
369
+ provider: "openrouter",
370
+ contextWindow: 400000,
371
+ maxOutputTokens: 128000,
372
+ defaultTemperature: -1,
373
+ promptFormat: "xml",
374
+ supportsReasoning: true,
375
+ supportsToolCalling: true,
376
+ costPerInputToken: 0.00000125,
377
+ costPerOutputToken: 0.00001,
378
+ category: "powerful",
379
+ },
279
380
  "openrouter:gpt-5-mini": {
280
381
  id: "openrouter:gpt-5-mini",
281
382
  provider: "openrouter",
@@ -315,4 +416,17 @@ export const openrouterModelRegistry = {
315
416
  costPerOutputToken: 0.0000002903936,
316
417
  category: "fast",
317
418
  },
419
+ "openrouter:grok-4-fast-free": {
420
+ id: "openrouter:grok-4-fast-free",
421
+ provider: "openrouter",
422
+ contextWindow: 2000000,
423
+ maxOutputTokens: 64000,
424
+ defaultTemperature: 0.5,
425
+ promptFormat: "markdown",
426
+ supportsReasoning: true,
427
+ supportsToolCalling: true,
428
+ costPerInputToken: 0,
429
+ costPerOutputToken: 0,
430
+ category: "fast",
431
+ },
318
432
  };
@@ -1,8 +1,7 @@
1
- import { z } from "zod";
2
- export declare const providers: readonly ["anthropic", "openai", "google", "deepseek", "openrouter", "xai"];
1
+ export declare const providers: readonly ["anthropic", "openai", "google", "groq", "deepseek", "openrouter", "xai"];
3
2
  export type ModelProvider = (typeof providers)[number];
4
- export declare const models: readonly ("anthropic:opus" | "anthropic:sonnet" | "anthropic:sonnet37" | "anthropic:sonnet37-token-efficient-tools" | "anthropic:sonnet37-128k" | "anthropic:sonnet35" | "anthropic:haiku" | "deepseek:deepseek-chat" | "deepseek:deepseek-reasoner" | "google:flash25lite" | "google:pro25" | "google:flash25" | "openai:o3" | "openai:gpt-4.1" | "openai:o4-mini" | "openai:codex-mini" | "openrouter:gpt-5" | "openrouter:gpt-5-mini" | "openrouter:gpt-4.1" | "openrouter:deepseek-v3" | "openrouter:deepseek-v3-1" | "openrouter:deepseek-r1" | "openrouter:deepseek-v3-free" | "openrouter:deepseek-r1-free" | "openrouter:gemini-flash25" | "openrouter:gemini-pro25" | "openrouter:sonnet4" | "openrouter:opus4" | "openrouter:opus-4.1" | "openrouter:kimi-k2" | "openrouter:kimi-k2-free" | "openrouter:devstral-medium" | "openrouter:qwen3-coder" | "openrouter:qwen3-coder-free" | "openrouter:glm-4.5" | "openrouter:gpt-oss-120b" | "openrouter:grok-code-fast-1" | "xai:grok3" | "xai:grok3-mini")[];
5
- export type ModelName = (typeof models)[number] | (`xai:${string}` & {}) | (`openai:${string}` & {}) | (`anthropic:${string}` & {}) | (`google:${string}` & {}) | (`deepseek:${string}` & {}) | (`openrouter:${string}` & {});
3
+ export declare const models: readonly ("anthropic:opus" | "anthropic:sonnet" | "anthropic:sonnet37" | "anthropic:sonnet37-token-efficient-tools" | "anthropic:sonnet37-128k" | "anthropic:sonnet35" | "anthropic:haiku" | "deepseek:deepseek-chat" | "deepseek:deepseek-reasoner" | "google:flash25lite" | "google:pro25" | "google:flash25" | "groq:kimi-k2-instruct-0905" | "openai:gpt-4.1" | "openai:o3" | "openai:o4-mini" | "openai:codex-mini" | "openrouter:gpt-4.1" | "openrouter:gpt-5-codex" | "openrouter:gpt-5-mini" | "openrouter:gpt-5" | "openrouter:deepseek-v3" | "openrouter:deepseek-v3-1" | "openrouter:deepseek-r1" | "openrouter:deepseek-v3-free" | "openrouter:deepseek-r1-free" | "openrouter:gemini-flash25" | "openrouter:gemini-pro25" | "openrouter:sonnet4" | "openrouter:sonnet-4.5" | "openrouter:opus4" | "openrouter:opus-4.1" | "openrouter:kimi-k2" | "openrouter:kimi-k2-free" | "openrouter:kimi-k2-0905" | "openrouter:devstral-medium" | "openrouter:qwen3-coder" | "openrouter:qwen3-coder-free" | "openrouter:qwen3-coder-plus" | "openrouter:qwen3-max" | "openrouter:glm-4.6" | "openrouter:glm-4.5" | "openrouter:gpt-oss-120b" | "openrouter:grok-code-fast-1" | "openrouter:grok-4-fast-free" | "xai:grok3" | "xai:grok3-mini")[];
4
+ export type ModelName = (typeof models)[number] | (`xai:${string}` & {}) | (`openai:${string}` & {}) | (`anthropic:${string}` & {}) | (`google:${string}` & {}) | (`groq:${string}` & {}) | (`deepseek:${string}` & {}) | (`openrouter:${string}` & {});
6
5
  export declare function isSupportedModel(model: unknown): model is ModelName;
7
6
  export declare function languageModel(model: ModelName): import("@ai-sdk/provider").LanguageModelV2;
8
7
  export interface ModelMetadata<T = ModelName> {
@@ -19,7 +18,6 @@ export interface ModelMetadata<T = ModelName> {
19
18
  category: "fast" | "balanced" | "powerful";
20
19
  }
21
20
  export declare const modelRegistry: Record<ModelName, ModelMetadata>;
22
- export declare const ModelSelectionSchema: z.ZodEnum<[string, ...string[]]>;
23
21
  export declare function getModelsByProvider(): Record<ModelProvider, ModelMetadata[]>;
24
22
  export declare function getModelsById(): Record<ModelName, string>;
25
23
  export declare function getModelInfo(modelName: ModelName): ModelMetadata | undefined;
@@ -31,3 +29,4 @@ export declare function getRecommendedModels(options: {
31
29
  requiresReasoning?: boolean;
32
30
  speedPriority?: boolean;
33
31
  }): ModelName[];
32
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../source/models/providers.ts"],"names":[],"mappings":"AAsCA,eAAO,MAAM,SAAS,qFAQZ,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAYvD,eAAO,MAAM,MAAM,srCAQT,CAAC;AAEX,MAAM,MAAM,SAAS,GACjB,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,GACvB,CAAC,OAAO,MAAM,EAAE,GAAG,EAAE,CAAC,GACtB,CAAC,UAAU,MAAM,EAAE,GAAG,EAAE,CAAC,GACzB,CAAC,aAAa,MAAM,EAAE,GAAG,EAAE,CAAC,GAC5B,CAAC,UAAU,MAAM,EAAE,GAAG,EAAE,CAAC,GACzB,CAAC,QAAQ,MAAM,EAAE,GAAG,EAAE,CAAC,GACvB,CAAC,YAAY,MAAM,EAAE,GAAG,EAAE,CAAC,GAC3B,CAAC,cAAc,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAElC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAYnE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,8CAE7C;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,SAAS;IAC1C,EAAE,EAAE,CAAC,CAAC;IACN,QAAQ,EAAE,aAAa,CAAC;IAGxB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7C,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;CAC5C;AAGD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,aAAa,CAQ1D,CAAC;AAGF,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC,CAgB5E;AAED,wBAAgB,aAAa,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CASzD;AAGD,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,CAE5E;AAGD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GACzC,aAAa,EAAE,CAIjB;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAE5D;AAGD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,IAAI,SAAS,CAEtE;AAGD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,SAAS,EAAE,CAkBd"}
@@ -1,9 +1,9 @@
1
1
  import { isString } from "@travisennis/stdlib/typeguards";
2
2
  import { createProviderRegistry } from "ai";
3
- import { z } from "zod";
4
3
  import { anthropicModelNames, anthropicModelRegistry, anthropicProvider, } from "./anthropic-provider.js";
5
4
  import { deepseekModelNames, deepseekModelRegistry, deepseekProvider, } from "./deepseek-provider.js";
6
5
  import { googleModelNames, googleModelRegistry, googleProvider, } from "./google-provider.js";
6
+ import { groqModelNames, groqModelRegistry, groqProvider, } from "./groq-provider.js";
7
7
  import { openaiModelNames, openaiModelRegistry, openaiProvider, } from "./openai-provider.js";
8
8
  import { openrouterModelNames, openrouterModelRegistry, openrouterProvider, } from "./openrouter-provider.js";
9
9
  import { xaiModelNames, xaiModelRegistry, xaiProvider, } from "./xai-provider.js";
@@ -11,6 +11,7 @@ export const providers = [
11
11
  "anthropic",
12
12
  "openai",
13
13
  "google",
14
+ "groq",
14
15
  "deepseek",
15
16
  "openrouter",
16
17
  "xai",
@@ -19,6 +20,7 @@ const registry = createProviderRegistry({
19
20
  ...anthropicProvider,
20
21
  ...deepseekProvider,
21
22
  ...googleProvider,
23
+ ...groqProvider,
22
24
  ...openaiProvider,
23
25
  ...openrouterProvider,
24
26
  ...xaiProvider,
@@ -27,6 +29,7 @@ export const models = [
27
29
  ...anthropicModelNames,
28
30
  ...openaiModelNames,
29
31
  ...googleModelNames,
32
+ ...groqModelNames,
30
33
  ...deepseekModelNames,
31
34
  ...openrouterModelNames,
32
35
  ...xaiModelNames,
@@ -38,6 +41,7 @@ export function isSupportedModel(model) {
38
41
  model.startsWith("anthropic:") ||
39
42
  model.startsWith("openai:") ||
40
43
  model.startsWith("google:") ||
44
+ model.startsWith("groq:") ||
41
45
  model.startsWith("xai:") ||
42
46
  model.startsWith("deepseek:"))));
43
47
  }
@@ -49,18 +53,18 @@ export const modelRegistry = {
49
53
  ...anthropicModelRegistry,
50
54
  ...openaiModelRegistry,
51
55
  ...googleModelRegistry,
56
+ ...groqModelRegistry,
52
57
  ...deepseekModelRegistry,
53
58
  ...openrouterModelRegistry,
54
59
  ...xaiModelRegistry,
55
60
  };
56
- // Schema for validating model selection
57
- export const ModelSelectionSchema = z.enum(Object.keys(modelRegistry));
58
61
  // Get available models grouped by provider
59
62
  export function getModelsByProvider() {
60
63
  const result = {
61
64
  anthropic: [],
62
65
  openai: [],
63
66
  google: [],
67
+ groq: [],
64
68
  deepseek: [],
65
69
  openrouter: [],
66
70
  xai: [],
@@ -18,3 +18,4 @@ export declare const xaiModelRegistry: {
18
18
  [K in ModelName]: ModelMetadata<ModelName>;
19
19
  };
20
20
  export {};
21
+ //# sourceMappingURL=xai-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai-provider.d.ts","sourceRoot":"","sources":["../../source/models/xai-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQpD,QAAA,MAAM,SAAS;;;CAGL,CAAC;AAEX,KAAK,SAAS,GAAG,OAAO,MAAM,OAAO,SAAS,EAAE,CAAC;AAEjD,eAAO,MAAM,aAAa,EAAE,SAAS,EAEpC,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;CAKvB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE;KAC5B,CAAC,IAAI,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;CA4B3C,CAAC"}
package/dist/parsing.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  import { z } from "zod";
2
- export declare function jsonParser<T extends z.ZodTypeAny>(input: T): z.ZodEffects<T, T["_output"], unknown>;
2
+ export declare function jsonParser<T extends z.ZodTypeAny>(input: T): z.ZodPipe<z.ZodTransform<any, unknown>, T>;
3
+ //# sourceMappingURL=parsing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsing.d.ts","sourceRoot":"","sources":["../source/parsing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBtC,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,8CAE1D"}
@@ -1,8 +1,19 @@
1
1
  import type { UserModelMessage } from "ai";
2
2
  import { type UserMessageContentItem } from "../messages.ts";
3
- import type { TokenCounter } from "../token-utils.ts";
3
+ import type { TokenCounter } from "../tokens/counter.ts";
4
4
  export type ContextItem = UserMessageContentItem;
5
- export declare class PromptManager {
5
+ export interface PromptManagerApi {
6
+ set(prompt: string): void;
7
+ get(): string;
8
+ getUserMessage(): UserModelMessage;
9
+ isPending(): boolean;
10
+ addContext(item: ContextItem): void;
11
+ hasContext(): boolean;
12
+ clearContext(): void;
13
+ clearAll(): void;
14
+ getContextTokenCount(): number;
15
+ }
16
+ export declare class PromptManager implements PromptManagerApi {
6
17
  private prompt;
7
18
  private context;
8
19
  private tokenCounter;
@@ -18,3 +29,4 @@ export declare class PromptManager {
18
29
  clearAll(): void;
19
30
  getContextTokenCount(): number;
20
31
  }
32
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../source/prompts/manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,gBAAgB,EAAE,MAAM,IAAI,CAAC;AACrD,OAAO,EAAqB,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,IAAI,MAAM,CAAC;IACd,cAAc,IAAI,gBAAgB,CAAC;IACnC,SAAS,IAAI,OAAO,CAAC;IACrB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,UAAU,IAAI,OAAO,CAAC;IACtB,YAAY,IAAI,IAAI,CAAC;IACrB,QAAQ,IAAI,IAAI,CAAC;IACjB,oBAAoB,IAAI,MAAM,CAAC;CAChC;AAED,qBAAa,aAAc,YAAW,gBAAgB;IACpD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAe;gBAEvB,YAAY,EAAE,YAAY;IAMtC,GAAG,CAAC,MAAM,EAAE,MAAM;IAIlB,GAAG;IAQH,cAAc,IAAI,gBAAgB;IAmBlC,OAAO,CAAC,8BAA8B;IAoBtC,SAAS;IAIT,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAInC,UAAU;IAIV,YAAY;IAIZ,QAAQ;IAKR,oBAAoB,IAAI,MAAM;CAY/B"}
package/dist/prompts.d.ts CHANGED
@@ -2,3 +2,4 @@ export declare function systemPrompt(options?: {
2
2
  supportsToolCalling?: boolean;
3
3
  }): Promise<string>;
4
4
  export declare function minSystemPrompt(): Promise<string>;
5
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../source/prompts.ts"],"names":[],"mappings":"AAiJA,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE;IAC3C,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,mBAkBA;AAED,wBAAsB,eAAe,oBAYpC"}
package/dist/prompts.js CHANGED
@@ -3,11 +3,11 @@ import { platform } from "node:os";
3
3
  import path from "node:path";
4
4
  import { config } from "./config.js";
5
5
  import { dedent } from "./dedent.js";
6
+ import { getShell } from "./terminal/index.js";
6
7
  import { AgentTool } from "./tools/agent.js";
7
8
  import { BashTool } from "./tools/bash.js";
8
9
  import { CodeInterpreterTool } from "./tools/code-interpreter.js";
9
10
  import { DeleteFileTool } from "./tools/delete-file.js";
10
- import { DirectoryTreeTool } from "./tools/directory-tree.js";
11
11
  import { EditFileTool } from "./tools/edit-file.js";
12
12
  import { getCurrentBranch, inGitDirectory } from "./tools/git-utils.js";
13
13
  import { GrepTool } from "./tools/grep.js";
@@ -33,7 +33,7 @@ async function instructions() {
33
33
  }
34
34
  return `## Core Principles
35
35
 
36
- - **CLI-Optimized**: Be concise and direct - responses appear in a terminal.
36
+ - **CLI-Optimized**: Be concise and direct - responses appear in a terminal. Be extremely concise. Sacrifice grammar for the sake of concision.
37
37
  - **Progressive Problem Solving**: Work through problems methodically until resolution.
38
38
  - **User Authority**: NEVER commit changes or add dependencies without explicit user approval.
39
39
  - **Security-First**: Prioritize secure coding practices in all suggestions.
@@ -66,12 +66,12 @@ function toolUsage() {
66
66
  return `## Tool Usage Guidelines
67
67
 
68
68
  ### Information Gathering
69
- - Use \`${DirectoryTreeTool.name}\` for project structure
69
+ - Prefer targeted queries: use \`${GrepTool.name}\` for code pattern searches and \`${ReadMultipleFilesTool.name}\` to fetch files. Avoid full directory dumps for large repositories.
70
70
  - Use \`${ReadFileTool.name}\` or \`${ReadMultipleFilesTool.name}\` for file contents if filenames are provided in the prompt
71
71
  - Use \`${GrepTool.name}\` for code pattern searches
72
72
  - Use \`${WebFetchTool.name}\` for text-based URLs provided in the prompt
73
73
  - Use \`${WebSearchTool.name}\` for external research (e.g., libraries, errors)
74
- - Use \`${AgentTool.name}\` for iterative keyword/file searches. Use this if you need to explore the project fo find what you are looking for.
74
+ - Use \`${AgentTool.name}\` for iterative keyword/file searches. Use this if you need to explore the project to find what you are looking for.
75
75
  - If file contents or URLs are provided in the prompt, use them directly without re-fetching
76
76
  - Always verify file contents before suggesting changes unless provided in the prompt
77
77
 
@@ -85,16 +85,20 @@ function toolUsage() {
85
85
  - Outline multi-step tasks before execution
86
86
 
87
87
  ### Bash Commands (\`${BashTool.name}\`)
88
- - Execute bash commands within project directory only
89
- - Always specify absolute paths to avoid errors
90
- - You have access to the Github CLI
91
- - 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.
88
+ - Execute commands with a sandboxed executor that supports pipes (|), conditional chaining (&&, ||, ;), and redirection (> >> < 2> 2>>).
89
+ - Run single commands or compose multi-step flows using shell operators.
90
+ - For large gh/git messages with newlines:
91
+ 1. Create temp file with ${SaveFileTool.name} in the project's .tmp directory
92
+ 2. Use git commit --file path/to/temp/file or gh pr create --title "Title of PR" --body-file path/to/temp/file
93
+ - Note: The .tmp directory in the current working directory is deleted each time the agent shuts down.
94
+ - Commands execute only within the project directory; always use absolute paths.
95
+ - Avoid interactive commands; prefer non-interactive flags (e.g., npm init -y).
92
96
 
93
97
  ### Code Interpreter (\`${CodeInterpreterTool.name}\`)
94
98
  - Executes JavaScript code in a separate Node.js process using Node's Permission Model
95
99
  - By default, the child process has no permissions except read/write within the current working directory
96
100
  - Returns stdout, stderr, and exitCode
97
- - Use console.log/console.error to produce outpu`;
101
+ - Use console.log/console.error to produce output`;
98
102
  }
99
103
  function escalationProcedures() {
100
104
  return `## Escalation
@@ -120,14 +124,16 @@ async function environmentInfo() {
120
124
  const gitDirectory = await inGitDirectory();
121
125
  let gitSection = `- **Is directory a git repo**: ${gitDirectory ? "Yes" : "No"}`;
122
126
  if (gitDirectory) {
123
- gitSection += `\n- ** Current git branch**: ${await getCurrentBranch()}`;
127
+ gitSection += `\n- **Current git branch**: ${await getCurrentBranch()}`;
124
128
  }
125
129
  return `## Environment
126
130
 
127
131
  - **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].
128
132
  ${gitSection}
129
133
  - **Platform**: ${platform()}
130
- - **Today's date**: ${(new Date()).toISOString()}`;
134
+ - **Shell**: ${getShell()}
135
+ - **Today's date**: ${(new Date()).toISOString()}
136
+ - Note: The .tmp directory in the current working directory is deleted each time the agent shuts down.`;
131
137
  }
132
138
  export async function systemPrompt(options) {
133
139
  const { supportsToolCalling = true } = options ?? {};
@@ -0,0 +1,4 @@
1
+ import type { Terminal } from "../terminal/index.ts";
2
+ import type { Message } from "../tools/types.ts";
3
+ export declare function displayToolMessages(messages: Message[], terminal: Terminal): void;
4
+ //# sourceMappingURL=display-tool-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-tool-messages.d.ts","sourceRoot":"","sources":["../../source/repl/display-tool-messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,QAiC1E"}
@@ -0,0 +1,55 @@
1
+ import { logger } from "../logger.js";
2
+ import { isMarkdown } from "../terminal/markdown-utils.js";
3
+ import style from "../terminal/style.js";
4
+ export function displayToolMessages(messages, terminal) {
5
+ const isError = messages[messages.length - 1]?.event === "tool-error";
6
+ const indicator = isError ? style.red.bold("●") : style.blue.bold("●");
7
+ const initMessage = messages.find((m) => m.event === "tool-init")?.data ?? "Tool Execution";
8
+ terminal.write(`${indicator} `);
9
+ terminal.writeln(initMessage);
10
+ for (const msg of messages) {
11
+ switch (msg.event) {
12
+ case "tool-update":
13
+ handleToolUpdateMessage(msg.data, terminal);
14
+ break;
15
+ case "tool-completion":
16
+ handleToolCompletionMessage(String(msg.data), terminal);
17
+ break;
18
+ case "tool-error":
19
+ handleToolErrorMessage(String(msg.data), terminal);
20
+ break;
21
+ case "tool-init":
22
+ break;
23
+ default:
24
+ logger.debug(`Unhandled tool message event: ${msg.event}`);
25
+ break;
26
+ }
27
+ }
28
+ terminal.lineBreak();
29
+ }
30
+ function handleToolUpdateMessage(data, terminal) {
31
+ if (data.secondary && data.secondary.length > 0) {
32
+ const content = data.secondary.join("\n");
33
+ if (content.trim().length !== 0) {
34
+ terminal.header(`${data.primary}`);
35
+ if (isMarkdown(content)) {
36
+ terminal.display(content, true);
37
+ }
38
+ else {
39
+ terminal.write(style.green(content));
40
+ terminal.lineBreak();
41
+ }
42
+ terminal.hr();
43
+ }
44
+ }
45
+ else {
46
+ terminal.header(`${data.primary}`);
47
+ }
48
+ }
49
+ function handleToolCompletionMessage(data, terminal) {
50
+ terminal.display(`└── ${style.bold(data)}`);
51
+ }
52
+ function handleToolErrorMessage(data, terminal) {
53
+ terminal.write("└── ");
54
+ terminal.error(data);
55
+ }
@@ -0,0 +1,14 @@
1
+ import type { Terminal } from "../terminal/index.ts";
2
+ interface MinimalStep {
3
+ toolResults: Array<{
4
+ toolName: string;
5
+ }>;
6
+ toolCalls: Array<{
7
+ toolName: string;
8
+ }>;
9
+ }
10
+ export declare function displayToolUse(result: {
11
+ steps: MinimalStep[];
12
+ }, terminal: Terminal): void;
13
+ export {};
14
+ //# sourceMappingURL=display-tool-use.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-tool-use.d.ts","sourceRoot":"","sources":["../../source/repl/display-tool-use.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIrD,UAAU,WAAW;IACnB,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzC,SAAS,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxC;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE;IAAE,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,EAChC,QAAQ,EAAE,QAAQ,QA0EnB"}
@@ -0,0 +1,63 @@
1
+ import style from "../terminal/style.js";
2
+ export function displayToolUse(result, terminal) {
3
+ const toolsCalled = [];
4
+ const toolColors = new Map();
5
+ const styleColors = [
6
+ "red",
7
+ "green",
8
+ "yellow",
9
+ "blue",
10
+ "magenta",
11
+ "cyan",
12
+ "white",
13
+ "gray",
14
+ "redBright",
15
+ "greenBright",
16
+ "yellowBright",
17
+ "blueBright",
18
+ "magentaBright",
19
+ "cyanBright",
20
+ "whiteBright",
21
+ "blackBright",
22
+ ];
23
+ terminal.writeln(style.dim(`Steps: ${result.steps.length}`));
24
+ for (const step of result.steps) {
25
+ let currentToolCalls = [];
26
+ if (step.toolResults.length > 0) {
27
+ currentToolCalls = step.toolResults;
28
+ }
29
+ else if (step.toolCalls.length > 0) {
30
+ currentToolCalls = step.toolCalls;
31
+ }
32
+ for (const toolCallOrResult of currentToolCalls) {
33
+ const toolName = toolCallOrResult.toolName;
34
+ if (!toolColors.has(toolName)) {
35
+ const availableColors = styleColors.filter((color) => !Array.from(toolColors.values()).some((c) => c === style[color]));
36
+ const color = availableColors.length > 0
37
+ ? (availableColors[Math.floor(Math.random() * availableColors.length)] ?? "white")
38
+ : "white";
39
+ toolColors.set(toolName, style[color]);
40
+ }
41
+ toolsCalled.push(toolName);
42
+ }
43
+ }
44
+ if (toolsCalled.length > 0) {
45
+ terminal.lineBreak();
46
+ terminal.writeln(style.dim("Tools:"));
47
+ for (const toolCalled of toolsCalled) {
48
+ const colorFn = toolColors.get(toolCalled) ?? style.white;
49
+ terminal.write(`${colorFn("██")} `);
50
+ }
51
+ terminal.lineBreak();
52
+ const uniqueTools = new Set(toolsCalled);
53
+ for (const [index, toolCalled] of Array.from(uniqueTools).entries()) {
54
+ const colorFn = toolColors.get(toolCalled) ?? style.white;
55
+ terminal.write(colorFn(toolCalled));
56
+ if (index < new Set(toolsCalled).size - 1) {
57
+ terminal.write(" - ");
58
+ }
59
+ }
60
+ terminal.lineBreak();
61
+ terminal.lineBreak();
62
+ }
63
+ }
@@ -0,0 +1,8 @@
1
+ import type { Terminal } from "../terminal/index.ts";
2
+ export declare function getPromptHeader(args: {
3
+ terminal: Terminal;
4
+ modelId: string;
5
+ contextWindow: number;
6
+ currentContextWindow: number;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=get-prompt-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-prompt-header.d.ts","sourceRoot":"","sources":["../../source/repl/get-prompt-header.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAuCrD,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;CAC9B,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhB"}
@@ -0,0 +1,38 @@
1
+ import style from "../terminal/style.js";
2
+ import { getCurrentBranch, getDiffStat, getGitStatus, hasUncommittedChanges, inGitDirectory, } from "../tools/git-utils.js";
3
+ async function getProjectStatusLine() {
4
+ const currentDir = process.cwd().split("/").pop() || process.cwd();
5
+ const branch = await getCurrentBranch();
6
+ let gitStatus = "";
7
+ if (branch) {
8
+ const hasChanges = await hasUncommittedChanges();
9
+ const asterisk = hasChanges ? "*" : "";
10
+ gitStatus = ` ${style.gray(branch + asterisk)}`;
11
+ }
12
+ if (await inGitDirectory()) {
13
+ const stats = await getDiffStat();
14
+ const fileChanges = await getGitStatus();
15
+ let fileStatus = "";
16
+ if (fileChanges.added)
17
+ fileStatus += ` +${fileChanges.added}`;
18
+ if (fileChanges.modified)
19
+ fileStatus += ` ~${fileChanges.modified}`;
20
+ if (fileChanges.deleted)
21
+ fileStatus += ` -${fileChanges.deleted}`;
22
+ if (fileChanges.untracked)
23
+ fileStatus += ` ?${fileChanges.untracked}`;
24
+ gitStatus +=
25
+ " " +
26
+ `${style.dim("[")}${style.yellow(fileStatus.trim())} ` +
27
+ `${style.green(`+${stats.insertions}`)} ` +
28
+ `${style.red(`-${stats.deletions}`)}${style.dim("]")}`;
29
+ }
30
+ return `${style.blue(currentDir)}${gitStatus}`;
31
+ }
32
+ export async function getPromptHeader(args) {
33
+ const { terminal, modelId, contextWindow, currentContextWindow } = args;
34
+ terminal.hr();
35
+ terminal.writeln(await getProjectStatusLine());
36
+ terminal.writeln(style.dim(modelId));
37
+ terminal.displayProgressBar(currentContextWindow, contextWindow);
38
+ }
@@ -0,0 +1,4 @@
1
+ import { type ToolCallRepairFunction, type ToolSet } from "ai";
2
+ import type { ModelManager } from "../models/manager.js";
3
+ export declare const toolCallRepair: (modelManager: ModelManager) => ToolCallRepairFunction<ToolSet>;
4
+ //# sourceMappingURL=tool-call-repair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-call-repair.d.ts","sourceRoot":"","sources":["../../source/repl/tool-call-repair.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,OAAO,EACb,MAAM,IAAI,CAAC;AAIZ,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAoCzD,eAAO,MAAM,cAAc,GAAI,cAAc,YAAY,oCA0CxD,CAAC"}