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,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Embedding Service - Generates vector embeddings for text
|
|
4
|
+
* Supports multiple providers: OpenAI, Ollama, and simple keyword-based fallback
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.EmbeddingService = void 0;
|
|
8
|
+
class EmbeddingService {
|
|
9
|
+
config;
|
|
10
|
+
initialized = false;
|
|
11
|
+
async initialize(config) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.initialized = true;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Generate embedding for text
|
|
17
|
+
*/
|
|
18
|
+
async embed(text) {
|
|
19
|
+
if (!this.initialized)
|
|
20
|
+
await this.initialize(this.config);
|
|
21
|
+
// Truncate long text
|
|
22
|
+
const truncated = text.slice(0, 8000);
|
|
23
|
+
switch (this.config.provider) {
|
|
24
|
+
case 'openai':
|
|
25
|
+
return this.embedOpenAI(truncated);
|
|
26
|
+
case 'ollama':
|
|
27
|
+
return this.embedOllama(truncated);
|
|
28
|
+
case 'local':
|
|
29
|
+
default:
|
|
30
|
+
return this.embedLocal(truncated);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generate embeddings for multiple texts (batch processing)
|
|
35
|
+
*/
|
|
36
|
+
async embedBatch(texts) {
|
|
37
|
+
return Promise.all(texts.map(t => this.embed(t)));
|
|
38
|
+
}
|
|
39
|
+
async embedOpenAI(text) {
|
|
40
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
41
|
+
if (!apiKey) {
|
|
42
|
+
throw new Error('OPENAI_API_KEY environment variable not set');
|
|
43
|
+
}
|
|
44
|
+
const response = await fetch('https://api.openai.com/v1/embeddings', {
|
|
45
|
+
method: 'POST',
|
|
46
|
+
headers: {
|
|
47
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
48
|
+
'Content-Type': 'application/json'
|
|
49
|
+
},
|
|
50
|
+
body: JSON.stringify({
|
|
51
|
+
model: this.config.model || 'text-embedding-3-small',
|
|
52
|
+
input: text
|
|
53
|
+
})
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
throw new Error(`OpenAI API error: ${response.statusText}`);
|
|
57
|
+
}
|
|
58
|
+
const data = await response.json();
|
|
59
|
+
return data.data[0].embedding;
|
|
60
|
+
}
|
|
61
|
+
async embedOllama(text) {
|
|
62
|
+
const ollamaUrl = process.env.OLLAMA_URL || 'http://localhost:11434';
|
|
63
|
+
const response = await fetch(`${ollamaUrl}/api/embeddings`, {
|
|
64
|
+
method: 'POST',
|
|
65
|
+
headers: {
|
|
66
|
+
'Content-Type': 'application/json'
|
|
67
|
+
},
|
|
68
|
+
body: JSON.stringify({
|
|
69
|
+
model: this.config.model || 'nomic-embed-text',
|
|
70
|
+
prompt: text
|
|
71
|
+
})
|
|
72
|
+
});
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
throw new Error(`Ollama API error: ${response.statusText}`);
|
|
75
|
+
}
|
|
76
|
+
const data = await response.json();
|
|
77
|
+
return data.embedding;
|
|
78
|
+
}
|
|
79
|
+
async embedLocal(text) {
|
|
80
|
+
// Simple keyword-based embedding (no external dependencies)
|
|
81
|
+
return this.keywordEmbedding(text);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Simple keyword-based embedding
|
|
85
|
+
* Used when no embedding service is available
|
|
86
|
+
* Creates a bag-of-words style vector
|
|
87
|
+
*/
|
|
88
|
+
keywordEmbedding(text) {
|
|
89
|
+
const dimension = this.config.dimension || 384;
|
|
90
|
+
const embedding = new Array(dimension).fill(0);
|
|
91
|
+
// Common stop words to filter out
|
|
92
|
+
const stopWords = new Set(['the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been',
|
|
93
|
+
'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
94
|
+
'should', 'may', 'might', 'must', 'shall', 'can', 'need', 'dare', 'ought',
|
|
95
|
+
'used', 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'as',
|
|
96
|
+
'into', 'through', 'during', 'before', 'after', 'above', 'below', 'between',
|
|
97
|
+
'and', 'but', 'or', 'yet', 'so', 'if', 'because', 'although', 'though',
|
|
98
|
+
'unless', 'while', 'where', 'when', 'that', 'which', 'who', 'whom', 'whose',
|
|
99
|
+
'what', 'this', 'these', 'those', 'i', 'you', 'he', 'she', 'it', 'we', 'they',
|
|
100
|
+
'my', 'your', 'his', 'her', 'its', 'our', 'their']);
|
|
101
|
+
// Extract words and build frequency vector
|
|
102
|
+
const words = text.toLowerCase()
|
|
103
|
+
.replace(/[^\w\s]/g, ' ')
|
|
104
|
+
.split(/\s+/)
|
|
105
|
+
.filter(w => w.length > 2 && !stopWords.has(w) && !/^\d+$/.test(w));
|
|
106
|
+
// Use multiple hash functions for better distribution
|
|
107
|
+
words.forEach((word) => {
|
|
108
|
+
// Hash 1: Simple rolling hash
|
|
109
|
+
let hash1 = 0;
|
|
110
|
+
for (let i = 0; i < word.length; i++) {
|
|
111
|
+
hash1 = ((hash1 << 5) - hash1) + word.charCodeAt(i);
|
|
112
|
+
hash1 = hash1 & hash1;
|
|
113
|
+
}
|
|
114
|
+
// Hash 2: FNV-like hash
|
|
115
|
+
let hash2 = 0x811c9dc5;
|
|
116
|
+
for (let i = 0; i < word.length; i++) {
|
|
117
|
+
hash2 ^= word.charCodeAt(i);
|
|
118
|
+
hash2 += (hash2 << 1) + (hash2 << 4) + (hash2 << 7) + (hash2 << 8) + (hash2 << 24);
|
|
119
|
+
}
|
|
120
|
+
// Distribute across vector
|
|
121
|
+
const pos1 = Math.abs(hash1) % dimension;
|
|
122
|
+
const pos2 = Math.abs(hash2) % dimension;
|
|
123
|
+
embedding[pos1] += 1;
|
|
124
|
+
embedding[pos2] += 0.5;
|
|
125
|
+
});
|
|
126
|
+
// Normalize to unit length
|
|
127
|
+
const norm = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));
|
|
128
|
+
if (norm > 0) {
|
|
129
|
+
for (let i = 0; i < dimension; i++) {
|
|
130
|
+
embedding[i] /= norm;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return embedding;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.EmbeddingService = EmbeddingService;
|
|
137
|
+
//# sourceMappingURL=embedding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/core/embedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fork Detector - Core matching engine
|
|
3
|
+
* Finds relevant historical sessions based on current context
|
|
4
|
+
*/
|
|
5
|
+
import type { SearchQuery, SearchResult } from '../types';
|
|
6
|
+
export declare class ForkDetector {
|
|
7
|
+
private embeddingService;
|
|
8
|
+
private vectorStore;
|
|
9
|
+
private initialized;
|
|
10
|
+
constructor();
|
|
11
|
+
initialize(): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Extract context from current Claude Code session
|
|
14
|
+
* Reads from environment variables and recent conversation history
|
|
15
|
+
*/
|
|
16
|
+
extractCurrentContext(): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Find sessions relevant to the given query
|
|
19
|
+
*/
|
|
20
|
+
findRelevantSessions(query: SearchQuery): Promise<SearchResult[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Analyze current session and suggest relevant past sessions proactively
|
|
23
|
+
*/
|
|
24
|
+
suggestRelevantSessions(): Promise<SearchResult[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Extract key topics from text using simple TF-IDF-like approach
|
|
27
|
+
*/
|
|
28
|
+
private extractKeyTopics;
|
|
29
|
+
/**
|
|
30
|
+
* Find the best matching message in a session
|
|
31
|
+
*/
|
|
32
|
+
private findBestMatchingMessage;
|
|
33
|
+
/**
|
|
34
|
+
* Get recently modified files in a directory
|
|
35
|
+
*/
|
|
36
|
+
private getRecentFiles;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=fork-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fork-detector.d.ts","sourceRoot":"","sources":["../../src/core/fork-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAgB,MAAM,UAAU,CAAC;AAIxE,qBAAa,YAAY;IACvB,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAS;;IAOtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC;;;OAGG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IA4D9C;;OAEG;IACG,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA0BvE;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmBxD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAM/B;;OAEG;YACW,cAAc;CAmC7B"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Fork Detector - Core matching engine
|
|
4
|
+
* Finds relevant historical sessions based on current context
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.ForkDetector = void 0;
|
|
41
|
+
const config_1 = require("./config");
|
|
42
|
+
const embedding_1 = require("./embedding");
|
|
43
|
+
const vector_store_1 = require("./vector-store");
|
|
44
|
+
const fs = __importStar(require("fs/promises"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
class ForkDetector {
|
|
47
|
+
embeddingService;
|
|
48
|
+
vectorStore;
|
|
49
|
+
initialized = false;
|
|
50
|
+
constructor() {
|
|
51
|
+
this.embeddingService = new embedding_1.EmbeddingService();
|
|
52
|
+
this.vectorStore = new vector_store_1.VectorStore();
|
|
53
|
+
}
|
|
54
|
+
async initialize() {
|
|
55
|
+
if (this.initialized)
|
|
56
|
+
return;
|
|
57
|
+
const config = config_1.configManager.get();
|
|
58
|
+
await this.embeddingService.initialize(config.embedding);
|
|
59
|
+
await this.vectorStore.initialize(config.vectorStore);
|
|
60
|
+
this.initialized = true;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Extract context from current Claude Code session
|
|
64
|
+
* Reads from environment variables and recent conversation history
|
|
65
|
+
*/
|
|
66
|
+
async extractCurrentContext() {
|
|
67
|
+
const contexts = [];
|
|
68
|
+
// 1. Try to get from Claude Code's context file (if available)
|
|
69
|
+
const claudeContextPath = process.env.CLAUDE_CONTEXT_PATH ||
|
|
70
|
+
path.join(process.cwd(), '.claude', 'context.json');
|
|
71
|
+
try {
|
|
72
|
+
const contextContent = await fs.readFile(claudeContextPath, 'utf-8');
|
|
73
|
+
const context = JSON.parse(contextContent);
|
|
74
|
+
if (context.recentMessages) {
|
|
75
|
+
contexts.push(...context.recentMessages.map((m) => m.content));
|
|
76
|
+
}
|
|
77
|
+
if (context.currentTask) {
|
|
78
|
+
contexts.push(context.currentTask);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Context file not available, use alternative methods
|
|
83
|
+
}
|
|
84
|
+
// 2. Extract from current working directory
|
|
85
|
+
contexts.push(`Current project: ${process.cwd()}`);
|
|
86
|
+
// 3. Try to infer from git status
|
|
87
|
+
try {
|
|
88
|
+
const { execSync } = require('child_process');
|
|
89
|
+
const gitBranch = execSync('git branch --show-current', {
|
|
90
|
+
cwd: process.cwd(),
|
|
91
|
+
encoding: 'utf-8'
|
|
92
|
+
}).trim();
|
|
93
|
+
contexts.push(`Git branch: ${gitBranch}`);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Not a git repository
|
|
97
|
+
}
|
|
98
|
+
// 4. Look for recent files
|
|
99
|
+
try {
|
|
100
|
+
const recentFiles = await this.getRecentFiles(process.cwd(), 5);
|
|
101
|
+
if (recentFiles.length > 0) {
|
|
102
|
+
contexts.push(`Recent files: ${recentFiles.join(', ')}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Ignore errors
|
|
107
|
+
}
|
|
108
|
+
// 5. Use recent command history if available
|
|
109
|
+
const historyPath = path.join(process.env.HOME || process.env.USERPROFILE || '', '.claude_history');
|
|
110
|
+
try {
|
|
111
|
+
const history = await fs.readFile(historyPath, 'utf-8');
|
|
112
|
+
const recentCommands = history.split('\n').slice(-10).join(' ');
|
|
113
|
+
contexts.push(`Recent activity: ${recentCommands}`);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// History not available
|
|
117
|
+
}
|
|
118
|
+
return contexts.join('\n');
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Find sessions relevant to the given query
|
|
122
|
+
*/
|
|
123
|
+
async findRelevantSessions(query) {
|
|
124
|
+
await this.initialize();
|
|
125
|
+
// Generate embedding for the query
|
|
126
|
+
const queryEmbedding = await this.embeddingService.embed(query.text);
|
|
127
|
+
// Search vector store
|
|
128
|
+
const results = await this.vectorStore.search({
|
|
129
|
+
vector: queryEmbedding,
|
|
130
|
+
limit: query.limit || 5,
|
|
131
|
+
filter: query.projectPath ? { projectPath: query.projectPath } : undefined
|
|
132
|
+
});
|
|
133
|
+
// Filter by threshold and format results
|
|
134
|
+
const threshold = query.threshold ?? 0.6;
|
|
135
|
+
const filteredResults = results
|
|
136
|
+
.filter(r => r.score >= threshold)
|
|
137
|
+
.map(r => ({
|
|
138
|
+
session: r.session,
|
|
139
|
+
score: r.score,
|
|
140
|
+
matchedMessage: this.findBestMatchingMessage(r.session, query.text)
|
|
141
|
+
}));
|
|
142
|
+
return filteredResults;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Analyze current session and suggest relevant past sessions proactively
|
|
146
|
+
*/
|
|
147
|
+
async suggestRelevantSessions() {
|
|
148
|
+
const context = await this.extractCurrentContext();
|
|
149
|
+
// Extract key topics from context
|
|
150
|
+
const keyTopics = this.extractKeyTopics(context);
|
|
151
|
+
// Search with expanded query
|
|
152
|
+
const expandedQuery = [
|
|
153
|
+
context,
|
|
154
|
+
...keyTopics
|
|
155
|
+
].join(' ');
|
|
156
|
+
return this.findRelevantSessions({
|
|
157
|
+
text: expandedQuery,
|
|
158
|
+
limit: 3,
|
|
159
|
+
threshold: 0.5 // Lower threshold for proactive suggestions
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Extract key topics from text using simple TF-IDF-like approach
|
|
164
|
+
*/
|
|
165
|
+
extractKeyTopics(text) {
|
|
166
|
+
// Remove common stop words
|
|
167
|
+
const stopWords = new Set(['the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been',
|
|
168
|
+
'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
169
|
+
'should', 'may', 'might', 'must', 'shall', 'can', 'need', 'dare', 'ought',
|
|
170
|
+
'used', 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'as',
|
|
171
|
+
'into', 'through', 'during', 'before', 'after', 'above', 'below', 'between',
|
|
172
|
+
'and', 'but', 'or', 'yet', 'so', 'if', 'because', 'although', 'though',
|
|
173
|
+
'unless', 'while', 'where', 'when', 'that', 'which', 'who', 'whom', 'whose',
|
|
174
|
+
'what', 'this', 'these', 'those', 'i', 'you', 'he', 'she', 'it', 'we', 'they']);
|
|
175
|
+
// Extract words and count frequency
|
|
176
|
+
const words = text.toLowerCase()
|
|
177
|
+
.replace(/[^\w\s]/g, ' ')
|
|
178
|
+
.split(/\s+/)
|
|
179
|
+
.filter(w => w.length > 2 && !stopWords.has(w));
|
|
180
|
+
const frequency = {};
|
|
181
|
+
words.forEach(word => {
|
|
182
|
+
frequency[word] = (frequency[word] || 0) + 1;
|
|
183
|
+
});
|
|
184
|
+
// Get top keywords
|
|
185
|
+
return Object.entries(frequency)
|
|
186
|
+
.sort((a, b) => b[1] - a[1])
|
|
187
|
+
.slice(0, 10)
|
|
188
|
+
.map(([word]) => word);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Find the best matching message in a session
|
|
192
|
+
*/
|
|
193
|
+
findBestMatchingMessage(session, query) {
|
|
194
|
+
// This would require loading the full session
|
|
195
|
+
// For now, return the summary
|
|
196
|
+
return session.summary;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get recently modified files in a directory
|
|
200
|
+
*/
|
|
201
|
+
async getRecentFiles(dir, limit) {
|
|
202
|
+
const files = [];
|
|
203
|
+
async function scan(directory) {
|
|
204
|
+
try {
|
|
205
|
+
const entries = await fs.readdir(directory, { withFileTypes: true });
|
|
206
|
+
for (const entry of entries) {
|
|
207
|
+
const fullPath = path.join(directory, entry.name);
|
|
208
|
+
// Skip hidden files and common non-code directories
|
|
209
|
+
if (entry.name.startsWith('.') ||
|
|
210
|
+
['node_modules', 'dist', 'build', '.git'].includes(entry.name)) {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
if (entry.isDirectory()) {
|
|
214
|
+
await scan(fullPath);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
const stat = await fs.stat(fullPath);
|
|
218
|
+
files.push({ path: fullPath, mtime: stat.mtime.getTime() });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Ignore permission errors
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
await scan(dir);
|
|
227
|
+
return files
|
|
228
|
+
.sort((a, b) => b.mtime - a.mtime)
|
|
229
|
+
.slice(0, limit)
|
|
230
|
+
.map(f => path.relative(dir, f.path));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
exports.ForkDetector = ForkDetector;
|
|
234
|
+
//# sourceMappingURL=fork-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fork-detector.js","sourceRoot":"","sources":["../../src/core/fork-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager - Handles session indexing, storage, and forking
|
|
3
|
+
*/
|
|
4
|
+
import type { Session, SessionIndex, ConversationTurn } from '../types';
|
|
5
|
+
export declare class SessionManager {
|
|
6
|
+
private embeddingService;
|
|
7
|
+
private vectorStore;
|
|
8
|
+
private initialized;
|
|
9
|
+
constructor();
|
|
10
|
+
initialize(): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Index the current Claude Code session with full conversation history
|
|
13
|
+
*/
|
|
14
|
+
indexCurrentSession(options?: {
|
|
15
|
+
summary?: string;
|
|
16
|
+
tags?: string[];
|
|
17
|
+
/**
|
|
18
|
+
* Complete conversation history including both user messages and assistant responses
|
|
19
|
+
*/
|
|
20
|
+
conversationHistory?: ConversationTurn[];
|
|
21
|
+
}): Promise<Session>;
|
|
22
|
+
/**
|
|
23
|
+
* Fork to a historical session
|
|
24
|
+
*/
|
|
25
|
+
forkToSession(sessionId: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* List all indexed sessions
|
|
28
|
+
*/
|
|
29
|
+
listSessions(projectPath?: string): Promise<SessionIndex[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Export session to a file
|
|
32
|
+
*/
|
|
33
|
+
exportSession(sessionId: string, outputPath?: string): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Import session from a file
|
|
36
|
+
*/
|
|
37
|
+
importSession(filePath: string): Promise<Session>;
|
|
38
|
+
/**
|
|
39
|
+
* Extract conversation history from various sources
|
|
40
|
+
*/
|
|
41
|
+
private extractConversationHistory;
|
|
42
|
+
/**
|
|
43
|
+
* Convert conversation turns to legacy message format
|
|
44
|
+
*/
|
|
45
|
+
private conversationToMessages;
|
|
46
|
+
/**
|
|
47
|
+
* Convert legacy messages to conversation turns
|
|
48
|
+
*/
|
|
49
|
+
private messagesToConversation;
|
|
50
|
+
/**
|
|
51
|
+
* Convert conversation to text for embedding
|
|
52
|
+
*/
|
|
53
|
+
private conversationToText;
|
|
54
|
+
/**
|
|
55
|
+
* Generate summary from conversation
|
|
56
|
+
*/
|
|
57
|
+
private generateSummaryFromConversation;
|
|
58
|
+
/**
|
|
59
|
+
* Extract key topics from conversation
|
|
60
|
+
*/
|
|
61
|
+
private extractKeyTopicsFromConversation;
|
|
62
|
+
/**
|
|
63
|
+
* Sanitize path for use in file names
|
|
64
|
+
*/
|
|
65
|
+
private sanitizePath;
|
|
66
|
+
private extractMessages;
|
|
67
|
+
private generateSummary;
|
|
68
|
+
private extractKeyTopics;
|
|
69
|
+
private sessionToText;
|
|
70
|
+
private saveSession;
|
|
71
|
+
private loadSession;
|
|
72
|
+
private saveForkContext;
|
|
73
|
+
private getCurrentSessionId;
|
|
74
|
+
private getOpenFiles;
|
|
75
|
+
private extractFilesFromSession;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAkB,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAMxF,qBAAa,cAAc;IACzB,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAS;;IAOtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;OAEG;IACG,mBAAmB,CAAC,OAAO,GAAE;QACjC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB;;WAEG;QACH,mBAAmB,CAAC,EAAE,gBAAgB,EAAE,CAAC;KACrC,GAAG,OAAO,CAAC,OAAO,CAAC;IA0DzB;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2FrD;;OAEG;IACG,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAYjE;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAe5E;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvD;;OAEG;YACW,0BAA0B;IAmDxC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA4B9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAmC9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;YACW,+BAA+B;IAc7C;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAsBxC;;OAEG;IACH,OAAO,CAAC,YAAY;YAMN,eAAe;YAwCf,eAAe;IAc7B,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,aAAa;YAYP,WAAW;YAMX,WAAW;YAYX,eAAe;IAQ7B,OAAO,CAAC,mBAAmB;YAIb,YAAY;IAwB1B,OAAO,CAAC,uBAAuB;CAkBhC"}
|