@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@travisennis/acai",
3
- "version": "0.0.12",
3
+ "version": "0.0.14",
4
4
  "description": "An AI assistant for developing software.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -47,9 +47,11 @@
47
47
  "dev": "node --no-warnings --env-file=.env ./source/index.ts",
48
48
  "oxlint": "npm run oxlint:single -- ./source",
49
49
  "oxlint:single": "oxlint --type-aware --ignore-path .gitignore -A all -c .oxlintrc.json",
50
- "knip": "npx knip",
51
- "knip:prod": "npx knip --production",
50
+ "knip": "knip",
51
+ "knip:prod": "knip --production",
52
+ "fallow": "fallow --format json",
52
53
  "setup": "node scripts/setup.ts",
54
+ "bootstrap": "npm run setup",
53
55
  "update": "npx npm-check-updates --interactive --format group",
54
56
  "cpd": "npx jscpd ./source",
55
57
  "typecheck": "tsc --noEmit --pretty -p tsconfig.json",
@@ -58,24 +60,22 @@
58
60
  "lint:length": "find source -name '*.ts' | xargs -I{} awk 'END{if(NR>500)print FILENAME\": \"NR\" lines\"}' {}"
59
61
  },
60
62
  "dependencies": {
61
- "@ai-sdk/alibaba": "^1.0.21",
62
- "@ai-sdk/anthropic": "^3.0.74",
63
- "@ai-sdk/deepseek": "^2.0.32",
64
- "@ai-sdk/devtools": "^0.0.17",
65
- "@ai-sdk/google": "^3.0.67",
66
- "@ai-sdk/groq": "^3.0.38",
67
- "@ai-sdk/open-responses": "^1.0.14",
68
- "@ai-sdk/openai": "^3.0.58",
69
- "@ai-sdk/openai-compatible": "^2.0.45",
63
+ "@ai-sdk/anthropic": "^3.0.84",
64
+ "@ai-sdk/deepseek": "^2.0.38",
65
+ "@ai-sdk/devtools": "^0.0.19",
66
+ "@ai-sdk/google": "^3.0.82",
67
+ "@ai-sdk/groq": "^3.0.41",
68
+ "@ai-sdk/open-responses": "^1.0.18",
69
+ "@ai-sdk/openai": "^3.0.71",
70
+ "@ai-sdk/openai-compatible": "^2.0.50",
70
71
  "@crosscopy/clipboard": "^0.3.6",
71
72
  "@travisennis/stdlib": "^0.0.14",
72
- "ai": "^6.0.174",
73
+ "ai": "^6.0.204",
73
74
  "cheerio": "^1.2.0",
74
75
  "diff": "^9.0.0",
75
- "fast-glob": "^3.3.3",
76
76
  "fdir": "^6.5.0",
77
77
  "highlight.js": "^11.11.1",
78
- "marked": "18.0.3",
78
+ "marked": "18.0.5",
79
79
  "p-throttle": "^8.1.0",
80
80
  "parse5": "^8.0.1",
81
81
  "parse5-htmlparser2-tree-adapter": "^8.0.1",
@@ -83,24 +83,25 @@
83
83
  "pino-pretty": "^13.1.3",
84
84
  "pino-roll": "^4.0.0",
85
85
  "tiktoken": "^1.0.22",
86
- "zod": "^4.4.2"
86
+ "zod": "^4.4.3"
87
87
  },
88
88
  "devDependencies": {
89
89
  "@ai-sdk/provider": "^3.0.10",
90
- "@ast-grep/napi": "^0.42.1",
91
- "@biomejs/biome": "2.4.14",
92
- "@commitlint/config-conventional": "^20.5.3",
93
- "@types/node": "^25.6.0",
90
+ "@biomejs/biome": "2.5.0",
91
+ "@commitlint/config-conventional": "^21.0.2",
92
+ "@types/node": "^25.9.3",
94
93
  "c8": "^11.0.0",
95
- "commitlint": "^20.5.3",
94
+ "commitlint": "^21.0.2",
96
95
  "domhandler": "^6.0.1",
96
+ "fallow": "^2.96.0",
97
97
  "husky": "^9.1.7",
98
- "oxlint": "^1.62.0",
99
- "oxlint-tsgolint": "^0.22.1",
98
+ "knip": "^6.16.1",
99
+ "oxlint": "^1.69.0",
100
+ "oxlint-tsgolint": "^0.23.0",
100
101
  "typescript": "^6.0.3"
101
102
  },
102
103
  "engines": {
103
- "node": ">=20"
104
+ "node": ">=24"
104
105
  },
105
106
  "publishConfig": {
106
107
  "access": "public"
@@ -1,23 +0,0 @@
1
- import type { WorkspaceContext } from "../index.ts";
2
- import type { ModelName } from "../models/providers.ts";
3
- export declare class SubAgent {
4
- workspace: WorkspaceContext;
5
- constructor(options: {
6
- workspace: WorkspaceContext;
7
- });
8
- execute({ model, system, prompt, abortSignal, allowedTools, timeout, }: {
9
- model: ModelName;
10
- system: string;
11
- prompt: string;
12
- abortSignal?: AbortSignal;
13
- allowedTools?: string[];
14
- timeout?: number;
15
- }): Promise<string>;
16
- private prepareExecution;
17
- private filterTools;
18
- private createTimeoutSignal;
19
- private combineAbortSignals;
20
- private runGenerateText;
21
- private transformError;
22
- }
23
- //# sourceMappingURL=sub-agent.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sub-agent.d.ts","sourceRoot":"","sources":["../../source/agent/sub-agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKxD,qBAAa,QAAQ;IACnB,SAAS,EAAE,gBAAgB,CAAC;gBAEhB,OAAO,EAAE;QACnB,SAAS,EAAE,gBAAgB,CAAC;KAC7B;IAIK,OAAO,CAAC,EACZ,KAAK,EACL,MAAM,EACN,MAAM,EACN,WAAW,EACX,YAAY,EACZ,OAAO,GACR,EAAE;QACD,KAAK,EAAE,SAAS,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;YAgCa,gBAAgB;IA2B9B,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,mBAAmB;YAmBb,eAAe;IAmC7B,OAAO,CAAC,cAAc;CASvB"}
@@ -1,109 +0,0 @@
1
- import { generateText, stepCountIs } from "ai";
2
- import { config } from "../config/index.js";
3
- import { AiConfig } from "../models/ai-config.js";
4
- import { getLanguageModel, getModelMetadata } from "../models/manager.js";
5
- import { initTools } from "../tools/index.js";
6
- import { toAiSdkTools } from "../tools/utils.js";
7
- export class SubAgent {
8
- workspace;
9
- constructor(options) {
10
- this.workspace = options.workspace;
11
- }
12
- async execute({ model, system, prompt, abortSignal, allowedTools, timeout, }) {
13
- try {
14
- const { tools, abortSignal: combinedSignal, timeoutId, } = await this.prepareExecution({
15
- allowedTools,
16
- timeout,
17
- abortSignal,
18
- });
19
- try {
20
- const result = await this.runGenerateText({
21
- model,
22
- system,
23
- prompt,
24
- tools,
25
- abortSignal: combinedSignal,
26
- });
27
- return result.text;
28
- }
29
- finally {
30
- if (timeoutId) {
31
- clearTimeout(timeoutId);
32
- }
33
- }
34
- }
35
- catch (error) {
36
- throw this.transformError(error);
37
- }
38
- }
39
- async prepareExecution({ allowedTools, timeout, abortSignal, }) {
40
- let tools = await initTools({
41
- workspace: this.workspace,
42
- });
43
- tools = this.filterTools(tools, allowedTools);
44
- const { signal: timeoutSignal, timeoutId } = this.createTimeoutSignal(timeout);
45
- const combinedSignal = this.combineAbortSignals(timeoutSignal, abortSignal);
46
- return { tools, abortSignal: combinedSignal, timeoutId };
47
- }
48
- filterTools(tools, allowedTools) {
49
- if (!allowedTools || allowedTools.length === 0) {
50
- return tools;
51
- }
52
- const filteredTools = {};
53
- for (const [key, value] of Object.entries(tools)) {
54
- if (allowedTools.includes(key)) {
55
- filteredTools[key] = value;
56
- }
57
- }
58
- return filteredTools;
59
- }
60
- createTimeoutSignal(timeout) {
61
- if (!timeout || timeout <= 0) {
62
- return { signal: undefined, timeoutId: undefined };
63
- }
64
- const controller = new AbortController();
65
- const timeoutId = setTimeout(() => {
66
- controller.abort(new Error(`SubAgent timed out after ${timeout} seconds`));
67
- }, timeout * 1000);
68
- return { signal: controller.signal, timeoutId };
69
- }
70
- combineAbortSignals(timeoutSignal, abortSignal) {
71
- const signals = [timeoutSignal, abortSignal].filter((s) => s != null);
72
- if (signals.length === 0) {
73
- return undefined;
74
- }
75
- if (signals.length === 1) {
76
- return signals[0];
77
- }
78
- return AbortSignal.any(signals);
79
- }
80
- async runGenerateText({ model, system, prompt, tools, abortSignal, }) {
81
- const modelConfig = getModelMetadata({ model });
82
- const aiConfig = new AiConfig({
83
- modelMetadata: modelConfig,
84
- prompt,
85
- });
86
- const stateDir = await config.app.ensurePath("audit");
87
- return generateText({
88
- model: getLanguageModel({ model, app: "subagent", stateDir }),
89
- maxOutputTokens: aiConfig.maxOutputTokens(),
90
- system,
91
- prompt,
92
- temperature: aiConfig.temperature(),
93
- topP: aiConfig.topP(),
94
- stopWhen: stepCountIs(100),
95
- providerOptions: aiConfig.providerOptions(),
96
- tools: toAiSdkTools(tools),
97
- abortSignal,
98
- });
99
- }
100
- transformError(error) {
101
- if (error.name === "AbortError" || error.name === "TimeoutError") {
102
- if (error.message.includes("timed out")) {
103
- return new Error(error.message);
104
- }
105
- return new Error(`SubAgent execution was aborted: ${error.message}`);
106
- }
107
- return error;
108
- }
109
- }
@@ -1,3 +0,0 @@
1
- import type { CommandOptions, ReplCommand } from "../types.ts";
2
- export declare const addDirectoryCommand: ({ workspace, }: CommandOptions) => ReplCommand;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/add-directory/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/D,eAAO,MAAM,mBAAmB,GAAI,gBAEjC,cAAc,KAAG,WAwFnB,CAAC"}
@@ -1,50 +0,0 @@
1
- import style from "../../terminal/style.js";
2
- import { Text } from "../../tui/index.js";
3
- import { resolveDirectoryPath, validateDirectory } from "./utils.js";
4
- export const addDirectoryCommand = ({ workspace, }) => {
5
- return {
6
- command: "/add-directory",
7
- description: "Add a directory to the list of allowed working directories",
8
- getSubCommands: async () => {
9
- return [];
10
- },
11
- async handle(args, { tui, container, editor, }) {
12
- const directoryPath = args?.[0];
13
- if (!directoryPath) {
14
- container.addChild(new Text(style.red("Usage: /add-directory <path>"), 0, 1));
15
- tui.requestRender();
16
- editor.setText("");
17
- return "continue";
18
- }
19
- try {
20
- const resolvedPath = resolveDirectoryPath(directoryPath);
21
- const isValid = await validateDirectory(resolvedPath);
22
- if (!isValid) {
23
- container.addChild(new Text(style.red(`Path is not a directory: ${resolvedPath}`), 1, 0));
24
- tui.requestRender();
25
- editor.setText("");
26
- return "continue";
27
- }
28
- if (workspace.allowedDirs.includes(resolvedPath)) {
29
- container.addChild(new Text(style.yellow(`Directory already in allowed list: ${resolvedPath}`), 1, 0));
30
- tui.requestRender();
31
- editor.setText("");
32
- return "continue";
33
- }
34
- workspace.allowedDirs.push(resolvedPath);
35
- container.addChild(new Text(`Added directory to allowed list: ${style.blue(resolvedPath)}`, 1, 0));
36
- container.addChild(new Text(`Current allowed directories: ${style.blue(workspace.allowedDirs.join(", "))}`, 2, 0));
37
- tui.requestRender();
38
- editor.setText("");
39
- return "continue";
40
- }
41
- catch (error) {
42
- const errorMessage = error instanceof Error ? error.message : String(error);
43
- container.addChild(new Text(style.red(`Failed to add directory: ${errorMessage}`), 0, 1));
44
- tui.requestRender();
45
- editor.setText("");
46
- return "continue";
47
- }
48
- },
49
- };
50
- };
@@ -1,3 +0,0 @@
1
- export declare function validateDirectory(dirPath: string): Promise<boolean>;
2
- export declare function resolveDirectoryPath(dirPath: string): string;
3
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/commands/add-directory/utils.ts"],"names":[],"mappings":"AAGA,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQzE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D"}
@@ -1,15 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import path from "node:path";
3
- export async function validateDirectory(dirPath) {
4
- try {
5
- const resolvedPath = path.resolve(dirPath);
6
- const stats = await fs.stat(resolvedPath);
7
- return stats.isDirectory();
8
- }
9
- catch {
10
- return false;
11
- }
12
- }
13
- export function resolveDirectoryPath(dirPath) {
14
- return path.resolve(dirPath);
15
- }
@@ -1,3 +0,0 @@
1
- import type { CommandOptions, ReplCommand } from "../types.ts";
2
- export declare const clearCommand: (_options: CommandOptions) => ReplCommand;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/clear/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,eAAO,MAAM,YAAY,GAAI,UAAU,cAAc,KAAG,WAmBvD,CAAC"}
@@ -1,13 +0,0 @@
1
- export const clearCommand = (_options) => {
2
- return {
3
- command: "/clear",
4
- description: "Clears the terminal screen.",
5
- getSubCommands: () => Promise.resolve([]),
6
- async handle(_args, { tui, container, editor, }) {
7
- container.clear();
8
- tui.requestRender();
9
- editor.setText("");
10
- return "continue";
11
- },
12
- };
13
- };
@@ -1,3 +0,0 @@
1
- import type { CommandOptions, ReplCommand } from "../types.ts";
2
- export declare const generateRulesCommand: ({ sessionManager, modelManager, tokenTracker, config, workspace, }: CommandOptions) => ReplCommand;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/generate-rules/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/D,eAAO,MAAM,oBAAoB,GAAI,oEAMlC,cAAc,KAAG,WA4HnB,CAAC"}
@@ -1,206 +0,0 @@
1
- import { getTerminalSize, isArrowDown, isArrowUp, isEnter, isEscape, isShiftTab, isTab, } from "../../terminal/control.js";
2
- import style from "../../terminal/style.js";
3
- import { Container, Input, Spacer, Text, } from "../../tui/index.js";
4
- import { logger } from "../../utils/logger.js";
5
- import { generateRulesFromSession } from "./service.js";
6
- import { hideRuleSelector } from "./utils.js";
7
- export const generateRulesCommand = ({ sessionManager, modelManager, tokenTracker, config, workspace, }) => {
8
- return {
9
- command: "/generate-rules",
10
- description: "Analyzes the current conversation to generate and save new interaction rules, then displays them.",
11
- getSubCommands: () => Promise.resolve([]),
12
- async handle(_args, { tui, container, inputContainer, editor, }) {
13
- if (sessionManager.isEmpty()) {
14
- container.addChild(new Text(style.yellow("Cannot generate rules from an empty conversation."), 1, 0));
15
- tui.requestRender();
16
- editor.setText("");
17
- return "continue";
18
- }
19
- container.addChild(new Text("Analyzing conversation to generate rules...", 0, 1));
20
- tui.requestRender();
21
- try {
22
- const { rules: newRules } = await generateRulesFromSession({
23
- modelManager,
24
- messages: sessionManager.get(),
25
- tokenTracker,
26
- config,
27
- workspace,
28
- });
29
- if (newRules == null || newRules.length === 0) {
30
- container.addChild(new Text(style.yellow("No new generalizable rules were identified."), 2, 0));
31
- tui.requestRender();
32
- editor.setText("");
33
- return "continue";
34
- }
35
- const ruleSelector = new RuleSelectorComponent(newRules, async (selectedRules) => {
36
- if (selectedRules.length === 0) {
37
- container.addChild(new Text(style.yellow("No rules selected to save."), 2, 0));
38
- }
39
- else {
40
- try {
41
- const existingRules = await config.readLearnedRulesFile();
42
- const rulesToAdd = selectedRules.join("\n");
43
- const updatedRules = existingRules.endsWith("\n") || existingRules.length === 0
44
- ? `${existingRules}${rulesToAdd}`
45
- : `${existingRules}\n${rulesToAdd}`;
46
- await config.writeLearnedRulesFile(updatedRules);
47
- container.addChild(new Text(style.green("Selected rules saved to learned rules."), 2, 0));
48
- container.addChild(new Text(style.dim("Saved rules:"), 3, 0));
49
- selectedRules.forEach((rule, index) => {
50
- container.addChild(new Text(`- ${rule}`, 4 + index, 0));
51
- });
52
- }
53
- catch (error) {
54
- container.addChild(new Text(style.red(`Failed to save rules: ${error}`), 2, 0));
55
- }
56
- }
57
- hideRuleSelector(inputContainer, editor, tui);
58
- tui.requestRender();
59
- }, () => {
60
- hideRuleSelector(inputContainer, editor, tui);
61
- tui.requestRender();
62
- });
63
- inputContainer.clear();
64
- inputContainer.addChild(ruleSelector);
65
- tui.setFocus(ruleSelector);
66
- tui.requestRender();
67
- return "continue";
68
- }
69
- catch (error) {
70
- const errorMessage = error instanceof Error ? error.message : String(error);
71
- container.addChild(new Text(style.red(`Error generating rules: ${errorMessage}`), 0, 1));
72
- logger.error(error, "Error during rule generation:");
73
- tui.requestRender();
74
- editor.setText("");
75
- return "continue";
76
- }
77
- },
78
- };
79
- };
80
- class RuleSelectorComponent extends Container {
81
- searchInput;
82
- listContainer;
83
- allRules = [];
84
- filteredRules = [];
85
- selectedIndex = 0;
86
- selectedRules = new Set();
87
- onSelectCallback;
88
- onCancelCallback;
89
- constructor(rules, onSelect, onCancel) {
90
- super();
91
- this.onSelectCallback = onSelect;
92
- this.onCancelCallback = onCancel;
93
- this.allRules = rules;
94
- this.filteredRules = rules;
95
- const { columns } = getTerminalSize();
96
- this.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
97
- this.addChild(new Spacer(1));
98
- this.searchInput = new Input();
99
- this.searchInput.onSubmit = () => {
100
- this.toggleSelection(this.selectedIndex);
101
- };
102
- this.addChild(this.searchInput);
103
- this.addChild(new Spacer(1));
104
- this.listContainer = new Container();
105
- this.addChild(this.listContainer);
106
- this.addChild(new Spacer(1));
107
- this.addChild(new Text(style.dim("Space: toggle selection, Enter: confirm, Escape: cancel"), 0, 0));
108
- this.addChild(new Spacer(1));
109
- this.addChild(new Text(style.blue("─".repeat(columns)), 0, 0));
110
- this.updateList();
111
- }
112
- filterRules(query) {
113
- if (!query.trim()) {
114
- this.filteredRules = this.allRules;
115
- }
116
- else {
117
- const searchTokens = query
118
- .toLowerCase()
119
- .split(/\s+/)
120
- .filter((t) => t);
121
- this.filteredRules = this.allRules.filter((rule) => {
122
- const searchText = rule.toLowerCase();
123
- return searchTokens.every((token) => searchText.includes(token));
124
- });
125
- }
126
- this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, this.filteredRules.length - 1));
127
- this.updateList();
128
- }
129
- updateList() {
130
- this.listContainer.clear();
131
- const maxVisible = 10;
132
- const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(maxVisible / 2), this.filteredRules.length - maxVisible));
133
- const endIndex = Math.min(startIndex + maxVisible, this.filteredRules.length);
134
- for (let i = startIndex; i < endIndex; i++) {
135
- const rule = this.filteredRules[i];
136
- if (!rule)
137
- continue;
138
- const isSelected = i === this.selectedIndex;
139
- const isChecked = this.selectedRules.has(i);
140
- let line = "";
141
- if (isSelected) {
142
- const prefix = style.blue("→ ");
143
- const checkbox = isChecked ? style.green("[✓] ") : "[ ] ";
144
- const ruleText = rule;
145
- line = `${prefix + checkbox + style.blue(ruleText)}`;
146
- }
147
- else {
148
- const checkbox = isChecked ? style.green("[✓] ") : "[ ] ";
149
- const ruleText = ` ${rule}`;
150
- line = `${checkbox + ruleText}`;
151
- }
152
- this.listContainer.addChild(new Text(line, 0, 0));
153
- }
154
- if (startIndex > 0 || endIndex < this.filteredRules.length) {
155
- const scrollInfo = style.gray(` (${this.selectedIndex + 1}/${this.filteredRules.length})`);
156
- this.listContainer.addChild(new Text(scrollInfo, 0, 0));
157
- }
158
- if (this.filteredRules.length === 0) {
159
- this.listContainer.addChild(new Text(style.gray(" No matching rules"), 0, 0));
160
- }
161
- }
162
- wantsNavigationKeys() {
163
- return true;
164
- }
165
- handleInput(keyData) {
166
- if (isArrowUp(keyData) || isShiftTab(keyData)) {
167
- this.selectedIndex = Math.max(0, this.selectedIndex - 1);
168
- this.updateList();
169
- }
170
- else if (isArrowDown(keyData) || isTab(keyData)) {
171
- this.selectedIndex = Math.min(this.filteredRules.length - 1, this.selectedIndex + 1);
172
- this.updateList();
173
- }
174
- else if (keyData === " ") {
175
- this.toggleSelection(this.selectedIndex);
176
- }
177
- else if (isEnter(keyData)) {
178
- this.handleConfirm();
179
- }
180
- else if (isEscape(keyData)) {
181
- this.onCancelCallback();
182
- }
183
- else {
184
- this.searchInput.handleInput(keyData);
185
- this.filterRules(this.searchInput.getValue());
186
- }
187
- }
188
- toggleSelection(index) {
189
- if (this.selectedRules.has(index)) {
190
- this.selectedRules.delete(index);
191
- }
192
- else {
193
- this.selectedRules.add(index);
194
- }
195
- this.updateList();
196
- }
197
- handleConfirm() {
198
- const selectedRuleTexts = Array.from(this.selectedRules)
199
- .map((index) => this.filteredRules[index])
200
- .filter((rule) => rule !== undefined);
201
- this.onSelectCallback(selectedRuleTexts);
202
- }
203
- getSearchInput() {
204
- return this.searchInput;
205
- }
206
- }
@@ -1,22 +0,0 @@
1
- import { type ModelMessage } from "ai";
2
- import type { ConfigManager } from "../../config/index.ts";
3
- import type { WorkspaceContext } from "../../index.ts";
4
- import type { ModelManager } from "../../models/manager.ts";
5
- import type { TokenTracker } from "../../tokens/tracker.ts";
6
- interface GenerateRulesOptions {
7
- modelManager: ModelManager;
8
- messages: ModelMessage[];
9
- tokenTracker: TokenTracker;
10
- config: ConfigManager;
11
- workspace: WorkspaceContext;
12
- }
13
- interface GenerateRulesResult {
14
- rules: string[];
15
- }
16
- /**
17
- * Analyzes conversation and generates rules without UI interaction.
18
- * Returns the list of generated rules.
19
- */
20
- export declare function generateRulesFromSession(options: GenerateRulesOptions): Promise<GenerateRulesResult>;
21
- export {};
22
- //# sourceMappingURL=service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../source/commands/generate-rules/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,IAAI,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5D,UAAU,oBAAoB;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAED,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA6D9B"}