genaicode 0.2.1 → 0.4.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 (232) hide show
  1. package/README.md +11 -0
  2. package/bin/genaicode-dev.js +2 -1
  3. package/bin/genaicode.cjs +4 -4
  4. package/dist/ai-service/ai-studio.js +65 -10
  5. package/dist/ai-service/ai-studio.js.map +1 -1
  6. package/dist/ai-service/anthropic.js +22 -8
  7. package/dist/ai-service/anthropic.js.map +1 -1
  8. package/dist/ai-service/chat-gpt.js +22 -10
  9. package/dist/ai-service/chat-gpt.js.map +1 -1
  10. package/dist/ai-service/common.d.ts +20 -7
  11. package/dist/ai-service/common.js +9 -6
  12. package/dist/ai-service/common.js.map +1 -1
  13. package/dist/ai-service/common.test.js +3 -3
  14. package/dist/ai-service/common.test.js.map +1 -1
  15. package/dist/ai-service/unescape-function-call.d.ts +7 -0
  16. package/dist/ai-service/unescape-function-call.js +59 -0
  17. package/dist/ai-service/unescape-function-call.js.map +1 -0
  18. package/dist/ai-service/unescape-function-call.test.js +18 -0
  19. package/dist/ai-service/unescape-function-call.test.js.map +1 -0
  20. package/dist/ai-service/vertex-ai-claude.js +11 -4
  21. package/dist/ai-service/vertex-ai-claude.js.map +1 -1
  22. package/dist/ai-service/vertex-ai.d.ts +1 -1
  23. package/dist/ai-service/vertex-ai.js +73 -14
  24. package/dist/ai-service/vertex-ai.js.map +1 -1
  25. package/dist/cli/cli-options.js +8 -0
  26. package/dist/cli/cli-options.js.map +1 -1
  27. package/dist/cli/cli-params.d.ts +6 -0
  28. package/dist/cli/cli-params.js +25 -4
  29. package/dist/cli/cli-params.js.map +1 -1
  30. package/dist/cli/validate-cli-params.js +11 -1
  31. package/dist/cli/validate-cli-params.js.map +1 -1
  32. package/dist/files/cache-file.d.ts +3 -0
  33. package/dist/files/cache-file.js +36 -0
  34. package/dist/files/cache-file.js.map +1 -0
  35. package/dist/files/find-files.d.ts +1 -0
  36. package/dist/files/find-files.js +7 -2
  37. package/dist/files/find-files.js.map +1 -1
  38. package/dist/files/read-files.d.ts +6 -3
  39. package/dist/files/read-files.js +7 -5
  40. package/dist/files/read-files.js.map +1 -1
  41. package/dist/files/read-files.test.js +2 -1
  42. package/dist/files/read-files.test.js.map +1 -1
  43. package/dist/files/update-files.js +1 -4
  44. package/dist/files/update-files.js.map +1 -1
  45. package/dist/main/codegen-types.d.ts +15 -0
  46. package/dist/main/codegen.d.ts +2 -2
  47. package/dist/main/codegen.js +91 -52
  48. package/dist/main/codegen.js.map +1 -1
  49. package/dist/main/codegen.test.d.ts +1 -0
  50. package/dist/main/codegen.test.js +24 -8
  51. package/dist/main/codegen.test.js.map +1 -1
  52. package/dist/main/common/content-bus-types.d.ts +16 -0
  53. package/dist/main/common/content-bus-types.js +7 -0
  54. package/dist/main/common/content-bus-types.js.map +1 -0
  55. package/dist/main/common/content-bus.d.ts +9 -0
  56. package/dist/main/common/content-bus.js +25 -0
  57. package/dist/main/common/content-bus.js.map +1 -0
  58. package/dist/main/common/cost-collector.d.ts +11 -0
  59. package/dist/main/common/cost-collector.js +90 -0
  60. package/dist/main/common/cost-collector.js.map +1 -0
  61. package/dist/main/common/user-actions.d.ts +7 -0
  62. package/dist/main/common/user-actions.js +15 -0
  63. package/dist/main/common/user-actions.js.map +1 -0
  64. package/dist/main/config-lib.d.ts +19 -0
  65. package/dist/main/config-lib.js.map +1 -1
  66. package/dist/main/config.d.ts +2 -1
  67. package/dist/main/config.js +3 -0
  68. package/dist/main/config.js.map +1 -1
  69. package/dist/main/interactive/codegen-interactive.js +8 -2
  70. package/dist/main/interactive/codegen-interactive.js.map +1 -1
  71. package/dist/main/interactive/codegen-interactive.test.d.ts +1 -0
  72. package/dist/main/interactive/codegen-interactive.test.js +2 -0
  73. package/dist/main/interactive/codegen-interactive.test.js.map +1 -1
  74. package/dist/main/interactive/codegen-worker.d.ts +1 -1
  75. package/dist/main/interactive/codegen-worker.js +10 -4
  76. package/dist/main/interactive/codegen-worker.js.map +1 -1
  77. package/dist/main/interactive/task-file.js +9 -2
  78. package/dist/main/interactive/task-file.js.map +1 -1
  79. package/dist/main/interactive/user-action-handlers.d.ts +1 -0
  80. package/dist/main/interactive/user-action-handlers.js +13 -0
  81. package/dist/main/interactive/user-action-handlers.js.map +1 -0
  82. package/dist/main/interactive/user-interrupt.js +1 -1
  83. package/dist/main/interactive/user-interrupt.js.map +1 -1
  84. package/dist/main/ui/backend/api-utils.d.ts +2 -0
  85. package/dist/main/ui/backend/api-utils.js +18 -0
  86. package/dist/main/ui/backend/api-utils.js.map +1 -0
  87. package/dist/main/ui/backend/api.d.ts +2 -0
  88. package/dist/main/ui/backend/api.js +186 -0
  89. package/dist/main/ui/backend/api.js.map +1 -0
  90. package/dist/main/ui/backend/server.d.ts +2 -0
  91. package/dist/main/ui/backend/server.js +85 -0
  92. package/dist/main/ui/backend/server.js.map +1 -0
  93. package/dist/main/ui/backend/service.d.ts +48 -0
  94. package/dist/main/ui/backend/service.js +161 -0
  95. package/dist/main/ui/backend/service.js.map +1 -0
  96. package/dist/main/ui/codegen-ui.d.ts +2 -0
  97. package/dist/main/ui/codegen-ui.js +13 -0
  98. package/dist/main/ui/codegen-ui.js.map +1 -0
  99. package/dist/main/ui/frontend/assets/index-Bj9ZkmiD.js +638 -0
  100. package/dist/main/ui/frontend/assets/index-S_ocA1xG.css +1 -0
  101. package/dist/main/ui/frontend/assets/logo-BGHkG1-J.png +0 -0
  102. package/dist/main/ui/frontend/assets/logo-dark-KAsU1C78.png +0 -0
  103. package/dist/main/ui/frontend/assets/press-start-2p-cyrillic-400-normal-oElOGqNf.woff2 +0 -0
  104. package/dist/main/ui/frontend/assets/press-start-2p-cyrillic-ext-400-normal-COIQET2s.woff2 +0 -0
  105. package/dist/main/ui/frontend/assets/press-start-2p-greek-400-normal-DUIT0YPZ.woff2 +0 -0
  106. package/dist/main/ui/frontend/assets/press-start-2p-latin-400-normal-BKfmdmKK.woff +0 -0
  107. package/dist/main/ui/frontend/assets/press-start-2p-latin-400-normal-xj9lRvVs.woff2 +0 -0
  108. package/dist/main/ui/frontend/assets/press-start-2p-latin-ext-400-normal-B18ub5-k.woff +0 -0
  109. package/dist/main/ui/frontend/assets/press-start-2p-latin-ext-400-normal-DDIa4im3.woff2 +0 -0
  110. package/dist/main/ui/frontend/index.html +16 -0
  111. package/dist/main/ui/user-action-handlers.d.ts +2 -0
  112. package/dist/main/ui/user-action-handlers.js +9 -0
  113. package/dist/main/ui/user-action-handlers.js.map +1 -0
  114. package/dist/prompt/ai-service-fallback.d.ts +3 -0
  115. package/dist/prompt/ai-service-fallback.js +84 -0
  116. package/dist/prompt/ai-service-fallback.js.map +1 -0
  117. package/dist/prompt/function-calling-validate.js +70 -4
  118. package/dist/prompt/function-calling-validate.js.map +1 -1
  119. package/dist/prompt/function-calling.js +11 -1
  120. package/dist/prompt/function-calling.js.map +1 -1
  121. package/dist/prompt/function-defs/ask-question-reflect.d.ts +20 -0
  122. package/dist/prompt/function-defs/ask-question-reflect.js +21 -0
  123. package/dist/prompt/function-defs/ask-question-reflect.js.map +1 -0
  124. package/dist/prompt/function-defs/ask-question.d.ts +31 -20
  125. package/dist/prompt/function-defs/ask-question.js +51 -21
  126. package/dist/prompt/function-defs/ask-question.js.map +1 -1
  127. package/dist/prompt/function-defs/codegen-summary.d.ts +23 -21
  128. package/dist/prompt/function-defs/codegen-summary.js +28 -28
  129. package/dist/prompt/function-defs/codegen-summary.js.map +1 -1
  130. package/dist/prompt/function-defs/create-file.d.ts +4 -4
  131. package/dist/prompt/function-defs/create-file.js +4 -4
  132. package/dist/prompt/function-defs/create-file.js.map +1 -1
  133. package/dist/prompt/function-defs/delete-file.d.ts +4 -4
  134. package/dist/prompt/function-defs/delete-file.js +4 -4
  135. package/dist/prompt/function-defs/delete-file.js.map +1 -1
  136. package/dist/prompt/function-defs/generate-image.d.ts +4 -4
  137. package/dist/prompt/function-defs/generate-image.js +4 -4
  138. package/dist/prompt/function-defs/generate-image.js.map +1 -1
  139. package/dist/prompt/function-defs/get-source-code.d.ts +1 -1
  140. package/dist/prompt/function-defs/get-source-code.js +2 -1
  141. package/dist/prompt/function-defs/get-source-code.js.map +1 -1
  142. package/dist/prompt/function-defs/move-file.d.ts +4 -4
  143. package/dist/prompt/function-defs/move-file.js +4 -4
  144. package/dist/prompt/function-defs/move-file.js.map +1 -1
  145. package/dist/prompt/function-defs/optimize-context.d.ts +46 -0
  146. package/dist/prompt/function-defs/optimize-context.js +47 -0
  147. package/dist/prompt/function-defs/optimize-context.js.map +1 -0
  148. package/dist/prompt/function-defs/patch-file.d.ts +4 -4
  149. package/dist/prompt/function-defs/patch-file.js +4 -4
  150. package/dist/prompt/function-defs/patch-file.js.map +1 -1
  151. package/dist/prompt/function-defs/read-history.d.ts +13 -0
  152. package/dist/prompt/function-defs/read-history.js +14 -0
  153. package/dist/prompt/function-defs/read-history.js.map +1 -0
  154. package/dist/prompt/function-defs/set-summaries.d.ts +31 -0
  155. package/dist/prompt/function-defs/set-summaries.js +32 -0
  156. package/dist/prompt/function-defs/set-summaries.js.map +1 -0
  157. package/dist/prompt/function-defs/update-file.d.ts +4 -4
  158. package/dist/prompt/function-defs/update-file.js +4 -4
  159. package/dist/prompt/function-defs/update-file.js.map +1 -1
  160. package/dist/prompt/function-defs/update-history.d.ts +21 -0
  161. package/dist/prompt/function-defs/update-history.js +22 -0
  162. package/dist/prompt/function-defs/update-history.js.map +1 -0
  163. package/dist/prompt/limits.d.ts +3 -3
  164. package/dist/prompt/limits.js +10 -8
  165. package/dist/prompt/limits.js.map +1 -1
  166. package/dist/prompt/limits.test.js +6 -6
  167. package/dist/prompt/limits.test.js.map +1 -1
  168. package/dist/prompt/prompt-codegen.js +52 -25
  169. package/dist/prompt/prompt-codegen.js.map +1 -1
  170. package/dist/prompt/prompt-codegen.test.js +2 -2
  171. package/dist/prompt/prompt-codegen.test.js.map +1 -1
  172. package/dist/prompt/prompt-service-ask-question.test.d.ts +1 -0
  173. package/dist/prompt/prompt-service-ask-question.test.js +86 -13
  174. package/dist/prompt/prompt-service-ask-question.test.js.map +1 -1
  175. package/dist/prompt/prompt-service.d.ts +3 -10
  176. package/dist/prompt/prompt-service.js +66 -23
  177. package/dist/prompt/prompt-service.js.map +1 -1
  178. package/dist/prompt/prompt-service.test.d.ts +1 -0
  179. package/dist/prompt/prompt-service.test.js +73 -48
  180. package/dist/prompt/prompt-service.test.js.map +1 -1
  181. package/dist/prompt/steps/step-ask-question-handlers.d.ts +10 -0
  182. package/dist/prompt/steps/step-ask-question-handlers.js +265 -0
  183. package/dist/prompt/steps/step-ask-question-handlers.js.map +1 -0
  184. package/dist/prompt/steps/step-ask-question-reflect.d.ts +4 -0
  185. package/dist/prompt/steps/step-ask-question-reflect.js +40 -0
  186. package/dist/prompt/steps/step-ask-question-reflect.js.map +1 -0
  187. package/dist/prompt/steps/step-ask-question-types.d.ts +60 -0
  188. package/dist/prompt/steps/step-ask-question-types.js +2 -0
  189. package/dist/prompt/steps/step-ask-question-types.js.map +1 -0
  190. package/dist/prompt/steps/step-ask-question.d.ts +3 -3
  191. package/dist/prompt/steps/step-ask-question.js +69 -69
  192. package/dist/prompt/steps/step-ask-question.js.map +1 -1
  193. package/dist/prompt/steps/step-context-optimization.d.ts +4 -0
  194. package/dist/prompt/steps/step-context-optimization.js +193 -0
  195. package/dist/prompt/steps/step-context-optimization.js.map +1 -0
  196. package/dist/prompt/steps/step-history-update.d.ts +5 -0
  197. package/dist/prompt/steps/step-history-update.js +54 -0
  198. package/dist/prompt/steps/step-history-update.js.map +1 -0
  199. package/dist/prompt/steps/step-summarization.d.ts +8 -0
  200. package/dist/prompt/steps/step-summarization.js +75 -0
  201. package/dist/prompt/steps/step-summarization.js.map +1 -0
  202. package/dist/prompt/steps/step-validate-recover.d.ts +2 -13
  203. package/dist/prompt/steps/step-validate-recover.js +3 -3
  204. package/dist/prompt/steps/step-validate-recover.js.map +1 -1
  205. package/dist/prompt/steps/step-verify-patch.d.ts +1 -2
  206. package/dist/prompt/steps/step-verify-patch.js +3 -10
  207. package/dist/prompt/steps/step-verify-patch.js.map +1 -1
  208. package/dist/prompt/steps/steps-types.d.ts +16 -0
  209. package/dist/prompt/steps/steps-utils.d.ts +7 -0
  210. package/dist/prompt/steps/steps-utils.js +11 -0
  211. package/dist/prompt/steps/steps-utils.js.map +1 -0
  212. package/dist/prompt/systemprompt.d.ts +1 -1
  213. package/dist/prompt/systemprompt.js +194 -32
  214. package/dist/prompt/systemprompt.js.map +1 -1
  215. package/dist/prompt/systemprompt.test.js +5 -8
  216. package/dist/prompt/systemprompt.test.js.map +1 -1
  217. package/dist/prompt/token-estimator.d.ts +8 -0
  218. package/dist/prompt/token-estimator.js +31 -0
  219. package/dist/prompt/token-estimator.js.map +1 -0
  220. package/package.json +28 -4
  221. package/dist/main/codegen-interactive-utils.d.ts +0 -8
  222. package/dist/main/codegen-interactive-utils.js +0 -148
  223. package/dist/main/codegen-interactive-utils.js.map +0 -1
  224. package/dist/main/codegen-interactive.d.ts +0 -2
  225. package/dist/main/codegen-interactive.js +0 -68
  226. package/dist/main/codegen-interactive.js.map +0 -1
  227. package/dist/main/interactive/worker-script.js +0 -24
  228. package/dist/main/interactive/worker-script.js.map +0 -1
  229. package/dist/main/interactive/worker.d.ts +0 -2
  230. package/dist/main/interactive/worker.js +0 -55
  231. package/dist/main/interactive/worker.js.map +0 -1
  232. /package/dist/{main/interactive/worker-script.d.ts → ai-service/unescape-function-call.test.d.ts} +0 -0
@@ -0,0 +1,186 @@
1
+ import express from 'express';
2
+ import multer from 'multer';
3
+ import { rcConfig as globalRcConfig } from '../../config.js';
4
+ import { validateCodegenOptions } from './api-utils.js';
5
+ const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
6
+ const ALLOWED_FILE_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
7
+ const MAX_IMAGES = 5;
8
+ const storage = multer.memoryStorage();
9
+ const upload = multer({
10
+ storage: storage,
11
+ fileFilter: (_, file, cb) => {
12
+ if (ALLOWED_FILE_TYPES.includes(file.mimetype)) {
13
+ cb(null, true);
14
+ }
15
+ else {
16
+ cb(new Error('Invalid file type. Only JPEG, PNG, GIF, and WebP are allowed.'));
17
+ }
18
+ },
19
+ limits: {
20
+ fileSize: MAX_FILE_SIZE,
21
+ files: MAX_IMAGES,
22
+ },
23
+ });
24
+ export function createRouter(service) {
25
+ const router = express.Router();
26
+ // Apply token validation middleware to all routes
27
+ router.use((req, res, next) => {
28
+ const token = req.headers['authorization']?.split(' ')[1];
29
+ if (!token) {
30
+ return res.status(401).json({ error: 'No token provided' });
31
+ }
32
+ if (!service.validateToken(token)) {
33
+ return res.status(401).json({ error: 'Invalid token' });
34
+ }
35
+ next();
36
+ });
37
+ // Execute codegen (handles both regular and multimodal)
38
+ router.post('/execute-codegen', upload.array('images', MAX_IMAGES), async (req, res) => {
39
+ try {
40
+ const prompt = req.body.prompt;
41
+ const options = JSON.parse(req.body.options);
42
+ const files = req.files;
43
+ if (!prompt || typeof prompt !== 'string') {
44
+ return res.status(400).json({ error: 'Invalid prompt' });
45
+ }
46
+ const validationErrors = validateCodegenOptions(options);
47
+ if (validationErrors.length > 0) {
48
+ return res.status(400).json({ errors: validationErrors });
49
+ }
50
+ const images = files?.map((file) => ({
51
+ buffer: file.buffer,
52
+ mimetype: file.mimetype,
53
+ originalname: file.originalname,
54
+ }));
55
+ const result = await service.executeCodegen(prompt, options, images);
56
+ res.json({ result });
57
+ }
58
+ catch (error) {
59
+ console.error('Error executing codegen:', error);
60
+ if (error instanceof multer.MulterError) {
61
+ if (error.code === 'LIMIT_FILE_SIZE') {
62
+ return res.status(400).json({ error: 'File size exceeds the 5MB limit' });
63
+ }
64
+ if (error.code === 'LIMIT_FILE_COUNT') {
65
+ return res.status(400).json({ error: `Maximum of ${MAX_IMAGES} images allowed` });
66
+ }
67
+ }
68
+ res.status(500).json({ error: 'An error occurred while executing codegen' });
69
+ }
70
+ });
71
+ router.get('/content', async (_, res) => {
72
+ try {
73
+ const content = service.getContent();
74
+ res.json({ content });
75
+ }
76
+ catch (error) {
77
+ console.error('Error getting content:', error);
78
+ res.status(500).json({ error: 'An error occurred while getting content' });
79
+ }
80
+ });
81
+ // Get execution status
82
+ router.get('/execution-status', async (_, res) => {
83
+ try {
84
+ const status = await service.getExecutionStatus();
85
+ res.json({ status });
86
+ }
87
+ catch (error) {
88
+ console.error('Error getting execution status:', error);
89
+ res.status(500).json({ error: 'An error occurred while getting execution status' });
90
+ }
91
+ });
92
+ // Interrupt execution
93
+ router.post('/interrupt-execution', async (_, res) => {
94
+ try {
95
+ await service.interruptExecution();
96
+ res.json({ message: 'Execution interrupted successfully' });
97
+ }
98
+ catch (error) {
99
+ console.error('Error interrupting execution:', error);
100
+ res.status(500).json({ error: 'An error occurred while interrupting execution' });
101
+ }
102
+ });
103
+ // Pause execution
104
+ router.post('/pause-execution', async (_, res) => {
105
+ try {
106
+ await service.pauseExecution();
107
+ res.json({ message: 'Execution paused successfully' });
108
+ }
109
+ catch (error) {
110
+ console.error('Error pausing execution:', error);
111
+ res.status(500).json({ error: 'An error occurred while pausing execution' });
112
+ }
113
+ });
114
+ // Resume execution
115
+ router.post('/resume-execution', async (_, res) => {
116
+ try {
117
+ await service.resumeExecution();
118
+ res.json({ message: 'Execution resumed successfully' });
119
+ }
120
+ catch (error) {
121
+ console.error('Error resuming execution:', error);
122
+ res.status(500).json({ error: 'An error occurred while resuming execution' });
123
+ }
124
+ });
125
+ // Get current question
126
+ router.get('/current-question', async (_, res) => {
127
+ try {
128
+ const question = await service.getCurrentQuestion();
129
+ res.json({ question });
130
+ }
131
+ catch (error) {
132
+ console.error('Error getting current question:', error);
133
+ res.status(500).json({ error: 'An error occurred while getting current question' });
134
+ }
135
+ });
136
+ // Answer question
137
+ router.post('/answer-question', async (req, res) => {
138
+ try {
139
+ const { questionId, answer } = req.body;
140
+ if (!questionId || !answer || typeof questionId !== 'string' || typeof answer !== 'string') {
141
+ return res.status(400).json({ error: 'Invalid question ID or answer' });
142
+ }
143
+ await service.answerQuestion(questionId, answer);
144
+ res.json({ message: 'Question answered successfully' });
145
+ }
146
+ catch (error) {
147
+ console.error('Error answering question:', error);
148
+ res.status(500).json({ error: 'An error occurred while answering question' });
149
+ }
150
+ });
151
+ // Get total cost of prompts in the current session
152
+ router.get('/usage', async (_, res) => {
153
+ try {
154
+ const usageMetrics = await service.getUsageMetrics();
155
+ res.json({ usageMetrics });
156
+ }
157
+ catch (error) {
158
+ console.error('Error getting total cost:', error);
159
+ res.status(500).json({ error: 'An error occurred while getting total cost' });
160
+ }
161
+ });
162
+ // Get default CodegenOptions
163
+ router.get('/default-codegen-options', async (_, res) => {
164
+ try {
165
+ const defaultOptions = service.getCodegenOptions();
166
+ res.json({ options: defaultOptions });
167
+ }
168
+ catch (error) {
169
+ console.error('Error getting default codegen options:', error);
170
+ res.status(500).json({ error: 'An error occurred while getting default codegen options' });
171
+ }
172
+ });
173
+ // Get rcConfig settings
174
+ router.get('/rcconfig', async (_, res) => {
175
+ try {
176
+ const rcConfigSettings = globalRcConfig;
177
+ res.json({ rcConfig: rcConfigSettings });
178
+ }
179
+ catch (error) {
180
+ console.error('Error getting rcConfig settings:', error);
181
+ res.status(500).json({ error: 'An error occurred while getting rcConfig settings' });
182
+ }
183
+ });
184
+ return router;
185
+ }
186
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/main/ui/backend/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Service } from './service.js';
2
+ export declare function startServer(service: Service): Promise<void>;
@@ -0,0 +1,85 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import express from 'express';
3
+ import cors from 'cors';
4
+ import helmet from 'helmet';
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ import http from 'http';
8
+ import { createRouter } from './api.js';
9
+ import { uiPort } from '../../../cli/cli-params.js';
10
+ export async function startServer(service) {
11
+ const __dirname = fileURLToPath(new URL('.', import.meta.url));
12
+ const app = express();
13
+ // CORS configuration
14
+ const corsOptions = {
15
+ origin: process.env.ALLOWED_ORIGINS ? process.env.ALLOWED_ORIGINS.split(',') : 'http://localhost:1337',
16
+ optionsSuccessStatus: 200,
17
+ };
18
+ app.use(cors(corsOptions));
19
+ // Helmet for security headers including iframe protection
20
+ app.use(helmet({
21
+ contentSecurityPolicy: {
22
+ directives: {
23
+ defaultSrc: ["'self'"],
24
+ scriptSrc: ["'self'", "'unsafe-inline'"],
25
+ styleSrc: ["'self'", "'unsafe-inline'"],
26
+ imgSrc: ["'self'", 'data:', 'blob:'],
27
+ connectSrc: ["'self'", 'ws:'],
28
+ fontSrc: ["'self'"],
29
+ objectSrc: ["'none'"],
30
+ mediaSrc: ["'self'"],
31
+ frameSrc: ["'none'"],
32
+ },
33
+ },
34
+ referrerPolicy: {
35
+ policy: 'strict-origin-when-cross-origin',
36
+ },
37
+ frameguard: {
38
+ action: 'deny',
39
+ },
40
+ }));
41
+ app.use(express.json());
42
+ const apiRouter = createRouter(service);
43
+ // API routes
44
+ app.use('/api', apiRouter);
45
+ const httpServer = http.createServer(app);
46
+ httpServer.on('error', console.error);
47
+ if (service.getCodegenOptions().isDev) {
48
+ console.log('GenAIcode Dev Mode!');
49
+ const { createServer } = await import('vite');
50
+ const vite = await createServer({
51
+ build: {
52
+ target: false,
53
+ rollupOptions: {
54
+ input: __dirname + '../frontend/index.html',
55
+ },
56
+ },
57
+ configFile: false,
58
+ root: __dirname + '../frontend',
59
+ server: {
60
+ middlewareMode: true,
61
+ },
62
+ plugins: [
63
+ {
64
+ name: 'security-token',
65
+ transformIndexHtml: (html) => html.replace('__SECURITY_TOKEN__', service.getToken()),
66
+ },
67
+ ],
68
+ });
69
+ httpServer.on('error', () => vite.close());
70
+ app.use(vite.middlewares);
71
+ }
72
+ else {
73
+ // Serve index.html with injected token
74
+ app.get('/', (_, res) => {
75
+ const indexPath = path.join(__dirname, '../frontend/index.html');
76
+ const html = fs.readFileSync(indexPath, 'utf-8').replace('__SECURITY_TOKEN__', service.getToken());
77
+ res.send(html);
78
+ });
79
+ app.use('/assets', express.static(__dirname + '../frontend/assets'));
80
+ }
81
+ httpServer.listen(uiPort, () => {
82
+ console.log(`Server is running on http://localhost:${uiPort}`);
83
+ });
84
+ }
85
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../src/main/ui/backend/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { AiServiceType, CodegenOptions } from '../../codegen-types.js';
2
+ import { RcConfig } from '../../config-lib.js';
3
+ import { ContentProps } from '../../common/content-bus-types.js';
4
+ import { UsageMetrics } from '../../common/cost-collector.js';
5
+ interface CodegenResult {
6
+ success: boolean;
7
+ message?: string;
8
+ }
9
+ interface Question {
10
+ id: string;
11
+ text: string;
12
+ isConfirmation: boolean;
13
+ }
14
+ interface ImageData {
15
+ buffer: Buffer;
16
+ mimetype: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';
17
+ originalname: string;
18
+ }
19
+ export declare class Service {
20
+ private executionStatus;
21
+ private currentQuestion;
22
+ private askQuestionConversation;
23
+ private codegenOptions;
24
+ private content;
25
+ private pausePromiseResolve;
26
+ private securityToken;
27
+ constructor(codegenOptions: CodegenOptions);
28
+ private generateToken;
29
+ getToken(): string;
30
+ validateToken(token: string): boolean;
31
+ refreshToken(): string;
32
+ executeCodegen(prompt: string, options: CodegenOptions, images?: ImageData[]): Promise<CodegenResult>;
33
+ interruptExecution(): Promise<void>;
34
+ pauseExecution(): Promise<void>;
35
+ resumeExecution(): Promise<void>;
36
+ getExecutionStatus(): Promise<string>;
37
+ getCurrentQuestion(): Promise<Question | null>;
38
+ askQuestion(question: string, isConfirmation?: boolean): Promise<string>;
39
+ answerQuestion(questionId: string, answer: string): Promise<void>;
40
+ handleContent(content: ContentProps): void;
41
+ getContent(): ContentProps[];
42
+ getUsageMetrics(): Promise<Record<AiServiceType | 'total', UsageMetrics>>;
43
+ getCodegenOptions(): CodegenOptions;
44
+ getRcConfig(): Promise<RcConfig>;
45
+ private waitForQuestionAnswer;
46
+ waitIfPaused(): Promise<void>;
47
+ }
48
+ export {};
@@ -0,0 +1,161 @@
1
+ import { rcConfig } from '../../config.js';
2
+ import { runCodegenWorker, abortController } from '../../interactive/codegen-worker.js';
3
+ import { getUsageMetrics } from '../../common/cost-collector.js';
4
+ import { putSystemMessage } from '../../common/content-bus.js';
5
+ import crypto from 'crypto';
6
+ export class Service {
7
+ executionStatus = 'idle';
8
+ currentQuestion = null;
9
+ askQuestionConversation = [];
10
+ codegenOptions;
11
+ content = [];
12
+ pausePromiseResolve = null;
13
+ securityToken;
14
+ constructor(codegenOptions) {
15
+ this.codegenOptions = codegenOptions;
16
+ this.securityToken = this.generateToken();
17
+ }
18
+ generateToken() {
19
+ return crypto.randomBytes(32).toString('hex');
20
+ }
21
+ getToken() {
22
+ return this.securityToken;
23
+ }
24
+ validateToken(token) {
25
+ return token === this.securityToken;
26
+ }
27
+ refreshToken() {
28
+ this.securityToken = this.generateToken();
29
+ return this.securityToken;
30
+ }
31
+ async executeCodegen(prompt, options, images) {
32
+ this.executionStatus = 'executing';
33
+ this.currentQuestion = null;
34
+ this.codegenOptions = { ...this.codegenOptions, ...options };
35
+ try {
36
+ const imageDataForPrompt = images?.map((image) => ({
37
+ base64url: image.buffer.toString('base64'),
38
+ mediaType: image.mimetype,
39
+ originalName: image.originalname,
40
+ }));
41
+ await runCodegenWorker({
42
+ ...this.codegenOptions,
43
+ explicitPrompt: prompt,
44
+ considerAllFiles: true,
45
+ images: imageDataForPrompt,
46
+ vision: this.codegenOptions.vision || !!imageDataForPrompt?.length,
47
+ }, () => this.waitIfPaused());
48
+ this.executionStatus = 'idle';
49
+ return { success: true };
50
+ }
51
+ catch (error) {
52
+ console.error('Error executing codegen:', error);
53
+ this.executionStatus = 'idle';
54
+ if (error instanceof Error) {
55
+ if (error.name === 'AbortError' || error.message.includes('interrupted')) {
56
+ return { success: false, message: 'Codegen execution was interrupted' };
57
+ }
58
+ else if (error.message.includes('Rate limit exceeded')) {
59
+ return {
60
+ success: false,
61
+ message: 'Rate limit exceeded. Consider switching to a different AI service or waiting before retrying.',
62
+ };
63
+ }
64
+ return { success: false, message: `An error occurred: ${error.message}` };
65
+ }
66
+ return { success: false, message: 'An unknown error occurred' };
67
+ }
68
+ }
69
+ async interruptExecution() {
70
+ if (this.executionStatus === 'executing' || this.executionStatus === 'paused') {
71
+ abortController?.abort();
72
+ this.executionStatus = 'interrupted';
73
+ this.currentQuestion = null;
74
+ putSystemMessage('Execution interrupted');
75
+ }
76
+ }
77
+ async pauseExecution() {
78
+ if (this.executionStatus === 'executing') {
79
+ this.executionStatus = 'paused';
80
+ putSystemMessage('Execution paused');
81
+ }
82
+ }
83
+ async resumeExecution() {
84
+ if (this.executionStatus === 'paused') {
85
+ this.executionStatus = 'executing';
86
+ putSystemMessage('Execution resumed');
87
+ if (this.pausePromiseResolve) {
88
+ this.pausePromiseResolve();
89
+ this.pausePromiseResolve = null;
90
+ }
91
+ }
92
+ }
93
+ async getExecutionStatus() {
94
+ return this.executionStatus;
95
+ }
96
+ async getCurrentQuestion() {
97
+ return this.currentQuestion;
98
+ }
99
+ async askQuestion(question, isConfirmation = false) {
100
+ const questionId = Date.now().toString();
101
+ this.currentQuestion = {
102
+ id: questionId,
103
+ text: question,
104
+ isConfirmation,
105
+ };
106
+ await this.waitForQuestionAnswer();
107
+ console.log('Question answer wait finished.');
108
+ const answer = this.askQuestionConversation.find((q) => q.id === questionId)?.answer ?? '';
109
+ return isConfirmation ? (answer.toLowerCase() === 'yes' ? 'yes' : 'no') : answer;
110
+ }
111
+ async answerQuestion(questionId, answer) {
112
+ if (this.currentQuestion && this.currentQuestion.id === questionId) {
113
+ this.askQuestionConversation.push({
114
+ id: this.currentQuestion.id,
115
+ question: this.currentQuestion.text,
116
+ answer: answer,
117
+ isConfirmation: this.currentQuestion.isConfirmation,
118
+ });
119
+ this.currentQuestion = null;
120
+ }
121
+ }
122
+ handleContent(content) {
123
+ this.content.push(content);
124
+ }
125
+ getContent() {
126
+ return this.content;
127
+ }
128
+ async getUsageMetrics() {
129
+ return await getUsageMetrics();
130
+ }
131
+ getCodegenOptions() {
132
+ return this.codegenOptions;
133
+ }
134
+ async getRcConfig() {
135
+ return rcConfig;
136
+ }
137
+ waitForQuestionAnswer() {
138
+ return new Promise((resolve, reject) => {
139
+ const checkQuestion = () => {
140
+ if (abortController?.signal.aborted || this.executionStatus === 'interrupted') {
141
+ reject(new Error('Codegen execution was interrupted'));
142
+ }
143
+ else if (this.currentQuestion === null) {
144
+ resolve();
145
+ }
146
+ else {
147
+ setTimeout(checkQuestion, 100);
148
+ }
149
+ };
150
+ checkQuestion();
151
+ });
152
+ }
153
+ async waitIfPaused() {
154
+ if (this.executionStatus === 'paused') {
155
+ return new Promise((resolve) => {
156
+ this.pausePromiseResolve = resolve;
157
+ });
158
+ }
159
+ }
160
+ }
161
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/main/ui/backend/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { CodegenOptions } from '../codegen-types.js';
2
+ export declare function runCodegenUI(options: CodegenOptions): Promise<void>;
@@ -0,0 +1,13 @@
1
+ import { registerContentHandler } from '../common/content-bus.js';
2
+ import { startServer } from './backend/server.js';
3
+ import { Service } from './backend/service.js';
4
+ import { registerUserActionHandlers } from './user-action-handlers.js';
5
+ export async function runCodegenUI(options) {
6
+ console.log('Starting Genaicode Web UI');
7
+ const service = new Service(options);
8
+ registerUserActionHandlers(service);
9
+ registerContentHandler((content) => service.handleContent(content));
10
+ await startServer(service);
11
+ console.log('Genaicode Web UI started');
12
+ }
13
+ //# sourceMappingURL=codegen-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen-ui.js","sourceRoot":"","sources":["../../../src/main/ui/codegen-ui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAuB;IACxD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACpC,sBAAsB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAEpE,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAC1C,CAAC"}