@stackmemoryai/stackmemory 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +317 -0
- package/dist/attention-scoring/src/attention-tracker.d.ts +79 -0
- package/dist/attention-scoring/src/attention-tracker.d.ts.map +1 -0
- package/dist/attention-scoring/src/attention-tracker.js +488 -0
- package/dist/attention-scoring/src/attention-tracker.js.map +1 -0
- package/dist/attention-scoring/src/mcp-integration.d.ts +56 -0
- package/dist/attention-scoring/src/mcp-integration.d.ts.map +1 -0
- package/dist/attention-scoring/src/mcp-integration.js +369 -0
- package/dist/attention-scoring/src/mcp-integration.js.map +1 -0
- package/dist/p2p-sync/src/p2p-sync.d.ts +81 -0
- package/dist/p2p-sync/src/p2p-sync.d.ts.map +1 -0
- package/dist/p2p-sync/src/p2p-sync.js +457 -0
- package/dist/p2p-sync/src/p2p-sync.js.map +1 -0
- package/dist/p2p-sync/src/team-context-sync.d.ts +99 -0
- package/dist/p2p-sync/src/team-context-sync.d.ts.map +1 -0
- package/dist/p2p-sync/src/team-context-sync.js +491 -0
- package/dist/p2p-sync/src/team-context-sync.js.map +1 -0
- package/dist/scripts/initialize.d.ts +6 -0
- package/dist/scripts/initialize.d.ts.map +1 -0
- package/dist/scripts/initialize.js +93 -0
- package/dist/scripts/initialize.js.map +1 -0
- package/dist/scripts/status.d.ts +6 -0
- package/dist/scripts/status.d.ts.map +1 -0
- package/dist/scripts/status.js +87 -0
- package/dist/scripts/status.js.map +1 -0
- package/dist/src/cli.d.ts +7 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +73 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/error-handler.d.ts +42 -0
- package/dist/src/error-handler.d.ts.map +1 -0
- package/dist/src/error-handler.js +155 -0
- package/dist/src/error-handler.js.map +1 -0
- package/dist/src/frame-manager.d.ts +106 -0
- package/dist/src/frame-manager.d.ts.map +1 -0
- package/dist/src/frame-manager.js +361 -0
- package/dist/src/frame-manager.js.map +1 -0
- package/dist/src/index.d.ts +21 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logger.d.ts +24 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +120 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/mcp-server.d.ts +32 -0
- package/dist/src/mcp-server.d.ts.map +1 -0
- package/dist/src/mcp-server.js +441 -0
- package/dist/src/mcp-server.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Integration with Attention-Based Importance Scoring
|
|
3
|
+
*
|
|
4
|
+
* Automatically tracks what context Claude actually uses
|
|
5
|
+
* and learns importance over time
|
|
6
|
+
*/
|
|
7
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
8
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import AttentionTracker from './attention-tracker';
|
|
11
|
+
import { TeamContextManager } from '../../p2p-sync/src/team-context-sync';
|
|
12
|
+
// ============================================
|
|
13
|
+
// Smart MCP Server with Attention Tracking
|
|
14
|
+
// ============================================
|
|
15
|
+
export class SmartStackMemoryMCP {
|
|
16
|
+
server;
|
|
17
|
+
attentionTracker;
|
|
18
|
+
teamContext;
|
|
19
|
+
activeProvisions = new Map();
|
|
20
|
+
constructor(config) {
|
|
21
|
+
// Initialize attention tracking
|
|
22
|
+
this.attentionTracker = new AttentionTracker(`.stackmemory/${config.projectId}/attention.db`);
|
|
23
|
+
// Initialize team context
|
|
24
|
+
this.teamContext = new TeamContextManager({
|
|
25
|
+
projectId: config.projectId,
|
|
26
|
+
teamId: config.teamId,
|
|
27
|
+
userId: config.userId
|
|
28
|
+
});
|
|
29
|
+
// Setup MCP server
|
|
30
|
+
this.server = new Server({
|
|
31
|
+
name: 'stackmemory-smart',
|
|
32
|
+
version: '2.0.0'
|
|
33
|
+
}, {
|
|
34
|
+
capabilities: {
|
|
35
|
+
tools: {},
|
|
36
|
+
resources: {}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
this.setupHandlers();
|
|
40
|
+
this.setupLearningLoop();
|
|
41
|
+
}
|
|
42
|
+
// ============================================
|
|
43
|
+
// MCP Request Handlers
|
|
44
|
+
// ============================================
|
|
45
|
+
setupHandlers() {
|
|
46
|
+
// Main context retrieval with attention tracking
|
|
47
|
+
this.server.setRequestHandler(z.object({
|
|
48
|
+
method: z.literal('tools/call'),
|
|
49
|
+
params: z.object({
|
|
50
|
+
name: z.string(),
|
|
51
|
+
arguments: z.record(z.unknown())
|
|
52
|
+
})
|
|
53
|
+
}), async (request) => {
|
|
54
|
+
if (request.params.name === 'get_context') {
|
|
55
|
+
return this.getSmartContext(request.params.arguments);
|
|
56
|
+
}
|
|
57
|
+
// Other tool handlers...
|
|
58
|
+
return { content: [] };
|
|
59
|
+
});
|
|
60
|
+
// Feedback handler for reinforcement learning
|
|
61
|
+
this.server.setRequestHandler(z.object({
|
|
62
|
+
method: z.literal('feedback'),
|
|
63
|
+
params: z.object({
|
|
64
|
+
responseId: z.string(),
|
|
65
|
+
helpful: z.boolean()
|
|
66
|
+
})
|
|
67
|
+
}), async (request) => {
|
|
68
|
+
const { responseId, helpful } = request.params;
|
|
69
|
+
await this.attentionTracker.reinforcementUpdate({
|
|
70
|
+
responseId,
|
|
71
|
+
helpful
|
|
72
|
+
});
|
|
73
|
+
return { success: true };
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// ============================================
|
|
77
|
+
// Smart Context Assembly
|
|
78
|
+
// ============================================
|
|
79
|
+
async getSmartContext(params) {
|
|
80
|
+
const { query, tokenBudget = 8000 } = params;
|
|
81
|
+
// Start tracking this provision
|
|
82
|
+
const provision = this.attentionTracker.startProvision(query);
|
|
83
|
+
// Get base context from team system
|
|
84
|
+
const baseContext = await this.teamContext.getContextBundle(query, tokenBudget);
|
|
85
|
+
// Enhance with learned importance scores
|
|
86
|
+
const enhancedContext = await this.enhanceWithAttention(baseContext, provision);
|
|
87
|
+
// Track the provision and get response
|
|
88
|
+
const trackedResponse = await provision.execute(async (contexts) => {
|
|
89
|
+
// Format for Claude
|
|
90
|
+
return this.formatForClaude(enhancedContext);
|
|
91
|
+
});
|
|
92
|
+
// Store provision ID for later feedback
|
|
93
|
+
this.activeProvisions.set(query, trackedResponse.responseId);
|
|
94
|
+
return {
|
|
95
|
+
content: [{
|
|
96
|
+
type: 'text',
|
|
97
|
+
text: trackedResponse.response
|
|
98
|
+
}],
|
|
99
|
+
metadata: {
|
|
100
|
+
responseId: trackedResponse.responseId,
|
|
101
|
+
contextsUsed: trackedResponse.contextsUsed,
|
|
102
|
+
latency: trackedResponse.latency
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// ============================================
|
|
107
|
+
// Attention-Based Enhancement
|
|
108
|
+
// ============================================
|
|
109
|
+
async enhanceWithAttention(baseContext, provision) {
|
|
110
|
+
const enhanced = {
|
|
111
|
+
items: [],
|
|
112
|
+
totalTokens: 0,
|
|
113
|
+
metadata: {
|
|
114
|
+
enhanced: true,
|
|
115
|
+
timestamp: Date.now()
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
// Process shared context with importance scores
|
|
119
|
+
for (const ctx of baseContext.shared) {
|
|
120
|
+
const importance = this.attentionTracker.getImportanceScore(ctx.id || this.hashContext(ctx));
|
|
121
|
+
const item = {
|
|
122
|
+
id: ctx.id || this.hashContext(ctx),
|
|
123
|
+
type: 'shared',
|
|
124
|
+
content: ctx.content,
|
|
125
|
+
tokenCount: this.estimateTokens(ctx.content),
|
|
126
|
+
importance: importance
|
|
127
|
+
};
|
|
128
|
+
// Add to provision tracking
|
|
129
|
+
provision.add(item);
|
|
130
|
+
// Only include if importance above threshold
|
|
131
|
+
if (importance > 0.3) {
|
|
132
|
+
enhanced.items.push({
|
|
133
|
+
...ctx,
|
|
134
|
+
importance,
|
|
135
|
+
influenceHistory: await this.getInfluenceHistory(item.id)
|
|
136
|
+
});
|
|
137
|
+
enhanced.totalTokens += item.tokenCount;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Get recommended additional context based on patterns
|
|
141
|
+
const recommendations = this.attentionTracker.getRecommendedContext(provision.query, enhanced.items.map(i => i.id));
|
|
142
|
+
// Add recommended contexts if budget allows
|
|
143
|
+
for (const recId of recommendations) {
|
|
144
|
+
const recContext = await this.loadContext(recId);
|
|
145
|
+
if (recContext && enhanced.totalTokens + recContext.tokenCount < 6000) {
|
|
146
|
+
provision.add(recContext);
|
|
147
|
+
enhanced.items.push({
|
|
148
|
+
...recContext,
|
|
149
|
+
recommended: true,
|
|
150
|
+
importance: this.attentionTracker.getImportanceScore(recId)
|
|
151
|
+
});
|
|
152
|
+
enhanced.totalTokens += recContext.tokenCount;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Sort by importance (most important first)
|
|
156
|
+
enhanced.items.sort((a, b) => (b.importance || 0) - (a.importance || 0));
|
|
157
|
+
return enhanced;
|
|
158
|
+
}
|
|
159
|
+
// ============================================
|
|
160
|
+
// Learning Loop
|
|
161
|
+
// ============================================
|
|
162
|
+
setupLearningLoop() {
|
|
163
|
+
// Periodic analysis of patterns
|
|
164
|
+
setInterval(() => {
|
|
165
|
+
this.analyzePatterns();
|
|
166
|
+
}, 3600000); // Every hour
|
|
167
|
+
// Real-time importance updates
|
|
168
|
+
this.attentionTracker.on('importance-updated', (event) => {
|
|
169
|
+
console.log(`Context ${event.contextId} importance: ${event.importance.toFixed(3)}`);
|
|
170
|
+
// Could trigger re-ranking of active context
|
|
171
|
+
this.updateActiveContext(event.contextId, event.importance);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
async analyzePatterns() {
|
|
175
|
+
// Get top performing context combinations
|
|
176
|
+
const rankings = this.attentionTracker.getContextRanking();
|
|
177
|
+
console.log('=== Attention Analysis ===');
|
|
178
|
+
console.log('Top influential contexts:');
|
|
179
|
+
rankings.slice(0, 10).forEach((r, i) => {
|
|
180
|
+
console.log(`${i + 1}. ${r.contextId}: ${(r.importance * 100).toFixed(1)}% (used ${r.influenceRate.toFixed(2)} influence rate)`);
|
|
181
|
+
});
|
|
182
|
+
// Identify underutilized important contexts
|
|
183
|
+
const underutilized = rankings.filter(r => r.importance > 0.7 && r.influenceRate < 0.3);
|
|
184
|
+
if (underutilized.length > 0) {
|
|
185
|
+
console.log('\nUnderutilized important contexts:');
|
|
186
|
+
underutilized.forEach(u => {
|
|
187
|
+
console.log(`- ${u.contextId}: High importance but low usage`);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
// Generate attention heatmap
|
|
191
|
+
const heatmap = this.attentionTracker.getAttentionHeatmap();
|
|
192
|
+
this.visualizeHeatmap(heatmap);
|
|
193
|
+
}
|
|
194
|
+
// ============================================
|
|
195
|
+
// Visualization
|
|
196
|
+
// ============================================
|
|
197
|
+
visualizeHeatmap(heatmap) {
|
|
198
|
+
// Create ASCII visualization of attention patterns
|
|
199
|
+
console.log('\n=== Attention Heatmap ===');
|
|
200
|
+
console.log('Position in context vs Influence:');
|
|
201
|
+
const maxInfluence = Math.max(...heatmap.influences);
|
|
202
|
+
const scale = 10;
|
|
203
|
+
heatmap.positions.forEach((pos, i) => {
|
|
204
|
+
const influence = heatmap.influences[i];
|
|
205
|
+
const bars = Math.round((influence / maxInfluence) * scale);
|
|
206
|
+
const bar = '█'.repeat(bars) + '░'.repeat(scale - bars);
|
|
207
|
+
console.log(`Pos ${String(pos).padStart(2)}: ${bar} ${(influence * 100).toFixed(1)}%`);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
// ============================================
|
|
211
|
+
// Real-time Context Updates
|
|
212
|
+
// ============================================
|
|
213
|
+
updateActiveContext(contextId, newImportance) {
|
|
214
|
+
// If context importance drops below threshold, remove from active
|
|
215
|
+
if (newImportance < 0.2) {
|
|
216
|
+
console.log(`Removing low-importance context: ${contextId}`);
|
|
217
|
+
// Would trigger context refresh in active sessions
|
|
218
|
+
}
|
|
219
|
+
// If context importance rises above threshold, promote
|
|
220
|
+
if (newImportance > 0.8) {
|
|
221
|
+
console.log(`Promoting high-importance context: ${contextId}`);
|
|
222
|
+
// Would add to priority context
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// ============================================
|
|
226
|
+
// Formatting & Utilities
|
|
227
|
+
// ============================================
|
|
228
|
+
formatForClaude(context) {
|
|
229
|
+
let output = '# Team Context (Attention-Weighted)\n\n';
|
|
230
|
+
// Group by type and importance
|
|
231
|
+
const grouped = this.groupByType(context.items);
|
|
232
|
+
for (const [type, items] of Object.entries(grouped)) {
|
|
233
|
+
output += `## ${this.formatType(type)}\n\n`;
|
|
234
|
+
items.forEach(item => {
|
|
235
|
+
const importanceBar = this.getImportanceBar(item.importance || 0.5);
|
|
236
|
+
const flag = item.recommended ? ' [AI-RECOMMENDED]' : '';
|
|
237
|
+
output += `${importanceBar} ${item.content}${flag}\n`;
|
|
238
|
+
if (item.influenceHistory && item.influenceHistory.length > 0) {
|
|
239
|
+
output += ` ↳ Previously influenced: ${item.influenceHistory.join(', ')}\n`;
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
output += '\n';
|
|
243
|
+
}
|
|
244
|
+
// Add metadata
|
|
245
|
+
output += `\n---\n`;
|
|
246
|
+
output += `Contexts: ${context.items.length} | Tokens: ~${context.totalTokens}\n`;
|
|
247
|
+
output += `Enhanced with attention-based importance scoring\n`;
|
|
248
|
+
return output;
|
|
249
|
+
}
|
|
250
|
+
getImportanceBar(importance) {
|
|
251
|
+
if (importance >= 0.8)
|
|
252
|
+
return '🔴'; // Critical
|
|
253
|
+
if (importance >= 0.6)
|
|
254
|
+
return '🟠'; // Important
|
|
255
|
+
if (importance >= 0.4)
|
|
256
|
+
return '🟡'; // Normal
|
|
257
|
+
return '⚪'; // Low
|
|
258
|
+
}
|
|
259
|
+
groupByType(items) {
|
|
260
|
+
const grouped = {};
|
|
261
|
+
items.forEach(item => {
|
|
262
|
+
const type = item.type || 'other';
|
|
263
|
+
if (!grouped[type])
|
|
264
|
+
grouped[type] = [];
|
|
265
|
+
grouped[type].push(item);
|
|
266
|
+
});
|
|
267
|
+
return grouped;
|
|
268
|
+
}
|
|
269
|
+
formatType(type) {
|
|
270
|
+
const typeMap = {
|
|
271
|
+
'decision': '🎯 Decisions',
|
|
272
|
+
'constraint': '⚠️ Constraints',
|
|
273
|
+
'shared': '👥 Team Context',
|
|
274
|
+
'personal': '📝 Personal Notes',
|
|
275
|
+
'knowledge': '📚 Project Knowledge'
|
|
276
|
+
};
|
|
277
|
+
return typeMap[type] || type;
|
|
278
|
+
}
|
|
279
|
+
hashContext(ctx) {
|
|
280
|
+
const crypto = require('crypto');
|
|
281
|
+
return crypto.createHash('sha256')
|
|
282
|
+
.update(JSON.stringify(ctx))
|
|
283
|
+
.digest('hex')
|
|
284
|
+
.substring(0, 16);
|
|
285
|
+
}
|
|
286
|
+
estimateTokens(text) {
|
|
287
|
+
return Math.ceil(text.length / 4);
|
|
288
|
+
}
|
|
289
|
+
async getInfluenceHistory(contextId) {
|
|
290
|
+
// Get last 3 significant influences
|
|
291
|
+
// In production, query from attention_signals table
|
|
292
|
+
return [];
|
|
293
|
+
}
|
|
294
|
+
async loadContext(contextId) {
|
|
295
|
+
// Load context from main storage
|
|
296
|
+
// This would connect to your team context or local storage
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
// ============================================
|
|
300
|
+
// Startup
|
|
301
|
+
// ============================================
|
|
302
|
+
async start() {
|
|
303
|
+
const transport = new StdioServerTransport();
|
|
304
|
+
await this.server.connect(transport);
|
|
305
|
+
console.log('Smart StackMemory MCP Server started');
|
|
306
|
+
console.log('Attention tracking enabled');
|
|
307
|
+
console.log('Learning from usage patterns...');
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// ============================================
|
|
311
|
+
// Dashboard for Attention Analytics
|
|
312
|
+
// ============================================
|
|
313
|
+
export class AttentionDashboard {
|
|
314
|
+
tracker;
|
|
315
|
+
constructor(tracker) {
|
|
316
|
+
this.tracker = tracker;
|
|
317
|
+
}
|
|
318
|
+
async generateReport() {
|
|
319
|
+
const rankings = this.tracker.getContextRanking();
|
|
320
|
+
const heatmap = this.tracker.getAttentionHeatmap();
|
|
321
|
+
// Calculate statistics
|
|
322
|
+
const totalContexts = rankings.length;
|
|
323
|
+
const avgImportance = rankings.reduce((sum, r) => sum + r.importance, 0) / totalContexts;
|
|
324
|
+
const highInfluence = rankings.filter(r => r.avgInfluence > 0.7).length;
|
|
325
|
+
// Identify patterns
|
|
326
|
+
const alwaysUseful = rankings.filter(r => r.influenceRate > 0.8);
|
|
327
|
+
const neverUseful = rankings.filter(r => r.influenceRate < 0.1 && r.importance < 0.3);
|
|
328
|
+
return {
|
|
329
|
+
summary: {
|
|
330
|
+
totalContexts,
|
|
331
|
+
avgImportance,
|
|
332
|
+
highInfluenceCount: highInfluence,
|
|
333
|
+
lastUpdated: Date.now()
|
|
334
|
+
},
|
|
335
|
+
topContexts: rankings.slice(0, 20),
|
|
336
|
+
alwaysUseful,
|
|
337
|
+
neverUseful,
|
|
338
|
+
heatmap,
|
|
339
|
+
recommendations: this.generateRecommendations(rankings)
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
generateRecommendations(rankings) {
|
|
343
|
+
const recs = [];
|
|
344
|
+
// Find contexts that should be promoted
|
|
345
|
+
const undervalued = rankings.filter(r => r.avgInfluence > 0.7 && r.importance < 0.5);
|
|
346
|
+
if (undervalued.length > 0) {
|
|
347
|
+
recs.push(`Promote ${undervalued.length} undervalued contexts with high influence`);
|
|
348
|
+
}
|
|
349
|
+
// Find contexts that should be demoted
|
|
350
|
+
const overvalued = rankings.filter(r => r.avgInfluence < 0.2 && r.importance > 0.7);
|
|
351
|
+
if (overvalued.length > 0) {
|
|
352
|
+
recs.push(`Consider demoting ${overvalued.length} contexts with low actual influence`);
|
|
353
|
+
}
|
|
354
|
+
return recs;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// ============================================
|
|
358
|
+
// CLI Usage
|
|
359
|
+
// ============================================
|
|
360
|
+
if (require.main === module) {
|
|
361
|
+
const config = {
|
|
362
|
+
projectId: process.env.PROJECT_ID || 'default',
|
|
363
|
+
teamId: process.env.TEAM_ID || 'default',
|
|
364
|
+
userId: process.env.USER_ID || 'default'
|
|
365
|
+
};
|
|
366
|
+
const server = new SmartStackMemoryMCP(config);
|
|
367
|
+
server.start().catch(console.error);
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=mcp-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-integration.js","sourceRoot":"","sources":["../../../attention-scoring/src/mcp-integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebRTC P2P Sync Implementation for Beads/StackMemory
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Direct peer-to-peer sync (zero server bandwidth)
|
|
6
|
+
* - CRDT-based conflict resolution
|
|
7
|
+
* - End-to-end encryption
|
|
8
|
+
* - Automatic reconnection
|
|
9
|
+
* - Offline queue
|
|
10
|
+
*/
|
|
11
|
+
import nacl from 'tweetnacl';
|
|
12
|
+
export declare class P2PSync {
|
|
13
|
+
private peers;
|
|
14
|
+
private db;
|
|
15
|
+
private socket;
|
|
16
|
+
private userId;
|
|
17
|
+
private teamId;
|
|
18
|
+
private syncQueue;
|
|
19
|
+
private keypair;
|
|
20
|
+
constructor(config: P2PConfig);
|
|
21
|
+
private initDB;
|
|
22
|
+
private connectSignaling;
|
|
23
|
+
private connectToPeer;
|
|
24
|
+
private handleSignal;
|
|
25
|
+
private onPeerConnected;
|
|
26
|
+
private handlePeerData;
|
|
27
|
+
private getVectorClock;
|
|
28
|
+
incrementClock(): VectorClock;
|
|
29
|
+
private getOwnClock;
|
|
30
|
+
private mergeVectorClock;
|
|
31
|
+
createFrame(frame: Frame): void;
|
|
32
|
+
updateFrame(frameId: string, updates: Partial<Frame>): void;
|
|
33
|
+
deleteFrame(frameId: string): void;
|
|
34
|
+
getFrame(frameId: string): Frame | null;
|
|
35
|
+
private handleFrameUpdate;
|
|
36
|
+
private isNewer;
|
|
37
|
+
private logOperation;
|
|
38
|
+
private getUnsyncedChanges;
|
|
39
|
+
private batchChanges;
|
|
40
|
+
private applyChanges;
|
|
41
|
+
private sendRequestedFrames;
|
|
42
|
+
private sendToPeer;
|
|
43
|
+
private broadcast;
|
|
44
|
+
private reconnectToPeer;
|
|
45
|
+
private removePeer;
|
|
46
|
+
private encrypt;
|
|
47
|
+
private decrypt;
|
|
48
|
+
discoverPeers(): Promise<PeerInfo[]>;
|
|
49
|
+
private setupPeerHandlers;
|
|
50
|
+
sync(): Promise<SyncStats>;
|
|
51
|
+
disconnect(): void;
|
|
52
|
+
}
|
|
53
|
+
interface P2PConfig {
|
|
54
|
+
userId: string;
|
|
55
|
+
teamId: string;
|
|
56
|
+
signalingServer: string;
|
|
57
|
+
dbPath?: string;
|
|
58
|
+
keypair?: nacl.BoxKeyPair;
|
|
59
|
+
}
|
|
60
|
+
interface PeerInfo {
|
|
61
|
+
userId: string;
|
|
62
|
+
publicKey: string;
|
|
63
|
+
lastSeen: number;
|
|
64
|
+
}
|
|
65
|
+
interface Frame {
|
|
66
|
+
id?: string;
|
|
67
|
+
type: string;
|
|
68
|
+
content: any;
|
|
69
|
+
metadata?: any;
|
|
70
|
+
}
|
|
71
|
+
interface VectorClock {
|
|
72
|
+
[peerId: string]: number;
|
|
73
|
+
}
|
|
74
|
+
interface SyncStats {
|
|
75
|
+
connectedPeers: number;
|
|
76
|
+
totalPeers: number;
|
|
77
|
+
unsyncedChanges: number;
|
|
78
|
+
lastSync: number;
|
|
79
|
+
}
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=p2p-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p2p-sync.d.ts","sourceRoot":"","sources":["../../../p2p-sync/src/p2p-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,OAAO,CAAkB;gBAErB,MAAM,EAAE,SAAS;IAc7B,OAAO,CAAC,MAAM;IAmCd,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,aAAa;IA0CrB,OAAO,CAAC,YAAY;YAoBN,eAAe;IAkB7B,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,cAAc;IASf,cAAc,IAAI,WAAW;IAQpC,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,gBAAgB;IAkBjB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAwB/B,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;IAyB3D,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAsBlC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAY9C,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,OAAO;IAuBf,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAE,YAAY;IAMrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,OAAO;IASF,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IASjD,OAAO,CAAC,iBAAiB;IAcZ,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC;IAiBhC,UAAU;CAMlB;AAMD,UAAU,SAAS;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;CAC3B;AAED,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD,UAAU,KAAK;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AASD,UAAU,WAAW;IACnB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAmBD,UAAU,SAAS;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|