solver-sdk 8.1.0 → 8.2.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 (43) hide show
  1. package/README.md +84 -14
  2. package/dist/cjs/api/credits-api.js +31 -11
  3. package/dist/cjs/api/credits-api.js.map +1 -1
  4. package/dist/cjs/errors/sdk-errors.js +216 -0
  5. package/dist/cjs/errors/sdk-errors.js.map +1 -0
  6. package/dist/cjs/index.js +20 -3
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/types/index.js.map +1 -1
  9. package/dist/cjs/utils/error-mapper.js +149 -0
  10. package/dist/cjs/utils/error-mapper.js.map +1 -0
  11. package/dist/cjs/utils/http-client.js +9 -37
  12. package/dist/cjs/utils/http-client.js.map +1 -1
  13. package/dist/esm/api/credits-api.js +31 -11
  14. package/dist/esm/api/credits-api.js.map +1 -1
  15. package/dist/esm/errors/sdk-errors.js +198 -0
  16. package/dist/esm/errors/sdk-errors.js.map +1 -0
  17. package/dist/esm/index.js +4 -2
  18. package/dist/esm/index.js.map +1 -1
  19. package/dist/esm/types/index.js.map +1 -1
  20. package/dist/esm/utils/error-mapper.js +145 -0
  21. package/dist/esm/utils/error-mapper.js.map +1 -0
  22. package/dist/esm/utils/http-client.js +9 -37
  23. package/dist/esm/utils/http-client.js.map +1 -1
  24. package/dist/types/api/credits-api.d.ts +24 -4
  25. package/dist/types/api/credits-api.d.ts.map +1 -1
  26. package/dist/types/errors/sdk-errors.d.ts +156 -0
  27. package/dist/types/errors/sdk-errors.d.ts.map +1 -0
  28. package/dist/types/index.d.ts +2 -1
  29. package/dist/types/index.d.ts.map +1 -1
  30. package/dist/types/interfaces/http-client.d.ts +0 -9
  31. package/dist/types/interfaces/http-client.d.ts.map +1 -1
  32. package/dist/types/types/index.d.ts +1 -1
  33. package/dist/types/types/index.d.ts.map +1 -1
  34. package/dist/types/utils/error-mapper.d.ts +24 -0
  35. package/dist/types/utils/error-mapper.d.ts.map +1 -0
  36. package/dist/types/utils/http-client.d.ts.map +1 -1
  37. package/package.json +1 -1
  38. package/dist/cjs/errors/limit-errors.js +0 -80
  39. package/dist/cjs/errors/limit-errors.js.map +0 -1
  40. package/dist/esm/errors/limit-errors.js +0 -74
  41. package/dist/esm/errors/limit-errors.js.map +0 -1
  42. package/dist/types/errors/limit-errors.d.ts +0 -61
  43. package/dist/types/errors/limit-errors.d.ts.map +0 -1
package/README.md CHANGED
@@ -1,13 +1,23 @@
1
- # Code Solver SDK v8.1.0
1
+ # Code Solver SDK v8.2.0
2
2
 
3
3
  AI-powered code analysis SDK with WorkCoins billing system. 100% typed, production ready.
4
4
 
5
5
  ## Install
6
6
 
7
7
  ```bash
8
- npm install solver-sdk@8.1.0
8
+ npm install solver-sdk@8.2.0
9
9
  ```
10
10
 
11
+ ## ✨ What's New in v8.2.0
12
+
13
+ **Centralized Error Handling** - Full typed error system with 15+ error classes:
14
+ - 🎯 **Typed exceptions** instead of `null` returns
15
+ - 🔍 **TypeScript autocomplete** for all error types
16
+ - 🛡️ **Better debugging** with `requestId`, `timestamp`, `details`
17
+ - ✅ **Backward compatible** - existing code continues to work
18
+
19
+ See [Error Handling](#error-handling) section for details.
20
+
11
21
  ## Quick Start
12
22
 
13
23
  ```typescript
@@ -62,7 +72,9 @@ const sdk = await CodeSolverSDK.create({
62
72
  getAuthToken: async () => 'your-token'
63
73
  });
64
74
 
65
- // Production with token refresh
75
+ // Production with token refresh + error handling
76
+ import { AuthenticationError } from 'solver-sdk';
77
+
66
78
  const sdk = await CodeSolverSDK.create({
67
79
  baseURL: 'https://api.example.com',
68
80
  getAuthToken: async () => {
@@ -72,6 +84,16 @@ const sdk = await CodeSolverSDK.create({
72
84
  return getToken();
73
85
  }
74
86
  });
87
+
88
+ // All methods throw AuthenticationError on 401
89
+ try {
90
+ await sdk.user.getProfile();
91
+ } catch (error) {
92
+ if (error instanceof AuthenticationError) {
93
+ await refreshToken();
94
+ // retry
95
+ }
96
+ }
75
97
  ```
76
98
 
77
99
  ## WebSocket (Real-time)
@@ -95,26 +117,74 @@ sdk.projectSync.on('sync-completed', (data) => {
95
117
 
96
118
  ## Error Handling
97
119
 
98
- ### Auth Errors
120
+ **v8.2.0+** All SDK methods throw typed exceptions instead of returning `null`. This enables better error handling with TypeScript autocomplete.
99
121
 
100
- By default, 401/403 auth errors return `null` instead of throwing:
122
+ ### Available Error Types
101
123
 
102
124
  ```typescript
103
- const projects = await sdk.projects.getAllProjects();
104
- if (!projects) {
105
- // Token expired - refresh and retry
106
- await refreshToken();
125
+ import {
126
+ // Auth errors
127
+ AuthenticationError, // 401 - token expired/invalid
128
+ ForbiddenError, // 403 - access denied
129
+
130
+ // Client errors
131
+ ValidationError, // 422 - invalid data
132
+ NotFoundError, // 404 - resource not found
133
+ ConflictError, // 409 - data conflict
134
+ BadRequestError, // 400 - bad request
135
+
136
+ // Server errors
137
+ InternalServerError, // 500 - server error
138
+ ServiceUnavailableError, // 503 - service down
139
+ GatewayTimeoutError, // 504 - timeout
140
+
141
+ // Special errors
142
+ LimitExceededError, // 403 - credits limit exceeded
143
+ RateLimitError, // 429 - too many requests
144
+ NetworkError, // 0 - network failure
145
+ TimeoutError, // 408 - request timeout
146
+ DatabaseError // 400 - database error
147
+ } from 'solver-sdk';
148
+ ```
149
+
150
+ ### Basic Error Handling
151
+
152
+ ```typescript
153
+ try {
154
+ const status = await sdk.credits.getStatus();
155
+ console.log(status.balance);
156
+
157
+ } catch (error) {
158
+ // All errors have common properties:
159
+ console.log(error.statusCode); // HTTP status code
160
+ console.log(error.errorType); // Error type string
161
+ console.log(error.requestId); // For correlation with backend logs
162
+ console.log(error.timestamp); // When error occurred
163
+ console.log(error.rawResponse); // Full backend response
107
164
  }
165
+ ```
108
166
 
109
- // To throw errors instead:
110
- const sdk = await CodeSolverSDK.create({
111
- suppressAuthErrors: false
112
- });
167
+ ### Auth Error Handling
168
+
169
+ ```typescript
170
+ import { AuthenticationError } from 'solver-sdk';
171
+
172
+ try {
173
+ const balance = await sdk.credits.getBalance();
174
+ } catch (error) {
175
+ if (error instanceof AuthenticationError) {
176
+ // Token expired or invalid
177
+ console.log('Token expired, refreshing...');
178
+ await refreshToken();
179
+ // Retry the request
180
+ return retry();
181
+ }
182
+ }
113
183
  ```
114
184
 
115
185
  ### Usage Limits & Rate Limiting
116
186
 
117
- SDK automatically handles usage limit and rate limit errors with specialized error classes:
187
+ SDK provides specialized error classes for limits:
118
188
 
119
189
  #### Checking Limit Status
120
190
 
@@ -13,19 +13,24 @@ class CreditsApi {
13
13
  * Получить баланс credits (WorkCoins)
14
14
  *
15
15
  * @returns Текущий баланс credits пользователя
16
- * @throws {Error} 401 если не авторизован
16
+ * @throws {AuthenticationError} При истекшем или невалидном access token (401)
17
+ * @throws {ForbiddenError} При отсутствии доступа (403)
18
+ * @throws {InternalServerError} При ошибке сервера (500)
17
19
  */
18
20
  async getBalance() {
19
- return await this.httpClient.get('/api/credits/balance');
21
+ return await this.httpClient.get('/api/v1/credits/balance');
20
22
  }
21
23
  /**
22
24
  * Получить статус credits (с рекомендациями)
23
25
  *
24
26
  * @returns Статус credits и рекомендации
25
- * @throws {Error} 401 если не авторизован
27
+ * @throws {AuthenticationError} При истекшем или невалидном access token (401)
28
+ * @throws {ForbiddenError} При отсутствии доступа (403)
29
+ * @throws {LimitExceededError} При превышении лимита credits
30
+ * @throws {InternalServerError} При ошибке сервера (500)
26
31
  */
27
32
  async getStatus() {
28
- return await this.httpClient.get('/api/credits/status');
33
+ return await this.httpClient.get('/api/v1/credits/status');
29
34
  }
30
35
  /**
31
36
  * Оценить стоимость операции в credits (WorkCoins) до выполнения
@@ -34,9 +39,12 @@ class CreditsApi {
34
39
  * @param model - Модель (haiku/sonnet/auto)
35
40
  * @param operationType - Тип операции
36
41
  * @returns Оценка стоимости в credits (WorkCoins)
42
+ * @throws {AuthenticationError} При истекшем или невалидном access token (401)
43
+ * @throws {ValidationError} При некорректных параметрах запроса (422)
44
+ * @throws {InternalServerError} При ошибке сервера (500)
37
45
  */
38
46
  async estimate(tokens, model = 'haiku', operationType = 'simple_prompt') {
39
- return await this.httpClient.post('/api/credits/estimate', {
47
+ return await this.httpClient.post('/api/v1/credits/estimate', {
40
48
  tokens,
41
49
  model,
42
50
  operationType,
@@ -46,35 +54,47 @@ class CreditsApi {
46
54
  * Получить конфигурацию overage (pay-as-you-go)
47
55
  *
48
56
  * @returns Настройки overage пользователя
57
+ * @throws {AuthenticationError} При истекшем или невалидном access token (401)
58
+ * @throws {ForbiddenError} При отсутствии доступа (403)
59
+ * @throws {InternalServerError} При ошибке сервера (500)
49
60
  */
50
61
  async getOverageConfig() {
51
- return await this.httpClient.get('/api/credits/overage');
62
+ return await this.httpClient.get('/api/v1/credits/overage');
52
63
  }
53
64
  /**
54
65
  * Получить статистику overage за текущий месяц
55
66
  *
56
67
  * @returns Статистика использования overage
68
+ * @throws {AuthenticationError} При истекшем или невалидном access token (401)
69
+ * @throws {ForbiddenError} При отсутствии доступа (403)
70
+ * @throws {InternalServerError} При ошибке сервера (500)
57
71
  */
58
72
  async getOverageStats() {
59
- return await this.httpClient.get('/api/credits/overage/stats');
73
+ return await this.httpClient.get('/api/v1/credits/overage/stats');
60
74
  }
61
75
  /**
62
76
  * Включить/выключить overage
63
77
  *
64
78
  * @param enabled - true для включения, false для выключения
65
- * @throws {AxiosError} 403 если пользователь на Free плане
79
+ * @throws {AuthenticationError} При истекшем или невалидном access token (401)
80
+ * @throws {ForbiddenError} Если пользователь на Free плане (403)
81
+ * @throws {ValidationError} При некорректных параметрах (422)
82
+ * @throws {InternalServerError} При ошибке сервера (500)
66
83
  */
67
84
  async toggleOverage(enabled) {
68
- await this.httpClient.post('/api/credits/overage/toggle', { enabled });
85
+ await this.httpClient.post('/api/v1/credits/overage/toggle', { enabled });
69
86
  }
70
87
  /**
71
88
  * Обновить лимит overage
72
89
  *
73
90
  * @param limitCredits - Новый лимит overage в credits
74
- * @throws {AxiosError} 400 если лимит некорректный
91
+ * @throws {AuthenticationError} При истекшем или невалидном access token (401)
92
+ * @throws {BadRequestError} Если лимит некорректный (400)
93
+ * @throws {ValidationError} При ошибке валидации (422)
94
+ * @throws {InternalServerError} При ошибке сервера (500)
75
95
  */
76
96
  async updateOverageLimit(limitCredits) {
77
- await this.httpClient.post('/api/credits/overage/limit', { limitCredits });
97
+ await this.httpClient.post('/api/v1/credits/overage/limit', { limitCredits });
78
98
  }
79
99
  }
80
100
  exports.CreditsApi = CreditsApi;
@@ -1 +1 @@
1
- {"version":3,"file":"credits-api.js","sourceRoot":"","sources":["../../../src/api/credits-api.ts"],"names":[],"mappings":";;;AAWA;;;GAGG;AACH,MAAa,UAAU;IACrB,YAAoB,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAE9C;;;;;OAKG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAiB,sBAAsB,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAgB,qBAAqB,CAAC,CAAC;IACzE,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,CACZ,MAAc,EACd,QAAmB,OAAO,EAC1B,gBAA+B,eAAe;QAE9C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAkB,uBAAuB,EAAE;YAC1E,MAAM;YACN,KAAK;YACL,aAAa;SACd,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB;QACpB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAgB,sBAAsB,CAAC,CAAC;IAC1E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe;QACnB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAe,4BAA4B,CAAC,CAAC;IAC/E,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CAAC,OAAgB;QAClC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CAAC,YAAoB;QAC3C,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7E,CAAC;CACF;AAhFD,gCAgFC"}
1
+ {"version":3,"file":"credits-api.js","sourceRoot":"","sources":["../../../src/api/credits-api.ts"],"names":[],"mappings":";;;AAWA;;;GAGG;AACH,MAAa,UAAU;IACrB,YAAoB,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAE9C;;;;;;;OAOG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAiB,yBAAyB,CAAC,CAAC;IAC9E,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAgB,wBAAwB,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,QAAQ,CACZ,MAAc,EACd,QAAmB,OAAO,EAC1B,gBAA+B,eAAe;QAE9C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAkB,0BAA0B,EAAE;YAC7E,MAAM;YACN,KAAK;YACL,aAAa;SACd,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,gBAAgB;QACpB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAgB,yBAAyB,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,eAAe;QACnB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAe,+BAA+B,CAAC,CAAC;IAClF,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,aAAa,CAAC,OAAgB;QAClC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,kBAAkB,CAAC,YAAoB;QAC3C,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IAChF,CAAC;CACF;AApGD,gCAoGC"}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ /**
3
+ * Централизованные классы ошибок SDK
4
+ * Покрывают все типы ошибок backend с типизацией
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RateLimitError = exports.LimitExceededError = exports.NetworkError = exports.TimeoutError = exports.DatabaseError = exports.GatewayTimeoutError = exports.ServiceUnavailableError = exports.InternalServerError = exports.BadRequestError = exports.ConflictError = exports.NotFoundError = exports.ValidationError = exports.ForbiddenError = exports.AuthenticationError = exports.BaseSDKError = void 0;
8
+ /**
9
+ * Базовый класс для всех SDK ошибок
10
+ */
11
+ class BaseSDKError extends Error {
12
+ constructor(statusCode, errorType, message, details) {
13
+ super(message);
14
+ this.name = this.constructor.name;
15
+ this.statusCode = statusCode;
16
+ this.errorType = errorType;
17
+ this.requestId = details?.requestId;
18
+ this.timestamp = details?.timestamp;
19
+ this.rawResponse = details;
20
+ // Поддержка stack trace в V8
21
+ if (Error.captureStackTrace) {
22
+ Error.captureStackTrace(this, this.constructor);
23
+ }
24
+ }
25
+ }
26
+ exports.BaseSDKError = BaseSDKError;
27
+ // ========================================
28
+ // CLIENT ERRORS (4xx)
29
+ // ========================================
30
+ /**
31
+ * Ошибка аутентификации (401)
32
+ * Выбрасывается при истекшем или невалидном access token
33
+ */
34
+ class AuthenticationError extends BaseSDKError {
35
+ constructor(message, details) {
36
+ super(401, 'unauthorized', message, details);
37
+ /** Можно ли повторить запрос после refresh токена */
38
+ this.shouldRetry = true;
39
+ }
40
+ }
41
+ exports.AuthenticationError = AuthenticationError;
42
+ /**
43
+ * Ошибка доступа (403)
44
+ * Выбрасывается когда доступ запрещен (не путать с LimitExceededError)
45
+ */
46
+ class ForbiddenError extends BaseSDKError {
47
+ constructor(message, details) {
48
+ super(403, 'forbidden', message, details);
49
+ this.reason = details?.reason;
50
+ }
51
+ }
52
+ exports.ForbiddenError = ForbiddenError;
53
+ /**
54
+ * Ошибка валидации (422)
55
+ * Выбрасывается при невалидных данных в запросе
56
+ */
57
+ class ValidationError extends BaseSDKError {
58
+ constructor(message, details) {
59
+ super(422, 'validation_error', message, details);
60
+ this.fields = details?.fields;
61
+ }
62
+ }
63
+ exports.ValidationError = ValidationError;
64
+ /**
65
+ * Ресурс не найден (404)
66
+ */
67
+ class NotFoundError extends BaseSDKError {
68
+ constructor(message, details) {
69
+ super(404, 'not_found', message, details);
70
+ this.resource = details?.resource;
71
+ }
72
+ }
73
+ exports.NotFoundError = NotFoundError;
74
+ /**
75
+ * Конфликт данных (409)
76
+ * Выбрасывается при попытке создать дубликат или конфликтующую запись
77
+ */
78
+ class ConflictError extends BaseSDKError {
79
+ constructor(message, details) {
80
+ super(409, 'conflict', message, details);
81
+ }
82
+ }
83
+ exports.ConflictError = ConflictError;
84
+ /**
85
+ * Некорректный запрос (400)
86
+ */
87
+ class BadRequestError extends BaseSDKError {
88
+ constructor(message, details) {
89
+ super(400, 'bad_request', message, details);
90
+ }
91
+ }
92
+ exports.BadRequestError = BadRequestError;
93
+ // ========================================
94
+ // SERVER ERRORS (5xx)
95
+ // ========================================
96
+ /**
97
+ * Внутренняя ошибка сервера (500)
98
+ */
99
+ class InternalServerError extends BaseSDKError {
100
+ constructor(message, details) {
101
+ super(500, 'internal_server_error', message, details);
102
+ }
103
+ }
104
+ exports.InternalServerError = InternalServerError;
105
+ /**
106
+ * Сервис недоступен (503)
107
+ */
108
+ class ServiceUnavailableError extends BaseSDKError {
109
+ constructor(message, details) {
110
+ super(503, 'service_unavailable', message, details);
111
+ this.retryAfter = details?.retryAfter;
112
+ }
113
+ }
114
+ exports.ServiceUnavailableError = ServiceUnavailableError;
115
+ /**
116
+ * Таймаут gateway (504)
117
+ */
118
+ class GatewayTimeoutError extends BaseSDKError {
119
+ constructor(message, details) {
120
+ super(504, 'gateway_timeout', message, details);
121
+ }
122
+ }
123
+ exports.GatewayTimeoutError = GatewayTimeoutError;
124
+ // ========================================
125
+ // СПЕЦИАЛЬНЫЕ ОШИБКИ
126
+ // ========================================
127
+ /**
128
+ * Ошибка базы данных
129
+ * Выбрасывается при SQL ошибках или проблемах с БД
130
+ */
131
+ class DatabaseError extends BaseSDKError {
132
+ constructor(message, details) {
133
+ super(400, 'database_error', message, details);
134
+ }
135
+ }
136
+ exports.DatabaseError = DatabaseError;
137
+ /**
138
+ * Таймаут запроса (408)
139
+ */
140
+ class TimeoutError extends BaseSDKError {
141
+ constructor(message, details) {
142
+ super(408, 'timeout_error', message, details);
143
+ }
144
+ }
145
+ exports.TimeoutError = TimeoutError;
146
+ /**
147
+ * Ошибка сети
148
+ * Выбрасывается когда запрос не смог достичь сервера
149
+ */
150
+ class NetworkError extends BaseSDKError {
151
+ constructor(message, details) {
152
+ super(0, 'network_error', message, details);
153
+ }
154
+ }
155
+ exports.NetworkError = NetworkError;
156
+ // ========================================
157
+ // СУЩЕСТВУЮЩИЕ КЛАССЫ (обратная совместимость)
158
+ // ========================================
159
+ /**
160
+ * Ошибка превышения лимита использования
161
+ * Выбрасывается при HTTP 403 с details.error === 'usage_limit_exceeded'
162
+ */
163
+ class LimitExceededError extends BaseSDKError {
164
+ constructor(errorData) {
165
+ const message = errorData.message || errorData.details?.message || 'Usage limit exceeded';
166
+ super(403, 'usage_limit_exceeded', message, errorData);
167
+ this.statusType = errorData.details?.statusType || 'unknown';
168
+ this.status = errorData.details?.status || 'blocked';
169
+ this.details = errorData.details || {};
170
+ this.action = errorData.details?.action;
171
+ this.balance = errorData.details?.balance;
172
+ }
173
+ /**
174
+ * Проверяет, заблокирован ли пользователь
175
+ */
176
+ isBlocked() {
177
+ return !this.details.canMakeRequest;
178
+ }
179
+ /**
180
+ * Получает URL для действия пользователя
181
+ */
182
+ getActionUrl() {
183
+ return this.action?.ctaUrl;
184
+ }
185
+ }
186
+ exports.LimitExceededError = LimitExceededError;
187
+ /**
188
+ * Ошибка превышения rate limit
189
+ * Выбрасывается при HTTP 429
190
+ */
191
+ class RateLimitError extends BaseSDKError {
192
+ constructor(errorData) {
193
+ const message = errorData.message || errorData.details?.message || 'Rate limit exceeded';
194
+ super(429, 'rate_limit_exceeded', message, errorData);
195
+ this.details = errorData.details || {};
196
+ this.retryAfter = this.details.retryAfter || 60;
197
+ // Парсим дату из ISO строки или используем текущее время + retryAfter
198
+ this.retryAt = this.details.retryAt
199
+ ? new Date(this.details.retryAt)
200
+ : new Date(Date.now() + this.retryAfter * 1000);
201
+ }
202
+ /**
203
+ * Получает время ожидания в миллисекундах
204
+ */
205
+ getRetryDelayMs() {
206
+ return Math.max(0, this.retryAt.getTime() - Date.now());
207
+ }
208
+ /**
209
+ * Проверяет, прошло ли время ожидания
210
+ */
211
+ canRetryNow() {
212
+ return Date.now() >= this.retryAt.getTime();
213
+ }
214
+ }
215
+ exports.RateLimitError = RateLimitError;
216
+ //# sourceMappingURL=sdk-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-errors.js","sourceRoot":"","sources":["../../../src/errors/sdk-errors.ts"],"names":[],"mappings":"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"}
package/dist/cjs/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.UpdateManager = exports.DeltaChunkingUtils = exports.DeltaChunkingManager = exports.DeltaChunkingApi = exports.ensureCorrectBlockOrder = exports.createSystemMessage = exports.createUserMessage = exports.createTextBlock = exports.createComplexAssistantMessage = exports.createStandardDevelopmentTools = exports.extractToolResultBlocks = exports.extractToolUseBlocks = exports.extractThinkingBlocks = exports.createToolUseBlock = exports.createToolResultMessage = exports.createThinkingBlock = exports.HttpClient = exports.CodeSolverSDK = exports.VERSION = void 0;
17
+ exports.UpdateManager = exports.DeltaChunkingUtils = exports.DeltaChunkingManager = exports.DeltaChunkingApi = exports.ensureCorrectBlockOrder = exports.createSystemMessage = exports.createUserMessage = exports.createTextBlock = exports.createComplexAssistantMessage = exports.createStandardDevelopmentTools = exports.extractToolResultBlocks = exports.extractToolUseBlocks = exports.extractThinkingBlocks = exports.createToolUseBlock = exports.createToolResultMessage = exports.createThinkingBlock = exports.BaseSDKError = exports.RateLimitError = exports.LimitExceededError = exports.NetworkError = exports.TimeoutError = exports.DatabaseError = exports.GatewayTimeoutError = exports.ServiceUnavailableError = exports.InternalServerError = exports.BadRequestError = exports.ConflictError = exports.NotFoundError = exports.ValidationError = exports.ForbiddenError = exports.AuthenticationError = exports.HttpClient = exports.CodeSolverSDK = exports.VERSION = void 0;
18
18
  const code_solver_sdk_js_1 = require("./code-solver-sdk.js");
19
19
  Object.defineProperty(exports, "CodeSolverSDK", { enumerable: true, get: function () { return code_solver_sdk_js_1.CodeSolverSDK; } });
20
20
  const http_client_js_1 = require("./utils/http-client.js");
@@ -34,8 +34,25 @@ __exportStar(require("./api/updates-api.js"), exports);
34
34
  __exportStar(require("./api/user-api.js"), exports);
35
35
  // Экспортируем типы лимитов
36
36
  __exportStar(require("./types/limit-status.js"), exports);
37
- // Экспортируем классы ошибок лимитов
38
- __exportStar(require("./errors/limit-errors.js"), exports);
37
+ // Экспортируем все классы ошибок SDK
38
+ __exportStar(require("./errors/sdk-errors.js"), exports);
39
+ // Явно экспортируем основные классы ошибок для удобства импорта
40
+ var sdk_errors_js_1 = require("./errors/sdk-errors.js");
41
+ Object.defineProperty(exports, "AuthenticationError", { enumerable: true, get: function () { return sdk_errors_js_1.AuthenticationError; } });
42
+ Object.defineProperty(exports, "ForbiddenError", { enumerable: true, get: function () { return sdk_errors_js_1.ForbiddenError; } });
43
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return sdk_errors_js_1.ValidationError; } });
44
+ Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return sdk_errors_js_1.NotFoundError; } });
45
+ Object.defineProperty(exports, "ConflictError", { enumerable: true, get: function () { return sdk_errors_js_1.ConflictError; } });
46
+ Object.defineProperty(exports, "BadRequestError", { enumerable: true, get: function () { return sdk_errors_js_1.BadRequestError; } });
47
+ Object.defineProperty(exports, "InternalServerError", { enumerable: true, get: function () { return sdk_errors_js_1.InternalServerError; } });
48
+ Object.defineProperty(exports, "ServiceUnavailableError", { enumerable: true, get: function () { return sdk_errors_js_1.ServiceUnavailableError; } });
49
+ Object.defineProperty(exports, "GatewayTimeoutError", { enumerable: true, get: function () { return sdk_errors_js_1.GatewayTimeoutError; } });
50
+ Object.defineProperty(exports, "DatabaseError", { enumerable: true, get: function () { return sdk_errors_js_1.DatabaseError; } });
51
+ Object.defineProperty(exports, "TimeoutError", { enumerable: true, get: function () { return sdk_errors_js_1.TimeoutError; } });
52
+ Object.defineProperty(exports, "NetworkError", { enumerable: true, get: function () { return sdk_errors_js_1.NetworkError; } });
53
+ Object.defineProperty(exports, "LimitExceededError", { enumerable: true, get: function () { return sdk_errors_js_1.LimitExceededError; } });
54
+ Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return sdk_errors_js_1.RateLimitError; } });
55
+ Object.defineProperty(exports, "BaseSDKError", { enumerable: true, get: function () { return sdk_errors_js_1.BaseSDKError; } });
39
56
  // Экспортируем Credits API и типы
40
57
  __exportStar(require("./types/credits.js"), exports);
41
58
  __exportStar(require("./api/credits-api.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6DAAqD;AAQ5C,8FARA,kCAAa,OAQA;AANtB,2DAAoD;AAQ3C,2FARA,2BAAU,OAQA;AANnB,2DAA2D;AAC3D,2CAAuC;AAA9B,qGAAA,OAAO,OAAA;AAOhB,0CAA0C;AAC1C,8DAA4C;AAE5C,gCAAgC;AAChC,wDAAsC;AACtC,sDAAoC;AAEpC,0DAAwC;AACxC,qDAAmC;AACnC,sDAAoC;AACpC,uDAAqC;AACrC,oDAAkC;AAElC,4BAA4B;AAC5B,0DAAwC;AAExC,qCAAqC;AACrC,2DAAyC;AAEzC,kCAAkC;AAClC,qDAAmC;AACnC,uDAAqC;AAErC,kDAAkD;AAClD,6DAA2C;AAE3C,iEAAiE;AACjE,iEAaoC;AAZlC,yHAAA,mBAAmB,OAAA;AACnB,6HAAA,uBAAuB,OAAA;AACvB,wHAAA,kBAAkB,OAAA;AAClB,2HAAA,qBAAqB,OAAA;AACrB,0HAAA,oBAAoB,OAAA;AACpB,6HAAA,uBAAuB,OAAA;AACvB,oIAAA,8BAA8B,OAAA;AAC9B,mIAAA,6BAA6B,OAAA;AAC7B,qHAAA,eAAe,OAAA;AACf,uHAAA,iBAAiB,OAAA;AACjB,yHAAA,mBAAmB,OAAA;AACnB,6HAAA,uBAAuB,OAAA,CAAE,+DAA+D;AAG1F,oEAAoE;AACpE,qEAA+D;AAAtD,yHAAA,gBAAgB,OAAA;AACzB,wFAAkF;AAAzE,iIAAA,oBAAoB,OAAA;AAC7B,oFAA8E;AAArE,6HAAA,kBAAkB,OAAA;AAE3B,+BAA+B;AAC/B,4DAA0C;AAE1C,wCAAwC;AACxC,kEAAgD;AAEhD,2BAA2B;AAC3B,qDAAmC;AAEnC,iDAAiD;AACjD,+DAA0D;AAAjD,kHAAA,aAAa,OAAA;AAEtB,uBAAuB;AACvB,kBAAe,kCAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6DAAqD;AAQ5C,8FARA,kCAAa,OAQA;AANtB,2DAAoD;AAQ3C,2FARA,2BAAU,OAQA;AANnB,2DAA2D;AAC3D,2CAAuC;AAA9B,qGAAA,OAAO,OAAA;AAOhB,0CAA0C;AAC1C,8DAA4C;AAE5C,gCAAgC;AAChC,wDAAsC;AACtC,sDAAoC;AAEpC,0DAAwC;AACxC,qDAAmC;AACnC,sDAAoC;AACpC,uDAAqC;AACrC,oDAAkC;AAElC,4BAA4B;AAC5B,0DAAwC;AAExC,qCAAqC;AACrC,yDAAuC;AAEvC,gEAAgE;AAChE,wDAgBgC;AAf9B,oHAAA,mBAAmB,OAAA;AACnB,+GAAA,cAAc,OAAA;AACd,gHAAA,eAAe,OAAA;AACf,8GAAA,aAAa,OAAA;AACb,8GAAA,aAAa,OAAA;AACb,gHAAA,eAAe,OAAA;AACf,oHAAA,mBAAmB,OAAA;AACnB,wHAAA,uBAAuB,OAAA;AACvB,oHAAA,mBAAmB,OAAA;AACnB,8GAAA,aAAa,OAAA;AACb,6GAAA,YAAY,OAAA;AACZ,6GAAA,YAAY,OAAA;AACZ,mHAAA,kBAAkB,OAAA;AAClB,+GAAA,cAAc,OAAA;AACd,6GAAA,YAAY,OAAA;AAGd,kCAAkC;AAClC,qDAAmC;AACnC,uDAAqC;AAErC,kDAAkD;AAClD,6DAA2C;AAE3C,iEAAiE;AACjE,iEAaoC;AAZlC,yHAAA,mBAAmB,OAAA;AACnB,6HAAA,uBAAuB,OAAA;AACvB,wHAAA,kBAAkB,OAAA;AAClB,2HAAA,qBAAqB,OAAA;AACrB,0HAAA,oBAAoB,OAAA;AACpB,6HAAA,uBAAuB,OAAA;AACvB,oIAAA,8BAA8B,OAAA;AAC9B,mIAAA,6BAA6B,OAAA;AAC7B,qHAAA,eAAe,OAAA;AACf,uHAAA,iBAAiB,OAAA;AACjB,yHAAA,mBAAmB,OAAA;AACnB,6HAAA,uBAAuB,OAAA,CAAE,+DAA+D;AAG1F,oEAAoE;AACpE,qEAA+D;AAAtD,yHAAA,gBAAgB,OAAA;AACzB,wFAAkF;AAAzE,iIAAA,oBAAoB,OAAA;AAC7B,oFAA8E;AAArE,6HAAA,kBAAkB,OAAA;AAE3B,+BAA+B;AAC/B,4DAA0C;AAE1C,wCAAwC;AACxC,kEAAgD;AAEhD,2BAA2B;AAC3B,qDAAmC;AAEnC,iDAAiD;AACjD,+DAA0D;AAAjD,kHAAA,aAAa,OAAA;AAEtB,uBAAuB;AACvB,kBAAe,kCAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAucH,gCAAgC;AAChC,+CAA6B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAgeH,gCAAgC;AAChC,+CAA6B"}