@travisennis/acai 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (586) hide show
  1. package/README.md +225 -39
  2. package/dist/agent/index.d.ts +30 -21
  3. package/dist/agent/index.d.ts.map +1 -1
  4. package/dist/agent/index.js +237 -198
  5. package/dist/cli.d.ts +4 -3
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +56 -18
  8. package/dist/commands/add-directory/index.d.ts +3 -0
  9. package/dist/commands/add-directory/index.d.ts.map +1 -0
  10. package/dist/commands/add-directory/index.js +50 -0
  11. package/dist/commands/add-directory/types.d.ts +6 -0
  12. package/dist/commands/add-directory/types.d.ts.map +1 -0
  13. package/dist/commands/add-directory/utils.d.ts +3 -0
  14. package/dist/commands/add-directory/utils.d.ts.map +1 -0
  15. package/dist/commands/add-directory/utils.js +15 -0
  16. package/dist/commands/clear/index.d.ts +3 -0
  17. package/dist/commands/clear/index.d.ts.map +1 -0
  18. package/dist/commands/{clear-command.js → clear/index.js} +1 -7
  19. package/dist/commands/copy/index.d.ts +3 -0
  20. package/dist/commands/copy/index.d.ts.map +1 -0
  21. package/dist/commands/copy/index.js +39 -0
  22. package/dist/commands/copy/types.d.ts +3 -0
  23. package/dist/commands/copy/types.d.ts.map +1 -0
  24. package/dist/commands/copy/types.js +1 -0
  25. package/dist/commands/copy/utils.d.ts +3 -0
  26. package/dist/commands/copy/utils.d.ts.map +1 -0
  27. package/dist/commands/copy/utils.js +22 -0
  28. package/dist/commands/exit/index.d.ts +10 -0
  29. package/dist/commands/exit/index.d.ts.map +1 -0
  30. package/dist/commands/exit/index.js +21 -0
  31. package/dist/commands/exit/types.d.ts +8 -0
  32. package/dist/commands/exit/types.d.ts.map +1 -0
  33. package/dist/commands/exit/types.js +1 -0
  34. package/dist/commands/exit/utils.d.ts +2 -0
  35. package/dist/commands/exit/utils.d.ts.map +1 -0
  36. package/dist/commands/exit/utils.js +13 -0
  37. package/dist/commands/generate-rules/index.d.ts +3 -0
  38. package/dist/commands/generate-rules/index.d.ts.map +1 -0
  39. package/dist/commands/{generate-rules-command.js → generate-rules/index.js} +65 -147
  40. package/dist/commands/generate-rules/utils.d.ts +5 -0
  41. package/dist/commands/generate-rules/utils.d.ts.map +1 -0
  42. package/dist/commands/generate-rules/utils.js +25 -0
  43. package/dist/commands/handoff/index.d.ts +3 -0
  44. package/dist/commands/handoff/index.d.ts.map +1 -0
  45. package/dist/commands/handoff/index.js +97 -0
  46. package/dist/commands/handoff/utils.d.ts +4 -0
  47. package/dist/commands/handoff/utils.d.ts.map +1 -0
  48. package/dist/commands/handoff/utils.js +123 -0
  49. package/dist/commands/health/index.d.ts +3 -0
  50. package/dist/commands/health/index.d.ts.map +1 -0
  51. package/dist/commands/health/index.js +56 -0
  52. package/dist/commands/health/utils.d.ts +15 -0
  53. package/dist/commands/health/utils.d.ts.map +1 -0
  54. package/dist/commands/health/utils.js +52 -0
  55. package/dist/commands/help/index.d.ts +3 -0
  56. package/dist/commands/help/index.d.ts.map +1 -0
  57. package/dist/commands/{help-command.js → help/index.js} +6 -14
  58. package/dist/commands/history/index.d.ts +3 -0
  59. package/dist/commands/history/index.d.ts.map +1 -0
  60. package/dist/commands/{history-command.js → history/index.js} +40 -200
  61. package/dist/commands/history/types.d.ts +11 -0
  62. package/dist/commands/history/types.d.ts.map +1 -0
  63. package/dist/commands/history/types.js +1 -0
  64. package/dist/commands/history/utils.d.ts +4 -0
  65. package/dist/commands/history/utils.d.ts.map +1 -0
  66. package/dist/commands/history/utils.js +86 -0
  67. package/dist/commands/init/index.d.ts +3 -0
  68. package/dist/commands/init/index.d.ts.map +1 -0
  69. package/dist/commands/{init-command.js → init/index.js} +17 -27
  70. package/dist/commands/init-project/index.d.ts +3 -0
  71. package/dist/commands/init-project/index.d.ts.map +1 -0
  72. package/dist/commands/init-project/index.js +51 -0
  73. package/dist/commands/init-project/utils.d.ts +9 -0
  74. package/dist/commands/init-project/utils.d.ts.map +1 -0
  75. package/dist/commands/init-project/utils.js +43 -0
  76. package/dist/commands/list-directories/index.d.ts +3 -0
  77. package/dist/commands/list-directories/index.d.ts.map +1 -0
  78. package/dist/commands/{list-directories-command.js → list-directories/index.js} +2 -15
  79. package/dist/commands/list-tools/index.d.ts +3 -0
  80. package/dist/commands/list-tools/index.d.ts.map +1 -0
  81. package/dist/commands/list-tools/index.js +89 -0
  82. package/dist/commands/manager.d.ts +2 -9
  83. package/dist/commands/manager.d.ts.map +1 -1
  84. package/dist/commands/manager.js +38 -83
  85. package/dist/commands/model/index.d.ts +3 -0
  86. package/dist/commands/model/index.d.ts.map +1 -0
  87. package/dist/commands/model/index.js +182 -0
  88. package/dist/commands/model/utils.d.ts +3 -0
  89. package/dist/commands/model/utils.d.ts.map +1 -0
  90. package/dist/commands/model/utils.js +5 -0
  91. package/dist/commands/paste/index.d.ts +3 -0
  92. package/dist/commands/paste/index.d.ts.map +1 -0
  93. package/dist/commands/paste/index.js +94 -0
  94. package/dist/commands/paste/utils.d.ts +5 -0
  95. package/dist/commands/paste/utils.d.ts.map +1 -0
  96. package/dist/commands/paste/utils.js +86 -0
  97. package/dist/commands/pickup/index.d.ts +3 -0
  98. package/dist/commands/pickup/index.d.ts.map +1 -0
  99. package/dist/commands/pickup/index.js +138 -0
  100. package/dist/commands/pickup/types.d.ts +6 -0
  101. package/dist/commands/pickup/types.d.ts.map +1 -0
  102. package/dist/commands/pickup/types.js +1 -0
  103. package/dist/commands/pickup/utils.d.ts +7 -0
  104. package/dist/commands/pickup/utils.d.ts.map +1 -0
  105. package/dist/commands/pickup/utils.js +56 -0
  106. package/dist/commands/prompt/index.d.ts +5 -0
  107. package/dist/commands/prompt/index.d.ts.map +1 -0
  108. package/dist/commands/prompt/index.js +126 -0
  109. package/dist/commands/prompt/types.d.ts +15 -0
  110. package/dist/commands/prompt/types.d.ts.map +1 -0
  111. package/dist/commands/prompt/types.js +1 -0
  112. package/dist/commands/prompt/utils.d.ts +12 -0
  113. package/dist/commands/prompt/utils.d.ts.map +1 -0
  114. package/dist/commands/prompt/utils.js +107 -0
  115. package/dist/commands/remove-directory/index.d.ts +3 -0
  116. package/dist/commands/remove-directory/index.d.ts.map +1 -0
  117. package/dist/commands/{remove-directory-command.js → remove-directory/index.js} +3 -35
  118. package/dist/commands/reset/index.d.ts +3 -0
  119. package/dist/commands/reset/index.d.ts.map +1 -0
  120. package/dist/commands/{reset-command.js → reset/index.js} +8 -11
  121. package/dist/commands/reset/types.d.ts +1 -0
  122. package/dist/commands/reset/types.d.ts.map +1 -0
  123. package/dist/commands/reset/types.js +3 -0
  124. package/dist/commands/resources/index.d.ts +3 -0
  125. package/dist/commands/resources/index.d.ts.map +1 -0
  126. package/dist/commands/resources/index.js +84 -0
  127. package/dist/commands/review/index.d.ts +3 -0
  128. package/dist/commands/review/index.d.ts.map +1 -0
  129. package/dist/commands/review/index.js +126 -0
  130. package/dist/commands/review/types.d.ts +12 -0
  131. package/dist/commands/review/types.d.ts.map +1 -0
  132. package/dist/commands/review/types.js +1 -0
  133. package/dist/commands/review/utils.d.ts +4 -0
  134. package/dist/commands/review/utils.d.ts.map +1 -0
  135. package/dist/commands/review/utils.js +87 -0
  136. package/dist/commands/save/index.d.ts +3 -0
  137. package/dist/commands/save/index.d.ts.map +1 -0
  138. package/dist/commands/{save-command.js → save/index.js} +3 -10
  139. package/dist/commands/session/index.d.ts +3 -0
  140. package/dist/commands/session/index.d.ts.map +1 -0
  141. package/dist/commands/session/index.js +197 -0
  142. package/dist/commands/session/types.d.ts +13 -0
  143. package/dist/commands/session/types.d.ts.map +1 -0
  144. package/dist/commands/session/types.js +7 -0
  145. package/dist/commands/shell/index.d.ts +3 -0
  146. package/dist/commands/shell/index.d.ts.map +1 -0
  147. package/dist/commands/{shell-command.js → shell/index.js} +4 -51
  148. package/dist/commands/types.d.ts +2 -5
  149. package/dist/commands/types.d.ts.map +1 -1
  150. package/dist/config.d.ts +36 -7
  151. package/dist/config.d.ts.map +1 -1
  152. package/dist/config.js +118 -60
  153. package/dist/dedent.d.ts.map +1 -1
  154. package/dist/dedent.js +7 -7
  155. package/dist/execution/index.d.ts +18 -2
  156. package/dist/execution/index.d.ts.map +1 -1
  157. package/dist/execution/index.js +119 -81
  158. package/dist/formatting.d.ts +46 -0
  159. package/dist/formatting.d.ts.map +1 -1
  160. package/dist/formatting.js +94 -0
  161. package/dist/index.d.ts +1 -1
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +299 -177
  164. package/dist/logger.d.ts.map +1 -1
  165. package/dist/logger.js +4 -11
  166. package/dist/mentions.d.ts.map +1 -1
  167. package/dist/mentions.js +3 -53
  168. package/dist/middleware/audit-message.d.ts +2 -2
  169. package/dist/middleware/audit-message.d.ts.map +1 -1
  170. package/dist/middleware/audit-message.js +40 -2
  171. package/dist/middleware/cache.d.ts +2 -2
  172. package/dist/middleware/cache.d.ts.map +1 -1
  173. package/dist/middleware/cache.js +111 -27
  174. package/dist/middleware/rate-limit.d.ts +2 -2
  175. package/dist/middleware/rate-limit.d.ts.map +1 -1
  176. package/dist/middleware/rate-limit.js +1 -0
  177. package/dist/models/ai-config.d.ts.map +1 -1
  178. package/dist/models/ai-config.js +46 -29
  179. package/dist/models/anthropic-provider.d.ts +14 -13
  180. package/dist/models/anthropic-provider.d.ts.map +1 -1
  181. package/dist/models/anthropic-provider.js +0 -7
  182. package/dist/models/deepseek-provider.d.ts +9 -8
  183. package/dist/models/deepseek-provider.d.ts.map +1 -1
  184. package/dist/models/deepseek-provider.js +0 -2
  185. package/dist/models/google-provider.d.ts +10 -9
  186. package/dist/models/google-provider.d.ts.map +1 -1
  187. package/dist/models/google-provider.js +0 -3
  188. package/dist/models/groq-provider.d.ts +8 -7
  189. package/dist/models/groq-provider.d.ts.map +1 -1
  190. package/dist/models/groq-provider.js +0 -1
  191. package/dist/models/manager.d.ts +7 -4
  192. package/dist/models/manager.d.ts.map +1 -1
  193. package/dist/models/manager.js +5 -25
  194. package/dist/models/openai-provider.d.ts +11 -10
  195. package/dist/models/openai-provider.d.ts.map +1 -1
  196. package/dist/models/openai-provider.js +0 -4
  197. package/dist/models/opencode-zen-provider.d.ts +23 -0
  198. package/dist/models/opencode-zen-provider.d.ts.map +1 -0
  199. package/dist/models/opencode-zen-provider.js +76 -0
  200. package/dist/models/openrouter-provider.d.ts +34 -28
  201. package/dist/models/openrouter-provider.d.ts.map +1 -1
  202. package/dist/models/openrouter-provider.js +148 -139
  203. package/dist/models/providers.d.ts +6 -16
  204. package/dist/models/providers.d.ts.map +1 -1
  205. package/dist/models/providers.js +8 -58
  206. package/dist/models/xai-provider.d.ts +9 -8
  207. package/dist/models/xai-provider.d.ts.map +1 -1
  208. package/dist/models/xai-provider.js +0 -2
  209. package/dist/prompts/manager.d.ts +1 -1
  210. package/dist/prompts/manager.d.ts.map +1 -1
  211. package/dist/prompts/manager.js +1 -1
  212. package/dist/prompts.d.ts +8 -4
  213. package/dist/prompts.d.ts.map +1 -1
  214. package/dist/prompts.js +155 -177
  215. package/dist/repl/project-status.d.ts +19 -0
  216. package/dist/repl/project-status.d.ts.map +1 -0
  217. package/dist/repl/project-status.js +78 -0
  218. package/dist/repl-new.d.ts +15 -6
  219. package/dist/repl-new.d.ts.map +1 -1
  220. package/dist/repl-new.js +266 -83
  221. package/dist/{messages.d.ts → sessions/manager.d.ts} +13 -4
  222. package/dist/sessions/manager.d.ts.map +1 -0
  223. package/dist/{messages.js → sessions/manager.js} +126 -16
  224. package/dist/skills.d.ts +16 -0
  225. package/dist/skills.d.ts.map +1 -0
  226. package/dist/skills.js +233 -0
  227. package/dist/terminal/control.d.ts +56 -0
  228. package/dist/terminal/control.d.ts.map +1 -0
  229. package/dist/terminal/control.js +111 -0
  230. package/dist/terminal/default-theme.d.ts +1 -1
  231. package/dist/terminal/default-theme.d.ts.map +1 -1
  232. package/dist/terminal/default-theme.js +24 -28
  233. package/dist/terminal/formatting.d.ts +23 -26
  234. package/dist/terminal/formatting.d.ts.map +1 -1
  235. package/dist/terminal/formatting.js +35 -53
  236. package/dist/terminal/highlight/index.d.ts.map +1 -1
  237. package/dist/terminal/highlight/index.js +3 -6
  238. package/dist/terminal/highlight/theme.d.ts.map +1 -1
  239. package/dist/terminal/highlight/theme.js +2 -6
  240. package/dist/terminal/index.d.ts +2 -101
  241. package/dist/terminal/index.d.ts.map +1 -1
  242. package/dist/terminal/index.js +2 -464
  243. package/dist/terminal/keys.d.ts +211 -0
  244. package/dist/terminal/keys.d.ts.map +1 -0
  245. package/dist/terminal/keys.js +546 -0
  246. package/dist/terminal/segmenter.d.ts +6 -0
  247. package/dist/terminal/segmenter.d.ts.map +1 -0
  248. package/dist/terminal/segmenter.js +11 -0
  249. package/dist/terminal/select-prompt.d.ts.map +1 -1
  250. package/dist/terminal/select-prompt.js +9 -21
  251. package/dist/terminal/string-width.d.ts.map +1 -1
  252. package/dist/terminal/string-width.js +40 -21
  253. package/dist/terminal/strip-ansi.d.ts.map +1 -1
  254. package/dist/terminal/strip-ansi.js +9 -15
  255. package/dist/terminal/table/cell.d.ts +114 -0
  256. package/dist/terminal/table/cell.d.ts.map +1 -0
  257. package/dist/terminal/table/cell.js +407 -0
  258. package/dist/terminal/table/debug.d.ts +15 -0
  259. package/dist/terminal/table/debug.d.ts.map +1 -0
  260. package/dist/terminal/table/debug.js +32 -0
  261. package/dist/terminal/table/index.d.ts +3 -0
  262. package/dist/terminal/table/index.d.ts.map +1 -0
  263. package/dist/terminal/table/index.js +2 -0
  264. package/dist/terminal/table/layout-manager.d.ts +27 -0
  265. package/dist/terminal/table/layout-manager.d.ts.map +1 -0
  266. package/dist/terminal/table/layout-manager.js +257 -0
  267. package/dist/terminal/table/table.d.ts +9 -0
  268. package/dist/terminal/table/table.d.ts.map +1 -0
  269. package/dist/terminal/table/table.js +97 -0
  270. package/dist/terminal/table/utils.d.ts +63 -0
  271. package/dist/terminal/table/utils.d.ts.map +1 -0
  272. package/dist/terminal/table/utils.js +326 -0
  273. package/dist/tokens/tracker.d.ts.map +1 -1
  274. package/dist/tokens/tracker.js +58 -16
  275. package/dist/tools/bash.d.ts +11 -11
  276. package/dist/tools/bash.d.ts.map +1 -1
  277. package/dist/tools/bash.js +189 -81
  278. package/dist/tools/directory-tree.d.ts +9 -13
  279. package/dist/tools/directory-tree.d.ts.map +1 -1
  280. package/dist/tools/directory-tree.js +90 -60
  281. package/dist/tools/dynamic-tool-loader.d.ts +22 -8
  282. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  283. package/dist/tools/dynamic-tool-loader.js +41 -46
  284. package/dist/tools/edit-file.d.ts +6 -16
  285. package/dist/tools/edit-file.d.ts.map +1 -1
  286. package/dist/tools/edit-file.js +22 -66
  287. package/dist/tools/glob.d.ts +15 -16
  288. package/dist/tools/glob.d.ts.map +1 -1
  289. package/dist/tools/glob.js +78 -109
  290. package/dist/tools/grep.d.ts +19 -22
  291. package/dist/tools/grep.d.ts.map +1 -1
  292. package/dist/tools/grep.js +61 -93
  293. package/dist/tools/index.d.ts +202 -167
  294. package/dist/tools/index.d.ts.map +1 -1
  295. package/dist/tools/index.js +17 -273
  296. package/dist/tools/ls.d.ts +26 -0
  297. package/dist/tools/ls.d.ts.map +1 -0
  298. package/dist/tools/ls.js +80 -0
  299. package/dist/tools/read-file.d.ts +15 -15
  300. package/dist/tools/read-file.d.ts.map +1 -1
  301. package/dist/tools/read-file.js +52 -76
  302. package/dist/tools/save-file.d.ts +8 -8
  303. package/dist/tools/save-file.d.ts.map +1 -1
  304. package/dist/tools/save-file.js +42 -53
  305. package/dist/tools/think.d.ts +4 -4
  306. package/dist/tools/think.d.ts.map +1 -1
  307. package/dist/tools/think.js +9 -32
  308. package/dist/tools/types.d.ts +5 -21
  309. package/dist/tools/types.d.ts.map +1 -1
  310. package/dist/tools/types.js +0 -9
  311. package/dist/tui/autocomplete/attachment-provider.d.ts +18 -0
  312. package/dist/tui/autocomplete/attachment-provider.d.ts.map +1 -0
  313. package/dist/tui/autocomplete/attachment-provider.js +159 -0
  314. package/dist/tui/autocomplete/base-provider.d.ts +17 -0
  315. package/dist/tui/autocomplete/base-provider.d.ts.map +1 -0
  316. package/dist/tui/autocomplete/base-provider.js +1 -0
  317. package/dist/tui/autocomplete/combined-provider.d.ts +20 -0
  318. package/dist/tui/autocomplete/combined-provider.d.ts.map +1 -0
  319. package/dist/tui/autocomplete/combined-provider.js +61 -0
  320. package/dist/tui/autocomplete/command-provider.d.ts +20 -0
  321. package/dist/tui/autocomplete/command-provider.d.ts.map +1 -0
  322. package/dist/tui/autocomplete/command-provider.js +90 -0
  323. package/dist/tui/autocomplete/file-search-provider.d.ts +16 -0
  324. package/dist/tui/autocomplete/file-search-provider.d.ts.map +1 -0
  325. package/dist/tui/autocomplete/file-search-provider.js +123 -0
  326. package/dist/tui/autocomplete/path-provider.d.ts +21 -0
  327. package/dist/tui/autocomplete/path-provider.d.ts.map +1 -0
  328. package/dist/tui/autocomplete/path-provider.js +164 -0
  329. package/dist/tui/autocomplete/utils.d.ts +16 -0
  330. package/dist/tui/autocomplete/utils.d.ts.map +1 -0
  331. package/dist/tui/autocomplete/utils.js +137 -0
  332. package/dist/tui/autocomplete.d.ts +12 -43
  333. package/dist/tui/autocomplete.d.ts.map +1 -1
  334. package/dist/tui/autocomplete.js +20 -465
  335. package/dist/tui/components/assistant-message.js +1 -1
  336. package/dist/tui/components/box.d.ts +20 -0
  337. package/dist/tui/components/box.d.ts.map +1 -0
  338. package/dist/tui/components/box.js +87 -0
  339. package/dist/tui/components/editor.d.ts +61 -7
  340. package/dist/tui/components/editor.d.ts.map +1 -1
  341. package/dist/tui/components/editor.js +630 -127
  342. package/dist/tui/components/footer.d.ts +19 -18
  343. package/dist/tui/components/footer.d.ts.map +1 -1
  344. package/dist/tui/components/footer.js +90 -185
  345. package/dist/tui/components/header.d.ts +21 -0
  346. package/dist/tui/components/header.d.ts.map +1 -0
  347. package/dist/tui/components/header.js +63 -0
  348. package/dist/tui/components/input.d.ts.map +1 -1
  349. package/dist/tui/components/input.js +8 -7
  350. package/dist/tui/components/loader.d.ts +6 -1
  351. package/dist/tui/components/loader.d.ts.map +1 -1
  352. package/dist/tui/components/loader.js +8 -3
  353. package/dist/tui/components/markdown.d.ts +31 -27
  354. package/dist/tui/components/markdown.d.ts.map +1 -1
  355. package/dist/tui/components/markdown.js +131 -67
  356. package/dist/tui/components/modal.d.ts +0 -11
  357. package/dist/tui/components/modal.d.ts.map +1 -1
  358. package/dist/tui/components/modal.js +9 -37
  359. package/dist/tui/components/notification.d.ts +28 -0
  360. package/dist/tui/components/notification.d.ts.map +1 -0
  361. package/dist/tui/components/notification.js +63 -0
  362. package/dist/tui/components/progress-bar.d.ts +19 -0
  363. package/dist/tui/components/progress-bar.d.ts.map +1 -0
  364. package/dist/tui/components/progress-bar.js +66 -0
  365. package/dist/tui/components/select-list.d.ts +12 -1
  366. package/dist/tui/components/select-list.d.ts.map +1 -1
  367. package/dist/tui/components/select-list.js +73 -32
  368. package/dist/tui/components/spacer.d.ts +1 -1
  369. package/dist/tui/components/spacer.d.ts.map +1 -1
  370. package/dist/tui/components/spacer.js +2 -2
  371. package/dist/tui/components/table.d.ts +27 -0
  372. package/dist/tui/components/table.d.ts.map +1 -0
  373. package/dist/tui/components/table.js +125 -0
  374. package/dist/tui/components/thinking-block.d.ts.map +1 -1
  375. package/dist/tui/components/thinking-block.js +4 -1
  376. package/dist/tui/components/tool-execution.d.ts +7 -6
  377. package/dist/tui/components/tool-execution.d.ts.map +1 -1
  378. package/dist/tui/components/tool-execution.js +81 -85
  379. package/dist/tui/components/user-message.d.ts.map +1 -1
  380. package/dist/tui/components/user-message.js +6 -4
  381. package/dist/tui/components/welcome.d.ts +8 -1
  382. package/dist/tui/components/welcome.d.ts.map +1 -1
  383. package/dist/tui/components/welcome.js +45 -6
  384. package/dist/tui/index.d.ts +12 -6
  385. package/dist/tui/index.d.ts.map +1 -1
  386. package/dist/tui/index.js +7 -3
  387. package/dist/tui/terminal.d.ts +4 -3
  388. package/dist/tui/terminal.d.ts.map +1 -1
  389. package/dist/tui/terminal.js +43 -49
  390. package/dist/tui/tui.d.ts +3 -0
  391. package/dist/tui/tui.d.ts.map +1 -1
  392. package/dist/tui/tui.js +58 -43
  393. package/dist/tui/utils.d.ts +5 -0
  394. package/dist/tui/utils.d.ts.map +1 -1
  395. package/dist/tui/utils.js +80 -1
  396. package/dist/{tools/bash-utils.d.ts → utils/bash.d.ts} +3 -3
  397. package/dist/utils/bash.d.ts.map +1 -0
  398. package/dist/{tools/bash-utils.js → utils/bash.js} +22 -11
  399. package/dist/utils/{filesystem.d.ts → filesystem/operations.d.ts} +1 -1
  400. package/dist/utils/filesystem/operations.d.ts.map +1 -0
  401. package/dist/{tools/filesystem-utils.d.ts → utils/filesystem/security.d.ts} +3 -2
  402. package/dist/utils/filesystem/security.d.ts.map +1 -0
  403. package/dist/{tools/filesystem-utils.js → utils/filesystem/security.js} +62 -4
  404. package/dist/utils/funcs.d.ts +6 -0
  405. package/dist/utils/funcs.d.ts.map +1 -0
  406. package/dist/utils/funcs.js +6 -0
  407. package/dist/{tools/git-utils.d.ts → utils/git.d.ts} +1 -1
  408. package/dist/utils/git.d.ts.map +1 -0
  409. package/dist/{tools/git-utils.js → utils/git.js} +0 -6
  410. package/dist/utils/glob.js +1 -1
  411. package/dist/utils/yaml.d.ts +11 -0
  412. package/dist/utils/yaml.d.ts.map +1 -0
  413. package/dist/utils/yaml.js +207 -0
  414. package/dist/utils/{zod-utils.d.ts → zod.d.ts} +2 -1
  415. package/dist/utils/zod.d.ts.map +1 -0
  416. package/dist/utils/zod.js +24 -0
  417. package/package.json +31 -29
  418. package/dist/agent/manual-loop.d.ts +0 -41
  419. package/dist/agent/manual-loop.d.ts.map +0 -1
  420. package/dist/agent/manual-loop.js +0 -278
  421. package/dist/api/exa/index.d.ts +0 -177
  422. package/dist/api/exa/index.d.ts.map +0 -1
  423. package/dist/api/exa/index.js +0 -439
  424. package/dist/commands/add-directory-command.d.ts +0 -3
  425. package/dist/commands/add-directory-command.d.ts.map +0 -1
  426. package/dist/commands/add-directory-command.js +0 -85
  427. package/dist/commands/application-log-command.d.ts +0 -3
  428. package/dist/commands/application-log-command.d.ts.map +0 -1
  429. package/dist/commands/application-log-command.js +0 -79
  430. package/dist/commands/clear-command.d.ts +0 -3
  431. package/dist/commands/clear-command.d.ts.map +0 -1
  432. package/dist/commands/compact-command.d.ts +0 -3
  433. package/dist/commands/compact-command.d.ts.map +0 -1
  434. package/dist/commands/compact-command.js +0 -64
  435. package/dist/commands/context-command.d.ts +0 -3
  436. package/dist/commands/context-command.d.ts.map +0 -1
  437. package/dist/commands/context-command.js +0 -183
  438. package/dist/commands/copy-command.d.ts +0 -3
  439. package/dist/commands/copy-command.d.ts.map +0 -1
  440. package/dist/commands/copy-command.js +0 -80
  441. package/dist/commands/edit-command.d.ts +0 -3
  442. package/dist/commands/edit-command.d.ts.map +0 -1
  443. package/dist/commands/edit-command.js +0 -88
  444. package/dist/commands/edit-prompt-command.d.ts +0 -3
  445. package/dist/commands/edit-prompt-command.d.ts.map +0 -1
  446. package/dist/commands/edit-prompt-command.js +0 -61
  447. package/dist/commands/exit-command.d.ts +0 -13
  448. package/dist/commands/exit-command.d.ts.map +0 -1
  449. package/dist/commands/exit-command.js +0 -46
  450. package/dist/commands/files-command.d.ts +0 -3
  451. package/dist/commands/files-command.d.ts.map +0 -1
  452. package/dist/commands/files-command.js +0 -121
  453. package/dist/commands/generate-rules-command.d.ts +0 -3
  454. package/dist/commands/generate-rules-command.d.ts.map +0 -1
  455. package/dist/commands/handoff-command.d.ts +0 -3
  456. package/dist/commands/handoff-command.d.ts.map +0 -1
  457. package/dist/commands/handoff-command.js +0 -202
  458. package/dist/commands/health-command.d.ts +0 -4
  459. package/dist/commands/health-command.d.ts.map +0 -1
  460. package/dist/commands/health-command.js +0 -213
  461. package/dist/commands/help-command.d.ts +0 -3
  462. package/dist/commands/help-command.d.ts.map +0 -1
  463. package/dist/commands/history-command.d.ts +0 -3
  464. package/dist/commands/history-command.d.ts.map +0 -1
  465. package/dist/commands/init-command.d.ts +0 -3
  466. package/dist/commands/init-command.d.ts.map +0 -1
  467. package/dist/commands/last-log-command.d.ts +0 -3
  468. package/dist/commands/last-log-command.d.ts.map +0 -1
  469. package/dist/commands/last-log-command.js +0 -98
  470. package/dist/commands/list-directories-command.d.ts +0 -3
  471. package/dist/commands/list-directories-command.d.ts.map +0 -1
  472. package/dist/commands/list-tools-command.d.ts +0 -3
  473. package/dist/commands/list-tools-command.d.ts.map +0 -1
  474. package/dist/commands/list-tools-command.js +0 -124
  475. package/dist/commands/model-command.d.ts +0 -25
  476. package/dist/commands/model-command.d.ts.map +0 -1
  477. package/dist/commands/model-command.js +0 -340
  478. package/dist/commands/paste-command.d.ts +0 -3
  479. package/dist/commands/paste-command.d.ts.map +0 -1
  480. package/dist/commands/paste-command.js +0 -277
  481. package/dist/commands/pickup-command.d.ts +0 -3
  482. package/dist/commands/pickup-command.d.ts.map +0 -1
  483. package/dist/commands/pickup-command.js +0 -161
  484. package/dist/commands/prompt-command.d.ts +0 -3
  485. package/dist/commands/prompt-command.d.ts.map +0 -1
  486. package/dist/commands/prompt-command.js +0 -280
  487. package/dist/commands/remove-directory-command.d.ts +0 -3
  488. package/dist/commands/remove-directory-command.d.ts.map +0 -1
  489. package/dist/commands/reset-command.d.ts +0 -3
  490. package/dist/commands/reset-command.d.ts.map +0 -1
  491. package/dist/commands/rules-command.d.ts +0 -3
  492. package/dist/commands/rules-command.d.ts.map +0 -1
  493. package/dist/commands/rules-command.js +0 -135
  494. package/dist/commands/save-command.d.ts +0 -3
  495. package/dist/commands/save-command.d.ts.map +0 -1
  496. package/dist/commands/shell-command.d.ts +0 -3
  497. package/dist/commands/shell-command.d.ts.map +0 -1
  498. package/dist/commands/usage-command.d.ts +0 -3
  499. package/dist/commands/usage-command.d.ts.map +0 -1
  500. package/dist/commands/usage-command.js +0 -42
  501. package/dist/messages.d.ts.map +0 -1
  502. package/dist/repl/display-tool-messages.d.ts +0 -4
  503. package/dist/repl/display-tool-messages.d.ts.map +0 -1
  504. package/dist/repl/display-tool-messages.js +0 -58
  505. package/dist/repl/display-tool-use.d.ts +0 -14
  506. package/dist/repl/display-tool-use.d.ts.map +0 -1
  507. package/dist/repl/display-tool-use.js +0 -63
  508. package/dist/repl/get-prompt-header.d.ts +0 -8
  509. package/dist/repl/get-prompt-header.d.ts.map +0 -1
  510. package/dist/repl/get-prompt-header.js +0 -9
  511. package/dist/repl/project-status-line.d.ts +0 -2
  512. package/dist/repl/project-status-line.d.ts.map +0 -1
  513. package/dist/repl/project-status-line.js +0 -31
  514. package/dist/repl/prompt.d.ts +0 -21
  515. package/dist/repl/prompt.d.ts.map +0 -1
  516. package/dist/repl/prompt.js +0 -244
  517. package/dist/repl/tool-call-repair.d.ts +0 -4
  518. package/dist/repl/tool-call-repair.d.ts.map +0 -1
  519. package/dist/repl/tool-call-repair.js +0 -54
  520. package/dist/repl.d.ts +0 -29
  521. package/dist/repl.d.ts.map +0 -1
  522. package/dist/repl.js +0 -218
  523. package/dist/terminal/checkbox-prompt.d.ts +0 -36
  524. package/dist/terminal/checkbox-prompt.d.ts.map +0 -1
  525. package/dist/terminal/checkbox-prompt.js +0 -368
  526. package/dist/terminal/editor-prompt.d.ts +0 -10
  527. package/dist/terminal/editor-prompt.d.ts.map +0 -1
  528. package/dist/terminal/editor-prompt.js +0 -61
  529. package/dist/terminal/errors.d.ts +0 -19
  530. package/dist/terminal/errors.d.ts.map +0 -1
  531. package/dist/terminal/errors.js +0 -37
  532. package/dist/terminal/input-prompt.d.ts +0 -17
  533. package/dist/terminal/input-prompt.d.ts.map +0 -1
  534. package/dist/terminal/input-prompt.js +0 -181
  535. package/dist/terminal/markdown.d.ts +0 -2
  536. package/dist/terminal/markdown.d.ts.map +0 -1
  537. package/dist/terminal/markdown.js +0 -118
  538. package/dist/terminal/search-prompt.d.ts +0 -20
  539. package/dist/terminal/search-prompt.d.ts.map +0 -1
  540. package/dist/terminal/search-prompt.js +0 -280
  541. package/dist/terminal/types.d.ts +0 -35
  542. package/dist/terminal/types.d.ts.map +0 -1
  543. package/dist/tokens/threshold.d.ts +0 -35
  544. package/dist/tokens/threshold.d.ts.map +0 -1
  545. package/dist/tokens/threshold.js +0 -85
  546. package/dist/tools/advanced-edit-file.d.ts +0 -69
  547. package/dist/tools/advanced-edit-file.d.ts.map +0 -1
  548. package/dist/tools/advanced-edit-file.js +0 -281
  549. package/dist/tools/agent.d.ts +0 -29
  550. package/dist/tools/agent.d.ts.map +0 -1
  551. package/dist/tools/agent.js +0 -103
  552. package/dist/tools/bash-utils.d.ts.map +0 -1
  553. package/dist/tools/code-interpreter.d.ts +0 -25
  554. package/dist/tools/code-interpreter.d.ts.map +0 -1
  555. package/dist/tools/code-interpreter.js +0 -167
  556. package/dist/tools/delete-file.d.ts +0 -24
  557. package/dist/tools/delete-file.d.ts.map +0 -1
  558. package/dist/tools/delete-file.js +0 -70
  559. package/dist/tools/dynamic-tool-parser.d.ts +0 -21
  560. package/dist/tools/dynamic-tool-parser.d.ts.map +0 -1
  561. package/dist/tools/dynamic-tool-parser.js +0 -22
  562. package/dist/tools/filesystem-utils.d.ts.map +0 -1
  563. package/dist/tools/git-utils.d.ts.map +0 -1
  564. package/dist/tools/llm-edit-fixer.d.ts +0 -25
  565. package/dist/tools/llm-edit-fixer.d.ts.map +0 -1
  566. package/dist/tools/llm-edit-fixer.js +0 -150
  567. package/dist/tools/move-file.d.ts +0 -26
  568. package/dist/tools/move-file.d.ts.map +0 -1
  569. package/dist/tools/move-file.js +0 -58
  570. package/dist/tools/read-multiple-files.d.ts +0 -26
  571. package/dist/tools/read-multiple-files.d.ts.map +0 -1
  572. package/dist/tools/read-multiple-files.js +0 -139
  573. package/dist/tools/web-fetch.d.ts +0 -56
  574. package/dist/tools/web-fetch.d.ts.map +0 -1
  575. package/dist/tools/web-fetch.js +0 -247
  576. package/dist/tools/web-search.d.ts +0 -23
  577. package/dist/tools/web-search.d.ts.map +0 -1
  578. package/dist/tools/web-search.js +0 -133
  579. package/dist/tui/components/prompt-status.d.ts +0 -16
  580. package/dist/tui/components/prompt-status.d.ts.map +0 -1
  581. package/dist/tui/components/prompt-status.js +0 -21
  582. package/dist/utils/filesystem.d.ts.map +0 -1
  583. package/dist/utils/zod-utils.d.ts.map +0 -1
  584. package/dist/utils/zod-utils.js +0 -7
  585. /package/dist/{terminal → commands/add-directory}/types.js +0 -0
  586. /package/dist/utils/{filesystem.js → filesystem/operations.js} +0 -0
package/dist/config.js CHANGED
@@ -1,9 +1,28 @@
1
- import { mkdirSync } from "node:fs";
1
+ import { existsSync, mkdirSync } from "node:fs";
2
2
  import fs from "node:fs/promises";
3
3
  import { homedir } from "node:os";
4
4
  import path from "node:path";
5
5
  import { z } from "zod";
6
6
  import { jsonParser } from "./parsing.js";
7
+ export const defaultConfig = {
8
+ loop: {
9
+ maxIterations: 200,
10
+ },
11
+ tools: {
12
+ activeTools: undefined,
13
+ maxTokens: 30000,
14
+ maxResults: 30,
15
+ dynamicTools: {
16
+ enabled: true,
17
+ maxTools: 10,
18
+ },
19
+ },
20
+ notify: true,
21
+ readOnlyFiles: [],
22
+ skills: {
23
+ enabled: true,
24
+ },
25
+ };
7
26
  // Type definitions
8
27
  const ProjectConfigSchema = z.object({
9
28
  logs: z
@@ -13,41 +32,40 @@ const ProjectConfigSchema = z.object({
13
32
  .optional(),
14
33
  loop: z
15
34
  .object({
16
- maxIterations: z.number().default(90),
17
- parallelTools: z.boolean().default(true),
18
- maxDurationMs: z.number().default(0),
35
+ maxIterations: z.number().default(defaultConfig.loop.maxIterations),
19
36
  })
20
37
  .optional()
21
- .default({
22
- maxIterations: 90,
23
- parallelTools: true,
24
- maxDurationMs: 0,
25
- }),
38
+ .default(defaultConfig.loop),
26
39
  tools: z
27
40
  .object({
28
- maxTokens: z.number().default(30000),
29
- maxResults: z.number().default(30),
41
+ activeTools: z.array(z.string()).optional(),
42
+ maxTokens: z.number().default(defaultConfig.tools.maxTokens),
43
+ maxResults: z.number().default(defaultConfig.tools.maxResults),
30
44
  dynamicTools: z
31
45
  .object({
32
- enabled: z.boolean().default(true),
33
- maxTools: z.number().default(10),
46
+ enabled: z
47
+ .boolean()
48
+ .default(defaultConfig.tools.dynamicTools.enabled),
49
+ maxTools: z
50
+ .number()
51
+ .default(defaultConfig.tools.dynamicTools.maxTools),
34
52
  })
35
53
  .optional()
36
- .default({
37
- enabled: true,
38
- maxTools: 10,
39
- }),
54
+ .default(defaultConfig.tools.dynamicTools),
40
55
  })
41
56
  .optional()
42
- .default({
43
- maxTokens: 30000,
44
- maxResults: 30,
45
- dynamicTools: {
46
- enabled: true,
47
- maxTools: 10,
48
- },
49
- }),
50
- notify: z.boolean().optional().default(true),
57
+ .default(defaultConfig.tools),
58
+ notify: z.boolean().optional().default(defaultConfig.notify),
59
+ readOnlyFiles: z
60
+ .array(z.string())
61
+ .optional()
62
+ .default(defaultConfig.readOnlyFiles),
63
+ skills: z
64
+ .object({
65
+ enabled: z.boolean().optional().default(defaultConfig.skills.enabled),
66
+ })
67
+ .optional()
68
+ .default(defaultConfig.skills),
51
69
  });
52
70
  export class DirectoryProvider {
53
71
  baseDir;
@@ -69,6 +87,22 @@ export class DirectoryProvider {
69
87
  mkdirSync(dirPath, { recursive: true });
70
88
  return dirPath;
71
89
  }
90
+ // Check if directory exists without creating it
91
+ async exists(subdir) {
92
+ const dirPath = this.getPath(subdir);
93
+ try {
94
+ await fs.access(dirPath);
95
+ return true;
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ }
101
+ // Synchronous version of exists check
102
+ existsSync(subdir) {
103
+ const dirPath = this.getPath(subdir);
104
+ return existsSync(dirPath);
105
+ }
72
106
  }
73
107
  export class ConfigManager {
74
108
  project;
@@ -89,8 +123,8 @@ export class ConfigManager {
89
123
  throw error;
90
124
  }
91
125
  }
92
- // Project config helpers
93
- async readProjectConfig() {
126
+ // Get merged configuration (project overrides app)
127
+ async getConfig() {
94
128
  const appConfigPath = path.join(this.app.getPath(), "acai.json");
95
129
  const projectConfigPath = path.join(this.project.getPath(), "acai.json");
96
130
  const appConfig = await this._readConfig(appConfigPath);
@@ -101,17 +135,55 @@ export class ConfigManager {
101
135
  };
102
136
  return ProjectConfigSchema.parse(mergedConfig);
103
137
  }
104
- async readAgentsFile() {
105
- const agentsPath = path.join(process.cwd(), "AGENTS.md");
138
+ // Skills settings helpers
139
+ async getSkillsEnabled() {
140
+ const projectConfig = await this.getConfig();
141
+ return projectConfig.skills?.enabled ?? true;
142
+ }
143
+ async setSkillsEnabled(enabled) {
144
+ const configPath = path.join(this.app.getPath(), "acai.json");
145
+ let configData = {};
106
146
  try {
107
- return await fs.readFile(agentsPath, "utf8");
147
+ const data = await fs.readFile(configPath, "utf8");
148
+ configData = jsonParser(ProjectConfigSchema.partial()).parse(data);
108
149
  }
109
150
  catch (error) {
110
- if (error.code === "ENOENT") {
111
- return "";
151
+ if (error.code !== "ENOENT") {
152
+ throw error;
153
+ }
154
+ }
155
+ if (!configData.skills) {
156
+ configData.skills = { enabled: true };
157
+ }
158
+ configData.skills.enabled = enabled;
159
+ await this.app.ensurePath();
160
+ await fs.writeFile(configPath, JSON.stringify(configData, null, 2));
161
+ }
162
+ async readAgentsFiles() {
163
+ const files = [];
164
+ const agentsPaths = [
165
+ {
166
+ absolute: path.join(this.app.getPath(), "AGENTS.md"),
167
+ relative: "~/.acai/AGENTS.md",
168
+ },
169
+ {
170
+ absolute: path.join(process.cwd(), "AGENTS.md"),
171
+ relative: "./AGENTS.md",
172
+ },
173
+ ];
174
+ for (const { absolute, relative } of agentsPaths) {
175
+ try {
176
+ const content = await fs.readFile(absolute, "utf8");
177
+ files.push({
178
+ path: relative,
179
+ content,
180
+ });
181
+ }
182
+ catch (_error) {
183
+ // ignore
112
184
  }
113
- throw error;
114
185
  }
186
+ return files;
115
187
  }
116
188
  async writeAgentsFile(rules) {
117
189
  const agentsPath = path.join(process.cwd(), "AGENTS.md");
@@ -139,6 +211,10 @@ export class ConfigManager {
139
211
  }
140
212
  }
141
213
  async writeProjectLearnedRulesFile(rules) {
214
+ // Only write project rules if the project directory exists
215
+ if (!(await this.project.exists())) {
216
+ return; // Silently return if project directory doesn't exist
217
+ }
142
218
  const rulesDir = await this.project.ensurePath("rules");
143
219
  const rulesPath = path.join(rulesDir, "learned-rules.md");
144
220
  try {
@@ -177,50 +253,32 @@ export class ConfigManager {
177
253
  throw error;
178
254
  }
179
255
  }
180
- // App config helpers
181
- async readAppConfig(configName) {
256
+ // Private helper for reading app config
257
+ async _readAppConfig(configName) {
182
258
  const configPath = path.join(this.app.getPath(), `${configName}.json`);
183
259
  try {
184
260
  const data = await fs.readFile(configPath, "utf8");
185
- return JSON.parse(data);
261
+ return ProjectConfigSchema.parse(JSON.parse(data));
186
262
  }
187
263
  catch (error) {
188
264
  if (error.code === "ENOENT") {
189
- return {};
265
+ return ProjectConfigSchema.parse(defaultConfig);
190
266
  }
191
267
  throw error;
192
268
  }
193
269
  }
194
- async ensureAppConfig(configName) {
270
+ // Ensure default app configuration exists
271
+ async ensureDefaultConfig(configName) {
195
272
  const configPath = path.join(this.app.getPath(), `${configName}.json`);
196
273
  try {
197
274
  await fs.access(configPath);
198
- return await this.readAppConfig(configName);
275
+ return await this._readAppConfig(configName);
199
276
  }
200
277
  catch {
201
278
  // Create directory and default config if missing
202
279
  await this.app.ensurePath();
203
- const defaultConfig = {
204
- logs: {
205
- path: path.join(this.app.getPath(), "logs", "current.log"),
206
- },
207
- loop: {
208
- maxIterations: 90,
209
- parallelTools: true,
210
- maxDurationMs: 0,
211
- },
212
- tools: {
213
- maxTokens: 30000,
214
- maxResults: 30,
215
- dynamicTools: {
216
- enabled: true,
217
- maxTools: 10,
218
- },
219
- },
220
- notify: true,
221
- };
222
280
  await fs.writeFile(configPath, JSON.stringify(defaultConfig, null, 2));
223
- return defaultConfig;
281
+ return ProjectConfigSchema.parse(defaultConfig);
224
282
  }
225
283
  }
226
284
  async writeAppConfig(configName, data) {
@@ -1 +1 @@
1
- {"version":3,"file":"dedent.d.ts","sourceRoot":"","sources":["../source/dedent.ts"],"names":[],"mappings":"AAAA,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AAI9E,eAAO,MAAM,MAAM,EAAE,MAgDpB,CAAC"}
1
+ {"version":3,"file":"dedent.d.ts","sourceRoot":"","sources":["../source/dedent.ts"],"names":[],"mappings":"AAAA,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AAI9E,eAAO,MAAM,MAAM,EAAE,MA+CpB,CAAC"}
package/dist/dedent.js CHANGED
@@ -3,13 +3,13 @@ export const dedent = (strings, ...values) => {
3
3
  // Perform interpolation
4
4
  let result = "";
5
5
  for (let i = 0; i < strings.raw.length; i++) {
6
- const next = strings.raw[i] ??
7
- ""
8
- // handle escaped newlines, backticks, and interpolation characters
9
- .replace(/\\\n[ \t]*/g, "")
10
- .replace(/\\`/g, "`")
11
- .replace(/\\\$/g, "$")
12
- .replace(/\\\{/g, "{");
6
+ const raw = strings.raw[i] ?? "";
7
+ // handle escaped newlines, backticks, and interpolation characters
8
+ const next = raw
9
+ .replace(/\\\n[ \t]*/g, "")
10
+ .replace(/\\`/g, "`")
11
+ .replace(/\\\$/g, "$")
12
+ .replace(/\\\{/g, "{");
13
13
  result += next;
14
14
  if (i < values.length) {
15
15
  result += values[i];
@@ -37,17 +37,26 @@ interface BackgroundProcessOptions extends ExecutionOptions {
37
37
  onExit?: (code: number | null) => void;
38
38
  }
39
39
  /**
40
- * Background process handle
40
+ * Background process handle (public interface)
41
41
  */
42
42
  interface BackgroundProcess {
43
43
  pid: number;
44
44
  kill: () => boolean;
45
45
  isRunning: boolean;
46
46
  }
47
+ /**
48
+ * Tracked background process with project information
49
+ */
50
+ interface TrackedBackgroundProcess extends BackgroundProcess {
51
+ originalCwd: string;
52
+ startTime: Date;
53
+ command: string;
54
+ }
47
55
  /**
48
56
  * Execution environment manager
49
57
  */
50
58
  interface ExecutionConfig {
59
+ /** Value for NODE_ENV environment variable (defaults to "production") */
51
60
  env?: string;
52
61
  execution?: {
53
62
  cwd?: string;
@@ -78,6 +87,14 @@ export declare class ExecutionEnvironment {
78
87
  * Execute a command in the background
79
88
  */
80
89
  executeCommandInBackground(command: string, options?: BackgroundProcessOptions): BackgroundProcess;
90
+ /**
91
+ * Get background processes for a specific project directory
92
+ */
93
+ getBackgroundProcessesForProject(projectRoot: string): TrackedBackgroundProcess[];
94
+ /**
95
+ * Kill all background processes for a specific project directory
96
+ */
97
+ killBackgroundProcessesForProject(projectRoot: string): void;
81
98
  /**
82
99
  * Kill all running background processes
83
100
  */
@@ -107,6 +124,5 @@ export declare class ExecutionEnvironment {
107
124
  * Initialize the execution environment
108
125
  */
109
126
  export declare function initExecutionEnvironment(config?: ExecutionConfig): Promise<ExecutionEnvironment>;
110
- export declare function setupProcessCleanup(executionEnv: ExecutionEnvironment): void;
111
127
  export {};
112
128
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/execution/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/execution/index.ts"],"names":[],"mappings":"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"}
@@ -56,9 +56,10 @@ export class ExecutionEnvironment {
56
56
  constructor(config = {}) {
57
57
  this.config = config;
58
58
  this.workingDirectory = config.execution?.cwd || process.cwd();
59
- // Set up environment variables
59
+ // Set up environment variables - filter out undefined values from process.env
60
+ const filteredEnv = Object.fromEntries(Object.entries(process.env).filter((entry) => entry[1] !== undefined));
60
61
  this.environmentVariables = {
61
- ...process.env,
62
+ ...filteredEnv,
62
63
  // biome-ignore lint/style/useNamingConvention: environment variable.
63
64
  NODE_ENV: config.env || "production",
64
65
  ...(config.execution?.env || {}),
@@ -130,6 +131,23 @@ export class ExecutionEnvironment {
130
131
  });
131
132
  return;
132
133
  }
134
+ let settled = false;
135
+ let abortHandler;
136
+ const settle = (result, shouldReject, error) => {
137
+ if (settled)
138
+ return;
139
+ settled = true;
140
+ // Clean up abort listener
141
+ if (abortHandler) {
142
+ options.abortSignal?.removeEventListener("abort", abortHandler);
143
+ }
144
+ if (shouldReject && error) {
145
+ reject(error);
146
+ }
147
+ else {
148
+ resolve(result);
149
+ }
150
+ };
133
151
  const childProcess = exec(command, {
134
152
  cwd,
135
153
  env,
@@ -145,65 +163,50 @@ export class ExecutionEnvironment {
145
163
  ? `${stdout}${stderr ? stderr : ""}`
146
164
  : stdout;
147
165
  if (error) {
166
+ const exitCode = error.code ?? 1;
148
167
  logger.error({
149
168
  error: error.message,
150
- exitCode: error.code,
169
+ exitCode,
151
170
  duration,
152
171
  }, `Command execution failed: ${command}`);
153
- const result = {
172
+ settle({
154
173
  output: preserveOutputOnError ? output : "",
155
- exitCode: error.code || 1,
174
+ exitCode,
156
175
  error,
157
176
  command,
158
177
  duration,
159
- };
160
- if (throwOnError) {
161
- reject(error);
162
- }
163
- else {
164
- resolve(result);
165
- }
178
+ }, throwOnError, error);
166
179
  }
167
180
  else {
168
181
  logger.debug({
169
182
  duration,
170
183
  outputLength: output.length,
171
184
  }, `Command executed successfully: ${command}`);
172
- resolve({
185
+ settle({
173
186
  output,
174
187
  exitCode: 0,
175
188
  command,
176
189
  duration,
177
- });
190
+ }, false);
178
191
  }
179
192
  });
180
193
  // Handle abort signal
181
194
  if (options.abortSignal) {
182
- const abortHandler = () => {
195
+ abortHandler = () => {
183
196
  logger.warn({ command, pid: childProcess.pid }, "Command execution aborted");
184
197
  childProcess.kill("SIGTERM");
185
198
  const error = new Error("Command execution aborted");
186
- const result = {
187
- output: preserveOutputOnError ? "" : "",
199
+ settle({
200
+ output: "",
188
201
  exitCode: 1,
189
202
  error,
190
203
  command,
191
204
  duration: Date.now() - startTime,
192
- };
193
- if (throwOnError) {
194
- reject(error);
195
- }
196
- else {
197
- resolve(result);
198
- }
205
+ }, throwOnError, error);
199
206
  };
200
207
  options.abortSignal.addEventListener("abort", abortHandler, {
201
208
  once: true,
202
209
  });
203
- // Clean up abort listener when process completes
204
- childProcess.on("exit", () => {
205
- options.abortSignal?.removeEventListener("abort", abortHandler);
206
- });
207
210
  }
208
211
  });
209
212
  }
@@ -211,28 +214,40 @@ export class ExecutionEnvironment {
211
214
  * Execute a command in the background
212
215
  */
213
216
  executeCommandInBackground(command, options = {}) {
217
+ const cwd = options.cwd || this.workingDirectory;
218
+ // Create the tracked process first
219
+ const trackedProcess = {
220
+ pid: -1, // Will be set after spawn
221
+ kill: () => false, // Will be set after spawn
222
+ isRunning: true,
223
+ originalCwd: cwd,
224
+ startTime: new Date(),
225
+ command,
226
+ };
214
227
  // Validate command for safety
215
228
  this.validateCommand(command);
216
- const cwd = options.cwd || this.workingDirectory;
217
229
  const env = {
218
230
  ...this.environmentVariables,
219
231
  ...ttySizeEnv(),
220
232
  ...(options.env || {}),
221
233
  };
222
- const shell = options.shell ||
223
- this.config.execution?.shell ||
224
- process.env["SHELL"] ||
225
- "bash";
234
+ const shell = options.shell || this.config.execution?.shell || getShell();
226
235
  logger.debug({
227
236
  command,
228
237
  cwd,
229
238
  shell,
230
239
  hasAbortSignal: !!options.abortSignal,
231
240
  }, "Executing command in background");
232
- // Check if already aborted
241
+ // Check if already aborted - return a dead process handle for consistency
233
242
  if (options.abortSignal?.aborted) {
234
243
  logger.warn({ command }, "Background command execution aborted before starting");
235
- throw new Error("Background command execution aborted");
244
+ return {
245
+ pid: -1,
246
+ kill: () => false,
247
+ get isRunning() {
248
+ return false;
249
+ },
250
+ };
236
251
  }
237
252
  // Spawn the process
238
253
  const childProcess = spawn(command, [], {
@@ -244,6 +259,25 @@ export class ExecutionEnvironment {
244
259
  });
245
260
  const pid = childProcess.pid ?? -1;
246
261
  let isRunning = true;
262
+ // Update tracked process with actual PID, isRunning getter, and kill function
263
+ trackedProcess.pid = pid;
264
+ Object.defineProperty(trackedProcess, "isRunning", {
265
+ get: () => isRunning,
266
+ enumerable: true,
267
+ });
268
+ trackedProcess.kill = () => {
269
+ if (isRunning) {
270
+ childProcess.kill();
271
+ isRunning = false;
272
+ this.backgroundProcesses.delete(pid);
273
+ // Clean up abort listener
274
+ if (abortHandler) {
275
+ options.abortSignal?.removeEventListener("abort", abortHandler);
276
+ }
277
+ return true;
278
+ }
279
+ return false;
280
+ };
247
281
  // Set up output handlers
248
282
  if (childProcess.stdout) {
249
283
  childProcess.stdout.on("data", (data) => {
@@ -292,28 +326,46 @@ export class ExecutionEnvironment {
292
326
  once: true,
293
327
  });
294
328
  }
295
- // Create the process handle
329
+ // Create the public process handle with getter for live isRunning state
296
330
  const backgroundProcess = {
297
331
  pid,
298
- kill: () => {
299
- if (isRunning) {
300
- childProcess.kill();
301
- isRunning = false;
302
- this.backgroundProcesses.delete(pid);
303
- // Clean up abort listener
304
- if (abortHandler) {
305
- options.abortSignal?.removeEventListener("abort", abortHandler);
306
- }
307
- return true;
308
- }
309
- return false;
332
+ kill: trackedProcess.kill,
333
+ get isRunning() {
334
+ return isRunning;
310
335
  },
311
- isRunning: true,
312
336
  };
313
337
  // Track the process
314
- this.backgroundProcesses.set(pid, backgroundProcess);
338
+ this.backgroundProcesses.set(pid, trackedProcess);
315
339
  return backgroundProcess;
316
340
  }
341
+ /**
342
+ * Get background processes for a specific project directory
343
+ */
344
+ getBackgroundProcessesForProject(projectRoot) {
345
+ const processes = [];
346
+ for (const process of this.backgroundProcesses.values()) {
347
+ // Check if process was started in or under the project root
348
+ if (process.originalCwd.startsWith(projectRoot)) {
349
+ processes.push(process);
350
+ }
351
+ }
352
+ return processes;
353
+ }
354
+ /**
355
+ * Kill all background processes for a specific project directory
356
+ */
357
+ killBackgroundProcessesForProject(projectRoot) {
358
+ const processes = this.getBackgroundProcessesForProject(projectRoot);
359
+ logger.info(`Killing ${processes.length} background processes for project: ${projectRoot}`);
360
+ for (const process of processes) {
361
+ try {
362
+ process.kill();
363
+ }
364
+ catch (error) {
365
+ logger.warn(error, `Failed to kill process ${process.pid}`);
366
+ }
367
+ }
368
+ }
317
369
  /**
318
370
  * Kill all running background processes
319
371
  */
@@ -388,45 +440,31 @@ export async function initExecutionEnvironment(config = {}) {
388
440
  try {
389
441
  const executionEnv = new ExecutionEnvironment(config);
390
442
  await executionEnv.initialize();
443
+ // Set up cleanup for background processes
444
+ setupProcessCleanup(executionEnv);
391
445
  logger.info("Execution environment initialized successfully");
392
446
  return executionEnv;
393
447
  }
394
448
  catch (error) {
395
449
  logger.error(error, "Failed to initialize execution environment");
396
450
  // Return a minimal execution environment even if initialization failed
397
- return new ExecutionEnvironment(config);
451
+ const executionEnv = new ExecutionEnvironment(config);
452
+ setupProcessCleanup(executionEnv);
453
+ return executionEnv;
398
454
  }
399
455
  }
400
- // const platformName = process.platform;
401
- // let cmd: string;
402
- // let args: string[] = [];
403
- // const useShellOption = false;
404
- // if (platformName === "win32") {
405
- // const { execSync } = await import("node:child_process");
406
- // try {
407
- // execSync("where wsl", { stdio: "ignore" });
408
- // cmd = "wsl.exe";
409
- // args = ["--", command];
410
- // } catch {
411
- // cmd = "powershell.exe";
412
- // args = ["-NoProfile", "-NonInteractive", "-Command", command];
413
- // }
414
- // } else {
415
- // const shell = process.env["SHELL"] || "/bin/bash";
416
- // cmd = shell;
417
- // args = ["-c", command];
418
- // }
456
+ // Track registered execution environments for cleanup
457
+ const registeredForCleanup = new WeakSet();
419
458
  // Set up cleanup on process exit
420
- export function setupProcessCleanup(executionEnv) {
421
- process.on("exit", () => {
422
- executionEnv.killAllBackgroundProcesses();
423
- });
424
- process.on("SIGINT", () => {
425
- executionEnv.killAllBackgroundProcesses();
426
- process.exit(0);
427
- });
428
- process.on("SIGTERM", () => {
459
+ function setupProcessCleanup(executionEnv) {
460
+ if (registeredForCleanup.has(executionEnv)) {
461
+ return;
462
+ }
463
+ registeredForCleanup.add(executionEnv);
464
+ const cleanup = () => {
429
465
  executionEnv.killAllBackgroundProcesses();
430
- process.exit(0);
431
- });
466
+ };
467
+ process.on("exit", cleanup);
468
+ process.on("SIGINT", cleanup);
469
+ process.on("SIGTERM", cleanup);
432
470
  }