@travisennis/acai 0.0.12 → 0.0.14

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 (242) hide show
  1. package/README.md +5 -2
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +91 -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 -1
  9. package/dist/commands/manager.d.ts.map +1 -1
  10. package/dist/commands/manager.js +0 -18
  11. package/dist/commands/share/html-renderer.d.ts.map +1 -1
  12. package/dist/commands/share/html-renderer.js +54 -48
  13. package/dist/commands/tools/index.js +39 -38
  14. package/dist/config/index.d.ts +0 -2
  15. package/dist/config/index.d.ts.map +1 -1
  16. package/dist/config/index.js +3 -7
  17. package/dist/index.d.ts +14 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +94 -76
  20. package/dist/models/manager.d.ts +1 -10
  21. package/dist/models/manager.d.ts.map +1 -1
  22. package/dist/models/manager.js +2 -2
  23. package/dist/models/opencode-go-provider.d.ts +6 -4
  24. package/dist/models/opencode-go-provider.d.ts.map +1 -1
  25. package/dist/models/opencode-go-provider.js +55 -35
  26. package/dist/models/providers.d.ts +1 -1
  27. package/dist/models/providers.d.ts.map +1 -1
  28. package/dist/prompts/system-prompt.d.ts +0 -2
  29. package/dist/prompts/system-prompt.d.ts.map +1 -1
  30. package/dist/prompts/system-prompt.js +6 -10
  31. package/dist/repl/index.d.ts +27 -11
  32. package/dist/repl/index.d.ts.map +1 -1
  33. package/dist/repl/index.js +238 -254
  34. package/dist/sessions/manager.d.ts +41 -0
  35. package/dist/sessions/manager.d.ts.map +1 -1
  36. package/dist/sessions/manager.js +53 -0
  37. package/dist/sessions/summary.d.ts.map +1 -1
  38. package/dist/sessions/summary.js +18 -0
  39. package/dist/skills/index.d.ts +12 -2
  40. package/dist/skills/index.d.ts.map +1 -1
  41. package/dist/skills/index.js +123 -73
  42. package/dist/terminal/control.d.ts +1 -21
  43. package/dist/terminal/control.d.ts.map +1 -1
  44. package/dist/terminal/control.js +1 -32
  45. package/dist/terminal/formatting.d.ts +0 -33
  46. package/dist/terminal/formatting.d.ts.map +1 -1
  47. package/dist/terminal/formatting.js +0 -91
  48. package/dist/terminal/highlight/theme.d.ts +0 -37
  49. package/dist/terminal/highlight/theme.d.ts.map +1 -1
  50. package/dist/terminal/highlight/theme.js +1 -79
  51. package/dist/terminal/keys.d.ts +0 -97
  52. package/dist/terminal/keys.d.ts.map +1 -1
  53. package/dist/terminal/keys.js +0 -194
  54. package/dist/terminal/select-prompt.d.ts.map +1 -1
  55. package/dist/terminal/select-prompt.js +65 -51
  56. package/dist/terminal/style.d.ts +1 -1
  57. package/dist/terminal/style.d.ts.map +1 -1
  58. package/dist/terminal/supports-color.d.ts.map +1 -1
  59. package/dist/terminal/supports-color.js +38 -20
  60. package/dist/terminal/supports-hyperlinks.d.ts +3 -0
  61. package/dist/terminal/supports-hyperlinks.d.ts.map +1 -1
  62. package/dist/terminal/supports-hyperlinks.js +72 -31
  63. package/dist/terminal/table/layout-manager.d.ts +0 -20
  64. package/dist/terminal/table/layout-manager.d.ts.map +1 -1
  65. package/dist/terminal/table/layout-manager.js +68 -44
  66. package/dist/terminal/table/utils.d.ts +0 -1
  67. package/dist/terminal/table/utils.d.ts.map +1 -1
  68. package/dist/terminal/table/utils.js +2 -4
  69. package/dist/tools/apply-patch.d.ts +5 -3
  70. package/dist/tools/apply-patch.d.ts.map +1 -1
  71. package/dist/tools/apply-patch.js +154 -123
  72. package/dist/tools/bash.d.ts.map +1 -1
  73. package/dist/tools/bash.js +11 -8
  74. package/dist/tools/dynamic-tool-loader.d.ts +6 -1
  75. package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
  76. package/dist/tools/dynamic-tool-loader.js +154 -135
  77. package/dist/tools/index.d.ts +3 -133
  78. package/dist/tools/index.d.ts.map +1 -1
  79. package/dist/tools/index.js +0 -20
  80. package/dist/tools/read-file.d.ts.map +1 -1
  81. package/dist/tools/read-file.js +32 -13
  82. package/dist/tools/skill.d.ts.map +1 -1
  83. package/dist/tools/skill.js +20 -13
  84. package/dist/tools/web-fetch.d.ts +2 -6
  85. package/dist/tools/web-fetch.d.ts.map +1 -1
  86. package/dist/tools/web-fetch.js +59 -36
  87. package/dist/tools/web-search.d.ts +0 -4
  88. package/dist/tools/web-search.d.ts.map +1 -1
  89. package/dist/tools/web-search.js +40 -32
  90. package/dist/tui/autocomplete/utils.d.ts +0 -15
  91. package/dist/tui/autocomplete/utils.d.ts.map +1 -1
  92. package/dist/tui/autocomplete/utils.js +0 -85
  93. package/dist/tui/autocomplete.d.ts +1 -1
  94. package/dist/tui/autocomplete.d.ts.map +1 -1
  95. package/dist/tui/autocomplete.js +1 -1
  96. package/dist/tui/components/editor.d.ts +12 -0
  97. package/dist/tui/components/editor.d.ts.map +1 -1
  98. package/dist/tui/components/editor.js +181 -195
  99. package/dist/tui/components/input.d.ts +4 -0
  100. package/dist/tui/components/input.d.ts.map +1 -1
  101. package/dist/tui/components/input.js +33 -31
  102. package/dist/tui/components/markdown.d.ts +30 -0
  103. package/dist/tui/components/markdown.d.ts.map +1 -1
  104. package/dist/tui/components/markdown.js +274 -242
  105. package/dist/tui/components/modal.d.ts.map +1 -1
  106. package/dist/tui/components/modal.js +11 -11
  107. package/dist/tui/components/select-list.d.ts +5 -0
  108. package/dist/tui/components/select-list.d.ts.map +1 -1
  109. package/dist/tui/components/select-list.js +69 -98
  110. package/dist/tui/components/table.d.ts +6 -0
  111. package/dist/tui/components/table.d.ts.map +1 -1
  112. package/dist/tui/components/table.js +61 -52
  113. package/dist/tui/index.d.ts +1 -8
  114. package/dist/tui/index.d.ts.map +1 -1
  115. package/dist/tui/index.js +0 -8
  116. package/dist/tui/tui.d.ts +9 -0
  117. package/dist/tui/tui.d.ts.map +1 -1
  118. package/dist/tui/tui.js +78 -48
  119. package/dist/tui/utils.d.ts +7 -0
  120. package/dist/tui/utils.d.ts.map +1 -1
  121. package/dist/tui/utils.js +117 -53
  122. package/dist/utils/bash.d.ts.map +1 -1
  123. package/dist/utils/bash.js +156 -104
  124. package/dist/utils/command-protection.d.ts +3 -6
  125. package/dist/utils/command-protection.d.ts.map +1 -1
  126. package/dist/utils/command-protection.js +213 -100
  127. package/dist/utils/filesystem/operations.d.ts +0 -15
  128. package/dist/utils/filesystem/operations.d.ts.map +1 -1
  129. package/dist/utils/filesystem/operations.js +1 -38
  130. package/dist/utils/filesystem/security.d.ts.map +1 -1
  131. package/dist/utils/filesystem/security.js +22 -15
  132. package/dist/utils/filetype-detection.d.ts +0 -1
  133. package/dist/utils/filetype-detection.d.ts.map +1 -1
  134. package/dist/utils/filetype-detection.js +0 -12
  135. package/dist/utils/formatting.d.ts +0 -30
  136. package/dist/utils/formatting.d.ts.map +1 -1
  137. package/dist/utils/formatting.js +0 -44
  138. package/dist/utils/git.d.ts +4 -6
  139. package/dist/utils/git.d.ts.map +1 -1
  140. package/dist/utils/git.js +36 -46
  141. package/dist/utils/ignore.d.ts +1 -1
  142. package/dist/utils/ignore.d.ts.map +1 -1
  143. package/dist/utils/ignore.js +1 -1
  144. package/dist/utils/process.d.ts.map +1 -1
  145. package/dist/utils/process.js +77 -79
  146. package/dist/utils/yaml.d.ts +0 -1
  147. package/dist/utils/yaml.d.ts.map +1 -1
  148. package/dist/utils/yaml.js +80 -89
  149. package/dist/utils/zod.d.ts +0 -3
  150. package/dist/utils/zod.d.ts.map +1 -1
  151. package/dist/utils/zod.js +0 -7
  152. package/package.json +25 -24
  153. package/dist/agent/sub-agent.d.ts +0 -23
  154. package/dist/agent/sub-agent.d.ts.map +0 -1
  155. package/dist/agent/sub-agent.js +0 -109
  156. package/dist/commands/add-directory/index.d.ts +0 -3
  157. package/dist/commands/add-directory/index.d.ts.map +0 -1
  158. package/dist/commands/add-directory/index.js +0 -50
  159. package/dist/commands/add-directory/utils.d.ts +0 -3
  160. package/dist/commands/add-directory/utils.d.ts.map +0 -1
  161. package/dist/commands/add-directory/utils.js +0 -15
  162. package/dist/commands/clear/index.d.ts +0 -3
  163. package/dist/commands/clear/index.d.ts.map +0 -1
  164. package/dist/commands/clear/index.js +0 -13
  165. package/dist/commands/generate-rules/index.d.ts +0 -3
  166. package/dist/commands/generate-rules/index.d.ts.map +0 -1
  167. package/dist/commands/generate-rules/index.js +0 -206
  168. package/dist/commands/generate-rules/service.d.ts +0 -22
  169. package/dist/commands/generate-rules/service.d.ts.map +0 -1
  170. package/dist/commands/generate-rules/service.js +0 -103
  171. package/dist/commands/generate-rules/utils.d.ts +0 -5
  172. package/dist/commands/generate-rules/utils.d.ts.map +0 -1
  173. package/dist/commands/generate-rules/utils.js +0 -25
  174. package/dist/commands/handoff/index.d.ts +0 -3
  175. package/dist/commands/handoff/index.d.ts.map +0 -1
  176. package/dist/commands/handoff/index.js +0 -97
  177. package/dist/commands/handoff/utils.d.ts +0 -4
  178. package/dist/commands/handoff/utils.d.ts.map +0 -1
  179. package/dist/commands/handoff/utils.js +0 -123
  180. package/dist/commands/list-directories/index.d.ts +0 -3
  181. package/dist/commands/list-directories/index.d.ts.map +0 -1
  182. package/dist/commands/list-directories/index.js +0 -35
  183. package/dist/commands/pickup/index.d.ts +0 -3
  184. package/dist/commands/pickup/index.d.ts.map +0 -1
  185. package/dist/commands/pickup/index.js +0 -141
  186. package/dist/commands/pickup/types.d.ts +0 -6
  187. package/dist/commands/pickup/types.d.ts.map +0 -1
  188. package/dist/commands/pickup/types.js +0 -1
  189. package/dist/commands/pickup/utils.d.ts +0 -7
  190. package/dist/commands/pickup/utils.d.ts.map +0 -1
  191. package/dist/commands/pickup/utils.js +0 -56
  192. package/dist/commands/remove-directory/index.d.ts +0 -3
  193. package/dist/commands/remove-directory/index.d.ts.map +0 -1
  194. package/dist/commands/remove-directory/index.js +0 -55
  195. package/dist/commands/review/index.d.ts +0 -3
  196. package/dist/commands/review/index.d.ts.map +0 -1
  197. package/dist/commands/review/index.js +0 -12
  198. package/dist/commands/review/review-panel.d.ts +0 -3
  199. package/dist/commands/review/review-panel.d.ts.map +0 -1
  200. package/dist/commands/review/review-panel.js +0 -186
  201. package/dist/commands/review/utils.d.ts +0 -18
  202. package/dist/commands/review/utils.d.ts.map +0 -1
  203. package/dist/commands/review/utils.js +0 -146
  204. package/dist/commands/shell/index.d.ts +0 -3
  205. package/dist/commands/shell/index.d.ts.map +0 -1
  206. package/dist/commands/shell/index.js +0 -96
  207. package/dist/subagents/index.d.ts +0 -16
  208. package/dist/subagents/index.d.ts.map +0 -1
  209. package/dist/subagents/index.js +0 -231
  210. package/dist/terminal/index.d.ts +0 -9
  211. package/dist/terminal/index.d.ts.map +0 -1
  212. package/dist/terminal/index.js +0 -8
  213. package/dist/tools/agent.d.ts +0 -27
  214. package/dist/tools/agent.d.ts.map +0 -1
  215. package/dist/tools/agent.js +0 -81
  216. package/dist/tools/directory-tree.d.ts +0 -28
  217. package/dist/tools/directory-tree.d.ts.map +0 -1
  218. package/dist/tools/directory-tree.js +0 -154
  219. package/dist/tools/glob.d.ts +0 -35
  220. package/dist/tools/glob.d.ts.map +0 -1
  221. package/dist/tools/glob.js +0 -167
  222. package/dist/tools/grep.d.ts +0 -100
  223. package/dist/tools/grep.d.ts.map +0 -1
  224. package/dist/tools/grep.js +0 -608
  225. package/dist/tools/ls.d.ts +0 -26
  226. package/dist/tools/ls.d.ts.map +0 -1
  227. package/dist/tools/ls.js +0 -83
  228. package/dist/tui/components/header.d.ts +0 -21
  229. package/dist/tui/components/header.d.ts.map +0 -1
  230. package/dist/tui/components/header.js +0 -63
  231. package/dist/utils/bash/parse.d.ts +0 -19
  232. package/dist/utils/bash/parse.d.ts.map +0 -1
  233. package/dist/utils/bash/parse.js +0 -223
  234. package/dist/utils/bash/quote.d.ts +0 -6
  235. package/dist/utils/bash/quote.d.ts.map +0 -1
  236. package/dist/utils/bash/quote.js +0 -23
  237. package/dist/utils/generators.d.ts +0 -3
  238. package/dist/utils/generators.d.ts.map +0 -1
  239. package/dist/utils/generators.js +0 -25
  240. package/dist/utils/glob.d.ts +0 -52
  241. package/dist/utils/glob.d.ts.map +0 -1
  242. package/dist/utils/glob.js +0 -376
@@ -1,3 +0,0 @@
1
- import type { CommandOptions, ReplCommand } from "../types.ts";
2
- export declare const removeDirectoryCommand: ({ workspace, }: CommandOptions) => ReplCommand;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/remove-directory/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,eAAO,MAAM,sBAAsB,GAAI,gBAEpC,cAAc,KAAG,WAkGnB,CAAC"}
@@ -1,55 +0,0 @@
1
- import path from "node:path";
2
- import style from "../../terminal/style.js";
3
- import { Text } from "../../tui/index.js";
4
- export const removeDirectoryCommand = ({ workspace, }) => {
5
- return {
6
- command: "/remove-directory",
7
- description: "Remove a directory from the list of allowed working directories",
8
- getSubCommands: async () => {
9
- // Return only non-primary directories for tab completion
10
- return workspace.allowedDirs.filter((dir) => dir !== workspace.primaryDir);
11
- },
12
- async handle(args, { tui, container, editor, }) {
13
- const directoryPath = args?.[0];
14
- if (!directoryPath) {
15
- container.addChild(new Text(style.red("Usage: /remove-directory <path>"), 0, 1));
16
- tui.requestRender();
17
- editor.setText("");
18
- return "continue";
19
- }
20
- try {
21
- // Resolve the directory path
22
- const resolvedPath = path.resolve(directoryPath);
23
- // Check if it's the primary directory
24
- if (resolvedPath === workspace.primaryDir) {
25
- container.addChild(new Text(style.red("Cannot remove the primary working directory"), 1, 0));
26
- tui.requestRender();
27
- editor.setText("");
28
- return "continue";
29
- }
30
- // Find the directory in the list
31
- const index = workspace.allowedDirs.indexOf(resolvedPath);
32
- if (index === -1) {
33
- container.addChild(new Text(style.red(`Directory not found in allowed list: ${resolvedPath}`), 1, 0));
34
- tui.requestRender();
35
- editor.setText("");
36
- return "continue";
37
- }
38
- // Remove the directory
39
- workspace.allowedDirs.splice(index, 1);
40
- container.addChild(new Text(`Removed directory from allowed list: ${style.blue(resolvedPath)}`, 1, 0));
41
- container.addChild(new Text(`Current allowed directories: ${style.blue(workspace.allowedDirs.join(", "))}`, 2, 0));
42
- tui.requestRender();
43
- editor.setText("");
44
- return "continue";
45
- }
46
- catch (error) {
47
- const errorMessage = error instanceof Error ? error.message : String(error);
48
- container.addChild(new Text(style.red(`Failed to remove directory: ${errorMessage}`), 1, 0));
49
- tui.requestRender();
50
- editor.setText("");
51
- return "continue";
52
- }
53
- },
54
- };
55
- };
@@ -1,3 +0,0 @@
1
- import type { CommandOptions, ReplCommand } from "../types.ts";
2
- export declare const reviewCommand: (_options: CommandOptions) => ReplCommand;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/review/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/D,eAAO,MAAM,aAAa,GAAI,UAAU,cAAc,KAAG,WAuBxD,CAAC"}
@@ -1,12 +0,0 @@
1
- import { showReviewPanel } from "./review-panel.js";
2
- export const reviewCommand = (_options) => {
3
- return {
4
- command: "/review",
5
- description: "Shows a diff of all changes in the current directory.",
6
- getSubCommands: () => Promise.resolve([]),
7
- async handle(_args, { tui, container, editor, inputContainer, }) {
8
- await showReviewPanel(tui, container, inputContainer, editor);
9
- return "continue";
10
- },
11
- };
12
- };
@@ -1,3 +0,0 @@
1
- import { Container, type Editor, type TUI } from "../../tui/index.ts";
2
- export declare function showReviewPanel(tui: TUI, container: Container, inputContainer: Container, editor: Editor): Promise<void>;
3
- //# sourceMappingURL=review-panel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review-panel.d.ts","sourceRoot":"","sources":["../../../source/commands/review/review-panel.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,SAAS,EACT,KAAK,MAAM,EAGX,KAAK,GAAG,EACT,MAAM,oBAAoB,CAAC;AAQ5B,wBAAsB,eAAe,CACnC,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,SAAS,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA8Of"}
@@ -1,186 +0,0 @@
1
- import { join } from "node:path";
2
- import { initExecutionEnvironment } from "../../execution/index.js";
3
- import { getTerminalSize } from "../../terminal/control.js";
4
- import style from "../../terminal/style.js";
5
- import { Markdown } from "../../tui/components/markdown.js";
6
- import { Spacer } from "../../tui/components/spacer.js";
7
- import { Container, SelectList, Text, } from "../../tui/index.js";
8
- import { formatFileDiffForDisplay, getUntrackedFiles, openFileInEditor, parseGitDiffFiles, } from "./utils.js";
9
- export async function showReviewPanel(tui, container, inputContainer, editor) {
10
- try {
11
- const execEnv = await initExecutionEnvironment();
12
- const stagedResult = await execEnv.executeCommand("git diff --cached", {
13
- cwd: process.cwd(),
14
- timeout: 5000,
15
- preserveOutputOnError: true,
16
- captureStderr: true,
17
- throwOnError: false,
18
- });
19
- const unstagedResult = await execEnv.executeCommand("git diff", {
20
- cwd: process.cwd(),
21
- timeout: 5000,
22
- preserveOutputOnError: true,
23
- captureStderr: true,
24
- throwOnError: false,
25
- });
26
- const untrackedResult = await execEnv.executeCommand("git ls-files --others --exclude-standard", {
27
- cwd: process.cwd(),
28
- timeout: 5000,
29
- preserveOutputOnError: true,
30
- captureStderr: true,
31
- throwOnError: false,
32
- });
33
- const stagedOutput = stagedResult.exitCode === 0 ? stagedResult.output : "";
34
- const unstagedOutput = unstagedResult.exitCode === 0 ? unstagedResult.output : "";
35
- const untrackedOutput = untrackedResult.exitCode === 0 ? untrackedResult.output : "";
36
- const combinedOutput = stagedOutput +
37
- (stagedOutput && unstagedOutput ? "\n" : "") +
38
- unstagedOutput;
39
- if (!combinedOutput.trim()) {
40
- container.addChild(new Spacer(1));
41
- container.addChild(new Markdown("No changes detected in the current directory.", {
42
- customBgRgb: {
43
- r: 52,
44
- g: 53,
45
- b: 65,
46
- },
47
- paddingX: 1,
48
- paddingY: 1,
49
- }));
50
- tui.requestRender();
51
- return;
52
- }
53
- const fileChanges = parseGitDiffFiles(combinedOutput);
54
- const untrackedFiles = await getUntrackedFiles(untrackedOutput, process.cwd());
55
- fileChanges.push(...untrackedFiles);
56
- if (fileChanges.length === 0) {
57
- container.addChild(new Spacer(1));
58
- container.addChild(new Markdown("No file changes could be parsed.", {
59
- customBgRgb: {
60
- r: 52,
61
- g: 53,
62
- b: 65,
63
- },
64
- paddingX: 1,
65
- paddingY: 1,
66
- }));
67
- tui.requestRender();
68
- return;
69
- }
70
- const selectItems = fileChanges.map((file) => ({
71
- value: file.fileName,
72
- label: file.fileName,
73
- description: file.stats,
74
- }));
75
- const selectList = new SelectList(selectItems, 10);
76
- const selectContainer = new Container();
77
- const { columns } = getTerminalSize();
78
- selectContainer.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
79
- selectContainer.addChild(new Spacer(1));
80
- selectContainer.addChild(selectList);
81
- selectContainer.addChild(new Spacer(1));
82
- selectContainer.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
83
- const originalEditor = editor;
84
- inputContainer.clear();
85
- inputContainer.addChild(selectContainer);
86
- tui.setFocus(selectList);
87
- selectList.onSelect = (selectedItem) => {
88
- const selectedFile = fileChanges.find((file) => file.fileName === selectedItem.value);
89
- if (!selectedFile) {
90
- container.addChild(new Spacer(1));
91
- container.addChild(new Markdown(style.red("Error: Selected file not found."), {
92
- customBgRgb: {
93
- r: 52,
94
- g: 53,
95
- b: 65,
96
- },
97
- paddingX: 1,
98
- paddingY: 1,
99
- }));
100
- tui.requestRender();
101
- return;
102
- }
103
- const actionItems = [
104
- { value: "diff", label: "View diff", description: "Show changes" },
105
- {
106
- value: "edit",
107
- label: "Open in editor",
108
- description: `Open in ${process.env["EDITOR"] || process.env["VISUAL"] || "vi"}`,
109
- },
110
- ];
111
- const actionSelectList = new SelectList(actionItems, 5);
112
- const actionContainer = new Container();
113
- actionContainer.addChild(new Spacer(1));
114
- actionContainer.addChild(new Text(style.blue(`Selected: ${selectedFile.fileName}`), 0, 0));
115
- actionContainer.addChild(new Spacer(1));
116
- actionContainer.addChild(actionSelectList);
117
- actionContainer.addChild(new Spacer(1));
118
- actionContainer.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
119
- inputContainer.clear();
120
- inputContainer.addChild(actionContainer);
121
- tui.setFocus(actionSelectList);
122
- tui.requestRender();
123
- actionSelectList.onSelect = (actionItem) => {
124
- if (actionItem.value === "diff") {
125
- container.addChild(new Spacer(1));
126
- container.addChild(new Markdown(formatFileDiffForDisplay(selectedFile.fileName, selectedFile.diff), {
127
- customBgRgb: {
128
- r: 52,
129
- g: 53,
130
- b: 65,
131
- },
132
- paddingX: 1,
133
- paddingY: 1,
134
- }));
135
- }
136
- else if (actionItem.value === "edit") {
137
- const filePath = join(process.cwd(), selectedFile.fileName);
138
- const result = openFileInEditor(filePath, tui.getTerminal());
139
- if (!result.success) {
140
- container.addChild(new Spacer(1));
141
- container.addChild(new Markdown(`Failed to open file in editor: ${result.error || "Unknown error"}`, {
142
- customBgRgb: {
143
- r: 52,
144
- g: 53,
145
- b: 65,
146
- },
147
- paddingX: 1,
148
- paddingY: 1,
149
- }));
150
- }
151
- }
152
- inputContainer.clear();
153
- inputContainer.addChild(originalEditor);
154
- tui.setFocus(originalEditor);
155
- tui.requestRender();
156
- };
157
- actionSelectList.onCancel = () => {
158
- inputContainer.clear();
159
- inputContainer.addChild(selectContainer);
160
- tui.setFocus(selectList);
161
- tui.requestRender();
162
- };
163
- };
164
- selectList.onCancel = () => {
165
- inputContainer.clear();
166
- inputContainer.addChild(originalEditor);
167
- tui.setFocus(originalEditor);
168
- tui.requestRender();
169
- };
170
- tui.requestRender();
171
- }
172
- catch (error) {
173
- console.error("Error executing git diff:", error);
174
- container.addChild(new Spacer(1));
175
- container.addChild(new Markdown("Failed to retrieve git changes. Ensure git is installed and initialized.", {
176
- customBgRgb: {
177
- r: 52,
178
- g: 53,
179
- b: 65,
180
- },
181
- paddingX: 1,
182
- paddingY: 1,
183
- }));
184
- tui.requestRender();
185
- }
186
- }
@@ -1,18 +0,0 @@
1
- import type { Terminal } from "../../tui/terminal.ts";
2
- interface FileChange {
3
- fileName: string;
4
- diff: string;
5
- stats: string;
6
- }
7
- export declare function parseGitDiffFiles(diffOutput: string): FileChange[];
8
- export declare function formatFileDiffForDisplay(fileName: string, diff: string): string;
9
- export declare function getUntrackedFiles(untrackedOutput: string, cwd: string): Promise<FileChange[]>;
10
- /**
11
- * Open a file in the user's preferred editor ($EDITOR or $VISUAL)
12
- */
13
- export declare function openFileInEditor(filePath: string, terminal: Terminal): {
14
- success: boolean;
15
- error?: string;
16
- };
17
- export {};
18
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/commands/review/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AA6CD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,CAwBlE;AAgBD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,MAAM,CAaR;AAED,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,EAAE,CAAC,CAsCvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GACjB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBtC"}
@@ -1,146 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import fs from "node:fs";
3
- import { join } from "node:path";
4
- function isDiffContentLine(line) {
5
- return ((line.startsWith("+") && !line.startsWith("+++")) ||
6
- (line.startsWith("-") && !line.startsWith("---")) ||
7
- line.startsWith(" ") ||
8
- line.startsWith("index") ||
9
- line.startsWith("old mode") ||
10
- line.startsWith("new mode") ||
11
- line.startsWith("deleted file") ||
12
- line.startsWith("new file"));
13
- }
14
- function parseHunkStats(line, isNewFile) {
15
- const statsMatch = line.match(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/);
16
- if (!statsMatch) {
17
- return "Additions: 1, Deletions: 0";
18
- }
19
- const deletions = isNewFile ? 0 : Number.parseInt(statsMatch[2], 10);
20
- const additions = Number.parseInt(statsMatch[4], 10);
21
- return `Additions: ${additions}, Deletions: ${deletions}`;
22
- }
23
- function startNewFile(state, line) {
24
- if (state.currentFile) {
25
- state.fileChanges.push(state.currentFile);
26
- }
27
- const fileMatch = line.match(/diff --git a\/(.*) b\/(.*)/);
28
- if (!fileMatch)
29
- return;
30
- state.currentFile = { fileName: fileMatch[1], diff: "", stats: "" };
31
- state.inDiff = true;
32
- state.isNewFile =
33
- fileMatch[1] === "/dev/null" || fileMatch[2] === "/dev/null";
34
- }
35
- export function parseGitDiffFiles(diffOutput) {
36
- const lines = diffOutput.split("\n");
37
- const state = {
38
- fileChanges: [],
39
- currentFile: null,
40
- inDiff: false,
41
- isNewFile: false,
42
- };
43
- for (const line of lines) {
44
- if (line.startsWith("diff --git")) {
45
- startNewFile(state, line);
46
- }
47
- else if (line.startsWith("@@") && state.currentFile) {
48
- state.currentFile.stats = parseHunkStats(line, state.isNewFile);
49
- }
50
- else if (state.inDiff && state.currentFile && isDiffContentLine(line)) {
51
- state.currentFile.diff += `${line}\n`;
52
- }
53
- }
54
- if (state.currentFile) {
55
- state.fileChanges.push(state.currentFile);
56
- }
57
- return state.fileChanges;
58
- }
59
- function formatDiffLine(line) {
60
- if (line.trim() === "")
61
- return null;
62
- if (line.startsWith("+") && !line.startsWith("+++")) {
63
- return `+${line.substring(1)}`;
64
- }
65
- if (line.startsWith("-") && !line.startsWith("---")) {
66
- return `-${line.substring(1)}`;
67
- }
68
- if (line.startsWith(" ")) {
69
- return ` ${line.substring(1)}`;
70
- }
71
- return line;
72
- }
73
- export function formatFileDiffForDisplay(fileName, diff) {
74
- const lines = diff.split("\n");
75
- const formattedLines = [`### ${fileName}`, "", "```diff"];
76
- for (const line of lines) {
77
- const formatted = formatDiffLine(line);
78
- if (formatted !== null) {
79
- formattedLines.push(formatted);
80
- }
81
- }
82
- formattedLines.push("```");
83
- return formattedLines.join("\n");
84
- }
85
- export async function getUntrackedFiles(untrackedOutput, cwd) {
86
- const fileChanges = [];
87
- const untrackedFiles = untrackedOutput
88
- .trim()
89
- .split("\n")
90
- .filter((file) => file.length > 0);
91
- for (const fileName of untrackedFiles) {
92
- try {
93
- const filePath = join(cwd, fileName);
94
- const fileContent = await fs.promises.readFile(filePath, "utf-8");
95
- const lines = fileContent.split("\n").length;
96
- // Create a diff-like representation for the untracked file
97
- const diff = `diff --git a/${fileName} b/${fileName}
98
- new file mode 100644
99
- index 0000000..0000000
100
- --- /dev/null
101
- +++ b/${fileName}
102
- @@ -0,0 +1,${lines} @@
103
- ${fileContent
104
- .split("\n")
105
- .map((line) => `+${line}`)
106
- .join("\n")}
107
- `;
108
- fileChanges.push({
109
- fileName,
110
- diff,
111
- stats: `Additions: ${lines}, Deletions: 0`,
112
- });
113
- }
114
- catch (error) {
115
- // Skip files that can't be read (e.g., directories, binary files)
116
- console.error(`Failed to read untracked file: ${fileName}`, error);
117
- }
118
- }
119
- return fileChanges;
120
- }
121
- /**
122
- * Open a file in the user's preferred editor ($EDITOR or $VISUAL)
123
- */
124
- export function openFileInEditor(filePath, terminal) {
125
- const editor = process.env["EDITOR"] || process.env["VISUAL"] || "vi";
126
- terminal.enterExternalMode();
127
- try {
128
- const result = spawnSync(editor, [filePath], {
129
- stdio: "inherit",
130
- });
131
- if (result.error) {
132
- return { success: false, error: result.error.message };
133
- }
134
- // Note: Editors often exit with non-zero codes (e.g., :cq in vim, or when
135
- // quitting without saving). We only treat spawn errors as failures, not
136
- // exit codes, since the user may intentionally exit with an error code.
137
- return { success: true };
138
- }
139
- catch (error) {
140
- const errorMessage = error instanceof Error ? error.message : "Unknown error";
141
- return { success: false, error: errorMessage };
142
- }
143
- finally {
144
- terminal.exitExternalMode();
145
- }
146
- }
@@ -1,3 +0,0 @@
1
- import type { CommandOptions, ReplCommand } from "../types.ts";
2
- export declare const shellCommand: (options: CommandOptions) => ReplCommand;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/shell/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/D,eAAO,MAAM,YAAY,GAAI,SAAS,cAAc,KAAG,WAuItD,CAAC"}
@@ -1,96 +0,0 @@
1
- import { initExecutionEnvironment } from "../../execution/index.js";
2
- import style from "../../terminal/style.js";
3
- import { Loader, SelectList, Spacer, Text } from "../../tui/index.js";
4
- // Command execution timeout in milliseconds
5
- const DEFAULT_TIMEOUT = 1.5 * 60 * 1000; // 1.5 minutes
6
- export const shellCommand = (options) => {
7
- const { promptManager, tokenCounter } = options;
8
- return {
9
- command: "/shell",
10
- aliases: ["/sh"],
11
- description: "Run a non-interactive shell command on the local machine.",
12
- getSubCommands: () => Promise.resolve([]),
13
- async handle(args, { tui, container, editor, }) {
14
- const commandStr = args.join(" ");
15
- if (!commandStr.trim()) {
16
- container.addChild(new Text(style.red("Provide a non-empty command."), 0, 1));
17
- tui.requestRender();
18
- editor.setText("");
19
- return "continue";
20
- }
21
- const execEnv = await initExecutionEnvironment();
22
- const colorEnv = {
23
- ["FORCE_COLOR"]: "1",
24
- ["CLICOLOR"]: "1",
25
- ["CLICOLOR_FORCE"]: "1",
26
- ["TERM"]: process.env["TERM"] ?? "xterm-256color",
27
- ["COLORTERM"]: process.env["COLORTERM"] ?? "truecolor",
28
- ["npm_config_color"]: "true",
29
- };
30
- // Show loader before execution
31
- const truncatedCommand = commandStr.length > 50
32
- ? `${commandStr.substring(0, 50)}...`
33
- : commandStr;
34
- const loader = new Loader(tui, `Running: ${truncatedCommand}`);
35
- container.addChild(loader);
36
- tui.requestRender();
37
- const { output, exitCode, duration } = await execEnv.executeCommand(commandStr, {
38
- cwd: process.cwd(),
39
- timeout: DEFAULT_TIMEOUT,
40
- preserveOutputOnError: true,
41
- captureStderr: true,
42
- throwOnError: false,
43
- env: colorEnv,
44
- });
45
- // Cleanup loader
46
- loader.stop();
47
- container.removeChild(loader);
48
- // Display results with spacing
49
- container.addChild(new Spacer(1));
50
- container.addChild(new Text(style.gray(`Exit code: ${exitCode}, Duration: ${duration}ms`), 1, 0));
51
- container.addChild(new Spacer(1));
52
- container.addChild(new Text(output, 2, 0));
53
- // Create context selection component
54
- const contextSelector = new SelectList([
55
- {
56
- value: "yes",
57
- label: "Yes",
58
- description: "Add output to prompt context",
59
- },
60
- {
61
- value: "no",
62
- label: "No",
63
- description: "Do not add output to context",
64
- },
65
- ]);
66
- contextSelector.onSelect = (item) => {
67
- if (item.value === "yes") {
68
- const tokenCount = tokenCounter.count(output);
69
- promptManager.addContext(output);
70
- container.addChild(new Text(style.green(`Output added to prompt context. (${tokenCount} tokens)`), 3, 0));
71
- }
72
- else {
73
- container.addChild(new Text(style.gray("Output not added to context."), 3, 0));
74
- }
75
- // Remove the selector and show final result
76
- container.removeChild(contextSelector);
77
- tui.setFocus(editor);
78
- tui.requestRender();
79
- editor.setText("");
80
- };
81
- contextSelector.onCancel = () => {
82
- // User cancelled - default to not adding to context
83
- container.addChild(new Text(style.gray("Output not added to context."), 3, 0));
84
- container.removeChild(contextSelector);
85
- tui.setFocus(editor);
86
- tui.requestRender();
87
- editor.setText("");
88
- };
89
- // Add the selector to the container
90
- container.addChild(contextSelector);
91
- tui.setFocus(contextSelector);
92
- tui.requestRender();
93
- return "continue";
94
- },
95
- };
96
- };
@@ -1,16 +0,0 @@
1
- interface Subagent {
2
- name: string;
3
- description: string;
4
- model?: string;
5
- tools?: string[];
6
- timeout: number;
7
- systemPrompt: string;
8
- filePath: string;
9
- source: string;
10
- }
11
- export declare function loadSubagents(): Promise<Subagent[]>;
12
- export declare function getSubagent(name: string): Promise<Subagent | undefined>;
13
- export declare function formatSubagentsForDescription(subagents: Subagent[]): string;
14
- export declare function formatSubagentsForPrompt(subagents: Subagent[]): string;
15
- export {};
16
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/subagents/index.ts"],"names":[],"mappings":"AAeA,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAkND,wBAAsB,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAgBzD;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAG7E;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAa3E;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CA6CtE"}