stellar-memory 0.5.0
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/LICENSE +21 -0
- package/README.md +362 -0
- package/dist/api/routes/analytics.d.ts +15 -0
- package/dist/api/routes/analytics.js +131 -0
- package/dist/api/routes/analytics.js.map +1 -0
- package/dist/api/routes/conflicts.d.ts +12 -0
- package/dist/api/routes/conflicts.js +67 -0
- package/dist/api/routes/conflicts.js.map +1 -0
- package/dist/api/routes/consolidation.d.ts +11 -0
- package/dist/api/routes/consolidation.js +63 -0
- package/dist/api/routes/consolidation.js.map +1 -0
- package/dist/api/routes/constellation.d.ts +4 -0
- package/dist/api/routes/constellation.js +84 -0
- package/dist/api/routes/constellation.js.map +1 -0
- package/dist/api/routes/memories.d.ts +4 -0
- package/dist/api/routes/memories.js +219 -0
- package/dist/api/routes/memories.js.map +1 -0
- package/dist/api/routes/observations.d.ts +10 -0
- package/dist/api/routes/observations.js +42 -0
- package/dist/api/routes/observations.js.map +1 -0
- package/dist/api/routes/orbit.d.ts +4 -0
- package/dist/api/routes/orbit.js +71 -0
- package/dist/api/routes/orbit.js.map +1 -0
- package/dist/api/routes/projects.d.ts +15 -0
- package/dist/api/routes/projects.js +121 -0
- package/dist/api/routes/projects.js.map +1 -0
- package/dist/api/routes/scan.d.ts +4 -0
- package/dist/api/routes/scan.js +403 -0
- package/dist/api/routes/scan.js.map +1 -0
- package/dist/api/routes/sun.d.ts +4 -0
- package/dist/api/routes/sun.js +43 -0
- package/dist/api/routes/sun.js.map +1 -0
- package/dist/api/routes/system.d.ts +4 -0
- package/dist/api/routes/system.js +70 -0
- package/dist/api/routes/system.js.map +1 -0
- package/dist/api/routes/temporal.d.ts +13 -0
- package/dist/api/routes/temporal.js +82 -0
- package/dist/api/routes/temporal.js.map +1 -0
- package/dist/api/server.d.ts +2 -0
- package/dist/api/server.js +99 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/websocket.d.ts +53 -0
- package/dist/api/websocket.js +168 -0
- package/dist/api/websocket.js.map +1 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.js +35 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +10 -0
- package/dist/cli/init.js +163 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/engine/analytics.d.ts +93 -0
- package/dist/engine/analytics.js +437 -0
- package/dist/engine/analytics.js.map +1 -0
- package/dist/engine/conflict.d.ts +54 -0
- package/dist/engine/conflict.js +322 -0
- package/dist/engine/conflict.js.map +1 -0
- package/dist/engine/consolidation.d.ts +83 -0
- package/dist/engine/consolidation.js +368 -0
- package/dist/engine/consolidation.js.map +1 -0
- package/dist/engine/constellation.d.ts +66 -0
- package/dist/engine/constellation.js +382 -0
- package/dist/engine/constellation.js.map +1 -0
- package/dist/engine/corona.d.ts +53 -0
- package/dist/engine/corona.js +181 -0
- package/dist/engine/corona.js.map +1 -0
- package/dist/engine/embedding.d.ts +44 -0
- package/dist/engine/embedding.js +168 -0
- package/dist/engine/embedding.js.map +1 -0
- package/dist/engine/gravity.d.ts +63 -0
- package/dist/engine/gravity.js +121 -0
- package/dist/engine/gravity.js.map +1 -0
- package/dist/engine/multiproject.d.ts +75 -0
- package/dist/engine/multiproject.js +241 -0
- package/dist/engine/multiproject.js.map +1 -0
- package/dist/engine/observation.d.ts +82 -0
- package/dist/engine/observation.js +357 -0
- package/dist/engine/observation.js.map +1 -0
- package/dist/engine/orbit.d.ts +91 -0
- package/dist/engine/orbit.js +249 -0
- package/dist/engine/orbit.js.map +1 -0
- package/dist/engine/planet.d.ts +64 -0
- package/dist/engine/planet.js +432 -0
- package/dist/engine/planet.js.map +1 -0
- package/dist/engine/procedural.d.ts +71 -0
- package/dist/engine/procedural.js +259 -0
- package/dist/engine/procedural.js.map +1 -0
- package/dist/engine/quality.d.ts +48 -0
- package/dist/engine/quality.js +245 -0
- package/dist/engine/quality.js.map +1 -0
- package/dist/engine/repository.d.ts +79 -0
- package/dist/engine/repository.js +13 -0
- package/dist/engine/repository.js.map +1 -0
- package/dist/engine/sun.d.ts +61 -0
- package/dist/engine/sun.js +240 -0
- package/dist/engine/sun.js.map +1 -0
- package/dist/engine/temporal.d.ts +67 -0
- package/dist/engine/temporal.js +283 -0
- package/dist/engine/temporal.js.map +1 -0
- package/dist/engine/types.d.ts +179 -0
- package/dist/engine/types.js +27 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/connector-registry.d.ts +20 -0
- package/dist/mcp/connector-registry.js +35 -0
- package/dist/mcp/connector-registry.js.map +1 -0
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +242 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/daemon-tool.d.ts +16 -0
- package/dist/mcp/tools/daemon-tool.js +58 -0
- package/dist/mcp/tools/daemon-tool.js.map +1 -0
- package/dist/mcp/tools/ingestion-tools.d.ts +20 -0
- package/dist/mcp/tools/ingestion-tools.js +34 -0
- package/dist/mcp/tools/ingestion-tools.js.map +1 -0
- package/dist/mcp/tools/memory-tools.d.ts +122 -0
- package/dist/mcp/tools/memory-tools.js +1037 -0
- package/dist/mcp/tools/memory-tools.js.map +1 -0
- package/dist/scanner/cloud/github.d.ts +34 -0
- package/dist/scanner/cloud/github.js +260 -0
- package/dist/scanner/cloud/github.js.map +1 -0
- package/dist/scanner/cloud/google-drive.d.ts +30 -0
- package/dist/scanner/cloud/google-drive.js +289 -0
- package/dist/scanner/cloud/google-drive.js.map +1 -0
- package/dist/scanner/cloud/notion.d.ts +33 -0
- package/dist/scanner/cloud/notion.js +231 -0
- package/dist/scanner/cloud/notion.js.map +1 -0
- package/dist/scanner/cloud/slack.d.ts +38 -0
- package/dist/scanner/cloud/slack.js +282 -0
- package/dist/scanner/cloud/slack.js.map +1 -0
- package/dist/scanner/cloud/types.d.ts +73 -0
- package/dist/scanner/cloud/types.js +9 -0
- package/dist/scanner/cloud/types.js.map +1 -0
- package/dist/scanner/index.d.ts +35 -0
- package/dist/scanner/index.js +420 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/local/filesystem.d.ts +33 -0
- package/dist/scanner/local/filesystem.js +203 -0
- package/dist/scanner/local/filesystem.js.map +1 -0
- package/dist/scanner/local/git.d.ts +24 -0
- package/dist/scanner/local/git.js +161 -0
- package/dist/scanner/local/git.js.map +1 -0
- package/dist/scanner/local/parsers/code.d.ts +3 -0
- package/dist/scanner/local/parsers/code.js +127 -0
- package/dist/scanner/local/parsers/code.js.map +1 -0
- package/dist/scanner/local/parsers/index.d.ts +11 -0
- package/dist/scanner/local/parsers/index.js +24 -0
- package/dist/scanner/local/parsers/index.js.map +1 -0
- package/dist/scanner/local/parsers/json-parser.d.ts +3 -0
- package/dist/scanner/local/parsers/json-parser.js +117 -0
- package/dist/scanner/local/parsers/json-parser.js.map +1 -0
- package/dist/scanner/local/parsers/markdown.d.ts +3 -0
- package/dist/scanner/local/parsers/markdown.js +120 -0
- package/dist/scanner/local/parsers/markdown.js.map +1 -0
- package/dist/scanner/local/parsers/text.d.ts +3 -0
- package/dist/scanner/local/parsers/text.js +41 -0
- package/dist/scanner/local/parsers/text.js.map +1 -0
- package/dist/scanner/metadata-scanner.d.ts +67 -0
- package/dist/scanner/metadata-scanner.js +356 -0
- package/dist/scanner/metadata-scanner.js.map +1 -0
- package/dist/scanner/types.d.ts +47 -0
- package/dist/scanner/types.js +19 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/service/daemon.d.ts +23 -0
- package/dist/service/daemon.js +105 -0
- package/dist/service/daemon.js.map +1 -0
- package/dist/service/scheduler.d.ts +73 -0
- package/dist/service/scheduler.js +281 -0
- package/dist/service/scheduler.js.map +1 -0
- package/dist/storage/database.d.ts +10 -0
- package/dist/storage/database.js +265 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/queries.d.ts +85 -0
- package/dist/storage/queries.js +865 -0
- package/dist/storage/queries.js.map +1 -0
- package/dist/storage/sqlite-repository.d.ts +32 -0
- package/dist/storage/sqlite-repository.js +68 -0
- package/dist/storage/sqlite-repository.js.map +1 -0
- package/dist/storage/vec.d.ts +62 -0
- package/dist/storage/vec.js +111 -0
- package/dist/storage/vec.js.map +1 -0
- package/dist/utils/config.d.ts +5 -0
- package/dist/utils/config.js +60 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/logger.js +86 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/time.d.ts +21 -0
- package/dist/utils/time.js +42 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/tokenizer.d.ts +13 -0
- package/dist/utils/tokenizer.js +46 -0
- package/dist/utils/tokenizer.js.map +1 -0
- package/package.json +77 -0
- package/scripts/check-node.mjs +36 -0
- package/scripts/setup.mjs +157 -0
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* analytics.ts — Memory Analytics
|
|
3
|
+
*
|
|
4
|
+
* Purely computational analysis of memory usage patterns, health metrics,
|
|
5
|
+
* and insights derived from memory and orbit_log data.
|
|
6
|
+
*
|
|
7
|
+
* No side effects — all functions are read-only queries.
|
|
8
|
+
*/
|
|
9
|
+
import { ORBIT_ZONES } from './types.js';
|
|
10
|
+
import { getAnalytics, getTopTags, getMemoriesByProject, getConflicts, } from '../storage/queries.js';
|
|
11
|
+
import { getDatabase } from '../storage/database.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// getFullAnalytics
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/**
|
|
16
|
+
* Get comprehensive analytics for a project.
|
|
17
|
+
* Wraps queries.getAnalytics() and ensures all fields are populated.
|
|
18
|
+
*/
|
|
19
|
+
export function getFullAnalytics(project) {
|
|
20
|
+
return getAnalytics(project);
|
|
21
|
+
}
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// getSurvivalCurve
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
/**
|
|
26
|
+
* Memory survival analysis — how do memories fare over time?
|
|
27
|
+
*
|
|
28
|
+
* Groups memories by age bucket (days since creation) and reports:
|
|
29
|
+
* - survivingCount: still in habitable zone or closer (distance < 15)
|
|
30
|
+
* - accessedCount: accessed at least once
|
|
31
|
+
* - forgottenCount: pushed to Oort (distance >= 70) or soft-deleted
|
|
32
|
+
*/
|
|
33
|
+
export function getSurvivalCurve(project) {
|
|
34
|
+
const db = getDatabase();
|
|
35
|
+
const rows = db.prepare(`
|
|
36
|
+
SELECT
|
|
37
|
+
CAST(
|
|
38
|
+
(julianday('now') - julianday(created_at)) AS INTEGER
|
|
39
|
+
) as age_days,
|
|
40
|
+
distance,
|
|
41
|
+
access_count,
|
|
42
|
+
deleted_at
|
|
43
|
+
FROM memories
|
|
44
|
+
WHERE project = ?
|
|
45
|
+
`).all(project);
|
|
46
|
+
// Bucket by age: 0, 1, 3, 7, 14, 30, 60, 90, 180, 365+
|
|
47
|
+
const BUCKETS = [0, 1, 3, 7, 14, 30, 60, 90, 180, 365];
|
|
48
|
+
function bucketFor(age) {
|
|
49
|
+
for (let i = BUCKETS.length - 1; i >= 0; i--) {
|
|
50
|
+
if (age >= BUCKETS[i])
|
|
51
|
+
return BUCKETS[i];
|
|
52
|
+
}
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
const bucketMap = new Map();
|
|
56
|
+
for (const row of rows) {
|
|
57
|
+
const bucket = bucketFor(Math.max(0, row.age_days));
|
|
58
|
+
const entry = bucketMap.get(bucket) ?? { surviving: 0, accessed: 0, forgotten: 0 };
|
|
59
|
+
const isDeleted = row.deleted_at !== null;
|
|
60
|
+
const isOort = row.distance >= ORBIT_ZONES.forgotten.min;
|
|
61
|
+
const isActive = row.distance < ORBIT_ZONES.active.max; // core + near + active
|
|
62
|
+
if (isDeleted || isOort) {
|
|
63
|
+
entry.forgotten++;
|
|
64
|
+
}
|
|
65
|
+
else if (isActive) {
|
|
66
|
+
entry.surviving++;
|
|
67
|
+
}
|
|
68
|
+
if (row.access_count > 0) {
|
|
69
|
+
entry.accessed++;
|
|
70
|
+
}
|
|
71
|
+
bucketMap.set(bucket, entry);
|
|
72
|
+
}
|
|
73
|
+
return BUCKETS
|
|
74
|
+
.filter(b => bucketMap.has(b))
|
|
75
|
+
.map(b => {
|
|
76
|
+
const e = bucketMap.get(b);
|
|
77
|
+
return {
|
|
78
|
+
ageInDays: b,
|
|
79
|
+
survivingCount: e.surviving,
|
|
80
|
+
accessedCount: e.accessed,
|
|
81
|
+
forgottenCount: e.forgotten,
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// getOrbitMovements
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
/**
|
|
89
|
+
* Analyze orbit_log to find which memories have moved the most.
|
|
90
|
+
*
|
|
91
|
+
* Returns up to 20 memories sorted by movement activity (most log entries first).
|
|
92
|
+
*/
|
|
93
|
+
export function getOrbitMovements(project, days = 30) {
|
|
94
|
+
const db = getDatabase();
|
|
95
|
+
const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
|
|
96
|
+
const logRows = db.prepare(`
|
|
97
|
+
SELECT ol.memory_id, ol.old_distance, ol.new_distance, ol.trigger, ol.created_at,
|
|
98
|
+
m.summary
|
|
99
|
+
FROM orbit_log ol
|
|
100
|
+
LEFT JOIN memories m ON m.id = ol.memory_id
|
|
101
|
+
WHERE ol.project = ? AND ol.created_at >= ?
|
|
102
|
+
ORDER BY ol.created_at ASC
|
|
103
|
+
`).all(project, cutoff);
|
|
104
|
+
// Group by memory_id
|
|
105
|
+
const grouped = new Map();
|
|
106
|
+
for (const row of logRows) {
|
|
107
|
+
const entry = grouped.get(row.memory_id) ?? {
|
|
108
|
+
summary: row.summary ?? row.memory_id.slice(0, 8),
|
|
109
|
+
movements: [],
|
|
110
|
+
};
|
|
111
|
+
entry.movements.push({
|
|
112
|
+
timestamp: row.created_at,
|
|
113
|
+
oldDistance: row.old_distance,
|
|
114
|
+
newDistance: row.new_distance,
|
|
115
|
+
trigger: row.trigger,
|
|
116
|
+
});
|
|
117
|
+
grouped.set(row.memory_id, entry);
|
|
118
|
+
}
|
|
119
|
+
// Calculate net movement and sort by most active
|
|
120
|
+
return [...grouped.entries()]
|
|
121
|
+
.map(([memoryId, data]) => {
|
|
122
|
+
const first = data.movements[0];
|
|
123
|
+
const last = data.movements[data.movements.length - 1];
|
|
124
|
+
const netMovement = last.newDistance - first.oldDistance; // positive = moved away
|
|
125
|
+
return {
|
|
126
|
+
memoryId,
|
|
127
|
+
summary: data.summary,
|
|
128
|
+
movements: data.movements,
|
|
129
|
+
netMovement,
|
|
130
|
+
};
|
|
131
|
+
})
|
|
132
|
+
.sort((a, b) => b.movements.length - a.movements.length)
|
|
133
|
+
.slice(0, 20);
|
|
134
|
+
}
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
// getTopicClusters
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
/**
|
|
139
|
+
* Group memories by their primary tag to find topic clusters.
|
|
140
|
+
*
|
|
141
|
+
* For each tag, computes:
|
|
142
|
+
* - memory count
|
|
143
|
+
* - average importance
|
|
144
|
+
* - average distance
|
|
145
|
+
* - recent activity (accesses in last 7 days)
|
|
146
|
+
*
|
|
147
|
+
* Sorted by recent activity (most active clusters first).
|
|
148
|
+
*/
|
|
149
|
+
export function getTopicClusters(project) {
|
|
150
|
+
const memories = getMemoriesByProject(project);
|
|
151
|
+
if (memories.length === 0)
|
|
152
|
+
return [];
|
|
153
|
+
const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
154
|
+
// Build cluster map using primary tag (first tag in the array)
|
|
155
|
+
const clusterMap = new Map();
|
|
156
|
+
for (const memory of memories) {
|
|
157
|
+
const primaryTag = memory.tags[0];
|
|
158
|
+
if (!primaryTag)
|
|
159
|
+
continue; // skip untagged memories
|
|
160
|
+
const existing = clusterMap.get(primaryTag) ?? {
|
|
161
|
+
count: 0,
|
|
162
|
+
importanceSum: 0,
|
|
163
|
+
distanceSum: 0,
|
|
164
|
+
recentActivity: 0,
|
|
165
|
+
};
|
|
166
|
+
existing.count++;
|
|
167
|
+
existing.importanceSum += memory.importance;
|
|
168
|
+
existing.distanceSum += memory.distance;
|
|
169
|
+
const recentlyAccessed = memory.last_accessed_at !== null &&
|
|
170
|
+
memory.last_accessed_at >= sevenDaysAgo;
|
|
171
|
+
if (recentlyAccessed) {
|
|
172
|
+
existing.recentActivity++;
|
|
173
|
+
}
|
|
174
|
+
clusterMap.set(primaryTag, existing);
|
|
175
|
+
}
|
|
176
|
+
return [...clusterMap.entries()]
|
|
177
|
+
.map(([topic, data]) => ({
|
|
178
|
+
topic,
|
|
179
|
+
memoryCount: data.count,
|
|
180
|
+
avgImportance: data.importanceSum / data.count,
|
|
181
|
+
avgDistance: data.distanceSum / data.count,
|
|
182
|
+
recentActivity: data.recentActivity,
|
|
183
|
+
}))
|
|
184
|
+
.sort((a, b) => b.recentActivity - a.recentActivity || b.memoryCount - a.memoryCount);
|
|
185
|
+
}
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
// detectAccessPatterns
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
/**
|
|
190
|
+
* Detect periodic access patterns from orbit_log entries.
|
|
191
|
+
*
|
|
192
|
+
* Heuristics:
|
|
193
|
+
* - Daily pattern: a tag/group accessed multiple times in a day consistently
|
|
194
|
+
* - Weekly pattern: accesses concentrated on specific day-of-week
|
|
195
|
+
* - Burst pattern: high access concentration in recent days
|
|
196
|
+
*/
|
|
197
|
+
export function detectAccessPatterns(project) {
|
|
198
|
+
const db = getDatabase();
|
|
199
|
+
// Get access events (trigger = 'access') from orbit_log in last 30 days
|
|
200
|
+
const cutoff = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString();
|
|
201
|
+
const accessRows = db.prepare(`
|
|
202
|
+
SELECT memory_id, created_at
|
|
203
|
+
FROM orbit_log
|
|
204
|
+
WHERE project = ? AND trigger = 'access' AND created_at >= ?
|
|
205
|
+
ORDER BY created_at ASC
|
|
206
|
+
`).all(project, cutoff);
|
|
207
|
+
if (accessRows.length === 0)
|
|
208
|
+
return [];
|
|
209
|
+
const patterns = [];
|
|
210
|
+
// Day-of-week analysis
|
|
211
|
+
const dowCounts = new Array(7).fill(0);
|
|
212
|
+
const hourCounts = new Array(24).fill(0);
|
|
213
|
+
for (const row of accessRows) {
|
|
214
|
+
const d = new Date(row.created_at);
|
|
215
|
+
dowCounts[d.getDay()]++;
|
|
216
|
+
hourCounts[d.getHours()]++;
|
|
217
|
+
}
|
|
218
|
+
const DOW_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|
219
|
+
const avgPerDay = accessRows.length / 7;
|
|
220
|
+
// Find days with significantly above-average access (>2x average)
|
|
221
|
+
const activeDays = dowCounts
|
|
222
|
+
.map((count, day) => ({ day, count }))
|
|
223
|
+
.filter(d => d.count > avgPerDay * 2)
|
|
224
|
+
.sort((a, b) => b.count - a.count);
|
|
225
|
+
if (activeDays.length > 0) {
|
|
226
|
+
const dayNames = activeDays.map(d => DOW_NAMES[d.day]).join(', ');
|
|
227
|
+
patterns.push({
|
|
228
|
+
pattern: 'weekly',
|
|
229
|
+
description: `Memory access concentrated on ${dayNames}`,
|
|
230
|
+
frequency: `${activeDays[0].count} accesses on peak day`,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
// Find peak hours (>2x average)
|
|
234
|
+
const avgPerHour = accessRows.length / 24;
|
|
235
|
+
const peakHours = hourCounts
|
|
236
|
+
.map((count, hour) => ({ hour, count }))
|
|
237
|
+
.filter(h => h.count > avgPerHour * 2)
|
|
238
|
+
.sort((a, b) => b.count - a.count)
|
|
239
|
+
.slice(0, 3);
|
|
240
|
+
if (peakHours.length > 0) {
|
|
241
|
+
const hourStrs = peakHours.map(h => `${h.hour}:00`).join(', ');
|
|
242
|
+
patterns.push({
|
|
243
|
+
pattern: 'daily',
|
|
244
|
+
description: `Peak memory access at ${hourStrs}`,
|
|
245
|
+
frequency: `${peakHours[0].count} accesses in peak hour`,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
// Burst detection: compare last 7 days vs previous 7 days
|
|
249
|
+
const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
250
|
+
const fourteenDaysAgo = new Date(Date.now() - 14 * 24 * 60 * 60 * 1000).toISOString();
|
|
251
|
+
const recentCount = accessRows.filter(r => r.created_at >= sevenDaysAgo).length;
|
|
252
|
+
const prevCount = accessRows.filter(r => r.created_at >= fourteenDaysAgo && r.created_at < sevenDaysAgo).length;
|
|
253
|
+
if (recentCount > prevCount * 2 && recentCount >= 5) {
|
|
254
|
+
patterns.push({
|
|
255
|
+
pattern: 'burst',
|
|
256
|
+
description: `Memory access surged this week (${recentCount} vs ${prevCount} prior week)`,
|
|
257
|
+
frequency: `${recentCount} accesses in last 7 days`,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
return patterns;
|
|
261
|
+
}
|
|
262
|
+
// ---------------------------------------------------------------------------
|
|
263
|
+
// getMemoryHealth
|
|
264
|
+
// ---------------------------------------------------------------------------
|
|
265
|
+
/**
|
|
266
|
+
* Compute health metrics and generate actionable recommendations.
|
|
267
|
+
*/
|
|
268
|
+
export function getMemoryHealth(project) {
|
|
269
|
+
const memories = getMemoriesByProject(project);
|
|
270
|
+
const totalMemories = memories.length;
|
|
271
|
+
if (totalMemories === 0) {
|
|
272
|
+
return {
|
|
273
|
+
totalMemories: 0,
|
|
274
|
+
activeRatio: 0,
|
|
275
|
+
staleRatio: 0,
|
|
276
|
+
qualityAvg: 0,
|
|
277
|
+
conflictRatio: 0,
|
|
278
|
+
consolidationOpportunities: 0,
|
|
279
|
+
recommendations: ['No memories found. Start storing memories with the remember tool.'],
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString();
|
|
283
|
+
// Active = core + near + active (distance < 15)
|
|
284
|
+
const activeCount = memories.filter(m => m.distance < ORBIT_ZONES.active.max).length;
|
|
285
|
+
const activeRatio = activeCount / totalMemories;
|
|
286
|
+
// Stale = not accessed in 30+ days
|
|
287
|
+
const staleCount = memories.filter(m => {
|
|
288
|
+
const lastAccess = m.last_accessed_at ?? m.created_at;
|
|
289
|
+
return lastAccess < thirtyDaysAgo;
|
|
290
|
+
}).length;
|
|
291
|
+
const staleRatio = staleCount / totalMemories;
|
|
292
|
+
// Quality average
|
|
293
|
+
const qualityValues = memories
|
|
294
|
+
.map(m => m.quality_score)
|
|
295
|
+
.filter((q) => q !== undefined && q !== null);
|
|
296
|
+
const qualityAvg = qualityValues.length > 0
|
|
297
|
+
? qualityValues.reduce((a, b) => a + b, 0) / qualityValues.length
|
|
298
|
+
: 0.5;
|
|
299
|
+
// Conflicts
|
|
300
|
+
const openConflicts = getConflicts(project, 'open');
|
|
301
|
+
const conflictRatio = openConflicts.length / totalMemories;
|
|
302
|
+
// Consolidation opportunities: memories with consolidated_into set
|
|
303
|
+
// indicate past consolidations; estimate future opportunities by finding
|
|
304
|
+
// memories with very similar summaries (same type + close distance + similar importance)
|
|
305
|
+
const consolidationOpportunities = estimateConsolidationOpportunities(memories);
|
|
306
|
+
// Build recommendations
|
|
307
|
+
const recommendations = [];
|
|
308
|
+
if (staleCount > 10) {
|
|
309
|
+
recommendations.push(`${staleCount} memories have not been accessed in 30+ days. Run orbit to recalculate positions.`);
|
|
310
|
+
}
|
|
311
|
+
if (consolidationOpportunities > 3) {
|
|
312
|
+
recommendations.push(`${consolidationOpportunities} similar memories may be consolidatable. Run consolidate to merge them.`);
|
|
313
|
+
}
|
|
314
|
+
if (openConflicts.length > 0) {
|
|
315
|
+
recommendations.push(`${openConflicts.length} unresolved conflict${openConflicts.length > 1 ? 's' : ''} detected. Review and resolve them.`);
|
|
316
|
+
}
|
|
317
|
+
if (qualityAvg < 0.4 && qualityValues.length > 0) {
|
|
318
|
+
recommendations.push('Average quality score is below 0.4. Store more specific, actionable memories.');
|
|
319
|
+
}
|
|
320
|
+
if (activeRatio < 0.3 && totalMemories > 20) {
|
|
321
|
+
recommendations.push(`Only ${Math.round(activeRatio * 100)}% of memories are in active zones. Run orbit to refresh positions.`);
|
|
322
|
+
}
|
|
323
|
+
return {
|
|
324
|
+
totalMemories,
|
|
325
|
+
activeRatio,
|
|
326
|
+
staleRatio,
|
|
327
|
+
qualityAvg,
|
|
328
|
+
conflictRatio,
|
|
329
|
+
consolidationOpportunities,
|
|
330
|
+
recommendations,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Estimate how many memories could be consolidated.
|
|
335
|
+
* Heuristic: same type AND within similar importance range (±0.1) AND similar distance.
|
|
336
|
+
* We use a simple O(n²) check bounded at n=200 to avoid performance issues.
|
|
337
|
+
*/
|
|
338
|
+
function estimateConsolidationOpportunities(memories) {
|
|
339
|
+
const sample = memories.slice(0, 200);
|
|
340
|
+
const visited = new Set();
|
|
341
|
+
let count = 0;
|
|
342
|
+
for (let i = 0; i < sample.length; i++) {
|
|
343
|
+
if (visited.has(i))
|
|
344
|
+
continue;
|
|
345
|
+
for (let j = i + 1; j < sample.length; j++) {
|
|
346
|
+
if (visited.has(j))
|
|
347
|
+
continue;
|
|
348
|
+
const a = sample[i];
|
|
349
|
+
const b = sample[j];
|
|
350
|
+
if (a.type === b.type &&
|
|
351
|
+
Math.abs(a.importance - b.importance) < 0.1 &&
|
|
352
|
+
Math.abs(a.distance - b.distance) < 5) {
|
|
353
|
+
count++;
|
|
354
|
+
visited.add(j);
|
|
355
|
+
break; // one pair per memory — don't double count
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return count;
|
|
360
|
+
}
|
|
361
|
+
// ---------------------------------------------------------------------------
|
|
362
|
+
// generateReport
|
|
363
|
+
// ---------------------------------------------------------------------------
|
|
364
|
+
/**
|
|
365
|
+
* Compile all analytics into a readable text report.
|
|
366
|
+
* Suitable for display in terminal or chat.
|
|
367
|
+
*/
|
|
368
|
+
export function generateReport(project) {
|
|
369
|
+
const analytics = getFullAnalytics(project);
|
|
370
|
+
const health = getMemoryHealth(project);
|
|
371
|
+
const clusters = getTopicClusters(project).slice(0, 5);
|
|
372
|
+
const patterns = detectAccessPatterns(project);
|
|
373
|
+
const topTags = getTopTags(project, 10);
|
|
374
|
+
const lines = [
|
|
375
|
+
`# Stellar Memory Report — Project: ${project}`,
|
|
376
|
+
`Generated: ${new Date().toISOString()}`,
|
|
377
|
+
'',
|
|
378
|
+
'## Overview',
|
|
379
|
+
`Total memories: ${analytics.total_memories}`,
|
|
380
|
+
`Average importance: ${(analytics.avg_importance * 100).toFixed(1)}%`,
|
|
381
|
+
`Average quality: ${(analytics.avg_quality * 100).toFixed(1)}%`,
|
|
382
|
+
`Recall success rate: ${(analytics.recall_success_rate * 100).toFixed(1)}%`,
|
|
383
|
+
`Consolidations: ${analytics.consolidation_count}`,
|
|
384
|
+
`Open conflicts: ${analytics.conflict_count}`,
|
|
385
|
+
'',
|
|
386
|
+
'## Zone Distribution',
|
|
387
|
+
];
|
|
388
|
+
const zoneOrder = ['core', 'near', 'active', 'archive', 'fading', 'forgotten'];
|
|
389
|
+
for (const zone of zoneOrder) {
|
|
390
|
+
const count = analytics.zone_distribution[zone] ?? 0;
|
|
391
|
+
const bar = '#'.repeat(Math.min(20, count));
|
|
392
|
+
lines.push(` ${zone.padEnd(10)} ${String(count).padStart(4)} ${bar}`);
|
|
393
|
+
}
|
|
394
|
+
lines.push('');
|
|
395
|
+
lines.push('## Type Distribution');
|
|
396
|
+
for (const [type, count] of Object.entries(analytics.type_distribution).sort(([, a], [, b]) => b - a)) {
|
|
397
|
+
lines.push(` ${type.padEnd(12)} ${count}`);
|
|
398
|
+
}
|
|
399
|
+
if (topTags.length > 0) {
|
|
400
|
+
lines.push('');
|
|
401
|
+
lines.push('## Top Tags');
|
|
402
|
+
for (const { tag, count } of topTags) {
|
|
403
|
+
lines.push(` ${tag.padEnd(20)} ${count}`);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
if (clusters.length > 0) {
|
|
407
|
+
lines.push('');
|
|
408
|
+
lines.push('## Active Topic Clusters');
|
|
409
|
+
for (const cluster of clusters) {
|
|
410
|
+
lines.push(` ${cluster.topic.padEnd(20)} ${cluster.memoryCount} memories` +
|
|
411
|
+
` avg importance: ${(cluster.avgImportance * 100).toFixed(0)}%` +
|
|
412
|
+
` recent activity: ${cluster.recentActivity}`);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
if (patterns.length > 0) {
|
|
416
|
+
lines.push('');
|
|
417
|
+
lines.push('## Access Patterns');
|
|
418
|
+
for (const p of patterns) {
|
|
419
|
+
lines.push(` [${p.pattern}] ${p.description} (${p.frequency})`);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
lines.push('');
|
|
423
|
+
lines.push('## Health Assessment');
|
|
424
|
+
lines.push(`Active ratio: ${(health.activeRatio * 100).toFixed(1)}%`);
|
|
425
|
+
lines.push(`Stale ratio: ${(health.staleRatio * 100).toFixed(1)}%`);
|
|
426
|
+
lines.push(`Conflict ratio: ${(health.conflictRatio * 100).toFixed(1)}%`);
|
|
427
|
+
lines.push(`Consolidation opportunities: ${health.consolidationOpportunities}`);
|
|
428
|
+
if (health.recommendations.length > 0) {
|
|
429
|
+
lines.push('');
|
|
430
|
+
lines.push('## Recommendations');
|
|
431
|
+
for (const rec of health.recommendations) {
|
|
432
|
+
lines.push(` - ${rec}`);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return lines.join('\n');
|
|
436
|
+
}
|
|
437
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/engine/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* conflict.ts — Conflict Detection engine
|
|
3
|
+
*
|
|
4
|
+
* Finds contradictions between memories. When a new memory is stored,
|
|
5
|
+
* this module checks existing memories for semantic conflicts and creates
|
|
6
|
+
* MemoryConflict records for any detected issues.
|
|
7
|
+
*
|
|
8
|
+
* Detection is purely local — no LLM required. Heuristics use keyword
|
|
9
|
+
* overlap, negation patterns, and opposing action verbs.
|
|
10
|
+
*
|
|
11
|
+
* All functions are pure (no classes), following the project style.
|
|
12
|
+
*/
|
|
13
|
+
import type { Memory, MemoryConflict } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Check for conflicts when storing a new memory.
|
|
16
|
+
*
|
|
17
|
+
* Searches for up to 5 similar existing memories via FTS5, then analyzes
|
|
18
|
+
* each pair for semantic contradictions. Detected conflicts are persisted
|
|
19
|
+
* and returned to the caller.
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectConflicts(newMemory: Memory, project: string): Promise<MemoryConflict[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Attempt to auto-resolve a conflict without user intervention.
|
|
24
|
+
*
|
|
25
|
+
* Auto-resolves when the newer memory clearly supersedes the older one:
|
|
26
|
+
* - The conflict memory was created after the conflicting memory
|
|
27
|
+
* - Severity is high (strong signal of supersession)
|
|
28
|
+
*
|
|
29
|
+
* Returns true if resolved (and calls temporal.supersedeMemory),
|
|
30
|
+
* or false if user decision is needed.
|
|
31
|
+
*/
|
|
32
|
+
export declare function autoResolveConflict(conflict: MemoryConflict): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Format conflict warnings as human-readable text.
|
|
35
|
+
*
|
|
36
|
+
* Returns a warning string listing each conflict with memory summaries.
|
|
37
|
+
* Designed to be returned to the user as part of a remember tool response.
|
|
38
|
+
*/
|
|
39
|
+
export declare function formatConflictWarnings(conflicts: MemoryConflict[]): string;
|
|
40
|
+
/**
|
|
41
|
+
* Return all open (unresolved) conflicts for a project.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getUnresolvedConflicts(project: string): MemoryConflict[];
|
|
44
|
+
/**
|
|
45
|
+
* Resolve a conflict manually.
|
|
46
|
+
*
|
|
47
|
+
* Actions:
|
|
48
|
+
* - 'supersede': mark resolved and call temporal.supersedeMemory()
|
|
49
|
+
* (conflicting_memory_id superseded by memory_id)
|
|
50
|
+
* - 'dismiss': mark resolved without any memory changes
|
|
51
|
+
* - 'keep_both': mark resolved with a note that both are intentionally kept
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveConflict(conflictId: string, resolution: string, action?: 'supersede' | 'dismiss' | 'keep_both'): void;
|
|
54
|
+
//# sourceMappingURL=conflict.d.ts.map
|