solver-sdk 1.8.0 → 1.9.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 (181) hide show
  1. package/README.md +176 -468
  2. package/dist/cjs/api/{chat-api.js → chat-api/index.js} +77 -125
  3. package/dist/cjs/api/chat-api/index.js.map +1 -0
  4. package/dist/cjs/api/chat-api/interfaces.js +3 -0
  5. package/dist/cjs/api/chat-api/interfaces.js.map +1 -0
  6. package/dist/cjs/api/chat-api/models.js +6 -0
  7. package/dist/cjs/api/chat-api/models.js.map +1 -0
  8. package/dist/cjs/api/chat-api/stream-utils.js +192 -0
  9. package/dist/cjs/api/chat-api/stream-utils.js.map +1 -0
  10. package/dist/cjs/api/chat-api/websocket-helpers.js +211 -0
  11. package/dist/cjs/api/chat-api/websocket-helpers.js.map +1 -0
  12. package/dist/cjs/api/projects-api.js +275 -3
  13. package/dist/cjs/api/projects-api.js.map +1 -1
  14. package/dist/cjs/code-solver-sdk.js +21 -23
  15. package/dist/cjs/code-solver-sdk.js.map +1 -1
  16. package/dist/cjs/constants/websocket-events.constants.js +90 -52
  17. package/dist/cjs/constants/websocket-events.constants.js.map +1 -1
  18. package/dist/cjs/constants/websocket-namespaces.constants.js +18 -0
  19. package/dist/cjs/constants/websocket-namespaces.constants.js.map +1 -0
  20. package/dist/cjs/interfaces/websocket/callbacks.interfaces.js +3 -0
  21. package/dist/cjs/interfaces/websocket/callbacks.interfaces.js.map +1 -0
  22. package/dist/cjs/interfaces/websocket/client-options.interfaces.js +3 -0
  23. package/dist/cjs/interfaces/websocket/client-options.interfaces.js.map +1 -0
  24. package/dist/cjs/interfaces/websocket/events.interfaces.js +3 -0
  25. package/dist/cjs/interfaces/websocket/events.interfaces.js.map +1 -0
  26. package/dist/cjs/interfaces/websocket/stats.interfaces.js +3 -0
  27. package/dist/cjs/interfaces/websocket/stats.interfaces.js.map +1 -0
  28. package/dist/cjs/utils/code-solver-websocket-client.js +383 -1473
  29. package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -1
  30. package/dist/cjs/utils/connection-state-manager.js +133 -0
  31. package/dist/cjs/utils/connection-state-manager.js.map +1 -0
  32. package/dist/cjs/utils/http-client.js +7 -0
  33. package/dist/cjs/utils/http-client.js.map +1 -1
  34. package/dist/cjs/utils/logger.js +106 -0
  35. package/dist/cjs/utils/logger.js.map +1 -0
  36. package/dist/cjs/utils/ping-pong-manager.js +306 -0
  37. package/dist/cjs/utils/ping-pong-manager.js.map +1 -0
  38. package/dist/cjs/utils/reasoning-auth-helper.js +58 -0
  39. package/dist/cjs/utils/reasoning-auth-helper.js.map +1 -0
  40. package/dist/cjs/utils/session-manager.js +114 -0
  41. package/dist/cjs/utils/session-manager.js.map +1 -0
  42. package/dist/cjs/utils/websocket-client.js +37 -10
  43. package/dist/cjs/utils/websocket-client.js.map +1 -1
  44. package/dist/cjs/ws/base-ws-client.js +286 -0
  45. package/dist/cjs/ws/base-ws-client.js.map +1 -0
  46. package/dist/cjs/ws/dependencies-ws-client.js +11 -0
  47. package/dist/cjs/ws/dependencies-ws-client.js.map +1 -0
  48. package/dist/cjs/ws/diagnostics-service.js +170 -0
  49. package/dist/cjs/ws/diagnostics-service.js.map +1 -0
  50. package/dist/cjs/ws/indexing-ws-client.js +223 -0
  51. package/dist/cjs/ws/indexing-ws-client.js.map +1 -0
  52. package/dist/cjs/ws/notifications-ws-client.js +12 -0
  53. package/dist/cjs/ws/notifications-ws-client.js.map +1 -0
  54. package/dist/cjs/ws/reasoning-ws-client.js +330 -0
  55. package/dist/cjs/ws/reasoning-ws-client.js.map +1 -0
  56. package/dist/esm/api/{chat-api.js → chat-api/index.js} +74 -125
  57. package/dist/esm/api/chat-api/index.js.map +1 -0
  58. package/dist/esm/api/chat-api/interfaces.js +2 -0
  59. package/dist/esm/api/chat-api/interfaces.js.map +1 -0
  60. package/dist/esm/api/chat-api/models.js +5 -0
  61. package/dist/esm/api/chat-api/models.js.map +1 -0
  62. package/dist/esm/api/chat-api/stream-utils.js +188 -0
  63. package/dist/esm/api/chat-api/stream-utils.js.map +1 -0
  64. package/dist/esm/api/chat-api/websocket-helpers.js +205 -0
  65. package/dist/esm/api/chat-api/websocket-helpers.js.map +1 -0
  66. package/dist/esm/api/projects-api.js +275 -3
  67. package/dist/esm/api/projects-api.js.map +1 -1
  68. package/dist/esm/code-solver-sdk.js +13 -15
  69. package/dist/esm/code-solver-sdk.js.map +1 -1
  70. package/dist/esm/constants/websocket-events.constants.js +89 -51
  71. package/dist/esm/constants/websocket-events.constants.js.map +1 -1
  72. package/dist/esm/constants/websocket-namespaces.constants.js +15 -0
  73. package/dist/esm/constants/websocket-namespaces.constants.js.map +1 -0
  74. package/dist/esm/interfaces/websocket/callbacks.interfaces.js +2 -0
  75. package/dist/esm/interfaces/websocket/callbacks.interfaces.js.map +1 -0
  76. package/dist/esm/interfaces/websocket/client-options.interfaces.js +2 -0
  77. package/dist/esm/interfaces/websocket/client-options.interfaces.js.map +1 -0
  78. package/dist/esm/interfaces/websocket/events.interfaces.js +2 -0
  79. package/dist/esm/interfaces/websocket/events.interfaces.js.map +1 -0
  80. package/dist/esm/interfaces/websocket/stats.interfaces.js +2 -0
  81. package/dist/esm/interfaces/websocket/stats.interfaces.js.map +1 -0
  82. package/dist/esm/utils/code-solver-websocket-client.js +382 -1473
  83. package/dist/esm/utils/code-solver-websocket-client.js.map +1 -1
  84. package/dist/esm/utils/connection-state-manager.js +129 -0
  85. package/dist/esm/utils/connection-state-manager.js.map +1 -0
  86. package/dist/esm/utils/http-client.js +7 -0
  87. package/dist/esm/utils/http-client.js.map +1 -1
  88. package/dist/esm/utils/logger.js +101 -0
  89. package/dist/esm/utils/logger.js.map +1 -0
  90. package/dist/esm/utils/ping-pong-manager.js +302 -0
  91. package/dist/esm/utils/ping-pong-manager.js.map +1 -0
  92. package/dist/esm/utils/reasoning-auth-helper.js +54 -0
  93. package/dist/esm/utils/reasoning-auth-helper.js.map +1 -0
  94. package/dist/esm/utils/session-manager.js +109 -0
  95. package/dist/esm/utils/session-manager.js.map +1 -0
  96. package/dist/esm/utils/websocket-client.js +37 -10
  97. package/dist/esm/utils/websocket-client.js.map +1 -1
  98. package/dist/esm/ws/base-ws-client.js +282 -0
  99. package/dist/esm/ws/base-ws-client.js.map +1 -0
  100. package/dist/esm/ws/dependencies-ws-client.js +7 -0
  101. package/dist/esm/ws/dependencies-ws-client.js.map +1 -0
  102. package/dist/esm/ws/diagnostics-service.js +166 -0
  103. package/dist/esm/ws/diagnostics-service.js.map +1 -0
  104. package/dist/esm/ws/indexing-ws-client.js +219 -0
  105. package/dist/esm/ws/indexing-ws-client.js.map +1 -0
  106. package/dist/esm/ws/notifications-ws-client.js +8 -0
  107. package/dist/esm/ws/notifications-ws-client.js.map +1 -0
  108. package/dist/esm/ws/reasoning-ws-client.js +326 -0
  109. package/dist/esm/ws/reasoning-ws-client.js.map +1 -0
  110. package/dist/types/api/chat-api/index.d.ts +81 -0
  111. package/dist/types/api/chat-api/index.d.ts.map +1 -0
  112. package/dist/types/api/chat-api/interfaces.d.ts +47 -0
  113. package/dist/types/api/chat-api/interfaces.d.ts.map +1 -0
  114. package/dist/types/api/{chat-api.d.ts → chat-api/models.d.ts} +10 -73
  115. package/dist/types/api/chat-api/models.d.ts.map +1 -0
  116. package/dist/types/api/chat-api/stream-utils.d.ts +31 -0
  117. package/dist/types/api/chat-api/stream-utils.d.ts.map +1 -0
  118. package/dist/types/api/chat-api/websocket-helpers.d.ts +40 -0
  119. package/dist/types/api/chat-api/websocket-helpers.d.ts.map +1 -0
  120. package/dist/types/api/projects-api.d.ts +114 -1
  121. package/dist/types/api/projects-api.d.ts.map +1 -1
  122. package/dist/types/code-solver-sdk.d.ts +3 -2
  123. package/dist/types/code-solver-sdk.d.ts.map +1 -1
  124. package/dist/types/constants/websocket-events.constants.d.ts +77 -36
  125. package/dist/types/constants/websocket-events.constants.d.ts.map +1 -1
  126. package/dist/types/constants/websocket-namespaces.constants.d.ts +14 -0
  127. package/dist/types/constants/websocket-namespaces.constants.d.ts.map +1 -0
  128. package/dist/types/interfaces/http-client.d.ts +1 -1
  129. package/dist/types/interfaces/http-client.d.ts.map +1 -1
  130. package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts +30 -0
  131. package/dist/types/interfaces/websocket/callbacks.interfaces.d.ts.map +1 -0
  132. package/dist/types/interfaces/websocket/client-options.interfaces.d.ts +51 -0
  133. package/dist/types/interfaces/websocket/client-options.interfaces.d.ts.map +1 -0
  134. package/dist/types/interfaces/websocket/events.interfaces.d.ts +165 -0
  135. package/dist/types/interfaces/websocket/events.interfaces.d.ts.map +1 -0
  136. package/dist/types/interfaces/websocket/stats.interfaces.d.ts +72 -0
  137. package/dist/types/interfaces/websocket/stats.interfaces.d.ts.map +1 -0
  138. package/dist/types/types/index.d.ts +8 -0
  139. package/dist/types/types/index.d.ts.map +1 -1
  140. package/dist/types/utils/code-solver-websocket-client.d.ts +67 -612
  141. package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -1
  142. package/dist/types/utils/connection-state-manager.d.ts +94 -0
  143. package/dist/types/utils/connection-state-manager.d.ts.map +1 -0
  144. package/dist/types/utils/http-client.d.ts +5 -0
  145. package/dist/types/utils/http-client.d.ts.map +1 -1
  146. package/dist/types/utils/logger.d.ts +62 -0
  147. package/dist/types/utils/logger.d.ts.map +1 -0
  148. package/dist/types/utils/ping-pong-manager.d.ts +118 -0
  149. package/dist/types/utils/ping-pong-manager.d.ts.map +1 -0
  150. package/dist/types/utils/reasoning-auth-helper.d.ts +24 -0
  151. package/dist/types/utils/reasoning-auth-helper.d.ts.map +1 -0
  152. package/dist/types/utils/session-manager.d.ts +98 -0
  153. package/dist/types/utils/session-manager.d.ts.map +1 -0
  154. package/dist/types/utils/websocket-client.d.ts +6 -0
  155. package/dist/types/utils/websocket-client.d.ts.map +1 -1
  156. package/dist/types/ws/base-ws-client.d.ts +119 -0
  157. package/dist/types/ws/base-ws-client.d.ts.map +1 -0
  158. package/dist/types/ws/dependencies-ws-client.d.ts +6 -0
  159. package/dist/types/ws/dependencies-ws-client.d.ts.map +1 -0
  160. package/dist/types/ws/diagnostics-service.d.ts +93 -0
  161. package/dist/types/ws/diagnostics-service.d.ts.map +1 -0
  162. package/dist/types/ws/indexing-ws-client.d.ts +78 -0
  163. package/dist/types/ws/indexing-ws-client.d.ts.map +1 -0
  164. package/dist/types/ws/notifications-ws-client.d.ts +5 -0
  165. package/dist/types/ws/notifications-ws-client.d.ts.map +1 -0
  166. package/dist/types/ws/reasoning-ws-client.d.ts +87 -0
  167. package/dist/types/ws/reasoning-ws-client.d.ts.map +1 -0
  168. package/docs/API_REFERENCE.md +432 -0
  169. package/docs/AUTHENTICATION.md +83 -0
  170. package/docs/ERROR_HANDLING.md +240 -0
  171. package/docs/INTEGRATION_EXAMPLES.md +342 -0
  172. package/docs/PING_PONG.md +212 -0
  173. package/docs/README.md +102 -0
  174. package/docs/WEBSOCKET.md +139 -0
  175. package/docs/advanced/PING_PONG.md +212 -0
  176. package/docs/features/THINKING.md +158 -0
  177. package/docs/indexing/INDEXING.md +231 -0
  178. package/package.json +4 -3
  179. package/dist/cjs/api/chat-api.js.map +0 -1
  180. package/dist/esm/api/chat-api.js.map +0 -1
  181. package/dist/types/api/chat-api.d.ts.map +0 -1
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IndexingWebSocketClient = void 0;
4
+ const websocket_namespaces_constants_js_1 = require("../constants/websocket-namespaces.constants.js");
5
+ const websocket_events_constants_js_1 = require("../constants/websocket-events.constants.js");
6
+ const base_ws_client_js_1 = require("./base-ws-client.js");
7
+ const reasoning_auth_helper_js_1 = require("../utils/reasoning-auth-helper.js");
8
+ /**
9
+ * WebSocket клиент для пространства имен индексации
10
+ */
11
+ class IndexingWebSocketClient extends base_ws_client_js_1.BaseWebSocketClient {
12
+ /**
13
+ * Создает новый WebSocket клиент для индексации
14
+ * @param {string} baseURL Базовый URL API
15
+ * @param {IndexingWebSocketClientOptions} options Опции клиента
16
+ */
17
+ constructor(baseURL, options = {}) {
18
+ super(websocket_namespaces_constants_js_1.WebSocketNamespace.INDEXING, baseURL, options);
19
+ /** ID активного проекта */
20
+ this.activeProjectId = null;
21
+ // Инициализируем ID проекта, если указан
22
+ this.activeProjectId = options.projectId || null;
23
+ }
24
+ /**
25
+ * Подключается к серверу WebSocket
26
+ * @param {boolean} autoJoin Автоматически присоединиться к проекту
27
+ * @returns {Promise<boolean>} Успешность подключения
28
+ */
29
+ async connectToIndexing(autoJoin = true) {
30
+ try {
31
+ this.logger.info('Подключение к пространству имен индексации', { projectId: this.activeProjectId });
32
+ // Получаем параметры для подключения с авторизацией
33
+ const authParams = (0, reasoning_auth_helper_js_1.createIndexingConnectionParams)(this.options.apiKey, this.activeProjectId, this.sessionManager.getSessionToken(this.namespace));
34
+ // Подключаемся к пространству имен индексации с передачей authToken
35
+ const connected = await this.connect(authParams);
36
+ if (!connected) {
37
+ this.logger.error('Не удалось подключиться к пространству имен индексации');
38
+ return false;
39
+ }
40
+ // Аутентифицируемся с увеличенным таймаутом
41
+ try {
42
+ const authResult = await this.emitWithAck(websocket_events_constants_js_1.WebSocketEvents.AUTHENTICATE, {
43
+ token: this.options.apiKey,
44
+ projectId: this.activeProjectId
45
+ }, 10000);
46
+ this.logger.debug('Результат аутентификации в namespace индексации', authResult);
47
+ // Если сервер вернул токен сессии, сохраняем его
48
+ if (authResult.sessionToken) {
49
+ this.sessionManager.saveSessionToken(this.namespace, authResult.sessionToken);
50
+ }
51
+ }
52
+ catch (error) {
53
+ this.logger.error('Ошибка аутентификации в namespace индексации', error);
54
+ return false;
55
+ }
56
+ // Если у нас есть ID проекта и включено автоматическое присоединение
57
+ if (this.activeProjectId && autoJoin) {
58
+ return this.joinProject(this.activeProjectId);
59
+ }
60
+ return true;
61
+ }
62
+ catch (error) {
63
+ this.logger.error('Ошибка подключения к пространству имен индексации', error);
64
+ return false;
65
+ }
66
+ }
67
+ /**
68
+ * Присоединяется к проекту
69
+ * @param {string} projectId ID проекта
70
+ * @returns {Promise<boolean>} Успешность операции
71
+ */
72
+ async joinProject(projectId) {
73
+ if (!projectId) {
74
+ this.logger.error('Попытка присоединиться к пустому projectId');
75
+ return false;
76
+ }
77
+ // Сохраняем ID проекта
78
+ this.activeProjectId = projectId;
79
+ try {
80
+ // Отправляем запрос на присоединение к проекту
81
+ const joinResult = await this.emitWithAck(websocket_events_constants_js_1.WebSocketEvents.JOIN_PROJECT, {
82
+ projectId,
83
+ token: this.options.apiKey
84
+ }, 10000);
85
+ this.logger.debug(`Результат присоединения к проекту ${projectId}`, joinResult);
86
+ if (joinResult.success !== true) {
87
+ this.logger.error(`Ошибка при присоединении к проекту: ${joinResult.error || 'Неизвестная ошибка'}`);
88
+ return false;
89
+ }
90
+ return true;
91
+ }
92
+ catch (error) {
93
+ this.logger.error(`Ошибка при присоединении к проекту ${projectId}`, error);
94
+ return false;
95
+ }
96
+ }
97
+ /**
98
+ * Запускает процесс индексации проекта
99
+ * @param {string} [projectId] ID проекта (если не указан, используется текущий проект)
100
+ * @returns {Promise<boolean>} Успешность операции
101
+ */
102
+ async startIndexing(projectId) {
103
+ const targetId = projectId || this.activeProjectId;
104
+ if (!targetId) {
105
+ this.logger.error('Попытка запустить индексацию без указания ID проекта');
106
+ return false;
107
+ }
108
+ try {
109
+ // Отправляем запрос на запуск индексации
110
+ const startResult = await this.emitWithAck(websocket_events_constants_js_1.WebSocketEvents.START_INDEXING, {
111
+ projectId: targetId,
112
+ token: this.options.apiKey
113
+ }, 10000);
114
+ this.logger.debug(`Результат запуска индексации проекта ${targetId}`, startResult);
115
+ if (startResult.success !== true) {
116
+ this.logger.error(`Ошибка при запуске индексации: ${startResult.error || 'Неизвестная ошибка'}`);
117
+ return false;
118
+ }
119
+ return true;
120
+ }
121
+ catch (error) {
122
+ this.logger.error(`Ошибка при запуске индексации проекта ${targetId}`, error);
123
+ return false;
124
+ }
125
+ }
126
+ /**
127
+ * Останавливает процесс индексации проекта
128
+ * @param {string} [projectId] ID проекта (если не указан, используется текущий проект)
129
+ * @returns {Promise<boolean>} Успешность операции
130
+ */
131
+ async stopIndexing(projectId) {
132
+ const targetId = projectId || this.activeProjectId;
133
+ if (!targetId) {
134
+ this.logger.error('Попытка остановить индексацию без указания ID проекта');
135
+ return false;
136
+ }
137
+ try {
138
+ // Отправляем запрос на остановку индексации
139
+ const stopResult = await this.emitWithAck(websocket_events_constants_js_1.WebSocketEvents.STOP_INDEXING, {
140
+ projectId: targetId,
141
+ token: this.options.apiKey
142
+ }, 10000);
143
+ this.logger.debug(`Результат остановки индексации проекта ${targetId}`, stopResult);
144
+ if (stopResult.success !== true) {
145
+ this.logger.error(`Ошибка при остановке индексации: ${stopResult.error || 'Неизвестная ошибка'}`);
146
+ return false;
147
+ }
148
+ return true;
149
+ }
150
+ catch (error) {
151
+ this.logger.error(`Ошибка при остановке индексации проекта ${targetId}`, error);
152
+ return false;
153
+ }
154
+ }
155
+ /**
156
+ * Получает статус индексации проекта
157
+ * @param {string} [projectId] ID проекта (если не указан, используется текущий проект)
158
+ * @returns {Promise<any>} Статус индексации проекта
159
+ */
160
+ async getIndexingStatus(projectId) {
161
+ const targetId = projectId || this.activeProjectId;
162
+ if (!targetId) {
163
+ throw new Error('Не указан ID проекта для получения статуса индексации');
164
+ }
165
+ try {
166
+ // Отправляем запрос на получение статуса индексации
167
+ const statusResult = await this.emitWithAck(websocket_events_constants_js_1.WebSocketEvents.GET_INDEXING_STATUS, {
168
+ projectId: targetId,
169
+ token: this.options.apiKey
170
+ }, 10000);
171
+ this.logger.debug(`Получен статус индексации проекта ${targetId}`, statusResult);
172
+ return statusResult;
173
+ }
174
+ catch (error) {
175
+ this.logger.error(`Ошибка при получении статуса индексации проекта ${targetId}`, error);
176
+ throw error;
177
+ }
178
+ }
179
+ /**
180
+ * Устанавливает обработчик для события завершения индексации
181
+ * @param {Function} handler Обработчик события
182
+ */
183
+ onIndexingComplete(handler) {
184
+ this.on('indexing_complete', handler);
185
+ }
186
+ /**
187
+ * Устанавливает обработчик для события индексации файла
188
+ * @param {Function} handler Обработчик события
189
+ */
190
+ onFileIndexed(handler) {
191
+ this.on('file_indexed', handler);
192
+ }
193
+ /**
194
+ * Устанавливает обработчик для события ошибки индексации
195
+ * @param {Function} handler Обработчик события
196
+ */
197
+ onIndexingError(handler) {
198
+ this.on('indexing_error', handler);
199
+ }
200
+ /**
201
+ * Получает текущий ID активного проекта
202
+ * @returns {string | null} ID активного проекта или null
203
+ */
204
+ getActiveProjectId() {
205
+ return this.activeProjectId;
206
+ }
207
+ /**
208
+ * Устанавливает ID активного проекта
209
+ * @param {string} projectId ID проекта
210
+ * @returns {boolean} Успешность установки
211
+ */
212
+ setActiveProjectId(projectId) {
213
+ if (!projectId) {
214
+ this.logger.error('Попытка установить пустой projectId');
215
+ return false;
216
+ }
217
+ this.activeProjectId = projectId;
218
+ this.logger.debug(`Установлен активный projectId: ${projectId}`);
219
+ return true;
220
+ }
221
+ }
222
+ exports.IndexingWebSocketClient = IndexingWebSocketClient;
223
+ //# sourceMappingURL=indexing-ws-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexing-ws-client.js","sourceRoot":"","sources":["../../../src/ws/indexing-ws-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotificationsWsClient = void 0;
4
+ const base_ws_client_1 = require("./base-ws-client");
5
+ const websocket_namespaces_constants_js_1 = require("../constants/websocket-namespaces.constants.js");
6
+ class NotificationsWsClient extends base_ws_client_1.BaseWebSocketClient {
7
+ constructor(baseURL, options = {}) {
8
+ super(websocket_namespaces_constants_js_1.WebSocketNamespace.DEFAULT, baseURL, options);
9
+ }
10
+ }
11
+ exports.NotificationsWsClient = NotificationsWsClient;
12
+ //# sourceMappingURL=notifications-ws-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications-ws-client.js","sourceRoot":"","sources":["../../../src/ws/notifications-ws-client.ts"],"names":[],"mappings":";;;AAAA,qDAAuD;AACvD,sGAAoF;AAEpF,MAAa,qBAAsB,SAAQ,oCAAmB;IAC5D,YAAY,OAAe,EAAE,OAAO,GAAG,EAAE;QACvC,KAAK,CAAC,sDAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;CAEF;AALD,sDAKC"}
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReasoningWebSocketClient = void 0;
4
+ const websocket_namespaces_constants_js_1 = require("../constants/websocket-namespaces.constants.js");
5
+ const websocket_events_constants_js_1 = require("../constants/websocket-events.constants.js");
6
+ const base_ws_client_js_1 = require("./base-ws-client.js");
7
+ const reasoning_auth_helper_js_1 = require("../utils/reasoning-auth-helper.js");
8
+ /**
9
+ * WebSocket клиент для пространства имен рассуждений
10
+ */
11
+ class ReasoningWebSocketClient extends base_ws_client_js_1.BaseWebSocketClient {
12
+ /**
13
+ * Создает новый WebSocket клиент для рассуждений
14
+ * @param {string} baseURL Базовый URL API
15
+ * @param {ReasoningWebSocketClientOptions} options Опции клиента
16
+ */
17
+ constructor(baseURL, options = {}) {
18
+ super(websocket_namespaces_constants_js_1.WebSocketNamespace.REASONING, baseURL, options);
19
+ /** ID активного рассуждения */
20
+ this.activeReasoningId = null;
21
+ /** Обработчики событий мышления */
22
+ this.thinkingEventHandlers = new Map();
23
+ // Инициализируем ID рассуждения, если указан
24
+ this.activeReasoningId = options.reasoningId || null;
25
+ // Инициализируем обработчики событий
26
+ this.callbacks = options.callbacks || {};
27
+ }
28
+ /**
29
+ * Подключается к серверу WebSocket
30
+ * @param {boolean} autoJoin Автоматически присоединиться к рассуждению
31
+ * @returns {Promise<boolean>} Успешность подключения
32
+ */
33
+ async connectToReasoning(autoJoin = true) {
34
+ try {
35
+ // Получаем параметры авторизации для пространства имен рассуждений
36
+ const authParams = (0, reasoning_auth_helper_js_1.createReasoningConnectionParams)(this.options.apiKey, this.activeReasoningId, this.sessionManager.getSessionToken(this.namespace));
37
+ // Подключаемся к серверу
38
+ const connected = await this.connect(authParams);
39
+ if (!connected) {
40
+ this.logger.error('Не удалось подключиться к серверу рассуждений');
41
+ return false;
42
+ }
43
+ // Аутентифицируемся с увеличенным таймаутом
44
+ try {
45
+ const authResult = await this.emitWithAck(websocket_events_constants_js_1.WebSocketEvents.AUTHENTICATE, {
46
+ token: this.options.apiKey,
47
+ reasoningId: this.activeReasoningId
48
+ }, 10000);
49
+ this.logger.debug('Результат аутентификации в namespace рассуждений', authResult);
50
+ // Если сервер вернул токен сессии, сохраняем его
51
+ if (authResult.sessionToken) {
52
+ this.sessionManager.saveSessionToken(this.namespace, authResult.sessionToken);
53
+ }
54
+ }
55
+ catch (error) {
56
+ this.logger.error('Ошибка аутентификации в namespace рассуждений', error);
57
+ return false;
58
+ }
59
+ // Если у нас есть ID рассуждения и включено автоматическое присоединение
60
+ if (this.activeReasoningId && autoJoin) {
61
+ return this.joinReasoning(this.activeReasoningId);
62
+ }
63
+ return true;
64
+ }
65
+ catch (error) {
66
+ this.logger.error('Ошибка подключения к пространству имен рассуждений', error);
67
+ return false;
68
+ }
69
+ }
70
+ /**
71
+ * Присоединяется к сессии рассуждения
72
+ * @param {string} reasoningId ID сессии рассуждения
73
+ * @returns {Promise<boolean>} Успешность операции
74
+ */
75
+ async joinReasoning(reasoningId) {
76
+ if (!reasoningId) {
77
+ this.logger.error('Попытка присоединиться к пустому reasoningId');
78
+ return false;
79
+ }
80
+ // Сохраняем ID рассуждения
81
+ this.activeReasoningId = reasoningId;
82
+ try {
83
+ // Отправляем запрос на присоединение к сессии рассуждения
84
+ const joinResult = await this.emitWithAck(websocket_events_constants_js_1.WebSocketEvents.JOIN_REASONING, {
85
+ reasoningId,
86
+ token: this.options.apiKey
87
+ }, 10000);
88
+ this.logger.debug(`Результат присоединения к рассуждению ${reasoningId}`, joinResult);
89
+ if (joinResult.success !== true) {
90
+ this.logger.error(`Ошибка при присоединении к рассуждению: ${joinResult.error || 'Неизвестная ошибка'}`);
91
+ return false;
92
+ }
93
+ return true;
94
+ }
95
+ catch (error) {
96
+ this.logger.error(`Ошибка при присоединении к рассуждению ${reasoningId}`, error);
97
+ return false;
98
+ }
99
+ }
100
+ /**
101
+ * Запускает рассуждение
102
+ * @param {string} reasoningId ID сессии рассуждения
103
+ * @returns {Promise<boolean>} Успешность операции
104
+ */
105
+ async startReasoning(reasoningId) {
106
+ const targetId = reasoningId || this.activeReasoningId;
107
+ if (!targetId) {
108
+ this.logger.error('Попытка запустить рассуждение без указания ID');
109
+ return false;
110
+ }
111
+ try {
112
+ // Отправляем запрос на запуск рассуждения
113
+ const startResult = await this.emitWithAck(websocket_events_constants_js_1.WebSocketEvents.START_REASONING, {
114
+ reasoningId: targetId,
115
+ token: this.options.apiKey
116
+ }, 10000);
117
+ this.logger.debug(`Результат запуска рассуждения ${targetId}`, startResult);
118
+ if (startResult.success !== true) {
119
+ this.logger.error(`Ошибка при запуске рассуждения: ${startResult.error || 'Неизвестная ошибка'}`);
120
+ return false;
121
+ }
122
+ return true;
123
+ }
124
+ catch (error) {
125
+ this.logger.error(`Ошибка при запуске рассуждения ${targetId}`, error);
126
+ return false;
127
+ }
128
+ }
129
+ /**
130
+ * Создает новое рассуждение на сервере
131
+ * @returns {Promise<string>} ID нового рассуждения
132
+ */
133
+ async createNewReasoning() {
134
+ if (!this.isConnected()) {
135
+ this.logger.debug('Подключение к пространству имен рассуждений для создания нового рассуждения');
136
+ const connected = await this.connectToReasoning(false);
137
+ if (!connected) {
138
+ throw new Error('Не удалось подключиться к пространству имен рассуждений');
139
+ }
140
+ }
141
+ this.logger.debug('Отправка запроса на создание нового рассуждения');
142
+ const result = await this.emitWithAck(websocket_events_constants_js_1.WebSocketEvents.CREATE_REASONING, {
143
+ token: this.options.apiKey
144
+ }, 10000);
145
+ if (!result.reasoningId) {
146
+ throw new Error(`Сервер не вернул ID рассуждения: ${JSON.stringify(result)}`);
147
+ }
148
+ // Сохраняем ID нового рассуждения
149
+ this.activeReasoningId = result.reasoningId;
150
+ return result.reasoningId;
151
+ }
152
+ /**
153
+ * Подключается к сессии thinking с расширенными возможностями
154
+ * @param {string} [reasoningId="system"] Идентификатор рассуждения
155
+ * @param {(data: any) => void} [thinkingHandler] Обработчик событий мышления
156
+ * @returns {Promise<string>} Идентификатор сессии рассуждения
157
+ */
158
+ async connectToThinkingSession(reasoningId = "system", thinkingHandler) {
159
+ try {
160
+ // Подключаемся к пространству имен
161
+ const connected = await this.connectToReasoning(false);
162
+ if (!connected) {
163
+ throw new Error('Не удалось подключиться к пространству имен рассуждений');
164
+ }
165
+ // Если reasoningId == "system", сервер заменит его на новый
166
+ // с префиксом "system-". Для получения нового ID нужно подписаться
167
+ // на событие создания рассуждения.
168
+ if (reasoningId === "system") {
169
+ // Будем ждать ответа о создании рассуждения
170
+ const newReasoningId = await this.createNewReasoning();
171
+ this.activeReasoningId = newReasoningId;
172
+ // Отправляем запрос на присоединение к сессии рассуждения
173
+ const joinSuccess = await this.joinReasoning(newReasoningId);
174
+ if (!joinSuccess) {
175
+ throw new Error(`Ошибка при присоединении к сессии рассуждения: ${newReasoningId}`);
176
+ }
177
+ // Отправляем запрос на запуск рассуждения
178
+ const startSuccess = await this.startReasoning(newReasoningId);
179
+ if (!startSuccess) {
180
+ throw new Error(`Ошибка при запуске рассуждения: ${newReasoningId}`);
181
+ }
182
+ // Если передан обработчик событий мышления, подписываемся
183
+ if (thinkingHandler) {
184
+ this.subscribeToThinking(newReasoningId, thinkingHandler);
185
+ }
186
+ return newReasoningId;
187
+ }
188
+ else {
189
+ this.activeReasoningId = reasoningId;
190
+ // Отправляем запрос на присоединение к сессии рассуждения
191
+ const joinSuccess = await this.joinReasoning(reasoningId);
192
+ if (!joinSuccess) {
193
+ throw new Error(`Ошибка при присоединении к сессии рассуждения: ${reasoningId}`);
194
+ }
195
+ // Отправляем запрос на запуск рассуждения
196
+ const startSuccess = await this.startReasoning(reasoningId);
197
+ if (!startSuccess) {
198
+ throw new Error(`Ошибка при запуске рассуждения: ${reasoningId}`);
199
+ }
200
+ // Если передан обработчик событий мышления, подписываемся
201
+ if (thinkingHandler) {
202
+ this.subscribeToThinking(reasoningId, thinkingHandler);
203
+ }
204
+ return reasoningId;
205
+ }
206
+ }
207
+ catch (error) {
208
+ throw new Error(`Ошибка при подключении к сессии thinking: ${error instanceof Error ? error.message : String(error)}`);
209
+ }
210
+ }
211
+ /**
212
+ * Настраивает обработчики событий для стрима от Anthropic
213
+ */
214
+ setupAnthropicStreamHandlers() {
215
+ if (!this.isConnected() || !this.client) {
216
+ this.logger.warn('Попытка настроить обработчики событий Anthropic Stream, но клиент не подключен');
217
+ return;
218
+ }
219
+ // Устанавливаем обработчики для различных событий
220
+ // Обработчик для события начала сообщения
221
+ if (this.callbacks.onMessageStart) {
222
+ this.client.on('message_start', this.callbacks.onMessageStart);
223
+ }
224
+ // Обработчик для события начала блока контента
225
+ this.client.on('content_block_start', (data) => {
226
+ if (data.content_type === 'thinking' && this.callbacks.onThinkingStart) {
227
+ this.callbacks.onThinkingStart(data);
228
+ }
229
+ else if (this.callbacks.onContentStart) {
230
+ this.callbacks.onContentStart(data);
231
+ }
232
+ // Для отладки
233
+ if (this.callbacks.onAny) {
234
+ this.callbacks.onAny('content_block_start', data);
235
+ }
236
+ });
237
+ // Обработчик для события дельты блока контента
238
+ this.client.on('content_block_delta', (data) => {
239
+ if (data.delta.type === 'thinking_delta' && this.callbacks.onThinkingDelta && data.delta.thinking) {
240
+ this.callbacks.onThinkingDelta({
241
+ index: data.index,
242
+ delta: data.delta.thinking
243
+ });
244
+ }
245
+ else if (this.callbacks.onContentDelta) {
246
+ this.callbacks.onContentDelta(data);
247
+ }
248
+ // Для отладки
249
+ if (this.callbacks.onAny) {
250
+ this.callbacks.onAny('content_block_delta', data);
251
+ }
252
+ });
253
+ // Обработчик для события остановки блока контента
254
+ this.client.on('content_block_stop', (data) => {
255
+ if (data.content_type === 'thinking' && this.callbacks.onThinkingStop) {
256
+ this.callbacks.onThinkingStop(data);
257
+ }
258
+ else if (this.callbacks.onContentStop) {
259
+ this.callbacks.onContentStop(data);
260
+ }
261
+ // Для отладки
262
+ if (this.callbacks.onAny) {
263
+ this.callbacks.onAny('content_block_stop', data);
264
+ }
265
+ });
266
+ // Обработчик для события окончания сообщения
267
+ if (this.callbacks.onMessageStop) {
268
+ this.client.on('message_stop', this.callbacks.onMessageStop);
269
+ }
270
+ // Обработчик для события ошибки
271
+ if (this.callbacks.onError) {
272
+ this.client.on('error', this.callbacks.onError);
273
+ }
274
+ }
275
+ /**
276
+ * Подписывается на события мышления
277
+ * @param {string} reasoningId Идентификатор рассуждения
278
+ * @param {Function} handler Обработчик событий мышления
279
+ * @returns {void}
280
+ */
281
+ subscribeToThinking(reasoningId, handler) {
282
+ // Сохраняем обработчик
283
+ this.thinkingEventHandlers.set(reasoningId, handler);
284
+ // Подписываемся на события мышления
285
+ this.on(`thinking:${reasoningId}`, handler);
286
+ // Дублируем подписку для полной совместимости
287
+ this.on(`reasoning:thinking:${reasoningId}`, handler);
288
+ this.logger.debug(`Подписан на события мышления для ${reasoningId}`);
289
+ }
290
+ /**
291
+ * Отписывается от событий мышления
292
+ * @param {string} reasoningId Идентификатор рассуждения
293
+ * @returns {void}
294
+ */
295
+ unsubscribeFromThinking(reasoningId) {
296
+ // Получаем обработчик
297
+ const handler = this.thinkingEventHandlers.get(reasoningId);
298
+ if (handler) {
299
+ // Отписываемся от событий
300
+ this.off(`thinking:${reasoningId}`, handler);
301
+ this.off(`reasoning:thinking:${reasoningId}`, handler);
302
+ // Удаляем обработчик
303
+ this.thinkingEventHandlers.delete(reasoningId);
304
+ this.logger.debug(`Отписан от событий мышления для ${reasoningId}`);
305
+ }
306
+ }
307
+ /**
308
+ * Получает текущий ID активного рассуждения
309
+ * @returns {string | null} ID активного рассуждения или null
310
+ */
311
+ getActiveReasoningId() {
312
+ return this.activeReasoningId;
313
+ }
314
+ /**
315
+ * Устанавливает ID активного рассуждения
316
+ * @param {string} reasoningId ID рассуждения
317
+ * @returns {boolean} Успешность установки
318
+ */
319
+ setActiveReasoningId(reasoningId) {
320
+ if (!reasoningId) {
321
+ this.logger.error('Попытка установить пустой reasoningId');
322
+ return false;
323
+ }
324
+ this.activeReasoningId = reasoningId;
325
+ this.logger.debug(`Установлен активный reasoningId: ${reasoningId}`);
326
+ return true;
327
+ }
328
+ }
329
+ exports.ReasoningWebSocketClient = ReasoningWebSocketClient;
330
+ //# sourceMappingURL=reasoning-ws-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-ws-client.js","sourceRoot":"","sources":["../../../src/ws/reasoning-ws-client.ts"],"names":[],"mappings":"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"}