solver-sdk 7.1.3 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +257 -409
- package/dist/cjs/api/auth-api.js +93 -0
- package/dist/cjs/api/auth-api.js.map +1 -0
- package/dist/cjs/code-solver-sdk.js +25 -8
- package/dist/cjs/code-solver-sdk.js.map +1 -1
- package/dist/esm/api/auth-api.js +89 -0
- package/dist/esm/api/auth-api.js.map +1 -0
- package/dist/esm/code-solver-sdk.js +25 -8
- package/dist/esm/code-solver-sdk.js.map +1 -1
- package/dist/types/api/auth-api.d.ts +84 -0
- package/dist/types/api/auth-api.d.ts.map +1 -0
- package/dist/types/code-solver-sdk.d.ts +23 -1
- package/dist/types/code-solver-sdk.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,535 +1,383 @@
|
|
|
1
|
-
# Code Solver SDK v7.
|
|
1
|
+
# Code Solver SDK v7.3.0
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
AI-powered code analysis SDK. 100% typed, production ready.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Install
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
**Работа с проектами:**
|
|
11
|
-
- [Индексация](#индексация-проекта) • [Real-time прогресс](#websocket-api-sdkprojectsync) • [Recovery](#session-recovery)
|
|
7
|
+
```bash
|
|
8
|
+
npm install solver-sdk@7.3.0
|
|
9
|
+
```
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
- [Ключевые типы](#-ключевые-типы-данных) • [Решение проблем](#-быстрое-решение-проблем) • [API Reference](#-api-reference-подробно)
|
|
11
|
+
## Quick Start
|
|
15
12
|
|
|
16
|
-
|
|
13
|
+
```typescript
|
|
14
|
+
import { CodeSolverSDK } from 'solver-sdk';
|
|
17
15
|
|
|
18
|
-
|
|
16
|
+
const sdk = await CodeSolverSDK.create({
|
|
17
|
+
baseURL: 'https://api.example.com',
|
|
18
|
+
getAuthToken: async () => getToken()
|
|
19
|
+
});
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
// Projects
|
|
22
|
+
const projects = await sdk.projects.getAllProjects();
|
|
23
|
+
await sdk.projects.createProject('MyProject');
|
|
21
24
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
// Chat with Thinking
|
|
26
|
+
const response = await sdk.chat.chat([
|
|
27
|
+
{ role: 'user', content: 'explain this code' }
|
|
28
|
+
], { thinking: { type: 'enabled', budget_tokens: 10000 } });
|
|
25
29
|
|
|
26
|
-
|
|
30
|
+
// Search
|
|
31
|
+
const results = await sdk.search.searchCode({
|
|
32
|
+
projectId,
|
|
33
|
+
query: 'authentication function'
|
|
34
|
+
});
|
|
27
35
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
//npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN
|
|
32
|
-
@androidsprintteam:registry=https://npm.pkg.github.com
|
|
33
|
-
always-auth=true
|
|
34
|
-
EOF
|
|
35
|
-
|
|
36
|
-
# 2. Установи SDK
|
|
37
|
-
npm install @androidsprintteam/solver-sdk
|
|
36
|
+
// User & Updates
|
|
37
|
+
const profile = await sdk.user.getProfile();
|
|
38
|
+
const update = await sdk.updates.checkForUpdates({...});
|
|
38
39
|
```
|
|
39
40
|
|
|
40
|
-
|
|
41
|
+
## API Overview
|
|
41
42
|
|
|
42
|
-
|
|
43
|
+
| Feature | Methods | Status |
|
|
44
|
+
|---------|---------|--------|
|
|
45
|
+
| **Projects** | 19 | ✅ Full CRUD + state |
|
|
46
|
+
| **Delta Chunking** | 7 | ✅ Encrypted sync |
|
|
47
|
+
| **Chat** | 12 | ✅ Streaming + Extended Thinking |
|
|
48
|
+
| **Search** | 4 | ✅ Vector-based |
|
|
49
|
+
| **Tools** | 5 | ✅ AI tool schemas |
|
|
50
|
+
| **Models** | 5 | ✅ Provider info |
|
|
51
|
+
| **Updates** | 5 | ✅ Auto-check + changelog |
|
|
52
|
+
| **User** | 1 | ✅ Profile |
|
|
53
|
+
| **Auth** | 2 | ✅ Token revocation + logout |
|
|
43
54
|
|
|
44
|
-
##
|
|
55
|
+
## Auth
|
|
45
56
|
|
|
46
|
-
### Локальная разработка
|
|
47
57
|
```typescript
|
|
48
|
-
|
|
49
|
-
|
|
58
|
+
// Local dev
|
|
50
59
|
const sdk = await CodeSolverSDK.create({
|
|
51
60
|
baseURL: 'http://localhost:3000',
|
|
52
|
-
|
|
61
|
+
getAuthToken: async () => 'your-token'
|
|
53
62
|
});
|
|
54
|
-
```
|
|
55
63
|
|
|
56
|
-
|
|
57
|
-
```typescript
|
|
58
|
-
const sdk = await CodeSolverSDK.create({
|
|
59
|
-
baseURL: 'https://workai.su/api/v1',
|
|
60
|
-
headers: { Authorization: `Bearer ${oauth_token}` },
|
|
61
|
-
webSocket: { enabled: true }
|
|
62
|
-
});
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### 🔑 Динамическое обновление токена (v6.1.4+)
|
|
66
|
-
```typescript
|
|
64
|
+
// Production with token refresh
|
|
67
65
|
const sdk = await CodeSolverSDK.create({
|
|
68
|
-
baseURL: 'https://
|
|
66
|
+
baseURL: 'https://api.example.com',
|
|
69
67
|
getAuthToken: async () => {
|
|
70
|
-
if (
|
|
71
|
-
await
|
|
68
|
+
if (isTokenExpired()) {
|
|
69
|
+
await refreshToken();
|
|
72
70
|
}
|
|
73
|
-
return
|
|
71
|
+
return getToken();
|
|
74
72
|
}
|
|
75
73
|
});
|
|
76
74
|
```
|
|
77
75
|
|
|
78
|
-
##
|
|
79
|
-
|
|
80
|
-
| Задача | Метод | Назначение |
|
|
81
|
-
|--------|-------|------------|
|
|
82
|
-
| **Индексация** |
|
|
83
|
-
| Синхронизировать проект | `sdk.deltaManager.syncEncryptedChunks(projectId, chunks, rootHash)` | Единственный способ индексации |
|
|
84
|
-
| Проверить статус | `sdk.projects.getProjectState(projectId, clientRootHash?)` | Получить состояние + totalFiles |
|
|
85
|
-
| Проверить recovery | `sdk.projects.getRecoveryStatus(projectId)` | Нужно ли возобновить прерванную синхронизацию |
|
|
86
|
-
| Возобновить синхронизацию | `sdk.projects.resumeSync(projectId)` | Продолжить прерванную индексацию |
|
|
87
|
-
| **Real-time прогресс** |
|
|
88
|
-
| Подключить WebSocket | `await sdk.connectWebSocket()` | Для live обновлений |
|
|
89
|
-
| Подписаться на проект | `sdk.projectSync.subscribeToProject(projectId)` | Получать события по проекту |
|
|
90
|
-
| Прогресс индексации | `sdk.projectSync.on('sync-progress', callback)` | `data.processedFiles / data.totalFiles` |
|
|
91
|
-
| Завершение индексации | `sdk.projectSync.on('sync-completed', callback)` | `data.statistics.totalFiles` |
|
|
92
|
-
| **Проекты** |
|
|
93
|
-
| Получить все проекты | `sdk.projects.getAllProjects()` | Список всех проектов |
|
|
94
|
-
| Найти или создать | `sdk.projects.findOrCreateProject(name)` | Idempotent создание |
|
|
95
|
-
| Получить проект | `sdk.projects.getProject(projectId)` | Детали проекта |
|
|
96
|
-
| **Поиск** |
|
|
97
|
-
| Поиск по коду | `sdk.search.searchCode(projectId, query)` | Semantic search с reranker |
|
|
98
|
-
| Поиск функций | `sdk.search.searchFunctions(projectId, query)` | Только функции/методы |
|
|
99
|
-
| **Чат** |
|
|
100
|
-
| Streaming чат | `sdk.chat.streamChat(messages, options)` | AsyncGenerator chunks |
|
|
101
|
-
| Обычный чат | `sdk.chat.chat(messages, options)` | Promise response |
|
|
102
|
-
|
|
103
|
-
## 📖 API Reference (подробно)
|
|
104
|
-
|
|
105
|
-
<details>
|
|
106
|
-
<summary><b>Projects API</b> (<code>sdk.projects</code>) - управление проектами</summary>
|
|
76
|
+
## WebSocket (Real-time)
|
|
107
77
|
|
|
108
78
|
```typescript
|
|
109
|
-
//
|
|
110
|
-
|
|
111
|
-
getProject(projectId: string): Promise<Project>
|
|
112
|
-
findOrCreateProject(projectName: string): Promise<Project>
|
|
113
|
-
|
|
114
|
-
// Индексация
|
|
115
|
-
getProjectState(projectId: string, clientRootHash?: string): Promise<ProjectState>
|
|
116
|
-
getIndexingStatus(projectId: string): Promise<any>
|
|
117
|
-
|
|
118
|
-
// Recovery
|
|
119
|
-
getRecoveryStatus(projectId: string): Promise<any>
|
|
120
|
-
resumeSync(projectId: string, options?: any): Promise<any>
|
|
121
|
-
cancelRecovery(projectId: string): Promise<any>
|
|
122
|
-
```
|
|
79
|
+
// Connect
|
|
80
|
+
await sdk.connectWebSocket();
|
|
123
81
|
|
|
124
|
-
|
|
82
|
+
// Subscribe to project
|
|
83
|
+
sdk.projectSync.subscribeToProject(projectId);
|
|
125
84
|
|
|
126
|
-
|
|
127
|
-
|
|
85
|
+
// Listen for updates
|
|
86
|
+
sdk.projectSync.on('sync-progress', (data) => {
|
|
87
|
+
console.log(`Progress: ${data.processedFiles}/${data.totalFiles}`);
|
|
88
|
+
});
|
|
128
89
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
projectId: string,
|
|
133
|
-
encryptedChunks: any[],
|
|
134
|
-
rootHash: string,
|
|
135
|
-
options?: { batchSize?: number; onProgress?: (current, total) => void }
|
|
136
|
-
): Promise<any>
|
|
137
|
-
|
|
138
|
-
// Вспомогательные
|
|
139
|
-
getSyncStatus(projectId: string): Promise<SyncStatus>
|
|
140
|
-
cancelSync(projectId: string): Promise<boolean>
|
|
141
|
-
cleanupDeletedFiles(projectId: string, activeFiles: any[]): Promise<any>
|
|
90
|
+
sdk.projectSync.on('sync-completed', (data) => {
|
|
91
|
+
console.log(`Done: ${data.statistics.totalFiles} files`);
|
|
92
|
+
});
|
|
142
93
|
```
|
|
143
94
|
|
|
144
|
-
|
|
95
|
+
## Error Handling
|
|
145
96
|
|
|
146
|
-
|
|
147
|
-
<summary><b>Search API</b> (<code>sdk.search</code>) - поиск по коду</summary>
|
|
97
|
+
By default, 401/403 auth errors return `null` instead of throwing:
|
|
148
98
|
|
|
149
99
|
```typescript
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
100
|
+
const projects = await sdk.projects.getAllProjects();
|
|
101
|
+
if (!projects) {
|
|
102
|
+
// Token expired - refresh and retry
|
|
103
|
+
await refreshToken();
|
|
104
|
+
}
|
|
154
105
|
|
|
155
|
-
|
|
106
|
+
// To throw errors instead:
|
|
107
|
+
const sdk = await CodeSolverSDK.create({
|
|
108
|
+
suppressAuthErrors: false
|
|
109
|
+
});
|
|
110
|
+
```
|
|
156
111
|
|
|
157
|
-
|
|
158
|
-
<summary><b>Chat API</b> (<code>sdk.chat</code>) - AI чат</summary>
|
|
112
|
+
## Types
|
|
159
113
|
|
|
160
114
|
```typescript
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
115
|
+
import {
|
|
116
|
+
ChatMessage,
|
|
117
|
+
ChatOptions,
|
|
118
|
+
Project,
|
|
119
|
+
ProjectState,
|
|
120
|
+
SearchResult,
|
|
121
|
+
UserProfile
|
|
122
|
+
} from 'solver-sdk';
|
|
167
123
|
```
|
|
168
124
|
|
|
169
|
-
|
|
125
|
+
## Debug
|
|
170
126
|
|
|
171
|
-
### WebSocket API (`sdk.projectSync`)
|
|
172
127
|
```typescript
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
sdk.isWebSocketConnected
|
|
177
|
-
|
|
178
|
-
// Подписка
|
|
179
|
-
sdk.projectSync.subscribeToProject(projectId)
|
|
180
|
-
sdk.projectSync.unsubscribeFromProject(projectId)
|
|
181
|
-
|
|
182
|
-
// События
|
|
183
|
-
sdk.projectSync.on('sync-status-update', callback) // {projectId, status, timestamp}
|
|
184
|
-
sdk.projectSync.on('sync-progress', callback) // {projectId, progress, processedFiles, totalFiles}
|
|
185
|
-
sdk.projectSync.on('sync-completed', callback) // {projectId, processedChunks, statistics}
|
|
186
|
-
sdk.projectSync.on('sync-error', callback) // {projectId, error, timestamp}
|
|
187
|
-
|
|
188
|
-
// Пример: Cursor-like прогресс по файлам (v7.1.1+)
|
|
189
|
-
sdk.projectSync.on('sync-progress', (data) => {
|
|
190
|
-
if (data.totalFiles && data.processedFiles) {
|
|
191
|
-
// User-friendly: "450 of 722 files"
|
|
192
|
-
console.log(`${data.processedFiles}/${data.totalFiles} files (${data.progress}%)`);
|
|
193
|
-
updateUI(data.processedFiles, data.totalFiles, data.progress);
|
|
194
|
-
} else {
|
|
195
|
-
// Fallback: chunks (для старых версий backend)
|
|
196
|
-
console.log(`${data.currentChunk}/${data.totalChunks} chunks`);
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
sdk.projectSync.on('sync-completed', (data) => {
|
|
201
|
-
const files = data.statistics?.totalFiles || 0;
|
|
202
|
-
console.log(`Indexed ${files} files in ${data.duration}ms`);
|
|
128
|
+
const sdk = await CodeSolverSDK.create({
|
|
129
|
+
debug: 'verbose', // silent | error | warn | info | debug | verbose
|
|
130
|
+
webSocket: { debug: true }
|
|
203
131
|
});
|
|
204
132
|
```
|
|
205
133
|
|
|
206
|
-
##
|
|
134
|
+
## Delta Chunking (Indexing)
|
|
207
135
|
|
|
208
|
-
### Индексация проекта
|
|
209
136
|
```typescript
|
|
210
|
-
// ✅
|
|
137
|
+
// ✅ Main indexing method
|
|
211
138
|
await sdk.deltaManager.syncEncryptedChunks(projectId, chunks, rootHash, {
|
|
212
139
|
batchSize: 50,
|
|
213
140
|
onProgress: (current, total) => console.log(`${current}/${total}`)
|
|
214
141
|
});
|
|
215
142
|
|
|
216
|
-
//
|
|
217
|
-
|
|
143
|
+
// Check sync status
|
|
144
|
+
const state = await sdk.projects.getProjectState(projectId, clientRootHash);
|
|
145
|
+
if (state.syncRequired) {
|
|
146
|
+
// Needs sync
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Cancel ongoing sync
|
|
150
|
+
await sdk.deltaManager.cancelSync(projectId);
|
|
218
151
|
```
|
|
219
152
|
|
|
220
|
-
|
|
153
|
+
## Session Recovery
|
|
221
154
|
|
|
222
|
-
### Session Recovery
|
|
223
155
|
```typescript
|
|
224
|
-
//
|
|
156
|
+
// Always check on project open
|
|
225
157
|
const recovery = await sdk.projects.getRecoveryStatus(projectId);
|
|
226
158
|
if (recovery.needsRecovery) {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
159
|
+
const { processedFiles, totalFiles, percentage } = recovery.progress;
|
|
160
|
+
|
|
161
|
+
// Show dialog: "Continue (67%) — 480/642 files" or "Start Fresh"
|
|
162
|
+
await sdk.projects.resumeSync(projectId); // Continue
|
|
163
|
+
// OR
|
|
164
|
+
await sdk.projects.cancelRecovery(projectId); // Start over
|
|
230
165
|
}
|
|
231
166
|
```
|
|
232
167
|
|
|
233
|
-
|
|
234
|
-
- Требуется **OAuth токен** в production
|
|
235
|
-
- Автоматическое переподключение при разрыве
|
|
236
|
-
- События фильтруются по `projectId`
|
|
237
|
-
- Fallback на HTTP polling если недоступен
|
|
238
|
-
|
|
239
|
-
### Авторизация
|
|
240
|
-
- **Локально**: `apiKey` для HTTP API
|
|
241
|
-
- **Production**: OAuth `access_token` для HTTP + WebSocket
|
|
242
|
-
- **v6.1.4+**: `getAuthToken()` для автоматического обновления токенов
|
|
243
|
-
|
|
244
|
-
### Graceful Auth Errors (v7.0.1+)
|
|
245
|
-
По умолчанию SDK **тихо обрабатывает** 401/403 ошибки (возвращает `null`) вместо выброса исключения.
|
|
246
|
-
Это предотвращает `ERR` логи в VS Code Extension Host.
|
|
168
|
+
## Key Types
|
|
247
169
|
|
|
170
|
+
### ProjectState
|
|
248
171
|
```typescript
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
172
|
+
interface ProjectState {
|
|
173
|
+
projectId: string;
|
|
174
|
+
merkleRootHash: string | null;
|
|
175
|
+
totalFiles: number; // For UI display
|
|
176
|
+
indexingStatus: 'pending' | 'in-progress' | 'complete' | 'failed';
|
|
177
|
+
syncRequired?: boolean; // Compare with client hash
|
|
178
|
+
}
|
|
179
|
+
```
|
|
253
180
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
181
|
+
### SyncProgressEvent
|
|
182
|
+
```typescript
|
|
183
|
+
interface SyncProgressEvent {
|
|
184
|
+
projectId: string;
|
|
185
|
+
progress: number; // 0-100
|
|
186
|
+
processedFiles: number; // 450
|
|
187
|
+
totalFiles: number; // 722
|
|
188
|
+
stage: 'receiving_chunks' | 'processing_chunks' | 'creating_embeddings' | 'finalizing';
|
|
259
189
|
}
|
|
260
190
|
```
|
|
261
191
|
|
|
262
|
-
|
|
192
|
+
### RecoveryInfo
|
|
263
193
|
```typescript
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
194
|
+
interface RecoveryInfo {
|
|
195
|
+
needsRecovery: boolean;
|
|
196
|
+
progress: {
|
|
197
|
+
processedFiles: number;
|
|
198
|
+
totalFiles: number;
|
|
199
|
+
percentage: number; // 0-100
|
|
200
|
+
};
|
|
201
|
+
canResume: boolean;
|
|
202
|
+
}
|
|
267
203
|
```
|
|
268
204
|
|
|
269
|
-
##
|
|
205
|
+
## Troubleshooting
|
|
270
206
|
|
|
271
|
-
###
|
|
207
|
+
### "0 files" after indexing
|
|
272
208
|
```typescript
|
|
273
|
-
const
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
// 1. Найти/создать проект
|
|
279
|
-
const project = await sdk.projects.findOrCreateProject('/path/to/project');
|
|
209
|
+
const state = await sdk.projects.getProjectState(projectId);
|
|
210
|
+
console.log(state.totalFiles); // Should be > 0
|
|
211
|
+
// If 0: update backend to latest version
|
|
212
|
+
```
|
|
280
213
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
return;
|
|
286
|
-
}
|
|
214
|
+
### No WebSocket updates
|
|
215
|
+
```typescript
|
|
216
|
+
// 1. Check connection
|
|
217
|
+
console.log(sdk.isWebSocketConnected); // should be true
|
|
287
218
|
|
|
288
|
-
//
|
|
289
|
-
|
|
290
|
-
if (!state.syncRequired) {
|
|
291
|
-
console.log('Проект синхронизирован');
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
219
|
+
// 2. Verify subscription
|
|
220
|
+
sdk.projectSync.subscribeToProject(projectId);
|
|
294
221
|
|
|
295
|
-
//
|
|
296
|
-
await
|
|
297
|
-
|
|
298
|
-
sdk.projectSync.on('sync-progress', (data) => {
|
|
299
|
-
console.log(`Прогресс: ${data.progress}%`);
|
|
222
|
+
// 3. Ensure OAuth token (production)
|
|
223
|
+
const sdk = await CodeSolverSDK.create({
|
|
224
|
+
getAuthToken: () => authManager.getAccessToken()
|
|
300
225
|
});
|
|
301
226
|
|
|
302
|
-
//
|
|
303
|
-
await sdk.
|
|
304
|
-
|
|
305
|
-
// 6. Поиск по проекту
|
|
306
|
-
const results = await sdk.search.searchCode(project.id, 'function handleClick');
|
|
227
|
+
// 4. Fallback to HTTP polling
|
|
228
|
+
const status = await sdk.projects.getIndexingStatus(projectId);
|
|
307
229
|
```
|
|
308
230
|
|
|
309
|
-
###
|
|
231
|
+
### Interrupted sync
|
|
310
232
|
```typescript
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
233
|
+
const recovery = await sdk.projects.getRecoveryStatus(projectId);
|
|
234
|
+
if (recovery.needsRecovery) {
|
|
235
|
+
// Option 1: Resume
|
|
236
|
+
await sdk.projects.resumeSync(projectId);
|
|
237
|
+
|
|
238
|
+
// Option 2: Cancel and restart
|
|
239
|
+
await sdk.projects.cancelRecovery(projectId);
|
|
315
240
|
}
|
|
316
241
|
```
|
|
317
242
|
|
|
318
|
-
##
|
|
243
|
+
## API Reference
|
|
319
244
|
|
|
320
|
-
|
|
321
|
-
- Backend SDK — HTTP клиент (НЕ работает с файлами)
|
|
322
|
-
- Client Extension — сканирует файлы, создает chunks
|
|
323
|
-
- Только Delta-Chunking — filesystem индексация удалена
|
|
324
|
-
|
|
325
|
-
<details>
|
|
326
|
-
<summary><b>Миграция с v6.x</b></summary>
|
|
327
|
-
|
|
328
|
-
**BREAKING CHANGES:**
|
|
329
|
-
- ❌ Удален `sdk.projects.startIndexing()`
|
|
330
|
-
- ✅ Используйте `sdk.deltaManager.syncEncryptedChunks()`
|
|
245
|
+
### Projects (`sdk.projects`)
|
|
331
246
|
|
|
332
247
|
```typescript
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
248
|
+
getAllProjects(): Promise<Project[]>
|
|
249
|
+
getProjects(): Promise<Project[]>
|
|
250
|
+
getProject(projectId: string): Promise<Project>
|
|
251
|
+
createProject(name: string, data?: any, options?: ProjectOptions): Promise<Project>
|
|
252
|
+
findOrCreateProject(name: string): Promise<Project>
|
|
253
|
+
deleteProject(projectId: string): Promise<void>
|
|
254
|
+
getReadyProjects(): Promise<Project[]>
|
|
255
|
+
getProjectState(projectId: string, clientRootHash?: string): Promise<ProjectState>
|
|
256
|
+
getProjectStatus(projectId: string): Promise<any>
|
|
257
|
+
getIndexingStatus(projectId: string): Promise<any>
|
|
258
|
+
cancelIndexing(projectId: string): Promise<boolean>
|
|
259
|
+
clearIndexingError(projectId: string): Promise<boolean>
|
|
260
|
+
getRecoveryStatus(projectId: string): Promise<RecoveryInfo>
|
|
261
|
+
resumeSync(projectId: string, options?: any): Promise<any>
|
|
262
|
+
cancelRecovery(projectId: string): Promise<void>
|
|
263
|
+
initializeDeltaSync(projectId: string, params: any): Promise<any>
|
|
264
|
+
resetIndexing(projectId: string): Promise<any>
|
|
265
|
+
restartIndexing(projectId: string): Promise<any>
|
|
266
|
+
getFilePathMapping(projectId: string): Promise<any>
|
|
340
267
|
```
|
|
341
268
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
## 📦 Ключевые типы данных
|
|
269
|
+
### Delta Manager (`sdk.deltaManager`)
|
|
345
270
|
|
|
346
|
-
### ProjectState (v7.1.0+)
|
|
347
271
|
```typescript
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
indexingStatus: 'pending' | 'in-progress' | 'complete' | 'failed' | 'cancelled';
|
|
356
|
-
syncRequired?: boolean; // true если нужна синхронизация
|
|
357
|
-
lastSyncSessionId?: string;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
// Использование:
|
|
361
|
-
const state = await sdk.projects.getProjectState(projectId, clientRootHash);
|
|
362
|
-
if (state.syncRequired) {
|
|
363
|
-
// Нужна синхронизация
|
|
364
|
-
}
|
|
365
|
-
console.log(`${state.totalFiles} files indexed`);
|
|
272
|
+
initSync(projectId: string, request: SyncInitRequest): Promise<any>
|
|
273
|
+
uploadChunkBatch(projectId: string, chunks: any[]): Promise<any>
|
|
274
|
+
uploadChunksWithRetry(projectId: string, chunks: any[], options?: any): Promise<any>
|
|
275
|
+
finalizeSync(projectId: string): Promise<SyncResult>
|
|
276
|
+
getSyncStatus(projectId: string): Promise<SyncStatus>
|
|
277
|
+
cancelSync(projectId: string): Promise<{ success: boolean; message?: string }>
|
|
278
|
+
cleanupFiles(projectId: string, activeFiles: string[]): Promise<any>
|
|
366
279
|
```
|
|
367
280
|
|
|
368
|
-
###
|
|
369
|
-
```typescript
|
|
370
|
-
interface SyncProgressEvent {
|
|
371
|
-
projectId: string;
|
|
372
|
-
sessionId: string;
|
|
373
|
-
stage: 'receiving_chunks' | 'processing_chunks' | 'creating_embeddings' | 'updating_tree' | 'finalizing';
|
|
374
|
-
progress: number; // 0-100
|
|
375
|
-
|
|
376
|
-
// User-friendly (файлы) - основное для UI
|
|
377
|
-
processedFiles?: number; // 450
|
|
378
|
-
totalFiles?: number; // 722
|
|
379
|
-
|
|
380
|
-
// Technical (чанки) - опционально
|
|
381
|
-
currentChunk?: number;
|
|
382
|
-
totalChunks?: number;
|
|
383
|
-
|
|
384
|
-
estimatedTimeRemaining?: number; // секунды
|
|
385
|
-
details?: string;
|
|
386
|
-
timestamp: Date;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
// Использование:
|
|
390
|
-
sdk.projectSync.on('sync-progress', (data) => {
|
|
391
|
-
if (data.totalFiles) {
|
|
392
|
-
statusBar.text = `${data.processedFiles}/${data.totalFiles} files`;
|
|
393
|
-
}
|
|
394
|
-
});
|
|
395
|
-
```
|
|
281
|
+
### Chat (`sdk.chat`)
|
|
396
282
|
|
|
397
|
-
### SyncCompletedEvent (v7.1.1+)
|
|
398
283
|
```typescript
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
totalSize: number;
|
|
412
|
-
totalFiles?: number; // ✨ Для финального отображения
|
|
413
|
-
};
|
|
414
|
-
}
|
|
284
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
|
|
285
|
+
chatCompletion(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
|
|
286
|
+
chatWithRegionFailover(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>
|
|
287
|
+
streamChat(messages: ChatMessage[], options?: ChatStreamOptions): AsyncGenerator<ChatStreamChunk>
|
|
288
|
+
streamPrompt(prompt: string, options?: ChatStreamOptions): AsyncGenerator<ChatStreamChunk>
|
|
289
|
+
sendContinuation(requestId: string, messages: ChatMessage[]): AsyncGenerator<ChatStreamChunk>
|
|
290
|
+
sendPromptWithRegionFailover(prompt: string, options?: ChatOptions): Promise<string>
|
|
291
|
+
checkAvailability(): Promise<boolean>
|
|
292
|
+
cancelRequest(requestId: string): Promise<void>
|
|
293
|
+
getStreamsStats(): Promise<any>
|
|
294
|
+
cleanupStaleStreams(timeoutMs?: number): Promise<any>
|
|
295
|
+
cancelUserStreams(reason?: string): Promise<number>
|
|
415
296
|
```
|
|
416
297
|
|
|
417
|
-
###
|
|
298
|
+
### Search (`sdk.search`)
|
|
299
|
+
|
|
418
300
|
```typescript
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
status: 'interrupted' | 'paused' | 'active' | 'uploading';
|
|
424
|
-
progress: {
|
|
425
|
-
received: number; // Чанки получены
|
|
426
|
-
processed: number; // Чанки обработаны
|
|
427
|
-
total: number; // Всего ожидается
|
|
428
|
-
percentage: number; // 0-100
|
|
429
|
-
processedFiles?: number; // ✨ Файлы обработаны
|
|
430
|
-
totalFiles?: number; // ✨ Всего файлов
|
|
431
|
-
filesPercentage?: number; // ✨ 0-100 по файлам
|
|
432
|
-
};
|
|
433
|
-
canResume: boolean;
|
|
434
|
-
needsRecovery: boolean;
|
|
435
|
-
interruptedAt?: Date;
|
|
436
|
-
}
|
|
301
|
+
searchCode(projectIdOrParams: string | SearchCodeParams, params?: SearchCodeParams): Promise<SearchResult[]>
|
|
302
|
+
searchFunctions(projectIdOrParams: string | SearchFunctionsParams, params?: SearchFunctionsParams): Promise<FunctionSearchResult>
|
|
303
|
+
semanticSearch(projectId: string, params: SearchCodeParams): Promise<SearchResult[]>
|
|
304
|
+
getFunctionStats(projectId: string): Promise<{ stats: { totalFunctions: number } }>
|
|
437
305
|
```
|
|
438
306
|
|
|
439
|
-
|
|
307
|
+
### Tools (`sdk.tools`)
|
|
440
308
|
|
|
441
|
-
### Проблема: "0 files" после индексации
|
|
442
309
|
```typescript
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
// Решение: Обновите backend до последней версии
|
|
310
|
+
getSchemas(): Promise<ToolsResponse>
|
|
311
|
+
findToolByName(name: string): Promise<ToolSchema | null>
|
|
312
|
+
getToolsStats(): Promise<{ total: number; categories: Record<string, number>; mostUsed?: string[] }>
|
|
313
|
+
validateToolSchema(tool: ToolSchema): boolean
|
|
314
|
+
createToolSchema(name: string, description: string, properties: any, required?: string[]): ToolSchema
|
|
449
315
|
```
|
|
450
316
|
|
|
451
|
-
###
|
|
452
|
-
```typescript
|
|
453
|
-
// 1. Проверить подключение
|
|
454
|
-
console.log(sdk.isWebSocketConnected); // должно быть true
|
|
455
|
-
|
|
456
|
-
// 2. Проверить подписку
|
|
457
|
-
sdk.projectSync.subscribeToProject(projectId);
|
|
458
|
-
|
|
459
|
-
// 3. Проверить токен (production)
|
|
460
|
-
const sdk = await CodeSolverSDK.create({
|
|
461
|
-
baseURL: 'https://workai.su/api/v1',
|
|
462
|
-
getAuthToken: () => authManager.getAccessToken() // OAuth required
|
|
463
|
-
});
|
|
317
|
+
### User (`sdk.user`)
|
|
464
318
|
|
|
465
|
-
|
|
466
|
-
|
|
319
|
+
```typescript
|
|
320
|
+
getProfile(): Promise<UserProfile>
|
|
467
321
|
```
|
|
468
322
|
|
|
469
|
-
###
|
|
323
|
+
### Auth (`sdk.auth`)
|
|
324
|
+
|
|
470
325
|
```typescript
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
if (recovery.needsRecovery) {
|
|
474
|
-
// Показать UI диалог
|
|
475
|
-
const percentage = recovery.progress.filesPercentage || recovery.progress.percentage;
|
|
476
|
-
const files = `${recovery.progress.processedFiles}/${recovery.progress.totalFiles}`;
|
|
477
|
-
|
|
478
|
-
// Пользователь выбирает:
|
|
479
|
-
await sdk.projects.resumeSync(projectId); // Продолжить
|
|
480
|
-
// или
|
|
481
|
-
await sdk.projects.cancelRecovery(projectId); // Начать заново
|
|
482
|
-
}
|
|
326
|
+
revokeToken(token: string): Promise<{ ok: boolean }>
|
|
327
|
+
logout(): Promise<{ ok: boolean }>
|
|
483
328
|
```
|
|
484
329
|
|
|
485
|
-
###
|
|
486
|
-
```typescript
|
|
487
|
-
// v7.0.1+: По умолчанию возвращает null
|
|
488
|
-
const projects = await sdk.projects.getAllProjects();
|
|
489
|
-
if (!projects) {
|
|
490
|
-
// Токен истек
|
|
491
|
-
await authManager.refreshToken();
|
|
492
|
-
// Повторить запрос
|
|
493
|
-
}
|
|
330
|
+
### Models (`sdk.models`)
|
|
494
331
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
332
|
+
```typescript
|
|
333
|
+
getAllModels(): Promise<any[]>
|
|
334
|
+
getModels(): Promise<any[]>
|
|
335
|
+
getAvailableModels(): Promise<any[]>
|
|
336
|
+
getProviderModels(providerId: string): Promise<ProviderModels>
|
|
337
|
+
getModelInfo(modelId: string): Promise<any>
|
|
499
338
|
```
|
|
500
339
|
|
|
501
|
-
|
|
340
|
+
### Updates (`sdk.updates`)
|
|
502
341
|
|
|
503
|
-
### TypeScript типы
|
|
504
342
|
```typescript
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
SyncProgressEvent,
|
|
511
|
-
SyncCompletedEvent,
|
|
512
|
-
RecoveryInfo
|
|
513
|
-
} from '@androidsprintteam/solver-sdk';
|
|
343
|
+
checkForUpdates(options: UpdateCheckOptions): Promise<UpdateResponse>
|
|
344
|
+
getChangelog(version: string, locale: string): Promise<string>
|
|
345
|
+
sendStats(event: UpdateStatsEvent): Promise<void>
|
|
346
|
+
getLatestVersion(channel?: string): Promise<LatestVersionInfo>
|
|
347
|
+
checkAvailability(): Promise<boolean>
|
|
514
348
|
```
|
|
515
349
|
|
|
516
|
-
###
|
|
350
|
+
### WebSocket (`sdk.projectSync`)
|
|
351
|
+
|
|
517
352
|
```typescript
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
353
|
+
connectWebSocket(): Promise<void>
|
|
354
|
+
disconnectWebSocket(): void
|
|
355
|
+
isWebSocketConnected: boolean
|
|
356
|
+
projectSync.subscribeToProject(projectId: string): void
|
|
357
|
+
projectSync.unsubscribeFromProject(projectId: string): void
|
|
358
|
+
projectSync.on('sync-status-update', callback): void
|
|
359
|
+
projectSync.on('sync-progress', callback): void
|
|
360
|
+
projectSync.on('sync-completed', callback): void
|
|
361
|
+
projectSync.on('sync-error', callback): void
|
|
362
|
+
projectSync.off(event: string, callback): void
|
|
522
363
|
```
|
|
523
364
|
|
|
524
|
-
###
|
|
365
|
+
### Utility
|
|
366
|
+
|
|
525
367
|
```typescript
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
console.error(`[HTTP ${error.status}] ${error.message}`);
|
|
530
|
-
}
|
|
368
|
+
checkHealth(): Promise<boolean>
|
|
369
|
+
version: string
|
|
370
|
+
baseURL: string
|
|
531
371
|
```
|
|
532
372
|
|
|
533
|
-
##
|
|
373
|
+
## Docs
|
|
374
|
+
|
|
375
|
+
- **Full verification:** [SDK_v7.2.0_FINAL_REPORT.md](../docs/sdk/SDK_v7.2.0_FINAL_REPORT.md)
|
|
376
|
+
- **Migration guide:** [SDK_v7.2.0_MIGRATION.md](../docs/sdk/SDK_v7.2.0_MIGRATION.md)
|
|
377
|
+
- **Architecture:** [ARCHITECTURE_NOTES.md](../docs/sdk/ARCHITECTURE_NOTES.md)
|
|
378
|
+
|
|
379
|
+
All methods have JSDoc comments - check IDE autocomplete for full reference.
|
|
380
|
+
|
|
381
|
+
---
|
|
534
382
|
|
|
535
|
-
MIT
|
|
383
|
+
**Status:** ✅ Production Ready | **v7.3.0** | **License:** MIT
|