mcp-image 0.9.0 → 0.11.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 (77) hide show
  1. package/README.md +87 -8
  2. package/dist/api/errorClassification.d.ts +12 -0
  3. package/dist/api/errorClassification.d.ts.map +1 -0
  4. package/dist/api/errorClassification.js +20 -0
  5. package/dist/api/errorClassification.js.map +1 -0
  6. package/dist/api/geminiClient.d.ts +5 -29
  7. package/dist/api/geminiClient.d.ts.map +1 -1
  8. package/dist/api/geminiClient.js +25 -24
  9. package/dist/api/geminiClient.js.map +1 -1
  10. package/dist/api/geminiTextClient.d.ts +3 -27
  11. package/dist/api/geminiTextClient.d.ts.map +1 -1
  12. package/dist/api/geminiTextClient.js +20 -19
  13. package/dist/api/geminiTextClient.js.map +1 -1
  14. package/dist/api/imageClient.d.ts +43 -0
  15. package/dist/api/imageClient.d.ts.map +1 -0
  16. package/dist/api/imageClient.js +2 -0
  17. package/dist/api/imageClient.js.map +1 -0
  18. package/dist/api/openaiImageClient.d.ts +12 -0
  19. package/dist/api/openaiImageClient.d.ts.map +1 -0
  20. package/dist/api/openaiImageClient.js +195 -0
  21. package/dist/api/openaiImageClient.js.map +1 -0
  22. package/dist/api/openaiTextClient.d.ts +12 -0
  23. package/dist/api/openaiTextClient.d.ts.map +1 -0
  24. package/dist/api/openaiTextClient.js +131 -0
  25. package/dist/api/openaiTextClient.js.map +1 -0
  26. package/dist/api/textClient.d.ts +23 -0
  27. package/dist/api/textClient.d.ts.map +1 -0
  28. package/dist/api/textClient.js +2 -0
  29. package/dist/api/textClient.js.map +1 -0
  30. package/dist/business/fileManager.d.ts +1 -1
  31. package/dist/business/fileManager.d.ts.map +1 -1
  32. package/dist/business/fileManager.js +6 -4
  33. package/dist/business/fileManager.js.map +1 -1
  34. package/dist/business/inputValidator.d.ts.map +1 -1
  35. package/dist/business/inputValidator.js +3 -4
  36. package/dist/business/inputValidator.js.map +1 -1
  37. package/dist/business/responseBuilder.d.ts +1 -1
  38. package/dist/business/responseBuilder.d.ts.map +1 -1
  39. package/dist/business/responseBuilder.js +46 -27
  40. package/dist/business/responseBuilder.js.map +1 -1
  41. package/dist/business/structuredPromptGenerator.d.ts +7 -6
  42. package/dist/business/structuredPromptGenerator.d.ts.map +1 -1
  43. package/dist/business/structuredPromptGenerator.js +8 -7
  44. package/dist/business/structuredPromptGenerator.js.map +1 -1
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/server/errorHandler.d.ts.map +1 -1
  48. package/dist/server/errorHandler.js +20 -12
  49. package/dist/server/errorHandler.js.map +1 -1
  50. package/dist/server/mcpServer.d.ts +3 -3
  51. package/dist/server/mcpServer.d.ts.map +1 -1
  52. package/dist/server/mcpServer.js +41 -27
  53. package/dist/server/mcpServer.js.map +1 -1
  54. package/dist/types/mcp.d.ts +11 -0
  55. package/dist/types/mcp.d.ts.map +1 -1
  56. package/dist/types/mcp.js +4 -0
  57. package/dist/types/mcp.js.map +1 -1
  58. package/dist/utils/config.d.ts +3 -1
  59. package/dist/utils/config.d.ts.map +1 -1
  60. package/dist/utils/config.js +31 -8
  61. package/dist/utils/config.js.map +1 -1
  62. package/dist/utils/errors.d.ts +15 -12
  63. package/dist/utils/errors.d.ts.map +1 -1
  64. package/dist/utils/errors.js +57 -11
  65. package/dist/utils/errors.js.map +1 -1
  66. package/dist/utils/logger.d.ts +7 -5
  67. package/dist/utils/logger.d.ts.map +1 -1
  68. package/dist/utils/logger.js +42 -39
  69. package/dist/utils/logger.js.map +1 -1
  70. package/dist/utils/mimeUtils.d.ts +56 -0
  71. package/dist/utils/mimeUtils.d.ts.map +1 -0
  72. package/dist/utils/mimeUtils.js +111 -0
  73. package/dist/utils/mimeUtils.js.map +1 -0
  74. package/dist/utils/security.d.ts.map +1 -1
  75. package/dist/utils/security.js +2 -3
  76. package/dist/utils/security.js.map +1 -1
  77. package/package.json +7 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageClient.d.ts","sourceRoot":"","sources":["../../src/api/imageClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAErF;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,IAAI,CAAA;IACf,kBAAkB,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,OAAO,CAAC,EAAE,YAAY,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,uBAAuB,CAAA;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,aAAa,CACX,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC,CAAC,CAAA;CACxF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=imageClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageClient.js","sourceRoot":"","sources":["../../src/api/imageClient.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * OpenAI API client for GPT Image generation and editing.
3
+ */
4
+ import type { Result } from '../types/result.js';
5
+ import type { Config } from '../utils/config.js';
6
+ import { ImageAPIError } from '../utils/errors.js';
7
+ import type { ImageClient } from './imageClient.js';
8
+ /**
9
+ * Creates a new OpenAI image client.
10
+ */
11
+ export declare function createOpenAIImageClient(config: Config): Result<ImageClient, ImageAPIError>;
12
+ //# sourceMappingURL=openaiImageClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openaiImageClient.d.ts","sourceRoot":"","sources":["../../src/api/openaiImageClient.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAgB,MAAM,oBAAoB,CAAA;AAGhE,OAAO,KAAK,EAAwC,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAmQzF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,CAe1F"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * OpenAI API client for GPT Image generation and editing.
3
+ */
4
+ import OpenAI, { toFile } from 'openai';
5
+ import { Err, Ok } from '../types/result.js';
6
+ import { ImageAPIError, NetworkError } from '../utils/errors.js';
7
+ import { DEFAULT_MIME_TYPE, normalizeMimeType } from '../utils/mimeUtils.js';
8
+ import { extractStatusCode, isNetworkError } from './errorClassification.js';
9
+ function mapQuality(quality) {
10
+ switch (quality) {
11
+ case 'quality':
12
+ return 'high';
13
+ case 'balanced':
14
+ return 'medium';
15
+ case 'fast':
16
+ return 'low';
17
+ }
18
+ }
19
+ function getOrientation(params) {
20
+ if (!params.aspectRatio) {
21
+ return 'square';
22
+ }
23
+ const [widthRaw, heightRaw] = params.aspectRatio.split(':');
24
+ const width = Number(widthRaw);
25
+ const height = Number(heightRaw);
26
+ if (!Number.isFinite(width) || !Number.isFinite(height) || width === height) {
27
+ return 'square';
28
+ }
29
+ return width > height ? 'landscape' : 'portrait';
30
+ }
31
+ function mapSize(params) {
32
+ const orientation = getOrientation(params);
33
+ if (params.imageSize === '2K') {
34
+ switch (orientation) {
35
+ case 'landscape':
36
+ return '2048x1152';
37
+ case 'portrait':
38
+ return '1152x2048';
39
+ case 'square':
40
+ return '2048x2048';
41
+ }
42
+ }
43
+ if (params.imageSize === '4K') {
44
+ switch (orientation) {
45
+ case 'landscape':
46
+ return '3840x2160';
47
+ case 'portrait':
48
+ return '2160x3840';
49
+ case 'square':
50
+ return '2880x2880';
51
+ }
52
+ }
53
+ switch (orientation) {
54
+ case 'landscape':
55
+ return '1536x1024';
56
+ case 'portrait':
57
+ return '1024x1536';
58
+ case 'square':
59
+ return '1024x1024';
60
+ }
61
+ }
62
+ function mimeTypeToExtension(mimeType) {
63
+ switch (normalizeMimeType(mimeType)) {
64
+ case 'image/jpeg':
65
+ return 'jpg';
66
+ case 'image/webp':
67
+ return 'webp';
68
+ default:
69
+ return 'png';
70
+ }
71
+ }
72
+ const OPENAI_IMAGE_MODEL = 'gpt-image-2';
73
+ function hasInputImage(params) {
74
+ return typeof params.inputImage === 'string' && params.inputImage.length > 0;
75
+ }
76
+ function validateOpenAIOptions(params) {
77
+ if (params.useGoogleSearch) {
78
+ return Err(new ImageAPIError('useGoogleSearch is not supported by the OpenAI image provider', 'Disable useGoogleSearch or use IMAGE_PROVIDER=gemini for Google Search grounding'));
79
+ }
80
+ return Ok(true);
81
+ }
82
+ class OpenAIImageClientImpl {
83
+ constructor(client, defaultQuality = 'fast') {
84
+ this.client = client;
85
+ this.defaultQuality = defaultQuality;
86
+ this.outputFormat = 'png';
87
+ this.modelName = OPENAI_IMAGE_MODEL;
88
+ }
89
+ async generateImage(params) {
90
+ try {
91
+ const optionsResult = validateOpenAIOptions(params);
92
+ if (!optionsResult.success) {
93
+ return optionsResult;
94
+ }
95
+ const quality = mapQuality(params.quality ?? this.defaultQuality);
96
+ const size = mapSize(params);
97
+ const response = hasInputImage(params)
98
+ ? await this.editImage(params, quality, size)
99
+ : await this.createImage(params, quality, size);
100
+ const firstImage = response.data?.[0];
101
+ if (!firstImage?.b64_json) {
102
+ return Err(new ImageAPIError('No image data returned from OpenAI image API', {
103
+ provider: 'openai',
104
+ model: this.modelName,
105
+ stage: 'image_extraction',
106
+ suggestion: 'Retry the request or verify that the selected model returns base64 image data',
107
+ }));
108
+ }
109
+ return Ok({
110
+ imageData: Buffer.from(firstImage.b64_json, 'base64'),
111
+ metadata: {
112
+ model: this.modelName,
113
+ provider: 'openai',
114
+ prompt: params.prompt,
115
+ mimeType: `image/${this.outputFormat}`,
116
+ timestamp: new Date(),
117
+ inputImageProvided: !!params.inputImage,
118
+ ...(firstImage.revised_prompt && { revisedPrompt: firstImage.revised_prompt }),
119
+ },
120
+ });
121
+ }
122
+ catch (error) {
123
+ return this.handleError(error, params.prompt);
124
+ }
125
+ }
126
+ async createImage(params, quality, size) {
127
+ const request = {
128
+ model: this.modelName,
129
+ prompt: params.prompt,
130
+ n: 1,
131
+ output_format: this.outputFormat,
132
+ quality,
133
+ size,
134
+ };
135
+ return await this.client.images.generate(request);
136
+ }
137
+ async editImage(params, quality, size) {
138
+ const mimeType = normalizeMimeType(params.inputImageMimeType ?? DEFAULT_MIME_TYPE);
139
+ const inputFile = await toFile(Buffer.from(params.inputImage, 'base64'), `input.${mimeTypeToExtension(mimeType)}`, { type: mimeType });
140
+ const request = {
141
+ model: this.modelName,
142
+ prompt: params.prompt,
143
+ image: inputFile,
144
+ n: 1,
145
+ output_format: this.outputFormat,
146
+ quality,
147
+ size,
148
+ };
149
+ return await this.client.images.edit(request);
150
+ }
151
+ handleError(error, prompt) {
152
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
153
+ if (isNetworkError(error)) {
154
+ return Err(new NetworkError('Network error during OpenAI image generation', 'Check your internet connection and try again', error instanceof Error ? error : undefined));
155
+ }
156
+ return Err(new ImageAPIError('Failed to generate image with OpenAI', {
157
+ provider: 'openai',
158
+ prompt,
159
+ upstreamMessage: errorMessage,
160
+ suggestion: this.getAPIErrorSuggestion(errorMessage),
161
+ }, extractStatusCode(error)));
162
+ }
163
+ getAPIErrorSuggestion(errorMessage) {
164
+ const lowerMessage = errorMessage.toLowerCase();
165
+ if (lowerMessage.includes('quota') || lowerMessage.includes('rate limit')) {
166
+ return 'You have exceeded your OpenAI API quota or rate limit. Wait before retrying or upgrade your plan';
167
+ }
168
+ if (lowerMessage.includes('unauthorized') || lowerMessage.includes('api key')) {
169
+ return 'Check that your OPENAI_API_KEY is valid and has image generation permissions';
170
+ }
171
+ if (lowerMessage.includes('model') || lowerMessage.includes('not found')) {
172
+ return 'Verify your OpenAI organization has been verified to use gpt-image-2 (https://platform.openai.com/settings/organization/general)';
173
+ }
174
+ if (lowerMessage.includes('forbidden') || lowerMessage.includes('permission')) {
175
+ return 'Your OpenAI API key does not have permission for this operation or model';
176
+ }
177
+ return 'Check OpenAI API configuration and try again';
178
+ }
179
+ }
180
+ /**
181
+ * Creates a new OpenAI image client.
182
+ */
183
+ export function createOpenAIImageClient(config) {
184
+ try {
185
+ const client = new OpenAI({
186
+ apiKey: config.openaiApiKey,
187
+ });
188
+ return Ok(new OpenAIImageClientImpl(client, config.imageQuality));
189
+ }
190
+ catch (error) {
191
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
192
+ return Err(new ImageAPIError(`Failed to initialize OpenAI image client: ${errorMessage}`, 'Verify your OPENAI_API_KEY is valid and the openai package is properly installed'));
193
+ }
194
+ }
195
+ //# sourceMappingURL=openaiImageClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openaiImageClient.js","sourceRoot":"","sources":["../../src/api/openaiImageClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * OpenAI text client for structured prompt enhancement.
3
+ */
4
+ import type { Result } from '../types/result.js';
5
+ import type { Config } from '../utils/config.js';
6
+ import { ImageAPIError } from '../utils/errors.js';
7
+ import type { TextClient } from './textClient.js';
8
+ /**
9
+ * Creates a new OpenAI text client for prompt enhancement.
10
+ */
11
+ export declare function createOpenAITextClient(config: Config): Result<TextClient, ImageAPIError>;
12
+ //# sourceMappingURL=openaiTextClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openaiTextClient.d.ts","sourceRoot":"","sources":["../../src/api/openaiTextClient.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAgB,MAAM,oBAAoB,CAAA;AAGhE,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,iBAAiB,CAAA;AA+KnE;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAYxF"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * OpenAI text client for structured prompt enhancement.
3
+ */
4
+ import OpenAI from 'openai';
5
+ import { Err, Ok } from '../types/result.js';
6
+ import { ImageAPIError, NetworkError } from '../utils/errors.js';
7
+ import { DEFAULT_MIME_TYPE, normalizeMimeType } from '../utils/mimeUtils.js';
8
+ import { extractStatusCode, isNetworkError } from './errorClassification.js';
9
+ const OPENAI_TEXT_MODEL = 'gpt-4o-mini';
10
+ class OpenAITextClientImpl {
11
+ constructor(config) {
12
+ this.modelName = OPENAI_TEXT_MODEL;
13
+ this.client = new OpenAI({
14
+ apiKey: config.openaiApiKey,
15
+ });
16
+ }
17
+ async generateText(prompt, config = {}) {
18
+ const validationResult = this.validatePromptInput(prompt);
19
+ if (!validationResult.success) {
20
+ return validationResult;
21
+ }
22
+ const timeout = config.timeout ?? 30000;
23
+ try {
24
+ const response = (await this.client.responses.create({
25
+ model: this.modelName,
26
+ input: this.buildInput(prompt, config),
27
+ ...(config.systemInstruction && { instructions: config.systemInstruction }),
28
+ max_output_tokens: config.maxTokens ?? 8192,
29
+ temperature: config.temperature ?? 0.7,
30
+ top_p: config.topP ?? 0.95,
31
+ }, { signal: AbortSignal.timeout(timeout) }));
32
+ const responseText = this.extractResponseText(response);
33
+ if (!responseText || responseText.trim().length === 0) {
34
+ throw new Error('Empty response from OpenAI text API');
35
+ }
36
+ return Ok(responseText.trim());
37
+ }
38
+ catch (error) {
39
+ return this.handleError(error, 'text generation');
40
+ }
41
+ }
42
+ async validateConnection() {
43
+ try {
44
+ if (!this.client.responses) {
45
+ return Err(new ImageAPIError('Failed to access OpenAI Responses API', 'Check your OPENAI_API_KEY configuration'));
46
+ }
47
+ return Ok(true);
48
+ }
49
+ catch (error) {
50
+ return this.handleError(error, 'connection validation');
51
+ }
52
+ }
53
+ buildInput(prompt, config) {
54
+ if (!config.inputImage) {
55
+ return prompt;
56
+ }
57
+ const mimeType = normalizeMimeType(config.inputImageMimeType ?? DEFAULT_MIME_TYPE);
58
+ return [
59
+ {
60
+ role: 'user',
61
+ content: [
62
+ {
63
+ type: 'input_text',
64
+ text: prompt,
65
+ },
66
+ {
67
+ type: 'input_image',
68
+ image_url: `data:${mimeType};base64,${config.inputImage}`,
69
+ detail: 'auto',
70
+ },
71
+ ],
72
+ },
73
+ ];
74
+ }
75
+ extractResponseText(response) {
76
+ if (typeof response.output_text === 'string') {
77
+ return response.output_text;
78
+ }
79
+ const textParts = response.output?.flatMap((item) => item.content
80
+ ?.filter((content) => content.type === 'output_text' && typeof content.text === 'string')
81
+ .map((content) => content.text ?? '')) ?? [];
82
+ return textParts.join('');
83
+ }
84
+ handleError(error, context) {
85
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
86
+ if (isNetworkError(error)) {
87
+ return Err(new NetworkError(`Network error during OpenAI ${context}`, 'Check your internet connection and try again'));
88
+ }
89
+ return Err(new ImageAPIError(`Failed during OpenAI ${context}`, {
90
+ provider: 'openai',
91
+ stage: context,
92
+ upstreamMessage: errorMessage,
93
+ suggestion: this.getAPIErrorSuggestion(errorMessage),
94
+ }, extractStatusCode(error)));
95
+ }
96
+ getAPIErrorSuggestion(errorMessage) {
97
+ const lowerMessage = errorMessage.toLowerCase();
98
+ if (lowerMessage.includes('quota') || lowerMessage.includes('rate limit')) {
99
+ return 'You have exceeded your OpenAI API quota or rate limit. Wait before retrying or upgrade your plan';
100
+ }
101
+ if (lowerMessage.includes('unauthorized') || lowerMessage.includes('api key')) {
102
+ return 'Check that your OPENAI_API_KEY is valid';
103
+ }
104
+ if (lowerMessage.includes('model') || lowerMessage.includes('not found')) {
105
+ return 'Ensure gpt-4o-mini is available to your OpenAI account';
106
+ }
107
+ return 'Check OpenAI API configuration and try again';
108
+ }
109
+ validatePromptInput(prompt) {
110
+ if (!prompt || prompt.trim().length === 0) {
111
+ return Err(new ImageAPIError('Empty prompt provided', 'Please provide a non-empty prompt'));
112
+ }
113
+ if (prompt.length > 100000) {
114
+ return Err(new ImageAPIError('Prompt too long', 'Please provide a shorter prompt'));
115
+ }
116
+ return Ok(true);
117
+ }
118
+ }
119
+ /**
120
+ * Creates a new OpenAI text client for prompt enhancement.
121
+ */
122
+ export function createOpenAITextClient(config) {
123
+ try {
124
+ return Ok(new OpenAITextClientImpl(config));
125
+ }
126
+ catch (error) {
127
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
128
+ return Err(new ImageAPIError(`Failed to initialize OpenAI Text client: ${errorMessage}`, 'Verify your OPENAI_API_KEY is valid and the openai package is properly installed'));
129
+ }
130
+ }
131
+ //# sourceMappingURL=openaiTextClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openaiTextClient.js","sourceRoot":"","sources":["../../src/api/openaiTextClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Result } from '../types/result.js';
2
+ import type { GeminiAPIError, ImageAPIError, NetworkError } from '../utils/errors.js';
3
+ /**
4
+ * Options for text generation used by the prompt enhancer.
5
+ */
6
+ export interface GenerationConfig {
7
+ temperature?: number;
8
+ maxTokens?: number;
9
+ timeout?: number;
10
+ systemInstruction?: string;
11
+ inputImage?: string;
12
+ inputImageMimeType?: string;
13
+ topP?: number;
14
+ topK?: number;
15
+ }
16
+ /**
17
+ * Provider-neutral text client for prompt enhancement.
18
+ */
19
+ export interface TextClient {
20
+ generateText(prompt: string, config?: GenerationConfig): Promise<Result<string, GeminiAPIError | ImageAPIError | NetworkError>>;
21
+ validateConnection(): Promise<Result<boolean, GeminiAPIError | ImageAPIError | NetworkError>>;
22
+ }
23
+ //# sourceMappingURL=textClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textClient.d.ts","sourceRoot":"","sources":["../../src/api/textClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAErF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY,CACV,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC,CAAC,CAAA;IAEzE,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC,CAAC,CAAA;CAC9F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=textClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textClient.js","sourceRoot":"","sources":["../../src/api/textClient.ts"],"names":[],"mappings":""}
@@ -10,7 +10,7 @@ import { FileOperationError } from '../utils/errors.js';
10
10
  export interface FileManager {
11
11
  saveImage(imageData: Buffer, outputPath: string, format?: string): Promise<Result<string, FileOperationError>>;
12
12
  ensureDirectoryExists(dirPath: string): Result<void, FileOperationError>;
13
- generateFileName(): string;
13
+ generateFileName(mimeType?: string): string;
14
14
  }
15
15
  /**
16
16
  * Creates a file manager for image file operations
@@ -1 +1 @@
1
- {"version":3,"file":"fileManager.d.ts","sourceRoot":"","sources":["../../src/business/fileManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAcvD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAC9C,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;IACxE,gBAAgB,IAAI,MAAM,CAAA;CAC3B;AA+BD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAsC/C"}
1
+ {"version":3,"file":"fileManager.d.ts","sourceRoot":"","sources":["../../src/business/fileManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAcvD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAC9C,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;IACxE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC5C;AAiCD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAsC/C"}
@@ -7,9 +7,9 @@ import { promises as fs, mkdirSync } from 'node:fs';
7
7
  import * as path from 'node:path';
8
8
  import { Err, Ok } from '../types/result.js';
9
9
  import { FileOperationError } from '../utils/errors.js';
10
+ import { DEFAULT_MIME_TYPE, getExtensionFromMimeType } from '../utils/mimeUtils.js';
10
11
  // Constants for file naming and error messages
11
12
  const FILE_NAME_PREFIX = 'image';
12
- const DEFAULT_EXTENSION = '.png';
13
13
  const RANDOM_BYTES_LENGTH = 4;
14
14
  const ERROR_MESSAGES = {
15
15
  SAVE_FAILED: 'Failed to save image file',
@@ -34,12 +34,14 @@ function ensureDirectoryExists(dirPath) {
34
34
  }
35
35
  /**
36
36
  * Generates a unique filename based on timestamp and random component
37
- * @returns Generated filename in the format: gemini-image-{timestamp}.png
37
+ * @param mimeType Optional MIME type to determine file extension (defaults to image/png)
38
+ * @returns Generated filename in the format: image-{timestamp}-{hex}.{ext}
38
39
  */
39
- function generateFileName() {
40
+ function generateFileName(mimeType) {
40
41
  const timestamp = Date.now();
41
42
  const random = randomBytes(RANDOM_BYTES_LENGTH).toString('hex');
42
- return `${FILE_NAME_PREFIX}-${timestamp}-${random}${DEFAULT_EXTENSION}`;
43
+ const extension = getExtensionFromMimeType(mimeType ?? DEFAULT_MIME_TYPE);
44
+ return `${FILE_NAME_PREFIX}-${timestamp}-${random}${extension}`;
43
45
  }
44
46
  /**
45
47
  * Creates a file manager for image file operations
@@ -1 +1 @@
1
- {"version":3,"file":"fileManager.js","sourceRoot":"","sources":["../../src/business/fileManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,+CAA+C;AAC/C,MAAM,gBAAgB,GAAG,OAAgB,CAAA;AACzC,MAAM,iBAAiB,GAAG,MAAe,CAAA;AACzC,MAAM,mBAAmB,GAAG,CAAU,CAAA;AAEtC,MAAM,cAAc,GAAG;IACrB,WAAW,EAAE,2BAA2B;IACxC,yBAAyB,EAAE,4BAA4B;IACvD,qBAAqB,EAAE,mDAAmD;IAC1E,eAAe,EAAE,qDAAqD;CAC9D,CAAA;AAeV;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,iFAAiF;QACjF,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACvC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAA;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CACR,IAAI,kBAAkB,CACpB,GAAG,cAAc,CAAC,yBAAyB,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC3G,CACF,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/D,OAAO,GAAG,gBAAgB,IAAI,SAAS,IAAI,MAAM,GAAG,iBAAiB,EAAE,CAAA;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL;;;;;;WAMG;QACH,KAAK,CAAC,SAAS,CACb,SAAiB,EACjB,UAAkB,EAClB,OAAgB;YAEhB,IAAI,CAAC;gBACH,8BAA8B;gBAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;gBAC1C,MAAM,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;gBAClD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;oBACvB,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;gBAC7B,CAAC;gBAED,gBAAgB;gBAChB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;gBAEzC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAA;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,CACR,IAAI,kBAAkB,CACpB,GAAG,cAAc,CAAC,WAAW,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC7F,CACF,CAAA;YACH,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,gBAAgB;KACjB,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"fileManager.js","sourceRoot":"","sources":["../../src/business/fileManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAEnF,+CAA+C;AAC/C,MAAM,gBAAgB,GAAG,OAAgB,CAAA;AACzC,MAAM,mBAAmB,GAAG,CAAU,CAAA;AAEtC,MAAM,cAAc,GAAG;IACrB,WAAW,EAAE,2BAA2B;IACxC,yBAAyB,EAAE,4BAA4B;IACvD,qBAAqB,EAAE,mDAAmD;IAC1E,eAAe,EAAE,qDAAqD;CAC9D,CAAA;AAeV;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,iFAAiF;QACjF,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACvC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAA;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CACR,IAAI,kBAAkB,CACpB,GAAG,cAAc,CAAC,yBAAyB,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC3G,CACF,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,QAAiB;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/D,MAAM,SAAS,GAAG,wBAAwB,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAA;IACzE,OAAO,GAAG,gBAAgB,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,EAAE,CAAA;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL;;;;;;WAMG;QACH,KAAK,CAAC,SAAS,CACb,SAAiB,EACjB,UAAkB,EAClB,OAAgB;YAEhB,IAAI,CAAC;gBACH,8BAA8B;gBAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;gBAC1C,MAAM,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;gBAClD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;oBACvB,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;gBAC7B,CAAC;gBAED,gBAAgB;gBAChB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;gBAEzC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAA;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,CACR,IAAI,kBAAkB,CACpB,GAAG,cAAc,CAAC,WAAW,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC7F,CACF,CAAA;YACH,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,gBAAgB;KACjB,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"inputValidator.d.ts","sourceRoot":"","sources":["../../src/business/inputValidator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAe,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAiCzD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAanF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,oBAAoB,CAAC,CAuDlD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,oBAAoB,CAAC,CA6BlD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,mBAAmB,GAC1B,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CA2EnD"}
1
+ {"version":3,"file":"inputValidator.d.ts","sourceRoot":"","sources":["../../src/business/inputValidator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAe,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAiCzD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAanF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,oBAAoB,CAAC,CAuDlD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,oBAAoB,CAAC,CA4BlD;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,mBAAmB,GAC1B,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CA2EnD"}
@@ -7,11 +7,11 @@ import { extname } from 'node:path';
7
7
  import { IMAGE_QUALITY_VALUES } from '../types/mcp.js';
8
8
  import { Err, Ok } from '../types/result.js';
9
9
  import { InputValidationError } from '../utils/errors.js';
10
+ import { SUPPORTED_EXTENSIONS, SUPPORTED_MIME_TYPES } from '../utils/mimeUtils.js';
10
11
  // Constants for validation limits
11
12
  const PROMPT_MIN_LENGTH = 1;
12
13
  const PROMPT_MAX_LENGTH = 4000;
13
14
  const MAX_IMAGE_SIZE = 10 * 1024 * 1024; // 10MB in bytes
14
- const SUPPORTED_MIME_TYPES = ['image/jpeg', 'image/png', 'image/webp', 'image/gif', 'image/bmp'];
15
15
  const SUPPORTED_ASPECT_RATIOS = [
16
16
  '1:1',
17
17
  '1:4',
@@ -99,9 +99,8 @@ export function validateImagePath(imagePath) {
99
99
  }
100
100
  // Check file extension
101
101
  const ext = extname(imagePath).toLowerCase();
102
- const supportedExtensions = ['.jpg', '.jpeg', '.png', '.webp', '.gif', '.bmp'];
103
- if (!supportedExtensions.includes(ext)) {
104
- return Err(new InputValidationError(`Unsupported image format: ${ext}. Supported formats: ${supportedExtensions.join(', ')}`, `Please provide an image with one of these extensions: ${supportedExtensions.join(', ')}`));
102
+ if (!SUPPORTED_EXTENSIONS.includes(ext)) {
103
+ return Err(new InputValidationError(`Unsupported image format: ${ext}. Supported formats: ${SUPPORTED_EXTENSIONS.join(', ')}`, `Please provide an image with one of these extensions: ${SUPPORTED_EXTENSIONS.join(', ')}`));
105
104
  }
106
105
  return Ok(imagePath);
107
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"inputValidator.js","sourceRoot":"","sources":["../../src/business/inputValidator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inputValidator.js","sourceRoot":"","sources":["../../src/business/inputValidator.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * Response Builder for MCP structured content responses
3
3
  * Converts generation results and errors into MCP-compatible response format
4
4
  */
5
- import type { GeneratedImageResult } from '../api/geminiClient.js';
5
+ import type { GeneratedImageResult } from '../api/imageClient.js';
6
6
  import type { McpToolResponse } from '../types/mcp.js';
7
7
  import { type BaseError } from '../utils/errors.js';
8
8
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"responseBuilder.d.ts","sourceRoot":"","sources":["../../src/business/responseBuilder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,iBAAiB,CAAA;AACzE,OAAO,EACL,KAAK,SAAS,EAOf,MAAM,oBAAoB,CAAA;AAmB3B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oBAAoB,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAAA;IAC/F,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,GAAG,eAAe,CAAA;CAC9D;AA+DD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAgEvD"}
1
+ {"version":3,"file":"responseBuilder.d.ts","sourceRoot":"","sources":["../../src/business/responseBuilder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,iBAAiB,CAAA;AACzE,OAAO,EACL,KAAK,SAAS,EAQf,MAAM,oBAAoB,CAAA;AAuC3B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oBAAoB,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAAA;IAC/F,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,GAAG,eAAe,CAAA;CAC9D;AA+DD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CAmEvD"}