agentdb 1.5.8 → 1.6.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 +11 -11
- package/dist/agentdb.min.js +4 -4
- package/dist/cli/agentdb-cli.d.ts +29 -0
- package/dist/cli/agentdb-cli.d.ts.map +1 -1
- package/dist/cli/agentdb-cli.js +1009 -34
- package/dist/cli/agentdb-cli.js.map +1 -1
- package/dist/controllers/ContextSynthesizer.d.ts +65 -0
- package/dist/controllers/ContextSynthesizer.d.ts.map +1 -0
- package/dist/controllers/ContextSynthesizer.js +208 -0
- package/dist/controllers/ContextSynthesizer.js.map +1 -0
- package/dist/controllers/MMRDiversityRanker.d.ts +50 -0
- package/dist/controllers/MMRDiversityRanker.d.ts.map +1 -0
- package/dist/controllers/MMRDiversityRanker.js +130 -0
- package/dist/controllers/MMRDiversityRanker.js.map +1 -0
- package/dist/controllers/MetadataFilter.d.ts +70 -0
- package/dist/controllers/MetadataFilter.d.ts.map +1 -0
- package/dist/controllers/MetadataFilter.js +243 -0
- package/dist/controllers/MetadataFilter.js.map +1 -0
- package/dist/controllers/QUICClient.d.ts +109 -0
- package/dist/controllers/QUICClient.d.ts.map +1 -0
- package/dist/controllers/QUICClient.js +299 -0
- package/dist/controllers/QUICClient.js.map +1 -0
- package/dist/controllers/QUICServer.d.ts +121 -0
- package/dist/controllers/QUICServer.d.ts.map +1 -0
- package/dist/controllers/QUICServer.js +383 -0
- package/dist/controllers/QUICServer.js.map +1 -0
- package/dist/controllers/SyncCoordinator.d.ts +120 -0
- package/dist/controllers/SyncCoordinator.d.ts.map +1 -0
- package/dist/controllers/SyncCoordinator.js +441 -0
- package/dist/controllers/SyncCoordinator.js.map +1 -0
- package/dist/controllers/WASMVectorSearch.d.ts.map +1 -1
- package/dist/controllers/WASMVectorSearch.js +10 -2
- package/dist/controllers/WASMVectorSearch.js.map +1 -1
- package/dist/controllers/index.d.ts +12 -0
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js +6 -0
- package/dist/controllers/index.js.map +1 -1
- package/dist/db-fallback.d.ts.map +1 -1
- package/dist/db-fallback.js +14 -11
- package/dist/db-fallback.js.map +1 -1
- package/dist/examples/quic-sync-example.d.ts +9 -0
- package/dist/examples/quic-sync-example.d.ts.map +1 -0
- package/dist/examples/quic-sync-example.js +169 -0
- package/dist/examples/quic-sync-example.js.map +1 -0
- package/dist/types/quic.d.ts +518 -0
- package/dist/types/quic.d.ts.map +1 -0
- package/dist/types/quic.js +272 -0
- package/dist/types/quic.js.map +1 -0
- package/package.json +9 -3
- package/src/browser-entry.js +41 -6
- package/src/cli/agentdb-cli.ts +1114 -33
- package/src/controllers/ContextSynthesizer.ts +285 -0
- package/src/controllers/MMRDiversityRanker.ts +187 -0
- package/src/controllers/MetadataFilter.ts +280 -0
- package/src/controllers/QUICClient.ts +413 -0
- package/src/controllers/QUICServer.ts +498 -0
- package/src/controllers/SyncCoordinator.ts +597 -0
- package/src/controllers/WASMVectorSearch.ts +11 -2
- package/src/controllers/index.ts +12 -0
- package/src/db-fallback.ts +13 -10
- package/src/examples/quic-sync-example.ts +198 -0
- package/src/types/quic.ts +772 -0
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QUICServer - QUIC Protocol Server for AgentDB Synchronization
|
|
3
|
+
*
|
|
4
|
+
* Implements a QUIC server for receiving and handling synchronization requests
|
|
5
|
+
* from remote AgentDB instances. Supports episodes, skills, and edge synchronization.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Start/stop server lifecycle management
|
|
9
|
+
* - Client connection handling
|
|
10
|
+
* - Authentication and authorization
|
|
11
|
+
* - Rate limiting per client
|
|
12
|
+
* - Sync request processing (episodes, skills, edges)
|
|
13
|
+
* - Comprehensive error handling and logging
|
|
14
|
+
*/
|
|
15
|
+
import chalk from 'chalk';
|
|
16
|
+
export class QUICServer {
|
|
17
|
+
db;
|
|
18
|
+
config;
|
|
19
|
+
isRunning = false;
|
|
20
|
+
connections = new Map();
|
|
21
|
+
rateLimitState = new Map();
|
|
22
|
+
server = null;
|
|
23
|
+
cleanupInterval = null;
|
|
24
|
+
constructor(db, config = {}) {
|
|
25
|
+
this.db = db;
|
|
26
|
+
this.config = {
|
|
27
|
+
host: config.host || '0.0.0.0',
|
|
28
|
+
port: config.port || 4433,
|
|
29
|
+
maxConnections: config.maxConnections || 100,
|
|
30
|
+
authToken: config.authToken || '',
|
|
31
|
+
rateLimit: config.rateLimit || {
|
|
32
|
+
maxRequestsPerMinute: 60,
|
|
33
|
+
maxBytesPerMinute: 10 * 1024 * 1024, // 10MB
|
|
34
|
+
},
|
|
35
|
+
tlsConfig: config.tlsConfig || {},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Start the QUIC server
|
|
40
|
+
*/
|
|
41
|
+
async start() {
|
|
42
|
+
if (this.isRunning) {
|
|
43
|
+
console.log(chalk.yellow('⚠️ QUIC server is already running'));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
console.log(chalk.blue('🚀 Starting QUIC server...'));
|
|
48
|
+
console.log(chalk.gray(` Host: ${this.config.host}`));
|
|
49
|
+
console.log(chalk.gray(` Port: ${this.config.port}`));
|
|
50
|
+
// Note: Actual QUIC implementation would use a library like @fails-components/webtransport
|
|
51
|
+
// or node-quic. This is a reference implementation showing the interface.
|
|
52
|
+
// Initialize server state
|
|
53
|
+
this.isRunning = true;
|
|
54
|
+
this.startCleanupInterval();
|
|
55
|
+
console.log(chalk.green('✓ QUIC server started successfully'));
|
|
56
|
+
console.log(chalk.gray(` Max connections: ${this.config.maxConnections}`));
|
|
57
|
+
console.log(chalk.gray(` Rate limit: ${this.config.rateLimit.maxRequestsPerMinute} req/min`));
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const err = error;
|
|
61
|
+
console.error(chalk.red('✗ Failed to start QUIC server:'), err.message);
|
|
62
|
+
throw new Error(`QUIC server start failed: ${err.message}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Stop the QUIC server
|
|
67
|
+
*/
|
|
68
|
+
async stop() {
|
|
69
|
+
if (!this.isRunning) {
|
|
70
|
+
console.log(chalk.yellow('⚠️ QUIC server is not running'));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
console.log(chalk.blue('🛑 Stopping QUIC server...'));
|
|
75
|
+
// Close all connections
|
|
76
|
+
for (const [clientId, connection] of this.connections.entries()) {
|
|
77
|
+
console.log(chalk.gray(` Closing connection: ${clientId}`));
|
|
78
|
+
// Close connection logic here
|
|
79
|
+
}
|
|
80
|
+
this.connections.clear();
|
|
81
|
+
this.rateLimitState.clear();
|
|
82
|
+
// Stop cleanup interval
|
|
83
|
+
if (this.cleanupInterval) {
|
|
84
|
+
clearInterval(this.cleanupInterval);
|
|
85
|
+
this.cleanupInterval = null;
|
|
86
|
+
}
|
|
87
|
+
// Close server
|
|
88
|
+
if (this.server) {
|
|
89
|
+
// await this.server.close();
|
|
90
|
+
this.server = null;
|
|
91
|
+
}
|
|
92
|
+
this.isRunning = false;
|
|
93
|
+
console.log(chalk.green('✓ QUIC server stopped successfully'));
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const err = error;
|
|
97
|
+
console.error(chalk.red('✗ Error stopping QUIC server:'), err.message);
|
|
98
|
+
throw new Error(`QUIC server stop failed: ${err.message}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Handle incoming client connection
|
|
103
|
+
*/
|
|
104
|
+
async handleConnection(clientId, address) {
|
|
105
|
+
// Check max connections
|
|
106
|
+
if (this.connections.size >= this.config.maxConnections) {
|
|
107
|
+
console.log(chalk.yellow(`⚠️ Max connections reached, rejecting ${clientId}`));
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
// Register connection
|
|
111
|
+
const connection = {
|
|
112
|
+
id: clientId,
|
|
113
|
+
address,
|
|
114
|
+
connectedAt: Date.now(),
|
|
115
|
+
requestCount: 0,
|
|
116
|
+
bytesReceived: 0,
|
|
117
|
+
lastRequestAt: 0,
|
|
118
|
+
};
|
|
119
|
+
this.connections.set(clientId, connection);
|
|
120
|
+
console.log(chalk.green(`✓ Client connected: ${clientId} from ${address}`));
|
|
121
|
+
console.log(chalk.gray(` Active connections: ${this.connections.size}`));
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Authenticate client request
|
|
126
|
+
*/
|
|
127
|
+
authenticate(clientId, authToken) {
|
|
128
|
+
if (!this.config.authToken) {
|
|
129
|
+
return true; // No auth required
|
|
130
|
+
}
|
|
131
|
+
const isValid = authToken === this.config.authToken;
|
|
132
|
+
if (!isValid) {
|
|
133
|
+
console.log(chalk.red(`✗ Authentication failed for client: ${clientId}`));
|
|
134
|
+
}
|
|
135
|
+
return isValid;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Check rate limits for client
|
|
139
|
+
*/
|
|
140
|
+
checkRateLimit(clientId, requestSize) {
|
|
141
|
+
const now = Date.now();
|
|
142
|
+
let state = this.rateLimitState.get(clientId);
|
|
143
|
+
if (!state || now - state.windowStart > 60000) {
|
|
144
|
+
// New window
|
|
145
|
+
state = {
|
|
146
|
+
requestCount: 0,
|
|
147
|
+
bytesTransferred: 0,
|
|
148
|
+
windowStart: now,
|
|
149
|
+
};
|
|
150
|
+
this.rateLimitState.set(clientId, state);
|
|
151
|
+
}
|
|
152
|
+
// Check limits
|
|
153
|
+
if (state.requestCount >= this.config.rateLimit.maxRequestsPerMinute) {
|
|
154
|
+
console.log(chalk.yellow(`⚠️ Rate limit exceeded (requests) for ${clientId}`));
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
if (state.bytesTransferred + requestSize > this.config.rateLimit.maxBytesPerMinute) {
|
|
158
|
+
console.log(chalk.yellow(`⚠️ Rate limit exceeded (bytes) for ${clientId}`));
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
// Update state
|
|
162
|
+
state.requestCount++;
|
|
163
|
+
state.bytesTransferred += requestSize;
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Process sync request from client
|
|
168
|
+
*/
|
|
169
|
+
async processSyncRequest(clientId, request, authToken) {
|
|
170
|
+
try {
|
|
171
|
+
// Authenticate
|
|
172
|
+
if (!this.authenticate(clientId, authToken)) {
|
|
173
|
+
return {
|
|
174
|
+
success: false,
|
|
175
|
+
error: 'Authentication failed',
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
// Check rate limit
|
|
179
|
+
const requestSize = JSON.stringify(request).length;
|
|
180
|
+
if (!this.checkRateLimit(clientId, requestSize)) {
|
|
181
|
+
return {
|
|
182
|
+
success: false,
|
|
183
|
+
error: 'Rate limit exceeded',
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// Update connection stats
|
|
187
|
+
const connection = this.connections.get(clientId);
|
|
188
|
+
if (connection) {
|
|
189
|
+
connection.requestCount++;
|
|
190
|
+
connection.bytesReceived += requestSize;
|
|
191
|
+
connection.lastRequestAt = Date.now();
|
|
192
|
+
}
|
|
193
|
+
console.log(chalk.blue(`📥 Processing sync request from ${clientId}`));
|
|
194
|
+
console.log(chalk.gray(` Type: ${request.type}`));
|
|
195
|
+
console.log(chalk.gray(` Since: ${request.since || 'full sync'}`));
|
|
196
|
+
// Process based on type
|
|
197
|
+
let data;
|
|
198
|
+
let count = 0;
|
|
199
|
+
switch (request.type) {
|
|
200
|
+
case 'episodes':
|
|
201
|
+
data = await this.syncEpisodes(request);
|
|
202
|
+
count = data.length;
|
|
203
|
+
break;
|
|
204
|
+
case 'skills':
|
|
205
|
+
data = await this.syncSkills(request);
|
|
206
|
+
count = data.length;
|
|
207
|
+
break;
|
|
208
|
+
case 'edges':
|
|
209
|
+
data = await this.syncEdges(request);
|
|
210
|
+
count = data.length;
|
|
211
|
+
break;
|
|
212
|
+
case 'full':
|
|
213
|
+
data = await this.syncFull(request);
|
|
214
|
+
count = data.episodes?.length + data.skills?.length + data.edges?.length || 0;
|
|
215
|
+
break;
|
|
216
|
+
default:
|
|
217
|
+
return {
|
|
218
|
+
success: false,
|
|
219
|
+
error: `Unknown sync type: ${request.type}`,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
console.log(chalk.green(`✓ Sync completed: ${count} items sent`));
|
|
223
|
+
return {
|
|
224
|
+
success: true,
|
|
225
|
+
data,
|
|
226
|
+
count,
|
|
227
|
+
hasMore: false, // Could implement pagination here
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
const err = error;
|
|
232
|
+
console.error(chalk.red('✗ Sync request failed:'), err.message);
|
|
233
|
+
return {
|
|
234
|
+
success: false,
|
|
235
|
+
error: err.message,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Sync episodes data
|
|
241
|
+
*/
|
|
242
|
+
async syncEpisodes(request) {
|
|
243
|
+
const { since, filters, batchSize = 1000 } = request;
|
|
244
|
+
let query = 'SELECT * FROM episodes WHERE 1=1';
|
|
245
|
+
const params = [];
|
|
246
|
+
if (since) {
|
|
247
|
+
query += ' AND ts > ?';
|
|
248
|
+
params.push(since);
|
|
249
|
+
}
|
|
250
|
+
// Apply filters
|
|
251
|
+
if (filters) {
|
|
252
|
+
if (filters.sessionId) {
|
|
253
|
+
query += ' AND session_id = ?';
|
|
254
|
+
params.push(filters.sessionId);
|
|
255
|
+
}
|
|
256
|
+
if (filters.success !== undefined) {
|
|
257
|
+
query += ' AND success = ?';
|
|
258
|
+
params.push(filters.success ? 1 : 0);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
query += ` ORDER BY ts DESC LIMIT ${batchSize}`;
|
|
262
|
+
const stmt = this.db.prepare(query);
|
|
263
|
+
const rows = stmt.all(...params);
|
|
264
|
+
return rows.map((row) => ({
|
|
265
|
+
id: row.id,
|
|
266
|
+
ts: row.ts,
|
|
267
|
+
sessionId: row.session_id,
|
|
268
|
+
task: row.task,
|
|
269
|
+
input: row.input,
|
|
270
|
+
output: row.output,
|
|
271
|
+
critique: row.critique,
|
|
272
|
+
reward: row.reward,
|
|
273
|
+
success: row.success === 1,
|
|
274
|
+
latencyMs: row.latency_ms,
|
|
275
|
+
tokensUsed: row.tokens_used,
|
|
276
|
+
tags: row.tags ? JSON.parse(row.tags) : [],
|
|
277
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : {},
|
|
278
|
+
}));
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Sync skills data
|
|
282
|
+
*/
|
|
283
|
+
async syncSkills(request) {
|
|
284
|
+
const { since, batchSize = 1000 } = request;
|
|
285
|
+
let query = 'SELECT * FROM skills WHERE 1=1';
|
|
286
|
+
const params = [];
|
|
287
|
+
if (since) {
|
|
288
|
+
query += ' AND ts > ?';
|
|
289
|
+
params.push(since);
|
|
290
|
+
}
|
|
291
|
+
query += ` ORDER BY ts DESC LIMIT ${batchSize}`;
|
|
292
|
+
const stmt = this.db.prepare(query);
|
|
293
|
+
const rows = stmt.all(...params);
|
|
294
|
+
return rows.map((row) => ({
|
|
295
|
+
id: row.id,
|
|
296
|
+
ts: row.ts,
|
|
297
|
+
name: row.name,
|
|
298
|
+
description: row.description,
|
|
299
|
+
code: row.code,
|
|
300
|
+
successRate: row.success_rate,
|
|
301
|
+
usageCount: row.usage_count,
|
|
302
|
+
avgReward: row.avg_reward,
|
|
303
|
+
tags: row.tags ? JSON.parse(row.tags) : [],
|
|
304
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : {},
|
|
305
|
+
}));
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Sync edges (skill relationships)
|
|
309
|
+
*/
|
|
310
|
+
async syncEdges(request) {
|
|
311
|
+
const { since, batchSize = 1000 } = request;
|
|
312
|
+
let query = 'SELECT * FROM skill_edges WHERE 1=1';
|
|
313
|
+
const params = [];
|
|
314
|
+
if (since) {
|
|
315
|
+
query += ' AND ts > ?';
|
|
316
|
+
params.push(since);
|
|
317
|
+
}
|
|
318
|
+
query += ` ORDER BY ts DESC LIMIT ${batchSize}`;
|
|
319
|
+
const stmt = this.db.prepare(query);
|
|
320
|
+
const rows = stmt.all(...params);
|
|
321
|
+
return rows.map((row) => ({
|
|
322
|
+
id: row.id,
|
|
323
|
+
ts: row.ts,
|
|
324
|
+
fromSkillId: row.from_skill_id,
|
|
325
|
+
toSkillId: row.to_skill_id,
|
|
326
|
+
weight: row.weight,
|
|
327
|
+
coOccurrences: row.co_occurrences,
|
|
328
|
+
}));
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Full sync of all data
|
|
332
|
+
*/
|
|
333
|
+
async syncFull(request) {
|
|
334
|
+
const [episodes, skills, edges] = await Promise.all([
|
|
335
|
+
this.syncEpisodes(request),
|
|
336
|
+
this.syncSkills(request),
|
|
337
|
+
this.syncEdges(request),
|
|
338
|
+
]);
|
|
339
|
+
return {
|
|
340
|
+
episodes,
|
|
341
|
+
skills,
|
|
342
|
+
edges,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Start cleanup interval for stale connections
|
|
347
|
+
*/
|
|
348
|
+
startCleanupInterval() {
|
|
349
|
+
this.cleanupInterval = setInterval(() => {
|
|
350
|
+
const now = Date.now();
|
|
351
|
+
const staleThreshold = 5 * 60 * 1000; // 5 minutes
|
|
352
|
+
for (const [clientId, connection] of this.connections.entries()) {
|
|
353
|
+
if (now - connection.lastRequestAt > staleThreshold && connection.requestCount > 0) {
|
|
354
|
+
console.log(chalk.gray(`🧹 Removing stale connection: ${clientId}`));
|
|
355
|
+
this.connections.delete(clientId);
|
|
356
|
+
this.rateLimitState.delete(clientId);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}, 60000); // Run every minute
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Get server status
|
|
363
|
+
*/
|
|
364
|
+
getStatus() {
|
|
365
|
+
let totalRequests = 0;
|
|
366
|
+
for (const connection of this.connections.values()) {
|
|
367
|
+
totalRequests += connection.requestCount;
|
|
368
|
+
}
|
|
369
|
+
return {
|
|
370
|
+
isRunning: this.isRunning,
|
|
371
|
+
activeConnections: this.connections.size,
|
|
372
|
+
totalRequests,
|
|
373
|
+
config: this.config,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Get connection info
|
|
378
|
+
*/
|
|
379
|
+
getConnections() {
|
|
380
|
+
return Array.from(this.connections.values());
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=QUICServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QUICServer.js","sourceRoot":"","sources":["../../src/controllers/QUICServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SyncCoordinator - Orchestrate AgentDB Synchronization
|
|
3
|
+
*
|
|
4
|
+
* Coordinates bidirectional synchronization between local and remote AgentDB instances.
|
|
5
|
+
* Handles change detection, conflict resolution, batching, and progress tracking.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Detect changes since last sync
|
|
9
|
+
* - Bidirectional sync (push and pull)
|
|
10
|
+
* - Conflict resolution strategies
|
|
11
|
+
* - Batch operations for efficiency
|
|
12
|
+
* - Progress tracking and reporting
|
|
13
|
+
* - Comprehensive error handling
|
|
14
|
+
* - Sync state persistence
|
|
15
|
+
*/
|
|
16
|
+
import { QUICClient } from './QUICClient.js';
|
|
17
|
+
import { QUICServer } from './QUICServer.js';
|
|
18
|
+
type Database = any;
|
|
19
|
+
export interface SyncCoordinatorConfig {
|
|
20
|
+
db: Database;
|
|
21
|
+
client?: QUICClient;
|
|
22
|
+
server?: QUICServer;
|
|
23
|
+
conflictStrategy?: 'local-wins' | 'remote-wins' | 'latest-wins' | 'merge';
|
|
24
|
+
batchSize?: number;
|
|
25
|
+
autoSync?: boolean;
|
|
26
|
+
syncIntervalMs?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface SyncState {
|
|
29
|
+
lastSyncAt: number;
|
|
30
|
+
lastEpisodeSync: number;
|
|
31
|
+
lastSkillSync: number;
|
|
32
|
+
lastEdgeSync: number;
|
|
33
|
+
totalItemsSynced: number;
|
|
34
|
+
totalBytesSynced: number;
|
|
35
|
+
syncCount: number;
|
|
36
|
+
lastError?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface SyncProgress {
|
|
39
|
+
phase: 'detecting' | 'pushing' | 'pulling' | 'resolving' | 'applying' | 'completed' | 'error';
|
|
40
|
+
current: number;
|
|
41
|
+
total: number;
|
|
42
|
+
itemType?: string;
|
|
43
|
+
message?: string;
|
|
44
|
+
error?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SyncReport {
|
|
47
|
+
success: boolean;
|
|
48
|
+
startTime: number;
|
|
49
|
+
endTime: number;
|
|
50
|
+
durationMs: number;
|
|
51
|
+
itemsPushed: number;
|
|
52
|
+
itemsPulled: number;
|
|
53
|
+
conflictsResolved: number;
|
|
54
|
+
errors: string[];
|
|
55
|
+
bytesTransferred: number;
|
|
56
|
+
}
|
|
57
|
+
export declare class SyncCoordinator {
|
|
58
|
+
private db;
|
|
59
|
+
private client?;
|
|
60
|
+
private server?;
|
|
61
|
+
private config;
|
|
62
|
+
private syncState;
|
|
63
|
+
private isSyncing;
|
|
64
|
+
private autoSyncInterval;
|
|
65
|
+
constructor(config: SyncCoordinatorConfig);
|
|
66
|
+
/**
|
|
67
|
+
* Perform bidirectional synchronization
|
|
68
|
+
*/
|
|
69
|
+
sync(onProgress?: (progress: SyncProgress) => void): Promise<SyncReport>;
|
|
70
|
+
/**
|
|
71
|
+
* Detect changes since last sync
|
|
72
|
+
*/
|
|
73
|
+
private detectChanges;
|
|
74
|
+
/**
|
|
75
|
+
* Push local changes to remote
|
|
76
|
+
*/
|
|
77
|
+
private pushChanges;
|
|
78
|
+
/**
|
|
79
|
+
* Pull changes from remote
|
|
80
|
+
*/
|
|
81
|
+
private pullChanges;
|
|
82
|
+
/**
|
|
83
|
+
* Resolve conflicts between local and remote data
|
|
84
|
+
*/
|
|
85
|
+
private resolveConflicts;
|
|
86
|
+
/**
|
|
87
|
+
* Apply pulled changes to local database
|
|
88
|
+
*/
|
|
89
|
+
private applyChanges;
|
|
90
|
+
/**
|
|
91
|
+
* Load sync state from database
|
|
92
|
+
*/
|
|
93
|
+
private loadSyncState;
|
|
94
|
+
/**
|
|
95
|
+
* Save sync state to database
|
|
96
|
+
*/
|
|
97
|
+
private saveSyncState;
|
|
98
|
+
/**
|
|
99
|
+
* Start automatic synchronization
|
|
100
|
+
*/
|
|
101
|
+
private startAutoSync;
|
|
102
|
+
/**
|
|
103
|
+
* Stop automatic synchronization
|
|
104
|
+
*/
|
|
105
|
+
stopAutoSync(): void;
|
|
106
|
+
/**
|
|
107
|
+
* Get sync state
|
|
108
|
+
*/
|
|
109
|
+
getSyncState(): SyncState;
|
|
110
|
+
/**
|
|
111
|
+
* Get sync status
|
|
112
|
+
*/
|
|
113
|
+
getStatus(): {
|
|
114
|
+
isSyncing: boolean;
|
|
115
|
+
autoSyncEnabled: boolean;
|
|
116
|
+
state: SyncState;
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export {};
|
|
120
|
+
//# sourceMappingURL=SyncCoordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncCoordinator.d.ts","sourceRoot":"","sources":["../../src/controllers/SyncCoordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,UAAU,EAA2B,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAe,MAAM,iBAAiB,CAAC;AAG1D,KAAK,QAAQ,GAAG,GAAG,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,QAAQ,CAAC;IACb,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,gBAAgB,CAAC,EAAE,YAAY,GAAG,aAAa,GAAG,aAAa,GAAG,OAAO,CAAC;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;IAC9F,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAoE;IAClF,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,gBAAgB,CAA+B;gBAE3C,MAAM,EAAE,qBAAqB;IAoBzC;;OAEG;IACG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IA0G9E;;OAEG;YACW,aAAa;IAyB3B;;OAEG;YACW,WAAW;IAezB;;OAEG;YACW,WAAW;IAuGzB;;OAEG;YACW,gBAAgB;IA4B9B;;OAEG;YACW,YAAY;IA2E1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAiCrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAyCrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,YAAY,IAAI,IAAI;IAQpB;;OAEG;IACH,YAAY,IAAI,SAAS;IAIzB;;OAEG;IACH,SAAS,IAAI;QACX,SAAS,EAAE,OAAO,CAAC;QACnB,eAAe,EAAE,OAAO,CAAC;QACzB,KAAK,EAAE,SAAS,CAAC;KAClB;CAOF"}
|