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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +2 -2
- package/.env.mcp +30 -0
- package/.mcp.json +2 -5
- package/CHANGELOG.md +111 -0
- package/QUICK-START.md +65 -0
- package/README.md +188 -530
- package/commands/managed-sync.ts +69 -0
- package/commands/mcp-server.ts +519 -0
- package/config/mcp-cli-fallback-policy.json +22 -0
- package/config/mcp-migration-map.json +22 -0
- package/config/mcp-mode-semantics.json +21 -0
- package/config/mcp-remote-auth.json +36 -0
- package/config/mcp-universal.schema.json +48 -0
- package/config/mcp.json +38 -0
- package/config/remote-memory-policy.json +32 -0
- package/dist/algorithms/merge/detection/hash-filters.js +2 -2
- package/dist/algorithms/merge/detection/hash-filters.js.map +1 -1
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts +5 -2
- package/dist/algorithms/merge/detection/two-stage-detector.d.ts.map +1 -1
- package/dist/algorithms/merge/detection/two-stage-detector.js +139 -22
- package/dist/algorithms/merge/detection/two-stage-detector.js.map +1 -1
- package/dist/commands/managed-sync.d.ts +10 -0
- package/dist/commands/managed-sync.d.ts.map +1 -0
- package/dist/commands/managed-sync.js +64 -0
- package/dist/commands/managed-sync.js.map +1 -0
- package/dist/commands/mcp-server.d.ts +3 -0
- package/dist/commands/mcp-server.d.ts.map +1 -0
- package/dist/commands/mcp-server.js +389 -0
- package/dist/commands/mcp-server.js.map +1 -0
- package/dist/config.d.ts +24 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +32 -1
- package/dist/config.js.map +1 -1
- package/dist/core/associations.d.ts +1 -1
- package/dist/core/associations.d.ts.map +1 -1
- package/dist/core/consolidation.d.ts +31 -0
- package/dist/core/consolidation.d.ts.map +1 -1
- package/dist/core/consolidation.js +237 -29
- package/dist/core/consolidation.js.map +1 -1
- package/dist/core/embeddings/google-multimodal.d.ts +14 -0
- package/dist/core/embeddings/google-multimodal.d.ts.map +1 -0
- package/dist/core/embeddings/google-multimodal.js +142 -0
- package/dist/core/embeddings/google-multimodal.js.map +1 -0
- package/dist/core/embeddings.d.ts +3 -2
- package/dist/core/embeddings.d.ts.map +1 -1
- package/dist/core/embeddings.js +61 -39
- package/dist/core/embeddings.js.map +1 -1
- package/dist/core/mcp/client.d.ts +17 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +101 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/index.d.ts +6 -0
- package/dist/core/mcp/index.d.ts.map +1 -0
- package/dist/core/mcp/index.js +6 -0
- package/dist/core/mcp/index.js.map +1 -0
- package/dist/core/mcp/server.d.ts +18 -0
- package/dist/core/mcp/server.d.ts.map +1 -0
- package/dist/core/mcp/server.js +131 -0
- package/dist/core/mcp/server.js.map +1 -0
- package/dist/core/mcp/standalone-server.d.ts +13 -0
- package/dist/core/mcp/standalone-server.d.ts.map +1 -0
- package/dist/core/mcp/standalone-server.js +46 -0
- package/dist/core/mcp/standalone-server.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +9 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +262 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/mcp/types.d.ts +315 -0
- package/dist/core/mcp/types.d.ts.map +1 -0
- package/dist/core/mcp/types.js +48 -0
- package/dist/core/mcp/types.js.map +1 -0
- package/dist/core/memory/categorizer.d.ts +27 -0
- package/dist/core/memory/categorizer.d.ts.map +1 -0
- package/dist/core/memory/categorizer.js +304 -0
- package/dist/core/memory/categorizer.js.map +1 -0
- package/dist/core/memory/conflict-detector.d.ts +7 -0
- package/dist/core/memory/conflict-detector.d.ts.map +1 -0
- package/dist/core/memory/conflict-detector.js +43 -0
- package/dist/core/memory/conflict-detector.js.map +1 -0
- package/dist/core/memory/context-collector.d.ts +10 -0
- package/dist/core/memory/context-collector.d.ts.map +1 -0
- package/dist/core/memory/context-collector.js +55 -0
- package/dist/core/memory/context-collector.js.map +1 -0
- package/dist/core/memory/contradiction-resolver.d.ts +40 -0
- package/dist/core/memory/contradiction-resolver.d.ts.map +1 -0
- package/dist/core/memory/contradiction-resolver.js +368 -0
- package/dist/core/memory/contradiction-resolver.js.map +1 -0
- package/dist/core/memory/edit-workflow.d.ts +19 -0
- package/dist/core/memory/edit-workflow.d.ts.map +1 -0
- package/dist/core/memory/edit-workflow.js +120 -0
- package/dist/core/memory/edit-workflow.js.map +1 -0
- package/dist/core/memory/feedback-tracker.d.ts +12 -0
- package/dist/core/memory/feedback-tracker.d.ts.map +1 -0
- package/dist/core/memory/feedback-tracker.js +151 -0
- package/dist/core/memory/feedback-tracker.js.map +1 -0
- package/dist/core/memory/hybrid-retrieval.d.ts +11 -12
- package/dist/core/memory/hybrid-retrieval.d.ts.map +1 -1
- package/dist/core/memory/hybrid-retrieval.js +56 -28
- package/dist/core/memory/hybrid-retrieval.js.map +1 -1
- package/dist/core/memory/hybrid-scorer.d.ts +5 -16
- package/dist/core/memory/hybrid-scorer.d.ts.map +1 -1
- package/dist/core/memory/hybrid-scorer.js +161 -125
- package/dist/core/memory/hybrid-scorer.js.map +1 -1
- package/dist/core/memory/hybrid-search.js +53 -19
- package/dist/core/memory/hybrid-search.js.map +1 -1
- package/dist/core/memory/memories.d.ts +4 -0
- package/dist/core/memory/memories.d.ts.map +1 -1
- package/dist/core/memory/memories.js +133 -60
- package/dist/core/memory/memories.js.map +1 -1
- package/dist/core/memory/progressive-disclosure.d.ts +43 -0
- package/dist/core/memory/progressive-disclosure.d.ts.map +1 -0
- package/dist/core/memory/progressive-disclosure.js +280 -0
- package/dist/core/memory/progressive-disclosure.js.map +1 -0
- package/dist/core/memory/query-rewriter.d.ts +13 -0
- package/dist/core/memory/query-rewriter.d.ts.map +1 -0
- package/dist/core/memory/query-rewriter.js +118 -0
- package/dist/core/memory/query-rewriter.js.map +1 -0
- package/dist/core/memory/response-analyzer.d.ts +9 -0
- package/dist/core/memory/response-analyzer.d.ts.map +1 -0
- package/dist/core/memory/response-analyzer.js +61 -0
- package/dist/core/memory/response-analyzer.js.map +1 -0
- package/dist/core/memory/stats.d.ts +17 -0
- package/dist/core/memory/stats.d.ts.map +1 -0
- package/dist/core/memory/stats.js +87 -0
- package/dist/core/memory/stats.js.map +1 -0
- package/dist/core/memory/telemetry.d.ts +69 -0
- package/dist/core/memory/telemetry.d.ts.map +1 -0
- package/dist/core/memory/telemetry.js +313 -0
- package/dist/core/memory/telemetry.js.map +1 -0
- package/dist/core/memory/temporal-facts.d.ts +41 -0
- package/dist/core/memory/temporal-facts.d.ts.map +1 -0
- package/dist/core/memory/temporal-facts.js +262 -0
- package/dist/core/memory/temporal-facts.js.map +1 -0
- package/dist/core/memory/trigger-detector.d.ts +14 -0
- package/dist/core/memory/trigger-detector.d.ts.map +1 -0
- package/dist/core/memory/trigger-detector.js +42 -0
- package/dist/core/memory/trigger-detector.js.map +1 -0
- package/dist/core/memory/write-gate.d.ts +54 -0
- package/dist/core/memory/write-gate.d.ts.map +1 -0
- package/dist/core/memory/write-gate.js +210 -0
- package/dist/core/memory/write-gate.js.map +1 -0
- package/dist/core/projects.d.ts +2 -0
- package/dist/core/projects.d.ts.map +1 -1
- package/dist/core/projects.js +33 -0
- package/dist/core/projects.js.map +1 -1
- package/dist/core/scheduler/cron-scheduler.d.ts +32 -0
- package/dist/core/scheduler/cron-scheduler.d.ts.map +1 -0
- package/dist/core/scheduler/cron-scheduler.js +238 -0
- package/dist/core/scheduler/cron-scheduler.js.map +1 -0
- package/dist/core/scheduler/heartbeat.d.ts +11 -0
- package/dist/core/scheduler/heartbeat.d.ts.map +1 -0
- package/dist/core/scheduler/heartbeat.js +73 -0
- package/dist/core/scheduler/heartbeat.js.map +1 -0
- package/dist/core/scheduler/index.d.ts +8 -0
- package/dist/core/scheduler/index.d.ts.map +1 -0
- package/dist/core/scheduler/index.js +8 -0
- package/dist/core/scheduler/index.js.map +1 -0
- package/dist/core/scheduler/job-runner.d.ts +11 -0
- package/dist/core/scheduler/job-runner.d.ts.map +1 -0
- package/dist/core/scheduler/job-runner.js +161 -0
- package/dist/core/scheduler/job-runner.js.map +1 -0
- package/dist/core/session/auto-load.d.ts +6 -0
- package/dist/core/session/auto-load.d.ts.map +1 -0
- package/dist/core/session/auto-load.js +119 -0
- package/dist/core/session/auto-load.js.map +1 -0
- package/dist/core/session/index.d.ts +7 -0
- package/dist/core/session/index.d.ts.map +1 -0
- package/dist/core/session/index.js +7 -0
- package/dist/core/session/index.js.map +1 -0
- package/dist/core/session/types.d.ts +26 -0
- package/dist/core/session/types.d.ts.map +1 -0
- package/dist/core/session/types.js +10 -0
- package/dist/core/session/types.js.map +1 -0
- package/dist/core/snapshots/comparison.d.ts.map +1 -1
- package/dist/core/snapshots/comparison.js +8 -2
- package/dist/core/snapshots/comparison.js.map +1 -1
- package/dist/core/utils/content-extraction.d.ts.map +1 -1
- package/dist/core/utils/content-extraction.js +11 -1
- package/dist/core/utils/content-extraction.js.map +1 -1
- package/dist/core/utils/summarization-helpers.d.ts.map +1 -1
- package/dist/core/utils/summarization-helpers.js +4 -1
- package/dist/core/utils/summarization-helpers.js.map +1 -1
- package/dist/core/utils.d.ts.map +1 -1
- package/dist/core/utils.js +26 -3
- package/dist/core/utils.js.map +1 -1
- package/dist/core/worker.d.ts +20 -0
- package/dist/core/worker.d.ts.map +1 -1
- package/dist/core/worker.js +86 -0
- package/dist/core/worker.js.map +1 -1
- package/dist/db/adapter.d.ts +1 -5
- package/dist/db/adapter.d.ts.map +1 -1
- package/dist/db/adapter.js +125 -12
- package/dist/db/adapter.js.map +1 -1
- package/dist/db/bootstrap.d.ts.map +1 -1
- package/dist/db/bootstrap.js +178 -3
- package/dist/db/bootstrap.js.map +1 -1
- package/dist/db/index.d.ts +1 -5
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +7 -4
- package/dist/db/index.js.map +1 -1
- package/dist/drizzle/schema-sqlite.d.ts +1953 -612
- package/dist/drizzle/schema-sqlite.d.ts.map +1 -1
- package/dist/drizzle/schema-sqlite.js +134 -0
- package/dist/drizzle/schema-sqlite.js.map +1 -1
- package/dist/drizzle/schema.d.ts +684 -3
- package/dist/drizzle/schema.d.ts.map +1 -1
- package/dist/drizzle/schema.js +81 -1
- package/dist/drizzle/schema.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +152 -13
- package/dist/index.js.map +1 -1
- package/package.json +125 -103
- package/scripts/build-release.sh +33 -0
- package/scripts/db/check-db.mjs +88 -0
- package/scripts/db/fix-all-columns.mjs +52 -0
- package/scripts/db/fix-schema-all.mjs +55 -0
- package/scripts/db/fix-schema-full.mjs +46 -0
- package/scripts/db/fix-schema.mjs +38 -0
- package/scripts/db/init-db.mjs +13 -0
- package/scripts/db/recreate-db.mjs +14 -0
- package/scripts/generate-mcp.mjs +264 -0
- package/scripts/github-release.sh +61 -0
- package/scripts/init-dirs.mjs +13 -0
- package/scripts/init-dirs.ts +15 -0
- package/scripts/install-mcp.mjs +116 -0
- package/scripts/install-web.sh +120 -0
- package/scripts/install.mjs +340 -0
- package/scripts/openclaw-bootstrap.mjs +127 -0
- package/scripts/package-release.sh +71 -0
- package/scripts/remote-preflight.mjs +62 -0
- package/scripts/squish-fallback.mjs +132 -0
- package/scripts/test/test-all-systems.mjs +139 -0
- package/scripts/test/test-memory-system.mjs +139 -0
- package/scripts/test/test-v0.5.0.mjs +210 -0
- package/scripts/verify-mcp.mjs +214 -0
- package/skills/memory-guide/SKILL.md +181 -123
- package/skills/squish-cli/SKILL.md +200 -0
- package/skills/squish-mcp/SKILL.md +311 -0
- package/skills/squish-memory/SKILL.md +100 -62
- package/skills/squish-memory/claude-desktop.json +12 -0
- package/skills/squish-memory/install.mjs +335 -0
- package/skills/squish-memory/install.sh +94 -62
- package/skills/squish-memory/openclaw.json +13 -0
- package/skills/squish-memory/opencode.json +14 -0
- package/skills/squish-memory/skill.json +32 -0
- package/dist/adapters/claude-code/capture.d.ts +0 -11
- package/dist/adapters/claude-code/capture.d.ts.map +0 -1
- package/dist/adapters/claude-code/capture.js +0 -100
- package/dist/adapters/claude-code/capture.js.map +0 -1
- package/dist/adapters/claude-code/index.d.ts +0 -5
- package/dist/adapters/claude-code/index.d.ts.map +0 -1
- package/dist/adapters/claude-code/index.js +0 -6
- package/dist/adapters/claude-code/index.js.map +0 -1
- package/dist/adapters/claude-code/injection.d.ts +0 -34
- package/dist/adapters/claude-code/injection.d.ts.map +0 -1
- package/dist/adapters/claude-code/injection.js +0 -127
- package/dist/adapters/claude-code/injection.js.map +0 -1
- package/dist/adapters/claude-code/plugin-wrapper.d.ts +0 -21
- package/dist/adapters/claude-code/plugin-wrapper.d.ts.map +0 -1
- package/dist/adapters/claude-code/plugin-wrapper.js +0 -239
- package/dist/adapters/claude-code/plugin-wrapper.js.map +0 -1
- package/dist/adapters/claude-code/types.d.ts +0 -46
- package/dist/adapters/claude-code/types.d.ts.map +0 -1
- package/dist/adapters/claude-code/types.js +0 -6
- 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"}
|