claude-cognitive 0.3.4 → 0.4.1

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 (86) hide show
  1. package/README.md +52 -2
  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/init.d.ts.map +1 -1
  18. package/dist/cli/commands/init.js +32 -37
  19. package/dist/cli/commands/init.js.map +1 -1
  20. package/dist/cli/index.js +4 -2
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/client.d.ts +121 -22
  23. package/dist/client.d.ts.map +1 -1
  24. package/dist/client.js +203 -31
  25. package/dist/client.js.map +1 -1
  26. package/dist/events.d.ts +20 -0
  27. package/dist/events.d.ts.map +1 -1
  28. package/dist/events.js.map +1 -1
  29. package/dist/feedback/constants.d.ts +72 -0
  30. package/dist/feedback/constants.d.ts.map +1 -0
  31. package/dist/feedback/constants.js +145 -0
  32. package/dist/feedback/constants.js.map +1 -0
  33. package/dist/feedback/detector.d.ts +75 -0
  34. package/dist/feedback/detector.d.ts.map +1 -0
  35. package/dist/feedback/detector.js +393 -0
  36. package/dist/feedback/detector.js.map +1 -0
  37. package/dist/feedback/index.d.ts +85 -0
  38. package/dist/feedback/index.d.ts.map +1 -0
  39. package/dist/feedback/index.js +194 -0
  40. package/dist/feedback/index.js.map +1 -0
  41. package/dist/feedback/offline-queue.d.ts +110 -0
  42. package/dist/feedback/offline-queue.d.ts.map +1 -0
  43. package/dist/feedback/offline-queue.js +188 -0
  44. package/dist/feedback/offline-queue.js.map +1 -0
  45. package/dist/feedback/scorer.d.ts +81 -0
  46. package/dist/feedback/scorer.d.ts.map +1 -0
  47. package/dist/feedback/scorer.js +194 -0
  48. package/dist/feedback/scorer.js.map +1 -0
  49. package/dist/feedback/similarity.d.ts +19 -0
  50. package/dist/feedback/similarity.d.ts.map +1 -0
  51. package/dist/feedback/similarity.js +49 -0
  52. package/dist/feedback/similarity.js.map +1 -0
  53. package/dist/feedback/tracker.d.ts +104 -0
  54. package/dist/feedback/tracker.d.ts.map +1 -0
  55. package/dist/feedback/tracker.js +324 -0
  56. package/dist/feedback/tracker.js.map +1 -0
  57. package/dist/hooks/process-session.d.ts.map +1 -1
  58. package/dist/hooks/process-session.js +13 -1
  59. package/dist/hooks/process-session.js.map +1 -1
  60. package/dist/index.d.ts +7 -0
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +13 -0
  63. package/dist/index.js.map +1 -1
  64. package/dist/learn/index.d.ts.map +1 -1
  65. package/dist/learn/index.js +6 -2
  66. package/dist/learn/index.js.map +1 -1
  67. package/dist/mcp/handlers.d.ts +9 -1
  68. package/dist/mcp/handlers.d.ts.map +1 -1
  69. package/dist/mcp/handlers.js +66 -0
  70. package/dist/mcp/handlers.js.map +1 -1
  71. package/dist/mcp/server.d.ts.map +1 -1
  72. package/dist/mcp/server.js +42 -2
  73. package/dist/mcp/server.js.map +1 -1
  74. package/dist/mcp/tools.d.ts +77 -0
  75. package/dist/mcp/tools.d.ts.map +1 -1
  76. package/dist/mcp/tools.js +30 -0
  77. package/dist/mcp/tools.js.map +1 -1
  78. package/dist/mcp/types.d.ts +16 -0
  79. package/dist/mcp/types.d.ts.map +1 -1
  80. package/dist/mind.d.ts +25 -1
  81. package/dist/mind.d.ts.map +1 -1
  82. package/dist/mind.js +196 -11
  83. package/dist/mind.js.map +1 -1
  84. package/dist/types.d.ts +166 -1
  85. package/dist/types.d.ts.map +1 -1
  86. package/package.json +1 -1
@@ -0,0 +1,194 @@
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 { USED_THRESHOLD, IGNORED_THRESHOLD, NEGATIVE_SIGNAL_WEIGHT, } from "./constants.js";
10
+ /**
11
+ * Aggregate all detections into final fact scores
12
+ */
13
+ export function aggregateDetections(detections) {
14
+ const factScores = new Map();
15
+ // Process positive signals (additive)
16
+ const positiveDetections = [
17
+ ...(detections.explicit || []),
18
+ ...(detections.semantic || []),
19
+ ...(detections.behavioral || []),
20
+ ];
21
+ for (const detection of positiveDetections) {
22
+ const current = factScores.get(detection.factId) || {
23
+ factId: detection.factId,
24
+ used: 0,
25
+ ignored: 0,
26
+ detections: [],
27
+ };
28
+ // Add confidence (cap at 1.0)
29
+ current.used = Math.min(current.used + detection.confidence, 1.0);
30
+ current.detections.push(detection);
31
+ factScores.set(detection.factId, current);
32
+ }
33
+ // Process negative signals
34
+ for (const signal of detections.negative || []) {
35
+ const current = factScores.get(signal.factId) || {
36
+ factId: signal.factId,
37
+ used: 0,
38
+ ignored: 0,
39
+ detections: [],
40
+ };
41
+ // Add ignore confidence (cap at 1.0)
42
+ current.ignored = Math.min(current.ignored + signal.ignoreConfidence, 1.0);
43
+ current.detections.push({
44
+ detectionType: "negative_signals",
45
+ confidence: signal.ignoreConfidence,
46
+ evidence: { signals: signal.signals },
47
+ });
48
+ factScores.set(signal.factId, current);
49
+ }
50
+ // Calculate final verdicts
51
+ const results = [];
52
+ for (const scores of factScores.values()) {
53
+ const verdict = calculateVerdict(scores.used, scores.ignored);
54
+ results.push({
55
+ factId: scores.factId,
56
+ verdict: verdict.verdict,
57
+ confidence: verdict.confidence,
58
+ scores: {
59
+ used: scores.used,
60
+ ignored: scores.ignored,
61
+ },
62
+ detections: scores.detections,
63
+ });
64
+ }
65
+ // Sort by confidence (highest first)
66
+ results.sort((a, b) => b.confidence - a.confidence);
67
+ return results;
68
+ }
69
+ /**
70
+ * Calculate verdict for a fact based on used and ignored scores
71
+ */
72
+ export function calculateVerdict(usedScore, ignoredScore) {
73
+ // Net score: positive - (negative * weight)
74
+ // Negative signals weighted less than positive
75
+ const netScore = usedScore - (ignoredScore * NEGATIVE_SIGNAL_WEIGHT);
76
+ let verdict;
77
+ if (netScore > USED_THRESHOLD) {
78
+ verdict = "used";
79
+ }
80
+ else if (netScore < IGNORED_THRESHOLD) {
81
+ verdict = "ignored";
82
+ }
83
+ else {
84
+ verdict = "uncertain";
85
+ }
86
+ return {
87
+ verdict,
88
+ confidence: Math.abs(netScore),
89
+ };
90
+ }
91
+ // =============================================================================
92
+ // Feedback Preparation
93
+ // =============================================================================
94
+ /**
95
+ * Prepare feedback for Hindsight API submission
96
+ * Sanitizes data to ensure no sensitive information is included
97
+ */
98
+ export function prepareFeedback(factScores, query) {
99
+ return factScores
100
+ .filter((score) => score.verdict !== "uncertain")
101
+ .map((score) => ({
102
+ factId: score.factId,
103
+ signalType: score.verdict,
104
+ confidence: score.confidence,
105
+ query,
106
+ }));
107
+ }
108
+ /**
109
+ * Create a summary of feedback results
110
+ */
111
+ export function summarizeFeedback(factScores) {
112
+ const summary = {
113
+ total: factScores.length,
114
+ used: 0,
115
+ ignored: 0,
116
+ uncertain: 0,
117
+ usageRate: 0,
118
+ avgUsedConfidence: 0,
119
+ avgIgnoredConfidence: 0,
120
+ topUsed: [],
121
+ topIgnored: [],
122
+ };
123
+ let usedConfidenceSum = 0;
124
+ let ignoredConfidenceSum = 0;
125
+ for (const score of factScores) {
126
+ switch (score.verdict) {
127
+ case "used":
128
+ summary.used++;
129
+ usedConfidenceSum += score.confidence;
130
+ break;
131
+ case "ignored":
132
+ summary.ignored++;
133
+ ignoredConfidenceSum += score.confidence;
134
+ break;
135
+ default:
136
+ summary.uncertain++;
137
+ }
138
+ }
139
+ // Calculate rates and averages
140
+ if (summary.total > 0) {
141
+ summary.usageRate = summary.used / summary.total;
142
+ }
143
+ if (summary.used > 0) {
144
+ summary.avgUsedConfidence = usedConfidenceSum / summary.used;
145
+ }
146
+ if (summary.ignored > 0) {
147
+ summary.avgIgnoredConfidence = ignoredConfidenceSum / summary.ignored;
148
+ }
149
+ // Get top 5 used and ignored facts
150
+ const used = factScores
151
+ .filter((s) => s.verdict === "used")
152
+ .sort((a, b) => b.confidence - a.confidence);
153
+ const ignored = factScores
154
+ .filter((s) => s.verdict === "ignored")
155
+ .sort((a, b) => b.confidence - a.confidence);
156
+ summary.topUsed = used.slice(0, 5).map((s) => ({
157
+ factId: s.factId,
158
+ confidence: s.confidence,
159
+ detectionTypes: [...new Set(s.detections.map((d) => d.detectionType))],
160
+ }));
161
+ summary.topIgnored = ignored.slice(0, 5).map((s) => ({
162
+ factId: s.factId,
163
+ confidence: s.confidence,
164
+ }));
165
+ return summary;
166
+ }
167
+ /**
168
+ * Filter feedback to only high-confidence results
169
+ */
170
+ export function filterHighConfidence(factScores, minConfidence = 0.5) {
171
+ return factScores.filter((score) => score.verdict !== "uncertain" && score.confidence >= minConfidence);
172
+ }
173
+ /**
174
+ * Get detection type breakdown
175
+ */
176
+ export function getDetectionBreakdown(factScores) {
177
+ const breakdown = {
178
+ explicit_reference: 0,
179
+ semantic_match: 0,
180
+ file_access_correlation: 0,
181
+ task_topic_correlation: 0,
182
+ negative_signals: 0,
183
+ };
184
+ for (const score of factScores) {
185
+ for (const detection of score.detections || []) {
186
+ const detType = detection.detectionType;
187
+ if (detType && detType in breakdown && breakdown[detType] !== undefined) {
188
+ breakdown[detType] = breakdown[detType] + 1;
189
+ }
190
+ }
191
+ }
192
+ return breakdown;
193
+ }
194
+ //# sourceMappingURL=scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scorer.js","sourceRoot":"","sources":["../../src/feedback/scorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Text Similarity Functions
3
+ *
4
+ * Provides Jaccard similarity calculation for semantic matching.
5
+ *
6
+ * @module feedback/similarity
7
+ */
8
+ /**
9
+ * Calculate Jaccard similarity between two texts
10
+ * @param text1 - First text
11
+ * @param text2 - Second text
12
+ * @returns Similarity score (0-1)
13
+ */
14
+ export declare function calculateSimilarity(text1: string, text2: string): number;
15
+ /**
16
+ * Calculate Jaccard similarity between two sets
17
+ */
18
+ export declare function jaccardSimilarity(set1: Set<string>, set2: Set<string>): number;
19
+ //# sourceMappingURL=similarity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"similarity.d.ts","sourceRoot":"","sources":["../../src/feedback/similarity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAQ9E"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Text Similarity Functions
3
+ *
4
+ * Provides Jaccard similarity calculation for semantic matching.
5
+ *
6
+ * @module feedback/similarity
7
+ */
8
+ /**
9
+ * Normalize text for comparison
10
+ */
11
+ function normalizeText(text) {
12
+ return text
13
+ .toLowerCase()
14
+ .replace(/[^\w\s]/g, "") // Remove punctuation
15
+ .replace(/\s+/g, " ") // Normalize whitespace
16
+ .trim();
17
+ }
18
+ /**
19
+ * Calculate Jaccard similarity between two texts
20
+ * @param text1 - First text
21
+ * @param text2 - Second text
22
+ * @returns Similarity score (0-1)
23
+ */
24
+ export function calculateSimilarity(text1, text2) {
25
+ const words1 = new Set(normalizeText(text1).split(/\s+/).filter(Boolean));
26
+ const words2 = new Set(normalizeText(text2).split(/\s+/).filter(Boolean));
27
+ if (words1.size === 0 && words2.size === 0) {
28
+ return 1; // Both empty = identical
29
+ }
30
+ if (words1.size === 0 || words2.size === 0) {
31
+ return 0; // One empty = no similarity
32
+ }
33
+ const intersection = new Set([...words1].filter((w) => words2.has(w)));
34
+ const union = new Set([...words1, ...words2]);
35
+ return intersection.size / union.size;
36
+ }
37
+ /**
38
+ * Calculate Jaccard similarity between two sets
39
+ */
40
+ export function jaccardSimilarity(set1, set2) {
41
+ if (set1.size === 0 && set2.size === 0)
42
+ return 1;
43
+ if (set1.size === 0 || set2.size === 0)
44
+ return 0;
45
+ const intersectionSize = [...set1].filter((x) => set2.has(x)).length;
46
+ const unionSize = new Set([...set1, ...set2]).size;
47
+ return intersectionSize / unionSize;
48
+ }
49
+ //# sourceMappingURL=similarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"similarity.js","sourceRoot":"","sources":["../../src/feedback/similarity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,qBAAqB;SAC7C,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,uBAAuB;SAC5C,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,KAAa;IAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAE1E,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,CAAC,CAAC,yBAAyB;IACrC,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,CAAC,CAAC,4BAA4B;IACxC,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IAE9C,OAAO,YAAY,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAiB,EAAE,IAAiB;IACpE,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEjD,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAEnD,OAAO,gBAAgB,GAAG,SAAS,CAAC;AACtC,CAAC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Recall Session Tracker
3
+ *
4
+ * Tracks recalled facts for a session to enable feedback loop analysis.
5
+ * Writes to .claude/feedback-sessions/.recall-session.json
6
+ *
7
+ * @module feedback/tracker
8
+ */
9
+ import type { Memory } from "../types.js";
10
+ export interface RecallParams {
11
+ query: string;
12
+ queryType: "fixed" | "adaptive";
13
+ parameters: {
14
+ limit: number;
15
+ budget: string;
16
+ factTypes: string[];
17
+ timeWindow: string | null;
18
+ };
19
+ context: SessionContext;
20
+ }
21
+ export interface SessionContext {
22
+ branch: string | null;
23
+ recentFiles: string[];
24
+ projectType: string | null;
25
+ }
26
+ export interface RecalledFact {
27
+ factId: string;
28
+ text: string;
29
+ factType: string;
30
+ score: number;
31
+ position: number;
32
+ }
33
+ export interface RecallSession {
34
+ sessionId: string;
35
+ startedAt: string;
36
+ project: string;
37
+ recall: RecallParams;
38
+ factsRecalled: RecalledFact[];
39
+ totalFacts: number;
40
+ totalTokens: number;
41
+ }
42
+ export interface SessionStats {
43
+ currentSession: RecallSession | null;
44
+ archivedSessions: number;
45
+ totalFactsTracked: number;
46
+ oldestSession: string | null;
47
+ newestSession: string | null;
48
+ }
49
+ /**
50
+ * Get the path to the feedback sessions directory
51
+ */
52
+ export declare function getSessionActivityDir(projectDir: string): string;
53
+ /**
54
+ * Get the path to the recall session file
55
+ */
56
+ export declare function getRecallSessionPath(projectDir: string): string;
57
+ /**
58
+ * Create a new recall session record
59
+ */
60
+ export declare function createRecallSession(sessionId: string, projectDir: string, recallParams?: {
61
+ query?: string;
62
+ queryType?: "fixed" | "adaptive";
63
+ limit?: number;
64
+ budget?: string;
65
+ factTypes?: string[];
66
+ timeWindow?: string | null;
67
+ }): RecallSession;
68
+ /**
69
+ * Add recalled facts to session
70
+ */
71
+ export declare function addRecalledFacts(session: RecallSession, facts: Memory[]): RecallSession;
72
+ /**
73
+ * Save recall session to disk
74
+ */
75
+ export declare function saveRecallSession(session: RecallSession, projectDir: string): Promise<void>;
76
+ /**
77
+ * Load recall session from disk
78
+ */
79
+ export declare function loadRecallSession(sessionId: string | null, projectDir: string): Promise<RecallSession | null>;
80
+ /**
81
+ * Track a recall operation (convenience function combining create, add, save)
82
+ */
83
+ export declare function trackRecall(options: {
84
+ sessionId: string;
85
+ projectDir: string;
86
+ query: string;
87
+ facts: Memory[];
88
+ params?: {
89
+ queryType?: "fixed" | "adaptive";
90
+ limit?: number;
91
+ budget?: string;
92
+ factTypes?: string[];
93
+ timeWindow?: string | null;
94
+ };
95
+ }): Promise<RecallSession>;
96
+ /**
97
+ * Clean up old session data
98
+ */
99
+ export declare function cleanupOldSessions(projectDir: string, retentionDays?: number): Promise<number>;
100
+ /**
101
+ * Get statistics about tracked sessions
102
+ */
103
+ export declare function getSessionStats(projectDir: string): Promise<SessionStats>;
104
+ //# sourceMappingURL=tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/feedback/tracker.ts"],"names":[],"mappings":"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"}