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.
Files changed (197) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +362 -0
  3. package/dist/api/routes/analytics.d.ts +15 -0
  4. package/dist/api/routes/analytics.js +131 -0
  5. package/dist/api/routes/analytics.js.map +1 -0
  6. package/dist/api/routes/conflicts.d.ts +12 -0
  7. package/dist/api/routes/conflicts.js +67 -0
  8. package/dist/api/routes/conflicts.js.map +1 -0
  9. package/dist/api/routes/consolidation.d.ts +11 -0
  10. package/dist/api/routes/consolidation.js +63 -0
  11. package/dist/api/routes/consolidation.js.map +1 -0
  12. package/dist/api/routes/constellation.d.ts +4 -0
  13. package/dist/api/routes/constellation.js +84 -0
  14. package/dist/api/routes/constellation.js.map +1 -0
  15. package/dist/api/routes/memories.d.ts +4 -0
  16. package/dist/api/routes/memories.js +219 -0
  17. package/dist/api/routes/memories.js.map +1 -0
  18. package/dist/api/routes/observations.d.ts +10 -0
  19. package/dist/api/routes/observations.js +42 -0
  20. package/dist/api/routes/observations.js.map +1 -0
  21. package/dist/api/routes/orbit.d.ts +4 -0
  22. package/dist/api/routes/orbit.js +71 -0
  23. package/dist/api/routes/orbit.js.map +1 -0
  24. package/dist/api/routes/projects.d.ts +15 -0
  25. package/dist/api/routes/projects.js +121 -0
  26. package/dist/api/routes/projects.js.map +1 -0
  27. package/dist/api/routes/scan.d.ts +4 -0
  28. package/dist/api/routes/scan.js +403 -0
  29. package/dist/api/routes/scan.js.map +1 -0
  30. package/dist/api/routes/sun.d.ts +4 -0
  31. package/dist/api/routes/sun.js +43 -0
  32. package/dist/api/routes/sun.js.map +1 -0
  33. package/dist/api/routes/system.d.ts +4 -0
  34. package/dist/api/routes/system.js +70 -0
  35. package/dist/api/routes/system.js.map +1 -0
  36. package/dist/api/routes/temporal.d.ts +13 -0
  37. package/dist/api/routes/temporal.js +82 -0
  38. package/dist/api/routes/temporal.js.map +1 -0
  39. package/dist/api/server.d.ts +2 -0
  40. package/dist/api/server.js +99 -0
  41. package/dist/api/server.js.map +1 -0
  42. package/dist/api/websocket.d.ts +53 -0
  43. package/dist/api/websocket.js +168 -0
  44. package/dist/api/websocket.js.map +1 -0
  45. package/dist/cli/index.d.ts +12 -0
  46. package/dist/cli/index.js +35 -0
  47. package/dist/cli/index.js.map +1 -0
  48. package/dist/cli/init.d.ts +10 -0
  49. package/dist/cli/init.js +163 -0
  50. package/dist/cli/init.js.map +1 -0
  51. package/dist/engine/analytics.d.ts +93 -0
  52. package/dist/engine/analytics.js +437 -0
  53. package/dist/engine/analytics.js.map +1 -0
  54. package/dist/engine/conflict.d.ts +54 -0
  55. package/dist/engine/conflict.js +322 -0
  56. package/dist/engine/conflict.js.map +1 -0
  57. package/dist/engine/consolidation.d.ts +83 -0
  58. package/dist/engine/consolidation.js +368 -0
  59. package/dist/engine/consolidation.js.map +1 -0
  60. package/dist/engine/constellation.d.ts +66 -0
  61. package/dist/engine/constellation.js +382 -0
  62. package/dist/engine/constellation.js.map +1 -0
  63. package/dist/engine/corona.d.ts +53 -0
  64. package/dist/engine/corona.js +181 -0
  65. package/dist/engine/corona.js.map +1 -0
  66. package/dist/engine/embedding.d.ts +44 -0
  67. package/dist/engine/embedding.js +168 -0
  68. package/dist/engine/embedding.js.map +1 -0
  69. package/dist/engine/gravity.d.ts +63 -0
  70. package/dist/engine/gravity.js +121 -0
  71. package/dist/engine/gravity.js.map +1 -0
  72. package/dist/engine/multiproject.d.ts +75 -0
  73. package/dist/engine/multiproject.js +241 -0
  74. package/dist/engine/multiproject.js.map +1 -0
  75. package/dist/engine/observation.d.ts +82 -0
  76. package/dist/engine/observation.js +357 -0
  77. package/dist/engine/observation.js.map +1 -0
  78. package/dist/engine/orbit.d.ts +91 -0
  79. package/dist/engine/orbit.js +249 -0
  80. package/dist/engine/orbit.js.map +1 -0
  81. package/dist/engine/planet.d.ts +64 -0
  82. package/dist/engine/planet.js +432 -0
  83. package/dist/engine/planet.js.map +1 -0
  84. package/dist/engine/procedural.d.ts +71 -0
  85. package/dist/engine/procedural.js +259 -0
  86. package/dist/engine/procedural.js.map +1 -0
  87. package/dist/engine/quality.d.ts +48 -0
  88. package/dist/engine/quality.js +245 -0
  89. package/dist/engine/quality.js.map +1 -0
  90. package/dist/engine/repository.d.ts +79 -0
  91. package/dist/engine/repository.js +13 -0
  92. package/dist/engine/repository.js.map +1 -0
  93. package/dist/engine/sun.d.ts +61 -0
  94. package/dist/engine/sun.js +240 -0
  95. package/dist/engine/sun.js.map +1 -0
  96. package/dist/engine/temporal.d.ts +67 -0
  97. package/dist/engine/temporal.js +283 -0
  98. package/dist/engine/temporal.js.map +1 -0
  99. package/dist/engine/types.d.ts +179 -0
  100. package/dist/engine/types.js +27 -0
  101. package/dist/engine/types.js.map +1 -0
  102. package/dist/index.d.ts +2 -0
  103. package/dist/index.js +60 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/mcp/connector-registry.d.ts +20 -0
  106. package/dist/mcp/connector-registry.js +35 -0
  107. package/dist/mcp/connector-registry.js.map +1 -0
  108. package/dist/mcp/server.d.ts +13 -0
  109. package/dist/mcp/server.js +242 -0
  110. package/dist/mcp/server.js.map +1 -0
  111. package/dist/mcp/tools/daemon-tool.d.ts +16 -0
  112. package/dist/mcp/tools/daemon-tool.js +58 -0
  113. package/dist/mcp/tools/daemon-tool.js.map +1 -0
  114. package/dist/mcp/tools/ingestion-tools.d.ts +20 -0
  115. package/dist/mcp/tools/ingestion-tools.js +34 -0
  116. package/dist/mcp/tools/ingestion-tools.js.map +1 -0
  117. package/dist/mcp/tools/memory-tools.d.ts +122 -0
  118. package/dist/mcp/tools/memory-tools.js +1037 -0
  119. package/dist/mcp/tools/memory-tools.js.map +1 -0
  120. package/dist/scanner/cloud/github.d.ts +34 -0
  121. package/dist/scanner/cloud/github.js +260 -0
  122. package/dist/scanner/cloud/github.js.map +1 -0
  123. package/dist/scanner/cloud/google-drive.d.ts +30 -0
  124. package/dist/scanner/cloud/google-drive.js +289 -0
  125. package/dist/scanner/cloud/google-drive.js.map +1 -0
  126. package/dist/scanner/cloud/notion.d.ts +33 -0
  127. package/dist/scanner/cloud/notion.js +231 -0
  128. package/dist/scanner/cloud/notion.js.map +1 -0
  129. package/dist/scanner/cloud/slack.d.ts +38 -0
  130. package/dist/scanner/cloud/slack.js +282 -0
  131. package/dist/scanner/cloud/slack.js.map +1 -0
  132. package/dist/scanner/cloud/types.d.ts +73 -0
  133. package/dist/scanner/cloud/types.js +9 -0
  134. package/dist/scanner/cloud/types.js.map +1 -0
  135. package/dist/scanner/index.d.ts +35 -0
  136. package/dist/scanner/index.js +420 -0
  137. package/dist/scanner/index.js.map +1 -0
  138. package/dist/scanner/local/filesystem.d.ts +33 -0
  139. package/dist/scanner/local/filesystem.js +203 -0
  140. package/dist/scanner/local/filesystem.js.map +1 -0
  141. package/dist/scanner/local/git.d.ts +24 -0
  142. package/dist/scanner/local/git.js +161 -0
  143. package/dist/scanner/local/git.js.map +1 -0
  144. package/dist/scanner/local/parsers/code.d.ts +3 -0
  145. package/dist/scanner/local/parsers/code.js +127 -0
  146. package/dist/scanner/local/parsers/code.js.map +1 -0
  147. package/dist/scanner/local/parsers/index.d.ts +11 -0
  148. package/dist/scanner/local/parsers/index.js +24 -0
  149. package/dist/scanner/local/parsers/index.js.map +1 -0
  150. package/dist/scanner/local/parsers/json-parser.d.ts +3 -0
  151. package/dist/scanner/local/parsers/json-parser.js +117 -0
  152. package/dist/scanner/local/parsers/json-parser.js.map +1 -0
  153. package/dist/scanner/local/parsers/markdown.d.ts +3 -0
  154. package/dist/scanner/local/parsers/markdown.js +120 -0
  155. package/dist/scanner/local/parsers/markdown.js.map +1 -0
  156. package/dist/scanner/local/parsers/text.d.ts +3 -0
  157. package/dist/scanner/local/parsers/text.js +41 -0
  158. package/dist/scanner/local/parsers/text.js.map +1 -0
  159. package/dist/scanner/metadata-scanner.d.ts +67 -0
  160. package/dist/scanner/metadata-scanner.js +356 -0
  161. package/dist/scanner/metadata-scanner.js.map +1 -0
  162. package/dist/scanner/types.d.ts +47 -0
  163. package/dist/scanner/types.js +19 -0
  164. package/dist/scanner/types.js.map +1 -0
  165. package/dist/service/daemon.d.ts +23 -0
  166. package/dist/service/daemon.js +105 -0
  167. package/dist/service/daemon.js.map +1 -0
  168. package/dist/service/scheduler.d.ts +73 -0
  169. package/dist/service/scheduler.js +281 -0
  170. package/dist/service/scheduler.js.map +1 -0
  171. package/dist/storage/database.d.ts +10 -0
  172. package/dist/storage/database.js +265 -0
  173. package/dist/storage/database.js.map +1 -0
  174. package/dist/storage/queries.d.ts +85 -0
  175. package/dist/storage/queries.js +865 -0
  176. package/dist/storage/queries.js.map +1 -0
  177. package/dist/storage/sqlite-repository.d.ts +32 -0
  178. package/dist/storage/sqlite-repository.js +68 -0
  179. package/dist/storage/sqlite-repository.js.map +1 -0
  180. package/dist/storage/vec.d.ts +62 -0
  181. package/dist/storage/vec.js +111 -0
  182. package/dist/storage/vec.js.map +1 -0
  183. package/dist/utils/config.d.ts +5 -0
  184. package/dist/utils/config.js +60 -0
  185. package/dist/utils/config.js.map +1 -0
  186. package/dist/utils/logger.d.ts +36 -0
  187. package/dist/utils/logger.js +86 -0
  188. package/dist/utils/logger.js.map +1 -0
  189. package/dist/utils/time.d.ts +21 -0
  190. package/dist/utils/time.js +42 -0
  191. package/dist/utils/time.js.map +1 -0
  192. package/dist/utils/tokenizer.d.ts +13 -0
  193. package/dist/utils/tokenizer.js +46 -0
  194. package/dist/utils/tokenizer.js.map +1 -0
  195. package/package.json +77 -0
  196. package/scripts/check-node.mjs +36 -0
  197. 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