@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 +105 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +614 -0
- package/dist/index.js.map +1 -0
- package/openclaw.plugin.json +104 -0
- package/package.json +35 -0
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
|
+
```
|
package/dist/index.d.ts
ADDED
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
|
+
}
|