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,241 @@
1
+ /**
2
+ * multiproject.ts — Multi-Project Galaxy management
3
+ *
4
+ * Manages runtime project switching and cross-project knowledge sharing.
5
+ * Universal memories are memories marked to appear in ALL project recall results.
6
+ *
7
+ * State: currentProject is the one mutable singleton in this module.
8
+ * All other functions are pure queries or side-effectful writes to the DB.
9
+ */
10
+ import { getUniversalMemories, setUniversal, listProjects, upsertSunState, getSunState, getMemoriesByProject, } from '../storage/queries.js';
11
+ import { getDatabase } from '../storage/database.js';
12
+ import { createLogger } from '../utils/logger.js';
13
+ import { corona } from './corona.js';
14
+ const log = createLogger('multiproject');
15
+ // ---------------------------------------------------------------------------
16
+ // State
17
+ // ---------------------------------------------------------------------------
18
+ let currentProject = process.env['STELLAR_PROJECT'] ?? 'default';
19
+ // ---------------------------------------------------------------------------
20
+ // Validation
21
+ // ---------------------------------------------------------------------------
22
+ const PROJECT_NAME_RE = /^[a-zA-Z0-9-]{1,50}$/;
23
+ function validateProjectName(name) {
24
+ if (!PROJECT_NAME_RE.test(name)) {
25
+ throw new Error(`Invalid project name "${name}". Must be 1-50 alphanumeric characters or hyphens.`);
26
+ }
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // getCurrentProject
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Return the currently active project name.
33
+ */
34
+ export function getCurrentProject() {
35
+ return currentProject;
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // switchProject
39
+ // ---------------------------------------------------------------------------
40
+ /**
41
+ * Switch the active project at runtime without restarting.
42
+ *
43
+ * Returns info about the transition so callers can report it to the user.
44
+ */
45
+ export function switchProject(project) {
46
+ validateProjectName(project);
47
+ const previous = currentProject;
48
+ currentProject = project;
49
+ log.info('Switched project', { previous, current: project });
50
+ const db = getDatabase();
51
+ const row = db.prepare(`
52
+ SELECT COUNT(*) as count FROM memories
53
+ WHERE project = ? AND deleted_at IS NULL
54
+ `).get(project);
55
+ const memoryCount = row?.count ?? 0;
56
+ // Reload the corona cache for the new project.
57
+ corona.switchProject(project);
58
+ return { previous, current: project, memoryCount };
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // createProject
62
+ // ---------------------------------------------------------------------------
63
+ /**
64
+ * Create a new project by seeding a sun_state entry for it.
65
+ * If the project already has a sun_state, returns created=false.
66
+ */
67
+ export function createProject(name) {
68
+ validateProjectName(name);
69
+ const existing = getSunState(name);
70
+ if (existing) {
71
+ log.debug('Project already exists', { project: name });
72
+ return { project: name, created: false };
73
+ }
74
+ upsertSunState({ project: name });
75
+ log.info('Created new project', { project: name });
76
+ return { project: name, created: true };
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // listAllProjects
80
+ // ---------------------------------------------------------------------------
81
+ /**
82
+ * List all projects with basic statistics.
83
+ * Always includes 'default' even if it has no memories yet.
84
+ */
85
+ export function listAllProjects() {
86
+ const projectCounts = listProjects();
87
+ // Build lookup map from DB results
88
+ const countMap = new Map(projectCounts.map(p => [p.project, p.count]));
89
+ // Ensure 'default' is always in the list
90
+ if (!countMap.has('default')) {
91
+ countMap.set('default', 0);
92
+ }
93
+ const db = getDatabase();
94
+ return [...countMap.entries()].map(([project, memoryCount]) => {
95
+ // Get last updated timestamp for this project
96
+ const lastRow = db.prepare(`
97
+ SELECT MAX(updated_at) as last_updated FROM memories
98
+ WHERE project = ? AND deleted_at IS NULL
99
+ `).get(project);
100
+ const lastUpdated = lastRow?.last_updated ?? new Date().toISOString();
101
+ // Check if this project has any universal memories
102
+ const univRow = db.prepare(`
103
+ SELECT COUNT(*) as count FROM memories
104
+ WHERE project = ? AND is_universal = 1 AND deleted_at IS NULL
105
+ `).get(project);
106
+ const hasUniversal = (univRow?.count ?? 0) > 0;
107
+ return { project, memoryCount, lastUpdated, hasUniversal };
108
+ }).sort((a, b) => b.memoryCount - a.memoryCount);
109
+ }
110
+ // ---------------------------------------------------------------------------
111
+ // markUniversal
112
+ // ---------------------------------------------------------------------------
113
+ /**
114
+ * Mark (or unmark) a memory as universal.
115
+ * Universal memories surface in recall results for all projects.
116
+ */
117
+ export function markUniversal(memoryId, isUniversal) {
118
+ setUniversal(memoryId, isUniversal);
119
+ log.info('Updated universal flag', { memoryId, isUniversal });
120
+ }
121
+ // ---------------------------------------------------------------------------
122
+ // getUniversalContext
123
+ // ---------------------------------------------------------------------------
124
+ /**
125
+ * Get universal memories relevant to a project.
126
+ * Filters out memories that already belong to the current project
127
+ * (no need to surface them twice) and sorts by importance.
128
+ */
129
+ export function getUniversalContext(project, limit = 20) {
130
+ const universals = getUniversalMemories(limit * 2);
131
+ return universals
132
+ .filter(m => m.project !== project)
133
+ .sort((a, b) => b.importance - a.importance)
134
+ .slice(0, limit);
135
+ }
136
+ // ---------------------------------------------------------------------------
137
+ // detectUniversalCandidates
138
+ // ---------------------------------------------------------------------------
139
+ // Words/patterns that suggest project-specific content
140
+ const PROJECT_SPECIFIC_PATTERNS = [
141
+ /\b(this project|our project|this repo|this codebase)\b/i,
142
+ /\b(localhost|127\.0\.0\.1|:3000|:8080)\b/i,
143
+ /\bTODO\b/,
144
+ ];
145
+ function looksProjectSpecific(content) {
146
+ return PROJECT_SPECIFIC_PATTERNS.some(re => re.test(content));
147
+ }
148
+ /**
149
+ * Detect memories that are strong candidates to become universal.
150
+ *
151
+ * Criteria:
152
+ * - type = 'procedural' (behavioral rules are generally universal)
153
+ * - type = 'context' with generic technical content (no project-specific terms)
154
+ * - importance > 0.8 (highly important knowledge tends to be broadly applicable)
155
+ * - not already marked universal
156
+ */
157
+ export function detectUniversalCandidates(project) {
158
+ const memories = getMemoriesByProject(project);
159
+ return memories.filter(m => {
160
+ if (m.is_universal)
161
+ return false; // already universal
162
+ if (looksProjectSpecific(m.content))
163
+ return false;
164
+ if (m.type === 'procedural')
165
+ return true;
166
+ if (m.type === 'context' && !looksProjectSpecific(m.content))
167
+ return true;
168
+ if (m.importance > 0.8)
169
+ return true;
170
+ return false;
171
+ });
172
+ }
173
+ // ---------------------------------------------------------------------------
174
+ // getProjectStats
175
+ // ---------------------------------------------------------------------------
176
+ /**
177
+ * Detailed statistics for a single project.
178
+ */
179
+ export function getProjectStats(project) {
180
+ const db = getDatabase();
181
+ // Basic count
182
+ const countRow = db.prepare(`
183
+ SELECT COUNT(*) as count FROM memories
184
+ WHERE project = ? AND deleted_at IS NULL
185
+ `).get(project);
186
+ const memoryCount = countRow?.count ?? 0;
187
+ // Zone distribution
188
+ const zoneRows = db.prepare(`
189
+ SELECT
190
+ CASE
191
+ WHEN distance < 1.0 THEN 'core'
192
+ WHEN distance < 5.0 THEN 'near'
193
+ WHEN distance < 15.0 THEN 'active'
194
+ WHEN distance < 40.0 THEN 'archive'
195
+ WHEN distance < 70.0 THEN 'fading'
196
+ ELSE 'forgotten'
197
+ END as zone,
198
+ COUNT(*) as count
199
+ FROM memories
200
+ WHERE project = ? AND deleted_at IS NULL
201
+ GROUP BY zone
202
+ `).all(project);
203
+ const zoneDistribution = {};
204
+ for (const row of zoneRows) {
205
+ zoneDistribution[row.zone] = row.count;
206
+ }
207
+ // Type distribution
208
+ const typeRows = db.prepare(`
209
+ SELECT type, COUNT(*) as count
210
+ FROM memories
211
+ WHERE project = ? AND deleted_at IS NULL
212
+ GROUP BY type
213
+ `).all(project);
214
+ const typeDistribution = {};
215
+ for (const row of typeRows) {
216
+ typeDistribution[row.type] = row.count;
217
+ }
218
+ // Universal count
219
+ const univRow = db.prepare(`
220
+ SELECT COUNT(*) as count FROM memories
221
+ WHERE project = ? AND is_universal = 1 AND deleted_at IS NULL
222
+ `).get(project);
223
+ const universalCount = univRow?.count ?? 0;
224
+ // Date range
225
+ const rangeRow = db.prepare(`
226
+ SELECT MIN(created_at) as oldest, MAX(created_at) as newest
227
+ FROM memories
228
+ WHERE project = ? AND deleted_at IS NULL
229
+ `).get(project);
230
+ const oldestMemory = rangeRow?.oldest ?? '';
231
+ const newestMemory = rangeRow?.newest ?? '';
232
+ return {
233
+ memoryCount,
234
+ zoneDistribution,
235
+ typeDistribution,
236
+ universalCount,
237
+ oldestMemory,
238
+ newestMemory,
239
+ };
240
+ }
241
+ //# sourceMappingURL=multiproject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiproject.js","sourceRoot":"","sources":["../../src/engine/multiproject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * observation.ts — Observational Memory ("Comet")
3
+ *
4
+ * Auto-extracts knowledge from raw conversation text and stores it as
5
+ * structured memories. Like comets that bring material from the outer
6
+ * solar system, observations bring new information from conversations
7
+ * into the memory system.
8
+ *
9
+ * Pipeline:
10
+ * observe() → extract pattern-matched memories from a chunk
11
+ * reflect() → categorize observations (novel / reinforcing / conflicting)
12
+ * processConversation → full pipeline: split → observe → reflect → store
13
+ *
14
+ * No LLM is used — all extraction is done via keyword matching and heuristics.
15
+ */
16
+ import type { Memory } from './types.js';
17
+ /**
18
+ * Extract meaningful key terms from text.
19
+ *
20
+ * Filters out stop words and short tokens; keeps technical terms,
21
+ * proper nouns (by capitalization), version numbers, and path-like strings.
22
+ *
23
+ * Returns unique terms sorted by appearance order.
24
+ */
25
+ export declare function extractKeyTerms(text: string): string[];
26
+ /**
27
+ * Split a conversation into chunks suitable for observation.
28
+ *
29
+ * Splits on:
30
+ * - Common turn markers: "User:", "Assistant:", "Human:", "AI:", "System:"
31
+ * - Double newlines (paragraph breaks)
32
+ *
33
+ * Filters out empty or very short chunks.
34
+ * Chunks are bounded to 100-500 words each.
35
+ */
36
+ export declare function splitConversation(text: string): string[];
37
+ /**
38
+ * Observe a conversation chunk and extract structured memories from it.
39
+ *
40
+ * For each sentence that matches a known pattern (decision, error, milestone,
41
+ * task, context), a memory is created and stored.
42
+ *
43
+ * Returns the text observations extracted and the Memory objects created.
44
+ */
45
+ export declare function observe(conversationChunk: string, project: string): {
46
+ observations: string[];
47
+ memories: Memory[];
48
+ };
49
+ /**
50
+ * Reflect on a list of observations against the existing memory store.
51
+ *
52
+ * Categorizes each observation string as:
53
+ * - novel : not found in existing memories (truly new)
54
+ * - reinforcing : confirms an existing memory (we boost that memory)
55
+ * - conflicting : appears to contradict an existing memory
56
+ *
57
+ * Heuristics:
58
+ * - If an existing memory contains most of the same key terms → reinforcing
59
+ * - If an existing memory uses contradicting signals (negation patterns) → conflicting
60
+ * - Otherwise → novel
61
+ */
62
+ export declare function reflect(newObservations: string[], project: string): Promise<{
63
+ novel: string[];
64
+ reinforcing: string[];
65
+ conflicting: string[];
66
+ }>;
67
+ /**
68
+ * Process a full conversation through the observe → reflect pipeline.
69
+ *
70
+ * Steps:
71
+ * 1. Split conversation into chunks.
72
+ * 2. Run observe() on each chunk to extract memories.
73
+ * 3. Run reflect() on the extracted observations.
74
+ * 4. Boost reinforced memories.
75
+ * 5. Return aggregate statistics.
76
+ */
77
+ export declare function processConversation(conversation: string, project: string): Promise<{
78
+ memoriesCreated: number;
79
+ memoriesReinforced: number;
80
+ conflictsDetected: number;
81
+ }>;
82
+ //# sourceMappingURL=observation.d.ts.map