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,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retrieval Quality Telemetry
|
|
3
|
+
* Tracks memory usage patterns (echo/fizzle) to improve retrieval quality
|
|
4
|
+
* Echo: memory was retrieved and used
|
|
5
|
+
* Fizzle: memory was retrieved but not used
|
|
6
|
+
*/
|
|
7
|
+
import { eq, desc } from 'drizzle-orm';
|
|
8
|
+
import { getDb } from '../../db/index.js';
|
|
9
|
+
import { getSchema } from '../../db/schema.js';
|
|
10
|
+
import { logger } from '../logger.js';
|
|
11
|
+
// In-memory cache for recent retrieval events (flushed periodically)
|
|
12
|
+
const retrievalEvents = [];
|
|
13
|
+
const MAX_CACHE_SIZE = 1000;
|
|
14
|
+
/**
|
|
15
|
+
* Record a retrieval event
|
|
16
|
+
*/
|
|
17
|
+
export function recordRetrieval(memoryId, query, position, score, sessionId) {
|
|
18
|
+
const event = {
|
|
19
|
+
memoryId,
|
|
20
|
+
query,
|
|
21
|
+
position,
|
|
22
|
+
score,
|
|
23
|
+
wasUsed: false, // Initially false, updated when echoed
|
|
24
|
+
sessionId,
|
|
25
|
+
timestamp: new Date(),
|
|
26
|
+
};
|
|
27
|
+
retrievalEvents.push(event);
|
|
28
|
+
// Flush if cache is full
|
|
29
|
+
if (retrievalEvents.length >= MAX_CACHE_SIZE) {
|
|
30
|
+
flushRetrievalEvents().catch(err => {
|
|
31
|
+
logger.error('Failed to flush retrieval events', err);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Mark a retrieval as "echoed" (memory was actually used)
|
|
37
|
+
*/
|
|
38
|
+
export function recordEcho(memoryId, sessionId) {
|
|
39
|
+
// Find the most recent retrieval for this memory
|
|
40
|
+
const recentIndex = retrievalEvents.findIndex((e, i) => e.memoryId === memoryId &&
|
|
41
|
+
!e.wasUsed &&
|
|
42
|
+
(sessionId ? e.sessionId === sessionId : true));
|
|
43
|
+
if (recentIndex !== -1) {
|
|
44
|
+
retrievalEvents[recentIndex].wasUsed = true;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Add a new echo event if not found in cache
|
|
48
|
+
retrievalEvents.push({
|
|
49
|
+
memoryId,
|
|
50
|
+
query: '',
|
|
51
|
+
position: 0,
|
|
52
|
+
score: 0,
|
|
53
|
+
wasUsed: true,
|
|
54
|
+
sessionId,
|
|
55
|
+
timestamp: new Date(),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// Update memory's echo count directly
|
|
59
|
+
incrementMemoryEcho(memoryId).catch(err => {
|
|
60
|
+
logger.debug('Failed to increment echo count', err);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Mark retrievals as "fizzled" (memory was not used)
|
|
65
|
+
* Call this at the end of a session for non-echoed retrievals
|
|
66
|
+
*/
|
|
67
|
+
export function recordFizzle(memoryId, sessionId) {
|
|
68
|
+
incrementMemoryFizzle(memoryId).catch(err => {
|
|
69
|
+
logger.debug('Failed to increment fizzle count', err);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Flush cached retrieval events to database
|
|
74
|
+
*/
|
|
75
|
+
export async function flushRetrievalEvents() {
|
|
76
|
+
if (retrievalEvents.length === 0)
|
|
77
|
+
return;
|
|
78
|
+
const events = [...retrievalEvents];
|
|
79
|
+
retrievalEvents.length = 0; // Clear cache
|
|
80
|
+
try {
|
|
81
|
+
const db = await getDb();
|
|
82
|
+
const schema = await getSchema();
|
|
83
|
+
// Group by memoryId for batch updates
|
|
84
|
+
const byMemory = new Map();
|
|
85
|
+
for (const event of events) {
|
|
86
|
+
const existing = byMemory.get(event.memoryId) || [];
|
|
87
|
+
existing.push(event);
|
|
88
|
+
byMemory.set(event.memoryId, existing);
|
|
89
|
+
}
|
|
90
|
+
// Update each memory's telemetry
|
|
91
|
+
for (const [memoryId, memEvents] of byMemory.entries()) {
|
|
92
|
+
const echoCount = memEvents.filter(e => e.wasUsed).length;
|
|
93
|
+
const fizzleCount = memEvents.filter(e => !e.wasUsed).length;
|
|
94
|
+
// Get current stats
|
|
95
|
+
const memories = await db
|
|
96
|
+
.select()
|
|
97
|
+
.from(schema.memories)
|
|
98
|
+
.where(eq(schema.memories.id, memoryId))
|
|
99
|
+
.limit(1);
|
|
100
|
+
if (memories.length > 0) {
|
|
101
|
+
const current = memories[0];
|
|
102
|
+
const newEchoCount = (current.echoCount || 0) + echoCount;
|
|
103
|
+
const newFizzleCount = (current.fizzleCount || 0) + fizzleCount;
|
|
104
|
+
const newRetrievalCount = (current.retrievalCount || 0) + memEvents.length;
|
|
105
|
+
await db
|
|
106
|
+
.update(schema.memories)
|
|
107
|
+
.set({
|
|
108
|
+
echoCount: newEchoCount,
|
|
109
|
+
fizzleCount: newFizzleCount,
|
|
110
|
+
retrievalCount: newRetrievalCount,
|
|
111
|
+
lastRetrievedAt: new Date(),
|
|
112
|
+
updatedAt: new Date(),
|
|
113
|
+
})
|
|
114
|
+
.where(eq(schema.memories.id, memoryId));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
logger.debug('Flushed retrieval events', { count: events.length });
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
logger.error('Error flushing retrieval events', error);
|
|
121
|
+
// Re-add events to cache on failure
|
|
122
|
+
retrievalEvents.push(...events);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Increment memory's echo count directly
|
|
127
|
+
*/
|
|
128
|
+
async function incrementMemoryEcho(memoryId) {
|
|
129
|
+
try {
|
|
130
|
+
const db = await getDb();
|
|
131
|
+
const schema = await getSchema();
|
|
132
|
+
const memories = await db
|
|
133
|
+
.select()
|
|
134
|
+
.from(schema.memories)
|
|
135
|
+
.where(eq(schema.memories.id, memoryId))
|
|
136
|
+
.limit(1);
|
|
137
|
+
if (memories.length > 0) {
|
|
138
|
+
const current = memories[0];
|
|
139
|
+
await db
|
|
140
|
+
.update(schema.memories)
|
|
141
|
+
.set({
|
|
142
|
+
echoCount: (current.echoCount || 0) + 1,
|
|
143
|
+
lastEchoedAt: new Date(),
|
|
144
|
+
coactivationScore: (current.coactivationScore || 0) + 1,
|
|
145
|
+
updatedAt: new Date(),
|
|
146
|
+
})
|
|
147
|
+
.where(eq(schema.memories.id, memoryId));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
logger.debug('Error incrementing echo count', { error });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Increment memory's fizzle count directly
|
|
156
|
+
*/
|
|
157
|
+
async function incrementMemoryFizzle(memoryId) {
|
|
158
|
+
try {
|
|
159
|
+
const db = await getDb();
|
|
160
|
+
const schema = await getSchema();
|
|
161
|
+
const memories = await db
|
|
162
|
+
.select()
|
|
163
|
+
.from(schema.memories)
|
|
164
|
+
.where(eq(schema.memories.id, memoryId))
|
|
165
|
+
.limit(1);
|
|
166
|
+
if (memories.length > 0) {
|
|
167
|
+
const current = memories[0];
|
|
168
|
+
await db
|
|
169
|
+
.update(schema.memories)
|
|
170
|
+
.set({
|
|
171
|
+
fizzleCount: (current.fizzleCount || 0) + 1,
|
|
172
|
+
updatedAt: new Date(),
|
|
173
|
+
})
|
|
174
|
+
.where(eq(schema.memories.id, memoryId));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
logger.debug('Error incrementing fizzle count', { error });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get telemetry for a specific memory
|
|
183
|
+
*/
|
|
184
|
+
export async function getMemoryTelemetry(memoryId) {
|
|
185
|
+
try {
|
|
186
|
+
const db = await getDb();
|
|
187
|
+
const schema = await getSchema();
|
|
188
|
+
const memories = await db
|
|
189
|
+
.select()
|
|
190
|
+
.from(schema.memories)
|
|
191
|
+
.where(eq(schema.memories.id, memoryId))
|
|
192
|
+
.limit(1);
|
|
193
|
+
if (memories.length === 0)
|
|
194
|
+
return null;
|
|
195
|
+
const m = memories[0];
|
|
196
|
+
const echoCount = m.echoCount || 0;
|
|
197
|
+
const fizzleCount = m.fizzleCount || 0;
|
|
198
|
+
const total = echoCount + fizzleCount;
|
|
199
|
+
return {
|
|
200
|
+
memoryId: m.id,
|
|
201
|
+
retrievalCount: m.retrievalCount || 0,
|
|
202
|
+
echoCount,
|
|
203
|
+
fizzleCount,
|
|
204
|
+
echoRate: total > 0 ? echoCount / total : 0,
|
|
205
|
+
avgPosition: 0, // Would need to calculate from retrieval events
|
|
206
|
+
lastRetrieved: m.lastRetrievedAt,
|
|
207
|
+
lastEchoed: m.lastEchoedAt,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
logger.error('Error getting memory telemetry', error);
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get overall retrieval statistics
|
|
217
|
+
*/
|
|
218
|
+
export async function getRetrievalStats(projectId) {
|
|
219
|
+
try {
|
|
220
|
+
const db = await getDb();
|
|
221
|
+
const schema = await getSchema();
|
|
222
|
+
const whereClause = projectId
|
|
223
|
+
? eq(schema.memories.projectId, projectId)
|
|
224
|
+
: undefined;
|
|
225
|
+
const memories = await db
|
|
226
|
+
.select()
|
|
227
|
+
.from(schema.memories)
|
|
228
|
+
.where(whereClause)
|
|
229
|
+
.orderBy(desc(schema.memories.retrievalCount))
|
|
230
|
+
.limit(1000);
|
|
231
|
+
let totalRetrievals = 0;
|
|
232
|
+
let totalEchoes = 0;
|
|
233
|
+
let totalFizzles = 0;
|
|
234
|
+
const topMemories = [];
|
|
235
|
+
const underperforming = [];
|
|
236
|
+
for (const m of memories) {
|
|
237
|
+
const echoes = m.echoCount || 0;
|
|
238
|
+
const fizzles = m.fizzleCount || 0;
|
|
239
|
+
const retrievals = m.retrievalCount || 0;
|
|
240
|
+
totalRetrievals += retrievals;
|
|
241
|
+
totalEchoes += echoes;
|
|
242
|
+
totalFizzles += fizzles;
|
|
243
|
+
// Top performers (high echo rate with sufficient data)
|
|
244
|
+
if (echoes >= 3 && (echoes / (echoes + fizzles)) >= 0.8) {
|
|
245
|
+
topMemories.push(m.id);
|
|
246
|
+
}
|
|
247
|
+
// Underperformers (high fizzle rate with sufficient data)
|
|
248
|
+
if (fizzles >= 5 && (fizzles / (echoes + fizzles)) >= 0.7) {
|
|
249
|
+
underperforming.push(m.id);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
const echoRate = (totalEchoes + totalFizzles) > 0
|
|
253
|
+
? totalEchoes / (totalEchoes + totalFizzles)
|
|
254
|
+
: 0;
|
|
255
|
+
return {
|
|
256
|
+
totalRetrievals,
|
|
257
|
+
echoes: totalEchoes,
|
|
258
|
+
fizzles: totalFizzles,
|
|
259
|
+
echoRate,
|
|
260
|
+
avgPosition: 0, // Would need more detailed tracking
|
|
261
|
+
topMemories: topMemories.slice(0, 10),
|
|
262
|
+
underperformingMemories: underperforming.slice(0, 10),
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
logger.error('Error getting retrieval stats', error);
|
|
267
|
+
return {
|
|
268
|
+
totalRetrievals: 0,
|
|
269
|
+
echoes: 0,
|
|
270
|
+
fizzles: 0,
|
|
271
|
+
echoRate: 0,
|
|
272
|
+
avgPosition: 0,
|
|
273
|
+
topMemories: [],
|
|
274
|
+
underperformingMemories: [],
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Adjust retrieval boosting based on echo/fizzle history
|
|
280
|
+
* Returns a boost factor (0.5 - 2.0) for a memory
|
|
281
|
+
*/
|
|
282
|
+
export function calculateTelemetryBoost(telemetry) {
|
|
283
|
+
if (!telemetry || telemetry.retrievalCount < 3) {
|
|
284
|
+
return 1.0; // Not enough data
|
|
285
|
+
}
|
|
286
|
+
const echoRate = telemetry.echoRate;
|
|
287
|
+
// High echo rate = boost
|
|
288
|
+
if (echoRate >= 0.8) {
|
|
289
|
+
return 1.5;
|
|
290
|
+
}
|
|
291
|
+
else if (echoRate >= 0.6) {
|
|
292
|
+
return 1.2;
|
|
293
|
+
}
|
|
294
|
+
else if (echoRate >= 0.4) {
|
|
295
|
+
return 1.0;
|
|
296
|
+
}
|
|
297
|
+
else if (echoRate >= 0.2) {
|
|
298
|
+
return 0.8;
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
return 0.5; // Low echo rate = penalize
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Periodic cleanup job for telemetry data
|
|
306
|
+
*/
|
|
307
|
+
export async function cleanupOldTelemetry(daysToKeep = 90) {
|
|
308
|
+
// This would typically clean up a dedicated telemetry_events table
|
|
309
|
+
// For now, we just flush the in-memory cache
|
|
310
|
+
await flushRetrievalEvents();
|
|
311
|
+
return 0;
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../core/memory/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal Facts Lifecycle
|
|
3
|
+
* Manages temporal fact validity, supersession, and expiration
|
|
4
|
+
* Integrates with the memory pipeline to automatically supersede outdated facts
|
|
5
|
+
*/
|
|
6
|
+
export interface TemporalValidityCheck {
|
|
7
|
+
isValid: boolean;
|
|
8
|
+
supersededBy?: string;
|
|
9
|
+
expiresAt?: Date;
|
|
10
|
+
confidence: number;
|
|
11
|
+
}
|
|
12
|
+
export interface SupersessionResult {
|
|
13
|
+
supersededCount: number;
|
|
14
|
+
newValidFrom: Date;
|
|
15
|
+
newValidTo?: Date;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check temporal validity of a memory
|
|
19
|
+
* Returns whether the memory is still valid based on temporal facts
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkTemporalValidity(memoryId: string): Promise<TemporalValidityCheck>;
|
|
22
|
+
/**
|
|
23
|
+
* Auto-supersede temporal facts that have been updated
|
|
24
|
+
* Call this when storing a new memory that may supersede old temporal facts
|
|
25
|
+
*/
|
|
26
|
+
export declare function supersedeOldTemporalFacts(newMemoryId: string, content: string, projectId?: string): Promise<SupersessionResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Clean up expired temporal facts
|
|
29
|
+
* Can be run as a background job
|
|
30
|
+
*/
|
|
31
|
+
export declare function cleanupExpiredTemporalFacts(projectId?: string): Promise<number>;
|
|
32
|
+
/**
|
|
33
|
+
* Get temporal fact statistics for a project
|
|
34
|
+
*/
|
|
35
|
+
export declare function getTemporalFactsStats(projectId?: string): Promise<{
|
|
36
|
+
totalTemporalFacts: number;
|
|
37
|
+
validFacts: number;
|
|
38
|
+
expiredFacts: number;
|
|
39
|
+
supersededFacts: number;
|
|
40
|
+
}>;
|
|
41
|
+
//# sourceMappingURL=temporal-facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal-facts.d.ts","sourceRoot":"","sources":["../../../core/memory/temporal-facts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA0D5F;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC,CA8F7B;AAiCD;;;GAGG;AACH,wBAAsB,2BAA2B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDrF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACvE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC,CA+CD"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal Facts Lifecycle
|
|
3
|
+
* Manages temporal fact validity, supersession, and expiration
|
|
4
|
+
* Integrates with the memory pipeline to automatically supersede outdated facts
|
|
5
|
+
*/
|
|
6
|
+
import { eq, and, lt } 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
|
+
import { parseTemporalFacts } from './temporal-parser.js';
|
|
12
|
+
/**
|
|
13
|
+
* Check temporal validity of a memory
|
|
14
|
+
* Returns whether the memory is still valid based on temporal facts
|
|
15
|
+
*/
|
|
16
|
+
export async function checkTemporalValidity(memoryId) {
|
|
17
|
+
try {
|
|
18
|
+
const db = await getDb();
|
|
19
|
+
const schema = await getSchema();
|
|
20
|
+
const memories = await db
|
|
21
|
+
.select()
|
|
22
|
+
.from(schema.memories)
|
|
23
|
+
.where(eq(schema.memories.id, memoryId))
|
|
24
|
+
.limit(1);
|
|
25
|
+
if (memories.length === 0) {
|
|
26
|
+
return { isValid: false, confidence: 0 };
|
|
27
|
+
}
|
|
28
|
+
const memory = memories[0];
|
|
29
|
+
const now = new Date();
|
|
30
|
+
// Check if memory has explicit validity period
|
|
31
|
+
if (memory.validTo) {
|
|
32
|
+
const validTo = new Date(memory.validTo);
|
|
33
|
+
if (validTo < now) {
|
|
34
|
+
// Find if there's a superseding memory
|
|
35
|
+
const superseding = await db
|
|
36
|
+
.select()
|
|
37
|
+
.from(schema.memories)
|
|
38
|
+
.where(eq(schema.memories.supersedes, memoryId))
|
|
39
|
+
.limit(1);
|
|
40
|
+
return {
|
|
41
|
+
isValid: false,
|
|
42
|
+
supersededBy: superseding[0]?.id,
|
|
43
|
+
expiresAt: validTo,
|
|
44
|
+
confidence: 0.95,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Parse temporal facts from content
|
|
49
|
+
const temporalFacts = await parseTemporalFacts(memory.content);
|
|
50
|
+
// Check for expiration indicators
|
|
51
|
+
for (const fact of temporalFacts) {
|
|
52
|
+
if (fact.parsed.end && new Date(fact.parsed.end) < now) {
|
|
53
|
+
return {
|
|
54
|
+
isValid: false,
|
|
55
|
+
expiresAt: new Date(fact.parsed.end),
|
|
56
|
+
confidence: fact.confidence,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { isValid: true, confidence: 1.0 };
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
logger.error('Error checking temporal validity', error);
|
|
64
|
+
return { isValid: true, confidence: 0.5 }; // Assume valid on error
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Auto-supersede temporal facts that have been updated
|
|
69
|
+
* Call this when storing a new memory that may supersede old temporal facts
|
|
70
|
+
*/
|
|
71
|
+
export async function supersedeOldTemporalFacts(newMemoryId, content, projectId) {
|
|
72
|
+
const result = {
|
|
73
|
+
supersededCount: 0,
|
|
74
|
+
newValidFrom: new Date(),
|
|
75
|
+
};
|
|
76
|
+
try {
|
|
77
|
+
const db = await getDb();
|
|
78
|
+
const schema = await getSchema();
|
|
79
|
+
// Parse temporal facts from new content
|
|
80
|
+
const temporalFacts = await parseTemporalFacts(content);
|
|
81
|
+
if (temporalFacts.length === 0) {
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
// Find the earliest date as validFrom
|
|
85
|
+
const dates = temporalFacts
|
|
86
|
+
.filter(f => f.parsed.start)
|
|
87
|
+
.map(f => new Date(f.parsed.start));
|
|
88
|
+
if (dates.length > 0) {
|
|
89
|
+
result.newValidFrom = new Date(Math.min(...dates.map(d => d.getTime())));
|
|
90
|
+
}
|
|
91
|
+
// Find memories in same project with overlapping temporal scope
|
|
92
|
+
const whereClause = projectId
|
|
93
|
+
? and(eq(schema.memories.projectId, projectId), eq(schema.memories.status, 'active'))
|
|
94
|
+
: eq(schema.memories.status, 'active');
|
|
95
|
+
const candidates = await db
|
|
96
|
+
.select()
|
|
97
|
+
.from(schema.memories)
|
|
98
|
+
.where(whereClause)
|
|
99
|
+
.limit(100);
|
|
100
|
+
const toSupersede = [];
|
|
101
|
+
for (const candidate of candidates) {
|
|
102
|
+
if (candidate.id === newMemoryId)
|
|
103
|
+
continue;
|
|
104
|
+
if (candidate.isProtected)
|
|
105
|
+
continue;
|
|
106
|
+
// Check for temporal overlap
|
|
107
|
+
const candidateFacts = await parseTemporalFacts(candidate.content);
|
|
108
|
+
for (const newFact of temporalFacts) {
|
|
109
|
+
for (const candidateFact of candidateFacts) {
|
|
110
|
+
if (factsOverlap(newFact, candidateFact)) {
|
|
111
|
+
// Check if new fact is more recent
|
|
112
|
+
if (isMoreRecent(newFact, candidateFact)) {
|
|
113
|
+
toSupersede.push(candidate.id);
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Apply supersession
|
|
121
|
+
if (toSupersede.length > 0) {
|
|
122
|
+
const now = new Date();
|
|
123
|
+
await db
|
|
124
|
+
.update(schema.memories)
|
|
125
|
+
.set({
|
|
126
|
+
status: 'superseded',
|
|
127
|
+
supersededBy: newMemoryId,
|
|
128
|
+
supersededAt: now,
|
|
129
|
+
updatedAt: now,
|
|
130
|
+
})
|
|
131
|
+
.where(eq(schema.memories.id, toSupersede[0])); // Batch for all
|
|
132
|
+
// Create associations
|
|
133
|
+
for (const oldId of toSupersede) {
|
|
134
|
+
await createAssociation(newMemoryId, oldId, 'supersedes', 0.85);
|
|
135
|
+
}
|
|
136
|
+
result.supersededCount = toSupersede.length;
|
|
137
|
+
logger.info('Superseded temporal facts', {
|
|
138
|
+
newMemoryId,
|
|
139
|
+
supersededCount: toSupersede.length,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
logger.error('Error superseding temporal facts', error);
|
|
145
|
+
}
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Check if two temporal facts overlap in time
|
|
150
|
+
*/
|
|
151
|
+
function factsOverlap(fact1, fact2) {
|
|
152
|
+
// Both need start dates to compare
|
|
153
|
+
if (!fact1.parsed.start || !fact2.parsed.start) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
const start1 = new Date(fact1.parsed.start).getTime();
|
|
157
|
+
const end1 = fact1.parsed.end ? new Date(fact1.parsed.end).getTime() : Infinity;
|
|
158
|
+
const start2 = new Date(fact2.parsed.start).getTime();
|
|
159
|
+
const end2 = fact2.parsed.end ? new Date(fact2.parsed.end).getTime() : Infinity;
|
|
160
|
+
// Check for overlap
|
|
161
|
+
return start1 <= end2 && start2 <= end1;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if fact1 is more recent than fact2
|
|
165
|
+
*/
|
|
166
|
+
function isMoreRecent(fact1, fact2) {
|
|
167
|
+
if (!fact1.parsed.start)
|
|
168
|
+
return false;
|
|
169
|
+
if (!fact2.parsed.start)
|
|
170
|
+
return true;
|
|
171
|
+
const date1 = new Date(fact1.parsed.start).getTime();
|
|
172
|
+
const date2 = new Date(fact2.parsed.start).getTime();
|
|
173
|
+
return date1 > date2;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Clean up expired temporal facts
|
|
177
|
+
* Can be run as a background job
|
|
178
|
+
*/
|
|
179
|
+
export async function cleanupExpiredTemporalFacts(projectId) {
|
|
180
|
+
let expiredCount = 0;
|
|
181
|
+
try {
|
|
182
|
+
const db = await getDb();
|
|
183
|
+
const schema = await getSchema();
|
|
184
|
+
const now = new Date();
|
|
185
|
+
const whereClause = projectId
|
|
186
|
+
? and(eq(schema.memories.projectId, projectId), eq(schema.memories.status, 'active'), lt(schema.memories.validTo, now))
|
|
187
|
+
: and(eq(schema.memories.status, 'active'), lt(schema.memories.validTo, now));
|
|
188
|
+
const expired = await db
|
|
189
|
+
.select()
|
|
190
|
+
.from(schema.memories)
|
|
191
|
+
.where(whereClause);
|
|
192
|
+
for (const memory of expired) {
|
|
193
|
+
if (memory.isProtected)
|
|
194
|
+
continue;
|
|
195
|
+
await db
|
|
196
|
+
.update(schema.memories)
|
|
197
|
+
.set({
|
|
198
|
+
status: 'expired',
|
|
199
|
+
expiredAt: now,
|
|
200
|
+
updatedAt: now,
|
|
201
|
+
})
|
|
202
|
+
.where(eq(schema.memories.id, memory.id));
|
|
203
|
+
expiredCount++;
|
|
204
|
+
}
|
|
205
|
+
if (expiredCount > 0) {
|
|
206
|
+
logger.info('Cleaned up expired temporal facts', { expiredCount });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
logger.error('Error cleaning up expired temporal facts', error);
|
|
211
|
+
}
|
|
212
|
+
return expiredCount;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get temporal fact statistics for a project
|
|
216
|
+
*/
|
|
217
|
+
export async function getTemporalFactsStats(projectId) {
|
|
218
|
+
try {
|
|
219
|
+
const db = await getDb();
|
|
220
|
+
const schema = await getSchema();
|
|
221
|
+
const now = new Date();
|
|
222
|
+
const whereClause = projectId
|
|
223
|
+
? eq(schema.memories.projectId, projectId)
|
|
224
|
+
: undefined;
|
|
225
|
+
const memories = await db
|
|
226
|
+
.select()
|
|
227
|
+
.from(schema.memories)
|
|
228
|
+
.where(whereClause);
|
|
229
|
+
let totalTemporalFacts = 0;
|
|
230
|
+
let validFacts = 0;
|
|
231
|
+
let expiredFacts = 0;
|
|
232
|
+
let supersededFacts = 0;
|
|
233
|
+
for (const memory of memories) {
|
|
234
|
+
// Check if memory has temporal facts
|
|
235
|
+
const facts = await parseTemporalFacts(memory.content);
|
|
236
|
+
if (facts.length > 0) {
|
|
237
|
+
totalTemporalFacts++;
|
|
238
|
+
if (memory.status === 'expired') {
|
|
239
|
+
expiredFacts++;
|
|
240
|
+
}
|
|
241
|
+
else if (memory.status === 'superseded') {
|
|
242
|
+
supersededFacts++;
|
|
243
|
+
}
|
|
244
|
+
else if (memory.status === 'active') {
|
|
245
|
+
// Check if still valid
|
|
246
|
+
if (memory.validTo && new Date(memory.validTo) < now) {
|
|
247
|
+
expiredFacts++;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
validFacts++;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return { totalTemporalFacts, validFacts, expiredFacts, supersededFacts };
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
logger.error('Error getting temporal facts stats', error);
|
|
259
|
+
return { totalTemporalFacts: 0, validFacts: 0, expiredFacts: 0, supersededFacts: 0 };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=temporal-facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal-facts.js","sourceRoot":"","sources":["../../../core/memory/temporal-facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface MemorySignals {
|
|
2
|
+
explicitTriggers: string[];
|
|
3
|
+
implicit: {
|
|
4
|
+
decision: boolean;
|
|
5
|
+
correction: boolean;
|
|
6
|
+
preference: boolean;
|
|
7
|
+
workflowRule: boolean;
|
|
8
|
+
lesson: boolean;
|
|
9
|
+
};
|
|
10
|
+
suggestedType: 'observation' | 'fact' | 'decision' | 'context' | 'preference';
|
|
11
|
+
priority: 'normal' | 'high';
|
|
12
|
+
}
|
|
13
|
+
export declare function detectMemorySignals(content: string): MemorySignals;
|
|
14
|
+
//# sourceMappingURL=trigger-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-detector.d.ts","sourceRoot":"","sources":["../../../core/memory/trigger-detector.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,EAAE;QACR,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,YAAY,EAAE,OAAO,CAAC;QACtB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,aAAa,EAAE,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;IAC9E,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC7B;AAcD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAiClE"}
|