@memclaw/plugin 0.9.1 → 0.9.3
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/dist/index.d.ts +100 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin-impl.d.ts +40 -0
- package/dist/plugin-impl.d.ts.map +1 -0
- package/dist/plugin-impl.js +445 -0
- package/dist/plugin-impl.js.map +1 -0
- package/dist/src/binaries.d.ts +29 -0
- package/dist/src/binaries.d.ts.map +1 -0
- package/dist/src/binaries.js +292 -0
- package/dist/src/binaries.js.map +1 -0
- package/dist/src/client.d.ts +88 -0
- package/dist/src/client.d.ts.map +1 -0
- package/dist/src/client.js +131 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/config.d.ts +50 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +257 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/migrate.d.ts +26 -0
- package/dist/src/migrate.d.ts.map +1 -0
- package/dist/src/migrate.js +287 -0
- package/dist/src/migrate.js.map +1 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/skill/SKILL.md +21 -3
- package/skill/references/setup.md +199 -54
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration management for MemClaw
|
|
4
|
+
*
|
|
5
|
+
* Handles platform-specific config paths, config file generation,
|
|
6
|
+
* and auto-opening config files for user editing.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.getConfigDir = getConfigDir;
|
|
43
|
+
exports.getDataDir = getDataDir;
|
|
44
|
+
exports.getConfigPath = getConfigPath;
|
|
45
|
+
exports.generateConfigTemplate = generateConfigTemplate;
|
|
46
|
+
exports.ensureConfigExists = ensureConfigExists;
|
|
47
|
+
exports.openConfigFile = openConfigFile;
|
|
48
|
+
exports.parseConfig = parseConfig;
|
|
49
|
+
exports.validateConfig = validateConfig;
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const os = __importStar(require("os"));
|
|
53
|
+
const child_process_1 = require("child_process");
|
|
54
|
+
// Platform-specific paths
|
|
55
|
+
function getConfigDir() {
|
|
56
|
+
const platform = process.platform;
|
|
57
|
+
if (platform === "win32") {
|
|
58
|
+
return path.join(process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming"), "memclaw");
|
|
59
|
+
}
|
|
60
|
+
else if (platform === "darwin") {
|
|
61
|
+
return path.join(os.homedir(), "Library", "Application Support", "memclaw");
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
return path.join(os.homedir(), ".config", "memclaw");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function getDataDir() {
|
|
68
|
+
const platform = process.platform;
|
|
69
|
+
if (platform === "win32") {
|
|
70
|
+
return path.join(process.env.LOCALAPPDATA || path.join(os.homedir(), "AppData", "Local"), "memclaw", "data");
|
|
71
|
+
}
|
|
72
|
+
else if (platform === "darwin") {
|
|
73
|
+
return path.join(os.homedir(), "Library", "Application Support", "memclaw", "data");
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return path.join(os.homedir(), ".local", "share", "memclaw", "data");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function getConfigPath() {
|
|
80
|
+
return path.join(getConfigDir(), "config.toml");
|
|
81
|
+
}
|
|
82
|
+
function generateConfigTemplate() {
|
|
83
|
+
const dataDir = getDataDir().replace(/\\/g, "/");
|
|
84
|
+
return `# MemClaw Configuration
|
|
85
|
+
#
|
|
86
|
+
# This file was auto-generated. Please fill in the required values below.
|
|
87
|
+
# Required fields are marked with [REQUIRED]
|
|
88
|
+
|
|
89
|
+
# Qdrant Vector Database Configuration
|
|
90
|
+
[qdrant]
|
|
91
|
+
url = "http://localhost:6334"
|
|
92
|
+
collection_name = "memclaw"
|
|
93
|
+
timeout_secs = 30
|
|
94
|
+
|
|
95
|
+
# LLM Configuration [REQUIRED for memory processing]
|
|
96
|
+
[llm]
|
|
97
|
+
# Your LLM API endpoint (OpenAI-compatible)
|
|
98
|
+
api_base_url = "https://api.openai.com/v1"
|
|
99
|
+
# Your API key [REQUIRED]
|
|
100
|
+
api_key = ""
|
|
101
|
+
# Model for memory extraction and layer generation
|
|
102
|
+
model_efficient = "gpt-4o-mini"
|
|
103
|
+
temperature = 0.1
|
|
104
|
+
max_tokens = 4096
|
|
105
|
+
|
|
106
|
+
# Embedding Configuration [REQUIRED for vector search]
|
|
107
|
+
[embedding]
|
|
108
|
+
# Your embedding API endpoint (OpenAI-compatible)
|
|
109
|
+
api_base_url = "https://api.openai.com/v1"
|
|
110
|
+
# Your API key [REQUIRED - can be same as llm.api_key]
|
|
111
|
+
api_key = ""
|
|
112
|
+
model_name = "text-embedding-3-small"
|
|
113
|
+
batch_size = 10
|
|
114
|
+
timeout_secs = 30
|
|
115
|
+
|
|
116
|
+
# Service Configuration
|
|
117
|
+
[server]
|
|
118
|
+
host = "localhost"
|
|
119
|
+
port = 8085
|
|
120
|
+
|
|
121
|
+
# Cortex Memory Settings
|
|
122
|
+
[cortex]
|
|
123
|
+
data_dir = "${dataDir}"
|
|
124
|
+
enable_intent_analysis = false
|
|
125
|
+
`;
|
|
126
|
+
}
|
|
127
|
+
function ensureConfigExists() {
|
|
128
|
+
const configDir = getConfigDir();
|
|
129
|
+
const configPath = getConfigPath();
|
|
130
|
+
if (!fs.existsSync(configDir)) {
|
|
131
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
132
|
+
}
|
|
133
|
+
if (!fs.existsSync(configPath)) {
|
|
134
|
+
const template = generateConfigTemplate();
|
|
135
|
+
fs.writeFileSync(configPath, template, "utf-8");
|
|
136
|
+
return { created: true, path: configPath };
|
|
137
|
+
}
|
|
138
|
+
return { created: false, path: configPath };
|
|
139
|
+
}
|
|
140
|
+
function openConfigFile(configPath) {
|
|
141
|
+
return new Promise((resolve, reject) => {
|
|
142
|
+
const platform = process.platform;
|
|
143
|
+
let command;
|
|
144
|
+
let args = [];
|
|
145
|
+
if (platform === "win32") {
|
|
146
|
+
command = "cmd";
|
|
147
|
+
args = ["/c", "start", '""', configPath];
|
|
148
|
+
}
|
|
149
|
+
else if (platform === "darwin") {
|
|
150
|
+
command = "open";
|
|
151
|
+
args = [configPath];
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
command = "xdg-open";
|
|
155
|
+
args = [configPath];
|
|
156
|
+
}
|
|
157
|
+
const proc = (0, child_process_1.spawn)(command, args, { detached: true, stdio: "ignore" });
|
|
158
|
+
proc.on("error", (err) => {
|
|
159
|
+
reject(err);
|
|
160
|
+
});
|
|
161
|
+
proc.unref();
|
|
162
|
+
resolve();
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
function parseConfig(configPath) {
|
|
166
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
167
|
+
const config = {};
|
|
168
|
+
let currentSection = "";
|
|
169
|
+
for (const line of content.split("\n")) {
|
|
170
|
+
const trimmed = line.trim();
|
|
171
|
+
// Skip comments and empty lines
|
|
172
|
+
if (trimmed.startsWith("#") || trimmed === "")
|
|
173
|
+
continue;
|
|
174
|
+
// Section header
|
|
175
|
+
const sectionMatch = trimmed.match(/^\[(\w+)\]$/);
|
|
176
|
+
if (sectionMatch) {
|
|
177
|
+
currentSection = sectionMatch[1];
|
|
178
|
+
config[currentSection] = {};
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
// Key-value pair
|
|
182
|
+
const kvMatch = trimmed.match(/^(\w+)\s*=\s*"([^"]*)"(?:\s*$|\s*#)/) ||
|
|
183
|
+
trimmed.match(/^(\w+)\s*=\s*(\d+(?:\.\d+)?)(?:\s*$|\s*#)/) ||
|
|
184
|
+
trimmed.match(/^(\w+)\s*=\s*(true|false)(?:\s*$|\s*#)/);
|
|
185
|
+
if (kvMatch && currentSection) {
|
|
186
|
+
const key = kvMatch[1];
|
|
187
|
+
let value = kvMatch[2];
|
|
188
|
+
// Convert to appropriate type
|
|
189
|
+
if (value === "true")
|
|
190
|
+
value = true;
|
|
191
|
+
else if (value === "false")
|
|
192
|
+
value = false;
|
|
193
|
+
else if (/^\d+$/.test(value))
|
|
194
|
+
value = parseInt(value, 10);
|
|
195
|
+
else if (/^\d+\.\d+$/.test(value))
|
|
196
|
+
value = parseFloat(value);
|
|
197
|
+
config[currentSection] = config[currentSection] || {};
|
|
198
|
+
config[currentSection][key] = value;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Apply defaults
|
|
202
|
+
const dataDir = getDataDir();
|
|
203
|
+
return {
|
|
204
|
+
qdrant: {
|
|
205
|
+
url: "http://localhost:6334",
|
|
206
|
+
collection_name: "memclaw",
|
|
207
|
+
timeout_secs: 30,
|
|
208
|
+
...(config.qdrant || {}),
|
|
209
|
+
},
|
|
210
|
+
llm: {
|
|
211
|
+
api_base_url: "https://api.openai.com/v1",
|
|
212
|
+
api_key: "",
|
|
213
|
+
model_efficient: "gpt-5-mini",
|
|
214
|
+
temperature: 0.1,
|
|
215
|
+
max_tokens: 4096,
|
|
216
|
+
...(config.llm || {}),
|
|
217
|
+
},
|
|
218
|
+
embedding: {
|
|
219
|
+
api_base_url: "https://api.openai.com/v1",
|
|
220
|
+
api_key: "",
|
|
221
|
+
model_name: "text-embedding-3-small",
|
|
222
|
+
batch_size: 10,
|
|
223
|
+
timeout_secs: 30,
|
|
224
|
+
...(config.embedding || {}),
|
|
225
|
+
},
|
|
226
|
+
server: {
|
|
227
|
+
host: "localhost",
|
|
228
|
+
port: 8085,
|
|
229
|
+
...(config.server || {}),
|
|
230
|
+
},
|
|
231
|
+
cortex: {
|
|
232
|
+
data_dir: dataDir,
|
|
233
|
+
enable_intent_analysis: false,
|
|
234
|
+
...(config.cortex || {}),
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
function validateConfig(config) {
|
|
239
|
+
const errors = [];
|
|
240
|
+
if (!config.llm.api_key || config.llm.api_key === "") {
|
|
241
|
+
errors.push("llm.api_key is required");
|
|
242
|
+
}
|
|
243
|
+
if (!config.embedding.api_key || config.embedding.api_key === "") {
|
|
244
|
+
// Allow using llm.api_key for embedding if not specified
|
|
245
|
+
if (config.llm.api_key && config.llm.api_key !== "") {
|
|
246
|
+
config.embedding.api_key = config.llm.api_key;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
errors.push("embedding.api_key is required");
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
valid: errors.length === 0,
|
|
254
|
+
errors,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration script for OpenClaw native memory to MemClaw
|
|
3
|
+
*
|
|
4
|
+
* Migrates:
|
|
5
|
+
* - memory/YYYY-MM-DD.md → session timeline files
|
|
6
|
+
* - MEMORY.md → users/{tenant}/preferences.md
|
|
7
|
+
*/
|
|
8
|
+
interface MigrationResult {
|
|
9
|
+
dailyLogsMigrated: number;
|
|
10
|
+
memoryMdMigrated: boolean;
|
|
11
|
+
sessionsCreated: string[];
|
|
12
|
+
errors: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Main migration function
|
|
16
|
+
*/
|
|
17
|
+
export declare function migrateFromOpenClaw(log?: (msg: string) => void): Promise<MigrationResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Check if migration is possible
|
|
20
|
+
*/
|
|
21
|
+
export declare function canMigrate(): {
|
|
22
|
+
possible: boolean;
|
|
23
|
+
reason: string;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,UAAU,eAAe;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAgPD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC1B,OAAO,CAAC,eAAe,CAAC,CA8C1B;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAelE"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Migration script for OpenClaw native memory to MemClaw
|
|
4
|
+
*
|
|
5
|
+
* Migrates:
|
|
6
|
+
* - memory/YYYY-MM-DD.md → session timeline files
|
|
7
|
+
* - MEMORY.md → users/{tenant}/preferences.md
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.migrateFromOpenClaw = migrateFromOpenClaw;
|
|
44
|
+
exports.canMigrate = canMigrate;
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const os = __importStar(require("os"));
|
|
48
|
+
const child_process_1 = require("child_process");
|
|
49
|
+
const util_1 = require("util");
|
|
50
|
+
const glob_1 = require("glob");
|
|
51
|
+
const config_js_1 = require("./config.js");
|
|
52
|
+
const binaries_js_1 = require("./binaries.js");
|
|
53
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
54
|
+
// Migration configuration
|
|
55
|
+
const MIGRATION_TENANT = 'tenant_claw';
|
|
56
|
+
const DEFAULT_ROLE = 'user';
|
|
57
|
+
/**
|
|
58
|
+
* Detect OpenClaw workspace directory
|
|
59
|
+
*/
|
|
60
|
+
function findOpenClawWorkspace() {
|
|
61
|
+
const homeDir = os.homedir();
|
|
62
|
+
const workspacePath = path.join(homeDir, '.openclaw', 'workspace');
|
|
63
|
+
if (fs.existsSync(workspacePath)) {
|
|
64
|
+
return workspacePath;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Split content into paragraphs (not just lines)
|
|
70
|
+
*/
|
|
71
|
+
function splitIntoParagraphs(content) {
|
|
72
|
+
return content
|
|
73
|
+
.split(/\n\s*\n/)
|
|
74
|
+
.map(p => p.trim())
|
|
75
|
+
.filter(p => p.length > 0 && !p.startsWith('#')); // Skip headers
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Generate L2 content for a single paragraph
|
|
79
|
+
*/
|
|
80
|
+
function generateL2Content(paragraph, sessionId, date, index) {
|
|
81
|
+
// Generate a deterministic timestamp based on index
|
|
82
|
+
const hour = String(index % 24).padStart(2, '0');
|
|
83
|
+
const minute = String((index * 7) % 60).padStart(2, '0');
|
|
84
|
+
const second = String((index * 13) % 60).padStart(2, '0');
|
|
85
|
+
const timestamp = `${date}T${hour}:${minute}:${second}Z`;
|
|
86
|
+
const msgId = `${date.replace(/-/g, '')}_${String(index).padStart(4, '0')}`;
|
|
87
|
+
return `---
|
|
88
|
+
id: "${msgId}"
|
|
89
|
+
role: "${DEFAULT_ROLE}"
|
|
90
|
+
timestamp: "${timestamp}"
|
|
91
|
+
thread_id: "${sessionId}"
|
|
92
|
+
---
|
|
93
|
+
${paragraph}`;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Migrate daily logs from OpenClaw native memory to MemClaw
|
|
97
|
+
*/
|
|
98
|
+
async function migrateDailyLogs(ocWorkspace, dataDir, log) {
|
|
99
|
+
const memoryDir = path.join(ocWorkspace, 'memory');
|
|
100
|
+
const count = 0;
|
|
101
|
+
const sessions = [];
|
|
102
|
+
const errors = [];
|
|
103
|
+
if (!fs.existsSync(memoryDir)) {
|
|
104
|
+
log?.('No memory directory found in OpenClaw workspace');
|
|
105
|
+
return { count: 0, sessions: [], errors: [] };
|
|
106
|
+
}
|
|
107
|
+
// Find all daily log files
|
|
108
|
+
const dailyLogPattern = path.join(memoryDir, '*.md').replace(/\\/g, '/');
|
|
109
|
+
const files = await (0, glob_1.glob)(dailyLogPattern);
|
|
110
|
+
const dailyLogs = files.filter(f => {
|
|
111
|
+
const basename = path.basename(f);
|
|
112
|
+
return /^\d{4}-\d{2}-\d{2}\.md$/.test(basename);
|
|
113
|
+
});
|
|
114
|
+
log?.(`Found ${dailyLogs.length} daily log files to migrate`);
|
|
115
|
+
for (const logPath of dailyLogs) {
|
|
116
|
+
try {
|
|
117
|
+
const date = path.basename(logPath, '.md'); // 2026-03-13
|
|
118
|
+
const [year, month, day] = date.split('-');
|
|
119
|
+
const sessionId = `migrated-oc-${date}`;
|
|
120
|
+
const timelineDir = path.join(dataDir, 'sessions', MIGRATION_TENANT, sessionId, 'timeline', year, month, day);
|
|
121
|
+
// Create directory
|
|
122
|
+
fs.mkdirSync(timelineDir, { recursive: true });
|
|
123
|
+
// Read and split content
|
|
124
|
+
const content = fs.readFileSync(logPath, 'utf-8');
|
|
125
|
+
const paragraphs = splitIntoParagraphs(content);
|
|
126
|
+
// Write each paragraph as L2 file
|
|
127
|
+
for (let i = 0; i < paragraphs.length; i++) {
|
|
128
|
+
const para = paragraphs[i];
|
|
129
|
+
const hour = String(i % 24).padStart(2, '0');
|
|
130
|
+
const minute = String((i * 7) % 60).padStart(2, '0');
|
|
131
|
+
const second = String((i * 13) % 60).padStart(2, '0');
|
|
132
|
+
const msgId = `${date.replace(/-/g, '')}_${String(i).padStart(4, '0')}`;
|
|
133
|
+
const l2Content = generateL2Content(para, sessionId, date, i);
|
|
134
|
+
const filename = `${hour}_${minute}_${second}_${msgId}.md`;
|
|
135
|
+
fs.writeFileSync(path.join(timelineDir, filename), l2Content, 'utf-8');
|
|
136
|
+
}
|
|
137
|
+
sessions.push(sessionId);
|
|
138
|
+
log?.(`Migrated ${date}: ${paragraphs.length} messages`);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
const errorMsg = `Failed to migrate ${logPath}: ${err}`;
|
|
142
|
+
errors.push(errorMsg);
|
|
143
|
+
log?.(`Error: ${errorMsg}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
count: dailyLogs.length,
|
|
148
|
+
sessions,
|
|
149
|
+
errors,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Migrate MEMORY.md to user preferences
|
|
154
|
+
*/
|
|
155
|
+
async function migrateMemoryMd(ocWorkspace, dataDir, log) {
|
|
156
|
+
const memoryMdPath = path.join(ocWorkspace, 'MEMORY.md');
|
|
157
|
+
if (!fs.existsSync(memoryMdPath)) {
|
|
158
|
+
log?.('No MEMORY.md found');
|
|
159
|
+
return { migrated: false };
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
const userDir = path.join(dataDir, 'users', MIGRATION_TENANT);
|
|
163
|
+
fs.mkdirSync(userDir, { recursive: true });
|
|
164
|
+
const content = fs.readFileSync(memoryMdPath, 'utf-8');
|
|
165
|
+
const targetPath = path.join(userDir, 'preferences.md');
|
|
166
|
+
// Add header to indicate migration source
|
|
167
|
+
const migratedContent = `<!--
|
|
168
|
+
Migrated from OpenClaw native MEMORY.md
|
|
169
|
+
Original path: ${memoryMdPath}
|
|
170
|
+
Migration date: ${new Date().toISOString()}
|
|
171
|
+
-->
|
|
172
|
+
${content}`;
|
|
173
|
+
fs.writeFileSync(targetPath, migratedContent, 'utf-8');
|
|
174
|
+
log?.('Migrated MEMORY.md to user preferences');
|
|
175
|
+
return { migrated: true };
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
const error = `Failed to migrate MEMORY.md: ${err}`;
|
|
179
|
+
log?.(`Error: ${error}`);
|
|
180
|
+
return { migrated: false, error };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Generate L0/L1 layers using cortex-mem-cli
|
|
185
|
+
*/
|
|
186
|
+
async function generateLayers(configPath, tenant, log) {
|
|
187
|
+
log?.('Generating L0/L1 layers...');
|
|
188
|
+
const cliPath = (0, binaries_js_1.getCliPath)();
|
|
189
|
+
if (!cliPath) {
|
|
190
|
+
log?.('cortex-mem-cli not found, skipping layer generation');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
const { stdout, stderr } = await execAsync(`"${cliPath}" --config "${configPath}" --tenant ${tenant} layers ensure-all`, { timeout: 300000 } // 5 minutes
|
|
195
|
+
);
|
|
196
|
+
if (stdout)
|
|
197
|
+
log?.(stdout);
|
|
198
|
+
if (stderr)
|
|
199
|
+
log?.(stderr);
|
|
200
|
+
log?.('Layer generation completed');
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
log?.(`Layer generation warning: ${err}`);
|
|
204
|
+
// Don't throw - this is not critical for migration
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Generate vector index using cortex-mem-cli
|
|
209
|
+
*/
|
|
210
|
+
async function generateVectorIndex(configPath, tenant, log) {
|
|
211
|
+
log?.('Generating vector index...');
|
|
212
|
+
const cliPath = (0, binaries_js_1.getCliPath)();
|
|
213
|
+
if (!cliPath) {
|
|
214
|
+
log?.('cortex-mem-cli not found, skipping vector index generation');
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
try {
|
|
218
|
+
const { stdout, stderr } = await execAsync(`"${cliPath}" --config "${configPath}" --tenant ${tenant} vector reindex`, { timeout: 600000 } // 10 minutes
|
|
219
|
+
);
|
|
220
|
+
if (stdout)
|
|
221
|
+
log?.(stdout);
|
|
222
|
+
if (stderr)
|
|
223
|
+
log?.(stderr);
|
|
224
|
+
log?.('Vector index generation completed');
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
log?.(`Vector index warning: ${err}`);
|
|
228
|
+
// Don't throw - this is not critical for migration
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Main migration function
|
|
233
|
+
*/
|
|
234
|
+
async function migrateFromOpenClaw(log) {
|
|
235
|
+
const result = {
|
|
236
|
+
dailyLogsMigrated: 0,
|
|
237
|
+
memoryMdMigrated: false,
|
|
238
|
+
sessionsCreated: [],
|
|
239
|
+
errors: [],
|
|
240
|
+
};
|
|
241
|
+
log?.('Starting OpenClaw memory migration...');
|
|
242
|
+
// Find OpenClaw workspace
|
|
243
|
+
const ocWorkspace = findOpenClawWorkspace();
|
|
244
|
+
if (!ocWorkspace) {
|
|
245
|
+
const error = 'OpenClaw workspace not found at ~/.openclaw/workspace';
|
|
246
|
+
result.errors.push(error);
|
|
247
|
+
log?.(error);
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
log?.(`Found OpenClaw workspace: ${ocWorkspace}`);
|
|
251
|
+
const dataDir = (0, config_js_1.getDataDir)();
|
|
252
|
+
const configPath = (0, config_js_1.getConfigPath)();
|
|
253
|
+
// Migrate daily logs
|
|
254
|
+
const dailyResult = await migrateDailyLogs(ocWorkspace, dataDir, log);
|
|
255
|
+
result.dailyLogsMigrated = dailyResult.count;
|
|
256
|
+
result.sessionsCreated = dailyResult.sessions;
|
|
257
|
+
result.errors.push(...dailyResult.errors);
|
|
258
|
+
// Migrate MEMORY.md
|
|
259
|
+
const memoryMdResult = await migrateMemoryMd(ocWorkspace, dataDir, log);
|
|
260
|
+
result.memoryMdMigrated = memoryMdResult.migrated;
|
|
261
|
+
if (memoryMdResult.error) {
|
|
262
|
+
result.errors.push(memoryMdResult.error);
|
|
263
|
+
}
|
|
264
|
+
// Generate layers and index
|
|
265
|
+
if (result.dailyLogsMigrated > 0 || result.memoryMdMigrated) {
|
|
266
|
+
await generateLayers(configPath, MIGRATION_TENANT, log);
|
|
267
|
+
await generateVectorIndex(configPath, MIGRATION_TENANT, log);
|
|
268
|
+
}
|
|
269
|
+
log?.(`Migration completed: ${result.dailyLogsMigrated} daily logs, MEMORY.md: ${result.memoryMdMigrated}`);
|
|
270
|
+
return result;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Check if migration is possible
|
|
274
|
+
*/
|
|
275
|
+
function canMigrate() {
|
|
276
|
+
const ocWorkspace = findOpenClawWorkspace();
|
|
277
|
+
if (!ocWorkspace) {
|
|
278
|
+
return { possible: false, reason: 'OpenClaw workspace not found' };
|
|
279
|
+
}
|
|
280
|
+
const memoryDir = path.join(ocWorkspace, 'memory');
|
|
281
|
+
const memoryMd = path.join(ocWorkspace, 'MEMORY.md');
|
|
282
|
+
if (!fs.existsSync(memoryDir) && !fs.existsSync(memoryMd)) {
|
|
283
|
+
return { possible: false, reason: 'No memory files found in OpenClaw workspace' };
|
|
284
|
+
}
|
|
285
|
+
return { possible: true, reason: 'OpenClaw memory found and ready for migration' };
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":"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"}
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memclaw/plugin",
|
|
3
|
-
"version": "0.9.
|
|
4
|
-
"description": "MemClaw - The Cortex Memory
|
|
3
|
+
"version": "0.9.3",
|
|
4
|
+
"description": "MemClaw - The Cortex Memory plugin for OpenClaw. Layered semantic memory for OpenClaw with easy setup and migration",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
package/skill/SKILL.md
CHANGED
|
@@ -21,7 +21,22 @@ MemClaw provides **three-layer semantic memory** with tiered retrieval:
|
|
|
21
21
|
|
|
22
22
|
The search engine queries all three layers internally and returns unified results with `snippet` and `content`.
|
|
23
23
|
|
|
24
|
-
##
|
|
24
|
+
## Pre-Use Requirements
|
|
25
|
+
|
|
26
|
+
**IMPORTANT**: Before using MemClaw for the first time, you MUST ensure:
|
|
27
|
+
|
|
28
|
+
1. **Qdrant** is running on port 6333/6334
|
|
29
|
+
2. **cortex-mem-service** is running on port 8085 with `--data-dir` and valid `config.toml`
|
|
30
|
+
3. **LLM/Embedding API keys** are configured in `config.toml`
|
|
31
|
+
|
|
32
|
+
**Manual Configuration Required**: Users must manually configure the following in `config.toml`:
|
|
33
|
+
- `llm.api_key` — LLM API key for memory processing
|
|
34
|
+
- `embedding.api_key` — Embedding API key for vector search
|
|
35
|
+
- `llm.api_base_url` / `embedding.api_base_url` — API endpoints (if not using OpenAI default)
|
|
36
|
+
|
|
37
|
+
> **See `references/setup.md`** for complete installation, service setup, and configuration instructions.
|
|
38
|
+
|
|
39
|
+
## Decision Flow
|
|
25
40
|
|
|
26
41
|
1. **Need to find something** → `cortex_search`
|
|
27
42
|
2. **Need more context** → `cortex_recall`
|
|
@@ -64,11 +79,14 @@ The search engine queries all three layers internally and returns unified result
|
|
|
64
79
|
| Services won't start | Check ports 6333, 6334, 8085; verify `api_key` in config.toml |
|
|
65
80
|
| Search returns no results | Run `cortex_list_sessions` to verify; lower `min_score` threshold |
|
|
66
81
|
| Migration fails | Ensure OpenClaw workspace at `~/.openclaw/workspace` |
|
|
82
|
+
| cortex-mem-service fails | Ensure `--data-dir` is set and `config.toml` exists in that directory |
|
|
83
|
+
| LLM/Embedding errors | Verify `llm.api_key` and `embedding.api_key` are configured in `config.toml` |
|
|
84
|
+
| Platform not supported | MemClaw supports macOS Apple Silicon and Windows x64 only |
|
|
67
85
|
|
|
68
86
|
## References
|
|
69
87
|
|
|
70
88
|
For detailed information, see:
|
|
71
89
|
|
|
72
|
-
- **`references/setup.md`** — Installation and configuration guide
|
|
90
|
+
- **`references/setup.md`** — Installation, service setup, and configuration guide
|
|
73
91
|
- **`references/tools.md`** — Detailed tool parameters and examples
|
|
74
|
-
- **`references/maintenance.md`** — CLI commands for data maintenance and optimization
|
|
92
|
+
- **`references/maintenance.md`** — CLI commands for data maintenance and optimization
|