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,194 @@
|
|
|
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 { DEFAULT_FEEDBACK_CONFIG } from "./constants.js";
|
|
12
|
+
import { trackRecall, loadRecallSession, getSessionStats, } from "./tracker.js";
|
|
13
|
+
import { runDetectionPipeline } from "./detector.js";
|
|
14
|
+
import { aggregateDetections, summarizeFeedback, prepareFeedback, } from "./scorer.js";
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// Re-exports
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Constants
|
|
19
|
+
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";
|
|
20
|
+
// Tracker
|
|
21
|
+
export { createRecallSession, addRecalledFacts, saveRecallSession, loadRecallSession, trackRecall, cleanupOldSessions, getSessionStats, getRecallSessionPath, getSessionActivityDir, } from "./tracker.js";
|
|
22
|
+
// Detector
|
|
23
|
+
export { detectExplicitReferences, detectSemanticMatches, detectBehavioralSignals, detectNegativeSignals, runDetectionPipeline, extractFileReferences, extractTopics, } from "./detector.js";
|
|
24
|
+
// Scorer
|
|
25
|
+
export { aggregateDetections, calculateVerdict, prepareFeedback, summarizeFeedback, filterHighConfidence, getDetectionBreakdown, } from "./scorer.js";
|
|
26
|
+
// Similarity
|
|
27
|
+
export { calculateSimilarity, jaccardSimilarity } from "./similarity.js";
|
|
28
|
+
/**
|
|
29
|
+
* FeedbackService - Main facade class for the feedback loop
|
|
30
|
+
*
|
|
31
|
+
* Provides a high-level interface for:
|
|
32
|
+
* - Tracking recall sessions
|
|
33
|
+
* - Processing feedback at session end
|
|
34
|
+
* - Viewing statistics and patterns
|
|
35
|
+
*/
|
|
36
|
+
export class FeedbackService {
|
|
37
|
+
projectDir;
|
|
38
|
+
config;
|
|
39
|
+
/**
|
|
40
|
+
* Create a new FeedbackService
|
|
41
|
+
*/
|
|
42
|
+
constructor(config, projectDir) {
|
|
43
|
+
this.projectDir = projectDir;
|
|
44
|
+
this.config = { ...DEFAULT_FEEDBACK_CONFIG, ...config };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if feedback loop is enabled
|
|
48
|
+
*/
|
|
49
|
+
isEnabled() {
|
|
50
|
+
return this.config.enabled === true;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Track a recall operation
|
|
54
|
+
*/
|
|
55
|
+
async trackRecall(sessionId, query, facts) {
|
|
56
|
+
if (!this.isEnabled()) {
|
|
57
|
+
return { success: false, reason: "Feedback loop disabled" };
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const session = await trackRecall({
|
|
61
|
+
sessionId,
|
|
62
|
+
projectDir: this.projectDir,
|
|
63
|
+
query,
|
|
64
|
+
facts,
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
success: true,
|
|
68
|
+
sessionId: session.sessionId,
|
|
69
|
+
factsTracked: session.totalFacts,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return {
|
|
74
|
+
success: false,
|
|
75
|
+
error: error instanceof Error ? error.message : String(error),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Process feedback for a session
|
|
81
|
+
*/
|
|
82
|
+
async processFeedback(sessionId, options = {}) {
|
|
83
|
+
if (!this.isEnabled()) {
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
sessionId,
|
|
87
|
+
reason: "Feedback loop disabled",
|
|
88
|
+
summary: createEmptySummary(),
|
|
89
|
+
factScores: [],
|
|
90
|
+
feedback: [],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
// Load recall session
|
|
95
|
+
const recallSession = await loadRecallSession(sessionId, this.projectDir);
|
|
96
|
+
if (!recallSession) {
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
sessionId,
|
|
100
|
+
reason: "No recall session found for this session ID",
|
|
101
|
+
summary: createEmptySummary(),
|
|
102
|
+
factScores: [],
|
|
103
|
+
feedback: [],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// Run detection pipeline
|
|
107
|
+
const detections = runDetectionPipeline(options.conversationText || null, options.sessionActivity || null, recallSession.factsRecalled, this.config.detection || {});
|
|
108
|
+
// Aggregate scores
|
|
109
|
+
const factScores = aggregateDetections(detections);
|
|
110
|
+
// Get summary
|
|
111
|
+
const summary = summarizeFeedback(factScores);
|
|
112
|
+
// Prepare feedback for API (if enabled)
|
|
113
|
+
let feedback = [];
|
|
114
|
+
if (this.config.hindsight?.sendFeedback) {
|
|
115
|
+
feedback = prepareFeedback(factScores, recallSession.recall.query);
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
success: true,
|
|
119
|
+
sessionId,
|
|
120
|
+
summary,
|
|
121
|
+
factScores,
|
|
122
|
+
feedback,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
return {
|
|
127
|
+
success: false,
|
|
128
|
+
sessionId,
|
|
129
|
+
error: error instanceof Error ? error.message : String(error),
|
|
130
|
+
summary: createEmptySummary(),
|
|
131
|
+
factScores: [],
|
|
132
|
+
feedback: [],
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get feedback statistics for the project
|
|
138
|
+
*/
|
|
139
|
+
async getStats() {
|
|
140
|
+
try {
|
|
141
|
+
const sessionStats = await getSessionStats(this.projectDir);
|
|
142
|
+
return {
|
|
143
|
+
success: true,
|
|
144
|
+
enabled: this.isEnabled(),
|
|
145
|
+
...sessionStats,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
return {
|
|
150
|
+
success: false,
|
|
151
|
+
enabled: this.isEnabled(),
|
|
152
|
+
error: error instanceof Error ? error.message : String(error),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Update configuration
|
|
158
|
+
*/
|
|
159
|
+
updateConfig(config) {
|
|
160
|
+
this.config = { ...this.config, ...config };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get current configuration
|
|
164
|
+
*/
|
|
165
|
+
getConfig() {
|
|
166
|
+
return { ...this.config };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// =============================================================================
|
|
170
|
+
// Helper Functions
|
|
171
|
+
// =============================================================================
|
|
172
|
+
function createEmptySummary() {
|
|
173
|
+
return {
|
|
174
|
+
total: 0,
|
|
175
|
+
used: 0,
|
|
176
|
+
ignored: 0,
|
|
177
|
+
uncertain: 0,
|
|
178
|
+
usageRate: 0,
|
|
179
|
+
avgUsedConfidence: 0,
|
|
180
|
+
avgIgnoredConfidence: 0,
|
|
181
|
+
topUsed: [],
|
|
182
|
+
topIgnored: [],
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
// =============================================================================
|
|
186
|
+
// Factory Functions
|
|
187
|
+
// =============================================================================
|
|
188
|
+
/**
|
|
189
|
+
* Create a new FeedbackService instance
|
|
190
|
+
*/
|
|
191
|
+
export function createFeedbackService(config, projectDir) {
|
|
192
|
+
return new FeedbackService(config, projectDir);
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offline feedback signal queue for degraded mode.
|
|
3
|
+
* Stores feedback signals locally when Hindsight is unavailable.
|
|
4
|
+
* Auto-syncs to Hindsight when connection is restored.
|
|
5
|
+
* @module feedback/offline-queue
|
|
6
|
+
*/
|
|
7
|
+
import type { SignalItem } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* A feedback signal stored offline with queue metadata.
|
|
10
|
+
*/
|
|
11
|
+
export interface OfflineSignal extends SignalItem {
|
|
12
|
+
/** Local queue ID */
|
|
13
|
+
id: string;
|
|
14
|
+
/** When queued (ISO 8601) */
|
|
15
|
+
queuedAt: string;
|
|
16
|
+
/** Whether this has been synced to Hindsight */
|
|
17
|
+
synced: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Options for OfflineFeedbackQueue.
|
|
21
|
+
*/
|
|
22
|
+
export interface OfflineFeedbackQueueOptions {
|
|
23
|
+
/** Project root directory */
|
|
24
|
+
projectPath: string;
|
|
25
|
+
/** Custom storage file path (default: .claude/offline-feedback.json) */
|
|
26
|
+
storagePath?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Queue statistics.
|
|
30
|
+
*/
|
|
31
|
+
export interface QueueStats {
|
|
32
|
+
/** Total signals in queue */
|
|
33
|
+
total: number;
|
|
34
|
+
/** Signals pending sync */
|
|
35
|
+
pending: number;
|
|
36
|
+
/** Signals already synced */
|
|
37
|
+
synced: number;
|
|
38
|
+
/** Last sync attempt */
|
|
39
|
+
lastSyncAttempt?: string;
|
|
40
|
+
/** Last successful sync */
|
|
41
|
+
lastSyncSuccess?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Local file-based feedback signal queue for offline/degraded mode.
|
|
45
|
+
*/
|
|
46
|
+
export declare class OfflineFeedbackQueue {
|
|
47
|
+
private readonly filePath;
|
|
48
|
+
private store;
|
|
49
|
+
constructor(options: OfflineFeedbackQueueOptions);
|
|
50
|
+
/**
|
|
51
|
+
* Get the storage file path.
|
|
52
|
+
*/
|
|
53
|
+
getFilePath(): string;
|
|
54
|
+
/**
|
|
55
|
+
* Load the store from disk.
|
|
56
|
+
*/
|
|
57
|
+
private load;
|
|
58
|
+
/**
|
|
59
|
+
* Save the store to disk.
|
|
60
|
+
*/
|
|
61
|
+
private save;
|
|
62
|
+
/**
|
|
63
|
+
* Generate a unique ID for queued signals.
|
|
64
|
+
*/
|
|
65
|
+
private generateId;
|
|
66
|
+
/**
|
|
67
|
+
* Queue a single feedback signal.
|
|
68
|
+
* @returns The queue ID assigned to this signal
|
|
69
|
+
*/
|
|
70
|
+
enqueue(signal: SignalItem): Promise<string>;
|
|
71
|
+
/**
|
|
72
|
+
* Queue multiple feedback signals atomically.
|
|
73
|
+
* @returns Array of queue IDs assigned to the signals
|
|
74
|
+
*/
|
|
75
|
+
enqueueBatch(signals: SignalItem[]): Promise<string[]>;
|
|
76
|
+
/**
|
|
77
|
+
* Get all unsynced signals.
|
|
78
|
+
*/
|
|
79
|
+
getUnsynced(): Promise<OfflineSignal[]>;
|
|
80
|
+
/**
|
|
81
|
+
* Mark signals as synced.
|
|
82
|
+
*/
|
|
83
|
+
markSynced(ids: string[]): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Record a sync attempt (even if it failed).
|
|
86
|
+
*/
|
|
87
|
+
recordSyncAttempt(): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Clear all synced signals to save space.
|
|
90
|
+
* @returns Number of signals cleared
|
|
91
|
+
*/
|
|
92
|
+
clearSynced(): Promise<number>;
|
|
93
|
+
/**
|
|
94
|
+
* Get signal count.
|
|
95
|
+
*/
|
|
96
|
+
count(): Promise<number>;
|
|
97
|
+
/**
|
|
98
|
+
* Get queue statistics.
|
|
99
|
+
*/
|
|
100
|
+
getStats(): Promise<QueueStats>;
|
|
101
|
+
/**
|
|
102
|
+
* Clear all signals.
|
|
103
|
+
*/
|
|
104
|
+
clear(): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Convert OfflineSignal to SignalItem (strip queue metadata).
|
|
107
|
+
*/
|
|
108
|
+
static toSignalItem(offline: OfflineSignal): SignalItem;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=offline-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline-queue.d.ts","sourceRoot":"","sources":["../../src/feedback/offline-queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,MAAM,EAAE,OAAO,CAAC;CACjB;AAgBD;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,KAAK,CAAkC;gBAEnC,OAAO,EAAE,2BAA2B;IAMhD;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;YACW,IAAI;IAmBlB;;OAEG;YACW,IAAI;IAalB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;;OAGG;IACG,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBlD;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAuB5D;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAK7C;;OAEG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxC;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAQpC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAK9B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAsBrC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,UAAU;CAKxD"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offline feedback signal queue for degraded mode.
|
|
3
|
+
* Stores feedback signals locally when Hindsight is unavailable.
|
|
4
|
+
* Auto-syncs to Hindsight when connection is restored.
|
|
5
|
+
* @module feedback/offline-queue
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
8
|
+
import { dirname, join } from "node:path";
|
|
9
|
+
/**
|
|
10
|
+
* Local file-based feedback signal queue for offline/degraded mode.
|
|
11
|
+
*/
|
|
12
|
+
export class OfflineFeedbackQueue {
|
|
13
|
+
filePath;
|
|
14
|
+
store = null;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.filePath =
|
|
17
|
+
options.storagePath ??
|
|
18
|
+
join(options.projectPath, ".claude", "offline-feedback.json");
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get the storage file path.
|
|
22
|
+
*/
|
|
23
|
+
getFilePath() {
|
|
24
|
+
return this.filePath;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load the store from disk.
|
|
28
|
+
*/
|
|
29
|
+
async load() {
|
|
30
|
+
if (this.store) {
|
|
31
|
+
return this.store;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const content = await readFile(this.filePath, "utf-8");
|
|
35
|
+
this.store = JSON.parse(content);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// File doesn't exist or is invalid - create empty store
|
|
39
|
+
this.store = {
|
|
40
|
+
version: 1,
|
|
41
|
+
signals: [],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return this.store;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Save the store to disk.
|
|
48
|
+
*/
|
|
49
|
+
async save() {
|
|
50
|
+
if (!this.store)
|
|
51
|
+
return;
|
|
52
|
+
// Ensure directory exists
|
|
53
|
+
await mkdir(dirname(this.filePath), { recursive: true });
|
|
54
|
+
await writeFile(this.filePath, JSON.stringify(this.store, null, 2), "utf-8");
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Generate a unique ID for queued signals.
|
|
58
|
+
*/
|
|
59
|
+
generateId() {
|
|
60
|
+
return `signal-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Queue a single feedback signal.
|
|
64
|
+
* @returns The queue ID assigned to this signal
|
|
65
|
+
*/
|
|
66
|
+
async enqueue(signal) {
|
|
67
|
+
const store = await this.load();
|
|
68
|
+
const offlineSignal = {
|
|
69
|
+
...signal,
|
|
70
|
+
id: this.generateId(),
|
|
71
|
+
queuedAt: new Date().toISOString(),
|
|
72
|
+
synced: false,
|
|
73
|
+
};
|
|
74
|
+
store.signals.push(offlineSignal);
|
|
75
|
+
await this.save();
|
|
76
|
+
return offlineSignal.id;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Queue multiple feedback signals atomically.
|
|
80
|
+
* @returns Array of queue IDs assigned to the signals
|
|
81
|
+
*/
|
|
82
|
+
async enqueueBatch(signals) {
|
|
83
|
+
if (signals.length === 0) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
const store = await this.load();
|
|
87
|
+
const ids = [];
|
|
88
|
+
for (const signal of signals) {
|
|
89
|
+
const offlineSignal = {
|
|
90
|
+
...signal,
|
|
91
|
+
id: this.generateId(),
|
|
92
|
+
queuedAt: new Date().toISOString(),
|
|
93
|
+
synced: false,
|
|
94
|
+
};
|
|
95
|
+
store.signals.push(offlineSignal);
|
|
96
|
+
ids.push(offlineSignal.id);
|
|
97
|
+
}
|
|
98
|
+
await this.save();
|
|
99
|
+
return ids;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get all unsynced signals.
|
|
103
|
+
*/
|
|
104
|
+
async getUnsynced() {
|
|
105
|
+
const store = await this.load();
|
|
106
|
+
return store.signals.filter((s) => !s.synced);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Mark signals as synced.
|
|
110
|
+
*/
|
|
111
|
+
async markSynced(ids) {
|
|
112
|
+
const store = await this.load();
|
|
113
|
+
const idSet = new Set(ids);
|
|
114
|
+
for (const signal of store.signals) {
|
|
115
|
+
if (idSet.has(signal.id)) {
|
|
116
|
+
signal.synced = true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
store.lastSyncSuccess = new Date().toISOString();
|
|
120
|
+
await this.save();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Record a sync attempt (even if it failed).
|
|
124
|
+
*/
|
|
125
|
+
async recordSyncAttempt() {
|
|
126
|
+
const store = await this.load();
|
|
127
|
+
store.lastSyncAttempt = new Date().toISOString();
|
|
128
|
+
await this.save();
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Clear all synced signals to save space.
|
|
132
|
+
* @returns Number of signals cleared
|
|
133
|
+
*/
|
|
134
|
+
async clearSynced() {
|
|
135
|
+
const store = await this.load();
|
|
136
|
+
const before = store.signals.length;
|
|
137
|
+
store.signals = store.signals.filter((s) => !s.synced);
|
|
138
|
+
await this.save();
|
|
139
|
+
return before - store.signals.length;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get signal count.
|
|
143
|
+
*/
|
|
144
|
+
async count() {
|
|
145
|
+
const store = await this.load();
|
|
146
|
+
return store.signals.length;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get queue statistics.
|
|
150
|
+
*/
|
|
151
|
+
async getStats() {
|
|
152
|
+
const store = await this.load();
|
|
153
|
+
const pending = store.signals.filter((s) => !s.synced).length;
|
|
154
|
+
const synced = store.signals.filter((s) => s.synced).length;
|
|
155
|
+
const stats = {
|
|
156
|
+
total: store.signals.length,
|
|
157
|
+
pending,
|
|
158
|
+
synced,
|
|
159
|
+
};
|
|
160
|
+
// Only include optional properties if they have values
|
|
161
|
+
if (store.lastSyncAttempt !== undefined) {
|
|
162
|
+
stats.lastSyncAttempt = store.lastSyncAttempt;
|
|
163
|
+
}
|
|
164
|
+
if (store.lastSyncSuccess !== undefined) {
|
|
165
|
+
stats.lastSyncSuccess = store.lastSyncSuccess;
|
|
166
|
+
}
|
|
167
|
+
return stats;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Clear all signals.
|
|
171
|
+
*/
|
|
172
|
+
async clear() {
|
|
173
|
+
this.store = {
|
|
174
|
+
version: 1,
|
|
175
|
+
signals: [],
|
|
176
|
+
};
|
|
177
|
+
await this.save();
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Convert OfflineSignal to SignalItem (strip queue metadata).
|
|
181
|
+
*/
|
|
182
|
+
static toSignalItem(offline) {
|
|
183
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
184
|
+
const { id, queuedAt, synced, ...signal } = offline;
|
|
185
|
+
return signal;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=offline-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline-queue.js","sourceRoot":"","sources":["../../src/feedback/offline-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback Scorer
|
|
3
|
+
*
|
|
4
|
+
* Aggregates detection results into final fact scores and prepares
|
|
5
|
+
* feedback for storage/API submission.
|
|
6
|
+
*
|
|
7
|
+
* @module feedback/scorer
|
|
8
|
+
*/
|
|
9
|
+
import type { Detection, DetectionResults } from "./detector.js";
|
|
10
|
+
import type { SignalItem } from "../types.js";
|
|
11
|
+
export type Verdict = "used" | "ignored" | "uncertain";
|
|
12
|
+
export interface FactScore {
|
|
13
|
+
factId: string;
|
|
14
|
+
verdict: Verdict;
|
|
15
|
+
confidence: number;
|
|
16
|
+
scores: {
|
|
17
|
+
used: number;
|
|
18
|
+
ignored: number;
|
|
19
|
+
};
|
|
20
|
+
detections: Array<Detection | {
|
|
21
|
+
detectionType: string;
|
|
22
|
+
confidence: number;
|
|
23
|
+
evidence: unknown;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export interface FeedbackSummary {
|
|
27
|
+
total: number;
|
|
28
|
+
used: number;
|
|
29
|
+
ignored: number;
|
|
30
|
+
uncertain: number;
|
|
31
|
+
usageRate: number;
|
|
32
|
+
avgUsedConfidence: number;
|
|
33
|
+
avgIgnoredConfidence: number;
|
|
34
|
+
topUsed: Array<{
|
|
35
|
+
factId: string;
|
|
36
|
+
confidence: number;
|
|
37
|
+
detectionTypes: string[];
|
|
38
|
+
}>;
|
|
39
|
+
topIgnored: Array<{
|
|
40
|
+
factId: string;
|
|
41
|
+
confidence: number;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
export interface FeedbackResult {
|
|
45
|
+
success: boolean;
|
|
46
|
+
sessionId: string;
|
|
47
|
+
summary: FeedbackSummary;
|
|
48
|
+
factScores: FactScore[];
|
|
49
|
+
feedback: SignalItem[];
|
|
50
|
+
error?: string;
|
|
51
|
+
reason?: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Aggregate all detections into final fact scores
|
|
55
|
+
*/
|
|
56
|
+
export declare function aggregateDetections(detections: DetectionResults): FactScore[];
|
|
57
|
+
/**
|
|
58
|
+
* Calculate verdict for a fact based on used and ignored scores
|
|
59
|
+
*/
|
|
60
|
+
export declare function calculateVerdict(usedScore: number, ignoredScore: number): {
|
|
61
|
+
verdict: Verdict;
|
|
62
|
+
confidence: number;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Prepare feedback for Hindsight API submission
|
|
66
|
+
* Sanitizes data to ensure no sensitive information is included
|
|
67
|
+
*/
|
|
68
|
+
export declare function prepareFeedback(factScores: FactScore[], query: string): SignalItem[];
|
|
69
|
+
/**
|
|
70
|
+
* Create a summary of feedback results
|
|
71
|
+
*/
|
|
72
|
+
export declare function summarizeFeedback(factScores: FactScore[]): FeedbackSummary;
|
|
73
|
+
/**
|
|
74
|
+
* Filter feedback to only high-confidence results
|
|
75
|
+
*/
|
|
76
|
+
export declare function filterHighConfidence(factScores: FactScore[], minConfidence?: number): FactScore[];
|
|
77
|
+
/**
|
|
78
|
+
* Get detection type breakdown
|
|
79
|
+
*/
|
|
80
|
+
export declare function getDetectionBreakdown(factScores: FactScore[]): Record<string, number>;
|
|
81
|
+
//# sourceMappingURL=scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../../src/feedback/scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM9C,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,EAAE,KAAK,CAAC,SAAS,GAAG;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACjG;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC,CAAC;IACH,UAAU,EAAE,KAAK,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,eAAe,CAAC;IACzB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAaD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,GAAG,SAAS,EAAE,CAiE7E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAkB1C;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,SAAS,EAAE,EACvB,KAAK,EAAE,MAAM,GACZ,UAAU,EAAE,CASd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,eAAe,CAgE1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,SAAS,EAAE,EACvB,aAAa,SAAM,GAClB,SAAS,EAAE,CAIb;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmBrF"}
|