cognitive-core 0.1.2 → 0.2.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 (483) hide show
  1. package/CLAUDE.md +233 -0
  2. package/README.md +370 -54
  3. package/dist/atlas.d.ts +10 -10
  4. package/dist/atlas.d.ts.map +1 -1
  5. package/dist/atlas.js +79 -48
  6. package/dist/atlas.js.map +1 -1
  7. package/dist/bin/cli-utils.d.ts +37 -0
  8. package/dist/bin/cli-utils.d.ts.map +1 -0
  9. package/dist/bin/cli-utils.js +176 -0
  10. package/dist/bin/cli-utils.js.map +1 -0
  11. package/dist/bin/cognitive-core.d.ts +2 -12
  12. package/dist/bin/cognitive-core.d.ts.map +1 -1
  13. package/dist/bin/cognitive-core.js +76 -351
  14. package/dist/bin/cognitive-core.js.map +1 -1
  15. package/dist/bin/commands/kb.d.ts +6 -0
  16. package/dist/bin/commands/kb.d.ts.map +1 -0
  17. package/dist/bin/commands/kb.js +240 -0
  18. package/dist/bin/commands/kb.js.map +1 -0
  19. package/dist/bin/commands/learn.d.ts +6 -0
  20. package/dist/bin/commands/learn.d.ts.map +1 -0
  21. package/dist/bin/commands/learn.js +91 -0
  22. package/dist/bin/commands/learn.js.map +1 -0
  23. package/dist/bin/commands/legacy.d.ts +12 -0
  24. package/dist/bin/commands/legacy.d.ts.map +1 -0
  25. package/dist/bin/commands/legacy.js +142 -0
  26. package/dist/bin/commands/legacy.js.map +1 -0
  27. package/dist/bin/commands/run.d.ts +3 -0
  28. package/dist/bin/commands/run.d.ts.map +1 -0
  29. package/dist/bin/commands/run.js +99 -0
  30. package/dist/bin/commands/run.js.map +1 -0
  31. package/dist/bin/commands/sessions.d.ts +9 -0
  32. package/dist/bin/commands/sessions.d.ts.map +1 -0
  33. package/dist/bin/commands/sessions.js +183 -0
  34. package/dist/bin/commands/sessions.js.map +1 -0
  35. package/dist/bin/commands/skills.d.ts +6 -0
  36. package/dist/bin/commands/skills.d.ts.map +1 -0
  37. package/dist/bin/commands/skills.js +135 -0
  38. package/dist/bin/commands/skills.js.map +1 -0
  39. package/dist/embeddings/index.d.ts +1 -0
  40. package/dist/embeddings/index.d.ts.map +1 -1
  41. package/dist/embeddings/index.js +2 -0
  42. package/dist/embeddings/index.js.map +1 -1
  43. package/dist/embeddings/inverted-index.d.ts +47 -0
  44. package/dist/embeddings/inverted-index.d.ts.map +1 -0
  45. package/dist/embeddings/inverted-index.js +122 -0
  46. package/dist/embeddings/inverted-index.js.map +1 -0
  47. package/dist/embeddings/manager.d.ts +3 -1
  48. package/dist/embeddings/manager.d.ts.map +1 -1
  49. package/dist/embeddings/manager.js +12 -7
  50. package/dist/embeddings/manager.js.map +1 -1
  51. package/dist/embeddings/vector-store.d.ts +7 -3
  52. package/dist/embeddings/vector-store.d.ts.map +1 -1
  53. package/dist/embeddings/vector-store.js +22 -6
  54. package/dist/embeddings/vector-store.js.map +1 -1
  55. package/dist/factory.d.ts +11 -12
  56. package/dist/factory.d.ts.map +1 -1
  57. package/dist/factory.js +20 -7
  58. package/dist/factory.js.map +1 -1
  59. package/dist/index.d.ts +7 -6
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +37 -5
  62. package/dist/index.js.map +1 -1
  63. package/dist/learning/analyzer.d.ts.map +1 -1
  64. package/dist/learning/analyzer.js +17 -35
  65. package/dist/learning/analyzer.js.map +1 -1
  66. package/dist/learning/energy-evaluator.d.ts +128 -0
  67. package/dist/learning/energy-evaluator.d.ts.map +1 -0
  68. package/dist/learning/energy-evaluator.js +175 -0
  69. package/dist/learning/energy-evaluator.js.map +1 -0
  70. package/dist/learning/healing-orchestrator.d.ts +182 -0
  71. package/dist/learning/healing-orchestrator.d.ts.map +1 -0
  72. package/dist/learning/healing-orchestrator.js +250 -0
  73. package/dist/learning/healing-orchestrator.js.map +1 -0
  74. package/dist/learning/index.d.ts +7 -2
  75. package/dist/learning/index.d.ts.map +1 -1
  76. package/dist/learning/index.js +13 -2
  77. package/dist/learning/index.js.map +1 -1
  78. package/dist/learning/instant-loop.d.ts +87 -0
  79. package/dist/learning/instant-loop.d.ts.map +1 -0
  80. package/dist/learning/instant-loop.js +264 -0
  81. package/dist/learning/instant-loop.js.map +1 -0
  82. package/dist/learning/loop-coordinator.d.ts +61 -0
  83. package/dist/learning/loop-coordinator.d.ts.map +1 -0
  84. package/dist/learning/loop-coordinator.js +96 -0
  85. package/dist/learning/loop-coordinator.js.map +1 -0
  86. package/dist/learning/maintenance-scheduler.d.ts +141 -0
  87. package/dist/learning/maintenance-scheduler.d.ts.map +1 -0
  88. package/dist/learning/maintenance-scheduler.js +186 -0
  89. package/dist/learning/maintenance-scheduler.js.map +1 -0
  90. package/dist/learning/meta-learner.d.ts.map +1 -1
  91. package/dist/learning/meta-learner.js +4 -21
  92. package/dist/learning/meta-learner.js.map +1 -1
  93. package/dist/learning/pipeline.d.ts +31 -4
  94. package/dist/learning/pipeline.d.ts.map +1 -1
  95. package/dist/learning/pipeline.js +64 -12
  96. package/dist/learning/pipeline.js.map +1 -1
  97. package/dist/learning/reflexion-generator.d.ts +64 -0
  98. package/dist/learning/reflexion-generator.d.ts.map +1 -0
  99. package/dist/learning/reflexion-generator.js +194 -0
  100. package/dist/learning/reflexion-generator.js.map +1 -0
  101. package/dist/learning/trajectory-sources/entire.d.ts +8 -5
  102. package/dist/learning/trajectory-sources/entire.d.ts.map +1 -1
  103. package/dist/learning/trajectory-sources/entire.js +13 -6
  104. package/dist/learning/trajectory-sources/entire.js.map +1 -1
  105. package/dist/learning/trajectory-sources/index.d.ts +1 -1
  106. package/dist/learning/trajectory-sources/index.d.ts.map +1 -1
  107. package/dist/learning/trajectory-sources/index.js +1 -1
  108. package/dist/learning/trajectory-sources/index.js.map +1 -1
  109. package/dist/learning/trajectory-sources/pipeline.d.ts +4 -4
  110. package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -1
  111. package/dist/learning/trajectory-sources/pipeline.js +2 -2
  112. package/dist/learning/trajectory-sources/pipeline.js.map +1 -1
  113. package/dist/learning/unified-pipeline.d.ts +281 -0
  114. package/dist/learning/unified-pipeline.d.ts.map +1 -0
  115. package/dist/learning/unified-pipeline.js +637 -0
  116. package/dist/learning/unified-pipeline.js.map +1 -0
  117. package/dist/memory/candidate-retrieval.d.ts +43 -0
  118. package/dist/memory/candidate-retrieval.d.ts.map +1 -0
  119. package/dist/memory/candidate-retrieval.js +41 -0
  120. package/dist/memory/candidate-retrieval.js.map +1 -0
  121. package/dist/memory/causal-store.d.ts +97 -0
  122. package/dist/memory/causal-store.d.ts.map +1 -0
  123. package/dist/memory/causal-store.js +209 -0
  124. package/dist/memory/causal-store.js.map +1 -0
  125. package/dist/memory/coherence.d.ts +71 -0
  126. package/dist/memory/coherence.d.ts.map +1 -0
  127. package/dist/memory/coherence.js +176 -0
  128. package/dist/memory/coherence.js.map +1 -0
  129. package/dist/memory/experience.d.ts +39 -6
  130. package/dist/memory/experience.d.ts.map +1 -1
  131. package/dist/memory/experience.js +193 -49
  132. package/dist/memory/experience.js.map +1 -1
  133. package/dist/memory/index.d.ts +7 -0
  134. package/dist/memory/index.d.ts.map +1 -1
  135. package/dist/memory/index.js +12 -0
  136. package/dist/memory/index.js.map +1 -1
  137. package/dist/memory/knowledge-bank.d.ts +14 -0
  138. package/dist/memory/knowledge-bank.d.ts.map +1 -1
  139. package/dist/memory/knowledge-bank.js +45 -0
  140. package/dist/memory/knowledge-bank.js.map +1 -1
  141. package/dist/memory/meta.d.ts +7 -8
  142. package/dist/memory/meta.d.ts.map +1 -1
  143. package/dist/memory/meta.js +73 -79
  144. package/dist/memory/meta.js.map +1 -1
  145. package/dist/memory/playbook.d.ts +26 -9
  146. package/dist/memory/playbook.d.ts.map +1 -1
  147. package/dist/memory/playbook.js +198 -74
  148. package/dist/memory/playbook.js.map +1 -1
  149. package/dist/memory/reasoning-bank.d.ts +130 -0
  150. package/dist/memory/reasoning-bank.d.ts.map +1 -0
  151. package/dist/memory/reasoning-bank.js +342 -0
  152. package/dist/memory/reasoning-bank.js.map +1 -0
  153. package/dist/memory/reflexion.d.ts +59 -0
  154. package/dist/memory/reflexion.d.ts.map +1 -0
  155. package/dist/memory/reflexion.js +96 -0
  156. package/dist/memory/reflexion.js.map +1 -0
  157. package/dist/memory/system.d.ts +7 -2
  158. package/dist/memory/system.d.ts.map +1 -1
  159. package/dist/memory/system.js +19 -7
  160. package/dist/memory/system.js.map +1 -1
  161. package/dist/memory/temporal-compressor.d.ts +126 -0
  162. package/dist/memory/temporal-compressor.d.ts.map +1 -0
  163. package/dist/memory/temporal-compressor.js +335 -0
  164. package/dist/memory/temporal-compressor.js.map +1 -0
  165. package/dist/persistence/index.d.ts +11 -0
  166. package/dist/persistence/index.d.ts.map +1 -0
  167. package/dist/persistence/index.js +11 -0
  168. package/dist/persistence/index.js.map +1 -0
  169. package/dist/persistence/migrator.d.ts +40 -0
  170. package/dist/persistence/migrator.d.ts.map +1 -0
  171. package/dist/persistence/migrator.js +238 -0
  172. package/dist/persistence/migrator.js.map +1 -0
  173. package/dist/persistence/serializers.d.ts +45 -0
  174. package/dist/persistence/serializers.d.ts.map +1 -0
  175. package/dist/persistence/serializers.js +80 -0
  176. package/dist/persistence/serializers.js.map +1 -0
  177. package/dist/persistence/sqlite-persistence.d.ts +228 -0
  178. package/dist/persistence/sqlite-persistence.d.ts.map +1 -0
  179. package/dist/persistence/sqlite-persistence.js +588 -0
  180. package/dist/persistence/sqlite-persistence.js.map +1 -0
  181. package/dist/runtime/flows/learning.d.ts +10 -12
  182. package/dist/runtime/flows/learning.d.ts.map +1 -1
  183. package/dist/runtime/flows/learning.js +10 -23
  184. package/dist/runtime/flows/learning.js.map +1 -1
  185. package/dist/search/index.d.ts +1 -0
  186. package/dist/search/index.d.ts.map +1 -1
  187. package/dist/search/index.js +2 -0
  188. package/dist/search/index.js.map +1 -1
  189. package/dist/search/moe-gate.d.ts +124 -0
  190. package/dist/search/moe-gate.d.ts.map +1 -0
  191. package/dist/search/moe-gate.js +234 -0
  192. package/dist/search/moe-gate.js.map +1 -0
  193. package/dist/search/router.d.ts +32 -2
  194. package/dist/search/router.d.ts.map +1 -1
  195. package/dist/search/router.js +87 -4
  196. package/dist/search/router.js.map +1 -1
  197. package/dist/session-bank/git-reader.d.ts +9 -4
  198. package/dist/session-bank/git-reader.d.ts.map +1 -1
  199. package/dist/session-bank/git-reader.js +22 -15
  200. package/dist/session-bank/git-reader.js.map +1 -1
  201. package/dist/session-bank/index.d.ts +2 -2
  202. package/dist/session-bank/index.d.ts.map +1 -1
  203. package/dist/session-bank/index.js +2 -2
  204. package/dist/session-bank/index.js.map +1 -1
  205. package/dist/session-bank/parser.d.ts +16 -5
  206. package/dist/session-bank/parser.d.ts.map +1 -1
  207. package/dist/session-bank/parser.js +187 -80
  208. package/dist/session-bank/parser.js.map +1 -1
  209. package/dist/session-bank/session-bank.d.ts +5 -0
  210. package/dist/session-bank/session-bank.d.ts.map +1 -1
  211. package/dist/session-bank/session-bank.js +30 -9
  212. package/dist/session-bank/session-bank.js.map +1 -1
  213. package/dist/session-bank/types.d.ts +4 -1
  214. package/dist/session-bank/types.d.ts.map +1 -1
  215. package/dist/session-bank/types.js +3 -3
  216. package/dist/session-bank/types.js.map +1 -1
  217. package/dist/surfacing/skill-publisher.d.ts.map +1 -1
  218. package/dist/surfacing/skill-publisher.js +15 -43
  219. package/dist/surfacing/skill-publisher.js.map +1 -1
  220. package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -1
  221. package/dist/surfacing/sqlite-storage-adapter.js +13 -21
  222. package/dist/surfacing/sqlite-storage-adapter.js.map +1 -1
  223. package/dist/types/config.d.ts +100 -0
  224. package/dist/types/config.d.ts.map +1 -1
  225. package/dist/types/config.js +27 -0
  226. package/dist/types/config.js.map +1 -1
  227. package/dist/types/index.d.ts +2 -2
  228. package/dist/types/index.d.ts.map +1 -1
  229. package/dist/types/index.js +1 -1
  230. package/dist/types/index.js.map +1 -1
  231. package/dist/types/memory.d.ts +52 -0
  232. package/dist/types/memory.d.ts.map +1 -1
  233. package/dist/types/memory.js +13 -0
  234. package/dist/types/memory.js.map +1 -1
  235. package/dist/types/playbook.d.ts +4 -0
  236. package/dist/types/playbook.d.ts.map +1 -1
  237. package/dist/types/playbook.js.map +1 -1
  238. package/dist/utils/error-classifier.d.ts +30 -0
  239. package/dist/utils/error-classifier.d.ts.map +1 -0
  240. package/dist/utils/error-classifier.js +85 -0
  241. package/dist/utils/error-classifier.js.map +1 -0
  242. package/dist/utils/index.d.ts +3 -0
  243. package/dist/utils/index.d.ts.map +1 -1
  244. package/dist/utils/index.js +3 -0
  245. package/dist/utils/index.js.map +1 -1
  246. package/dist/utils/partitioned-store.d.ts +93 -0
  247. package/dist/utils/partitioned-store.d.ts.map +1 -0
  248. package/dist/utils/partitioned-store.js +251 -0
  249. package/dist/utils/partitioned-store.js.map +1 -0
  250. package/dist/utils/trajectory-helpers.d.ts +39 -0
  251. package/dist/utils/trajectory-helpers.d.ts.map +1 -0
  252. package/dist/utils/trajectory-helpers.js +57 -0
  253. package/dist/utils/trajectory-helpers.js.map +1 -0
  254. package/dist/workspace/runner.d.ts +3 -4
  255. package/dist/workspace/runner.d.ts.map +1 -1
  256. package/dist/workspace/runner.js.map +1 -1
  257. package/dist/workspace/types.d.ts +9 -2
  258. package/dist/workspace/types.d.ts.map +1 -1
  259. package/dist/workspace/types.js.map +1 -1
  260. package/package.json +6 -4
  261. package/references/sessionlog/.husky/pre-commit +1 -0
  262. package/references/sessionlog/.lintstagedrc.json +4 -0
  263. package/references/sessionlog/.prettierignore +4 -0
  264. package/references/sessionlog/.prettierrc.json +11 -0
  265. package/references/sessionlog/LICENSE +21 -0
  266. package/references/sessionlog/README.md +453 -0
  267. package/references/sessionlog/eslint.config.js +58 -0
  268. package/references/sessionlog/package-lock.json +3672 -0
  269. package/references/sessionlog/package.json +65 -0
  270. package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
  271. package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
  272. package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
  273. package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
  274. package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
  275. package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
  276. package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
  277. package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
  278. package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
  279. package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
  280. package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
  281. package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
  282. package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
  283. package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
  284. package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
  285. package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
  286. package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
  287. package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
  288. package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
  289. package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
  290. package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
  291. package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
  292. package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
  293. package/references/sessionlog/src/__tests__/types.test.ts +166 -0
  294. package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
  295. package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
  296. package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
  297. package/references/sessionlog/src/agent/agents/claude-code.ts +1089 -0
  298. package/references/sessionlog/src/agent/agents/cursor.ts +361 -0
  299. package/references/sessionlog/src/agent/agents/gemini-cli.ts +632 -0
  300. package/references/sessionlog/src/agent/agents/opencode.ts +540 -0
  301. package/references/sessionlog/src/agent/registry.ts +143 -0
  302. package/references/sessionlog/src/agent/session-types.ts +113 -0
  303. package/references/sessionlog/src/agent/types.ts +220 -0
  304. package/references/sessionlog/src/cli.ts +597 -0
  305. package/references/sessionlog/src/commands/clean.ts +133 -0
  306. package/references/sessionlog/src/commands/disable.ts +84 -0
  307. package/references/sessionlog/src/commands/doctor.ts +145 -0
  308. package/references/sessionlog/src/commands/enable.ts +202 -0
  309. package/references/sessionlog/src/commands/explain.ts +261 -0
  310. package/references/sessionlog/src/commands/reset.ts +105 -0
  311. package/references/sessionlog/src/commands/resume.ts +180 -0
  312. package/references/sessionlog/src/commands/rewind.ts +195 -0
  313. package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
  314. package/references/sessionlog/src/commands/status.ts +172 -0
  315. package/references/sessionlog/src/config.ts +165 -0
  316. package/references/sessionlog/src/events/event-log.ts +126 -0
  317. package/references/sessionlog/src/git-operations.ts +558 -0
  318. package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
  319. package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
  320. package/references/sessionlog/src/index.ts +650 -0
  321. package/references/sessionlog/src/security/redaction.ts +283 -0
  322. package/references/sessionlog/src/session/state-machine.ts +452 -0
  323. package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
  324. package/references/sessionlog/src/store/native-store.ts +173 -0
  325. package/references/sessionlog/src/store/provider-types.ts +99 -0
  326. package/references/sessionlog/src/store/session-store.ts +266 -0
  327. package/references/sessionlog/src/strategy/attribution.ts +296 -0
  328. package/references/sessionlog/src/strategy/common.ts +207 -0
  329. package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
  330. package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
  331. package/references/sessionlog/src/strategy/types.ts +279 -0
  332. package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
  333. package/references/sessionlog/src/summarize/summarize.ts +432 -0
  334. package/references/sessionlog/src/types.ts +508 -0
  335. package/references/sessionlog/src/utils/chunk-files.ts +49 -0
  336. package/references/sessionlog/src/utils/commit-message.ts +65 -0
  337. package/references/sessionlog/src/utils/detect-agent.ts +36 -0
  338. package/references/sessionlog/src/utils/hook-managers.ts +125 -0
  339. package/references/sessionlog/src/utils/ide-tags.ts +32 -0
  340. package/references/sessionlog/src/utils/paths.ts +79 -0
  341. package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
  342. package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
  343. package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
  344. package/references/sessionlog/src/utils/string-utils.ts +46 -0
  345. package/references/sessionlog/src/utils/todo-extract.ts +188 -0
  346. package/references/sessionlog/src/utils/trailers.ts +187 -0
  347. package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
  348. package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
  349. package/references/sessionlog/src/utils/tree-ops.ts +219 -0
  350. package/references/sessionlog/src/utils/tty.ts +72 -0
  351. package/references/sessionlog/src/utils/validation.ts +65 -0
  352. package/references/sessionlog/src/utils/worktree.ts +58 -0
  353. package/references/sessionlog/src/wire-types.ts +59 -0
  354. package/references/sessionlog/templates/setup-env.sh +153 -0
  355. package/references/sessionlog/tsconfig.json +18 -0
  356. package/references/sessionlog/vitest.config.ts +12 -0
  357. package/references/skill-tree/.sudocode/issues.jsonl +8 -0
  358. package/references/skill-tree/.sudocode/specs.jsonl +2 -0
  359. package/references/skill-tree/CLAUDE.md +56 -80
  360. package/references/skill-tree/README.md +188 -140
  361. package/references/skill-tree/examples/basic-usage.ts +95 -121
  362. package/references/skill-tree/package-lock.json +369 -26
  363. package/references/skill-tree/package.json +1 -1
  364. package/src/atlas.ts +97 -67
  365. package/src/bin/cli-utils.ts +220 -0
  366. package/src/bin/cognitive-core.ts +84 -392
  367. package/src/bin/commands/kb.ts +266 -0
  368. package/src/bin/commands/learn.ts +100 -0
  369. package/src/bin/commands/legacy.ts +182 -0
  370. package/src/bin/commands/run.ts +113 -0
  371. package/src/bin/commands/sessions.ts +221 -0
  372. package/src/bin/commands/skills.ts +146 -0
  373. package/src/embeddings/index.ts +3 -0
  374. package/src/embeddings/inverted-index.ts +134 -0
  375. package/src/embeddings/manager.ts +13 -8
  376. package/src/embeddings/vector-store.ts +21 -9
  377. package/src/factory.ts +33 -16
  378. package/src/index.ts +109 -9
  379. package/src/learning/analyzer.ts +21 -37
  380. package/src/learning/energy-evaluator.ts +282 -0
  381. package/src/learning/healing-orchestrator.ts +383 -0
  382. package/src/learning/index.ts +65 -9
  383. package/src/learning/instant-loop.ts +357 -0
  384. package/src/learning/maintenance-scheduler.ts +271 -0
  385. package/src/learning/meta-learner.ts +5 -23
  386. package/src/learning/reflexion-generator.ts +273 -0
  387. package/src/learning/trajectory-sources/entire.ts +24 -13
  388. package/src/learning/trajectory-sources/index.ts +2 -2
  389. package/src/learning/trajectory-sources/pipeline.ts +5 -5
  390. package/src/learning/unified-pipeline.ts +921 -0
  391. package/src/memory/candidate-retrieval.ts +71 -0
  392. package/src/memory/causal-store.ts +273 -0
  393. package/src/memory/coherence.ts +252 -0
  394. package/src/memory/experience.ts +217 -50
  395. package/src/memory/index.ts +43 -0
  396. package/src/memory/knowledge-bank.ts +57 -0
  397. package/src/memory/meta.ts +78 -96
  398. package/src/memory/playbook.ts +239 -75
  399. package/src/memory/reasoning-bank.ts +458 -0
  400. package/src/memory/reflexion.ts +122 -0
  401. package/src/memory/system.ts +21 -5
  402. package/src/memory/temporal-compressor.ts +409 -0
  403. package/src/persistence/index.ts +37 -0
  404. package/src/persistence/migrator.ts +298 -0
  405. package/src/persistence/serializers.ts +79 -0
  406. package/src/persistence/sqlite-persistence.ts +925 -0
  407. package/src/runtime/flows/learning.ts +25 -42
  408. package/src/search/index.ts +10 -0
  409. package/src/search/moe-gate.ts +304 -0
  410. package/src/search/router.ts +111 -4
  411. package/src/session-bank/git-reader.ts +29 -19
  412. package/src/session-bank/index.ts +4 -2
  413. package/src/session-bank/parser.ts +280 -98
  414. package/src/session-bank/session-bank.ts +33 -12
  415. package/src/session-bank/types.ts +8 -5
  416. package/src/surfacing/skill-publisher.ts +17 -49
  417. package/src/surfacing/sqlite-storage-adapter.ts +16 -32
  418. package/src/types/config.ts +30 -0
  419. package/src/types/index.ts +3 -0
  420. package/src/types/memory.ts +30 -0
  421. package/src/types/playbook.ts +4 -0
  422. package/src/utils/error-classifier.ts +113 -0
  423. package/src/utils/index.ts +18 -0
  424. package/src/utils/partitioned-store.ts +299 -0
  425. package/src/utils/trajectory-helpers.ts +79 -0
  426. package/src/workspace/runner.ts +3 -3
  427. package/src/workspace/types.ts +10 -2
  428. package/tests/embeddings/inverted-index.test.ts +138 -0
  429. package/tests/feature-toggles.test.ts +275 -0
  430. package/tests/gap-fixes.test.ts +17 -4
  431. package/tests/integration/cli-e2e.test.ts +621 -0
  432. package/tests/integration/e2e.test.ts +6 -5
  433. package/tests/integration/entire-e2e.test.ts +314 -125
  434. package/tests/integration/persistence-e2e.test.ts +741 -0
  435. package/tests/integration/phase-e2e.test.ts +1143 -0
  436. package/tests/integration/session-bank.test.ts +20 -14
  437. package/tests/integration/sessionlog-e2e.test.ts +329 -0
  438. package/tests/integration/unified-pipeline-e2e.test.ts +634 -0
  439. package/tests/learning/analyzer.test.ts +1 -1
  440. package/tests/learning/energy-evaluator.test.ts +180 -0
  441. package/tests/learning/entire-trajectory-source.test.ts +25 -25
  442. package/tests/learning/healing-orchestrator.test.ts +269 -0
  443. package/tests/learning/instant-loop.test.ts +243 -0
  444. package/tests/learning/maintenance-scheduler.test.ts +191 -0
  445. package/tests/learning/reflexion-generator.test.ts +411 -0
  446. package/tests/learning/trajectory-sources.test.ts +12 -4
  447. package/tests/learning/unified-pipeline.test.ts +322 -0
  448. package/tests/mcp/playbook-server.test.ts +6 -1
  449. package/tests/memory/causal-store.test.ts +276 -0
  450. package/tests/memory/coherence.test.ts +232 -0
  451. package/tests/memory/experience.test.ts +8 -3
  452. package/tests/memory/playbook.test.ts +307 -1
  453. package/tests/memory/provenance.test.ts +11 -2
  454. package/tests/memory/reasoning-bank.test.ts +239 -0
  455. package/tests/memory/reflexion.test.ts +166 -0
  456. package/tests/memory/skill-exporter.test.ts +6 -1
  457. package/tests/memory/system.test.ts +6 -1
  458. package/tests/memory/temporal-compressor.test.ts +318 -0
  459. package/tests/persistence/migrator.test.ts +1009 -0
  460. package/tests/persistence/sqlite-persistence.test.ts +635 -0
  461. package/tests/runtime/agent-manager.test.ts +6 -1
  462. package/tests/runtime/delegate.test.ts +6 -1
  463. package/tests/search/moe-gate.test.ts +250 -0
  464. package/tests/search/refinement-loop.test.ts +11 -2
  465. package/tests/search/router.test.ts +81 -2
  466. package/tests/session-bank/fixtures/sessionlog-root-metadata.json +16 -0
  467. package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +6 -0
  468. package/tests/session-bank/fixtures/sessionlog-session/metadata.json +55 -0
  469. package/tests/session-bank/git-reader.test.ts +13 -13
  470. package/tests/session-bank/parser.test.ts +135 -3
  471. package/tests/session-bank/session-bank.test.ts +1 -1
  472. package/tests/surfacing/skill-library.test.ts +6 -1
  473. package/tests/surfacing/skill-publisher.test.ts +24 -58
  474. package/tests/surfacing/sqlite-storage-adapter.test.ts +11 -23
  475. package/tests/utils/partitioned-store.test.ts +230 -0
  476. package/tests/workspace/full-flow.test.ts +10 -4
  477. package/tests/workspace/runner.test.ts +10 -4
  478. package/docs/DESIGN-workspace-migration.md +0 -1079
  479. package/docs/PLAN-agentic-workspace-implementation.md +0 -717
  480. package/docs/PLAN-graph-migration.md +0 -299
  481. package/docs/PLAN-session-bank-implementation.md +0 -474
  482. package/src/learning/pipeline.ts +0 -323
  483. package/tests/learning/pipeline.test.ts +0 -176
@@ -1,6 +1,10 @@
1
1
  import type { Experience } from '../types/index.js';
2
- import { JsonStore } from '../utils/storage.js';
2
+ import type { SqlitePersistence, ExperienceRow } from '../persistence/index.js';
3
+ import { fromISO, fromInt, fromJSON, blobToEmbedding } from '../persistence/index.js';
4
+ import { InvertedIndex } from '../embeddings/inverted-index.js';
3
5
  import { findTopK } from '../utils/similarity.js';
6
+ import type { ReasoningBank } from './reasoning-bank.js';
7
+ import { getCandidates, type ItemResolver } from './candidate-retrieval.js';
4
8
 
5
9
  /**
6
10
  * Result of pruning operation
@@ -22,34 +26,94 @@ export interface PruneResult {
22
26
  remainingCount: number;
23
27
  }
24
28
 
29
+ /**
30
+ * Convert an ExperienceRow (SQLite representation) back to an Experience (domain type).
31
+ */
32
+ function rowToExperience(row: ExperienceRow): Experience {
33
+ return {
34
+ id: row.id,
35
+ taskInput: row.task_input,
36
+ solutionOutput: row.solution_output,
37
+ feedback: row.feedback,
38
+ success: fromInt(row.success),
39
+ domain: row.domain,
40
+ embedding: blobToEmbedding(row.embedding),
41
+ trajectoryId: row.trajectory_id,
42
+ usageCount: row.usage_count,
43
+ accessScore: row.access_score,
44
+ retrievalCount: row.retrieval_count,
45
+ tier: row.tier as 'hot' | 'warm' | 'cold',
46
+ compressed: fromJSON(row.compressed),
47
+ metadata: fromJSON(row.metadata, {}),
48
+ createdAt: fromISO(row.created_at) ?? new Date(),
49
+ lastAccessedAt: fromISO(row.last_accessed_at),
50
+ };
51
+ }
52
+
25
53
  /**
26
54
  * Experience Memory - ReMem-style task-level retrieval
27
55
  * Stores complete (task, solution, feedback) tuples
56
+ *
57
+ * Uses SqlitePersistence for storage and InvertedIndex
58
+ * for fast candidate narrowing before similarity scoring.
28
59
  */
29
60
  export class ExperienceMemory {
30
- private _store: JsonStore<Experience>;
61
+ private persistence: SqlitePersistence;
62
+ private _index: InvertedIndex = new InvertedIndex();
31
63
  private initialized = false;
64
+ private _reasoningBank: ReasoningBank | null = null;
32
65
 
33
- constructor(baseDir: string) {
34
- this._store = new JsonStore<Experience>(baseDir, 'experiences', {
35
- autoSaveInterval: 60000,
36
- pretty: true,
37
- });
66
+ /**
67
+ * ItemResolver adapter for getCandidates().
68
+ * Resolves items by ID from SQLite and returns all values.
69
+ */
70
+ private _resolver: ItemResolver<Experience>;
71
+
72
+ constructor(persistence: SqlitePersistence) {
73
+ this.persistence = persistence;
74
+ this._resolver = {
75
+ get: (id: string) => {
76
+ const row = this.persistence.getExperience(id);
77
+ return row ? rowToExperience(row) : undefined;
78
+ },
79
+ values: () => this.getAllSync(),
80
+ };
38
81
  }
39
82
 
40
83
  async init(): Promise<void> {
41
84
  if (this.initialized) return;
42
- await this._store.init();
85
+
86
+ // Build inverted index from all experiences in DB
87
+ const ids = this.persistence.getExperienceIds();
88
+ for (const { id, task_input } of ids) {
89
+ this._index.add(id, task_input);
90
+ }
91
+
43
92
  this.initialized = true;
44
93
  }
45
94
 
95
+ /**
96
+ * Set the reasoning bank for cluster-augmented retrieval.
97
+ * Called externally when ReasoningBank is initialized.
98
+ */
99
+ setReasoningBank(bank: ReasoningBank): void {
100
+ this._reasoningBank = bank;
101
+ }
102
+
103
+ /**
104
+ * Get the reasoning bank (if set).
105
+ */
106
+ getReasoningBank(): ReasoningBank | null {
107
+ return this._reasoningBank;
108
+ }
109
+
46
110
  /**
47
111
  * Store a new experience
48
112
  */
49
113
  async add(experience: Experience): Promise<void> {
50
114
  await this.init();
51
- this._store.set(experience.id, experience);
52
- await this._store.save(experience.id);
115
+ this.persistence.insertExperience(experience);
116
+ this._index.add(experience.id, experience.taskInput);
53
117
  }
54
118
 
55
119
  /**
@@ -57,12 +121,14 @@ export class ExperienceMemory {
57
121
  */
58
122
  async get(id: string): Promise<Experience | undefined> {
59
123
  await this.init();
60
- return this._store.get(id);
124
+ const row = this.persistence.getExperience(id);
125
+ return row ? rowToExperience(row) : undefined;
61
126
  }
62
127
 
63
128
  /**
64
129
  * Find similar experiences
65
- * Uses embedding similarity if available, falls back to text similarity
130
+ * Uses inverted index for candidate narrowing, then embedding/text similarity scoring.
131
+ * Bumps accessScore on returned results.
66
132
  */
67
133
  async findSimilar(
68
134
  query: string | number[],
@@ -76,9 +142,26 @@ export class ExperienceMemory {
76
142
  await this.init();
77
143
 
78
144
  const k = options?.k ?? 4; // ReMem default
79
- let experiences = this._store.values();
80
145
 
81
- // Filter by domain if specified
146
+ // Get candidate pool
147
+ const domainFallback = options?.domain
148
+ ? [
149
+ ...this.persistence.getExperiencesByDomain(options.domain).map(rowToExperience),
150
+ // Include '_global' domain items too
151
+ ...this.persistence.getExperiencesByDomain('_global').map(rowToExperience),
152
+ ]
153
+ : undefined;
154
+
155
+ let experiences: Experience[];
156
+
157
+ if (typeof query === 'string') {
158
+ experiences = getCandidates(query, this._index, this._resolver, { k }, domainFallback);
159
+ } else {
160
+ // Embedding query — inverted index doesn't help, use fallback
161
+ experiences = domainFallback ?? this.getAllSync();
162
+ }
163
+
164
+ // Apply domain filter (for cases where inverted index returned cross-domain results)
82
165
  if (options?.domain) {
83
166
  experiences = experiences.filter((e) => e.domain === options.domain);
84
167
  }
@@ -100,11 +183,57 @@ export class ExperienceMemory {
100
183
  }));
101
184
 
102
185
  // Filter by minimum score
103
- if (options?.minScore !== undefined) {
104
- return results.filter((r) => r.score >= options.minScore!);
186
+ const filtered = options?.minScore !== undefined
187
+ ? results.filter((r) => r.score >= options.minScore!)
188
+ : results;
189
+
190
+ // Merge with ReasoningBank results if available (string queries only)
191
+ let merged = filtered;
192
+ if (this._reasoningBank && typeof query === 'string') {
193
+ const clusterResults = this._reasoningBank.findInCluster(query, {
194
+ k,
195
+ domain: options?.domain,
196
+ });
197
+
198
+ // Merge: deduplicate by experience ID, keep higher score
199
+ const seenIds = new Map<string, number>();
200
+ for (const r of merged) {
201
+ seenIds.set(r.experience.id, r.score);
202
+ }
203
+ for (const cr of clusterResults) {
204
+ const existing = seenIds.get(cr.experience.id);
205
+ if (existing === undefined) {
206
+ merged.push({ experience: cr.experience, score: cr.score });
207
+ seenIds.set(cr.experience.id, cr.score);
208
+ }
209
+ // If already present, keep the higher score — existing is already in merged
210
+ }
211
+
212
+ // Re-sort by score after merge
213
+ merged.sort((a, b) => b.score - a.score);
214
+ merged = merged.slice(0, k);
215
+ }
216
+
217
+ // Bump access scores on returned results
218
+ for (const result of merged) {
219
+ const exp = result.experience;
220
+ const newRetrievalCount = (exp.retrievalCount ?? 0) + 1;
221
+ const newAccessScore = (exp.accessScore ?? 0) * 0.95 + 0.1;
222
+ const newLastAccessedAt = new Date();
223
+
224
+ this.persistence.updateExperience(exp.id, {
225
+ retrievalCount: newRetrievalCount,
226
+ accessScore: newAccessScore,
227
+ lastAccessedAt: newLastAccessedAt,
228
+ });
229
+
230
+ // Update in-memory reference too so caller sees updated values
231
+ exp.retrievalCount = newRetrievalCount;
232
+ exp.accessScore = newAccessScore;
233
+ exp.lastAccessedAt = newLastAccessedAt;
105
234
  }
106
235
 
107
- return results;
236
+ return merged;
108
237
  }
109
238
 
110
239
  /**
@@ -115,16 +244,24 @@ export class ExperienceMemory {
115
244
  updates: Partial<Experience>
116
245
  ): Promise<Experience | undefined> {
117
246
  await this.init();
118
- const existing = this._store.get(id);
119
- if (!existing) return undefined;
247
+ const row = this.persistence.getExperience(id);
248
+ if (!row) return undefined;
120
249
 
250
+ const existing = rowToExperience(row);
121
251
  const updated = {
122
252
  ...existing,
123
253
  ...updates,
124
254
  id: existing.id, // Preserve ID
125
255
  };
126
- this._store.set(id, updated);
127
- await this._store.save(id);
256
+
257
+ // Write-through: full replace via INSERT OR REPLACE
258
+ this.persistence.insertExperience(updated);
259
+
260
+ // Update inverted index if taskInput changed
261
+ if (updates.taskInput) {
262
+ this._index.add(id, updates.taskInput);
263
+ }
264
+
128
265
  return updated;
129
266
  }
130
267
 
@@ -133,11 +270,12 @@ export class ExperienceMemory {
133
270
  */
134
271
  async recordUsage(id: string): Promise<void> {
135
272
  await this.init();
136
- const existing = this._store.get(id);
137
- if (existing) {
138
- existing.usageCount++;
139
- existing.lastAccessedAt = new Date();
140
- this._store.set(id, existing);
273
+ const row = this.persistence.getExperience(id);
274
+ if (row) {
275
+ this.persistence.updateExperience(id, {
276
+ usageCount: row.usage_count + 1,
277
+ lastAccessedAt: new Date(),
278
+ });
141
279
  }
142
280
  }
143
281
 
@@ -146,7 +284,16 @@ export class ExperienceMemory {
146
284
  */
147
285
  async getAll(): Promise<Experience[]> {
148
286
  await this.init();
149
- return this._store.values();
287
+ return this.getAllSync();
288
+ }
289
+
290
+ /**
291
+ * Delete an experience by ID
292
+ */
293
+ async delete(id: string): Promise<boolean> {
294
+ await this.init();
295
+ this._index.remove(id);
296
+ return this.persistence.deleteExperience(id);
150
297
  }
151
298
 
152
299
  /**
@@ -154,11 +301,12 @@ export class ExperienceMemory {
154
301
  */
155
302
  async getByTrajectory(trajectoryId: string): Promise<Experience[]> {
156
303
  await this.init();
157
- return this._store.values().filter((e) => e.trajectoryId === trajectoryId);
304
+ return this.persistence.getExperiencesByTrajectory(trajectoryId).map(rowToExperience);
158
305
  }
159
306
 
160
307
  /**
161
- * Prune low-value experiences
308
+ * Prune low-value experiences.
309
+ * Uses accessScore as primary value signal when available.
162
310
  */
163
311
  async prune(options?: {
164
312
  maxCount?: number;
@@ -177,7 +325,7 @@ export class ExperienceMemory {
177
325
  redundancy: [],
178
326
  failedOld: [],
179
327
  };
180
- let experiences = this._store.values();
328
+ let experiences = this.getAllSync();
181
329
 
182
330
  // 1. Prune by age
183
331
  if (options?.maxAgeDays) {
@@ -186,7 +334,8 @@ export class ExperienceMemory {
186
334
  (e) => e.createdAt.getTime() < cutoff
187
335
  );
188
336
  for (const exp of oldExperiences) {
189
- this._store.delete(exp.id);
337
+ this.persistence.deleteExperience(exp.id);
338
+ this._index.remove(exp.id);
190
339
  pruned.push(exp.id);
191
340
  prunedByReason.age.push(exp.id);
192
341
  }
@@ -201,7 +350,8 @@ export class ExperienceMemory {
201
350
  (e) => !e.success && e.createdAt.getTime() < cutoff
202
351
  );
203
352
  for (const exp of failedOld) {
204
- this._store.delete(exp.id);
353
+ this.persistence.deleteExperience(exp.id);
354
+ this._index.remove(exp.id);
205
355
  pruned.push(exp.id);
206
356
  prunedByReason.failedOld.push(exp.id);
207
357
  }
@@ -219,12 +369,13 @@ export class ExperienceMemory {
219
369
  const sevenDaysAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;
220
370
  for (const exp of lowUsage) {
221
371
  if (exp.createdAt.getTime() < sevenDaysAgo) {
222
- this._store.delete(exp.id);
372
+ this.persistence.deleteExperience(exp.id);
373
+ this._index.remove(exp.id);
223
374
  pruned.push(exp.id);
224
375
  prunedByReason.usage.push(exp.id);
225
376
  }
226
377
  }
227
- experiences = this._store.values(); // Refresh
378
+ experiences = this.getAllSync(); // Refresh
228
379
  }
229
380
 
230
381
  // 4. Prune redundant/similar experiences
@@ -235,16 +386,17 @@ export class ExperienceMemory {
235
386
  options.preserveDomainCoverage
236
387
  );
237
388
  for (const exp of redundant) {
238
- this._store.delete(exp.id);
389
+ this.persistence.deleteExperience(exp.id);
390
+ this._index.remove(exp.id);
239
391
  pruned.push(exp.id);
240
392
  prunedByReason.redundancy.push(exp.id);
241
393
  }
242
- experiences = this._store.values(); // Refresh
394
+ experiences = this.getAllSync(); // Refresh
243
395
  }
244
396
 
245
397
  // 5. Prune by count (keep most valuable)
246
398
  if (options?.maxCount && experiences.length > options.maxCount) {
247
- // Sort by value
399
+ // Sort by value (uses accessScore when available)
248
400
  experiences.sort((a, b) => {
249
401
  const scoreA = this.computeValue(a);
250
402
  const scoreB = this.computeValue(b);
@@ -260,7 +412,8 @@ export class ExperienceMemory {
260
412
  const keptIds = new Set(kept.map((e) => e.id));
261
413
  for (const exp of experiences) {
262
414
  if (!keptIds.has(exp.id)) {
263
- this._store.delete(exp.id);
415
+ this.persistence.deleteExperience(exp.id);
416
+ this._index.remove(exp.id);
264
417
  pruned.push(exp.id);
265
418
  prunedByReason.capacity.push(exp.id);
266
419
  }
@@ -268,23 +421,19 @@ export class ExperienceMemory {
268
421
  } else {
269
422
  const toRemove = experiences.slice(options.maxCount);
270
423
  for (const exp of toRemove) {
271
- this._store.delete(exp.id);
424
+ this.persistence.deleteExperience(exp.id);
425
+ this._index.remove(exp.id);
272
426
  pruned.push(exp.id);
273
427
  prunedByReason.capacity.push(exp.id);
274
428
  }
275
429
  }
276
430
  }
277
431
 
278
- // Save changes
279
- if (pruned.length > 0) {
280
- await this._store.flush();
281
- }
282
-
283
432
  return {
284
433
  prunedIds: pruned,
285
434
  prunedByReason,
286
435
  totalPruned: pruned.length,
287
- remainingCount: this._store.size(),
436
+ remainingCount: this.persistence.getExperienceCount(),
288
437
  };
289
438
  }
290
439
 
@@ -403,9 +552,20 @@ export class ExperienceMemory {
403
552
  }
404
553
 
405
554
  /**
406
- * Compute value score for an experience
555
+ * Compute value score for an experience.
556
+ * Uses accessScore as primary signal when available, falls back to
557
+ * the original recency + usage heuristic for backward compatibility.
407
558
  */
408
559
  private computeValue(exp: Experience): number {
560
+ // If accessScore is populated (> 0), use it as primary signal
561
+ if (exp.accessScore && exp.accessScore > 0) {
562
+ return (
563
+ exp.accessScore *
564
+ (exp.success ? 1 : 0.3)
565
+ );
566
+ }
567
+
568
+ // Backward compat: original heuristic for experiences without accessScore
409
569
  const ageMs = Date.now() - exp.createdAt.getTime();
410
570
  const ageDays = ageMs / (1000 * 60 * 60 * 24);
411
571
  const recencyScore = Math.exp(-ageDays / 30); // Decay over ~30 days
@@ -441,7 +601,7 @@ export class ExperienceMemory {
441
601
  };
442
602
  }> {
443
603
  await this.init();
444
- const experiences = this._store.values();
604
+ const experiences = this.getAllSync();
445
605
 
446
606
  const byDomain: Record<string, number> = {};
447
607
  let successCount = 0;
@@ -503,13 +663,20 @@ export class ExperienceMemory {
503
663
  */
504
664
  async count(): Promise<number> {
505
665
  await this.init();
506
- return this._store.size();
666
+ return this.persistence.getExperienceCount();
507
667
  }
508
668
 
509
669
  /**
510
- * Close the store
670
+ * Close the store (no-op — SqlitePersistence lifecycle is managed externally)
511
671
  */
512
672
  async close(): Promise<void> {
513
- await this._store.close();
673
+ // SqlitePersistence lifecycle is managed by MemorySystem/Atlas
674
+ }
675
+
676
+ /**
677
+ * Synchronous helper: get all experiences from SQLite.
678
+ */
679
+ private getAllSync(): Experience[] {
680
+ return this.persistence.getAllExperiences().map(rowToExperience);
514
681
  }
515
682
  }
@@ -35,6 +35,45 @@ export {
35
35
  type TeamMetaObservationEntry,
36
36
  } from './team-experience.js';
37
37
 
38
+ // Reflexion episodes
39
+ export {
40
+ ReflexionMemory,
41
+ createReflexionMemory,
42
+ type ReflexionQueryOptions,
43
+ } from './reflexion.js';
44
+
45
+ // Coherence checking
46
+ export {
47
+ CoherenceChecker,
48
+ createCoherenceChecker,
49
+ type CoherenceResult,
50
+ type CoherenceCheckerConfig,
51
+ } from './coherence.js';
52
+
53
+ // Reasoning bank (clustered experience retrieval)
54
+ export {
55
+ ReasoningBank,
56
+ createReasoningBank,
57
+ type ExperienceCluster,
58
+ type ClusterStats,
59
+ type ReasoningBankConfig,
60
+ } from './reasoning-bank.js';
61
+
62
+ // Causal edge store
63
+ export {
64
+ CausalStore,
65
+ createCausalStore,
66
+ type CausalEdge,
67
+ } from './causal-store.js';
68
+
69
+ // Temporal compression
70
+ export {
71
+ TemporalCompressor,
72
+ createTemporalCompressor,
73
+ type TemporalCompressorConfig,
74
+ type CompressionResult,
75
+ } from './temporal-compressor.js';
76
+
38
77
  // Knowledge bank (semantic memory)
39
78
  export { KnowledgeBank } from './knowledge-bank.js';
40
79
  export { KnowledgeGraphManager } from './knowledge-graph.js';
@@ -53,6 +92,10 @@ export {
53
92
  EntityGraphLayer,
54
93
  } from './graph-layers/index.js';
55
94
 
95
+ // Re-export persistence module
96
+ export { SqlitePersistence, createSqlitePersistence } from '../persistence/index.js';
97
+ export type { SqlitePersistenceConfig } from '../persistence/index.js';
98
+
56
99
  // Curated playbook loading
57
100
  export {
58
101
  loadCuratedPlaybooks,
@@ -21,6 +21,7 @@ import type { GraphNode } from '../types/knowledge-graph.js';
21
21
  import type { AgenticTaskRunner } from '../workspace/runner.js';
22
22
  import type { TrajectoryAnalyzer, AnalysisResult } from '../learning/analyzer.js';
23
23
  import { KnowledgeGraphManager } from './knowledge-graph.js';
24
+ import { CoherenceChecker } from './coherence.js';
24
25
  import {
25
26
  parseKnowledgeNote,
26
27
  serializeKnowledgeNote,
@@ -50,6 +51,7 @@ export class KnowledgeBank {
50
51
  private readonly bankConfig: KnowledgeBankConfig;
51
52
  private initialized = false;
52
53
  private searchProvider: SearchProvider = new TextSimilaritySearchProvider();
54
+ private coherenceChecker: CoherenceChecker = new CoherenceChecker();
53
55
 
54
56
  // Directory paths (resolved on init)
55
57
  private observationsDir = '';
@@ -115,15 +117,45 @@ export class KnowledgeBank {
115
117
 
116
118
  /**
117
119
  * Create a new knowledge note and write it to disk.
120
+ * Runs coherence checking against existing notes — contradictions are flagged
121
+ * via metadata but the note is still stored.
118
122
  * Updates the graph overlay in memory.
119
123
  */
120
124
  async addObservation(note: KnowledgeNote): Promise<string> {
121
125
  await this.init();
126
+
127
+ // Run coherence check against related existing notes (if enabled)
128
+ if (this.bankConfig.coherenceChecking !== false) {
129
+ try {
130
+ const existing = await this.getRelatedNotes(note);
131
+ const coherence = await this.coherenceChecker.check(note, existing);
132
+
133
+ if (!coherence.isCoherent) {
134
+ // Flag contradictions in metadata but still store the note
135
+ const meta = (note.frontmatter as Record<string, unknown>);
136
+ meta['contradictions'] = coherence.contradictions.map(
137
+ (c) => c.existingNoteId
138
+ );
139
+ meta['coherenceEnergy'] = coherence.globalEnergy;
140
+ }
141
+ } catch {
142
+ // Coherence check is non-critical — don't block insertion
143
+ }
144
+ }
145
+
122
146
  await this.writeNote(note);
123
147
  this.graph.addNode(this.noteToGraphNode(note));
124
148
  return note.frontmatter.id;
125
149
  }
126
150
 
151
+ /**
152
+ * Get the last coherence result from the most recent addObservation call.
153
+ * Useful for downstream consumers to react to contradictions.
154
+ */
155
+ getCoherenceChecker(): CoherenceChecker {
156
+ return this.coherenceChecker;
157
+ }
158
+
127
159
  /**
128
160
  * Update an existing entity note by appending a section.
129
161
  */
@@ -1245,6 +1277,31 @@ export class KnowledgeBank {
1245
1277
  return lines.join('\n');
1246
1278
  }
1247
1279
 
1280
+ /**
1281
+ * Get notes related to the given note by entity or domain overlap.
1282
+ * Used for coherence checking before insertion.
1283
+ */
1284
+ private async getRelatedNotes(note: KnowledgeNote): Promise<KnowledgeNote[]> {
1285
+ const allNotes = await this.getAllNotes();
1286
+
1287
+ const noteEntities = new Set(note.frontmatter.entities);
1288
+ const noteDomains = new Set(note.frontmatter.domain);
1289
+
1290
+ return allNotes.filter((existing) => {
1291
+ if (existing.frontmatter.id === note.frontmatter.id) return false;
1292
+
1293
+ const hasEntityOverlap = existing.frontmatter.entities.some((e) =>
1294
+ noteEntities.has(e)
1295
+ );
1296
+ if (hasEntityOverlap) return true;
1297
+
1298
+ const hasDomainOverlap = existing.frontmatter.domain.some((d) =>
1299
+ noteDomains.has(d)
1300
+ );
1301
+ return hasDomainOverlap;
1302
+ });
1303
+ }
1304
+
1248
1305
  private noteToGraphNode(note: KnowledgeNote): GraphNode {
1249
1306
  return {
1250
1307
  id: note.frontmatter.id,