genaicode 0.6.1 → 0.7.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 (213) hide show
  1. package/README.md +0 -2
  2. package/dist/ai-service/ai-studio.js +7 -1
  3. package/dist/ai-service/ai-studio.js.map +1 -1
  4. package/dist/ai-service/anthropic.js +49 -19
  5. package/dist/ai-service/anthropic.js.map +1 -1
  6. package/dist/ai-service/chat-gpt.js +28 -11
  7. package/dist/ai-service/chat-gpt.js.map +1 -1
  8. package/dist/ai-service/common.d.ts +5 -4
  9. package/dist/ai-service/common.js +3 -4
  10. package/dist/ai-service/common.js.map +1 -1
  11. package/dist/ai-service/common.test.js +1 -1
  12. package/dist/ai-service/vertex-ai-claude.js +1 -1
  13. package/dist/ai-service/vertex-ai-claude.js.map +1 -1
  14. package/dist/ai-service/vertex-ai.js +7 -1
  15. package/dist/ai-service/vertex-ai.js.map +1 -1
  16. package/dist/cli/cli-options.js +0 -12
  17. package/dist/cli/cli-options.js.map +1 -1
  18. package/dist/cli/cli-params.d.ts +0 -3
  19. package/dist/cli/cli-params.js +0 -9
  20. package/dist/cli/cli-params.js.map +1 -1
  21. package/dist/cli/validate-cli-params.js +1 -7
  22. package/dist/cli/validate-cli-params.js.map +1 -1
  23. package/dist/cli/validate-cli-params.test.js +1 -1
  24. package/dist/cli/validate-cli-params.test.js.map +1 -1
  25. package/dist/eval/codegen-summary.test.d.ts +1 -0
  26. package/dist/eval/codegen-summary.test.js +91 -0
  27. package/dist/eval/codegen-summary.test.js.map +1 -0
  28. package/dist/eval/current-prompt-plugin.d.ts +3 -0
  29. package/dist/eval/current-prompt-plugin.js +10 -0
  30. package/dist/eval/current-prompt-plugin.js.map +1 -0
  31. package/dist/eval/data/current-prompt.d.ts +73 -0
  32. package/dist/eval/data/current-prompt.js +104 -0
  33. package/dist/eval/data/current-prompt.js.map +1 -0
  34. package/dist/eval/data/prompt-assistant-image.d.ts +49 -0
  35. package/dist/eval/data/prompt-assistant-image.js +67 -0
  36. package/dist/eval/data/prompt-assistant-image.js.map +1 -0
  37. package/dist/eval/data/prompt3.d.ts +34 -0
  38. package/dist/eval/data/prompt3.js +71 -0
  39. package/dist/eval/data/prompt3.js.map +1 -0
  40. package/dist/eval/prompt-debug.test.d.ts +1 -0
  41. package/dist/eval/prompt-debug.test.js +71 -0
  42. package/dist/eval/prompt-debug.test.js.map +1 -0
  43. package/dist/eval/prompt2.d.ts +34 -0
  44. package/dist/eval/prompt2.js +125 -0
  45. package/dist/eval/prompt2.js.map +1 -0
  46. package/dist/files/read-files.d.ts +2 -2
  47. package/dist/files/read-files.js +13 -7
  48. package/dist/files/read-files.js.map +1 -1
  49. package/dist/files/read-files.test.js +12 -6
  50. package/dist/files/read-files.test.js.map +1 -1
  51. package/dist/files/source-code-tree.d.ts +12 -0
  52. package/dist/files/source-code-tree.js +27 -0
  53. package/dist/files/source-code-tree.js.map +1 -0
  54. package/dist/main/codegen-types.d.ts +7 -4
  55. package/dist/main/codegen.ai-services.test.d.ts +3 -0
  56. package/dist/main/codegen.ai-services.test.js +198 -0
  57. package/dist/main/codegen.ai-services.test.js.map +1 -0
  58. package/dist/main/codegen.cli-options.test.d.ts +3 -0
  59. package/dist/main/codegen.cli-options.test.js +171 -0
  60. package/dist/main/codegen.cli-options.test.js.map +1 -0
  61. package/dist/main/codegen.image-generation.test.d.ts +3 -0
  62. package/dist/main/codegen.image-generation.test.js +187 -0
  63. package/dist/main/codegen.image-generation.test.js.map +1 -0
  64. package/dist/main/codegen.js +2 -5
  65. package/dist/main/codegen.js.map +1 -1
  66. package/dist/main/codegen.test-utils.d.ts +81 -0
  67. package/dist/main/codegen.test-utils.js +88 -0
  68. package/dist/main/codegen.test-utils.js.map +1 -0
  69. package/dist/main/codegen.test.js +47 -28
  70. package/dist/main/codegen.test.js.map +1 -1
  71. package/dist/main/common/content-bus-types.d.ts +6 -0
  72. package/dist/main/common/content-bus.d.ts +2 -2
  73. package/dist/main/common/content-bus.js +3 -1
  74. package/dist/main/common/content-bus.js.map +1 -1
  75. package/dist/main/common/user-actions.d.ts +8 -2
  76. package/dist/main/common/user-actions.js.map +1 -1
  77. package/dist/main/interactive/codegen-interactive.js +0 -4
  78. package/dist/main/interactive/codegen-interactive.js.map +1 -1
  79. package/dist/main/interactive/codegen-interactive.test.js +0 -6
  80. package/dist/main/interactive/codegen-interactive.test.js.map +1 -1
  81. package/dist/main/interactive/common.d.ts +1 -1
  82. package/dist/main/interactive/common.js +0 -2
  83. package/dist/main/interactive/common.js.map +1 -1
  84. package/dist/main/interactive/configure.js +0 -2
  85. package/dist/main/interactive/configure.js.map +1 -1
  86. package/dist/main/interactive/help.js +0 -2
  87. package/dist/main/interactive/help.js.map +1 -1
  88. package/dist/main/interactive/task-file.js +1 -1
  89. package/dist/main/interactive/task-file.js.map +1 -1
  90. package/dist/main/interactive/text-prompt.js +1 -1
  91. package/dist/main/interactive/text-prompt.js.map +1 -1
  92. package/dist/main/interactive/user-action-handlers.js +4 -2
  93. package/dist/main/interactive/user-action-handlers.js.map +1 -1
  94. package/dist/main/plugin-loader.d.ts +2 -1
  95. package/dist/main/plugin-loader.js +8 -0
  96. package/dist/main/plugin-loader.js.map +1 -1
  97. package/dist/main/ui/backend/api.js +9 -3
  98. package/dist/main/ui/backend/api.js.map +1 -1
  99. package/dist/main/ui/backend/service.d.ts +2 -1
  100. package/dist/main/ui/backend/service.js +6 -3
  101. package/dist/main/ui/backend/service.js.map +1 -1
  102. package/dist/main/ui/frontend/assets/{index-Dk_qaEQg.js → index-5e3ykhy6.js} +129 -103
  103. package/dist/main/ui/frontend/index.html +1 -1
  104. package/dist/main/ui/user-action-handlers.js +1 -1
  105. package/dist/main/ui/user-action-handlers.js.map +1 -1
  106. package/dist/prompt/function-calling.js +8 -3
  107. package/dist/prompt/function-calling.js.map +1 -1
  108. package/dist/prompt/function-defs/ask-question.d.ts +5 -0
  109. package/dist/prompt/function-defs/ask-question.js +140 -60
  110. package/dist/prompt/function-defs/ask-question.js.map +1 -1
  111. package/dist/prompt/function-defs/codegen-planning.d.ts +8 -0
  112. package/dist/prompt/function-defs/codegen-planning.js +50 -0
  113. package/dist/prompt/function-defs/codegen-planning.js.map +1 -0
  114. package/dist/prompt/function-defs/codegen-summary.js +2 -2
  115. package/dist/prompt/function-defs/codegen-summary.js.map +1 -1
  116. package/dist/prompt/function-defs/get-source-code.js +32 -2
  117. package/dist/prompt/function-defs/get-source-code.js.map +1 -1
  118. package/dist/prompt/function-defs/optimize-context.js +35 -12
  119. package/dist/prompt/function-defs/optimize-context.js.map +1 -1
  120. package/dist/prompt/limits.js +2 -2
  121. package/dist/prompt/limits.js.map +1 -1
  122. package/dist/prompt/limits.test.js +3 -3
  123. package/dist/prompt/limits.test.js.map +1 -1
  124. package/dist/prompt/prompt-codegen.js +7 -79
  125. package/dist/prompt/prompt-codegen.js.map +1 -1
  126. package/dist/prompt/prompt-codegen.test.js +3 -10
  127. package/dist/prompt/prompt-codegen.test.js.map +1 -1
  128. package/dist/prompt/prompt-service-ask-question.test.js +26 -81
  129. package/dist/prompt/prompt-service-ask-question.test.js.map +1 -1
  130. package/dist/prompt/prompt-service.ai-services.test.d.ts +1 -0
  131. package/dist/prompt/prompt-service.ai-services.test.js +149 -0
  132. package/dist/prompt/prompt-service.ai-services.test.js.map +1 -0
  133. package/dist/prompt/prompt-service.context-optimization.test.d.ts +1 -0
  134. package/dist/prompt/prompt-service.context-optimization.test.js +212 -0
  135. package/dist/prompt/prompt-service.context-optimization.test.js.map +1 -0
  136. package/dist/prompt/prompt-service.image-handling.test.d.ts +1 -0
  137. package/dist/prompt/prompt-service.image-handling.test.js +212 -0
  138. package/dist/prompt/prompt-service.image-handling.test.js.map +1 -0
  139. package/dist/prompt/prompt-service.js +36 -29
  140. package/dist/prompt/prompt-service.js.map +1 -1
  141. package/dist/prompt/prompt-service.test-utils.d.ts +66 -0
  142. package/dist/prompt/prompt-service.test-utils.js +169 -0
  143. package/dist/prompt/prompt-service.test-utils.js.map +1 -0
  144. package/dist/prompt/prompt-service.test.js +96 -20
  145. package/dist/prompt/prompt-service.test.js.map +1 -1
  146. package/dist/prompt/prompt-service.validation-recovery.test.d.ts +1 -0
  147. package/dist/prompt/prompt-service.validation-recovery.test.js +263 -0
  148. package/dist/prompt/prompt-service.validation-recovery.test.js.map +1 -0
  149. package/dist/prompt/static-prompts.d.ts +16 -0
  150. package/dist/prompt/static-prompts.js +22 -0
  151. package/dist/prompt/static-prompts.js.map +1 -0
  152. package/dist/prompt/steps/step-ask-question/handlers/cancel-code-generation.js +1 -1
  153. package/dist/prompt/steps/step-ask-question/handlers/cancel-code-generation.js.map +1 -1
  154. package/dist/prompt/steps/step-ask-question/handlers/confirm-code-generation.d.ts +1 -1
  155. package/dist/prompt/steps/step-ask-question/handlers/confirm-code-generation.js +7 -4
  156. package/dist/prompt/steps/step-ask-question/handlers/confirm-code-generation.js.map +1 -1
  157. package/dist/prompt/steps/step-ask-question/handlers/context-optimization.js +6 -4
  158. package/dist/prompt/steps/step-ask-question/handlers/context-optimization.js.map +1 -1
  159. package/dist/prompt/steps/step-ask-question/handlers/default-action.js +1 -2
  160. package/dist/prompt/steps/step-ask-question/handlers/default-action.js.map +1 -1
  161. package/dist/prompt/steps/step-ask-question/handlers/handle-request-answer-with-image.d.ts +2 -0
  162. package/dist/prompt/steps/step-ask-question/handlers/handle-request-answer-with-image.js +86 -0
  163. package/dist/prompt/steps/step-ask-question/handlers/handle-request-answer-with-image.js.map +1 -0
  164. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message-with-image.d.ts +2 -0
  165. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message-with-image.js +103 -0
  166. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message-with-image.js.map +1 -0
  167. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message.d.ts +2 -0
  168. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message.js +22 -0
  169. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message.js.map +1 -0
  170. package/dist/prompt/steps/step-ask-question/handlers/handler-utils.d.ts +0 -0
  171. package/dist/prompt/steps/step-ask-question/handlers/handler-utils.js +2 -0
  172. package/dist/prompt/steps/step-ask-question/handlers/handler-utils.js.map +1 -0
  173. package/dist/prompt/steps/step-ask-question/handlers/remove-files-from-context.d.ts +1 -1
  174. package/dist/prompt/steps/step-ask-question/handlers/remove-files-from-context.js +58 -13
  175. package/dist/prompt/steps/step-ask-question/handlers/remove-files-from-context.js.map +1 -1
  176. package/dist/prompt/steps/step-ask-question/handlers/request-files-content.d.ts +1 -1
  177. package/dist/prompt/steps/step-ask-question/handlers/request-files-content.js +110 -10
  178. package/dist/prompt/steps/step-ask-question/handlers/request-files-content.js.map +1 -1
  179. package/dist/prompt/steps/step-ask-question/handlers/request-permissions.d.ts +1 -1
  180. package/dist/prompt/steps/step-ask-question/handlers/request-permissions.js +49 -24
  181. package/dist/prompt/steps/step-ask-question/handlers/request-permissions.js.map +1 -1
  182. package/dist/prompt/steps/step-ask-question/handlers/start-code-generation.js +1 -1
  183. package/dist/prompt/steps/step-ask-question/handlers/start-code-generation.js.map +1 -1
  184. package/dist/prompt/steps/step-ask-question/step-ask-question-reflect.js +1 -0
  185. package/dist/prompt/steps/step-ask-question/step-ask-question-reflect.js.map +1 -1
  186. package/dist/prompt/steps/step-ask-question/step-ask-question-types.d.ts +22 -19
  187. package/dist/prompt/steps/step-ask-question/step-ask-question.d.ts +2 -4
  188. package/dist/prompt/steps/step-ask-question/step-ask-question.js +18 -29
  189. package/dist/prompt/steps/step-ask-question/step-ask-question.js.map +1 -1
  190. package/dist/prompt/steps/step-codegen-planning.d.ts +10 -0
  191. package/dist/prompt/steps/step-codegen-planning.js +69 -0
  192. package/dist/prompt/steps/step-codegen-planning.js.map +1 -0
  193. package/dist/prompt/steps/step-context-optimization.js +110 -80
  194. package/dist/prompt/steps/step-context-optimization.js.map +1 -1
  195. package/dist/prompt/steps/step-context-optimization.test.d.ts +2 -0
  196. package/dist/prompt/steps/step-context-optimization.test.js +456 -0
  197. package/dist/prompt/steps/step-context-optimization.test.js.map +1 -0
  198. package/dist/prompt/steps/step-generate-image.d.ts +8 -1
  199. package/dist/prompt/steps/step-generate-image.js +1 -0
  200. package/dist/prompt/steps/step-generate-image.js.map +1 -1
  201. package/dist/prompt/steps/step-summarization.d.ts +0 -1
  202. package/dist/prompt/steps/step-summarization.js +6 -3
  203. package/dist/prompt/steps/step-summarization.js.map +1 -1
  204. package/dist/prompt/steps/step-validate-recover.js +24 -15
  205. package/dist/prompt/steps/step-validate-recover.js.map +1 -1
  206. package/dist/prompt/systemprompt.d.ts +2 -2
  207. package/dist/prompt/systemprompt.js +74 -176
  208. package/dist/prompt/systemprompt.js.map +1 -1
  209. package/dist/prompt/systemprompt.test.js +2 -3
  210. package/dist/prompt/systemprompt.test.js.map +1 -1
  211. package/dist/vite-genaicode/vite-genaicode-plugin.js +0 -2
  212. package/dist/vite-genaicode/vite-genaicode-plugin.js.map +1 -1
  213. package/package.json +1 -1
@@ -0,0 +1,198 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { runCodegen } from './codegen.js';
3
+ import * as vertexAi from '../ai-service/vertex-ai.js';
4
+ import * as chatGpt from '../ai-service/chat-gpt.js';
5
+ import * as anthropic from '../ai-service/anthropic.js';
6
+ import * as vertexAiClaude from '../ai-service/vertex-ai-claude.js';
7
+ import * as updateFiles from '../files/update-files.js';
8
+ import * as cliParams from '../cli/cli-params.js';
9
+ import '../files/find-files.js';
10
+ import '../files/cache-file.js';
11
+ import './config.js';
12
+ import { createMockPlanningResponse, createMockCodegenSummary, createMockFileUpdate, createMockResponseSequence, } from './codegen.test-utils.js';
13
+ // Mock all required modules
14
+ vi.mock('../cli/cli-params.js', () => ({
15
+ interactive: false,
16
+ ui: false,
17
+ uiPort: 1337,
18
+ disableExplanations: true,
19
+ explicitPrompt: false,
20
+ allowFileCreate: false,
21
+ allowFileDelete: false,
22
+ allowDirectoryCreate: false,
23
+ allowFileMove: false,
24
+ verbosePrompt: false,
25
+ vertexAiClaude: false,
26
+ helpRequested: false,
27
+ aiStudio: false,
28
+ vision: false,
29
+ imagen: false,
30
+ temperature: 0.7,
31
+ cheap: false,
32
+ taskFile: undefined,
33
+ disableInitialLint: undefined,
34
+ askQuestion: false,
35
+ disableContextOptimization: true,
36
+ geminiBlockNone: undefined,
37
+ contentMask: undefined,
38
+ ignorePatterns: [],
39
+ disableCache: undefined,
40
+ disableAiServiceFallback: undefined,
41
+ disableHistory: true,
42
+ disableConversationSummary: true,
43
+ aiService: undefined,
44
+ dryRun: false,
45
+ }));
46
+ vi.mock('../ai-service/vertex-ai.js', () => ({ generateContent: vi.fn() }));
47
+ vi.mock('../ai-service/chat-gpt.js', () => ({ generateContent: vi.fn() }));
48
+ vi.mock('../ai-service/anthropic.js', () => ({ generateContent: vi.fn() }));
49
+ vi.mock('../ai-service/vertex-ai-claude.js', () => ({ generateContent: vi.fn() }));
50
+ vi.mock('../files/update-files.js');
51
+ vi.mock('../files/cache-file.js');
52
+ vi.mock('../files/find-files.js', () => ({
53
+ getSourceFiles: () => [],
54
+ getImageAssetFiles: () => [],
55
+ refreshFiles: () => null,
56
+ }));
57
+ vi.mock('./config.js', () => ({
58
+ rootDir: '/mocked/root/dir',
59
+ rcConfig: {
60
+ rootDir: '/mocked/root/dir',
61
+ extensions: ['.js', '.ts', '.tsx', '.jsx'],
62
+ },
63
+ importantContext: {},
64
+ }));
65
+ describe('AI Services Integration', () => {
66
+ beforeEach(() => {
67
+ vi.resetAllMocks();
68
+ vi.mocked(cliParams).aiService = undefined;
69
+ vi.mocked(cliParams).dryRun = false;
70
+ vi.mocked(cliParams).helpRequested = false;
71
+ vi.mocked(cliParams).vision = false;
72
+ vi.mocked(cliParams).imagen = undefined;
73
+ vi.mocked(cliParams).cheap = false;
74
+ vi.mocked(cliParams).temperature = 0.7;
75
+ vi.mocked(cliParams).explicitPrompt = 'test';
76
+ });
77
+ describe('Vertex AI', () => {
78
+ it('should run codegen with Vertex AI by default', async () => {
79
+ vi.mocked(cliParams).aiService = 'vertex-ai';
80
+ const mockPlanning = createMockPlanningResponse('Test analysis for Vertex AI', 'Update test.js file', [
81
+ { filePath: '/mocked/root/dir/test.js', reason: 'Test update' },
82
+ ]);
83
+ const mockSummary = createMockCodegenSummary([{ filePath: '/mocked/root/dir/test.js', updateToolName: 'updateFile', prompt: 'Update file content' }], [], 'Test file update');
84
+ const mockUpdate = createMockFileUpdate('updateFile', {
85
+ filePath: '/mocked/root/dir/test.js',
86
+ newContent: 'console.log("Hello");',
87
+ });
88
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockUpdate]);
89
+ mockSequence.forEach((response) => {
90
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(response);
91
+ });
92
+ await runCodegen();
93
+ // Verify all phases were called
94
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
95
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockUpdate, expect.anything());
96
+ });
97
+ });
98
+ describe('ChatGPT', () => {
99
+ it('should run codegen with ChatGPT when specified', async () => {
100
+ vi.mocked(cliParams).aiService = 'chat-gpt';
101
+ const mockPlanning = createMockPlanningResponse('Test analysis for ChatGPT', 'Create new.js file', [
102
+ { filePath: '/mocked/root/dir/new.js', reason: 'New file creation' },
103
+ ]);
104
+ const mockSummary = createMockCodegenSummary([{ filePath: '/mocked/root/dir/new.js', updateToolName: 'createFile', prompt: 'Create new file' }], [], 'Create new test file');
105
+ const mockCreate = createMockFileUpdate('createFile', {
106
+ filePath: '/mocked/root/dir/new.js',
107
+ newContent: 'const x = 5;',
108
+ });
109
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockCreate]);
110
+ mockSequence.forEach((response) => {
111
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(response);
112
+ });
113
+ await runCodegen();
114
+ expect(chatGpt.generateContent).toHaveBeenCalledTimes(3);
115
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockCreate, expect.anything());
116
+ });
117
+ });
118
+ describe('Anthropic', () => {
119
+ it('should run codegen with Anthropic when specified', async () => {
120
+ vi.mocked(cliParams).aiService = 'anthropic';
121
+ const mockPlanning = createMockPlanningResponse('Test analysis for Anthropic', 'Delete obsolete.js file', [
122
+ { filePath: '/mocked/root/dir/obsolete.js', reason: 'File removal' },
123
+ ]);
124
+ const mockSummary = createMockCodegenSummary([{ filePath: '/mocked/root/dir/obsolete.js', updateToolName: 'deleteFile', prompt: 'Remove obsolete file' }], [], 'Remove test file');
125
+ const mockDelete = createMockFileUpdate('deleteFile', {
126
+ filePath: '/mocked/root/dir/obsolete.js',
127
+ });
128
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockDelete]);
129
+ mockSequence.forEach((response) => {
130
+ vi.mocked(anthropic.generateContent).mockResolvedValueOnce(response);
131
+ });
132
+ await runCodegen();
133
+ expect(anthropic.generateContent).toHaveBeenCalledTimes(3);
134
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockDelete, expect.anything());
135
+ });
136
+ });
137
+ describe('Vertex AI Claude', () => {
138
+ it('should run codegen with Vertex AI Claude when specified', async () => {
139
+ vi.mocked(cliParams).aiService = 'vertex-ai-claude';
140
+ const mockPlanning = createMockPlanningResponse('Test analysis for Vertex AI Claude', 'Update test.js with Claude', [{ filePath: '/mocked/root/dir/test.js', reason: 'Claude test update' }]);
141
+ const mockSummary = createMockCodegenSummary([{ filePath: '/mocked/root/dir/test.js', updateToolName: 'updateFile', prompt: 'Update with Claude' }], [], 'Claude test update');
142
+ const mockUpdate = createMockFileUpdate('updateFile', {
143
+ filePath: '/mocked/root/dir/test.js',
144
+ newContent: 'console.log("Hello from Claude");',
145
+ });
146
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockUpdate]);
147
+ mockSequence.forEach((response) => {
148
+ vi.mocked(vertexAiClaude.generateContent).mockResolvedValueOnce(response);
149
+ });
150
+ await runCodegen();
151
+ expect(vertexAiClaude.generateContent).toHaveBeenCalledTimes(3);
152
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockUpdate, expect.anything());
153
+ });
154
+ });
155
+ describe('AI Service Parameters', () => {
156
+ it('should pass the temperature parameter to the AI service', async () => {
157
+ vi.mocked(cliParams).aiService = 'vertex-ai';
158
+ vi.mocked(cliParams).temperature = 0.5;
159
+ const mockPlanning = createMockPlanningResponse();
160
+ const mockSummary = createMockCodegenSummary();
161
+ const mockUpdate = createMockFileUpdate('updateFile', {
162
+ filePath: 'test.js',
163
+ newContent: 'console.log("Temperature test");',
164
+ });
165
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockUpdate]);
166
+ mockSequence.forEach((response) => {
167
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(response);
168
+ });
169
+ await runCodegen();
170
+ // Verify temperature parameter in each call
171
+ const calls = vi.mocked(vertexAi.generateContent).mock.calls;
172
+ calls.forEach((call) => {
173
+ expect(call[3]).toBe(0.5); // temperature parameter
174
+ });
175
+ });
176
+ it('should pass the cheap parameter to the AI service when --cheap flag is true', async () => {
177
+ vi.mocked(cliParams).aiService = 'vertex-ai';
178
+ vi.mocked(cliParams).cheap = true;
179
+ const mockPlanning = createMockPlanningResponse();
180
+ const mockSummary = createMockCodegenSummary();
181
+ const mockUpdate = createMockFileUpdate('updateFile', {
182
+ filePath: 'test.js',
183
+ newContent: 'console.log("Cheap test");',
184
+ });
185
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockUpdate]);
186
+ mockSequence.forEach((response) => {
187
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(response);
188
+ });
189
+ await runCodegen();
190
+ // Verify cheap parameter in each call
191
+ const calls = vi.mocked(vertexAi.generateContent).mock.calls;
192
+ calls.forEach((call) => {
193
+ expect(call[4]).toBe(true); // cheap parameter
194
+ });
195
+ });
196
+ });
197
+ });
198
+ //# sourceMappingURL=codegen.ai-services.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.ai-services.test.js","sourceRoot":"","sources":["../../src/main/codegen.ai-services.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import '../files/find-files.js';
2
+ import '../files/cache-file.js';
3
+ import './config.js';
@@ -0,0 +1,171 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { runCodegen } from './codegen.js';
3
+ import * as vertexAi from '../ai-service/vertex-ai.js';
4
+ import * as updateFiles from '../files/update-files.js';
5
+ import * as cliParams from '../cli/cli-params.js';
6
+ import * as cliOptions from '../cli/cli-options.js';
7
+ import '../files/find-files.js';
8
+ import '../files/cache-file.js';
9
+ import './config.js';
10
+ import { createMockPlanningResponse, createMockCodegenSummary, createMockFileUpdate, createMockResponseSequence, } from './codegen.test-utils.js';
11
+ import { rcConfig } from './config.js';
12
+ // Mock all required modules
13
+ vi.mock('../cli/cli-params.js', () => ({
14
+ interactive: false,
15
+ ui: false,
16
+ uiPort: 1337,
17
+ disableExplanations: true,
18
+ explicitPrompt: false,
19
+ allowFileCreate: false,
20
+ allowFileDelete: false,
21
+ allowDirectoryCreate: false,
22
+ allowFileMove: false,
23
+ verbosePrompt: false,
24
+ vertexAiClaude: false,
25
+ helpRequested: false,
26
+ aiStudio: false,
27
+ vision: false,
28
+ imagen: false,
29
+ temperature: 0.7,
30
+ cheap: false,
31
+ taskFile: undefined,
32
+ disableInitialLint: undefined,
33
+ askQuestion: false,
34
+ disableContextOptimization: true,
35
+ geminiBlockNone: undefined,
36
+ contentMask: undefined,
37
+ ignorePatterns: [],
38
+ disableCache: undefined,
39
+ disableAiServiceFallback: undefined,
40
+ disableHistory: true,
41
+ disableConversationSummary: true,
42
+ aiService: undefined,
43
+ dryRun: false,
44
+ }));
45
+ vi.mock('../ai-service/vertex-ai.js', () => ({ generateContent: vi.fn() }));
46
+ vi.mock('../files/update-files.js');
47
+ vi.mock('../files/cache-file.js');
48
+ vi.mock('../cli/cli-options.js', () => ({
49
+ printHelpMessage: vi.fn(),
50
+ }));
51
+ vi.mock('../files/find-files.js', () => ({
52
+ getSourceFiles: () => [],
53
+ getImageAssetFiles: () => [],
54
+ refreshFiles: () => null,
55
+ }));
56
+ vi.mock('./config.js', () => ({
57
+ rootDir: '/mocked/root/dir',
58
+ rcConfig: {
59
+ rootDir: '/mocked/root/dir',
60
+ extensions: ['.js', '.ts', '.tsx', '.jsx'],
61
+ lintCommand: 'echo "mock lint"',
62
+ },
63
+ importantContext: {},
64
+ }));
65
+ describe('CLI Options', () => {
66
+ beforeEach(() => {
67
+ vi.resetAllMocks();
68
+ // Reset CLI parameters to default values
69
+ vi.mocked(cliParams).aiService = undefined;
70
+ vi.mocked(cliParams).disableInitialLint = true;
71
+ vi.mocked(cliParams).dryRun = false;
72
+ vi.mocked(cliParams).helpRequested = false;
73
+ vi.mocked(cliParams).vision = false;
74
+ vi.mocked(cliParams).imagen = undefined;
75
+ vi.mocked(cliParams).cheap = false;
76
+ vi.mocked(cliParams).temperature = 0.7;
77
+ vi.mocked(cliParams).explicitPrompt = 'test';
78
+ });
79
+ describe('Help Option', () => {
80
+ it('should print help message and not run codegen when --help option is provided', async () => {
81
+ vi.mocked(cliParams).helpRequested = true;
82
+ await runCodegen();
83
+ expect(cliOptions.printHelpMessage).toHaveBeenCalled();
84
+ expect(vertexAi.generateContent).not.toHaveBeenCalled();
85
+ expect(updateFiles.updateFiles).not.toHaveBeenCalled();
86
+ });
87
+ });
88
+ describe('Dry Run Mode', () => {
89
+ it('should not update files in dry run mode but should still plan and analyze', async () => {
90
+ vi.mocked(cliParams).dryRun = true;
91
+ vi.mocked(cliParams).aiService = 'vertex-ai';
92
+ const mockPlanning = createMockPlanningResponse('Test analysis for dry run', 'Update test.js file', [
93
+ { filePath: '/mocked/root/dir/test.js', reason: 'Test update' },
94
+ ]);
95
+ const mockSummary = createMockCodegenSummary([{ filePath: '/mocked/root/dir/test.js', updateToolName: 'updateFile', prompt: 'Update file content' }], [], 'Test file update');
96
+ const mockUpdate = createMockFileUpdate('updateFile', {
97
+ filePath: '/mocked/root/dir/test.js',
98
+ newContent: 'console.log("Dry run");',
99
+ });
100
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockUpdate]);
101
+ mockSequence.forEach((response) => {
102
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(response);
103
+ });
104
+ await runCodegen();
105
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
106
+ expect(updateFiles.updateFiles).not.toHaveBeenCalled();
107
+ });
108
+ });
109
+ describe('Temperature Setting', () => {
110
+ it('should use custom temperature value when specified', async () => {
111
+ vi.mocked(cliParams).temperature = 0.3;
112
+ vi.mocked(cliParams).aiService = 'vertex-ai';
113
+ const mockPlanning = createMockPlanningResponse('Test analysis with custom temperature', 'Update test.js file', [
114
+ { filePath: '/mocked/root/dir/test.js', reason: 'Temperature test' },
115
+ ]);
116
+ const mockSummary = createMockCodegenSummary([
117
+ {
118
+ filePath: '/mocked/root/dir/test.js',
119
+ updateToolName: 'updateFile',
120
+ prompt: 'Update with custom temperature',
121
+ },
122
+ ], [], 'Temperature test update');
123
+ const mockUpdate = createMockFileUpdate('updateFile', {
124
+ filePath: '/mocked/root/dir/test.js',
125
+ newContent: 'console.log("Custom temperature");',
126
+ });
127
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockUpdate]);
128
+ mockSequence.forEach((response) => {
129
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(response);
130
+ });
131
+ await runCodegen();
132
+ const calls = vi.mocked(vertexAi.generateContent).mock.calls;
133
+ calls.forEach((call) => {
134
+ expect(call[3]).toBe(0.3); // Check temperature parameter
135
+ });
136
+ });
137
+ });
138
+ describe('Context Optimization', () => {
139
+ it('should respect disableContextOptimization flag', async () => {
140
+ vi.mocked(cliParams).disableContextOptimization = false;
141
+ vi.mocked(cliParams).aiService = 'vertex-ai';
142
+ vi.mocked(rcConfig).lintCommand = undefined;
143
+ const mockPlanning = createMockPlanningResponse('Test analysis with context optimization', 'Update test.js file', [{ filePath: '/mocked/root/dir/test.js', reason: 'Context optimization test' }]);
144
+ const mockSummary = createMockCodegenSummary([{ filePath: '/mocked/root/dir/test.js', updateToolName: 'updateFile', prompt: 'Update with optimization' }], ['/mocked/root/dir/context.js'], // Additional context paths
145
+ 'Context optimization test');
146
+ const mockUpdate = createMockFileUpdate('updateFile', {
147
+ filePath: '/mocked/root/dir/test.js',
148
+ newContent: 'console.log("Optimized context");',
149
+ });
150
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockUpdate]);
151
+ mockSequence.forEach((response) => {
152
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(response);
153
+ });
154
+ await runCodegen();
155
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
156
+ // Check if context paths were included in the call
157
+ const calls = vi.mocked(vertexAi.generateContent).mock.calls;
158
+ expect(calls[1][0]).toEqual(expect.arrayContaining([
159
+ expect.objectContaining({
160
+ type: 'user',
161
+ functionResponses: expect.arrayContaining([
162
+ expect.objectContaining({
163
+ name: 'getSourceCode',
164
+ }),
165
+ ]),
166
+ }),
167
+ ]));
168
+ });
169
+ });
170
+ });
171
+ //# sourceMappingURL=codegen.cli-options.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.cli-options.test.js","sourceRoot":"","sources":["../../src/main/codegen.cli-options.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import '../files/find-files.js';
2
+ import '../files/cache-file.js';
3
+ import './config.js';
@@ -0,0 +1,187 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { runCodegen } from './codegen.js';
3
+ import * as vertexAi from '../ai-service/vertex-ai.js';
4
+ import * as chatGpt from '../ai-service/chat-gpt.js';
5
+ import * as vertexAiImagen from '../ai-service/vertex-ai-imagen.js';
6
+ import * as dallE from '../ai-service/dall-e.js';
7
+ import * as updateFiles from '../files/update-files.js';
8
+ import * as cliParams from '../cli/cli-params.js';
9
+ import '../files/find-files.js';
10
+ import '../files/cache-file.js';
11
+ import './config.js';
12
+ import { createMockPlanningResponse, createMockCodegenSummary, createMockImageGenerationResponse, createMockResponseSequence, } from './codegen.test-utils.js';
13
+ // Mock all required modules
14
+ vi.mock('../cli/cli-params.js', () => ({
15
+ interactive: false,
16
+ ui: false,
17
+ uiPort: 1337,
18
+ disableExplanations: true,
19
+ explicitPrompt: false,
20
+ allowFileCreate: false,
21
+ allowFileDelete: false,
22
+ allowDirectoryCreate: false,
23
+ allowFileMove: false,
24
+ verbosePrompt: false,
25
+ vertexAiClaude: false,
26
+ helpRequested: false,
27
+ aiStudio: false,
28
+ vision: false,
29
+ imagen: false,
30
+ temperature: 0.7,
31
+ cheap: false,
32
+ taskFile: undefined,
33
+ disableInitialLint: undefined,
34
+ askQuestion: false,
35
+ disableContextOptimization: true,
36
+ geminiBlockNone: undefined,
37
+ contentMask: undefined,
38
+ ignorePatterns: [],
39
+ disableCache: undefined,
40
+ disableAiServiceFallback: undefined,
41
+ disableHistory: true,
42
+ disableConversationSummary: true,
43
+ aiService: undefined,
44
+ dryRun: false,
45
+ }));
46
+ vi.mock('../ai-service/vertex-ai.js', () => ({ generateContent: vi.fn() }));
47
+ vi.mock('../ai-service/chat-gpt.js', () => ({ generateContent: vi.fn() }));
48
+ vi.mock('../ai-service/vertex-ai-imagen.js', () => ({ generateImage: vi.fn() }));
49
+ vi.mock('../ai-service/dall-e.js', () => ({ generateImage: vi.fn() }));
50
+ vi.mock('../files/update-files.js');
51
+ vi.mock('../files/cache-file.js');
52
+ vi.mock('../files/find-files.js', () => ({
53
+ getSourceFiles: () => [],
54
+ getImageAssetFiles: () => [],
55
+ refreshFiles: () => null,
56
+ }));
57
+ vi.mock('./config.js', () => ({
58
+ rootDir: '/mocked/root/dir',
59
+ rcConfig: {
60
+ rootDir: '/mocked/root/dir',
61
+ extensions: ['.js', '.ts', '.tsx', '.jsx'],
62
+ },
63
+ importantContext: {},
64
+ }));
65
+ describe('Image Generation', () => {
66
+ beforeEach(() => {
67
+ vi.resetAllMocks();
68
+ // Reset CLI parameters to default values
69
+ vi.mocked(cliParams).aiService = undefined;
70
+ vi.mocked(cliParams).dryRun = false;
71
+ vi.mocked(cliParams).helpRequested = false;
72
+ vi.mocked(cliParams).vision = false;
73
+ vi.mocked(cliParams).imagen = undefined;
74
+ vi.mocked(cliParams).cheap = false;
75
+ vi.mocked(cliParams).temperature = 0.7;
76
+ vi.mocked(cliParams).explicitPrompt = 'test';
77
+ });
78
+ describe('Vertex AI Imagen', () => {
79
+ it('should use Vertex AI Imagen when imagen flag is set to vertex-ai', async () => {
80
+ vi.mocked(cliParams).imagen = 'vertex-ai';
81
+ vi.mocked(cliParams).aiService = 'vertex-ai';
82
+ const mockPlanning = createMockPlanningResponse('Test analysis for Vertex AI Imagen', 'Generate landscape image', [{ filePath: '/mocked/root/dir/landscape.png', reason: 'Generate test image' }]);
83
+ const mockSummary = createMockCodegenSummary([
84
+ {
85
+ filePath: '/mocked/root/dir/landscape.png',
86
+ updateToolName: 'generateImage',
87
+ prompt: 'Generate image',
88
+ },
89
+ ], [], 'Mock summary with image generation');
90
+ const mockGenerate = createMockImageGenerationResponse('A beautiful landscape', '/mocked/root/dir/landscape.png', 512, 512, 'Generate a beautiful landscape image');
91
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockGenerate]);
92
+ mockSequence.forEach((response) => {
93
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(response);
94
+ });
95
+ vi.mocked(vertexAiImagen.generateImage).mockResolvedValueOnce('mocked-image-data');
96
+ await runCodegen();
97
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
98
+ expect(vertexAiImagen.generateImage).toHaveBeenCalledWith('A beautiful landscape', undefined, {
99
+ height: 512,
100
+ width: 512,
101
+ }, false);
102
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockGenerate, expect.anything());
103
+ });
104
+ it('should pass the cheap parameter to Vertex AI Imagen when --cheap flag is true', async () => {
105
+ vi.mocked(cliParams).imagen = 'vertex-ai';
106
+ vi.mocked(cliParams).aiService = 'vertex-ai';
107
+ vi.mocked(cliParams).cheap = true;
108
+ const mockPlanning = createMockPlanningResponse('Test analysis for cheap Vertex AI Imagen', 'Generate small landscape image', [{ filePath: '/mocked/root/dir/landscape.png', reason: 'Generate small test image' }]);
109
+ const mockSummary = createMockCodegenSummary([
110
+ {
111
+ filePath: '/mocked/root/dir/landscape.png',
112
+ updateToolName: 'generateImage',
113
+ prompt: 'Generate small image',
114
+ },
115
+ ], [], 'Mock summary with cheap image generation');
116
+ const mockGenerate = createMockImageGenerationResponse('A simple landscape', '/mocked/root/dir/landscape.png', 256, 256, 'Generate a simple landscape image');
117
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockGenerate]);
118
+ mockSequence.forEach((response) => {
119
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(response);
120
+ });
121
+ vi.mocked(vertexAiImagen.generateImage).mockResolvedValueOnce('mocked-cheap-image-data');
122
+ await runCodegen();
123
+ expect(vertexAiImagen.generateImage).toHaveBeenCalledWith('A simple landscape', undefined, {
124
+ height: 256,
125
+ width: 256,
126
+ }, false);
127
+ });
128
+ });
129
+ describe('DALL-E', () => {
130
+ it('should use DALL-E when imagen flag is set to dall-e', async () => {
131
+ vi.mocked(cliParams).imagen = 'dall-e';
132
+ vi.mocked(cliParams).aiService = 'chat-gpt';
133
+ const mockPlanning = createMockPlanningResponse('Test analysis for DALL-E', 'Generate city image', [
134
+ { filePath: '/mocked/root/dir/city.png', reason: 'Generate test image' },
135
+ ]);
136
+ const mockSummary = createMockCodegenSummary([
137
+ {
138
+ filePath: '/mocked/root/dir/city.png',
139
+ updateToolName: 'generateImage',
140
+ prompt: 'Generate image',
141
+ },
142
+ ], [], 'Mock summary with image generation');
143
+ const mockGenerate = createMockImageGenerationResponse('A futuristic city', '/mocked/root/dir/city.png', 1024, 1024, 'Generate a futuristic city image');
144
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockGenerate]);
145
+ mockSequence.forEach((response) => {
146
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(response);
147
+ });
148
+ vi.mocked(dallE.generateImage).mockResolvedValueOnce('mocked-image-data');
149
+ await runCodegen();
150
+ expect(chatGpt.generateContent).toHaveBeenCalledTimes(3);
151
+ expect(dallE.generateImage).toHaveBeenCalledWith('A futuristic city', undefined, {
152
+ width: 1024,
153
+ height: 1024,
154
+ }, false);
155
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockGenerate, expect.anything());
156
+ });
157
+ });
158
+ describe('Error Handling', () => {
159
+ it('should throw an error when imagen flag is set but no AI service is specified', async () => {
160
+ vi.mocked(cliParams).imagen = 'vertex-ai';
161
+ vi.mocked(cliParams).aiService = undefined;
162
+ await expect(runCodegen()).rejects.toThrow('Please specify which AI service should be used');
163
+ });
164
+ it('should handle image generation errors gracefully', async () => {
165
+ vi.mocked(cliParams).imagen = 'vertex-ai';
166
+ vi.mocked(cliParams).aiService = 'vertex-ai';
167
+ const mockPlanning = createMockPlanningResponse();
168
+ const mockSummary = createMockCodegenSummary([
169
+ {
170
+ filePath: '/mocked/root/dir/error.png',
171
+ updateToolName: 'generateImage',
172
+ prompt: 'Generate error image',
173
+ },
174
+ ], [], 'Mock summary with error');
175
+ const mockGenerate = createMockImageGenerationResponse('Error image', '/mocked/root/dir/error.png');
176
+ const mockSequence = createMockResponseSequence(mockPlanning, mockSummary, [mockGenerate]);
177
+ mockSequence.forEach((response) => {
178
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(response);
179
+ });
180
+ vi.mocked(vertexAiImagen.generateImage).mockRejectedValueOnce(new Error('Generation failed'));
181
+ await runCodegen();
182
+ expect(vertexAiImagen.generateImage).toHaveBeenCalled();
183
+ // The error should be caught and handled without breaking the test
184
+ });
185
+ });
186
+ });
187
+ //# sourceMappingURL=codegen.image-generation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.image-generation.test.js","sourceRoot":"","sources":["../../src/main/codegen.image-generation.test.ts"],"names":[],"mappings":"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"}