genaicode 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +2 -0
  2. package/bin/genaicode-dev.js +2 -1
  3. package/bin/genaicode.cjs +4 -4
  4. package/dist/ai-service/ai-studio.js +8 -2
  5. package/dist/ai-service/ai-studio.js.map +1 -1
  6. package/dist/ai-service/anthropic.js +21 -8
  7. package/dist/ai-service/anthropic.js.map +1 -1
  8. package/dist/ai-service/chat-gpt.js +21 -10
  9. package/dist/ai-service/chat-gpt.js.map +1 -1
  10. package/dist/ai-service/common.d.ts +9 -5
  11. package/dist/ai-service/common.js +6 -4
  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/vertex-ai-claude.js +5 -4
  16. package/dist/ai-service/vertex-ai-claude.js.map +1 -1
  17. package/dist/ai-service/vertex-ai.js +11 -2
  18. package/dist/ai-service/vertex-ai.js.map +1 -1
  19. package/dist/cli/cli-params.d.ts +2 -0
  20. package/dist/cli/cli-params.js +14 -2
  21. package/dist/cli/cli-params.js.map +1 -1
  22. package/dist/cli/validate-cli-params.js +3 -1
  23. package/dist/cli/validate-cli-params.js.map +1 -1
  24. package/dist/files/find-files.d.ts +1 -0
  25. package/dist/files/find-files.js +7 -2
  26. package/dist/files/find-files.js.map +1 -1
  27. package/dist/files/read-files.d.ts +2 -2
  28. package/dist/files/read-files.js +2 -2
  29. package/dist/files/read-files.js.map +1 -1
  30. package/dist/files/read-files.test.js +1 -1
  31. package/dist/files/read-files.test.js.map +1 -1
  32. package/dist/main/codegen-types.d.ts +13 -0
  33. package/dist/main/codegen.d.ts +2 -2
  34. package/dist/main/codegen.js +86 -52
  35. package/dist/main/codegen.js.map +1 -1
  36. package/dist/main/codegen.test.js +7 -4
  37. package/dist/main/codegen.test.js.map +1 -1
  38. package/dist/main/common/content-bus-types.d.ts +16 -0
  39. package/dist/main/common/content-bus-types.js +7 -0
  40. package/dist/main/common/content-bus-types.js.map +1 -0
  41. package/dist/main/common/content-bus.d.ts +9 -0
  42. package/dist/main/common/content-bus.js +25 -0
  43. package/dist/main/common/content-bus.js.map +1 -0
  44. package/dist/main/common/cost-collector.d.ts +15 -0
  45. package/dist/main/common/cost-collector.js +24 -0
  46. package/dist/main/common/cost-collector.js.map +1 -0
  47. package/dist/main/common/user-actions.d.ts +7 -0
  48. package/dist/main/common/user-actions.js +15 -0
  49. package/dist/main/common/user-actions.js.map +1 -0
  50. package/dist/main/config-lib.d.ts +19 -0
  51. package/dist/main/config-lib.js.map +1 -1
  52. package/dist/main/config.d.ts +2 -1
  53. package/dist/main/config.js +3 -0
  54. package/dist/main/config.js.map +1 -1
  55. package/dist/main/interactive/codegen-interactive.js +8 -2
  56. package/dist/main/interactive/codegen-interactive.js.map +1 -1
  57. package/dist/main/interactive/codegen-worker.d.ts +1 -1
  58. package/dist/main/interactive/codegen-worker.js +5 -2
  59. package/dist/main/interactive/codegen-worker.js.map +1 -1
  60. package/dist/main/interactive/task-file.js +9 -2
  61. package/dist/main/interactive/task-file.js.map +1 -1
  62. package/dist/main/interactive/user-action-handlers.d.ts +1 -0
  63. package/dist/main/interactive/user-action-handlers.js +13 -0
  64. package/dist/main/interactive/user-action-handlers.js.map +1 -0
  65. package/dist/main/interactive/user-interrupt.js +1 -1
  66. package/dist/main/interactive/user-interrupt.js.map +1 -1
  67. package/dist/main/ui/backend/api-utils.d.ts +2 -0
  68. package/dist/main/ui/backend/api-utils.js +18 -0
  69. package/dist/main/ui/backend/api-utils.js.map +1 -0
  70. package/dist/main/ui/backend/api.d.ts +2 -0
  71. package/dist/main/ui/backend/api.js +186 -0
  72. package/dist/main/ui/backend/api.js.map +1 -0
  73. package/dist/main/ui/backend/server.d.ts +2 -0
  74. package/dist/main/ui/backend/server.js +81 -0
  75. package/dist/main/ui/backend/server.js.map +1 -0
  76. package/dist/main/ui/backend/service.d.ts +47 -0
  77. package/dist/main/ui/backend/service.js +161 -0
  78. package/dist/main/ui/backend/service.js.map +1 -0
  79. package/dist/main/ui/codegen-ui.d.ts +2 -0
  80. package/dist/main/ui/codegen-ui.js +13 -0
  81. package/dist/main/ui/codegen-ui.js.map +1 -0
  82. package/dist/main/ui/frontend/assets/index-D9wcaSJU.js +598 -0
  83. package/dist/main/ui/frontend/assets/index-S_ocA1xG.css +1 -0
  84. package/dist/main/ui/frontend/assets/logo-BGHkG1-J.png +0 -0
  85. package/dist/main/ui/frontend/assets/logo-dark-KAsU1C78.png +0 -0
  86. package/dist/main/ui/frontend/assets/press-start-2p-cyrillic-400-normal-oElOGqNf.woff2 +0 -0
  87. package/dist/main/ui/frontend/assets/press-start-2p-cyrillic-ext-400-normal-COIQET2s.woff2 +0 -0
  88. package/dist/main/ui/frontend/assets/press-start-2p-greek-400-normal-DUIT0YPZ.woff2 +0 -0
  89. package/dist/main/ui/frontend/assets/press-start-2p-latin-400-normal-BKfmdmKK.woff +0 -0
  90. package/dist/main/ui/frontend/assets/press-start-2p-latin-400-normal-xj9lRvVs.woff2 +0 -0
  91. package/dist/main/ui/frontend/assets/press-start-2p-latin-ext-400-normal-B18ub5-k.woff +0 -0
  92. package/dist/main/ui/frontend/assets/press-start-2p-latin-ext-400-normal-DDIa4im3.woff2 +0 -0
  93. package/dist/main/ui/frontend/index.html +16 -0
  94. package/dist/main/ui/user-action-handlers.d.ts +2 -0
  95. package/dist/main/ui/user-action-handlers.js +9 -0
  96. package/dist/main/ui/user-action-handlers.js.map +1 -0
  97. package/dist/prompt/ai-service-fallback.d.ts +3 -0
  98. package/dist/prompt/ai-service-fallback.js +79 -0
  99. package/dist/prompt/ai-service-fallback.js.map +1 -0
  100. package/dist/prompt/function-calling.js +3 -1
  101. package/dist/prompt/function-calling.js.map +1 -1
  102. package/dist/prompt/function-defs/ask-question.d.ts +13 -13
  103. package/dist/prompt/function-defs/ask-question.js +13 -14
  104. package/dist/prompt/function-defs/ask-question.js.map +1 -1
  105. package/dist/prompt/function-defs/codegen-summary.d.ts +23 -21
  106. package/dist/prompt/function-defs/codegen-summary.js +28 -28
  107. package/dist/prompt/function-defs/codegen-summary.js.map +1 -1
  108. package/dist/prompt/function-defs/create-file.d.ts +4 -4
  109. package/dist/prompt/function-defs/create-file.js +4 -4
  110. package/dist/prompt/function-defs/create-file.js.map +1 -1
  111. package/dist/prompt/function-defs/delete-file.d.ts +4 -4
  112. package/dist/prompt/function-defs/delete-file.js +4 -4
  113. package/dist/prompt/function-defs/delete-file.js.map +1 -1
  114. package/dist/prompt/function-defs/generate-image.d.ts +4 -4
  115. package/dist/prompt/function-defs/generate-image.js +4 -4
  116. package/dist/prompt/function-defs/generate-image.js.map +1 -1
  117. package/dist/prompt/function-defs/get-source-code.d.ts +1 -1
  118. package/dist/prompt/function-defs/get-source-code.js +2 -1
  119. package/dist/prompt/function-defs/get-source-code.js.map +1 -1
  120. package/dist/prompt/function-defs/move-file.d.ts +4 -4
  121. package/dist/prompt/function-defs/move-file.js +4 -4
  122. package/dist/prompt/function-defs/move-file.js.map +1 -1
  123. package/dist/prompt/function-defs/optimize-context.d.ts +41 -0
  124. package/dist/prompt/function-defs/optimize-context.js +42 -0
  125. package/dist/prompt/function-defs/optimize-context.js.map +1 -0
  126. package/dist/prompt/function-defs/patch-file.d.ts +4 -4
  127. package/dist/prompt/function-defs/patch-file.js +4 -4
  128. package/dist/prompt/function-defs/patch-file.js.map +1 -1
  129. package/dist/prompt/function-defs/update-file.d.ts +4 -4
  130. package/dist/prompt/function-defs/update-file.js +4 -4
  131. package/dist/prompt/function-defs/update-file.js.map +1 -1
  132. package/dist/prompt/limits.d.ts +3 -3
  133. package/dist/prompt/limits.js +10 -8
  134. package/dist/prompt/limits.js.map +1 -1
  135. package/dist/prompt/limits.test.js +6 -6
  136. package/dist/prompt/limits.test.js.map +1 -1
  137. package/dist/prompt/prompt-codegen.js +38 -23
  138. package/dist/prompt/prompt-codegen.js.map +1 -1
  139. package/dist/prompt/prompt-codegen.test.js +2 -2
  140. package/dist/prompt/prompt-codegen.test.js.map +1 -1
  141. package/dist/prompt/prompt-service-ask-question.test.js +12 -5
  142. package/dist/prompt/prompt-service-ask-question.test.js.map +1 -1
  143. package/dist/prompt/prompt-service.d.ts +3 -9
  144. package/dist/prompt/prompt-service.js +30 -7
  145. package/dist/prompt/prompt-service.js.map +1 -1
  146. package/dist/prompt/prompt-service.test.js +40 -25
  147. package/dist/prompt/prompt-service.test.js.map +1 -1
  148. package/dist/prompt/steps/step-ask-question.d.ts +1 -1
  149. package/dist/prompt/steps/step-ask-question.js +34 -17
  150. package/dist/prompt/steps/step-ask-question.js.map +1 -1
  151. package/dist/prompt/steps/step-context-optimization.d.ts +6 -0
  152. package/dist/prompt/steps/step-context-optimization.js +146 -0
  153. package/dist/prompt/steps/step-context-optimization.js.map +1 -0
  154. package/dist/prompt/systemprompt.d.ts +1 -1
  155. package/dist/prompt/systemprompt.js +82 -32
  156. package/dist/prompt/systemprompt.js.map +1 -1
  157. package/dist/prompt/systemprompt.test.js +5 -8
  158. package/dist/prompt/systemprompt.test.js.map +1 -1
  159. package/dist/prompt/token-estimator.d.ts +8 -0
  160. package/dist/prompt/token-estimator.js +31 -0
  161. package/dist/prompt/token-estimator.js.map +1 -0
  162. package/package.json +24 -4
  163. package/dist/main/codegen-interactive-utils.d.ts +0 -8
  164. package/dist/main/codegen-interactive-utils.js +0 -148
  165. package/dist/main/codegen-interactive-utils.js.map +0 -1
  166. package/dist/main/codegen-interactive.d.ts +0 -2
  167. package/dist/main/codegen-interactive.js +0 -68
  168. package/dist/main/codegen-interactive.js.map +0 -1
  169. package/dist/main/interactive/worker-script.d.ts +0 -1
  170. package/dist/main/interactive/worker-script.js +0 -24
  171. package/dist/main/interactive/worker-script.js.map +0 -1
  172. package/dist/main/interactive/worker.d.ts +0 -2
  173. package/dist/main/interactive/worker.js +0 -55
  174. package/dist/main/interactive/worker.js.map +0 -1
@@ -0,0 +1,81 @@
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 { createRouter } from './api.js';
8
+ export async function startServer(service) {
9
+ const __dirname = fileURLToPath(new URL('.', import.meta.url));
10
+ const app = express();
11
+ // CORS configuration
12
+ const corsOptions = {
13
+ origin: process.env.ALLOWED_ORIGINS ? process.env.ALLOWED_ORIGINS.split(',') : 'http://localhost:1337',
14
+ optionsSuccessStatus: 200,
15
+ };
16
+ app.use(cors(corsOptions));
17
+ // Helmet for security headers including iframe protection
18
+ app.use(helmet({
19
+ contentSecurityPolicy: {
20
+ directives: {
21
+ defaultSrc: ["'self'"],
22
+ scriptSrc: ["'self'", "'unsafe-inline'"],
23
+ styleSrc: ["'self'", "'unsafe-inline'"],
24
+ imgSrc: ["'self'", 'data:', 'blob:'],
25
+ connectSrc: ["'self'", 'ws:'],
26
+ fontSrc: ["'self'"],
27
+ objectSrc: ["'none'"],
28
+ mediaSrc: ["'self'"],
29
+ frameSrc: ["'none'"],
30
+ },
31
+ },
32
+ referrerPolicy: {
33
+ policy: 'strict-origin-when-cross-origin',
34
+ },
35
+ frameguard: {
36
+ action: 'deny',
37
+ },
38
+ }));
39
+ app.use(express.json());
40
+ const apiRouter = createRouter(service);
41
+ // API routes
42
+ app.use('/api', apiRouter);
43
+ if (service.getCodegenOptions().isDev) {
44
+ console.log('GenAIcode Dev Mode!');
45
+ const { createServer } = await import('vite');
46
+ const vite = await createServer({
47
+ build: {
48
+ target: false,
49
+ rollupOptions: {
50
+ input: __dirname + '../frontend/index.html',
51
+ },
52
+ },
53
+ configFile: false,
54
+ root: __dirname + '../frontend',
55
+ server: {
56
+ middlewareMode: true,
57
+ },
58
+ plugins: [
59
+ {
60
+ name: 'security-token',
61
+ transformIndexHtml: (html) => html.replace('__SECURITY_TOKEN__', service.getToken()),
62
+ },
63
+ ],
64
+ });
65
+ app.use(vite.middlewares);
66
+ }
67
+ else {
68
+ // Serve index.html with injected token
69
+ app.get('/', (_, res) => {
70
+ const indexPath = path.join(__dirname, '../frontend/index.html');
71
+ const html = fs.readFileSync(indexPath, 'utf-8').replace('__SECURITY_TOKEN__', service.getToken());
72
+ res.send(html);
73
+ });
74
+ app.use('/assets', express.static(__dirname + '../frontend/assets'));
75
+ }
76
+ const server = app.listen(1337, () => {
77
+ console.log('Server is running on http://localhost:1337');
78
+ });
79
+ server.on('error', console.error);
80
+ }
81
+ //# 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,47 @@
1
+ import { CodegenOptions } from '../../codegen-types.js';
2
+ import { RcConfig } from '../../config-lib.js';
3
+ import { ContentProps } from '../../common/content-bus-types.js';
4
+ interface CodegenResult {
5
+ success: boolean;
6
+ message?: string;
7
+ }
8
+ interface Question {
9
+ id: string;
10
+ text: string;
11
+ isConfirmation: boolean;
12
+ }
13
+ interface ImageData {
14
+ buffer: Buffer;
15
+ mimetype: 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';
16
+ originalname: string;
17
+ }
18
+ export declare class Service {
19
+ private executionStatus;
20
+ private currentQuestion;
21
+ private askQuestionConversation;
22
+ private codegenOptions;
23
+ private content;
24
+ private pausePromiseResolve;
25
+ private securityToken;
26
+ constructor(codegenOptions: CodegenOptions);
27
+ private generateToken;
28
+ getToken(): string;
29
+ validateToken(token: string): boolean;
30
+ refreshToken(): string;
31
+ executeCodegen(prompt: string, options: CodegenOptions, images?: ImageData[]): Promise<CodegenResult>;
32
+ interruptExecution(): Promise<void>;
33
+ pauseExecution(): Promise<void>;
34
+ resumeExecution(): Promise<void>;
35
+ getExecutionStatus(): Promise<string>;
36
+ getCurrentQuestion(): Promise<Question | null>;
37
+ askQuestion(question: string, isConfirmation?: boolean): Promise<string>;
38
+ answerQuestion(questionId: string, answer: string): Promise<void>;
39
+ handleContent(content: ContentProps): void;
40
+ getContent(): ContentProps[];
41
+ getTotalCost(): Promise<number>;
42
+ getCodegenOptions(): CodegenOptions;
43
+ getRcConfig(): Promise<RcConfig>;
44
+ private waitForQuestionAnswer;
45
+ waitIfPaused(): Promise<void>;
46
+ }
47
+ export {};
@@ -0,0 +1,161 @@
1
+ import { rcConfig } from '../../config.js';
2
+ import { runCodegenWorker, abortController } from '../../interactive/codegen-worker.js';
3
+ import { getCollectedCosts } 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
+ console.log('Ask question:', question, 'Is confirmation:', isConfirmation);
101
+ const questionId = Date.now().toString();
102
+ this.currentQuestion = {
103
+ id: questionId,
104
+ text: question,
105
+ isConfirmation,
106
+ };
107
+ await this.waitForQuestionAnswer();
108
+ console.log('Question answer wait finished.');
109
+ const answer = this.askQuestionConversation.find((q) => q.id === questionId)?.answer ?? '';
110
+ return isConfirmation ? (answer.toLowerCase() === 'yes' ? 'yes' : 'no') : answer;
111
+ }
112
+ async answerQuestion(questionId, answer) {
113
+ if (this.currentQuestion && this.currentQuestion.id === questionId) {
114
+ this.askQuestionConversation.push({
115
+ id: this.currentQuestion.id,
116
+ question: this.currentQuestion.text,
117
+ answer: answer,
118
+ isConfirmation: this.currentQuestion.isConfirmation,
119
+ });
120
+ this.currentQuestion = null;
121
+ console.log(`Answered question: ${answer}`);
122
+ }
123
+ }
124
+ handleContent(content) {
125
+ this.content.push(content);
126
+ }
127
+ getContent() {
128
+ return this.content;
129
+ }
130
+ async getTotalCost() {
131
+ const costs = getCollectedCosts();
132
+ return costs.reduce((total, item) => total + item.cost, 0);
133
+ }
134
+ getCodegenOptions() {
135
+ return this.codegenOptions;
136
+ }
137
+ async getRcConfig() {
138
+ return rcConfig;
139
+ }
140
+ waitForQuestionAnswer() {
141
+ return new Promise((resolve) => {
142
+ const checkQuestion = () => {
143
+ if (this.currentQuestion === null || this.executionStatus === 'interrupted') {
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"}