cognitive-core 0.1.2 → 0.2.1

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 (528) hide show
  1. package/.claude/settings.json +111 -2
  2. package/.sessionlog/settings.json +4 -0
  3. package/CLAUDE.md +233 -0
  4. package/README.md +370 -54
  5. package/dist/atlas.d.ts +10 -10
  6. package/dist/atlas.d.ts.map +1 -1
  7. package/dist/atlas.js +79 -48
  8. package/dist/atlas.js.map +1 -1
  9. package/dist/bin/cli-utils.d.ts +37 -0
  10. package/dist/bin/cli-utils.d.ts.map +1 -0
  11. package/dist/bin/cli-utils.js +176 -0
  12. package/dist/bin/cli-utils.js.map +1 -0
  13. package/dist/bin/cognitive-core.d.ts +2 -12
  14. package/dist/bin/cognitive-core.d.ts.map +1 -1
  15. package/dist/bin/cognitive-core.js +76 -351
  16. package/dist/bin/cognitive-core.js.map +1 -1
  17. package/dist/bin/commands/kb.d.ts +6 -0
  18. package/dist/bin/commands/kb.d.ts.map +1 -0
  19. package/dist/bin/commands/kb.js +240 -0
  20. package/dist/bin/commands/kb.js.map +1 -0
  21. package/dist/bin/commands/learn.d.ts +6 -0
  22. package/dist/bin/commands/learn.d.ts.map +1 -0
  23. package/dist/bin/commands/learn.js +91 -0
  24. package/dist/bin/commands/learn.js.map +1 -0
  25. package/dist/bin/commands/legacy.d.ts +12 -0
  26. package/dist/bin/commands/legacy.d.ts.map +1 -0
  27. package/dist/bin/commands/legacy.js +142 -0
  28. package/dist/bin/commands/legacy.js.map +1 -0
  29. package/dist/bin/commands/run.d.ts +3 -0
  30. package/dist/bin/commands/run.d.ts.map +1 -0
  31. package/dist/bin/commands/run.js +99 -0
  32. package/dist/bin/commands/run.js.map +1 -0
  33. package/dist/bin/commands/sessions.d.ts +9 -0
  34. package/dist/bin/commands/sessions.d.ts.map +1 -0
  35. package/dist/bin/commands/sessions.js +183 -0
  36. package/dist/bin/commands/sessions.js.map +1 -0
  37. package/dist/bin/commands/skills.d.ts +6 -0
  38. package/dist/bin/commands/skills.d.ts.map +1 -0
  39. package/dist/bin/commands/skills.js +135 -0
  40. package/dist/bin/commands/skills.js.map +1 -0
  41. package/dist/embeddings/index.d.ts +1 -0
  42. package/dist/embeddings/index.d.ts.map +1 -1
  43. package/dist/embeddings/index.js +2 -0
  44. package/dist/embeddings/index.js.map +1 -1
  45. package/dist/embeddings/inverted-index.d.ts +47 -0
  46. package/dist/embeddings/inverted-index.d.ts.map +1 -0
  47. package/dist/embeddings/inverted-index.js +122 -0
  48. package/dist/embeddings/inverted-index.js.map +1 -0
  49. package/dist/embeddings/manager.d.ts +3 -1
  50. package/dist/embeddings/manager.d.ts.map +1 -1
  51. package/dist/embeddings/manager.js +12 -7
  52. package/dist/embeddings/manager.js.map +1 -1
  53. package/dist/embeddings/vector-store.d.ts +7 -3
  54. package/dist/embeddings/vector-store.d.ts.map +1 -1
  55. package/dist/embeddings/vector-store.js +22 -6
  56. package/dist/embeddings/vector-store.js.map +1 -1
  57. package/dist/factory.d.ts +11 -12
  58. package/dist/factory.d.ts.map +1 -1
  59. package/dist/factory.js +20 -7
  60. package/dist/factory.js.map +1 -1
  61. package/dist/index.d.ts +8 -7
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +42 -6
  64. package/dist/index.js.map +1 -1
  65. package/dist/learning/analyzer.d.ts.map +1 -1
  66. package/dist/learning/analyzer.js +17 -35
  67. package/dist/learning/analyzer.js.map +1 -1
  68. package/dist/learning/energy-evaluator.d.ts +128 -0
  69. package/dist/learning/energy-evaluator.d.ts.map +1 -0
  70. package/dist/learning/energy-evaluator.js +175 -0
  71. package/dist/learning/energy-evaluator.js.map +1 -0
  72. package/dist/learning/healing-orchestrator.d.ts +182 -0
  73. package/dist/learning/healing-orchestrator.d.ts.map +1 -0
  74. package/dist/learning/healing-orchestrator.js +250 -0
  75. package/dist/learning/healing-orchestrator.js.map +1 -0
  76. package/dist/learning/index.d.ts +7 -2
  77. package/dist/learning/index.d.ts.map +1 -1
  78. package/dist/learning/index.js +13 -2
  79. package/dist/learning/index.js.map +1 -1
  80. package/dist/learning/instant-loop.d.ts +87 -0
  81. package/dist/learning/instant-loop.d.ts.map +1 -0
  82. package/dist/learning/instant-loop.js +264 -0
  83. package/dist/learning/instant-loop.js.map +1 -0
  84. package/dist/learning/loop-coordinator.d.ts +61 -0
  85. package/dist/learning/loop-coordinator.d.ts.map +1 -0
  86. package/dist/learning/loop-coordinator.js +96 -0
  87. package/dist/learning/loop-coordinator.js.map +1 -0
  88. package/dist/learning/maintenance-scheduler.d.ts +141 -0
  89. package/dist/learning/maintenance-scheduler.d.ts.map +1 -0
  90. package/dist/learning/maintenance-scheduler.js +186 -0
  91. package/dist/learning/maintenance-scheduler.js.map +1 -0
  92. package/dist/learning/meta-learner.d.ts.map +1 -1
  93. package/dist/learning/meta-learner.js +4 -21
  94. package/dist/learning/meta-learner.js.map +1 -1
  95. package/dist/learning/pipeline.d.ts +31 -4
  96. package/dist/learning/pipeline.d.ts.map +1 -1
  97. package/dist/learning/pipeline.js +64 -12
  98. package/dist/learning/pipeline.js.map +1 -1
  99. package/dist/learning/reflexion-generator.d.ts +64 -0
  100. package/dist/learning/reflexion-generator.d.ts.map +1 -0
  101. package/dist/learning/reflexion-generator.js +194 -0
  102. package/dist/learning/reflexion-generator.js.map +1 -0
  103. package/dist/learning/trajectory-sources/entire.d.ts +8 -5
  104. package/dist/learning/trajectory-sources/entire.d.ts.map +1 -1
  105. package/dist/learning/trajectory-sources/entire.js +13 -6
  106. package/dist/learning/trajectory-sources/entire.js.map +1 -1
  107. package/dist/learning/trajectory-sources/index.d.ts +1 -1
  108. package/dist/learning/trajectory-sources/index.d.ts.map +1 -1
  109. package/dist/learning/trajectory-sources/index.js +1 -1
  110. package/dist/learning/trajectory-sources/index.js.map +1 -1
  111. package/dist/learning/trajectory-sources/pipeline.d.ts +4 -4
  112. package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -1
  113. package/dist/learning/trajectory-sources/pipeline.js +2 -2
  114. package/dist/learning/trajectory-sources/pipeline.js.map +1 -1
  115. package/dist/learning/unified-pipeline.d.ts +311 -0
  116. package/dist/learning/unified-pipeline.d.ts.map +1 -0
  117. package/dist/learning/unified-pipeline.js +844 -0
  118. package/dist/learning/unified-pipeline.js.map +1 -0
  119. package/dist/memory/candidate-retrieval.d.ts +43 -0
  120. package/dist/memory/candidate-retrieval.d.ts.map +1 -0
  121. package/dist/memory/candidate-retrieval.js +43 -0
  122. package/dist/memory/candidate-retrieval.js.map +1 -0
  123. package/dist/memory/causal-store.d.ts +97 -0
  124. package/dist/memory/causal-store.d.ts.map +1 -0
  125. package/dist/memory/causal-store.js +209 -0
  126. package/dist/memory/causal-store.js.map +1 -0
  127. package/dist/memory/coherence.d.ts +71 -0
  128. package/dist/memory/coherence.d.ts.map +1 -0
  129. package/dist/memory/coherence.js +176 -0
  130. package/dist/memory/coherence.js.map +1 -0
  131. package/dist/memory/experience.d.ts +39 -6
  132. package/dist/memory/experience.d.ts.map +1 -1
  133. package/dist/memory/experience.js +193 -49
  134. package/dist/memory/experience.js.map +1 -1
  135. package/dist/memory/index.d.ts +7 -0
  136. package/dist/memory/index.d.ts.map +1 -1
  137. package/dist/memory/index.js +12 -0
  138. package/dist/memory/index.js.map +1 -1
  139. package/dist/memory/knowledge-bank.d.ts +14 -0
  140. package/dist/memory/knowledge-bank.d.ts.map +1 -1
  141. package/dist/memory/knowledge-bank.js +45 -0
  142. package/dist/memory/knowledge-bank.js.map +1 -1
  143. package/dist/memory/meta.d.ts +7 -8
  144. package/dist/memory/meta.d.ts.map +1 -1
  145. package/dist/memory/meta.js +73 -79
  146. package/dist/memory/meta.js.map +1 -1
  147. package/dist/memory/playbook.d.ts +26 -9
  148. package/dist/memory/playbook.d.ts.map +1 -1
  149. package/dist/memory/playbook.js +198 -74
  150. package/dist/memory/playbook.js.map +1 -1
  151. package/dist/memory/reasoning-bank.d.ts +130 -0
  152. package/dist/memory/reasoning-bank.d.ts.map +1 -0
  153. package/dist/memory/reasoning-bank.js +342 -0
  154. package/dist/memory/reasoning-bank.js.map +1 -0
  155. package/dist/memory/reflexion.d.ts +59 -0
  156. package/dist/memory/reflexion.d.ts.map +1 -0
  157. package/dist/memory/reflexion.js +96 -0
  158. package/dist/memory/reflexion.js.map +1 -0
  159. package/dist/memory/system.d.ts +7 -2
  160. package/dist/memory/system.d.ts.map +1 -1
  161. package/dist/memory/system.js +19 -7
  162. package/dist/memory/system.js.map +1 -1
  163. package/dist/memory/temporal-compressor.d.ts +126 -0
  164. package/dist/memory/temporal-compressor.d.ts.map +1 -0
  165. package/dist/memory/temporal-compressor.js +335 -0
  166. package/dist/memory/temporal-compressor.js.map +1 -0
  167. package/dist/persistence/index.d.ts +11 -0
  168. package/dist/persistence/index.d.ts.map +1 -0
  169. package/dist/persistence/index.js +11 -0
  170. package/dist/persistence/index.js.map +1 -0
  171. package/dist/persistence/migrator.d.ts +40 -0
  172. package/dist/persistence/migrator.d.ts.map +1 -0
  173. package/dist/persistence/migrator.js +238 -0
  174. package/dist/persistence/migrator.js.map +1 -0
  175. package/dist/persistence/serializers.d.ts +45 -0
  176. package/dist/persistence/serializers.d.ts.map +1 -0
  177. package/dist/persistence/serializers.js +80 -0
  178. package/dist/persistence/serializers.js.map +1 -0
  179. package/dist/persistence/sqlite-persistence.d.ts +228 -0
  180. package/dist/persistence/sqlite-persistence.d.ts.map +1 -0
  181. package/dist/persistence/sqlite-persistence.js +588 -0
  182. package/dist/persistence/sqlite-persistence.js.map +1 -0
  183. package/dist/runtime/flows/learning.d.ts +10 -12
  184. package/dist/runtime/flows/learning.d.ts.map +1 -1
  185. package/dist/runtime/flows/learning.js +10 -23
  186. package/dist/runtime/flows/learning.js.map +1 -1
  187. package/dist/search/index.d.ts +1 -0
  188. package/dist/search/index.d.ts.map +1 -1
  189. package/dist/search/index.js +2 -0
  190. package/dist/search/index.js.map +1 -1
  191. package/dist/search/moe-gate.d.ts +124 -0
  192. package/dist/search/moe-gate.d.ts.map +1 -0
  193. package/dist/search/moe-gate.js +234 -0
  194. package/dist/search/moe-gate.js.map +1 -0
  195. package/dist/search/router.d.ts +32 -2
  196. package/dist/search/router.d.ts.map +1 -1
  197. package/dist/search/router.js +87 -4
  198. package/dist/search/router.js.map +1 -1
  199. package/dist/session-bank/git-reader.d.ts +9 -4
  200. package/dist/session-bank/git-reader.d.ts.map +1 -1
  201. package/dist/session-bank/git-reader.js +22 -15
  202. package/dist/session-bank/git-reader.js.map +1 -1
  203. package/dist/session-bank/index.d.ts +2 -2
  204. package/dist/session-bank/index.d.ts.map +1 -1
  205. package/dist/session-bank/index.js +2 -2
  206. package/dist/session-bank/index.js.map +1 -1
  207. package/dist/session-bank/parser.d.ts +16 -5
  208. package/dist/session-bank/parser.d.ts.map +1 -1
  209. package/dist/session-bank/parser.js +187 -80
  210. package/dist/session-bank/parser.js.map +1 -1
  211. package/dist/session-bank/session-bank.d.ts +5 -0
  212. package/dist/session-bank/session-bank.d.ts.map +1 -1
  213. package/dist/session-bank/session-bank.js +30 -9
  214. package/dist/session-bank/session-bank.js.map +1 -1
  215. package/dist/session-bank/types.d.ts +4 -1
  216. package/dist/session-bank/types.d.ts.map +1 -1
  217. package/dist/session-bank/types.js +3 -3
  218. package/dist/session-bank/types.js.map +1 -1
  219. package/dist/surfacing/skill-publisher.d.ts.map +1 -1
  220. package/dist/surfacing/skill-publisher.js +15 -43
  221. package/dist/surfacing/skill-publisher.js.map +1 -1
  222. package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -1
  223. package/dist/surfacing/sqlite-storage-adapter.js +13 -21
  224. package/dist/surfacing/sqlite-storage-adapter.js.map +1 -1
  225. package/dist/types/config.d.ts +100 -0
  226. package/dist/types/config.d.ts.map +1 -1
  227. package/dist/types/config.js +27 -0
  228. package/dist/types/config.js.map +1 -1
  229. package/dist/types/index.d.ts +2 -2
  230. package/dist/types/index.d.ts.map +1 -1
  231. package/dist/types/index.js +1 -1
  232. package/dist/types/index.js.map +1 -1
  233. package/dist/types/memory.d.ts +52 -0
  234. package/dist/types/memory.d.ts.map +1 -1
  235. package/dist/types/memory.js +13 -0
  236. package/dist/types/memory.js.map +1 -1
  237. package/dist/types/playbook.d.ts +4 -0
  238. package/dist/types/playbook.d.ts.map +1 -1
  239. package/dist/types/playbook.js.map +1 -1
  240. package/dist/utils/error-classifier.d.ts +30 -0
  241. package/dist/utils/error-classifier.d.ts.map +1 -0
  242. package/dist/utils/error-classifier.js +85 -0
  243. package/dist/utils/error-classifier.js.map +1 -0
  244. package/dist/utils/index.d.ts +3 -0
  245. package/dist/utils/index.d.ts.map +1 -1
  246. package/dist/utils/index.js +3 -0
  247. package/dist/utils/index.js.map +1 -1
  248. package/dist/utils/partitioned-store.d.ts +93 -0
  249. package/dist/utils/partitioned-store.d.ts.map +1 -0
  250. package/dist/utils/partitioned-store.js +251 -0
  251. package/dist/utils/partitioned-store.js.map +1 -0
  252. package/dist/utils/trajectory-helpers.d.ts +39 -0
  253. package/dist/utils/trajectory-helpers.d.ts.map +1 -0
  254. package/dist/utils/trajectory-helpers.js +57 -0
  255. package/dist/utils/trajectory-helpers.js.map +1 -0
  256. package/dist/workspace/efficacy-toolkit.d.ts +164 -0
  257. package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
  258. package/dist/workspace/efficacy-toolkit.js +281 -0
  259. package/dist/workspace/efficacy-toolkit.js.map +1 -0
  260. package/dist/workspace/index.d.ts +2 -1
  261. package/dist/workspace/index.d.ts.map +1 -1
  262. package/dist/workspace/index.js +3 -1
  263. package/dist/workspace/index.js.map +1 -1
  264. package/dist/workspace/runner.d.ts +3 -4
  265. package/dist/workspace/runner.d.ts.map +1 -1
  266. package/dist/workspace/runner.js.map +1 -1
  267. package/dist/workspace/templates/index.d.ts +3 -0
  268. package/dist/workspace/templates/index.d.ts.map +1 -1
  269. package/dist/workspace/templates/index.js +6 -0
  270. package/dist/workspace/templates/index.js.map +1 -1
  271. package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
  272. package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
  273. package/dist/workspace/templates/playbook-decay-detection.js +197 -0
  274. package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
  275. package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
  276. package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
  277. package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
  278. package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
  279. package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
  280. package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
  281. package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
  282. package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
  283. package/dist/workspace/types.d.ts +9 -2
  284. package/dist/workspace/types.d.ts.map +1 -1
  285. package/dist/workspace/types.js.map +1 -1
  286. package/package.json +12 -4
  287. package/references/sessionlog/.husky/pre-commit +1 -0
  288. package/references/sessionlog/.lintstagedrc.json +4 -0
  289. package/references/sessionlog/.prettierignore +4 -0
  290. package/references/sessionlog/.prettierrc.json +11 -0
  291. package/references/sessionlog/LICENSE +21 -0
  292. package/references/sessionlog/README.md +453 -0
  293. package/references/sessionlog/eslint.config.js +58 -0
  294. package/references/sessionlog/package-lock.json +3672 -0
  295. package/references/sessionlog/package.json +65 -0
  296. package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
  297. package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
  298. package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
  299. package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
  300. package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
  301. package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
  302. package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
  303. package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
  304. package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
  305. package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
  306. package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
  307. package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
  308. package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
  309. package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
  310. package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
  311. package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
  312. package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
  313. package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
  314. package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
  315. package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
  316. package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
  317. package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
  318. package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
  319. package/references/sessionlog/src/__tests__/types.test.ts +166 -0
  320. package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
  321. package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
  322. package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
  323. package/references/sessionlog/src/agent/agents/claude-code.ts +1089 -0
  324. package/references/sessionlog/src/agent/agents/cursor.ts +361 -0
  325. package/references/sessionlog/src/agent/agents/gemini-cli.ts +632 -0
  326. package/references/sessionlog/src/agent/agents/opencode.ts +540 -0
  327. package/references/sessionlog/src/agent/registry.ts +143 -0
  328. package/references/sessionlog/src/agent/session-types.ts +113 -0
  329. package/references/sessionlog/src/agent/types.ts +220 -0
  330. package/references/sessionlog/src/cli.ts +597 -0
  331. package/references/sessionlog/src/commands/clean.ts +133 -0
  332. package/references/sessionlog/src/commands/disable.ts +84 -0
  333. package/references/sessionlog/src/commands/doctor.ts +145 -0
  334. package/references/sessionlog/src/commands/enable.ts +202 -0
  335. package/references/sessionlog/src/commands/explain.ts +261 -0
  336. package/references/sessionlog/src/commands/reset.ts +105 -0
  337. package/references/sessionlog/src/commands/resume.ts +180 -0
  338. package/references/sessionlog/src/commands/rewind.ts +195 -0
  339. package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
  340. package/references/sessionlog/src/commands/status.ts +172 -0
  341. package/references/sessionlog/src/config.ts +165 -0
  342. package/references/sessionlog/src/events/event-log.ts +126 -0
  343. package/references/sessionlog/src/git-operations.ts +558 -0
  344. package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
  345. package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
  346. package/references/sessionlog/src/index.ts +650 -0
  347. package/references/sessionlog/src/security/redaction.ts +283 -0
  348. package/references/sessionlog/src/session/state-machine.ts +452 -0
  349. package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
  350. package/references/sessionlog/src/store/native-store.ts +173 -0
  351. package/references/sessionlog/src/store/provider-types.ts +99 -0
  352. package/references/sessionlog/src/store/session-store.ts +266 -0
  353. package/references/sessionlog/src/strategy/attribution.ts +296 -0
  354. package/references/sessionlog/src/strategy/common.ts +207 -0
  355. package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
  356. package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
  357. package/references/sessionlog/src/strategy/types.ts +279 -0
  358. package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
  359. package/references/sessionlog/src/summarize/summarize.ts +432 -0
  360. package/references/sessionlog/src/types.ts +508 -0
  361. package/references/sessionlog/src/utils/chunk-files.ts +49 -0
  362. package/references/sessionlog/src/utils/commit-message.ts +65 -0
  363. package/references/sessionlog/src/utils/detect-agent.ts +36 -0
  364. package/references/sessionlog/src/utils/hook-managers.ts +125 -0
  365. package/references/sessionlog/src/utils/ide-tags.ts +32 -0
  366. package/references/sessionlog/src/utils/paths.ts +79 -0
  367. package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
  368. package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
  369. package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
  370. package/references/sessionlog/src/utils/string-utils.ts +46 -0
  371. package/references/sessionlog/src/utils/todo-extract.ts +188 -0
  372. package/references/sessionlog/src/utils/trailers.ts +187 -0
  373. package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
  374. package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
  375. package/references/sessionlog/src/utils/tree-ops.ts +219 -0
  376. package/references/sessionlog/src/utils/tty.ts +72 -0
  377. package/references/sessionlog/src/utils/validation.ts +65 -0
  378. package/references/sessionlog/src/utils/worktree.ts +58 -0
  379. package/references/sessionlog/src/wire-types.ts +59 -0
  380. package/references/sessionlog/templates/setup-env.sh +153 -0
  381. package/references/sessionlog/tsconfig.json +18 -0
  382. package/references/sessionlog/vitest.config.ts +12 -0
  383. package/references/skill-tree/.sudocode/issues.jsonl +8 -0
  384. package/references/skill-tree/.sudocode/specs.jsonl +2 -0
  385. package/references/skill-tree/CLAUDE.md +56 -80
  386. package/references/skill-tree/README.md +188 -140
  387. package/references/skill-tree/examples/basic-usage.ts +95 -121
  388. package/references/skill-tree/package-lock.json +369 -26
  389. package/references/skill-tree/package.json +1 -1
  390. package/src/atlas.ts +97 -67
  391. package/src/bin/cli-utils.ts +220 -0
  392. package/src/bin/cognitive-core.ts +84 -392
  393. package/src/bin/commands/kb.ts +266 -0
  394. package/src/bin/commands/learn.ts +100 -0
  395. package/src/bin/commands/legacy.ts +182 -0
  396. package/src/bin/commands/run.ts +113 -0
  397. package/src/bin/commands/sessions.ts +221 -0
  398. package/src/bin/commands/skills.ts +146 -0
  399. package/src/embeddings/index.ts +3 -0
  400. package/src/embeddings/inverted-index.ts +134 -0
  401. package/src/embeddings/manager.ts +13 -8
  402. package/src/embeddings/vector-store.ts +21 -9
  403. package/src/factory.ts +33 -16
  404. package/src/index.ts +136 -9
  405. package/src/learning/analyzer.ts +21 -37
  406. package/src/learning/energy-evaluator.ts +282 -0
  407. package/src/learning/healing-orchestrator.ts +383 -0
  408. package/src/learning/index.ts +66 -9
  409. package/src/learning/instant-loop.ts +357 -0
  410. package/src/learning/maintenance-scheduler.ts +271 -0
  411. package/src/learning/meta-learner.ts +5 -23
  412. package/src/learning/reflexion-generator.ts +273 -0
  413. package/src/learning/trajectory-sources/entire.ts +24 -13
  414. package/src/learning/trajectory-sources/index.ts +2 -2
  415. package/src/learning/trajectory-sources/pipeline.ts +5 -5
  416. package/src/learning/unified-pipeline.ts +1191 -0
  417. package/src/memory/candidate-retrieval.ts +72 -0
  418. package/src/memory/causal-store.ts +273 -0
  419. package/src/memory/coherence.ts +252 -0
  420. package/src/memory/experience.ts +217 -50
  421. package/src/memory/index.ts +43 -0
  422. package/src/memory/knowledge-bank.ts +57 -0
  423. package/src/memory/meta.ts +78 -96
  424. package/src/memory/playbook.ts +239 -75
  425. package/src/memory/reasoning-bank.ts +458 -0
  426. package/src/memory/reflexion.ts +122 -0
  427. package/src/memory/system.ts +21 -5
  428. package/src/memory/temporal-compressor.ts +409 -0
  429. package/src/persistence/index.ts +37 -0
  430. package/src/persistence/migrator.ts +298 -0
  431. package/src/persistence/serializers.ts +79 -0
  432. package/src/persistence/sqlite-persistence.ts +925 -0
  433. package/src/runtime/flows/learning.ts +25 -42
  434. package/src/search/index.ts +10 -0
  435. package/src/search/moe-gate.ts +304 -0
  436. package/src/search/router.ts +111 -4
  437. package/src/session-bank/git-reader.ts +29 -19
  438. package/src/session-bank/index.ts +4 -2
  439. package/src/session-bank/parser.ts +280 -98
  440. package/src/session-bank/session-bank.ts +33 -12
  441. package/src/session-bank/types.ts +8 -5
  442. package/src/surfacing/skill-publisher.ts +17 -49
  443. package/src/surfacing/sqlite-storage-adapter.ts +16 -32
  444. package/src/types/config.ts +30 -0
  445. package/src/types/index.ts +3 -0
  446. package/src/types/memory.ts +30 -0
  447. package/src/types/playbook.ts +4 -0
  448. package/src/utils/error-classifier.ts +113 -0
  449. package/src/utils/index.ts +18 -0
  450. package/src/utils/partitioned-store.ts +299 -0
  451. package/src/utils/trajectory-helpers.ts +79 -0
  452. package/src/workspace/efficacy-toolkit.ts +496 -0
  453. package/src/workspace/index.ts +29 -0
  454. package/src/workspace/runner.ts +3 -3
  455. package/src/workspace/templates/index.ts +24 -0
  456. package/src/workspace/templates/playbook-decay-detection.ts +272 -0
  457. package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
  458. package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
  459. package/src/workspace/types.ts +10 -2
  460. package/tests/embeddings/inverted-index.test.ts +138 -0
  461. package/tests/feature-toggles.test.ts +275 -0
  462. package/tests/fixtures/behavioral-trajectories.ts +210 -0
  463. package/tests/gap-fixes.test.ts +17 -4
  464. package/tests/integration/cli-e2e.test.ts +621 -0
  465. package/tests/integration/e2e.test.ts +6 -5
  466. package/tests/integration/entire-e2e.test.ts +314 -125
  467. package/tests/integration/persistence-e2e.test.ts +741 -0
  468. package/tests/integration/phase-e2e.test.ts +1143 -0
  469. package/tests/integration/pipeline-data-correctness.test.ts +794 -0
  470. package/tests/integration/session-bank.test.ts +20 -14
  471. package/tests/integration/sessionlog-e2e.test.ts +329 -0
  472. package/tests/integration/unified-pipeline-e2e.test.ts +634 -0
  473. package/tests/learning/analyzer.test.ts +1 -1
  474. package/tests/learning/energy-evaluator.test.ts +180 -0
  475. package/tests/learning/entire-trajectory-source.test.ts +25 -25
  476. package/tests/learning/healing-orchestrator.test.ts +269 -0
  477. package/tests/learning/instant-loop.test.ts +243 -0
  478. package/tests/learning/maintenance-scheduler.test.ts +191 -0
  479. package/tests/learning/meta-learner.test.ts +418 -0
  480. package/tests/learning/pipeline-memory-updates.test.ts +721 -0
  481. package/tests/learning/reflexion-generator.test.ts +411 -0
  482. package/tests/learning/trajectory-sources.test.ts +12 -4
  483. package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
  484. package/tests/learning/unified-pipeline.test.ts +322 -0
  485. package/tests/mcp/playbook-server.test.ts +6 -1
  486. package/tests/memory/candidate-retrieval.test.ts +167 -0
  487. package/tests/memory/causal-store.test.ts +276 -0
  488. package/tests/memory/coherence.test.ts +232 -0
  489. package/tests/memory/experience.test.ts +8 -3
  490. package/tests/memory/meta.test.ts +399 -0
  491. package/tests/memory/playbook.test.ts +307 -1
  492. package/tests/memory/provenance.test.ts +11 -2
  493. package/tests/memory/reasoning-bank.test.ts +239 -0
  494. package/tests/memory/reflexion.test.ts +166 -0
  495. package/tests/memory/skill-exporter.test.ts +6 -1
  496. package/tests/memory/system.test.ts +6 -1
  497. package/tests/memory/temporal-compressor.test.ts +318 -0
  498. package/tests/persistence/migrator.test.ts +1009 -0
  499. package/tests/persistence/sqlite-persistence.test.ts +635 -0
  500. package/tests/runtime/agent-manager.test.ts +6 -1
  501. package/tests/runtime/delegate.test.ts +6 -1
  502. package/tests/search/evaluator.test.ts +257 -0
  503. package/tests/search/moe-gate.test.ts +250 -0
  504. package/tests/search/refinement-loop.test.ts +11 -2
  505. package/tests/search/router.test.ts +81 -2
  506. package/tests/search/verification-runner.test.ts +357 -0
  507. package/tests/session-bank/fixtures/sessionlog-root-metadata.json +16 -0
  508. package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +6 -0
  509. package/tests/session-bank/fixtures/sessionlog-session/metadata.json +55 -0
  510. package/tests/session-bank/git-reader.test.ts +13 -13
  511. package/tests/session-bank/parser.test.ts +135 -3
  512. package/tests/session-bank/session-bank.test.ts +1 -1
  513. package/tests/surfacing/skill-library.test.ts +6 -1
  514. package/tests/surfacing/skill-publisher.test.ts +24 -58
  515. package/tests/surfacing/sqlite-storage-adapter.test.ts +11 -23
  516. package/tests/utils/error-classifier.test.ts +149 -0
  517. package/tests/utils/partitioned-store.test.ts +230 -0
  518. package/tests/utils/trajectory-helpers.test.ts +163 -0
  519. package/tests/workspace/efficacy-toolkit.test.ts +404 -0
  520. package/tests/workspace/full-flow.test.ts +10 -4
  521. package/tests/workspace/runner.test.ts +10 -4
  522. package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
  523. package/docs/DESIGN-workspace-migration.md +0 -1079
  524. package/docs/PLAN-agentic-workspace-implementation.md +0 -717
  525. package/docs/PLAN-graph-migration.md +0 -299
  526. package/docs/PLAN-session-bank-implementation.md +0 -474
  527. package/src/learning/pipeline.ts +0 -323
  528. package/tests/learning/pipeline.test.ts +0 -176
@@ -1,6 +1,7 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
2
  import { PlaybookLibrary, createPlaybookLibrary } from '../../src/memory/playbook.js';
3
3
  import type { Playbook } from '../../src/types/playbook.js';
4
+ import { createSqlitePersistence } from '../../src/persistence/index.js';
4
5
  import { mkdtemp, rm } from 'node:fs/promises';
5
6
  import { join } from 'node:path';
6
7
  import { tmpdir } from 'node:os';
@@ -8,15 +9,19 @@ import { tmpdir } from 'node:os';
8
9
  describe('PlaybookLibrary', () => {
9
10
  let tempDir: string;
10
11
  let library: PlaybookLibrary;
12
+ let persistence: any;
11
13
 
12
14
  beforeEach(async () => {
13
15
  tempDir = await mkdtemp(join(tmpdir(), 'atlas-test-'));
14
- library = createPlaybookLibrary(tempDir);
16
+ persistence = createSqlitePersistence({ baseDir: tempDir });
17
+ await persistence.init();
18
+ library = createPlaybookLibrary(persistence);
15
19
  await library.init();
16
20
  });
17
21
 
18
22
  afterEach(async () => {
19
23
  await library.close();
24
+ persistence.close();
20
25
  await rm(tempDir, { recursive: true, force: true });
21
26
  });
22
27
 
@@ -322,6 +327,164 @@ describe('PlaybookLibrary', () => {
322
327
  });
323
328
  });
324
329
 
330
+ describe('stability-plasticity', () => {
331
+ it('should dampen confidence changes for high consolidationStrength', async () => {
332
+ // Create a highly consolidated playbook
333
+ const consolidated = createSamplePlaybook({
334
+ name: 'consolidated',
335
+ confidence: 0.7,
336
+ evolution: {
337
+ version: '1.0.0',
338
+ createdFrom: [],
339
+ failures: [],
340
+ refinements: [],
341
+ successCount: 50,
342
+ failureCount: 2,
343
+ consolidationStrength: 5,
344
+ },
345
+ });
346
+ await library.add(consolidated);
347
+
348
+ // Create a fresh playbook
349
+ const fresh = createSamplePlaybook({
350
+ name: 'fresh',
351
+ confidence: 0.7,
352
+ evolution: {
353
+ version: '1.0.0',
354
+ createdFrom: [],
355
+ failures: [],
356
+ refinements: [],
357
+ successCount: 0,
358
+ failureCount: 0,
359
+ consolidationStrength: 0,
360
+ },
361
+ });
362
+ await library.add(fresh);
363
+
364
+ // Apply failure to both
365
+ await library.recordFailure(consolidated.id, 'traj-1', 'test', 'test fail');
366
+ await library.recordFailure(fresh.id, 'traj-2', 'test', 'test fail');
367
+
368
+ const updatedConsolidated = await library.get(consolidated.id);
369
+ const updatedFresh = await library.get(fresh.id);
370
+
371
+ // Both should decrease, but consolidated should decrease less
372
+ const consolidatedDelta = 0.7 - updatedConsolidated!.confidence;
373
+ const freshDelta = 0.7 - updatedFresh!.confidence;
374
+ expect(consolidatedDelta).toBeLessThan(freshDelta);
375
+ });
376
+
377
+ it('should behave as before when consolidationStrength is 0', async () => {
378
+ // A playbook with no consolidation should update like the original EMA
379
+ const playbook = createSamplePlaybook({
380
+ confidence: 0.5,
381
+ evolution: {
382
+ version: '1.0.0',
383
+ createdFrom: [],
384
+ failures: [],
385
+ refinements: [],
386
+ successCount: 0,
387
+ failureCount: 0,
388
+ consolidationStrength: 0,
389
+ },
390
+ });
391
+ await library.add(playbook);
392
+
393
+ await library.recordSuccess(playbook.id, 'traj-1');
394
+
395
+ const updated = await library.get(playbook.id);
396
+ // With cs=0: dampedDelta = rawDelta / (1 + 0) = rawDelta
397
+ // rawDelta = (1 - 0.5) * 0.1 = 0.05
398
+ // new confidence = 0.5 + 0.05 = 0.55
399
+ expect(updated!.confidence).toBeCloseTo(0.55, 2);
400
+ });
401
+
402
+ it('should grow consolidationStrength on success', async () => {
403
+ const playbook = createSamplePlaybook({
404
+ evolution: {
405
+ version: '1.0.0',
406
+ createdFrom: [],
407
+ failures: [],
408
+ refinements: [],
409
+ successCount: 0,
410
+ failureCount: 0,
411
+ consolidationStrength: 0,
412
+ },
413
+ });
414
+ await library.add(playbook);
415
+
416
+ await library.recordSuccess(playbook.id, 'traj-1');
417
+ const after1 = await library.get(playbook.id);
418
+ expect(after1!.evolution.consolidationStrength).toBeCloseTo(0.05, 3);
419
+
420
+ await library.recordSuccess(playbook.id, 'traj-2');
421
+ const after2 = await library.get(playbook.id);
422
+ expect(after2!.evolution.consolidationStrength).toBeCloseTo(0.10, 3);
423
+ });
424
+
425
+ it('should not reduce consolidationStrength on failure', async () => {
426
+ const playbook = createSamplePlaybook({
427
+ evolution: {
428
+ version: '1.0.0',
429
+ createdFrom: [],
430
+ failures: [],
431
+ refinements: [],
432
+ successCount: 10,
433
+ failureCount: 0,
434
+ consolidationStrength: 2.0,
435
+ },
436
+ });
437
+ await library.add(playbook);
438
+
439
+ await library.recordFailure(playbook.id, 'traj-1', 'test', 'failed');
440
+ const updated = await library.get(playbook.id);
441
+ // consolidationStrength should remain at 2.0 (failures don't reduce it)
442
+ expect(updated!.evolution.consolidationStrength).toBe(2.0);
443
+ });
444
+
445
+ it('should cap consolidationStrength at 10', async () => {
446
+ const playbook = createSamplePlaybook({
447
+ evolution: {
448
+ version: '1.0.0',
449
+ createdFrom: [],
450
+ failures: [],
451
+ refinements: [],
452
+ successCount: 100,
453
+ failureCount: 0,
454
+ consolidationStrength: 9.98,
455
+ },
456
+ });
457
+ await library.add(playbook);
458
+
459
+ await library.recordSuccess(playbook.id, 'traj-1');
460
+ const updated = await library.get(playbook.id);
461
+ expect(updated!.evolution.consolidationStrength).toBeLessThanOrEqual(10);
462
+ });
463
+
464
+ it('should backward compat — missing consolidationStrength defaults to 0', async () => {
465
+ // Playbook without consolidationStrength field
466
+ const playbook = createSamplePlaybook({
467
+ confidence: 0.5,
468
+ evolution: {
469
+ version: '1.0.0',
470
+ createdFrom: [],
471
+ failures: [],
472
+ refinements: [],
473
+ successCount: 0,
474
+ failureCount: 0,
475
+ // No consolidationStrength or domainBreadth
476
+ },
477
+ });
478
+ await library.add(playbook);
479
+
480
+ await library.recordSuccess(playbook.id, 'traj-1');
481
+ const updated = await library.get(playbook.id);
482
+ // Should still work, same as cs=0
483
+ expect(updated!.confidence).toBeCloseTo(0.55, 2);
484
+ expect(updated!.evolution.consolidationStrength).toBeCloseTo(0.05, 3);
485
+ });
486
+ });
487
+
325
488
  describe('count and getAll', () => {
326
489
  it('should return correct counts', async () => {
327
490
  expect(await library.count()).toBe(0);
@@ -335,4 +498,147 @@ describe('PlaybookLibrary', () => {
335
498
  expect(all).toHaveLength(2);
336
499
  });
337
500
  });
501
+
502
+ describe('MMR diversity', () => {
503
+ it('should match pure relevance ranking when lambda=1.0', async () => {
504
+ await library.add(createSamplePlaybook({
505
+ name: 'pb-a',
506
+ applicability: {
507
+ situations: ['Fix TypeScript type errors in production code'],
508
+ triggers: ['TS2322'],
509
+ antiPatterns: [],
510
+ domains: ['typescript'],
511
+ },
512
+ guidance: {
513
+ strategy: 'Analyze and fix type mismatches',
514
+ tactics: [],
515
+ steps: [],
516
+ },
517
+ }));
518
+ await library.add(createSamplePlaybook({
519
+ name: 'pb-b',
520
+ applicability: {
521
+ situations: ['Fix TypeScript import errors'],
522
+ triggers: ['import'],
523
+ antiPatterns: [],
524
+ domains: ['typescript'],
525
+ },
526
+ guidance: {
527
+ strategy: 'Check and resolve import paths',
528
+ tactics: [],
529
+ steps: [],
530
+ },
531
+ }));
532
+
533
+ // lambda=1.0 should give same order as no MMR
534
+ const pureRelevance = await library.findMatching('TypeScript type errors', { k: 2 });
535
+ const mmr1 = await library.findMatching('TypeScript type errors', { k: 2, lambda: 1.0 });
536
+
537
+ expect(pureRelevance.length).toBe(mmr1.length);
538
+ // Same top result
539
+ expect(pureRelevance[0].playbook.name).toBe(mmr1[0].playbook.name);
540
+ });
541
+
542
+ it('should diversify results when lambda is low', async () => {
543
+ // Add two very similar playbooks and one different
544
+ await library.add(createSamplePlaybook({
545
+ name: 'similar-1',
546
+ applicability: {
547
+ situations: ['Debug TypeScript type error in code'],
548
+ triggers: ['type error'],
549
+ antiPatterns: [],
550
+ domains: ['typescript'],
551
+ },
552
+ guidance: {
553
+ strategy: 'Read the full error message and trace back to the source type declaration',
554
+ tactics: [],
555
+ steps: [],
556
+ },
557
+ }));
558
+ await library.add(createSamplePlaybook({
559
+ name: 'similar-2',
560
+ applicability: {
561
+ situations: ['Debug TypeScript type error in tests'],
562
+ triggers: ['type error'],
563
+ antiPatterns: [],
564
+ domains: ['typescript'],
565
+ },
566
+ guidance: {
567
+ strategy: 'Read the full error message and trace back to the source type declaration',
568
+ tactics: [],
569
+ steps: [],
570
+ },
571
+ }));
572
+ await library.add(createSamplePlaybook({
573
+ name: 'different',
574
+ applicability: {
575
+ situations: ['Debug TypeScript type error using alternative approach'],
576
+ triggers: ['type error'],
577
+ antiPatterns: [],
578
+ domains: ['typescript'],
579
+ },
580
+ guidance: {
581
+ strategy: 'Use the TypeScript compiler API to programmatically analyze types',
582
+ tactics: [],
583
+ steps: [],
584
+ },
585
+ }));
586
+
587
+ // With low lambda, MMR should prefer the diverse playbook over the near-duplicate
588
+ const diverseResults = await library.findMatching('TypeScript type error', {
589
+ k: 3,
590
+ lambda: 0.3,
591
+ });
592
+
593
+ expect(diverseResults.length).toBe(3);
594
+ // The "different" strategy playbook should appear in the top results
595
+ const names = diverseResults.map((r) => r.playbook.name);
596
+ expect(names).toContain('different');
597
+ });
598
+
599
+ it('should avoid returning near-duplicates with strong diversity bias', async () => {
600
+ // Add 3 playbooks with identical strategies
601
+ for (let i = 0; i < 3; i++) {
602
+ await library.add(createSamplePlaybook({
603
+ name: `clone-${i}`,
604
+ applicability: {
605
+ situations: ['Resolve eslint warnings in codebase'],
606
+ triggers: ['eslint warning'],
607
+ antiPatterns: [],
608
+ domains: ['typescript'],
609
+ },
610
+ guidance: {
611
+ strategy: 'Run eslint with auto-fix flag',
612
+ tactics: [],
613
+ steps: [],
614
+ },
615
+ }));
616
+ }
617
+
618
+ // Add one unique playbook
619
+ await library.add(createSamplePlaybook({
620
+ name: 'unique-lint',
621
+ applicability: {
622
+ situations: ['Resolve eslint warnings using custom rules'],
623
+ triggers: ['eslint warning'],
624
+ antiPatterns: [],
625
+ domains: ['typescript'],
626
+ },
627
+ guidance: {
628
+ strategy: 'Create custom eslint rule to prevent the warning pattern',
629
+ tactics: [],
630
+ steps: [],
631
+ },
632
+ }));
633
+
634
+ // With diversity bias, the unique one should appear by position 2
635
+ const results = await library.findMatching('eslint warnings', {
636
+ k: 2,
637
+ lambda: 0.3,
638
+ });
639
+
640
+ const names = results.map((r) => r.playbook.name);
641
+ expect(names).toContain('unique-lint');
642
+ });
643
+ });
338
644
  });
@@ -3,6 +3,7 @@ import { PlaybookLibrary, createPlaybookLibrary } from '../../src/memory/playboo
3
3
  import { loadCuratedPlaybooks, type CuratedPlaybookFile } from '../../src/memory/curated-loader.js';
4
4
  import type { Playbook, PlaybookProvenance } from '../../src/types/playbook.js';
5
5
  import { createPlaybook } from '../../src/types/playbook.js';
6
+ import { createSqlitePersistence } from '../../src/persistence/index.js';
6
7
  import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises';
7
8
  import { join } from 'node:path';
8
9
  import { tmpdir } from 'node:os';
@@ -10,15 +11,19 @@ import { tmpdir } from 'node:os';
10
11
  describe('Playbook Provenance', () => {
11
12
  let tempDir: string;
12
13
  let library: PlaybookLibrary;
14
+ let persistence: any;
13
15
 
14
16
  beforeEach(async () => {
15
17
  tempDir = await mkdtemp(join(tmpdir(), 'atlas-prov-test-'));
16
- library = createPlaybookLibrary(tempDir);
18
+ persistence = createSqlitePersistence({ baseDir: tempDir });
19
+ await persistence.init();
20
+ library = createPlaybookLibrary(persistence);
17
21
  await library.init();
18
22
  });
19
23
 
20
24
  afterEach(async () => {
21
25
  await library.close();
26
+ persistence.close();
22
27
  await rm(tempDir, { recursive: true, force: true });
23
28
  });
24
29
 
@@ -373,17 +378,21 @@ describe('Curated Playbook Loader', () => {
373
378
  let tempDir: string;
374
379
  let curatedDir: string;
375
380
  let library: PlaybookLibrary;
381
+ let persistence: any;
376
382
 
377
383
  beforeEach(async () => {
378
384
  tempDir = await mkdtemp(join(tmpdir(), 'atlas-curated-test-'));
379
385
  curatedDir = join(tempDir, 'curated');
380
386
  await mkdir(curatedDir, { recursive: true });
381
- library = createPlaybookLibrary(tempDir);
387
+ persistence = createSqlitePersistence({ baseDir: tempDir });
388
+ await persistence.init();
389
+ library = createPlaybookLibrary(persistence);
382
390
  await library.init();
383
391
  });
384
392
 
385
393
  afterEach(async () => {
386
394
  await library.close();
395
+ persistence.close();
387
396
  await rm(tempDir, { recursive: true, force: true });
388
397
  });
389
398
 
@@ -0,0 +1,239 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ReasoningBank } from '../../src/memory/reasoning-bank.js';
3
+ import { createExperience } from '../../src/types/memory.js';
4
+
5
+ function makeExperience(
6
+ taskInput: string,
7
+ domain: string,
8
+ success = true,
9
+ accessScore = 1.0
10
+ ) {
11
+ return createExperience({
12
+ taskInput,
13
+ solutionOutput: `Solution for: ${taskInput}`,
14
+ feedback: success ? 'Success' : 'Failed',
15
+ success,
16
+ domain,
17
+ trajectoryId: `traj-${crypto.randomUUID().slice(0, 8)}`,
18
+ metadata: { accessScore },
19
+ });
20
+ }
21
+
22
+ describe('ReasoningBank', () => {
23
+ describe('buildClusters', () => {
24
+ it('should form clusters from similar experiences', () => {
25
+ const bank = new ReasoningBank({ minClusterSize: 2, maxClusters: 5 });
26
+
27
+ const experiences = [
28
+ // Cluster 1: TypeScript type errors
29
+ makeExperience('Fix TypeScript type error in component', 'typescript'),
30
+ makeExperience('Resolve TypeScript type mismatch in handler', 'typescript'),
31
+ makeExperience('Debug TypeScript type assertion failure', 'typescript'),
32
+ // Cluster 2: CSS styling
33
+ makeExperience('Fix CSS layout alignment issue in sidebar', 'css'),
34
+ makeExperience('Correct CSS flexbox alignment in header', 'css'),
35
+ makeExperience('Fix CSS grid alignment on main page', 'css'),
36
+ ];
37
+
38
+ bank.buildClusters(experiences);
39
+
40
+ expect(bank.clusterCount).toBeGreaterThanOrEqual(2);
41
+ const clusters = bank.getClusters();
42
+ expect(clusters.length).toBeGreaterThanOrEqual(2);
43
+ });
44
+
45
+ it('should not cluster when too few experiences', () => {
46
+ const bank = new ReasoningBank({ minClusterSize: 5 });
47
+
48
+ const experiences = [
49
+ makeExperience('Fix a bug', 'typescript'),
50
+ makeExperience('Add a feature', 'typescript'),
51
+ ];
52
+
53
+ bank.buildClusters(experiences);
54
+
55
+ expect(bank.clusterCount).toBe(0);
56
+ });
57
+
58
+ it('should only cluster successful experiences', () => {
59
+ const bank = new ReasoningBank({ minClusterSize: 2 });
60
+
61
+ const experiences = [
62
+ makeExperience('Fix TypeScript error', 'typescript', true),
63
+ makeExperience('Fix TypeScript import', 'typescript', true),
64
+ makeExperience('Fix TypeScript build', 'typescript', true),
65
+ makeExperience('Fix failing deploy', 'devops', false),
66
+ makeExperience('Fix broken pipeline', 'devops', false),
67
+ makeExperience('Fix CI configuration', 'devops', false),
68
+ ];
69
+
70
+ bank.buildClusters(experiences);
71
+
72
+ // All clusters should only contain successful experiences
73
+ for (const cluster of bank.getClusters()) {
74
+ expect(cluster.successRate).toBe(1.0);
75
+ }
76
+ });
77
+ });
78
+
79
+ describe('findInCluster', () => {
80
+ it('should return experiences from matching cluster', () => {
81
+ const bank = new ReasoningBank({ minClusterSize: 2 });
82
+
83
+ const experiences = [
84
+ makeExperience('Fix TypeScript type error in component', 'typescript'),
85
+ makeExperience('Fix TypeScript type mismatch in API', 'typescript'),
86
+ makeExperience('Fix TypeScript type assertion issue', 'typescript'),
87
+ makeExperience('Fix CSS layout bug in sidebar', 'css'),
88
+ makeExperience('Fix CSS flexbox alignment issue', 'css'),
89
+ makeExperience('Fix CSS grid layout problem', 'css'),
90
+ ];
91
+
92
+ bank.buildClusters(experiences);
93
+
94
+ const results = bank.findInCluster('TypeScript type error', { k: 3 });
95
+
96
+ expect(results.length).toBeGreaterThan(0);
97
+ // Results should come from the typescript cluster
98
+ for (const r of results) {
99
+ expect(r.experience.domain).toBe('typescript');
100
+ expect(r.clusterId).toBeDefined();
101
+ expect(r.score).toBeGreaterThan(0);
102
+ }
103
+ });
104
+
105
+ it('should return empty array when no clusters exist', () => {
106
+ const bank = new ReasoningBank();
107
+ const results = bank.findInCluster('anything');
108
+ expect(results).toHaveLength(0);
109
+ });
110
+
111
+ it('should filter by domain', () => {
112
+ const bank = new ReasoningBank({ minClusterSize: 2 });
113
+
114
+ const experiences = [
115
+ makeExperience('Fix error in production code', 'typescript'),
116
+ makeExperience('Fix error in production system', 'typescript'),
117
+ makeExperience('Fix error in production app', 'typescript'),
118
+ makeExperience('Fix error in production deploy', 'devops'),
119
+ makeExperience('Fix error in production pipeline', 'devops'),
120
+ makeExperience('Fix error in production build', 'devops'),
121
+ ];
122
+
123
+ bank.buildClusters(experiences);
124
+
125
+ const results = bank.findInCluster('production error', {
126
+ domain: 'devops',
127
+ });
128
+
129
+ for (const r of results) {
130
+ expect(r.experience.domain).toBe('devops');
131
+ }
132
+ });
133
+ });
134
+
135
+ describe('cluster labels', () => {
136
+ it('should reflect common task patterns', () => {
137
+ const bank = new ReasoningBank({ minClusterSize: 2 });
138
+
139
+ const experiences = [
140
+ makeExperience('Fix TypeScript type error in component file', 'typescript'),
141
+ makeExperience('Fix TypeScript type error in module export', 'typescript'),
142
+ makeExperience('Fix TypeScript type error in interface', 'typescript'),
143
+ ];
144
+
145
+ bank.buildClusters(experiences);
146
+
147
+ const clusters = bank.getClusters();
148
+ expect(clusters.length).toBeGreaterThan(0);
149
+
150
+ // Label should contain common tokens like "fix", "typescript", "type", or "error"
151
+ const label = clusters[0].label.toLowerCase();
152
+ const hasCommonToken =
153
+ label.includes('fix') ||
154
+ label.includes('typescript') ||
155
+ label.includes('type') ||
156
+ label.includes('error');
157
+ expect(hasCommonToken).toBe(true);
158
+ });
159
+ });
160
+
161
+ describe('cluster stats', () => {
162
+ it('should report correct success rates', () => {
163
+ const bank = new ReasoningBank({ minClusterSize: 2 });
164
+
165
+ // All successful (failures are filtered out before clustering)
166
+ const experiences = [
167
+ makeExperience('Fix TypeScript error one', 'typescript', true),
168
+ makeExperience('Fix TypeScript error two', 'typescript', true),
169
+ makeExperience('Fix TypeScript error three', 'typescript', true),
170
+ ];
171
+
172
+ bank.buildClusters(experiences);
173
+
174
+ const stats = bank.getClusterStats();
175
+ expect(stats.length).toBeGreaterThan(0);
176
+
177
+ for (const stat of stats) {
178
+ expect(stat.successRate).toBe(1.0); // Only successful ones clustered
179
+ expect(stat.size).toBeGreaterThanOrEqual(2);
180
+ expect(stat.label).toBeDefined();
181
+ expect(stat.clusterId).toBeDefined();
182
+ }
183
+ });
184
+ });
185
+
186
+ describe('re-clustering', () => {
187
+ it('should track experiences since last cluster', () => {
188
+ const bank = new ReasoningBank({ reclusterInterval: 3 });
189
+
190
+ expect(bank.shouldRecluster()).toBe(false);
191
+
192
+ bank.notifyNewExperience();
193
+ bank.notifyNewExperience();
194
+ expect(bank.shouldRecluster()).toBe(false);
195
+
196
+ bank.notifyNewExperience();
197
+ expect(bank.shouldRecluster()).toBe(true);
198
+ });
199
+
200
+ it('should reset counter after buildClusters', () => {
201
+ const bank = new ReasoningBank({ reclusterInterval: 2 });
202
+
203
+ bank.notifyNewExperience();
204
+ bank.notifyNewExperience();
205
+ expect(bank.shouldRecluster()).toBe(true);
206
+
207
+ bank.buildClusters([
208
+ makeExperience('Task A one', 'typescript'),
209
+ makeExperience('Task A two', 'typescript'),
210
+ makeExperience('Task A three', 'typescript'),
211
+ ]);
212
+
213
+ expect(bank.shouldRecluster()).toBe(false);
214
+ });
215
+ });
216
+
217
+ describe('edge cases', () => {
218
+ it('should handle empty experience list', () => {
219
+ const bank = new ReasoningBank();
220
+ bank.buildClusters([]);
221
+ expect(bank.clusterCount).toBe(0);
222
+ expect(bank.getClusters()).toHaveLength(0);
223
+ expect(bank.getClusterStats()).toHaveLength(0);
224
+ });
225
+
226
+ it('should handle all identical experiences', () => {
227
+ const bank = new ReasoningBank({ minClusterSize: 2 });
228
+
229
+ const experiences = Array.from({ length: 5 }, () =>
230
+ makeExperience('Fix TypeScript error', 'typescript')
231
+ );
232
+
233
+ bank.buildClusters(experiences);
234
+
235
+ // Should form at least one cluster
236
+ expect(bank.clusterCount).toBeGreaterThanOrEqual(1);
237
+ });
238
+ });
239
+ });