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.
Files changed (108) hide show
  1. package/README.md +57 -35
  2. package/dist/agents/context.d.ts.map +1 -1
  3. package/dist/agents/context.js +7 -7
  4. package/dist/agents/context.js.map +1 -1
  5. package/dist/cli/commands/feedback-stats.d.ts +10 -0
  6. package/dist/cli/commands/feedback-stats.d.ts.map +1 -0
  7. package/dist/cli/commands/feedback-stats.js +70 -0
  8. package/dist/cli/commands/feedback-stats.js.map +1 -0
  9. package/dist/cli/commands/feedback-sync.d.ts +10 -0
  10. package/dist/cli/commands/feedback-sync.d.ts.map +1 -0
  11. package/dist/cli/commands/feedback-sync.js +117 -0
  12. package/dist/cli/commands/feedback-sync.js.map +1 -0
  13. package/dist/cli/commands/index.d.ts +2 -0
  14. package/dist/cli/commands/index.d.ts.map +1 -1
  15. package/dist/cli/commands/index.js +2 -0
  16. package/dist/cli/commands/index.js.map +1 -1
  17. package/dist/cli/commands/install.d.ts.map +1 -1
  18. package/dist/cli/commands/install.js +130 -4
  19. package/dist/cli/commands/install.js.map +1 -1
  20. package/dist/cli/commands/semantic.d.ts +4 -2
  21. package/dist/cli/commands/semantic.d.ts.map +1 -1
  22. package/dist/cli/commands/semantic.js +8 -57
  23. package/dist/cli/commands/semantic.js.map +1 -1
  24. package/dist/cli/commands/status.d.ts.map +1 -1
  25. package/dist/cli/commands/status.js +0 -2
  26. package/dist/cli/commands/status.js.map +1 -1
  27. package/dist/cli/commands/sync.d.ts +4 -2
  28. package/dist/cli/commands/sync.d.ts.map +1 -1
  29. package/dist/cli/commands/sync.js +9 -250
  30. package/dist/cli/commands/sync.js.map +1 -1
  31. package/dist/cli/commands/update.d.ts.map +1 -1
  32. package/dist/cli/commands/update.js +106 -1
  33. package/dist/cli/commands/update.js.map +1 -1
  34. package/dist/cli/index.js +3 -1
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/cli/utils/output.d.ts +0 -2
  37. package/dist/cli/utils/output.d.ts.map +1 -1
  38. package/dist/cli/utils/output.js +0 -2
  39. package/dist/cli/utils/output.js.map +1 -1
  40. package/dist/client.d.ts +121 -22
  41. package/dist/client.d.ts.map +1 -1
  42. package/dist/client.js +209 -36
  43. package/dist/client.js.map +1 -1
  44. package/dist/events.d.ts +30 -1
  45. package/dist/events.d.ts.map +1 -1
  46. package/dist/events.js.map +1 -1
  47. package/dist/feedback/constants.d.ts +72 -0
  48. package/dist/feedback/constants.d.ts.map +1 -0
  49. package/dist/feedback/constants.js +145 -0
  50. package/dist/feedback/constants.js.map +1 -0
  51. package/dist/feedback/detector.d.ts +75 -0
  52. package/dist/feedback/detector.d.ts.map +1 -0
  53. package/dist/feedback/detector.js +393 -0
  54. package/dist/feedback/detector.js.map +1 -0
  55. package/dist/feedback/index.d.ts +85 -0
  56. package/dist/feedback/index.d.ts.map +1 -0
  57. package/dist/feedback/index.js +194 -0
  58. package/dist/feedback/index.js.map +1 -0
  59. package/dist/feedback/offline-queue.d.ts +110 -0
  60. package/dist/feedback/offline-queue.d.ts.map +1 -0
  61. package/dist/feedback/offline-queue.js +188 -0
  62. package/dist/feedback/offline-queue.js.map +1 -0
  63. package/dist/feedback/scorer.d.ts +81 -0
  64. package/dist/feedback/scorer.d.ts.map +1 -0
  65. package/dist/feedback/scorer.js +194 -0
  66. package/dist/feedback/scorer.js.map +1 -0
  67. package/dist/feedback/similarity.d.ts +19 -0
  68. package/dist/feedback/similarity.d.ts.map +1 -0
  69. package/dist/feedback/similarity.js +49 -0
  70. package/dist/feedback/similarity.js.map +1 -0
  71. package/dist/feedback/tracker.d.ts +104 -0
  72. package/dist/feedback/tracker.d.ts.map +1 -0
  73. package/dist/feedback/tracker.js +324 -0
  74. package/dist/feedback/tracker.js.map +1 -0
  75. package/dist/hooks/process-session.d.ts.map +1 -1
  76. package/dist/hooks/process-session.js +17 -8
  77. package/dist/hooks/process-session.js.map +1 -1
  78. package/dist/index.d.ts +9 -0
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +15 -0
  81. package/dist/index.js.map +1 -1
  82. package/dist/learn/index.d.ts.map +1 -1
  83. package/dist/learn/index.js +6 -2
  84. package/dist/learn/index.js.map +1 -1
  85. package/dist/mcp/handlers.d.ts +9 -1
  86. package/dist/mcp/handlers.d.ts.map +1 -1
  87. package/dist/mcp/handlers.js +66 -0
  88. package/dist/mcp/handlers.js.map +1 -1
  89. package/dist/mcp/server.d.ts.map +1 -1
  90. package/dist/mcp/server.js +42 -2
  91. package/dist/mcp/server.js.map +1 -1
  92. package/dist/mcp/tools.d.ts +77 -0
  93. package/dist/mcp/tools.d.ts.map +1 -1
  94. package/dist/mcp/tools.js +30 -0
  95. package/dist/mcp/tools.js.map +1 -1
  96. package/dist/mcp/types.d.ts +16 -0
  97. package/dist/mcp/types.d.ts.map +1 -1
  98. package/dist/mind.d.ts +47 -28
  99. package/dist/mind.d.ts.map +1 -1
  100. package/dist/mind.js +351 -104
  101. package/dist/mind.js.map +1 -1
  102. package/dist/offline.d.ts +111 -0
  103. package/dist/offline.d.ts.map +1 -0
  104. package/dist/offline.js +198 -0
  105. package/dist/offline.js.map +1 -0
  106. package/dist/types.d.ts +171 -1
  107. package/dist/types.d.ts.map +1 -1
  108. 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"}