claude-code-smart-fork 1.0.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/CHANGELOG.md +36 -0
- package/LICENSE +21 -0
- package/README.md +317 -0
- package/README.zh-CN.md +45 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +351 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/__tests__/embedding.test.d.ts +2 -0
- package/dist/core/__tests__/embedding.test.d.ts.map +1 -0
- package/dist/core/__tests__/embedding.test.js +90 -0
- package/dist/core/__tests__/embedding.test.js.map +1 -0
- package/dist/core/config.d.ts +19 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +105 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/embedding.d.ts +28 -0
- package/dist/core/embedding.d.ts.map +1 -0
- package/dist/core/embedding.js +137 -0
- package/dist/core/embedding.js.map +1 -0
- package/dist/core/fork-detector.d.ts +38 -0
- package/dist/core/fork-detector.d.ts.map +1 -0
- package/dist/core/fork-detector.js +234 -0
- package/dist/core/fork-detector.js.map +1 -0
- package/dist/core/session-manager.d.ts +77 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +525 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/vector-store.d.ts +47 -0
- package/dist/core/vector-store.d.ts.map +1 -0
- package/dist/core/vector-store.js +204 -0
- package/dist/core/vector-store.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/claude-code.d.ts +53 -0
- package/dist/integrations/claude-code.d.ts.map +1 -0
- package/dist/integrations/claude-code.js +277 -0
- package/dist/integrations/claude-code.js.map +1 -0
- package/dist/types/index.d.ts +106 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session Manager - Handles session indexing, storage, and forking
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.SessionManager = void 0;
|
|
40
|
+
const fs = __importStar(require("fs/promises"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const uuid_1 = require("uuid");
|
|
43
|
+
const config_1 = require("./config");
|
|
44
|
+
const embedding_1 = require("./embedding");
|
|
45
|
+
const vector_store_1 = require("./vector-store");
|
|
46
|
+
const child_process_1 = require("child_process");
|
|
47
|
+
class SessionManager {
|
|
48
|
+
embeddingService;
|
|
49
|
+
vectorStore;
|
|
50
|
+
initialized = false;
|
|
51
|
+
constructor() {
|
|
52
|
+
this.embeddingService = new embedding_1.EmbeddingService();
|
|
53
|
+
this.vectorStore = new vector_store_1.VectorStore();
|
|
54
|
+
}
|
|
55
|
+
async initialize() {
|
|
56
|
+
if (this.initialized)
|
|
57
|
+
return;
|
|
58
|
+
const config = config_1.configManager.get();
|
|
59
|
+
await this.embeddingService.initialize(config.embedding);
|
|
60
|
+
await this.vectorStore.initialize(config.vectorStore);
|
|
61
|
+
// Ensure sessions directory exists
|
|
62
|
+
await fs.mkdir(config.storage.sessionsDir, { recursive: true });
|
|
63
|
+
this.initialized = true;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Index the current Claude Code session with full conversation history
|
|
67
|
+
*/
|
|
68
|
+
async indexCurrentSession(options = {}) {
|
|
69
|
+
await this.initialize();
|
|
70
|
+
const sessionId = (0, uuid_1.v4)();
|
|
71
|
+
const projectPath = process.cwd();
|
|
72
|
+
const projectName = path.basename(projectPath);
|
|
73
|
+
// Use provided conversation history or extract from Claude Code context
|
|
74
|
+
const conversationHistory = options.conversationHistory || await this.extractConversationHistory();
|
|
75
|
+
// Convert conversation history to legacy message format for compatibility
|
|
76
|
+
const messages = this.conversationToMessages(conversationHistory);
|
|
77
|
+
// Generate summary if not provided
|
|
78
|
+
const summary = options.summary || await this.generateSummaryFromConversation(conversationHistory);
|
|
79
|
+
// Extract key topics
|
|
80
|
+
const keyTopics = this.extractKeyTopicsFromConversation(conversationHistory);
|
|
81
|
+
// Create session object
|
|
82
|
+
const session = {
|
|
83
|
+
id: sessionId,
|
|
84
|
+
projectPath,
|
|
85
|
+
projectName,
|
|
86
|
+
createdAt: Date.now(),
|
|
87
|
+
updatedAt: Date.now(),
|
|
88
|
+
messages,
|
|
89
|
+
summary,
|
|
90
|
+
tags: options.tags || [],
|
|
91
|
+
conversationHistory
|
|
92
|
+
};
|
|
93
|
+
// Generate embedding for the session (include both user and assistant content)
|
|
94
|
+
const sessionText = this.conversationToText(conversationHistory);
|
|
95
|
+
session.embedding = await this.embeddingService.embed(sessionText);
|
|
96
|
+
// Save full session
|
|
97
|
+
await this.saveSession(session);
|
|
98
|
+
// Index for searching
|
|
99
|
+
const sessionIndex = {
|
|
100
|
+
id: sessionId,
|
|
101
|
+
projectPath,
|
|
102
|
+
projectName,
|
|
103
|
+
createdAt: session.createdAt,
|
|
104
|
+
updatedAt: session.updatedAt,
|
|
105
|
+
messageCount: messages.length,
|
|
106
|
+
summary,
|
|
107
|
+
tags: options.tags || [],
|
|
108
|
+
keyTopics,
|
|
109
|
+
embedding: session.embedding
|
|
110
|
+
};
|
|
111
|
+
await this.vectorStore.upsert(sessionIndex);
|
|
112
|
+
return session;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Fork to a historical session
|
|
116
|
+
*/
|
|
117
|
+
async forkToSession(sessionId) {
|
|
118
|
+
await this.initialize();
|
|
119
|
+
const session = await this.loadSession(sessionId);
|
|
120
|
+
if (!session) {
|
|
121
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
122
|
+
}
|
|
123
|
+
// 1. Change to the project directory
|
|
124
|
+
if (session.projectPath !== process.cwd()) {
|
|
125
|
+
console.log(`Changing directory to: ${session.projectPath}`);
|
|
126
|
+
process.chdir(session.projectPath);
|
|
127
|
+
}
|
|
128
|
+
// 2. Restore git branch if possible
|
|
129
|
+
try {
|
|
130
|
+
const currentBranch = (0, child_process_1.execSync)('git branch --show-current', {
|
|
131
|
+
encoding: 'utf-8',
|
|
132
|
+
cwd: session.projectPath
|
|
133
|
+
});
|
|
134
|
+
// Store current context before switching
|
|
135
|
+
const forkContext = {
|
|
136
|
+
sourceSessionId: this.getCurrentSessionId(),
|
|
137
|
+
targetSessionId: sessionId,
|
|
138
|
+
preservedContext: {
|
|
139
|
+
files: await this.getOpenFiles(),
|
|
140
|
+
environment: { ...process.env },
|
|
141
|
+
gitBranch: currentBranch.trim()
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
// Save fork context
|
|
145
|
+
await this.saveForkContext(forkContext);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Not a git repository or git not available
|
|
149
|
+
}
|
|
150
|
+
// 3. Open relevant files from the session
|
|
151
|
+
const filesToOpen = this.extractFilesFromSession(session);
|
|
152
|
+
for (const file of filesToOpen.slice(0, 5)) {
|
|
153
|
+
const filePath = path.join(session.projectPath, file);
|
|
154
|
+
try {
|
|
155
|
+
await fs.access(filePath);
|
|
156
|
+
console.log(`📄 ${file}`);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// File doesn't exist
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// 4. Display session summary and conversation history
|
|
163
|
+
console.log('\n📋 Session Summary:');
|
|
164
|
+
console.log(session.summary);
|
|
165
|
+
// Display full conversation history
|
|
166
|
+
console.log('\n💬 Conversation History:');
|
|
167
|
+
console.log('─'.repeat(60));
|
|
168
|
+
const history = session.conversationHistory || this.messagesToConversation(session.messages);
|
|
169
|
+
history.forEach((turn, index) => {
|
|
170
|
+
console.log(`\n[${index + 1}] 👤 User:`);
|
|
171
|
+
console.log(turn.userMessage.content);
|
|
172
|
+
if (turn.assistantMessage) {
|
|
173
|
+
console.log(`\n 🤖 Assistant:`);
|
|
174
|
+
// Truncate long assistant responses for display
|
|
175
|
+
const content = turn.assistantMessage.content;
|
|
176
|
+
const displayContent = content.length > 500
|
|
177
|
+
? content.substring(0, 500) + '\n... (truncated)'
|
|
178
|
+
: content;
|
|
179
|
+
console.log(displayContent);
|
|
180
|
+
}
|
|
181
|
+
// Show tool calls if any
|
|
182
|
+
if (turn.assistantMessage?.toolCalls && turn.assistantMessage.toolCalls.length > 0) {
|
|
183
|
+
console.log(` 🔧 Tool calls: ${turn.assistantMessage.toolCalls.map(t => t.type).join(', ')}`);
|
|
184
|
+
}
|
|
185
|
+
console.log('─'.repeat(60));
|
|
186
|
+
});
|
|
187
|
+
console.log(`\n✨ Total turns: ${history.length}`);
|
|
188
|
+
console.log('💡 You can continue the conversation from here.\n');
|
|
189
|
+
// 5. Set environment variable to indicate forked session
|
|
190
|
+
process.env.SMART_FORK_SESSION_ID = sessionId;
|
|
191
|
+
process.env.SMART_FORK_ORIGINAL_CWD = process.cwd();
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* List all indexed sessions
|
|
195
|
+
*/
|
|
196
|
+
async listSessions(projectPath) {
|
|
197
|
+
await this.initialize();
|
|
198
|
+
const allSessions = await this.vectorStore.getAll();
|
|
199
|
+
if (projectPath) {
|
|
200
|
+
return allSessions.filter(s => s.projectPath === projectPath);
|
|
201
|
+
}
|
|
202
|
+
return allSessions;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Export session to a file
|
|
206
|
+
*/
|
|
207
|
+
async exportSession(sessionId, outputPath) {
|
|
208
|
+
const session = await this.loadSession(sessionId);
|
|
209
|
+
if (!session) {
|
|
210
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
211
|
+
}
|
|
212
|
+
const targetPath = outputPath || path.join(process.cwd(), `session-${sessionId.slice(0, 8)}.json`);
|
|
213
|
+
await fs.writeFile(targetPath, JSON.stringify(session, null, 2));
|
|
214
|
+
return targetPath;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Import session from a file
|
|
218
|
+
*/
|
|
219
|
+
async importSession(filePath) {
|
|
220
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
221
|
+
const session = JSON.parse(content);
|
|
222
|
+
// Re-index the session
|
|
223
|
+
const summary = session.summary || `Session in ${session.projectName}`;
|
|
224
|
+
await this.vectorStore.upsert({
|
|
225
|
+
id: session.id,
|
|
226
|
+
projectPath: session.projectPath,
|
|
227
|
+
projectName: session.projectName,
|
|
228
|
+
createdAt: session.createdAt,
|
|
229
|
+
updatedAt: Date.now(),
|
|
230
|
+
messageCount: session.messages.length,
|
|
231
|
+
summary: summary,
|
|
232
|
+
tags: session.tags,
|
|
233
|
+
keyTopics: this.extractKeyTopics(session.messages),
|
|
234
|
+
embedding: session.embedding || await this.embeddingService.embed(this.sessionToText(session))
|
|
235
|
+
});
|
|
236
|
+
await this.saveSession(session);
|
|
237
|
+
return session;
|
|
238
|
+
}
|
|
239
|
+
// Private helper methods for conversation history
|
|
240
|
+
/**
|
|
241
|
+
* Extract conversation history from various sources
|
|
242
|
+
*/
|
|
243
|
+
async extractConversationHistory() {
|
|
244
|
+
const turns = [];
|
|
245
|
+
// Try to read from Claude Code's conversation log
|
|
246
|
+
const claudeConvPath = path.join(process.env.HOME || process.env.USERPROFILE || '', '.claude', 'projects', this.sanitizePath(process.cwd()), 'conversation.json');
|
|
247
|
+
try {
|
|
248
|
+
const content = await fs.readFile(claudeConvPath, 'utf-8');
|
|
249
|
+
const logData = JSON.parse(content);
|
|
250
|
+
if (Array.isArray(logData.conversation)) {
|
|
251
|
+
turns.push(...logData.conversation.map((turn) => ({
|
|
252
|
+
id: turn.id || (0, uuid_1.v4)(),
|
|
253
|
+
timestamp: turn.timestamp || Date.now(),
|
|
254
|
+
userMessage: {
|
|
255
|
+
content: turn.userMessage?.content || '',
|
|
256
|
+
metadata: turn.userMessage?.metadata
|
|
257
|
+
},
|
|
258
|
+
assistantMessage: turn.assistantMessage ? {
|
|
259
|
+
content: turn.assistantMessage.content || '',
|
|
260
|
+
toolCalls: turn.assistantMessage.toolCalls,
|
|
261
|
+
metadata: turn.assistantMessage.metadata
|
|
262
|
+
} : undefined
|
|
263
|
+
})));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// Conversation log not available, fallback to legacy message format
|
|
268
|
+
const messages = await this.extractMessages();
|
|
269
|
+
return this.messagesToConversation(messages);
|
|
270
|
+
}
|
|
271
|
+
// If no conversation found, create a placeholder
|
|
272
|
+
if (turns.length === 0) {
|
|
273
|
+
turns.push({
|
|
274
|
+
id: (0, uuid_1.v4)(),
|
|
275
|
+
timestamp: Date.now(),
|
|
276
|
+
userMessage: {
|
|
277
|
+
content: `Working in ${process.cwd()}`
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
return turns;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Convert conversation turns to legacy message format
|
|
285
|
+
*/
|
|
286
|
+
conversationToMessages(turns) {
|
|
287
|
+
const messages = [];
|
|
288
|
+
for (const turn of turns) {
|
|
289
|
+
// Add user message
|
|
290
|
+
messages.push({
|
|
291
|
+
id: `${turn.id}-user`,
|
|
292
|
+
role: 'user',
|
|
293
|
+
content: turn.userMessage.content,
|
|
294
|
+
timestamp: turn.timestamp,
|
|
295
|
+
metadata: turn.userMessage.metadata
|
|
296
|
+
});
|
|
297
|
+
// Add assistant message if exists
|
|
298
|
+
if (turn.assistantMessage) {
|
|
299
|
+
messages.push({
|
|
300
|
+
id: `${turn.id}-assistant`,
|
|
301
|
+
role: 'assistant',
|
|
302
|
+
content: turn.assistantMessage.content,
|
|
303
|
+
timestamp: turn.timestamp + 1,
|
|
304
|
+
metadata: turn.assistantMessage.metadata
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return messages;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Convert legacy messages to conversation turns
|
|
312
|
+
*/
|
|
313
|
+
messagesToConversation(messages) {
|
|
314
|
+
const turns = [];
|
|
315
|
+
let currentTurn = {};
|
|
316
|
+
for (const message of messages) {
|
|
317
|
+
if (message.role === 'user') {
|
|
318
|
+
// Save previous turn if exists
|
|
319
|
+
if (currentTurn.id) {
|
|
320
|
+
turns.push(currentTurn);
|
|
321
|
+
}
|
|
322
|
+
// Start new turn
|
|
323
|
+
currentTurn = {
|
|
324
|
+
id: message.id.replace('-user', ''),
|
|
325
|
+
timestamp: message.timestamp,
|
|
326
|
+
userMessage: {
|
|
327
|
+
content: message.content,
|
|
328
|
+
metadata: message.metadata
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
else if (message.role === 'assistant' && currentTurn.id) {
|
|
333
|
+
currentTurn.assistantMessage = {
|
|
334
|
+
content: message.content,
|
|
335
|
+
metadata: message.metadata
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
// Don't forget the last turn
|
|
340
|
+
if (currentTurn.id) {
|
|
341
|
+
turns.push(currentTurn);
|
|
342
|
+
}
|
|
343
|
+
return turns;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Convert conversation to text for embedding
|
|
347
|
+
*/
|
|
348
|
+
conversationToText(turns) {
|
|
349
|
+
const parts = [];
|
|
350
|
+
for (const turn of turns) {
|
|
351
|
+
parts.push(`User: ${turn.userMessage.content}`);
|
|
352
|
+
if (turn.assistantMessage) {
|
|
353
|
+
parts.push(`Assistant: ${turn.assistantMessage.content}`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return parts.join('\n\n');
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Generate summary from conversation
|
|
360
|
+
*/
|
|
361
|
+
async generateSummaryFromConversation(turns) {
|
|
362
|
+
if (turns.length === 0) {
|
|
363
|
+
return `Session in ${path.basename(process.cwd())}`;
|
|
364
|
+
}
|
|
365
|
+
// Use the first user message as summary basis
|
|
366
|
+
const firstUserMessage = turns[0].userMessage.content;
|
|
367
|
+
const summary = firstUserMessage.length > 200
|
|
368
|
+
? firstUserMessage.substring(0, 200) + '...'
|
|
369
|
+
: firstUserMessage;
|
|
370
|
+
return summary;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Extract key topics from conversation
|
|
374
|
+
*/
|
|
375
|
+
extractKeyTopicsFromConversation(turns) {
|
|
376
|
+
const allText = turns
|
|
377
|
+
.map(t => `${t.userMessage.content} ${t.assistantMessage?.content || ''}`)
|
|
378
|
+
.join(' ');
|
|
379
|
+
// Simple keyword extraction
|
|
380
|
+
const words = allText.toLowerCase()
|
|
381
|
+
.replace(/[^\w\s]/g, ' ')
|
|
382
|
+
.split(/\s+/)
|
|
383
|
+
.filter(w => w.length > 3);
|
|
384
|
+
const frequency = {};
|
|
385
|
+
words.forEach(word => {
|
|
386
|
+
frequency[word] = (frequency[word] || 0) + 1;
|
|
387
|
+
});
|
|
388
|
+
return Object.entries(frequency)
|
|
389
|
+
.sort((a, b) => b[1] - a[1])
|
|
390
|
+
.slice(0, 10)
|
|
391
|
+
.map(([word]) => word);
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Sanitize path for use in file names
|
|
395
|
+
*/
|
|
396
|
+
sanitizePath(filePath) {
|
|
397
|
+
return filePath.replace(/[:\/\\]/g, '_');
|
|
398
|
+
}
|
|
399
|
+
// Legacy helper methods
|
|
400
|
+
async extractMessages() {
|
|
401
|
+
const messages = [];
|
|
402
|
+
// Try to read from Claude Code's message log
|
|
403
|
+
const claudeLogPath = path.join(process.env.HOME || process.env.USERPROFILE || '', '.claude', 'messages.json');
|
|
404
|
+
try {
|
|
405
|
+
const content = await fs.readFile(claudeLogPath, 'utf-8');
|
|
406
|
+
const logData = JSON.parse(content);
|
|
407
|
+
if (Array.isArray(logData.messages)) {
|
|
408
|
+
messages.push(...logData.messages.map((m) => ({
|
|
409
|
+
id: m.id || (0, uuid_1.v4)(),
|
|
410
|
+
role: m.role,
|
|
411
|
+
content: m.content,
|
|
412
|
+
timestamp: m.timestamp || Date.now(),
|
|
413
|
+
metadata: m.metadata
|
|
414
|
+
})));
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
// Log file not available, try alternative methods
|
|
419
|
+
}
|
|
420
|
+
// If no messages found, create a placeholder
|
|
421
|
+
if (messages.length === 0) {
|
|
422
|
+
messages.push({
|
|
423
|
+
id: (0, uuid_1.v4)(),
|
|
424
|
+
role: 'user',
|
|
425
|
+
content: `Working in ${process.cwd()}`,
|
|
426
|
+
timestamp: Date.now()
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
return messages;
|
|
430
|
+
}
|
|
431
|
+
async generateSummary(messages) {
|
|
432
|
+
// Use the first user message as summary, or combine recent messages
|
|
433
|
+
const userMessages = messages.filter(m => m.role === 'user');
|
|
434
|
+
if (userMessages.length > 0) {
|
|
435
|
+
const firstMsg = userMessages[0].content;
|
|
436
|
+
return firstMsg.length > 200
|
|
437
|
+
? firstMsg.substring(0, 200) + '...'
|
|
438
|
+
: firstMsg;
|
|
439
|
+
}
|
|
440
|
+
return `Session in ${path.basename(process.cwd())}`;
|
|
441
|
+
}
|
|
442
|
+
extractKeyTopics(messages) {
|
|
443
|
+
const allText = messages.map(m => m.content).join(' ');
|
|
444
|
+
// Simple keyword extraction
|
|
445
|
+
const words = allText.toLowerCase()
|
|
446
|
+
.replace(/[^\w\s]/g, ' ')
|
|
447
|
+
.split(/\s+/)
|
|
448
|
+
.filter(w => w.length > 3);
|
|
449
|
+
const frequency = {};
|
|
450
|
+
words.forEach(word => {
|
|
451
|
+
frequency[word] = (frequency[word] || 0) + 1;
|
|
452
|
+
});
|
|
453
|
+
return Object.entries(frequency)
|
|
454
|
+
.sort((a, b) => b[1] - a[1])
|
|
455
|
+
.slice(0, 10)
|
|
456
|
+
.map(([word]) => word);
|
|
457
|
+
}
|
|
458
|
+
sessionToText(session) {
|
|
459
|
+
const parts = [
|
|
460
|
+
`Project: ${session.projectName}`,
|
|
461
|
+
`Path: ${session.projectPath}`,
|
|
462
|
+
`Summary: ${session.summary}`,
|
|
463
|
+
`Tags: ${session.tags.join(', ')}`,
|
|
464
|
+
`Messages:`,
|
|
465
|
+
...session.messages.map(m => `${m.role}: ${m.content}`)
|
|
466
|
+
];
|
|
467
|
+
return parts.join('\n');
|
|
468
|
+
}
|
|
469
|
+
async saveSession(session) {
|
|
470
|
+
const sessionsDir = config_1.configManager.getSessionsDir();
|
|
471
|
+
const sessionPath = path.join(sessionsDir, `${session.id}.json`);
|
|
472
|
+
await fs.writeFile(sessionPath, JSON.stringify(session, null, 2));
|
|
473
|
+
}
|
|
474
|
+
async loadSession(sessionId) {
|
|
475
|
+
const sessionsDir = config_1.configManager.getSessionsDir();
|
|
476
|
+
const sessionPath = path.join(sessionsDir, `${sessionId}.json`);
|
|
477
|
+
try {
|
|
478
|
+
const content = await fs.readFile(sessionPath, 'utf-8');
|
|
479
|
+
return JSON.parse(content);
|
|
480
|
+
}
|
|
481
|
+
catch {
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
async saveForkContext(context) {
|
|
486
|
+
const forkPath = path.join(config_1.configManager.getSessionsDir(), 'fork-context.json');
|
|
487
|
+
await fs.writeFile(forkPath, JSON.stringify(context, null, 2));
|
|
488
|
+
}
|
|
489
|
+
getCurrentSessionId() {
|
|
490
|
+
return process.env.SMART_FORK_SESSION_ID || 'unknown';
|
|
491
|
+
}
|
|
492
|
+
async getOpenFiles() {
|
|
493
|
+
// Try to detect currently open files
|
|
494
|
+
// This could be integrated with VS Code, cursor, or other editors
|
|
495
|
+
const openFiles = [];
|
|
496
|
+
// Check for VS Code
|
|
497
|
+
try {
|
|
498
|
+
// VS Code state is in different locations depending on OS
|
|
499
|
+
// This is a simplified version
|
|
500
|
+
const vscodePath = path.join(process.env.HOME || process.env.USERPROFILE || '', '.config', 'Code', 'Global Storage', 'state.vscdb');
|
|
501
|
+
// Actual implementation would parse the VS Code state
|
|
502
|
+
}
|
|
503
|
+
catch {
|
|
504
|
+
// VS Code not detected
|
|
505
|
+
}
|
|
506
|
+
return openFiles;
|
|
507
|
+
}
|
|
508
|
+
extractFilesFromSession(session) {
|
|
509
|
+
const files = new Set();
|
|
510
|
+
session.messages.forEach(msg => {
|
|
511
|
+
// Extract file paths from message content
|
|
512
|
+
const fileMatches = msg.content.match(/[\w\-./]+\.(ts|js|tsx|jsx|py|go|rs|java|cpp|c|h|md|json|yaml|yml)/g);
|
|
513
|
+
if (fileMatches) {
|
|
514
|
+
fileMatches.forEach(f => files.add(f));
|
|
515
|
+
}
|
|
516
|
+
// Extract from metadata if available
|
|
517
|
+
if (msg.metadata?.filePaths) {
|
|
518
|
+
msg.metadata.filePaths.forEach(f => files.add(f));
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
return Array.from(files);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
exports.SessionManager = SessionManager;
|
|
525
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector Store - Handles storage and retrieval of session embeddings
|
|
3
|
+
* Supports multiple backends: local JSON, Chroma, Pinecone
|
|
4
|
+
*/
|
|
5
|
+
import type { SessionIndex, Config } from '../types';
|
|
6
|
+
interface SearchParams {
|
|
7
|
+
vector: number[];
|
|
8
|
+
limit: number;
|
|
9
|
+
filter?: Record<string, any>;
|
|
10
|
+
}
|
|
11
|
+
interface SearchResult {
|
|
12
|
+
session: SessionIndex;
|
|
13
|
+
score: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class VectorStore {
|
|
16
|
+
private config;
|
|
17
|
+
private localData;
|
|
18
|
+
private initialized;
|
|
19
|
+
initialize(config: Config['vectorStore']): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Add or update a session in the vector store
|
|
22
|
+
*/
|
|
23
|
+
upsert(session: SessionIndex): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Search for similar sessions
|
|
26
|
+
*/
|
|
27
|
+
search(params: SearchParams): Promise<SearchResult[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Delete a session from the store
|
|
30
|
+
*/
|
|
31
|
+
delete(sessionId: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Get all sessions
|
|
34
|
+
*/
|
|
35
|
+
getAll(): Promise<SessionIndex[]>;
|
|
36
|
+
private loadLocalData;
|
|
37
|
+
private saveLocalData;
|
|
38
|
+
private upsertLocal;
|
|
39
|
+
private searchLocal;
|
|
40
|
+
private upsertChroma;
|
|
41
|
+
private searchChroma;
|
|
42
|
+
private upsertPinecone;
|
|
43
|
+
private searchPinecone;
|
|
44
|
+
private cosineSimilarity;
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=vector-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../src/core/vector-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGrD,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,WAAW,CAAS;IAEtB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9D;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlD;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAe3D;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB9C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YAYzB,aAAa;YAkBb,aAAa;YAab,WAAW;IAKzB,OAAO,CAAC,WAAW;YA0BL,YAAY;YAMZ,YAAY;YAKZ,cAAc;YAMd,cAAc;IAK5B,OAAO,CAAC,gBAAgB;CAazB"}
|