squish-memory 0.8.2 → 0.9.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 (266) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.env.mcp +30 -0
  4. package/.mcp.json +2 -5
  5. package/CHANGELOG.md +111 -0
  6. package/QUICK-START.md +65 -0
  7. package/README.md +188 -530
  8. package/commands/managed-sync.ts +69 -0
  9. package/commands/mcp-server.ts +519 -0
  10. package/config/mcp-cli-fallback-policy.json +22 -0
  11. package/config/mcp-migration-map.json +22 -0
  12. package/config/mcp-mode-semantics.json +21 -0
  13. package/config/mcp-remote-auth.json +36 -0
  14. package/config/mcp-universal.schema.json +48 -0
  15. package/config/mcp.json +38 -0
  16. package/config/remote-memory-policy.json +32 -0
  17. package/dist/algorithms/merge/detection/hash-filters.js +2 -2
  18. package/dist/algorithms/merge/detection/hash-filters.js.map +1 -1
  19. package/dist/algorithms/merge/detection/two-stage-detector.d.ts +5 -2
  20. package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +1 -1
  21. package/dist/algorithms/merge/detection/two-stage-detector.js +139 -22
  22. package/dist/algorithms/merge/detection/two-stage-detector.js.map +1 -1
  23. package/dist/commands/managed-sync.d.ts +10 -0
  24. package/dist/commands/managed-sync.d.ts.map +1 -0
  25. package/dist/commands/managed-sync.js +64 -0
  26. package/dist/commands/managed-sync.js.map +1 -0
  27. package/dist/commands/mcp-server.d.ts +3 -0
  28. package/dist/commands/mcp-server.d.ts.map +1 -0
  29. package/dist/commands/mcp-server.js +389 -0
  30. package/dist/commands/mcp-server.js.map +1 -0
  31. package/dist/config.d.ts +24 -1
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +32 -1
  34. package/dist/config.js.map +1 -1
  35. package/dist/core/associations.d.ts +1 -1
  36. package/dist/core/associations.d.ts.map +1 -1
  37. package/dist/core/consolidation.d.ts +31 -0
  38. package/dist/core/consolidation.d.ts.map +1 -1
  39. package/dist/core/consolidation.js +237 -29
  40. package/dist/core/consolidation.js.map +1 -1
  41. package/dist/core/embeddings/google-multimodal.d.ts +14 -0
  42. package/dist/core/embeddings/google-multimodal.d.ts.map +1 -0
  43. package/dist/core/embeddings/google-multimodal.js +142 -0
  44. package/dist/core/embeddings/google-multimodal.js.map +1 -0
  45. package/dist/core/embeddings.d.ts +3 -2
  46. package/dist/core/embeddings.d.ts.map +1 -1
  47. package/dist/core/embeddings.js +61 -39
  48. package/dist/core/embeddings.js.map +1 -1
  49. package/dist/core/mcp/client.d.ts +17 -0
  50. package/dist/core/mcp/client.d.ts.map +1 -0
  51. package/dist/core/mcp/client.js +101 -0
  52. package/dist/core/mcp/client.js.map +1 -0
  53. package/dist/core/mcp/index.d.ts +6 -0
  54. package/dist/core/mcp/index.d.ts.map +1 -0
  55. package/dist/core/mcp/index.js +6 -0
  56. package/dist/core/mcp/index.js.map +1 -0
  57. package/dist/core/mcp/server.d.ts +18 -0
  58. package/dist/core/mcp/server.d.ts.map +1 -0
  59. package/dist/core/mcp/server.js +131 -0
  60. package/dist/core/mcp/server.js.map +1 -0
  61. package/dist/core/mcp/standalone-server.d.ts +13 -0
  62. package/dist/core/mcp/standalone-server.d.ts.map +1 -0
  63. package/dist/core/mcp/standalone-server.js +46 -0
  64. package/dist/core/mcp/standalone-server.js.map +1 -0
  65. package/dist/core/mcp/tools.d.ts +9 -0
  66. package/dist/core/mcp/tools.d.ts.map +1 -0
  67. package/dist/core/mcp/tools.js +262 -0
  68. package/dist/core/mcp/tools.js.map +1 -0
  69. package/dist/core/mcp/types.d.ts +315 -0
  70. package/dist/core/mcp/types.d.ts.map +1 -0
  71. package/dist/core/mcp/types.js +48 -0
  72. package/dist/core/mcp/types.js.map +1 -0
  73. package/dist/core/memory/categorizer.d.ts +27 -0
  74. package/dist/core/memory/categorizer.d.ts.map +1 -0
  75. package/dist/core/memory/categorizer.js +304 -0
  76. package/dist/core/memory/categorizer.js.map +1 -0
  77. package/dist/core/memory/conflict-detector.d.ts +7 -0
  78. package/dist/core/memory/conflict-detector.d.ts.map +1 -0
  79. package/dist/core/memory/conflict-detector.js +43 -0
  80. package/dist/core/memory/conflict-detector.js.map +1 -0
  81. package/dist/core/memory/context-collector.d.ts +10 -0
  82. package/dist/core/memory/context-collector.d.ts.map +1 -0
  83. package/dist/core/memory/context-collector.js +55 -0
  84. package/dist/core/memory/context-collector.js.map +1 -0
  85. package/dist/core/memory/contradiction-resolver.d.ts +40 -0
  86. package/dist/core/memory/contradiction-resolver.d.ts.map +1 -0
  87. package/dist/core/memory/contradiction-resolver.js +368 -0
  88. package/dist/core/memory/contradiction-resolver.js.map +1 -0
  89. package/dist/core/memory/edit-workflow.d.ts +19 -0
  90. package/dist/core/memory/edit-workflow.d.ts.map +1 -0
  91. package/dist/core/memory/edit-workflow.js +120 -0
  92. package/dist/core/memory/edit-workflow.js.map +1 -0
  93. package/dist/core/memory/feedback-tracker.d.ts +12 -0
  94. package/dist/core/memory/feedback-tracker.d.ts.map +1 -0
  95. package/dist/core/memory/feedback-tracker.js +151 -0
  96. package/dist/core/memory/feedback-tracker.js.map +1 -0
  97. package/dist/core/memory/hybrid-retrieval.d.ts +11 -12
  98. package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
  99. package/dist/core/memory/hybrid-retrieval.js +56 -28
  100. package/dist/core/memory/hybrid-retrieval.js.map +1 -1
  101. package/dist/core/memory/hybrid-scorer.d.ts +5 -16
  102. package/dist/core/memory/hybrid-scorer.d.ts.map +1 -1
  103. package/dist/core/memory/hybrid-scorer.js +161 -125
  104. package/dist/core/memory/hybrid-scorer.js.map +1 -1
  105. package/dist/core/memory/hybrid-search.js +53 -19
  106. package/dist/core/memory/hybrid-search.js.map +1 -1
  107. package/dist/core/memory/memories.d.ts +4 -0
  108. package/dist/core/memory/memories.d.ts.map +1 -1
  109. package/dist/core/memory/memories.js +133 -60
  110. package/dist/core/memory/memories.js.map +1 -1
  111. package/dist/core/memory/progressive-disclosure.d.ts +43 -0
  112. package/dist/core/memory/progressive-disclosure.d.ts.map +1 -0
  113. package/dist/core/memory/progressive-disclosure.js +280 -0
  114. package/dist/core/memory/progressive-disclosure.js.map +1 -0
  115. package/dist/core/memory/query-rewriter.d.ts +13 -0
  116. package/dist/core/memory/query-rewriter.d.ts.map +1 -0
  117. package/dist/core/memory/query-rewriter.js +118 -0
  118. package/dist/core/memory/query-rewriter.js.map +1 -0
  119. package/dist/core/memory/response-analyzer.d.ts +9 -0
  120. package/dist/core/memory/response-analyzer.d.ts.map +1 -0
  121. package/dist/core/memory/response-analyzer.js +61 -0
  122. package/dist/core/memory/response-analyzer.js.map +1 -0
  123. package/dist/core/memory/stats.d.ts +17 -0
  124. package/dist/core/memory/stats.d.ts.map +1 -0
  125. package/dist/core/memory/stats.js +87 -0
  126. package/dist/core/memory/stats.js.map +1 -0
  127. package/dist/core/memory/telemetry.d.ts +69 -0
  128. package/dist/core/memory/telemetry.d.ts.map +1 -0
  129. package/dist/core/memory/telemetry.js +313 -0
  130. package/dist/core/memory/telemetry.js.map +1 -0
  131. package/dist/core/memory/temporal-facts.d.ts +41 -0
  132. package/dist/core/memory/temporal-facts.d.ts.map +1 -0
  133. package/dist/core/memory/temporal-facts.js +262 -0
  134. package/dist/core/memory/temporal-facts.js.map +1 -0
  135. package/dist/core/memory/trigger-detector.d.ts +14 -0
  136. package/dist/core/memory/trigger-detector.d.ts.map +1 -0
  137. package/dist/core/memory/trigger-detector.js +42 -0
  138. package/dist/core/memory/trigger-detector.js.map +1 -0
  139. package/dist/core/memory/write-gate.d.ts +54 -0
  140. package/dist/core/memory/write-gate.d.ts.map +1 -0
  141. package/dist/core/memory/write-gate.js +210 -0
  142. package/dist/core/memory/write-gate.js.map +1 -0
  143. package/dist/core/projects.d.ts +2 -0
  144. package/dist/core/projects.d.ts.map +1 -1
  145. package/dist/core/projects.js +33 -0
  146. package/dist/core/projects.js.map +1 -1
  147. package/dist/core/scheduler/cron-scheduler.d.ts +32 -0
  148. package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -0
  149. package/dist/core/scheduler/cron-scheduler.js +238 -0
  150. package/dist/core/scheduler/cron-scheduler.js.map +1 -0
  151. package/dist/core/scheduler/heartbeat.d.ts +11 -0
  152. package/dist/core/scheduler/heartbeat.d.ts.map +1 -0
  153. package/dist/core/scheduler/heartbeat.js +73 -0
  154. package/dist/core/scheduler/heartbeat.js.map +1 -0
  155. package/dist/core/scheduler/index.d.ts +8 -0
  156. package/dist/core/scheduler/index.d.ts.map +1 -0
  157. package/dist/core/scheduler/index.js +8 -0
  158. package/dist/core/scheduler/index.js.map +1 -0
  159. package/dist/core/scheduler/job-runner.d.ts +11 -0
  160. package/dist/core/scheduler/job-runner.d.ts.map +1 -0
  161. package/dist/core/scheduler/job-runner.js +161 -0
  162. package/dist/core/scheduler/job-runner.js.map +1 -0
  163. package/dist/core/session/auto-load.d.ts +6 -0
  164. package/dist/core/session/auto-load.d.ts.map +1 -0
  165. package/dist/core/session/auto-load.js +119 -0
  166. package/dist/core/session/auto-load.js.map +1 -0
  167. package/dist/core/session/index.d.ts +7 -0
  168. package/dist/core/session/index.d.ts.map +1 -0
  169. package/dist/core/session/index.js +7 -0
  170. package/dist/core/session/index.js.map +1 -0
  171. package/dist/core/session/types.d.ts +26 -0
  172. package/dist/core/session/types.d.ts.map +1 -0
  173. package/dist/core/session/types.js +10 -0
  174. package/dist/core/session/types.js.map +1 -0
  175. package/dist/core/snapshots/comparison.d.ts.map +1 -1
  176. package/dist/core/snapshots/comparison.js +8 -2
  177. package/dist/core/snapshots/comparison.js.map +1 -1
  178. package/dist/core/utils/content-extraction.d.ts.map +1 -1
  179. package/dist/core/utils/content-extraction.js +11 -1
  180. package/dist/core/utils/content-extraction.js.map +1 -1
  181. package/dist/core/utils/summarization-helpers.d.ts.map +1 -1
  182. package/dist/core/utils/summarization-helpers.js +4 -1
  183. package/dist/core/utils/summarization-helpers.js.map +1 -1
  184. package/dist/core/utils.d.ts.map +1 -1
  185. package/dist/core/utils.js +26 -3
  186. package/dist/core/utils.js.map +1 -1
  187. package/dist/core/worker.d.ts +20 -0
  188. package/dist/core/worker.d.ts.map +1 -1
  189. package/dist/core/worker.js +86 -0
  190. package/dist/core/worker.js.map +1 -1
  191. package/dist/db/adapter.d.ts +1 -5
  192. package/dist/db/adapter.d.ts.map +1 -1
  193. package/dist/db/adapter.js +125 -12
  194. package/dist/db/adapter.js.map +1 -1
  195. package/dist/db/bootstrap.d.ts.map +1 -1
  196. package/dist/db/bootstrap.js +178 -3
  197. package/dist/db/bootstrap.js.map +1 -1
  198. package/dist/db/index.d.ts +1 -5
  199. package/dist/db/index.d.ts.map +1 -1
  200. package/dist/db/index.js +7 -4
  201. package/dist/db/index.js.map +1 -1
  202. package/dist/drizzle/schema-sqlite.d.ts +1953 -612
  203. package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
  204. package/dist/drizzle/schema-sqlite.js +134 -0
  205. package/dist/drizzle/schema-sqlite.js.map +1 -1
  206. package/dist/drizzle/schema.d.ts +684 -3
  207. package/dist/drizzle/schema.d.ts.map +1 -1
  208. package/dist/drizzle/schema.js +81 -1
  209. package/dist/drizzle/schema.js.map +1 -1
  210. package/dist/index.d.ts +3 -3
  211. package/dist/index.js +152 -13
  212. package/dist/index.js.map +1 -1
  213. package/package.json +125 -103
  214. package/scripts/build-release.sh +33 -0
  215. package/scripts/db/check-db.mjs +88 -0
  216. package/scripts/db/fix-all-columns.mjs +52 -0
  217. package/scripts/db/fix-schema-all.mjs +55 -0
  218. package/scripts/db/fix-schema-full.mjs +46 -0
  219. package/scripts/db/fix-schema.mjs +38 -0
  220. package/scripts/db/init-db.mjs +13 -0
  221. package/scripts/db/recreate-db.mjs +14 -0
  222. package/scripts/generate-mcp.mjs +264 -0
  223. package/scripts/github-release.sh +61 -0
  224. package/scripts/init-dirs.mjs +13 -0
  225. package/scripts/init-dirs.ts +15 -0
  226. package/scripts/install-mcp.mjs +116 -0
  227. package/scripts/install-web.sh +120 -0
  228. package/scripts/install.mjs +340 -0
  229. package/scripts/openclaw-bootstrap.mjs +127 -0
  230. package/scripts/package-release.sh +71 -0
  231. package/scripts/remote-preflight.mjs +62 -0
  232. package/scripts/squish-fallback.mjs +132 -0
  233. package/scripts/test/test-all-systems.mjs +139 -0
  234. package/scripts/test/test-memory-system.mjs +139 -0
  235. package/scripts/test/test-v0.5.0.mjs +210 -0
  236. package/scripts/verify-mcp.mjs +214 -0
  237. package/skills/memory-guide/SKILL.md +181 -123
  238. package/skills/squish-cli/SKILL.md +200 -0
  239. package/skills/squish-mcp/SKILL.md +311 -0
  240. package/skills/squish-memory/SKILL.md +100 -62
  241. package/skills/squish-memory/claude-desktop.json +12 -0
  242. package/skills/squish-memory/install.mjs +335 -0
  243. package/skills/squish-memory/install.sh +94 -62
  244. package/skills/squish-memory/openclaw.json +13 -0
  245. package/skills/squish-memory/opencode.json +14 -0
  246. package/skills/squish-memory/skill.json +32 -0
  247. package/dist/adapters/claude-code/capture.d.ts +0 -11
  248. package/dist/adapters/claude-code/capture.d.ts.map +0 -1
  249. package/dist/adapters/claude-code/capture.js +0 -100
  250. package/dist/adapters/claude-code/capture.js.map +0 -1
  251. package/dist/adapters/claude-code/index.d.ts +0 -5
  252. package/dist/adapters/claude-code/index.d.ts.map +0 -1
  253. package/dist/adapters/claude-code/index.js +0 -6
  254. package/dist/adapters/claude-code/index.js.map +0 -1
  255. package/dist/adapters/claude-code/injection.d.ts +0 -34
  256. package/dist/adapters/claude-code/injection.d.ts.map +0 -1
  257. package/dist/adapters/claude-code/injection.js +0 -127
  258. package/dist/adapters/claude-code/injection.js.map +0 -1
  259. package/dist/adapters/claude-code/plugin-wrapper.d.ts +0 -21
  260. package/dist/adapters/claude-code/plugin-wrapper.d.ts.map +0 -1
  261. package/dist/adapters/claude-code/plugin-wrapper.js +0 -239
  262. package/dist/adapters/claude-code/plugin-wrapper.js.map +0 -1
  263. package/dist/adapters/claude-code/types.d.ts +0 -46
  264. package/dist/adapters/claude-code/types.d.ts.map +0 -1
  265. package/dist/adapters/claude-code/types.js +0 -6
  266. package/dist/adapters/claude-code/types.js.map +0 -1
@@ -0,0 +1,368 @@
1
+ /**
2
+ * Contradiction Resolver
3
+ * Detects and auto-resolves contradictions when writing new memories
4
+ * Implements supersession logic for outdated information
5
+ */
6
+ import { eq, and, inArray } from 'drizzle-orm';
7
+ import { getDb } from '../../db/index.js';
8
+ import { getSchema } from '../../db/schema.js';
9
+ import { logger } from '../logger.js';
10
+ import { createAssociation } from '../associations.js';
11
+ /**
12
+ * Calculate temporal relationship between two time periods
13
+ * Returns: 'existing_is_newer', 'existing_is_older', 'overlapping', or 'unknown'
14
+ */
15
+ function calculateTemporalRelationship(existingValidFrom, existingValidTo, newTime) {
16
+ if (!existingValidFrom && !existingValidTo) {
17
+ return 'unknown';
18
+ }
19
+ const existingFrom = existingValidFrom ? new Date(existingValidFrom) : null;
20
+ const existingTo = existingValidTo ? new Date(existingValidTo) : null;
21
+ // If existing fact is completely in the future compared to new time
22
+ if (existingFrom && existingFrom > newTime) {
23
+ return 'existing_is_newer';
24
+ }
25
+ // If existing fact is completely in the past compared to new time
26
+ if (existingTo && existingTo < newTime) {
27
+ return 'existing_is_older';
28
+ }
29
+ // If time periods overlap or we can't determine
30
+ return 'overlapping';
31
+ }
32
+ /**
33
+ * Check if two temporal periods conflict (don't overlap reasonably)
34
+ */
35
+ function checkTemporalPeriodConflict(existingStart, existingEnd, newStart, newEnd) {
36
+ // If we don't have enough info, assume no conflict
37
+ if (!existingStart || !existingEnd) {
38
+ return false;
39
+ }
40
+ const existingStartDate = new Date(existingStart);
41
+ const existingEndDate = new Date(existingEnd);
42
+ // Normalize newEnd (use distant future if null)
43
+ const normalizedNewEnd = newEnd || new Date(8640000000000000); // Far future
44
+ // Check if periods overlap
45
+ const overlaps = !(existingStartDate > normalizedNewEnd ||
46
+ existingEndDate < newStart);
47
+ // Conflict if they don't overlap
48
+ return !overlaps;
49
+ }
50
+ // Patterns that indicate updated/corrected information
51
+ const UPDATE_PATTERNS = [
52
+ /\b(now|currently|actually|in fact|correct(ed)?|update(d)?)\b/gi,
53
+ /\b(changed to|switched to|moved to)\b/gi,
54
+ /\b(formerly|previously|used to be)\b/gi,
55
+ /\binstead of\b/gi,
56
+ /\b(no longer|not anymore)\b/gi,
57
+ /\b(as of|starting|beginning|from now|effective)\s+(\d{4}|\w+\s+\d{1,2})/gi, // Temporal updates
58
+ ];
59
+ // Negation patterns
60
+ const NEGATION_PATTERNS = [
61
+ /\b(not|no|never|don't|doesn't|didn't|won't|wouldn't|shouldn't|can't|cannot)\b/gi,
62
+ ];
63
+ // Temporal sensitivity patterns - content that is likely time-sensitive
64
+ const TEMPORAL_SENSITIVITY_PATTERNS = [
65
+ /\b(date|time|version|release|deadline|schedule|timeline)\b/i,
66
+ /\b(\d{4}|january|february|march|april|may|june|july|august|september|october|november|december)\b/i,
67
+ /\b(today|tomorrow|yesterday|next\s+week|last\s+week|this\s+week)\b/i,
68
+ ];
69
+ // Key entity extraction for contradiction detection
70
+ function extractKeyEntities(content) {
71
+ // Simple extraction of capitalized phrases and key terms
72
+ const entities = [];
73
+ // Match capitalized multi-word phrases (likely proper nouns)
74
+ const properNouns = content.match(/\b[A-Z][a-z]+(?:\s+[A-Z][a-z]+)+\b/g) || [];
75
+ entities.push(...properNouns);
76
+ // Match quoted strings (often important values)
77
+ const quoted = content.match(/"([^"]+)"|'([^']+)'/g) || [];
78
+ entities.push(...quoted.map(q => q.replace(/['"]/g, '')));
79
+ // Match key-value patterns
80
+ const keyValues = content.match(/(\w+)\s*[=:]\s*(\S+)/g) || [];
81
+ entities.push(...keyValues);
82
+ return [...new Set(entities)];
83
+ }
84
+ // Calculate content similarity (Jaccard on words)
85
+ function calculateSimilarity(a, b) {
86
+ const tokensA = new Set(a.toLowerCase().split(/\s+/).filter(t => t.length > 2));
87
+ const tokensB = new Set(b.toLowerCase().split(/\s+/).filter(t => t.length > 2));
88
+ const intersection = new Set([...tokensA].filter(x => tokensB.has(x)));
89
+ const union = new Set([...tokensA, ...tokensB]);
90
+ return union.size > 0 ? intersection.size / union.size : 0;
91
+ }
92
+ // Check if content has negation
93
+ function hasNegation(content) {
94
+ return NEGATION_PATTERNS.some(pattern => pattern.test(content));
95
+ }
96
+ // Check if content indicates an update
97
+ function hasUpdateIndicator(content) {
98
+ return UPDATE_PATTERNS.some(pattern => pattern.test(content));
99
+ }
100
+ // Extract the "subject" of a memory (what it's about)
101
+ function extractSubject(content) {
102
+ // Take first significant clause
103
+ const sentences = content.split(/[.!?\n]/);
104
+ const firstSentence = sentences[0]?.trim() || content;
105
+ // Limit to first 100 chars for subject matching
106
+ return firstSentence.substring(0, 100).toLowerCase();
107
+ }
108
+ /**
109
+ * Detect contradictions between new memory and existing memories
110
+ */
111
+ export async function detectContradictions(check) {
112
+ const result = {
113
+ hasContradiction: false,
114
+ supersededMemories: [],
115
+ confidence: 0,
116
+ reason: '',
117
+ };
118
+ try {
119
+ const db = await getDb();
120
+ const schema = await getSchema();
121
+ // Get memories from same project with similar content
122
+ const whereClause = check.projectId
123
+ ? eq(schema.memories.projectId, check.projectId)
124
+ : undefined;
125
+ const existingMemories = await db
126
+ .select()
127
+ .from(schema.memories)
128
+ .where(whereClause)
129
+ .limit(100);
130
+ if (existingMemories.length === 0) {
131
+ return result;
132
+ }
133
+ const newSubject = extractSubject(check.newContent);
134
+ const newEntities = extractKeyEntities(check.newContent);
135
+ const newHasNegation = hasNegation(check.newContent);
136
+ const newHasUpdate = hasUpdateIndicator(check.newContent);
137
+ const toSupersede = [];
138
+ let maxConfidence = 0;
139
+ let reasons = [];
140
+ for (const existing of existingMemories) {
141
+ // Skip already superseded memories
142
+ if (existing.status === 'superseded' || existing.status === 'merged') {
143
+ continue;
144
+ }
145
+ // Skip protected memories
146
+ if (existing.isProtected) {
147
+ continue;
148
+ }
149
+ const existingSubject = extractSubject(existing.content);
150
+ const similarity = calculateSimilarity(check.newContent, existing.content);
151
+ const subjectSimilarity = calculateSimilarity(newSubject, existingSubject);
152
+ // Check for entity overlap
153
+ const existingEntities = extractKeyEntities(existing.content);
154
+ const entityOverlap = newEntities.filter(e => existingEntities.some(ee => ee.toLowerCase().includes(e.toLowerCase()) ||
155
+ e.toLowerCase().includes(ee.toLowerCase())));
156
+ // Calculate temporal relationship between memories
157
+ const temporalRelationship = calculateTemporalRelationship(existing.validFrom, existing.validTo, new Date() // current time for new memory
158
+ );
159
+ // Detect contradiction scenarios with temporal awareness
160
+ // Scenario 1: High similarity with negation in new content
161
+ if (similarity > 0.5 && newHasNegation && subjectSimilarity > 0.4) {
162
+ // Adjust confidence based on temporal relevance
163
+ let temporalFactor = 1.0;
164
+ if (temporalRelationship === 'existing_is_newer') {
165
+ temporalFactor = 0.7; // Lower confidence if existing is newer
166
+ }
167
+ else if (temporalRelationship === 'existing_is_older') {
168
+ temporalFactor = 1.2; // Higher confidence if existing is older
169
+ }
170
+ toSupersede.push(existing.id);
171
+ maxConfidence = Math.max(maxConfidence, similarity * 0.9 * temporalFactor);
172
+ reasons.push(`negation of similar content (${(similarity * 100).toFixed(0)}% similar)`);
173
+ continue;
174
+ }
175
+ // Scenario 2: Update indicator with overlapping subject
176
+ if (newHasUpdate && subjectSimilarity > 0.5) {
177
+ // Boost confidence for updates when existing is older
178
+ let temporalFactor = 1.0;
179
+ if (temporalRelationship === 'existing_is_older') {
180
+ temporalFactor = 1.3; // Higher confidence for updating older info
181
+ }
182
+ toSupersede.push(existing.id);
183
+ maxConfidence = Math.max(maxConfidence, subjectSimilarity * 0.85 * temporalFactor);
184
+ reasons.push(`update to existing information`);
185
+ continue;
186
+ }
187
+ // Scenario 3: Same type, high subject similarity, different conclusion
188
+ if (existing.type === check.newType && subjectSimilarity > 0.6) {
189
+ // Check if conclusions differ
190
+ const existingHasNegation = hasNegation(existing.content);
191
+ // XOR: one has negation, other doesn't
192
+ if (newHasNegation !== existingHasNegation) {
193
+ // Adjust confidence based on temporal relationship
194
+ let temporalFactor = 1.0;
195
+ if (temporalRelationship === 'existing_is_newer') {
196
+ temporalFactor = 0.8; // Lower confidence if contradicting newer info
197
+ }
198
+ else if (temporalRelationship === 'existing_is_older') {
199
+ temporalFactor = 1.1; // Higher confidence if contradicting older info
200
+ }
201
+ toSupersede.push(existing.id);
202
+ maxConfidence = Math.max(maxConfidence, subjectSimilarity * 0.8 * temporalFactor);
203
+ reasons.push(`contradicting statement about same topic`);
204
+ continue;
205
+ }
206
+ }
207
+ // Scenario 4: Entity overlap with correction signals
208
+ if (entityOverlap.length >= 2 && similarity > 0.3) {
209
+ const correctionSignals = /\b(fixed|changed|updated|replaced|removed|added)\b/i.test(check.newContent);
210
+ if (correctionSignals) {
211
+ // Consider temporal relevance for corrections
212
+ let temporalFactor = 1.0;
213
+ if (temporalRelationship === 'existing_is_older') {
214
+ temporalFactor = 1.2; // Higher confidence for correcting older info
215
+ }
216
+ toSupersede.push(existing.id);
217
+ maxConfidence = Math.max(maxConfidence, 0.75 * temporalFactor);
218
+ reasons.push(`correction involving ${entityOverlap.slice(0, 2).join(', ')}`);
219
+ continue;
220
+ }
221
+ }
222
+ // Scenario 5: Very high similarity (near-duplicate) - supersede older
223
+ if (similarity > 0.85) {
224
+ // Prefer to supersede older memories with newer ones
225
+ let temporalFactor = 1.0;
226
+ if (temporalRelationship === 'existing_is_older') {
227
+ temporalFactor = 1.1; // Slight boost for superseding older
228
+ }
229
+ else if (temporalRelationship === 'existing_is_newer') {
230
+ temporalFactor = 0.9; // Slight reduction for superseding newer
231
+ }
232
+ toSupersede.push(existing.id);
233
+ maxConfidence = Math.max(maxConfidence, similarity * temporalFactor);
234
+ reasons.push(`near-duplicate replacement`);
235
+ continue;
236
+ }
237
+ // Scenario 6: Temporal inconsistency - same subject but different time periods
238
+ if (subjectSimilarity > 0.7 && similarity > 0.4 &&
239
+ existing.validFrom && existing.validTo) {
240
+ // Check if temporal periods don't overlap reasonably
241
+ const newValidFrom = new Date(); // When we learned this
242
+ const newValidTo = null; // Open-ended by default
243
+ const hasTemporalConflict = checkTemporalPeriodConflict(existing.validFrom, existing.validTo, newValidFrom, newValidTo);
244
+ if (hasTemporalConflict) {
245
+ toSupersede.push(existing.id);
246
+ maxConfidence = Math.max(maxConfidence, 0.8);
247
+ reasons.push(`temporal inconsistency with existing fact`);
248
+ continue;
249
+ }
250
+ }
251
+ }
252
+ if (toSupersede.length > 0) {
253
+ result.hasContradiction = true;
254
+ result.supersededMemories = [...new Set(toSupersede)]; // Dedupe
255
+ result.confidence = maxConfidence;
256
+ result.reason = reasons[0] || 'contradiction detected';
257
+ }
258
+ }
259
+ catch (error) {
260
+ logger.error('Error detecting contradictions', error);
261
+ }
262
+ return result;
263
+ }
264
+ /**
265
+ * Apply supersession to memories - archive old ones and create associations
266
+ */
267
+ export async function applySupersession(newMemoryId, supersededIds, confidence) {
268
+ if (supersededIds.length === 0)
269
+ return;
270
+ try {
271
+ const db = await getDb();
272
+ const schema = await getSchema();
273
+ const now = new Date();
274
+ // Update superseded memories
275
+ await db
276
+ .update(schema.memories)
277
+ .set({
278
+ status: 'superseded',
279
+ supersededBy: newMemoryId,
280
+ supersededAt: now,
281
+ updatedAt: now,
282
+ })
283
+ .where(inArray(schema.memories.id, supersededIds));
284
+ // Create associations for traceability
285
+ for (const oldId of supersededIds) {
286
+ await createAssociation(newMemoryId, oldId, 'supersedes', confidence);
287
+ }
288
+ logger.info('Applied supersession', {
289
+ newMemoryId,
290
+ supersededCount: supersededIds.length,
291
+ confidence,
292
+ });
293
+ }
294
+ catch (error) {
295
+ logger.error('Error applying supersession', error);
296
+ }
297
+ }
298
+ /**
299
+ * Check for temporal contradictions (facts that are no longer valid)
300
+ */
301
+ export async function checkTemporalContradictions(content, projectId) {
302
+ const supersededIds = [];
303
+ try {
304
+ // Look for temporal update patterns
305
+ const temporalUpdates = content.match(/\b(as of|starting|beginning|from now|effective)\s+(\d{4}|\w+\s+\d{1,2})/gi);
306
+ if (!temporalUpdates || temporalUpdates.length === 0) {
307
+ return supersededIds;
308
+ }
309
+ const db = await getDb();
310
+ const schema = await getSchema();
311
+ // Find memories with overlapping subject but older validTo dates
312
+ const subject = extractSubject(content);
313
+ const whereClause = projectId
314
+ ? and(eq(schema.memories.projectId, projectId), eq(schema.memories.status, 'active'))
315
+ : eq(schema.memories.status, 'active');
316
+ const candidates = await db
317
+ .select()
318
+ .from(schema.memories)
319
+ .where(whereClause)
320
+ .limit(50);
321
+ for (const candidate of candidates) {
322
+ const candidateSubject = extractSubject(candidate.content);
323
+ const similarity = calculateSimilarity(subject, candidateSubject);
324
+ if (similarity > 0.5 && candidate.validTo) {
325
+ const validToDate = new Date(candidate.validTo);
326
+ const now = new Date();
327
+ // If the candidate's validity period has passed
328
+ if (validToDate < now) {
329
+ supersededIds.push(candidate.id);
330
+ }
331
+ }
332
+ }
333
+ }
334
+ catch (error) {
335
+ logger.error('Error checking temporal contradictions', error);
336
+ }
337
+ return supersededIds;
338
+ }
339
+ /**
340
+ * Integrated contradiction resolution for the write path
341
+ * Call this before storing a new memory
342
+ */
343
+ export async function resolveContradictions(content, type, projectId) {
344
+ // Detect standard contradictions
345
+ const contradictionResult = await detectContradictions({
346
+ newContent: content,
347
+ newType: type,
348
+ projectId,
349
+ });
350
+ // Also check temporal contradictions
351
+ const temporalSuperseded = await checkTemporalContradictions(content, projectId);
352
+ // Combine results
353
+ const allSuperseded = [
354
+ ...new Set([
355
+ ...contradictionResult.supersededMemories,
356
+ ...temporalSuperseded,
357
+ ]),
358
+ ];
359
+ const maxConfidence = Math.max(contradictionResult.confidence, temporalSuperseded.length > 0 ? 0.7 : 0);
360
+ return {
361
+ shouldProceed: true, // Always proceed, but track supersessions
362
+ supersededIds: allSuperseded,
363
+ confidence: maxConfidence,
364
+ reason: contradictionResult.reason ||
365
+ (temporalSuperseded.length > 0 ? 'temporal supersession' : ''),
366
+ };
367
+ }
368
+ //# sourceMappingURL=contradiction-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contradiction-resolver.js","sourceRoot":"","sources":["../../../core/memory/contradiction-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface EditProposal {
2
+ id: string;
3
+ memoryId: string;
4
+ currentContent: string;
5
+ proposedContent: string;
6
+ reason: string;
7
+ conflictWarnings: string[];
8
+ status: 'pending' | 'approved' | 'rejected' | 'expired';
9
+ version: number;
10
+ createdAt: Date;
11
+ reviewedAt?: Date;
12
+ reviewNotes?: string;
13
+ }
14
+ export declare function createEditProposal(memoryId: string, currentContent: string, proposedContent: string, reason: string, userId?: string): Promise<EditProposal>;
15
+ export declare function approveEditProposal(proposalId: string): Promise<boolean>;
16
+ export declare function rejectEditProposal(proposalId: string, reviewNotes: string): Promise<boolean>;
17
+ export declare function detectConflicts(memoryId: string, proposedContent: string): Promise<string[]>;
18
+ export declare function getEditProposals(memoryId?: string, status?: 'pending' | 'approved' | 'rejected'): Promise<EditProposal[]>;
19
+ //# sourceMappingURL=edit-workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-workflow.d.ts","sourceRoot":"","sources":["../../../core/memory/edit-workflow.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CAsCvB;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4B9E;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUlG;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA0ClG;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAC3C,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB"}
@@ -0,0 +1,120 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { eq, and, sql } from 'drizzle-orm';
3
+ import { getDb } from '../../db/index.js';
4
+ import { getSchema } from '../../db/schema.js';
5
+ import { createDatabaseClient } from '../../core/database.js';
6
+ export async function createEditProposal(memoryId, currentContent, proposedContent, reason, userId) {
7
+ const db = createDatabaseClient(await getDb());
8
+ const schema = await getSchema();
9
+ const { memoryEditProposals } = schema;
10
+ const proposalId = randomUUID();
11
+ const now = new Date();
12
+ await db.insert(memoryEditProposals).values({
13
+ id: proposalId,
14
+ memoryId,
15
+ currentContent,
16
+ proposedContent,
17
+ reason,
18
+ conflictWarnings: [],
19
+ status: 'pending',
20
+ version: 1,
21
+ createdAt: now,
22
+ userId,
23
+ });
24
+ // Run conflict detection
25
+ const conflicts = await detectConflicts(memoryId, proposedContent);
26
+ await db.update(memoryEditProposals)
27
+ .set({ conflictWarnings: conflicts })
28
+ .where(eq(memoryEditProposals.id, proposalId));
29
+ return {
30
+ id: proposalId,
31
+ memoryId,
32
+ currentContent,
33
+ proposedContent,
34
+ reason,
35
+ conflictWarnings: conflicts,
36
+ status: 'pending',
37
+ version: 1,
38
+ createdAt: now,
39
+ };
40
+ }
41
+ export async function approveEditProposal(proposalId) {
42
+ const db = createDatabaseClient(await getDb());
43
+ const schema = await getSchema();
44
+ const { memoryEditProposals, memories } = schema;
45
+ // Get proposal
46
+ const proposal = await db.select()
47
+ .from(memoryEditProposals)
48
+ .where(eq(memoryEditProposals.id, proposalId))
49
+ .limit(1);
50
+ if (proposal.length === 0)
51
+ return false;
52
+ // Update memory content
53
+ await db.update(memories)
54
+ .set({
55
+ content: proposal[0].proposedContent,
56
+ version: sql `${memories.version} + 1`,
57
+ updatedAt: new Date()
58
+ })
59
+ .where(eq(memories.id, proposal[0].memoryId));
60
+ // Mark proposal as approved
61
+ await db.update(memoryEditProposals)
62
+ .set({ status: 'approved', reviewedAt: new Date() })
63
+ .where(eq(memoryEditProposals.id, proposalId));
64
+ return true;
65
+ }
66
+ export async function rejectEditProposal(proposalId, reviewNotes) {
67
+ const db = createDatabaseClient(await getDb());
68
+ const schema = await getSchema();
69
+ const { memoryEditProposals } = schema;
70
+ await db.update(memoryEditProposals)
71
+ .set({ status: 'rejected', reviewNotes, reviewedAt: new Date() })
72
+ .where(eq(memoryEditProposals.id, proposalId));
73
+ return true;
74
+ }
75
+ export async function detectConflicts(memoryId, proposedContent) {
76
+ const db = createDatabaseClient(await getDb());
77
+ const schema = await getSchema();
78
+ const { memories } = schema;
79
+ // Get current memory
80
+ const currentMemory = await db.select()
81
+ .from(memories)
82
+ .where(eq(memories.id, memoryId))
83
+ .limit(1);
84
+ if (currentMemory.length === 0)
85
+ return [];
86
+ const conflicts = [];
87
+ // Check for temporal contradictions
88
+ if (currentMemory[0].validFrom && currentMemory[0].validTo) {
89
+ const now = new Date();
90
+ if (now < new Date(currentMemory[0].validFrom) || now > new Date(currentMemory[0].validTo)) {
91
+ conflicts.push('Current time is outside validity period');
92
+ }
93
+ }
94
+ // Check for semantic contradictions with other memories
95
+ const similarMemories = await db.select()
96
+ .from(memories)
97
+ .where(and(eq(memories.projectId, currentMemory[0].projectId), sql `memories.id != ${memoryId}`, sql `memories.content ILIKE ${proposedContent}`))
98
+ .limit(5);
99
+ for (const memory of similarMemories) {
100
+ if (memory.id !== memoryId) {
101
+ conflicts.push(`Potential contradiction with memory ${memory.id}`);
102
+ }
103
+ }
104
+ return conflicts;
105
+ }
106
+ export async function getEditProposals(memoryId, status) {
107
+ const db = createDatabaseClient(await getDb());
108
+ const schema = await getSchema();
109
+ const { memoryEditProposals } = schema;
110
+ let query = db.select().from(memoryEditProposals);
111
+ if (memoryId) {
112
+ query = query.where(eq(memoryEditProposals.memoryId, memoryId));
113
+ }
114
+ if (status) {
115
+ query = query.where(eq(memoryEditProposals.status, status));
116
+ }
117
+ const proposals = await query;
118
+ return proposals;
119
+ }
120
+ //# sourceMappingURL=edit-workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-workflow.js","sourceRoot":"","sources":["../../../core/memory/edit-workflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** Feedback Tracker - Track memory usage in responses for Echo/Fizzle loop */
2
+ export declare function recordInjection(sessionId: string, memoryIds: string[], memoryContent: Map<string, string>): Promise<void>;
3
+ export declare function analyzeAndRecordFeedback(sessionId: string, responseText: string): Promise<void>;
4
+ export declare function updateRetrievalPriority(memoryId: string, delta: number): Promise<void>;
5
+ export declare function getMemoryFeedbackStats(memoryId: string): Promise<{
6
+ totalInjections: number;
7
+ totalReferences: number;
8
+ echoRate: number;
9
+ averagePriorityDelta: number;
10
+ }>;
11
+ export declare function cleanupInjectionTracker(maxAgeMs?: number): void;
12
+ //# sourceMappingURL=feedback-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-tracker.d.ts","sourceRoot":"","sources":["../../../core/memory/feedback-tracker.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAiB9E,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Df;AAaD,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB5F;AAED,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CAAC,CAuBD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,GAAE,MAAgB,GAAG,IAAI,CAOxE"}