genaicode 0.0.35 → 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 (229) hide show
  1. package/README.md +3 -0
  2. package/bin/genaicode-dev.js +11 -0
  3. package/bin/genaicode.cjs +8 -1
  4. package/dist/ai-service/ai-studio.d.ts +5 -0
  5. package/dist/ai-service/ai-studio.js +135 -0
  6. package/dist/ai-service/ai-studio.js.map +1 -0
  7. package/dist/ai-service/anthropic.d.ts +5 -0
  8. package/dist/ai-service/anthropic.js +133 -0
  9. package/dist/ai-service/anthropic.js.map +1 -0
  10. package/dist/ai-service/chat-gpt.d.ts +5 -0
  11. package/dist/ai-service/chat-gpt.js +131 -0
  12. package/dist/ai-service/chat-gpt.js.map +1 -0
  13. package/dist/ai-service/common.d.ts +57 -0
  14. package/dist/ai-service/common.js +38 -0
  15. package/dist/ai-service/common.js.map +1 -0
  16. package/dist/ai-service/common.test.d.ts +1 -0
  17. package/dist/ai-service/common.test.js +85 -0
  18. package/dist/ai-service/common.test.js.map +1 -0
  19. package/dist/ai-service/dall-e.d.ts +14 -0
  20. package/dist/ai-service/dall-e.js +47 -0
  21. package/dist/ai-service/dall-e.js.map +1 -0
  22. package/dist/ai-service/vertex-ai-claude.d.ts +5 -0
  23. package/dist/ai-service/vertex-ai-claude.js +93 -0
  24. package/dist/ai-service/vertex-ai-claude.js.map +1 -0
  25. package/dist/ai-service/vertex-ai-imagen.d.ts +14 -0
  26. package/dist/ai-service/vertex-ai-imagen.js +74 -0
  27. package/dist/ai-service/vertex-ai-imagen.js.map +1 -0
  28. package/dist/ai-service/vertex-ai.d.ts +7 -0
  29. package/dist/ai-service/vertex-ai.js +147 -0
  30. package/dist/ai-service/vertex-ai.js.map +1 -0
  31. package/dist/cli/cli-options.d.ts +10 -0
  32. package/dist/cli/cli-options.js +124 -0
  33. package/dist/cli/cli-options.js.map +1 -0
  34. package/dist/cli/cli-options.test.d.ts +1 -0
  35. package/dist/cli/cli-options.test.js +34 -0
  36. package/dist/cli/cli-options.test.js.map +1 -0
  37. package/dist/cli/cli-params.d.ts +29 -0
  38. package/dist/cli/cli-params.js +103 -0
  39. package/dist/cli/cli-params.js.map +1 -0
  40. package/dist/cli/cli-params.test.d.ts +1 -0
  41. package/dist/cli/cli-params.test.js +38 -0
  42. package/dist/cli/cli-params.test.js.map +1 -0
  43. package/dist/cli/service-autodetect.d.ts +2 -0
  44. package/dist/cli/service-autodetect.js +17 -0
  45. package/dist/cli/service-autodetect.js.map +1 -0
  46. package/dist/cli/service-autodetect.test.d.ts +1 -0
  47. package/dist/cli/service-autodetect.test.js +38 -0
  48. package/dist/cli/service-autodetect.test.js.map +1 -0
  49. package/dist/cli/validate-cli-params.d.ts +18 -0
  50. package/dist/cli/validate-cli-params.js +128 -0
  51. package/dist/cli/validate-cli-params.js.map +1 -0
  52. package/dist/cli/validate-cli-params.test.d.ts +1 -0
  53. package/dist/cli/validate-cli-params.test.js +106 -0
  54. package/dist/cli/validate-cli-params.test.js.map +1 -0
  55. package/dist/files/file-utils.d.ts +2 -0
  56. package/dist/files/file-utils.js +7 -0
  57. package/dist/files/file-utils.js.map +1 -0
  58. package/dist/files/file-utils.test.d.ts +1 -0
  59. package/dist/files/file-utils.test.js +18 -0
  60. package/dist/files/file-utils.test.js.map +1 -0
  61. package/dist/files/find-files.d.ts +8 -0
  62. package/dist/files/find-files.js +76 -0
  63. package/dist/files/find-files.js.map +1 -0
  64. package/dist/files/read-files.d.ts +13 -0
  65. package/dist/files/read-files.js +61 -0
  66. package/dist/files/read-files.js.map +1 -0
  67. package/dist/files/read-files.test.d.ts +1 -0
  68. package/dist/files/read-files.test.js +89 -0
  69. package/dist/files/read-files.test.js.map +1 -0
  70. package/dist/files/temp-buffer.d.ts +2 -0
  71. package/dist/files/temp-buffer.js +12 -0
  72. package/dist/files/temp-buffer.js.map +1 -0
  73. package/dist/files/update-files.d.ts +5 -0
  74. package/dist/files/update-files.js +197 -0
  75. package/dist/files/update-files.js.map +1 -0
  76. package/dist/images/ensure-alpha.d.ts +1 -0
  77. package/dist/images/ensure-alpha.js +5 -0
  78. package/dist/images/ensure-alpha.js.map +1 -0
  79. package/dist/images/imgly-remove-background.d.ts +2 -0
  80. package/dist/images/imgly-remove-background.js +21 -0
  81. package/dist/images/imgly-remove-background.js.map +1 -0
  82. package/dist/images/resize-image.d.ts +19 -0
  83. package/dist/images/resize-image.js +22 -0
  84. package/dist/images/resize-image.js.map +1 -0
  85. package/dist/images/split-image.d.ts +18 -0
  86. package/dist/images/split-image.js +25 -0
  87. package/dist/images/split-image.js.map +1 -0
  88. package/dist/main/codegen.d.ts +2 -0
  89. package/dist/main/codegen.js +101 -0
  90. package/dist/main/codegen.js.map +1 -0
  91. package/dist/main/codegen.test.d.ts +2 -0
  92. package/dist/main/codegen.test.js +259 -0
  93. package/dist/main/codegen.test.js.map +1 -0
  94. package/dist/main/config-lib.d.ts +8 -0
  95. package/dist/main/config-lib.js +28 -0
  96. package/dist/main/config-lib.js.map +1 -0
  97. package/dist/main/config-lib.test.d.ts +1 -0
  98. package/dist/main/config-lib.test.js +64 -0
  99. package/dist/main/config-lib.test.js.map +1 -0
  100. package/dist/main/config.d.ts +5 -0
  101. package/{src → dist}/main/config.js +16 -22
  102. package/dist/main/config.js.map +1 -0
  103. package/dist/prompt/function-calling-validate.d.ts +3 -0
  104. package/dist/prompt/function-calling-validate.js +27 -0
  105. package/dist/prompt/function-calling-validate.js.map +1 -0
  106. package/dist/prompt/function-calling.d.ts +5 -0
  107. package/dist/prompt/function-calling.js +48 -0
  108. package/dist/prompt/function-calling.js.map +1 -0
  109. package/dist/prompt/function-defs/ask-question.d.ts +31 -0
  110. package/dist/prompt/function-defs/ask-question.js +32 -0
  111. package/dist/prompt/function-defs/ask-question.js.map +1 -0
  112. package/dist/prompt/function-defs/codegen-summary.d.ts +63 -0
  113. package/dist/prompt/function-defs/codegen-summary.js +80 -0
  114. package/dist/prompt/function-defs/codegen-summary.js.map +1 -0
  115. package/dist/prompt/function-defs/create-directory.d.ts +21 -0
  116. package/dist/prompt/function-defs/create-directory.js +22 -0
  117. package/dist/prompt/function-defs/create-directory.js.map +1 -0
  118. package/dist/prompt/function-defs/create-file.d.ts +25 -0
  119. package/dist/prompt/function-defs/create-file.js +26 -0
  120. package/dist/prompt/function-defs/create-file.js.map +1 -0
  121. package/dist/prompt/function-defs/delete-file.d.ts +21 -0
  122. package/dist/prompt/function-defs/delete-file.js +22 -0
  123. package/dist/prompt/function-defs/delete-file.js.map +1 -0
  124. package/dist/prompt/function-defs/download-file.d.ts +25 -0
  125. package/dist/prompt/function-defs/download-file.js +26 -0
  126. package/dist/prompt/function-defs/download-file.js.map +1 -0
  127. package/dist/prompt/function-defs/explanation.d.ts +17 -0
  128. package/dist/prompt/function-defs/explanation.js +18 -0
  129. package/dist/prompt/function-defs/explanation.js.map +1 -0
  130. package/dist/prompt/function-defs/generate-image.d.ts +48 -0
  131. package/dist/prompt/function-defs/generate-image.js +49 -0
  132. package/dist/prompt/function-defs/generate-image.js.map +1 -0
  133. package/dist/prompt/function-defs/get-image-assets.d.ts +20 -0
  134. package/dist/prompt/function-defs/get-image-assets.js +21 -0
  135. package/dist/prompt/function-defs/get-image-assets.js.map +1 -0
  136. package/dist/prompt/function-defs/get-source-code.d.ts +20 -0
  137. package/dist/prompt/function-defs/get-source-code.js +21 -0
  138. package/dist/prompt/function-defs/get-source-code.js.map +1 -0
  139. package/dist/prompt/function-defs/imgly-remove-background.d.ts +25 -0
  140. package/dist/prompt/function-defs/imgly-remove-background.js +26 -0
  141. package/dist/prompt/function-defs/imgly-remove-background.js.map +1 -0
  142. package/dist/prompt/function-defs/move-file.d.ts +25 -0
  143. package/dist/prompt/function-defs/move-file.js +26 -0
  144. package/dist/prompt/function-defs/move-file.js.map +1 -0
  145. package/dist/prompt/function-defs/patch-file.d.ts +25 -0
  146. package/dist/prompt/function-defs/patch-file.js +39 -0
  147. package/dist/prompt/function-defs/patch-file.js.map +1 -0
  148. package/dist/prompt/function-defs/resize-image.d.ts +36 -0
  149. package/dist/prompt/function-defs/resize-image.js +37 -0
  150. package/dist/prompt/function-defs/resize-image.js.map +1 -0
  151. package/dist/prompt/function-defs/split-image.d.ts +57 -0
  152. package/dist/prompt/function-defs/split-image.js +46 -0
  153. package/dist/prompt/function-defs/split-image.js.map +1 -0
  154. package/dist/prompt/function-defs/update-file.d.ts +25 -0
  155. package/dist/prompt/function-defs/update-file.js +26 -0
  156. package/dist/prompt/function-defs/update-file.js.map +1 -0
  157. package/dist/prompt/limits.d.ts +3 -0
  158. package/dist/prompt/limits.js +19 -0
  159. package/dist/prompt/limits.js.map +1 -0
  160. package/dist/prompt/limits.test.d.ts +1 -0
  161. package/dist/prompt/limits.test.js +35 -0
  162. package/dist/prompt/limits.test.js.map +1 -0
  163. package/dist/prompt/prompt-codegen.d.ts +4 -0
  164. package/dist/prompt/prompt-codegen.js +81 -0
  165. package/dist/prompt/prompt-codegen.js.map +1 -0
  166. package/dist/prompt/prompt-codegen.test.d.ts +1 -0
  167. package/dist/prompt/prompt-codegen.test.js +94 -0
  168. package/dist/prompt/prompt-codegen.test.js.map +1 -0
  169. package/dist/prompt/prompt-consts.d.ts +1 -0
  170. package/{src → dist}/prompt/prompt-consts.js +1 -0
  171. package/dist/prompt/prompt-consts.js.map +1 -0
  172. package/dist/prompt/prompt-service-ask-question.test.d.ts +3 -0
  173. package/dist/prompt/prompt-service-ask-question.test.js +146 -0
  174. package/dist/prompt/prompt-service-ask-question.test.js.map +1 -0
  175. package/dist/prompt/prompt-service.d.ts +13 -0
  176. package/dist/prompt/prompt-service.js +278 -0
  177. package/dist/prompt/prompt-service.js.map +1 -0
  178. package/dist/prompt/prompt-service.test.d.ts +1 -0
  179. package/dist/prompt/prompt-service.test.js +511 -0
  180. package/dist/prompt/prompt-service.test.js.map +1 -0
  181. package/dist/prompt/systemprompt.d.ts +2 -0
  182. package/dist/prompt/systemprompt.js +43 -0
  183. package/dist/prompt/systemprompt.js.map +1 -0
  184. package/dist/prompt/systemprompt.test.d.ts +2 -0
  185. package/dist/prompt/systemprompt.test.js +47 -0
  186. package/dist/prompt/systemprompt.test.js.map +1 -0
  187. package/package.json +15 -5
  188. package/bin/genaicode.js +0 -5
  189. package/src/ai-service/anthropic.js +0 -95
  190. package/src/ai-service/chat-gpt.js +0 -99
  191. package/src/ai-service/common.js +0 -40
  192. package/src/ai-service/common.test.js +0 -107
  193. package/src/ai-service/dall-e.js +0 -50
  194. package/src/ai-service/vertex-ai-claude.js +0 -99
  195. package/src/ai-service/vertex-ai-imagen.js +0 -78
  196. package/src/ai-service/vertex-ai.js +0 -156
  197. package/src/cli/cli-options.js +0 -120
  198. package/src/cli/cli-options.test.js +0 -50
  199. package/src/cli/cli-params.js +0 -99
  200. package/src/cli/cli-params.test.js +0 -43
  201. package/src/cli/service-autodetect.js +0 -11
  202. package/src/cli/service-autodetect.test.js +0 -43
  203. package/src/cli/validate-cli-params.js +0 -117
  204. package/src/cli/validate-cli-params.test.js +0 -134
  205. package/src/files/file-utils.js +0 -7
  206. package/src/files/file-utils.test.js +0 -21
  207. package/src/files/find-files.js +0 -86
  208. package/src/files/read-files.js +0 -60
  209. package/src/files/read-files.test.js +0 -102
  210. package/src/files/temp-buffer.js +0 -13
  211. package/src/files/update-files.js +0 -205
  212. package/src/images/ensure-alpha.js +0 -5
  213. package/src/images/imgly-remove-background.js +0 -23
  214. package/src/images/resize-image.js +0 -23
  215. package/src/images/split-image.js +0 -26
  216. package/src/main/codegen.js +0 -120
  217. package/src/main/codegen.test.js +0 -334
  218. package/src/main/config-lib.js +0 -33
  219. package/src/main/config-lib.test.js +0 -80
  220. package/src/prompt/function-calling-validate.js +0 -25
  221. package/src/prompt/function-calling.js +0 -454
  222. package/src/prompt/limits.js +0 -23
  223. package/src/prompt/limits.test.js +0 -40
  224. package/src/prompt/prompt-codegen.js +0 -106
  225. package/src/prompt/prompt-codegen.test.js +0 -116
  226. package/src/prompt/prompt-service.js +0 -287
  227. package/src/prompt/prompt-service.test.js +0 -601
  228. package/src/prompt/systemprompt.js +0 -32
  229. package/src/prompt/systemprompt.test.js +0 -63
@@ -0,0 +1,259 @@
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 '../files/find-files.js';
9
+ import * as cliParams from '../cli/cli-params.js';
10
+ import * as cliOptions from '../cli/cli-options.js';
11
+ import * as vertexAiImagen from '../ai-service/vertex-ai-imagen.js';
12
+ import * as dallE from '../ai-service/dall-e.js';
13
+ import './config.js';
14
+ vi.mock('../ai-service/vertex-ai.js', () => ({ generateContent: vi.fn() }));
15
+ vi.mock('../ai-service/chat-gpt.js', () => ({ generateContent: vi.fn() }));
16
+ vi.mock('../ai-service/anthropic.js', () => ({ generateContent: vi.fn() }));
17
+ vi.mock('../ai-service/vertex-ai-claude.js', () => ({ generateContent: vi.fn() }));
18
+ vi.mock('../files/update-files.js');
19
+ vi.mock('../cli/cli-params.js', () => ({
20
+ requireExplanations: false,
21
+ considerAllFiles: false,
22
+ dependencyTree: false,
23
+ explicitPrompt: false,
24
+ allowFileCreate: false,
25
+ allowFileDelete: false,
26
+ allowDirectoryCreate: false,
27
+ allowFileMove: false,
28
+ verbosePrompt: false,
29
+ vertexAiClaude: false,
30
+ helpRequested: false,
31
+ aiStudio: false,
32
+ vision: false,
33
+ imagen: false,
34
+ temperature: 0.7,
35
+ cheap: false,
36
+ taskFile: undefined,
37
+ disableInitialLint: undefined,
38
+ askQuestion: undefined,
39
+ }));
40
+ vi.mock('../files/find-files.js', () => ({
41
+ getSourceFiles: () => [],
42
+ getImageAssetFiles: () => [],
43
+ }));
44
+ vi.mock('../cli/cli-options.js', () => ({
45
+ printHelpMessage: vi.fn(),
46
+ }));
47
+ vi.mock('../ai-service/vertex-ai-imagen.js', () => ({ generateImage: vi.fn() }));
48
+ vi.mock('../ai-service/dall-e.js', () => ({ generateImage: vi.fn() }));
49
+ vi.mock('./config.js', () => ({
50
+ rootDir: '/mocked/root/dir',
51
+ rcConfig: {
52
+ rootDir: '.',
53
+ extensions: ['.js', '.ts', '.tsx', '.jsx'],
54
+ },
55
+ }));
56
+ describe('runCodegen', () => {
57
+ beforeEach(() => {
58
+ vi.resetAllMocks();
59
+ vi.mocked(cliParams).anthropic = false;
60
+ vi.mocked(cliParams).chatGpt = false;
61
+ vi.mocked(cliParams).vertexAi = false;
62
+ vi.mocked(cliParams).vertexAiClaude = false;
63
+ vi.mocked(cliParams).dryRun = false;
64
+ vi.mocked(cliParams).helpRequested = false;
65
+ vi.mocked(cliParams).vision = false;
66
+ vi.mocked(cliParams).imagen = undefined;
67
+ });
68
+ it('should run codegen with Vertex AI by default', async () => {
69
+ vi.mocked(cliParams).vertexAi = true;
70
+ const mockFunctionCalls = [
71
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Hello");' } },
72
+ ];
73
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
74
+ await runCodegen();
75
+ expect(vertexAi.generateContent).toHaveBeenCalled();
76
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockFunctionCalls);
77
+ });
78
+ it('should run codegen with ChatGPT when chatGpt flag is true', async () => {
79
+ vi.mocked(cliParams).chatGpt = true;
80
+ const mockFunctionCalls = [{ name: 'createFile', args: { filePath: 'new.js', newContent: 'const x = 5;' } }];
81
+ vi.mocked(chatGpt).generateContent.mockResolvedValueOnce(mockFunctionCalls);
82
+ await runCodegen();
83
+ expect(chatGpt.generateContent).toHaveBeenCalled();
84
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockFunctionCalls);
85
+ });
86
+ it('should run codegen with Anthropic when anthropic flag is true', async () => {
87
+ vi.mocked(cliParams).anthropic = true;
88
+ const mockFunctionCalls = [{ name: 'deleteFile', args: { filePath: 'obsolete.js' } }];
89
+ vi.mocked(anthropic).generateContent.mockResolvedValueOnce(mockFunctionCalls);
90
+ await runCodegen();
91
+ expect(anthropic.generateContent).toHaveBeenCalled();
92
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockFunctionCalls);
93
+ });
94
+ it('should not update files in dry run mode', async () => {
95
+ vi.mocked(cliParams).vertexAi = true;
96
+ vi.mocked(cliParams).dryRun = true;
97
+ const mockFunctionCalls = [
98
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Dry run");' } },
99
+ ];
100
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
101
+ await runCodegen();
102
+ expect(vertexAi.generateContent).toHaveBeenCalled();
103
+ expect(updateFiles.updateFiles).not.toHaveBeenCalled();
104
+ });
105
+ it('should run codegen with Vertex AI Claude when vertexAiClaude flag is true', async () => {
106
+ vi.mocked(cliParams).vertexAiClaude = true;
107
+ const mockFunctionCalls = [
108
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Hello from Claude");' } },
109
+ ];
110
+ vi.mocked(vertexAiClaude).generateContent.mockResolvedValueOnce(mockFunctionCalls);
111
+ await runCodegen();
112
+ expect(vertexAiClaude.generateContent).toHaveBeenCalled();
113
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockFunctionCalls);
114
+ });
115
+ it('should pass the temperature parameter to the AI service', async () => {
116
+ vi.mocked(cliParams).vertexAi = true;
117
+ vi.mocked(cliParams).temperature = 0.5;
118
+ const mockFunctionCalls = [
119
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Temperature test");' } },
120
+ ];
121
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
122
+ await runCodegen();
123
+ expect(vertexAi.generateContent).toHaveBeenCalledWith(expect.anything(), expect.anything(), expect.anything(), 0.5, false);
124
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockFunctionCalls);
125
+ });
126
+ it('should print help message and not run codegen when --help option is provided', async () => {
127
+ vi.mocked(cliParams).helpRequested = true;
128
+ await runCodegen();
129
+ expect(cliOptions.printHelpMessage).toHaveBeenCalled();
130
+ expect(vertexAi.generateContent).not.toHaveBeenCalled();
131
+ expect(chatGpt.generateContent).not.toHaveBeenCalled();
132
+ expect(anthropic.generateContent).not.toHaveBeenCalled();
133
+ expect(vertexAiClaude.generateContent).not.toHaveBeenCalled();
134
+ expect(updateFiles.updateFiles).not.toHaveBeenCalled();
135
+ });
136
+ it('should run codegen with vision when vision flag is true', async () => {
137
+ vi.mocked(cliParams).chatGpt = true;
138
+ vi.mocked(cliParams).vision = true;
139
+ const mockFunctionCalls = [
140
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Vision test");' } },
141
+ ];
142
+ vi.mocked(chatGpt).generateContent.mockResolvedValueOnce(mockFunctionCalls);
143
+ await runCodegen();
144
+ expect(chatGpt.generateContent).toHaveBeenCalled();
145
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockFunctionCalls);
146
+ // Check if the generateContent function was called with the correct parameters
147
+ expect(vi.mocked(chatGpt).generateContent.mock.calls[0][0]).toEqual(expect.arrayContaining([
148
+ expect.objectContaining({
149
+ type: 'user',
150
+ text: expect.stringContaining('I should also provide you with a summary of application image assets'),
151
+ }),
152
+ expect.objectContaining({
153
+ type: 'assistant',
154
+ text: expect.stringContaining('Please provide summary of application image assets.'),
155
+ }),
156
+ expect.objectContaining({
157
+ type: 'user',
158
+ functionResponses: [{ name: 'getImageAssets', content: expect.any(String) }],
159
+ }),
160
+ ]));
161
+ });
162
+ it('should use Vertex AI Imagen when imagen flag is set to vertex-ai', async () => {
163
+ vi.mocked(cliParams).imagen = 'vertex-ai';
164
+ vi.mocked(cliParams).vertexAi = true;
165
+ const mockCodegenSummary = [
166
+ {
167
+ name: 'codegenSummary',
168
+ args: {
169
+ fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
170
+ contextPaths: [],
171
+ explanation: 'Mock summary with image generation failure',
172
+ },
173
+ },
174
+ ];
175
+ const mockFunctionCalls = [
176
+ { name: 'generateImage', args: { prompt: 'A beautiful landscape', filePath: 'landscape.png', size: '512x512' } },
177
+ ];
178
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
179
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
180
+ vi.mocked(vertexAiImagen).generateImage.mockResolvedValueOnce('mocked-image-data');
181
+ await runCodegen();
182
+ expect(vertexAi.generateContent).toHaveBeenCalled();
183
+ expect(vertexAiImagen.generateImage).toHaveBeenCalledWith('A beautiful landscape', undefined, '512x512', false);
184
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockFunctionCalls);
185
+ });
186
+ it('should use DALL-E when imagen flag is set to dall-e', async () => {
187
+ vi.mocked(cliParams).imagen = 'dall-e';
188
+ vi.mocked(cliParams).chatGpt = true;
189
+ const mockCodegenSummary = [
190
+ {
191
+ name: 'codegenSummary',
192
+ args: {
193
+ fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
194
+ contextPaths: [],
195
+ explanation: 'Mock summary with image generation failure',
196
+ },
197
+ },
198
+ ];
199
+ const mockFunctionCalls = [
200
+ { name: 'generateImage', args: { prompt: 'A futuristic city', filePath: 'city.png', size: '1024x1024' } },
201
+ ];
202
+ vi.mocked(chatGpt).generateContent.mockResolvedValueOnce(mockCodegenSummary);
203
+ vi.mocked(chatGpt).generateContent.mockResolvedValueOnce(mockFunctionCalls);
204
+ vi.mocked(dallE).generateImage.mockResolvedValueOnce('mocked-image-data');
205
+ await runCodegen();
206
+ expect(chatGpt.generateContent).toHaveBeenCalled();
207
+ expect(dallE.generateImage).toHaveBeenCalledWith('A futuristic city', undefined, '1024x1024', false);
208
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockFunctionCalls);
209
+ });
210
+ it('should throw an error when imagen flag is set but no AI service is specified', async () => {
211
+ vi.mocked(cliParams).imagen = 'vertex-ai';
212
+ await expect(runCodegen()).rejects.toThrow('Please specify which AI service should be used');
213
+ });
214
+ it('should pass the cheap parameter to the AI service when --cheap flag is true', async () => {
215
+ vi.mocked(cliParams).vertexAi = true;
216
+ vi.mocked(cliParams).cheap = true;
217
+ const mockFunctionCalls = [
218
+ { name: 'updateFile', args: { filePath: 'test.js', newContent: 'console.log("Cheap test");' } },
219
+ ];
220
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
221
+ await runCodegen();
222
+ expect(vertexAi.generateContent).toHaveBeenCalledWith(expect.anything(), expect.anything(), expect.anything(), expect.anything(), true);
223
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockFunctionCalls);
224
+ });
225
+ it('should pass the cheap parameter to the image generation service when --cheap flag is true', async () => {
226
+ vi.mocked(cliParams).imagen = 'vertex-ai';
227
+ vi.mocked(cliParams).vertexAi = true;
228
+ vi.mocked(cliParams).cheap = true;
229
+ const mockCodegenSummary = [
230
+ {
231
+ name: 'codegenSummary',
232
+ args: {
233
+ fileUpdates: [{ path: 'test.js', updateToolName: 'updateFile' }],
234
+ contextPaths: [],
235
+ explanation: 'Mock summary with cheap image generation',
236
+ },
237
+ },
238
+ ];
239
+ const mockFunctionCalls = [
240
+ {
241
+ name: 'generateImage',
242
+ args: {
243
+ prompt: 'A simple landscape',
244
+ filePath: 'landscape.png',
245
+ size: { width: 256, height: 256 },
246
+ cheap: true,
247
+ },
248
+ },
249
+ ];
250
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockCodegenSummary);
251
+ vi.mocked(vertexAi.generateContent).mockResolvedValueOnce(mockFunctionCalls);
252
+ vi.mocked(vertexAiImagen).generateImage.mockResolvedValueOnce('mocked-cheap-image-data');
253
+ await runCodegen();
254
+ expect(vertexAi.generateContent).toHaveBeenCalledWith(expect.anything(), expect.anything(), expect.anything(), expect.anything(), true);
255
+ expect(vertexAiImagen.generateImage).toHaveBeenCalledWith('A simple landscape', undefined, { width: 256, height: 256 }, true);
256
+ expect(updateFiles.updateFiles).toHaveBeenCalledWith(mockFunctionCalls);
257
+ });
258
+ });
259
+ //# sourceMappingURL=codegen.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.test.js","sourceRoot":"","sources":["../../src/main/codegen.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface RcConfig {
2
+ rootDir: string;
3
+ lintCommand?: string;
4
+ extensions?: string[];
5
+ ignorePaths?: string[];
6
+ }
7
+ export declare function findRcFile(): string;
8
+ export declare function parseRcFile(rcFilePath: string): RcConfig;
@@ -0,0 +1,28 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import assert from 'node:assert';
4
+ import { isAncestorDirectory } from '../files/file-utils.js';
5
+ // This file contains project codegen configuration
6
+ const CODEGENRC_FILENAME = '.genaicoderc';
7
+ // Find .genaicoderc file
8
+ export function findRcFile() {
9
+ let rcFilePath = process.cwd();
10
+ while (!fs.existsSync(path.join(rcFilePath, CODEGENRC_FILENAME))) {
11
+ const parentDir = path.dirname(rcFilePath);
12
+ if (parentDir === rcFilePath) {
13
+ throw new Error(`${CODEGENRC_FILENAME} not found in any parent directory`);
14
+ }
15
+ rcFilePath = parentDir;
16
+ }
17
+ return path.join(rcFilePath, CODEGENRC_FILENAME);
18
+ }
19
+ // Read and parse .genaicoderc file
20
+ export function parseRcFile(rcFilePath) {
21
+ assert(fs.existsSync(rcFilePath), `${CODEGENRC_FILENAME} not found`);
22
+ const rcConfig = JSON.parse(fs.readFileSync(rcFilePath, 'utf-8'));
23
+ assert(rcConfig.rootDir, 'Root dir not configured');
24
+ const rootDir = path.resolve(path.dirname(rcFilePath), rcConfig.rootDir);
25
+ assert(isAncestorDirectory(path.dirname(rcFilePath), rootDir), 'Root dir is not located inside project directory');
26
+ return { ...rcConfig, rootDir };
27
+ }
28
+ //# sourceMappingURL=config-lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-lib.js","sourceRoot":"","sources":["../../src/main/config-lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,mDAAmD;AACnD,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAS1C,yBAAyB;AACzB,MAAM,UAAU,UAAU;IACxB,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,GAAG,kBAAkB,oCAAoC,CAAC,CAAC;QAC7E,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AACnD,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,GAAG,kBAAkB,YAAY,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAa,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5E,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,EAAE,kDAAkD,CAAC,CAAC;IAEnH,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,64 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { isAncestorDirectory } from '../files/file-utils.js';
5
+ import { findRcFile, parseRcFile } from './config-lib.js';
6
+ vi.mock('fs');
7
+ vi.mock('path');
8
+ vi.mock('../files/file-utils.js');
9
+ const CODEGENRC_FILENAME = '.genaicoderc';
10
+ // Mock data
11
+ const mockRcContent = JSON.stringify({ rootDir: 'src' });
12
+ const mockRootDir = '/project/src';
13
+ const mockRcFilePath = `/project/${CODEGENRC_FILENAME}`;
14
+ // Helper function to mock fs.existsSync
15
+ function mockExistsSync(paths) {
16
+ return (p) => paths.includes(p);
17
+ }
18
+ // Tests
19
+ // Test for findRcFile
20
+ describe('findRcFile', () => {
21
+ it('should find .genaicoderc in the current or parent directories', () => {
22
+ vi.mocked(fs).existsSync.mockImplementation(mockExistsSync([mockRcFilePath]));
23
+ vi.mocked(path).dirname.mockImplementation((p) => (p === '/project' ? '/' : '/project'));
24
+ vi.mocked(path).join.mockImplementation((...args) => args.join('/'));
25
+ const result = findRcFile();
26
+ expect(result).toBe(mockRcFilePath);
27
+ });
28
+ it('should throw an error if .genaicoderc is not found', () => {
29
+ vi.mocked(fs).existsSync.mockReturnValue(false);
30
+ vi.mocked(path).dirname.mockImplementation((p) => (p === '/' ? '/' : '/project'));
31
+ expect(() => findRcFile()).toThrowError(`${CODEGENRC_FILENAME} not found in any parent directory`);
32
+ });
33
+ });
34
+ // Test for parseRcFile
35
+ describe('parseRcFile', () => {
36
+ it('should parse .genaicoderc and return config with rootDir', () => {
37
+ vi.mocked(fs).existsSync.mockReturnValue(true);
38
+ vi.mocked(fs).readFileSync.mockReturnValue(mockRcContent);
39
+ vi.mocked(path).resolve.mockImplementation((...args) => args.join('/'));
40
+ vi.mocked(path).dirname.mockReturnValue('/project');
41
+ vi.mocked(isAncestorDirectory).mockReturnValue(true);
42
+ const result = parseRcFile(mockRcFilePath);
43
+ expect(result).toEqual({ ...JSON.parse(mockRcContent), rootDir: mockRootDir });
44
+ });
45
+ it('should throw an error if .genaicoderc is missing', () => {
46
+ vi.mocked(fs).existsSync.mockReturnValue(false);
47
+ expect(() => parseRcFile(mockRcFilePath)).toThrowError(`${CODEGENRC_FILENAME} not found`);
48
+ });
49
+ it('should throw an error if rootDir is not configured', () => {
50
+ const invalidContent = JSON.stringify({});
51
+ vi.mocked(fs).existsSync.mockReturnValue(true);
52
+ vi.mocked(fs).readFileSync.mockReturnValue(invalidContent);
53
+ expect(() => parseRcFile(mockRcFilePath)).toThrowError('Root dir not configured');
54
+ });
55
+ it('should throw an error if rootDir is not located inside project directory', () => {
56
+ vi.mocked(fs).existsSync.mockReturnValue(true);
57
+ vi.mocked(fs).readFileSync.mockReturnValue(mockRcContent);
58
+ vi.mocked(path).resolve.mockImplementation((...args) => args.join('/'));
59
+ vi.mocked(path).dirname.mockReturnValue('/project');
60
+ vi.mocked(isAncestorDirectory).mockReturnValue(false);
61
+ expect(() => parseRcFile(mockRcFilePath)).toThrowError('Root dir is not located inside project directory');
62
+ });
63
+ });
64
+ //# sourceMappingURL=config-lib.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-lib.test.js","sourceRoot":"","sources":["../../src/main/config-lib.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { RcConfig } from './config-lib.js';
2
+ export declare const rcConfig: RcConfig;
3
+ export declare const sourceExtensions: string[];
4
+ export declare const IMAGE_ASSET_EXTENSIONS: string[];
5
+ export declare const ignorePaths: string[];
@@ -1,39 +1,33 @@
1
1
  import { findRcFile, parseRcFile } from './config-lib.js';
2
-
3
2
  // Default extensions if not specified in .genaicoderc
4
3
  const DEFAULT_EXTENSIONS = [
5
- '.md',
6
- '.js',
7
- '.ts',
8
- '.tsx',
9
- '.css',
10
- '.scss',
11
- '.py',
12
- '.go',
13
- '.c',
14
- '.h',
15
- '.cpp',
16
- '.txt',
17
- '.html',
18
- '.txt',
19
- '.json',
4
+ '.md',
5
+ '.js',
6
+ '.ts',
7
+ '.tsx',
8
+ '.css',
9
+ '.scss',
10
+ '.py',
11
+ '.go',
12
+ '.c',
13
+ '.h',
14
+ '.cpp',
15
+ '.txt',
16
+ '.html',
17
+ '.txt',
18
+ '.json',
20
19
  ];
21
-
22
20
  // A list of paths that are ignored by default
23
21
  const DEFAULT_IGNORE_PATHS = ['node_modules', 'build', 'dist', 'package-lock.json', 'coverage'];
24
-
25
22
  // Read and parse the configuration
26
23
  const rcFilePath = findRcFile();
27
24
  export const rcConfig = parseRcFile(rcFilePath);
28
-
29
25
  // Use extensions from .genaicoderc if available, otherwise use default
30
26
  export const sourceExtensions = rcConfig.extensions || DEFAULT_EXTENSIONS;
31
-
32
27
  // Image extensions (driven by ai service limitations)
33
28
  export const IMAGE_ASSET_EXTENSIONS = ['.png', '.jpg', '.jpeg', '.gif', '.webp'];
34
-
35
29
  // Export ignore paths
36
30
  export const ignorePaths = rcConfig.ignorePaths ?? DEFAULT_IGNORE_PATHS;
37
-
38
31
  console.log('Detected codegen configuration', rcConfig);
39
32
  console.log('Root dir:', rcConfig.rootDir);
33
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/main/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAY,MAAM,iBAAiB,CAAC;AAEpE,sDAAsD;AACtD,MAAM,kBAAkB,GAAa;IACnC,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,KAAK;IACL,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;CACR,CAAC;AAEF,8CAA8C;AAC9C,MAAM,oBAAoB,GAAa,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,UAAU,CAAC,CAAC;AAE1G,mCAAmC;AACnC,MAAM,UAAU,GAAW,UAAU,EAAE,CAAC;AACxC,MAAM,CAAC,MAAM,QAAQ,GAAa,WAAW,CAAC,UAAU,CAAC,CAAC;AAE1D,uEAAuE;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAa,QAAQ,CAAC,UAAU,IAAI,kBAAkB,CAAC;AAEpF,sDAAsD;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3F,sBAAsB;AACtB,MAAM,CAAC,MAAM,WAAW,GAAa,QAAQ,CAAC,WAAW,IAAI,oBAAoB,CAAC;AAElF,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,QAAQ,CAAC,CAAC;AACxD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ValidatorResult } from 'jsonschema';
2
+ import { FunctionCall } from '../ai-service/common.js';
3
+ export declare function validateFunctionCall(call: FunctionCall): Omit<ValidatorResult, 'addError'> | undefined;
@@ -0,0 +1,27 @@
1
+ import { Validator } from 'jsonschema';
2
+ import { functionDefs } from './function-calling.js';
3
+ export function validateFunctionCall(call) {
4
+ const validator = new Validator();
5
+ const functionDef = functionDefs.find((def) => def.name === call.name);
6
+ if (!functionDef) {
7
+ return {
8
+ errors: [
9
+ {
10
+ message: `Function "${call.name}" is not defined.`,
11
+ },
12
+ ],
13
+ valid: false,
14
+ instance: call,
15
+ schema: {},
16
+ propertyPath: '',
17
+ disableFormat: false,
18
+ throwError: true,
19
+ };
20
+ }
21
+ const validationResult = validator.validate(call.args, functionDef.parameters);
22
+ if (validationResult.errors.length > 0) {
23
+ return validationResult;
24
+ }
25
+ return undefined;
26
+ }
27
+ //# sourceMappingURL=function-calling-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-calling-validate.js","sourceRoot":"","sources":["../../src/prompt/function-calling-validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA4C,MAAM,YAAY,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,UAAU,oBAAoB,CAAC,IAAkB;IACrD,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAClC,MAAM,WAAW,GAA4B,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;YACL,MAAM,EAAE;gBACN;oBACE,OAAO,EAAE,aAAa,IAAI,CAAC,IAAI,mBAAmB;iBACrB;aAChC;YACD,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAY;YACpB,YAAY,EAAE,EAAE;YAChB,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;IAED,MAAM,gBAAgB,GAAoB,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,UAA+B,CAAC,CAAC;IAErH,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { FunctionDef } from '../ai-service/common.js';
2
+ /**
3
+ * Function definitions for function calling feature
4
+ */
5
+ export declare const functionDefs: FunctionDef[];
@@ -0,0 +1,48 @@
1
+ import { requireExplanations } from '../cli/cli-params.js';
2
+ import { getSourceCode } from './function-defs/get-source-code.js';
3
+ import { getImageAssets } from './function-defs/get-image-assets.js';
4
+ import { codegenSummary } from './function-defs/codegen-summary.js';
5
+ import { updateFile } from './function-defs/update-file.js';
6
+ import { patchFile } from './function-defs/patch-file.js';
7
+ import { createFile } from './function-defs/create-file.js';
8
+ import { deleteFile } from './function-defs/delete-file.js';
9
+ import { explanation } from './function-defs/explanation.js';
10
+ import { createDirectory } from './function-defs/create-directory.js';
11
+ import { moveFile } from './function-defs/move-file.js';
12
+ import { generateImage } from './function-defs/generate-image.js';
13
+ import { downloadFile } from './function-defs/download-file.js';
14
+ import { imglyRemoveBackground } from './function-defs/imgly-remove-background.js';
15
+ import { resizeImage } from './function-defs/resize-image.js';
16
+ import { splitImage } from './function-defs/split-image.js';
17
+ import { askQuestion } from './function-defs/ask-question.js';
18
+ /**
19
+ * Function definitions for function calling feature
20
+ */
21
+ export const functionDefs = [
22
+ getSourceCode,
23
+ getImageAssets,
24
+ codegenSummary,
25
+ updateFile,
26
+ patchFile,
27
+ createFile,
28
+ deleteFile,
29
+ explanation,
30
+ createDirectory,
31
+ moveFile,
32
+ generateImage,
33
+ downloadFile,
34
+ imglyRemoveBackground,
35
+ resizeImage,
36
+ splitImage,
37
+ askQuestion,
38
+ // @ts-expect-error (fix this once fun defs are converted to ts)
39
+ ].map((fd) => {
40
+ if (requireExplanations && fd.parameters.properties.explanation && !fd.parameters.required.includes('explanation')) {
41
+ fd.parameters.required.push('explanation');
42
+ }
43
+ else if (!requireExplanations) {
44
+ delete fd.parameters.properties.explanation;
45
+ }
46
+ return fd;
47
+ });
48
+ //# sourceMappingURL=function-calling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-calling.js","sourceRoot":"","sources":["../../src/prompt/function-calling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,aAAa;IACb,cAAc;IACd,cAAc;IACd,UAAU;IACV,SAAS;IACT,UAAU;IACV,UAAU;IACV,WAAW;IACX,eAAe;IACf,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,qBAAqB;IACrB,WAAW;IACX,UAAU;IACV,WAAW;IACX,gEAAgE;CACjE,CAAC,GAAG,CAAC,CAAC,EAAe,EAAE,EAAE;IACxB,IAAI,mBAAmB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACnH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC;IAC9C,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Function definition for askQuestion
3
+ */
4
+ export declare const askQuestion: {
5
+ readonly name: "askQuestion";
6
+ readonly description: "If there is a need ask a question to the user to gather more information or clarification. Alternatively this function can be called also if there is no need to prompt the user with any question.";
7
+ readonly parameters: {
8
+ readonly type: "object";
9
+ readonly properties: {
10
+ readonly content: {
11
+ readonly type: "string";
12
+ readonly description: "The message you want to display to the user, it can be either a question or a confirmation/ackoweledgment in case there is no intention to prompt the user.";
13
+ };
14
+ readonly shouldPrompt: {
15
+ readonly type: "boolean";
16
+ readonly description: "Set to true if the intention is to get response from the user.";
17
+ };
18
+ readonly promptNecessity: {
19
+ readonly type: "number";
20
+ readonly minimum: 0;
21
+ readonly maximum: 100;
22
+ readonly description: "How strong is the need to prompt the user? Higher value indicates a stronger need.";
23
+ };
24
+ readonly stopCodegen: {
25
+ readonly type: "boolean";
26
+ readonly description: "If set to true, it will break the code generation process without error.";
27
+ };
28
+ };
29
+ readonly required: readonly ["content", "shouldPrompt", "promptNecessity", "stopCodegen"];
30
+ };
31
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Function definition for askQuestion
3
+ */
4
+ export const askQuestion = {
5
+ name: 'askQuestion',
6
+ description: 'If there is a need ask a question to the user to gather more information or clarification. Alternatively this function can be called also if there is no need to prompt the user with any question.',
7
+ parameters: {
8
+ type: 'object',
9
+ properties: {
10
+ content: {
11
+ type: 'string',
12
+ description: 'The message you want to display to the user, it can be either a question or a confirmation/ackoweledgment in case there is no intention to prompt the user.',
13
+ },
14
+ shouldPrompt: {
15
+ type: 'boolean',
16
+ description: 'Set to true if the intention is to get response from the user.',
17
+ },
18
+ promptNecessity: {
19
+ type: 'number',
20
+ minimum: 0,
21
+ maximum: 100,
22
+ description: 'How strong is the need to prompt the user? Higher value indicates a stronger need.',
23
+ },
24
+ stopCodegen: {
25
+ type: 'boolean',
26
+ description: 'If set to true, it will break the code generation process without error.',
27
+ },
28
+ },
29
+ required: ['content', 'shouldPrompt', 'promptNecessity', 'stopCodegen'],
30
+ },
31
+ };
32
+ //# sourceMappingURL=ask-question.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-question.js","sourceRoot":"","sources":["../../../src/prompt/function-defs/ask-question.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,qMAAqM;IACvM,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,6JAA6J;aAChK;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,gEAAgE;aAC9E;YACD,eAAe,EAAE;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,GAAG;gBACZ,WAAW,EAAE,oFAAoF;aAClG;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,0EAA0E;aACxF;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,CAAC;KACxE;CACO,CAAC"}