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,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* orbit.ts — Core importance function and orbital mechanics
|
|
3
|
+
*
|
|
4
|
+
* Implements the celestial mechanics metaphor:
|
|
5
|
+
* - High importance → small orbital distance (close to the sun)
|
|
6
|
+
* - Low importance → large orbital distance (far from the sun, fading)
|
|
7
|
+
* - Access boost → pulls a memory closer when it is recalled
|
|
8
|
+
* - Decay → memories drift outward over time via recency score
|
|
9
|
+
*/
|
|
10
|
+
import { ORBIT_ZONES } from './types.js';
|
|
11
|
+
import { keywordRelevance, hybridRelevance } from './gravity.js';
|
|
12
|
+
import { getMemoriesByProject, updateMemoryOrbit, insertOrbitLog, getSunState, cleanupOrbitLog, } from '../storage/queries.js';
|
|
13
|
+
import { getDatabase } from '../storage/database.js';
|
|
14
|
+
import { corona } from './corona.js';
|
|
15
|
+
import { qualityOrbitAdjustment } from './quality.js';
|
|
16
|
+
import { getProceduralDecayMultiplier } from './procedural.js';
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Scoring primitives
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/**
|
|
21
|
+
* Calculate recency score using exponential decay.
|
|
22
|
+
*
|
|
23
|
+
* Formula: 0.5 ^ (hoursSince / effectiveHalfLife)
|
|
24
|
+
* - At t=0 → score = 1.0
|
|
25
|
+
* - At t=halfLife → score = 0.5
|
|
26
|
+
* - At t=2×halfLife → score = 0.25
|
|
27
|
+
*
|
|
28
|
+
* Procedural memories use a slower decay rate (halfLife / 0.3 ≈ 240h for default 72h)
|
|
29
|
+
* so hard-won knowledge persists longer.
|
|
30
|
+
*
|
|
31
|
+
* Returns a value in [0, 1].
|
|
32
|
+
*/
|
|
33
|
+
export function recencyScore(lastAccessedAt, createdAt, halfLifeHours = 72, memoryType) {
|
|
34
|
+
const referenceTime = lastAccessedAt ?? createdAt;
|
|
35
|
+
// Append 'Z' only when there is no existing timezone designator so that
|
|
36
|
+
// Date.parse interprets bare ISO strings as UTC rather than local time.
|
|
37
|
+
const normalized = /[Zz]$|[+-]\d{2}:\d{2}$/.test(referenceTime)
|
|
38
|
+
? referenceTime
|
|
39
|
+
: referenceTime + 'Z';
|
|
40
|
+
const refMs = new Date(normalized).getTime();
|
|
41
|
+
if (isNaN(refMs))
|
|
42
|
+
throw new Error(`Invalid reference date: "${referenceTime}"`);
|
|
43
|
+
const now = new Date();
|
|
44
|
+
const hoursSince = (now.getTime() - refMs) / (1000 * 60 * 60);
|
|
45
|
+
// Procedural memories decay ~3.3x slower than normal
|
|
46
|
+
const effectiveHalfLife = memoryType === 'procedural'
|
|
47
|
+
? halfLifeHours / getProceduralDecayMultiplier()
|
|
48
|
+
: halfLifeHours;
|
|
49
|
+
return Math.pow(0.5, Math.max(0, hoursSince) / effectiveHalfLife);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Calculate frequency score using logarithmic saturation.
|
|
53
|
+
*
|
|
54
|
+
* Formula: log(1 + count) / log(1 + saturationPoint)
|
|
55
|
+
* - Grows quickly for the first few accesses.
|
|
56
|
+
* - Plateaus as count approaches saturationPoint.
|
|
57
|
+
*
|
|
58
|
+
* Returns a value in [0, 1].
|
|
59
|
+
*/
|
|
60
|
+
export function frequencyScore(accessCount, saturationPoint = 20) {
|
|
61
|
+
if (saturationPoint <= 0)
|
|
62
|
+
throw new Error('saturationPoint must be positive');
|
|
63
|
+
return Math.min(1.0, Math.log(1 + accessCount) / Math.log(1 + saturationPoint));
|
|
64
|
+
}
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Composite importance
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
/**
|
|
69
|
+
* Calculate overall importance from all four components.
|
|
70
|
+
*
|
|
71
|
+
* Weights are configured via StellarConfig and must sum to 1.0 for a
|
|
72
|
+
* meaningful 0–1 total (they do in the defaults: 0.30+0.20+0.30+0.20=1.00).
|
|
73
|
+
*/
|
|
74
|
+
export function calculateImportance(memory, sunText, config) {
|
|
75
|
+
const weights = config.weights;
|
|
76
|
+
const weightSum = weights.recency + weights.frequency + weights.impact + weights.relevance;
|
|
77
|
+
if (Math.abs(weightSum - 1.0) > 0.01) {
|
|
78
|
+
throw new Error(`Weights must sum to 1.0, got ${weightSum.toFixed(3)}`);
|
|
79
|
+
}
|
|
80
|
+
const rec = recencyScore(memory.last_accessed_at, memory.created_at, config.decayHalfLifeHours, memory.type);
|
|
81
|
+
const freq = frequencyScore(memory.access_count, config.frequencySaturationPoint);
|
|
82
|
+
const imp = memory.impact;
|
|
83
|
+
// Combine content + tags so tags act as relevance boosters.
|
|
84
|
+
const memoryText = memory.content + ' ' + memory.tags.join(' ');
|
|
85
|
+
// Attempt to load embeddings synchronously from the vec table for hybrid relevance.
|
|
86
|
+
// Falls back to keyword-only if embeddings are unavailable.
|
|
87
|
+
let rel;
|
|
88
|
+
try {
|
|
89
|
+
const db = getDatabase();
|
|
90
|
+
const memRow = db.prepare('SELECT embedding FROM memory_vec WHERE memory_id = ?').get(memory.id);
|
|
91
|
+
const sunState = getSunState(memory.project);
|
|
92
|
+
const sunText2 = sunState
|
|
93
|
+
? [sunState.current_work, ...sunState.recent_decisions, ...sunState.next_steps].join(' ')
|
|
94
|
+
: sunText;
|
|
95
|
+
if (memRow?.embedding) {
|
|
96
|
+
const memEmbedding = new Float32Array(memRow.embedding.buffer, memRow.embedding.byteOffset, memRow.embedding.byteLength / 4);
|
|
97
|
+
// Look up the sun embedding via the most-recent sun memory, if available.
|
|
98
|
+
const sunRow = db.prepare(`SELECT mv.embedding FROM memory_vec mv
|
|
99
|
+
JOIN memories m ON m.id = mv.memory_id
|
|
100
|
+
WHERE m.project = ? AND m.deleted_at IS NULL
|
|
101
|
+
ORDER BY m.importance DESC LIMIT 1`).get(memory.project);
|
|
102
|
+
const sunEmbedding = sunRow?.embedding
|
|
103
|
+
? new Float32Array(sunRow.embedding.buffer, sunRow.embedding.byteOffset, sunRow.embedding.byteLength / 4)
|
|
104
|
+
: undefined;
|
|
105
|
+
rel = hybridRelevance(memoryText, sunText2, memEmbedding, sunEmbedding);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
rel = keywordRelevance(memoryText, sunText);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
rel = keywordRelevance(memoryText, sunText);
|
|
113
|
+
}
|
|
114
|
+
const total = config.weights.recency * rec +
|
|
115
|
+
config.weights.frequency * freq +
|
|
116
|
+
config.weights.impact * imp +
|
|
117
|
+
config.weights.relevance * rel;
|
|
118
|
+
return {
|
|
119
|
+
recency: rec,
|
|
120
|
+
frequency: freq,
|
|
121
|
+
impact: imp,
|
|
122
|
+
relevance: rel,
|
|
123
|
+
total: Math.min(1.0, Math.max(0.0, total)),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// Distance mapping
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
/**
|
|
130
|
+
* Convert importance (0–1) to orbital distance (0.1–100).
|
|
131
|
+
*
|
|
132
|
+
* Uses quadratic mapping so that:
|
|
133
|
+
* - importance = 1.0 → distance ≈ 0.1 (core / working memory)
|
|
134
|
+
* - importance = 0.0 → distance = 100 (Oort cloud / nearly forgotten)
|
|
135
|
+
*
|
|
136
|
+
* The quadratic curve creates a non-linear relationship: a memory must fall
|
|
137
|
+
* significantly in importance before it drifts noticeably outward, which
|
|
138
|
+
* mirrors how cognitive salience works in practice.
|
|
139
|
+
*/
|
|
140
|
+
export function importanceToDistance(importance) {
|
|
141
|
+
const MIN_DISTANCE = 0.1;
|
|
142
|
+
const MAX_DISTANCE = 100.0;
|
|
143
|
+
const clamped = Math.min(1.0, Math.max(0.0, importance));
|
|
144
|
+
const normalized = Math.pow(1 - clamped, 2);
|
|
145
|
+
return MIN_DISTANCE + normalized * (MAX_DISTANCE - MIN_DISTANCE);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Inverse of importanceToDistance — derive importance from a given distance.
|
|
149
|
+
*
|
|
150
|
+
* Used when a user manually drags a memory to a new orbital position.
|
|
151
|
+
*/
|
|
152
|
+
export function distanceToImportance(distance) {
|
|
153
|
+
const MIN_DISTANCE = 0.1;
|
|
154
|
+
const MAX_DISTANCE = 100.0;
|
|
155
|
+
const clamped = Math.min(MAX_DISTANCE, Math.max(MIN_DISTANCE, distance));
|
|
156
|
+
const normalized = (clamped - MIN_DISTANCE) / (MAX_DISTANCE - MIN_DISTANCE);
|
|
157
|
+
return Math.max(0.0, Math.min(1.0, 1 - Math.sqrt(normalized)));
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Return the orbit zone label for a given distance.
|
|
161
|
+
*
|
|
162
|
+
* Iterates ORBIT_ZONES in definition order (core → forgotten) and returns the
|
|
163
|
+
* first zone whose [min, max) range contains the distance. Falls back to
|
|
164
|
+
* the 'forgotten' label for any distance at or beyond 70.
|
|
165
|
+
*/
|
|
166
|
+
export function getOrbitZone(distance) {
|
|
167
|
+
for (const [, zone] of Object.entries(ORBIT_ZONES)) {
|
|
168
|
+
if (distance >= zone.min && distance < zone.max) {
|
|
169
|
+
return zone.label;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Beyond all defined zones — treat as forgotten.
|
|
173
|
+
return ORBIT_ZONES.forgotten.label;
|
|
174
|
+
}
|
|
175
|
+
// ---------------------------------------------------------------------------
|
|
176
|
+
// Access boost
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
/**
|
|
179
|
+
* Apply access boost — pull a memory closer when it is recalled.
|
|
180
|
+
*
|
|
181
|
+
* The boost is proportional to the current distance so that:
|
|
182
|
+
* - Far-away memories (high distance) receive a large absolute pull.
|
|
183
|
+
* - Close memories (low distance) are nudged only slightly.
|
|
184
|
+
*
|
|
185
|
+
* MIN_BOOST ensures even core memories get a small reward.
|
|
186
|
+
* The floor of 0.1 prevents distance from going below the core minimum.
|
|
187
|
+
*/
|
|
188
|
+
export function applyAccessBoost(currentDistance) {
|
|
189
|
+
const BOOST_FACTOR = 0.3;
|
|
190
|
+
const MIN_BOOST = 0.5;
|
|
191
|
+
const pull = Math.max(MIN_BOOST, currentDistance * BOOST_FACTOR);
|
|
192
|
+
return Math.max(0.1, currentDistance - pull);
|
|
193
|
+
}
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
// Full orbit recalculation
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
/**
|
|
198
|
+
* Run a full orbit recalculation for all memories in a project.
|
|
199
|
+
*
|
|
200
|
+
* Called during stellar_commit and stellar_orbit. For each non-deleted memory:
|
|
201
|
+
* 1. Compute new importance using current sun context.
|
|
202
|
+
* 2. Map importance → distance.
|
|
203
|
+
* 3. If the distance shifted by more than 0.01, persist the change and log it.
|
|
204
|
+
*
|
|
205
|
+
* Returns every OrbitChange that was actually written.
|
|
206
|
+
*/
|
|
207
|
+
export function recalculateOrbits(project, config) {
|
|
208
|
+
const memories = getMemoriesByProject(project);
|
|
209
|
+
if (memories.length === 0) {
|
|
210
|
+
return [];
|
|
211
|
+
}
|
|
212
|
+
// Build sun context text for relevance scoring.
|
|
213
|
+
const sunState = getSunState(project);
|
|
214
|
+
const sunText = sunState
|
|
215
|
+
? [sunState.current_work, ...sunState.recent_decisions, ...sunState.next_steps].join(' ')
|
|
216
|
+
: '';
|
|
217
|
+
const changes = [];
|
|
218
|
+
for (const memory of memories) {
|
|
219
|
+
const components = calculateImportance(memory, sunText, config);
|
|
220
|
+
const newImportance = components.total;
|
|
221
|
+
// Apply quality-based orbit adjustment: low-quality memories drift further out
|
|
222
|
+
const qualityScore = memory.quality_score ?? 0.5;
|
|
223
|
+
const newDistance = importanceToDistance(newImportance) * qualityOrbitAdjustment(qualityScore);
|
|
224
|
+
const velocity = newDistance - memory.distance;
|
|
225
|
+
// Skip negligible drifts to avoid write churn.
|
|
226
|
+
if (Math.abs(velocity) <= 0.01) {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
const change = {
|
|
230
|
+
memory_id: memory.id,
|
|
231
|
+
project,
|
|
232
|
+
old_distance: memory.distance,
|
|
233
|
+
new_distance: newDistance,
|
|
234
|
+
old_importance: memory.importance,
|
|
235
|
+
new_importance: newImportance,
|
|
236
|
+
trigger: 'decay',
|
|
237
|
+
};
|
|
238
|
+
updateMemoryOrbit(memory.id, newDistance, newImportance, velocity);
|
|
239
|
+
insertOrbitLog(change);
|
|
240
|
+
changes.push(change);
|
|
241
|
+
}
|
|
242
|
+
// Prune orbit log entries older than 90 days to prevent unbounded growth.
|
|
243
|
+
cleanupOrbitLog(90);
|
|
244
|
+
// Refresh the corona cache after orbit recalculation so distance changes
|
|
245
|
+
// are reflected in the in-memory tier immediately.
|
|
246
|
+
corona.warmup(project);
|
|
247
|
+
return changes;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=orbit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orbit.js","sourceRoot":"","sources":["../../src/engine/orbit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* planet.ts — Memory (planet) management
|
|
3
|
+
*
|
|
4
|
+
* Memories are "planets" orbiting the sun. This module handles:
|
|
5
|
+
* - createMemory : place a new memory into orbit.
|
|
6
|
+
* - recallMemories: search memories and apply access boost to results (hybrid).
|
|
7
|
+
* - forgetMemory : push a memory to the Oort cloud or soft-delete it.
|
|
8
|
+
*
|
|
9
|
+
* Phase 2: Hybrid search
|
|
10
|
+
* createMemory kicks off an async background embedding job so that the
|
|
11
|
+
* synchronous call returns immediately while the vector index is populated
|
|
12
|
+
* without blocking the caller.
|
|
13
|
+
*
|
|
14
|
+
* recallMemories merges FTS5 keyword results with vector KNN results using
|
|
15
|
+
* Reciprocal Rank Fusion (RRF), then deduplicates and re-ranks.
|
|
16
|
+
*/
|
|
17
|
+
import type { Memory, MemoryType } from './types.js';
|
|
18
|
+
/**
|
|
19
|
+
* Create a new memory planet and place it in initial orbit.
|
|
20
|
+
*
|
|
21
|
+
* Initial placement uses static component values because the memory has just
|
|
22
|
+
* been created and has no access history or proven relevance yet:
|
|
23
|
+
* - recency = 1.0 (brand new)
|
|
24
|
+
* - frequency = 0.0 (never recalled)
|
|
25
|
+
* - impact = type-specific default (or caller-supplied)
|
|
26
|
+
* - relevance = 0.0 (no context yet; updated on next commit)
|
|
27
|
+
*
|
|
28
|
+
* The resulting distance positions the memory in the inner zone for high-impact
|
|
29
|
+
* types (decisions, milestones) and further out for lower-impact types.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createMemory(data: {
|
|
32
|
+
project: string;
|
|
33
|
+
content: string;
|
|
34
|
+
summary?: string;
|
|
35
|
+
type?: MemoryType;
|
|
36
|
+
impact?: number;
|
|
37
|
+
tags?: string[];
|
|
38
|
+
}): Memory;
|
|
39
|
+
/**
|
|
40
|
+
* Forget a memory.
|
|
41
|
+
*
|
|
42
|
+
* Modes:
|
|
43
|
+
* - 'push' : Push the memory to the Oort cloud (distance ≈ 95 AU).
|
|
44
|
+
* The memory remains searchable but will rarely surface.
|
|
45
|
+
* - 'delete': Soft-delete the memory (sets deleted_at; excluded from queries).
|
|
46
|
+
*/
|
|
47
|
+
export declare function forgetMemory(memoryId: string, mode: 'push' | 'delete'): void;
|
|
48
|
+
/**
|
|
49
|
+
* Async tiered recall: 3-tier pipeline from corona cache → FTS5 → full hybrid.
|
|
50
|
+
*
|
|
51
|
+
* Tier 1: Corona cache (0ms) — core + near zone, token matching
|
|
52
|
+
* Tier 2: Active zone FTS5 (1-5ms) — distance 5.0–15.0
|
|
53
|
+
* Tier 3: Full hybrid FTS5 + vector (5-50ms) — distance 15.0+
|
|
54
|
+
*
|
|
55
|
+
* Early exit: if Tier 1 fills the requested limit, Tier 2 and 3 are skipped.
|
|
56
|
+
*/
|
|
57
|
+
export declare function recallMemoriesAsync(project: string, query: string, options?: {
|
|
58
|
+
type?: MemoryType | 'all';
|
|
59
|
+
minDistance?: number;
|
|
60
|
+
maxDistance?: number;
|
|
61
|
+
limit?: number;
|
|
62
|
+
excludeIds?: Set<string>;
|
|
63
|
+
}): Promise<Memory[]>;
|
|
64
|
+
//# sourceMappingURL=planet.d.ts.map
|