@fastcoder/vision-mcp-server 1.0.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.
- package/README.md +263 -0
- package/README.zh-CN.md +210 -0
- package/build/core/api-common.d.ts +89 -0
- package/build/core/api-common.d.ts.map +1 -0
- package/build/core/api-common.js +119 -0
- package/build/core/api-common.js.map +1 -0
- package/build/core/base-image-service.d.ts +38 -0
- package/build/core/base-image-service.d.ts.map +1 -0
- package/build/core/base-image-service.js +92 -0
- package/build/core/base-image-service.js.map +1 -0
- package/build/core/chat-service.d.ts +42 -0
- package/build/core/chat-service.d.ts.map +1 -0
- package/build/core/chat-service.js +97 -0
- package/build/core/chat-service.js.map +1 -0
- package/build/core/environment.d.ts +76 -0
- package/build/core/environment.d.ts.map +1 -0
- package/build/core/environment.js +132 -0
- package/build/core/environment.js.map +1 -0
- package/build/core/error-handler.d.ts +124 -0
- package/build/core/error-handler.d.ts.map +1 -0
- package/build/core/error-handler.js +248 -0
- package/build/core/error-handler.js.map +1 -0
- package/build/core/file-service.d.ts +36 -0
- package/build/core/file-service.d.ts.map +1 -0
- package/build/core/file-service.js +141 -0
- package/build/core/file-service.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +119 -0
- package/build/index.js.map +1 -0
- package/build/prompts/data-viz.d.ts +5 -0
- package/build/prompts/data-viz.d.ts.map +1 -0
- package/build/prompts/data-viz.js +98 -0
- package/build/prompts/data-viz.js.map +1 -0
- package/build/prompts/diagram-analysis.d.ts +5 -0
- package/build/prompts/diagram-analysis.d.ts.map +1 -0
- package/build/prompts/diagram-analysis.js +102 -0
- package/build/prompts/diagram-analysis.js.map +1 -0
- package/build/prompts/error-diagnosis.d.ts +5 -0
- package/build/prompts/error-diagnosis.d.ts.map +1 -0
- package/build/prompts/error-diagnosis.js +69 -0
- package/build/prompts/error-diagnosis.js.map +1 -0
- package/build/prompts/general-image.d.ts +5 -0
- package/build/prompts/general-image.d.ts.map +1 -0
- package/build/prompts/general-image.js +45 -0
- package/build/prompts/general-image.js.map +1 -0
- package/build/prompts/index.d.ts +8 -0
- package/build/prompts/index.d.ts.map +1 -0
- package/build/prompts/index.js +8 -0
- package/build/prompts/index.js.map +1 -0
- package/build/prompts/text-extraction.d.ts +5 -0
- package/build/prompts/text-extraction.d.ts.map +1 -0
- package/build/prompts/text-extraction.js +45 -0
- package/build/prompts/text-extraction.js.map +1 -0
- package/build/prompts/ui-diff.d.ts +5 -0
- package/build/prompts/ui-diff.d.ts.map +1 -0
- package/build/prompts/ui-diff.js +190 -0
- package/build/prompts/ui-diff.js.map +1 -0
- package/build/prompts/ui-to-artifact.d.ts +10 -0
- package/build/prompts/ui-to-artifact.d.ts.map +1 -0
- package/build/prompts/ui-to-artifact.js +89 -0
- package/build/prompts/ui-to-artifact.js.map +1 -0
- package/build/tools/data-viz.d.ts +5 -0
- package/build/tools/data-viz.d.ts.map +1 -0
- package/build/tools/data-viz.js +93 -0
- package/build/tools/data-viz.js.map +1 -0
- package/build/tools/diagram-analysis.d.ts +5 -0
- package/build/tools/diagram-analysis.d.ts.map +1 -0
- package/build/tools/diagram-analysis.js +93 -0
- package/build/tools/diagram-analysis.js.map +1 -0
- package/build/tools/error-diagnosis.d.ts +5 -0
- package/build/tools/error-diagnosis.d.ts.map +1 -0
- package/build/tools/error-diagnosis.js +93 -0
- package/build/tools/error-diagnosis.js.map +1 -0
- package/build/tools/general-image.d.ts +5 -0
- package/build/tools/general-image.d.ts.map +1 -0
- package/build/tools/general-image.js +81 -0
- package/build/tools/general-image.js.map +1 -0
- package/build/tools/index.d.ts +8 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +9 -0
- package/build/tools/index.js.map +1 -0
- package/build/tools/text-extraction.d.ts +5 -0
- package/build/tools/text-extraction.d.ts.map +1 -0
- package/build/tools/text-extraction.js +93 -0
- package/build/tools/text-extraction.js.map +1 -0
- package/build/tools/ui-diff.d.ts +5 -0
- package/build/tools/ui-diff.d.ts.map +1 -0
- package/build/tools/ui-diff.js +98 -0
- package/build/tools/ui-diff.js.map +1 -0
- package/build/tools/ui-to-artifact.d.ts +5 -0
- package/build/tools/ui-to-artifact.d.ts.map +1 -0
- package/build/tools/ui-to-artifact.js +117 -0
- package/build/tools/ui-to-artifact.js.map +1 -0
- package/build/types/index.d.ts +26 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/index.js +43 -0
- package/build/types/index.js.map +1 -0
- package/build/utils/logger.d.ts +24 -0
- package/build/utils/logger.d.ts.map +1 -0
- package/build/utils/logger.js +119 -0
- package/build/utils/logger.js.map +1 -0
- package/build/utils/validation.d.ts +87 -0
- package/build/utils/validation.d.ts.map +1 -0
- package/build/utils/validation.js +155 -0
- package/build/utils/validation.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { MultimodalContent } from './api-common.js';
|
|
2
|
+
/**
|
|
3
|
+
* Base image analysis service providing shared functionality
|
|
4
|
+
* for all specialized image analysis tools
|
|
5
|
+
*/
|
|
6
|
+
export declare class BaseImageAnalysisService {
|
|
7
|
+
protected chatService: import("./chat-service.js").ChatService;
|
|
8
|
+
protected fileService: typeof import("./file-service.js").FileService;
|
|
9
|
+
protected MAX_IMAGE_SIZE_MB: number;
|
|
10
|
+
/**
|
|
11
|
+
* Process image source and validate it
|
|
12
|
+
* @param imageSource Image file path or URL
|
|
13
|
+
* @returns Processed image content for API
|
|
14
|
+
*/
|
|
15
|
+
protected processImageSource(imageSource: string): Promise<MultimodalContent>;
|
|
16
|
+
/**
|
|
17
|
+
* Process multiple image sources (for tools like UI diff)
|
|
18
|
+
* @param imageSources Array of image file paths or URLs
|
|
19
|
+
* @returns Array of processed image content objects
|
|
20
|
+
*/
|
|
21
|
+
protected processMultipleImageSources(imageSources: string[]): Promise<MultimodalContent[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Execute vision analysis with a system prompt
|
|
24
|
+
* @param systemPrompt System-level instructions for AI
|
|
25
|
+
* @param userPrompt User's specific request
|
|
26
|
+
* @param imageContents Array of processed image content
|
|
27
|
+
* @param toolName Name of calling tool (for error context)
|
|
28
|
+
* @returns Analysis result
|
|
29
|
+
*/
|
|
30
|
+
protected executeVisionAnalysis(systemPrompt: string, userPrompt: string, imageContents: MultimodalContent[], toolName: string): Promise<string>;
|
|
31
|
+
/**
|
|
32
|
+
* Validate that a prompt is not empty
|
|
33
|
+
* @param prompt Prompt to validate
|
|
34
|
+
* @param toolName Name of calling tool
|
|
35
|
+
*/
|
|
36
|
+
protected validatePrompt(prompt: string, toolName: string): void;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=base-image-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-image-service.d.ts","sourceRoot":"","sources":["../../src/core/base-image-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;GAGG;AACH,qBAAa,wBAAwB;IACnC,SAAS,CAAC,WAAW,0CAAe;IACpC,SAAS,CAAC,WAAW,iDAAe;IACpC,SAAS,CAAC,iBAAiB,SAAM;IAEjC;;;;OAIG;cACa,kBAAkB,CAChC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,CAAC;IAkB7B;;;;OAIG;cACa,2BAA2B,CACzC,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAS/B;;;;;;;OAOG;cACa,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,iBAAiB,EAAE,EAClC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAgClB;;;;OAIG;IACH,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;CAajE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { ToolExecutionError } from './error-handler.js';
|
|
2
|
+
import { createMultiModalMessage, createImageContent } from './api-common.js';
|
|
3
|
+
import { fileService } from './file-service.js';
|
|
4
|
+
import { chatService } from './chat-service.js';
|
|
5
|
+
/**
|
|
6
|
+
* Base image analysis service providing shared functionality
|
|
7
|
+
* for all specialized image analysis tools
|
|
8
|
+
*/
|
|
9
|
+
export class BaseImageAnalysisService {
|
|
10
|
+
chatService = chatService;
|
|
11
|
+
fileService = fileService;
|
|
12
|
+
MAX_IMAGE_SIZE_MB = 20; // Updated to 20MB for OpenAI
|
|
13
|
+
/**
|
|
14
|
+
* Process image source and validate it
|
|
15
|
+
* @param imageSource Image file path or URL
|
|
16
|
+
* @returns Processed image content for API
|
|
17
|
+
*/
|
|
18
|
+
async processImageSource(imageSource) {
|
|
19
|
+
// Validate image source and size
|
|
20
|
+
await this.fileService.validateImageSource(imageSource, this.MAX_IMAGE_SIZE_MB);
|
|
21
|
+
// Handle image source (URL or local file)
|
|
22
|
+
if (this.fileService.isUrl(imageSource)) {
|
|
23
|
+
// For URLs, pass directly without base64 encoding
|
|
24
|
+
return createImageContent(imageSource);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// For local files, encode to base64
|
|
28
|
+
const imageData = await this.fileService.encodeImageToBase64(imageSource);
|
|
29
|
+
return createImageContent(imageData);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Process multiple image sources (for tools like UI diff)
|
|
34
|
+
* @param imageSources Array of image file paths or URLs
|
|
35
|
+
* @returns Array of processed image content objects
|
|
36
|
+
*/
|
|
37
|
+
async processMultipleImageSources(imageSources) {
|
|
38
|
+
const imageContents = [];
|
|
39
|
+
for (const imageSource of imageSources) {
|
|
40
|
+
const imageContent = await this.processImageSource(imageSource);
|
|
41
|
+
imageContents.push(imageContent);
|
|
42
|
+
}
|
|
43
|
+
return imageContents;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Execute vision analysis with a system prompt
|
|
47
|
+
* @param systemPrompt System-level instructions for AI
|
|
48
|
+
* @param userPrompt User's specific request
|
|
49
|
+
* @param imageContents Array of processed image content
|
|
50
|
+
* @param toolName Name of calling tool (for error context)
|
|
51
|
+
* @returns Analysis result
|
|
52
|
+
*/
|
|
53
|
+
async executeVisionAnalysis(systemPrompt, userPrompt, imageContents, toolName) {
|
|
54
|
+
try {
|
|
55
|
+
// Create multimodal message with system context
|
|
56
|
+
const messages = [
|
|
57
|
+
{
|
|
58
|
+
role: 'system',
|
|
59
|
+
content: systemPrompt
|
|
60
|
+
},
|
|
61
|
+
...createMultiModalMessage(imageContents, userPrompt)
|
|
62
|
+
];
|
|
63
|
+
const result = await this.chatService.visionCompletions(messages);
|
|
64
|
+
console.info(`${toolName} analysis completed successfully`);
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error(`${toolName} analysis failed`, {
|
|
69
|
+
error: error instanceof Error ? error.message : String(error)
|
|
70
|
+
});
|
|
71
|
+
throw new ToolExecutionError(`${toolName} analysis failed: ${error instanceof Error ? error.message : String(error)}`, toolName, 'EXECUTION_ERROR', {
|
|
72
|
+
toolName,
|
|
73
|
+
operation: 'executeVisionAnalysis',
|
|
74
|
+
metadata: { originalError: error }
|
|
75
|
+
}, error instanceof Error ? error : undefined);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Validate that a prompt is not empty
|
|
80
|
+
* @param prompt Prompt to validate
|
|
81
|
+
* @param toolName Name of calling tool
|
|
82
|
+
*/
|
|
83
|
+
validatePrompt(prompt, toolName) {
|
|
84
|
+
if (!prompt || prompt.trim().length === 0) {
|
|
85
|
+
throw new ToolExecutionError('Prompt is required for image analysis', toolName, 'VALIDATION_ERROR', {
|
|
86
|
+
toolName,
|
|
87
|
+
operation: 'validatePrompt'
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=base-image-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-image-service.js","sourceRoot":"","sources":["../../src/core/base-image-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IACzB,WAAW,GAAG,WAAW,CAAC;IAC1B,WAAW,GAAG,WAAW,CAAC;IAC1B,iBAAiB,GAAG,EAAE,CAAC,CAAC,6BAA6B;IAE/D;;;;OAIG;IACO,KAAK,CAAC,kBAAkB,CAChC,WAAmB;QAEnB,iCAAiC;QACjC,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,CACxC,WAAW,EACX,IAAI,CAAC,iBAAiB,CACvB,CAAC;QAEF,0CAA0C;QAC1C,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,kDAAkD;YAClD,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;YAC1E,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACO,KAAK,CAAC,2BAA2B,CACzC,YAAsB;QAEtB,MAAM,aAAa,GAAwB,EAAE,CAAC;QAC9C,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAChE,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;;;;;OAOG;IACO,KAAK,CAAC,qBAAqB,CACnC,YAAoB,EACpB,UAAkB,EAClB,aAAkC,EAClC,QAAgB;QAEhB,IAAI,CAAC;YACH,gDAAgD;YAChD,MAAM,QAAQ,GAAG;gBACf;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,YAAY;iBACtB;gBACD,GAAG,uBAAuB,CAAC,aAAa,EAAE,UAAU,CAAC;aACtD,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,kCAAkC,CAAC,CAAC;YAC5D,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,kBAAkB,EAAE;gBAC3C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,MAAM,IAAI,kBAAkB,CAC1B,GAAG,QAAQ,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACxF,QAAQ,EACR,iBAAiB,EACjB;gBACE,QAAQ;gBACR,SAAS,EAAE,uBAAuB;gBAClC,QAAQ,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;aACnC,EACD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACO,cAAc,CAAC,MAAc,EAAE,QAAgB;QACvD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,kBAAkB,CAC1B,uCAAuC,EACvC,QAAQ,EACR,kBAAkB,EAClB;gBACE,QAAQ;gBACR,SAAS,EAAE,gBAAgB;aAC5B,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { EnvironmentService } from './environment.js';
|
|
2
|
+
/**
|
|
3
|
+
* OpenAI API request interface
|
|
4
|
+
*/
|
|
5
|
+
interface OpenAIChatRequest {
|
|
6
|
+
model: string;
|
|
7
|
+
messages: Array<{
|
|
8
|
+
role: string;
|
|
9
|
+
content: string | Array<{
|
|
10
|
+
type: string;
|
|
11
|
+
text?: string;
|
|
12
|
+
image_url?: {
|
|
13
|
+
url: string;
|
|
14
|
+
};
|
|
15
|
+
}>;
|
|
16
|
+
}>;
|
|
17
|
+
temperature: number;
|
|
18
|
+
top_p: number;
|
|
19
|
+
max_tokens: number;
|
|
20
|
+
stream: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* OpenAI API service implementation
|
|
24
|
+
*/
|
|
25
|
+
export declare class ChatService {
|
|
26
|
+
private environmentService;
|
|
27
|
+
constructor(environmentService?: EnvironmentService);
|
|
28
|
+
/**
|
|
29
|
+
* OpenAI chat completions API for vision analysis
|
|
30
|
+
*/
|
|
31
|
+
visionCompletions(messages: OpenAIChatRequest['messages']): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Make HTTP request to OpenAI API with proper headers and error handling
|
|
34
|
+
*/
|
|
35
|
+
private chatCompletions;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* OpenAI API chat completions service instance
|
|
39
|
+
*/
|
|
40
|
+
export declare const chatService: ChatService;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=chat-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-service.d.ts","sourceRoot":"","sources":["../../src/core/chat-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;GAEG;AACH,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE;gBAAE,GAAG,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC,CAAC;KACvF,CAAC,CAAC;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAgBD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,kBAAkB,qBAAmC;IAIjE;;OAEG;IACG,iBAAiB,CACrB,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC;IA0ClB;;OAEG;YACW,eAAe;CAyD9B;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { ApiError } from '../types/index.js';
|
|
2
|
+
import { configurationService } from './environment.js';
|
|
3
|
+
import { EnvironmentService } from './environment.js';
|
|
4
|
+
/**
|
|
5
|
+
* OpenAI API service implementation
|
|
6
|
+
*/
|
|
7
|
+
export class ChatService {
|
|
8
|
+
environmentService;
|
|
9
|
+
constructor(environmentService = EnvironmentService.getInstance()) {
|
|
10
|
+
this.environmentService = environmentService;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* OpenAI chat completions API for vision analysis
|
|
14
|
+
*/
|
|
15
|
+
async visionCompletions(messages) {
|
|
16
|
+
const visionConfig = configurationService.getVisionConfig();
|
|
17
|
+
const apiKey = this.environmentService.getApiKey();
|
|
18
|
+
const requestBody = {
|
|
19
|
+
model: visionConfig.model,
|
|
20
|
+
messages,
|
|
21
|
+
temperature: visionConfig.temperature,
|
|
22
|
+
top_p: visionConfig.topP,
|
|
23
|
+
max_tokens: visionConfig.maxTokens,
|
|
24
|
+
stream: false
|
|
25
|
+
};
|
|
26
|
+
console.info('Requesting OpenAI chat completions API for vision analysis', {
|
|
27
|
+
model: visionConfig.model,
|
|
28
|
+
messageCount: messages.length
|
|
29
|
+
});
|
|
30
|
+
try {
|
|
31
|
+
const response = await this.chatCompletions(visionConfig.url, requestBody, apiKey);
|
|
32
|
+
const result = response.choices?.[0]?.message?.content;
|
|
33
|
+
if (!result) {
|
|
34
|
+
throw new ApiError('Invalid API response: missing content');
|
|
35
|
+
}
|
|
36
|
+
console.info('OpenAI chat completions API request successful');
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error('OpenAI chat completions API request failed', {
|
|
41
|
+
error: error instanceof Error ? error.message : String(error)
|
|
42
|
+
});
|
|
43
|
+
throw error instanceof ApiError
|
|
44
|
+
? error
|
|
45
|
+
: new ApiError(`API call failed: ${error}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Make HTTP request to OpenAI API with proper headers and error handling
|
|
50
|
+
*/
|
|
51
|
+
async chatCompletions(url, body, apiKey) {
|
|
52
|
+
const apiConfig = configurationService.getVisionConfig();
|
|
53
|
+
const controller = new AbortController();
|
|
54
|
+
const timeoutId = setTimeout(() => controller.abort(), apiConfig.timeout);
|
|
55
|
+
try {
|
|
56
|
+
const response = await fetch(url, {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers: {
|
|
59
|
+
Authorization: `Bearer ${apiKey}`,
|
|
60
|
+
'Content-Type': 'application/json',
|
|
61
|
+
Accept: 'application/json'
|
|
62
|
+
},
|
|
63
|
+
body: JSON.stringify(body),
|
|
64
|
+
signal: controller.signal
|
|
65
|
+
});
|
|
66
|
+
clearTimeout(timeoutId);
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const errorText = await response.text();
|
|
69
|
+
throw new ApiError(`HTTP ${response.status}: ${errorText}`);
|
|
70
|
+
}
|
|
71
|
+
return await response.json();
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
clearTimeout(timeoutId);
|
|
75
|
+
if (error instanceof ApiError) {
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
if (error instanceof Error) {
|
|
79
|
+
if (error.name === 'AbortError') {
|
|
80
|
+
throw new ApiError(`Request timeout after ${apiConfig.timeout}ms when calling ${url}`);
|
|
81
|
+
}
|
|
82
|
+
if (error.message.includes('fetch failed')) {
|
|
83
|
+
const causeInfo = error.cause ? ` | Cause: ${error.cause}` : '';
|
|
84
|
+
throw new ApiError(`Network error: Failed to connect to ${url}. ` +
|
|
85
|
+
`Original error: ${error.message}${causeInfo}`);
|
|
86
|
+
}
|
|
87
|
+
throw new ApiError(`Network error: ${error.message}`);
|
|
88
|
+
}
|
|
89
|
+
throw new ApiError(`Network error: ${String(error)}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* OpenAI API chat completions service instance
|
|
95
|
+
*/
|
|
96
|
+
export const chatService = new ChatService();
|
|
97
|
+
//# sourceMappingURL=chat-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-service.js","sourceRoot":"","sources":["../../src/core/chat-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment configuration interface
|
|
3
|
+
*/
|
|
4
|
+
interface EnvironmentConfig {
|
|
5
|
+
OPENAI_API_KEY: string;
|
|
6
|
+
OPENAI_BASE_URL: string;
|
|
7
|
+
OPENAI_VISION_MODEL: string;
|
|
8
|
+
OPENAI_MODEL_TEMPERATURE: number;
|
|
9
|
+
OPENAI_MODEL_TOP_P: number;
|
|
10
|
+
OPENAI_MODEL_MAX_TOKENS: number;
|
|
11
|
+
OPENAI_TIMEOUT: number;
|
|
12
|
+
OPENAI_RETRY_COUNT: number;
|
|
13
|
+
SERVER_NAME: string;
|
|
14
|
+
SERVER_VERSION: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Vision configuration interface
|
|
18
|
+
*/
|
|
19
|
+
interface VisionConfig {
|
|
20
|
+
model: string;
|
|
21
|
+
timeout: number;
|
|
22
|
+
retryCount: number;
|
|
23
|
+
url: string;
|
|
24
|
+
temperature: number;
|
|
25
|
+
topP: number;
|
|
26
|
+
maxTokens: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Server configuration interface
|
|
30
|
+
*/
|
|
31
|
+
interface ServerConfig {
|
|
32
|
+
name: string;
|
|
33
|
+
version: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Environment configuration service using singleton pattern
|
|
37
|
+
*/
|
|
38
|
+
export declare class EnvironmentService {
|
|
39
|
+
private static instance;
|
|
40
|
+
private config;
|
|
41
|
+
private constructor();
|
|
42
|
+
/**
|
|
43
|
+
* Get singleton instance of EnvironmentService
|
|
44
|
+
*/
|
|
45
|
+
static getInstance(): EnvironmentService;
|
|
46
|
+
/**
|
|
47
|
+
* Get environment configuration
|
|
48
|
+
*/
|
|
49
|
+
getConfig(): EnvironmentConfig;
|
|
50
|
+
/**
|
|
51
|
+
* Load environment configuration from process.env
|
|
52
|
+
*/
|
|
53
|
+
private loadEnvironmentConfig;
|
|
54
|
+
/**
|
|
55
|
+
* Get server configuration
|
|
56
|
+
*/
|
|
57
|
+
getServerConfig(): ServerConfig;
|
|
58
|
+
/**
|
|
59
|
+
* Get API configuration for vision analysis
|
|
60
|
+
*/
|
|
61
|
+
getVisionConfig(): VisionConfig;
|
|
62
|
+
/**
|
|
63
|
+
* Get OpenAI API key from configuration
|
|
64
|
+
*/
|
|
65
|
+
getApiKey(): string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Global environment service instance
|
|
69
|
+
*/
|
|
70
|
+
export declare const environmentService: EnvironmentService;
|
|
71
|
+
/**
|
|
72
|
+
* Configuration service instance (for backward compatibility)
|
|
73
|
+
*/
|
|
74
|
+
export declare const configurationService: EnvironmentService;
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/core/environment.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,UAAU,iBAAiB;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,wBAAwB,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,MAAM,CAAkC;IAEhD,OAAO;IAEP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAOxC;;OAEG;IACH,SAAS,IAAI,iBAAiB;IAO9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2F7B;;OAEG;IACH,eAAe,IAAI,YAAY;IAQ/B;;OAEG;IACH,eAAe,IAAI,YAAY;IAqB/B;;OAEG;IACH,SAAS,IAAI,MAAM;CAGpB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,oBAAmC,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,oBAAoB,oBAAqB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { ApiError } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Environment configuration service using singleton pattern
|
|
4
|
+
*/
|
|
5
|
+
export class EnvironmentService {
|
|
6
|
+
static instance;
|
|
7
|
+
config = null;
|
|
8
|
+
constructor() { }
|
|
9
|
+
/**
|
|
10
|
+
* Get singleton instance of EnvironmentService
|
|
11
|
+
*/
|
|
12
|
+
static getInstance() {
|
|
13
|
+
if (!EnvironmentService.instance) {
|
|
14
|
+
EnvironmentService.instance = new EnvironmentService();
|
|
15
|
+
}
|
|
16
|
+
return EnvironmentService.instance;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get environment configuration
|
|
20
|
+
*/
|
|
21
|
+
getConfig() {
|
|
22
|
+
if (!this.config) {
|
|
23
|
+
this.config = this.loadEnvironmentConfig();
|
|
24
|
+
}
|
|
25
|
+
return this.config;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Load environment configuration from process.env
|
|
29
|
+
*/
|
|
30
|
+
loadEnvironmentConfig() {
|
|
31
|
+
const envConfig = { ...process.env };
|
|
32
|
+
// Support both VISION_MCP_* and OPENAI_* environment variable prefixes
|
|
33
|
+
// VISION_MCP_* takes precedence
|
|
34
|
+
const apiKey = envConfig.VISION_MCP_API_KEY ||
|
|
35
|
+
envConfig.OPENAI_API_KEY ||
|
|
36
|
+
'';
|
|
37
|
+
// Validate required API Key
|
|
38
|
+
if (!apiKey || apiKey.trim().length === 0) {
|
|
39
|
+
throw new ApiError('VISION_MCP_API_KEY or OPENAI_API_KEY environment variable is required');
|
|
40
|
+
}
|
|
41
|
+
// Detect placeholder API keys
|
|
42
|
+
if (apiKey.toLowerCase().includes('your_') ||
|
|
43
|
+
apiKey.toLowerCase().includes('api_key') ||
|
|
44
|
+
apiKey.toLowerCase().includes('sk-your-openai-api-key')) {
|
|
45
|
+
throw new ApiError('API key appears to be a placeholder. Please set your actual API key.');
|
|
46
|
+
}
|
|
47
|
+
const baseUrl = envConfig.VISION_MCP_API_URL ||
|
|
48
|
+
envConfig.OPENAI_BASE_URL ||
|
|
49
|
+
'https://api.openai.com/v1';
|
|
50
|
+
const model = envConfig.VISION_MCP_MODEL ||
|
|
51
|
+
envConfig.OPENAI_VISION_MODEL ||
|
|
52
|
+
'gpt-4o';
|
|
53
|
+
const temperature = parseFloat(envConfig.VISION_MCP_TEMPERATURE ||
|
|
54
|
+
envConfig.OPENAI_MODEL_TEMPERATURE ||
|
|
55
|
+
'0.7');
|
|
56
|
+
const topP = parseFloat(envConfig.VISION_MCP_TOP_P ||
|
|
57
|
+
envConfig.OPENAI_MODEL_TOP_P ||
|
|
58
|
+
'1.0');
|
|
59
|
+
const maxTokens = parseInt(envConfig.VISION_MCP_MAX_TOKENS ||
|
|
60
|
+
envConfig.OPENAI_MODEL_MAX_TOKENS ||
|
|
61
|
+
'2048');
|
|
62
|
+
const timeout = parseInt(envConfig.VISION_MCP_TIMEOUT ||
|
|
63
|
+
envConfig.OPENAI_TIMEOUT ||
|
|
64
|
+
'60000');
|
|
65
|
+
const retryCount = parseInt(envConfig.OPENAI_RETRY_COUNT ||
|
|
66
|
+
'1');
|
|
67
|
+
const serverName = envConfig.VISION_MCP_SERVER_NAME ||
|
|
68
|
+
envConfig.SERVER_NAME ||
|
|
69
|
+
'vision-mcp-server';
|
|
70
|
+
const serverVersion = envConfig.VISION_MCP_SERVER_VERSION ||
|
|
71
|
+
envConfig.SERVER_VERSION ||
|
|
72
|
+
'0.1.0';
|
|
73
|
+
return {
|
|
74
|
+
OPENAI_API_KEY: apiKey,
|
|
75
|
+
OPENAI_BASE_URL: baseUrl,
|
|
76
|
+
OPENAI_VISION_MODEL: model,
|
|
77
|
+
OPENAI_MODEL_TEMPERATURE: temperature,
|
|
78
|
+
OPENAI_MODEL_TOP_P: topP,
|
|
79
|
+
OPENAI_MODEL_MAX_TOKENS: maxTokens,
|
|
80
|
+
OPENAI_TIMEOUT: timeout,
|
|
81
|
+
OPENAI_RETRY_COUNT: retryCount,
|
|
82
|
+
SERVER_NAME: serverName,
|
|
83
|
+
SERVER_VERSION: serverVersion
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get server configuration
|
|
88
|
+
*/
|
|
89
|
+
getServerConfig() {
|
|
90
|
+
const config = this.getConfig();
|
|
91
|
+
return {
|
|
92
|
+
name: config.SERVER_NAME,
|
|
93
|
+
version: config.SERVER_VERSION
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get API configuration for vision analysis
|
|
98
|
+
*/
|
|
99
|
+
getVisionConfig() {
|
|
100
|
+
const config = this.getConfig();
|
|
101
|
+
const baseUrl = config.OPENAI_BASE_URL;
|
|
102
|
+
// Check if the base URL already includes /chat/completions
|
|
103
|
+
// If so, use it directly; otherwise, append it
|
|
104
|
+
const url = baseUrl.includes('/chat/completions')
|
|
105
|
+
? baseUrl
|
|
106
|
+
: `${baseUrl}/chat/completions`;
|
|
107
|
+
return {
|
|
108
|
+
model: config.OPENAI_VISION_MODEL,
|
|
109
|
+
timeout: config.OPENAI_TIMEOUT,
|
|
110
|
+
retryCount: config.OPENAI_RETRY_COUNT,
|
|
111
|
+
url,
|
|
112
|
+
temperature: config.OPENAI_MODEL_TEMPERATURE,
|
|
113
|
+
topP: config.OPENAI_MODEL_TOP_P,
|
|
114
|
+
maxTokens: config.OPENAI_MODEL_MAX_TOKENS
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get OpenAI API key from configuration
|
|
119
|
+
*/
|
|
120
|
+
getApiKey() {
|
|
121
|
+
return this.getConfig().OPENAI_API_KEY;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Global environment service instance
|
|
126
|
+
*/
|
|
127
|
+
export const environmentService = EnvironmentService.getInstance();
|
|
128
|
+
/**
|
|
129
|
+
* Configuration service instance (for backward compatibility)
|
|
130
|
+
*/
|
|
131
|
+
export const configurationService = environmentService;
|
|
132
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/core/environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error severity levels
|
|
3
|
+
*/
|
|
4
|
+
export declare enum ErrorSeverity {
|
|
5
|
+
LOW = "low",
|
|
6
|
+
MEDIUM = "medium",
|
|
7
|
+
HIGH = "high",
|
|
8
|
+
CRITICAL = "critical"
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Error categories
|
|
12
|
+
*/
|
|
13
|
+
export declare enum ErrorCategory {
|
|
14
|
+
VALIDATION = "validation",
|
|
15
|
+
AUTHENTICATION = "authentication",
|
|
16
|
+
AUTHORIZATION = "authorization",
|
|
17
|
+
NETWORK = "network",
|
|
18
|
+
API = "api",
|
|
19
|
+
SYSTEM = "system",
|
|
20
|
+
BUSINESS = "business",
|
|
21
|
+
UNKNOWN = "unknown"
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Error context interface
|
|
25
|
+
*/
|
|
26
|
+
export interface ErrorContext {
|
|
27
|
+
timestamp: number;
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Base error class
|
|
32
|
+
*/
|
|
33
|
+
export declare class BaseError extends Error {
|
|
34
|
+
readonly code: string;
|
|
35
|
+
readonly severity: ErrorSeverity;
|
|
36
|
+
readonly category: ErrorCategory;
|
|
37
|
+
readonly context: ErrorContext;
|
|
38
|
+
readonly cause?: Error;
|
|
39
|
+
readonly recoverable: boolean;
|
|
40
|
+
constructor(message: string, code: string, severity: ErrorSeverity, category: ErrorCategory, context?: Partial<ErrorContext>, cause?: Error, recoverable?: boolean);
|
|
41
|
+
/**
|
|
42
|
+
* Convert to JSON format
|
|
43
|
+
*/
|
|
44
|
+
toJSON(): Record<string, unknown>;
|
|
45
|
+
/**
|
|
46
|
+
* Get user-friendly error message
|
|
47
|
+
*/
|
|
48
|
+
getUserMessage(): string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Business logic error
|
|
52
|
+
*/
|
|
53
|
+
export declare class BusinessError extends BaseError {
|
|
54
|
+
constructor(message: string, code?: string, context?: Partial<ErrorContext>, cause?: Error);
|
|
55
|
+
getUserMessage(): string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* System error
|
|
59
|
+
*/
|
|
60
|
+
export declare class SystemError extends BaseError {
|
|
61
|
+
constructor(message: string, code?: string, context?: Partial<ErrorContext>, cause?: Error);
|
|
62
|
+
getUserMessage(): string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Network error
|
|
66
|
+
*/
|
|
67
|
+
export declare class NetworkError extends BaseError {
|
|
68
|
+
constructor(message: string, code?: string, context?: Partial<ErrorContext>, cause?: Error);
|
|
69
|
+
getUserMessage(): string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Authentication error
|
|
73
|
+
*/
|
|
74
|
+
export declare class AuthenticationError extends BaseError {
|
|
75
|
+
constructor(message: string, code?: string, context?: Partial<ErrorContext>, cause?: Error);
|
|
76
|
+
getUserMessage(): string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Authorization error
|
|
80
|
+
*/
|
|
81
|
+
export declare class AuthorizationError extends BaseError {
|
|
82
|
+
constructor(message: string, code?: string, context?: Partial<ErrorContext>, cause?: Error);
|
|
83
|
+
getUserMessage(): string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Tool execution error
|
|
87
|
+
*/
|
|
88
|
+
export declare class ToolExecutionError extends BaseError {
|
|
89
|
+
readonly toolName: string;
|
|
90
|
+
constructor(message: string, toolName: string, code?: string, context?: Partial<ErrorContext>, cause?: Error);
|
|
91
|
+
getUserMessage(): string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Error handling strategy interface
|
|
95
|
+
*/
|
|
96
|
+
interface ErrorHandlingStrategy {
|
|
97
|
+
canHandle(error: Error | BaseError): boolean;
|
|
98
|
+
handle(error: Error | BaseError, context: ErrorContext): Promise<BaseError>;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Unified error handler
|
|
102
|
+
*/
|
|
103
|
+
export declare class ErrorHandler {
|
|
104
|
+
private strategies;
|
|
105
|
+
constructor();
|
|
106
|
+
/**
|
|
107
|
+
* Add error handling strategy
|
|
108
|
+
*/
|
|
109
|
+
addStrategy(strategy: ErrorHandlingStrategy): void;
|
|
110
|
+
/**
|
|
111
|
+
* Handle error
|
|
112
|
+
*/
|
|
113
|
+
handleError(error: Error | BaseError, context?: Partial<ErrorContext>): Promise<BaseError>;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Global error handler instance
|
|
117
|
+
*/
|
|
118
|
+
export declare const errorHandler: ErrorHandler;
|
|
119
|
+
/**
|
|
120
|
+
* Convenience function to handle errors
|
|
121
|
+
*/
|
|
122
|
+
export declare function handleError(error: Error | BaseError, context?: Partial<ErrorContext>): Promise<BaseError>;
|
|
123
|
+
export {};
|
|
124
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/core/error-handler.ts"],"names":[],"mappings":"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"}
|