solver-sdk 2.0.2 → 2.1.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/dist/cjs/api/chat-api/index.js +205 -171
- package/dist/cjs/api/chat-api/index.js.map +1 -1
- package/dist/cjs/api/chat-api/models.js +1 -1
- package/dist/cjs/api/chat-api/stream-utils.js +139 -151
- package/dist/cjs/api/chat-api/stream-utils.js.map +1 -1
- package/dist/cjs/constants/websocket-events.constants.js +1 -1
- package/dist/cjs/constants/websocket-events.constants.js.map +1 -1
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/utils/message-helpers.js +212 -0
- package/dist/cjs/utils/message-helpers.js.map +1 -0
- package/dist/cjs/ws/filesystem-ws-client.js +0 -10
- package/dist/cjs/ws/filesystem-ws-client.js.map +1 -1
- package/dist/esm/api/chat-api/index.js +207 -151
- package/dist/esm/api/chat-api/index.js.map +1 -1
- package/dist/esm/api/chat-api/models.js +1 -1
- package/dist/esm/api/chat-api/stream-utils.js +139 -151
- package/dist/esm/api/chat-api/stream-utils.js.map +1 -1
- package/dist/esm/constants/websocket-events.constants.js +1 -1
- package/dist/esm/constants/websocket-events.constants.js.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/message-helpers.js +199 -0
- package/dist/esm/utils/message-helpers.js.map +1 -0
- package/dist/esm/ws/filesystem-ws-client.js +0 -10
- package/dist/esm/ws/filesystem-ws-client.js.map +1 -1
- package/dist/types/api/chat-api/index.d.ts +23 -8
- package/dist/types/api/chat-api/index.d.ts.map +1 -1
- package/dist/types/api/chat-api/interfaces.d.ts +125 -8
- package/dist/types/api/chat-api/interfaces.d.ts.map +1 -1
- package/dist/types/api/chat-api/models.d.ts +163 -43
- package/dist/types/api/chat-api/models.d.ts.map +1 -1
- package/dist/types/api/chat-api/stream-utils.d.ts +19 -16
- package/dist/types/api/chat-api/stream-utils.d.ts.map +1 -1
- package/dist/types/constants/websocket-events.constants.d.ts +2 -2
- package/dist/types/constants/websocket-events.constants.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/utils/message-helpers.d.ts +84 -0
- package/dist/types/utils/message-helpers.d.ts.map +1 -0
- package/dist/types/ws/filesystem-ws-client.d.ts +0 -2
- package/dist/types/ws/filesystem-ws-client.d.ts.map +1 -1
- package/docs/API_REFERENCE.md +38 -166
- package/docs/AUTHENTICATION.md +37 -59
- package/docs/ERROR_HANDLING.md +124 -191
- package/docs/INTEGRATION_EXAMPLES.md +38 -52
- package/docs/PING_PONG.md +79 -178
- package/docs/README.md +7 -3
- package/docs/WEBSOCKET.md +66 -37
- package/package.json +7 -2
- package/docs/advanced/PING_PONG.md +0 -212
package/docs/ERROR_HANDLING.md
CHANGED
|
@@ -1,240 +1,173 @@
|
|
|
1
|
-
# Обработка ошибок в
|
|
1
|
+
# Обработка ошибок в SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
SDK предоставляет различные механизмы обработки ошибок для HTTP запросов и WebSocket соединений.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Обработка HTTP ошибок
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- [Типы ошибок](#типы-ошибок)
|
|
9
|
-
- [HTTP ошибки](#http-ошибки)
|
|
10
|
-
- [WebSocket ошибки](#websocket-ошибки)
|
|
11
|
-
- [Ошибки географических ограничений](#ошибки-географических-ограничений)
|
|
12
|
-
- [Примеры обработки ошибок](#примеры-обработки-ошибок)
|
|
7
|
+
### Использование try/catch
|
|
13
8
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Solver SDK использует следующие принципы при работе с ошибками:
|
|
17
|
-
|
|
18
|
-
1. **Унифицированный формат** — все ошибки имеют единую структуру
|
|
19
|
-
2. **Информативные сообщения** — ошибки содержат детальное описание проблемы
|
|
20
|
-
3. **Коды ошибок** — каждая ошибка имеет уникальный код для идентификации
|
|
21
|
-
4. **Типизация** — ошибки классифицируются по типам для удобной обработки
|
|
22
|
-
|
|
23
|
-
## Типы ошибок
|
|
24
|
-
|
|
25
|
-
Основные типы ошибок в SDK:
|
|
26
|
-
|
|
27
|
-
| Тип ошибки | Описание |
|
|
28
|
-
|------------|----------|
|
|
29
|
-
| `http_error` | Ошибки HTTP запросов |
|
|
30
|
-
| `websocket_error` | Ошибки WebSocket соединений |
|
|
31
|
-
| `validation_error` | Ошибки валидации входных данных |
|
|
32
|
-
| `authentication_error` | Ошибки аутентификации |
|
|
33
|
-
| `rate_limit_error` | Ошибки превышения лимита запросов |
|
|
34
|
-
| `provider_error` | Ошибки провайдеров API (Anthropic, OpenAI) |
|
|
35
|
-
| `geo_restriction` | Ошибки географических ограничений |
|
|
36
|
-
|
|
37
|
-
## HTTP ошибки
|
|
38
|
-
|
|
39
|
-
HTTP ошибки возникают при проблемах с HTTP запросами:
|
|
9
|
+
Рекомендуемый способ обработки ошибок - использование конструкции `try/catch`:
|
|
40
10
|
|
|
41
11
|
```javascript
|
|
42
12
|
try {
|
|
43
|
-
|
|
13
|
+
// Выполнение запроса
|
|
14
|
+
const projects = await sdk.projects.getAllProjects();
|
|
15
|
+
console.log('Получено проектов:', projects.length);
|
|
44
16
|
} catch (error) {
|
|
45
|
-
console.error(
|
|
46
|
-
console.error(`Сообщение: ${error.message}`);
|
|
17
|
+
console.error('Ошибка при получении проектов:', error);
|
|
47
18
|
|
|
48
|
-
//
|
|
49
|
-
if (error.
|
|
50
|
-
console.error('Ошибка
|
|
51
|
-
} else if (error.
|
|
52
|
-
console.error('
|
|
19
|
+
// Можно проверить тип ошибки
|
|
20
|
+
if (error.status === 401) {
|
|
21
|
+
console.error('Ошибка авторизации. Проверьте API ключ.');
|
|
22
|
+
} else if (error.status === 404) {
|
|
23
|
+
console.error('Ресурс не найден.');
|
|
24
|
+
} else if (error.code === 'NETWORK_ERROR') {
|
|
25
|
+
console.error('Проблема с сетевым соединением.');
|
|
53
26
|
}
|
|
54
27
|
}
|
|
55
28
|
```
|
|
56
29
|
|
|
57
|
-
|
|
30
|
+
### Глобальный обработчик ошибок
|
|
58
31
|
|
|
59
|
-
|
|
32
|
+
Можно установить глобальный обработчик ошибок SDK:
|
|
60
33
|
|
|
61
34
|
```javascript
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
break;
|
|
71
|
-
case 'authentication_error':
|
|
72
|
-
console.error('Проблема аутентификации, запрашиваем новый токен...');
|
|
73
|
-
break;
|
|
74
|
-
case 'timeout_error':
|
|
75
|
-
console.error('Превышен таймаут ожидания ответа');
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
// Передаем обработчик событий
|
|
82
|
-
await sdk.chat.streamChatWithThinking(messages, options, handleEvent);
|
|
35
|
+
// Установка глобального обработчика
|
|
36
|
+
CodeSolverSDK.setErrorHandler((error) => {
|
|
37
|
+
console.error('Глобальная ошибка SDK:', error);
|
|
38
|
+
// Отправка информации об ошибке в мониторинг
|
|
39
|
+
sendToMonitoring(error);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// После этого необработанные ошибки SDK будут передаваться в этот обработчик
|
|
83
43
|
```
|
|
84
44
|
|
|
85
|
-
##
|
|
45
|
+
## Обработка ошибок WebSocket
|
|
46
|
+
|
|
47
|
+
### Обработка событий ошибок
|
|
48
|
+
|
|
49
|
+
SDK позволяет подписаться на события ошибок для различных API:
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
// Для индексации проектов
|
|
53
|
+
sdk.projects.on('error', (error) => {
|
|
54
|
+
console.error('Ошибка индексации:', error);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Для рассуждений
|
|
58
|
+
sdk.reasoning.on('error', (error) => {
|
|
59
|
+
console.error('Ошибка рассуждения:', error);
|
|
60
|
+
});
|
|
61
|
+
```
|
|
86
62
|
|
|
87
|
-
|
|
63
|
+
### Обработка ошибок соединения
|
|
88
64
|
|
|
89
|
-
|
|
65
|
+
При использовании высокоуровневых методов подключения можно обрабатывать ошибки соединения:
|
|
90
66
|
|
|
91
67
|
```javascript
|
|
92
68
|
try {
|
|
93
|
-
|
|
69
|
+
// Попытка подключения к WebSocket
|
|
70
|
+
await sdk.connect();
|
|
71
|
+
console.log('Подключение установлено');
|
|
94
72
|
} catch (error) {
|
|
95
|
-
|
|
96
|
-
if (error.type === 'geo_restriction') {
|
|
97
|
-
console.error('==============================================');
|
|
98
|
-
console.error('⚠️ ОШИБКА ГЕОГРАФИЧЕСКОГО ОГРАНИЧЕНИЯ API ANTHROPIC');
|
|
99
|
-
console.error('⚠️ Для работы с API Anthropic требуется VPN или прокси');
|
|
100
|
-
console.error('⚠️ Anthropic API доступен только из определенных регионов');
|
|
101
|
-
console.error('==============================================');
|
|
102
|
-
|
|
103
|
-
// Возможные действия:
|
|
104
|
-
// 1. Предложить пользователю включить VPN
|
|
105
|
-
// 2. Переключиться на другой провайдер API
|
|
106
|
-
// 3. Использовать прокси-сервер
|
|
107
|
-
}
|
|
73
|
+
console.error('Ошибка подключения:', error);
|
|
108
74
|
}
|
|
109
75
|
```
|
|
110
76
|
|
|
111
|
-
|
|
77
|
+
### Автоматическое переподключение
|
|
78
|
+
|
|
79
|
+
SDK поддерживает автоматическое переподключение в случае разрыва соединения:
|
|
112
80
|
|
|
113
81
|
```javascript
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
//
|
|
82
|
+
const sdk = new CodeSolverSDK({
|
|
83
|
+
baseURL: 'https://api.example.com',
|
|
84
|
+
apiKey: 'your-api-key',
|
|
85
|
+
websocket: {
|
|
86
|
+
reconnect: true, // Включить автоматическое переподключение
|
|
87
|
+
reconnectAttempts: 5, // Максимальное число попыток
|
|
88
|
+
reconnectDelay: 3000 // Задержка между попытками (мс)
|
|
119
89
|
}
|
|
120
|
-
};
|
|
90
|
+
});
|
|
121
91
|
```
|
|
122
92
|
|
|
123
|
-
|
|
93
|
+
## Типичные ошибки и их решения
|
|
124
94
|
|
|
125
|
-
|
|
95
|
+
### Ошибки подключения
|
|
126
96
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
97
|
+
| Код ошибки | Описание | Решение |
|
|
98
|
+
|------------|----------|---------|
|
|
99
|
+
| `NETWORK_ERROR` | Ошибка сети | Проверьте подключение к Интернету |
|
|
100
|
+
| `ETIMEDOUT` | Таймаут соединения | Увеличьте значение `timeout` в настройках SDK |
|
|
101
|
+
| `CONNECTION_REFUSED` | Соединение отклонено | Проверьте правильность URL и доступность сервера |
|
|
102
|
+
| `CERT_ERROR` | Ошибка сертификата | Используйте параметр `rejectUnauthorized: false` для локальной разработки |
|
|
130
103
|
|
|
131
|
-
###
|
|
104
|
+
### Ошибки аутентификации
|
|
132
105
|
|
|
133
|
-
|
|
106
|
+
| Код ошибки | Описание | Решение |
|
|
107
|
+
|------------|----------|---------|
|
|
108
|
+
| `401 Unauthorized` | Неверный API ключ | Проверьте правильность API ключа |
|
|
109
|
+
| `403 Forbidden` | Недостаточно прав | Проверьте права доступа для API ключа |
|
|
110
|
+
| `AUTH_EXPIRED` | Срок действия токена истек | Обновите API ключ |
|
|
134
111
|
|
|
135
|
-
|
|
136
|
-
2. **Прокси-сервер** — настройте прокси для запросов к API
|
|
137
|
-
3. **Альтернативные провайдеры** — используйте альтернативных провайдеров, доступных в вашем регионе
|
|
112
|
+
### Ошибки индексации
|
|
138
113
|
|
|
139
|
-
|
|
114
|
+
| Код ошибки | Описание | Решение |
|
|
115
|
+
|------------|----------|---------|
|
|
116
|
+
| `PROJECT_NOT_FOUND` | Проект не найден | Проверьте ID проекта |
|
|
117
|
+
| `INDEXING_IN_PROGRESS` | Индексация уже выполняется | Дождитесь завершения текущей индексации |
|
|
118
|
+
| `INDEXING_ERROR` | Ошибка во время индексации | Проверьте лог ошибок на сервере |
|
|
140
119
|
|
|
141
|
-
|
|
120
|
+
## Пример комплексной обработки ошибок
|
|
142
121
|
|
|
143
122
|
```javascript
|
|
144
|
-
async function
|
|
145
|
-
const sdk = new CodeSolverSDK({
|
|
146
|
-
baseURL: 'https://api.example.com',
|
|
147
|
-
apiKey: 'your-api-key'
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
const messages = [
|
|
151
|
-
{ role: 'user', content: 'Explain quantum computing' }
|
|
152
|
-
];
|
|
153
|
-
|
|
154
|
-
const options = {
|
|
155
|
-
model: 'claude-3-7-sonnet-20240229',
|
|
156
|
-
thinking: true,
|
|
157
|
-
authToken: 'your-auth-token'
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
// Обработчик WebSocket событий
|
|
161
|
-
const handleEvent = (eventType, data) => {
|
|
162
|
-
// Обработка ошибок
|
|
163
|
-
if (eventType === 'error') {
|
|
164
|
-
console.error(`Ошибка: ${data.message}`);
|
|
165
|
-
|
|
166
|
-
// Проверка типа ошибки
|
|
167
|
-
switch (data.type) {
|
|
168
|
-
case 'geo_restriction':
|
|
169
|
-
console.error('Географическое ограничение: требуется VPN');
|
|
170
|
-
break;
|
|
171
|
-
case 'authentication_error':
|
|
172
|
-
console.error('Ошибка аутентификации: неверный токен');
|
|
173
|
-
break;
|
|
174
|
-
case 'rate_limit_error':
|
|
175
|
-
console.error('Превышен лимит запросов');
|
|
176
|
-
break;
|
|
177
|
-
default:
|
|
178
|
-
console.error(`Неизвестная ошибка типа: ${data.type}`);
|
|
179
|
-
break;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
|
|
123
|
+
async function initializeSDK() {
|
|
184
124
|
try {
|
|
185
|
-
|
|
186
|
-
|
|
125
|
+
// Проверка доступности API
|
|
126
|
+
const isHealthy = await sdk.checkHealth();
|
|
127
|
+
|
|
128
|
+
if (!isHealthy) {
|
|
129
|
+
console.error('API недоступен, пробуем резервный сервер');
|
|
130
|
+
// Создаем новый экземпляр SDK с резервным URL
|
|
131
|
+
return new CodeSolverSDK({
|
|
132
|
+
baseURL: 'https://backup-api.example.com',
|
|
133
|
+
apiKey: 'your-api-key'
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Подключение к WebSocket
|
|
138
|
+
await sdk.connect();
|
|
139
|
+
console.log('SDK успешно инициализирован');
|
|
140
|
+
|
|
141
|
+
return sdk;
|
|
187
142
|
} catch (error) {
|
|
188
|
-
console.error(
|
|
143
|
+
console.error('Ошибка при инициализации SDK:', error);
|
|
144
|
+
|
|
145
|
+
// Логирование ошибки для отладки
|
|
146
|
+
logError('SDK_INIT_ERROR', error);
|
|
189
147
|
|
|
190
|
-
//
|
|
191
|
-
if (error.
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
scheduleRetry(5000); // Запланировать повторную попытку через 5 секунд
|
|
195
|
-
} else {
|
|
196
|
-
reportError(error); // Отправить отчет об ошибке
|
|
148
|
+
// В зависимости от ошибки предпринимаем разные действия
|
|
149
|
+
if (error.code === 'CONNECTION_ERROR') {
|
|
150
|
+
console.warn('Продолжаем работу без WebSocket подключения');
|
|
151
|
+
return sdk; // Возвращаем SDK, но без WebSocket функциональности
|
|
197
152
|
}
|
|
153
|
+
|
|
154
|
+
// Для критических ошибок выбрасываем исключение
|
|
155
|
+
throw new Error(`Не удалось инициализировать SDK: ${error.message}`);
|
|
198
156
|
}
|
|
199
157
|
}
|
|
200
|
-
```
|
|
201
158
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
const reasoning = await sdk.reasoning.createReasoning({
|
|
208
|
-
projectId: 'project-123',
|
|
209
|
-
query: 'Analyze this codebase'
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
// Подключение WebSocket
|
|
213
|
-
await sdk.reasoning.connectWebSocket({
|
|
214
|
-
reasoningId: reasoning.id,
|
|
215
|
-
authToken: 'your-auth-token',
|
|
216
|
-
onError: (error) => {
|
|
217
|
-
console.error(`WebSocket ошибка: ${error.message}`);
|
|
218
|
-
|
|
219
|
-
if (error.type === 'geo_restriction') {
|
|
220
|
-
// Показать сообщение о необходимости VPN
|
|
221
|
-
showVpnAlert();
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
});
|
|
159
|
+
// Использование
|
|
160
|
+
const sdk = await initializeSDK().catch(error => {
|
|
161
|
+
console.error('Критическая ошибка:', error);
|
|
162
|
+
// Показываем пользователю сообщение об ошибке
|
|
163
|
+
showErrorMessage('Не удалось подключиться к серверу');
|
|
225
164
|
|
|
226
|
-
//
|
|
227
|
-
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
//
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
} else if (error.status === 403) {
|
|
236
|
-
// Показать сообщение об отсутствии доступа
|
|
237
|
-
showAccessDeniedMessage();
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
```
|
|
165
|
+
// Возвращаем отключенную версию SDK или null
|
|
166
|
+
return null;
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
if (sdk) {
|
|
170
|
+
// Продолжаем работу с SDK
|
|
171
|
+
} else {
|
|
172
|
+
// Работаем в режиме ограниченной функциональности
|
|
173
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Примеры интеграции
|
|
1
|
+
# Примеры интеграции SDK
|
|
2
2
|
|
|
3
|
-
В этом документе приведены примеры использования SDK с VS Code или
|
|
3
|
+
В этом документе приведены примеры использования SDK с расширениями VS Code/Cursor или другими приложениями.
|
|
4
4
|
|
|
5
5
|
## Содержание
|
|
6
6
|
- [Инициализация SDK](#инициализация-sdk)
|
|
@@ -179,6 +179,18 @@ context.subscriptions.push(
|
|
|
179
179
|
<div class="thinking" id="thinking"></div>
|
|
180
180
|
<h4>Ответ:</h4>
|
|
181
181
|
<div class="answer" id="answer"></div>
|
|
182
|
+
|
|
183
|
+
<script>
|
|
184
|
+
const vscode = acquireVsCodeApi();
|
|
185
|
+
window.addEventListener('message', event => {
|
|
186
|
+
const message = event.data;
|
|
187
|
+
if (message.command === 'appendThinking') {
|
|
188
|
+
document.getElementById('thinking').textContent += message.content;
|
|
189
|
+
} else if (message.command === 'appendAnswer') {
|
|
190
|
+
document.getElementById('answer').textContent += message.content;
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
</script>
|
|
182
194
|
</body>
|
|
183
195
|
</html>
|
|
184
196
|
`;
|
|
@@ -219,18 +231,6 @@ context.subscriptions.push(
|
|
|
219
231
|
handleEvent
|
|
220
232
|
);
|
|
221
233
|
|
|
222
|
-
// Настраиваем обработку сообщений в WebView
|
|
223
|
-
panel.webview.onDidReceiveMessage(message => {
|
|
224
|
-
const thinkingElement = document.getElementById('thinking');
|
|
225
|
-
const answerElement = document.getElementById('answer');
|
|
226
|
-
|
|
227
|
-
if (message.command === 'appendThinking') {
|
|
228
|
-
thinkingElement.textContent += message.content;
|
|
229
|
-
} else if (message.command === 'appendAnswer') {
|
|
230
|
-
answerElement.textContent += message.content;
|
|
231
|
-
}
|
|
232
|
-
});
|
|
233
|
-
|
|
234
234
|
} catch (error) {
|
|
235
235
|
vscode.window.showErrorMessage(`Ошибка чата: ${error.message}`);
|
|
236
236
|
}
|
|
@@ -273,6 +273,16 @@ async function searchInProject(projectId, query) {
|
|
|
273
273
|
);
|
|
274
274
|
|
|
275
275
|
// Формируем HTML для отображения результатов
|
|
276
|
+
let resultsHtml = '';
|
|
277
|
+
results.results.forEach((result, index) => {
|
|
278
|
+
resultsHtml += `
|
|
279
|
+
<div class="result">
|
|
280
|
+
<div class="path" data-path="${result.path}">${result.path}</div>
|
|
281
|
+
<div class="snippet">${result.content || 'Содержимое недоступно'}</div>
|
|
282
|
+
</div>
|
|
283
|
+
`;
|
|
284
|
+
});
|
|
285
|
+
|
|
276
286
|
panel.webview.html = `
|
|
277
287
|
<!DOCTYPE html>
|
|
278
288
|
<html>
|
|
@@ -286,25 +296,15 @@ async function searchInProject(projectId, query) {
|
|
|
286
296
|
</head>
|
|
287
297
|
<body>
|
|
288
298
|
<h3>Результаты для: ${query}</h3>
|
|
289
|
-
${
|
|
290
|
-
<div class="result">
|
|
291
|
-
<div class="path" data-path="${result.filePath}" data-start="${result.startLine}" data-end="${result.endLine}">
|
|
292
|
-
${result.filePath}:${result.startLine}-${result.endLine}
|
|
293
|
-
</div>
|
|
294
|
-
<div class="snippet">${result.snippet || result.content || ''}</div>
|
|
295
|
-
</div>
|
|
296
|
-
`).join('')}
|
|
299
|
+
${resultsHtml}
|
|
297
300
|
|
|
298
301
|
<script>
|
|
299
|
-
|
|
300
|
-
document.querySelectorAll('.path').forEach(
|
|
301
|
-
|
|
302
|
-
const vscode = acquireVsCodeApi();
|
|
302
|
+
const vscode = acquireVsCodeApi();
|
|
303
|
+
document.querySelectorAll('.path').forEach(element => {
|
|
304
|
+
element.addEventListener('click', () => {
|
|
303
305
|
vscode.postMessage({
|
|
304
306
|
command: 'openFile',
|
|
305
|
-
|
|
306
|
-
startLine: parseInt(elem.dataset.start),
|
|
307
|
-
endLine: parseInt(elem.dataset.end)
|
|
307
|
+
path: element.getAttribute('data-path')
|
|
308
308
|
});
|
|
309
309
|
});
|
|
310
310
|
});
|
|
@@ -313,30 +313,16 @@ async function searchInProject(projectId, query) {
|
|
|
313
313
|
</html>
|
|
314
314
|
`;
|
|
315
315
|
|
|
316
|
-
//
|
|
317
|
-
panel.webview.onDidReceiveMessage(
|
|
318
|
-
message
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
new vscode.Position(message.startLine - 1, 0),
|
|
325
|
-
new vscode.Position(message.endLine - 1, 0)
|
|
326
|
-
);
|
|
327
|
-
editor.revealRange(range);
|
|
328
|
-
});
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
},
|
|
332
|
-
undefined,
|
|
333
|
-
context.subscriptions
|
|
334
|
-
);
|
|
335
|
-
|
|
336
|
-
return results;
|
|
316
|
+
// Обработчик сообщений от WebView
|
|
317
|
+
panel.webview.onDidReceiveMessage(message => {
|
|
318
|
+
if (message.command === 'openFile') {
|
|
319
|
+
const filePath = message.path;
|
|
320
|
+
vscode.workspace.openTextDocument(filePath)
|
|
321
|
+
.then(doc => vscode.window.showTextDocument(doc));
|
|
322
|
+
}
|
|
323
|
+
});
|
|
337
324
|
});
|
|
338
325
|
} catch (error) {
|
|
339
326
|
vscode.window.showErrorMessage(`Ошибка поиска: ${error.message}`);
|
|
340
327
|
}
|
|
341
|
-
}
|
|
342
|
-
```
|
|
328
|
+
}
|