claude-conversation-memory-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +223 -0
- package/dist/ConversationMemory.d.ts +80 -0
- package/dist/ConversationMemory.d.ts.map +1 -0
- package/dist/ConversationMemory.js +203 -0
- package/dist/ConversationMemory.js.map +1 -0
- package/dist/documentation/CodeAnalyzer.d.ts +29 -0
- package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
- package/dist/documentation/CodeAnalyzer.js +122 -0
- package/dist/documentation/CodeAnalyzer.js.map +1 -0
- package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
- package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
- package/dist/documentation/ConversationAnalyzer.js +156 -0
- package/dist/documentation/ConversationAnalyzer.js.map +1 -0
- package/dist/documentation/CrossReferencer.d.ts +67 -0
- package/dist/documentation/CrossReferencer.d.ts.map +1 -0
- package/dist/documentation/CrossReferencer.js +247 -0
- package/dist/documentation/CrossReferencer.js.map +1 -0
- package/dist/documentation/DocumentationGenerator.d.ts +22 -0
- package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
- package/dist/documentation/DocumentationGenerator.js +57 -0
- package/dist/documentation/DocumentationGenerator.js.map +1 -0
- package/dist/documentation/MarkdownFormatter.d.ts +26 -0
- package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
- package/dist/documentation/MarkdownFormatter.js +301 -0
- package/dist/documentation/MarkdownFormatter.js.map +1 -0
- package/dist/documentation/types.d.ts +176 -0
- package/dist/documentation/types.d.ts.map +1 -0
- package/dist/documentation/types.js +5 -0
- package/dist/documentation/types.js.map +1 -0
- package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
- package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingConfig.js +132 -0
- package/dist/embeddings/EmbeddingConfig.js.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts +45 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.js +129 -0
- package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
- package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
- package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingProvider.js +6 -0
- package/dist/embeddings/EmbeddingProvider.js.map +1 -0
- package/dist/embeddings/VectorStore.d.ts +75 -0
- package/dist/embeddings/VectorStore.d.ts.map +1 -0
- package/dist/embeddings/VectorStore.js +220 -0
- package/dist/embeddings/VectorStore.js.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js +132 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js +128 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js +114 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +127 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/ConversationParser.d.ts +138 -0
- package/dist/parsers/ConversationParser.d.ts.map +1 -0
- package/dist/parsers/ConversationParser.js +325 -0
- package/dist/parsers/ConversationParser.js.map +1 -0
- package/dist/parsers/DecisionExtractor.d.ts +76 -0
- package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
- package/dist/parsers/DecisionExtractor.js +305 -0
- package/dist/parsers/DecisionExtractor.js.map +1 -0
- package/dist/parsers/GitIntegrator.d.ts +71 -0
- package/dist/parsers/GitIntegrator.d.ts.map +1 -0
- package/dist/parsers/GitIntegrator.js +283 -0
- package/dist/parsers/GitIntegrator.js.map +1 -0
- package/dist/parsers/MistakeExtractor.d.ts +86 -0
- package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
- package/dist/parsers/MistakeExtractor.js +341 -0
- package/dist/parsers/MistakeExtractor.js.map +1 -0
- package/dist/parsers/RequirementsExtractor.d.ts +70 -0
- package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
- package/dist/parsers/RequirementsExtractor.js +252 -0
- package/dist/parsers/RequirementsExtractor.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +90 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +352 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/storage/ConversationStorage.d.ts +53 -0
- package/dist/storage/ConversationStorage.d.ts.map +1 -0
- package/dist/storage/ConversationStorage.js +249 -0
- package/dist/storage/ConversationStorage.js.map +1 -0
- package/dist/storage/SQLiteManager.d.ts +88 -0
- package/dist/storage/SQLiteManager.d.ts.map +1 -0
- package/dist/storage/SQLiteManager.js +281 -0
- package/dist/storage/SQLiteManager.js.map +1 -0
- package/dist/storage/migrations.d.ts +54 -0
- package/dist/storage/migrations.d.ts.map +1 -0
- package/dist/storage/migrations.js +153 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/schema.sql +321 -0
- package/dist/tools/ToolDefinitions.d.ts +265 -0
- package/dist/tools/ToolDefinitions.d.ts.map +1 -0
- package/dist/tools/ToolDefinitions.js +261 -0
- package/dist/tools/ToolDefinitions.js.map +1 -0
- package/dist/tools/ToolHandlers.d.ts +56 -0
- package/dist/tools/ToolHandlers.d.ts.map +1 -0
- package/dist/tools/ToolHandlers.js +431 -0
- package/dist/tools/ToolHandlers.js.map +1 -0
- package/dist/types/ToolTypes.d.ts +333 -0
- package/dist/types/ToolTypes.d.ts.map +1 -0
- package/dist/types/ToolTypes.js +6 -0
- package/dist/types/ToolTypes.js.map +1 -0
- package/dist/utils/sanitization.d.ts +35 -0
- package/dist/utils/sanitization.d.ts.map +1 -0
- package/dist/utils/sanitization.js +97 -0
- package/dist/utils/sanitization.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Integrator
|
|
3
|
+
* Links git commits to conversations based on temporal and contextual analysis
|
|
4
|
+
*/
|
|
5
|
+
import simpleGit from "simple-git";
|
|
6
|
+
export class GitIntegrator {
|
|
7
|
+
git;
|
|
8
|
+
constructor(projectPath) {
|
|
9
|
+
this.git = simpleGit(projectPath);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parse git history and link to conversations
|
|
13
|
+
*/
|
|
14
|
+
async linkCommitsToConversations(conversations, fileEdits, decisions) {
|
|
15
|
+
console.log("Parsing git history...");
|
|
16
|
+
// Get git log
|
|
17
|
+
const commits = await this.parseGitHistory();
|
|
18
|
+
console.log(`Found ${commits.length} commits`);
|
|
19
|
+
// Link commits to conversations
|
|
20
|
+
const linkedCommits = [];
|
|
21
|
+
for (const commit of commits) {
|
|
22
|
+
const linkage = this.findBestConversationMatch(commit, conversations, fileEdits, decisions);
|
|
23
|
+
if (linkage && linkage.confidence > 0.3) {
|
|
24
|
+
commit.conversation_id = linkage.conversation.id;
|
|
25
|
+
console.log(`Linked commit ${commit.hash.substring(0, 7)} to conversation (confidence: ${(linkage.confidence * 100).toFixed(0)}%)`);
|
|
26
|
+
console.log(` Reasons: ${linkage.reasons.join(", ")}`);
|
|
27
|
+
}
|
|
28
|
+
linkedCommits.push(commit);
|
|
29
|
+
}
|
|
30
|
+
console.log(`Linked ${linkedCommits.filter((c) => c.conversation_id).length} commits to conversations`);
|
|
31
|
+
return linkedCommits;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse git history
|
|
35
|
+
*/
|
|
36
|
+
async parseGitHistory() {
|
|
37
|
+
try {
|
|
38
|
+
const log = await this.git.log({
|
|
39
|
+
"--all": null,
|
|
40
|
+
"--name-only": null,
|
|
41
|
+
});
|
|
42
|
+
const commits = [];
|
|
43
|
+
for (const entry of log.all) {
|
|
44
|
+
// Get current branch (if available)
|
|
45
|
+
let branch;
|
|
46
|
+
try {
|
|
47
|
+
const branches = await this.git.branch(["--contains", entry.hash]);
|
|
48
|
+
branch = branches.current || branches.all[0];
|
|
49
|
+
}
|
|
50
|
+
catch (_e) {
|
|
51
|
+
// Branch info not available
|
|
52
|
+
}
|
|
53
|
+
// Parse changed files from diff
|
|
54
|
+
const files = await this.getChangedFiles(entry.hash);
|
|
55
|
+
commits.push({
|
|
56
|
+
hash: entry.hash,
|
|
57
|
+
message: entry.message,
|
|
58
|
+
author: entry.author_name,
|
|
59
|
+
timestamp: new Date(entry.date).getTime(),
|
|
60
|
+
branch,
|
|
61
|
+
files_changed: files,
|
|
62
|
+
metadata: {
|
|
63
|
+
author_email: entry.author_email,
|
|
64
|
+
refs: entry.refs,
|
|
65
|
+
body: entry.body,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return commits;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error("Error parsing git history:", error);
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get files changed in a commit
|
|
78
|
+
*/
|
|
79
|
+
async getChangedFiles(commitHash) {
|
|
80
|
+
try {
|
|
81
|
+
const diff = await this.git.show([
|
|
82
|
+
"--name-only",
|
|
83
|
+
"--format=",
|
|
84
|
+
commitHash,
|
|
85
|
+
]);
|
|
86
|
+
return diff
|
|
87
|
+
.split("\n")
|
|
88
|
+
.map((f) => f.trim())
|
|
89
|
+
.filter((f) => f.length > 0);
|
|
90
|
+
}
|
|
91
|
+
catch (_error) {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Find best conversation match for a commit
|
|
97
|
+
*/
|
|
98
|
+
findBestConversationMatch(commit, conversations, fileEdits, decisions) {
|
|
99
|
+
let bestMatch = null;
|
|
100
|
+
let highestConfidence = 0;
|
|
101
|
+
for (const conversation of conversations) {
|
|
102
|
+
const linkage = this.scoreCommitConversationMatch(commit, conversation, fileEdits, decisions);
|
|
103
|
+
if (linkage.confidence > highestConfidence) {
|
|
104
|
+
highestConfidence = linkage.confidence;
|
|
105
|
+
bestMatch = linkage;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return bestMatch;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Score how well a commit matches a conversation
|
|
112
|
+
*/
|
|
113
|
+
scoreCommitConversationMatch(commit, conversation, fileEdits, decisions) {
|
|
114
|
+
let score = 0;
|
|
115
|
+
const reasons = [];
|
|
116
|
+
const maxScore = 10; // Total possible points
|
|
117
|
+
// 1. Timestamp proximity (3 points max)
|
|
118
|
+
const timestampScore = this.scoreTimestampProximity(commit, conversation);
|
|
119
|
+
score += timestampScore;
|
|
120
|
+
if (timestampScore > 0) {
|
|
121
|
+
reasons.push(`timestamp proximity (${timestampScore.toFixed(1)}/3)`);
|
|
122
|
+
}
|
|
123
|
+
// 2. File overlap (4 points max)
|
|
124
|
+
const fileScore = this.scoreFileOverlap(commit, conversation, fileEdits);
|
|
125
|
+
score += fileScore;
|
|
126
|
+
if (fileScore > 0) {
|
|
127
|
+
reasons.push(`file overlap (${fileScore.toFixed(1)}/4)`);
|
|
128
|
+
}
|
|
129
|
+
// 3. Branch match (1 point)
|
|
130
|
+
if (commit.branch && commit.branch === conversation.git_branch) {
|
|
131
|
+
score += 1;
|
|
132
|
+
reasons.push("branch match");
|
|
133
|
+
}
|
|
134
|
+
// 4. Commit message keywords (2 points max)
|
|
135
|
+
const keywordScore = this.scoreCommitMessageKeywords(commit, conversation, decisions);
|
|
136
|
+
score += keywordScore;
|
|
137
|
+
if (keywordScore > 0) {
|
|
138
|
+
reasons.push(`message keywords (${keywordScore.toFixed(1)}/2)`);
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
commit,
|
|
142
|
+
conversation,
|
|
143
|
+
confidence: score / maxScore,
|
|
144
|
+
reasons,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Score based on timestamp proximity
|
|
149
|
+
* Returns 0-3 points
|
|
150
|
+
*/
|
|
151
|
+
scoreTimestampProximity(commit, conversation) {
|
|
152
|
+
const { first_message_at, last_message_at } = conversation;
|
|
153
|
+
// Check if commit is within conversation timespan
|
|
154
|
+
if (commit.timestamp >= first_message_at &&
|
|
155
|
+
commit.timestamp <= last_message_at) {
|
|
156
|
+
return 3; // Perfect match
|
|
157
|
+
}
|
|
158
|
+
// Check if commit is within 5 minutes before/after conversation
|
|
159
|
+
const fiveMinutes = 5 * 60 * 1000;
|
|
160
|
+
const timeDelta = Math.min(Math.abs(commit.timestamp - first_message_at), Math.abs(commit.timestamp - last_message_at));
|
|
161
|
+
if (timeDelta < fiveMinutes) {
|
|
162
|
+
return 2; // Very close
|
|
163
|
+
}
|
|
164
|
+
// Check if commit is within 1 hour
|
|
165
|
+
const oneHour = 60 * 60 * 1000;
|
|
166
|
+
if (timeDelta < oneHour) {
|
|
167
|
+
return 1; // Somewhat close
|
|
168
|
+
}
|
|
169
|
+
return 0; // Too far away
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Score based on file overlap
|
|
173
|
+
* Returns 0-4 points
|
|
174
|
+
*/
|
|
175
|
+
scoreFileOverlap(commit, conversation, fileEdits) {
|
|
176
|
+
// Get files discussed in conversation
|
|
177
|
+
const conversationFiles = fileEdits
|
|
178
|
+
.filter((edit) => edit.conversation_id === conversation.id)
|
|
179
|
+
.map((edit) => edit.file_path);
|
|
180
|
+
if (conversationFiles.length === 0) {
|
|
181
|
+
return 0;
|
|
182
|
+
}
|
|
183
|
+
// Calculate overlap
|
|
184
|
+
const commitFilesSet = new Set(commit.files_changed);
|
|
185
|
+
const overlappingFiles = conversationFiles.filter((file) => commitFilesSet.has(file));
|
|
186
|
+
const overlapRatio = overlappingFiles.length /
|
|
187
|
+
Math.max(commit.files_changed.length, conversationFiles.length);
|
|
188
|
+
// 4 points for 100% overlap, scaling down
|
|
189
|
+
return overlapRatio * 4;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Score based on commit message keywords
|
|
193
|
+
* Returns 0-2 points
|
|
194
|
+
*/
|
|
195
|
+
scoreCommitMessageKeywords(commit, conversation, decisions) {
|
|
196
|
+
const commitMessage = commit.message.toLowerCase();
|
|
197
|
+
// Get keywords from conversation decisions
|
|
198
|
+
const conversationDecisions = decisions.filter((d) => d.conversation_id === conversation.id);
|
|
199
|
+
if (conversationDecisions.length === 0) {
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
// Extract keywords from decisions
|
|
203
|
+
const keywords = new Set();
|
|
204
|
+
for (const decision of conversationDecisions) {
|
|
205
|
+
// Extract significant words (3+ characters)
|
|
206
|
+
const words = decision.decision_text
|
|
207
|
+
.toLowerCase()
|
|
208
|
+
.split(/\s+/)
|
|
209
|
+
.filter((w) => w.length >= 3);
|
|
210
|
+
words.forEach((w) => keywords.add(w));
|
|
211
|
+
if (decision.context) {
|
|
212
|
+
keywords.add(decision.context.toLowerCase());
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Count keyword matches
|
|
216
|
+
let matches = 0;
|
|
217
|
+
for (const keyword of keywords) {
|
|
218
|
+
if (commitMessage.includes(keyword)) {
|
|
219
|
+
matches++;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// 2 points for 3+ matches, scaling down
|
|
223
|
+
return Math.min(matches / 3, 1) * 2;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get recent commits (last N days)
|
|
227
|
+
*/
|
|
228
|
+
async getRecentCommits(days = 30) {
|
|
229
|
+
const sinceDate = new Date();
|
|
230
|
+
sinceDate.setDate(sinceDate.getDate() - days);
|
|
231
|
+
try {
|
|
232
|
+
const log = await this.git.log({
|
|
233
|
+
"--since": sinceDate.toISOString(),
|
|
234
|
+
});
|
|
235
|
+
const commits = [];
|
|
236
|
+
for (const entry of log.all) {
|
|
237
|
+
const files = await this.getChangedFiles(entry.hash);
|
|
238
|
+
commits.push({
|
|
239
|
+
hash: entry.hash,
|
|
240
|
+
message: entry.message,
|
|
241
|
+
author: entry.author_name,
|
|
242
|
+
timestamp: new Date(entry.date).getTime(),
|
|
243
|
+
files_changed: files,
|
|
244
|
+
metadata: {
|
|
245
|
+
author_email: entry.author_email,
|
|
246
|
+
refs: entry.refs,
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
return commits;
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
console.error("Error getting recent commits:", error);
|
|
254
|
+
return [];
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get commits affecting a specific file
|
|
259
|
+
*/
|
|
260
|
+
async getCommitsForFile(filePath) {
|
|
261
|
+
try {
|
|
262
|
+
const log = await this.git.log({
|
|
263
|
+
file: filePath,
|
|
264
|
+
});
|
|
265
|
+
return log.all.map((entry) => ({
|
|
266
|
+
hash: entry.hash,
|
|
267
|
+
message: entry.message,
|
|
268
|
+
author: entry.author_name,
|
|
269
|
+
timestamp: new Date(entry.date).getTime(),
|
|
270
|
+
files_changed: [filePath],
|
|
271
|
+
metadata: {
|
|
272
|
+
author_email: entry.author_email,
|
|
273
|
+
refs: entry.refs,
|
|
274
|
+
},
|
|
275
|
+
}));
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
console.error(`Error getting commits for ${filePath}:`, error);
|
|
279
|
+
return [];
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=GitIntegrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitIntegrator.js","sourceRoot":"","sources":["../../src/parsers/GitIntegrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mistake Extractor
|
|
3
|
+
* Identifies errors and how they were corrected to prevent repetition
|
|
4
|
+
*/
|
|
5
|
+
import type { Message, ToolResult } from "./ConversationParser.js";
|
|
6
|
+
export interface Mistake {
|
|
7
|
+
id: string;
|
|
8
|
+
conversation_id: string;
|
|
9
|
+
message_id: string;
|
|
10
|
+
mistake_type: "logic_error" | "wrong_approach" | "misunderstanding" | "tool_error" | "syntax_error";
|
|
11
|
+
what_went_wrong: string;
|
|
12
|
+
correction?: string;
|
|
13
|
+
user_correction_message?: string;
|
|
14
|
+
files_affected: string[];
|
|
15
|
+
timestamp: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class MistakeExtractor {
|
|
18
|
+
private readonly CORRECTION_INDICATORS;
|
|
19
|
+
private readonly ERROR_INDICATORS;
|
|
20
|
+
private readonly MISTAKE_PATTERNS;
|
|
21
|
+
/**
|
|
22
|
+
* Extract mistakes from messages and tool results
|
|
23
|
+
*/
|
|
24
|
+
extractMistakes(messages: Message[], toolResults: ToolResult[]): Mistake[];
|
|
25
|
+
/**
|
|
26
|
+
* Extract mistakes from tool execution errors
|
|
27
|
+
*/
|
|
28
|
+
private extractToolErrors;
|
|
29
|
+
/**
|
|
30
|
+
* Extract mistakes from user corrections
|
|
31
|
+
*/
|
|
32
|
+
private extractUserCorrections;
|
|
33
|
+
/**
|
|
34
|
+
* Extract mistakes from error discussions in messages
|
|
35
|
+
*/
|
|
36
|
+
private extractErrorDiscussions;
|
|
37
|
+
/**
|
|
38
|
+
* Classify the type of mistake
|
|
39
|
+
*/
|
|
40
|
+
private classifyMistakeType;
|
|
41
|
+
/**
|
|
42
|
+
* Summarize error message
|
|
43
|
+
*/
|
|
44
|
+
private summarizeError;
|
|
45
|
+
/**
|
|
46
|
+
* Find correction in subsequent messages
|
|
47
|
+
*/
|
|
48
|
+
private findCorrection;
|
|
49
|
+
/**
|
|
50
|
+
* Extract files mentioned in error
|
|
51
|
+
*/
|
|
52
|
+
private extractFilesFromError;
|
|
53
|
+
/**
|
|
54
|
+
* Extract files from message metadata
|
|
55
|
+
*/
|
|
56
|
+
private extractFilesFromMessage;
|
|
57
|
+
/**
|
|
58
|
+
* Find previous assistant message
|
|
59
|
+
*/
|
|
60
|
+
private findPreviousAssistantMessage;
|
|
61
|
+
/**
|
|
62
|
+
* Extract what went wrong from correction message
|
|
63
|
+
*/
|
|
64
|
+
private extractWhatWentWrong;
|
|
65
|
+
/**
|
|
66
|
+
* Extract correction from user message
|
|
67
|
+
*/
|
|
68
|
+
private extractCorrection;
|
|
69
|
+
/**
|
|
70
|
+
* Extract error discussion from message
|
|
71
|
+
*/
|
|
72
|
+
private extractErrorDiscussion;
|
|
73
|
+
/**
|
|
74
|
+
* Extract solution from same message that discusses error
|
|
75
|
+
*/
|
|
76
|
+
private extractSolutionFromSameMessage;
|
|
77
|
+
/**
|
|
78
|
+
* Deduplicate similar mistakes
|
|
79
|
+
*/
|
|
80
|
+
private deduplicateMistakes;
|
|
81
|
+
/**
|
|
82
|
+
* Score mistake severity (for prioritization)
|
|
83
|
+
*/
|
|
84
|
+
scoreMistakeSeverity(mistake: Mistake): number;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=MistakeExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MistakeExtractor.d.ts","sourceRoot":"","sources":["../../src/parsers/MistakeExtractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,aAAa,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,YAAY,GAAG,cAAc,CAAC;IACpG,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,gBAAgB;IAE3B,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAOpC;IAGF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAO/B;IAGF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAa/B;IAEF;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE;IAkB1E;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAyC9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAsC/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgB/B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAYpC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAezB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAQtC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;CA8B/C"}
|