genaicode 0.0.37 → 0.1.1

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 (244) hide show
  1. package/bin/genaicode-dev.js +11 -0
  2. package/bin/genaicode.cjs +8 -1
  3. package/dist/ai-service/ai-studio.d.ts +5 -0
  4. package/dist/ai-service/ai-studio.js +135 -0
  5. package/dist/ai-service/ai-studio.js.map +1 -0
  6. package/dist/ai-service/anthropic.d.ts +5 -0
  7. package/dist/ai-service/anthropic.js +133 -0
  8. package/dist/ai-service/anthropic.js.map +1 -0
  9. package/dist/ai-service/chat-gpt.d.ts +5 -0
  10. package/dist/ai-service/chat-gpt.js +131 -0
  11. package/dist/ai-service/chat-gpt.js.map +1 -0
  12. package/dist/ai-service/common.d.ts +57 -0
  13. package/dist/ai-service/common.js +38 -0
  14. package/dist/ai-service/common.js.map +1 -0
  15. package/dist/ai-service/common.test.d.ts +1 -0
  16. package/dist/ai-service/common.test.js +85 -0
  17. package/dist/ai-service/common.test.js.map +1 -0
  18. package/dist/ai-service/dall-e.d.ts +14 -0
  19. package/dist/ai-service/dall-e.js +47 -0
  20. package/dist/ai-service/dall-e.js.map +1 -0
  21. package/dist/ai-service/vertex-ai-claude.d.ts +5 -0
  22. package/dist/ai-service/vertex-ai-claude.js +93 -0
  23. package/dist/ai-service/vertex-ai-claude.js.map +1 -0
  24. package/dist/ai-service/vertex-ai-imagen.d.ts +14 -0
  25. package/dist/ai-service/vertex-ai-imagen.js +74 -0
  26. package/dist/ai-service/vertex-ai-imagen.js.map +1 -0
  27. package/dist/ai-service/vertex-ai.d.ts +7 -0
  28. package/dist/ai-service/vertex-ai.js +147 -0
  29. package/dist/ai-service/vertex-ai.js.map +1 -0
  30. package/dist/cli/cli-options.d.ts +10 -0
  31. package/dist/cli/cli-options.js +124 -0
  32. package/dist/cli/cli-options.js.map +1 -0
  33. package/dist/cli/cli-options.test.d.ts +1 -0
  34. package/dist/cli/cli-options.test.js +34 -0
  35. package/dist/cli/cli-options.test.js.map +1 -0
  36. package/dist/cli/cli-params.d.ts +29 -0
  37. package/dist/cli/cli-params.js +103 -0
  38. package/dist/cli/cli-params.js.map +1 -0
  39. package/dist/cli/cli-params.test.d.ts +1 -0
  40. package/dist/cli/cli-params.test.js +38 -0
  41. package/dist/cli/cli-params.test.js.map +1 -0
  42. package/dist/cli/service-autodetect.d.ts +2 -0
  43. package/dist/cli/service-autodetect.js +17 -0
  44. package/dist/cli/service-autodetect.js.map +1 -0
  45. package/dist/cli/service-autodetect.test.d.ts +1 -0
  46. package/dist/cli/service-autodetect.test.js +38 -0
  47. package/dist/cli/service-autodetect.test.js.map +1 -0
  48. package/dist/cli/validate-cli-params.d.ts +18 -0
  49. package/dist/cli/validate-cli-params.js +128 -0
  50. package/dist/cli/validate-cli-params.js.map +1 -0
  51. package/dist/cli/validate-cli-params.test.d.ts +1 -0
  52. package/dist/cli/validate-cli-params.test.js +106 -0
  53. package/dist/cli/validate-cli-params.test.js.map +1 -0
  54. package/dist/files/file-utils.d.ts +2 -0
  55. package/dist/files/file-utils.js +7 -0
  56. package/dist/files/file-utils.js.map +1 -0
  57. package/dist/files/file-utils.test.d.ts +1 -0
  58. package/dist/files/file-utils.test.js +18 -0
  59. package/dist/files/file-utils.test.js.map +1 -0
  60. package/dist/files/find-files.d.ts +8 -0
  61. package/dist/files/find-files.js +76 -0
  62. package/dist/files/find-files.js.map +1 -0
  63. package/dist/files/read-files.d.ts +13 -0
  64. package/dist/files/read-files.js +61 -0
  65. package/dist/files/read-files.js.map +1 -0
  66. package/dist/files/read-files.test.d.ts +1 -0
  67. package/dist/files/read-files.test.js +89 -0
  68. package/dist/files/read-files.test.js.map +1 -0
  69. package/dist/files/temp-buffer.d.ts +2 -0
  70. package/dist/files/temp-buffer.js +12 -0
  71. package/dist/files/temp-buffer.js.map +1 -0
  72. package/dist/files/update-files.d.ts +5 -0
  73. package/dist/files/update-files.js +197 -0
  74. package/dist/files/update-files.js.map +1 -0
  75. package/dist/images/ensure-alpha.d.ts +1 -0
  76. package/dist/images/ensure-alpha.js +5 -0
  77. package/dist/images/ensure-alpha.js.map +1 -0
  78. package/dist/images/imgly-remove-background.d.ts +2 -0
  79. package/dist/images/imgly-remove-background.js +21 -0
  80. package/dist/images/imgly-remove-background.js.map +1 -0
  81. package/dist/images/resize-image.d.ts +19 -0
  82. package/dist/images/resize-image.js +22 -0
  83. package/dist/images/resize-image.js.map +1 -0
  84. package/dist/images/split-image.d.ts +18 -0
  85. package/dist/images/split-image.js +25 -0
  86. package/dist/images/split-image.js.map +1 -0
  87. package/dist/main/codegen.d.ts +2 -0
  88. package/dist/main/codegen.js +101 -0
  89. package/dist/main/codegen.js.map +1 -0
  90. package/dist/main/codegen.test.d.ts +2 -0
  91. package/dist/main/codegen.test.js +259 -0
  92. package/dist/main/codegen.test.js.map +1 -0
  93. package/dist/main/config-lib.d.ts +8 -0
  94. package/dist/main/config-lib.js +28 -0
  95. package/dist/main/config-lib.js.map +1 -0
  96. package/dist/main/config-lib.test.d.ts +1 -0
  97. package/dist/main/config-lib.test.js +64 -0
  98. package/dist/main/config-lib.test.js.map +1 -0
  99. package/dist/main/config.d.ts +5 -0
  100. package/{src → dist}/main/config.js +16 -22
  101. package/dist/main/config.js.map +1 -0
  102. package/dist/prompt/function-calling-validate.d.ts +3 -0
  103. package/dist/prompt/function-calling-validate.js +27 -0
  104. package/dist/prompt/function-calling-validate.js.map +1 -0
  105. package/dist/prompt/function-calling.d.ts +5 -0
  106. package/{src → dist}/prompt/function-calling.js +25 -24
  107. package/dist/prompt/function-calling.js.map +1 -0
  108. package/dist/prompt/function-defs/ask-question.d.ts +31 -0
  109. package/dist/prompt/function-defs/ask-question.js +32 -0
  110. package/dist/prompt/function-defs/ask-question.js.map +1 -0
  111. package/dist/prompt/function-defs/codegen-summary.d.ts +63 -0
  112. package/dist/prompt/function-defs/codegen-summary.js +80 -0
  113. package/dist/prompt/function-defs/codegen-summary.js.map +1 -0
  114. package/dist/prompt/function-defs/create-directory.d.ts +21 -0
  115. package/dist/prompt/function-defs/create-directory.js +22 -0
  116. package/dist/prompt/function-defs/create-directory.js.map +1 -0
  117. package/dist/prompt/function-defs/create-file.d.ts +25 -0
  118. package/dist/prompt/function-defs/create-file.js +26 -0
  119. package/dist/prompt/function-defs/create-file.js.map +1 -0
  120. package/dist/prompt/function-defs/delete-file.d.ts +21 -0
  121. package/dist/prompt/function-defs/delete-file.js +22 -0
  122. package/dist/prompt/function-defs/delete-file.js.map +1 -0
  123. package/dist/prompt/function-defs/download-file.d.ts +25 -0
  124. package/dist/prompt/function-defs/download-file.js +26 -0
  125. package/dist/prompt/function-defs/download-file.js.map +1 -0
  126. package/dist/prompt/function-defs/explanation.d.ts +17 -0
  127. package/dist/prompt/function-defs/explanation.js +18 -0
  128. package/dist/prompt/function-defs/explanation.js.map +1 -0
  129. package/dist/prompt/function-defs/generate-image.d.ts +48 -0
  130. package/dist/prompt/function-defs/generate-image.js +49 -0
  131. package/dist/prompt/function-defs/generate-image.js.map +1 -0
  132. package/dist/prompt/function-defs/get-image-assets.d.ts +20 -0
  133. package/dist/prompt/function-defs/get-image-assets.js +21 -0
  134. package/dist/prompt/function-defs/get-image-assets.js.map +1 -0
  135. package/dist/prompt/function-defs/get-source-code.d.ts +20 -0
  136. package/dist/prompt/function-defs/get-source-code.js +21 -0
  137. package/dist/prompt/function-defs/get-source-code.js.map +1 -0
  138. package/dist/prompt/function-defs/imgly-remove-background.d.ts +25 -0
  139. package/dist/prompt/function-defs/imgly-remove-background.js +26 -0
  140. package/dist/prompt/function-defs/imgly-remove-background.js.map +1 -0
  141. package/dist/prompt/function-defs/move-file.d.ts +25 -0
  142. package/dist/prompt/function-defs/move-file.js +26 -0
  143. package/dist/prompt/function-defs/move-file.js.map +1 -0
  144. package/dist/prompt/function-defs/patch-file.d.ts +25 -0
  145. package/dist/prompt/function-defs/patch-file.js +39 -0
  146. package/dist/prompt/function-defs/patch-file.js.map +1 -0
  147. package/dist/prompt/function-defs/resize-image.d.ts +36 -0
  148. package/dist/prompt/function-defs/resize-image.js +37 -0
  149. package/dist/prompt/function-defs/resize-image.js.map +1 -0
  150. package/dist/prompt/function-defs/split-image.d.ts +57 -0
  151. package/dist/prompt/function-defs/split-image.js +46 -0
  152. package/dist/prompt/function-defs/split-image.js.map +1 -0
  153. package/dist/prompt/function-defs/update-file.d.ts +25 -0
  154. package/dist/prompt/function-defs/update-file.js +26 -0
  155. package/dist/prompt/function-defs/update-file.js.map +1 -0
  156. package/dist/prompt/limits.d.ts +3 -0
  157. package/dist/prompt/limits.js +19 -0
  158. package/dist/prompt/limits.js.map +1 -0
  159. package/dist/prompt/limits.test.d.ts +1 -0
  160. package/dist/prompt/limits.test.js +35 -0
  161. package/dist/prompt/limits.test.js.map +1 -0
  162. package/dist/prompt/prompt-codegen.d.ts +4 -0
  163. package/dist/prompt/prompt-codegen.js +81 -0
  164. package/dist/prompt/prompt-codegen.js.map +1 -0
  165. package/dist/prompt/prompt-codegen.test.d.ts +1 -0
  166. package/dist/prompt/prompt-codegen.test.js +94 -0
  167. package/dist/prompt/prompt-codegen.test.js.map +1 -0
  168. package/dist/prompt/prompt-consts.d.ts +1 -0
  169. package/{src → dist}/prompt/prompt-consts.js +1 -0
  170. package/dist/prompt/prompt-consts.js.map +1 -0
  171. package/dist/prompt/prompt-service-ask-question.test.d.ts +3 -0
  172. package/dist/prompt/prompt-service-ask-question.test.js +146 -0
  173. package/dist/prompt/prompt-service-ask-question.test.js.map +1 -0
  174. package/dist/prompt/prompt-service.d.ts +13 -0
  175. package/dist/prompt/prompt-service.js +278 -0
  176. package/dist/prompt/prompt-service.js.map +1 -0
  177. package/dist/prompt/prompt-service.test.d.ts +1 -0
  178. package/dist/prompt/prompt-service.test.js +511 -0
  179. package/dist/prompt/prompt-service.test.js.map +1 -0
  180. package/dist/prompt/systemprompt.d.ts +2 -0
  181. package/dist/prompt/systemprompt.js +43 -0
  182. package/dist/prompt/systemprompt.js.map +1 -0
  183. package/dist/prompt/systemprompt.test.d.ts +2 -0
  184. package/dist/prompt/systemprompt.test.js +47 -0
  185. package/dist/prompt/systemprompt.test.js.map +1 -0
  186. package/package.json +13 -4
  187. package/bin/genaicode.js +0 -5
  188. package/src/ai-service/anthropic.js +0 -126
  189. package/src/ai-service/chat-gpt.js +0 -126
  190. package/src/ai-service/common.js +0 -49
  191. package/src/ai-service/common.test.js +0 -107
  192. package/src/ai-service/dall-e.js +0 -50
  193. package/src/ai-service/vertex-ai-claude.js +0 -99
  194. package/src/ai-service/vertex-ai-imagen.js +0 -78
  195. package/src/ai-service/vertex-ai.js +0 -156
  196. package/src/cli/cli-options.js +0 -132
  197. package/src/cli/cli-options.test.js +0 -50
  198. package/src/cli/cli-params.js +0 -114
  199. package/src/cli/cli-params.test.js +0 -43
  200. package/src/cli/service-autodetect.js +0 -11
  201. package/src/cli/service-autodetect.test.js +0 -43
  202. package/src/cli/validate-cli-params.js +0 -137
  203. package/src/cli/validate-cli-params.test.js +0 -134
  204. package/src/files/file-utils.js +0 -7
  205. package/src/files/file-utils.test.js +0 -21
  206. package/src/files/find-files.js +0 -86
  207. package/src/files/read-files.js +0 -65
  208. package/src/files/read-files.test.js +0 -103
  209. package/src/files/temp-buffer.js +0 -13
  210. package/src/files/update-files.js +0 -205
  211. package/src/images/ensure-alpha.js +0 -5
  212. package/src/images/imgly-remove-background.js +0 -23
  213. package/src/images/resize-image.js +0 -23
  214. package/src/images/split-image.js +0 -26
  215. package/src/main/codegen.js +0 -120
  216. package/src/main/codegen.test.js +0 -335
  217. package/src/main/config-lib.js +0 -33
  218. package/src/main/config-lib.test.js +0 -80
  219. package/src/prompt/function-calling-validate.js +0 -25
  220. package/src/prompt/function-defs/ask-question.js +0 -33
  221. package/src/prompt/function-defs/codegen-summary.js +0 -87
  222. package/src/prompt/function-defs/create-directory.js +0 -21
  223. package/src/prompt/function-defs/create-file.js +0 -26
  224. package/src/prompt/function-defs/delete-file.js +0 -21
  225. package/src/prompt/function-defs/download-file.js +0 -25
  226. package/src/prompt/function-defs/explanation.js +0 -17
  227. package/src/prompt/function-defs/generate-image.js +0 -51
  228. package/src/prompt/function-defs/get-image-assets.js +0 -21
  229. package/src/prompt/function-defs/get-source-code.js +0 -21
  230. package/src/prompt/function-defs/imgly-remove-background.js +0 -25
  231. package/src/prompt/function-defs/move-file.js +0 -25
  232. package/src/prompt/function-defs/patch-file.js +0 -39
  233. package/src/prompt/function-defs/resize-image.js +0 -36
  234. package/src/prompt/function-defs/split-image.js +0 -45
  235. package/src/prompt/function-defs/update-file.js +0 -26
  236. package/src/prompt/limits.js +0 -23
  237. package/src/prompt/limits.test.js +0 -40
  238. package/src/prompt/prompt-codegen.js +0 -106
  239. package/src/prompt/prompt-codegen.test.js +0 -116
  240. package/src/prompt/prompt-service-ask-question.test.js +0 -163
  241. package/src/prompt/prompt-service.js +0 -335
  242. package/src/prompt/prompt-service.test.js +0 -602
  243. package/src/prompt/systemprompt.js +0 -39
  244. package/src/prompt/systemprompt.test.js +0 -64
@@ -0,0 +1,511 @@
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 chatGpt from '../ai-service/chat-gpt.js';
5
+ import * as anthropic from '../ai-service/anthropic.js';
6
+ import * as cliParams from '../cli/cli-params.js';
7
+ import fs from 'fs';
8
+ import * as diff from 'diff';
9
+ import mime from 'mime-types';
10
+ import { getImageAssets } from '../files/read-files.js';
11
+ import '../files/find-files.js';
12
+ import * as dalleService from '../ai-service/dall-e.js';
13
+ vi.mock('../ai-service/vertex-ai.js', () => ({ generateContent: vi.fn() }));
14
+ vi.mock('../ai-service/chat-gpt.js', () => ({ generateContent: vi.fn() }));
15
+ vi.mock('../ai-service/anthropic.js', () => ({ generateContent: vi.fn() }));
16
+ vi.mock('../cli/cli-params.js', () => ({
17
+ requireExplanations: false,
18
+ considerAllFiles: false,
19
+ dependencyTree: false,
20
+ explicitPrompt: false,
21
+ allowFileCreate: false,
22
+ allowFileDelete: false,
23
+ allowDirectoryCreate: false,
24
+ allowFileMove: false,
25
+ verbosePrompt: false,
26
+ disableContextOptimization: false,
27
+ vision: false,
28
+ imagen: false,
29
+ temperature: 0.7,
30
+ cheap: false,
31
+ askQuestion: false,
32
+ }));
33
+ vi.mock('fs');
34
+ vi.mock('diff');
35
+ vi.mock('mime-types');
36
+ vi.mock('../ai-service/dall-e.js', () => ({ generateImage: vi.fn() }));
37
+ // Mock find-files module
38
+ vi.mock('../files/find-files.js', () => ({
39
+ getSourceFiles: () => [],
40
+ getImageAssetFiles: () => [],
41
+ }));
42
+ // Mock read-files module
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: '.',
51
+ extensions: ['.js', '.ts', '.tsx', '.jsx'],
52
+ },
53
+ }));
54
+ describe('promptService', () => {
55
+ beforeEach(() => {
56
+ vi.resetAllMocks();
57
+ vi.mocked(cliParams).anthropic = false;
58
+ vi.mocked(cliParams).chatGpt = false;
59
+ vi.mocked(cliParams).vertexAi = false;
60
+ vi.mocked(cliParams).dryRun = false;
61
+ vi.mocked(cliParams).vision = false;
62
+ vi.mocked(cliParams).imagen = undefined;
63
+ vi.mocked(cliParams).disableContextOptimization = false;
64
+ });
65
+ it('should process the codegen summary and return the result with Vertex AI', async () => {
66
+ vi.mocked(cliParams).vertexAi = true;
67
+ const mockFunctionCalls = [
68
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Hello");' } },
69
+ ];
70
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
71
+ const result = await promptService(vertexAi.generateContent, undefined);
72
+ expect(result).toEqual(mockFunctionCalls);
73
+ expect(vertexAi.generateContent).toHaveBeenCalled();
74
+ });
75
+ it('should process the codegen summary and return the result with ChatGPT', async () => {
76
+ vi.mocked(cliParams).chatGpt = true;
77
+ const mockFunctionCalls = [{ name: 'createFile', args: { filePath: 'new.js', newContent: 'const x = 5;' } }];
78
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockFunctionCalls);
79
+ const result = await promptService(chatGpt.generateContent, undefined);
80
+ expect(result).toEqual(mockFunctionCalls);
81
+ expect(chatGpt.generateContent).toHaveBeenCalled();
82
+ });
83
+ it('should process the codegen summary and return the result with Anthropic', async () => {
84
+ vi.mocked(cliParams).anthropic = true;
85
+ const mockFunctionCalls = [{ name: 'deleteFile', args: { filePath: 'obsolete.js' } }];
86
+ vi.mocked(anthropic.generateContent).mockResolvedValueOnce(mockFunctionCalls);
87
+ const result = await promptService(anthropic.generateContent, undefined);
88
+ expect(result).toEqual(mockFunctionCalls);
89
+ expect(anthropic.generateContent).toHaveBeenCalled();
90
+ });
91
+ it('should not update files in dry run mode', async () => {
92
+ vi.mocked(cliParams).vertexAi = true;
93
+ vi.mocked(cliParams).dryRun = true;
94
+ const mockFunctionCalls = [
95
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Dry run");' } },
96
+ ];
97
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
98
+ const result = await promptService(vertexAi.generateContent, undefined);
99
+ expect(result).toEqual(mockFunctionCalls);
100
+ expect(vertexAi.generateContent).toHaveBeenCalled();
101
+ });
102
+ it('should handle invalid patchFile call and retry without patchFile function', async () => {
103
+ vi.mocked(cliParams).vertexAi = true;
104
+ const mockCodegenSummary = [
105
+ {
106
+ name: 'codegenSummary',
107
+ args: {
108
+ fileUpdates: [{ path: 'test.js', updateToolName: 'patchFile' }],
109
+ contextPaths: [],
110
+ explanation: 'Mock summary',
111
+ },
112
+ },
113
+ ];
114
+ const mockInvalidPatchCall = [
115
+ {
116
+ name: 'patchFile',
117
+ args: {
118
+ filePath: 'test.js',
119
+ patch: 'invalid patch',
120
+ },
121
+ },
122
+ ];
123
+ const mockValidUpdateCall = [
124
+ {
125
+ name: 'updateFile',
126
+ args: {
127
+ filePath: 'test.js',
128
+ newContent: 'console.log("Updated content");',
129
+ },
130
+ },
131
+ ];
132
+ // Mock the first call to return the codegen summary
133
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
134
+ // Mock the second call to return an invalid patch
135
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockInvalidPatchCall);
136
+ // Mock the third call (retry) to return a valid update
137
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockValidUpdateCall);
138
+ // Mock fs.readFileSync to return some content
139
+ vi.mocked(fs.readFileSync).mockReturnValue('Original content');
140
+ // Mock diff.applyPatch to fail for the invalid patch
141
+ vi.mocked(diff.applyPatch).mockReturnValue(false);
142
+ const result = await promptService(vertexAi.generateContent, undefined);
143
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
144
+ expect(fs.readFileSync).toHaveBeenCalledWith('test.js', 'utf-8');
145
+ expect(diff.applyPatch).toHaveBeenCalledWith('Original content', 'invalid patch');
146
+ expect(result).toEqual(mockValidUpdateCall);
147
+ });
148
+ it('should include image assets when vision flag is true', async () => {
149
+ vi.mocked(cliParams).chatGpt = true;
150
+ vi.mocked(cliParams).vision = true;
151
+ const mockImageAssets = {
152
+ '/path/to/image1.png': { width: 100, height: 100, mimeType: 'image/png' },
153
+ '/path/to/image2.jpg': { width: 200, height: 200, mimeType: 'image/png' },
154
+ };
155
+ const mockFunctionCalls = [
156
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Vision test");' } },
157
+ ];
158
+ vi.mocked(getImageAssets).mockReturnValue(mockImageAssets);
159
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockFunctionCalls);
160
+ await promptService(chatGpt.generateContent, undefined);
161
+ expect(chatGpt.generateContent).toHaveBeenCalled();
162
+ const calls = vi.mocked(chatGpt.generateContent).mock.calls[0];
163
+ expect(calls[0]).toEqual(expect.arrayContaining([
164
+ expect.objectContaining({
165
+ type: 'user',
166
+ text: expect.stringContaining('I should also provide you with a summary of application image assets'),
167
+ }),
168
+ expect.objectContaining({
169
+ type: 'assistant',
170
+ text: expect.stringContaining('Please provide summary of application image assets.'),
171
+ }),
172
+ expect.objectContaining({
173
+ type: 'user',
174
+ functionResponses: [{ name: 'getImageAssets', content: JSON.stringify(mockImageAssets) }],
175
+ }),
176
+ ]));
177
+ });
178
+ it('should include image data in the prompt when processing files with vision', async () => {
179
+ vi.mocked(cliParams).chatGpt = true;
180
+ vi.mocked(cliParams).vision = true;
181
+ const mockCodegenSummary = [
182
+ {
183
+ name: 'codegenSummary',
184
+ args: {
185
+ fileUpdates: [
186
+ {
187
+ path: 'test.js',
188
+ updateToolName: 'updateFile',
189
+ contextImageAssets: ['/path/to/image1.png', '/path/to/image2.jpg'],
190
+ },
191
+ ],
192
+ contextPaths: [],
193
+ explanation: 'Mock summary',
194
+ },
195
+ },
196
+ ];
197
+ const mockUpdateCall = [
198
+ {
199
+ name: 'updateFile',
200
+ args: {
201
+ filePath: 'test.js',
202
+ newContent: 'console.log("Updated with vision");',
203
+ },
204
+ },
205
+ ];
206
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockCodegenSummary);
207
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockUpdateCall);
208
+ vi.mocked(fs.readFileSync).mockImplementation((path) => `mock-base64-data-for-${path}`);
209
+ vi.mocked(mime.lookup).mockImplementation((path) => (path.endsWith('.png') ? 'image/png' : 'image/jpeg'));
210
+ await promptService(chatGpt.generateContent, undefined);
211
+ expect(chatGpt.generateContent).toHaveBeenCalledTimes(2);
212
+ const secondCall = vi.mocked(chatGpt.generateContent).mock.calls[1];
213
+ expect(secondCall[0]).toEqual(expect.arrayContaining([
214
+ expect.objectContaining({
215
+ type: 'user',
216
+ text: expect.stringContaining('suggest changes for the `test.js` file'),
217
+ images: [
218
+ {
219
+ path: '/path/to/image1.png',
220
+ base64url: 'mock-base64-data-for-/path/to/image1.png',
221
+ mediaType: 'image/png',
222
+ },
223
+ {
224
+ path: '/path/to/image2.jpg',
225
+ base64url: 'mock-base64-data-for-/path/to/image2.jpg',
226
+ mediaType: 'image/jpeg',
227
+ },
228
+ ],
229
+ }),
230
+ ]));
231
+ });
232
+ it('should not include image assets when vision flag is false', async () => {
233
+ vi.mocked(cliParams).chatGpt = true;
234
+ vi.mocked(cliParams).vision = false;
235
+ const mockFunctionCalls = [
236
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("No vision test");' } },
237
+ ];
238
+ vi.mocked(chatGpt.generateContent).mockResolvedValueOnce(mockFunctionCalls);
239
+ await promptService(chatGpt.generateContent, undefined);
240
+ expect(chatGpt.generateContent).toHaveBeenCalled();
241
+ const calls = vi.mocked(chatGpt.generateContent).mock.calls[0];
242
+ expect(calls[0]).not.toEqual(expect.arrayContaining([
243
+ expect.objectContaining({
244
+ type: 'user',
245
+ text: expect.stringContaining('I should also provide you with a summary of application image assets'),
246
+ }),
247
+ ]));
248
+ });
249
+ it('should handle context optimization', async () => {
250
+ vi.mocked(cliParams).vertexAi = true;
251
+ const mockCodegenSummary = [
252
+ {
253
+ name: 'codegenSummary',
254
+ args: {
255
+ fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
256
+ contextPaths: ['context1.js', 'context2.js'],
257
+ explanation: 'Mock summary with context',
258
+ },
259
+ },
260
+ ];
261
+ const mockUpdateCall = [
262
+ {
263
+ name: 'updateFile',
264
+ args: {
265
+ filePath: 'test.js',
266
+ newContent: 'console.log("Updated with context");',
267
+ },
268
+ },
269
+ ];
270
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
271
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockUpdateCall);
272
+ await promptService(vertexAi.generateContent, undefined);
273
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
274
+ const firstCall = vi.mocked(vertexAi.generateContent).mock.calls[0];
275
+ expect(firstCall[0]).toEqual(expect.arrayContaining([
276
+ expect.objectContaining({
277
+ type: 'user',
278
+ functionResponses: [
279
+ expect.objectContaining({
280
+ name: 'getSourceCode',
281
+ content: expect.any(String),
282
+ }),
283
+ ],
284
+ }),
285
+ ]));
286
+ });
287
+ it('should handle disableContextOptimization flag', async () => {
288
+ vi.mocked(cliParams).vertexAi = true;
289
+ vi.mocked(cliParams).disableContextOptimization = true;
290
+ const mockCodegenSummary = [
291
+ {
292
+ name: 'codegenSummary',
293
+ args: {
294
+ fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
295
+ contextPaths: ['context1.js', 'context2.js'],
296
+ explanation: 'Mock summary without context optimization',
297
+ },
298
+ },
299
+ ];
300
+ const mockUpdateCall = [
301
+ {
302
+ name: 'updateFile',
303
+ args: {
304
+ filePath: 'test.js',
305
+ newContent: 'console.log("Updated without context optimization");',
306
+ },
307
+ },
308
+ ];
309
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
310
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockUpdateCall);
311
+ await promptService(vertexAi.generateContent, undefined);
312
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
313
+ const firstCall = vi.mocked(vertexAi.generateContent).mock.calls[0];
314
+ expect(firstCall[0]).not.toEqual(expect.arrayContaining([
315
+ expect.objectContaining({
316
+ type: 'user',
317
+ functionResponses: [
318
+ expect.objectContaining({
319
+ name: 'getSourceCode',
320
+ content: expect.stringContaining('context1.js'),
321
+ }),
322
+ ],
323
+ }),
324
+ ]));
325
+ });
326
+ it('should handle image generation requests', async () => {
327
+ vi.mocked(cliParams).vertexAi = true;
328
+ vi.mocked(cliParams).imagen = 'dall-e';
329
+ const mockCodegenSummary = [
330
+ {
331
+ name: 'codegenSummary',
332
+ args: {
333
+ fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
334
+ contextPaths: [],
335
+ explanation: 'Mock summary with image generation',
336
+ },
337
+ },
338
+ ];
339
+ const mockGenerateImageCall = [
340
+ {
341
+ name: 'generateImage',
342
+ args: {
343
+ prompt: 'A test image',
344
+ filePath: '/path/to/generated/image.png',
345
+ size: { width: 256, height: 256 },
346
+ },
347
+ },
348
+ ];
349
+ const mockDownloadFileCall = [
350
+ {
351
+ name: 'downloadFile',
352
+ args: {
353
+ filePath: '/path/to/generated/image.png',
354
+ explanation: 'Downloading generated image',
355
+ downloadUrl: 'https://example.com/generated-image.png',
356
+ },
357
+ },
358
+ ];
359
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
360
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockGenerateImageCall);
361
+ vi.mocked(dalleService.generateImage).mockResolvedValue('https://example.com/generated-image.png');
362
+ const result = await promptService(vertexAi.generateContent, dalleService.generateImage);
363
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
364
+ expect(dalleService.generateImage).toHaveBeenCalledWith('A test image', undefined, { width: 256, height: 256 }, false);
365
+ expect(result).toEqual(expect.arrayContaining(mockDownloadFileCall));
366
+ });
367
+ it('should handle image generation failure', async () => {
368
+ vi.mocked(cliParams).vertexAi = true;
369
+ vi.mocked(cliParams).imagen = 'dall-e';
370
+ const mockCodegenSummary = [
371
+ {
372
+ name: 'codegenSummary',
373
+ args: {
374
+ fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
375
+ contextPaths: [],
376
+ explanation: 'Mock summary with image generation failure',
377
+ },
378
+ },
379
+ ];
380
+ const mockGenerateImageCall = [
381
+ {
382
+ name: 'generateImage',
383
+ args: {
384
+ prompt: 'A test image',
385
+ filePath: '/path/to/generated/image.png',
386
+ size: { width: 256, height: 256 },
387
+ },
388
+ },
389
+ ];
390
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
391
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockGenerateImageCall);
392
+ vi.mocked(dalleService.generateImage).mockRejectedValue(new Error('Image generation failed'));
393
+ const result = await promptService(vertexAi.generateContent, dalleService.generateImage);
394
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(2);
395
+ expect(dalleService.generateImage).toHaveBeenCalledWith('A test image', undefined, { width: 256, height: 256 }, false);
396
+ expect(result).toEqual(expect.arrayContaining([
397
+ expect.objectContaining({
398
+ name: 'explanation',
399
+ args: {
400
+ text: expect.stringContaining('Failed to generate image: Image generation failed'),
401
+ },
402
+ }),
403
+ ]));
404
+ });
405
+ it('should handle unexpected response without codegen summary', async () => {
406
+ vi.mocked(cliParams).vertexAi = true;
407
+ const mockUnexpectedResponse = [
408
+ {
409
+ name: 'updateFile',
410
+ args: {
411
+ filePath: 'test.js',
412
+ newContent: 'console.log("Unexpected response");',
413
+ },
414
+ },
415
+ ];
416
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockUnexpectedResponse);
417
+ const result = await promptService(vertexAi.generateContent, undefined);
418
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(1);
419
+ expect(result).toEqual(mockUnexpectedResponse);
420
+ });
421
+ describe('validateAndRecoverSingleResult', () => {
422
+ it('should successfully recover from an invalid function call', async () => {
423
+ vi.mocked(cliParams).vertexAi = true;
424
+ const mockInvalidCall = [
425
+ {
426
+ name: 'codegenSummary',
427
+ args: {
428
+ files: [{ path: 'test.js', updateToolName: 'patchFile' }],
429
+ contextPaths: [],
430
+ explanation: 'Mock summary',
431
+ },
432
+ },
433
+ ];
434
+ const mockValidCall = [
435
+ {
436
+ name: 'codegenSummary',
437
+ args: {
438
+ fileUpdates: [{ path: 'test.js', updateToolName: 'patchFile' }],
439
+ contextPaths: [],
440
+ explanation: 'Mock summary',
441
+ },
442
+ },
443
+ ];
444
+ vi.mocked(vertexAi.generateContent)
445
+ .mockResolvedValueOnce(mockInvalidCall)
446
+ .mockResolvedValueOnce(mockValidCall)
447
+ .mockResolvedValueOnce([
448
+ {
449
+ name: 'updateFile',
450
+ args: {
451
+ filePath: 'test.js',
452
+ newContent: 'console.log("Unexpected response");',
453
+ },
454
+ },
455
+ ]);
456
+ const result = await promptService(vertexAi.generateContent, undefined);
457
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
458
+ expect(result).toEqual([
459
+ {
460
+ args: {
461
+ filePath: 'test.js',
462
+ newContent: 'console.log("Unexpected response");',
463
+ },
464
+ name: 'updateFile',
465
+ },
466
+ ]);
467
+ });
468
+ it('should handle unsuccessful recovery', async () => {
469
+ vi.mocked(cliParams).vertexAi = true;
470
+ const mockInvalidCall = [
471
+ {
472
+ name: 'updateFile',
473
+ args: { filePath: 'test.js', invalidArg: 'This should not be here' },
474
+ },
475
+ ];
476
+ vi.mocked(vertexAi.generateContent)
477
+ .mockResolvedValueOnce([
478
+ {
479
+ name: 'codegenSummary',
480
+ args: {
481
+ fileUpdates: [{ path: 'test.js', updateToolName: 'patchFile' }],
482
+ contextPaths: [],
483
+ explanation: 'Mock summary',
484
+ },
485
+ },
486
+ ])
487
+ .mockResolvedValueOnce(mockInvalidCall)
488
+ .mockResolvedValueOnce(mockInvalidCall); // Second call also returns invalid result
489
+ await expect(promptService(vertexAi.generateContent, undefined)).rejects.toThrow('Recovery failed');
490
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(3);
491
+ });
492
+ it('should not attempt recovery for multiple valid function calls', async () => {
493
+ vi.mocked(cliParams).vertexAi = true;
494
+ const mockValidCalls = [
495
+ {
496
+ name: 'updateFile',
497
+ args: { filePath: 'test1.js', newContent: 'console.log("File 1");' },
498
+ },
499
+ {
500
+ name: 'updateFile',
501
+ args: { filePath: 'test2.js', newContent: 'console.log("File 2");' },
502
+ },
503
+ ];
504
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockValidCalls);
505
+ const result = await promptService(vertexAi.generateContent, undefined);
506
+ expect(vertexAi.generateContent).toHaveBeenCalledTimes(1);
507
+ expect(result).toEqual(mockValidCalls);
508
+ });
509
+ });
510
+ });
511
+ //# 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,2 @@
1
+ /** Generates a system prompt */
2
+ export declare function getSystemPrompt(): string;
@@ -0,0 +1,43 @@
1
+ import { CODEGEN_TRIGGER } from './prompt-consts.js';
2
+ import { verbosePrompt, askQuestion } from '../cli/cli-params.js';
3
+ import { verifySystemPromptLimit } from './limits.js';
4
+ import { rcConfig } from '../main/config.js';
5
+ /** Generates a system prompt */
6
+ export function getSystemPrompt() {
7
+ console.log('Generate system prompt');
8
+ let systemPrompt = `
9
+ You are a code generation assistant. I want you to help me generate code for my ideas in my application source code.
10
+
11
+ You can generate new code, or modify the existing one. You will receive instructions on what is the goal of requested code modification.
12
+
13
+ Instructions will be passed to you either directly via message, with a file, or using the ${CODEGEN_TRIGGER} comment in the code.
14
+
15
+ You should parse my application source code and then suggest changes using appropriate tools.
16
+
17
+ The root directory of my application is \`${rcConfig.rootDir}\` and you should limit the changes only to this path.
18
+
19
+ Additional suggestions, or corners cases to think about:
20
+ - When suggesting changes always use absolute file paths.
21
+ - Always aim to return working code
22
+ - Do not leave out commented out fragments like "// ... (keep other existing functions)"
23
+ - For large files prefer to use \`patchFile\` function
24
+ - Suggest user to split large files if it makes sense for current task
25
+ - At the start of conversation the user will express what you are allowed to do (for example: create files, move files, generate images etc.). At the start of conversation you should ensure you have necessary allowances for the current task.
26
+ - Consider failing the task with explanation if instructions are not clear enough, or something feels completely wrong.
27
+ - Do not produce unnecessary code, ensure the code you generate will be used once all changes are done.
28
+
29
+ `;
30
+ if (askQuestion) {
31
+ systemPrompt +=
32
+ '\nYou have the ability to ask the user a question at the beginning of the conversation if you need more information or clarification. ' +
33
+ 'Use this feature wisely to gather any crucial information that would help you better understand the task or provide more accurate code generation. ' +
34
+ "To ask a question, use the 'askQuestion' function.";
35
+ }
36
+ if (verbosePrompt) {
37
+ console.log('System prompt:');
38
+ console.log(systemPrompt);
39
+ }
40
+ verifySystemPromptLimit(systemPrompt);
41
+ return systemPrompt;
42
+ }
43
+ //# sourceMappingURL=systemprompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemprompt.js","sourceRoot":"","sources":["../../src/prompt/systemprompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,gCAAgC;AAChC,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAEtC,IAAI,YAAY,GAAG;;;;;8FAKyE,eAAe;;;;8CAI/D,QAAQ,CAAC,OAAO;;;;;;;;;;;;GAY3D,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,YAAY;YACV,wIAAwI;gBACxI,qJAAqJ;gBACrJ,oDAAoD,CAAC;IACzD,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IAED,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAEtC,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import '../files/find-files.js';
2
+ import '../main/config.js';
@@ -0,0 +1,47 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { getSystemPrompt } from './systemprompt.js';
3
+ import * as cliParams from '../cli/cli-params.js';
4
+ import '../files/find-files.js';
5
+ import '../main/config.js';
6
+ vi.mock('../cli/cli-params.js', () => ({
7
+ requireExplanations: false,
8
+ considerAllFiles: false,
9
+ dependencyTree: false,
10
+ explicitPrompt: false,
11
+ allowFileCreate: false,
12
+ allowFileDelete: false,
13
+ allowDirectoryCreate: false,
14
+ allowFileMove: false,
15
+ verbosePrompt: false,
16
+ askQuestion: false,
17
+ }));
18
+ vi.mock('../files/find-files.js', () => ({
19
+ getSourceFiles: vi.fn(),
20
+ }));
21
+ vi.mock('../main/config.js', () => ({
22
+ rcConfig: { rootDir: '/mocked/root/dir' },
23
+ }));
24
+ describe('getSystemPrompt', () => {
25
+ beforeEach(() => {
26
+ vi.clearAllMocks();
27
+ });
28
+ it('generates correct system prompt', () => {
29
+ const systemPrompt = getSystemPrompt();
30
+ expect(systemPrompt).toContain('You are a code generation assistant. I want you to help me generate code for my ideas in my application source code.');
31
+ expect(systemPrompt).toContain('You can generate new code, or modify the existing one.');
32
+ expect(systemPrompt).toContain('Instructions will be passed to you either directly via message, with a file, or using the ' +
33
+ '@' +
34
+ 'CODEGEN comment in the code.');
35
+ expect(systemPrompt).toContain('The root directory of my application is `/mocked/root/dir` and you should limit the changes only to this path.');
36
+ expect(systemPrompt).toContain('When suggesting changes always use absolute file paths.');
37
+ });
38
+ it('verifies system prompt limit', () => {
39
+ vi.spyOn(cliParams, 'verbosePrompt', 'get').mockReturnValue(true);
40
+ const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
41
+ getSystemPrompt();
42
+ expect(consoleSpy).toHaveBeenCalledWith('System prompt:');
43
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('You are a code generation assistant. I want you to help me generate code for my ideas'));
44
+ consoleSpy.mockRestore();
45
+ });
46
+ });
47
+ //# sourceMappingURL=systemprompt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemprompt.test.js","sourceRoot":"","sources":["../../src/prompt/systemprompt.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,wBAAwB,CAAC;AAChC,OAAO,mBAAmB,CAAC;AAE3B,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,mBAAmB,EAAE,KAAK;IAC1B,gBAAgB,EAAE,KAAK;IACvB,cAAc,EAAE,KAAK;IACrB,cAAc,EAAE,KAAK;IACrB,eAAe,EAAE,KAAK;IACtB,eAAe,EAAE,KAAK;IACtB,oBAAoB,EAAE,KAAK;IAC3B,aAAa,EAAE,KAAK;IACpB,aAAa,EAAE,KAAK;IACpB,WAAW,EAAE,KAAK;CACnB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACvC,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;CACxB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,QAAQ,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE;CAC1C,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QAEvC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAC5B,sHAAsH,CACvH,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,wDAAwD,CAAC,CAAC;QACzF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAC5B,4FAA4F;YAC1F,GAAG;YACH,8BAA8B,CACjC,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAC5B,gHAAgH,CACjH,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,yDAAyD,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEzE,eAAe,EAAE,CAAC;QAElB,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CACrC,MAAM,CAAC,gBAAgB,CAAC,uFAAuF,CAAC,CACjH,CAAC;QAEF,UAAU,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}