0xkobold 0.7.2 → 0.8.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 (252) hide show
  1. package/HEARTBEAT.md +239 -0
  2. package/IDENTITY.md +12 -0
  3. package/README.md +138 -4
  4. package/SOUL.md +21 -0
  5. package/dist/package.json +10 -5
  6. package/dist/src/agent/bootstrap-loader.js +295 -66
  7. package/dist/src/agent/bootstrap-loader.js.map +1 -1
  8. package/dist/src/agent/context-pruning.js +10 -5
  9. package/dist/src/agent/context-pruning.js.map +1 -1
  10. package/dist/src/agent/embedded-runner.js +29 -15
  11. package/dist/src/agent/embedded-runner.js.map +1 -1
  12. package/dist/src/agent/index.js +5 -2
  13. package/dist/src/agent/index.js.map +1 -1
  14. package/dist/src/agent/system-prompt.js +167 -20
  15. package/dist/src/agent/system-prompt.js.map +1 -1
  16. package/dist/src/agent/tools/spawn-agent.js +72 -5
  17. package/dist/src/agent/tools/spawn-agent.js.map +1 -1
  18. package/dist/src/channels/slack/webhook.js +2 -2
  19. package/dist/src/channels/slack/webhook.js.map +1 -1
  20. package/dist/src/channels/telegram/bot.js +4 -4
  21. package/dist/src/channels/telegram/bot.js.map +1 -1
  22. package/dist/src/channels/whatsapp/integration.js +4 -4
  23. package/dist/src/channels/whatsapp/integration.js.map +1 -1
  24. package/dist/src/cli/commands/gateway.js +9 -10
  25. package/dist/src/cli/commands/gateway.js.map +1 -1
  26. package/dist/src/cli/commands/init.js +90 -0
  27. package/dist/src/cli/commands/init.js.map +1 -1
  28. package/dist/src/cli/commands/setup.js +53 -0
  29. package/dist/src/cli/commands/setup.js.map +1 -1
  30. package/dist/src/cli/index.js +0 -0
  31. package/dist/src/config/unified-config.js +5 -0
  32. package/dist/src/config/unified-config.js.map +1 -1
  33. package/dist/src/cron/index.js +2 -0
  34. package/dist/src/cron/index.js.map +1 -1
  35. package/dist/src/cron/nl-parser.js +522 -0
  36. package/dist/src/cron/nl-parser.js.map +1 -0
  37. package/dist/src/cron/runner.js +6 -31
  38. package/dist/src/cron/runner.js.map +1 -1
  39. package/dist/src/event-bus/index.js.map +1 -1
  40. package/dist/src/extensions/core/agent-orchestrator-extension.js +200 -148
  41. package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -1
  42. package/dist/src/extensions/core/diagnostics-extension.js +93 -56
  43. package/dist/src/extensions/core/diagnostics-extension.js.map +1 -1
  44. package/dist/src/extensions/core/draconic-safety-extension.js +256 -3
  45. package/dist/src/extensions/core/draconic-safety-extension.js.map +1 -1
  46. package/dist/src/extensions/core/heartbeat-extension.js +416 -150
  47. package/dist/src/extensions/core/heartbeat-extension.js.map +1 -1
  48. package/dist/src/extensions/core/{generative-agents-extension.js → learning-extension.js} +90 -128
  49. package/dist/src/extensions/core/learning-extension.js.map +1 -0
  50. package/dist/src/extensions/core/perennial-memory-extension.js +884 -87
  51. package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
  52. package/dist/src/extensions/core/routed-ollama-extension.js +345 -0
  53. package/dist/src/extensions/core/routed-ollama-extension.js.map +1 -0
  54. package/dist/src/extensions/core/task-manager-extension.js +25 -2
  55. package/dist/src/extensions/core/task-manager-extension.js.map +1 -1
  56. package/dist/src/extensions/core/websearch-enhanced-extension.js +81 -23
  57. package/dist/src/extensions/core/websearch-enhanced-extension.js.map +1 -1
  58. package/dist/src/extensions/core/workspace-footer-extension.js +40 -63
  59. package/dist/src/extensions/core/workspace-footer-extension.js.map +1 -1
  60. package/dist/src/extensions/loader.js +5 -1
  61. package/dist/src/extensions/loader.js.map +1 -1
  62. package/dist/src/gateway/gateway-server.js +74 -3
  63. package/dist/src/gateway/gateway-server.js.map +1 -1
  64. package/dist/src/gateway/index.js +2 -2
  65. package/dist/src/gateway/index.js.map +1 -1
  66. package/dist/src/gateway/methods/agent.js +1 -1
  67. package/dist/src/gateway/methods/agent.js.map +1 -1
  68. package/dist/src/gateway/methods/index.js +4 -0
  69. package/dist/src/gateway/methods/index.js.map +1 -1
  70. package/dist/src/gateway/methods/node.js +261 -0
  71. package/dist/src/gateway/methods/node.js.map +1 -0
  72. package/dist/src/gateway/queue-modes.js +356 -0
  73. package/dist/src/gateway/queue-modes.js.map +1 -0
  74. package/dist/src/index.js +47 -6
  75. package/dist/src/index.js.map +1 -1
  76. package/dist/src/llm/community-analytics.js +569 -0
  77. package/dist/src/llm/community-analytics.js.map +1 -0
  78. package/dist/src/llm/index.js +28 -4
  79. package/dist/src/llm/index.js.map +1 -1
  80. package/dist/src/llm/model-discovery.js +335 -0
  81. package/dist/src/llm/model-discovery.js.map +1 -0
  82. package/dist/src/llm/model-popularity.js +566 -0
  83. package/dist/src/llm/model-popularity.js.map +1 -0
  84. package/dist/src/llm/model-scoring-db.js +553 -0
  85. package/dist/src/llm/model-scoring-db.js.map +1 -0
  86. package/dist/src/llm/multi-provider.js +258 -0
  87. package/dist/src/llm/multi-provider.js.map +1 -0
  88. package/dist/src/llm/ollama.js +133 -187
  89. package/dist/src/llm/ollama.js.map +1 -1
  90. package/dist/src/llm/router-commands.js +773 -0
  91. package/dist/src/llm/router-commands.js.map +1 -0
  92. package/dist/src/llm/router-core.js +600 -0
  93. package/dist/src/llm/router-core.js.map +1 -0
  94. package/dist/src/memory/checkpoint-manager.js +278 -0
  95. package/dist/src/memory/checkpoint-manager.js.map +1 -0
  96. package/dist/src/memory/conflict-detector.js +279 -0
  97. package/dist/src/memory/conflict-detector.js.map +1 -0
  98. package/dist/src/memory/context-graph.js +360 -0
  99. package/dist/src/memory/context-graph.js.map +1 -0
  100. package/dist/src/memory/dialectic/benchmark-cli.js +200 -0
  101. package/dist/src/memory/dialectic/benchmark-cli.js.map +1 -0
  102. package/dist/src/memory/dialectic/debug-reasoning.js +37 -0
  103. package/dist/src/memory/dialectic/debug-reasoning.js.map +1 -0
  104. package/dist/src/memory/dialectic/index.js +135 -0
  105. package/dist/src/memory/dialectic/index.js.map +1 -0
  106. package/dist/src/memory/dialectic/nudges.js +380 -0
  107. package/dist/src/memory/dialectic/nudges.js.map +1 -0
  108. package/dist/src/memory/dialectic/reasoning-engine.js +607 -0
  109. package/dist/src/memory/dialectic/reasoning-engine.js.map +1 -0
  110. package/dist/src/memory/dialectic/reasoning.js +390 -0
  111. package/dist/src/memory/dialectic/reasoning.js.map +1 -0
  112. package/dist/src/memory/dialectic/skill-creation.js +481 -0
  113. package/dist/src/memory/dialectic/skill-creation.js.map +1 -0
  114. package/dist/src/memory/dialectic/store.js +663 -0
  115. package/dist/src/memory/dialectic/store.js.map +1 -0
  116. package/dist/src/memory/dialectic/types.js +11 -0
  117. package/dist/src/memory/dialectic/types.js.map +1 -0
  118. package/dist/src/memory/index.js +24 -2
  119. package/dist/src/memory/index.js.map +1 -1
  120. package/dist/src/memory/memory-decay.js +350 -0
  121. package/dist/src/memory/memory-decay.js.map +1 -0
  122. package/dist/src/memory/memory-integration.js +5 -5
  123. package/dist/src/memory/memory-integration.js.map +1 -1
  124. package/dist/src/memory/migrate-memory-stream.js +97 -0
  125. package/dist/src/memory/migrate-memory-stream.js.map +1 -0
  126. package/dist/src/memory/session-memory-bridge.js +49 -5
  127. package/dist/src/memory/session-memory-bridge.js.map +1 -1
  128. package/dist/src/memory/session-store.js +123 -0
  129. package/dist/src/memory/session-store.js.map +1 -1
  130. package/dist/src/memory/smart-write-rules.js +164 -0
  131. package/dist/src/memory/smart-write-rules.js.map +1 -0
  132. package/dist/src/memory/tiered-memory.js +436 -0
  133. package/dist/src/memory/tiered-memory.js.map +1 -0
  134. package/dist/src/memory/types.js +6 -0
  135. package/dist/src/memory/types.js.map +1 -0
  136. package/dist/src/memory/verify-migration.js +99 -0
  137. package/dist/src/memory/verify-migration.js.map +1 -0
  138. package/dist/src/pi-config.js +11 -9
  139. package/dist/src/pi-config.js.map +1 -1
  140. package/dist/src/skills/conditional-skills.js +464 -0
  141. package/dist/src/skills/conditional-skills.js.map +1 -0
  142. package/dist/src/skills/index.js +5 -0
  143. package/dist/src/skills/index.js.map +1 -1
  144. package/dist/src/skills/loader.js +56 -0
  145. package/dist/src/skills/loader.js.map +1 -1
  146. package/dist/src/skills/skill-manage.js +417 -0
  147. package/dist/src/skills/skill-manage.js.map +1 -0
  148. package/dist/src/tui/commands/orchestration-commands.js +62 -0
  149. package/dist/src/tui/commands/orchestration-commands.js.map +1 -1
  150. package/package.json +10 -5
  151. package/skills/model-router-test.ts +65 -0
  152. package/dist/src/extensions/core/auto-security-scan-extension.js +0 -41
  153. package/dist/src/extensions/core/auto-security-scan-extension.js.map +0 -1
  154. package/dist/src/extensions/core/cloudflare-browser-extension.js +0 -389
  155. package/dist/src/extensions/core/cloudflare-browser-extension.js.map +0 -1
  156. package/dist/src/extensions/core/compaction-safeguard.js +0 -223
  157. package/dist/src/extensions/core/compaction-safeguard.js.map +0 -1
  158. package/dist/src/extensions/core/generative-agents-extension.js.map +0 -1
  159. package/dist/src/extensions/core/obsidian-bridge-extension.js +0 -488
  160. package/dist/src/extensions/core/obsidian-bridge-extension.js.map +0 -1
  161. package/dist/src/llm/router.js +0 -145
  162. package/dist/src/llm/router.js.map +0 -1
  163. package/skills/kobold-scan-skill/node_modules/.package-lock.json +0 -172
  164. package/skills/kobold-scan-skill/node_modules/ansi-styles/index.d.ts +0 -345
  165. package/skills/kobold-scan-skill/node_modules/ansi-styles/index.js +0 -163
  166. package/skills/kobold-scan-skill/node_modules/ansi-styles/license +0 -9
  167. package/skills/kobold-scan-skill/node_modules/ansi-styles/package.json +0 -56
  168. package/skills/kobold-scan-skill/node_modules/ansi-styles/readme.md +0 -152
  169. package/skills/kobold-scan-skill/node_modules/balanced-match/.github/FUNDING.yml +0 -2
  170. package/skills/kobold-scan-skill/node_modules/balanced-match/LICENSE.md +0 -21
  171. package/skills/kobold-scan-skill/node_modules/balanced-match/README.md +0 -97
  172. package/skills/kobold-scan-skill/node_modules/balanced-match/index.js +0 -62
  173. package/skills/kobold-scan-skill/node_modules/balanced-match/package.json +0 -48
  174. package/skills/kobold-scan-skill/node_modules/brace-expansion/.github/FUNDING.yml +0 -2
  175. package/skills/kobold-scan-skill/node_modules/brace-expansion/LICENSE +0 -21
  176. package/skills/kobold-scan-skill/node_modules/brace-expansion/README.md +0 -135
  177. package/skills/kobold-scan-skill/node_modules/brace-expansion/index.js +0 -203
  178. package/skills/kobold-scan-skill/node_modules/brace-expansion/package.json +0 -49
  179. package/skills/kobold-scan-skill/node_modules/chalk/index.d.ts +0 -415
  180. package/skills/kobold-scan-skill/node_modules/chalk/license +0 -9
  181. package/skills/kobold-scan-skill/node_modules/chalk/package.json +0 -68
  182. package/skills/kobold-scan-skill/node_modules/chalk/readme.md +0 -341
  183. package/skills/kobold-scan-skill/node_modules/chalk/source/index.js +0 -229
  184. package/skills/kobold-scan-skill/node_modules/chalk/source/templates.js +0 -134
  185. package/skills/kobold-scan-skill/node_modules/chalk/source/util.js +0 -39
  186. package/skills/kobold-scan-skill/node_modules/color-convert/CHANGELOG.md +0 -54
  187. package/skills/kobold-scan-skill/node_modules/color-convert/LICENSE +0 -21
  188. package/skills/kobold-scan-skill/node_modules/color-convert/README.md +0 -68
  189. package/skills/kobold-scan-skill/node_modules/color-convert/conversions.js +0 -839
  190. package/skills/kobold-scan-skill/node_modules/color-convert/index.js +0 -81
  191. package/skills/kobold-scan-skill/node_modules/color-convert/package.json +0 -48
  192. package/skills/kobold-scan-skill/node_modules/color-convert/route.js +0 -97
  193. package/skills/kobold-scan-skill/node_modules/color-name/LICENSE +0 -8
  194. package/skills/kobold-scan-skill/node_modules/color-name/README.md +0 -11
  195. package/skills/kobold-scan-skill/node_modules/color-name/index.js +0 -152
  196. package/skills/kobold-scan-skill/node_modules/color-name/package.json +0 -28
  197. package/skills/kobold-scan-skill/node_modules/commander/LICENSE +0 -22
  198. package/skills/kobold-scan-skill/node_modules/commander/Readme.md +0 -1129
  199. package/skills/kobold-scan-skill/node_modules/commander/esm.mjs +0 -16
  200. package/skills/kobold-scan-skill/node_modules/commander/index.js +0 -27
  201. package/skills/kobold-scan-skill/node_modules/commander/lib/argument.js +0 -147
  202. package/skills/kobold-scan-skill/node_modules/commander/lib/command.js +0 -2179
  203. package/skills/kobold-scan-skill/node_modules/commander/lib/error.js +0 -45
  204. package/skills/kobold-scan-skill/node_modules/commander/lib/help.js +0 -461
  205. package/skills/kobold-scan-skill/node_modules/commander/lib/option.js +0 -326
  206. package/skills/kobold-scan-skill/node_modules/commander/lib/suggestSimilar.js +0 -100
  207. package/skills/kobold-scan-skill/node_modules/commander/package-support.json +0 -16
  208. package/skills/kobold-scan-skill/node_modules/commander/package.json +0 -80
  209. package/skills/kobold-scan-skill/node_modules/commander/typings/index.d.ts +0 -891
  210. package/skills/kobold-scan-skill/node_modules/fs.realpath/LICENSE +0 -43
  211. package/skills/kobold-scan-skill/node_modules/fs.realpath/README.md +0 -33
  212. package/skills/kobold-scan-skill/node_modules/fs.realpath/index.js +0 -66
  213. package/skills/kobold-scan-skill/node_modules/fs.realpath/old.js +0 -303
  214. package/skills/kobold-scan-skill/node_modules/fs.realpath/package.json +0 -26
  215. package/skills/kobold-scan-skill/node_modules/glob/LICENSE +0 -15
  216. package/skills/kobold-scan-skill/node_modules/glob/README.md +0 -399
  217. package/skills/kobold-scan-skill/node_modules/glob/common.js +0 -244
  218. package/skills/kobold-scan-skill/node_modules/glob/glob.js +0 -790
  219. package/skills/kobold-scan-skill/node_modules/glob/package.json +0 -55
  220. package/skills/kobold-scan-skill/node_modules/glob/sync.js +0 -486
  221. package/skills/kobold-scan-skill/node_modules/has-flag/index.d.ts +0 -39
  222. package/skills/kobold-scan-skill/node_modules/has-flag/index.js +0 -8
  223. package/skills/kobold-scan-skill/node_modules/has-flag/license +0 -9
  224. package/skills/kobold-scan-skill/node_modules/has-flag/package.json +0 -46
  225. package/skills/kobold-scan-skill/node_modules/has-flag/readme.md +0 -89
  226. package/skills/kobold-scan-skill/node_modules/inflight/LICENSE +0 -15
  227. package/skills/kobold-scan-skill/node_modules/inflight/README.md +0 -37
  228. package/skills/kobold-scan-skill/node_modules/inflight/inflight.js +0 -54
  229. package/skills/kobold-scan-skill/node_modules/inflight/package.json +0 -29
  230. package/skills/kobold-scan-skill/node_modules/inherits/LICENSE +0 -16
  231. package/skills/kobold-scan-skill/node_modules/inherits/README.md +0 -42
  232. package/skills/kobold-scan-skill/node_modules/inherits/inherits.js +0 -9
  233. package/skills/kobold-scan-skill/node_modules/inherits/inherits_browser.js +0 -27
  234. package/skills/kobold-scan-skill/node_modules/inherits/package.json +0 -29
  235. package/skills/kobold-scan-skill/node_modules/minimatch/LICENSE +0 -15
  236. package/skills/kobold-scan-skill/node_modules/minimatch/README.md +0 -259
  237. package/skills/kobold-scan-skill/node_modules/minimatch/lib/path.js +0 -4
  238. package/skills/kobold-scan-skill/node_modules/minimatch/minimatch.js +0 -944
  239. package/skills/kobold-scan-skill/node_modules/minimatch/package.json +0 -35
  240. package/skills/kobold-scan-skill/node_modules/once/LICENSE +0 -15
  241. package/skills/kobold-scan-skill/node_modules/once/README.md +0 -79
  242. package/skills/kobold-scan-skill/node_modules/once/once.js +0 -42
  243. package/skills/kobold-scan-skill/node_modules/once/package.json +0 -33
  244. package/skills/kobold-scan-skill/node_modules/supports-color/browser.js +0 -5
  245. package/skills/kobold-scan-skill/node_modules/supports-color/index.js +0 -135
  246. package/skills/kobold-scan-skill/node_modules/supports-color/license +0 -9
  247. package/skills/kobold-scan-skill/node_modules/supports-color/package.json +0 -53
  248. package/skills/kobold-scan-skill/node_modules/supports-color/readme.md +0 -76
  249. package/skills/kobold-scan-skill/node_modules/wrappy/LICENSE +0 -15
  250. package/skills/kobold-scan-skill/node_modules/wrappy/README.md +0 -36
  251. package/skills/kobold-scan-skill/node_modules/wrappy/package.json +0 -29
  252. package/skills/kobold-scan-skill/node_modules/wrappy/wrappy.js +0 -33
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-core.js","sourceRoot":"","sources":["../../../src/llm/router-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Session Checkpoint System
3
+ *
4
+ * Atomic session snapshots for recovery, debugging, and resumption
5
+ * Determinism: Replay any conversation
6
+ * Recoverability: Resume where you left off
7
+ * Debuggability: Inspect agent "thoughts"
8
+ */
9
+ const DEFAULT_CHECKPOINT_CONFIG = {
10
+ autoCheckpointEvery: 10,
11
+ checkpointBeforeTools: true,
12
+ checkpointAfterTools: true,
13
+ maxCheckpointsPerSession: 50,
14
+ autoPruneAge: 7,
15
+ allowForking: true,
16
+ };
17
+ export class CheckpointManager {
18
+ db;
19
+ config;
20
+ constructor(db, config) {
21
+ this.db = db;
22
+ this.config = { ...DEFAULT_CHECKPOINT_CONFIG, ...config };
23
+ }
24
+ /**
25
+ * Initialize checkpoint tables
26
+ */
27
+ initSchema() {
28
+ this.db.run(`
29
+ CREATE TABLE IF NOT EXISTS memory_checkpoints (
30
+ id TEXT PRIMARY KEY,
31
+ session_id TEXT NOT NULL,
32
+ parent_checkpoint_id TEXT,
33
+ message_count INTEGER NOT NULL,
34
+ conversation_data TEXT NOT NULL, -- JSON
35
+ tool_call_state TEXT, -- JSON
36
+ memory_thread_id TEXT NOT NULL,
37
+ conversation_summary TEXT,
38
+ context_window TEXT, -- JSON
39
+ created_at TEXT NOT NULL,
40
+ reason TEXT NOT NULL,
41
+ tags TEXT, -- JSON array
42
+ restored_count INTEGER DEFAULT 0,
43
+ last_restored_at TEXT,
44
+ FOREIGN KEY (parent_checkpoint_id) REFERENCES memory_checkpoints(id)
45
+ )
46
+ `);
47
+ // Migration: Add columns if they don't exist (for existing databases)
48
+ const columnsToAdd = [
49
+ { name: 'parent_checkpoint_id', type: 'TEXT' },
50
+ { name: 'conversation_data', type: 'TEXT' },
51
+ { name: 'tool_call_state', type: 'TEXT' },
52
+ { name: 'context_window', type: 'TEXT' },
53
+ { name: 'reason', type: 'TEXT' },
54
+ { name: 'tags', type: 'TEXT' },
55
+ { name: 'restored_count', type: 'INTEGER DEFAULT 0' },
56
+ { name: 'last_restored_at', type: 'TEXT' },
57
+ ];
58
+ for (const col of columnsToAdd) {
59
+ try {
60
+ this.db.run(`ALTER TABLE memory_checkpoints ADD COLUMN ${col.name} ${col.type}`);
61
+ }
62
+ catch (e) {
63
+ // Column already exists, ignore
64
+ }
65
+ }
66
+ // Indexes
67
+ this.db.run(`CREATE INDEX IF NOT EXISTS idx_checkpoints_session ON memory_checkpoints(session_id)`);
68
+ this.db.run(`CREATE INDEX IF NOT EXISTS idx_checkpoints_created ON memory_checkpoints(created_at)`);
69
+ // Parent checkpoint index - may fail if column doesn't exist yet (migration pending)
70
+ try {
71
+ this.db.run(`CREATE INDEX IF NOT EXISTS idx_checkpoints_parent ON memory_checkpoints(parent_checkpoint_id)`);
72
+ }
73
+ catch (e) {
74
+ // Index will be created after migration
75
+ }
76
+ console.log("[CheckpointManager] Schema initialized");
77
+ }
78
+ /**
79
+ * Create a checkpoint
80
+ */
81
+ create(sessionId, state, reason, tags = [], parentCheckpointId) {
82
+ const id = `ckpt_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;
83
+ // Prune old checkpoints if needed
84
+ this.pruneCheckpoints(sessionId);
85
+ this.db.query(`
86
+ INSERT INTO memory_checkpoints (
87
+ id, session_id, parent_checkpoint_id, message_count,
88
+ conversation_data, tool_call_state, memory_thread_id,
89
+ conversation_summary, context_window, created_at, reason, tags
90
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
91
+ `).run(id, sessionId, parentCheckpointId || null, state.messages.length, JSON.stringify(state.messages), state.toolCalls ? JSON.stringify(state.toolCalls) : null, state.memoryThreadId, state.summary || null, JSON.stringify(state.messages.slice(-5)), // Last 5 messages as context
92
+ new Date().toISOString(), reason, JSON.stringify(tags));
93
+ return id;
94
+ }
95
+ /**
96
+ * Restore from checkpoint
97
+ */
98
+ restore(checkpointId) {
99
+ const row = this.db.query(`SELECT * FROM memory_checkpoints WHERE id = ?`).get(checkpointId);
100
+ if (!row)
101
+ return null;
102
+ // Update restore count
103
+ this.db.query(`
104
+ UPDATE memory_checkpoints
105
+ SET restored_count = restored_count + 1, last_restored_at = ?
106
+ WHERE id = ?
107
+ `).run(new Date().toISOString(), checkpointId);
108
+ return {
109
+ id: row.id,
110
+ sessionId: row.session_id,
111
+ parentCheckpointId: row.parent_checkpoint_id,
112
+ messageCount: row.message_count,
113
+ conversationData: row.conversation_data,
114
+ toolCallState: row.tool_call_state,
115
+ memoryThreadId: row.memory_thread_id,
116
+ conversationSummary: row.conversation_summary,
117
+ contextWindow: row.context_window,
118
+ createdAt: row.created_at,
119
+ reason: row.reason,
120
+ tags: JSON.parse(row.tags || "[]"),
121
+ restoredCount: row.restored_count + 1,
122
+ lastRestoredAt: new Date().toISOString(),
123
+ };
124
+ }
125
+ /**
126
+ * Fork session from checkpoint
127
+ */
128
+ fork(checkpointId, newSessionId, reason) {
129
+ if (!this.config.allowForking) {
130
+ console.warn("[CheckpointManager] Forking disabled");
131
+ return null;
132
+ }
133
+ const original = this.restore(checkpointId);
134
+ if (!original)
135
+ return null;
136
+ const newId = this.create(newSessionId, {
137
+ messages: JSON.parse(original.conversationData),
138
+ toolCalls: original.toolCallState ? JSON.parse(original.toolCallState) : undefined,
139
+ memoryThreadId: original.memoryThreadId,
140
+ summary: original.conversationSummary,
141
+ }, "manual", [...original.tags, "fork", reason], checkpointId);
142
+ console.log(`[CheckpointManager] Forked ${checkpointId} → ${newId} for session ${newSessionId}`);
143
+ return newId;
144
+ }
145
+ /**
146
+ * Get checkpoints for session
147
+ */
148
+ getSessionCheckpoints(sessionId, limit = 20) {
149
+ const rows = this.db.query(`
150
+ SELECT * FROM memory_checkpoints
151
+ WHERE session_id = ?
152
+ ORDER BY created_at DESC
153
+ LIMIT ?
154
+ `).all(sessionId, limit);
155
+ return rows.map(r => ({
156
+ id: r.id,
157
+ messageCount: r.message_count,
158
+ createdAt: r.created_at,
159
+ reason: r.reason,
160
+ tags: JSON.parse(r.tags || "[]"),
161
+ restoredCount: r.restored_count,
162
+ summary: r.conversation_summary,
163
+ }));
164
+ }
165
+ /**
166
+ * Get checkpoint chain (for tree visualization)
167
+ */
168
+ getCheckpointChain(checkpointId) {
169
+ const chain = [];
170
+ let current = checkpointId;
171
+ while (current) {
172
+ const row = this.db.query(`SELECT * FROM memory_checkpoints WHERE id = ?`).get(current);
173
+ if (!row)
174
+ break;
175
+ chain.push({
176
+ id: row.id,
177
+ sessionId: row.session_id,
178
+ parentCheckpointId: row.parent_checkpoint_id,
179
+ messageCount: row.message_count,
180
+ conversationData: row.conversation_data,
181
+ toolCallState: row.tool_call_state,
182
+ memoryThreadId: row.memory_thread_id,
183
+ conversationSummary: row.conversation_summary,
184
+ contextWindow: row.context_window,
185
+ createdAt: row.created_at,
186
+ reason: row.reason,
187
+ tags: JSON.parse(row.tags || "[]"),
188
+ restoredCount: row.restored_count,
189
+ lastRestoredAt: row.last_restored_at,
190
+ });
191
+ current = row.parent_checkpoint_id;
192
+ }
193
+ return chain.reverse();
194
+ }
195
+ /**
196
+ * Delete checkpoint
197
+ */
198
+ delete(checkpointId) {
199
+ // Check for children
200
+ const children = this.db.query(`SELECT COUNT(*) as n FROM memory_checkpoints WHERE parent_checkpoint_id = ?`).get(checkpointId);
201
+ if (children.n > 0) {
202
+ throw new Error(`Checkpoint ${checkpointId} has ${children.n} child checkpoint(s). Delete children first.`);
203
+ }
204
+ this.db.query(`DELETE FROM memory_checkpoints WHERE id = ?`).run(checkpointId);
205
+ return true;
206
+ }
207
+ /**
208
+ * Prune old checkpoints
209
+ */
210
+ pruneCheckpoints(sessionId) {
211
+ // Count current
212
+ const count = this.db.query(`SELECT COUNT(*) as n FROM memory_checkpoints WHERE session_id = ?`).get(sessionId);
213
+ if (count.n >= this.config.maxCheckpointsPerSession) {
214
+ // Delete oldest
215
+ const toDelete = count.n - this.config.maxCheckpointsPerSession + 1;
216
+ this.db.query(`
217
+ DELETE FROM memory_checkpoints
218
+ WHERE session_id = ?
219
+ AND id IN (
220
+ SELECT id FROM memory_checkpoints
221
+ WHERE session_id = ?
222
+ ORDER BY created_at ASC
223
+ LIMIT ?
224
+ )
225
+ `).run(sessionId, sessionId, toDelete);
226
+ }
227
+ // Delete by age
228
+ const ageCutoff = new Date(Date.now() - this.config.autoPruneAge * 24 * 60 * 60 * 1000).toISOString();
229
+ this.db.query(`
230
+ DELETE FROM memory_checkpoints
231
+ WHERE session_id = ? AND created_at < ?
232
+ `).run(sessionId, ageCutoff);
233
+ }
234
+ /**
235
+ * Auto-checkpoint based on message count
236
+ */
237
+ shouldAutoCheckpoint(sessionId, messageCount) {
238
+ if (messageCount % this.config.autoCheckpointEvery === 0) {
239
+ return true;
240
+ }
241
+ return false;
242
+ }
243
+ /**
244
+ * Replay checkpoint (for debugging)
245
+ */
246
+ replay(checkpointId) {
247
+ const checkpoint = this.restore(checkpointId);
248
+ if (!checkpoint)
249
+ return null;
250
+ return {
251
+ messages: JSON.parse(checkpoint.conversationData),
252
+ toolCalls: checkpoint.toolCallState ? JSON.parse(checkpoint.toolCallState) : undefined,
253
+ summary: checkpoint.conversationSummary,
254
+ };
255
+ }
256
+ /**
257
+ * Get statistics
258
+ */
259
+ getStats() {
260
+ const total = this.db.query(`SELECT COUNT(*) as n FROM memory_checkpoints`).get()?.n || 0;
261
+ const sessions = this.db.query(`SELECT COUNT(DISTINCT session_id) as n FROM memory_checkpoints`).get()?.n || 0;
262
+ const mostRestored = this.db.query(`
263
+ SELECT id, restored_count
264
+ FROM memory_checkpoints
265
+ WHERE restored_count > 0
266
+ ORDER BY restored_count DESC
267
+ LIMIT 1
268
+ `).get();
269
+ return {
270
+ totalCheckpoints: total,
271
+ totalSessions: sessions,
272
+ avgPerSession: sessions > 0 ? Math.round(total / sessions) : 0,
273
+ mostRestored: mostRestored ? { id: mostRestored.id, count: mostRestored.restored_count } : null,
274
+ };
275
+ }
276
+ }
277
+ export { DEFAULT_CHECKPOINT_CONFIG };
278
+ //# sourceMappingURL=checkpoint-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-manager.js","sourceRoot":"","sources":["../../../src/memory/checkpoint-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Memory Conflict Detection
3
+ *
4
+ * Detect contradictions in user preferences and handle resolution
5
+ * "I love my job" vs "I hate my job" - embeddings close, truth different
6
+ */
7
+ const DEFAULT_CONFLICT_CONFIG = {
8
+ similarityThreshold: 0.85,
9
+ minConfidence: 0.8,
10
+ preferRecent: true,
11
+ archiveOld: true,
12
+ notifyUserOnConflict: true,
13
+ notifyThreshold: 0.7,
14
+ };
15
+ export class ConflictDetector {
16
+ db;
17
+ config;
18
+ constructor(db, config) {
19
+ this.db = db;
20
+ this.config = { ...DEFAULT_CONFLICT_CONFIG, ...config };
21
+ }
22
+ /**
23
+ * Initialize conflict tables
24
+ */
25
+ initSchema() {
26
+ this.db.run(`
27
+ CREATE TABLE IF NOT EXISTS memory_conflicts (
28
+ id TEXT PRIMARY KEY,
29
+ item_a_id TEXT NOT NULL,
30
+ item_b_id TEXT NOT NULL,
31
+ item_a_content TEXT NOT NULL,
32
+ item_b_content TEXT NOT NULL,
33
+ similarity_score REAL NOT NULL,
34
+ conflict_type TEXT NOT NULL, -- contradiction, update, duplicate
35
+ detected_at TEXT NOT NULL,
36
+ detected_by TEXT NOT NULL, -- llm, embedding, rule
37
+
38
+ -- Resolution
39
+ resolved_at TEXT,
40
+ resolution TEXT, -- keep_a, keep_b, merge, archive_both, user_decided
41
+ resolution_note TEXT,
42
+ resolved_by TEXT,
43
+ confidence REAL -- LLM confidence in resolution
44
+ )
45
+ `);
46
+ // Index for performance
47
+ this.db.run(`CREATE INDEX IF NOT EXISTS idx_conflicts_unresolved ON memory_conflicts(resolved_at IS NULL)`);
48
+ this.db.run(`CREATE INDEX IF NOT EXISTS idx_conflicts_items ON memory_conflicts(item_a_id, item_b_id)`);
49
+ console.log("[ConflictDetector] Schema initialized");
50
+ }
51
+ /**
52
+ * Check if new item conflicts with existing memories
53
+ */
54
+ async checkConflict(newItemId, newContent, embeddings) {
55
+ const conflicts = [];
56
+ // Get all active items (not the new one, not archived)
57
+ const existing = this.db.query(`
58
+ SELECT id, content FROM memory_items
59
+ WHERE id != ? AND archived = FALSE
60
+ `).all(newItemId);
61
+ // Get new item embedding
62
+ const newEmbedding = embeddings.get(newItemId);
63
+ for (const item of existing) {
64
+ const itemEmbedding = embeddings.get(item.id);
65
+ if (newEmbedding && itemEmbedding) {
66
+ const similarity = this.cosineSimilarity(newEmbedding, itemEmbedding);
67
+ // High similarity = potential conflict
68
+ if (similarity >= this.config.similarityThreshold) {
69
+ // Use LLM to determine conflict type
70
+ const analysis = await this.analyzeConflict(newContent, item.content);
71
+ if (analysis.conflictType !== "none") {
72
+ conflicts.push({
73
+ itemId: item.id,
74
+ content: item.content,
75
+ similarity,
76
+ conflictType: analysis.conflictType,
77
+ suggestedResolution: analysis.resolution,
78
+ confidence: analysis.confidence,
79
+ });
80
+ // Record in database
81
+ this.recordConflict(newItemId, item.id, newContent, item.content, similarity, analysis);
82
+ }
83
+ }
84
+ }
85
+ }
86
+ return conflicts;
87
+ }
88
+ /**
89
+ * Use LLM to analyze conflict
90
+ */
91
+ async analyzeConflict(contentA, contentB) {
92
+ const prompt = `Analyze these two memory items for conflicts:
93
+
94
+ Item A: "${contentA}"
95
+ Item B: "${contentB}"
96
+
97
+ Determine:
98
+ 1. CONTRADICTION: They cannot both be true ("I love" vs "I hate")
99
+ 2. UPDATE: Item B is newer information about same thing ("I had coffee" → "I had tea")
100
+ 3. DUPLICATE: Same information, keep only one
101
+ 4. NONE: No conflict, both can coexist
102
+
103
+ Return JSON:
104
+ {
105
+ "type": "contradiction|update|duplicate|none",
106
+ "reasoning": "brief explanation",
107
+ "suggested_action": "keep_a|keep_b|merge|archive_both",
108
+ "confidence": 0.0-1.0
109
+ }`;
110
+ try {
111
+ // This would call Ollama - using stub for now
112
+ // const response = await fetch(...)
113
+ // Stub implementation based on heuristics
114
+ const lowerA = contentA.toLowerCase();
115
+ const lowerB = contentB.toLowerCase();
116
+ // Check for negation flips
117
+ const negations = ["not", "never", "hate", "dislike", "quit", "left"];
118
+ const affirmations = ["love", "like", "enjoy", "have", "work", "at"];
119
+ const aHasNeg = negations.some(n => lowerA.includes(n));
120
+ const bHasNeg = negations.some(n => lowerB.includes(n));
121
+ const aHasAff = affirmations.some(a => lowerA.includes(a));
122
+ const bHasAff = affirmations.some(a => lowerB.includes(a));
123
+ if ((aHasNeg !== bHasNeg) && (aHasAff || bHasAff)) {
124
+ return {
125
+ conflictType: "contradiction",
126
+ resolution: "keep_b", // Prefer newer
127
+ confidence: 0.75,
128
+ };
129
+ }
130
+ // Check for time-based updates
131
+ const timeWords = ["now", "currently", "just", "recently", "today", "new"];
132
+ if (timeWords.some(w => lowerB.includes(w))) {
133
+ return {
134
+ conflictType: "update",
135
+ resolution: "keep_b",
136
+ confidence: 0.7,
137
+ };
138
+ }
139
+ // High similarity, likely duplicate
140
+ return {
141
+ conflictType: "duplicate",
142
+ resolution: "keep_a",
143
+ confidence: 0.8,
144
+ };
145
+ }
146
+ catch (err) {
147
+ return {
148
+ conflictType: "none",
149
+ resolution: "keep_both",
150
+ confidence: 0.5,
151
+ };
152
+ }
153
+ }
154
+ /**
155
+ * Resolve conflict
156
+ */
157
+ async resolveConflict(conflictId, resolution, note, userId) {
158
+ const conflict = this.db.query(`SELECT * FROM memory_conflicts WHERE id = ?`).get(conflictId);
159
+ if (!conflict)
160
+ return false;
161
+ // Apply resolution
162
+ const now = new Date().toISOString();
163
+ switch (resolution) {
164
+ case "keep_a":
165
+ this.db.query(`UPDATE memory_items SET archived = TRUE WHERE id = ?`).run(conflict.item_b_id);
166
+ break;
167
+ case "keep_b":
168
+ this.db.query(`UPDATE memory_items SET archived = TRUE WHERE id = ?`).run(conflict.item_a_id);
169
+ break;
170
+ case "archive_both":
171
+ this.db.query(`UPDATE memory_items SET archived = TRUE WHERE id IN (?, ?)`)
172
+ .run(conflict.item_a_id, conflict.item_b_id);
173
+ break;
174
+ case "merge":
175
+ // Keep A, update with B's info
176
+ // In practice, might want to do something more sophisticated
177
+ this.db.query(`UPDATE memory_items SET archived = TRUE WHERE id = ?`).run(conflict.item_b_id);
178
+ break;
179
+ case "user_decided":
180
+ // Just mark resolved, user will handle manually
181
+ break;
182
+ }
183
+ // Update conflict record
184
+ this.db.query(`
185
+ UPDATE memory_conflicts
186
+ SET resolved_at = ?, resolution = ?, resolution_note = ?, resolved_by = ?
187
+ WHERE id = ?
188
+ `).run(now, resolution, note || null, userId || "system", conflictId);
189
+ return true;
190
+ }
191
+ /**
192
+ * Auto-resolve conflicts above confidence threshold
193
+ */
194
+ async autoResolve(sessionId) {
195
+ const pending = this.db.query(`
196
+ SELECT * FROM memory_conflicts
197
+ WHERE resolved_at IS NULL AND confidence >= ?
198
+ `).all(this.config.minConfidence);
199
+ const result = { resolved: 0, flaggedForUser: 0, failed: 0 };
200
+ for (const conflict of pending) {
201
+ try {
202
+ // Prefer recent if configured
203
+ let resolution = "keep_b";
204
+ if (!this.config.preferRecent) {
205
+ resolution = "keep_a";
206
+ }
207
+ // Archive old if configured
208
+ if (this.config.archiveOld) {
209
+ await this.resolveConflict(conflict.id, resolution, "Auto-resolved by system", "system");
210
+ }
211
+ result.resolved++;
212
+ }
213
+ catch {
214
+ result.failed++;
215
+ }
216
+ }
217
+ // Flag conflicts needing user attention
218
+ const needsUser = this.db.query(`
219
+ SELECT * FROM memory_conflicts
220
+ WHERE resolved_at IS NULL
221
+ AND confidence < ?
222
+ AND confidence >= ?
223
+ `).all(this.config.minConfidence, this.config.notifyThreshold);
224
+ if (this.config.notifyUserOnConflict) {
225
+ for (const conflict of needsUser) {
226
+ // Emit notification event
227
+ // eventBus.emit("memory.needs_resolution", { conflict, sessionId });
228
+ result.flaggedForUser++;
229
+ }
230
+ }
231
+ return result;
232
+ }
233
+ /**
234
+ * Record conflict in database
235
+ */
236
+ recordConflict(itemAId, itemBId, contentA, contentB, similarity, analysis) {
237
+ const id = `conflict_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;
238
+ this.db.query(`
239
+ INSERT INTO memory_conflicts (
240
+ id, item_a_id, item_b_id, item_a_content, item_b_content,
241
+ similarity_score, conflict_type, detected_at, detected_by, confidence
242
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
243
+ `).run(id, itemAId, itemBId, contentA, contentB, similarity, analysis.conflictType, new Date().toISOString(), "llm", analysis.confidence);
244
+ }
245
+ /**
246
+ * Get pending conflicts
247
+ */
248
+ getPendingConflicts() {
249
+ const rows = this.db.query(`
250
+ SELECT * FROM memory_conflicts
251
+ WHERE resolved_at IS NULL
252
+ ORDER BY detected_at DESC
253
+ `).all();
254
+ return rows.map(r => ({
255
+ id: r.id,
256
+ itemA: { id: r.item_a_id, content: r.item_a_content },
257
+ itemB: { id: r.item_b_id, content: r.item_b_content },
258
+ type: r.conflict_type,
259
+ similarity: r.similarity_score,
260
+ detectedAt: r.detected_at,
261
+ }));
262
+ }
263
+ /**
264
+ * Cosine similarity calculation
265
+ */
266
+ cosineSimilarity(a, b) {
267
+ let dotProduct = 0;
268
+ let normA = 0;
269
+ let normB = 0;
270
+ for (let i = 0; i < a.length; i++) {
271
+ dotProduct += a[i] * b[i];
272
+ normA += a[i] * a[i];
273
+ normB += b[i] * b[i];
274
+ }
275
+ return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
276
+ }
277
+ }
278
+ export { DEFAULT_CONFLICT_CONFIG };
279
+ //# sourceMappingURL=conflict-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-detector.js","sourceRoot":"","sources":["../../../src/memory/conflict-detector.ts"],"names":[],"mappings":"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"}