@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.
Files changed (50) hide show
  1. package/README.md +317 -0
  2. package/dist/attention-scoring/src/attention-tracker.d.ts +79 -0
  3. package/dist/attention-scoring/src/attention-tracker.d.ts.map +1 -0
  4. package/dist/attention-scoring/src/attention-tracker.js +488 -0
  5. package/dist/attention-scoring/src/attention-tracker.js.map +1 -0
  6. package/dist/attention-scoring/src/mcp-integration.d.ts +56 -0
  7. package/dist/attention-scoring/src/mcp-integration.d.ts.map +1 -0
  8. package/dist/attention-scoring/src/mcp-integration.js +369 -0
  9. package/dist/attention-scoring/src/mcp-integration.js.map +1 -0
  10. package/dist/p2p-sync/src/p2p-sync.d.ts +81 -0
  11. package/dist/p2p-sync/src/p2p-sync.d.ts.map +1 -0
  12. package/dist/p2p-sync/src/p2p-sync.js +457 -0
  13. package/dist/p2p-sync/src/p2p-sync.js.map +1 -0
  14. package/dist/p2p-sync/src/team-context-sync.d.ts +99 -0
  15. package/dist/p2p-sync/src/team-context-sync.d.ts.map +1 -0
  16. package/dist/p2p-sync/src/team-context-sync.js +491 -0
  17. package/dist/p2p-sync/src/team-context-sync.js.map +1 -0
  18. package/dist/scripts/initialize.d.ts +6 -0
  19. package/dist/scripts/initialize.d.ts.map +1 -0
  20. package/dist/scripts/initialize.js +93 -0
  21. package/dist/scripts/initialize.js.map +1 -0
  22. package/dist/scripts/status.d.ts +6 -0
  23. package/dist/scripts/status.d.ts.map +1 -0
  24. package/dist/scripts/status.js +87 -0
  25. package/dist/scripts/status.js.map +1 -0
  26. package/dist/src/cli.d.ts +7 -0
  27. package/dist/src/cli.d.ts.map +1 -0
  28. package/dist/src/cli.js +73 -0
  29. package/dist/src/cli.js.map +1 -0
  30. package/dist/src/error-handler.d.ts +42 -0
  31. package/dist/src/error-handler.d.ts.map +1 -0
  32. package/dist/src/error-handler.js +155 -0
  33. package/dist/src/error-handler.js.map +1 -0
  34. package/dist/src/frame-manager.d.ts +106 -0
  35. package/dist/src/frame-manager.d.ts.map +1 -0
  36. package/dist/src/frame-manager.js +361 -0
  37. package/dist/src/frame-manager.js.map +1 -0
  38. package/dist/src/index.d.ts +21 -0
  39. package/dist/src/index.d.ts.map +1 -0
  40. package/dist/src/index.js +9 -0
  41. package/dist/src/index.js.map +1 -0
  42. package/dist/src/logger.d.ts +24 -0
  43. package/dist/src/logger.d.ts.map +1 -0
  44. package/dist/src/logger.js +120 -0
  45. package/dist/src/logger.js.map +1 -0
  46. package/dist/src/mcp-server.d.ts +32 -0
  47. package/dist/src/mcp-server.d.ts.map +1 -0
  48. package/dist/src/mcp-server.js +441 -0
  49. package/dist/src/mcp-server.js.map +1 -0
  50. 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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"}