genaicode 0.6.0 → 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 (217) hide show
  1. package/README.md +1 -3
  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 +9 -4
  55. package/dist/main/codegen-utils.d.ts +1 -1
  56. package/dist/main/codegen-utils.js +1 -3
  57. package/dist/main/codegen-utils.js.map +1 -1
  58. package/dist/main/codegen.ai-services.test.d.ts +3 -0
  59. package/dist/main/codegen.ai-services.test.js +198 -0
  60. package/dist/main/codegen.ai-services.test.js.map +1 -0
  61. package/dist/main/codegen.cli-options.test.d.ts +3 -0
  62. package/dist/main/codegen.cli-options.test.js +171 -0
  63. package/dist/main/codegen.cli-options.test.js.map +1 -0
  64. package/dist/main/codegen.image-generation.test.d.ts +3 -0
  65. package/dist/main/codegen.image-generation.test.js +187 -0
  66. package/dist/main/codegen.image-generation.test.js.map +1 -0
  67. package/dist/main/codegen.js +4 -7
  68. package/dist/main/codegen.js.map +1 -1
  69. package/dist/main/codegen.test-utils.d.ts +81 -0
  70. package/dist/main/codegen.test-utils.js +88 -0
  71. package/dist/main/codegen.test-utils.js.map +1 -0
  72. package/dist/main/codegen.test.js +47 -28
  73. package/dist/main/codegen.test.js.map +1 -1
  74. package/dist/main/common/content-bus-types.d.ts +6 -0
  75. package/dist/main/common/content-bus.d.ts +2 -2
  76. package/dist/main/common/content-bus.js +3 -1
  77. package/dist/main/common/content-bus.js.map +1 -1
  78. package/dist/main/common/user-actions.d.ts +8 -2
  79. package/dist/main/common/user-actions.js.map +1 -1
  80. package/dist/main/interactive/codegen-interactive.js +0 -4
  81. package/dist/main/interactive/codegen-interactive.js.map +1 -1
  82. package/dist/main/interactive/codegen-interactive.test.js +0 -6
  83. package/dist/main/interactive/codegen-interactive.test.js.map +1 -1
  84. package/dist/main/interactive/common.d.ts +1 -1
  85. package/dist/main/interactive/common.js +0 -2
  86. package/dist/main/interactive/common.js.map +1 -1
  87. package/dist/main/interactive/configure.js +0 -2
  88. package/dist/main/interactive/configure.js.map +1 -1
  89. package/dist/main/interactive/help.js +0 -2
  90. package/dist/main/interactive/help.js.map +1 -1
  91. package/dist/main/interactive/task-file.js +1 -1
  92. package/dist/main/interactive/task-file.js.map +1 -1
  93. package/dist/main/interactive/text-prompt.js +1 -1
  94. package/dist/main/interactive/text-prompt.js.map +1 -1
  95. package/dist/main/interactive/user-action-handlers.js +4 -2
  96. package/dist/main/interactive/user-action-handlers.js.map +1 -1
  97. package/dist/main/plugin-loader.d.ts +2 -1
  98. package/dist/main/plugin-loader.js +8 -0
  99. package/dist/main/plugin-loader.js.map +1 -1
  100. package/dist/main/ui/backend/api.js +9 -3
  101. package/dist/main/ui/backend/api.js.map +1 -1
  102. package/dist/main/ui/backend/service.d.ts +2 -1
  103. package/dist/main/ui/backend/service.js +6 -3
  104. package/dist/main/ui/backend/service.js.map +1 -1
  105. package/dist/main/ui/frontend/assets/{index-Dk_qaEQg.js → index-5e3ykhy6.js} +129 -103
  106. package/dist/main/ui/frontend/index.html +1 -1
  107. package/dist/main/ui/user-action-handlers.js +1 -1
  108. package/dist/main/ui/user-action-handlers.js.map +1 -1
  109. package/dist/prompt/function-calling.js +8 -3
  110. package/dist/prompt/function-calling.js.map +1 -1
  111. package/dist/prompt/function-defs/ask-question.d.ts +5 -0
  112. package/dist/prompt/function-defs/ask-question.js +140 -60
  113. package/dist/prompt/function-defs/ask-question.js.map +1 -1
  114. package/dist/prompt/function-defs/codegen-planning.d.ts +8 -0
  115. package/dist/prompt/function-defs/codegen-planning.js +50 -0
  116. package/dist/prompt/function-defs/codegen-planning.js.map +1 -0
  117. package/dist/prompt/function-defs/codegen-summary.js +2 -2
  118. package/dist/prompt/function-defs/codegen-summary.js.map +1 -1
  119. package/dist/prompt/function-defs/get-source-code.js +32 -2
  120. package/dist/prompt/function-defs/get-source-code.js.map +1 -1
  121. package/dist/prompt/function-defs/optimize-context.js +35 -12
  122. package/dist/prompt/function-defs/optimize-context.js.map +1 -1
  123. package/dist/prompt/limits.js +2 -2
  124. package/dist/prompt/limits.js.map +1 -1
  125. package/dist/prompt/limits.test.js +3 -3
  126. package/dist/prompt/limits.test.js.map +1 -1
  127. package/dist/prompt/prompt-codegen.js +7 -79
  128. package/dist/prompt/prompt-codegen.js.map +1 -1
  129. package/dist/prompt/prompt-codegen.test.js +3 -10
  130. package/dist/prompt/prompt-codegen.test.js.map +1 -1
  131. package/dist/prompt/prompt-service-ask-question.test.js +26 -81
  132. package/dist/prompt/prompt-service-ask-question.test.js.map +1 -1
  133. package/dist/prompt/prompt-service.ai-services.test.d.ts +1 -0
  134. package/dist/prompt/prompt-service.ai-services.test.js +149 -0
  135. package/dist/prompt/prompt-service.ai-services.test.js.map +1 -0
  136. package/dist/prompt/prompt-service.context-optimization.test.d.ts +1 -0
  137. package/dist/prompt/prompt-service.context-optimization.test.js +212 -0
  138. package/dist/prompt/prompt-service.context-optimization.test.js.map +1 -0
  139. package/dist/prompt/prompt-service.image-handling.test.d.ts +1 -0
  140. package/dist/prompt/prompt-service.image-handling.test.js +212 -0
  141. package/dist/prompt/prompt-service.image-handling.test.js.map +1 -0
  142. package/dist/prompt/prompt-service.js +36 -29
  143. package/dist/prompt/prompt-service.js.map +1 -1
  144. package/dist/prompt/prompt-service.test-utils.d.ts +66 -0
  145. package/dist/prompt/prompt-service.test-utils.js +169 -0
  146. package/dist/prompt/prompt-service.test-utils.js.map +1 -0
  147. package/dist/prompt/prompt-service.test.js +96 -20
  148. package/dist/prompt/prompt-service.test.js.map +1 -1
  149. package/dist/prompt/prompt-service.validation-recovery.test.d.ts +1 -0
  150. package/dist/prompt/prompt-service.validation-recovery.test.js +263 -0
  151. package/dist/prompt/prompt-service.validation-recovery.test.js.map +1 -0
  152. package/dist/prompt/static-prompts.d.ts +16 -0
  153. package/dist/prompt/static-prompts.js +22 -0
  154. package/dist/prompt/static-prompts.js.map +1 -0
  155. package/dist/prompt/steps/step-ask-question/handlers/cancel-code-generation.js +1 -1
  156. package/dist/prompt/steps/step-ask-question/handlers/cancel-code-generation.js.map +1 -1
  157. package/dist/prompt/steps/step-ask-question/handlers/confirm-code-generation.d.ts +1 -1
  158. package/dist/prompt/steps/step-ask-question/handlers/confirm-code-generation.js +7 -4
  159. package/dist/prompt/steps/step-ask-question/handlers/confirm-code-generation.js.map +1 -1
  160. package/dist/prompt/steps/step-ask-question/handlers/context-optimization.js +6 -4
  161. package/dist/prompt/steps/step-ask-question/handlers/context-optimization.js.map +1 -1
  162. package/dist/prompt/steps/step-ask-question/handlers/default-action.js +1 -2
  163. package/dist/prompt/steps/step-ask-question/handlers/default-action.js.map +1 -1
  164. package/dist/prompt/steps/step-ask-question/handlers/handle-request-answer-with-image.d.ts +2 -0
  165. package/dist/prompt/steps/step-ask-question/handlers/handle-request-answer-with-image.js +86 -0
  166. package/dist/prompt/steps/step-ask-question/handlers/handle-request-answer-with-image.js.map +1 -0
  167. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message-with-image.d.ts +2 -0
  168. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message-with-image.js +103 -0
  169. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message-with-image.js.map +1 -0
  170. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message.d.ts +2 -0
  171. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message.js +22 -0
  172. package/dist/prompt/steps/step-ask-question/handlers/handle-send-message.js.map +1 -0
  173. package/dist/prompt/steps/step-ask-question/handlers/handler-utils.d.ts +0 -0
  174. package/dist/prompt/steps/step-ask-question/handlers/handler-utils.js +2 -0
  175. package/dist/prompt/steps/step-ask-question/handlers/handler-utils.js.map +1 -0
  176. package/dist/prompt/steps/step-ask-question/handlers/remove-files-from-context.d.ts +1 -1
  177. package/dist/prompt/steps/step-ask-question/handlers/remove-files-from-context.js +58 -13
  178. package/dist/prompt/steps/step-ask-question/handlers/remove-files-from-context.js.map +1 -1
  179. package/dist/prompt/steps/step-ask-question/handlers/request-files-content.d.ts +1 -1
  180. package/dist/prompt/steps/step-ask-question/handlers/request-files-content.js +110 -10
  181. package/dist/prompt/steps/step-ask-question/handlers/request-files-content.js.map +1 -1
  182. package/dist/prompt/steps/step-ask-question/handlers/request-permissions.d.ts +1 -1
  183. package/dist/prompt/steps/step-ask-question/handlers/request-permissions.js +49 -24
  184. package/dist/prompt/steps/step-ask-question/handlers/request-permissions.js.map +1 -1
  185. package/dist/prompt/steps/step-ask-question/handlers/start-code-generation.js +1 -1
  186. package/dist/prompt/steps/step-ask-question/handlers/start-code-generation.js.map +1 -1
  187. package/dist/prompt/steps/step-ask-question/step-ask-question-reflect.js +1 -0
  188. package/dist/prompt/steps/step-ask-question/step-ask-question-reflect.js.map +1 -1
  189. package/dist/prompt/steps/step-ask-question/step-ask-question-types.d.ts +22 -19
  190. package/dist/prompt/steps/step-ask-question/step-ask-question.d.ts +2 -4
  191. package/dist/prompt/steps/step-ask-question/step-ask-question.js +18 -29
  192. package/dist/prompt/steps/step-ask-question/step-ask-question.js.map +1 -1
  193. package/dist/prompt/steps/step-codegen-planning.d.ts +10 -0
  194. package/dist/prompt/steps/step-codegen-planning.js +69 -0
  195. package/dist/prompt/steps/step-codegen-planning.js.map +1 -0
  196. package/dist/prompt/steps/step-context-optimization.js +110 -80
  197. package/dist/prompt/steps/step-context-optimization.js.map +1 -1
  198. package/dist/prompt/steps/step-context-optimization.test.d.ts +2 -0
  199. package/dist/prompt/steps/step-context-optimization.test.js +456 -0
  200. package/dist/prompt/steps/step-context-optimization.test.js.map +1 -0
  201. package/dist/prompt/steps/step-generate-image.d.ts +8 -1
  202. package/dist/prompt/steps/step-generate-image.js +1 -0
  203. package/dist/prompt/steps/step-generate-image.js.map +1 -1
  204. package/dist/prompt/steps/step-summarization.d.ts +0 -1
  205. package/dist/prompt/steps/step-summarization.js +6 -3
  206. package/dist/prompt/steps/step-summarization.js.map +1 -1
  207. package/dist/prompt/steps/step-validate-recover.js +24 -15
  208. package/dist/prompt/steps/step-validate-recover.js.map +1 -1
  209. package/dist/prompt/systemprompt.d.ts +2 -2
  210. package/dist/prompt/systemprompt.js +74 -176
  211. package/dist/prompt/systemprompt.js.map +1 -1
  212. package/dist/prompt/systemprompt.test.js +2 -3
  213. package/dist/prompt/systemprompt.test.js.map +1 -1
  214. package/dist/vite-genaicode/vite-genaicode-plugin.d.ts +2 -1
  215. package/dist/vite-genaicode/vite-genaicode-plugin.js +15 -2
  216. package/dist/vite-genaicode/vite-genaicode-plugin.js.map +1 -1
  217. package/package.json +3 -2
@@ -0,0 +1,263 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { promptService } from './prompt-service.js';
3
+ import * as vertexAi from '../ai-service/vertex-ai.js';
4
+ import * as vertexAiClaude from '../ai-service/vertex-ai-claude.js';
5
+ import * as chatGpt from '../ai-service/chat-gpt.js';
6
+ import * as anthropic from '../ai-service/anthropic.js';
7
+ import * as cliParams from '../cli/cli-params.js';
8
+ import fs from 'fs';
9
+ import * as diff from 'diff';
10
+ import * as dalleService from '../ai-service/dall-e.js';
11
+ import * as vertexAiImagen from '../ai-service/vertex-ai-imagen.js';
12
+ import { getCodeGenPrompt } from './prompt-codegen.js';
13
+ import { mockData, mockResponses, testConfigs } from './prompt-service.test-utils.js';
14
+ // Mock all external dependencies
15
+ vi.mock('../ai-service/vertex-ai-claude.js', () => ({ generateContent: vi.fn() }));
16
+ vi.mock('../ai-service/vertex-ai.js', () => ({ generateContent: vi.fn() }));
17
+ vi.mock('../ai-service/chat-gpt.js', () => ({ generateContent: vi.fn() }));
18
+ vi.mock('../ai-service/anthropic.js', () => ({ generateContent: vi.fn() }));
19
+ vi.mock('../ai-service/dall-e.js', () => ({ generateImage: vi.fn() }));
20
+ vi.mock('../ai-service/vertex-ai-imagen.js', () => ({ generateImage: vi.fn() }));
21
+ vi.mock('fs');
22
+ vi.mock('diff');
23
+ vi.mock('../cli/cli-params.js', () => ({
24
+ disableExplanations: true,
25
+ explicitPrompt: false,
26
+ allowFileCreate: false,
27
+ allowFileDelete: false,
28
+ allowDirectoryCreate: false,
29
+ allowFileMove: false,
30
+ verbosePrompt: false,
31
+ disableContextOptimization: true,
32
+ vision: false,
33
+ imagen: false,
34
+ temperature: 0.7,
35
+ cheap: false,
36
+ askQuestion: false,
37
+ }));
38
+ vi.mock('../files/cache-file.js');
39
+ vi.mock('../files/find-files.js', () => ({
40
+ getSourceFiles: () => [],
41
+ getImageAssetFiles: () => [],
42
+ }));
43
+ vi.mock('../files/read-files.js', () => ({
44
+ getSourceCode: () => ({}),
45
+ getImageAssets: vi.fn(() => ({})),
46
+ }));
47
+ vi.mock('../main/config.js', () => ({
48
+ rootDir: '/mocked/root/dir',
49
+ rcConfig: {
50
+ rootDir: '/mocked/root/dir',
51
+ extensions: ['.js', '.ts', '.tsx', '.jsx'],
52
+ },
53
+ importantContext: {},
54
+ }));
55
+ const GENERATE_CONTENT_FNS = {
56
+ 'vertex-ai-claude': vertexAiClaude.generateContent,
57
+ 'vertex-ai': vertexAi.generateContent,
58
+ 'ai-studio': vertexAi.generateContent,
59
+ anthropic: anthropic.generateContent,
60
+ 'chat-gpt': chatGpt.generateContent,
61
+ };
62
+ const GENERATE_IMAGE_FNS = {
63
+ 'dall-e': dalleService.generateImage,
64
+ 'vertex-ai': vertexAiImagen.generateImage,
65
+ };
66
+ describe('promptService - Validation and Recovery', () => {
67
+ beforeEach(() => {
68
+ vi.resetAllMocks();
69
+ vi.mocked(cliParams).dryRun = false;
70
+ vi.mocked(cliParams).vision = false;
71
+ vi.mocked(cliParams).imagen = undefined;
72
+ vi.mocked(cliParams).disableContextOptimization = true;
73
+ vi.mocked(cliParams).explicitPrompt = 'testx';
74
+ });
75
+ describe('Invalid Response Recovery', () => {
76
+ it('should successfully recover from an invalid function call', async () => {
77
+ vi.mocked(cliParams).aiService = 'vertex-ai';
78
+ const mockInvalidCall = [
79
+ {
80
+ name: 'codegenSummary',
81
+ args: {
82
+ files: [{ filePath: mockData.paths.test, updateToolName: 'updateFile' }],
83
+ contextPaths: [],
84
+ explanation: 'Mock summary',
85
+ },
86
+ },
87
+ ];
88
+ const mockValidCall = [
89
+ {
90
+ name: 'codegenSummary',
91
+ args: {
92
+ fileUpdates: [{ filePath: mockData.paths.test, updateToolName: 'updateFile', prompt: 'Generate file' }],
93
+ contextPaths: [],
94
+ explanation: 'Mock summary',
95
+ },
96
+ },
97
+ ];
98
+ // Setup mocks
99
+ vi.mocked(vertexAi.generateContent)
100
+ // First mock for codegenPlanning
101
+ .mockResolvedValueOnce(mockResponses.mockPlanningResponse(mockData.paths.test))
102
+ // Second mock for invalid codegenSummary
103
+ .mockResolvedValueOnce(mockInvalidCall)
104
+ // Third mock for valid codegenSummary
105
+ .mockResolvedValueOnce(mockValidCall)
106
+ // Fourth mock for the actual update
107
+ .mockResolvedValueOnce(mockResponses.mockUpdateFile(mockData.paths.test, 'console.log("Recovered response");'));
108
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt(testConfigs.baseConfig));
109
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(4);
110
+ expect(result).toEqual(mockResponses.mockUpdateFile(mockData.paths.test, 'console.log("Recovered response");'));
111
+ });
112
+ it('should handle unsuccessful recovery', async () => {
113
+ vi.mocked(cliParams).aiService = 'vertex-ai';
114
+ const mockInvalidCall = [
115
+ {
116
+ name: 'updateFile',
117
+ args: { filePath: mockData.paths.test, invalidArg: 'This should not be here' },
118
+ },
119
+ ];
120
+ // Setup mocks
121
+ vi.mocked(vertexAi.generateContent)
122
+ // First mock for codegenPlanning
123
+ .mockResolvedValueOnce(mockResponses.mockPlanningResponse(mockData.paths.test))
124
+ // Second mock for codegenSummary
125
+ .mockResolvedValueOnce([
126
+ {
127
+ name: 'codegenSummary',
128
+ args: {
129
+ fileUpdates: [{ filePath: mockData.paths.test, updateToolName: 'patchFile', prompt: 'Generate file' }],
130
+ contextPaths: [],
131
+ explanation: 'Mock summary',
132
+ },
133
+ },
134
+ ])
135
+ // Third, fourth, and fifth mocks for failed recovery attempts
136
+ .mockResolvedValueOnce(mockInvalidCall)
137
+ .mockResolvedValueOnce(mockInvalidCall)
138
+ .mockResolvedValueOnce(mockInvalidCall);
139
+ await expect(promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt(testConfigs.baseConfig))).rejects.toThrow('Recovery failed');
140
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(5);
141
+ });
142
+ it('should not attempt recovery for multiple valid function calls', async () => {
143
+ vi.mocked(cliParams).aiService = 'vertex-ai';
144
+ // Setup mocks
145
+ vi.mocked(vertexAi.generateContent)
146
+ // First mock for codegenPlanning
147
+ .mockResolvedValueOnce(mockResponses.mockPlanningResponse(mockData.paths.test))
148
+ // Second mock for codegenSummary with multiple files
149
+ .mockResolvedValueOnce([
150
+ {
151
+ name: 'codegenSummary',
152
+ args: {
153
+ fileUpdates: [
154
+ {
155
+ filePath: `${mockData.paths.root}/test1.js`,
156
+ updateToolName: 'updateFile',
157
+ prompt: 'Generate file 1',
158
+ },
159
+ {
160
+ filePath: `${mockData.paths.root}/test2.js`,
161
+ updateToolName: 'updateFile',
162
+ prompt: 'Generate file 2',
163
+ },
164
+ ],
165
+ contextPaths: [],
166
+ explanation: 'Mock summary',
167
+ },
168
+ },
169
+ ])
170
+ // Third and fourth mocks for the actual updates
171
+ .mockResolvedValueOnce(mockResponses.mockUpdateFile(`${mockData.paths.root}/test1.js`, 'console.log("File 1");'))
172
+ .mockResolvedValueOnce(mockResponses.mockUpdateFile(`${mockData.paths.root}/test2.js`, 'console.log("File 2");'));
173
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt(testConfigs.baseConfig));
174
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(4);
175
+ expect(result).toEqual([
176
+ ...mockResponses.mockUpdateFile(`${mockData.paths.root}/test1.js`, 'console.log("File 1");'),
177
+ ...mockResponses.mockUpdateFile(`${mockData.paths.root}/test2.js`, 'console.log("File 2");'),
178
+ ]);
179
+ });
180
+ });
181
+ describe('Patch File Validation', () => {
182
+ it('should handle invalid patchFile call and retry without patchFile function', async () => {
183
+ vi.mocked(cliParams).aiService = 'vertex-ai';
184
+ // Setup mocks
185
+ vi.mocked(vertexAi.generateContent)
186
+ // First mock for codegenPlanning
187
+ .mockResolvedValueOnce(mockResponses.mockPlanningResponse(mockData.paths.test))
188
+ // Second mock for codegenSummary
189
+ .mockResolvedValueOnce([
190
+ {
191
+ name: 'codegenSummary',
192
+ args: {
193
+ fileUpdates: [
194
+ {
195
+ filePath: mockData.paths.test,
196
+ updateToolName: 'patchFile',
197
+ prompt: 'Generate file',
198
+ },
199
+ ],
200
+ contextPaths: [],
201
+ explanation: 'Mock summary',
202
+ },
203
+ },
204
+ ])
205
+ // Third mock for invalid patch
206
+ .mockResolvedValueOnce(mockResponses.mockPatchFile(mockData.paths.test, 'invalid patch'))
207
+ // Fourth mock for recovery with updateFile
208
+ .mockResolvedValueOnce(mockResponses.mockUpdateFile(mockData.paths.test, 'console.log("Updated content");'));
209
+ // Mock fs.readFileSync to return some content
210
+ vi.mocked(fs.readFileSync).mockReturnValue(mockData.fileContent);
211
+ // Mock diff.applyPatch to fail for the invalid patch
212
+ vi.mocked(diff.applyPatch).mockReturnValue(false);
213
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt(testConfigs.baseConfig));
214
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(4);
215
+ expect(fs.readFileSync).toHaveBeenCalledWith(mockData.paths.test, 'utf-8');
216
+ expect(diff.applyPatch).toHaveBeenCalledWith(mockData.fileContent, 'invalid patch');
217
+ expect(result).toEqual(mockResponses.mockUpdateFile(mockData.paths.test, 'console.log("Updated content");'));
218
+ });
219
+ it('should handle successful patch application', async () => {
220
+ vi.mocked(cliParams).aiService = 'vertex-ai';
221
+ const validPatch = `Index: test.js
222
+ ===================================================================
223
+ --- test.js
224
+ +++ test.js
225
+ @@ -1,1 +1,1 @@
226
+ -Original content
227
+ +New content`;
228
+ // Setup mocks
229
+ vi.mocked(vertexAi.generateContent)
230
+ // First mock for codegenPlanning
231
+ .mockResolvedValueOnce(mockResponses.mockPlanningResponse(mockData.paths.test))
232
+ // Second mock for codegenSummary
233
+ .mockResolvedValueOnce([
234
+ {
235
+ name: 'codegenSummary',
236
+ args: {
237
+ fileUpdates: [
238
+ {
239
+ filePath: mockData.paths.test,
240
+ updateToolName: 'patchFile',
241
+ prompt: 'Generate file',
242
+ },
243
+ ],
244
+ contextPaths: [],
245
+ explanation: 'Mock summary',
246
+ },
247
+ },
248
+ ])
249
+ // Third mock for valid patch
250
+ .mockResolvedValueOnce(mockResponses.mockPatchFile(mockData.paths.test, validPatch));
251
+ // Mock fs.readFileSync to return some content
252
+ vi.mocked(fs.readFileSync).mockReturnValue(mockData.fileContent);
253
+ // Mock diff.applyPatch to succeed with the valid patch
254
+ vi.mocked(diff.applyPatch).mockReturnValue('New content');
255
+ const result = await promptService(GENERATE_CONTENT_FNS, GENERATE_IMAGE_FNS, getCodeGenPrompt(testConfigs.baseConfig));
256
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
257
+ expect(fs.readFileSync).toHaveBeenCalledWith(mockData.paths.test, 'utf-8');
258
+ expect(diff.applyPatch).toHaveBeenCalledWith(mockData.fileContent, validPatch);
259
+ expect(result).toEqual(mockResponses.mockPatchFile(mockData.paths.test, validPatch));
260
+ });
261
+ });
262
+ });
263
+ //# sourceMappingURL=prompt-service.validation-recovery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-service.validation-recovery.test.js","sourceRoot":"","sources":["../../src/prompt/prompt-service.validation-recovery.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Static prompts used in the prompt-service module.
3
+ * These prompts are used in the initial conversation with the AI service.
4
+ */
5
+ /** Initial greeting from the user */
6
+ export declare const INITIAL_GREETING = "Hello, GenAIcode!";
7
+ /** Assistant's response asking for source code and other assets */
8
+ export declare const REQUEST_SOURCE_CODE = "Hello there! I guess you have a task for me today. Before we start, could you please provide me with: \n - the current source code of your application\n - the image assets (if available)\n - and conversational history (if available)\n \n Thanks";
9
+ /** User's response when providing source code and assets */
10
+ export declare const SOURCE_CODE_RESPONSE = "Sure, here is the application source code, image assets, and the history.";
11
+ /** Assistant's acknowledgment after receiving source code */
12
+ export declare const READY_TO_ASSIST = "Thank you, I'm ready to assist you with your request.";
13
+ /** Assistant's response when generating code */
14
+ export declare const CODEGEN_SUMMARY_PROMPT = "Planning phase completed. Now please create the code generation summary.";
15
+ /** Template for partial prompt when requesting changes for a specific file */
16
+ export declare const getPartialPromptTemplate: (path: string) => string;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Static prompts used in the prompt-service module.
3
+ * These prompts are used in the initial conversation with the AI service.
4
+ */
5
+ /** Initial greeting from the user */
6
+ export const INITIAL_GREETING = 'Hello, GenAIcode!';
7
+ /** Assistant's response asking for source code and other assets */
8
+ export const REQUEST_SOURCE_CODE = `Hello there! I guess you have a task for me today. Before we start, could you please provide me with:
9
+ - the current source code of your application
10
+ - the image assets (if available)
11
+ - and conversational history (if available)
12
+
13
+ Thanks`;
14
+ /** User's response when providing source code and assets */
15
+ export const SOURCE_CODE_RESPONSE = 'Sure, here is the application source code, image assets, and the history.';
16
+ /** Assistant's acknowledgment after receiving source code */
17
+ export const READY_TO_ASSIST = "Thank you, I'm ready to assist you with your request.";
18
+ /** Assistant's response when generating code */
19
+ export const CODEGEN_SUMMARY_PROMPT = 'Planning phase completed. Now please create the code generation summary.';
20
+ /** Template for partial prompt when requesting changes for a specific file */
21
+ export const getPartialPromptTemplate = (path) => `Please now generate update for the \`${path}\` file using appropriate tools according to code generation summary.`;
22
+ //# sourceMappingURL=static-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-prompts.js","sourceRoot":"","sources":["../../src/prompt/static-prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qCAAqC;AACrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,mEAAmE;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;aAKtB,CAAC;AAEd,4DAA4D;AAC5D,MAAM,CAAC,MAAM,oBAAoB,GAAG,2EAA2E,CAAC;AAEhH,6DAA6D;AAC7D,MAAM,CAAC,MAAM,eAAe,GAAG,uDAAuD,CAAC;AAEvF,gDAAgD;AAChD,MAAM,CAAC,MAAM,sBAAsB,GAAG,0EAA0E,CAAC;AAEjH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAY,EAAU,EAAE,CAC/D,wCAAwC,IAAI,uEAAuE,CAAC"}
@@ -7,7 +7,7 @@ export async function handleCancelCodeGeneration({ askQuestionCall }) {
7
7
  stepResult: StepResult.BREAK,
8
8
  items: [
9
9
  {
10
- assistant: { type: 'assistant', text: askQuestionCall.args?.content ?? '', functionCalls: [] },
10
+ assistant: { type: 'assistant', text: askQuestionCall.args?.message ?? '' },
11
11
  user: { type: 'user', text: 'Code generation cancelled.' },
12
12
  },
13
13
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"cancel-code-generation.js","sourceRoot":"","sources":["../../../../../src/prompt/steps/step-ask-question/handlers/cancel-code-generation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAAE,eAAe,EAAsB;IACtF,gBAAgB,CAAC,yDAAyD,CAAC,CAAC;IAC5E,OAAO;QACL,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,UAAU,CAAC,KAAK;QAC5B,KAAK,EAAE;YACL;gBACE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;gBAC9F,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE;aAC3D;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"cancel-code-generation.js","sourceRoot":"","sources":["../../../../../src/prompt/steps/step-ask-question/handlers/cancel-code-generation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAAE,eAAe,EAAsB;IACtF,gBAAgB,CAAC,yDAAyD,CAAC,CAAC;IAC5E,OAAO;QACL,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,UAAU,CAAC,KAAK;QAC5B,KAAK,EAAE;YACL;gBACE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE;gBAC3E,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE;aAC3D;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import { ActionHandlerProps, ActionResult } from '../step-ask-question-types.js';
2
- export declare function handleConfirmCodeGeneration({ askQuestionCall }: ActionHandlerProps): Promise<ActionResult>;
2
+ export declare function handleConfirmCodeGeneration({ askQuestionCall, options, }: ActionHandlerProps): Promise<ActionResult>;
@@ -1,8 +1,12 @@
1
1
  import { putSystemMessage } from '../../../../main/common/content-bus.js';
2
2
  import { askUserForConfirmationWithAnswer } from '../../../../main/common/user-actions.js';
3
3
  import { StepResult } from '../../steps-types.js';
4
- export async function handleConfirmCodeGeneration({ askQuestionCall }) {
4
+ export async function handleConfirmCodeGeneration({ askQuestionCall, options, }) {
5
5
  const userConfirmation = await askUserForConfirmationWithAnswer('The assistant is ready to start code generation. Do you want to proceed?', 'Start code generation', 'Continue conversation', true);
6
+ if (userConfirmation.options?.aiService) {
7
+ options.aiService = userConfirmation.options.aiService;
8
+ options.cheap = userConfirmation.options.cheap;
9
+ }
6
10
  if (userConfirmation.confirmed) {
7
11
  putSystemMessage('Proceeding with code generation.');
8
12
  return {
@@ -10,7 +14,7 @@ export async function handleConfirmCodeGeneration({ askQuestionCall }) {
10
14
  stepResult: StepResult.CONTINUE,
11
15
  items: [
12
16
  {
13
- assistant: { type: 'assistant', text: askQuestionCall.args?.content ?? '', functionCalls: [] },
17
+ assistant: { type: 'assistant', text: askQuestionCall.args?.message ?? '', functionCalls: [] },
14
18
  user: { type: 'user', text: userConfirmation.answer || 'Confirmed. Proceed with code generation.' },
15
19
  },
16
20
  ],
@@ -23,11 +27,10 @@ export async function handleConfirmCodeGeneration({ askQuestionCall }) {
23
27
  stepResult: StepResult.CONTINUE,
24
28
  items: [
25
29
  {
26
- assistant: { type: 'assistant', text: askQuestionCall.args?.content ?? '', functionCalls: [askQuestionCall] },
30
+ assistant: { type: 'assistant', text: askQuestionCall.args?.message ?? '' },
27
31
  user: {
28
32
  type: 'user',
29
33
  text: userConfirmation.answer || 'Declined. Please continue the conversation.',
30
- functionResponses: [{ name: 'askQuestion', call_id: askQuestionCall.id ?? '', content: undefined }],
31
34
  },
32
35
  },
33
36
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"confirm-code-generation.js","sourceRoot":"","sources":["../../../../../src/prompt/steps/step-ask-question/handlers/confirm-code-generation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,gCAAgC,EAAE,MAAM,yCAAyC,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,EAAE,eAAe,EAAsB;IACvF,MAAM,gBAAgB,GAAG,MAAM,gCAAgC,CAC7D,0EAA0E,EAC1E,uBAAuB,EACvB,uBAAuB,EACvB,IAAI,CACL,CAAC;IACF,IAAI,gBAAgB,CAAC,SAAS,EAAE,CAAC;QAC/B,gBAAgB,CAAC,kCAAkC,CAAC,CAAC;QACrD,OAAO;YACL,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,UAAU,CAAC,QAAQ;YAC/B,KAAK,EAAE;gBACL;oBACE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;oBAC9F,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,MAAM,IAAI,0CAA0C,EAAE;iBACpG;aACF;SACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,gBAAgB,CAAC,wCAAwC,CAAC,CAAC;QAC3D,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,UAAU,CAAC,QAAQ;YAC/B,KAAK,EAAE;gBACL;oBACE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,eAAe,CAAC,EAAE;oBAC7G,IAAI,EAAE;wBACJ,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gBAAgB,CAAC,MAAM,IAAI,6CAA6C;wBAC9E,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;qBACpG;iBACF;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"confirm-code-generation.js","sourceRoot":"","sources":["../../../../../src/prompt/steps/step-ask-question/handlers/confirm-code-generation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,gCAAgC,EAAE,MAAM,yCAAyC,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,EAChD,eAAe,EACf,OAAO,GACY;IACnB,MAAM,gBAAgB,GAAG,MAAM,gCAAgC,CAC7D,0EAA0E,EAC1E,uBAAuB,EACvB,uBAAuB,EACvB,IAAI,CACL,CAAC;IACF,IAAI,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACxC,OAAO,CAAC,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC;QACvD,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;IACjD,CAAC;IACD,IAAI,gBAAgB,CAAC,SAAS,EAAE,CAAC;QAC/B,gBAAgB,CAAC,kCAAkC,CAAC,CAAC;QACrD,OAAO;YACL,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,UAAU,CAAC,QAAQ;YAC/B,KAAK,EAAE;gBACL;oBACE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;oBAC9F,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,MAAM,IAAI,0CAA0C,EAAE;iBACpG;aACF;SACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,gBAAgB,CAAC,wCAAwC,CAAC,CAAC;QAC3D,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,UAAU,CAAC,QAAQ;YAC/B,KAAK,EAAE;gBACL;oBACE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE;oBAC3E,IAAI,EAAE;wBACJ,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gBAAgB,CAAC,MAAM,IAAI,6CAA6C;qBAC/E;iBACF;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -5,17 +5,19 @@ import { executeStepContextOptimization } from '../../step-context-optimization.
5
5
  import { StepResult } from '../../steps-types.js';
6
6
  export async function handleContextOptimization({ askQuestionCall, prompt, options, generateContentFn, }) {
7
7
  const userConfirmation = await askUserForConfirmation('The assistant suggests optimizing the context to reduce token usage, cost, and latency. Do you want to proceed?', false);
8
+ if (userConfirmation.options?.aiService) {
9
+ options.aiService = userConfirmation.options.aiService;
10
+ options.cheap = userConfirmation.options.cheap;
11
+ }
8
12
  const user = {
9
13
  type: 'user',
10
14
  text: userConfirmation ? 'Context optimization applied.' : 'Context optimization not applied.',
11
- functionResponses: [{ name: 'askQuestion', call_id: askQuestionCall.id ?? '', content: undefined }],
12
15
  };
13
16
  const assistant = {
14
17
  type: 'assistant',
15
- text: askQuestionCall.args?.content ?? '',
16
- functionCalls: [askQuestionCall],
18
+ text: askQuestionCall.args?.message ?? '',
17
19
  };
18
- if (userConfirmation) {
20
+ if (userConfirmation.confirmed) {
19
21
  // the request may be caused be an appearance of a new file, so lets refresh
20
22
  refreshFiles();
21
23
  // Execute context optimization step
@@ -1 +1 @@
1
- {"version":3,"file":"context-optimization.js","sourceRoot":"","sources":["../../../../../src/prompt/steps/step-ask-question/handlers/context-optimization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,EAC9C,eAAe,EACf,MAAM,EACN,OAAO,EACP,iBAAiB,GACE;IACnB,MAAM,gBAAgB,GAAG,MAAM,sBAAsB,CACnD,iHAAiH,EACjH,KAAK,CACN,CAAC;IAEF,MAAM,IAAI,GAAa;QACrB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,mCAAmC;QAC9F,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;KACpG,CAAC;IAEF,MAAM,SAAS,GAAkB;QAC/B,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE;QACzC,aAAa,EAAE,CAAC,eAAe,CAAC;KACjC,CAAC;IAEF,IAAI,gBAAgB,EAAE,CAAC;QACrB,4EAA4E;QAC5E,YAAY,EAAE,CAAC;QAEf,oCAAoC;QACpC,gBAAgB,CAAC,sCAAsC,CAAC,CAAC;QACzD,MAAM,8BAA8B,CAAC,iBAAiB,EAAE,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACjG,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,UAAU,CAAC,QAAQ;QAC/B,KAAK,EAAE;YACL;gBACE,SAAS;gBACT,IAAI;aACL;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"context-optimization.js","sourceRoot":"","sources":["../../../../../src/prompt/steps/step-ask-question/handlers/context-optimization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,EAC9C,eAAe,EACf,MAAM,EACN,OAAO,EACP,iBAAiB,GACE;IACnB,MAAM,gBAAgB,GAAG,MAAM,sBAAsB,CACnD,iHAAiH,EACjH,KAAK,CACN,CAAC;IAEF,IAAI,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACxC,OAAO,CAAC,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC;QACvD,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;IACjD,CAAC;IAED,MAAM,IAAI,GAAa;QACrB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,mCAAmC;KAC/F,CAAC;IAEF,MAAM,SAAS,GAAkB;QAC/B,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE;KAC1C,CAAC;IAEF,IAAI,gBAAgB,CAAC,SAAS,EAAE,CAAC;QAC/B,4EAA4E;QAC5E,YAAY,EAAE,CAAC;QAEf,oCAAoC;QACpC,gBAAgB,CAAC,sCAAsC,CAAC,CAAC;QACzD,MAAM,8BAA8B,CAAC,iBAAiB,EAAE,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACjG,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,UAAU,CAAC,QAAQ;QAC/B,KAAK,EAAE;YACL;gBACE,SAAS;gBACT,IAAI;aACL;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -5,11 +5,10 @@ export async function handleDefaultAction({ askQuestionCall }) {
5
5
  stepResult: StepResult.CONTINUE,
6
6
  items: [
7
7
  {
8
- assistant: { type: 'assistant', text: askQuestionCall.args?.content ?? '', functionCalls: [askQuestionCall] },
8
+ assistant: { type: 'assistant', text: askQuestionCall.args?.message ?? '' },
9
9
  user: {
10
10
  type: 'user',
11
11
  text: "I don't want to start the code generation yet, let's talk a bit more.",
12
- functionResponses: [{ name: 'askQuestion', call_id: askQuestionCall.id ?? '', content: undefined }],
13
12
  },
14
13
  },
15
14
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"default-action.js","sourceRoot":"","sources":["../../../../../src/prompt/steps/step-ask-question/handlers/default-action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAE,eAAe,EAAsB;IAC/E,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,UAAU,CAAC,QAAQ;QAC/B,KAAK,EAAE;YACL;gBACE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,eAAe,CAAC,EAAE;gBAC7G,IAAI,EAAE;oBACJ,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,uEAAuE;oBAC7E,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;iBACpG;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"default-action.js","sourceRoot":"","sources":["../../../../../src/prompt/steps/step-ask-question/handlers/default-action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAE,eAAe,EAAsB;IAC/E,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,UAAU,CAAC,QAAQ;QAC/B,KAAK,EAAE;YACL;gBACE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE;gBAC3E,IAAI,EAAE;oBACJ,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,uEAAuE;iBAC9E;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ActionHandlerProps, ActionResult } from '../step-ask-question-types.js';
2
+ export declare function handleRequestAnswerWithImage({ askQuestionCall, options, generateImageFn, }: ActionHandlerProps): Promise<ActionResult>;
@@ -0,0 +1,86 @@
1
+ import { askUserForInput } from '../../../../main/common/user-actions.js';
2
+ import { putAssistantMessage, putSystemMessage } from '../../../../main/common/content-bus.js';
3
+ import { StepResult } from '../../steps-types.js';
4
+ import { executeStepGenerateImage } from '../../step-generate-image.js';
5
+ export async function handleRequestAnswerWithImage({ askQuestionCall, options, generateImageFn, }) {
6
+ if (!options.imagen) {
7
+ putSystemMessage('Image generation is not enabled. Please enable it using --imagen parameter.');
8
+ return {
9
+ breakLoop: true,
10
+ stepResult: StepResult.BREAK,
11
+ items: [],
12
+ };
13
+ }
14
+ // Get the image generation request from the args
15
+ const imageGenerationRequest = askQuestionCall.args?.imageGenerationRequest;
16
+ if (!imageGenerationRequest?.prompt) {
17
+ putSystemMessage('Image generation request with prompt is required for requestAnswerWithImage action.');
18
+ return {
19
+ breakLoop: true,
20
+ stepResult: StepResult.BREAK,
21
+ items: [],
22
+ };
23
+ }
24
+ // Create a temporary file path for the generated image
25
+ const tempImagePath = `/tmp/question-image-${Date.now()}.png`;
26
+ // Generate the image using generateImage function call
27
+ const generateImageCall = {
28
+ name: 'generateImage',
29
+ args: {
30
+ prompt: imageGenerationRequest.prompt,
31
+ filePath: tempImagePath,
32
+ width: 1024,
33
+ height: 1024,
34
+ explanation: 'Generating image to support the question',
35
+ ...(imageGenerationRequest.contextImage && { contextImagePath: imageGenerationRequest.contextImage }),
36
+ },
37
+ };
38
+ // Execute image generation
39
+ const downloadFileCall = await executeStepGenerateImage(generateImageFn, generateImageCall);
40
+ // If image generation failed, the downloadFileCall will be an explanation
41
+ if (!downloadFileCall.args?.downloadUrl) {
42
+ putSystemMessage('Failed to generate image for the question.');
43
+ return {
44
+ breakLoop: true,
45
+ stepResult: StepResult.BREAK,
46
+ items: [],
47
+ };
48
+ }
49
+ const response = await fetch(downloadFileCall.args?.downloadUrl);
50
+ const arrayBuffer = await response.arrayBuffer();
51
+ const buffer = Buffer.from(arrayBuffer);
52
+ putAssistantMessage('Here is the image to support the question:', generateImageCall.args, [], [
53
+ {
54
+ base64url: buffer.toString('base64'),
55
+ mediaType: 'image/png',
56
+ },
57
+ ]);
58
+ // Get user's response with the image displayed
59
+ const userText = await askUserForInput('Your answer', askQuestionCall.args?.content ?? '');
60
+ // Return the conversation items with the generated image
61
+ return {
62
+ breakLoop: false,
63
+ stepResult: StepResult.CONTINUE,
64
+ items: [
65
+ {
66
+ assistant: {
67
+ type: 'assistant',
68
+ text: askQuestionCall.args?.content ?? '',
69
+ functionCalls: [askQuestionCall, generateImageCall, downloadFileCall],
70
+ },
71
+ user: {
72
+ type: 'user',
73
+ text: userText,
74
+ functionResponses: [
75
+ {
76
+ name: 'askQuestion',
77
+ call_id: askQuestionCall.id ?? '',
78
+ content: undefined,
79
+ },
80
+ ],
81
+ },
82
+ },
83
+ ],
84
+ };
85
+ }
86
+ //# sourceMappingURL=handle-request-answer-with-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-request-answer-with-image.js","sourceRoot":"","sources":["../../../../../src/prompt/steps/step-ask-question/handlers/handle-request-answer-with-image.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { ActionHandlerProps, ActionResult } from '../step-ask-question-types.js';
2
+ export declare function handleSendMessageWithImage({ askQuestionCall, options, generateContentFn, prompt, generateImageFn, }: ActionHandlerProps): Promise<ActionResult>;