@sharc-code/mcp 0.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.
- package/README.md +134 -0
- package/dist/backend-client.d.ts +251 -0
- package/dist/backend-client.d.ts.map +1 -0
- package/dist/backend-client.js +269 -0
- package/dist/backend-client.js.map +1 -0
- package/dist/backend-handlers.d.ts +243 -0
- package/dist/backend-handlers.d.ts.map +1 -0
- package/dist/backend-handlers.js +1453 -0
- package/dist/backend-handlers.js.map +1 -0
- package/dist/config.d.ts +47 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +94 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +344 -0
- package/dist/index.js.map +1 -0
- package/dist/project-detector.d.ts +42 -0
- package/dist/project-detector.d.ts.map +1 -0
- package/dist/project-detector.js +135 -0
- package/dist/project-detector.js.map +1 -0
- package/dist/utils/env-manager.d.ts +19 -0
- package/dist/utils/env-manager.d.ts.map +1 -0
- package/dist/utils/env-manager.js +99 -0
- package/dist/utils/env-manager.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +27 -0
- package/dist/utils.js.map +1 -0
- package/dist/watcher/file-watcher.d.ts +64 -0
- package/dist/watcher/file-watcher.d.ts.map +1 -0
- package/dist/watcher/file-watcher.js +263 -0
- package/dist/watcher/file-watcher.js.map +1 -0
- package/dist/watcher/incremental-indexer.d.ts +68 -0
- package/dist/watcher/incremental-indexer.d.ts.map +1 -0
- package/dist/watcher/incremental-indexer.js +254 -0
- package/dist/watcher/incremental-indexer.js.map +1 -0
- package/dist/watcher/index.d.ts +10 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js +10 -0
- package/dist/watcher/index.js.map +1 -0
- package/dist/watcher/processing-queue.d.ts +79 -0
- package/dist/watcher/processing-queue.d.ts.map +1 -0
- package/dist/watcher/processing-queue.js +150 -0
- package/dist/watcher/processing-queue.js.map +1 -0
- package/dist/watcher/syntax-guard.d.ts +59 -0
- package/dist/watcher/syntax-guard.d.ts.map +1 -0
- package/dist/watcher/syntax-guard.js +136 -0
- package/dist/watcher/syntax-guard.js.map +1 -0
- package/package.json +52 -0
package/README.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# @sharc-code/mcp
|
|
2
|
+
|
|
3
|
+
**SHARC MCP Server** - Semantic code search for AI assistants via the Model Context Protocol (MCP).
|
|
4
|
+
|
|
5
|
+
This package provides an MCP server that enables AI assistants like Claude Code, Cursor, and VS Code Copilot to perform semantic code search across codebases using natural language queries.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Semantic Code Search** - Find code using natural language queries
|
|
10
|
+
- **Incremental Indexing** - Only re-indexes changed files (~0.3s for no changes)
|
|
11
|
+
- **Real-time File Watching** - Automatically updates index when files change
|
|
12
|
+
- **AST-based Chunking** - Smart code splitting that preserves semantic units
|
|
13
|
+
- **Multi-language Support** - TypeScript, JavaScript, Python, Go, Rust, Java, C#, C++, Scala
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @sharc-code/mcp
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Configuration
|
|
22
|
+
|
|
23
|
+
The MCP server requires environment variables to connect to the SHARC backend:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
SHARC_BACKEND_URL=<your-backend-url> # Backend API URL
|
|
27
|
+
SHARC_API_KEY=<your-api-key> # API key for authentication
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Claude Desktop Configuration
|
|
31
|
+
|
|
32
|
+
Add to your `claude_desktop_config.json`:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"mcpServers": {
|
|
37
|
+
"sharc": {
|
|
38
|
+
"command": "npx",
|
|
39
|
+
"args": ["@sharc-code/mcp"],
|
|
40
|
+
"env": {
|
|
41
|
+
"SHARC_BACKEND_URL": "<your-backend-url>",
|
|
42
|
+
"SHARC_API_KEY": "<your-api-key>"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### VS Code / Cursor Configuration
|
|
50
|
+
|
|
51
|
+
Add to your settings:
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"mcp.servers": {
|
|
56
|
+
"sharc": {
|
|
57
|
+
"command": "npx",
|
|
58
|
+
"args": ["@sharc-code/mcp"],
|
|
59
|
+
"env": {
|
|
60
|
+
"SHARC_BACKEND_URL": "<your-backend-url>",
|
|
61
|
+
"SHARC_API_KEY": "<your-api-key>"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## MCP Tools
|
|
69
|
+
|
|
70
|
+
The server exposes 7 tools to AI assistants:
|
|
71
|
+
|
|
72
|
+
### `index_codebase`
|
|
73
|
+
|
|
74
|
+
Index a codebase for semantic search.
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"path": "/path/to/project",
|
|
79
|
+
"force": false
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `search_code`
|
|
84
|
+
|
|
85
|
+
Search code using natural language queries.
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"path": "/path/to/project",
|
|
90
|
+
"query": "JWT authentication middleware",
|
|
91
|
+
"limit": 5
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### `clear_index`
|
|
96
|
+
|
|
97
|
+
Delete the search index for a codebase.
|
|
98
|
+
|
|
99
|
+
### `get_indexing_status`
|
|
100
|
+
|
|
101
|
+
Check indexing progress for a codebase.
|
|
102
|
+
|
|
103
|
+
### `start_watch` / `stop_watch`
|
|
104
|
+
|
|
105
|
+
Start or stop watching a codebase for file changes.
|
|
106
|
+
|
|
107
|
+
### `get_watch_status`
|
|
108
|
+
|
|
109
|
+
Get list of codebases currently being watched.
|
|
110
|
+
|
|
111
|
+
## Supported Languages
|
|
112
|
+
|
|
113
|
+
| Language | Extensions | Chunking |
|
|
114
|
+
|----------|------------|----------|
|
|
115
|
+
| TypeScript | `.ts`, `.tsx` | AST |
|
|
116
|
+
| JavaScript | `.js`, `.jsx` | AST |
|
|
117
|
+
| Python | `.py` | AST |
|
|
118
|
+
| Go | `.go` | AST |
|
|
119
|
+
| Rust | `.rs` | AST |
|
|
120
|
+
| Java | `.java` | AST |
|
|
121
|
+
| C# | `.cs` | AST |
|
|
122
|
+
| C++ | `.cpp`, `.hpp` | AST |
|
|
123
|
+
| Scala | `.scala` | AST |
|
|
124
|
+
| Markdown | `.md`, `.mdx` | LangChain |
|
|
125
|
+
| Config | `.json`, `.yaml`, `.toml` | LangChain |
|
|
126
|
+
|
|
127
|
+
## Dependencies
|
|
128
|
+
|
|
129
|
+
- `@sharc-code/splitter` - AST and LangChain code splitters
|
|
130
|
+
- `@modelcontextprotocol/sdk` - MCP protocol implementation
|
|
131
|
+
|
|
132
|
+
## License
|
|
133
|
+
|
|
134
|
+
MIT
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SHARC Backend Client
|
|
3
|
+
* HTTP client for communicating with the SHARC backend API
|
|
4
|
+
* Handles indexing, search, and collection management
|
|
5
|
+
*/
|
|
6
|
+
export interface IndexChunk {
|
|
7
|
+
content: string;
|
|
8
|
+
relativePath: string;
|
|
9
|
+
startLine: number;
|
|
10
|
+
endLine: number;
|
|
11
|
+
language?: string;
|
|
12
|
+
metadata?: Record<string, any>;
|
|
13
|
+
}
|
|
14
|
+
export interface IndexRequest {
|
|
15
|
+
collection: string;
|
|
16
|
+
chunks: IndexChunk[];
|
|
17
|
+
createIfNotExists?: boolean;
|
|
18
|
+
finalize?: boolean;
|
|
19
|
+
deleteFirst?: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface IndexResponse {
|
|
22
|
+
success: boolean;
|
|
23
|
+
collection: string;
|
|
24
|
+
indexed: number;
|
|
25
|
+
deleted?: number;
|
|
26
|
+
usage: {
|
|
27
|
+
prompt_tokens: number;
|
|
28
|
+
total_tokens: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface DeleteFileVectorsRequest {
|
|
32
|
+
collection: string;
|
|
33
|
+
relativePath: string;
|
|
34
|
+
}
|
|
35
|
+
export interface DeleteFileVectorsResponse {
|
|
36
|
+
success: boolean;
|
|
37
|
+
collection: string;
|
|
38
|
+
path: string;
|
|
39
|
+
deletedCount: number;
|
|
40
|
+
}
|
|
41
|
+
export interface SearchRequest {
|
|
42
|
+
query: string;
|
|
43
|
+
collection: string;
|
|
44
|
+
limit?: number;
|
|
45
|
+
extensionFilter?: string[];
|
|
46
|
+
rerank?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface SearchResult {
|
|
49
|
+
id: string;
|
|
50
|
+
content: string;
|
|
51
|
+
relativePath: string;
|
|
52
|
+
startLine: number;
|
|
53
|
+
endLine: number;
|
|
54
|
+
language: string;
|
|
55
|
+
score: number;
|
|
56
|
+
}
|
|
57
|
+
export interface SearchResponse {
|
|
58
|
+
results: SearchResult[];
|
|
59
|
+
collection: string;
|
|
60
|
+
query: string;
|
|
61
|
+
usage: {
|
|
62
|
+
total_tokens: number;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export interface RepoInfo {
|
|
66
|
+
name: string;
|
|
67
|
+
status: 'indexed' | 'unknown';
|
|
68
|
+
}
|
|
69
|
+
export interface ListReposResponse {
|
|
70
|
+
repos: RepoInfo[];
|
|
71
|
+
count: number;
|
|
72
|
+
}
|
|
73
|
+
export interface RepoStatusResponse {
|
|
74
|
+
collection: string;
|
|
75
|
+
status: 'indexed';
|
|
76
|
+
sampleDocs: number;
|
|
77
|
+
}
|
|
78
|
+
export interface DeleteRepoResponse {
|
|
79
|
+
success: boolean;
|
|
80
|
+
collection: string;
|
|
81
|
+
message: string;
|
|
82
|
+
}
|
|
83
|
+
export interface BackendError {
|
|
84
|
+
error: {
|
|
85
|
+
message: string;
|
|
86
|
+
type: string;
|
|
87
|
+
param: string | null;
|
|
88
|
+
code: string | null;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export interface CodebaseInfoIndexing {
|
|
92
|
+
status: 'indexing';
|
|
93
|
+
indexingPercentage: number;
|
|
94
|
+
lastUpdated: string;
|
|
95
|
+
}
|
|
96
|
+
export interface CodebaseInfoIndexed {
|
|
97
|
+
status: 'indexed';
|
|
98
|
+
indexedFiles: number;
|
|
99
|
+
totalChunks: number;
|
|
100
|
+
indexStatus: 'completed' | 'limit_reached';
|
|
101
|
+
lastUpdated: string;
|
|
102
|
+
}
|
|
103
|
+
export interface CodebaseInfoIndexFailed {
|
|
104
|
+
status: 'indexfailed';
|
|
105
|
+
errorMessage: string;
|
|
106
|
+
lastAttemptedPercentage?: number;
|
|
107
|
+
lastUpdated: string;
|
|
108
|
+
}
|
|
109
|
+
export type CodebaseInfo = CodebaseInfoIndexing | CodebaseInfoIndexed | CodebaseInfoIndexFailed;
|
|
110
|
+
export interface CodebaseSnapshotV2 {
|
|
111
|
+
formatVersion: 'v2';
|
|
112
|
+
codebases: Record<string, CodebaseInfo>;
|
|
113
|
+
lastUpdated: string;
|
|
114
|
+
}
|
|
115
|
+
export interface MerkleDAGNode {
|
|
116
|
+
id: string;
|
|
117
|
+
hash: string;
|
|
118
|
+
data: string;
|
|
119
|
+
parents: string[];
|
|
120
|
+
children: string[];
|
|
121
|
+
}
|
|
122
|
+
export interface MerkleDAG {
|
|
123
|
+
nodes: [string, MerkleDAGNode][];
|
|
124
|
+
rootIds: string[];
|
|
125
|
+
}
|
|
126
|
+
export interface MerkleSnapshot {
|
|
127
|
+
fileHashes: [string, string][];
|
|
128
|
+
merkleDAG: MerkleDAG;
|
|
129
|
+
fileCount?: number;
|
|
130
|
+
}
|
|
131
|
+
export interface SyncSnapshotResponse {
|
|
132
|
+
success: boolean;
|
|
133
|
+
snapshot: CodebaseSnapshotV2;
|
|
134
|
+
}
|
|
135
|
+
export interface SyncMerkleResponse {
|
|
136
|
+
success: boolean;
|
|
137
|
+
snapshot: MerkleSnapshot | null;
|
|
138
|
+
codebasePath?: string;
|
|
139
|
+
}
|
|
140
|
+
export interface SyncCodebasesResponse {
|
|
141
|
+
success: boolean;
|
|
142
|
+
codebases: {
|
|
143
|
+
path: string;
|
|
144
|
+
fileCount: number;
|
|
145
|
+
updatedAt: string;
|
|
146
|
+
}[];
|
|
147
|
+
}
|
|
148
|
+
export declare class BackendClient {
|
|
149
|
+
private baseUrl;
|
|
150
|
+
private apiKey;
|
|
151
|
+
private timeout;
|
|
152
|
+
private debug;
|
|
153
|
+
private consecutiveFailures;
|
|
154
|
+
private circuitOpenUntil;
|
|
155
|
+
private static readonly FAILURE_THRESHOLD;
|
|
156
|
+
private static readonly CIRCUIT_RESET_MS;
|
|
157
|
+
constructor(baseUrl: string, apiKey: string, timeout?: number);
|
|
158
|
+
private log;
|
|
159
|
+
private request;
|
|
160
|
+
/**
|
|
161
|
+
* Request with automatic retry for transient failures
|
|
162
|
+
*/
|
|
163
|
+
private requestWithRetry;
|
|
164
|
+
/**
|
|
165
|
+
* Index code chunks into a collection
|
|
166
|
+
* The backend will handle embedding generation
|
|
167
|
+
*/
|
|
168
|
+
indexChunks(request: IndexRequest): Promise<IndexResponse>;
|
|
169
|
+
/**
|
|
170
|
+
* Search for code in a collection
|
|
171
|
+
* The backend handles embedding + hybrid search + optional reranking
|
|
172
|
+
*/
|
|
173
|
+
search(request: SearchRequest): Promise<SearchResponse>;
|
|
174
|
+
/**
|
|
175
|
+
* List all indexed collections (repos)
|
|
176
|
+
*/
|
|
177
|
+
listRepos(): Promise<ListReposResponse>;
|
|
178
|
+
/**
|
|
179
|
+
* Get status of a specific collection
|
|
180
|
+
*/
|
|
181
|
+
getRepoStatus(collection: string): Promise<RepoStatusResponse>;
|
|
182
|
+
/**
|
|
183
|
+
* Delete a collection
|
|
184
|
+
*/
|
|
185
|
+
deleteRepo(collection: string): Promise<DeleteRepoResponse>;
|
|
186
|
+
/**
|
|
187
|
+
* Delete all vectors for a specific file path
|
|
188
|
+
* Used by incremental indexer when files are deleted
|
|
189
|
+
*/
|
|
190
|
+
deleteFileVectors(collection: string, relativePath: string): Promise<DeleteFileVectorsResponse>;
|
|
191
|
+
/**
|
|
192
|
+
* Delete vectors for multiple file paths in a single batch operation
|
|
193
|
+
* Much faster than sequential deletes - uses OR filter
|
|
194
|
+
*/
|
|
195
|
+
deleteFileVectorsBatch(collection: string, relativePaths: string[]): Promise<{
|
|
196
|
+
success: boolean;
|
|
197
|
+
pathsDeleted: number;
|
|
198
|
+
}>;
|
|
199
|
+
/**
|
|
200
|
+
* Check if a collection exists
|
|
201
|
+
*/
|
|
202
|
+
hasCollection(collection: string): Promise<boolean>;
|
|
203
|
+
/**
|
|
204
|
+
* Health check for the backend
|
|
205
|
+
*/
|
|
206
|
+
healthCheck(): Promise<{
|
|
207
|
+
status: string;
|
|
208
|
+
timestamp: string;
|
|
209
|
+
}>;
|
|
210
|
+
/**
|
|
211
|
+
* Load codebase snapshot from backend
|
|
212
|
+
*/
|
|
213
|
+
loadSnapshot(): Promise<CodebaseSnapshotV2>;
|
|
214
|
+
/**
|
|
215
|
+
* Save codebase snapshot to backend
|
|
216
|
+
*/
|
|
217
|
+
saveSnapshot(snapshot: CodebaseSnapshotV2): Promise<void>;
|
|
218
|
+
/**
|
|
219
|
+
* Update a single codebase's info in the snapshot
|
|
220
|
+
*/
|
|
221
|
+
updateCodebaseInfo(codebasePath: string, info: CodebaseInfo): Promise<void>;
|
|
222
|
+
/**
|
|
223
|
+
* Remove a codebase from the snapshot
|
|
224
|
+
*/
|
|
225
|
+
removeCodebaseFromSnapshot(codebasePath: string): Promise<void>;
|
|
226
|
+
/**
|
|
227
|
+
* Load Merkle snapshot for a codebase
|
|
228
|
+
*/
|
|
229
|
+
loadMerkleSnapshot(codebasePath: string): Promise<MerkleSnapshot | null>;
|
|
230
|
+
/**
|
|
231
|
+
* Save Merkle snapshot for a codebase
|
|
232
|
+
*/
|
|
233
|
+
saveMerkleSnapshot(codebasePath: string, snapshot: MerkleSnapshot): Promise<void>;
|
|
234
|
+
/**
|
|
235
|
+
* Delete Merkle snapshot for a codebase
|
|
236
|
+
*/
|
|
237
|
+
deleteMerkleSnapshot(codebasePath: string): Promise<void>;
|
|
238
|
+
/**
|
|
239
|
+
* List all codebases with Merkle info
|
|
240
|
+
*/
|
|
241
|
+
listSyncCodebases(): Promise<{
|
|
242
|
+
path: string;
|
|
243
|
+
fileCount: number;
|
|
244
|
+
updatedAt: string;
|
|
245
|
+
}[]>;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Create a BackendClient from environment variables
|
|
249
|
+
*/
|
|
250
|
+
export declare function createBackendClient(): BackendClient;
|
|
251
|
+
//# sourceMappingURL=backend-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-client.d.ts","sourceRoot":"","sources":["../src/backend-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SHARC Backend Client
|
|
3
|
+
* HTTP client for communicating with the SHARC backend API
|
|
4
|
+
* Handles indexing, search, and collection management
|
|
5
|
+
*/
|
|
6
|
+
export class BackendClient {
|
|
7
|
+
constructor(baseUrl, apiKey, timeout = 120000) {
|
|
8
|
+
// Circuit breaker state
|
|
9
|
+
this.consecutiveFailures = 0;
|
|
10
|
+
this.circuitOpenUntil = 0;
|
|
11
|
+
// Ensure base URL doesn't have trailing slash
|
|
12
|
+
this.baseUrl = baseUrl.replace(/\/$/, '');
|
|
13
|
+
this.apiKey = apiKey;
|
|
14
|
+
this.timeout = timeout;
|
|
15
|
+
this.debug = process.env.DEBUG_BACKEND_CLIENT === 'true';
|
|
16
|
+
}
|
|
17
|
+
log(message) {
|
|
18
|
+
if (this.debug) {
|
|
19
|
+
console.log(message);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async request(method, path, body) {
|
|
23
|
+
// Circuit breaker check
|
|
24
|
+
if (Date.now() < this.circuitOpenUntil) {
|
|
25
|
+
const waitSec = Math.ceil((this.circuitOpenUntil - Date.now()) / 1000);
|
|
26
|
+
throw new Error(`Circuit breaker open - backend unavailable. Retry in ${waitSec}s`);
|
|
27
|
+
}
|
|
28
|
+
const url = `${this.baseUrl}${path}`;
|
|
29
|
+
const headers = {
|
|
30
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
31
|
+
'Content-Type': 'application/json',
|
|
32
|
+
};
|
|
33
|
+
// Create abort controller for timeout
|
|
34
|
+
const controller = new AbortController();
|
|
35
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
36
|
+
const options = {
|
|
37
|
+
method,
|
|
38
|
+
headers,
|
|
39
|
+
signal: controller.signal,
|
|
40
|
+
};
|
|
41
|
+
if (body && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {
|
|
42
|
+
options.body = JSON.stringify(body);
|
|
43
|
+
}
|
|
44
|
+
this.log(`[BackendClient] ${method} ${path}`);
|
|
45
|
+
try {
|
|
46
|
+
const response = await fetch(url, options);
|
|
47
|
+
// Check Content-Type before parsing JSON
|
|
48
|
+
const contentType = response.headers.get('content-type');
|
|
49
|
+
if (!contentType?.includes('application/json')) {
|
|
50
|
+
throw new Error(`Expected JSON response but got ${contentType || 'unknown'}: ${response.status} ${response.statusText}`);
|
|
51
|
+
}
|
|
52
|
+
const data = await response.json();
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
const error = data;
|
|
55
|
+
throw new Error(error.error?.message || `HTTP ${response.status}: ${response.statusText}`);
|
|
56
|
+
}
|
|
57
|
+
// Success - reset circuit breaker
|
|
58
|
+
this.consecutiveFailures = 0;
|
|
59
|
+
return data;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
// Track failures for circuit breaker
|
|
63
|
+
this.consecutiveFailures++;
|
|
64
|
+
if (this.consecutiveFailures >= BackendClient.FAILURE_THRESHOLD) {
|
|
65
|
+
this.circuitOpenUntil = Date.now() + BackendClient.CIRCUIT_RESET_MS;
|
|
66
|
+
console.warn(`[BackendClient] Circuit breaker opened after ${this.consecutiveFailures} failures`);
|
|
67
|
+
}
|
|
68
|
+
if (error.name === 'AbortError') {
|
|
69
|
+
throw new Error(`Backend request timeout after ${this.timeout}ms: ${method} ${path}`);
|
|
70
|
+
}
|
|
71
|
+
if (error instanceof Error) {
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
throw new Error(`Request failed: ${String(error)}`);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
clearTimeout(timeoutId);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Request with automatic retry for transient failures
|
|
82
|
+
*/
|
|
83
|
+
async requestWithRetry(method, path, body, maxRetries = 2) {
|
|
84
|
+
let lastError = new Error('Unknown error');
|
|
85
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
86
|
+
try {
|
|
87
|
+
return await this.request(method, path, body);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
91
|
+
// Check if error is retryable (transient failures)
|
|
92
|
+
const isRetryable = /502|503|504|ECONNRESET|ETIMEDOUT|ECONNREFUSED|Circuit breaker/.test(lastError.message);
|
|
93
|
+
if (attempt < maxRetries && isRetryable) {
|
|
94
|
+
const delay = 1000 * Math.pow(2, attempt); // 1s, 2s, 4s
|
|
95
|
+
this.log(`[BackendClient] Retry ${attempt + 1}/${maxRetries} after ${delay}ms: ${lastError.message}`);
|
|
96
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
throw lastError;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
throw lastError;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Index code chunks into a collection
|
|
106
|
+
* The backend will handle embedding generation
|
|
107
|
+
*/
|
|
108
|
+
async indexChunks(request) {
|
|
109
|
+
this.log(`[BackendClient] Indexing ${request.chunks.length} chunks to collection: ${request.collection}`);
|
|
110
|
+
return this.requestWithRetry('POST', '/v1/index', request);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Search for code in a collection
|
|
114
|
+
* The backend handles embedding + hybrid search + optional reranking
|
|
115
|
+
*/
|
|
116
|
+
async search(request) {
|
|
117
|
+
this.log(`[BackendClient] Searching collection: ${request.collection}, query: "${request.query}"`);
|
|
118
|
+
return this.requestWithRetry('POST', '/v1/search', request);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* List all indexed collections (repos)
|
|
122
|
+
*/
|
|
123
|
+
async listRepos() {
|
|
124
|
+
this.log(`[BackendClient] Listing all repos`);
|
|
125
|
+
return this.requestWithRetry('GET', '/v1/repos');
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get status of a specific collection
|
|
129
|
+
*/
|
|
130
|
+
async getRepoStatus(collection) {
|
|
131
|
+
this.log(`[BackendClient] Getting status for collection: ${collection}`);
|
|
132
|
+
return this.requestWithRetry('GET', `/v1/repos/${encodeURIComponent(collection)}`);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Delete a collection
|
|
136
|
+
*/
|
|
137
|
+
async deleteRepo(collection) {
|
|
138
|
+
this.log(`[BackendClient] Deleting collection: ${collection}`);
|
|
139
|
+
return this.requestWithRetry('DELETE', `/v1/repos/${encodeURIComponent(collection)}`);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Delete all vectors for a specific file path
|
|
143
|
+
* Used by incremental indexer when files are deleted
|
|
144
|
+
*/
|
|
145
|
+
async deleteFileVectors(collection, relativePath) {
|
|
146
|
+
this.log(`[BackendClient] Deleting vectors for: ${relativePath} in ${collection}`);
|
|
147
|
+
return this.requestWithRetry('DELETE', `/v1/files?collection=${encodeURIComponent(collection)}&path=${encodeURIComponent(relativePath)}`);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Delete vectors for multiple file paths in a single batch operation
|
|
151
|
+
* Much faster than sequential deletes - uses OR filter
|
|
152
|
+
*/
|
|
153
|
+
async deleteFileVectorsBatch(collection, relativePaths) {
|
|
154
|
+
if (relativePaths.length === 0) {
|
|
155
|
+
return { success: true, pathsDeleted: 0 };
|
|
156
|
+
}
|
|
157
|
+
this.log(`[BackendClient] Batch deleting vectors for ${relativePaths.length} paths in ${collection}`);
|
|
158
|
+
return this.requestWithRetry('POST', '/v1/files/batch-delete', { collection, paths: relativePaths });
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check if a collection exists
|
|
162
|
+
*/
|
|
163
|
+
async hasCollection(collection) {
|
|
164
|
+
try {
|
|
165
|
+
await this.getRepoStatus(collection);
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
if (error instanceof Error && error.message.includes('not found')) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Health check for the backend
|
|
177
|
+
*/
|
|
178
|
+
async healthCheck() {
|
|
179
|
+
this.log(`[BackendClient] Health check`);
|
|
180
|
+
return this.requestWithRetry('GET', '/health');
|
|
181
|
+
}
|
|
182
|
+
// ==================== Sync API Methods ====================
|
|
183
|
+
/**
|
|
184
|
+
* Load codebase snapshot from backend
|
|
185
|
+
*/
|
|
186
|
+
async loadSnapshot() {
|
|
187
|
+
this.log(`[BackendClient] Loading codebase snapshot`);
|
|
188
|
+
const response = await this.requestWithRetry('GET', '/v1/sync/snapshot');
|
|
189
|
+
return response.snapshot;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Save codebase snapshot to backend
|
|
193
|
+
*/
|
|
194
|
+
async saveSnapshot(snapshot) {
|
|
195
|
+
this.log(`[BackendClient] Saving codebase snapshot`);
|
|
196
|
+
await this.requestWithRetry('PUT', '/v1/sync/snapshot', {
|
|
197
|
+
codebases: snapshot.codebases,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Update a single codebase's info in the snapshot
|
|
202
|
+
*/
|
|
203
|
+
async updateCodebaseInfo(codebasePath, info) {
|
|
204
|
+
this.log(`[BackendClient] Updating codebase info: ${codebasePath}`);
|
|
205
|
+
await this.requestWithRetry('PATCH', '/v1/sync/snapshot/codebase', {
|
|
206
|
+
codebasePath,
|
|
207
|
+
info,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Remove a codebase from the snapshot
|
|
212
|
+
*/
|
|
213
|
+
async removeCodebaseFromSnapshot(codebasePath) {
|
|
214
|
+
this.log(`[BackendClient] Removing codebase from snapshot: ${codebasePath}`);
|
|
215
|
+
await this.requestWithRetry('DELETE', `/v1/sync/snapshot/codebase/${encodeURIComponent(codebasePath)}`);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Load Merkle snapshot for a codebase
|
|
219
|
+
*/
|
|
220
|
+
async loadMerkleSnapshot(codebasePath) {
|
|
221
|
+
this.log(`[BackendClient] Loading Merkle snapshot: ${codebasePath}`);
|
|
222
|
+
const response = await this.requestWithRetry('GET', `/v1/sync/merkle/by-path?path=${encodeURIComponent(codebasePath)}`);
|
|
223
|
+
return response.snapshot;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Save Merkle snapshot for a codebase
|
|
227
|
+
*/
|
|
228
|
+
async saveMerkleSnapshot(codebasePath, snapshot) {
|
|
229
|
+
this.log(`[BackendClient] Saving Merkle snapshot: ${codebasePath}`);
|
|
230
|
+
await this.requestWithRetry('PUT', '/v1/sync/merkle', {
|
|
231
|
+
codebasePath,
|
|
232
|
+
fileHashes: snapshot.fileHashes,
|
|
233
|
+
merkleDAG: snapshot.merkleDAG,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Delete Merkle snapshot for a codebase
|
|
238
|
+
*/
|
|
239
|
+
async deleteMerkleSnapshot(codebasePath) {
|
|
240
|
+
this.log(`[BackendClient] Deleting Merkle snapshot: ${codebasePath}`);
|
|
241
|
+
await this.requestWithRetry('DELETE', `/v1/sync/merkle?path=${encodeURIComponent(codebasePath)}`);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* List all codebases with Merkle info
|
|
245
|
+
*/
|
|
246
|
+
async listSyncCodebases() {
|
|
247
|
+
this.log(`[BackendClient] Listing sync codebases`);
|
|
248
|
+
const response = await this.requestWithRetry('GET', '/v1/sync/codebases');
|
|
249
|
+
return response.codebases;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
BackendClient.FAILURE_THRESHOLD = 3;
|
|
253
|
+
BackendClient.CIRCUIT_RESET_MS = 30000; // 30 seconds
|
|
254
|
+
/**
|
|
255
|
+
* Create a BackendClient from environment variables
|
|
256
|
+
*/
|
|
257
|
+
export function createBackendClient() {
|
|
258
|
+
const baseUrl = process.env.SHARC_BACKEND_URL;
|
|
259
|
+
const apiKey = process.env.SHARC_API_KEY;
|
|
260
|
+
if (!baseUrl) {
|
|
261
|
+
throw new Error('SHARC_BACKEND_URL environment variable is required');
|
|
262
|
+
}
|
|
263
|
+
if (!apiKey) {
|
|
264
|
+
throw new Error('SHARC_API_KEY environment variable is required');
|
|
265
|
+
}
|
|
266
|
+
console.log(`[BackendClient] Initializing with backend URL: ${baseUrl}`);
|
|
267
|
+
return new BackendClient(baseUrl, apiKey);
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=backend-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-client.js","sourceRoot":"","sources":["../src/backend-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqKH,MAAM,OAAO,aAAa;IAYtB,YAAY,OAAe,EAAE,MAAc,EAAE,UAAkB,MAAM;QANrE,wBAAwB;QAChB,wBAAmB,GAAG,CAAC,CAAC;QACxB,qBAAgB,GAAG,CAAC,CAAC;QAKzB,8CAA8C;QAC9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM,CAAC;IAC7D,CAAC;IAEO,GAAG,CAAC,OAAe;QACvB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO,CACjB,MAAmD,EACnD,IAAY,EACZ,IAAU;QAEV,wBAAwB;QACxB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,wDAAwD,OAAO,GAAG,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QAErC,MAAM,OAAO,GAA2B;YACpC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACxC,cAAc,EAAE,kBAAkB;SACrC,CAAC;QAEF,sCAAsC;QACtC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAErE,MAAM,OAAO,GAAgB;YACzB,MAAM;YACN,OAAO;YACP,MAAM,EAAE,UAAU,CAAC,MAAM;SAC5B,CAAC;QAEF,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,OAAO,CAAC,EAAE,CAAC;YACxE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,mBAAmB,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAE3C,yCAAyC;YACzC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACzD,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,kCAAkC,WAAW,IAAI,SAAS,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC7H,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,KAAK,GAAG,IAAoB,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/F,CAAC;YAED,kCAAkC;YAClC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAE7B,OAAO,IAAS,CAAC;QACrB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,qCAAqC;YACrC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,mBAAmB,IAAI,aAAa,CAAC,iBAAiB,EAAE,CAAC;gBAC9D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,gBAAgB,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC,gDAAgD,IAAI,CAAC,mBAAmB,WAAW,CAAC,CAAC;YACtG,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,OAAO,OAAO,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;YAC1F,CAAC;YACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC;YAChB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACP,YAAY,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAC1B,MAAmD,EACnD,IAAY,EACZ,IAAU,EACV,aAAqB,CAAC;QAEtB,IAAI,SAAS,GAAU,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAElD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC;gBACD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBAClB,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAEtE,mDAAmD;gBACnD,MAAM,WAAW,GAAG,+DAA+D,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAE5G,IAAI,OAAO,GAAG,UAAU,IAAI,WAAW,EAAE,CAAC;oBACtC,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa;oBACxD,IAAI,CAAC,GAAG,CAAC,yBAAyB,OAAO,GAAG,CAAC,IAAI,UAAU,UAAU,KAAK,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;oBACtG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;oBACzD,SAAS;gBACb,CAAC;gBAED,MAAM,SAAS,CAAC;YACpB,CAAC;QACL,CAAC;QAED,MAAM,SAAS,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,OAAqB;QACnC,IAAI,CAAC,GAAG,CAAC,4BAA4B,OAAO,CAAC,MAAM,CAAC,MAAM,0BAA0B,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1G,OAAO,IAAI,CAAC,gBAAgB,CAAgB,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,OAAsB;QAC/B,IAAI,CAAC,GAAG,CAAC,yCAAyC,OAAO,CAAC,UAAU,aAAa,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;QACnG,OAAO,IAAI,CAAC,gBAAgB,CAAiB,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACX,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,gBAAgB,CAAoB,KAAK,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,UAAkB;QAClC,IAAI,CAAC,GAAG,CAAC,kDAAkD,UAAU,EAAE,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,gBAAgB,CAAqB,KAAK,EAAE,aAAa,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,UAAkB;QAC/B,IAAI,CAAC,GAAG,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,gBAAgB,CAAqB,QAAQ,EAAE,aAAa,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CAAC,UAAkB,EAAE,YAAoB;QAC5D,IAAI,CAAC,GAAG,CAAC,yCAAyC,YAAY,OAAO,UAAU,EAAE,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,gBAAgB,CACxB,QAAQ,EACR,wBAAwB,kBAAkB,CAAC,UAAU,CAAC,SAAS,kBAAkB,CAAC,YAAY,CAAC,EAAE,CACpG,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,sBAAsB,CAAC,UAAkB,EAAE,aAAuB;QACpE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,8CAA8C,aAAa,CAAC,MAAM,aAAa,UAAU,EAAE,CAAC,CAAC;QACtG,OAAO,IAAI,CAAC,gBAAgB,CACxB,MAAM,EACN,wBAAwB,EACxB,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,CACvC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,UAAkB;QAClC,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChE,OAAO,KAAK,CAAC;YACjB,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACb,IAAI,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,gBAAgB,CAAwC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1F,CAAC;IAED,6DAA6D;IAE7D;;OAEG;IACH,KAAK,CAAC,YAAY;QACd,IAAI,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAuB,KAAK,EAAE,mBAAmB,CAAC,CAAC;QAC/F,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,QAA4B;QAC3C,IAAI,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,gBAAgB,CAAuB,KAAK,EAAE,mBAAmB,EAAE;YAC1E,SAAS,EAAE,QAAQ,CAAC,SAAS;SAChC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,YAAoB,EAAE,IAAkB;QAC7D,IAAI,CAAC,GAAG,CAAC,2CAA2C,YAAY,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,gBAAgB,CAAuB,OAAO,EAAE,4BAA4B,EAAE;YACrF,YAAY;YACZ,IAAI;SACP,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,0BAA0B,CAAC,YAAoB;QACjD,IAAI,CAAC,GAAG,CAAC,oDAAoD,YAAY,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,CAAC,gBAAgB,CACvB,QAAQ,EACR,8BAA8B,kBAAkB,CAAC,YAAY,CAAC,EAAE,CACnE,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,YAAoB;QACzC,IAAI,CAAC,GAAG,CAAC,4CAA4C,YAAY,EAAE,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACxC,KAAK,EACL,gCAAgC,kBAAkB,CAAC,YAAY,CAAC,EAAE,CACrE,CAAC;QACF,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,YAAoB,EAAE,QAAwB;QACnE,IAAI,CAAC,GAAG,CAAC,2CAA2C,YAAY,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,gBAAgB,CAAuB,KAAK,EAAE,iBAAiB,EAAE;YACxE,YAAY;YACZ,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,SAAS,EAAE,QAAQ,CAAC,SAAS;SAChC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,YAAoB;QAC3C,IAAI,CAAC,GAAG,CAAC,6CAA6C,YAAY,EAAE,CAAC,CAAC;QACtE,MAAM,IAAI,CAAC,gBAAgB,CACvB,QAAQ,EACR,wBAAwB,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAC7D,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACnB,IAAI,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAwB,KAAK,EAAE,oBAAoB,CAAC,CAAC;QACjG,OAAO,QAAQ,CAAC,SAAS,CAAC;IAC9B,CAAC;;AA/SuB,+BAAiB,GAAG,CAAC,AAAJ,CAAK;AACtB,8BAAgB,GAAG,KAAK,AAAR,CAAS,CAAC,aAAa;AAiTnE;;GAEG;AACH,MAAM,UAAU,mBAAmB;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kDAAkD,OAAO,EAAE,CAAC,CAAC;IACzE,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC"}
|