claude-cognitive 0.3.2 → 0.4.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 +57 -35
- package/dist/agents/context.d.ts.map +1 -1
- package/dist/agents/context.js +7 -7
- package/dist/agents/context.js.map +1 -1
- package/dist/cli/commands/feedback-stats.d.ts +10 -0
- package/dist/cli/commands/feedback-stats.d.ts.map +1 -0
- package/dist/cli/commands/feedback-stats.js +70 -0
- package/dist/cli/commands/feedback-stats.js.map +1 -0
- package/dist/cli/commands/feedback-sync.d.ts +10 -0
- package/dist/cli/commands/feedback-sync.d.ts.map +1 -0
- package/dist/cli/commands/feedback-sync.js +117 -0
- package/dist/cli/commands/feedback-sync.js.map +1 -0
- package/dist/cli/commands/index.d.ts +2 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +130 -4
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/semantic.d.ts +4 -2
- package/dist/cli/commands/semantic.d.ts.map +1 -1
- package/dist/cli/commands/semantic.js +8 -57
- package/dist/cli/commands/semantic.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +0 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +4 -2
- package/dist/cli/commands/sync.d.ts.map +1 -1
- package/dist/cli/commands/sync.js +9 -250
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +106 -1
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +3 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/output.d.ts +0 -2
- package/dist/cli/utils/output.d.ts.map +1 -1
- package/dist/cli/utils/output.js +0 -2
- package/dist/cli/utils/output.js.map +1 -1
- package/dist/client.d.ts +121 -22
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +209 -36
- package/dist/client.js.map +1 -1
- package/dist/events.d.ts +30 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/feedback/constants.d.ts +72 -0
- package/dist/feedback/constants.d.ts.map +1 -0
- package/dist/feedback/constants.js +145 -0
- package/dist/feedback/constants.js.map +1 -0
- package/dist/feedback/detector.d.ts +75 -0
- package/dist/feedback/detector.d.ts.map +1 -0
- package/dist/feedback/detector.js +393 -0
- package/dist/feedback/detector.js.map +1 -0
- package/dist/feedback/index.d.ts +85 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +194 -0
- package/dist/feedback/index.js.map +1 -0
- package/dist/feedback/offline-queue.d.ts +110 -0
- package/dist/feedback/offline-queue.d.ts.map +1 -0
- package/dist/feedback/offline-queue.js +188 -0
- package/dist/feedback/offline-queue.js.map +1 -0
- package/dist/feedback/scorer.d.ts +81 -0
- package/dist/feedback/scorer.d.ts.map +1 -0
- package/dist/feedback/scorer.js +194 -0
- package/dist/feedback/scorer.js.map +1 -0
- package/dist/feedback/similarity.d.ts +19 -0
- package/dist/feedback/similarity.d.ts.map +1 -0
- package/dist/feedback/similarity.js +49 -0
- package/dist/feedback/similarity.js.map +1 -0
- package/dist/feedback/tracker.d.ts +104 -0
- package/dist/feedback/tracker.d.ts.map +1 -0
- package/dist/feedback/tracker.js +324 -0
- package/dist/feedback/tracker.js.map +1 -0
- package/dist/hooks/process-session.d.ts.map +1 -1
- package/dist/hooks/process-session.js +17 -8
- package/dist/hooks/process-session.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/learn/index.d.ts.map +1 -1
- package/dist/learn/index.js +6 -2
- package/dist/learn/index.js.map +1 -1
- package/dist/mcp/handlers.d.ts +9 -1
- package/dist/mcp/handlers.d.ts.map +1 -1
- package/dist/mcp/handlers.js +66 -0
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +42 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +77 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +30 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/types.d.ts +16 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mind.d.ts +47 -28
- package/dist/mind.d.ts.map +1 -1
- package/dist/mind.js +351 -104
- package/dist/mind.js.map +1 -1
- package/dist/offline.d.ts +111 -0
- package/dist/offline.d.ts.map +1 -0
- package/dist/offline.js +198 -0
- package/dist/offline.js.map +1 -0
- package/dist/types.d.ts +171 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Detection Strategies
|
|
3
|
+
*
|
|
4
|
+
* Implements 4 detection strategies to identify which recalled facts
|
|
5
|
+
* Claude actually used during a session:
|
|
6
|
+
*
|
|
7
|
+
* 1. Explicit Reference Detection (High Confidence)
|
|
8
|
+
* 2. Semantic Similarity Detection (Medium Confidence)
|
|
9
|
+
* 3. Behavioral Signal Detection (Low Confidence)
|
|
10
|
+
* 4. Negative Signal Detection
|
|
11
|
+
*
|
|
12
|
+
* @module feedback/detector
|
|
13
|
+
*/
|
|
14
|
+
import { EXPLICIT_TRIGGERS, EXPLICIT_CONFIDENCE, SEMANTIC_THRESHOLD, SEMANTIC_MAX_CONFIDENCE, FILE_ACCESS_CONFIDENCE, TASK_TOPIC_CONFIDENCE, createFileReferencePatterns, LOW_POSITION_WEIGHT, LOW_POSITION_THRESHOLD, TOPIC_MISMATCH_WEIGHT, TOPIC_MISMATCH_THRESHOLD, FILES_NOT_ACCESSED_WEIGHT, MAX_IGNORE_CONFIDENCE, CHUNK_MAX_WORDS, CHUNK_OVERLAP_WORDS, } from "./constants.js";
|
|
15
|
+
import { calculateSimilarity, jaccardSimilarity } from "./similarity.js";
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Strategy 1: Explicit Reference Detection (High Confidence)
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Detect explicit references to context in Claude's response
|
|
21
|
+
*/
|
|
22
|
+
export function detectExplicitReferences(response, recalledFacts) {
|
|
23
|
+
if (!response || !recalledFacts?.length) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
const detections = [];
|
|
27
|
+
const detectedFactIds = new Set();
|
|
28
|
+
// Check each trigger pattern
|
|
29
|
+
for (const pattern of EXPLICIT_TRIGGERS) {
|
|
30
|
+
const matches = response.match(pattern);
|
|
31
|
+
if (!matches)
|
|
32
|
+
continue;
|
|
33
|
+
// Found explicit reference - try to match to specific fact
|
|
34
|
+
for (const match of [matches[0]]) {
|
|
35
|
+
// Get surrounding context - use sentence boundary or limited window
|
|
36
|
+
const matchIndex = response.indexOf(match);
|
|
37
|
+
// Find sentence boundaries (period, newline, or window limit)
|
|
38
|
+
let contextStart = matchIndex;
|
|
39
|
+
let contextEnd = matchIndex + match.length;
|
|
40
|
+
// Look backwards for sentence start (max 50 chars)
|
|
41
|
+
for (let i = matchIndex - 1; i >= Math.max(0, matchIndex - 50); i--) {
|
|
42
|
+
if (response[i] === "." || response[i] === "\n") {
|
|
43
|
+
contextStart = i + 1;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
contextStart = i;
|
|
47
|
+
}
|
|
48
|
+
// Look forwards for sentence end (max 100 chars)
|
|
49
|
+
for (let i = matchIndex + match.length; i < Math.min(response.length, matchIndex + match.length + 100); i++) {
|
|
50
|
+
contextEnd = i + 1;
|
|
51
|
+
if (response[i] === "." || response[i] === "\n") {
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const surroundingContext = response.slice(contextStart, contextEnd).trim();
|
|
56
|
+
// Find best matching fact based on context
|
|
57
|
+
const matchedFact = findBestMatchingFact(surroundingContext, recalledFacts);
|
|
58
|
+
if (matchedFact && !detectedFactIds.has(matchedFact.factId)) {
|
|
59
|
+
detectedFactIds.add(matchedFact.factId);
|
|
60
|
+
detections.push({
|
|
61
|
+
factId: matchedFact.factId,
|
|
62
|
+
detectionType: "explicit_reference",
|
|
63
|
+
confidence: EXPLICIT_CONFIDENCE,
|
|
64
|
+
evidence: {
|
|
65
|
+
trigger: pattern.source,
|
|
66
|
+
match,
|
|
67
|
+
context: surroundingContext.slice(0, 200),
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return detections;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Find the best matching fact for a given context
|
|
77
|
+
*/
|
|
78
|
+
function findBestMatchingFact(context, facts, minThreshold = 0.1) {
|
|
79
|
+
if (!context || !facts?.length) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
let bestMatch = null;
|
|
83
|
+
let bestScore = 0;
|
|
84
|
+
for (const fact of facts) {
|
|
85
|
+
const factText = fact.text || "";
|
|
86
|
+
const similarity = calculateSimilarity(context, factText);
|
|
87
|
+
// Lower threshold (0.1) since explicit triggers already indicate high confidence
|
|
88
|
+
if (similarity > bestScore && similarity > minThreshold) {
|
|
89
|
+
bestScore = similarity;
|
|
90
|
+
bestMatch = fact;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return bestMatch;
|
|
94
|
+
}
|
|
95
|
+
// =============================================================================
|
|
96
|
+
// Strategy 2: Semantic Similarity Detection (Medium Confidence)
|
|
97
|
+
// =============================================================================
|
|
98
|
+
/**
|
|
99
|
+
* Detect semantic matches between response and facts
|
|
100
|
+
* Uses Jaccard similarity (word overlap) for comparison
|
|
101
|
+
*/
|
|
102
|
+
export function detectSemanticMatches(response, recalledFacts, threshold = SEMANTIC_THRESHOLD) {
|
|
103
|
+
if (!response || !recalledFacts?.length) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
const detections = [];
|
|
107
|
+
const factDetections = new Map();
|
|
108
|
+
// Split response into chunks for comparison
|
|
109
|
+
const chunks = splitIntoChunks(response, CHUNK_MAX_WORDS, CHUNK_OVERLAP_WORDS);
|
|
110
|
+
// Compare each chunk to each fact
|
|
111
|
+
for (const chunk of chunks) {
|
|
112
|
+
for (const fact of recalledFacts) {
|
|
113
|
+
const factText = fact.text || "";
|
|
114
|
+
const similarity = calculateSimilarity(chunk, factText);
|
|
115
|
+
if (similarity >= threshold) {
|
|
116
|
+
const confidence = Math.min(similarity * SEMANTIC_MAX_CONFIDENCE, SEMANTIC_MAX_CONFIDENCE);
|
|
117
|
+
// Keep best detection per fact
|
|
118
|
+
const existing = factDetections.get(fact.factId);
|
|
119
|
+
if (!existing || confidence > existing.confidence) {
|
|
120
|
+
factDetections.set(fact.factId, {
|
|
121
|
+
factId: fact.factId,
|
|
122
|
+
detectionType: "semantic_match",
|
|
123
|
+
confidence,
|
|
124
|
+
evidence: {
|
|
125
|
+
chunk: chunk.slice(0, 200),
|
|
126
|
+
factText: factText.slice(0, 200),
|
|
127
|
+
similarity,
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Convert map to array
|
|
135
|
+
for (const detection of factDetections.values()) {
|
|
136
|
+
detections.push(detection);
|
|
137
|
+
}
|
|
138
|
+
return detections;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Split text into overlapping chunks
|
|
142
|
+
*/
|
|
143
|
+
function splitIntoChunks(text, maxWords = CHUNK_MAX_WORDS, overlap = CHUNK_OVERLAP_WORDS) {
|
|
144
|
+
const words = text.split(/\s+/).filter(Boolean);
|
|
145
|
+
const chunks = [];
|
|
146
|
+
if (words.length <= maxWords) {
|
|
147
|
+
return [text];
|
|
148
|
+
}
|
|
149
|
+
const step = maxWords - overlap;
|
|
150
|
+
for (let i = 0; i < words.length; i += step) {
|
|
151
|
+
const chunkWords = words.slice(i, i + maxWords);
|
|
152
|
+
if (chunkWords.length >= overlap) {
|
|
153
|
+
chunks.push(chunkWords.join(" "));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return chunks;
|
|
157
|
+
}
|
|
158
|
+
// =============================================================================
|
|
159
|
+
// Strategy 3: Behavioral Signal Detection (Low Confidence)
|
|
160
|
+
// =============================================================================
|
|
161
|
+
/**
|
|
162
|
+
* Detect behavioral signals that indicate fact usage
|
|
163
|
+
*/
|
|
164
|
+
export function detectBehavioralSignals(sessionActivity, recalledFacts) {
|
|
165
|
+
if (!sessionActivity || !recalledFacts?.length) {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
const detections = [];
|
|
169
|
+
const detectedFactIds = new Set();
|
|
170
|
+
// 1. File access correlation
|
|
171
|
+
const accessedFiles = sessionActivity.filesAccessed || [];
|
|
172
|
+
if (accessedFiles.length > 0) {
|
|
173
|
+
for (const fact of recalledFacts) {
|
|
174
|
+
const factText = fact.text || "";
|
|
175
|
+
const mentionedFiles = extractFileReferences(factText);
|
|
176
|
+
if (mentionedFiles.length > 0) {
|
|
177
|
+
const overlap = intersection(accessedFiles, mentionedFiles);
|
|
178
|
+
if (overlap.length > 0 && !detectedFactIds.has(fact.factId)) {
|
|
179
|
+
detectedFactIds.add(fact.factId);
|
|
180
|
+
detections.push({
|
|
181
|
+
factId: fact.factId,
|
|
182
|
+
detectionType: "file_access_correlation",
|
|
183
|
+
confidence: FILE_ACCESS_CONFIDENCE,
|
|
184
|
+
evidence: {
|
|
185
|
+
filesInFact: mentionedFiles,
|
|
186
|
+
filesAccessed: overlap,
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// 2. Task topic correlation
|
|
194
|
+
const tasksCompleted = sessionActivity.tasksCompleted || [];
|
|
195
|
+
if (tasksCompleted.length > 0) {
|
|
196
|
+
for (const fact of recalledFacts) {
|
|
197
|
+
if (detectedFactIds.has(fact.factId))
|
|
198
|
+
continue;
|
|
199
|
+
const factText = fact.text || "";
|
|
200
|
+
const factTopics = extractTopics(factText);
|
|
201
|
+
for (const task of tasksCompleted) {
|
|
202
|
+
const taskDesc = task.description || task.title || String(task);
|
|
203
|
+
const taskTopics = extractTopics(taskDesc);
|
|
204
|
+
const topicOverlap = jaccardSimilarity(factTopics, taskTopics);
|
|
205
|
+
if (topicOverlap > 0.3 && !detectedFactIds.has(fact.factId)) {
|
|
206
|
+
detectedFactIds.add(fact.factId);
|
|
207
|
+
detections.push({
|
|
208
|
+
factId: fact.factId,
|
|
209
|
+
detectionType: "task_topic_correlation",
|
|
210
|
+
confidence: TASK_TOPIC_CONFIDENCE * topicOverlap,
|
|
211
|
+
evidence: {
|
|
212
|
+
task: taskDesc.slice(0, 100),
|
|
213
|
+
factTopics: [...factTopics].slice(0, 5),
|
|
214
|
+
taskTopics: [...taskTopics].slice(0, 5),
|
|
215
|
+
overlap: topicOverlap,
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return detections;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Extract file references from text
|
|
227
|
+
*/
|
|
228
|
+
export function extractFileReferences(text) {
|
|
229
|
+
if (!text)
|
|
230
|
+
return [];
|
|
231
|
+
const files = new Set();
|
|
232
|
+
// Create fresh regex patterns for each call to avoid shared state issues
|
|
233
|
+
const patterns = createFileReferencePatterns();
|
|
234
|
+
for (const pattern of patterns) {
|
|
235
|
+
let match;
|
|
236
|
+
while ((match = pattern.exec(text)) !== null) {
|
|
237
|
+
const file = match[1] || match[0];
|
|
238
|
+
if (file && file.length > 2) {
|
|
239
|
+
const normalized = normalizeFileName(file);
|
|
240
|
+
if (normalized) {
|
|
241
|
+
files.add(normalized);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return [...files];
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Normalize a file name for comparison
|
|
250
|
+
* @returns Normalized file name or empty string if input is invalid
|
|
251
|
+
*/
|
|
252
|
+
function normalizeFileName(fileName) {
|
|
253
|
+
if (!fileName)
|
|
254
|
+
return "";
|
|
255
|
+
const normalized = fileName
|
|
256
|
+
.toLowerCase()
|
|
257
|
+
.replace(/^['"]|['"]$/g, "") // Remove quotes
|
|
258
|
+
.trim();
|
|
259
|
+
if (!normalized)
|
|
260
|
+
return "";
|
|
261
|
+
const parts = normalized.split("/").filter(Boolean);
|
|
262
|
+
const baseName = parts.length > 0 ? parts[parts.length - 1] : "";
|
|
263
|
+
return baseName ?? "";
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Extract topic keywords from text
|
|
267
|
+
*/
|
|
268
|
+
export function extractTopics(text) {
|
|
269
|
+
if (!text)
|
|
270
|
+
return new Set();
|
|
271
|
+
// Common stop words to filter out
|
|
272
|
+
const stopWords = new Set([
|
|
273
|
+
"the", "a", "an", "and", "or", "but", "in", "on", "at", "to", "for",
|
|
274
|
+
"of", "with", "by", "from", "as", "is", "was", "are", "were", "be",
|
|
275
|
+
"been", "being", "have", "has", "had", "do", "does", "did", "will",
|
|
276
|
+
"would", "could", "should", "may", "might", "must", "shall", "can",
|
|
277
|
+
"this", "that", "these", "those", "it", "its", "they", "them", "their",
|
|
278
|
+
"we", "us", "our", "you", "your", "i", "me", "my", "he", "she", "him", "her", "his",
|
|
279
|
+
]);
|
|
280
|
+
const words = text
|
|
281
|
+
.toLowerCase()
|
|
282
|
+
.replace(/[^\w\s]/g, " ")
|
|
283
|
+
.split(/\s+/)
|
|
284
|
+
.filter((w) => w.length > 2 && !stopWords.has(w));
|
|
285
|
+
return new Set(words);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Calculate intersection of two arrays
|
|
289
|
+
*/
|
|
290
|
+
function intersection(arr1, arr2) {
|
|
291
|
+
const set2 = new Set(arr2.map((s) => s.toLowerCase()));
|
|
292
|
+
return arr1.filter((item) => set2.has(item.toLowerCase()));
|
|
293
|
+
}
|
|
294
|
+
// =============================================================================
|
|
295
|
+
// Strategy 4: Negative Signal Detection
|
|
296
|
+
// =============================================================================
|
|
297
|
+
/**
|
|
298
|
+
* Detect negative signals for facts that were likely NOT used
|
|
299
|
+
*/
|
|
300
|
+
export function detectNegativeSignals(sessionActivity, recalledFacts, usedFactIds) {
|
|
301
|
+
if (!recalledFacts?.length) {
|
|
302
|
+
return [];
|
|
303
|
+
}
|
|
304
|
+
const negativeSignals = [];
|
|
305
|
+
const sessionTopics = sessionActivity?.summary ? extractTopics(sessionActivity.summary) : new Set();
|
|
306
|
+
const accessedFiles = new Set((sessionActivity?.filesAccessed || []).map((f) => f.toLowerCase()));
|
|
307
|
+
for (const fact of recalledFacts) {
|
|
308
|
+
// Skip facts already detected as used
|
|
309
|
+
if (usedFactIds.has(fact.factId))
|
|
310
|
+
continue;
|
|
311
|
+
const signals = [];
|
|
312
|
+
const factText = fact.text || "";
|
|
313
|
+
// 1. Position-based signal (facts at end less likely useful)
|
|
314
|
+
if (fact.position > LOW_POSITION_THRESHOLD) {
|
|
315
|
+
signals.push({
|
|
316
|
+
type: "low_position",
|
|
317
|
+
weight: LOW_POSITION_WEIGHT,
|
|
318
|
+
detail: `Position ${fact.position} > ${LOW_POSITION_THRESHOLD}`,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
// 2. Topic mismatch signal
|
|
322
|
+
if (sessionTopics.size > 0) {
|
|
323
|
+
const factTopics = extractTopics(factText);
|
|
324
|
+
const topicOverlap = jaccardSimilarity(sessionTopics, factTopics);
|
|
325
|
+
if (topicOverlap < TOPIC_MISMATCH_THRESHOLD) {
|
|
326
|
+
signals.push({
|
|
327
|
+
type: "topic_mismatch",
|
|
328
|
+
weight: TOPIC_MISMATCH_WEIGHT,
|
|
329
|
+
detail: `Topic overlap ${(topicOverlap * 100).toFixed(1)}% < ${TOPIC_MISMATCH_THRESHOLD * 100}%`,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// 3. Files not accessed signal
|
|
334
|
+
const factFiles = extractFileReferences(factText);
|
|
335
|
+
if (factFiles.length > 0) {
|
|
336
|
+
const filesAccessed = factFiles.filter((f) => accessedFiles.has(f.toLowerCase()));
|
|
337
|
+
if (filesAccessed.length === 0) {
|
|
338
|
+
signals.push({
|
|
339
|
+
type: "files_not_accessed",
|
|
340
|
+
weight: FILES_NOT_ACCESSED_WEIGHT,
|
|
341
|
+
detail: `Fact mentions ${factFiles.length} files, none accessed`,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Only add negative signal if we found at least one indicator
|
|
346
|
+
if (signals.length > 0) {
|
|
347
|
+
const totalWeight = signals.reduce((sum, s) => sum + s.weight, 0);
|
|
348
|
+
negativeSignals.push({
|
|
349
|
+
factId: fact.factId,
|
|
350
|
+
signals,
|
|
351
|
+
ignoreConfidence: Math.min(totalWeight, MAX_IGNORE_CONFIDENCE),
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return negativeSignals;
|
|
356
|
+
}
|
|
357
|
+
// =============================================================================
|
|
358
|
+
// Detection Pipeline
|
|
359
|
+
// =============================================================================
|
|
360
|
+
/**
|
|
361
|
+
* Run the full detection pipeline
|
|
362
|
+
*/
|
|
363
|
+
export function runDetectionPipeline(conversationText, sessionActivity, recalledFacts, config = {}) {
|
|
364
|
+
const results = {
|
|
365
|
+
explicit: [],
|
|
366
|
+
semantic: [],
|
|
367
|
+
behavioral: [],
|
|
368
|
+
negative: [],
|
|
369
|
+
};
|
|
370
|
+
// Run enabled detection strategies
|
|
371
|
+
if (conversationText) {
|
|
372
|
+
if (config.explicit !== false) {
|
|
373
|
+
results.explicit = detectExplicitReferences(conversationText, recalledFacts);
|
|
374
|
+
}
|
|
375
|
+
if (config.semantic !== false) {
|
|
376
|
+
const threshold = config.semanticThreshold || SEMANTIC_THRESHOLD;
|
|
377
|
+
results.semantic = detectSemanticMatches(conversationText, recalledFacts, threshold);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
if (sessionActivity && config.behavioral !== false) {
|
|
381
|
+
results.behavioral = detectBehavioralSignals(sessionActivity, recalledFacts);
|
|
382
|
+
}
|
|
383
|
+
// Collect all used fact IDs for negative signal detection
|
|
384
|
+
const usedFactIds = new Set([
|
|
385
|
+
...results.explicit.map((d) => d.factId),
|
|
386
|
+
...results.semantic.map((d) => d.factId),
|
|
387
|
+
...results.behavioral.map((d) => d.factId),
|
|
388
|
+
]);
|
|
389
|
+
// Run negative signal detection
|
|
390
|
+
results.negative = detectNegativeSignals(sessionActivity, recalledFacts, usedFactIds);
|
|
391
|
+
return results;
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/feedback/detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Feedback Loop Module
|
|
3
|
+
*
|
|
4
|
+
* Provides a closed-loop feedback system that:
|
|
5
|
+
* 1. Tracks which recalled facts Claude actually uses
|
|
6
|
+
* 2. Scores facts based on usefulness signals
|
|
7
|
+
* 3. Prepares feedback for Hindsight API
|
|
8
|
+
*
|
|
9
|
+
* @module feedback
|
|
10
|
+
*/
|
|
11
|
+
import { type RecallSession } from "./tracker.js";
|
|
12
|
+
import { type SessionActivity } from "./detector.js";
|
|
13
|
+
import { type FeedbackResult } from "./scorer.js";
|
|
14
|
+
import type { FeedbackConfig, Memory } from "../types.js";
|
|
15
|
+
export { EXPLICIT_CONFIDENCE, SEMANTIC_THRESHOLD, SEMANTIC_MAX_CONFIDENCE, BEHAVIORAL_CONFIDENCE_BASE, USED_THRESHOLD, IGNORED_THRESHOLD, EXPLICIT_TRIGGERS, FILE_REFERENCE_PATTERNS, DEFAULT_FEEDBACK_CONFIG, SESSION_DATA_RETENTION_DAYS, } from "./constants.js";
|
|
16
|
+
export { createRecallSession, addRecalledFacts, saveRecallSession, loadRecallSession, trackRecall, cleanupOldSessions, getSessionStats, getRecallSessionPath, getSessionActivityDir, type RecallSession, type RecalledFact, type SessionStats, } from "./tracker.js";
|
|
17
|
+
export { detectExplicitReferences, detectSemanticMatches, detectBehavioralSignals, detectNegativeSignals, runDetectionPipeline, extractFileReferences, extractTopics, type Detection, type NegativeSignal, type DetectionResults, type SessionActivity, } from "./detector.js";
|
|
18
|
+
export { aggregateDetections, calculateVerdict, prepareFeedback, summarizeFeedback, filterHighConfidence, getDetectionBreakdown, type FactScore, type FeedbackSummary, type FeedbackResult, type Verdict, } from "./scorer.js";
|
|
19
|
+
export { calculateSimilarity, jaccardSimilarity } from "./similarity.js";
|
|
20
|
+
export interface ProcessFeedbackOptions {
|
|
21
|
+
conversationText?: string;
|
|
22
|
+
sessionActivity?: SessionActivity;
|
|
23
|
+
}
|
|
24
|
+
export interface TrackRecallResult {
|
|
25
|
+
success: boolean;
|
|
26
|
+
sessionId?: string;
|
|
27
|
+
factsTracked?: number;
|
|
28
|
+
reason?: string;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface StatsResult {
|
|
32
|
+
success: boolean;
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
currentSession?: RecallSession | null;
|
|
35
|
+
archivedSessions?: number;
|
|
36
|
+
totalFactsTracked?: number;
|
|
37
|
+
oldestSession?: string | null;
|
|
38
|
+
newestSession?: string | null;
|
|
39
|
+
error?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* FeedbackService - Main facade class for the feedback loop
|
|
43
|
+
*
|
|
44
|
+
* Provides a high-level interface for:
|
|
45
|
+
* - Tracking recall sessions
|
|
46
|
+
* - Processing feedback at session end
|
|
47
|
+
* - Viewing statistics and patterns
|
|
48
|
+
*/
|
|
49
|
+
export declare class FeedbackService {
|
|
50
|
+
private projectDir;
|
|
51
|
+
private config;
|
|
52
|
+
/**
|
|
53
|
+
* Create a new FeedbackService
|
|
54
|
+
*/
|
|
55
|
+
constructor(config: FeedbackConfig, projectDir: string);
|
|
56
|
+
/**
|
|
57
|
+
* Check if feedback loop is enabled
|
|
58
|
+
*/
|
|
59
|
+
isEnabled(): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Track a recall operation
|
|
62
|
+
*/
|
|
63
|
+
trackRecall(sessionId: string, query: string, facts: Memory[]): Promise<TrackRecallResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Process feedback for a session
|
|
66
|
+
*/
|
|
67
|
+
processFeedback(sessionId: string, options?: ProcessFeedbackOptions): Promise<FeedbackResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Get feedback statistics for the project
|
|
70
|
+
*/
|
|
71
|
+
getStats(): Promise<StatsResult>;
|
|
72
|
+
/**
|
|
73
|
+
* Update configuration
|
|
74
|
+
*/
|
|
75
|
+
updateConfig(config: Partial<FeedbackConfig>): void;
|
|
76
|
+
/**
|
|
77
|
+
* Get current configuration
|
|
78
|
+
*/
|
|
79
|
+
getConfig(): FeedbackConfig;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create a new FeedbackService instance
|
|
83
|
+
*/
|
|
84
|
+
export declare function createFeedbackService(config: FeedbackConfig, projectDir: string): FeedbackService;
|
|
85
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"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"}
|