gthinking 1.3.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +34 -0
- package/ANALYSIS_SUMMARY.md +363 -0
- package/README.md +230 -250
- package/dist/analysis/analysis-engine.d.ts +63 -0
- package/dist/analysis/analysis-engine.d.ts.map +1 -0
- package/dist/analysis/analysis-engine.js +322 -0
- package/dist/analysis/analysis-engine.js.map +1 -0
- package/dist/core/config.d.ts +1419 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +361 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/engine.d.ts +176 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +604 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/errors.d.ts +153 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +287 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/{types.js → core/index.js} +8 -4
- package/dist/core/index.js.map +1 -0
- package/dist/core/pipeline.d.ts +121 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +289 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +58 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +133 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/dist/core/session-manager.d.ts +96 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +223 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/creativity/creativity-engine.d.ts +6 -0
- package/dist/creativity/creativity-engine.d.ts.map +1 -0
- package/dist/creativity/creativity-engine.js +17 -0
- package/dist/creativity/creativity-engine.js.map +1 -0
- package/dist/index.d.ts +24 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +130 -104
- package/dist/index.js.map +1 -1
- package/dist/learning/learning-engine.d.ts +6 -0
- package/dist/learning/learning-engine.d.ts.map +1 -0
- package/dist/learning/learning-engine.js +17 -0
- package/dist/learning/learning-engine.js.map +1 -0
- package/dist/llm/index.d.ts +10 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +26 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/llm-service.d.ts +109 -0
- package/dist/llm/llm-service.d.ts.map +1 -0
- package/dist/llm/llm-service.js +224 -0
- package/dist/llm/llm-service.js.map +1 -0
- package/dist/llm/providers/base.d.ts +85 -0
- package/dist/llm/providers/base.d.ts.map +1 -0
- package/dist/llm/providers/base.js +57 -0
- package/dist/llm/providers/base.js.map +1 -0
- package/dist/llm/providers/cli.d.ts +23 -0
- package/dist/llm/providers/cli.d.ts.map +1 -0
- package/dist/llm/providers/cli.js +158 -0
- package/dist/llm/providers/cli.js.map +1 -0
- package/dist/llm/providers/gemini.d.ts +30 -0
- package/dist/llm/providers/gemini.d.ts.map +1 -0
- package/dist/llm/providers/gemini.js +168 -0
- package/dist/llm/providers/gemini.js.map +1 -0
- package/dist/llm/sanitization.d.ts +50 -0
- package/dist/llm/sanitization.d.ts.map +1 -0
- package/dist/llm/sanitization.js +149 -0
- package/dist/llm/sanitization.js.map +1 -0
- package/dist/{server.d.ts.map → mcp/server.d.ts.map} +1 -1
- package/dist/mcp/server.js +108 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/planning/planning-engine.d.ts +6 -0
- package/dist/planning/planning-engine.d.ts.map +1 -0
- package/dist/planning/planning-engine.js +17 -0
- package/dist/planning/planning-engine.js.map +1 -0
- package/dist/reasoning/reasoning-engine.d.ts +6 -0
- package/dist/reasoning/reasoning-engine.d.ts.map +1 -0
- package/dist/reasoning/reasoning-engine.js +17 -0
- package/dist/reasoning/reasoning-engine.js.map +1 -0
- package/dist/search/search-engine.d.ts +99 -0
- package/dist/search/search-engine.d.ts.map +1 -0
- package/dist/search/search-engine.js +271 -0
- package/dist/search/search-engine.js.map +1 -0
- package/dist/synthesis/synthesis-engine.d.ts +6 -0
- package/dist/synthesis/synthesis-engine.d.ts.map +1 -0
- package/dist/synthesis/synthesis-engine.js +17 -0
- package/dist/synthesis/synthesis-engine.js.map +1 -0
- package/dist/types/analysis.d.ts +1534 -49
- package/dist/types/analysis.d.ts.map +1 -1
- package/dist/types/analysis.js +250 -0
- package/dist/types/analysis.js.map +1 -1
- package/dist/types/core.d.ts +257 -30
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/core.js +148 -18
- package/dist/types/core.js.map +1 -1
- package/dist/types/creativity.d.ts +2871 -56
- package/dist/types/creativity.d.ts.map +1 -1
- package/dist/types/creativity.js +195 -0
- package/dist/types/creativity.js.map +1 -1
- package/dist/types/index.d.ts +6 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +17 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/learning.d.ts +851 -61
- package/dist/types/learning.d.ts.map +1 -1
- package/dist/types/learning.js +155 -0
- package/dist/types/learning.js.map +1 -1
- package/dist/types/planning.d.ts +2223 -71
- package/dist/types/planning.d.ts.map +1 -1
- package/dist/types/planning.js +190 -0
- package/dist/types/planning.js.map +1 -1
- package/dist/types/reasoning.d.ts +2209 -72
- package/dist/types/reasoning.d.ts.map +1 -1
- package/dist/types/reasoning.js +200 -1
- package/dist/types/reasoning.js.map +1 -1
- package/dist/types/search.d.ts +981 -53
- package/dist/types/search.d.ts.map +1 -1
- package/dist/types/search.js +137 -0
- package/dist/types/search.js.map +1 -1
- package/dist/types/synthesis.d.ts +583 -38
- package/dist/types/synthesis.d.ts.map +1 -1
- package/dist/types/synthesis.js +138 -0
- package/dist/types/synthesis.js.map +1 -1
- package/dist/utils/cache.d.ts +144 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +288 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/id-generator.d.ts +89 -0
- package/dist/utils/id-generator.d.ts.map +1 -0
- package/dist/utils/id-generator.js +132 -0
- package/dist/utils/id-generator.js.map +1 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +33 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +142 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +248 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/metrics.d.ts +149 -0
- package/dist/utils/metrics.d.ts.map +1 -0
- package/dist/utils/metrics.js +296 -0
- package/dist/utils/metrics.js.map +1 -0
- package/dist/utils/timer.d.ts +7 -0
- package/dist/utils/timer.d.ts.map +1 -0
- package/dist/utils/timer.js +17 -0
- package/dist/utils/timer.js.map +1 -0
- package/dist/utils/validation.d.ts +147 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +275 -0
- package/dist/utils/validation.js.map +1 -0
- package/docs/API.md +411 -0
- package/docs/ARCHITECTURE.md +271 -0
- package/docs/CHANGELOG.md +283 -0
- package/jest.config.js +28 -0
- package/package.json +43 -30
- package/src/analysis/analysis-engine.ts +383 -0
- package/src/core/config.ts +406 -0
- package/src/core/engine.ts +785 -0
- package/src/core/errors.ts +349 -0
- package/src/core/index.ts +12 -0
- package/src/core/pipeline.ts +424 -0
- package/src/core/rate-limiter.ts +155 -0
- package/src/core/session-manager.ts +269 -0
- package/src/creativity/creativity-engine.ts +14 -0
- package/src/index.ts +178 -0
- package/src/learning/learning-engine.ts +14 -0
- package/src/llm/index.ts +10 -0
- package/src/llm/llm-service.ts +285 -0
- package/src/llm/providers/base.ts +146 -0
- package/src/llm/providers/cli.ts +186 -0
- package/src/llm/providers/gemini.ts +201 -0
- package/src/llm/sanitization.ts +178 -0
- package/src/mcp/server.ts +117 -0
- package/src/planning/planning-engine.ts +14 -0
- package/src/reasoning/reasoning-engine.ts +14 -0
- package/src/search/search-engine.ts +333 -0
- package/src/synthesis/synthesis-engine.ts +14 -0
- package/src/types/analysis.ts +337 -0
- package/src/types/core.ts +342 -0
- package/src/types/creativity.ts +268 -0
- package/src/types/index.ts +31 -0
- package/src/types/learning.ts +215 -0
- package/src/types/planning.ts +251 -0
- package/src/types/reasoning.ts +288 -0
- package/src/types/search.ts +192 -0
- package/src/types/synthesis.ts +187 -0
- package/src/utils/cache.ts +363 -0
- package/src/utils/id-generator.ts +135 -0
- package/src/utils/index.ts +22 -0
- package/src/utils/logger.ts +290 -0
- package/src/utils/metrics.ts +380 -0
- package/src/utils/timer.ts +15 -0
- package/src/utils/validation.ts +297 -0
- package/tests/setup.ts +22 -0
- package/tests/unit/cache.test.ts +189 -0
- package/tests/unit/engine.test.ts +179 -0
- package/tests/unit/validation.test.ts +218 -0
- package/tsconfig.json +17 -12
- package/GEMINI.md +0 -68
- package/analysis.ts +0 -1063
- package/creativity.ts +0 -1055
- package/dist/analysis.d.ts +0 -54
- package/dist/analysis.d.ts.map +0 -1
- package/dist/analysis.js +0 -866
- package/dist/analysis.js.map +0 -1
- package/dist/creativity.d.ts +0 -81
- package/dist/creativity.d.ts.map +0 -1
- package/dist/creativity.js +0 -828
- package/dist/creativity.js.map +0 -1
- package/dist/engine.d.ts +0 -90
- package/dist/engine.d.ts.map +0 -1
- package/dist/engine.js +0 -720
- package/dist/engine.js.map +0 -1
- package/dist/examples.d.ts +0 -7
- package/dist/examples.d.ts.map +0 -1
- package/dist/examples.js +0 -506
- package/dist/examples.js.map +0 -1
- package/dist/learning.d.ts +0 -72
- package/dist/learning.d.ts.map +0 -1
- package/dist/learning.js +0 -615
- package/dist/learning.js.map +0 -1
- package/dist/llm-service.d.ts +0 -21
- package/dist/llm-service.d.ts.map +0 -1
- package/dist/llm-service.js +0 -100
- package/dist/llm-service.js.map +0 -1
- package/dist/planning.d.ts +0 -62
- package/dist/planning.d.ts.map +0 -1
- package/dist/planning.js +0 -886
- package/dist/planning.js.map +0 -1
- package/dist/reasoning.d.ts +0 -73
- package/dist/reasoning.d.ts.map +0 -1
- package/dist/reasoning.js +0 -845
- package/dist/reasoning.js.map +0 -1
- package/dist/search-discovery.d.ts +0 -73
- package/dist/search-discovery.d.ts.map +0 -1
- package/dist/search-discovery.js +0 -548
- package/dist/search-discovery.js.map +0 -1
- package/dist/server.js +0 -113
- package/dist/server.js.map +0 -1
- package/dist/types/engine.d.ts +0 -55
- package/dist/types/engine.d.ts.map +0 -1
- package/dist/types/engine.js +0 -3
- package/dist/types/engine.js.map +0 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/engine.ts +0 -1009
- package/examples.ts +0 -717
- package/index.ts +0 -106
- package/learning.ts +0 -779
- package/llm-service.ts +0 -120
- package/planning.ts +0 -1101
- package/reasoning.ts +0 -1079
- package/search-discovery.ts +0 -700
- package/server.ts +0 -115
- package/types/analysis.ts +0 -69
- package/types/core.ts +0 -90
- package/types/creativity.ts +0 -72
- package/types/engine.ts +0 -60
- package/types/index.ts +0 -9
- package/types/learning.ts +0 -69
- package/types/planning.ts +0 -85
- package/types/reasoning.ts +0 -92
- package/types/search.ts +0 -58
- package/types/synthesis.ts +0 -43
- package/types.ts +0 -6
- /package/dist/{server.d.ts → mcp/server.d.ts} +0 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Error Classes for gthinking v2.0.0
|
|
3
|
+
* Comprehensive error handling
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ThinkingStage } from '../types';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Base error class for all gthinking errors
|
|
10
|
+
*/
|
|
11
|
+
export class GThinkingError extends Error {
|
|
12
|
+
public readonly code: string;
|
|
13
|
+
public readonly timestamp: Date;
|
|
14
|
+
public readonly details: Record<string, unknown>;
|
|
15
|
+
|
|
16
|
+
constructor(
|
|
17
|
+
message: string,
|
|
18
|
+
code: string,
|
|
19
|
+
details: Record<string, unknown> = {}
|
|
20
|
+
) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = 'GThinkingError';
|
|
23
|
+
this.code = code;
|
|
24
|
+
this.timestamp = new Date();
|
|
25
|
+
this.details = details;
|
|
26
|
+
Error.captureStackTrace(this, this.constructor);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
toJSON(): Record<string, unknown> {
|
|
30
|
+
return {
|
|
31
|
+
name: this.name,
|
|
32
|
+
message: this.message,
|
|
33
|
+
code: this.code,
|
|
34
|
+
timestamp: this.timestamp,
|
|
35
|
+
details: this.details,
|
|
36
|
+
stack: this.stack,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Validation error for invalid input
|
|
43
|
+
*/
|
|
44
|
+
export class ValidationError extends GThinkingError {
|
|
45
|
+
constructor(message: string, details: Record<string, unknown> = {}) {
|
|
46
|
+
super(message, 'VALIDATION_ERROR', details);
|
|
47
|
+
this.name = 'ValidationError';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Timeout error for operations that exceed time limit
|
|
53
|
+
*/
|
|
54
|
+
export class TimeoutError extends GThinkingError {
|
|
55
|
+
public readonly stage?: ThinkingStage;
|
|
56
|
+
|
|
57
|
+
constructor(message: string, stage?: ThinkingStage) {
|
|
58
|
+
super(message, 'TIMEOUT_ERROR', { stage });
|
|
59
|
+
this.name = 'TimeoutError';
|
|
60
|
+
this.stage = stage;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Cache error for caching operations
|
|
66
|
+
*/
|
|
67
|
+
export class CacheError extends GThinkingError {
|
|
68
|
+
constructor(message: string, details: Record<string, unknown> = {}) {
|
|
69
|
+
super(message, 'CACHE_ERROR', details);
|
|
70
|
+
this.name = 'CacheError';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Stage error for thinking stage failures
|
|
76
|
+
*/
|
|
77
|
+
export class StageError extends GThinkingError {
|
|
78
|
+
public readonly stage: ThinkingStage;
|
|
79
|
+
public readonly retryable: boolean;
|
|
80
|
+
|
|
81
|
+
constructor(
|
|
82
|
+
message: string,
|
|
83
|
+
stage: ThinkingStage,
|
|
84
|
+
retryable = false,
|
|
85
|
+
details: Record<string, unknown> = {}
|
|
86
|
+
) {
|
|
87
|
+
super(message, 'STAGE_ERROR', { stage, retryable, ...details });
|
|
88
|
+
this.name = 'StageError';
|
|
89
|
+
this.stage = stage;
|
|
90
|
+
this.retryable = retryable;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* LLM error for LLM service failures
|
|
96
|
+
*/
|
|
97
|
+
export class LLMError extends GThinkingError {
|
|
98
|
+
public readonly provider: string;
|
|
99
|
+
public readonly statusCode?: number;
|
|
100
|
+
|
|
101
|
+
constructor(
|
|
102
|
+
message: string,
|
|
103
|
+
provider: string,
|
|
104
|
+
statusCode?: number,
|
|
105
|
+
details: Record<string, unknown> = {}
|
|
106
|
+
) {
|
|
107
|
+
super(message, 'LLM_ERROR', { provider, statusCode, ...details });
|
|
108
|
+
this.name = 'LLMError';
|
|
109
|
+
this.provider = provider;
|
|
110
|
+
this.statusCode = statusCode;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Search error for search operation failures
|
|
116
|
+
*/
|
|
117
|
+
export class SearchError extends GThinkingError {
|
|
118
|
+
public readonly provider: string;
|
|
119
|
+
|
|
120
|
+
constructor(
|
|
121
|
+
message: string,
|
|
122
|
+
provider: string,
|
|
123
|
+
details: Record<string, unknown> = {}
|
|
124
|
+
) {
|
|
125
|
+
super(message, 'SEARCH_ERROR', { provider, ...details });
|
|
126
|
+
this.name = 'SearchError';
|
|
127
|
+
this.provider = provider;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Configuration error for invalid configuration
|
|
133
|
+
*/
|
|
134
|
+
export class ConfigurationError extends GThinkingError {
|
|
135
|
+
constructor(message: string, details: Record<string, unknown> = {}) {
|
|
136
|
+
super(message, 'CONFIGURATION_ERROR', details);
|
|
137
|
+
this.name = 'ConfigurationError';
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Security error for security-related issues
|
|
143
|
+
*/
|
|
144
|
+
export class SecurityError extends GThinkingError {
|
|
145
|
+
constructor(message: string, details: Record<string, unknown> = {}) {
|
|
146
|
+
super(message, 'SECURITY_ERROR', details);
|
|
147
|
+
this.name = 'SecurityError';
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Rate limit error for rate limiting
|
|
153
|
+
*/
|
|
154
|
+
export class RateLimitError extends GThinkingError {
|
|
155
|
+
public readonly retryAfter: number;
|
|
156
|
+
|
|
157
|
+
constructor(message: string, retryAfter: number) {
|
|
158
|
+
super(message, 'RATE_LIMIT_ERROR', { retryAfter });
|
|
159
|
+
this.name = 'RateLimitError';
|
|
160
|
+
this.retryAfter = retryAfter;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Error codes enum
|
|
166
|
+
*/
|
|
167
|
+
export enum ErrorCode {
|
|
168
|
+
VALIDATION_ERROR = 'VALIDATION_ERROR',
|
|
169
|
+
TIMEOUT_ERROR = 'TIMEOUT_ERROR',
|
|
170
|
+
CACHE_ERROR = 'CACHE_ERROR',
|
|
171
|
+
STAGE_ERROR = 'STAGE_ERROR',
|
|
172
|
+
LLM_ERROR = 'LLM_ERROR',
|
|
173
|
+
SEARCH_ERROR = 'SEARCH_ERROR',
|
|
174
|
+
CONFIGURATION_ERROR = 'CONFIGURATION_ERROR',
|
|
175
|
+
SECURITY_ERROR = 'SECURITY_ERROR',
|
|
176
|
+
RATE_LIMIT_ERROR = 'RATE_LIMIT_ERROR',
|
|
177
|
+
UNKNOWN_ERROR = 'UNKNOWN_ERROR',
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Error handler function type
|
|
182
|
+
*/
|
|
183
|
+
export type ErrorHandler = (error: Error) => void | Promise<void>;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Global error handler registry
|
|
187
|
+
*/
|
|
188
|
+
class ErrorHandlerRegistry {
|
|
189
|
+
private handlers: Map<string, ErrorHandler[]> = new Map();
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Register an error handler
|
|
193
|
+
* @param errorCode - The error code to handle
|
|
194
|
+
* @param handler - The error handler function
|
|
195
|
+
*/
|
|
196
|
+
public register(errorCode: string, handler: ErrorHandler): void {
|
|
197
|
+
if (!this.handlers.has(errorCode)) {
|
|
198
|
+
this.handlers.set(errorCode, []);
|
|
199
|
+
}
|
|
200
|
+
this.handlers.get(errorCode)!.push(handler);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Unregister an error handler
|
|
205
|
+
* @param errorCode - The error code
|
|
206
|
+
* @param handler - The handler to remove
|
|
207
|
+
*/
|
|
208
|
+
public unregister(errorCode: string, handler: ErrorHandler): void {
|
|
209
|
+
const handlers = this.handlers.get(errorCode);
|
|
210
|
+
if (handlers) {
|
|
211
|
+
const index = handlers.indexOf(handler);
|
|
212
|
+
if (index > -1) {
|
|
213
|
+
handlers.splice(index, 1);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Handle an error
|
|
220
|
+
* @param error - The error to handle
|
|
221
|
+
*/
|
|
222
|
+
public async handle(error: Error): Promise<void> {
|
|
223
|
+
const gError = error as GThinkingError;
|
|
224
|
+
const errorCode = gError.code || ErrorCode.UNKNOWN_ERROR;
|
|
225
|
+
|
|
226
|
+
const handlers = this.handlers.get(errorCode) || [];
|
|
227
|
+
|
|
228
|
+
for (const handler of handlers) {
|
|
229
|
+
try {
|
|
230
|
+
await handler(error);
|
|
231
|
+
} catch (handlerError) {
|
|
232
|
+
console.error('Error handler failed:', handlerError);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Clear all handlers
|
|
239
|
+
*/
|
|
240
|
+
public clear(): void {
|
|
241
|
+
this.handlers.clear();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Export singleton instance
|
|
246
|
+
export const errorHandlerRegistry = new ErrorHandlerRegistry();
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Retry configuration interface
|
|
250
|
+
*/
|
|
251
|
+
export interface RetryConfig {
|
|
252
|
+
maxRetries: number;
|
|
253
|
+
retryDelay: number;
|
|
254
|
+
backoffMultiplier: number;
|
|
255
|
+
maxDelay: number;
|
|
256
|
+
retryableErrors: string[];
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Default retry configuration
|
|
261
|
+
*/
|
|
262
|
+
export const defaultRetryConfig: RetryConfig = {
|
|
263
|
+
maxRetries: 3,
|
|
264
|
+
retryDelay: 1000,
|
|
265
|
+
backoffMultiplier: 2,
|
|
266
|
+
maxDelay: 30000,
|
|
267
|
+
retryableErrors: [
|
|
268
|
+
ErrorCode.TIMEOUT_ERROR,
|
|
269
|
+
ErrorCode.LLM_ERROR,
|
|
270
|
+
ErrorCode.SEARCH_ERROR,
|
|
271
|
+
ErrorCode.CACHE_ERROR,
|
|
272
|
+
],
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Retry a function with exponential backoff
|
|
277
|
+
* @param fn - The function to retry
|
|
278
|
+
* @param config - Retry configuration
|
|
279
|
+
* @returns Function result
|
|
280
|
+
*/
|
|
281
|
+
export async function withRetry<T>(
|
|
282
|
+
fn: () => Promise<T>,
|
|
283
|
+
config: Partial<RetryConfig> = {}
|
|
284
|
+
): Promise<T> {
|
|
285
|
+
const mergedConfig = { ...defaultRetryConfig, ...config };
|
|
286
|
+
let lastError: Error | undefined;
|
|
287
|
+
|
|
288
|
+
for (let attempt = 0; attempt <= mergedConfig.maxRetries; attempt++) {
|
|
289
|
+
try {
|
|
290
|
+
return await fn();
|
|
291
|
+
} catch (error) {
|
|
292
|
+
lastError = error as Error;
|
|
293
|
+
const gError = error as GThinkingError;
|
|
294
|
+
|
|
295
|
+
// Check if error is retryable
|
|
296
|
+
if (!mergedConfig.retryableErrors.includes(gError.code)) {
|
|
297
|
+
throw error;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Don't retry on last attempt
|
|
301
|
+
if (attempt === mergedConfig.maxRetries) {
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Calculate delay with exponential backoff
|
|
306
|
+
const delay = Math.min(
|
|
307
|
+
mergedConfig.retryDelay * Math.pow(mergedConfig.backoffMultiplier, attempt),
|
|
308
|
+
mergedConfig.maxDelay
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
throw lastError;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Wrap a function with error handling
|
|
320
|
+
* @param fn - The function to wrap
|
|
321
|
+
* @param errorHandler - Custom error handler
|
|
322
|
+
* @returns Wrapped function
|
|
323
|
+
*/
|
|
324
|
+
export function withErrorHandling<T extends (...args: unknown[]) => unknown>(
|
|
325
|
+
fn: T,
|
|
326
|
+
errorHandler?: (error: Error) => void
|
|
327
|
+
): T {
|
|
328
|
+
return function (...args: Parameters<T>): ReturnType<T> {
|
|
329
|
+
try {
|
|
330
|
+
const result = fn(...args);
|
|
331
|
+
|
|
332
|
+
if (result instanceof Promise) {
|
|
333
|
+
return result.catch(error => {
|
|
334
|
+
if (errorHandler) {
|
|
335
|
+
errorHandler(error as Error);
|
|
336
|
+
}
|
|
337
|
+
throw error;
|
|
338
|
+
}) as ReturnType<T>;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
return result as ReturnType<T>;
|
|
342
|
+
} catch (error) {
|
|
343
|
+
if (errorHandler) {
|
|
344
|
+
errorHandler(error as Error);
|
|
345
|
+
}
|
|
346
|
+
throw error;
|
|
347
|
+
}
|
|
348
|
+
} as T;
|
|
349
|
+
}
|