genaicode 0.0.37 → 0.2.0

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 (312) hide show
  1. package/README.md +3 -1
  2. package/bin/genaicode-dev.js +11 -0
  3. package/bin/genaicode.cjs +15 -1
  4. package/dist/ai-service/ai-studio.d.ts +6 -0
  5. package/dist/ai-service/ai-studio.js +135 -0
  6. package/dist/ai-service/ai-studio.js.map +1 -0
  7. package/dist/ai-service/anthropic.d.ts +6 -0
  8. package/dist/ai-service/anthropic.js +135 -0
  9. package/dist/ai-service/anthropic.js.map +1 -0
  10. package/dist/ai-service/chat-gpt.d.ts +5 -0
  11. package/dist/ai-service/chat-gpt.js +132 -0
  12. package/dist/ai-service/chat-gpt.js.map +1 -0
  13. package/dist/ai-service/common.d.ts +58 -0
  14. package/dist/ai-service/common.js +38 -0
  15. package/dist/ai-service/common.js.map +1 -0
  16. package/dist/ai-service/common.test.d.ts +1 -0
  17. package/dist/ai-service/common.test.js +85 -0
  18. package/dist/ai-service/common.test.js.map +1 -0
  19. package/dist/ai-service/dall-e.d.ts +14 -0
  20. package/dist/ai-service/dall-e.js +48 -0
  21. package/dist/ai-service/dall-e.js.map +1 -0
  22. package/dist/ai-service/vertex-ai-claude.d.ts +5 -0
  23. package/dist/ai-service/vertex-ai-claude.js +94 -0
  24. package/dist/ai-service/vertex-ai-claude.js.map +1 -0
  25. package/dist/ai-service/vertex-ai-imagen.d.ts +14 -0
  26. package/dist/ai-service/vertex-ai-imagen.js +77 -0
  27. package/dist/ai-service/vertex-ai-imagen.js.map +1 -0
  28. package/dist/ai-service/vertex-ai.d.ts +7 -0
  29. package/dist/ai-service/vertex-ai.js +142 -0
  30. package/dist/ai-service/vertex-ai.js.map +1 -0
  31. package/dist/cli/cli-options.d.ts +10 -0
  32. package/dist/cli/cli-options.js +124 -0
  33. package/dist/cli/cli-options.js.map +1 -0
  34. package/dist/cli/cli-options.test.d.ts +1 -0
  35. package/dist/cli/cli-options.test.js +34 -0
  36. package/dist/cli/cli-options.test.js.map +1 -0
  37. package/dist/cli/cli-params.d.ts +30 -0
  38. package/dist/cli/cli-params.js +109 -0
  39. package/dist/cli/cli-params.js.map +1 -0
  40. package/dist/cli/cli-params.test.d.ts +1 -0
  41. package/dist/cli/cli-params.test.js +38 -0
  42. package/dist/cli/cli-params.test.js.map +1 -0
  43. package/dist/cli/service-autodetect.d.ts +2 -0
  44. package/dist/cli/service-autodetect.js +17 -0
  45. package/dist/cli/service-autodetect.js.map +1 -0
  46. package/dist/cli/service-autodetect.test.d.ts +1 -0
  47. package/dist/cli/service-autodetect.test.js +38 -0
  48. package/dist/cli/service-autodetect.test.js.map +1 -0
  49. package/dist/cli/validate-cli-params.d.ts +18 -0
  50. package/dist/cli/validate-cli-params.js +129 -0
  51. package/dist/cli/validate-cli-params.js.map +1 -0
  52. package/dist/cli/validate-cli-params.test.d.ts +1 -0
  53. package/dist/cli/validate-cli-params.test.js +106 -0
  54. package/dist/cli/validate-cli-params.test.js.map +1 -0
  55. package/dist/files/file-utils.d.ts +2 -0
  56. package/dist/files/file-utils.js +7 -0
  57. package/dist/files/file-utils.js.map +1 -0
  58. package/dist/files/file-utils.test.d.ts +1 -0
  59. package/dist/files/file-utils.test.js +18 -0
  60. package/dist/files/file-utils.test.js.map +1 -0
  61. package/dist/files/find-files.d.ts +8 -0
  62. package/dist/files/find-files.js +76 -0
  63. package/dist/files/find-files.js.map +1 -0
  64. package/dist/files/read-files.d.ts +18 -0
  65. package/dist/files/read-files.js +66 -0
  66. package/dist/files/read-files.js.map +1 -0
  67. package/dist/files/read-files.test.d.ts +1 -0
  68. package/dist/files/read-files.test.js +88 -0
  69. package/dist/files/read-files.test.js.map +1 -0
  70. package/dist/files/temp-buffer.d.ts +2 -0
  71. package/dist/files/temp-buffer.js +12 -0
  72. package/dist/files/temp-buffer.js.map +1 -0
  73. package/dist/files/update-files.d.ts +6 -0
  74. package/dist/files/update-files.js +197 -0
  75. package/dist/files/update-files.js.map +1 -0
  76. package/dist/images/ensure-alpha.d.ts +1 -0
  77. package/dist/images/ensure-alpha.js +5 -0
  78. package/dist/images/ensure-alpha.js.map +1 -0
  79. package/dist/images/imgly-remove-background.d.ts +2 -0
  80. package/dist/images/imgly-remove-background.js +21 -0
  81. package/dist/images/imgly-remove-background.js.map +1 -0
  82. package/dist/images/resize-image.d.ts +19 -0
  83. package/dist/images/resize-image.js +22 -0
  84. package/dist/images/resize-image.js.map +1 -0
  85. package/dist/images/split-image.d.ts +18 -0
  86. package/dist/images/split-image.js +25 -0
  87. package/dist/images/split-image.js.map +1 -0
  88. package/dist/main/codegen-interactive-utils.d.ts +8 -0
  89. package/dist/main/codegen-interactive-utils.js +148 -0
  90. package/dist/main/codegen-interactive-utils.js.map +1 -0
  91. package/dist/main/codegen-interactive.d.ts +2 -0
  92. package/dist/main/codegen-interactive.js +68 -0
  93. package/dist/main/codegen-interactive.js.map +1 -0
  94. package/dist/main/codegen-types.d.ts +28 -0
  95. package/dist/main/codegen-types.js +2 -0
  96. package/dist/main/codegen-types.js.map +1 -0
  97. package/dist/main/codegen.d.ts +4 -0
  98. package/dist/main/codegen.js +164 -0
  99. package/dist/main/codegen.js.map +1 -0
  100. package/dist/main/codegen.test.d.ts +2 -0
  101. package/dist/main/codegen.test.js +273 -0
  102. package/dist/main/codegen.test.js.map +1 -0
  103. package/dist/main/config-lib.d.ts +16 -0
  104. package/dist/main/config-lib.js +28 -0
  105. package/dist/main/config-lib.js.map +1 -0
  106. package/dist/main/config-lib.test.d.ts +1 -0
  107. package/dist/main/config-lib.test.js +64 -0
  108. package/dist/main/config-lib.test.js.map +1 -0
  109. package/dist/main/config.d.ts +6 -0
  110. package/{src → dist}/main/config.js +28 -22
  111. package/dist/main/config.js.map +1 -0
  112. package/dist/main/interactive/codegen-interactive.d.ts +2 -0
  113. package/dist/main/interactive/codegen-interactive.js +55 -0
  114. package/dist/main/interactive/codegen-interactive.js.map +1 -0
  115. package/dist/main/interactive/codegen-interactive.test.d.ts +4 -0
  116. package/dist/main/interactive/codegen-interactive.test.js +77 -0
  117. package/dist/main/interactive/codegen-interactive.test.js.map +1 -0
  118. package/dist/main/interactive/codegen-worker.d.ts +3 -0
  119. package/dist/main/interactive/codegen-worker.js +47 -0
  120. package/dist/main/interactive/codegen-worker.js.map +1 -0
  121. package/dist/main/interactive/common.d.ts +5 -0
  122. package/dist/main/interactive/common.js +51 -0
  123. package/dist/main/interactive/common.js.map +1 -0
  124. package/dist/main/interactive/configure.d.ts +2 -0
  125. package/dist/main/interactive/configure.js +99 -0
  126. package/dist/main/interactive/configure.js.map +1 -0
  127. package/dist/main/interactive/error-handling.d.ts +4 -0
  128. package/dist/main/interactive/error-handling.js +49 -0
  129. package/dist/main/interactive/error-handling.js.map +1 -0
  130. package/dist/main/interactive/help.d.ts +1 -0
  131. package/dist/main/interactive/help.js +22 -0
  132. package/dist/main/interactive/help.js.map +1 -0
  133. package/dist/main/interactive/process-comments.d.ts +2 -0
  134. package/dist/main/interactive/process-comments.js +39 -0
  135. package/dist/main/interactive/process-comments.js.map +1 -0
  136. package/dist/main/interactive/select-ai-service.d.ts +2 -0
  137. package/dist/main/interactive/select-ai-service.js +27 -0
  138. package/dist/main/interactive/select-ai-service.js.map +1 -0
  139. package/dist/main/interactive/task-file.d.ts +2 -0
  140. package/dist/main/interactive/task-file.js +28 -0
  141. package/dist/main/interactive/task-file.js.map +1 -0
  142. package/dist/main/interactive/text-prompt.d.ts +2 -0
  143. package/dist/main/interactive/text-prompt.js +18 -0
  144. package/dist/main/interactive/text-prompt.js.map +1 -0
  145. package/dist/main/interactive/user-interrupt.d.ts +1 -0
  146. package/dist/main/interactive/user-interrupt.js +36 -0
  147. package/dist/main/interactive/user-interrupt.js.map +1 -0
  148. package/dist/main/interactive/worker-script.d.ts +1 -0
  149. package/dist/main/interactive/worker-script.js +24 -0
  150. package/dist/main/interactive/worker-script.js.map +1 -0
  151. package/dist/main/interactive/worker.d.ts +2 -0
  152. package/dist/main/interactive/worker.js +55 -0
  153. package/dist/main/interactive/worker.js.map +1 -0
  154. package/dist/prompt/function-calling-validate.d.ts +3 -0
  155. package/dist/prompt/function-calling-validate.js +33 -0
  156. package/dist/prompt/function-calling-validate.js.map +1 -0
  157. package/dist/prompt/function-calling.d.ts +5 -0
  158. package/{src → dist}/prompt/function-calling.js +25 -24
  159. package/dist/prompt/function-calling.js.map +1 -0
  160. package/dist/prompt/function-defs/ask-question.d.ts +65 -0
  161. package/dist/prompt/function-defs/ask-question.js +67 -0
  162. package/dist/prompt/function-defs/ask-question.js.map +1 -0
  163. package/dist/prompt/function-defs/codegen-summary.d.ts +63 -0
  164. package/dist/prompt/function-defs/codegen-summary.js +80 -0
  165. package/dist/prompt/function-defs/codegen-summary.js.map +1 -0
  166. package/dist/prompt/function-defs/create-directory.d.ts +21 -0
  167. package/dist/prompt/function-defs/create-directory.js +22 -0
  168. package/dist/prompt/function-defs/create-directory.js.map +1 -0
  169. package/dist/prompt/function-defs/create-file.d.ts +25 -0
  170. package/dist/prompt/function-defs/create-file.js +26 -0
  171. package/dist/prompt/function-defs/create-file.js.map +1 -0
  172. package/dist/prompt/function-defs/delete-file.d.ts +21 -0
  173. package/dist/prompt/function-defs/delete-file.js +22 -0
  174. package/dist/prompt/function-defs/delete-file.js.map +1 -0
  175. package/dist/prompt/function-defs/download-file.d.ts +25 -0
  176. package/dist/prompt/function-defs/download-file.js +26 -0
  177. package/dist/prompt/function-defs/download-file.js.map +1 -0
  178. package/dist/prompt/function-defs/explanation.d.ts +17 -0
  179. package/dist/prompt/function-defs/explanation.js +18 -0
  180. package/dist/prompt/function-defs/explanation.js.map +1 -0
  181. package/dist/prompt/function-defs/generate-image.d.ts +41 -0
  182. package/dist/prompt/function-defs/generate-image.js +42 -0
  183. package/dist/prompt/function-defs/generate-image.js.map +1 -0
  184. package/dist/prompt/function-defs/get-image-assets.d.ts +20 -0
  185. package/dist/prompt/function-defs/get-image-assets.js +21 -0
  186. package/dist/prompt/function-defs/get-image-assets.js.map +1 -0
  187. package/dist/prompt/function-defs/get-source-code.d.ts +20 -0
  188. package/dist/prompt/function-defs/get-source-code.js +21 -0
  189. package/dist/prompt/function-defs/get-source-code.js.map +1 -0
  190. package/dist/prompt/function-defs/imgly-remove-background.d.ts +25 -0
  191. package/dist/prompt/function-defs/imgly-remove-background.js +26 -0
  192. package/dist/prompt/function-defs/imgly-remove-background.js.map +1 -0
  193. package/dist/prompt/function-defs/move-file.d.ts +25 -0
  194. package/dist/prompt/function-defs/move-file.js +26 -0
  195. package/dist/prompt/function-defs/move-file.js.map +1 -0
  196. package/dist/prompt/function-defs/patch-file.d.ts +25 -0
  197. package/dist/prompt/function-defs/patch-file.js +39 -0
  198. package/dist/prompt/function-defs/patch-file.js.map +1 -0
  199. package/dist/prompt/function-defs/resize-image.d.ts +36 -0
  200. package/dist/prompt/function-defs/resize-image.js +37 -0
  201. package/dist/prompt/function-defs/resize-image.js.map +1 -0
  202. package/dist/prompt/function-defs/split-image.d.ts +57 -0
  203. package/dist/prompt/function-defs/split-image.js +46 -0
  204. package/dist/prompt/function-defs/split-image.js.map +1 -0
  205. package/dist/prompt/function-defs/update-file.d.ts +25 -0
  206. package/dist/prompt/function-defs/update-file.js +26 -0
  207. package/dist/prompt/function-defs/update-file.js.map +1 -0
  208. package/dist/prompt/limits.d.ts +3 -0
  209. package/dist/prompt/limits.js +19 -0
  210. package/dist/prompt/limits.js.map +1 -0
  211. package/dist/prompt/limits.test.d.ts +1 -0
  212. package/dist/prompt/limits.test.js +35 -0
  213. package/dist/prompt/limits.test.js.map +1 -0
  214. package/dist/prompt/prompt-codegen.d.ts +9 -0
  215. package/dist/prompt/prompt-codegen.js +90 -0
  216. package/dist/prompt/prompt-codegen.js.map +1 -0
  217. package/dist/prompt/prompt-codegen.test.d.ts +1 -0
  218. package/dist/prompt/prompt-codegen.test.js +98 -0
  219. package/dist/prompt/prompt-codegen.test.js.map +1 -0
  220. package/dist/prompt/prompt-consts.d.ts +1 -0
  221. package/{src → dist}/prompt/prompt-consts.js +1 -0
  222. package/dist/prompt/prompt-consts.js.map +1 -0
  223. package/dist/prompt/prompt-service-ask-question.test.d.ts +3 -0
  224. package/dist/prompt/prompt-service-ask-question.test.js +142 -0
  225. package/dist/prompt/prompt-service-ask-question.test.js.map +1 -0
  226. package/dist/prompt/prompt-service.d.ts +28 -0
  227. package/dist/prompt/prompt-service.js +163 -0
  228. package/dist/prompt/prompt-service.js.map +1 -0
  229. package/dist/prompt/prompt-service.test.d.ts +1 -0
  230. package/dist/prompt/prompt-service.test.js +531 -0
  231. package/dist/prompt/prompt-service.test.js.map +1 -0
  232. package/dist/prompt/steps/step-ask-question.d.ts +6 -0
  233. package/dist/prompt/steps/step-ask-question.js +82 -0
  234. package/dist/prompt/steps/step-ask-question.js.map +1 -0
  235. package/dist/prompt/steps/step-generate-image.d.ts +2 -0
  236. package/dist/prompt/steps/step-generate-image.js +29 -0
  237. package/dist/prompt/steps/step-generate-image.js.map +1 -0
  238. package/dist/prompt/steps/step-validate-recover.d.ts +13 -0
  239. package/dist/prompt/steps/step-validate-recover.js +51 -0
  240. package/dist/prompt/steps/step-validate-recover.js.map +1 -0
  241. package/dist/prompt/steps/step-verify-patch.d.ts +7 -0
  242. package/dist/prompt/steps/step-verify-patch.js +41 -0
  243. package/dist/prompt/steps/step-verify-patch.js.map +1 -0
  244. package/dist/prompt/steps/steps-types.d.ts +4 -0
  245. package/dist/prompt/steps/steps-types.js +6 -0
  246. package/dist/prompt/steps/steps-types.js.map +1 -0
  247. package/dist/prompt/systemprompt.d.ts +3 -0
  248. package/dist/prompt/systemprompt.js +47 -0
  249. package/dist/prompt/systemprompt.js.map +1 -0
  250. package/dist/prompt/systemprompt.test.d.ts +3 -0
  251. package/dist/prompt/systemprompt.test.js +46 -0
  252. package/dist/prompt/systemprompt.test.js.map +1 -0
  253. package/package.json +15 -5
  254. package/bin/genaicode.js +0 -5
  255. package/bin/vertex-monkey-patch.cjs +0 -33
  256. package/src/ai-service/anthropic.js +0 -126
  257. package/src/ai-service/chat-gpt.js +0 -126
  258. package/src/ai-service/common.js +0 -49
  259. package/src/ai-service/common.test.js +0 -107
  260. package/src/ai-service/dall-e.js +0 -50
  261. package/src/ai-service/vertex-ai-claude.js +0 -99
  262. package/src/ai-service/vertex-ai-imagen.js +0 -78
  263. package/src/ai-service/vertex-ai.js +0 -156
  264. package/src/cli/cli-options.js +0 -132
  265. package/src/cli/cli-options.test.js +0 -50
  266. package/src/cli/cli-params.js +0 -114
  267. package/src/cli/cli-params.test.js +0 -43
  268. package/src/cli/service-autodetect.js +0 -11
  269. package/src/cli/service-autodetect.test.js +0 -43
  270. package/src/cli/validate-cli-params.js +0 -137
  271. package/src/cli/validate-cli-params.test.js +0 -134
  272. package/src/files/file-utils.js +0 -7
  273. package/src/files/file-utils.test.js +0 -21
  274. package/src/files/find-files.js +0 -86
  275. package/src/files/read-files.js +0 -65
  276. package/src/files/read-files.test.js +0 -103
  277. package/src/files/temp-buffer.js +0 -13
  278. package/src/files/update-files.js +0 -205
  279. package/src/images/ensure-alpha.js +0 -5
  280. package/src/images/imgly-remove-background.js +0 -23
  281. package/src/images/resize-image.js +0 -23
  282. package/src/images/split-image.js +0 -26
  283. package/src/main/codegen.js +0 -120
  284. package/src/main/codegen.test.js +0 -335
  285. package/src/main/config-lib.js +0 -33
  286. package/src/main/config-lib.test.js +0 -80
  287. package/src/prompt/function-calling-validate.js +0 -25
  288. package/src/prompt/function-defs/ask-question.js +0 -33
  289. package/src/prompt/function-defs/codegen-summary.js +0 -87
  290. package/src/prompt/function-defs/create-directory.js +0 -21
  291. package/src/prompt/function-defs/create-file.js +0 -26
  292. package/src/prompt/function-defs/delete-file.js +0 -21
  293. package/src/prompt/function-defs/download-file.js +0 -25
  294. package/src/prompt/function-defs/explanation.js +0 -17
  295. package/src/prompt/function-defs/generate-image.js +0 -51
  296. package/src/prompt/function-defs/get-image-assets.js +0 -21
  297. package/src/prompt/function-defs/get-source-code.js +0 -21
  298. package/src/prompt/function-defs/imgly-remove-background.js +0 -25
  299. package/src/prompt/function-defs/move-file.js +0 -25
  300. package/src/prompt/function-defs/patch-file.js +0 -39
  301. package/src/prompt/function-defs/resize-image.js +0 -36
  302. package/src/prompt/function-defs/split-image.js +0 -45
  303. package/src/prompt/function-defs/update-file.js +0 -26
  304. package/src/prompt/limits.js +0 -23
  305. package/src/prompt/limits.test.js +0 -40
  306. package/src/prompt/prompt-codegen.js +0 -106
  307. package/src/prompt/prompt-codegen.test.js +0 -116
  308. package/src/prompt/prompt-service-ask-question.test.js +0 -163
  309. package/src/prompt/prompt-service.js +0 -335
  310. package/src/prompt/prompt-service.test.js +0 -602
  311. package/src/prompt/systemprompt.js +0 -39
  312. package/src/prompt/systemprompt.test.js +0 -64
@@ -0,0 +1,531 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { promptService } from './prompt-service.js';
3
+ import * as aiStudio from '../ai-service/ai-studio.js';
4
+ import * as vertexAi from '../ai-service/vertex-ai.js';
5
+ import * as vertexAiClaude from '../ai-service/vertex-ai-claude.js';
6
+ import * as chatGpt from '../ai-service/chat-gpt.js';
7
+ import * as anthropic from '../ai-service/anthropic.js';
8
+ import * as cliParams from '../cli/cli-params.js';
9
+ import fs from 'fs';
10
+ import * as diff from 'diff';
11
+ import mime from 'mime-types';
12
+ import { getImageAssets } from '../files/read-files.js';
13
+ import '../files/find-files.js';
14
+ import * as dalleService from '../ai-service/dall-e.js';
15
+ import * as vertexAiImagen from '../ai-service/vertex-ai-imagen.js';
16
+ import { getCodeGenPrompt } from './prompt-codegen.js';
17
+ vi.mock('../ai-service/vertex-ai-claude.js', () => ({ generateContent: vi.fn() }));
18
+ vi.mock('../ai-service/vertex-ai.js', () => ({ generateContent: vi.fn() }));
19
+ vi.mock('../ai-service/chat-gpt.js', () => ({ generateContent: vi.fn() }));
20
+ vi.mock('../ai-service/anthropic.js', () => ({ generateContent: vi.fn() }));
21
+ vi.mock('../cli/cli-params.js', () => ({
22
+ requireExplanations: false,
23
+ considerAllFiles: false,
24
+ dependencyTree: false,
25
+ explicitPrompt: false,
26
+ allowFileCreate: false,
27
+ allowFileDelete: false,
28
+ allowDirectoryCreate: false,
29
+ allowFileMove: false,
30
+ verbosePrompt: false,
31
+ disableContextOptimization: false,
32
+ vision: false,
33
+ imagen: false,
34
+ temperature: 0.7,
35
+ cheap: false,
36
+ askQuestion: false,
37
+ }));
38
+ vi.mock('fs');
39
+ vi.mock('diff');
40
+ vi.mock('mime-types');
41
+ vi.mock('../ai-service/dall-e.js', () => ({ generateImage: vi.fn() }));
42
+ vi.mock('../ai-service/vertex-ai-imagen.js', () => ({ generateImage: vi.fn() }));
43
+ // Mock find-files module
44
+ vi.mock('../files/find-files.js', () => ({
45
+ getSourceFiles: () => [],
46
+ getImageAssetFiles: () => [],
47
+ }));
48
+ // Mock read-files module
49
+ vi.mock('../files/read-files.js', () => ({
50
+ getSourceCode: () => ({}),
51
+ getImageAssets: vi.fn(() => ({})),
52
+ }));
53
+ vi.mock('../main/config.js', () => ({
54
+ rootDir: '/mocked/root/dir',
55
+ rcConfig: {
56
+ rootDir: '.',
57
+ extensions: ['.js', '.ts', '.tsx', '.jsx'],
58
+ },
59
+ importantContext: {},
60
+ }));
61
+ const GENERATE_CONTENT_FNS = {
62
+ 'vertex-ai-claude': vertexAiClaude.generateContent,
63
+ 'vertex-ai': vertexAi.generateContent,
64
+ 'ai-studio': aiStudio.generateContent,
65
+ anthropic: anthropic.generateContent,
66
+ 'chat-gpt': chatGpt.generateContent,
67
+ };
68
+ const GENERATE_IMAGE_FNS = {
69
+ 'dall-e': dalleService.generateImage,
70
+ 'vertex-ai': vertexAiImagen.generateImage,
71
+ };
72
+ describe('promptService', () => {
73
+ beforeEach(() => {
74
+ vi.resetAllMocks();
75
+ vi.mocked(cliParams).anthropic = false;
76
+ vi.mocked(cliParams).chatGpt = false;
77
+ vi.mocked(cliParams).vertexAi = false;
78
+ vi.mocked(cliParams).dryRun = false;
79
+ vi.mocked(cliParams).vision = false;
80
+ vi.mocked(cliParams).imagen = undefined;
81
+ vi.mocked(cliParams).disableContextOptimization = false;
82
+ });
83
+ it('should process the codegen summary and return the result with Vertex AI', async () => {
84
+ vi.mocked(cliParams).vertexAi = true;
85
+ const mockFunctionCalls = [
86
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Hello");' } },
87
+ ];
88
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
89
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
90
+ expect(result).toEqual(mockFunctionCalls);
91
+ expect(vertexAi.generateContent).toHaveBeenCalled();
92
+ });
93
+ it('should process the codegen summary and return the result with ChatGPT', async () => {
94
+ vi.mocked(cliParams).chatGpt = true;
95
+ const mockFunctionCalls = [{ name: 'createFile', args: { filePath: 'new.js', newContent: 'const x = 5;' } }];
96
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockFunctionCalls);
97
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'chat-gpt' }));
98
+ expect(result).toEqual(mockFunctionCalls);
99
+ expect(chatGpt.generateContent).toHaveBeenCalled();
100
+ });
101
+ it('should process the codegen summary and return the result with Anthropic', async () => {
102
+ vi.mocked(cliParams).anthropic = true;
103
+ const mockFunctionCalls = [{ name: 'deleteFile', args: { filePath: 'obsolete.js' } }];
104
+ vi.mocked(anthropic.generateContent).mockResolvedValueOnce(mockFunctionCalls);
105
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'anthropic' }));
106
+ expect(result).toEqual(mockFunctionCalls);
107
+ expect(anthropic.generateContent).toHaveBeenCalled();
108
+ });
109
+ it('should not update files in dry run mode', async () => {
110
+ vi.mocked(cliParams).vertexAi = true;
111
+ vi.mocked(cliParams).dryRun = true;
112
+ const mockFunctionCalls = [
113
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Dry run");' } },
114
+ ];
115
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
116
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
117
+ expect(result).toEqual(mockFunctionCalls);
118
+ expect(vertexAi.generateContent).toHaveBeenCalled();
119
+ });
120
+ it('should handle invalid patchFile call and retry without patchFile function', async () => {
121
+ vi.mocked(cliParams).vertexAi = true;
122
+ const mockCodegenSummary = [
123
+ {
124
+ name: 'codegenSummary',
125
+ args: {
126
+ fileUpdates: [{ path: 'test.js', updateToolName: 'patchFile' }],
127
+ contextPaths: [],
128
+ explanation: 'Mock summary',
129
+ },
130
+ },
131
+ ];
132
+ const mockInvalidPatchCall = [
133
+ {
134
+ name: 'patchFile',
135
+ args: {
136
+ filePath: 'test.js',
137
+ patch: 'invalid patch',
138
+ },
139
+ },
140
+ ];
141
+ const mockValidUpdateCall = [
142
+ {
143
+ name: 'updateFile',
144
+ args: {
145
+ filePath: 'test.js',
146
+ newContent: 'console.log("Updated content");',
147
+ },
148
+ },
149
+ ];
150
+ // Mock the first call to return the codegen summary
151
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
152
+ // Mock the second call to return an invalid patch
153
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockInvalidPatchCall);
154
+ // Mock the third call (retry) to return a valid update
155
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockValidUpdateCall);
156
+ // Mock fs.readFileSync to return some content
157
+ vi.mocked(fs.readFileSync).mockReturnValue('Original content');
158
+ // Mock diff.applyPatch to fail for the invalid patch
159
+ vi.mocked(diff.applyPatch).mockReturnValue(false);
160
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
161
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
162
+ expect(fs.readFileSync).toHaveBeenCalledWith('test.js', 'utf-8');
163
+ expect(diff.applyPatch).toHaveBeenCalledWith('Original content', 'invalid patch');
164
+ expect(result).toEqual(mockValidUpdateCall);
165
+ });
166
+ it('should include image assets when vision flag is true', async () => {
167
+ vi.mocked(cliParams).chatGpt = true;
168
+ vi.mocked(cliParams).vision = true;
169
+ const mockImageAssets = {
170
+ '/path/to/image1.png': { width: 100, height: 100, mimeType: 'image/png' },
171
+ '/path/to/image2.jpg': { width: 200, height: 200, mimeType: 'image/png' },
172
+ };
173
+ const mockFunctionCalls = [
174
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Vision test");' } },
175
+ ];
176
+ vi.mocked(getImageAssets).mockReturnValue(mockImageAssets);
177
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockFunctionCalls);
178
+ await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'chat-gpt', vision: true }));
179
+ expect(chatGpt.generateContent).toHaveBeenCalled();
180
+ const calls = vi.mocked(chatGpt.generateContent).mock.calls[0];
181
+ expect(calls[0]).toEqual(expect.arrayContaining([
182
+ expect.objectContaining({
183
+ type: 'user',
184
+ text: expect.stringContaining('I should also provide you with a summary of application image assets'),
185
+ }),
186
+ expect.objectContaining({
187
+ type: 'assistant',
188
+ text: expect.stringContaining('Please provide summary of application image assets.'),
189
+ }),
190
+ expect.objectContaining({
191
+ type: 'user',
192
+ functionResponses: [{ name: 'getImageAssets', content: JSON.stringify(mockImageAssets) }],
193
+ }),
194
+ ]));
195
+ });
196
+ it('should include image data in the prompt when processing files with vision', async () => {
197
+ vi.mocked(cliParams).chatGpt = true;
198
+ vi.mocked(cliParams).vision = true;
199
+ const mockCodegenSummary = [
200
+ {
201
+ name: 'codegenSummary',
202
+ args: {
203
+ fileUpdates: [
204
+ {
205
+ path: 'test.js',
206
+ updateToolName: 'updateFile',
207
+ contextImageAssets: ['/path/to/image1.png', '/path/to/image2.jpg'],
208
+ },
209
+ ],
210
+ contextPaths: [],
211
+ explanation: 'Mock summary',
212
+ },
213
+ },
214
+ ];
215
+ const mockUpdateCall = [
216
+ {
217
+ name: 'updateFile',
218
+ args: {
219
+ filePath: 'test.js',
220
+ newContent: 'console.log("Updated with vision");',
221
+ },
222
+ },
223
+ ];
224
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockCodegenSummary);
225
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockUpdateCall);
226
+ vi.mocked(fs.readFileSync).mockImplementation((path) => `mock-base64-data-for-${path}`);
227
+ vi.mocked(mime.lookup).mockImplementation((path) => (path.endsWith('.png') ? 'image/png' : 'image/jpeg'));
228
+ await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'chat-gpt', vision: true }));
229
+ expect(chatGpt.generateContent).toHaveBeenCalledTimes(2);
230
+ const secondCall = vi.mocked(chatGpt.generateContent).mock.calls[1];
231
+ expect(secondCall[0]).toEqual(expect.arrayContaining([
232
+ expect.objectContaining({
233
+ type: 'user',
234
+ text: expect.stringContaining('suggest changes for the `test.js` file'),
235
+ images: [
236
+ {
237
+ path: '/path/to/image1.png',
238
+ base64url: 'mock-base64-data-for-/path/to/image1.png',
239
+ mediaType: 'image/png',
240
+ },
241
+ {
242
+ path: '/path/to/image2.jpg',
243
+ base64url: 'mock-base64-data-for-/path/to/image2.jpg',
244
+ mediaType: 'image/jpeg',
245
+ },
246
+ ],
247
+ }),
248
+ ]));
249
+ });
250
+ it('should not include image assets when vision flag is false', async () => {
251
+ vi.mocked(cliParams).chatGpt = true;
252
+ vi.mocked(cliParams).vision = false;
253
+ const mockFunctionCalls = [
254
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("No vision test");' } },
255
+ ];
256
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockFunctionCalls);
257
+ await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'chat-gpt' }));
258
+ expect(chatGpt.generateContent).toHaveBeenCalled();
259
+ const calls = vi.mocked(chatGpt.generateContent).mock.calls[0];
260
+ expect(calls[0]).not.toEqual(expect.arrayContaining([
261
+ expect.objectContaining({
262
+ type: 'user',
263
+ text: expect.stringContaining('I should also provide you with a summary of application image assets'),
264
+ }),
265
+ ]));
266
+ });
267
+ it('should handle context optimization', async () => {
268
+ vi.mocked(cliParams).vertexAi = true;
269
+ const mockCodegenSummary = [
270
+ {
271
+ name: 'codegenSummary',
272
+ args: {
273
+ fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
274
+ contextPaths: ['context1.js', 'context2.js'],
275
+ explanation: 'Mock summary with context',
276
+ },
277
+ },
278
+ ];
279
+ const mockUpdateCall = [
280
+ {
281
+ name: 'updateFile',
282
+ args: {
283
+ filePath: 'test.js',
284
+ newContent: 'console.log("Updated with context");',
285
+ },
286
+ },
287
+ ];
288
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
289
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockUpdateCall);
290
+ await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
291
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
292
+ const firstCall = vi.mocked(vertexAi.generateContent).mock.calls[0];
293
+ expect(firstCall[0]).toEqual(expect.arrayContaining([
294
+ expect.objectContaining({
295
+ type: 'user',
296
+ functionResponses: [
297
+ expect.objectContaining({
298
+ name: 'getSourceCode',
299
+ content: expect.any(String),
300
+ }),
301
+ ],
302
+ }),
303
+ ]));
304
+ });
305
+ it('should handle disableContextOptimization flag', async () => {
306
+ vi.mocked(cliParams).vertexAi = true;
307
+ vi.mocked(cliParams).disableContextOptimization = true;
308
+ const mockCodegenSummary = [
309
+ {
310
+ name: 'codegenSummary',
311
+ args: {
312
+ fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
313
+ contextPaths: ['context1.js', 'context2.js'],
314
+ explanation: 'Mock summary without context optimization',
315
+ },
316
+ },
317
+ ];
318
+ const mockUpdateCall = [
319
+ {
320
+ name: 'updateFile',
321
+ args: {
322
+ filePath: 'test.js',
323
+ newContent: 'console.log("Updated without context optimization");',
324
+ },
325
+ },
326
+ ];
327
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
328
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockUpdateCall);
329
+ await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
330
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
331
+ const firstCall = vi.mocked(vertexAi.generateContent).mock.calls[0];
332
+ expect(firstCall[0]).not.toEqual(expect.arrayContaining([
333
+ expect.objectContaining({
334
+ type: 'user',
335
+ functionResponses: [
336
+ expect.objectContaining({
337
+ name: 'getSourceCode',
338
+ content: expect.stringContaining('context1.js'),
339
+ }),
340
+ ],
341
+ }),
342
+ ]));
343
+ });
344
+ it('should handle image generation requests', async () => {
345
+ vi.mocked(cliParams).vertexAi = true;
346
+ vi.mocked(cliParams).imagen = 'dall-e';
347
+ const mockCodegenSummary = [
348
+ {
349
+ name: 'codegenSummary',
350
+ args: {
351
+ fileUpdates: [{ path: '/path/to/generated/image.png', updateToolName: 'generateImage' }],
352
+ contextPaths: [],
353
+ explanation: 'Mock summary with image generation',
354
+ },
355
+ },
356
+ ];
357
+ const mockGenerateImageCall = [
358
+ {
359
+ name: 'generateImage',
360
+ args: {
361
+ prompt: 'A test image',
362
+ filePath: '/path/to/generated/image.png',
363
+ width: 256,
364
+ height: 256,
365
+ },
366
+ },
367
+ ];
368
+ const mockDownloadFileCall = [
369
+ {
370
+ name: 'downloadFile',
371
+ args: {
372
+ filePath: '/path/to/generated/image.png',
373
+ explanation: 'Downloading generated image',
374
+ downloadUrl: 'https://example.com/generated-image.png',
375
+ },
376
+ },
377
+ ];
378
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
379
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockGenerateImageCall);
380
+ vi.mocked(dalleService.generateImage).mockResolvedValue('https://example.com/generated-image.png');
381
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai', imagen: 'dall-e' }));
382
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
383
+ expect(dalleService.generateImage).toHaveBeenCalledWith('A test image', undefined, { width: 256, height: 256 }, false);
384
+ expect(result).toEqual(expect.arrayContaining(mockDownloadFileCall));
385
+ });
386
+ it('should handle image generation failure', async () => {
387
+ vi.mocked(cliParams).vertexAi = true;
388
+ vi.mocked(cliParams).imagen = 'dall-e';
389
+ const mockCodegenSummary = [
390
+ {
391
+ name: 'codegenSummary',
392
+ args: {
393
+ fileUpdates: [{ path: '/path/to/generated/image.png', updateToolName: 'generateImage' }],
394
+ contextPaths: [],
395
+ explanation: 'Mock summary with image generation failure',
396
+ },
397
+ },
398
+ ];
399
+ const mockGenerateImageCall = [
400
+ {
401
+ name: 'generateImage',
402
+ args: {
403
+ prompt: 'A test image',
404
+ filePath: '/path/to/generated/image.png',
405
+ width: 256,
406
+ height: 256,
407
+ },
408
+ },
409
+ ];
410
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
411
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockGenerateImageCall);
412
+ vi.mocked(dalleService.generateImage).mockRejectedValue(new Error('Image generation failed'));
413
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai', imagen: 'dall-e' }));
414
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
415
+ expect(dalleService.generateImage).toHaveBeenCalledWith('A test image', undefined, { width: 256, height: 256 }, false);
416
+ expect(result).toEqual(expect.arrayContaining([
417
+ expect.objectContaining({
418
+ name: 'explanation',
419
+ args: {
420
+ text: expect.stringContaining('Failed to generate image: Image generation failed'),
421
+ },
422
+ }),
423
+ ]));
424
+ });
425
+ it('should handle unexpected response without codegen summary', async () => {
426
+ vi.mocked(cliParams).vertexAi = true;
427
+ const mockUnexpectedResponse = [
428
+ {
429
+ name: 'updateFile',
430
+ args: {
431
+ filePath: 'test.js',
432
+ newContent: 'console.log("Unexpected response");',
433
+ },
434
+ },
435
+ ];
436
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockUnexpectedResponse);
437
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
438
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(1);
439
+ expect(result).toEqual(mockUnexpectedResponse);
440
+ });
441
+ describe('validateAndRecoverSingleResult', () => {
442
+ it('should successfully recover from an invalid function call', async () => {
443
+ vi.mocked(cliParams).vertexAi = true;
444
+ const mockInvalidCall = [
445
+ {
446
+ name: 'codegenSummary',
447
+ args: {
448
+ files: [{ path: 'test.js', updateToolName: 'updateFile' }],
449
+ contextPaths: [],
450
+ explanation: 'Mock summary',
451
+ },
452
+ },
453
+ ];
454
+ const mockValidCall = [
455
+ {
456
+ name: 'codegenSummary',
457
+ args: {
458
+ fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
459
+ contextPaths: [],
460
+ explanation: 'Mock summary',
461
+ },
462
+ },
463
+ ];
464
+ vi.mocked(vertexAi.generateContent)
465
+ .mockResolvedValueOnce(mockInvalidCall)
466
+ .mockResolvedValueOnce(mockValidCall)
467
+ .mockResolvedValueOnce([
468
+ {
469
+ name: 'updateFile',
470
+ args: {
471
+ filePath: 'test.js',
472
+ newContent: 'console.log("Unexpected response");',
473
+ },
474
+ },
475
+ ]);
476
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
477
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
478
+ expect(result).toEqual([
479
+ {
480
+ args: {
481
+ filePath: 'test.js',
482
+ newContent: 'console.log("Unexpected response");',
483
+ },
484
+ name: 'updateFile',
485
+ },
486
+ ]);
487
+ });
488
+ it('should handle unsuccessful recovery', async () => {
489
+ vi.mocked(cliParams).vertexAi = true;
490
+ const mockInvalidCall = [
491
+ {
492
+ name: 'updateFile',
493
+ args: { filePath: 'test.js', invalidArg: 'This should not be here' },
494
+ },
495
+ ];
496
+ vi.mocked(vertexAi.generateContent)
497
+ .mockResolvedValueOnce([
498
+ {
499
+ name: 'codegenSummary',
500
+ args: {
501
+ fileUpdates: [{ path: 'test.js', updateToolName: 'patchFile' }],
502
+ contextPaths: [],
503
+ explanation: 'Mock summary',
504
+ },
505
+ },
506
+ ])
507
+ .mockResolvedValueOnce(mockInvalidCall)
508
+ .mockResolvedValueOnce(mockInvalidCall); // Second call also returns invalid result
509
+ await expect(promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }))).rejects.toThrow('Recovery failed');
510
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
511
+ });
512
+ it('should not attempt recovery for multiple valid function calls', async () => {
513
+ vi.mocked(cliParams).vertexAi = true;
514
+ const mockValidCalls = [
515
+ {
516
+ name: 'updateFile',
517
+ args: { filePath: 'test1.js', newContent: 'console.log("File 1");' },
518
+ },
519
+ {
520
+ name: 'updateFile',
521
+ args: { filePath: 'test2.js', newContent: 'console.log("File 2");' },
522
+ },
523
+ ];
524
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockValidCalls);
525
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt({ askQuestion: false, aiService: 'vertex-ai' }));
526
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(1);
527
+ expect(result).toEqual(mockValidCalls);
528
+ });
529
+ });
530
+ });
531
+ //# sourceMappingURL=prompt-service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-service.test.js","sourceRoot":"","sources":["../../src/prompt/prompt-service.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { FunctionCall, FunctionDef, PromptItem } from '../../ai-service/common.js';
2
+ import { StepResult } from './steps-types.js';
3
+ import { CodegenOptions } from '../../main/codegen-types.js';
4
+ export declare function executeStepAskQuestion(generateContentFn: (prompt: PromptItem[], functionDefs: FunctionDef[], requiredFunctionName: string, temperature: number, cheap: boolean, options: CodegenOptions) => Promise<FunctionCall[]>, prompt: PromptItem[], functionDefs: FunctionDef[], temperature: number, cheap: boolean, messages: {
5
+ contextSourceCode: (paths: string[]) => string;
6
+ }, options: CodegenOptions): Promise<StepResult>;
@@ -0,0 +1,82 @@
1
+ import { input, confirm } from '@inquirer/prompts';
2
+ import { StepResult } from './steps-types.js';
3
+ export async function executeStepAskQuestion(generateContentFn, prompt, functionDefs, temperature, cheap, messages, options) {
4
+ console.log('Allowing the assistant to ask a question...');
5
+ const questionAsked = false;
6
+ while (!questionAsked) {
7
+ const askQuestionResult = await generateContentFn(prompt, functionDefs, 'askQuestion', temperature, cheap, options);
8
+ const askQuestionCall = askQuestionResult.find((call) => call.name === 'askQuestion');
9
+ if (askQuestionCall) {
10
+ console.log('Assistant asks:', askQuestionCall.args);
11
+ if (askQuestionCall.args?.stopCodegen) {
12
+ console.log('Assistant requested to stop code generation. Exiting...');
13
+ return StepResult.BREAK;
14
+ }
15
+ else if (!askQuestionCall.args?.shouldPrompt) {
16
+ console.log('Proceeding with code generation.');
17
+ break;
18
+ }
19
+ const fileContentRequested = (askQuestionCall.args?.requestFilesContent?.length ?? 0) > 0;
20
+ const permissionsRequested = Object.entries(askQuestionCall.args?.requestPermissions ?? {}).filter(([, enabled]) => enabled).length > 0;
21
+ const userAnswer = askQuestionCall.args?.shouldPrompt
22
+ ? fileContentRequested
23
+ ? (await confirm({
24
+ message: 'The assistant is requesting file contents. Do you want to provide them?',
25
+ default: true,
26
+ }))
27
+ ? 'Providing requested files content.'
28
+ : 'Request for file contents denied.'
29
+ : permissionsRequested
30
+ ? (await confirm({
31
+ message: 'The assistant is requesting additional permissions. Do you want to grant them?',
32
+ default: false,
33
+ }))
34
+ ? 'Permissions granted.'
35
+ : 'Permission request denied.'
36
+ : await input({ message: 'Your answer' })
37
+ : "Let's proceed with code generation.";
38
+ if (permissionsRequested &&
39
+ askQuestionCall.args?.requestPermissions &&
40
+ userAnswer === 'Permission request denied.') {
41
+ if (askQuestionCall.args?.requestPermissions.enableImagen) {
42
+ options.imagen = options.aiService === 'chat-gpt' ? 'dall-e' : 'vertex-ai';
43
+ }
44
+ if (askQuestionCall.args?.requestPermissions.enableVision) {
45
+ options.vision = true;
46
+ }
47
+ if (askQuestionCall.args?.requestPermissions.allowDirectoryCreate) {
48
+ options.allowDirectoryCreate = true;
49
+ }
50
+ if (askQuestionCall.args?.requestPermissions.allowFileCreate) {
51
+ options.allowFileCreate = true;
52
+ }
53
+ if (askQuestionCall.args?.requestPermissions.allowFileDelete) {
54
+ options.allowFileDelete = true;
55
+ }
56
+ if (askQuestionCall.args?.requestPermissions.allowFileMove) {
57
+ options.allowFileMove = true;
58
+ }
59
+ }
60
+ prompt.push({ type: 'assistant', functionCalls: [askQuestionCall] }, {
61
+ type: 'user',
62
+ text: userAnswer,
63
+ functionResponses: [
64
+ {
65
+ name: 'askQuestion',
66
+ call_id: askQuestionCall.id,
67
+ content: fileContentRequested && userAnswer === 'Providing requested files content.'
68
+ ? messages.contextSourceCode(askQuestionCall.args.requestFilesContent)
69
+ : undefined,
70
+ },
71
+ ],
72
+ });
73
+ console.log('The question was answered', userAnswer);
74
+ }
75
+ else {
76
+ console.log('Assistant did not ask a question. Proceeding with code generation.');
77
+ break;
78
+ }
79
+ }
80
+ return StepResult.CONTINUE;
81
+ }
82
+ //# sourceMappingURL=step-ask-question.js.map