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,304 @@
1
+ const MEMORY_TYPE_PATTERNS = [
2
+ {
3
+ type: 'decision',
4
+ patterns: [
5
+ /\b(i\s+(?:decided|chose|went\s+with|selected|picked)|we\s+(?:decided|chose|went\s+with)|the\s+(?:decision|choice)\s+(?:is|was)|let's\s+go\s+with|going\s+with\s+\w+)\b/i,
6
+ /\b(over\s+the\s+other|instead\s+of|x\s+over\s+y|better\s+to|best\s+(?:option|choice|approach))\b/i,
7
+ /\b(final\s+decision|decided\s+to|make\s+a\s+decision)\b/i,
8
+ ],
9
+ weight: 3,
10
+ },
11
+ {
12
+ type: 'preference',
13
+ patterns: [
14
+ /\b(i\s+(?:prefer|like|hate|dislike|love)|my\s+(?:preference|favorite)|i'd\s+rather|i\s+(?:always|never)\s+)\b/i,
15
+ /\b(in\s+general|i\s+tend\s+to|i\s+usually|i\s+typically)\b/i,
16
+ /\b(better\s+to|better\s+if|nice\s+to\s+have|prefer\s+)\b/i,
17
+ ],
18
+ weight: 2,
19
+ },
20
+ {
21
+ type: 'context',
22
+ patterns: [
23
+ /\b(remember\s+that|keep\s+in\s+mind|note\s+that|important:|from\s+now\s+on|going\s+forward)\b/i,
24
+ /\b(standard\s+(?:practice|workflow|approach)|we\s+(?:always|usually)\s+|never\s+forget)\b/i,
25
+ /\b(reminder:|warning:|caution:|pro-tip:|tip:\s*)\b/i,
26
+ ],
27
+ weight: 2,
28
+ },
29
+ {
30
+ type: 'fact',
31
+ patterns: [
32
+ /\b(is|are|was|were|has|have|uses?|depends\s+on|requires?|located\s+at|sits?\s+on)\b/i,
33
+ /\b(the\s+\w+\s+(?:file|directory|module|class|function|variable|config|setting))\b/i,
34
+ /\b(in\s+the|at\s+location|under\s+path)\b/i,
35
+ ],
36
+ weight: 1,
37
+ },
38
+ ];
39
+ const TAG_CATEGORIES = {
40
+ 'language': [
41
+ /\b(typescript|javascript|python|rust|go|java|c\+\+|c#|ruby|php|swift|kotlin|scala|elixir|clojure|haskell)\b/gi,
42
+ ],
43
+ 'framework': [
44
+ /\b(react|vue|angular|svelte|nextjs|nuxt|express|fastify|nestjs|django|flask|spring|rails|laravel|\.net|unity|unreal)\b/gi,
45
+ ],
46
+ 'tool': [
47
+ /\b(docker|kubernetes|git|github|gitlab|jenkins|travis|github\s+actions|terraform|ansible|puppet|chef)\b/gi,
48
+ ],
49
+ 'database': [
50
+ /\b(postgresql|postgres|mysql|mongodb|redis|sqlite|elasticsearch|cassandra|dynamodb|neo4j|graphQL|prisma|drizzle)\b/gi,
51
+ ],
52
+ 'concept': [
53
+ /\b(api|rest|graphql|websocket|oauth|jwt|ssl|tls|https?|crud|tdd|bdd|pipeline|microservices|serverless)\b/gi,
54
+ ],
55
+ 'project': [
56
+ /\b(architecture|design|pattern|structure|directory|folder|file|module|component|service|controller|route|handler)\b/gi,
57
+ ],
58
+ 'workflow': [
59
+ /\b(review|pr|merge|deploy|build|test|debug|optimize|refactor|legacy|deprecated|migration|upgrade)\b/gi,
60
+ ],
61
+ 'error': [
62
+ /\b(error|bug|issue|exception|fallback|failure|crash|timeout|panic|assert|warn)\b/gi,
63
+ ],
64
+ };
65
+ const HIERARCHICAL_TAG_PREFIXES = {
66
+ 'lang:': 'language',
67
+ 'fw:': 'framework',
68
+ 'db:': 'database',
69
+ 'tool:': 'tool',
70
+ 'concept:': 'concept',
71
+ 'proj:': 'project',
72
+ 'wf:': 'workflow',
73
+ 'file:': 'file',
74
+ 'dir:': 'directory',
75
+ };
76
+ export async function categorizeMemory(content, existingTags = []) {
77
+ const typeScores = {
78
+ observation: 0,
79
+ fact: 0,
80
+ decision: 0,
81
+ context: 0,
82
+ preference: 0,
83
+ };
84
+ for (const { type, patterns, weight } of MEMORY_TYPE_PATTERNS) {
85
+ for (const pattern of patterns) {
86
+ if (pattern.test(content)) {
87
+ typeScores[type] += weight;
88
+ }
89
+ }
90
+ }
91
+ const sortedTypes = Object.entries(typeScores)
92
+ .sort(([, a], [, b]) => b - a);
93
+ const suggestedType = sortedTypes[0][1] > 0
94
+ ? sortedTypes[0][0]
95
+ : 'observation';
96
+ const tagScores = await scoreAndSuggestTags(content, existingTags);
97
+ const suggestedTags = tagScores
98
+ .filter(t => t.score >= 0.3)
99
+ .sort((a, b) => b.score - a.score)
100
+ .slice(0, 5)
101
+ .map(t => t.tag);
102
+ const hierarchicalTags = suggestedTags.map((tag, idx) => {
103
+ const score = tagScores[idx]?.score ?? 0;
104
+ const category = tagScores[idx]?.category ?? 'general';
105
+ const prefix = Object.entries(HIERARCHICAL_TAG_PREFIXES).find(([, v]) => v === category)?.[0] ?? '';
106
+ return prefix ? `${prefix}${tag}` : tag;
107
+ });
108
+ const concepts = extractConcepts(content);
109
+ const fileScopes = extractFileScopes(content);
110
+ const maxScore = sortedTypes[0][1];
111
+ const confidence = Math.min(maxScore / 5, 1);
112
+ return {
113
+ suggestedType,
114
+ suggestedTags,
115
+ hierarchicalTags,
116
+ concepts,
117
+ fileScopes,
118
+ confidence,
119
+ };
120
+ }
121
+ async function scoreAndSuggestTags(content, existingTags) {
122
+ const contentLower = content.toLowerCase();
123
+ const existingLower = new Set(existingTags.map(t => t.toLowerCase()));
124
+ const allScores = [];
125
+ for (const [category, patterns] of Object.entries(TAG_CATEGORIES)) {
126
+ const matches = [];
127
+ for (const pattern of patterns) {
128
+ const found = contentLower.match(pattern);
129
+ if (found) {
130
+ matches.push(...found.map(m => m.toLowerCase()));
131
+ }
132
+ }
133
+ const uniqueMatches = [...new Set(matches)];
134
+ for (const match of uniqueMatches) {
135
+ const score = calculateTagScore(match, content, category);
136
+ const isNew = !existingLower.has(match);
137
+ allScores.push({
138
+ tag: match,
139
+ score: isNew ? score : score * 0.5,
140
+ isNew,
141
+ category,
142
+ });
143
+ }
144
+ }
145
+ const projectTags = extractProjectTags(content);
146
+ for (const tag of projectTags) {
147
+ allScores.push({
148
+ tag,
149
+ score: 0.7,
150
+ isNew: !existingLower.has(tag.toLowerCase()),
151
+ category: 'project',
152
+ });
153
+ }
154
+ return allScores;
155
+ }
156
+ function calculateTagScore(tag, content, category) {
157
+ const tagLength = tag.length;
158
+ const contentLower = content.toLowerCase();
159
+ const tagLower = tag.toLowerCase();
160
+ const occurrences = (contentLower.match(new RegExp(tagLower, 'g')) || []).length;
161
+ const density = occurrences * tagLength / content.length;
162
+ const categoryBonus = {
163
+ 'language': 1.2,
164
+ 'framework': 1.1,
165
+ 'database': 1.1,
166
+ 'tool': 1.0,
167
+ 'concept': 0.9,
168
+ 'project': 0.8,
169
+ 'workflow': 0.9,
170
+ }[category] ?? 1.0;
171
+ let score = Math.min(density * 10 * categoryBonus, 1);
172
+ if (occurrences > 1) {
173
+ score = Math.min(score + 0.2, 1);
174
+ }
175
+ return Math.max(score, 0.1);
176
+ }
177
+ function extractConcepts(content) {
178
+ const concepts = [];
179
+ const pattern = /\b([a-z]+[A-Z][a-zA-Z0-9]*|[A-Z]+[a-z]+[A-Z][a-zA-Z0-9]*)\b/g;
180
+ const matches = content.match(pattern);
181
+ if (matches) {
182
+ const unique = [...new Set(matches)];
183
+ concepts.push(...unique.slice(0, 5));
184
+ }
185
+ const knownConcepts = [
186
+ 'api', 'cli', 'sdk', 'ui', 'ux', 'ide', 'orm', 'mvc', 'crud', 'api',
187
+ 'auth', 'jwt', 'oauth', 'rest', 'grpc', 'websocket', 'graphql',
188
+ ];
189
+ const found = knownConcepts.filter(c => new RegExp(`\\b${c}\\b`, 'i').test(content));
190
+ return [...new Set([...concepts, ...found])].slice(0, 8);
191
+ }
192
+ function extractFileScopes(content) {
193
+ const scopes = [];
194
+ const pathPatterns = [
195
+ /(['"])(\/[\w\-\.\/]+(?:\.[a-z]+)?)(['"])/g,
196
+ /(?:from|import|require)\s+['"]([\w\-\.\/]+)['"]/g,
197
+ /<([\w\-\.\/]+)(?:\.[a-z]+)?>/g,
198
+ /file:\s*([\w\-\.\/]+)/gi,
199
+ /in\s+([\w\-\.\/]+\.[a-z]+)/gi,
200
+ ];
201
+ for (const pattern of pathPatterns) {
202
+ let match;
203
+ while ((match = pattern.exec(content)) !== null) {
204
+ const path = match[1] || match[2] || match[3];
205
+ if (path && path.length < 100) {
206
+ const normalized = normalizeFilePath(path);
207
+ if (normalized && !scopes.includes(normalized)) {
208
+ scopes.push(normalized);
209
+ }
210
+ }
211
+ }
212
+ }
213
+ return scopes.slice(0, 3);
214
+ }
215
+ function normalizeFilePath(path) {
216
+ const cleaned = path
217
+ .replace(/^['"]+|['"]+$/g, '')
218
+ .replace(/^\.\.?\/?/, '')
219
+ .split('/')
220
+ .filter(Boolean)
221
+ .join('/');
222
+ const parts = cleaned.split('/');
223
+ if (parts.length > 3) {
224
+ return parts.slice(-3).join('/');
225
+ }
226
+ return cleaned || '';
227
+ }
228
+ function extractProjectTags(content) {
229
+ const tags = [];
230
+ const projectPattern = /\bproject[:\-]?(\w+)/gi;
231
+ let match;
232
+ while ((match = projectPattern.exec(content)) !== null) {
233
+ tags.push(match[1].toLowerCase());
234
+ }
235
+ const dotfilePattern = /^\.?([a-zA-Z0-9_\-]+)\.(json|yaml|yml|toml|config|cfg|ini|env)/m;
236
+ const dotfileMatch = content.match(dotfilePattern);
237
+ if (dotfileMatch) {
238
+ tags.push(dotfileMatch[1].toLowerCase());
239
+ }
240
+ return tags;
241
+ }
242
+ export function parseHierarchicalTag(tag) {
243
+ for (const [prefix, _category] of Object.entries(HIERARCHICAL_TAG_PREFIXES)) {
244
+ if (tag.startsWith(prefix)) {
245
+ return { prefix, name: tag.slice(prefix.length) };
246
+ }
247
+ }
248
+ return { prefix: null, name: tag };
249
+ }
250
+ export function buildTagHierarchy(tags) {
251
+ const hierarchy = new Map();
252
+ for (const tag of tags) {
253
+ const { prefix, name } = parseHierarchicalTag(tag);
254
+ const category = prefix
255
+ ? Object.entries(HIERARCHICAL_TAG_PREFIXES).find(([p]) => p === prefix)?.[1] ?? 'custom'
256
+ : 'general';
257
+ if (!hierarchy.has(category)) {
258
+ hierarchy.set(category, []);
259
+ }
260
+ hierarchy.get(category).push(tag);
261
+ }
262
+ return hierarchy;
263
+ }
264
+ export async function suggestTagsFromEmbedding(content, existingTags, similarMemories) {
265
+ if (similarMemories.length === 0) {
266
+ return [];
267
+ }
268
+ const existingLower = new Set(existingTags.map(t => t.toLowerCase()));
269
+ const tagCounts = {};
270
+ for (const memory of similarMemories) {
271
+ for (const tag of memory.tags) {
272
+ if (!existingLower.has(tag.toLowerCase())) {
273
+ tagCounts[tag] = (tagCounts[tag] ?? 0) + 1;
274
+ }
275
+ }
276
+ }
277
+ return Object.entries(tagCounts)
278
+ .sort(([, a], [, b]) => b - a)
279
+ .filter(([, count]) => count >= 2)
280
+ .slice(0, 3)
281
+ .map(([tag]) => tag);
282
+ }
283
+ export function generateTagVariants(tag) {
284
+ const variants = [tag];
285
+ const lower = tag.toLowerCase();
286
+ const upper = tag.toUpperCase();
287
+ const capitalize = tag.charAt(0).toUpperCase() + tag.slice(1).toLowerCase();
288
+ if (lower !== tag)
289
+ variants.push(lower);
290
+ if (upper !== tag)
291
+ variants.push(upper);
292
+ if (capitalize !== tag)
293
+ variants.push(capitalize);
294
+ const snakeCase = tag.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
295
+ if (snakeCase !== tag && snakeCase !== lower) {
296
+ variants.push(snakeCase);
297
+ }
298
+ const kebabCase = tag.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
299
+ if (kebabCase !== tag && kebabCase !== lower && kebabCase !== snakeCase) {
300
+ variants.push(kebabCase);
301
+ }
302
+ return [...new Set(variants)];
303
+ }
304
+ //# sourceMappingURL=categorizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categorizer.js","sourceRoot":"","sources":["../../../core/memory/categorizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface Conflict {
2
+ type: 'contradiction' | 'inconsistency' | 'outdated';
3
+ description: string;
4
+ relatedMemoryId?: string;
5
+ }
6
+ export declare function detectConflicts(memoryId: string, proposedContent: string): Promise<Conflict[]>;
7
+ //# sourceMappingURL=conflict-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-detector.d.ts","sourceRoot":"","sources":["../../../core/memory/conflict-detector.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,eAAe,GAAG,eAAe,GAAG,UAAU,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAiDpG"}
@@ -0,0 +1,43 @@
1
+ import { eq, and, sql } from 'drizzle-orm';
2
+ import { getDb } from '../../db/index.js';
3
+ import { getSchema } from '../../db/schema.js';
4
+ import { createDatabaseClient } from '../../core/database.js';
5
+ export async function detectConflicts(memoryId, proposedContent) {
6
+ const db = createDatabaseClient(await getDb());
7
+ const schema = await getSchema();
8
+ const { memories } = schema;
9
+ const conflicts = [];
10
+ // Get current memory
11
+ const currentMemory = await db.select()
12
+ .from(memories)
13
+ .where(eq(memories.id, memoryId))
14
+ .limit(1);
15
+ if (currentMemory.length === 0)
16
+ return [];
17
+ // Check for temporal contradictions
18
+ if (currentMemory[0].validFrom && currentMemory[0].validTo) {
19
+ const now = new Date();
20
+ if (now < new Date(currentMemory[0].validFrom) || now > new Date(currentMemory[0].validTo)) {
21
+ conflicts.push({
22
+ type: 'inconsistency',
23
+ description: 'Current time is outside validity period',
24
+ });
25
+ }
26
+ }
27
+ // Check for semantic contradictions with other memories
28
+ const similarMemories = await db.select()
29
+ .from(memories)
30
+ .where(and(eq(memories.projectId, currentMemory[0].projectId), sql `memories.id != ${memoryId}`, sql `memories.content ILIKE ${proposedContent}`))
31
+ .limit(5);
32
+ for (const memory of similarMemories) {
33
+ if (memory.id !== memoryId) {
34
+ conflicts.push({
35
+ type: 'contradiction',
36
+ description: `Potential contradiction with memory ${memory.id}`,
37
+ relatedMemoryId: memory.id,
38
+ });
39
+ }
40
+ }
41
+ return conflicts;
42
+ }
43
+ //# sourceMappingURL=conflict-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-detector.js","sourceRoot":"","sources":["../../../core/memory/conflict-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAS9D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,eAAuB;IAC7E,MAAM,EAAE,GAAG,oBAAoB,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAE5B,MAAM,SAAS,GAAe,EAAE,CAAC;IAEjC,qBAAqB;IACrB,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE;SACpC,IAAI,CAAC,QAAQ,CAAC;SACd,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;SAChC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1C,oCAAoC;IACpC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3F,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,yCAAyC;aACvD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE;SACtC,IAAI,CAAC,QAAQ,CAAC;SACd,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAClD,GAAG,CAAA,kBAAkB,QAAQ,EAAE,EAC/B,GAAG,CAAA,0BAA0B,eAAe,EAAE,CAC/C,CACF;SACA,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,eAAe;gBACrB,WAAW,EAAE,uCAAuC,MAAM,CAAC,EAAE,EAAE;gBAC/D,eAAe,EAAE,MAAM,CAAC,EAAE;aAC3B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Context Collector - Collect recent conversation context for query rewriting */
2
+ export interface ContextMessage {
3
+ role: 'user' | 'assistant';
4
+ content: string;
5
+ createdAt: Date;
6
+ }
7
+ export declare function collectRecentContext(sessionId: string, count?: number): Promise<ContextMessage[]>;
8
+ export declare function formatContextForLLM(messages: ContextMessage[]): string;
9
+ export declare function getLastUserMessages(sessionId: string, count?: number): Promise<string[]>;
10
+ //# sourceMappingURL=context-collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-collector.d.ts","sourceRoot":"","sources":["../../../core/memory/context-collector.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAOlF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,cAAc,EAAE,CAAC,CAsC3B;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAMtE;AAED,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC,CAMnB"}
@@ -0,0 +1,55 @@
1
+ /** Context Collector - Collect recent conversation context for query rewriting */
2
+ import { logger } from '../logger.js';
3
+ import { getDb } from '../../db/index.js';
4
+ import { messages, conversations } from '../../drizzle/schema-sqlite.js';
5
+ import { eq, desc } from 'drizzle-orm';
6
+ export async function collectRecentContext(sessionId, count = 5) {
7
+ const db = await getDb();
8
+ if (!db) {
9
+ logger.warn('[ContextCollector] Database not available');
10
+ return [];
11
+ }
12
+ try {
13
+ const [conversation] = await db
14
+ .select()
15
+ .from(conversations)
16
+ .where(eq(conversations.sessionId, sessionId))
17
+ .orderBy(desc(conversations.startedAt))
18
+ .limit(1);
19
+ if (!conversation) {
20
+ logger.debug(`[ContextCollector] No conversation found for session ${sessionId}`);
21
+ return [];
22
+ }
23
+ const recentMessages = await db
24
+ .select()
25
+ .from(messages)
26
+ .where(eq(messages.conversationId, conversation.id))
27
+ .orderBy(desc(messages.createdAt))
28
+ .limit(count);
29
+ const ordered = recentMessages.reverse();
30
+ return ordered.map((msg) => ({
31
+ role: msg.role,
32
+ content: msg.content,
33
+ createdAt: new Date(msg.createdAt ?? Date.now()),
34
+ }));
35
+ }
36
+ catch (error) {
37
+ logger.error('[ContextCollector] Failed to collect context:', error);
38
+ return [];
39
+ }
40
+ }
41
+ export function formatContextForLLM(messages) {
42
+ if (messages.length === 0)
43
+ return '';
44
+ return messages
45
+ .map(msg => `${msg.role === 'user' ? 'User' : 'Assistant'}: ${msg.content}`)
46
+ .join('\n\n');
47
+ }
48
+ export async function getLastUserMessages(sessionId, count = 3) {
49
+ const context = await collectRecentContext(sessionId, count * 2);
50
+ return context
51
+ .filter(msg => msg.role === 'user')
52
+ .slice(-count)
53
+ .map(msg => msg.content);
54
+ }
55
+ //# sourceMappingURL=context-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-collector.js","sourceRoot":"","sources":["../../../core/memory/context-collector.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAQvC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,QAAgB,CAAC;IAEjB,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,EAAE;aAC5B,MAAM,EAAE;aACR,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aAC7C,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;aACtC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEZ,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,wDAAwD,SAAS,EAAE,CAAC,CAAC;YAClF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,EAAE;aAC5B,MAAM,EAAE;aACR,IAAI,CAAC,QAAQ,CAAC;aACd,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;aACnD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;aACjC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhB,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC;QAEzC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAiC,EAAE,EAAE,CAAC,CAAC;YACzD,IAAI,EAAE,GAAG,CAAC,IAA4B;YACtC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;SACjD,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;QACrE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAA0B;IAC5D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,OAAO,QAAQ;SACZ,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;SAC3E,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,QAAgB,CAAC;IAEjB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACjE,OAAO,OAAO;SACX,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;SAClC,KAAK,CAAC,CAAC,KAAK,CAAC;SACb,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Contradiction Resolver
3
+ * Detects and auto-resolves contradictions when writing new memories
4
+ * Implements supersession logic for outdated information
5
+ */
6
+ export interface ContradictionResult {
7
+ hasContradiction: boolean;
8
+ supersededMemories: string[];
9
+ confidence: number;
10
+ reason: string;
11
+ }
12
+ export interface ContradictionCheck {
13
+ newContent: string;
14
+ newType: string;
15
+ projectId?: string;
16
+ entities?: string[];
17
+ }
18
+ /**
19
+ * Detect contradictions between new memory and existing memories
20
+ */
21
+ export declare function detectContradictions(check: ContradictionCheck): Promise<ContradictionResult>;
22
+ /**
23
+ * Apply supersession to memories - archive old ones and create associations
24
+ */
25
+ export declare function applySupersession(newMemoryId: string, supersededIds: string[], confidence: number): Promise<void>;
26
+ /**
27
+ * Check for temporal contradictions (facts that are no longer valid)
28
+ */
29
+ export declare function checkTemporalContradictions(content: string, projectId?: string): Promise<string[]>;
30
+ /**
31
+ * Integrated contradiction resolution for the write path
32
+ * Call this before storing a new memory
33
+ */
34
+ export declare function resolveContradictions(content: string, type: string, projectId?: string): Promise<{
35
+ shouldProceed: boolean;
36
+ supersededIds: string[];
37
+ confidence: number;
38
+ reason: string;
39
+ }>;
40
+ //# sourceMappingURL=contradiction-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contradiction-resolver.d.ts","sourceRoot":"","sources":["../../../core/memory/contradiction-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAqID;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAyLlG;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAoDnB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IACT,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CA+BD"}