@keyoku/openclaw 1.0.0 → 1.1.0

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.
Files changed (47) hide show
  1. package/bin/init.js +15 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +58 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/context.d.ts.map +1 -1
  6. package/dist/context.js +21 -1
  7. package/dist/context.js.map +1 -1
  8. package/dist/heartbeat-setup.d.ts +8 -1
  9. package/dist/heartbeat-setup.d.ts.map +1 -1
  10. package/dist/heartbeat-setup.js +58 -15
  11. package/dist/heartbeat-setup.js.map +1 -1
  12. package/dist/hooks.d.ts.map +1 -1
  13. package/dist/hooks.js +76 -50
  14. package/dist/hooks.js.map +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +4 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/init.d.ts +21 -0
  19. package/dist/init.d.ts.map +1 -0
  20. package/dist/init.js +522 -0
  21. package/dist/init.js.map +1 -0
  22. package/dist/migrate-vector-store.d.ts +52 -0
  23. package/dist/migrate-vector-store.d.ts.map +1 -0
  24. package/dist/migrate-vector-store.js +158 -0
  25. package/dist/migrate-vector-store.js.map +1 -0
  26. package/dist/service.d.ts.map +1 -1
  27. package/dist/service.js +27 -3
  28. package/dist/service.js.map +1 -1
  29. package/package.json +13 -4
  30. package/skills/keyoku-memory/SKILL.md +67 -0
  31. package/src/capture.ts +0 -116
  32. package/src/cli.ts +0 -95
  33. package/src/config.ts +0 -43
  34. package/src/context.ts +0 -164
  35. package/src/heartbeat-setup.ts +0 -53
  36. package/src/hooks.ts +0 -175
  37. package/src/incremental-capture.ts +0 -88
  38. package/src/index.ts +0 -68
  39. package/src/migration.ts +0 -241
  40. package/src/service.ts +0 -145
  41. package/src/tools.ts +0 -239
  42. package/src/types.ts +0 -40
  43. package/test/capture.test.ts +0 -139
  44. package/test/context.test.ts +0 -273
  45. package/test/hooks.test.ts +0 -137
  46. package/test/tools.test.ts +0 -174
  47. package/tsconfig.json +0 -8
package/dist/init.js ADDED
@@ -0,0 +1,522 @@
1
+ /**
2
+ * One-command installer for the Keyoku OpenClaw plugin.
3
+ *
4
+ * `npx @keyoku/openclaw init`
5
+ *
6
+ * 1. Detects OpenClaw config
7
+ * 2. Downloads keyoku-engine binary if missing
8
+ * 3. Registers plugin in openclaw.json (with full config defaults)
9
+ * 4. Configures DB path (~/.keyoku/data/keyoku.db)
10
+ * 5. Sets up LLM provider + API key (OpenAI required for embeddings)
11
+ * 6. Sets autonomy level (observe/suggest/act)
12
+ * 7. Auto-detects timezone, configures quiet hours
13
+ * 8. Installs SKILL.md (LLM guidebook) to workspace
14
+ * 9. Offers migration of existing OpenClaw memories
15
+ * 10. Health check to verify everything works
16
+ */
17
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync, createWriteStream, cpSync } from 'node:fs';
18
+ import { join, dirname } from 'node:path';
19
+ import { fileURLToPath } from 'node:url';
20
+ import { createInterface } from 'node:readline';
21
+ import { pipeline } from 'node:stream/promises';
22
+ import { KeyokuClient } from '@keyoku/memory';
23
+ import { importMemoryFiles } from './migration.js';
24
+ import { migrateAllVectorStores, discoverVectorDbs } from './migrate-vector-store.js';
25
+ const __dirname = dirname(fileURLToPath(import.meta.url));
26
+ const HOME = process.env.HOME ?? '';
27
+ const OPENCLAW_CONFIG_PATH = join(HOME, '.openclaw', 'openclaw.json');
28
+ const KEYOKU_BIN_DIR = join(HOME, '.keyoku', 'bin');
29
+ const KEYOKU_BIN_PATH = join(KEYOKU_BIN_DIR, 'keyoku');
30
+ const OPENCLAW_MEMORY_DIR = join(HOME, '.openclaw', 'memory');
31
+ function log(msg) {
32
+ console.log(` ${msg}`);
33
+ }
34
+ function success(msg) {
35
+ console.log(` [OK] ${msg}`);
36
+ }
37
+ function warn(msg) {
38
+ console.log(` [!] ${msg}`);
39
+ }
40
+ // Pre-buffered stdin lines for piped (non-TTY) input.
41
+ // When stdin is a pipe, readline only delivers the first line via question().
42
+ // We read all lines upfront and serve them from the buffer.
43
+ let stdinLines = null;
44
+ let stdinReady = null;
45
+ function ensureStdinBuffer() {
46
+ if (stdinReady)
47
+ return stdinReady;
48
+ if (process.stdin.isTTY) {
49
+ stdinReady = Promise.resolve();
50
+ return stdinReady;
51
+ }
52
+ stdinReady = new Promise((resolve) => {
53
+ const rl = createInterface({ input: process.stdin });
54
+ const lines = [];
55
+ rl.on('line', (line) => lines.push(line));
56
+ rl.on('close', () => {
57
+ stdinLines = lines;
58
+ resolve();
59
+ });
60
+ });
61
+ return stdinReady;
62
+ }
63
+ // Shared readline for TTY interactive mode
64
+ let ttyRl = null;
65
+ function closeTtyReadline() {
66
+ if (ttyRl) {
67
+ ttyRl.close();
68
+ ttyRl = null;
69
+ }
70
+ }
71
+ async function prompt(question) {
72
+ await ensureStdinBuffer();
73
+ // Piped mode — read from pre-buffered lines
74
+ if (stdinLines !== null) {
75
+ process.stdout.write(` ${question} `);
76
+ const answer = stdinLines.shift() ?? '';
77
+ console.log(answer);
78
+ return answer.trim();
79
+ }
80
+ // TTY mode — interactive prompt
81
+ if (!ttyRl) {
82
+ ttyRl = createInterface({ input: process.stdin, output: process.stdout });
83
+ }
84
+ return new Promise((resolve) => {
85
+ ttyRl.question(` ${question} `, (answer) => {
86
+ resolve(answer.trim());
87
+ });
88
+ });
89
+ }
90
+ /** Prompt that lowercases the answer (for y/n and enum choices). */
91
+ async function promptLower(question) {
92
+ return (await prompt(question)).toLowerCase();
93
+ }
94
+ /**
95
+ * Detect platform and architecture for binary download.
96
+ */
97
+ function getPlatformInfo() {
98
+ const platform = process.platform;
99
+ const arch = process.arch;
100
+ const osMap = {
101
+ darwin: 'darwin',
102
+ linux: 'linux',
103
+ win32: 'windows',
104
+ };
105
+ const archMap = {
106
+ x64: 'amd64',
107
+ arm64: 'arm64',
108
+ };
109
+ return {
110
+ os: osMap[platform] ?? platform,
111
+ arch: archMap[arch] ?? arch,
112
+ };
113
+ }
114
+ /**
115
+ * Download the keyoku-engine binary from GitHub releases.
116
+ */
117
+ async function downloadBinary() {
118
+ const { os, arch } = getPlatformInfo();
119
+ const binaryName = os === 'windows' ? 'keyoku-server.exe' : 'keyoku-server';
120
+ const assetName = `keyoku-server-${os}-${arch}${os === 'windows' ? '.exe' : ''}`;
121
+ log(`Downloading keyoku-engine for ${os}/${arch}...`);
122
+ try {
123
+ // Get latest release info from GitHub API
124
+ const releaseRes = await fetch('https://api.github.com/repos/keyoku-ai/keyoku-engine/releases/latest', { headers: { Accept: 'application/vnd.github.v3+json' } });
125
+ if (!releaseRes.ok) {
126
+ warn(`Could not fetch latest release: ${releaseRes.status} ${releaseRes.statusText}`);
127
+ return false;
128
+ }
129
+ const release = await releaseRes.json();
130
+ const asset = release.assets.find((a) => a.name === assetName);
131
+ if (!asset) {
132
+ warn(`No binary found for ${os}/${arch} in release ${release.tag_name}`);
133
+ warn(`Available assets: ${release.assets.map((a) => a.name).join(', ')}`);
134
+ return false;
135
+ }
136
+ log(`Downloading ${asset.name} from release ${release.tag_name}...`);
137
+ // Download the binary
138
+ const downloadRes = await fetch(asset.browser_download_url);
139
+ if (!downloadRes.ok || !downloadRes.body) {
140
+ warn(`Download failed: ${downloadRes.status}`);
141
+ return false;
142
+ }
143
+ // Ensure directory exists
144
+ mkdirSync(KEYOKU_BIN_DIR, { recursive: true });
145
+ // Stream to file
146
+ const destPath = KEYOKU_BIN_PATH;
147
+ const fileStream = createWriteStream(destPath);
148
+ // @ts-expect-error — Node fetch body is a ReadableStream, pipeline handles it
149
+ await pipeline(downloadRes.body, fileStream);
150
+ // Make executable
151
+ if (os !== 'windows') {
152
+ chmodSync(destPath, 0o755);
153
+ }
154
+ success(`Binary installed at ${destPath}`);
155
+ return true;
156
+ }
157
+ catch (err) {
158
+ warn(`Failed to download binary: ${String(err)}`);
159
+ return false;
160
+ }
161
+ }
162
+ /**
163
+ * Read and parse the OpenClaw config file.
164
+ */
165
+ function readOpenClawConfig() {
166
+ if (!existsSync(OPENCLAW_CONFIG_PATH))
167
+ return null;
168
+ try {
169
+ return JSON.parse(readFileSync(OPENCLAW_CONFIG_PATH, 'utf-8'));
170
+ }
171
+ catch {
172
+ return null;
173
+ }
174
+ }
175
+ /**
176
+ * Write the OpenClaw config file.
177
+ */
178
+ function writeOpenClawConfig(config) {
179
+ writeFileSync(OPENCLAW_CONFIG_PATH, JSON.stringify(config, null, 2) + '\n', 'utf-8');
180
+ }
181
+ /**
182
+ * Install the SKILL.md guidebook to the workspace skills directory.
183
+ * This teaches the LLM how to interpret heartbeat signals, use memory naturally, etc.
184
+ */
185
+ function installSkill() {
186
+ // The skill ships with the package at ../skills/keyoku-memory/SKILL.md
187
+ const bundledSkillDir = join(__dirname, '..', 'skills', 'keyoku-memory');
188
+ const bundledSkillPath = join(bundledSkillDir, 'SKILL.md');
189
+ // Install to workspace skills (highest precedence)
190
+ const workspaceSkillDir = join(HOME, '.openclaw', 'skills', 'keyoku-memory');
191
+ if (existsSync(join(workspaceSkillDir, 'SKILL.md'))) {
192
+ success('SKILL.md already installed in workspace');
193
+ return;
194
+ }
195
+ if (!existsSync(bundledSkillPath)) {
196
+ warn('Bundled SKILL.md not found — skill will load from plugin package instead');
197
+ return;
198
+ }
199
+ mkdirSync(workspaceSkillDir, { recursive: true });
200
+ cpSync(bundledSkillPath, join(workspaceSkillDir, 'SKILL.md'));
201
+ success('SKILL.md installed to ~/.openclaw/skills/keyoku-memory/');
202
+ }
203
+ /**
204
+ * Set up LLM provider and API keys.
205
+ * OpenAI is required for embeddings. Extraction provider is configurable.
206
+ */
207
+ async function setupLlmProvider() {
208
+ console.log('');
209
+ log('LLM Provider Setup');
210
+ log('Keyoku needs an OpenAI API key for embeddings (text-embedding-3-small).');
211
+ log('It also needs an LLM for memory extraction (can be OpenAI, Anthropic, or Gemini).');
212
+ console.log('');
213
+ // Check existing env vars
214
+ const hasOpenAI = !!process.env.OPENAI_API_KEY;
215
+ const hasAnthropic = !!process.env.ANTHROPIC_API_KEY;
216
+ const hasGemini = !!process.env.GEMINI_API_KEY;
217
+ if (hasOpenAI) {
218
+ success('OPENAI_API_KEY found in environment');
219
+ }
220
+ else {
221
+ warn('OPENAI_API_KEY not found — required for memory embeddings');
222
+ log('Set it in your shell profile or .env file:');
223
+ log(' export OPENAI_API_KEY=sk-...');
224
+ console.log('');
225
+ const key = await prompt('Enter your OpenAI API key (or press Enter to skip):');
226
+ if (key && key.startsWith('sk-')) {
227
+ appendToEnvFile('OPENAI_API_KEY', key);
228
+ process.env.OPENAI_API_KEY = key;
229
+ success('OPENAI_API_KEY saved to ~/.keyoku/.env');
230
+ }
231
+ else if (key) {
232
+ warn('That doesn\'t look like an OpenAI key (should start with sk-). Skipping.');
233
+ }
234
+ else {
235
+ warn('Skipped — you\'ll need to set OPENAI_API_KEY before using memory features');
236
+ }
237
+ }
238
+ // Extraction provider
239
+ const currentProvider = process.env.KEYOKU_EXTRACTION_PROVIDER;
240
+ if (currentProvider) {
241
+ success(`Extraction provider: ${currentProvider} (${process.env.KEYOKU_EXTRACTION_MODEL || 'default model'})`);
242
+ return;
243
+ }
244
+ // Auto-detect best available provider
245
+ if (hasOpenAI || process.env.OPENAI_API_KEY) {
246
+ log('Using OpenAI for memory extraction (detected OPENAI_API_KEY)');
247
+ appendToEnvFile('KEYOKU_EXTRACTION_PROVIDER', 'openai');
248
+ appendToEnvFile('KEYOKU_EXTRACTION_MODEL', 'gpt-4.1-mini');
249
+ }
250
+ else if (hasGemini) {
251
+ log('Using Gemini for memory extraction (detected GEMINI_API_KEY)');
252
+ appendToEnvFile('KEYOKU_EXTRACTION_PROVIDER', 'gemini');
253
+ appendToEnvFile('KEYOKU_EXTRACTION_MODEL', 'gemini-3.1-flash-lite-preview');
254
+ }
255
+ else if (hasAnthropic) {
256
+ log('Using Anthropic for memory extraction (detected ANTHROPIC_API_KEY)');
257
+ appendToEnvFile('KEYOKU_EXTRACTION_PROVIDER', 'anthropic');
258
+ appendToEnvFile('KEYOKU_EXTRACTION_MODEL', 'claude-haiku-4-5-20251001');
259
+ }
260
+ else {
261
+ warn('No LLM API key detected. Memory extraction will not work.');
262
+ warn('Set at least one: OPENAI_API_KEY, ANTHROPIC_API_KEY, or GEMINI_API_KEY');
263
+ }
264
+ }
265
+ /**
266
+ * Append a key=value to ~/.keyoku/.env (creates if needed).
267
+ * This file is sourced by the service when starting keyoku-engine.
268
+ */
269
+ function appendToEnvFile(key, value) {
270
+ const envDir = join(HOME, '.keyoku');
271
+ const envPath = join(envDir, '.env');
272
+ mkdirSync(envDir, { recursive: true });
273
+ let content = '';
274
+ if (existsSync(envPath)) {
275
+ content = readFileSync(envPath, 'utf-8');
276
+ // Replace existing key if present
277
+ const regex = new RegExp(`^${key}=.*$`, 'm');
278
+ if (regex.test(content)) {
279
+ content = content.replace(regex, `${key}=${value}`);
280
+ writeFileSync(envPath, content, 'utf-8');
281
+ return;
282
+ }
283
+ }
284
+ // Append new key
285
+ const line = `${key}=${value}\n`;
286
+ writeFileSync(envPath, content + line, 'utf-8');
287
+ }
288
+ /**
289
+ * Detect the system timezone (IANA format).
290
+ */
291
+ function detectTimezone() {
292
+ try {
293
+ return Intl.DateTimeFormat().resolvedOptions().timeZone;
294
+ }
295
+ catch {
296
+ return 'America/Los_Angeles';
297
+ }
298
+ }
299
+ /**
300
+ * Set up autonomy level — controls how aggressively heartbeat acts on signals.
301
+ */
302
+ async function setupAutonomy(config) {
303
+ console.log('');
304
+ log('Autonomy Level');
305
+ log('Controls how the agent acts on heartbeat signals (deadlines, reminders, etc.).');
306
+ console.log('');
307
+ log(' observe — Note signals silently, only act when the user asks');
308
+ log(' suggest — Mention important signals naturally in conversation (recommended)');
309
+ log(' act — Proactively execute actions (create reminders, follow up, etc.)');
310
+ console.log('');
311
+ const answer = await promptLower('Autonomy level [observe/suggest/act] (default: suggest):');
312
+ const level = ['observe', 'suggest', 'act'].includes(answer) ? answer : 'suggest';
313
+ // Save to plugin config in openclaw.json
314
+ const entry = config.plugins?.entries?.['keyoku-memory'];
315
+ if (entry) {
316
+ if (!entry.config)
317
+ entry.config = {};
318
+ entry.config.autonomy = level;
319
+ writeOpenClawConfig(config);
320
+ }
321
+ success(`Autonomy set to: ${level}`);
322
+ }
323
+ /**
324
+ * Set up timezone and quiet hours — controls when heartbeats are suppressed.
325
+ */
326
+ async function setupTimezoneAndQuietHours() {
327
+ console.log('');
328
+ log('Timezone & Quiet Hours');
329
+ // Auto-detect timezone
330
+ const detected = detectTimezone();
331
+ const tzAnswer = await prompt(`Timezone? (detected: ${detected}, press Enter to accept):`);
332
+ const timezone = tzAnswer || detected;
333
+ appendToEnvFile('KEYOKU_QUIET_HOURS_TIMEZONE', timezone);
334
+ success(`Timezone: ${timezone}`);
335
+ // Quiet hours
336
+ console.log('');
337
+ log('Quiet hours suppress non-urgent heartbeat signals (e.g., 11pm–7am).');
338
+ const enableQuiet = await promptLower('Enable quiet hours? (y/n, default: y):');
339
+ if (enableQuiet === 'n') {
340
+ appendToEnvFile('KEYOKU_QUIET_HOURS_ENABLED', 'false');
341
+ log('Quiet hours disabled — heartbeats can fire anytime');
342
+ return;
343
+ }
344
+ appendToEnvFile('KEYOKU_QUIET_HOURS_ENABLED', 'true');
345
+ const startAnswer = await prompt('Quiet start hour (0-23, default: 23):');
346
+ const endAnswer = await prompt('Quiet end hour (0-23, default: 7):');
347
+ const start = startAnswer ? parseInt(startAnswer, 10) : 23;
348
+ const end = endAnswer ? parseInt(endAnswer, 10) : 7;
349
+ if (!isNaN(start) && start >= 0 && start <= 23) {
350
+ appendToEnvFile('KEYOKU_QUIET_HOUR_START', String(start));
351
+ }
352
+ if (!isNaN(end) && end >= 0 && end <= 23) {
353
+ appendToEnvFile('KEYOKU_QUIET_HOUR_END', String(end));
354
+ }
355
+ success(`Quiet hours: ${isNaN(start) ? 23 : start}:00 – ${isNaN(end) ? 7 : end}:00 (${timezone})`);
356
+ }
357
+ /**
358
+ * Run a health check against keyoku-engine to verify the install works.
359
+ */
360
+ async function healthCheck() {
361
+ const url = 'http://localhost:18900';
362
+ log('Running health check...');
363
+ try {
364
+ const controller = new AbortController();
365
+ const timer = setTimeout(() => controller.abort(), 3000);
366
+ const res = await fetch(`${url}/api/v1/health`, { signal: controller.signal });
367
+ clearTimeout(timer);
368
+ if (res.ok) {
369
+ success('Keyoku engine is healthy');
370
+ return true;
371
+ }
372
+ warn(`Health check returned ${res.status}`);
373
+ return false;
374
+ }
375
+ catch {
376
+ // Engine isn't running yet — that's fine, it auto-starts with OpenClaw
377
+ log('Keyoku engine not running (it will auto-start when OpenClaw loads the plugin)');
378
+ return false;
379
+ }
380
+ }
381
+ /**
382
+ * Main init function — orchestrates the full setup.
383
+ */
384
+ export async function init() {
385
+ console.log('\n Keyoku OpenClaw Plugin — Setup\n');
386
+ // Step 1: Detect OpenClaw
387
+ const config = readOpenClawConfig();
388
+ if (!config) {
389
+ warn(`OpenClaw config not found at ${OPENCLAW_CONFIG_PATH}`);
390
+ warn('Make sure OpenClaw is installed first: https://openclaw.dev');
391
+ process.exit(1);
392
+ }
393
+ success('OpenClaw config detected');
394
+ // Step 2: Check if already installed
395
+ const entries = config.plugins?.entries ?? {};
396
+ const alreadyRegistered = !!entries['keyoku-memory']?.enabled;
397
+ if (alreadyRegistered) {
398
+ success('Keyoku plugin already registered in OpenClaw config');
399
+ }
400
+ else {
401
+ // Step 3: Ensure binary exists
402
+ if (existsSync(KEYOKU_BIN_PATH)) {
403
+ success(`Keyoku binary found at ${KEYOKU_BIN_PATH}`);
404
+ }
405
+ else {
406
+ log('Keyoku binary not found — downloading...');
407
+ const downloaded = await downloadBinary();
408
+ if (!downloaded) {
409
+ warn('Could not download binary. You can install it manually:');
410
+ warn(' Visit: https://github.com/keyoku-ai/keyoku-engine/releases');
411
+ warn(` Place the binary at: ${KEYOKU_BIN_PATH}`);
412
+ const proceed = await promptLower('Continue without binary? (y/n)');
413
+ if (proceed !== 'y') {
414
+ process.exit(1);
415
+ }
416
+ }
417
+ }
418
+ // Step 4: Register plugin in config
419
+ if (!config.plugins)
420
+ config.plugins = {};
421
+ if (!config.plugins.entries)
422
+ config.plugins.entries = {};
423
+ if (!config.plugins.slots)
424
+ config.plugins.slots = {};
425
+ config.plugins.entries['keyoku-memory'] = {
426
+ enabled: true,
427
+ config: {
428
+ keyokuUrl: 'http://localhost:18900',
429
+ autoRecall: true,
430
+ autoCapture: true,
431
+ heartbeat: true,
432
+ topK: 5,
433
+ },
434
+ };
435
+ config.plugins.slots['memory'] = 'keyoku-memory';
436
+ writeOpenClawConfig(config);
437
+ success('Plugin registered in openclaw.json');
438
+ }
439
+ // Step 5: Ensure DB path is configured
440
+ const dbPath = join(HOME, '.keyoku', 'data', 'keyoku.db');
441
+ appendToEnvFile('KEYOKU_DB_PATH', dbPath);
442
+ // Step 6: Set up LLM provider + API keys
443
+ await setupLlmProvider();
444
+ // Step 7: Autonomy level
445
+ await setupAutonomy(config);
446
+ // Step 8: Timezone & quiet hours
447
+ await setupTimezoneAndQuietHours();
448
+ // Step 9: Install SKILL.md guidebook
449
+ console.log('');
450
+ installSkill();
451
+ // Step 10: Check for existing memories to migrate
452
+ const memoryMdPath = join(HOME, '.openclaw', 'MEMORY.md');
453
+ const hasMemoryMd = existsSync(memoryMdPath);
454
+ const vectorDbs = discoverVectorDbs(OPENCLAW_MEMORY_DIR);
455
+ const hasVectorStores = vectorDbs.length > 0;
456
+ if (hasMemoryMd || hasVectorStores) {
457
+ console.log('');
458
+ log('Found existing OpenClaw memories:');
459
+ if (hasMemoryMd)
460
+ log(` - MEMORY.md`);
461
+ if (hasVectorStores)
462
+ log(` - ${vectorDbs.length} vector store(s) in ~/.openclaw/memory/`);
463
+ const migrate = await promptLower('Migrate existing memories into Keyoku? (y/n)');
464
+ if (migrate === 'y') {
465
+ log('Starting migration...');
466
+ const client = new KeyokuClient({
467
+ baseUrl: 'http://localhost:18900',
468
+ token: process.env.KEYOKU_SESSION_TOKEN,
469
+ timeout: 60000,
470
+ });
471
+ const entityId = 'default';
472
+ // Migrate markdown files
473
+ if (hasMemoryMd) {
474
+ try {
475
+ const mdResult = await importMemoryFiles({
476
+ client,
477
+ entityId,
478
+ workspaceDir: join(HOME, '.openclaw'),
479
+ logger: console,
480
+ });
481
+ success(`Markdown: ${mdResult.imported} imported, ${mdResult.skipped} skipped`);
482
+ }
483
+ catch (err) {
484
+ warn(`Markdown migration failed: ${String(err)}`);
485
+ warn('Make sure Keyoku is running (it will auto-start when OpenClaw loads the plugin)');
486
+ }
487
+ }
488
+ // Migrate vector stores
489
+ if (hasVectorStores) {
490
+ try {
491
+ const vsResult = await migrateAllVectorStores({
492
+ client,
493
+ entityId,
494
+ memoryDir: OPENCLAW_MEMORY_DIR,
495
+ logger: console,
496
+ });
497
+ success(`Vector store: ${vsResult.imported} imported, ${vsResult.skipped} skipped`);
498
+ }
499
+ catch (err) {
500
+ warn(`Vector store migration failed: ${String(err)}`);
501
+ }
502
+ }
503
+ }
504
+ else {
505
+ log('Skipping migration. You can run it later with: openclaw memory migrate');
506
+ }
507
+ }
508
+ // Step 11: Health check
509
+ console.log('');
510
+ await healthCheck();
511
+ // Done — close readline before exiting
512
+ closeTtyReadline();
513
+ console.log('\n Setup complete!\n');
514
+ log('Restart OpenClaw to load the plugin:');
515
+ log(' openclaw restart (or close and reopen your editor)');
516
+ console.log('');
517
+ log('The plugin will auto-start Keyoku when OpenClaw loads.');
518
+ log('Your agent now has persistent memory and heartbeat awareness.');
519
+ log('Run `openclaw memory stats` to check your memory status.');
520
+ log('Run `openclaw memory migrate` to migrate data later.\n');
521
+ }
522
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Vector store migration — imports OpenClaw's SQLite-based vector store into Keyoku.
3
+ *
4
+ * OpenClaw stores memory chunks in SQLite at ~/.openclaw/memory/<agentId>.sqlite
5
+ * with a `chunks` table (id, path, source, text, embedding, start_line, end_line).
6
+ *
7
+ * This migrator reads the text from each chunk, deduplicates against existing
8
+ * Keyoku memories, and stores each unique chunk. Embeddings are NOT migrated —
9
+ * Keyoku re-embeds with its own model.
10
+ */
11
+ import type { KeyokuClient } from '@keyoku/memory';
12
+ export interface VectorMigrationResult {
13
+ totalChunks: number;
14
+ imported: number;
15
+ skipped: number;
16
+ errors: number;
17
+ }
18
+ /**
19
+ * Discover OpenClaw SQLite memory databases.
20
+ */
21
+ export declare function discoverVectorDbs(memoryDir: string): string[];
22
+ /**
23
+ * Migrate a single OpenClaw SQLite vector store into Keyoku.
24
+ */
25
+ export declare function migrateVectorStore(params: {
26
+ client: KeyokuClient;
27
+ entityId: string;
28
+ sqlitePath: string;
29
+ agentId?: string;
30
+ dryRun?: boolean;
31
+ batchSize?: number;
32
+ delayMs?: number;
33
+ logger?: {
34
+ info: (msg: string) => void;
35
+ warn: (msg: string) => void;
36
+ };
37
+ }): Promise<VectorMigrationResult>;
38
+ /**
39
+ * Migrate all OpenClaw vector stores found in a directory.
40
+ */
41
+ export declare function migrateAllVectorStores(params: {
42
+ client: KeyokuClient;
43
+ entityId: string;
44
+ memoryDir: string;
45
+ agentId?: string;
46
+ dryRun?: boolean;
47
+ logger?: {
48
+ info: (msg: string) => void;
49
+ warn: (msg: string) => void;
50
+ };
51
+ }): Promise<VectorMigrationResult>;
52
+ //# sourceMappingURL=migrate-vector-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-vector-store.d.ts","sourceRoot":"","sources":["../src/migrate-vector-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAyBnD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAeD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAK7D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CACvE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAsGjC;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CACvE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA6BjC"}