@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,457 @@
|
|
|
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 SimplePeer from 'simple-peer';
|
|
12
|
+
import { io } from 'socket.io-client';
|
|
13
|
+
import Database from 'better-sqlite3';
|
|
14
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
15
|
+
import { pack, unpack } from 'msgpackr';
|
|
16
|
+
import nacl from 'tweetnacl';
|
|
17
|
+
// ============================================
|
|
18
|
+
// Core P2P Sync Engine
|
|
19
|
+
// ============================================
|
|
20
|
+
export class P2PSync {
|
|
21
|
+
peers = new Map();
|
|
22
|
+
db;
|
|
23
|
+
socket;
|
|
24
|
+
userId;
|
|
25
|
+
teamId;
|
|
26
|
+
syncQueue = new Map();
|
|
27
|
+
keypair;
|
|
28
|
+
constructor(config) {
|
|
29
|
+
this.userId = config.userId;
|
|
30
|
+
this.teamId = config.teamId;
|
|
31
|
+
this.db = new Database(config.dbPath || '.beads/sync.db');
|
|
32
|
+
this.keypair = config.keypair || nacl.box.keyPair();
|
|
33
|
+
this.initDB();
|
|
34
|
+
this.connectSignaling(config.signalingServer);
|
|
35
|
+
}
|
|
36
|
+
// ============================================
|
|
37
|
+
// Database Setup
|
|
38
|
+
// ============================================
|
|
39
|
+
initDB() {
|
|
40
|
+
// Vector clock for CRDT
|
|
41
|
+
this.db.exec(`
|
|
42
|
+
CREATE TABLE IF NOT EXISTS vector_clock (
|
|
43
|
+
peer_id TEXT PRIMARY KEY,
|
|
44
|
+
clock INTEGER DEFAULT 0
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
CREATE TABLE IF NOT EXISTS sync_log (
|
|
48
|
+
id TEXT PRIMARY KEY,
|
|
49
|
+
peer_id TEXT NOT NULL,
|
|
50
|
+
operation TEXT NOT NULL,
|
|
51
|
+
data TEXT NOT NULL,
|
|
52
|
+
vector_clock TEXT NOT NULL,
|
|
53
|
+
timestamp INTEGER DEFAULT (unixepoch()),
|
|
54
|
+
synced BOOLEAN DEFAULT FALSE
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
CREATE TABLE IF NOT EXISTS frames (
|
|
58
|
+
frame_id TEXT PRIMARY KEY,
|
|
59
|
+
content TEXT NOT NULL,
|
|
60
|
+
vector_clock TEXT NOT NULL,
|
|
61
|
+
deleted BOOLEAN DEFAULT FALSE,
|
|
62
|
+
last_modified INTEGER DEFAULT (unixepoch())
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
CREATE INDEX idx_sync_log_unsynced ON sync_log(synced, timestamp);
|
|
66
|
+
CREATE INDEX idx_frames_modified ON frames(last_modified);
|
|
67
|
+
`);
|
|
68
|
+
}
|
|
69
|
+
// ============================================
|
|
70
|
+
// Signaling & Peer Discovery
|
|
71
|
+
// ============================================
|
|
72
|
+
connectSignaling(signalingServer) {
|
|
73
|
+
this.socket = io(signalingServer, {
|
|
74
|
+
query: {
|
|
75
|
+
userId: this.userId,
|
|
76
|
+
teamId: this.teamId,
|
|
77
|
+
publicKey: Buffer.from(this.keypair.publicKey).toString('base64')
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
this.socket.on('peers', (peers) => {
|
|
81
|
+
// Connect to all team members
|
|
82
|
+
peers.forEach(peer => {
|
|
83
|
+
if (!this.peers.has(peer.userId)) {
|
|
84
|
+
this.connectToPeer(peer);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
this.socket.on('signal', (data) => {
|
|
89
|
+
this.handleSignal(data);
|
|
90
|
+
});
|
|
91
|
+
this.socket.on('peer-left', (userId) => {
|
|
92
|
+
this.removePeer(userId);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// ============================================
|
|
96
|
+
// WebRTC Connection Management
|
|
97
|
+
// ============================================
|
|
98
|
+
connectToPeer(peerInfo) {
|
|
99
|
+
const peer = new SimplePeer({
|
|
100
|
+
initiator: this.userId > peerInfo.userId, // Deterministic initiator
|
|
101
|
+
trickle: false,
|
|
102
|
+
config: {
|
|
103
|
+
iceServers: [
|
|
104
|
+
{ urls: 'stun:stun.l.google.com:19302' },
|
|
105
|
+
{ urls: 'stun:global.stun.twilio.com:3478' }
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
peer.on('signal', signal => {
|
|
110
|
+
// Send signaling data through signaling server
|
|
111
|
+
this.socket.emit('signal', {
|
|
112
|
+
to: peerInfo.userId,
|
|
113
|
+
signal: signal
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
peer.on('connect', () => {
|
|
117
|
+
console.log(`Connected to peer: ${peerInfo.userId}`);
|
|
118
|
+
this.onPeerConnected(peerInfo.userId, peer);
|
|
119
|
+
});
|
|
120
|
+
peer.on('data', data => {
|
|
121
|
+
this.handlePeerData(peerInfo.userId, data);
|
|
122
|
+
});
|
|
123
|
+
peer.on('error', err => {
|
|
124
|
+
console.error(`Peer error with ${peerInfo.userId}:`, err);
|
|
125
|
+
this.reconnectToPeer(peerInfo);
|
|
126
|
+
});
|
|
127
|
+
peer.on('close', () => {
|
|
128
|
+
console.log(`Connection closed with ${peerInfo.userId}`);
|
|
129
|
+
this.reconnectToPeer(peerInfo);
|
|
130
|
+
});
|
|
131
|
+
this.peers.set(peerInfo.userId, peer);
|
|
132
|
+
}
|
|
133
|
+
handleSignal(data) {
|
|
134
|
+
let peer = this.peers.get(data.from);
|
|
135
|
+
if (!peer) {
|
|
136
|
+
// Create new peer connection if doesn't exist
|
|
137
|
+
peer = new SimplePeer({
|
|
138
|
+
initiator: false,
|
|
139
|
+
trickle: false
|
|
140
|
+
});
|
|
141
|
+
this.peers.set(data.from, peer);
|
|
142
|
+
this.setupPeerHandlers(data.from, peer);
|
|
143
|
+
}
|
|
144
|
+
peer.signal(data.signal);
|
|
145
|
+
}
|
|
146
|
+
// ============================================
|
|
147
|
+
// CRDT Sync Protocol
|
|
148
|
+
// ============================================
|
|
149
|
+
async onPeerConnected(peerId, peer) {
|
|
150
|
+
// 1. Exchange vector clocks
|
|
151
|
+
const myClock = this.getVectorClock();
|
|
152
|
+
this.sendToPeer(peerId, {
|
|
153
|
+
type: 'clock_sync',
|
|
154
|
+
clock: myClock
|
|
155
|
+
});
|
|
156
|
+
// 2. Send unsynced changes
|
|
157
|
+
const unsynced = this.getUnsyncedChanges(peerId);
|
|
158
|
+
for (const batch of this.batchChanges(unsynced, 100)) {
|
|
159
|
+
this.sendToPeer(peerId, {
|
|
160
|
+
type: 'sync_batch',
|
|
161
|
+
changes: batch
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
handlePeerData(peerId, data) {
|
|
166
|
+
try {
|
|
167
|
+
// Decrypt if encrypted
|
|
168
|
+
const decrypted = this.decrypt(data, peerId);
|
|
169
|
+
const message = unpack(decrypted);
|
|
170
|
+
switch (message.type) {
|
|
171
|
+
case 'clock_sync':
|
|
172
|
+
this.mergeVectorClock(peerId, message.clock);
|
|
173
|
+
break;
|
|
174
|
+
case 'sync_batch':
|
|
175
|
+
this.applyChanges(message.changes);
|
|
176
|
+
break;
|
|
177
|
+
case 'frame_update':
|
|
178
|
+
this.handleFrameUpdate(message.frame);
|
|
179
|
+
break;
|
|
180
|
+
case 'request_frames':
|
|
181
|
+
this.sendRequestedFrames(peerId, message.frameIds);
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
console.error('Error handling peer data:', err);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// ============================================
|
|
190
|
+
// CRDT Operations
|
|
191
|
+
// ============================================
|
|
192
|
+
getVectorClock() {
|
|
193
|
+
const rows = this.db.prepare('SELECT * FROM vector_clock').all();
|
|
194
|
+
const clock = {};
|
|
195
|
+
rows.forEach(row => {
|
|
196
|
+
clock[row.peer_id] = row.clock;
|
|
197
|
+
});
|
|
198
|
+
return clock;
|
|
199
|
+
}
|
|
200
|
+
incrementClock() {
|
|
201
|
+
this.db.prepare('INSERT OR REPLACE INTO vector_clock (peer_id, clock) VALUES (?, ?)').run(this.userId, this.getOwnClock() + 1);
|
|
202
|
+
return this.getVectorClock();
|
|
203
|
+
}
|
|
204
|
+
getOwnClock() {
|
|
205
|
+
const row = this.db.prepare('SELECT clock FROM vector_clock WHERE peer_id = ?').get(this.userId);
|
|
206
|
+
return row?.clock || 0;
|
|
207
|
+
}
|
|
208
|
+
mergeVectorClock(peerId, peerClock) {
|
|
209
|
+
Object.entries(peerClock).forEach(([id, clock]) => {
|
|
210
|
+
const current = this.db.prepare('SELECT clock FROM vector_clock WHERE peer_id = ?').get(id);
|
|
211
|
+
if (!current || current.clock < clock) {
|
|
212
|
+
this.db.prepare('INSERT OR REPLACE INTO vector_clock (peer_id, clock) VALUES (?, ?)').run(id, clock);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
// ============================================
|
|
217
|
+
// Frame Sync Operations
|
|
218
|
+
// ============================================
|
|
219
|
+
createFrame(frame) {
|
|
220
|
+
const frameId = frame.id || uuidv4();
|
|
221
|
+
const vectorClock = this.incrementClock();
|
|
222
|
+
// Store locally
|
|
223
|
+
this.db.prepare(`
|
|
224
|
+
INSERT OR REPLACE INTO frames (frame_id, content, vector_clock)
|
|
225
|
+
VALUES (?, ?, ?)
|
|
226
|
+
`).run(frameId, JSON.stringify(frame), JSON.stringify(vectorClock));
|
|
227
|
+
// Log for sync
|
|
228
|
+
this.logOperation('create', frameId, frame, vectorClock);
|
|
229
|
+
// Broadcast to connected peers
|
|
230
|
+
this.broadcast({
|
|
231
|
+
type: 'frame_update',
|
|
232
|
+
frame: {
|
|
233
|
+
id: frameId,
|
|
234
|
+
content: frame,
|
|
235
|
+
vectorClock: vectorClock
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
updateFrame(frameId, updates) {
|
|
240
|
+
const existing = this.getFrame(frameId);
|
|
241
|
+
if (!existing)
|
|
242
|
+
return;
|
|
243
|
+
const vectorClock = this.incrementClock();
|
|
244
|
+
const updated = { ...existing, ...updates };
|
|
245
|
+
this.db.prepare(`
|
|
246
|
+
UPDATE frames
|
|
247
|
+
SET content = ?, vector_clock = ?, last_modified = unixepoch()
|
|
248
|
+
WHERE frame_id = ?
|
|
249
|
+
`).run(JSON.stringify(updated), JSON.stringify(vectorClock), frameId);
|
|
250
|
+
this.logOperation('update', frameId, updated, vectorClock);
|
|
251
|
+
this.broadcast({
|
|
252
|
+
type: 'frame_update',
|
|
253
|
+
frame: {
|
|
254
|
+
id: frameId,
|
|
255
|
+
content: updated,
|
|
256
|
+
vectorClock: vectorClock
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
deleteFrame(frameId) {
|
|
261
|
+
const vectorClock = this.incrementClock();
|
|
262
|
+
// Tombstone instead of delete (CRDT pattern)
|
|
263
|
+
this.db.prepare(`
|
|
264
|
+
UPDATE frames
|
|
265
|
+
SET deleted = TRUE, vector_clock = ?, last_modified = unixepoch()
|
|
266
|
+
WHERE frame_id = ?
|
|
267
|
+
`).run(JSON.stringify(vectorClock), frameId);
|
|
268
|
+
this.logOperation('delete', frameId, { deleted: true }, vectorClock);
|
|
269
|
+
this.broadcast({
|
|
270
|
+
type: 'frame_update',
|
|
271
|
+
frame: {
|
|
272
|
+
id: frameId,
|
|
273
|
+
deleted: true,
|
|
274
|
+
vectorClock: vectorClock
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
getFrame(frameId) {
|
|
279
|
+
const row = this.db.prepare('SELECT content FROM frames WHERE frame_id = ? AND deleted = FALSE').get(frameId);
|
|
280
|
+
return row ? JSON.parse(row.content) : null;
|
|
281
|
+
}
|
|
282
|
+
// ============================================
|
|
283
|
+
// Conflict Resolution (Last-Write-Wins with Vector Clocks)
|
|
284
|
+
// ============================================
|
|
285
|
+
handleFrameUpdate(update) {
|
|
286
|
+
const existing = this.db.prepare('SELECT vector_clock FROM frames WHERE frame_id = ?').get(update.id);
|
|
287
|
+
if (!existing || this.isNewer(update.vectorClock, JSON.parse(existing.vector_clock))) {
|
|
288
|
+
// Apply update
|
|
289
|
+
if (update.deleted) {
|
|
290
|
+
this.db.prepare('UPDATE frames SET deleted = TRUE, vector_clock = ? WHERE frame_id = ?').run(JSON.stringify(update.vectorClock), update.id);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
this.db.prepare(`
|
|
294
|
+
INSERT OR REPLACE INTO frames (frame_id, content, vector_clock)
|
|
295
|
+
VALUES (?, ?, ?)
|
|
296
|
+
`).run(update.id, JSON.stringify(update.content), JSON.stringify(update.vectorClock));
|
|
297
|
+
}
|
|
298
|
+
this.mergeVectorClock(update.id, update.vectorClock);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
isNewer(clock1, clock2) {
|
|
302
|
+
// Vector clock comparison for CRDT
|
|
303
|
+
let hasGreater = false;
|
|
304
|
+
let hasLesser = false;
|
|
305
|
+
const allKeys = new Set([...Object.keys(clock1), ...Object.keys(clock2)]);
|
|
306
|
+
for (const key of allKeys) {
|
|
307
|
+
const val1 = clock1[key] || 0;
|
|
308
|
+
const val2 = clock2[key] || 0;
|
|
309
|
+
if (val1 > val2)
|
|
310
|
+
hasGreater = true;
|
|
311
|
+
if (val1 < val2)
|
|
312
|
+
hasLesser = true;
|
|
313
|
+
}
|
|
314
|
+
// clock1 is newer if it has at least one greater value and no lesser values
|
|
315
|
+
return hasGreater && !hasLesser;
|
|
316
|
+
}
|
|
317
|
+
// ============================================
|
|
318
|
+
// Batch & Queue Management
|
|
319
|
+
// ============================================
|
|
320
|
+
logOperation(op, id, data, vectorClock) {
|
|
321
|
+
this.db.prepare(`
|
|
322
|
+
INSERT INTO sync_log (id, peer_id, operation, data, vector_clock)
|
|
323
|
+
VALUES (?, ?, ?, ?, ?)
|
|
324
|
+
`).run(uuidv4(), this.userId, op, JSON.stringify(data), JSON.stringify(vectorClock));
|
|
325
|
+
}
|
|
326
|
+
getUnsyncedChanges(peerId) {
|
|
327
|
+
const rows = this.db.prepare(`
|
|
328
|
+
SELECT * FROM sync_log
|
|
329
|
+
WHERE synced = FALSE
|
|
330
|
+
ORDER BY timestamp
|
|
331
|
+
LIMIT 1000
|
|
332
|
+
`).all();
|
|
333
|
+
return rows.map(row => ({
|
|
334
|
+
id: row.id,
|
|
335
|
+
operation: row.operation,
|
|
336
|
+
data: JSON.parse(row.data),
|
|
337
|
+
vectorClock: JSON.parse(row.vector_clock)
|
|
338
|
+
}));
|
|
339
|
+
}
|
|
340
|
+
*batchChanges(changes, batchSize) {
|
|
341
|
+
for (let i = 0; i < changes.length; i += batchSize) {
|
|
342
|
+
yield changes.slice(i, i + batchSize);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
applyChanges(changes) {
|
|
346
|
+
const tx = this.db.transaction(() => {
|
|
347
|
+
changes.forEach(change => {
|
|
348
|
+
this.handleFrameUpdate({
|
|
349
|
+
id: change.id,
|
|
350
|
+
content: change.data,
|
|
351
|
+
vectorClock: change.vectorClock,
|
|
352
|
+
deleted: change.operation === 'delete'
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
tx();
|
|
357
|
+
}
|
|
358
|
+
sendRequestedFrames(peerId, frameIds) {
|
|
359
|
+
const frames = frameIds.map(id => this.getFrame(id)).filter(f => f !== null);
|
|
360
|
+
this.sendToPeer(peerId, {
|
|
361
|
+
type: 'frames_response',
|
|
362
|
+
frames,
|
|
363
|
+
timestamp: Date.now()
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
// ============================================
|
|
367
|
+
// Network Utilities
|
|
368
|
+
// ============================================
|
|
369
|
+
sendToPeer(peerId, message) {
|
|
370
|
+
const peer = this.peers.get(peerId);
|
|
371
|
+
if (peer && peer.connected) {
|
|
372
|
+
const packed = pack(message);
|
|
373
|
+
const encrypted = this.encrypt(packed, peerId);
|
|
374
|
+
peer.send(encrypted);
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
// Queue for later
|
|
378
|
+
if (!this.syncQueue.has(peerId)) {
|
|
379
|
+
this.syncQueue.set(peerId, []);
|
|
380
|
+
}
|
|
381
|
+
this.syncQueue.get(peerId).push(message);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
broadcast(message) {
|
|
385
|
+
this.peers.forEach((peer, peerId) => {
|
|
386
|
+
this.sendToPeer(peerId, message);
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
reconnectToPeer(peerInfo) {
|
|
390
|
+
setTimeout(() => {
|
|
391
|
+
if (!this.peers.get(peerInfo.userId)?.connected) {
|
|
392
|
+
console.log(`Reconnecting to ${peerInfo.userId}...`);
|
|
393
|
+
this.connectToPeer(peerInfo);
|
|
394
|
+
}
|
|
395
|
+
}, 5000); // Retry after 5 seconds
|
|
396
|
+
}
|
|
397
|
+
removePeer(userId) {
|
|
398
|
+
const peer = this.peers.get(userId);
|
|
399
|
+
if (peer) {
|
|
400
|
+
peer.destroy();
|
|
401
|
+
this.peers.delete(userId);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
// ============================================
|
|
405
|
+
// Encryption
|
|
406
|
+
// ============================================
|
|
407
|
+
encrypt(data, peerId) {
|
|
408
|
+
// In production, exchange keys properly
|
|
409
|
+
// This is simplified for demonstration
|
|
410
|
+
return Buffer.from(data);
|
|
411
|
+
}
|
|
412
|
+
decrypt(data, peerId) {
|
|
413
|
+
// In production, implement proper decryption
|
|
414
|
+
return new Uint8Array(data);
|
|
415
|
+
}
|
|
416
|
+
// ============================================
|
|
417
|
+
// Mesh Network Topology
|
|
418
|
+
// ============================================
|
|
419
|
+
async discoverPeers() {
|
|
420
|
+
// Use DHT for peer discovery in decentralized mode
|
|
421
|
+
// For now, use signaling server
|
|
422
|
+
return new Promise((resolve) => {
|
|
423
|
+
this.socket.emit('get_peers', this.teamId);
|
|
424
|
+
this.socket.once('peers_list', resolve);
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
setupPeerHandlers(peerId, peer) {
|
|
428
|
+
peer.on('connect', () => {
|
|
429
|
+
this.onPeerConnected(peerId, peer);
|
|
430
|
+
});
|
|
431
|
+
peer.on('data', (data) => {
|
|
432
|
+
this.handlePeerData(peerId, data);
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
// ============================================
|
|
436
|
+
// Public API
|
|
437
|
+
// ============================================
|
|
438
|
+
async sync() {
|
|
439
|
+
const connectedPeers = Array.from(this.peers.entries())
|
|
440
|
+
.filter(([_, peer]) => peer.connected)
|
|
441
|
+
.map(([id]) => id);
|
|
442
|
+
const unsynced = this.db.prepare('SELECT COUNT(*) as count FROM sync_log WHERE synced = FALSE').get();
|
|
443
|
+
return {
|
|
444
|
+
connectedPeers: connectedPeers.length,
|
|
445
|
+
totalPeers: this.peers.size,
|
|
446
|
+
unsyncedChanges: unsynced.count,
|
|
447
|
+
lastSync: Date.now()
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
disconnect() {
|
|
451
|
+
this.peers.forEach(peer => peer.destroy());
|
|
452
|
+
this.peers.clear();
|
|
453
|
+
this.socket.disconnect();
|
|
454
|
+
this.db.close();
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
//# sourceMappingURL=p2p-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p2p-sync.js","sourceRoot":"","sources":["../../../p2p-sync/src/p2p-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Shared Context Management
|
|
3
|
+
*
|
|
4
|
+
* Per-project shared context that syncs across team members
|
|
5
|
+
* Optimized for LLM context windows and collaborative AI coding
|
|
6
|
+
*/
|
|
7
|
+
export declare class TeamContextManager {
|
|
8
|
+
private p2pSync;
|
|
9
|
+
private db;
|
|
10
|
+
private projectId;
|
|
11
|
+
private teamId;
|
|
12
|
+
private userId;
|
|
13
|
+
private sharedContext;
|
|
14
|
+
private personalContext;
|
|
15
|
+
private activeFrames;
|
|
16
|
+
constructor(config: TeamContextConfig);
|
|
17
|
+
private initDB;
|
|
18
|
+
/**
|
|
19
|
+
* Add a decision or constraint that should be shared with the team
|
|
20
|
+
*/
|
|
21
|
+
addSharedContext(type: ContextType, content: string, importance?: number): string;
|
|
22
|
+
/**
|
|
23
|
+
* Add personal context (not shared with team)
|
|
24
|
+
*/
|
|
25
|
+
addPersonalContext(type: ContextType, content: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Start a new working frame (task/feature/debug session)
|
|
28
|
+
*/
|
|
29
|
+
startFrame(task: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Complete a frame and extract learnings
|
|
32
|
+
*/
|
|
33
|
+
completeFrame(frameId: string, summary: string, learnings: string[]): void;
|
|
34
|
+
/**
|
|
35
|
+
* Get optimized context bundle for LLM
|
|
36
|
+
*/
|
|
37
|
+
getContextBundle(intent: string, tokenBudget?: number): Promise<ContextBundle>;
|
|
38
|
+
private addProjectKnowledge;
|
|
39
|
+
private findSimilarContext;
|
|
40
|
+
private reinforceContext;
|
|
41
|
+
private setupSyncHandlers;
|
|
42
|
+
private syncSharedContext;
|
|
43
|
+
private decayOldContext;
|
|
44
|
+
private generateContextId;
|
|
45
|
+
private estimateTokens;
|
|
46
|
+
private captureContextSnapshot;
|
|
47
|
+
getTeamActivity(): TeamActivity;
|
|
48
|
+
exportContext(): string;
|
|
49
|
+
disconnect(): void;
|
|
50
|
+
}
|
|
51
|
+
interface TeamContextConfig {
|
|
52
|
+
projectId: string;
|
|
53
|
+
teamId: string;
|
|
54
|
+
userId: string;
|
|
55
|
+
signalingServer?: string;
|
|
56
|
+
dbPath?: string;
|
|
57
|
+
}
|
|
58
|
+
type ContextType = 'decision' | 'constraint' | 'architecture' | 'learning' | 'gotcha' | 'convention';
|
|
59
|
+
interface ContextBundle {
|
|
60
|
+
shared: Array<{
|
|
61
|
+
type: string;
|
|
62
|
+
content: string;
|
|
63
|
+
author: string;
|
|
64
|
+
importance: number;
|
|
65
|
+
}>;
|
|
66
|
+
personal: Array<{
|
|
67
|
+
type: string;
|
|
68
|
+
content: string;
|
|
69
|
+
}>;
|
|
70
|
+
active: Array<{
|
|
71
|
+
user: string;
|
|
72
|
+
task: string;
|
|
73
|
+
duration: number;
|
|
74
|
+
}>;
|
|
75
|
+
knowledge: Array<{
|
|
76
|
+
category: string;
|
|
77
|
+
title: string;
|
|
78
|
+
content: string;
|
|
79
|
+
confidence: number;
|
|
80
|
+
}>;
|
|
81
|
+
stats: {
|
|
82
|
+
tokenCount: number;
|
|
83
|
+
sources: number;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
interface TeamActivity {
|
|
87
|
+
activeUsers: string[];
|
|
88
|
+
activeFrames: Array<{
|
|
89
|
+
user: string;
|
|
90
|
+
task: string;
|
|
91
|
+
duration: number;
|
|
92
|
+
}>;
|
|
93
|
+
recentContext: Array<{
|
|
94
|
+
type: string;
|
|
95
|
+
count: number;
|
|
96
|
+
}>;
|
|
97
|
+
}
|
|
98
|
+
export { ContextType, ContextBundle, TeamActivity };
|
|
99
|
+
//# sourceMappingURL=team-context-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-context-sync.d.ts","sourceRoot":"","sources":["../../../p2p-sync/src/team-context-sync.ts"],"names":[],"mappings":"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"}
|