@cognee/cognee-openclaw 2026.2.4

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 ADDED
@@ -0,0 +1,105 @@
1
+ # @cognee/cognee-openclaw
2
+
3
+ OpenClaw plugin that adds Cognee-backed memory with automatic recall and indexing.
4
+
5
+ ## Features
6
+
7
+ - **Auto-recall**: Before each agent run, searches Cognee for relevant memories and injects them as context
8
+ - **Auto-index**: On startup and after each agent run, syncs memory markdown files to Cognee (add new, update changed, skip unchanged)
9
+ - **CLI commands**: `openclaw cognee index` to manually sync, `openclaw cognee status` to check state
10
+ - **Configurable**: Search type, max results, score filtering, token limits, and more
11
+
12
+ ## Installation
13
+
14
+ Install the plugin locally for development:
15
+
16
+ ```bash
17
+ cd integrations/openclaw
18
+ npm install
19
+ npm run build
20
+ openclaw plugins install -l .
21
+ ```
22
+
23
+ Or once published:
24
+
25
+ ```bash
26
+ openclaw plugins install @cognee/cognee-openclaw
27
+ ```
28
+
29
+ ## Configuration
30
+
31
+ Enable the plugin in your OpenClaw config (`~/.openclaw/config.yaml` or project config):
32
+
33
+ ```yaml
34
+ plugins:
35
+ entries:
36
+ memory-cognee:
37
+ enabled: true
38
+ config:
39
+ baseUrl: "http://localhost:8000"
40
+ apiKey: "${COGNEE_API_KEY}"
41
+ datasetName: "my-project"
42
+ searchType: "GRAPH_COMPLETION"
43
+ maxResults: 6
44
+ autoRecall: true
45
+ autoIndex: true
46
+ ```
47
+
48
+ Set your API key in the environment:
49
+
50
+ ```bash
51
+ export COGNEE_API_KEY="your-key-here"
52
+ ```
53
+
54
+ ## Configuration Options
55
+
56
+ | Option | Type | Default | Description |
57
+ |--------|------|---------|-------------|
58
+ | `baseUrl` | string | `http://localhost:8000` | Cognee API base URL |
59
+ | `apiKey` | string | `$COGNEE_API_KEY` | API key for authentication |
60
+ | `datasetName` | string | `openclaw` | Dataset name for storing memories |
61
+ | `searchType` | string | `GRAPH_COMPLETION` | Search mode: `GRAPH_COMPLETION`, `CHUNKS`, `SUMMARIES` |
62
+ | `maxResults` | number | `6` | Max memories to inject per recall |
63
+ | `minScore` | number | `0` | Minimum relevance score filter |
64
+ | `maxTokens` | number | `512` | Token cap for recall context |
65
+ | `autoRecall` | boolean | `true` | Inject memories before agent runs |
66
+ | `autoIndex` | boolean | `true` | Sync memory files on startup and after agent runs |
67
+ | `autoCognify` | boolean | `true` | Run cognify after new memories are added |
68
+ | `requestTimeoutMs` | number | `60000` | HTTP timeout for Cognee requests |
69
+
70
+ ## How It Works
71
+
72
+ 1. **On startup**: Scans `memory/` directory for markdown files and syncs to Cognee (add new, update changed, skip unchanged)
73
+ 2. **Before agent start**: Searches Cognee for memories relevant to the prompt and prepends as `<cognee_memories>` context
74
+ 3. **After agent end**: Re-scans memory files and syncs any changes the agent made
75
+ 4. **State tracking**:
76
+ - `~/.openclaw/memory/cognee/datasets.json` — dataset ID mapping
77
+ - `~/.openclaw/memory/cognee/sync-index.json` — per-file hash and Cognee data IDs
78
+
79
+ Memory files detected at: `MEMORY.md`, `memory.md`, or `memory/*.md`
80
+
81
+ ## CLI Commands
82
+
83
+ ```bash
84
+ # Manually sync memory files to Cognee
85
+ openclaw cognee index
86
+
87
+ # Check sync status (indexed files, pending changes)
88
+ openclaw cognee status
89
+ ```
90
+
91
+ ## Development
92
+
93
+ ```bash
94
+ cd integrations/openclaw
95
+ # Build once, then link for local development with an OpenClaw project
96
+ npm install
97
+ npm run build
98
+ openclaw plugins install -l .
99
+ ```
100
+
101
+ For live rebuilds during development:
102
+
103
+ ```bash
104
+ npm run dev
105
+ ```
@@ -0,0 +1,9 @@
1
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
2
+ declare const memoryCogneePlugin: {
3
+ id: string;
4
+ name: string;
5
+ description: string;
6
+ kind: "memory";
7
+ register(api: OpenClawPluginApi): void;
8
+ };
9
+ export default memoryCogneePlugin;
package/dist/index.js ADDED
@@ -0,0 +1,614 @@
1
+ import fs from "node:fs/promises";
2
+ import { createHash } from "node:crypto";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join, relative, resolve } from "node:path";
5
+ // ---------------------------------------------------------------------------
6
+ // Defaults
7
+ // ---------------------------------------------------------------------------
8
+ const DEFAULT_BASE_URL = "http://localhost:8000";
9
+ const DEFAULT_DATASET_NAME = "openclaw";
10
+ const DEFAULT_SEARCH_TYPE = "GRAPH_COMPLETION";
11
+ const DEFAULT_MAX_RESULTS = 6;
12
+ const DEFAULT_MIN_SCORE = 0;
13
+ const DEFAULT_MAX_TOKENS = 512;
14
+ const DEFAULT_AUTO_RECALL = true;
15
+ const DEFAULT_AUTO_INDEX = true;
16
+ const DEFAULT_AUTO_COGNIFY = true;
17
+ const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
18
+ const STATE_PATH = join(homedir(), ".openclaw", "memory", "cognee", "datasets.json");
19
+ const SYNC_INDEX_PATH = join(homedir(), ".openclaw", "memory", "cognee", "sync-index.json");
20
+ /** Glob patterns for memory files, relative to workspace root. */
21
+ const MEMORY_FILE_PATTERNS = ["MEMORY.md", "memory.md", "memory"];
22
+ // ---------------------------------------------------------------------------
23
+ // Helpers
24
+ // ---------------------------------------------------------------------------
25
+ function resolveEnvVars(value) {
26
+ return value.replace(/\$\{([^}]+)\}/g, (_, envVar) => {
27
+ const envValue = process.env[envVar];
28
+ if (!envValue) {
29
+ throw new Error(`Environment variable ${envVar} is not set`);
30
+ }
31
+ return envValue;
32
+ });
33
+ }
34
+ function hashText(value) {
35
+ return createHash("sha256").update(value).digest("hex");
36
+ }
37
+ function resolveConfig(rawConfig) {
38
+ const raw = rawConfig && typeof rawConfig === "object" && !Array.isArray(rawConfig)
39
+ ? rawConfig
40
+ : {};
41
+ const baseUrl = raw.baseUrl?.trim() || DEFAULT_BASE_URL;
42
+ const datasetName = raw.datasetName?.trim() || DEFAULT_DATASET_NAME;
43
+ const searchType = raw.searchType || DEFAULT_SEARCH_TYPE;
44
+ const maxResults = typeof raw.maxResults === "number" ? raw.maxResults : DEFAULT_MAX_RESULTS;
45
+ const minScore = typeof raw.minScore === "number" ? raw.minScore : DEFAULT_MIN_SCORE;
46
+ const maxTokens = typeof raw.maxTokens === "number" ? raw.maxTokens : DEFAULT_MAX_TOKENS;
47
+ const autoRecall = typeof raw.autoRecall === "boolean" ? raw.autoRecall : DEFAULT_AUTO_RECALL;
48
+ const autoIndex = typeof raw.autoIndex === "boolean" ? raw.autoIndex : DEFAULT_AUTO_INDEX;
49
+ const autoCognify = typeof raw.autoCognify === "boolean" ? raw.autoCognify : DEFAULT_AUTO_COGNIFY;
50
+ const requestTimeoutMs = typeof raw.requestTimeoutMs === "number" ? raw.requestTimeoutMs : DEFAULT_REQUEST_TIMEOUT_MS;
51
+ const apiKey = raw.apiKey && raw.apiKey.length > 0
52
+ ? resolveEnvVars(raw.apiKey)
53
+ : process.env.COGNEE_API_KEY || "";
54
+ return {
55
+ baseUrl,
56
+ apiKey,
57
+ datasetName,
58
+ searchType,
59
+ maxResults,
60
+ minScore,
61
+ maxTokens,
62
+ autoRecall,
63
+ autoIndex,
64
+ autoCognify,
65
+ requestTimeoutMs,
66
+ };
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Persistence — dataset state & sync index
70
+ // ---------------------------------------------------------------------------
71
+ async function loadDatasetState() {
72
+ try {
73
+ const raw = await fs.readFile(STATE_PATH, "utf-8");
74
+ const parsed = JSON.parse(raw);
75
+ if (!parsed || typeof parsed !== "object")
76
+ return {};
77
+ return parsed;
78
+ }
79
+ catch (error) {
80
+ if (error.code === "ENOENT")
81
+ return {};
82
+ throw error;
83
+ }
84
+ }
85
+ async function saveDatasetState(state) {
86
+ await fs.mkdir(dirname(STATE_PATH), { recursive: true });
87
+ await fs.writeFile(STATE_PATH, JSON.stringify(state, null, 2), "utf-8");
88
+ }
89
+ async function loadSyncIndex() {
90
+ try {
91
+ const raw = await fs.readFile(SYNC_INDEX_PATH, "utf-8");
92
+ const parsed = JSON.parse(raw);
93
+ if (!parsed || typeof parsed !== "object") {
94
+ return { entries: {} };
95
+ }
96
+ const record = parsed;
97
+ record.entries ??= {};
98
+ return record;
99
+ }
100
+ catch (error) {
101
+ if (error.code === "ENOENT") {
102
+ return { entries: {} };
103
+ }
104
+ throw error;
105
+ }
106
+ }
107
+ async function saveSyncIndex(state) {
108
+ await fs.mkdir(dirname(SYNC_INDEX_PATH), { recursive: true });
109
+ await fs.writeFile(SYNC_INDEX_PATH, JSON.stringify(state, null, 2), "utf-8");
110
+ }
111
+ // ---------------------------------------------------------------------------
112
+ // File collection — scan workspace for memory markdown files
113
+ // ---------------------------------------------------------------------------
114
+ async function collectMemoryFiles(workspaceDir) {
115
+ const files = [];
116
+ for (const pattern of MEMORY_FILE_PATTERNS) {
117
+ const target = resolve(workspaceDir, pattern);
118
+ try {
119
+ const stat = await fs.stat(target);
120
+ if (stat.isFile() && target.endsWith(".md")) {
121
+ const content = await fs.readFile(target, "utf-8");
122
+ files.push({
123
+ path: relative(workspaceDir, target),
124
+ absPath: target,
125
+ content,
126
+ hash: hashText(content),
127
+ });
128
+ }
129
+ else if (stat.isDirectory()) {
130
+ // Recursively scan the memory/ directory for .md files
131
+ const entries = await scanDir(target, workspaceDir);
132
+ files.push(...entries);
133
+ }
134
+ }
135
+ catch (error) {
136
+ if (error.code !== "ENOENT") {
137
+ throw error;
138
+ }
139
+ // File/dir doesn't exist — skip silently
140
+ }
141
+ }
142
+ return files;
143
+ }
144
+ async function scanDir(dir, workspaceDir) {
145
+ const files = [];
146
+ const entries = await fs.readdir(dir, { withFileTypes: true });
147
+ for (const entry of entries) {
148
+ const absPath = join(dir, entry.name);
149
+ if (entry.isDirectory()) {
150
+ const nested = await scanDir(absPath, workspaceDir);
151
+ files.push(...nested);
152
+ }
153
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
154
+ const content = await fs.readFile(absPath, "utf-8");
155
+ files.push({
156
+ path: relative(workspaceDir, absPath),
157
+ absPath,
158
+ content,
159
+ hash: hashText(content),
160
+ });
161
+ }
162
+ }
163
+ return files;
164
+ }
165
+ // ---------------------------------------------------------------------------
166
+ // Cognee HTTP client
167
+ // ---------------------------------------------------------------------------
168
+ class CogneeClient {
169
+ baseUrl;
170
+ apiKey;
171
+ timeoutMs;
172
+ constructor(baseUrl, apiKey, timeoutMs = 30_000) {
173
+ this.baseUrl = baseUrl;
174
+ this.apiKey = apiKey;
175
+ this.timeoutMs = timeoutMs;
176
+ }
177
+ buildHeaders() {
178
+ if (!this.apiKey)
179
+ return {};
180
+ return {
181
+ Authorization: `Bearer ${this.apiKey}`,
182
+ "X-Api-Key": this.apiKey,
183
+ };
184
+ }
185
+ async fetchJson(path, init, timeoutMs = this.timeoutMs) {
186
+ const controller = new AbortController();
187
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
188
+ try {
189
+ const response = await fetch(`${this.baseUrl}${path}`, {
190
+ ...init,
191
+ signal: controller.signal,
192
+ });
193
+ if (!response.ok) {
194
+ const errorText = await response.text();
195
+ throw new Error(`Cognee request failed (${response.status}): ${errorText}`);
196
+ }
197
+ return (await response.json());
198
+ }
199
+ finally {
200
+ clearTimeout(timeout);
201
+ }
202
+ }
203
+ async add(params) {
204
+ const formData = new FormData();
205
+ formData.append("data", new Blob([params.data], { type: "text/plain" }), "openclaw-memory.txt");
206
+ formData.append("datasetName", params.datasetName);
207
+ if (params.datasetId) {
208
+ formData.append("datasetId", params.datasetId);
209
+ }
210
+ const data = await this.fetchJson("/api/v1/add", {
211
+ method: "POST",
212
+ headers: this.buildHeaders(),
213
+ body: formData,
214
+ });
215
+ const dataId = this.extractDataId(data.data_id ?? data.data_ingestion_info);
216
+ if (!dataId) {
217
+ console.warn("memory-cognee: add response missing data_id", JSON.stringify({
218
+ keys: Object.keys(data),
219
+ data_id: data.data_id ?? null,
220
+ data_ingestion_info: data.data_ingestion_info ?? null,
221
+ }, null, 2));
222
+ }
223
+ return {
224
+ datasetId: data.dataset_id,
225
+ datasetName: data.dataset_name,
226
+ dataId,
227
+ };
228
+ }
229
+ async update(params) {
230
+ const query = new URLSearchParams({
231
+ data_id: params.dataId,
232
+ dataset_id: params.datasetId,
233
+ });
234
+ const formData = new FormData();
235
+ formData.append("data", new Blob([params.data], { type: "text/plain" }), "openclaw-memory.txt");
236
+ const data = await this.fetchJson(`/api/v1/update?${query.toString()}`, {
237
+ method: "PATCH",
238
+ headers: this.buildHeaders(),
239
+ body: formData,
240
+ });
241
+ return {
242
+ datasetId: data.dataset_id,
243
+ datasetName: data.dataset_name,
244
+ dataId: this.extractDataId(data.data_id ?? data.data_ingestion_info),
245
+ };
246
+ }
247
+ async cognify(params = {}) {
248
+ return this.fetchJson("/api/v1/cognify", {
249
+ method: "POST",
250
+ headers: {
251
+ "Content-Type": "application/json",
252
+ ...this.buildHeaders(),
253
+ },
254
+ body: JSON.stringify({ datasetIds: params.datasetIds }),
255
+ });
256
+ }
257
+ async search(params) {
258
+ const data = await this.fetchJson("/api/v1/search", {
259
+ method: "POST",
260
+ headers: {
261
+ "Content-Type": "application/json",
262
+ ...this.buildHeaders(),
263
+ },
264
+ body: JSON.stringify({
265
+ query: params.queryText,
266
+ searchType: params.searchType,
267
+ datasetIds: params.datasetIds,
268
+ max_tokens: params.maxTokens,
269
+ }),
270
+ });
271
+ return this.normalizeSearchResults(data);
272
+ }
273
+ /**
274
+ * Normalize Cognee search response to consistent format.
275
+ * Cognee returns a direct array of strings: ["answer text here"]
276
+ * We convert to: [{ id, text, score }]
277
+ */
278
+ normalizeSearchResults(data) {
279
+ // Handle direct array (Cognee's actual format)
280
+ if (Array.isArray(data)) {
281
+ return data.map((item, index) => {
282
+ if (typeof item === "string") {
283
+ return { id: `result-${index}`, text: item, score: 1 };
284
+ }
285
+ if (item && typeof item === "object") {
286
+ const record = item;
287
+ return {
288
+ id: typeof record.id === "string" ? record.id : `result-${index}`,
289
+ text: typeof record.text === "string" ? record.text : JSON.stringify(record),
290
+ score: typeof record.score === "number" ? record.score : 1,
291
+ metadata: record.metadata,
292
+ };
293
+ }
294
+ return { id: `result-${index}`, text: String(item), score: 1 };
295
+ });
296
+ }
297
+ // Handle wrapped format { results: [...] }
298
+ if (data && typeof data === "object" && "results" in data) {
299
+ return this.normalizeSearchResults(data.results);
300
+ }
301
+ return [];
302
+ }
303
+ extractDataId(value) {
304
+ if (!value)
305
+ return undefined;
306
+ if (typeof value === "string")
307
+ return value;
308
+ if (Array.isArray(value)) {
309
+ for (const entry of value) {
310
+ const id = this.extractDataId(entry);
311
+ if (id)
312
+ return id;
313
+ }
314
+ return undefined;
315
+ }
316
+ if (typeof value !== "object")
317
+ return undefined;
318
+ const record = value;
319
+ if (typeof record.data_id === "string")
320
+ return record.data_id;
321
+ return this.extractDataId(record.data_ingestion_info);
322
+ }
323
+ }
324
+ // ---------------------------------------------------------------------------
325
+ // Unified sync logic
326
+ //
327
+ // For each memory file:
328
+ // - New file (no sync index entry) → add + cognify
329
+ // - Changed file with dataId → update (no re-cognify)
330
+ // - Changed file without dataId → add + cognify
331
+ // - Unchanged file → skip
332
+ //
333
+ // Matches clawdbot cognee-provider.ts syncFiles() (lines 422-513).
334
+ // ---------------------------------------------------------------------------
335
+ async function syncFiles(client, files, syncIndex, cfg, logger) {
336
+ const result = { added: 0, updated: 0, skipped: 0, errors: 0 };
337
+ let datasetId = syncIndex.datasetId;
338
+ let needsCognify = false;
339
+ for (const file of files) {
340
+ const existing = syncIndex.entries[file.path];
341
+ // Skip unchanged files
342
+ if (existing && existing.hash === file.hash) {
343
+ result.skipped++;
344
+ continue;
345
+ }
346
+ const dataWithMetadata = `# ${file.path}\n\n${file.content}\n\n---\nMetadata: ${JSON.stringify({ path: file.path, source: "memory" })}`;
347
+ try {
348
+ // Changed file with prior dataId → try update first
349
+ if (existing?.dataId && datasetId) {
350
+ try {
351
+ await client.update({
352
+ dataId: existing.dataId,
353
+ datasetId,
354
+ data: dataWithMetadata,
355
+ });
356
+ syncIndex.entries[file.path] = { hash: file.hash, dataId: existing.dataId };
357
+ syncIndex.datasetId = datasetId;
358
+ syncIndex.datasetName = cfg.datasetName;
359
+ result.updated++;
360
+ logger.info?.(`memory-cognee: updated ${file.path}`);
361
+ continue; // Success, move to next file
362
+ }
363
+ catch (updateError) {
364
+ // If update fails (404/409 - document not found), fall back to add
365
+ const errorMsg = updateError instanceof Error ? updateError.message : String(updateError);
366
+ if (errorMsg.includes("404") || errorMsg.includes("409") || errorMsg.includes("not found")) {
367
+ logger.info?.(`memory-cognee: update failed for ${file.path}, falling back to add`);
368
+ // Clear the stale dataId and fall through to add
369
+ delete existing.dataId;
370
+ }
371
+ else {
372
+ throw updateError; // Re-throw other errors
373
+ }
374
+ }
375
+ }
376
+ // New file, or changed file without dataId, or update failed → add
377
+ const response = await client.add({
378
+ data: dataWithMetadata,
379
+ datasetName: cfg.datasetName,
380
+ datasetId,
381
+ });
382
+ if (response.datasetId && response.datasetId !== datasetId) {
383
+ datasetId = response.datasetId;
384
+ // Persist dataset ID mapping
385
+ const state = await loadDatasetState();
386
+ state[cfg.datasetName] = response.datasetId;
387
+ await saveDatasetState(state);
388
+ }
389
+ syncIndex.entries[file.path] = {
390
+ hash: file.hash,
391
+ dataId: response.dataId,
392
+ };
393
+ syncIndex.datasetId = datasetId;
394
+ syncIndex.datasetName = cfg.datasetName;
395
+ needsCognify = true;
396
+ result.added++;
397
+ logger.info?.(`memory-cognee: added ${file.path}`);
398
+ }
399
+ catch (error) {
400
+ result.errors++;
401
+ logger.warn?.(`memory-cognee: failed to sync ${file.path}: ${error instanceof Error ? error.message : String(error)}`);
402
+ }
403
+ }
404
+ // Cognify only after adds (not after updates — those are already processed)
405
+ if (needsCognify && cfg.autoCognify && datasetId) {
406
+ try {
407
+ await client.cognify({ datasetIds: [datasetId] });
408
+ logger.info?.("memory-cognee: cognify completed");
409
+ }
410
+ catch (error) {
411
+ logger.warn?.(`memory-cognee: cognify failed: ${error instanceof Error ? error.message : String(error)}`);
412
+ }
413
+ }
414
+ // Save sync index to disk
415
+ await saveSyncIndex(syncIndex);
416
+ return { ...result, datasetId };
417
+ }
418
+ // ---------------------------------------------------------------------------
419
+ // Plugin registration
420
+ // ---------------------------------------------------------------------------
421
+ const memoryCogneePlugin = {
422
+ id: "memory-cognee",
423
+ name: "Memory (Cognee)",
424
+ description: "Cognee-backed memory: indexes workspace memory files, auto-recalls before agent runs",
425
+ kind: "memory",
426
+ register(api) {
427
+ const cfg = resolveConfig(api.pluginConfig);
428
+ const client = new CogneeClient(cfg.baseUrl, cfg.apiKey, cfg.requestTimeoutMs);
429
+ let datasetId;
430
+ let syncIndex = { entries: {} };
431
+ let syncIndexReady = false;
432
+ let resolvedWorkspaceDir; // Set by service/CLI, used by hooks
433
+ // Load persisted state on startup
434
+ const stateReady = Promise.all([
435
+ loadDatasetState()
436
+ .then((state) => {
437
+ datasetId = state[cfg.datasetName];
438
+ })
439
+ .catch((error) => {
440
+ api.logger.warn?.(`memory-cognee: failed to load dataset state: ${String(error)}`);
441
+ }),
442
+ loadSyncIndex()
443
+ .then((state) => {
444
+ syncIndex = state;
445
+ syncIndexReady = true;
446
+ if (!datasetId && state.datasetId && state.datasetName === cfg.datasetName) {
447
+ datasetId = state.datasetId;
448
+ }
449
+ })
450
+ .catch((error) => {
451
+ api.logger.warn?.(`memory-cognee: failed to load sync index: ${String(error)}`);
452
+ }),
453
+ ]);
454
+ // Helper: run sync with a given workspace dir
455
+ async function runSync(workspaceDir, logger) {
456
+ await stateReady;
457
+ const files = await collectMemoryFiles(workspaceDir);
458
+ if (files.length === 0) {
459
+ logger.info?.("memory-cognee: no memory files found");
460
+ return { added: 0, updated: 0, skipped: 0, errors: 0 };
461
+ }
462
+ logger.info?.(`memory-cognee: found ${files.length} memory file(s), syncing...`);
463
+ const result = await syncFiles(client, files, syncIndex, cfg, logger);
464
+ if (result.datasetId) {
465
+ datasetId = result.datasetId;
466
+ }
467
+ return result;
468
+ }
469
+ // ------------------------------------------------------------------
470
+ // CLI: openclaw cognee index / openclaw cognee status
471
+ // ------------------------------------------------------------------
472
+ api.registerCli((ctx) => {
473
+ const cognee = ctx.program.command("cognee").description("Cognee memory management");
474
+ const resolvedWorkspaceDir = ctx.workspaceDir || process.cwd();
475
+ cognee
476
+ .command("index")
477
+ .description("Sync memory files to Cognee (add new, update changed, skip unchanged)")
478
+ .action(async () => {
479
+ const result = await runSync(resolvedWorkspaceDir, ctx.logger);
480
+ const summary = `Sync complete: ${result.added} added, ${result.updated} updated, ${result.skipped} unchanged, ${result.errors} errors`;
481
+ ctx.logger.info?.(summary);
482
+ console.log(summary);
483
+ });
484
+ cognee
485
+ .command("status")
486
+ .description("Show Cognee sync state (files indexed, dataset info)")
487
+ .action(async () => {
488
+ await stateReady;
489
+ const entryCount = Object.keys(syncIndex.entries).length;
490
+ const entriesWithDataId = Object.values(syncIndex.entries).filter((e) => e.dataId).length;
491
+ const files = await collectMemoryFiles(resolvedWorkspaceDir);
492
+ let dirty = 0;
493
+ let newCount = 0;
494
+ for (const file of files) {
495
+ const existing = syncIndex.entries[file.path];
496
+ if (!existing) {
497
+ newCount++;
498
+ }
499
+ else if (existing.hash !== file.hash) {
500
+ dirty++;
501
+ }
502
+ }
503
+ const lines = [
504
+ `Dataset: ${syncIndex.datasetName ?? cfg.datasetName}`,
505
+ `Dataset ID: ${datasetId ?? syncIndex.datasetId ?? "(not set)"}`,
506
+ `Indexed files: ${entryCount} (${entriesWithDataId} with data ID)`,
507
+ `Workspace files: ${files.length}`,
508
+ `New (unindexed): ${newCount}`,
509
+ `Changed (dirty): ${dirty}`,
510
+ `Sync index: ${SYNC_INDEX_PATH}`,
511
+ ];
512
+ console.log(lines.join("\n"));
513
+ });
514
+ }, { commands: ["cognee"] });
515
+ // ------------------------------------------------------------------
516
+ // Auto-sync on startup
517
+ // ------------------------------------------------------------------
518
+ if (cfg.autoIndex) {
519
+ api.registerService({
520
+ id: "cognee-auto-sync",
521
+ async start(ctx) {
522
+ // Store workspace dir for use in hooks
523
+ resolvedWorkspaceDir = ctx.workspaceDir || process.cwd();
524
+ try {
525
+ const result = await runSync(resolvedWorkspaceDir, ctx.logger);
526
+ ctx.logger.info?.(`memory-cognee: auto-sync complete: ${result.added} added, ${result.updated} updated, ${result.skipped} unchanged`);
527
+ }
528
+ catch (error) {
529
+ ctx.logger.warn?.(`memory-cognee: auto-sync failed: ${String(error)}`);
530
+ }
531
+ },
532
+ });
533
+ }
534
+ // ------------------------------------------------------------------
535
+ // Auto-recall: inject memories before each agent run
536
+ // ------------------------------------------------------------------
537
+ if (cfg.autoRecall) {
538
+ api.on("before_agent_start", async (event, ctx) => {
539
+ // Wait for state to load (fixes race condition on first agent run)
540
+ await stateReady;
541
+ if (!event.prompt || event.prompt.length < 5) {
542
+ api.logger.debug?.("memory-cognee: skipping recall (prompt too short)");
543
+ return;
544
+ }
545
+ if (!datasetId) {
546
+ api.logger.debug?.("memory-cognee: skipping recall (no datasetId)");
547
+ return;
548
+ }
549
+ try {
550
+ const results = await client.search({
551
+ queryText: event.prompt,
552
+ searchType: cfg.searchType,
553
+ datasetIds: [datasetId],
554
+ maxTokens: cfg.maxTokens,
555
+ });
556
+ const filtered = results
557
+ .filter((result) => result.score >= cfg.minScore)
558
+ .slice(0, cfg.maxResults);
559
+ if (filtered.length === 0) {
560
+ api.logger.debug?.("memory-cognee: search returned no results above minScore");
561
+ return;
562
+ }
563
+ const payload = JSON.stringify(filtered.map((result) => ({
564
+ id: result.id,
565
+ score: result.score,
566
+ text: result.text,
567
+ metadata: result.metadata,
568
+ })), null, 2);
569
+ api.logger.info?.(`memory-cognee: injecting ${filtered.length} memories for session ${ctx.sessionKey ?? "unknown"}`);
570
+ return {
571
+ prependContext: `<cognee_memories>\nRelevant memories:\n${payload}\n</cognee_memories>`,
572
+ };
573
+ }
574
+ catch (error) {
575
+ api.logger.warn?.(`memory-cognee: recall failed: ${String(error)}`);
576
+ }
577
+ });
578
+ }
579
+ // ------------------------------------------------------------------
580
+ // Post-agent sync: detect file changes and sync to Cognee
581
+ // ------------------------------------------------------------------
582
+ if (cfg.autoIndex) {
583
+ api.on("agent_end", async (event, ctx) => {
584
+ // Only sync if the agent succeeded
585
+ if (!event.success)
586
+ return;
587
+ await stateReady;
588
+ // Need workspace dir to find memory files
589
+ const workspaceDir = resolvedWorkspaceDir || process.cwd();
590
+ try {
591
+ // Collect current files and find changed ones
592
+ const files = await collectMemoryFiles(workspaceDir);
593
+ const changedFiles = files.filter((f) => {
594
+ const existing = syncIndex.entries[f.path];
595
+ return !existing || existing.hash !== f.hash;
596
+ });
597
+ if (changedFiles.length === 0)
598
+ return;
599
+ api.logger.info?.(`memory-cognee: detected ${changedFiles.length} changed file(s), syncing...`);
600
+ const result = await syncFiles(client, changedFiles, syncIndex, cfg, api.logger);
601
+ if (result.datasetId) {
602
+ datasetId = result.datasetId;
603
+ }
604
+ api.logger.info?.(`memory-cognee: post-agent sync: ${result.added} added, ${result.updated} updated`);
605
+ }
606
+ catch (error) {
607
+ api.logger.warn?.(`memory-cognee: post-agent sync failed: ${String(error)}`);
608
+ }
609
+ });
610
+ }
611
+ },
612
+ };
613
+ export default memoryCogneePlugin;
614
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ {
2
+ "id": "memory-cognee",
3
+ "name": "Memory (Cognee)",
4
+ "kind": "memory",
5
+ "configSchema": {
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "baseUrl": {
10
+ "type": "string",
11
+ "description": "Cognee API base URL (default: http://localhost:8000)"
12
+ },
13
+ "apiKey": {
14
+ "type": "string",
15
+ "description": "Cognee API key (or use ${COGNEE_API_KEY})"
16
+ },
17
+ "datasetName": {
18
+ "type": "string",
19
+ "description": "Cognee dataset name to store memories in"
20
+ },
21
+ "searchType": {
22
+ "type": "string",
23
+ "enum": [
24
+ "GRAPH_COMPLETION",
25
+ "CHUNKS",
26
+ "SUMMARIES"
27
+ ],
28
+ "description": "Cognee search mode"
29
+ },
30
+ "maxResults": {
31
+ "type": "number",
32
+ "description": "Max recall results to inject (default: 6)"
33
+ },
34
+ "minScore": {
35
+ "type": "number",
36
+ "description": "Minimum score to include in recall (default: 0)"
37
+ },
38
+ "maxTokens": {
39
+ "type": "number",
40
+ "description": "Token cap for recall (default: 512)"
41
+ },
42
+ "autoRecall": {
43
+ "type": "boolean",
44
+ "description": "Inject memories before each agent run (default: true)"
45
+ },
46
+ "autoIndex": {
47
+ "type": "boolean",
48
+ "description": "Auto-sync memory files to Cognee on plugin startup (default: true)"
49
+ },
50
+ "autoCognify": {
51
+ "type": "boolean",
52
+ "description": "Run cognify after new memories are added (default: true)"
53
+ },
54
+ "requestTimeoutMs": {
55
+ "type": "number",
56
+ "description": "HTTP timeout in milliseconds for Cognee requests (default: 60000)"
57
+ }
58
+ }
59
+ },
60
+ "uiHints": {
61
+ "baseUrl": {
62
+ "label": "Base URL",
63
+ "placeholder": "http://localhost:8000"
64
+ },
65
+ "apiKey": {
66
+ "label": "API Key",
67
+ "sensitive": true,
68
+ "placeholder": "${COGNEE_API_KEY}"
69
+ },
70
+ "datasetName": {
71
+ "label": "Dataset Name",
72
+ "placeholder": "openclaw"
73
+ },
74
+ "searchType": {
75
+ "label": "Search Type",
76
+ "placeholder": "GRAPH_COMPLETION"
77
+ },
78
+ "maxResults": {
79
+ "label": "Max Results",
80
+ "placeholder": "6"
81
+ },
82
+ "minScore": {
83
+ "label": "Min Score",
84
+ "placeholder": "0"
85
+ },
86
+ "maxTokens": {
87
+ "label": "Max Tokens",
88
+ "placeholder": "512"
89
+ },
90
+ "autoRecall": {
91
+ "label": "Auto-Recall"
92
+ },
93
+ "autoIndex": {
94
+ "label": "Auto-Index on Startup"
95
+ },
96
+ "autoCognify": {
97
+ "label": "Auto-Cognify"
98
+ },
99
+ "requestTimeoutMs": {
100
+ "label": "Request Timeout (ms)",
101
+ "placeholder": "60000"
102
+ }
103
+ }
104
+ }
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@cognee/cognee-openclaw",
3
+ "version": "2026.2.4",
4
+ "type": "module",
5
+ "description": "OpenClaw Cognee-backed memory plugin with auto-recall/capture",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "openclaw": {
9
+ "extensions": [
10
+ "./dist/index.js"
11
+ ]
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "openclaw.plugin.json",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "dev": "tsc --watch",
21
+ "clean": "rm -rf dist",
22
+ "typecheck": "tsc --noEmit"
23
+ },
24
+ "peerDependencies": {
25
+ "openclaw": ">=2026.2.3-1"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^20.0.0",
29
+ "openclaw": "2026.2.3-1",
30
+ "typescript": "^5.3.0"
31
+ },
32
+ "overrides": {
33
+ "tar": "7.5.7"
34
+ }
35
+ }