@travisennis/acai 0.0.11 → 0.0.13

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 (292) hide show
  1. package/README.md +5 -5
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +2 -5
  4. package/dist/commands/history/types.d.ts +3 -2
  5. package/dist/commands/history/types.d.ts.map +1 -1
  6. package/dist/commands/init-project/utils.d.ts +0 -1
  7. package/dist/commands/init-project/utils.d.ts.map +1 -1
  8. package/dist/commands/init-project/utils.js +1 -12
  9. package/dist/commands/manager.d.ts.map +1 -1
  10. package/dist/commands/manager.js +6 -19
  11. package/dist/commands/resources/index.d.ts.map +1 -1
  12. package/dist/commands/resources/index.js +4 -1
  13. package/dist/commands/session/index.d.ts.map +1 -1
  14. package/dist/commands/session/index.js +6 -0
  15. package/dist/commands/session/types.d.ts +1 -0
  16. package/dist/commands/session/types.d.ts.map +1 -1
  17. package/dist/commands/share/html-renderer.d.ts.map +1 -1
  18. package/dist/commands/share/html-renderer.js +54 -48
  19. package/dist/commands/tools/index.d.ts +3 -0
  20. package/dist/commands/tools/index.d.ts.map +1 -0
  21. package/dist/commands/tools/index.js +191 -0
  22. package/dist/commands/tools/templates.d.ts +6 -0
  23. package/dist/commands/tools/templates.d.ts.map +1 -0
  24. package/dist/commands/tools/templates.js +97 -0
  25. package/dist/config/index.d.ts +5 -2
  26. package/dist/config/index.d.ts.map +1 -1
  27. package/dist/config/index.js +42 -6
  28. package/dist/index.d.ts +14 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +98 -68
  31. package/dist/models/anthropic-provider.d.ts +1 -1
  32. package/dist/models/deepseek-provider.d.ts +3 -3
  33. package/dist/models/deepseek-provider.js +17 -17
  34. package/dist/models/google-provider.d.ts +2 -4
  35. package/dist/models/google-provider.d.ts.map +1 -1
  36. package/dist/models/google-provider.js +2 -17
  37. package/dist/models/groq-provider.d.ts +2 -4
  38. package/dist/models/groq-provider.d.ts.map +1 -1
  39. package/dist/models/groq-provider.js +3 -21
  40. package/dist/models/manager.d.ts +1 -10
  41. package/dist/models/manager.d.ts.map +1 -1
  42. package/dist/models/manager.js +2 -2
  43. package/dist/models/opencode-go-provider.d.ts +11 -1
  44. package/dist/models/opencode-go-provider.d.ts.map +1 -1
  45. package/dist/models/opencode-go-provider.js +130 -0
  46. package/dist/models/opencode-zen-provider.d.ts +3 -3
  47. package/dist/models/opencode-zen-provider.d.ts.map +1 -1
  48. package/dist/models/opencode-zen-provider.js +26 -32
  49. package/dist/models/openrouter-provider.d.ts +4 -15
  50. package/dist/models/openrouter-provider.d.ts.map +1 -1
  51. package/dist/models/openrouter-provider.js +26 -169
  52. package/dist/models/providers.d.ts +1 -1
  53. package/dist/models/providers.d.ts.map +1 -1
  54. package/dist/models/xai-provider.d.ts +1 -2
  55. package/dist/models/xai-provider.d.ts.map +1 -1
  56. package/dist/models/xai-provider.js +0 -13
  57. package/dist/prompts/manager.d.ts.map +1 -1
  58. package/dist/prompts/manager.js +5 -1
  59. package/dist/prompts/system-prompt.d.ts +1 -2
  60. package/dist/prompts/system-prompt.d.ts.map +1 -1
  61. package/dist/prompts/system-prompt.js +26 -15
  62. package/dist/repl/index.d.ts +28 -13
  63. package/dist/repl/index.d.ts.map +1 -1
  64. package/dist/repl/index.js +242 -305
  65. package/dist/skills/activated-tracker.d.ts +11 -0
  66. package/dist/skills/activated-tracker.d.ts.map +1 -0
  67. package/dist/skills/activated-tracker.js +16 -0
  68. package/dist/skills/index.d.ts +12 -2
  69. package/dist/skills/index.d.ts.map +1 -1
  70. package/dist/skills/index.js +127 -71
  71. package/dist/terminal/control.d.ts +1 -21
  72. package/dist/terminal/control.d.ts.map +1 -1
  73. package/dist/terminal/control.js +1 -32
  74. package/dist/terminal/formatting.d.ts +0 -33
  75. package/dist/terminal/formatting.d.ts.map +1 -1
  76. package/dist/terminal/formatting.js +0 -91
  77. package/dist/terminal/highlight/theme.d.ts +0 -37
  78. package/dist/terminal/highlight/theme.d.ts.map +1 -1
  79. package/dist/terminal/highlight/theme.js +1 -79
  80. package/dist/terminal/keys.d.ts +0 -97
  81. package/dist/terminal/keys.d.ts.map +1 -1
  82. package/dist/terminal/keys.js +0 -194
  83. package/dist/terminal/select-prompt.d.ts.map +1 -1
  84. package/dist/terminal/select-prompt.js +65 -51
  85. package/dist/terminal/style.d.ts +1 -1
  86. package/dist/terminal/style.d.ts.map +1 -1
  87. package/dist/terminal/supports-color.d.ts.map +1 -1
  88. package/dist/terminal/supports-color.js +38 -20
  89. package/dist/terminal/supports-hyperlinks.d.ts +3 -0
  90. package/dist/terminal/supports-hyperlinks.d.ts.map +1 -1
  91. package/dist/terminal/supports-hyperlinks.js +72 -31
  92. package/dist/terminal/table/layout-manager.d.ts +0 -20
  93. package/dist/terminal/table/layout-manager.d.ts.map +1 -1
  94. package/dist/terminal/table/layout-manager.js +68 -44
  95. package/dist/terminal/table/utils.d.ts +0 -1
  96. package/dist/terminal/table/utils.d.ts.map +1 -1
  97. package/dist/terminal/table/utils.js +2 -4
  98. package/dist/tools/apply-patch.d.ts +5 -3
  99. package/dist/tools/apply-patch.d.ts.map +1 -1
  100. package/dist/tools/apply-patch.js +154 -123
  101. package/dist/tools/bash.d.ts +4 -4
  102. package/dist/tools/bash.d.ts.map +1 -1
  103. package/dist/tools/bash.js +27 -13
  104. package/dist/tools/dynamic-tool-loader.d.ts +17 -3
  105. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  106. package/dist/tools/dynamic-tool-loader.js +360 -81
  107. package/dist/tools/edit-file.d.ts +2 -2
  108. package/dist/tools/index.d.ts +27 -151
  109. package/dist/tools/index.d.ts.map +1 -1
  110. package/dist/tools/index.js +16 -21
  111. package/dist/tools/read-file.d.ts +8 -8
  112. package/dist/tools/read-file.d.ts.map +1 -1
  113. package/dist/tools/read-file.js +32 -13
  114. package/dist/tools/save-file.d.ts +4 -4
  115. package/dist/tools/skill.d.ts +2 -1
  116. package/dist/tools/skill.d.ts.map +1 -1
  117. package/dist/tools/skill.js +64 -14
  118. package/dist/tools/types.d.ts +8 -2
  119. package/dist/tools/types.d.ts.map +1 -1
  120. package/dist/tools/web-fetch.d.ts +8 -12
  121. package/dist/tools/web-fetch.d.ts.map +1 -1
  122. package/dist/tools/web-fetch.js +86 -44
  123. package/dist/tools/web-search.d.ts +4 -8
  124. package/dist/tools/web-search.d.ts.map +1 -1
  125. package/dist/tools/web-search.js +41 -33
  126. package/dist/tui/autocomplete/utils.d.ts +0 -15
  127. package/dist/tui/autocomplete/utils.d.ts.map +1 -1
  128. package/dist/tui/autocomplete/utils.js +0 -85
  129. package/dist/tui/autocomplete.d.ts +1 -1
  130. package/dist/tui/autocomplete.d.ts.map +1 -1
  131. package/dist/tui/autocomplete.js +1 -1
  132. package/dist/tui/components/editor.d.ts +12 -0
  133. package/dist/tui/components/editor.d.ts.map +1 -1
  134. package/dist/tui/components/editor.js +181 -195
  135. package/dist/tui/components/footer.d.ts +0 -2
  136. package/dist/tui/components/footer.d.ts.map +1 -1
  137. package/dist/tui/components/footer.js +1 -17
  138. package/dist/tui/components/input.d.ts +4 -0
  139. package/dist/tui/components/input.d.ts.map +1 -1
  140. package/dist/tui/components/input.js +33 -31
  141. package/dist/tui/components/markdown.d.ts +30 -0
  142. package/dist/tui/components/markdown.d.ts.map +1 -1
  143. package/dist/tui/components/markdown.js +274 -242
  144. package/dist/tui/components/modal.d.ts.map +1 -1
  145. package/dist/tui/components/modal.js +11 -11
  146. package/dist/tui/components/select-list.d.ts +5 -0
  147. package/dist/tui/components/select-list.d.ts.map +1 -1
  148. package/dist/tui/components/select-list.js +69 -98
  149. package/dist/tui/components/table.d.ts +6 -0
  150. package/dist/tui/components/table.d.ts.map +1 -1
  151. package/dist/tui/components/table.js +61 -52
  152. package/dist/tui/index.d.ts +1 -8
  153. package/dist/tui/index.d.ts.map +1 -1
  154. package/dist/tui/index.js +0 -8
  155. package/dist/tui/tui.d.ts +9 -0
  156. package/dist/tui/tui.d.ts.map +1 -1
  157. package/dist/tui/tui.js +78 -48
  158. package/dist/tui/utils.d.ts +7 -0
  159. package/dist/tui/utils.d.ts.map +1 -1
  160. package/dist/tui/utils.js +117 -53
  161. package/dist/utils/bash.d.ts.map +1 -1
  162. package/dist/utils/bash.js +121 -104
  163. package/dist/utils/binary-output.d.ts +32 -0
  164. package/dist/utils/binary-output.d.ts.map +1 -0
  165. package/dist/utils/binary-output.js +127 -0
  166. package/dist/utils/command-protection.d.ts +3 -2
  167. package/dist/utils/command-protection.d.ts.map +1 -1
  168. package/dist/utils/command-protection.js +121 -29
  169. package/dist/utils/filesystem/operations.d.ts +0 -15
  170. package/dist/utils/filesystem/operations.d.ts.map +1 -1
  171. package/dist/utils/filesystem/operations.js +1 -38
  172. package/dist/utils/filesystem/security.d.ts.map +1 -1
  173. package/dist/utils/filesystem/security.js +22 -15
  174. package/dist/utils/filetype-detection.d.ts +0 -1
  175. package/dist/utils/filetype-detection.d.ts.map +1 -1
  176. package/dist/utils/filetype-detection.js +0 -12
  177. package/dist/utils/formatting.d.ts +0 -30
  178. package/dist/utils/formatting.d.ts.map +1 -1
  179. package/dist/utils/formatting.js +0 -44
  180. package/dist/utils/git.d.ts +4 -6
  181. package/dist/utils/git.d.ts.map +1 -1
  182. package/dist/utils/git.js +36 -46
  183. package/dist/utils/ignore.d.ts +1 -1
  184. package/dist/utils/ignore.d.ts.map +1 -1
  185. package/dist/utils/ignore.js +1 -1
  186. package/dist/utils/parsing.d.ts +1 -1
  187. package/dist/utils/parsing.d.ts.map +1 -1
  188. package/dist/utils/process.d.ts.map +1 -1
  189. package/dist/utils/process.js +77 -79
  190. package/dist/utils/yaml.d.ts +0 -1
  191. package/dist/utils/yaml.d.ts.map +1 -1
  192. package/dist/utils/yaml.js +80 -89
  193. package/dist/utils/zod.d.ts +0 -3
  194. package/dist/utils/zod.d.ts.map +1 -1
  195. package/dist/utils/zod.js +0 -7
  196. package/package.json +32 -29
  197. package/dist/agent/sub-agent.d.ts +0 -23
  198. package/dist/agent/sub-agent.d.ts.map +0 -1
  199. package/dist/agent/sub-agent.js +0 -109
  200. package/dist/commands/add-directory/index.d.ts +0 -3
  201. package/dist/commands/add-directory/index.d.ts.map +0 -1
  202. package/dist/commands/add-directory/index.js +0 -50
  203. package/dist/commands/add-directory/utils.d.ts +0 -3
  204. package/dist/commands/add-directory/utils.d.ts.map +0 -1
  205. package/dist/commands/add-directory/utils.js +0 -15
  206. package/dist/commands/clear/index.d.ts +0 -3
  207. package/dist/commands/clear/index.d.ts.map +0 -1
  208. package/dist/commands/clear/index.js +0 -13
  209. package/dist/commands/generate-rules/index.d.ts +0 -3
  210. package/dist/commands/generate-rules/index.d.ts.map +0 -1
  211. package/dist/commands/generate-rules/index.js +0 -206
  212. package/dist/commands/generate-rules/service.d.ts +0 -22
  213. package/dist/commands/generate-rules/service.d.ts.map +0 -1
  214. package/dist/commands/generate-rules/service.js +0 -103
  215. package/dist/commands/generate-rules/utils.d.ts +0 -5
  216. package/dist/commands/generate-rules/utils.d.ts.map +0 -1
  217. package/dist/commands/generate-rules/utils.js +0 -25
  218. package/dist/commands/handoff/index.d.ts +0 -3
  219. package/dist/commands/handoff/index.d.ts.map +0 -1
  220. package/dist/commands/handoff/index.js +0 -97
  221. package/dist/commands/handoff/utils.d.ts +0 -4
  222. package/dist/commands/handoff/utils.d.ts.map +0 -1
  223. package/dist/commands/handoff/utils.js +0 -123
  224. package/dist/commands/list-directories/index.d.ts +0 -3
  225. package/dist/commands/list-directories/index.d.ts.map +0 -1
  226. package/dist/commands/list-directories/index.js +0 -35
  227. package/dist/commands/pickup/index.d.ts +0 -3
  228. package/dist/commands/pickup/index.d.ts.map +0 -1
  229. package/dist/commands/pickup/index.js +0 -141
  230. package/dist/commands/pickup/types.d.ts +0 -6
  231. package/dist/commands/pickup/types.d.ts.map +0 -1
  232. package/dist/commands/pickup/types.js +0 -1
  233. package/dist/commands/pickup/utils.d.ts +0 -7
  234. package/dist/commands/pickup/utils.d.ts.map +0 -1
  235. package/dist/commands/pickup/utils.js +0 -56
  236. package/dist/commands/remove-directory/index.d.ts +0 -3
  237. package/dist/commands/remove-directory/index.d.ts.map +0 -1
  238. package/dist/commands/remove-directory/index.js +0 -55
  239. package/dist/commands/review/index.d.ts +0 -3
  240. package/dist/commands/review/index.d.ts.map +0 -1
  241. package/dist/commands/review/index.js +0 -12
  242. package/dist/commands/review/review-panel.d.ts +0 -3
  243. package/dist/commands/review/review-panel.d.ts.map +0 -1
  244. package/dist/commands/review/review-panel.js +0 -186
  245. package/dist/commands/review/utils.d.ts +0 -18
  246. package/dist/commands/review/utils.d.ts.map +0 -1
  247. package/dist/commands/review/utils.js +0 -146
  248. package/dist/commands/shell/index.d.ts +0 -3
  249. package/dist/commands/shell/index.d.ts.map +0 -1
  250. package/dist/commands/shell/index.js +0 -96
  251. package/dist/modes/manager.d.ts +0 -24
  252. package/dist/modes/manager.d.ts.map +0 -1
  253. package/dist/modes/manager.js +0 -77
  254. package/dist/modes/prompts.d.ts +0 -2
  255. package/dist/modes/prompts.d.ts.map +0 -1
  256. package/dist/modes/prompts.js +0 -142
  257. package/dist/subagents/index.d.ts +0 -16
  258. package/dist/subagents/index.d.ts.map +0 -1
  259. package/dist/subagents/index.js +0 -231
  260. package/dist/terminal/index.d.ts +0 -9
  261. package/dist/terminal/index.d.ts.map +0 -1
  262. package/dist/terminal/index.js +0 -8
  263. package/dist/tools/agent.d.ts +0 -27
  264. package/dist/tools/agent.d.ts.map +0 -1
  265. package/dist/tools/agent.js +0 -81
  266. package/dist/tools/directory-tree.d.ts +0 -28
  267. package/dist/tools/directory-tree.d.ts.map +0 -1
  268. package/dist/tools/directory-tree.js +0 -152
  269. package/dist/tools/glob.d.ts +0 -35
  270. package/dist/tools/glob.d.ts.map +0 -1
  271. package/dist/tools/glob.js +0 -159
  272. package/dist/tools/grep.d.ts +0 -100
  273. package/dist/tools/grep.d.ts.map +0 -1
  274. package/dist/tools/grep.js +0 -601
  275. package/dist/tools/ls.d.ts +0 -26
  276. package/dist/tools/ls.d.ts.map +0 -1
  277. package/dist/tools/ls.js +0 -82
  278. package/dist/tui/components/header.d.ts +0 -21
  279. package/dist/tui/components/header.d.ts.map +0 -1
  280. package/dist/tui/components/header.js +0 -63
  281. package/dist/utils/bash/parse.d.ts +0 -19
  282. package/dist/utils/bash/parse.d.ts.map +0 -1
  283. package/dist/utils/bash/parse.js +0 -223
  284. package/dist/utils/bash/quote.d.ts +0 -6
  285. package/dist/utils/bash/quote.d.ts.map +0 -1
  286. package/dist/utils/bash/quote.js +0 -23
  287. package/dist/utils/generators.d.ts +0 -3
  288. package/dist/utils/generators.d.ts.map +0 -1
  289. package/dist/utils/generators.js +0 -25
  290. package/dist/utils/glob.d.ts +0 -52
  291. package/dist/utils/glob.d.ts.map +0 -1
  292. package/dist/utils/glob.js +0 -376
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Acai: AI-Powered Software Development Assistant
1
+ # acai
2
2
 
3
3
  ![Project Status](https://img.shields.io/badge/Status-Active-brightgreen)
4
4
  ![License](https://img.shields.io/badge/License-MIT-blue.svg)
@@ -19,7 +19,7 @@ Acai is an AI-driven command-line tool that assists software developers with cod
19
19
 
20
20
  ## Prerequisites
21
21
 
22
- - Node.js 20 or higher
22
+ - Node.js 24 or higher
23
23
  - Git
24
24
  - [Ripgrep](https://github.com/BurntSushi/ripgrep) (`rg`) - Fast file content searching
25
25
  - [GitHub CLI](https://cli.github.com/) (`gh`) - Git operations and repository management
@@ -75,19 +75,19 @@ Reference files directly with `@filename`, directories with `@dirname`, or run s
75
75
  - **Pino** for structured logging
76
76
  - **Zod** for schema validation
77
77
  - **Biome** for formatting and linting
78
+ - **Fallow** for dead code, duplication, and complexity analysis
78
79
 
79
80
  ## Project Structure
80
81
 
81
82
  ```
82
83
  .
83
84
  ├── source/ # Main application source code
84
- │ ├── agent/ # Agent loop and sub-agent execution
85
+ │ ├── agent/ # Agent loop
85
86
  │ ├── cli.ts # CLI entry point
86
87
  │ ├── commands/ # REPL command implementations
87
88
  │ ├── execution/ # Command execution utilities
88
89
  │ ├── middleware/ # AI request/response middleware
89
90
  │ ├── models/ # AI model providers and management
90
- │ ├── modes/ # Agent mode management
91
91
  │ ├── prompts/ # Prompt generation and management
92
92
  │ ├── repl/ # REPL utilities
93
93
  │ ├── sessions/ # Session persistence and management
@@ -108,7 +108,7 @@ Reference files directly with `@filename`, directories with `@dirname`, or run s
108
108
  - [Usage Guide](docs/usage.md) - Commands, keyboard shortcuts, piped input, and prompt syntax
109
109
  - [Configuration](docs/configuration.md) - Environment variables, project and global settings
110
110
  - [Skills System](docs/skills.md) - Creating and using specialized instruction files
111
- - [Dynamic Tools](docs/dynamic-tools.md) - Creating custom tools to extend acai
111
+ - [Dynamic Tools](docs/dynamic-tools.md) - Creating custom tools to extend acai (supports bash, python, and other languages; Amp-compatible text schema format; `/tools make` scaffolding command)
112
112
  - [Architecture](ARCHITECTURE.md) - Internal architecture and flow diagrams
113
113
  - [Contributing](CONTRIBUTING.md) - Development setup, scripts, and code style
114
114
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/agent/index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EAEhB,MAAM,mBAAmB,CAAC;AAI3B,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;CAChC,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,eAAe,CAAC;IACvB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,SAAS,GACjB;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;CACf,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;CACf,GACD;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEN,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,UAAU,GAElB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAExC;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAErB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAE3D,iBAAiB,CAAC;AActB,KAAK,UAAU,GAAG;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,kBAAkB,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH,CAAC;AAeF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,aAAa,CAAC;IAC3B,KAAK,EAAE;QACL,WAAW,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACzC,SAAS,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACxC,EAAE,CAAC;IACJ,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH,CAAC;AAEF,qBAAa,KAAK;IAChB,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,eAAe,CAAkB;gBAE7B,IAAI,EAAE,YAAY;IAO9B,SAAS,CAAC,MAAM,EAAE,MAAM;IAIxB,IAAI,KAAK,eAER;IAED,IAAI,WAAW,gBAEd;IAGM,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC;IAyQxD,KAAK;IAML,UAAU;IAmDV,OAAO,CAAC,iBAAiB;IA+FzB,OAAO,CAAC,gBAAgB;IA8CxB,OAAO,CAAC,gBAAgB;YA0BV,sBAAsB;IA4EpC,OAAO,CAAC,kBAAkB;YAuCZ,iBAAiB;IAoG/B,OAAO,CAAC,iBAAiB;CA6B1B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/agent/index.ts"],"names":[],"mappings":"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"}
@@ -30,7 +30,7 @@ export class Agent {
30
30
  const { systemPrompt, input, tools, activeTools, abortSignal } = args;
31
31
  this.resetState();
32
32
  this._state.timestamps.start = performance.now();
33
- const { modelManager, sessionManager, tokenTracker } = this.opts;
33
+ const { modelManager, sessionManager } = this.opts;
34
34
  const maxIterations = args.maxIterations ?? this.config.loop.maxIterations ?? 200;
35
35
  const maxRetries = args.maxRetries ?? 2;
36
36
  const langModel = modelManager.getModel("repl");
@@ -144,8 +144,6 @@ export class Agent {
144
144
  // If finishReason is not tool-calls, break
145
145
  const finishReason = await result.finishReason;
146
146
  if (finishReason !== "tool-calls") {
147
- // Track aggregate usage before yielding agent-stop so footer can display it
148
- tokenTracker.trackUsage("repl", this._state.totalUsage);
149
147
  yield {
150
148
  type: "agent-stop",
151
149
  };
@@ -225,8 +223,6 @@ export class Agent {
225
223
  }
226
224
  // Emit agent-stop if loop ended without emitting a terminal event (maxIterations reached)
227
225
  if (!hasEmittedTerminalEvent) {
228
- // Track aggregate usage before yielding agent-stop so footer can display it
229
- tokenTracker.trackUsage("repl", this._state.totalUsage);
230
226
  yield {
231
227
  type: "agent-stop",
232
228
  };
@@ -385,6 +381,7 @@ export class Agent {
385
381
  this._state.totalUsage.cachedInputTokens += cacheReadTokens;
386
382
  this._state.totalUsage.inputTokenDetails.cacheReadTokens += cacheReadTokens;
387
383
  this._state.totalUsage.reasoningTokens += reasoningTokens;
384
+ this.opts.tokenTracker.trackUsage("repl", stepUsage);
388
385
  sessionManager.recordTurnUsage({
389
386
  inputTokens,
390
387
  outputTokens,
@@ -1,5 +1,5 @@
1
1
  import type { ModelMessage } from "ai";
2
- export interface SessionTokenUsage {
2
+ interface SessionTokenUsage {
3
3
  total: {
4
4
  inputTokens: number;
5
5
  outputTokens: number;
@@ -17,7 +17,7 @@ export interface SessionTokenUsage {
17
17
  estimatedCost: number;
18
18
  };
19
19
  }
20
- export interface TokenUsageTurn {
20
+ interface TokenUsageTurn {
21
21
  stepIndex: number;
22
22
  inputTokens: number;
23
23
  outputTokens: number;
@@ -46,4 +46,5 @@ export interface ConversationHistory {
46
46
  project: string;
47
47
  tokenUsage?: SessionTokenUsage | TokenUsageTurn[];
48
48
  }
49
+ export {};
49
50
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../source/commands/history/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAGvC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAGD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,kBAAkB,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAAC;CACnD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../source/commands/history/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAGvC,UAAU,iBAAiB;IACzB,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAGD,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,kBAAkB,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAAC;CACnD"}
@@ -1,4 +1,3 @@
1
- export declare const DEVELOPMENT_DIRECTORY = "/Users/travisennis/Github/acai-ts";
2
1
  interface InitializationResult {
3
2
  created: string[];
4
3
  existing: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/commands/init-project/utils.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,sCAAsC,CAAC;AAEzE,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,GACjB,oBAAoB,CAmCtB;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,CAazE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE3D"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/commands/init-project/utils.ts"],"names":[],"mappings":"AAMA,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,GACjB,oBAAoB,CAwBtB;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,CAazE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE3D"}
@@ -1,7 +1,7 @@
1
1
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import { defaultConfig } from "../../config/index.js";
4
- export const DEVELOPMENT_DIRECTORY = "/Users/travisennis/Github/acai-ts";
4
+ const DEVELOPMENT_DIRECTORY = "/Users/travisennis/Github/acai-ts";
5
5
  export function ensureProjectDirectory(projectDir) {
6
6
  const created = [];
7
7
  const existing = [];
@@ -12,17 +12,6 @@ export function ensureProjectDirectory(projectDir) {
12
12
  else {
13
13
  existing.push(".acai/");
14
14
  }
15
- const subdirs = ["rules"];
16
- for (const subdir of subdirs) {
17
- const dirPath = path.join(projectDir, subdir);
18
- if (!existsSync(dirPath)) {
19
- mkdirSync(dirPath, { recursive: true });
20
- created.push(`.acai/${subdir}/`);
21
- }
22
- else {
23
- existing.push(`.acai/${subdir}/`);
24
- }
25
- }
26
15
  const agentsSkillsDir = path.join(path.dirname(projectDir), ".agents", "skills");
27
16
  if (!existsSync(agentsSkillsDir)) {
28
17
  mkdirSync(agentsSkillsDir, { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../source/commands/manager.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,SAAS,EACT,MAAM,EACN,YAAY,EACZ,GAAG,EACJ,MAAM,iBAAiB,CAAC;AA2BzB,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAE9D,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,WAAW,CAAU;gBAEjB,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,aAAa,EACb,SAAS,GACV,EAAE,cAAc;IAaX,mBAAmB;YA0DX,qBAAqB;IA0EnC,OAAO,CAAC,iBAAiB;IAQnB,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAuB/C,WAAW;IAKL,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlD,MAAM,CACV,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EACpC,OAAO,EAAE;QACP,GAAG,EAAE,GAAG,CAAC;QACT,SAAS,EAAE,SAAS,CAAC;QACrB,cAAc,EAAE,SAAS,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC;KAChB;;;CAsBJ"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../source/commands/manager.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAEV,SAAS,EACT,MAAM,EACN,YAAY,EACZ,GAAG,EACJ,MAAM,iBAAiB,CAAC;AAsBzB,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAE9D,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,WAAW,CAAU;gBAEjB,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,aAAa,EACb,SAAS,GACV,EAAE,cAAc;IAaX,mBAAmB;YAkDX,qBAAqB;IA4EnC,OAAO,CAAC,iBAAiB;IAQnB,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAuB/C,WAAW;IAKL,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlD,MAAM,CACV,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EACpC,OAAO,EAAE;QACP,GAAG,EAAE,GAAG,CAAC;QACT,SAAS,EAAE,SAAS,CAAC;QACrB,cAAc,EAAE,SAAS,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC;KAChB;;;CAsBJ"}
@@ -1,4 +1,5 @@
1
1
  import { readFile } from "node:fs/promises";
2
+ import { parseSkillsPath } from "../config/index.js";
2
3
  import { processPrompt } from "../prompts/mentions.js";
3
4
  import { loadSkills } from "../skills/index.js";
4
5
  import style from "../terminal/style.js";
@@ -6,27 +7,19 @@ import { Spacer, Text } from "../tui/index.js";
6
7
  import { logger } from "../utils/logger.js";
7
8
  import { replaceArgumentPlaceholders } from "../utils/templates.js";
8
9
  import { parseFrontMatter } from "../utils/yaml.js";
9
- import { addDirectoryCommand } from "./add-directory/index.js";
10
- import { clearCommand } from "./clear/index.js";
11
10
  import { copyCommand } from "./copy/index.js";
12
- import { generateRulesCommand } from "./generate-rules/index.js";
13
- import { handoffCommand } from "./handoff/index.js";
14
11
  import { healthCommand } from "./health/index.js";
15
12
  import { helpCommand } from "./help/index.js";
16
13
  import { historyCommand } from "./history/index.js";
17
14
  import { initCommand } from "./init/index.js";
18
15
  import { initProjectCommand } from "./init-project/index.js";
19
- import { listDirectoriesCommand } from "./list-directories/index.js";
20
16
  import { listToolsCommand } from "./list-tools/index.js";
21
17
  import { modelCommand } from "./model/index.js";
22
18
  import { pasteCommand } from "./paste/index.js";
23
- import { pickupCommand } from "./pickup/index.js";
24
- import { removeDirectoryCommand } from "./remove-directory/index.js";
25
19
  import { resourcesCommand } from "./resources/index.js";
26
- import { reviewCommand } from "./review/index.js";
27
20
  import { sessionCommand } from "./session/index.js";
28
21
  import { shareCommand } from "./share/index.js";
29
- import { shellCommand } from "./shell/index.js";
22
+ import { toolsCommand } from "./tools/index.js";
30
23
  export class CommandManager {
31
24
  commands;
32
25
  promptManager;
@@ -67,26 +60,18 @@ export class CommandManager {
67
60
  };
68
61
  // Register all commands
69
62
  const cmds = [
70
- addDirectoryCommand(options),
71
- clearCommand(options),
72
63
  healthCommand(options),
73
64
  historyCommand(options),
74
65
  initCommand(options),
75
66
  initProjectCommand(options),
76
- listDirectoriesCommand(options),
77
67
  pasteCommand(options),
78
- pickupCommand(options),
79
- removeDirectoryCommand(options),
80
- reviewCommand(options),
81
68
  modelCommand(options),
82
69
  sessionCommand(options),
83
- generateRulesCommand(options),
84
- handoffCommand(options),
85
70
  copyCommand(options),
86
71
  listToolsCommand(options),
87
72
  resourcesCommand(options),
88
73
  shareCommand(options),
89
- shellCommand(options),
74
+ toolsCommand(options),
90
75
  ];
91
76
  // Add help command with access to all commands
92
77
  const helpCmd = helpCommand(options, this.commands);
@@ -103,7 +88,9 @@ export class CommandManager {
103
88
  this.initialized = true;
104
89
  }
105
90
  async registerSkillCommands(options) {
106
- const skills = await loadSkills();
91
+ const appConfig = await this.config.getConfig();
92
+ const skillPaths = parseSkillsPath(appConfig.skills.path);
93
+ const skills = await loadSkills(skillPaths);
107
94
  const userInvocableSkills = skills.getUserInvocable();
108
95
  for (const skill of userInvocableSkills) {
109
96
  const commandName = `/${skill.name}`;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/resources/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkC/D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CAmErE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/resources/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkC/D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CAqErE"}
@@ -1,3 +1,4 @@
1
+ import { parseSkillsPath } from "../../config/index.js";
1
2
  import { loadSkills } from "../../skills/index.js";
2
3
  import style from "../../terminal/style.js";
3
4
  import { Modal, Container as ModalContainer, ModalText, } from "../../tui/index.js";
@@ -30,7 +31,9 @@ export function resourcesCommand(options) {
30
31
  getSubCommands: async () => [],
31
32
  async handle(_args, { tui, editor }) {
32
33
  try {
33
- const skills = await loadSkills();
34
+ const appConfig = await options.config.getConfig();
35
+ const skillPaths = parseSkillsPath(appConfig.skills.path);
36
+ const skills = await loadSkills(skillPaths);
34
37
  const allSkills = skills.getAll();
35
38
  const agentsFiles = await options.config.readAgentsFiles();
36
39
  const projectSkills = allSkills.filter((s) => s.source === "project");
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/session/index.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAoH/D,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,SAAS,EACT,YAAY,GACb,EAAE,cAAc,GAAG,WAAW,CAgK9B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/session/index.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAyH/D,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,SAAS,EACT,YAAY,GACb,EAAE,cAAc,GAAG,WAAW,CAiK9B"}
@@ -44,6 +44,11 @@ function buildContextTable(breakdown, window) {
44
44
  formatNumber(breakdown.systemPromptBreakdown.userAgentsMd),
45
45
  formatPercentage(breakdown.systemPromptBreakdown.userAgentsMd, window),
46
46
  ],
47
+ [
48
+ " ~/.config/AGENTS.md",
49
+ formatNumber(breakdown.systemPromptBreakdown.configAgentsMd),
50
+ formatPercentage(breakdown.systemPromptBreakdown.configAgentsMd, window),
51
+ ],
47
52
  [
48
53
  " ./AGENTS.md",
49
54
  formatNumber(breakdown.systemPromptBreakdown.cwdAgentsMd),
@@ -126,6 +131,7 @@ export function sessionCommand({ config, tokenCounter, modelManager, sessionMana
126
131
  const systemPromptBreakdown = {
127
132
  core: tokenCounter.count(sysResult.components.core),
128
133
  userAgentsMd: tokenCounter.count(sysResult.components.userAgentsMd),
134
+ configAgentsMd: tokenCounter.count(sysResult.components.configAgentsMd),
129
135
  cwdAgentsMd: tokenCounter.count(sysResult.components.cwdAgentsMd),
130
136
  learnedRules: tokenCounter.count(sysResult.components.learnedRules),
131
137
  skills: tokenCounter.count(sysResult.components.skills),
@@ -4,6 +4,7 @@ export type Breakdown = {
4
4
  systemPromptBreakdown: {
5
5
  core: number;
6
6
  userAgentsMd: number;
7
+ configAgentsMd: number;
7
8
  cwdAgentsMd: number;
8
9
  learnedRules: number;
9
10
  skills: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../source/commands/session/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAEvC,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE;IAAE,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GACxC,MAAM,CAOR"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../source/commands/session/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAEvC,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE;IAAE,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GACxC,MAAM,CAOR"}
@@ -1 +1 @@
1
- {"version":3,"file":"html-renderer.d.ts","sourceRoot":"","sources":["../../../source/commands/share/html-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA0C,MAAM,IAAI,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AAiJD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAwO9D;AAED,wBAAgB,cAAc,CAC5B,cAAc,EAAE;IACd,GAAG,EAAE,MAAM,YAAY,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,EACD,OAAO,CAAC,EAAE,MAAM,GACf,WAAW,CAUb;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAMA"}
1
+ {"version":3,"file":"html-renderer.d.ts","sourceRoot":"","sources":["../../../source/commands/share/html-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA0C,MAAM,IAAI,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AA8ID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAwO9D;AAED,wBAAgB,cAAc,CAC5B,cAAc,EAAE;IACd,GAAG,EAAE,MAAM,YAAY,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,EACD,OAAO,CAAC,EAAE,MAAM,GACf,WAAW,CAUb;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAMA"}
@@ -69,68 +69,74 @@ function renderToolResult(toolResult) {
69
69
  </div>
70
70
  </div>`;
71
71
  }
72
- function renderMessage(message) {
73
- const role = message.role;
74
- if (role === "system") {
75
- const content = Array.isArray(message.content)
76
- ? message.content
77
- .filter((p) => p.type === "text")
78
- .map((p) => escapeHtml(p.text))
79
- .join("\n")
80
- : escapeHtml(String(message.content));
81
- return `
72
+ function extractTextContent(content) {
73
+ if (typeof content === "string") {
74
+ return escapeHtml(content);
75
+ }
76
+ if (Array.isArray(content)) {
77
+ return content
78
+ .filter((p) => typeof p !== "string" && p.type === "text")
79
+ .map((p) => escapeHtml(p.text))
80
+ .join("\n");
81
+ }
82
+ return "";
83
+ }
84
+ function renderSystemMessage(content) {
85
+ const textContent = extractTextContent(content);
86
+ return `
82
87
  <div class="message system">
83
88
  <div class="role">system</div>
84
- <div class="content">${content}</div>
89
+ <div class="content">${textContent}</div>
85
90
  </div>`;
86
- }
87
- if (role === "user") {
88
- const content = message.content;
89
- let textContent = "";
90
- if (typeof content === "string") {
91
- textContent = escapeHtml(content);
92
- }
93
- else if (Array.isArray(content)) {
94
- textContent = content
95
- .filter((p) => typeof p !== "string" && p.type === "text")
96
- .map((p) => escapeHtml(p.text))
97
- .join("\n");
98
- }
99
- return `
91
+ }
92
+ function renderUserMessage(content) {
93
+ const textContent = extractTextContent(content);
94
+ return `
100
95
  <div class="message user">
101
96
  <div class="role">user</div>
102
97
  <div class="content">${textContent}</div>
103
98
  </div>`;
99
+ }
100
+ function renderAssistantContent(content) {
101
+ if (typeof content === "string") {
102
+ return `<div class="content">${escapeHtml(content)}</div>`;
104
103
  }
105
- if (role === "assistant") {
106
- const content = message.content;
107
- let html = `<div class="message assistant"><div class="role">assistant</div>`;
108
- if (typeof content === "string") {
109
- html += `<div class="content">${escapeHtml(content)}</div>`;
110
- }
111
- else if (Array.isArray(content)) {
112
- for (const part of content) {
113
- if (part.type === "text" && part.text.trim()) {
114
- html += `<div class="content">${escapeHtml(part.text)}</div>`;
115
- }
116
- else if (part.type === "tool-call") {
117
- html += renderToolCall(part);
118
- }
104
+ if (Array.isArray(content)) {
105
+ let html = "";
106
+ for (const part of content) {
107
+ if (part.type === "text" && part.text.trim()) {
108
+ html += `<div class="content">${escapeHtml(part.text)}</div>`;
109
+ }
110
+ else if (part.type === "tool-call") {
111
+ html += renderToolCall(part);
119
112
  }
120
113
  }
121
- html += "</div>";
122
114
  return html;
123
115
  }
124
- if (role === "tool") {
125
- const parts = message.content;
126
- let html = "";
127
- for (const part of parts) {
128
- if (part.type === "tool-result") {
129
- html += renderToolResult(part);
130
- }
116
+ return "";
117
+ }
118
+ function renderAssistantMessage(content) {
119
+ return `<div class="message assistant"><div class="role">assistant</div>${renderAssistantContent(content)}</div>`;
120
+ }
121
+ function renderToolMessage(parts) {
122
+ let html = "";
123
+ for (const part of parts) {
124
+ if (part.type === "tool-result") {
125
+ html += renderToolResult(part);
131
126
  }
132
- return html;
133
127
  }
128
+ return html;
129
+ }
130
+ function renderMessage(message) {
131
+ const role = message.role;
132
+ if (role === "system")
133
+ return renderSystemMessage(message.content);
134
+ if (role === "user")
135
+ return renderUserMessage(message.content);
136
+ if (role === "assistant")
137
+ return renderAssistantMessage(message.content);
138
+ if (role === "tool")
139
+ return renderToolMessage(message.content);
134
140
  return "";
135
141
  }
136
142
  export function renderSessionHtml(session) {
@@ -0,0 +1,3 @@
1
+ import type { CommandOptions, ReplCommand } from "../types.ts";
2
+ export declare function toolsCommand(options: CommandOptions): ReplCommand;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/tools/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAa/D,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CA6CjE"}
@@ -0,0 +1,191 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import style from "../../terminal/style.js";
4
+ import { Text } from "../../tui/index.js";
5
+ import { bashTemplate, nodeTemplate, textCompanionTemplate, textSchemaTemplate, zshTemplate, } from "./templates.js";
6
+ const TOOL_NAME_REGEX = /^[a-zA-Z_][a-zA-Z0-9_-]*$/;
7
+ export function toolsCommand(options) {
8
+ return {
9
+ command: "/tools",
10
+ description: "Manage dynamic tools (make, list)",
11
+ aliases: [],
12
+ getSubCommands: async () => ["make", "list"],
13
+ async handle(args, { tui, container, editor, }) {
14
+ const subCommand = args[0];
15
+ if (subCommand === "make") {
16
+ return handleToolMake(args.slice(1), options, container, editor, tui);
17
+ }
18
+ if (subCommand === "list") {
19
+ return handleToolList(options, container, editor, tui);
20
+ }
21
+ // Default: show help
22
+ container.addChild(new Text(style.dim("Usage: /tools make <name> [--bash|--zsh|--node|--text] [--description <desc>] [--dir <path>]"), 0, 1));
23
+ container.addChild(new Text(style.dim(" /tools list"), 0, 1));
24
+ return "continue";
25
+ },
26
+ };
27
+ }
28
+ function writeToolFile(filePath, content, makeExecutable) {
29
+ const files = [];
30
+ fs.writeFileSync(filePath, content, "utf8");
31
+ if (makeExecutable) {
32
+ fs.chmodSync(filePath, 0o755);
33
+ }
34
+ files.push(filePath);
35
+ return files;
36
+ }
37
+ function createToolFiles(toolName, description, toolType, outputDir) {
38
+ const files = [];
39
+ const typeConfig = {
40
+ node: {
41
+ ext: ".mjs",
42
+ template: () => nodeTemplate(toolName, description),
43
+ executable: true,
44
+ },
45
+ bash: {
46
+ ext: ".sh",
47
+ template: () => bashTemplate(toolName, description),
48
+ executable: true,
49
+ },
50
+ zsh: {
51
+ ext: ".zsh",
52
+ template: () => zshTemplate(toolName, description),
53
+ executable: true,
54
+ },
55
+ text: { ext: ".sh", template: () => "", executable: true }, // handled separately
56
+ };
57
+ if (toolType === "text") {
58
+ const toolFilePath = path.join(outputDir, `${toolName}.tool`);
59
+ const companionFilePath = path.join(outputDir, `${toolName}.sh`);
60
+ if (fs.existsSync(toolFilePath))
61
+ return toolFilePath;
62
+ if (fs.existsSync(companionFilePath))
63
+ return companionFilePath;
64
+ files.push(...writeToolFile(toolFilePath, textSchemaTemplate(toolName, description), false));
65
+ files.push(...writeToolFile(companionFilePath, textCompanionTemplate(toolName), true));
66
+ return files;
67
+ }
68
+ const config = typeConfig[toolType];
69
+ const filePath = path.join(outputDir, `${toolName}${config.ext}`);
70
+ if (fs.existsSync(filePath))
71
+ return filePath;
72
+ files.push(...writeToolFile(filePath, config.template(), config.executable));
73
+ return files;
74
+ }
75
+ const TYPE_FLAGS = {
76
+ "--bash": "bash",
77
+ "--zsh": "zsh",
78
+ "--node": "node",
79
+ "--text": "text",
80
+ };
81
+ function parseToolArgs(args) {
82
+ let toolName = "";
83
+ let toolType = "bash";
84
+ let description = "";
85
+ let customDir = "";
86
+ for (let i = 0; i < args.length; i++) {
87
+ const arg = args[i];
88
+ const typeFlag = TYPE_FLAGS[arg];
89
+ if (typeFlag) {
90
+ toolType = typeFlag;
91
+ }
92
+ else if (arg === "--description" || arg === "-d") {
93
+ description = args[++i] || "";
94
+ }
95
+ else if (arg === "--dir") {
96
+ customDir = args[++i] || "";
97
+ }
98
+ else if (!arg.startsWith("-")) {
99
+ toolName = arg;
100
+ }
101
+ }
102
+ return { toolName, toolType, description, customDir };
103
+ }
104
+ function showToolError(container, editor, tui, message, usage) {
105
+ container.addChild(new Text(style.red(message), 0, 1));
106
+ if (usage) {
107
+ container.addChild(new Text(style.dim(usage), 0, 1));
108
+ }
109
+ tui.requestRender();
110
+ editor.setText("");
111
+ return "continue";
112
+ }
113
+ function showToolSuccess(container, editor, tui, toolName, filePaths) {
114
+ container.addChild(new Text(style.green(`Created tool: ${toolName}`), 0, 1));
115
+ for (const filePath of filePaths) {
116
+ container.addChild(new Text(style.dim(` ${filePath}`), 0, 1));
117
+ }
118
+ container.addChild(new Text(style.dim("Restart acai or reload tools to use the new tool."), 0, 1));
119
+ tui.requestRender();
120
+ editor.setText("");
121
+ return "continue";
122
+ }
123
+ function handleToolMake(args, options, container, editor, tui) {
124
+ const parsed = parseToolArgs(args);
125
+ let { toolName, toolType, description, customDir } = parsed;
126
+ if (!toolName) {
127
+ return showToolError(container, editor, tui, "Error: Tool name is required", "Usage: /tools make <name> [--bash|--zsh|--node|--text] [--description <desc>] [--dir <path>]");
128
+ }
129
+ if (!TOOL_NAME_REGEX.test(toolName)) {
130
+ return showToolError(container, editor, tui, `Error: Tool name must match ${TOOL_NAME_REGEX.source}`);
131
+ }
132
+ if (!description) {
133
+ description = `Dynamic tool: ${toolName}`;
134
+ }
135
+ const outputDir = customDir || path.join(options.workspace.primaryDir, ".acai", "tools");
136
+ if (!fs.existsSync(outputDir)) {
137
+ fs.mkdirSync(outputDir, { recursive: true });
138
+ }
139
+ try {
140
+ const result = createToolFiles(toolName, description, toolType, outputDir);
141
+ if (typeof result === "string") {
142
+ return showToolError(container, editor, tui, `Error: File already exists: ${result}`);
143
+ }
144
+ return showToolSuccess(container, editor, tui, toolName, result);
145
+ }
146
+ catch (e) {
147
+ return showToolError(container, editor, tui, `Error creating tool: ${e.message}`);
148
+ }
149
+ }
150
+ async function handleToolList(options, container, editor, tui) {
151
+ const projectDir = path.join(options.workspace.primaryDir, ".acai", "tools");
152
+ const userDir = path.join(process.env["HOME"] || process.env["USERPROFILE"] || "", ".acai", "tools");
153
+ const dirs = [
154
+ { label: "User tools", dirPath: userDir },
155
+ { label: "Project tools", dirPath: projectDir },
156
+ ];
157
+ let foundAny = false;
158
+ for (const dir of dirs) {
159
+ if (!fs.existsSync(dir.dirPath)) {
160
+ container.addChild(new Text(style.dim(`${dir.label}: directory not found (${dir.dirPath})`), 0, 1));
161
+ continue;
162
+ }
163
+ const files = fs.readdirSync(dir.dirPath);
164
+ const toolFiles = files.filter((f) => f.endsWith(".js") ||
165
+ f.endsWith(".mjs") ||
166
+ f.endsWith(".cjs") ||
167
+ f.endsWith(".sh") ||
168
+ f.endsWith(".bash") ||
169
+ f.endsWith(".zsh") ||
170
+ f.endsWith(".py") ||
171
+ f.endsWith(".rb") ||
172
+ f.endsWith(".tool") ||
173
+ (!path.extname(f) &&
174
+ fs.statSync(path.join(dir.dirPath, f)).mode & 0o111));
175
+ if (toolFiles.length === 0) {
176
+ container.addChild(new Text(style.dim(`${dir.label}: no tools found`), 0, 1));
177
+ continue;
178
+ }
179
+ foundAny = true;
180
+ container.addChild(new Text(style.bold(dir.label), 0, 1));
181
+ for (const file of toolFiles) {
182
+ container.addChild(new Text(style.dim(` ${file}`), 0, 1));
183
+ }
184
+ }
185
+ if (!foundAny) {
186
+ container.addChild(new Text(style.dim("No dynamic tools found."), 0, 1));
187
+ }
188
+ tui.requestRender();
189
+ editor.setText("");
190
+ return "continue";
191
+ }