@cognee/cognee-openclaw 2026.3.0 → 2026.3.1
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/README.md +201 -38
- package/dist/index.d.ts +8 -142
- package/dist/index.js +17 -813
- package/dist/index.js.map +1 -1
- package/dist/src/client.d.ts +74 -0
- package/dist/src/client.js +302 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/config.d.ts +21 -0
- package/dist/src/config.js +89 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/files.d.ts +6 -0
- package/dist/src/files.js +60 -0
- package/dist/src/files.js.map +1 -0
- package/dist/src/persistence.d.ts +17 -0
- package/dist/src/persistence.js +107 -0
- package/dist/src/persistence.js.map +1 -0
- package/dist/src/plugin.d.ts +9 -0
- package/dist/src/plugin.js +510 -0
- package/dist/src/plugin.js.map +1 -0
- package/dist/src/scope.d.ts +20 -0
- package/dist/src/scope.js +122 -0
- package/dist/src/scope.js.map +1 -0
- package/dist/src/sync.d.ts +18 -0
- package/dist/src/sync.js +219 -0
- package/dist/src/sync.js.map +1 -0
- package/dist/src/types.d.ts +80 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/openclaw.plugin.json +114 -13
- package/package.json +4 -1
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { MEMORY_SCOPES } from "./types.js";
|
|
3
|
+
import { CogneeHttpClient } from "./client.js";
|
|
4
|
+
import { resolveConfig } from "./config.js";
|
|
5
|
+
import { collectMemoryFiles } from "./files.js";
|
|
6
|
+
import { loadDatasetState, loadScopedSyncIndexes, loadSyncIndex, migrateLegacyIndex, SYNC_INDEX_PATH, } from "./persistence.js";
|
|
7
|
+
import { datasetNameForScope, isMultiScopeEnabled, routeFileToScope } from "./scope.js";
|
|
8
|
+
import { syncFiles, syncFilesScoped } from "./sync.js";
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Plugin registration
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
const memoryCogneePlugin = {
|
|
13
|
+
id: "cognee-openclaw",
|
|
14
|
+
name: "Memory (Cognee)",
|
|
15
|
+
description: "Cognee-backed memory with multi-scope support (company/user/agent), session tracking, and auto-recall",
|
|
16
|
+
kind: "memory",
|
|
17
|
+
register(api) {
|
|
18
|
+
const cfg = resolveConfig(api.pluginConfig);
|
|
19
|
+
const client = new CogneeHttpClient(cfg.baseUrl, cfg.apiKey, cfg.username, cfg.password, cfg.requestTimeoutMs, cfg.ingestionTimeoutMs);
|
|
20
|
+
const multiScope = isMultiScopeEnabled(cfg);
|
|
21
|
+
// Legacy single-scope state
|
|
22
|
+
let datasetId;
|
|
23
|
+
let syncIndex = { entries: {} };
|
|
24
|
+
// Multi-scope state
|
|
25
|
+
let scopedIndexes = {};
|
|
26
|
+
// Session state
|
|
27
|
+
let sessionId;
|
|
28
|
+
let resolvedWorkspaceDir;
|
|
29
|
+
// Load persisted state on startup
|
|
30
|
+
const stateReady = Promise.all([
|
|
31
|
+
loadDatasetState()
|
|
32
|
+
.then((state) => {
|
|
33
|
+
if (!multiScope) {
|
|
34
|
+
datasetId = state[cfg.datasetName];
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
.catch((error) => {
|
|
38
|
+
api.logger.warn?.(`cognee-openclaw: failed to load dataset state: ${String(error)}`);
|
|
39
|
+
}),
|
|
40
|
+
multiScope
|
|
41
|
+
? loadScopedSyncIndexes()
|
|
42
|
+
.then(async (indexes) => {
|
|
43
|
+
// Fix #7: Migrate legacy index if scoped indexes are empty
|
|
44
|
+
if (Object.keys(indexes).length === 0) {
|
|
45
|
+
const migrated = await migrateLegacyIndex(cfg.defaultWriteScope);
|
|
46
|
+
if (migrated) {
|
|
47
|
+
scopedIndexes = migrated;
|
|
48
|
+
api.logger.info?.(`cognee-openclaw: migrated legacy sync index to scope "${cfg.defaultWriteScope}"`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
scopedIndexes = indexes;
|
|
53
|
+
})
|
|
54
|
+
.catch((error) => {
|
|
55
|
+
api.logger.warn?.(`cognee-openclaw: failed to load scoped sync indexes: ${String(error)}`);
|
|
56
|
+
})
|
|
57
|
+
: loadSyncIndex()
|
|
58
|
+
.then((state) => {
|
|
59
|
+
syncIndex = state;
|
|
60
|
+
if (!datasetId && state.datasetId && state.datasetName === cfg.datasetName) {
|
|
61
|
+
datasetId = state.datasetId;
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
.catch((error) => {
|
|
65
|
+
api.logger.warn?.(`cognee-openclaw: failed to load sync index: ${String(error)}`);
|
|
66
|
+
}),
|
|
67
|
+
]);
|
|
68
|
+
// Fix #8: Log when scopes have no dataset ID during recall
|
|
69
|
+
async function getRecallDatasetIds() {
|
|
70
|
+
const state = await loadDatasetState();
|
|
71
|
+
const ids = [];
|
|
72
|
+
const missingScopes = [];
|
|
73
|
+
if (multiScope) {
|
|
74
|
+
for (const scope of cfg.recallScopes) {
|
|
75
|
+
const dsName = datasetNameForScope(scope, cfg);
|
|
76
|
+
const dsId = state[dsName] ?? scopedIndexes[scope]?.datasetId;
|
|
77
|
+
if (dsId) {
|
|
78
|
+
ids.push(dsId);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
missingScopes.push(scope);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
if (datasetId)
|
|
87
|
+
ids.push(datasetId);
|
|
88
|
+
}
|
|
89
|
+
return { ids, missingScopes };
|
|
90
|
+
}
|
|
91
|
+
// Helper: run sync
|
|
92
|
+
async function runSync(workspaceDir, logger) {
|
|
93
|
+
await stateReady;
|
|
94
|
+
const files = await collectMemoryFiles(workspaceDir);
|
|
95
|
+
if (files.length === 0) {
|
|
96
|
+
logger.info?.("cognee-openclaw: no memory files found");
|
|
97
|
+
return { added: 0, updated: 0, skipped: 0, errors: 0, deleted: 0 };
|
|
98
|
+
}
|
|
99
|
+
logger.info?.(`cognee-openclaw: found ${files.length} memory file(s), syncing...`);
|
|
100
|
+
if (multiScope) {
|
|
101
|
+
return syncFilesScoped(client, files, files, scopedIndexes, cfg, logger);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const result = await syncFiles(client, files, files, syncIndex, cfg, logger);
|
|
105
|
+
if (result.datasetId)
|
|
106
|
+
datasetId = result.datasetId;
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ------------------------------------------------------------------
|
|
111
|
+
// CLI commands
|
|
112
|
+
// ------------------------------------------------------------------
|
|
113
|
+
api.registerCli((ctx) => {
|
|
114
|
+
const cognee = ctx.program.command("cognee").description("Cognee memory management");
|
|
115
|
+
const cliWorkspaceDir = ctx.workspaceDir || process.cwd();
|
|
116
|
+
cognee
|
|
117
|
+
.command("index")
|
|
118
|
+
.description("Sync memory files to Cognee (add new, update changed, skip unchanged)")
|
|
119
|
+
.action(async () => {
|
|
120
|
+
const result = await runSync(cliWorkspaceDir, ctx.logger);
|
|
121
|
+
const summary = `Sync complete: ${result.added} added, ${result.updated} updated, ${result.deleted} deleted, ${result.skipped} unchanged, ${result.errors} errors`;
|
|
122
|
+
ctx.logger.info?.(summary);
|
|
123
|
+
console.log(summary);
|
|
124
|
+
process.exit(0);
|
|
125
|
+
});
|
|
126
|
+
cognee
|
|
127
|
+
.command("status")
|
|
128
|
+
.description("Show Cognee sync state")
|
|
129
|
+
.action(async () => {
|
|
130
|
+
await stateReady;
|
|
131
|
+
const files = await collectMemoryFiles(cliWorkspaceDir);
|
|
132
|
+
if (multiScope) {
|
|
133
|
+
const state = await loadDatasetState();
|
|
134
|
+
for (const scope of MEMORY_SCOPES) {
|
|
135
|
+
const dsName = datasetNameForScope(scope, cfg);
|
|
136
|
+
const scopeIndex = scopedIndexes[scope] ?? { entries: {} };
|
|
137
|
+
const entryCount = Object.keys(scopeIndex.entries).length;
|
|
138
|
+
const scopeFiles = files.filter(f => routeFileToScope(f.path, cfg.scopeRouting, cfg.defaultWriteScope) === scope);
|
|
139
|
+
let dirty = 0, newCount = 0;
|
|
140
|
+
for (const file of scopeFiles) {
|
|
141
|
+
const existing = scopeIndex.entries[file.path];
|
|
142
|
+
if (!existing)
|
|
143
|
+
newCount++;
|
|
144
|
+
else if (existing.hash !== file.hash)
|
|
145
|
+
dirty++;
|
|
146
|
+
}
|
|
147
|
+
console.log(`\n[${scope.toUpperCase()}] Dataset: ${dsName}`);
|
|
148
|
+
console.log(` Dataset ID: ${state[dsName] ?? scopeIndex.datasetId ?? "(not set)"}`);
|
|
149
|
+
console.log(` Indexed files: ${entryCount}`);
|
|
150
|
+
console.log(` Workspace files: ${scopeFiles.length}`);
|
|
151
|
+
console.log(` New (unindexed): ${newCount}`);
|
|
152
|
+
console.log(` Changed (dirty): ${dirty}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
const entryCount = Object.keys(syncIndex.entries).length;
|
|
157
|
+
const entriesWithDataId = Object.values(syncIndex.entries).filter((e) => e.dataId).length;
|
|
158
|
+
let dirty = 0, newCount = 0;
|
|
159
|
+
for (const file of files) {
|
|
160
|
+
const existing = syncIndex.entries[file.path];
|
|
161
|
+
if (!existing)
|
|
162
|
+
newCount++;
|
|
163
|
+
else if (existing.hash !== file.hash)
|
|
164
|
+
dirty++;
|
|
165
|
+
}
|
|
166
|
+
console.log([
|
|
167
|
+
`Dataset: ${syncIndex.datasetName ?? cfg.datasetName}`,
|
|
168
|
+
`Dataset ID: ${datasetId ?? syncIndex.datasetId ?? "(not set)"}`,
|
|
169
|
+
`Indexed files: ${entryCount} (${entriesWithDataId} with data ID)`,
|
|
170
|
+
`Workspace files: ${files.length}`,
|
|
171
|
+
`New (unindexed): ${newCount}`,
|
|
172
|
+
`Changed (dirty): ${dirty}`,
|
|
173
|
+
`Sync index: ${SYNC_INDEX_PATH}`,
|
|
174
|
+
].join("\n"));
|
|
175
|
+
}
|
|
176
|
+
process.exit(0);
|
|
177
|
+
});
|
|
178
|
+
cognee
|
|
179
|
+
.command("health")
|
|
180
|
+
.description("Check Cognee API connectivity")
|
|
181
|
+
.action(async () => {
|
|
182
|
+
try {
|
|
183
|
+
const result = await client.health();
|
|
184
|
+
console.log(`Cognee API: OK (${cfg.baseUrl})`);
|
|
185
|
+
if (result.status)
|
|
186
|
+
console.log(`Status: ${result.status}`);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
console.log(`Cognee API: UNREACHABLE (${cfg.baseUrl})`);
|
|
190
|
+
console.log(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
process.exit(0);
|
|
194
|
+
});
|
|
195
|
+
cognee
|
|
196
|
+
.command("setup")
|
|
197
|
+
.description("Configure OpenClaw to use Cognee for memory (default: replaces built-in, --hybrid: alongside built-in)")
|
|
198
|
+
.option("--hybrid", "Keep built-in memory providers enabled alongside Cognee")
|
|
199
|
+
.action(async (opts) => {
|
|
200
|
+
const { loadConfig, writeConfigFile } = api.runtime.config;
|
|
201
|
+
const config = loadConfig();
|
|
202
|
+
// Set Cognee as the memory slot
|
|
203
|
+
config.plugins ??= {};
|
|
204
|
+
config.plugins.slots ??= {};
|
|
205
|
+
config.plugins.slots.memory = "cognee-openclaw";
|
|
206
|
+
config.plugins.entries ??= {};
|
|
207
|
+
const entries = config.plugins.entries;
|
|
208
|
+
if (opts.hybrid) {
|
|
209
|
+
// Hybrid mode: keep built-in memory enabled
|
|
210
|
+
entries["memory-core"] ??= { enabled: true };
|
|
211
|
+
entries["memory-core"].enabled = true;
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// Exclusive mode: disable built-in memory providers
|
|
215
|
+
entries["memory-core"] = { enabled: false };
|
|
216
|
+
entries["memory-lancedb"] = { enabled: false };
|
|
217
|
+
}
|
|
218
|
+
// Ensure cognee-openclaw is enabled
|
|
219
|
+
entries["cognee-openclaw"] ??= { enabled: true };
|
|
220
|
+
entries["cognee-openclaw"].enabled = true;
|
|
221
|
+
await writeConfigFile(config);
|
|
222
|
+
if (opts.hybrid) {
|
|
223
|
+
console.log("Cognee memory setup complete (hybrid mode):");
|
|
224
|
+
console.log(" - Memory slot set to cognee-openclaw");
|
|
225
|
+
console.log(" - memory-core enabled (built-in memory active)");
|
|
226
|
+
console.log("\nBoth Cognee recall and built-in memory search are active.");
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
console.log("Cognee memory setup complete:");
|
|
230
|
+
console.log(" - Memory slot set to cognee-openclaw");
|
|
231
|
+
console.log(" - memory-core disabled");
|
|
232
|
+
console.log(" - memory-lancedb disabled");
|
|
233
|
+
}
|
|
234
|
+
console.log("\nRun 'openclaw cognee health' to verify Cognee connectivity.");
|
|
235
|
+
process.exit(0);
|
|
236
|
+
});
|
|
237
|
+
cognee
|
|
238
|
+
.command("scopes")
|
|
239
|
+
.description("Show memory scope routing for current workspace files")
|
|
240
|
+
.action(async () => {
|
|
241
|
+
const files = await collectMemoryFiles(cliWorkspaceDir);
|
|
242
|
+
if (files.length === 0) {
|
|
243
|
+
console.log("No memory files found.");
|
|
244
|
+
process.exit(0);
|
|
245
|
+
}
|
|
246
|
+
if (!multiScope) {
|
|
247
|
+
console.log(`Multi-scope mode is OFF. All files go to dataset "${cfg.datasetName}".`);
|
|
248
|
+
console.log(`Set companyDataset, userDatasetPrefix, or agentDatasetPrefix to enable.`);
|
|
249
|
+
process.exit(0);
|
|
250
|
+
}
|
|
251
|
+
const grouped = { company: [], user: [], agent: [] };
|
|
252
|
+
for (const file of files) {
|
|
253
|
+
const scope = routeFileToScope(file.path, cfg.scopeRouting, cfg.defaultWriteScope);
|
|
254
|
+
grouped[scope].push(file.path);
|
|
255
|
+
}
|
|
256
|
+
for (const scope of MEMORY_SCOPES) {
|
|
257
|
+
const dsName = datasetNameForScope(scope, cfg);
|
|
258
|
+
console.log(`\n[${scope.toUpperCase()}] -> dataset "${dsName}"`);
|
|
259
|
+
if (grouped[scope].length === 0)
|
|
260
|
+
console.log(" (no files)");
|
|
261
|
+
else
|
|
262
|
+
for (const p of grouped[scope])
|
|
263
|
+
console.log(` ${p}`);
|
|
264
|
+
}
|
|
265
|
+
process.exit(0);
|
|
266
|
+
});
|
|
267
|
+
}, { commands: ["cognee"] });
|
|
268
|
+
// ------------------------------------------------------------------
|
|
269
|
+
// Auto-sync on startup (with health check)
|
|
270
|
+
// ------------------------------------------------------------------
|
|
271
|
+
if (cfg.autoIndex) {
|
|
272
|
+
api.registerService({
|
|
273
|
+
id: "cognee-auto-sync",
|
|
274
|
+
async start(ctx) {
|
|
275
|
+
resolvedWorkspaceDir = ctx.workspaceDir || process.cwd();
|
|
276
|
+
try {
|
|
277
|
+
await client.health();
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
ctx.logger.warn?.(`cognee-openclaw: Cognee API unreachable at ${cfg.baseUrl} — auto-sync disabled for this session. Error: ${String(error)}`);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (cfg.enableSessions) {
|
|
284
|
+
sessionId = `openclaw-${randomUUID()}`;
|
|
285
|
+
ctx.logger.info?.(`cognee-openclaw: session ${sessionId}`);
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
const result = await runSync(resolvedWorkspaceDir, ctx.logger);
|
|
289
|
+
ctx.logger.info?.(`cognee-openclaw: auto-sync complete: ${result.added} added, ${result.updated} updated, ${result.deleted} deleted, ${result.skipped} unchanged`);
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
ctx.logger.warn?.(`cognee-openclaw: auto-sync failed: ${String(error)}`);
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
// ------------------------------------------------------------------
|
|
298
|
+
// Auto-recall: inject memories before each agent run
|
|
299
|
+
// ------------------------------------------------------------------
|
|
300
|
+
if (cfg.autoRecall) {
|
|
301
|
+
api.on("before_agent_start", async (event, ctx) => {
|
|
302
|
+
await stateReady;
|
|
303
|
+
if (!event.prompt || event.prompt.length < 5) {
|
|
304
|
+
api.logger.debug?.("cognee-openclaw: skipping recall (prompt too short)");
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
const { ids: recallDatasetIds, missingScopes } = await getRecallDatasetIds();
|
|
308
|
+
// Fix #8: Log missing scopes so users know what's not being searched
|
|
309
|
+
if (missingScopes.length > 0) {
|
|
310
|
+
api.logger.info?.(`cognee-openclaw: scope(s) not yet indexed (no data): ${missingScopes.join(", ")}`);
|
|
311
|
+
}
|
|
312
|
+
if (recallDatasetIds.length === 0) {
|
|
313
|
+
api.logger.debug?.("cognee-openclaw: skipping recall (no datasetIds)");
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
try {
|
|
317
|
+
if (multiScope) {
|
|
318
|
+
// Fix #10: Use Promise.allSettled for resilience
|
|
319
|
+
const state = await loadDatasetState();
|
|
320
|
+
const searchPromises = cfg.recallScopes.map(async (scope) => {
|
|
321
|
+
const dsName = datasetNameForScope(scope, cfg);
|
|
322
|
+
const dsId = state[dsName] ?? scopedIndexes[scope]?.datasetId;
|
|
323
|
+
if (!dsId)
|
|
324
|
+
return null;
|
|
325
|
+
const results = await client.search({
|
|
326
|
+
queryText: event.prompt,
|
|
327
|
+
searchType: cfg.searchType,
|
|
328
|
+
datasetIds: [dsId],
|
|
329
|
+
searchPrompt: cfg.searchPrompt,
|
|
330
|
+
maxTokens: cfg.maxTokens,
|
|
331
|
+
sessionId,
|
|
332
|
+
});
|
|
333
|
+
const filtered = results
|
|
334
|
+
.filter((r) => r.score >= cfg.minScore)
|
|
335
|
+
.slice(0, cfg.maxResults);
|
|
336
|
+
return filtered.length > 0 ? { scope, results: filtered } : null;
|
|
337
|
+
});
|
|
338
|
+
// Fix #10: allSettled — inject whatever succeeds, log failures
|
|
339
|
+
const settled = await Promise.allSettled(searchPromises);
|
|
340
|
+
const scopeResults = {};
|
|
341
|
+
for (let i = 0; i < settled.length; i++) {
|
|
342
|
+
const outcome = settled[i];
|
|
343
|
+
const scope = cfg.recallScopes[i];
|
|
344
|
+
if (outcome.status === "fulfilled" && outcome.value) {
|
|
345
|
+
scopeResults[outcome.value.scope] = outcome.value.results;
|
|
346
|
+
}
|
|
347
|
+
else if (outcome.status === "rejected") {
|
|
348
|
+
api.logger.warn?.(`cognee-openclaw: recall failed for scope ${scope}: ${String(outcome.reason)}`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (Object.keys(scopeResults).length === 0) {
|
|
352
|
+
api.logger.debug?.("cognee-openclaw: search returned no results above minScore");
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
const sections = [];
|
|
356
|
+
for (const scope of cfg.recallScopes) {
|
|
357
|
+
const results = scopeResults[scope];
|
|
358
|
+
if (!results || results.length === 0)
|
|
359
|
+
continue;
|
|
360
|
+
const payload = JSON.stringify(results.map((r) => ({ id: r.id, score: r.score, text: r.text, metadata: r.metadata })), null, 2);
|
|
361
|
+
sections.push(`<${scope}_memory>\n${payload}\n</${scope}_memory>`);
|
|
362
|
+
}
|
|
363
|
+
const totalResults = Object.values(scopeResults).reduce((sum, arr) => sum + arr.length, 0);
|
|
364
|
+
api.logger.info?.(`cognee-openclaw: injecting ${totalResults} memories across ${Object.keys(scopeResults).length} scope(s)`);
|
|
365
|
+
return { prependContext: `<cognee_memories>\n${sections.join("\n")}\n</cognee_memories>` };
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
// Legacy single-scope
|
|
369
|
+
const results = await client.search({
|
|
370
|
+
queryText: event.prompt,
|
|
371
|
+
searchType: cfg.searchType,
|
|
372
|
+
datasetIds: recallDatasetIds,
|
|
373
|
+
searchPrompt: cfg.searchPrompt,
|
|
374
|
+
maxTokens: cfg.maxTokens,
|
|
375
|
+
sessionId,
|
|
376
|
+
});
|
|
377
|
+
const filtered = results
|
|
378
|
+
.filter((r) => r.score >= cfg.minScore)
|
|
379
|
+
.slice(0, cfg.maxResults);
|
|
380
|
+
if (filtered.length === 0) {
|
|
381
|
+
api.logger.debug?.("cognee-openclaw: search returned no results above minScore");
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const payload = JSON.stringify(filtered.map((r) => ({ id: r.id, score: r.score, text: r.text, metadata: r.metadata })), null, 2);
|
|
385
|
+
api.logger.info?.(`cognee-openclaw: injecting ${filtered.length} memories`);
|
|
386
|
+
return { prependContext: `<cognee_memories>\nRelevant memories:\n${payload}\n</cognee_memories>` };
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
api.logger.warn?.(`cognee-openclaw: recall failed: ${String(error)}`);
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
// ------------------------------------------------------------------
|
|
395
|
+
// Post-agent sync + session persistence
|
|
396
|
+
// ------------------------------------------------------------------
|
|
397
|
+
if (cfg.autoIndex) {
|
|
398
|
+
api.on("agent_end", async (event, ctx) => {
|
|
399
|
+
if (!event.success)
|
|
400
|
+
return;
|
|
401
|
+
await stateReady;
|
|
402
|
+
const workspaceDir = resolvedWorkspaceDir || process.cwd();
|
|
403
|
+
// Fix #4: Actually persist the session into the knowledge graph
|
|
404
|
+
if (cfg.enableSessions && cfg.persistSessionsAfterEnd && sessionId) {
|
|
405
|
+
try {
|
|
406
|
+
// Determine target dataset for session persistence
|
|
407
|
+
const targetDatasetIds = [];
|
|
408
|
+
if (multiScope) {
|
|
409
|
+
const state = await loadDatasetState();
|
|
410
|
+
const agentDsName = datasetNameForScope("agent", cfg);
|
|
411
|
+
const agentDsId = state[agentDsName] ?? scopedIndexes.agent?.datasetId;
|
|
412
|
+
if (agentDsId)
|
|
413
|
+
targetDatasetIds.push(agentDsId);
|
|
414
|
+
}
|
|
415
|
+
else if (datasetId) {
|
|
416
|
+
targetDatasetIds.push(datasetId);
|
|
417
|
+
}
|
|
418
|
+
if (targetDatasetIds.length > 0) {
|
|
419
|
+
// Call Cognee's session persistence endpoint via the generic fetchJson
|
|
420
|
+
await client.fetchJson("/api/v1/sessions/persist", {
|
|
421
|
+
method: "POST",
|
|
422
|
+
headers: { "Content-Type": "application/json" },
|
|
423
|
+
body: JSON.stringify({
|
|
424
|
+
session_ids: [sessionId],
|
|
425
|
+
dataset_ids: targetDatasetIds,
|
|
426
|
+
}),
|
|
427
|
+
}).catch(() => {
|
|
428
|
+
// Session persistence endpoint may not exist on all Cognee versions.
|
|
429
|
+
// Fail silently — this is an enhancement, not critical path.
|
|
430
|
+
api.logger.debug?.("cognee-openclaw: session persistence endpoint not available");
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
catch (error) {
|
|
435
|
+
api.logger.warn?.(`cognee-openclaw: session persistence failed: ${String(error)}`);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
// Sync file changes
|
|
439
|
+
try {
|
|
440
|
+
if (multiScope) {
|
|
441
|
+
try {
|
|
442
|
+
const freshIndexes = await loadScopedSyncIndexes();
|
|
443
|
+
scopedIndexes = freshIndexes;
|
|
444
|
+
}
|
|
445
|
+
catch { /* fall through */ }
|
|
446
|
+
const files = await collectMemoryFiles(workspaceDir);
|
|
447
|
+
let hasChanges = false;
|
|
448
|
+
for (const file of files) {
|
|
449
|
+
const scope = routeFileToScope(file.path, cfg.scopeRouting, cfg.defaultWriteScope);
|
|
450
|
+
const scopeIndex = scopedIndexes[scope];
|
|
451
|
+
if (!scopeIndex) {
|
|
452
|
+
hasChanges = true;
|
|
453
|
+
break;
|
|
454
|
+
}
|
|
455
|
+
const existing = scopeIndex.entries[file.path];
|
|
456
|
+
if (!existing || existing.hash !== file.hash) {
|
|
457
|
+
hasChanges = true;
|
|
458
|
+
break;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
if (!hasChanges) {
|
|
462
|
+
const currentPaths = new Set(files.map(f => f.path));
|
|
463
|
+
for (const scopeIndex of Object.values(scopedIndexes)) {
|
|
464
|
+
if (scopeIndex && Object.keys(scopeIndex.entries).some(p => !currentPaths.has(p))) {
|
|
465
|
+
hasChanges = true;
|
|
466
|
+
break;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
if (!hasChanges)
|
|
471
|
+
return;
|
|
472
|
+
api.logger.info?.("cognee-openclaw: detected changes, syncing across scopes...");
|
|
473
|
+
const result = await syncFilesScoped(client, files, files, scopedIndexes, cfg, api.logger);
|
|
474
|
+
api.logger.info?.(`cognee-openclaw: post-agent sync: ${result.added} added, ${result.updated} updated, ${result.deleted} deleted`);
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
try {
|
|
478
|
+
const freshIndex = await loadSyncIndex();
|
|
479
|
+
syncIndex.entries = freshIndex.entries;
|
|
480
|
+
if (freshIndex.datasetId)
|
|
481
|
+
syncIndex.datasetId = freshIndex.datasetId;
|
|
482
|
+
if (freshIndex.datasetName)
|
|
483
|
+
syncIndex.datasetName = freshIndex.datasetName;
|
|
484
|
+
}
|
|
485
|
+
catch { /* fall through */ }
|
|
486
|
+
const files = await collectMemoryFiles(workspaceDir);
|
|
487
|
+
const changedFiles = files.filter((f) => {
|
|
488
|
+
const existing = syncIndex.entries[f.path];
|
|
489
|
+
return !existing || existing.hash !== f.hash;
|
|
490
|
+
});
|
|
491
|
+
const currentPaths = new Set(files.map(f => f.path));
|
|
492
|
+
const hasDeletedFiles = Object.keys(syncIndex.entries).some(p => !currentPaths.has(p));
|
|
493
|
+
if (changedFiles.length === 0 && !hasDeletedFiles)
|
|
494
|
+
return;
|
|
495
|
+
api.logger.info?.(`cognee-openclaw: detected ${changedFiles.length} changed file(s)${hasDeletedFiles ? " + deletions" : ""}, syncing...`);
|
|
496
|
+
const result = await syncFiles(client, changedFiles, files, syncIndex, cfg, api.logger);
|
|
497
|
+
if (result.datasetId)
|
|
498
|
+
datasetId = result.datasetId;
|
|
499
|
+
api.logger.info?.(`cognee-openclaw: post-agent sync: ${result.added} added, ${result.updated} updated, ${result.deleted} deleted`);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
catch (error) {
|
|
503
|
+
api.logger.warn?.(`cognee-openclaw: post-agent sync failed: ${String(error)}`);
|
|
504
|
+
}
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
},
|
|
508
|
+
};
|
|
509
|
+
export default memoryCogneePlugin;
|
|
510
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CogneePluginConfig, MemoryScope, ScopeRoute } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Match a file path against a glob pattern.
|
|
4
|
+
* Paths are normalized to forward slashes.
|
|
5
|
+
*/
|
|
6
|
+
export declare function matchGlob(pattern: string, filePath: string): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Route a file to its memory scope based on scopeRouting rules.
|
|
9
|
+
* First matching rule wins; falls back to defaultScope.
|
|
10
|
+
*/
|
|
11
|
+
export declare function routeFileToScope(filePath: string, routes: ScopeRoute[], defaultScope: MemoryScope): MemoryScope;
|
|
12
|
+
/**
|
|
13
|
+
* Determine whether multi-scope mode is active.
|
|
14
|
+
* Active when at least one scope-specific dataset prefix/name is configured.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isMultiScopeEnabled(cfg: Required<CogneePluginConfig>): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the Cognee dataset name for a given memory scope.
|
|
19
|
+
*/
|
|
20
|
+
export declare function datasetNameForScope(scope: MemoryScope, cfg: Required<CogneePluginConfig>): string;
|