@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.
@@ -0,0 +1,60 @@
1
+ import { promises as fs } from "node:fs";
2
+ import { createHash } from "node:crypto";
3
+ import { join, relative, resolve } from "node:path";
4
+ import { MEMORY_FILE_PATTERNS } from "./config.js";
5
+ export function hashText(value) {
6
+ return createHash("sha256").update(value).digest("hex");
7
+ }
8
+ /**
9
+ * Scan the workspace for memory markdown files.
10
+ */
11
+ export async function collectMemoryFiles(workspaceDir) {
12
+ const files = [];
13
+ for (const pattern of MEMORY_FILE_PATTERNS) {
14
+ const target = resolve(workspaceDir, pattern);
15
+ try {
16
+ const stat = await fs.stat(target);
17
+ if (stat.isFile() && target.endsWith(".md")) {
18
+ const content = await fs.readFile(target, "utf-8");
19
+ files.push({
20
+ path: relative(workspaceDir, target),
21
+ absPath: target,
22
+ content,
23
+ hash: hashText(content),
24
+ });
25
+ }
26
+ else if (stat.isDirectory()) {
27
+ const entries = await scanDir(target, workspaceDir);
28
+ files.push(...entries);
29
+ }
30
+ }
31
+ catch (error) {
32
+ if (error.code !== "ENOENT") {
33
+ throw error;
34
+ }
35
+ }
36
+ }
37
+ return files;
38
+ }
39
+ async function scanDir(dir, workspaceDir) {
40
+ const files = [];
41
+ const entries = await fs.readdir(dir, { withFileTypes: true });
42
+ for (const entry of entries) {
43
+ const absPath = join(dir, entry.name);
44
+ if (entry.isDirectory()) {
45
+ const nested = await scanDir(absPath, workspaceDir);
46
+ files.push(...nested);
47
+ }
48
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
49
+ const content = await fs.readFile(absPath, "utf-8");
50
+ files.push({
51
+ path: relative(workspaceDir, absPath),
52
+ absPath,
53
+ content,
54
+ hash: hashText(content),
55
+ });
56
+ }
57
+ }
58
+ return files;
59
+ }
60
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { DatasetState, MemoryScope, ScopedSyncIndexes, SyncIndex } from "./types.js";
2
+ export declare const STATE_DIR: string;
3
+ export declare const STATE_PATH: string;
4
+ export declare const SYNC_INDEX_PATH: string;
5
+ export declare const SCOPED_SYNC_INDEX_PATH: string;
6
+ export declare function loadDatasetState(): Promise<DatasetState>;
7
+ export declare function saveDatasetState(state: DatasetState): Promise<void>;
8
+ export declare function loadSyncIndex(): Promise<SyncIndex>;
9
+ export declare function saveSyncIndex(state: SyncIndex): Promise<void>;
10
+ export declare function loadScopedSyncIndexes(): Promise<ScopedSyncIndexes>;
11
+ export declare function saveScopedSyncIndexes(indexes: ScopedSyncIndexes): Promise<void>;
12
+ /**
13
+ * Fix #7: Migrate legacy single-scope sync index into multi-scope indexes.
14
+ * Moves all entries from the old sync-index.json into the specified default scope.
15
+ * After migration, the legacy file is left in place (harmless) but no longer read.
16
+ */
17
+ export declare function migrateLegacyIndex(defaultScope: MemoryScope): Promise<ScopedSyncIndexes | null>;
@@ -0,0 +1,107 @@
1
+ import { promises as fs } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ // ---------------------------------------------------------------------------
5
+ // State file paths
6
+ // ---------------------------------------------------------------------------
7
+ export const STATE_DIR = join(homedir(), ".openclaw", "memory", "cognee");
8
+ export const STATE_PATH = join(STATE_DIR, "datasets.json");
9
+ export const SYNC_INDEX_PATH = join(STATE_DIR, "sync-index.json");
10
+ export const SCOPED_SYNC_INDEX_PATH = join(STATE_DIR, "scoped-sync-indexes.json");
11
+ // ---------------------------------------------------------------------------
12
+ // Dataset state (maps dataset name -> dataset ID)
13
+ // ---------------------------------------------------------------------------
14
+ export async function loadDatasetState() {
15
+ try {
16
+ const raw = await fs.readFile(STATE_PATH, "utf-8");
17
+ const parsed = JSON.parse(raw);
18
+ if (!parsed || typeof parsed !== "object")
19
+ return {};
20
+ return parsed;
21
+ }
22
+ catch (error) {
23
+ if (error.code === "ENOENT")
24
+ return {};
25
+ throw error;
26
+ }
27
+ }
28
+ export async function saveDatasetState(state) {
29
+ await fs.mkdir(dirname(STATE_PATH), { recursive: true });
30
+ await fs.writeFile(STATE_PATH, JSON.stringify(state, null, 2), "utf-8");
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // Sync index (legacy single-scope)
34
+ // ---------------------------------------------------------------------------
35
+ export async function loadSyncIndex() {
36
+ try {
37
+ const raw = await fs.readFile(SYNC_INDEX_PATH, "utf-8");
38
+ const parsed = JSON.parse(raw);
39
+ if (!parsed || typeof parsed !== "object")
40
+ return { entries: {} };
41
+ const record = parsed;
42
+ record.entries ??= {};
43
+ return record;
44
+ }
45
+ catch (error) {
46
+ if (error.code === "ENOENT")
47
+ return { entries: {} };
48
+ throw error;
49
+ }
50
+ }
51
+ export async function saveSyncIndex(state) {
52
+ await fs.mkdir(dirname(SYNC_INDEX_PATH), { recursive: true });
53
+ await fs.writeFile(SYNC_INDEX_PATH, JSON.stringify(state, null, 2), "utf-8");
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Scoped sync indexes (multi-scope)
57
+ //
58
+ // Fix #6: On load, we validate that keys are valid MemoryScope values
59
+ // and discard any garbage entries (e.g. typos like "compnay").
60
+ //
61
+ // Fix #7: Migration support — when switching from single to multi-scope,
62
+ // we migrate the legacy sync index into the appropriate scope.
63
+ // ---------------------------------------------------------------------------
64
+ const VALID_SCOPES = new Set(["company", "user", "agent"]);
65
+ export async function loadScopedSyncIndexes() {
66
+ try {
67
+ const raw = await fs.readFile(SCOPED_SYNC_INDEX_PATH, "utf-8");
68
+ const parsed = JSON.parse(raw);
69
+ if (!parsed || typeof parsed !== "object")
70
+ return {};
71
+ // Validate keys are valid scopes
72
+ const result = {};
73
+ for (const [key, value] of Object.entries(parsed)) {
74
+ if (VALID_SCOPES.has(key) && value && typeof value === "object") {
75
+ const idx = value;
76
+ idx.entries ??= {};
77
+ result[key] = idx;
78
+ }
79
+ }
80
+ return result;
81
+ }
82
+ catch (error) {
83
+ if (error.code === "ENOENT")
84
+ return {};
85
+ throw error;
86
+ }
87
+ }
88
+ export async function saveScopedSyncIndexes(indexes) {
89
+ await fs.mkdir(dirname(SCOPED_SYNC_INDEX_PATH), { recursive: true });
90
+ await fs.writeFile(SCOPED_SYNC_INDEX_PATH, JSON.stringify(indexes, null, 2), "utf-8");
91
+ }
92
+ /**
93
+ * Fix #7: Migrate legacy single-scope sync index into multi-scope indexes.
94
+ * Moves all entries from the old sync-index.json into the specified default scope.
95
+ * After migration, the legacy file is left in place (harmless) but no longer read.
96
+ */
97
+ export async function migrateLegacyIndex(defaultScope) {
98
+ const legacy = await loadSyncIndex();
99
+ if (Object.keys(legacy.entries).length === 0)
100
+ return null;
101
+ const scoped = {
102
+ [defaultScope]: { ...legacy },
103
+ };
104
+ await saveScopedSyncIndexes(scoped);
105
+ return scoped;
106
+ }
107
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/persistence.ts"],"names":[],"mappings":"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"}
@@ -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;