claude-conversation-memory-mcp 0.5.0 → 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/README.md +16 -0
- package/dist/ConversationMemory.d.ts +151 -10
- package/dist/ConversationMemory.d.ts.map +1 -1
- package/dist/ConversationMemory.js +127 -10
- package/dist/ConversationMemory.js.map +1 -1
- package/dist/cache/QueryCache.d.ts +215 -0
- package/dist/cache/QueryCache.d.ts.map +1 -0
- package/dist/cache/QueryCache.js +294 -0
- package/dist/cache/QueryCache.js.map +1 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +3 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/parsers/ConversationParser.d.ts +62 -3
- package/dist/parsers/ConversationParser.d.ts.map +1 -1
- package/dist/parsers/ConversationParser.js +50 -3
- package/dist/parsers/ConversationParser.js.map +1 -1
- package/dist/parsers/DecisionExtractor.d.ts +61 -3
- package/dist/parsers/DecisionExtractor.d.ts.map +1 -1
- package/dist/parsers/DecisionExtractor.js +47 -3
- package/dist/parsers/DecisionExtractor.js.map +1 -1
- package/dist/parsers/GitIntegrator.d.ts +88 -3
- package/dist/parsers/GitIntegrator.d.ts.map +1 -1
- package/dist/parsers/GitIntegrator.js +68 -3
- package/dist/parsers/GitIntegrator.js.map +1 -1
- package/dist/parsers/MistakeExtractor.d.ts +62 -3
- package/dist/parsers/MistakeExtractor.d.ts.map +1 -1
- package/dist/parsers/MistakeExtractor.js +50 -3
- package/dist/parsers/MistakeExtractor.js.map +1 -1
- package/dist/parsers/RequirementsExtractor.d.ts +95 -4
- package/dist/parsers/RequirementsExtractor.d.ts.map +1 -1
- package/dist/parsers/RequirementsExtractor.js +73 -4
- package/dist/parsers/RequirementsExtractor.js.map +1 -1
- package/dist/storage/ConversationStorage.d.ts +271 -2
- package/dist/storage/ConversationStorage.d.ts.map +1 -1
- package/dist/storage/ConversationStorage.js +356 -7
- package/dist/storage/ConversationStorage.js.map +1 -1
- package/dist/tools/ToolDefinitions.d.ts +39 -0
- package/dist/tools/ToolDefinitions.d.ts.map +1 -1
- package/dist/tools/ToolDefinitions.js +37 -0
- package/dist/tools/ToolDefinitions.js.map +1 -1
- package/dist/tools/ToolHandlers.d.ts +528 -14
- package/dist/tools/ToolHandlers.d.ts.map +1 -1
- package/dist/tools/ToolHandlers.js +691 -14
- package/dist/tools/ToolHandlers.js.map +1 -1
- package/dist/types/ToolTypes.d.ts +54 -0
- package/dist/types/ToolTypes.d.ts.map +1 -1
- package/dist/utils/Logger.d.ts +67 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +119 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/constants.d.ts +75 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +105 -0
- package/dist/utils/constants.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@ A Model Context Protocol (MCP) server that gives Claude Code long-term memory by
|
|
|
10
10
|
- **Links to git commits** - Connect conversations to code changes
|
|
11
11
|
- **Analyzes file history** - See the complete evolution of files with context
|
|
12
12
|
- **Migrates conversation history** - Keep your history when renaming or moving projects
|
|
13
|
+
- **Context transfer** - Recall past work and apply it to current tasks ("remember X, now do Y based on that")
|
|
13
14
|
|
|
14
15
|
## ⚠️ Important: Claude Code CLI Only
|
|
15
16
|
|
|
@@ -294,6 +295,21 @@ Claude: Let me trace the file evolution...
|
|
|
294
295
|
[Shows complete timeline with conversations, commits, and decisions]
|
|
295
296
|
```
|
|
296
297
|
|
|
298
|
+
### Recall and Apply Context
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
You: "Recall how we implemented authentication, now add OAuth support using that same pattern"
|
|
302
|
+
|
|
303
|
+
Claude: Let me recall the authentication implementation context...
|
|
304
|
+
[Returns relevant conversations, decisions, mistakes, file changes, and commits]
|
|
305
|
+
[Provides suggestions for applying this context to OAuth implementation]
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
**More examples:**
|
|
309
|
+
- "Remember the bug we fixed in parser.ts, check if similar issue exists in lexer.ts"
|
|
310
|
+
- "Recall all decisions about database schema, now design the migration strategy"
|
|
311
|
+
- "Find mistakes we made with async/await, avoid them in this new async function"
|
|
312
|
+
|
|
297
313
|
## 🔧 Advanced Usage
|
|
298
314
|
|
|
299
315
|
### Index Specific Session
|
|
@@ -1,16 +1,64 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Main Orchestrator - Coordinates all components
|
|
2
|
+
* Main Orchestrator - Coordinates all components for conversation memory indexing and retrieval.
|
|
3
|
+
*
|
|
4
|
+
* ConversationMemory is the primary interface for the conversation-memory-mcp system.
|
|
5
|
+
* It orchestrates parsing, storage, extraction, and search of Claude Code conversation history.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const memory = new ConversationMemory();
|
|
10
|
+
* await memory.indexConversations({
|
|
11
|
+
* projectPath: '/path/to/project',
|
|
12
|
+
* enableGitIntegration: true
|
|
13
|
+
* });
|
|
14
|
+
* ```
|
|
3
15
|
*/
|
|
4
16
|
import { ConversationStorage } from "./storage/ConversationStorage.js";
|
|
5
17
|
import { SemanticSearch } from "./search/SemanticSearch.js";
|
|
18
|
+
/**
|
|
19
|
+
* Configuration options for indexing conversations.
|
|
20
|
+
*/
|
|
6
21
|
export interface IndexOptions {
|
|
22
|
+
/** Absolute path to the project directory to index */
|
|
7
23
|
projectPath: string;
|
|
24
|
+
/** Optional: Index only a specific session ID instead of all sessions */
|
|
8
25
|
sessionId?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Whether to include thinking blocks in the index.
|
|
28
|
+
* Thinking blocks can be large and are excluded by default.
|
|
29
|
+
* @default false
|
|
30
|
+
*/
|
|
9
31
|
includeThinking?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Enable git integration to link commits to conversations.
|
|
34
|
+
* Requires the project to be a git repository.
|
|
35
|
+
* @default true
|
|
36
|
+
*/
|
|
10
37
|
enableGitIntegration?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Exclude MCP tool conversations from indexing.
|
|
40
|
+
* - `false`: Index all conversations (default)
|
|
41
|
+
* - `'self-only'`: Exclude only conversation-memory MCP conversations (prevents self-referential loops)
|
|
42
|
+
* - `'all-mcp'` or `true`: Exclude all MCP tool conversations
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
11
45
|
excludeMcpConversations?: boolean | 'self-only' | 'all-mcp';
|
|
46
|
+
/**
|
|
47
|
+
* List of specific MCP server names to exclude.
|
|
48
|
+
* More granular than `excludeMcpConversations`.
|
|
49
|
+
* @example ['conversation-memory', 'code-graph-rag']
|
|
50
|
+
*/
|
|
12
51
|
excludeMcpServers?: string[];
|
|
13
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Main orchestrator for conversation memory operations.
|
|
55
|
+
*
|
|
56
|
+
* Coordinates parsing, storage, extraction, and search across:
|
|
57
|
+
* - Conversation parsing from JSONL files
|
|
58
|
+
* - Decision, mistake, and requirement extraction
|
|
59
|
+
* - Git commit integration
|
|
60
|
+
* - Semantic search with embeddings
|
|
61
|
+
*/
|
|
14
62
|
export declare class ConversationMemory {
|
|
15
63
|
private sqliteManager;
|
|
16
64
|
private storage;
|
|
@@ -21,7 +69,39 @@ export declare class ConversationMemory {
|
|
|
21
69
|
private semanticSearch;
|
|
22
70
|
constructor();
|
|
23
71
|
/**
|
|
24
|
-
* Index conversations for a project
|
|
72
|
+
* Index conversations for a project.
|
|
73
|
+
*
|
|
74
|
+
* This is the main entry point for processing conversation history.
|
|
75
|
+
* It performs the following operations:
|
|
76
|
+
* 1. Parse conversation JSONL files from the project
|
|
77
|
+
* 2. Store conversations, messages, and tool interactions
|
|
78
|
+
* 3. Extract decisions, mistakes, and requirements
|
|
79
|
+
* 4. Link git commits (if enabled)
|
|
80
|
+
* 5. Generate semantic embeddings for search
|
|
81
|
+
*
|
|
82
|
+
* @param options - Configuration options for indexing
|
|
83
|
+
* @returns Result object containing:
|
|
84
|
+
* - `embeddings_generated`: Whether embeddings were successfully generated
|
|
85
|
+
* - `embedding_error`: Error message if embedding generation failed
|
|
86
|
+
* - `indexed_folders`: List of folders that were indexed
|
|
87
|
+
* - `database_path`: Path to the SQLite database
|
|
88
|
+
*
|
|
89
|
+
* @throws {Error} If project path doesn't exist or conversation files can't be parsed
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* const result = await memory.indexConversations({
|
|
94
|
+
* projectPath: '/Users/me/my-project',
|
|
95
|
+
* enableGitIntegration: true,
|
|
96
|
+
* excludeMcpConversations: 'self-only'
|
|
97
|
+
* });
|
|
98
|
+
*
|
|
99
|
+
* if (result.embeddings_generated) {
|
|
100
|
+
* console.log('Indexed folders:', result.indexed_folders);
|
|
101
|
+
* } else {
|
|
102
|
+
* console.warn('Embeddings failed:', result.embedding_error);
|
|
103
|
+
* }
|
|
104
|
+
* ```
|
|
25
105
|
*/
|
|
26
106
|
indexConversations(options: IndexOptions): Promise<{
|
|
27
107
|
embeddings_generated: boolean;
|
|
@@ -30,15 +110,55 @@ export declare class ConversationMemory {
|
|
|
30
110
|
database_path?: string;
|
|
31
111
|
}>;
|
|
32
112
|
/**
|
|
33
|
-
* Search conversations
|
|
113
|
+
* Search conversations using natural language query.
|
|
114
|
+
*
|
|
115
|
+
* Uses semantic search with embeddings if available, otherwise falls back to full-text search.
|
|
116
|
+
*
|
|
117
|
+
* @param query - Natural language search query
|
|
118
|
+
* @param limit - Maximum number of results to return (default: 10)
|
|
119
|
+
* @returns Array of search results with messages, conversations, and similarity scores
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* const results = await memory.search('authentication bug fix', 5);
|
|
124
|
+
* results.forEach(r => {
|
|
125
|
+
* console.log(`${r.similarity}: ${r.snippet}`);
|
|
126
|
+
* });
|
|
127
|
+
* ```
|
|
34
128
|
*/
|
|
35
129
|
search(query: string, limit?: number): Promise<import("./search/SemanticSearch.js").SearchResult[]>;
|
|
36
130
|
/**
|
|
37
|
-
* Search decisions
|
|
131
|
+
* Search for decisions using natural language query.
|
|
132
|
+
*
|
|
133
|
+
* Searches through extracted decisions to find relevant architectural choices and technical decisions.
|
|
134
|
+
*
|
|
135
|
+
* @param query - Natural language search query
|
|
136
|
+
* @param limit - Maximum number of results to return (default: 10)
|
|
137
|
+
* @returns Array of decision search results with similarity scores
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* const decisions = await memory.searchDecisions('database choice', 3);
|
|
142
|
+
* decisions.forEach(d => {
|
|
143
|
+
* console.log(`Decision: ${d.decision.decision_text}`);
|
|
144
|
+
* console.log(`Rationale: ${d.decision.rationale}`);
|
|
145
|
+
* });
|
|
146
|
+
* ```
|
|
38
147
|
*/
|
|
39
148
|
searchDecisions(query: string, limit?: number): Promise<import("./search/SemanticSearch.js").DecisionSearchResult[]>;
|
|
40
149
|
/**
|
|
41
|
-
* Get
|
|
150
|
+
* Get the timeline of changes for a specific file.
|
|
151
|
+
*
|
|
152
|
+
* Returns all edits, commits, and related conversations for a file across its history.
|
|
153
|
+
*
|
|
154
|
+
* @param filePath - Path to the file (relative to project root)
|
|
155
|
+
* @returns Timeline of file changes with conversations and commits
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* const timeline = memory.getFileTimeline('src/index.ts');
|
|
160
|
+
* console.log(`${timeline.length} changes to this file`);
|
|
161
|
+
* ```
|
|
42
162
|
*/
|
|
43
163
|
getFileTimeline(filePath: string): {
|
|
44
164
|
file_path: string;
|
|
@@ -47,7 +167,16 @@ export declare class ConversationMemory {
|
|
|
47
167
|
decisions: import("./parsers/DecisionExtractor.js").Decision[];
|
|
48
168
|
};
|
|
49
169
|
/**
|
|
50
|
-
* Get statistics
|
|
170
|
+
* Get statistics about the indexed conversation data.
|
|
171
|
+
*
|
|
172
|
+
* @returns Object containing counts for conversations, messages, decisions, mistakes, and commits
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* const stats = memory.getStats();
|
|
177
|
+
* console.log(`Indexed ${stats.conversations.count} conversations`);
|
|
178
|
+
* console.log(`Extracted ${stats.decisions.count} decisions`);
|
|
179
|
+
* ```
|
|
51
180
|
*/
|
|
52
181
|
getStats(): {
|
|
53
182
|
conversations: {
|
|
@@ -67,16 +196,28 @@ export declare class ConversationMemory {
|
|
|
67
196
|
};
|
|
68
197
|
};
|
|
69
198
|
/**
|
|
70
|
-
* Get storage instance
|
|
199
|
+
* Get the underlying storage instance for direct database access.
|
|
200
|
+
*
|
|
201
|
+
* Use with caution - prefer using the high-level methods when possible.
|
|
202
|
+
*
|
|
203
|
+
* @returns ConversationStorage instance
|
|
204
|
+
* @internal
|
|
71
205
|
*/
|
|
72
206
|
getStorage(): ConversationStorage;
|
|
73
207
|
/**
|
|
74
|
-
* Get semantic search instance
|
|
208
|
+
* Get the semantic search instance for advanced search operations.
|
|
209
|
+
*
|
|
210
|
+
* @returns SemanticSearch instance
|
|
211
|
+
* @internal
|
|
75
212
|
*/
|
|
76
213
|
getSemanticSearch(): SemanticSearch;
|
|
77
214
|
/**
|
|
78
|
-
* Filter MCP conversations from parse results
|
|
79
|
-
*
|
|
215
|
+
* Filter MCP conversations from parse results.
|
|
216
|
+
*
|
|
217
|
+
* Implements the exclusion logic for MCP tool conversations to prevent
|
|
218
|
+
* self-referential loops and reduce noise in the index.
|
|
219
|
+
*
|
|
220
|
+
* Strategy: Filter at MESSAGE level, not conversation level.
|
|
80
221
|
* - Keep all conversations
|
|
81
222
|
* - Exclude only messages that invoke specified MCP tools and their responses
|
|
82
223
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationMemory.d.ts","sourceRoot":"","sources":["../src/ConversationMemory.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ConversationMemory.d.ts","sourceRoot":"","sources":["../src/ConversationMemory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAMvE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;;;;;OAMG;IACH,uBAAuB,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IAE5D;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,cAAc,CAAiB;;IAiBvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACG,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC;QACvD,oBAAoB,EAAE,OAAO,CAAC;QAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IA8GF;;;;;;;;;;;;;;;;OAgBG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW;IAI9C;;;;;;;;;;;;;;;;;OAiBG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW;IAIvD;;;;;;;;;;;;;OAaG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM;;;;;;IAIhC;;;;;;;;;;;OAWG;IACH,QAAQ;;;;;;;;;;;;;;;;;IAIR;;;;;;;OAOG;IACH,UAAU;IAIV;;;;;OAKG;IACH,iBAAiB;IAIjB;;;;;;;;;OASG;IACH,OAAO,CAAC,sBAAsB;CAqE/B"}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Main Orchestrator - Coordinates all components
|
|
2
|
+
* Main Orchestrator - Coordinates all components for conversation memory indexing and retrieval.
|
|
3
|
+
*
|
|
4
|
+
* ConversationMemory is the primary interface for the conversation-memory-mcp system.
|
|
5
|
+
* It orchestrates parsing, storage, extraction, and search of Claude Code conversation history.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const memory = new ConversationMemory();
|
|
10
|
+
* await memory.indexConversations({
|
|
11
|
+
* projectPath: '/path/to/project',
|
|
12
|
+
* enableGitIntegration: true
|
|
13
|
+
* });
|
|
14
|
+
* ```
|
|
3
15
|
*/
|
|
4
16
|
import { getSQLiteManager } from "./storage/SQLiteManager.js";
|
|
5
17
|
import { ConversationStorage } from "./storage/ConversationStorage.js";
|
|
@@ -9,6 +21,15 @@ import { MistakeExtractor } from "./parsers/MistakeExtractor.js";
|
|
|
9
21
|
import { GitIntegrator } from "./parsers/GitIntegrator.js";
|
|
10
22
|
import { RequirementsExtractor } from "./parsers/RequirementsExtractor.js";
|
|
11
23
|
import { SemanticSearch } from "./search/SemanticSearch.js";
|
|
24
|
+
/**
|
|
25
|
+
* Main orchestrator for conversation memory operations.
|
|
26
|
+
*
|
|
27
|
+
* Coordinates parsing, storage, extraction, and search across:
|
|
28
|
+
* - Conversation parsing from JSONL files
|
|
29
|
+
* - Decision, mistake, and requirement extraction
|
|
30
|
+
* - Git commit integration
|
|
31
|
+
* - Semantic search with embeddings
|
|
32
|
+
*/
|
|
12
33
|
export class ConversationMemory {
|
|
13
34
|
sqliteManager;
|
|
14
35
|
storage;
|
|
@@ -20,6 +41,9 @@ export class ConversationMemory {
|
|
|
20
41
|
constructor() {
|
|
21
42
|
this.sqliteManager = getSQLiteManager();
|
|
22
43
|
this.storage = new ConversationStorage(this.sqliteManager);
|
|
44
|
+
// Enable caching by default for better performance
|
|
45
|
+
// Cache up to 100 query results for 5 minutes
|
|
46
|
+
this.storage.enableCache({ maxSize: 100, ttlMs: 300000 });
|
|
23
47
|
this.parser = new ConversationParser();
|
|
24
48
|
this.decisionExtractor = new DecisionExtractor();
|
|
25
49
|
this.mistakeExtractor = new MistakeExtractor();
|
|
@@ -27,7 +51,39 @@ export class ConversationMemory {
|
|
|
27
51
|
this.semanticSearch = new SemanticSearch(this.sqliteManager);
|
|
28
52
|
}
|
|
29
53
|
/**
|
|
30
|
-
* Index conversations for a project
|
|
54
|
+
* Index conversations for a project.
|
|
55
|
+
*
|
|
56
|
+
* This is the main entry point for processing conversation history.
|
|
57
|
+
* It performs the following operations:
|
|
58
|
+
* 1. Parse conversation JSONL files from the project
|
|
59
|
+
* 2. Store conversations, messages, and tool interactions
|
|
60
|
+
* 3. Extract decisions, mistakes, and requirements
|
|
61
|
+
* 4. Link git commits (if enabled)
|
|
62
|
+
* 5. Generate semantic embeddings for search
|
|
63
|
+
*
|
|
64
|
+
* @param options - Configuration options for indexing
|
|
65
|
+
* @returns Result object containing:
|
|
66
|
+
* - `embeddings_generated`: Whether embeddings were successfully generated
|
|
67
|
+
* - `embedding_error`: Error message if embedding generation failed
|
|
68
|
+
* - `indexed_folders`: List of folders that were indexed
|
|
69
|
+
* - `database_path`: Path to the SQLite database
|
|
70
|
+
*
|
|
71
|
+
* @throws {Error} If project path doesn't exist or conversation files can't be parsed
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* const result = await memory.indexConversations({
|
|
76
|
+
* projectPath: '/Users/me/my-project',
|
|
77
|
+
* enableGitIntegration: true,
|
|
78
|
+
* excludeMcpConversations: 'self-only'
|
|
79
|
+
* });
|
|
80
|
+
*
|
|
81
|
+
* if (result.embeddings_generated) {
|
|
82
|
+
* console.log('Indexed folders:', result.indexed_folders);
|
|
83
|
+
* } else {
|
|
84
|
+
* console.warn('Embeddings failed:', result.embedding_error);
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
31
87
|
*/
|
|
32
88
|
async indexConversations(options) {
|
|
33
89
|
console.log("\n=== Indexing Conversations ===");
|
|
@@ -114,44 +170,105 @@ export class ConversationMemory {
|
|
|
114
170
|
};
|
|
115
171
|
}
|
|
116
172
|
/**
|
|
117
|
-
* Search conversations
|
|
173
|
+
* Search conversations using natural language query.
|
|
174
|
+
*
|
|
175
|
+
* Uses semantic search with embeddings if available, otherwise falls back to full-text search.
|
|
176
|
+
*
|
|
177
|
+
* @param query - Natural language search query
|
|
178
|
+
* @param limit - Maximum number of results to return (default: 10)
|
|
179
|
+
* @returns Array of search results with messages, conversations, and similarity scores
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```typescript
|
|
183
|
+
* const results = await memory.search('authentication bug fix', 5);
|
|
184
|
+
* results.forEach(r => {
|
|
185
|
+
* console.log(`${r.similarity}: ${r.snippet}`);
|
|
186
|
+
* });
|
|
187
|
+
* ```
|
|
118
188
|
*/
|
|
119
189
|
async search(query, limit = 10) {
|
|
120
190
|
return this.semanticSearch.searchConversations(query, limit);
|
|
121
191
|
}
|
|
122
192
|
/**
|
|
123
|
-
* Search decisions
|
|
193
|
+
* Search for decisions using natural language query.
|
|
194
|
+
*
|
|
195
|
+
* Searches through extracted decisions to find relevant architectural choices and technical decisions.
|
|
196
|
+
*
|
|
197
|
+
* @param query - Natural language search query
|
|
198
|
+
* @param limit - Maximum number of results to return (default: 10)
|
|
199
|
+
* @returns Array of decision search results with similarity scores
|
|
200
|
+
*
|
|
201
|
+
* @example
|
|
202
|
+
* ```typescript
|
|
203
|
+
* const decisions = await memory.searchDecisions('database choice', 3);
|
|
204
|
+
* decisions.forEach(d => {
|
|
205
|
+
* console.log(`Decision: ${d.decision.decision_text}`);
|
|
206
|
+
* console.log(`Rationale: ${d.decision.rationale}`);
|
|
207
|
+
* });
|
|
208
|
+
* ```
|
|
124
209
|
*/
|
|
125
210
|
async searchDecisions(query, limit = 10) {
|
|
126
211
|
return this.semanticSearch.searchDecisions(query, limit);
|
|
127
212
|
}
|
|
128
213
|
/**
|
|
129
|
-
* Get
|
|
214
|
+
* Get the timeline of changes for a specific file.
|
|
215
|
+
*
|
|
216
|
+
* Returns all edits, commits, and related conversations for a file across its history.
|
|
217
|
+
*
|
|
218
|
+
* @param filePath - Path to the file (relative to project root)
|
|
219
|
+
* @returns Timeline of file changes with conversations and commits
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```typescript
|
|
223
|
+
* const timeline = memory.getFileTimeline('src/index.ts');
|
|
224
|
+
* console.log(`${timeline.length} changes to this file`);
|
|
225
|
+
* ```
|
|
130
226
|
*/
|
|
131
227
|
getFileTimeline(filePath) {
|
|
132
228
|
return this.storage.getFileTimeline(filePath);
|
|
133
229
|
}
|
|
134
230
|
/**
|
|
135
|
-
* Get statistics
|
|
231
|
+
* Get statistics about the indexed conversation data.
|
|
232
|
+
*
|
|
233
|
+
* @returns Object containing counts for conversations, messages, decisions, mistakes, and commits
|
|
234
|
+
*
|
|
235
|
+
* @example
|
|
236
|
+
* ```typescript
|
|
237
|
+
* const stats = memory.getStats();
|
|
238
|
+
* console.log(`Indexed ${stats.conversations.count} conversations`);
|
|
239
|
+
* console.log(`Extracted ${stats.decisions.count} decisions`);
|
|
240
|
+
* ```
|
|
136
241
|
*/
|
|
137
242
|
getStats() {
|
|
138
243
|
return this.storage.getStats();
|
|
139
244
|
}
|
|
140
245
|
/**
|
|
141
|
-
* Get storage instance
|
|
246
|
+
* Get the underlying storage instance for direct database access.
|
|
247
|
+
*
|
|
248
|
+
* Use with caution - prefer using the high-level methods when possible.
|
|
249
|
+
*
|
|
250
|
+
* @returns ConversationStorage instance
|
|
251
|
+
* @internal
|
|
142
252
|
*/
|
|
143
253
|
getStorage() {
|
|
144
254
|
return this.storage;
|
|
145
255
|
}
|
|
146
256
|
/**
|
|
147
|
-
* Get semantic search instance
|
|
257
|
+
* Get the semantic search instance for advanced search operations.
|
|
258
|
+
*
|
|
259
|
+
* @returns SemanticSearch instance
|
|
260
|
+
* @internal
|
|
148
261
|
*/
|
|
149
262
|
getSemanticSearch() {
|
|
150
263
|
return this.semanticSearch;
|
|
151
264
|
}
|
|
152
265
|
/**
|
|
153
|
-
* Filter MCP conversations from parse results
|
|
154
|
-
*
|
|
266
|
+
* Filter MCP conversations from parse results.
|
|
267
|
+
*
|
|
268
|
+
* Implements the exclusion logic for MCP tool conversations to prevent
|
|
269
|
+
* self-referential loops and reduce noise in the index.
|
|
270
|
+
*
|
|
271
|
+
* Strategy: Filter at MESSAGE level, not conversation level.
|
|
155
272
|
* - Keep all conversations
|
|
156
273
|
* - Exclude only messages that invoke specified MCP tools and their responses
|
|
157
274
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationMemory.js","sourceRoot":"","sources":["../src/ConversationMemory.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ConversationMemory.js","sourceRoot":"","sources":["../src/ConversationMemory.ts"],"names":[],"mappings":"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"}
|