@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/bin/init.js ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * npx @keyoku/openclaw init
5
+ *
6
+ * One-command setup for the Keyoku OpenClaw plugin.
7
+ * This is a thin shim that imports the compiled init module.
8
+ */
9
+
10
+ import('../dist/init.js')
11
+ .then((m) => m.init())
12
+ .catch((err) => {
13
+ console.error('Setup failed:', err);
14
+ process.exit(1);
15
+ });
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAgB,MAAM,YAAY,CAAC;AAa1D,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CA2ExF"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAgB,MAAM,YAAY,CAAC;AAc1D,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAgJxF"}
package/dist/cli.js CHANGED
@@ -2,8 +2,10 @@
2
2
  * CLI subcommand registration for memory management.
3
3
  * Registers `memory` command with search, list, stats, clear subcommands.
4
4
  */
5
+ import { join } from 'node:path';
5
6
  import { formatMemoryList } from './context.js';
6
7
  import { importMemoryFiles } from './migration.js';
8
+ import { migrateVectorStore, migrateAllVectorStores, discoverVectorDbs } from './migrate-vector-store.js';
7
9
  export function registerCli(api, client, entityId) {
8
10
  api.registerCli(({ program }) => {
9
11
  const prog = program;
@@ -66,6 +68,62 @@ export function registerCli(api, client, entityId) {
66
68
  });
67
69
  console.log(`\nImport complete: ${result.imported} imported, ${result.skipped} skipped, ${result.errors} errors`);
68
70
  });
71
+ memory
72
+ .command('migrate')
73
+ .description('Migrate OpenClaw vector store (SQLite) into Keyoku')
74
+ .option('--agent-id <id>', 'Agent ID to scope the migration')
75
+ .option('--sqlite <path>', 'Path to a specific OpenClaw .sqlite file')
76
+ .option('--include-markdown', 'Also import MEMORY.md and memory/*.md files')
77
+ .option('--dry-run', 'Show what would be imported without storing')
78
+ .action(async (opts) => {
79
+ const options = opts;
80
+ const home = process.env.HOME ?? '';
81
+ // Vector store migration
82
+ if (options.sqlite) {
83
+ // Migrate a specific SQLite file
84
+ const result = await migrateVectorStore({
85
+ client,
86
+ entityId,
87
+ sqlitePath: options.sqlite,
88
+ agentId: options.agentId,
89
+ dryRun: options.dryRun,
90
+ logger: console,
91
+ });
92
+ console.log(`\nVector migration: ${result.totalChunks} total, ${result.imported} imported, ${result.skipped} skipped, ${result.errors} errors`);
93
+ }
94
+ else {
95
+ // Auto-discover OpenClaw memory directory
96
+ const memoryDir = join(home, '.openclaw', 'memory');
97
+ const dbs = discoverVectorDbs(memoryDir);
98
+ if (dbs.length === 0) {
99
+ console.log('No OpenClaw vector stores found at ~/.openclaw/memory/*.sqlite');
100
+ }
101
+ else {
102
+ const result = await migrateAllVectorStores({
103
+ client,
104
+ entityId,
105
+ memoryDir,
106
+ agentId: options.agentId,
107
+ dryRun: options.dryRun,
108
+ logger: console,
109
+ });
110
+ console.log(`\nVector migration: ${result.totalChunks} total, ${result.imported} imported, ${result.skipped} skipped, ${result.errors} errors`);
111
+ }
112
+ }
113
+ // Optionally also import markdown files
114
+ if (options.includeMarkdown) {
115
+ const workspaceDir = join(home, '.openclaw');
116
+ const mdResult = await importMemoryFiles({
117
+ client,
118
+ entityId,
119
+ workspaceDir,
120
+ agentId: options.agentId,
121
+ dryRun: options.dryRun,
122
+ logger: console,
123
+ });
124
+ console.log(`Markdown import: ${mdResult.imported} imported, ${mdResult.skipped} skipped, ${mdResult.errors} errors`);
125
+ }
126
+ });
69
127
  }, { commands: ['memory'] });
70
128
  }
71
129
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAElF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAQnE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CAwH1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAM3D"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAElF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAQnE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CAgJ1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAM3D"}
package/dist/context.js CHANGED
@@ -23,6 +23,19 @@ export function formatMemoryContext(results) {
23
23
  * Used with the combined /heartbeat/context endpoint.
24
24
  */
25
25
  export function formatHeartbeatContext(ctx) {
26
+ // Nudge: engine selected a specific memory to reference naturally
27
+ if (ctx.decision_reason === 'nudge' && ctx.nudge_context) {
28
+ const sections = [];
29
+ sections.push(`## Nudge\nYou haven't heard from the user in a while. Here's something from memory you could casually bring up — only if it feels natural and useful. ONE short sentence max.`);
30
+ sections.push(`- ${escapeMemoryText(ctx.nudge_context)}`);
31
+ if (ctx.relevant_memories?.length > 0) {
32
+ sections.push('## What You Know');
33
+ for (const r of ctx.relevant_memories) {
34
+ sections.push(`- ${escapeMemoryText(r.memory.content)}`);
35
+ }
36
+ }
37
+ return `<heartbeat-signals>\n${sections.join('\n\n')}\n</heartbeat-signals>`;
38
+ }
26
39
  // If LLM analysis is available, use the analyzed output
27
40
  if (ctx.analysis) {
28
41
  const a = ctx.analysis;
@@ -46,6 +59,13 @@ export function formatHeartbeatContext(ctx) {
46
59
  if (a.user_facing) {
47
60
  sections.push(`## Tell the User\n${escapeMemoryText(a.user_facing)}`);
48
61
  }
62
+ // Inject relevant memories so the LLM has knowledge context, not just action signals
63
+ if (ctx.relevant_memories?.length > 0) {
64
+ sections.push('## What You Know');
65
+ for (const r of ctx.relevant_memories) {
66
+ sections.push(`- ${escapeMemoryText(r.memory.content)}`);
67
+ }
68
+ }
49
69
  sections.push(`Urgency: ${a.urgency} | Mode: ${a.autonomy}`);
50
70
  return `<heartbeat-signals>\n${sections.join('\n\n')}\n</heartbeat-signals>`;
51
71
  }
@@ -121,7 +141,7 @@ export function formatHeartbeatContext(ctx) {
121
141
  }
122
142
  if (sections.length === 0)
123
143
  return '';
124
- return `<heartbeat-signals>\nYou are being checked in on. Review the signals below alongside the current conversation. If any signal warrants action (a reminder, a nudge, a status update), do it. If nothing needs attention right now, reply HEARTBEAT_OK.\n\n${sections.join('\n')}\n</heartbeat-signals>`;
144
+ return `<heartbeat-signals>\nReview the signals below. If something genuinely warrants a message (a deadline, a reminder, new info), send ONE short sentence. Do NOT repeat things you have already said. If nothing is new or urgent, reply HEARTBEAT_OK.\n\n${sections.join('\n')}\n</heartbeat-signals>`;
125
145
  }
126
146
  /**
127
147
  * Format a list of memories for display (e.g., CLI or tool output).
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAuB;IACzD,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CACvF,CAAC;IAEF,OAAO,yWAAyW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC;AACvZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAA2B;IAChE,wDAAwD;IACxD,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC;QAEvB,oFAAoF;QACpF,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,mBAAmB,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACvG,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,QAAQ,CAAC,IAAI,CAAC,oBAAoB,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAEtE,IAAI,CAAC,CAAC,mBAAmB,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,KAAK,KAAK;gBACjC,CAAC,CAAC,0BAA0B;gBAC5B,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS;oBAC1B,CAAC,CAAC,sBAAsB;oBACxB,CAAC,CAAC,iBAAiB,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,mBAAmB,EAAE,CAAC;gBAC3C,QAAQ,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,qBAAqB,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE7D,OAAO,wBAAwB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC;IAC/E,CAAC;IAED,0DAA0D;IAC1D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,UAAU,IAAI,SAAS,GAAG,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACjC,QAAQ,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;YAC1F,QAAQ,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,WAAW,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1H,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClI,CAAC;IAED,IAAI,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,eAAe,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACtE,QAAQ,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;QACtE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1I,IAAI,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC5C,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,mBAAmB,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,WAAW,UAAU,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QACzG,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,mBAAmB,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,OAAO,4PAA4P,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC;AACjT,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAkB;IACjD,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO,oBAAoB,CAAC;IAEnD,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;SACvG,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,17 @@
1
1
  /**
2
2
  * Auto-generates HEARTBEAT.md so that OpenClaw's heartbeat runner
3
3
  * actually fires the heartbeat (empty file = skip).
4
+ *
5
+ * Preserves existing user content — appends keyoku instructions as
6
+ * an addendum rather than overwriting.
4
7
  */
5
8
  import type { PluginApi } from './types.js';
6
9
  /**
7
- * Write HEARTBEAT.md to the workspace if it doesn't exist or is effectively empty.
10
+ * Ensure HEARTBEAT.md exists with keyoku instructions.
11
+ * - No file → write full template
12
+ * - File with no user content → write full template
13
+ * - File with user content but no keyoku section → append keyoku section
14
+ * - File already has keyoku section → update it in place
8
15
  */
9
16
  export declare function ensureHeartbeatMd(api: PluginApi): void;
10
17
  //# sourceMappingURL=heartbeat-setup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat-setup.d.ts","sourceRoot":"","sources":["../src/heartbeat-setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqB5C;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAqBtD"}
1
+ {"version":3,"file":"heartbeat-setup.d.ts","sourceRoot":"","sources":["../src/heartbeat-setup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAmD5C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAuCtD"}
@@ -1,15 +1,20 @@
1
1
  /**
2
2
  * Auto-generates HEARTBEAT.md so that OpenClaw's heartbeat runner
3
3
  * actually fires the heartbeat (empty file = skip).
4
+ *
5
+ * Preserves existing user content — appends keyoku instructions as
6
+ * an addendum rather than overwriting.
4
7
  */
5
8
  import { existsSync, readFileSync, writeFileSync } from 'node:fs';
6
9
  import { join } from 'node:path';
7
10
  const HEARTBEAT_FILENAME = 'HEARTBEAT.md';
8
- const HEARTBEAT_TEMPLATE = `# Heartbeat Check
11
+ const KEYOKU_SECTION_MARKER = '<!-- keyoku-heartbeat-start -->';
12
+ const KEYOKU_SECTION_END = '<!-- keyoku-heartbeat-end -->';
13
+ const KEYOKU_HEARTBEAT_INSTRUCTIONS = `## Keyoku Memory Heartbeat
9
14
 
10
15
  You have been checked in on. Your memory system has reviewed your recent activity and surfaced anything that needs your attention. The signals are injected into your context automatically — look for the <heartbeat-signals> block.
11
16
 
12
- ## How to respond
17
+ ### How to respond
13
18
 
14
19
  IMPORTANT: If the signals contain \`should_act: true\` or a "Tell the User" section with ANY content, you MUST write a message to the user. Do NOT reply HEARTBEAT_OK in that case. Say something — even one sentence is fine.
15
20
 
@@ -19,26 +24,64 @@ IMPORTANT: If the signals contain \`should_act: true\` or a "Tell the User" sect
19
24
  4. If mode is \`suggest\` and urgency is not \`none\` — surface the suggestion naturally.
20
25
  5. ONLY reply HEARTBEAT_OK if \`should_act\` is false AND there is truly nothing in the signals worth mentioning.
21
26
 
22
- Do not repeat old tasks from prior conversations. Only act on what the signals say right now.
27
+ Do not repeat old tasks from prior conversations. Only act on what the signals say right now.`;
28
+ const HEARTBEAT_TEMPLATE = `# Heartbeat Check
29
+
30
+ ${KEYOKU_SECTION_MARKER}
31
+ ${KEYOKU_HEARTBEAT_INSTRUCTIONS}
32
+ ${KEYOKU_SECTION_END}
23
33
  `;
24
34
  /**
25
- * Write HEARTBEAT.md to the workspace if it doesn't exist or is effectively empty.
35
+ * Check if the file has meaningful user content beyond headings and whitespace.
36
+ */
37
+ function hasUserContent(content) {
38
+ // Strip out the keyoku section to check if there's OTHER content
39
+ const withoutKeyoku = content
40
+ .replace(new RegExp(`${escapeRegex(KEYOKU_SECTION_MARKER)}[\\s\\S]*?${escapeRegex(KEYOKU_SECTION_END)}`, 'g'), '')
41
+ .trim();
42
+ return withoutKeyoku
43
+ .split('\n')
44
+ .some((line) => {
45
+ const trimmed = line.trim();
46
+ return trimmed.length > 0 && !trimmed.startsWith('#') && trimmed !== '---';
47
+ });
48
+ }
49
+ function escapeRegex(s) {
50
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
51
+ }
52
+ /**
53
+ * Ensure HEARTBEAT.md exists with keyoku instructions.
54
+ * - No file → write full template
55
+ * - File with no user content → write full template
56
+ * - File with user content but no keyoku section → append keyoku section
57
+ * - File already has keyoku section → update it in place
26
58
  */
27
59
  export function ensureHeartbeatMd(api) {
28
60
  try {
29
61
  const heartbeatPath = join(api.resolvePath('.'), HEARTBEAT_FILENAME);
30
- if (existsSync(heartbeatPath)) {
31
- // Check if file is effectively empty (only comments/whitespace)
32
- const content = readFileSync(heartbeatPath, 'utf-8');
33
- const hasContent = content
34
- .split('\n')
35
- .some((line) => {
36
- const trimmed = line.trim();
37
- return trimmed.length > 0 && !trimmed.startsWith('#');
38
- });
39
- if (hasContent)
40
- return; // File has real content, don't overwrite
62
+ if (!existsSync(heartbeatPath)) {
63
+ writeFileSync(heartbeatPath, HEARTBEAT_TEMPLATE, 'utf-8');
64
+ api.logger.info(`keyoku: created ${HEARTBEAT_FILENAME} for heartbeat support`);
65
+ return;
66
+ }
67
+ const content = readFileSync(heartbeatPath, 'utf-8');
68
+ // Already has keyoku section — update it in place
69
+ if (content.includes(KEYOKU_SECTION_MARKER)) {
70
+ const updated = content.replace(new RegExp(`${escapeRegex(KEYOKU_SECTION_MARKER)}[\\s\\S]*?${escapeRegex(KEYOKU_SECTION_END)}`), `${KEYOKU_SECTION_MARKER}\n${KEYOKU_HEARTBEAT_INSTRUCTIONS}\n${KEYOKU_SECTION_END}`);
71
+ if (updated !== content) {
72
+ writeFileSync(heartbeatPath, updated, 'utf-8');
73
+ api.logger.info(`keyoku: updated keyoku section in ${HEARTBEAT_FILENAME}`);
74
+ }
75
+ return;
76
+ }
77
+ // Has user content but no keyoku section — append
78
+ if (hasUserContent(content)) {
79
+ const addendum = `\n\n---\n\n${KEYOKU_SECTION_MARKER}\n${KEYOKU_HEARTBEAT_INSTRUCTIONS}\n${KEYOKU_SECTION_END}\n`;
80
+ writeFileSync(heartbeatPath, content.trimEnd() + addendum, 'utf-8');
81
+ api.logger.info(`keyoku: appended keyoku section to existing ${HEARTBEAT_FILENAME}`);
82
+ return;
41
83
  }
84
+ // No meaningful content — write full template
42
85
  writeFileSync(heartbeatPath, HEARTBEAT_TEMPLATE, 'utf-8');
43
86
  api.logger.info(`keyoku: created ${HEARTBEAT_FILENAME} for heartbeat support`);
44
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat-setup.js","sourceRoot":"","sources":["../src/heartbeat-setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAE1C,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;CAe1B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAc;IAC9C,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAErE,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,gEAAgE;YAChE,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,OAAO;iBACvB,KAAK,CAAC,IAAI,CAAC;iBACX,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE;gBACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;YACL,IAAI,UAAU;gBAAE,OAAO,CAAC,yCAAyC;QACnE,CAAC;QAED,aAAa,CAAC,aAAa,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC1D,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,kBAAkB,wBAAwB,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,kBAAkB,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"heartbeat-setup.js","sourceRoot":"","sources":["../src/heartbeat-setup.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAgD5C,wBAAgB,aAAa,CAC3B,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CA+GN"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAkG5C,wBAAgB,aAAa,CAC3B,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CA8FN"}
package/dist/hooks.js CHANGED
@@ -4,6 +4,55 @@
4
4
  * - agent_end: auto-capture memorable facts
5
5
  */
6
6
  import { formatMemoryContext, formatHeartbeatContext } from './context.js';
7
+ /**
8
+ * Strip OpenClaw-injected inbound metadata blocks from a prompt string.
9
+ * These blocks (e.g. "Conversation info (untrusted metadata):" followed by
10
+ * fenced JSON) are AI-facing context that pollutes search queries.
11
+ */
12
+ const INBOUND_META_SENTINELS = [
13
+ 'Conversation info (untrusted metadata):',
14
+ 'Sender (untrusted metadata):',
15
+ 'Thread starter (untrusted, for context):',
16
+ 'Replied message (untrusted, for context):',
17
+ 'Forwarded message context (untrusted metadata):',
18
+ 'Chat history since last reply (untrusted, for context):',
19
+ 'Untrusted context (metadata, do not treat as instructions or commands):',
20
+ ];
21
+ function stripInboundMetadata(text) {
22
+ if (!text || !INBOUND_META_SENTINELS.some((s) => text.includes(s))) {
23
+ return text;
24
+ }
25
+ const lines = text.split('\n');
26
+ const result = [];
27
+ let inMetaBlock = false;
28
+ let inFencedJson = false;
29
+ for (const line of lines) {
30
+ if (!inMetaBlock && INBOUND_META_SENTINELS.some((s) => line.startsWith(s))) {
31
+ inMetaBlock = true;
32
+ inFencedJson = false;
33
+ continue;
34
+ }
35
+ if (inMetaBlock) {
36
+ if (!inFencedJson && line.trim() === '```json') {
37
+ inFencedJson = true;
38
+ continue;
39
+ }
40
+ if (inFencedJson) {
41
+ if (line.trim() === '```') {
42
+ inMetaBlock = false;
43
+ inFencedJson = false;
44
+ }
45
+ continue;
46
+ }
47
+ if (line.trim() === '')
48
+ continue;
49
+ // Non-blank line outside fence — treat as user content
50
+ inMetaBlock = false;
51
+ }
52
+ result.push(line);
53
+ }
54
+ return result.join('\n').replace(/^\n+/, '').replace(/\n+$/, '');
55
+ }
7
56
  /**
8
57
  * Extract a summary of recent activity from conversation messages.
9
58
  * Takes the last N user and assistant messages and builds a query string
@@ -42,10 +91,6 @@ function summarizeRecentActivity(messages, maxMessages = 6) {
42
91
  }
43
92
  return parts.join('\n');
44
93
  }
45
- // Idle check-in: track consecutive quiet heartbeats.
46
- // After N quiet beats, force the LLM to engage with the user.
47
- const IDLE_CHECK_IN_INTERVAL = 3; // every 3 quiet beats (~15 min with 5m heartbeat)
48
- let quietHeartbeatCount = 0;
49
94
  export function registerHooks(api, client, entityId, agentId, config) {
50
95
  // before_prompt_build: auto-recall + heartbeat context injection
51
96
  if (config.autoRecall || config.heartbeat) {
@@ -54,62 +99,41 @@ export function registerHooks(api, client, entityId, agentId, config) {
54
99
  if (!ev.prompt || ev.prompt.length < 5)
55
100
  return;
56
101
  const isHeartbeat = ev.prompt.includes('HEARTBEAT');
57
- // Heartbeat path: use heartbeat context endpoint with LLM analysis
102
+ // Heartbeat path: engine handles all intelligence (cooldown, novelty, active hours, nudges)
58
103
  if (isHeartbeat && config.heartbeat) {
59
104
  const activitySummary = summarizeRecentActivity(ev.messages ?? []);
105
+ // Detect active conversation: messages array has recent user content
106
+ const hasUserMessages = Array.isArray(ev.messages) && ev.messages.some((m) => {
107
+ const msg = m;
108
+ return msg.role === 'user' && msg.content && !msg.content.includes('HEARTBEAT');
109
+ });
110
+ const heartbeatQuery = activitySummary
111
+ || 'important things about this user, recent plans, preferences, and what they care about';
60
112
  try {
61
113
  const ctx = await client.heartbeatContext(entityId, {
62
- query: activitySummary || undefined,
63
- top_k: config.topK,
64
- min_score: 0.1,
114
+ query: heartbeatQuery,
115
+ top_k: Math.max(config.topK, 8),
116
+ min_score: 0.05,
65
117
  agent_id: agentId,
66
118
  max_results: 10,
67
119
  analyze: true,
68
120
  activity_summary: activitySummary || undefined,
69
121
  autonomy: config.autonomy,
122
+ in_conversation: hasUserMessages,
70
123
  });
71
- // Idle check-in: if nothing to act on, count quiet beats
72
- if (!ctx.should_act) {
73
- quietHeartbeatCount++;
74
- api.logger.info?.(`keyoku: quiet heartbeat ${quietHeartbeatCount}/${IDLE_CHECK_IN_INTERVAL}`);
75
- if (quietHeartbeatCount >= IDLE_CHECK_IN_INTERVAL) {
76
- quietHeartbeatCount = 0;
77
- // Build a check-in signal with any known memories
78
- const memoryHints = ctx.relevant_memories
79
- .slice(0, 3)
80
- .map((r) => r.memory.content)
81
- .join('; ');
82
- const checkInBlock = [
83
- '<heartbeat-signals>',
84
- '## Action Brief',
85
- 'It has been a while since you last reached out. Send the user a brief, friendly message right now.',
86
- '',
87
- '## Tell the User',
88
- memoryHints
89
- ? `Hey! Just checking in. Reference what you know about them: ${memoryHints}`
90
- : 'Hey! Just wanted to check in — how are things going?',
91
- '',
92
- '## Execute These Actions',
93
- '- Send a short, warm greeting to the user',
94
- '',
95
- 'should_act: true',
96
- `Urgency: low | Mode: ${config.autonomy}`,
97
- '</heartbeat-signals>',
98
- ];
99
- api.logger.info?.('keyoku: idle check-in triggered — forcing engagement');
100
- return { prependContext: checkInBlock.join('\n') };
124
+ const memories = ctx.relevant_memories ?? [];
125
+ const decision = ctx.decision_reason ?? 'unknown';
126
+ // Engine decides — plugin just logs and passes through
127
+ if (ctx.should_act) {
128
+ const formatted = formatHeartbeatContext(ctx);
129
+ if (formatted) {
130
+ const analysis = ctx.analysis;
131
+ const analyzed = analysis ? ` [${analysis.autonomy}/${analysis.urgency}]` : '';
132
+ api.logger.info?.(`keyoku: heartbeat ${decision} (memories: ${memories.length}, tier: ${ctx.highest_urgency_tier ?? 'n/a'}${analyzed})`);
133
+ return { prependContext: formatted };
101
134
  }
102
135
  }
103
- else {
104
- // Active heartbeat resets the quiet counter
105
- quietHeartbeatCount = 0;
106
- }
107
- const formatted = formatHeartbeatContext(ctx);
108
- if (formatted) {
109
- const analyzed = ctx.analysis ? ` [${ctx.analysis.autonomy}/${ctx.analysis.urgency}]` : '';
110
- api.logger.info?.(`keyoku: heartbeat context injected (should_act: ${ctx.should_act}, memories: ${ctx.relevant_memories.length}${analyzed})`);
111
- return { prependContext: formatted };
112
- }
136
+ api.logger.info?.(`keyoku: heartbeat ${decision} (should_act: false, memories: ${memories.length})`);
113
137
  }
114
138
  catch (err) {
115
139
  api.logger.warn(`keyoku: heartbeat context failed: ${String(err)}`);
@@ -119,11 +143,13 @@ export function registerHooks(api, client, entityId, agentId, config) {
119
143
  // Auto-recall path: search memories relevant to user's prompt + recent context
120
144
  if (config.autoRecall && !isHeartbeat) {
121
145
  try {
146
+ // Strip OpenClaw metadata blocks so the search query is the actual user message
147
+ const cleanPrompt = stripInboundMetadata(ev.prompt);
122
148
  // Build a richer query: user prompt + last assistant message for context
123
149
  const recentContext = summarizeRecentActivity(ev.messages ?? [], 2);
124
150
  const query = recentContext
125
- ? `${ev.prompt}\n\nRecent context:\n${recentContext}`
126
- : ev.prompt;
151
+ ? `${cleanPrompt}\n\nRecent context:\n${recentContext}`
152
+ : cleanPrompt;
127
153
  api.logger.info?.(`keyoku: auto-recall searching (query: ${query.slice(0, 80)}...)`);
128
154
  const results = await client.search(entityId, query, {
129
155
  limit: config.topK,
package/dist/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,aAAa,CAAC;AAO/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY;;;;;kBAOxC,SAAS;EAkC1B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,aAAa,CAAC;AAO/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY;;;;;kBAOxC,SAAS;EAqC1B"}
package/dist/index.js CHANGED
@@ -30,7 +30,10 @@ export default function keyokuMemory(config) {
30
30
  // Resolve entity/agent IDs — fall back to plugin API id
31
31
  const entityId = cfg.entityId || api.id || 'default';
32
32
  const agentId = cfg.agentId || api.id || 'default';
33
- const client = new KeyokuClient({ baseUrl: cfg.keyokuUrl });
33
+ const client = new KeyokuClient({
34
+ baseUrl: cfg.keyokuUrl,
35
+ token: process.env.KEYOKU_SESSION_TOKEN,
36
+ });
34
37
  api.logger.info(`keyoku: plugin registered (url: ${cfg.keyokuUrl}, entity: ${entityId})`);
35
38
  // Register 6 memory/schedule tools
36
39
  registerTools(api, client, entityId, agentId);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAqB,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIzD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,MAAqB;IACxD,OAAO;QACL,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,4EAA4E;QACzF,IAAI,EAAE,QAAiB;QAEvB,QAAQ,CAAC,GAAc;YACrB,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YAElC,wDAAwD;YACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;YACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;YAEnD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YAE5D,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,GAAG,CAAC,SAAS,aAAa,QAAQ,GAAG,CAAC,CAAC;YAE1F,mCAAmC;YACnC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE9C,kEAAkE;YAClE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAEnD,2CAA2C;YAC3C,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YAEpC,2BAA2B;YAC3B,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAEnC,2CAA2C;YAC3C,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC;gBAC3B,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAClE,CAAC;YAED,4EAA4E;YAC5E,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAqB,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIzD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,MAAqB;IACxD,OAAO;QACL,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,4EAA4E;QACzF,IAAI,EAAE,QAAiB;QAEvB,QAAQ,CAAC,GAAc;YACrB,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YAElC,wDAAwD;YACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;YACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;YAEnD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;gBAC9B,OAAO,EAAE,GAAG,CAAC,SAAS;gBACtB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;aACxC,CAAC,CAAC;YAEH,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,GAAG,CAAC,SAAS,aAAa,QAAQ,GAAG,CAAC,CAAC;YAE1F,mCAAmC;YACnC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE9C,kEAAkE;YAClE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAEnD,2CAA2C;YAC3C,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YAEpC,2BAA2B;YAC3B,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAEnC,2CAA2C;YAC3C,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC;gBAC3B,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAClE,CAAC;YAED,4EAA4E;YAC5E,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,21 @@
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
+ /**
18
+ * Main init function — orchestrates the full setup.
19
+ */
20
+ export declare function init(): Promise<void>;
21
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA+aH;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAoJ1C"}