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,351 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CLI Tool for Smart Forking
|
|
4
|
+
* Provides /fork-detect command and other utilities
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.program = void 0;
|
|
44
|
+
const commander_1 = require("commander");
|
|
45
|
+
const fork_detector_1 = require("../core/fork-detector");
|
|
46
|
+
const session_manager_1 = require("../core/session-manager");
|
|
47
|
+
const config_1 = require("../core/config");
|
|
48
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
49
|
+
const readline = __importStar(require("readline"));
|
|
50
|
+
const program = new commander_1.Command();
|
|
51
|
+
exports.program = program;
|
|
52
|
+
program
|
|
53
|
+
.name('smart-fork')
|
|
54
|
+
.description('Smart session forking for Claude Code')
|
|
55
|
+
.version('1.0.0');
|
|
56
|
+
// /fork-detect command
|
|
57
|
+
program
|
|
58
|
+
.command('detect')
|
|
59
|
+
.alias('fork-detect')
|
|
60
|
+
.description('Detect and suggest relevant historical sessions')
|
|
61
|
+
.option('-q, --query <text>', 'Search query (defaults to current context)')
|
|
62
|
+
.option('-p, --project <path>', 'Limit search to specific project')
|
|
63
|
+
.option('-a, --all', 'Search across all projects', false)
|
|
64
|
+
.option('-n, --limit <number>', 'Number of results', '5')
|
|
65
|
+
.option('--threshold <number>', 'Minimum similarity score', '0.6')
|
|
66
|
+
.action(async (options) => {
|
|
67
|
+
try {
|
|
68
|
+
await config_1.configManager.load();
|
|
69
|
+
const detector = new fork_detector_1.ForkDetector();
|
|
70
|
+
const sessionManager = new session_manager_1.SessionManager();
|
|
71
|
+
// Get current query from context or use provided query
|
|
72
|
+
const query = options.query || await detector.extractCurrentContext();
|
|
73
|
+
console.log(chalk_1.default.blue('\n🔍 Analyzing current context...\n'));
|
|
74
|
+
console.log(chalk_1.default.gray(`Query: ${query.substring(0, 100)}...`));
|
|
75
|
+
// Search for relevant sessions
|
|
76
|
+
const results = await detector.findRelevantSessions({
|
|
77
|
+
text: query,
|
|
78
|
+
projectPath: options.all ? undefined : options.project,
|
|
79
|
+
limit: parseInt(options.limit),
|
|
80
|
+
threshold: parseFloat(options.threshold)
|
|
81
|
+
});
|
|
82
|
+
if (results.length === 0) {
|
|
83
|
+
console.log(chalk_1.default.yellow('\n❌ No relevant sessions found.\n'));
|
|
84
|
+
console.log(chalk_1.default.gray('Tip: Try using --all to search across all projects, or lower the --threshold.'));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// Display results
|
|
88
|
+
console.log(chalk_1.default.green(`\n✓ Found ${results.length} relevant session(s):\n`));
|
|
89
|
+
results.forEach((result, index) => {
|
|
90
|
+
const session = result.session;
|
|
91
|
+
const score = Math.round(result.score * 100);
|
|
92
|
+
console.log(chalk_1.default.cyan(`${index + 1}. ${session.projectName}`));
|
|
93
|
+
console.log(chalk_1.default.gray(` Path: ${session.projectPath}`));
|
|
94
|
+
console.log(chalk_1.default.gray(` Relevance: ${score}%`));
|
|
95
|
+
console.log(chalk_1.default.gray(` Summary: ${session.summary.substring(0, 80)}...`));
|
|
96
|
+
console.log(chalk_1.default.gray(` Last updated: ${new Date(session.updatedAt).toLocaleString()}`));
|
|
97
|
+
console.log();
|
|
98
|
+
});
|
|
99
|
+
// Interactive selection
|
|
100
|
+
const selected = await promptSelection(results.length);
|
|
101
|
+
if (selected > 0) {
|
|
102
|
+
const targetSession = results[selected - 1].session;
|
|
103
|
+
console.log(chalk_1.default.blue(`\n🔄 Forking to session: ${targetSession.projectName}\n`));
|
|
104
|
+
// Perform the fork
|
|
105
|
+
await sessionManager.forkToSession(targetSession.id);
|
|
106
|
+
console.log(chalk_1.default.green('\n✓ Successfully forked to session!\n'));
|
|
107
|
+
console.log(chalk_1.default.gray(`Session ID: ${targetSession.id}`));
|
|
108
|
+
console.log(chalk_1.default.gray(`Project: ${targetSession.projectPath}`));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error(chalk_1.default.red('\nError:'), error instanceof Error ? error.message : error);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
// Index current session
|
|
117
|
+
program
|
|
118
|
+
.command('index')
|
|
119
|
+
.description('Index current session for searching (reads conversation history from stdin if provided)')
|
|
120
|
+
.option('-s, --summary <text>', 'Session summary')
|
|
121
|
+
.option('-t, --tags <tags>', 'Comma-separated tags')
|
|
122
|
+
.option('--conversation <file>', 'Path to conversation history JSON file')
|
|
123
|
+
.action(async (options) => {
|
|
124
|
+
try {
|
|
125
|
+
await config_1.configManager.load();
|
|
126
|
+
const sessionManager = new session_manager_1.SessionManager();
|
|
127
|
+
console.log(chalk_1.default.blue('\n📦 Indexing current session...\n'));
|
|
128
|
+
// Read conversation history from file if provided, or stdin
|
|
129
|
+
let conversationHistory;
|
|
130
|
+
if (options.conversation) {
|
|
131
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
132
|
+
const content = await fs.readFile(options.conversation, 'utf-8');
|
|
133
|
+
conversationHistory = JSON.parse(content);
|
|
134
|
+
}
|
|
135
|
+
else if (!process.stdin.isTTY) {
|
|
136
|
+
// Read from stdin
|
|
137
|
+
const chunks = [];
|
|
138
|
+
for await (const chunk of process.stdin) {
|
|
139
|
+
chunks.push(chunk);
|
|
140
|
+
}
|
|
141
|
+
const stdinContent = Buffer.concat(chunks).toString('utf-8').trim();
|
|
142
|
+
if (stdinContent) {
|
|
143
|
+
try {
|
|
144
|
+
conversationHistory = JSON.parse(stdinContent);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Not valid JSON, ignore
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const session = await sessionManager.indexCurrentSession({
|
|
152
|
+
summary: options.summary,
|
|
153
|
+
tags: options.tags?.split(',').map((t) => t.trim()) || [],
|
|
154
|
+
conversationHistory
|
|
155
|
+
});
|
|
156
|
+
console.log(chalk_1.default.green('\n✓ Session indexed successfully!\n'));
|
|
157
|
+
console.log(chalk_1.default.gray(`Session ID: ${session.id}`));
|
|
158
|
+
console.log(chalk_1.default.gray(`Conversation turns: ${session.conversationHistory?.length || Math.ceil(session.messages.length / 2)}`));
|
|
159
|
+
if (session.conversationHistory) {
|
|
160
|
+
console.log(chalk_1.default.gray(`Total messages: ${session.messages.length}`));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
console.error(chalk_1.default.red('\nError:'), error instanceof Error ? error.message : error);
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
// List indexed sessions
|
|
169
|
+
program
|
|
170
|
+
.command('list')
|
|
171
|
+
.description('List all indexed sessions')
|
|
172
|
+
.option('-p, --project <path>', 'Filter by project path')
|
|
173
|
+
.option('--json', 'Output as JSON')
|
|
174
|
+
.action(async (options) => {
|
|
175
|
+
try {
|
|
176
|
+
await config_1.configManager.load();
|
|
177
|
+
const sessionManager = new session_manager_1.SessionManager();
|
|
178
|
+
const sessions = await sessionManager.listSessions(options.project);
|
|
179
|
+
if (options.json) {
|
|
180
|
+
console.log(JSON.stringify(sessions, null, 2));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (sessions.length === 0) {
|
|
184
|
+
console.log(chalk_1.default.yellow('\nNo indexed sessions found.\n'));
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
console.log(chalk_1.default.blue(`\n📋 ${sessions.length} Indexed Session(s):\n`));
|
|
188
|
+
// Group by project
|
|
189
|
+
const byProject = sessions.reduce((acc, s) => {
|
|
190
|
+
acc[s.projectPath] = acc[s.projectPath] || [];
|
|
191
|
+
acc[s.projectPath].push(s);
|
|
192
|
+
return acc;
|
|
193
|
+
}, {});
|
|
194
|
+
Object.entries(byProject).forEach(([projectPath, projectSessions]) => {
|
|
195
|
+
console.log(chalk_1.default.cyan(`\n${projectPath}:`));
|
|
196
|
+
projectSessions.forEach(session => {
|
|
197
|
+
console.log(chalk_1.default.gray(` • ${session.summary.substring(0, 60)}...`));
|
|
198
|
+
console.log(chalk_1.default.gray(` ID: ${session.id} | ${new Date(session.updatedAt).toLocaleDateString()}`));
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
console.log();
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
console.error(chalk_1.default.red('\nError:'), error instanceof Error ? error.message : error);
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
// Export session
|
|
209
|
+
program
|
|
210
|
+
.command('export')
|
|
211
|
+
.description('Export session to file')
|
|
212
|
+
.argument('<session-id>', 'Session ID to export')
|
|
213
|
+
.option('-o, --output <path>', 'Output file path')
|
|
214
|
+
.action(async (sessionId, options) => {
|
|
215
|
+
try {
|
|
216
|
+
await config_1.configManager.load();
|
|
217
|
+
const sessionManager = new session_manager_1.SessionManager();
|
|
218
|
+
const outputPath = await sessionManager.exportSession(sessionId, options.output);
|
|
219
|
+
console.log(chalk_1.default.green('\n✓ Session exported to:'), outputPath);
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
console.error(chalk_1.default.red('\nError:'), error instanceof Error ? error.message : error);
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
// Config command
|
|
227
|
+
program
|
|
228
|
+
.command('config')
|
|
229
|
+
.description('Manage configuration')
|
|
230
|
+
.option('--set-embedding <provider>', 'Set embedding provider (openai/local/ollama)')
|
|
231
|
+
.option('--set-model <model>', 'Set embedding model')
|
|
232
|
+
.option('--show', 'Show current configuration')
|
|
233
|
+
.action(async (options) => {
|
|
234
|
+
await config_1.configManager.load();
|
|
235
|
+
if (options.show) {
|
|
236
|
+
console.log(chalk_1.default.blue('\n⚙️ Current Configuration:\n'));
|
|
237
|
+
console.log(JSON.stringify(config_1.configManager.get(), null, 2));
|
|
238
|
+
console.log();
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (options.setEmbedding) {
|
|
242
|
+
const currentConfig = config_1.configManager.get();
|
|
243
|
+
config_1.configManager.update({
|
|
244
|
+
embedding: { ...currentConfig.embedding, provider: options.setEmbedding }
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
if (options.setModel) {
|
|
248
|
+
const currentConfig = config_1.configManager.get();
|
|
249
|
+
config_1.configManager.update({
|
|
250
|
+
embedding: { ...currentConfig.embedding, model: options.setModel }
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
await config_1.configManager.save();
|
|
254
|
+
console.log(chalk_1.default.green('\n✓ Configuration updated\n'));
|
|
255
|
+
});
|
|
256
|
+
// Fork to specific session
|
|
257
|
+
program
|
|
258
|
+
.command('fork-to <session-id>')
|
|
259
|
+
.description('Fork to a specific historical session')
|
|
260
|
+
.action(async (sessionId) => {
|
|
261
|
+
try {
|
|
262
|
+
await config_1.configManager.load();
|
|
263
|
+
const sessionManager = new session_manager_1.SessionManager();
|
|
264
|
+
console.log(chalk_1.default.blue(`\n🔄 Forking to session: ${sessionId}\n`));
|
|
265
|
+
await sessionManager.forkToSession(sessionId);
|
|
266
|
+
console.log(chalk_1.default.green('\n✓ Successfully forked!\n'));
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
console.error(chalk_1.default.red('\nError:'), error instanceof Error ? error.message : error);
|
|
270
|
+
process.exit(1);
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
// Status command
|
|
274
|
+
program
|
|
275
|
+
.command('status')
|
|
276
|
+
.description('Show current fork status and suggestions')
|
|
277
|
+
.action(async () => {
|
|
278
|
+
try {
|
|
279
|
+
await config_1.configManager.load();
|
|
280
|
+
const detector = new fork_detector_1.ForkDetector();
|
|
281
|
+
const sessionManager = new session_manager_1.SessionManager();
|
|
282
|
+
// Show current session info
|
|
283
|
+
const currentSessionId = process.env.SMART_FORK_SESSION_ID;
|
|
284
|
+
console.log(chalk_1.default.blue('\n🔀 Fork Status\n'));
|
|
285
|
+
if (currentSessionId) {
|
|
286
|
+
console.log(chalk_1.default.gray(`Current Session: ${currentSessionId}`));
|
|
287
|
+
console.log(chalk_1.default.gray(`Original Directory: ${process.env.SMART_FORK_ORIGINAL_CWD || 'N/A'}`));
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
console.log(chalk_1.default.gray('Not currently forked'));
|
|
291
|
+
}
|
|
292
|
+
console.log(chalk_1.default.gray(`Working Directory: ${process.cwd()}`));
|
|
293
|
+
// Show suggestions
|
|
294
|
+
console.log(chalk_1.default.blue('\n💡 Suggested Sessions:\n'));
|
|
295
|
+
const suggestions = await detector.suggestRelevantSessions();
|
|
296
|
+
if (suggestions.length === 0) {
|
|
297
|
+
console.log(chalk_1.default.yellow('No relevant sessions found.'));
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
suggestions.slice(0, 3).forEach((result, index) => {
|
|
301
|
+
const session = result.session;
|
|
302
|
+
const score = Math.round(result.score * 100);
|
|
303
|
+
console.log(chalk_1.default.cyan(`${index + 1}. ${session.projectName} (${score}% match)`));
|
|
304
|
+
console.log(chalk_1.default.gray(` ${session.summary.substring(0, 70)}...`));
|
|
305
|
+
console.log();
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
// Show recent sessions
|
|
309
|
+
console.log(chalk_1.default.blue('📁 Recent Sessions in This Project:\n'));
|
|
310
|
+
const recentSessions = await sessionManager.listSessions(process.cwd());
|
|
311
|
+
const sorted = recentSessions
|
|
312
|
+
.sort((a, b) => b.updatedAt - a.updatedAt)
|
|
313
|
+
.slice(0, 5);
|
|
314
|
+
if (sorted.length === 0) {
|
|
315
|
+
console.log(chalk_1.default.yellow('No sessions indexed for this project yet.'));
|
|
316
|
+
console.log(chalk_1.default.gray('Run: smart-fork index'));
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
sorted.forEach(session => {
|
|
320
|
+
console.log(chalk_1.default.gray(`• ${session.summary.substring(0, 60)}...`));
|
|
321
|
+
console.log(chalk_1.default.gray(` ${new Date(session.updatedAt).toLocaleDateString()}`));
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
console.log();
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
console.error(chalk_1.default.red('\nError:'), error instanceof Error ? error.message : error);
|
|
328
|
+
process.exit(1);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
// Helper function for interactive selection
|
|
332
|
+
async function promptSelection(max) {
|
|
333
|
+
const rl = readline.createInterface({
|
|
334
|
+
input: process.stdin,
|
|
335
|
+
output: process.stdout
|
|
336
|
+
});
|
|
337
|
+
return new Promise((resolve) => {
|
|
338
|
+
rl.question(chalk_1.default.yellow(`\nSelect a session to fork (1-${max}, or 0 to cancel): `), (answer) => {
|
|
339
|
+
rl.close();
|
|
340
|
+
const selected = parseInt(answer.trim());
|
|
341
|
+
if (isNaN(selected) || selected < 0 || selected > max) {
|
|
342
|
+
console.log(chalk_1.default.red('Invalid selection'));
|
|
343
|
+
resolve(0);
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
resolve(selected);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/embedding.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const embedding_1 = require("../embedding");
|
|
4
|
+
describe('EmbeddingService', () => {
|
|
5
|
+
let service;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
service = new embedding_1.EmbeddingService();
|
|
8
|
+
});
|
|
9
|
+
describe('initialize', () => {
|
|
10
|
+
it('should initialize with local provider', async () => {
|
|
11
|
+
await service.initialize({
|
|
12
|
+
provider: 'local',
|
|
13
|
+
model: 'all-MiniLM-L6-v2',
|
|
14
|
+
dimension: 384,
|
|
15
|
+
});
|
|
16
|
+
// Should not throw
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe('embed', () => {
|
|
20
|
+
beforeEach(async () => {
|
|
21
|
+
await service.initialize({
|
|
22
|
+
provider: 'local',
|
|
23
|
+
model: 'all-MiniLM-L6-v2',
|
|
24
|
+
dimension: 384,
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
it('should generate embedding for text', async () => {
|
|
28
|
+
const text = 'This is a test sentence';
|
|
29
|
+
const embedding = await service.embed(text);
|
|
30
|
+
expect(embedding).toBeDefined();
|
|
31
|
+
expect(Array.isArray(embedding)).toBe(true);
|
|
32
|
+
expect(embedding.length).toBe(384);
|
|
33
|
+
});
|
|
34
|
+
it('should generate different embeddings for different texts', async () => {
|
|
35
|
+
const text1 = 'Machine learning';
|
|
36
|
+
const text2 = 'Cooking recipes';
|
|
37
|
+
const embedding1 = await service.embed(text1);
|
|
38
|
+
const embedding2 = await service.embed(text2);
|
|
39
|
+
// Embeddings should be different
|
|
40
|
+
const similarity = cosineSimilarity(embedding1, embedding2);
|
|
41
|
+
expect(similarity).toBeLessThan(0.9);
|
|
42
|
+
});
|
|
43
|
+
it('should generate similar embeddings for similar texts', async () => {
|
|
44
|
+
// Using texts with significant keyword overlap for local embedding
|
|
45
|
+
const text1 = 'implement authentication login user';
|
|
46
|
+
const text2 = 'authentication login user implement';
|
|
47
|
+
const embedding1 = await service.embed(text1);
|
|
48
|
+
const embedding2 = await service.embed(text2);
|
|
49
|
+
const similarity = cosineSimilarity(embedding1, embedding2);
|
|
50
|
+
// Local keyword-based embedding should have high similarity for same words
|
|
51
|
+
expect(similarity).toBeGreaterThan(0.5);
|
|
52
|
+
});
|
|
53
|
+
it('should truncate long text', async () => {
|
|
54
|
+
const longText = 'a '.repeat(10000);
|
|
55
|
+
const embedding = await service.embed(longText);
|
|
56
|
+
expect(embedding).toBeDefined();
|
|
57
|
+
expect(embedding.length).toBe(384);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('embedBatch', () => {
|
|
61
|
+
beforeEach(async () => {
|
|
62
|
+
await service.initialize({
|
|
63
|
+
provider: 'local',
|
|
64
|
+
model: 'all-MiniLM-L6-v2',
|
|
65
|
+
dimension: 384,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
it('should generate embeddings for multiple texts', async () => {
|
|
69
|
+
const texts = ['First text', 'Second text', 'Third text'];
|
|
70
|
+
const embeddings = await service.embedBatch(texts);
|
|
71
|
+
expect(embeddings).toHaveLength(3);
|
|
72
|
+
embeddings.forEach(embedding => {
|
|
73
|
+
expect(embedding.length).toBe(384);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
// Helper function
|
|
79
|
+
function cosineSimilarity(a, b) {
|
|
80
|
+
let dotProduct = 0;
|
|
81
|
+
let normA = 0;
|
|
82
|
+
let normB = 0;
|
|
83
|
+
for (let i = 0; i < a.length; i++) {
|
|
84
|
+
dotProduct += a[i] * b[i];
|
|
85
|
+
normA += a[i] * a[i];
|
|
86
|
+
normB += b[i] * b[i];
|
|
87
|
+
}
|
|
88
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=embedding.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/embedding.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Manager
|
|
3
|
+
* Handles all configuration settings for the Smart Forking system
|
|
4
|
+
*/
|
|
5
|
+
import type { Config } from '../types';
|
|
6
|
+
export declare class ConfigManager {
|
|
7
|
+
private config;
|
|
8
|
+
private configPath;
|
|
9
|
+
constructor();
|
|
10
|
+
load(): Promise<Config>;
|
|
11
|
+
save(): Promise<void>;
|
|
12
|
+
get(): Config;
|
|
13
|
+
update(partial: Partial<Config>): void;
|
|
14
|
+
private mergeConfig;
|
|
15
|
+
getSessionsDir(): string;
|
|
16
|
+
getIndexPath(): string;
|
|
17
|
+
}
|
|
18
|
+
export declare const configManager: ConfigManager;
|
|
19
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAmBvC,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;;IAOrB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAYvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,GAAG,IAAI,MAAM;IAIb,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI;IAItC,OAAO,CAAC,WAAW;IAQnB,cAAc,IAAI,MAAM;IAIxB,YAAY,IAAI,MAAM;CAGvB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration Manager
|
|
4
|
+
* Handles all configuration settings for the Smart Forking system
|
|
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.configManager = exports.ConfigManager = void 0;
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const fs = __importStar(require("fs/promises"));
|
|
44
|
+
const DEFAULT_CONFIG = {
|
|
45
|
+
vectorStore: {
|
|
46
|
+
provider: 'local',
|
|
47
|
+
dimension: 1536,
|
|
48
|
+
collectionName: 'smart-fork-sessions'
|
|
49
|
+
},
|
|
50
|
+
embedding: {
|
|
51
|
+
provider: 'local',
|
|
52
|
+
model: 'all-MiniLM-L6-v2',
|
|
53
|
+
dimension: 384 // all-MiniLM-L6-v2 produces 384-dimensional embeddings
|
|
54
|
+
},
|
|
55
|
+
storage: {
|
|
56
|
+
sessionsDir: path.join(os.homedir(), '.smart-fork', 'sessions'),
|
|
57
|
+
indexPath: path.join(os.homedir(), '.smart-fork', 'index.json')
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
class ConfigManager {
|
|
61
|
+
config;
|
|
62
|
+
configPath;
|
|
63
|
+
constructor() {
|
|
64
|
+
this.configPath = path.join(os.homedir(), '.smart-fork', 'config.json');
|
|
65
|
+
this.config = DEFAULT_CONFIG;
|
|
66
|
+
}
|
|
67
|
+
async load() {
|
|
68
|
+
try {
|
|
69
|
+
const content = await fs.readFile(this.configPath, 'utf-8');
|
|
70
|
+
const userConfig = JSON.parse(content);
|
|
71
|
+
this.config = this.mergeConfig(DEFAULT_CONFIG, userConfig);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Config doesn't exist, use defaults
|
|
75
|
+
await this.save();
|
|
76
|
+
}
|
|
77
|
+
return this.config;
|
|
78
|
+
}
|
|
79
|
+
async save() {
|
|
80
|
+
await fs.mkdir(path.dirname(this.configPath), { recursive: true });
|
|
81
|
+
await fs.writeFile(this.configPath, JSON.stringify(this.config, null, 2));
|
|
82
|
+
}
|
|
83
|
+
get() {
|
|
84
|
+
return this.config;
|
|
85
|
+
}
|
|
86
|
+
update(partial) {
|
|
87
|
+
this.config = this.mergeConfig(this.config, partial);
|
|
88
|
+
}
|
|
89
|
+
mergeConfig(base, override) {
|
|
90
|
+
return {
|
|
91
|
+
vectorStore: { ...base.vectorStore, ...override.vectorStore },
|
|
92
|
+
embedding: { ...base.embedding, ...override.embedding },
|
|
93
|
+
storage: { ...base.storage, ...override.storage }
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
getSessionsDir() {
|
|
97
|
+
return this.config.storage.sessionsDir;
|
|
98
|
+
}
|
|
99
|
+
getIndexPath() {
|
|
100
|
+
return this.config.storage.indexPath;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.ConfigManager = ConfigManager;
|
|
104
|
+
exports.configManager = new ConfigManager();
|
|
105
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,2CAA6B;AAC7B,uCAAyB;AACzB,gDAAkC;AAGlC,MAAM,cAAc,GAAW;IAC7B,WAAW,EAAE;QACX,QAAQ,EAAE,OAAO;QACjB,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,qBAAqB;KACtC;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,kBAAkB;QACzB,SAAS,EAAE,GAAG,CAAE,uDAAuD;KACxE;IACD,OAAO,EAAE;QACP,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC;QAC/D,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,YAAY,CAAC;KAChE;CACF,CAAC;AAEF,MAAa,aAAa;IAChB,MAAM,CAAS;IACf,UAAU,CAAS;IAE3B;QACE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;YACrC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,OAAwB;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAEO,WAAW,CAAC,IAAY,EAAE,QAAyB;QACzD,OAAO;YACL,WAAW,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE;YAC7D,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE;YACvD,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE;SAClD,CAAC;IACJ,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;IACvC,CAAC;CACF;AAjDD,sCAiDC;AAEY,QAAA,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Service - Generates vector embeddings for text
|
|
3
|
+
* Supports multiple providers: OpenAI, Ollama, and simple keyword-based fallback
|
|
4
|
+
*/
|
|
5
|
+
import type { Config } from '../types';
|
|
6
|
+
export declare class EmbeddingService {
|
|
7
|
+
private config;
|
|
8
|
+
private initialized;
|
|
9
|
+
initialize(config: Config['embedding']): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Generate embedding for text
|
|
12
|
+
*/
|
|
13
|
+
embed(text: string): Promise<number[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Generate embeddings for multiple texts (batch processing)
|
|
16
|
+
*/
|
|
17
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
18
|
+
private embedOpenAI;
|
|
19
|
+
private embedOllama;
|
|
20
|
+
private embedLocal;
|
|
21
|
+
/**
|
|
22
|
+
* Simple keyword-based embedding
|
|
23
|
+
* Used when no embedding service is available
|
|
24
|
+
* Creates a bag-of-words style vector
|
|
25
|
+
*/
|
|
26
|
+
private keywordEmbedding;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=embedding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/core/embedding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAS;IAEtB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5D;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiB5C;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAIxC,WAAW;YA0BX,WAAW;YAsBX,UAAU;IAKxB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;CAuDzB"}
|