@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.
Files changed (50) hide show
  1. package/README.md +134 -0
  2. package/dist/backend-client.d.ts +251 -0
  3. package/dist/backend-client.d.ts.map +1 -0
  4. package/dist/backend-client.js +269 -0
  5. package/dist/backend-client.js.map +1 -0
  6. package/dist/backend-handlers.d.ts +243 -0
  7. package/dist/backend-handlers.d.ts.map +1 -0
  8. package/dist/backend-handlers.js +1453 -0
  9. package/dist/backend-handlers.js.map +1 -0
  10. package/dist/config.d.ts +47 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +94 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +344 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/project-detector.d.ts +42 -0
  19. package/dist/project-detector.d.ts.map +1 -0
  20. package/dist/project-detector.js +135 -0
  21. package/dist/project-detector.js.map +1 -0
  22. package/dist/utils/env-manager.d.ts +19 -0
  23. package/dist/utils/env-manager.d.ts.map +1 -0
  24. package/dist/utils/env-manager.js +99 -0
  25. package/dist/utils/env-manager.js.map +1 -0
  26. package/dist/utils.d.ts +10 -0
  27. package/dist/utils.d.ts.map +1 -0
  28. package/dist/utils.js +27 -0
  29. package/dist/utils.js.map +1 -0
  30. package/dist/watcher/file-watcher.d.ts +64 -0
  31. package/dist/watcher/file-watcher.d.ts.map +1 -0
  32. package/dist/watcher/file-watcher.js +263 -0
  33. package/dist/watcher/file-watcher.js.map +1 -0
  34. package/dist/watcher/incremental-indexer.d.ts +68 -0
  35. package/dist/watcher/incremental-indexer.d.ts.map +1 -0
  36. package/dist/watcher/incremental-indexer.js +254 -0
  37. package/dist/watcher/incremental-indexer.js.map +1 -0
  38. package/dist/watcher/index.d.ts +10 -0
  39. package/dist/watcher/index.d.ts.map +1 -0
  40. package/dist/watcher/index.js +10 -0
  41. package/dist/watcher/index.js.map +1 -0
  42. package/dist/watcher/processing-queue.d.ts +79 -0
  43. package/dist/watcher/processing-queue.d.ts.map +1 -0
  44. package/dist/watcher/processing-queue.js +150 -0
  45. package/dist/watcher/processing-queue.js.map +1 -0
  46. package/dist/watcher/syntax-guard.d.ts +59 -0
  47. package/dist/watcher/syntax-guard.d.ts.map +1 -0
  48. package/dist/watcher/syntax-guard.js +136 -0
  49. package/dist/watcher/syntax-guard.js.map +1 -0
  50. 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":"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"}