@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,491 @@
|
|
|
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
|
+
import { P2PSync } from './p2p-sync';
|
|
8
|
+
import Database from 'better-sqlite3';
|
|
9
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
10
|
+
import { createHash } from 'crypto';
|
|
11
|
+
// ============================================
|
|
12
|
+
// Team Context Manager
|
|
13
|
+
// ============================================
|
|
14
|
+
export class TeamContextManager {
|
|
15
|
+
p2pSync;
|
|
16
|
+
db;
|
|
17
|
+
projectId;
|
|
18
|
+
teamId;
|
|
19
|
+
userId;
|
|
20
|
+
// Context layers
|
|
21
|
+
sharedContext;
|
|
22
|
+
personalContext;
|
|
23
|
+
activeFrames = new Map();
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.projectId = config.projectId;
|
|
26
|
+
this.teamId = config.teamId;
|
|
27
|
+
this.userId = config.userId;
|
|
28
|
+
this.db = new Database(config.dbPath || `.stackmemory/${this.projectId}/context.db`);
|
|
29
|
+
this.initDB();
|
|
30
|
+
// Initialize P2P sync for team
|
|
31
|
+
this.p2pSync = new P2PSync({
|
|
32
|
+
userId: this.userId,
|
|
33
|
+
teamId: this.teamId,
|
|
34
|
+
signalingServer: config.signalingServer || 'wss://signal.stackmemory.dev',
|
|
35
|
+
dbPath: `.stackmemory/${this.projectId}/sync.db`
|
|
36
|
+
});
|
|
37
|
+
this.sharedContext = new SharedContext(this.db, this.p2pSync);
|
|
38
|
+
this.personalContext = new PersonalContext(this.db);
|
|
39
|
+
this.setupSyncHandlers();
|
|
40
|
+
}
|
|
41
|
+
// ============================================
|
|
42
|
+
// Database Schema
|
|
43
|
+
// ============================================
|
|
44
|
+
initDB() {
|
|
45
|
+
this.db.exec(`
|
|
46
|
+
-- Shared context visible to all team members
|
|
47
|
+
CREATE TABLE IF NOT EXISTS shared_context (
|
|
48
|
+
context_id TEXT PRIMARY KEY,
|
|
49
|
+
project_id TEXT NOT NULL,
|
|
50
|
+
type TEXT NOT NULL, -- 'decision', 'constraint', 'architecture', 'learning'
|
|
51
|
+
content TEXT NOT NULL,
|
|
52
|
+
importance REAL DEFAULT 0.5,
|
|
53
|
+
author_id TEXT NOT NULL,
|
|
54
|
+
created_at INTEGER DEFAULT (unixepoch()),
|
|
55
|
+
updated_at INTEGER DEFAULT (unixepoch()),
|
|
56
|
+
vector_clock TEXT NOT NULL,
|
|
57
|
+
active BOOLEAN DEFAULT TRUE
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
-- Personal context (not shared)
|
|
61
|
+
CREATE TABLE IF NOT EXISTS personal_context (
|
|
62
|
+
context_id TEXT PRIMARY KEY,
|
|
63
|
+
user_id TEXT NOT NULL,
|
|
64
|
+
project_id TEXT NOT NULL,
|
|
65
|
+
type TEXT NOT NULL,
|
|
66
|
+
content TEXT NOT NULL,
|
|
67
|
+
importance REAL DEFAULT 0.5,
|
|
68
|
+
created_at INTEGER DEFAULT (unixepoch())
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
-- Active working frames (ephemeral, shared during collaboration)
|
|
72
|
+
CREATE TABLE IF NOT EXISTS active_frames (
|
|
73
|
+
frame_id TEXT PRIMARY KEY,
|
|
74
|
+
project_id TEXT NOT NULL,
|
|
75
|
+
user_id TEXT NOT NULL,
|
|
76
|
+
task TEXT NOT NULL,
|
|
77
|
+
status TEXT DEFAULT 'active', -- 'active', 'paused', 'completed'
|
|
78
|
+
context_snapshot TEXT, -- Compressed context at frame creation
|
|
79
|
+
started_at INTEGER DEFAULT (unixepoch()),
|
|
80
|
+
last_activity INTEGER DEFAULT (unixepoch())
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
-- Project-level aggregated knowledge
|
|
84
|
+
CREATE TABLE IF NOT EXISTS project_knowledge (
|
|
85
|
+
knowledge_id TEXT PRIMARY KEY,
|
|
86
|
+
project_id TEXT NOT NULL,
|
|
87
|
+
category TEXT NOT NULL, -- 'patterns', 'gotchas', 'conventions', 'dependencies'
|
|
88
|
+
title TEXT NOT NULL,
|
|
89
|
+
content TEXT NOT NULL,
|
|
90
|
+
confidence REAL DEFAULT 0.5,
|
|
91
|
+
usage_count INTEGER DEFAULT 0,
|
|
92
|
+
last_used INTEGER DEFAULT (unixepoch())
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
-- Context importance decay tracking
|
|
96
|
+
CREATE TABLE IF NOT EXISTS context_decay (
|
|
97
|
+
context_id TEXT PRIMARY KEY,
|
|
98
|
+
last_accessed INTEGER DEFAULT (unixepoch()),
|
|
99
|
+
access_count INTEGER DEFAULT 1,
|
|
100
|
+
decay_rate REAL DEFAULT 0.1
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
-- Indexes for performance
|
|
104
|
+
CREATE INDEX IF NOT EXISTS idx_shared_project ON shared_context(project_id, importance DESC);
|
|
105
|
+
CREATE INDEX IF NOT EXISTS idx_shared_type ON shared_context(type, active);
|
|
106
|
+
CREATE INDEX IF NOT EXISTS idx_personal_user ON personal_context(user_id, project_id);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_frames_active ON active_frames(project_id, status);
|
|
108
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_category ON project_knowledge(project_id, category);
|
|
109
|
+
`);
|
|
110
|
+
}
|
|
111
|
+
// ============================================
|
|
112
|
+
// Context Management
|
|
113
|
+
// ============================================
|
|
114
|
+
/**
|
|
115
|
+
* Add a decision or constraint that should be shared with the team
|
|
116
|
+
*/
|
|
117
|
+
addSharedContext(type, content, importance = 0.5) {
|
|
118
|
+
const contextId = this.generateContextId(content);
|
|
119
|
+
// Check if similar context exists
|
|
120
|
+
const existing = this.findSimilarContext(content);
|
|
121
|
+
if (existing) {
|
|
122
|
+
this.reinforceContext(existing.context_id);
|
|
123
|
+
return existing.context_id;
|
|
124
|
+
}
|
|
125
|
+
// Add to shared context
|
|
126
|
+
const vectorClock = this.p2pSync.incrementClock();
|
|
127
|
+
this.db.prepare(`
|
|
128
|
+
INSERT INTO shared_context
|
|
129
|
+
(context_id, project_id, type, content, importance, author_id, vector_clock)
|
|
130
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
131
|
+
`).run(contextId, this.projectId, type, content, importance, this.userId, JSON.stringify(vectorClock));
|
|
132
|
+
// Broadcast to team
|
|
133
|
+
this.p2pSync.createFrame({
|
|
134
|
+
id: contextId,
|
|
135
|
+
type: 'shared_context',
|
|
136
|
+
content: {
|
|
137
|
+
type,
|
|
138
|
+
content,
|
|
139
|
+
importance,
|
|
140
|
+
author_id: this.userId
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
return contextId;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Add personal context (not shared with team)
|
|
147
|
+
*/
|
|
148
|
+
addPersonalContext(type, content) {
|
|
149
|
+
const contextId = this.generateContextId(content);
|
|
150
|
+
this.db.prepare(`
|
|
151
|
+
INSERT INTO personal_context
|
|
152
|
+
(context_id, user_id, project_id, type, content)
|
|
153
|
+
VALUES (?, ?, ?, ?, ?)
|
|
154
|
+
`).run(contextId, this.userId, this.projectId, type, content);
|
|
155
|
+
return contextId;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Start a new working frame (task/feature/debug session)
|
|
159
|
+
*/
|
|
160
|
+
startFrame(task) {
|
|
161
|
+
const frameId = uuidv4();
|
|
162
|
+
// Capture current context snapshot
|
|
163
|
+
const snapshot = this.captureContextSnapshot();
|
|
164
|
+
this.db.prepare(`
|
|
165
|
+
INSERT INTO active_frames
|
|
166
|
+
(frame_id, project_id, user_id, task, context_snapshot)
|
|
167
|
+
VALUES (?, ?, ?, ?, ?)
|
|
168
|
+
`).run(frameId, this.projectId, this.userId, task, JSON.stringify(snapshot));
|
|
169
|
+
// Share frame with team (they see you're working on this)
|
|
170
|
+
this.p2pSync.createFrame({
|
|
171
|
+
id: frameId,
|
|
172
|
+
type: 'active_frame',
|
|
173
|
+
content: {
|
|
174
|
+
task,
|
|
175
|
+
user_id: this.userId,
|
|
176
|
+
started_at: Date.now()
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
this.activeFrames.set(frameId, {
|
|
180
|
+
id: frameId,
|
|
181
|
+
task,
|
|
182
|
+
startedAt: Date.now(),
|
|
183
|
+
context: snapshot
|
|
184
|
+
});
|
|
185
|
+
return frameId;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Complete a frame and extract learnings
|
|
189
|
+
*/
|
|
190
|
+
completeFrame(frameId, summary, learnings) {
|
|
191
|
+
const frame = this.activeFrames.get(frameId);
|
|
192
|
+
if (!frame)
|
|
193
|
+
return;
|
|
194
|
+
// Update frame status
|
|
195
|
+
this.db.prepare(`
|
|
196
|
+
UPDATE active_frames
|
|
197
|
+
SET status = 'completed', last_activity = unixepoch()
|
|
198
|
+
WHERE frame_id = ?
|
|
199
|
+
`).run(frameId);
|
|
200
|
+
// Extract and share important learnings
|
|
201
|
+
learnings.forEach(learning => {
|
|
202
|
+
this.addSharedContext('learning', learning, 0.7);
|
|
203
|
+
});
|
|
204
|
+
// Add to project knowledge if significant
|
|
205
|
+
if (learnings.length > 0) {
|
|
206
|
+
this.addProjectKnowledge('patterns', frame.task, summary);
|
|
207
|
+
}
|
|
208
|
+
// Notify team of completion
|
|
209
|
+
this.p2pSync.updateFrame(frameId, {
|
|
210
|
+
content: {
|
|
211
|
+
...this.p2pSync.getFrame(frameId)?.content,
|
|
212
|
+
status: 'completed',
|
|
213
|
+
summary,
|
|
214
|
+
learnings,
|
|
215
|
+
completed_at: Date.now()
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
this.activeFrames.delete(frameId);
|
|
219
|
+
}
|
|
220
|
+
// ============================================
|
|
221
|
+
// Context Assembly for LLM
|
|
222
|
+
// ============================================
|
|
223
|
+
/**
|
|
224
|
+
* Get optimized context bundle for LLM
|
|
225
|
+
*/
|
|
226
|
+
async getContextBundle(intent, tokenBudget = 8000) {
|
|
227
|
+
const bundle = {
|
|
228
|
+
shared: [],
|
|
229
|
+
personal: [],
|
|
230
|
+
active: [],
|
|
231
|
+
knowledge: [],
|
|
232
|
+
stats: {
|
|
233
|
+
tokenCount: 0,
|
|
234
|
+
sources: 0
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
let tokensUsed = 0;
|
|
238
|
+
const maxTokens = tokenBudget;
|
|
239
|
+
// 1. Critical shared context (30% budget)
|
|
240
|
+
const criticalShared = this.db.prepare(`
|
|
241
|
+
SELECT * FROM shared_context
|
|
242
|
+
WHERE project_id = ? AND active = TRUE
|
|
243
|
+
ORDER BY importance DESC, updated_at DESC
|
|
244
|
+
LIMIT 20
|
|
245
|
+
`).all(this.projectId);
|
|
246
|
+
for (const ctx of criticalShared) {
|
|
247
|
+
const tokens = this.estimateTokens(ctx.content);
|
|
248
|
+
if (tokensUsed + tokens > maxTokens * 0.3)
|
|
249
|
+
break;
|
|
250
|
+
bundle.shared.push({
|
|
251
|
+
type: ctx.type,
|
|
252
|
+
content: ctx.content,
|
|
253
|
+
author: ctx.author_id,
|
|
254
|
+
importance: ctx.importance
|
|
255
|
+
});
|
|
256
|
+
tokensUsed += tokens;
|
|
257
|
+
}
|
|
258
|
+
// 2. Active team frames (20% budget)
|
|
259
|
+
const activeFrames = this.db.prepare(`
|
|
260
|
+
SELECT * FROM active_frames
|
|
261
|
+
WHERE project_id = ? AND status = 'active'
|
|
262
|
+
ORDER BY last_activity DESC
|
|
263
|
+
LIMIT 10
|
|
264
|
+
`).all(this.projectId);
|
|
265
|
+
for (const frame of activeFrames) {
|
|
266
|
+
const tokens = this.estimateTokens(frame.task);
|
|
267
|
+
if (tokensUsed + tokens > maxTokens * 0.5)
|
|
268
|
+
break;
|
|
269
|
+
bundle.active.push({
|
|
270
|
+
user: frame.user_id,
|
|
271
|
+
task: frame.task,
|
|
272
|
+
duration: Date.now() - frame.started_at * 1000
|
|
273
|
+
});
|
|
274
|
+
tokensUsed += tokens;
|
|
275
|
+
}
|
|
276
|
+
// 3. Relevant project knowledge (30% budget)
|
|
277
|
+
const knowledge = this.db.prepare(`
|
|
278
|
+
SELECT * FROM project_knowledge
|
|
279
|
+
WHERE project_id = ?
|
|
280
|
+
ORDER BY confidence DESC, usage_count DESC
|
|
281
|
+
LIMIT 15
|
|
282
|
+
`).all(this.projectId);
|
|
283
|
+
for (const k of knowledge) {
|
|
284
|
+
const tokens = this.estimateTokens(k.content);
|
|
285
|
+
if (tokensUsed + tokens > maxTokens * 0.8)
|
|
286
|
+
break;
|
|
287
|
+
bundle.knowledge.push({
|
|
288
|
+
category: k.category,
|
|
289
|
+
title: k.title,
|
|
290
|
+
content: k.content,
|
|
291
|
+
confidence: k.confidence
|
|
292
|
+
});
|
|
293
|
+
tokensUsed += tokens;
|
|
294
|
+
}
|
|
295
|
+
// 4. Personal context (remaining budget)
|
|
296
|
+
const personal = this.db.prepare(`
|
|
297
|
+
SELECT * FROM personal_context
|
|
298
|
+
WHERE user_id = ? AND project_id = ?
|
|
299
|
+
ORDER BY created_at DESC
|
|
300
|
+
LIMIT 10
|
|
301
|
+
`).all(this.userId, this.projectId);
|
|
302
|
+
for (const p of personal) {
|
|
303
|
+
const tokens = this.estimateTokens(p.content);
|
|
304
|
+
if (tokensUsed + tokens > maxTokens * 0.95)
|
|
305
|
+
break;
|
|
306
|
+
bundle.personal.push({
|
|
307
|
+
type: p.type,
|
|
308
|
+
content: p.content
|
|
309
|
+
});
|
|
310
|
+
tokensUsed += tokens;
|
|
311
|
+
}
|
|
312
|
+
bundle.stats.tokenCount = tokensUsed;
|
|
313
|
+
bundle.stats.sources = bundle.shared.length + bundle.personal.length +
|
|
314
|
+
bundle.active.length + bundle.knowledge.length;
|
|
315
|
+
return bundle;
|
|
316
|
+
}
|
|
317
|
+
// ============================================
|
|
318
|
+
// Knowledge Extraction & Learning
|
|
319
|
+
// ============================================
|
|
320
|
+
addProjectKnowledge(category, title, content) {
|
|
321
|
+
const knowledgeId = this.generateContextId(content);
|
|
322
|
+
this.db.prepare(`
|
|
323
|
+
INSERT OR REPLACE INTO project_knowledge
|
|
324
|
+
(knowledge_id, project_id, category, title, content, confidence)
|
|
325
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
326
|
+
`).run(knowledgeId, this.projectId, category, title, content, 0.5);
|
|
327
|
+
// Share significant knowledge with team
|
|
328
|
+
this.p2pSync.createFrame({
|
|
329
|
+
id: knowledgeId,
|
|
330
|
+
type: 'project_knowledge',
|
|
331
|
+
content: {
|
|
332
|
+
category,
|
|
333
|
+
title,
|
|
334
|
+
content
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
findSimilarContext(content) {
|
|
339
|
+
// Simple similarity check - in production use embeddings
|
|
340
|
+
const words = content.toLowerCase().split(/\s+/);
|
|
341
|
+
const results = this.db.prepare(`
|
|
342
|
+
SELECT * FROM shared_context
|
|
343
|
+
WHERE project_id = ? AND active = TRUE
|
|
344
|
+
`).all(this.projectId);
|
|
345
|
+
for (const ctx of results) {
|
|
346
|
+
const ctxWords = ctx.content.toLowerCase().split(/\s+/);
|
|
347
|
+
const overlap = words.filter(w => ctxWords.includes(w)).length;
|
|
348
|
+
if (overlap / words.length > 0.7) {
|
|
349
|
+
return ctx;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return null;
|
|
353
|
+
}
|
|
354
|
+
reinforceContext(contextId) {
|
|
355
|
+
// Increase importance when context is referenced again
|
|
356
|
+
this.db.prepare(`
|
|
357
|
+
UPDATE shared_context
|
|
358
|
+
SET importance = MIN(1.0, importance + 0.1),
|
|
359
|
+
updated_at = unixepoch()
|
|
360
|
+
WHERE context_id = ?
|
|
361
|
+
`).run(contextId);
|
|
362
|
+
// Update decay tracking
|
|
363
|
+
this.db.prepare(`
|
|
364
|
+
INSERT INTO context_decay (context_id, last_accessed, access_count)
|
|
365
|
+
VALUES (?, unixepoch(), 1)
|
|
366
|
+
ON CONFLICT(context_id) DO UPDATE SET
|
|
367
|
+
last_accessed = unixepoch(),
|
|
368
|
+
access_count = access_count + 1
|
|
369
|
+
`).run(contextId);
|
|
370
|
+
}
|
|
371
|
+
// ============================================
|
|
372
|
+
// Sync Handlers
|
|
373
|
+
// ============================================
|
|
374
|
+
setupSyncHandlers() {
|
|
375
|
+
// Listen for shared context updates from team
|
|
376
|
+
setInterval(() => {
|
|
377
|
+
this.syncSharedContext();
|
|
378
|
+
}, 5000);
|
|
379
|
+
// Decay old context importance
|
|
380
|
+
setInterval(() => {
|
|
381
|
+
this.decayOldContext();
|
|
382
|
+
}, 3600000); // Every hour
|
|
383
|
+
}
|
|
384
|
+
async syncSharedContext() {
|
|
385
|
+
// P2P sync handles the actual synchronization
|
|
386
|
+
// This method processes received updates
|
|
387
|
+
const stats = await this.p2pSync.sync();
|
|
388
|
+
console.log(`Synced with ${stats.connectedPeers} peers`);
|
|
389
|
+
}
|
|
390
|
+
decayOldContext() {
|
|
391
|
+
// Reduce importance of unused context
|
|
392
|
+
this.db.prepare(`
|
|
393
|
+
UPDATE shared_context
|
|
394
|
+
SET importance = importance * 0.95
|
|
395
|
+
WHERE project_id = ?
|
|
396
|
+
AND updated_at < unixepoch() - 86400 * 7 -- 7 days old
|
|
397
|
+
AND importance > 0.1
|
|
398
|
+
`).run(this.projectId);
|
|
399
|
+
}
|
|
400
|
+
// ============================================
|
|
401
|
+
// Utilities
|
|
402
|
+
// ============================================
|
|
403
|
+
generateContextId(content) {
|
|
404
|
+
return createHash('sha256')
|
|
405
|
+
.update(content)
|
|
406
|
+
.digest('hex')
|
|
407
|
+
.substring(0, 12);
|
|
408
|
+
}
|
|
409
|
+
estimateTokens(text) {
|
|
410
|
+
// Rough estimate: 1 token per 4 characters
|
|
411
|
+
return Math.ceil(text.length / 4);
|
|
412
|
+
}
|
|
413
|
+
captureContextSnapshot() {
|
|
414
|
+
const shared = this.db.prepare(`
|
|
415
|
+
SELECT type, content, importance FROM shared_context
|
|
416
|
+
WHERE project_id = ? AND active = TRUE
|
|
417
|
+
ORDER BY importance DESC
|
|
418
|
+
LIMIT 10
|
|
419
|
+
`).all(this.projectId);
|
|
420
|
+
const personal = this.db.prepare(`
|
|
421
|
+
SELECT type, content FROM personal_context
|
|
422
|
+
WHERE user_id = ? AND project_id = ?
|
|
423
|
+
ORDER BY created_at DESC
|
|
424
|
+
LIMIT 5
|
|
425
|
+
`).all(this.userId, this.projectId);
|
|
426
|
+
return {
|
|
427
|
+
timestamp: Date.now(),
|
|
428
|
+
shared: shared,
|
|
429
|
+
personal: personal
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
// ============================================
|
|
433
|
+
// Public API
|
|
434
|
+
// ============================================
|
|
435
|
+
getTeamActivity() {
|
|
436
|
+
const activeFrames = this.db.prepare(`
|
|
437
|
+
SELECT user_id, task, started_at FROM active_frames
|
|
438
|
+
WHERE project_id = ? AND status = 'active'
|
|
439
|
+
`).all(this.projectId);
|
|
440
|
+
const recentContext = this.db.prepare(`
|
|
441
|
+
SELECT type, COUNT(*) as count FROM shared_context
|
|
442
|
+
WHERE project_id = ? AND created_at > unixepoch() - 3600
|
|
443
|
+
GROUP BY type
|
|
444
|
+
`).all(this.projectId);
|
|
445
|
+
return {
|
|
446
|
+
activeUsers: [...new Set(activeFrames.map(f => f.user_id))],
|
|
447
|
+
activeFrames: activeFrames.map(f => ({
|
|
448
|
+
user: f.user_id,
|
|
449
|
+
task: f.task,
|
|
450
|
+
duration: Date.now() - f.started_at * 1000
|
|
451
|
+
})),
|
|
452
|
+
recentContext: recentContext
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
exportContext() {
|
|
456
|
+
const shared = this.db.prepare(`
|
|
457
|
+
SELECT * FROM shared_context WHERE project_id = ?
|
|
458
|
+
`).all(this.projectId);
|
|
459
|
+
const knowledge = this.db.prepare(`
|
|
460
|
+
SELECT * FROM project_knowledge WHERE project_id = ?
|
|
461
|
+
`).all(this.projectId);
|
|
462
|
+
return JSON.stringify({
|
|
463
|
+
projectId: this.projectId,
|
|
464
|
+
exported: Date.now(),
|
|
465
|
+
sharedContext: shared,
|
|
466
|
+
projectKnowledge: knowledge
|
|
467
|
+
}, null, 2);
|
|
468
|
+
}
|
|
469
|
+
disconnect() {
|
|
470
|
+
this.p2pSync.disconnect();
|
|
471
|
+
this.db.close();
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// ============================================
|
|
475
|
+
// Helper Classes
|
|
476
|
+
// ============================================
|
|
477
|
+
class SharedContext {
|
|
478
|
+
db;
|
|
479
|
+
p2pSync;
|
|
480
|
+
constructor(db, p2pSync) {
|
|
481
|
+
this.db = db;
|
|
482
|
+
this.p2pSync = p2pSync;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
class PersonalContext {
|
|
486
|
+
db;
|
|
487
|
+
constructor(db) {
|
|
488
|
+
this.db = db;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
//# sourceMappingURL=team-context-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-context-sync.js","sourceRoot":"","sources":["../../../p2p-sync/src/team-context-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initialize.d.ts","sourceRoot":"","sources":["../../scripts/initialize.ts"],"names":[],"mappings":";AACA;;GAEG"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Initialize StackMemory in the current project
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
const projectRoot = process.cwd();
|
|
10
|
+
console.log(chalk.blue.bold('\nš Initializing StackMemory...\n'));
|
|
11
|
+
// 1. Create .stackmemory directory
|
|
12
|
+
const stackDir = join(projectRoot, '.stackmemory');
|
|
13
|
+
if (!existsSync(stackDir)) {
|
|
14
|
+
mkdirSync(stackDir, { recursive: true });
|
|
15
|
+
console.log(chalk.green('ā') + ' Created .stackmemory directory');
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
console.log(chalk.yellow('ā ') + ' .stackmemory directory already exists');
|
|
19
|
+
}
|
|
20
|
+
// 2. Add to .gitignore
|
|
21
|
+
const gitignorePath = join(projectRoot, '.gitignore');
|
|
22
|
+
const gitignoreEntry = '\n# StackMemory\n.stackmemory/*.db\n.stackmemory/*.db-*\n';
|
|
23
|
+
if (existsSync(gitignorePath)) {
|
|
24
|
+
const gitignore = require('fs').readFileSync(gitignorePath, 'utf-8');
|
|
25
|
+
if (!gitignore.includes('.stackmemory')) {
|
|
26
|
+
require('fs').appendFileSync(gitignorePath, gitignoreEntry);
|
|
27
|
+
console.log(chalk.green('ā') + ' Added .stackmemory to .gitignore');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
writeFileSync(gitignorePath, gitignoreEntry);
|
|
32
|
+
console.log(chalk.green('ā') + ' Created .gitignore with .stackmemory');
|
|
33
|
+
}
|
|
34
|
+
// 3. Create config file
|
|
35
|
+
const configPath = join(stackDir, 'config.json');
|
|
36
|
+
if (!existsSync(configPath)) {
|
|
37
|
+
const config = {
|
|
38
|
+
projectId: projectRoot.split('/').pop(),
|
|
39
|
+
userId: process.env.USER || 'default',
|
|
40
|
+
teamId: 'local',
|
|
41
|
+
initialized: new Date().toISOString()
|
|
42
|
+
};
|
|
43
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
44
|
+
console.log(chalk.green('ā') + ' Created config file');
|
|
45
|
+
}
|
|
46
|
+
// 4. Create initial JSONL file
|
|
47
|
+
const jsonlPath = join(stackDir, 'frames.jsonl');
|
|
48
|
+
if (!existsSync(jsonlPath)) {
|
|
49
|
+
const initialFrame = {
|
|
50
|
+
id: 'init_' + Date.now(),
|
|
51
|
+
type: 'system',
|
|
52
|
+
content: 'StackMemory initialized',
|
|
53
|
+
timestamp: Date.now()
|
|
54
|
+
};
|
|
55
|
+
writeFileSync(jsonlPath, JSON.stringify(initialFrame) + '\n');
|
|
56
|
+
console.log(chalk.green('ā') + ' Created frames.jsonl');
|
|
57
|
+
}
|
|
58
|
+
// 5. Create MCP config for Claude Code
|
|
59
|
+
const mcpConfigPath = join(process.env.HOME || '~', '.config', 'claude', 'mcp.json');
|
|
60
|
+
console.log(chalk.blue('\nš MCP Configuration for Claude Code:\n'));
|
|
61
|
+
const mcpConfig = {
|
|
62
|
+
"mcpServers": {
|
|
63
|
+
"stackmemory": {
|
|
64
|
+
"command": "node",
|
|
65
|
+
"args": [join(projectRoot, "dist", "mcp-server.js")],
|
|
66
|
+
"env": {
|
|
67
|
+
"PROJECT_ROOT": projectRoot
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
console.log(chalk.gray('Add this to your Claude Code MCP configuration:'));
|
|
73
|
+
console.log(chalk.gray('(' + mcpConfigPath + ')\n'));
|
|
74
|
+
console.log(chalk.cyan(JSON.stringify(mcpConfig, null, 2)));
|
|
75
|
+
// 6. Build the project
|
|
76
|
+
console.log(chalk.blue('\nš¦ Building TypeScript files...\n'));
|
|
77
|
+
try {
|
|
78
|
+
execSync('npm run build', { stdio: 'inherit', cwd: projectRoot });
|
|
79
|
+
console.log(chalk.green('ā') + ' Build completed');
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
console.log(chalk.yellow('ā ') + ' Build failed - run npm run build manually');
|
|
83
|
+
}
|
|
84
|
+
console.log(chalk.green.bold('\nā
StackMemory initialized successfully!\n'));
|
|
85
|
+
console.log(chalk.gray('Next steps:'));
|
|
86
|
+
console.log(chalk.gray('1. Add the MCP configuration above to Claude Code'));
|
|
87
|
+
console.log(chalk.gray('2. Restart Claude Code'));
|
|
88
|
+
console.log(chalk.gray('3. Start using context tracking!'));
|
|
89
|
+
console.log(chalk.gray('\nUseful commands:'));
|
|
90
|
+
console.log(chalk.cyan(' npm run mcp:dev') + ' - Start MCP server in dev mode');
|
|
91
|
+
console.log(chalk.cyan(' npm run status') + ' - Check StackMemory status');
|
|
92
|
+
console.log(chalk.cyan(' npm run analyze') + ' - Analyze context usage\n');
|
|
93
|
+
//# sourceMappingURL=initialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../scripts/initialize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../scripts/status.ts"],"names":[],"mappings":";AACA;;GAEG"}
|