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,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
|