squish-memory 0.8.2 → 0.9.2
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/api/web/index.d.ts +3 -0
- package/dist/api/web/index.d.ts.map +1 -0
- package/dist/api/web/index.js +4 -0
- package/dist/api/web/index.js.map +1 -0
- package/dist/api/web/web-server.d.ts +3 -0
- package/dist/api/web/web-server.d.ts.map +1 -0
- package/dist/api/web/web-server.js +6 -0
- package/dist/api/web/web-server.js.map +1 -0
- package/dist/api/web/web.d.ts.map +1 -1
- package/dist/api/web/web.js +227 -78
- package/dist/api/web/web.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 +64 -22
- 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 +138 -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/observations.d.ts.map +1 -1
- package/dist/core/observations.js +1 -0
- package/dist/core/observations.js.map +1 -1
- 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/memory-operations.d.ts.map +1 -1
- package/dist/core/utils/memory-operations.js +3 -1
- package/dist/core/utils/memory-operations.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 +137 -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 +126 -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,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"}
|