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
@@ -0,0 +1,411 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ReflexionGenerator } from '../../src/learning/reflexion-generator.js';
3
+ import { createTrajectory } from '../../src/types/trajectory.js';
4
+ import { createTask } from '../../src/types/task.js';
5
+ import { createStep } from '../../src/types/step.js';
6
+ import { successOutcome, failureOutcome, partialOutcome } from '../../src/types/outcome.js';
7
+ import type { PlaybookMatch } from '../../src/memory/playbook.js';
8
+ import { createPlaybook } from '../../src/types/playbook.js';
9
+
10
+ function makePlaybookMatch(name: string, score: number): PlaybookMatch {
11
+ return {
12
+ playbook: createPlaybook({
13
+ name,
14
+ applicability: {
15
+ situations: ['General task'],
16
+ triggers: [],
17
+ antiPatterns: [],
18
+ domains: ['typescript'],
19
+ },
20
+ guidance: {
21
+ strategy: `Strategy for ${name}`,
22
+ tactics: [],
23
+ steps: [],
24
+ },
25
+ }),
26
+ score,
27
+ matchType: 'situation',
28
+ };
29
+ }
30
+
31
+ describe('ReflexionGenerator', () => {
32
+ const generator = new ReflexionGenerator();
33
+
34
+ describe('heuristic mode — successful trajectory', () => {
35
+ it('should produce a valid reflexion episode', async () => {
36
+ const trajectory = createTrajectory({
37
+ task: createTask({
38
+ description: 'Fix the typescript import error in src/index.ts',
39
+ domain: 'typescript',
40
+ }),
41
+ steps: [
42
+ createStep({
43
+ thought: 'Let me check the imports',
44
+ action: 'ReadFile src/index.ts',
45
+ observation: 'File content: import { foo } from "./bar"',
46
+ }),
47
+ createStep({
48
+ thought: 'The import path is wrong',
49
+ action: 'EditFile src/index.ts',
50
+ observation: 'File updated successfully',
51
+ }),
52
+ ],
53
+ outcome: successOutcome('Fixed import path'),
54
+ agentId: 'test-agent',
55
+ });
56
+
57
+ const episode = await generator.generate(trajectory);
58
+
59
+ expect(episode.id).toBeDefined();
60
+ expect(episode.trajectoryId).toBe(trajectory.id);
61
+ expect(episode.outcome).toBe('success');
62
+ expect(episode.taskSummary).toContain('Fix the typescript import error');
63
+ expect(episode.domain).toBe('typescript');
64
+ expect(episode.selfCritique).toContain('Completed efficiently');
65
+ expect(episode.createdAt).toBeInstanceOf(Date);
66
+ });
67
+
68
+ it('should extract tool names as key insights', async () => {
69
+ const trajectory = createTrajectory({
70
+ task: createTask({
71
+ description: 'Debug the application',
72
+ domain: 'typescript',
73
+ }),
74
+ steps: [
75
+ createStep({
76
+ action: 'ReadFile src/app.ts',
77
+ observation: 'Source code',
78
+ }),
79
+ createStep({
80
+ action: 'SearchGlob *.test.ts',
81
+ observation: 'Found test files',
82
+ }),
83
+ createStep({
84
+ action: 'EditFile src/app.ts',
85
+ observation: 'Updated',
86
+ }),
87
+ ],
88
+ outcome: successOutcome('Debugged'),
89
+ agentId: 'test-agent',
90
+ });
91
+
92
+ const episode = await generator.generate(trajectory);
93
+
94
+ const toolInsight = episode.keyInsights.find((i) => i.startsWith('Tools used:'));
95
+ expect(toolInsight).toBeDefined();
96
+ expect(toolInsight).toContain('ReadFile');
97
+ expect(toolInsight).toContain('SearchGlob');
98
+ expect(toolInsight).toContain('EditFile');
99
+ });
100
+
101
+ it('should extract file paths as key insights', async () => {
102
+ const trajectory = createTrajectory({
103
+ task: createTask({
104
+ description: 'Fix a bug',
105
+ domain: 'typescript',
106
+ }),
107
+ steps: [
108
+ createStep({
109
+ action: 'ReadFile',
110
+ observation: 'Contents of /src/utils/helper.ts',
111
+ }),
112
+ ],
113
+ outcome: successOutcome('Fixed'),
114
+ agentId: 'test-agent',
115
+ });
116
+
117
+ const episode = await generator.generate(trajectory);
118
+
119
+ const fileInsight = episode.keyInsights.find((i) => i.startsWith('Key files:'));
120
+ expect(fileInsight).toBeDefined();
121
+ expect(fileInsight).toContain('/src/utils/helper.ts');
122
+ });
123
+ });
124
+
125
+ describe('heuristic mode — failed trajectory', () => {
126
+ it('should produce a valid episode with failure critique', async () => {
127
+ const trajectory = createTrajectory({
128
+ task: createTask({
129
+ description: 'Fix broken deployment',
130
+ domain: 'devops',
131
+ }),
132
+ steps: [
133
+ createStep({
134
+ action: 'RunCommand deploy',
135
+ observation: 'Deployment failed with error',
136
+ }),
137
+ ],
138
+ outcome: failureOutcome('Connection timeout to remote server'),
139
+ agentId: 'test-agent',
140
+ });
141
+
142
+ const episode = await generator.generate(trajectory);
143
+
144
+ expect(episode.outcome).toBe('failure');
145
+ expect(episode.selfCritique).toContain('Failed with');
146
+ expect(episode.selfCritique).toContain('Connection timeout');
147
+ });
148
+
149
+ it('should classify error patterns in key insights', async () => {
150
+ const trajectory = createTrajectory({
151
+ task: createTask({
152
+ description: 'Fix type error',
153
+ domain: 'typescript',
154
+ }),
155
+ steps: [
156
+ createStep({
157
+ action: 'ReadFile src/index.ts',
158
+ observation: 'TS2322: Type error',
159
+ }),
160
+ ],
161
+ outcome: failureOutcome('Type error: string is not assignable to number'),
162
+ agentId: 'test-agent',
163
+ });
164
+
165
+ const episode = await generator.generate(trajectory);
166
+
167
+ const errorInsight = episode.keyInsights.find((i) => i.startsWith('Error pattern:'));
168
+ expect(errorInsight).toBeDefined();
169
+ expect(errorInsight).toContain('type-error');
170
+ });
171
+
172
+ it('should suggest playbook updates when failed with matching playbooks', async () => {
173
+ const trajectory = createTrajectory({
174
+ task: createTask({
175
+ description: 'Fix module import issue',
176
+ domain: 'typescript',
177
+ }),
178
+ steps: [
179
+ createStep({
180
+ action: 'ReadFile src/index.ts',
181
+ observation: 'File not found',
182
+ }),
183
+ ],
184
+ outcome: failureOutcome('Module not found: ./missing-module'),
185
+ agentId: 'test-agent',
186
+ });
187
+
188
+ const matchedPlaybooks = [makePlaybookMatch('fix-imports', 0.85)];
189
+
190
+ const episode = await generator.generate(trajectory, matchedPlaybooks);
191
+
192
+ expect(episode.suggestedPlaybookUpdates.length).toBeGreaterThan(0);
193
+ expect(
194
+ episode.suggestedPlaybookUpdates.some((s) => s.includes('fix-imports'))
195
+ ).toBe(true);
196
+ });
197
+
198
+ it('should suggest new playbook when failed without matches', async () => {
199
+ const trajectory = createTrajectory({
200
+ task: createTask({
201
+ description: 'Fix import resolution',
202
+ domain: 'typescript',
203
+ }),
204
+ steps: [
205
+ createStep({
206
+ action: 'ReadFile src/index.ts',
207
+ observation: 'Error',
208
+ }),
209
+ ],
210
+ outcome: failureOutcome('Module not found'),
211
+ agentId: 'test-agent',
212
+ });
213
+
214
+ const episode = await generator.generate(trajectory, []);
215
+
216
+ expect(
217
+ episode.suggestedPlaybookUpdates.some(
218
+ (s) => s.includes('Create') && s.includes('import-error')
219
+ )
220
+ ).toBe(true);
221
+ });
222
+ });
223
+
224
+ describe('heuristic mode — partial outcome', () => {
225
+ it('should map partial score > 0 to partial outcome', async () => {
226
+ const trajectory = createTrajectory({
227
+ task: createTask({
228
+ description: 'Partially fix something',
229
+ domain: 'typescript',
230
+ }),
231
+ steps: [
232
+ createStep({
233
+ action: 'EditFile src/index.ts',
234
+ observation: 'Updated',
235
+ }),
236
+ ],
237
+ outcome: partialOutcome(0.5, 'Half done'),
238
+ agentId: 'test-agent',
239
+ });
240
+
241
+ const episode = await generator.generate(trajectory);
242
+
243
+ expect(episode.outcome).toBe('partial');
244
+ });
245
+ });
246
+
247
+ describe('strategy assessment', () => {
248
+ it('should note success with playbook match', async () => {
249
+ const trajectory = createTrajectory({
250
+ task: createTask({
251
+ description: 'Fix import',
252
+ domain: 'typescript',
253
+ }),
254
+ steps: [
255
+ createStep({
256
+ action: 'EditFile src/index.ts',
257
+ observation: 'Updated',
258
+ }),
259
+ ],
260
+ outcome: successOutcome('Fixed'),
261
+ agentId: 'test-agent',
262
+ });
263
+
264
+ const matches = [makePlaybookMatch('import-fixer', 0.9)];
265
+ const episode = await generator.generate(trajectory, matches);
266
+
267
+ expect(episode.strategyAssessment).toContain('import-fixer');
268
+ expect(episode.strategyAssessment).toContain('Succeeded');
269
+ expect(episode.strategyAssessment).toContain('confirmed');
270
+ });
271
+
272
+ it('should note failure with playbook match', async () => {
273
+ const trajectory = createTrajectory({
274
+ task: createTask({
275
+ description: 'Fix error',
276
+ domain: 'typescript',
277
+ }),
278
+ steps: [
279
+ createStep({
280
+ action: 'ReadFile src/index.ts',
281
+ observation: 'Error',
282
+ }),
283
+ ],
284
+ outcome: failureOutcome('Still broken'),
285
+ agentId: 'test-agent',
286
+ });
287
+
288
+ const matches = [makePlaybookMatch('error-fixer', 0.7)];
289
+ const episode = await generator.generate(trajectory, matches);
290
+
291
+ expect(episode.strategyAssessment).toContain('error-fixer');
292
+ expect(episode.strategyAssessment).toContain('Failed');
293
+ expect(episode.strategyAssessment).toContain('refinement');
294
+ });
295
+
296
+ it('should note success without playbook as new playbook candidate', async () => {
297
+ const trajectory = createTrajectory({
298
+ task: createTask({
299
+ description: 'Novel task',
300
+ domain: 'typescript',
301
+ }),
302
+ steps: [
303
+ createStep({
304
+ action: 'ReadFile src/index.ts',
305
+ observation: 'Source',
306
+ }),
307
+ ],
308
+ outcome: successOutcome('Solved'),
309
+ agentId: 'test-agent',
310
+ });
311
+
312
+ const episode = await generator.generate(trajectory, []);
313
+
314
+ expect(episode.strategyAssessment).toContain('new playbook candidate');
315
+ });
316
+ });
317
+
318
+ describe('self-critique', () => {
319
+ it('should detect repeated actions (thrashing)', async () => {
320
+ const trajectory = createTrajectory({
321
+ task: createTask({
322
+ description: 'Fix issue with retries',
323
+ domain: 'typescript',
324
+ }),
325
+ steps: [
326
+ createStep({ action: 'ReadFile src/index.ts', observation: 'Error' }),
327
+ createStep({ action: 'ReadFile src/index.ts', observation: 'Error' }),
328
+ createStep({ action: 'ReadFile src/index.ts', observation: 'Error' }),
329
+ createStep({ action: 'EditFile src/index.ts', observation: 'Updated' }),
330
+ ],
331
+ outcome: successOutcome('Fixed'),
332
+ agentId: 'test-agent',
333
+ });
334
+
335
+ const episode = await generator.generate(trajectory);
336
+
337
+ expect(episode.selfCritique).toContain('Repeated actions');
338
+ });
339
+
340
+ it('should note inefficiency for many steps', async () => {
341
+ const steps = Array.from({ length: 15 }, (_, i) =>
342
+ createStep({
343
+ action: `Step${i} something`,
344
+ observation: `Done ${i}`,
345
+ })
346
+ );
347
+
348
+ const trajectory = createTrajectory({
349
+ task: createTask({
350
+ description: 'Complex task',
351
+ domain: 'typescript',
352
+ }),
353
+ steps,
354
+ outcome: successOutcome('Eventually fixed'),
355
+ agentId: 'test-agent',
356
+ });
357
+
358
+ const episode = await generator.generate(trajectory);
359
+
360
+ expect(episode.selfCritique).toContain('15 steps');
361
+ expect(episode.selfCritique).toContain('overcomplicating');
362
+ });
363
+ });
364
+
365
+ describe('configuration', () => {
366
+ it('should respect maxSummaryLength', async () => {
367
+ const gen = new ReflexionGenerator({ maxSummaryLength: 20 });
368
+ const trajectory = createTrajectory({
369
+ task: createTask({
370
+ description: 'This is a very long task description that should be truncated',
371
+ domain: 'typescript',
372
+ }),
373
+ steps: [
374
+ createStep({ action: 'DoSomething', observation: 'Done' }),
375
+ ],
376
+ outcome: successOutcome('Done'),
377
+ agentId: 'test-agent',
378
+ });
379
+
380
+ const episode = await gen.generate(trajectory);
381
+
382
+ expect(episode.taskSummary.length).toBeLessThanOrEqual(20);
383
+ });
384
+
385
+ it('should respect maxInsights', async () => {
386
+ const gen = new ReflexionGenerator({ maxInsights: 1 });
387
+ const trajectory = createTrajectory({
388
+ task: createTask({
389
+ description: 'Task with many insights',
390
+ domain: 'typescript',
391
+ }),
392
+ steps: [
393
+ createStep({
394
+ action: 'ReadFile /src/a.ts',
395
+ observation: 'contents of /src/a.ts and /src/b.ts',
396
+ }),
397
+ createStep({
398
+ action: 'EditFile /src/c.ts',
399
+ observation: 'updated /src/c.ts',
400
+ }),
401
+ ],
402
+ outcome: successOutcome('Done'),
403
+ agentId: 'test-agent',
404
+ });
405
+
406
+ const episode = await gen.generate(trajectory);
407
+
408
+ expect(episode.keyInsights.length).toBeLessThanOrEqual(1);
409
+ });
410
+ });
411
+ });
@@ -5,8 +5,9 @@ import { join } from 'node:path';
5
5
  import { InMemoryTrajectorySource } from '../../src/learning/trajectory-sources/in-memory.js';
6
6
  import { FileTrajectorySource } from '../../src/learning/trajectory-sources/file.js';
7
7
  import { PipelineTrajectorySource } from '../../src/learning/trajectory-sources/pipeline.js';
8
- import { LearningPipeline } from '../../src/learning/pipeline.js';
8
+ import { UnifiedLearningPipeline } from '../../src/learning/unified-pipeline.js';
9
9
  import { MemorySystem, createMemorySystem } from '../../src/memory/system.js';
10
+ import { createSqlitePersistence } from '../../src/persistence/index.js';
10
11
  import {
11
12
  createTrajectory,
12
13
  createTask,
@@ -255,16 +256,23 @@ describe('FileTrajectorySource', () => {
255
256
  describe('PipelineTrajectorySource', () => {
256
257
  let tmpDir: string;
257
258
  let memory: MemorySystem;
258
- let pipeline: LearningPipeline;
259
+ let pipeline: UnifiedLearningPipeline;
260
+ let persistence: any;
259
261
 
260
262
  beforeEach(async () => {
261
263
  tmpDir = await mkdtemp(join(tmpdir(), 'pipeline-source-test-'));
262
- memory = createMemorySystem(tmpDir);
264
+ persistence = createSqlitePersistence({ baseDir: tmpDir });
265
+ await persistence.init();
266
+ memory = createMemorySystem(persistence, tmpDir);
263
267
  await memory.init();
264
- pipeline = new LearningPipeline(memory, { minTrajectories: 100 });
268
+ pipeline = new UnifiedLearningPipeline(memory, {
269
+ batch: { learning: { minTrajectories: 100 }, energy: {} },
270
+ }, persistence);
271
+ await pipeline.init();
265
272
  });
266
273
 
267
274
  afterEach(async () => {
275
+ persistence.close();
268
276
  await rm(tmpDir, { recursive: true, force: true });
269
277
  });
270
278
 
@@ -0,0 +1,232 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { UnifiedLearningPipeline, createUnifiedPipeline } from '../../src/learning/unified-pipeline.js';
3
+ import { MemorySystem } from '../../src/memory/system.js';
4
+ import { createTrajectory, type Trajectory } from '../../src/types/trajectory.js';
5
+ import { createTask } from '../../src/types/task.js';
6
+ import { createStep } from '../../src/types/step.js';
7
+ import { successOutcome, failureOutcome } from '../../src/types/outcome.js';
8
+ import { createPlaybook } from '../../src/types/playbook.js';
9
+ import { mkdtemp, rm } from 'node:fs/promises';
10
+ import { join } from 'node:path';
11
+ import { tmpdir } from 'node:os';
12
+ import { createSqlitePersistence } from '../../src/persistence/index.js';
13
+ import type { SqlitePersistence } from '../../src/persistence/index.js';
14
+ import type { Playbook } from '../../src/types/playbook.js';
15
+
16
+ function makeTrajectory(overrides?: {
17
+ success?: boolean;
18
+ domain?: string;
19
+ description?: string;
20
+ }): Trajectory {
21
+ const success = overrides?.success ?? true;
22
+ return createTrajectory({
23
+ task: createTask({
24
+ description: overrides?.description ?? 'Fix the typescript import error',
25
+ domain: overrides?.domain ?? 'typescript',
26
+ }),
27
+ steps: [
28
+ createStep({
29
+ thought: 'Let me check the imports',
30
+ action: 'ReadFile src/index.ts',
31
+ observation: 'File content: import { foo } from "./bar"',
32
+ }),
33
+ createStep({
34
+ thought: 'The import path is wrong',
35
+ action: 'EditFile src/index.ts',
36
+ observation: 'File updated successfully',
37
+ }),
38
+ ],
39
+ outcome: success
40
+ ? successOutcome('Fixed import path')
41
+ : failureOutcome('Could not resolve import'),
42
+ agentId: 'test-agent',
43
+ });
44
+ }
45
+
46
+ function makePlaybook(overrides?: Partial<{
47
+ name: string;
48
+ domain: string;
49
+ successCount: number;
50
+ failureCount: number;
51
+ confidence: number;
52
+ }>): Playbook {
53
+ return createPlaybook({
54
+ name: overrides?.name ?? 'test-playbook',
55
+ applicability: {
56
+ situations: ['fix import'],
57
+ domains: [overrides?.domain ?? 'typescript'],
58
+ triggers: ['import error'],
59
+ antiPatterns: [],
60
+ },
61
+ guidance: {
62
+ strategy: 'Check and fix import paths',
63
+ tactics: ['Read the file', 'Fix the path'],
64
+ verification: [],
65
+ commonPitfalls: [],
66
+ },
67
+ successCount: overrides?.successCount ?? 5,
68
+ failureCount: overrides?.failureCount ?? 1,
69
+ confidence: overrides?.confidence ?? 0.8,
70
+ });
71
+ }
72
+
73
+ describe('UnifiedLearningPipeline — efficacy maintenance', () => {
74
+ let tempDir: string;
75
+ let memory: MemorySystem;
76
+ let pipeline: UnifiedLearningPipeline;
77
+ let persistence: SqlitePersistence;
78
+
79
+ beforeEach(async () => {
80
+ tempDir = await mkdtemp(join(tmpdir(), 'atlas-efficacy-test-'));
81
+ persistence = createSqlitePersistence({ baseDir: tempDir });
82
+ await persistence.init();
83
+ memory = new MemorySystem(persistence, tempDir);
84
+ await memory.init();
85
+ });
86
+
87
+ afterEach(async () => {
88
+ await memory.close();
89
+ persistence.close();
90
+ await rm(tempDir, { recursive: true, force: true });
91
+ });
92
+
93
+ it('should register efficacy tasks by default', async () => {
94
+ pipeline = createUnifiedPipeline(memory, {
95
+ batch: { learning: { minTrajectories: 100 }, energy: { countThreshold: 100 } },
96
+ features: { healing: false },
97
+ }, persistence);
98
+ await pipeline.init();
99
+
100
+ const stats = pipeline.getStats();
101
+ expect(stats.maintenanceTasks).toContain('playbook-decay-detection');
102
+ expect(stats.maintenanceTasks).toContain('playbook-efficacy-audit');
103
+ expect(stats.maintenanceTasks).toContain('playbook-lifecycle-review');
104
+ });
105
+
106
+ it('should NOT register efficacy tasks when feature is disabled', async () => {
107
+ pipeline = createUnifiedPipeline(memory, {
108
+ batch: { learning: { minTrajectories: 100 }, energy: { countThreshold: 100 } },
109
+ features: { healing: false, efficacy: false },
110
+ }, persistence);
111
+ await pipeline.init();
112
+
113
+ const stats = pipeline.getStats();
114
+ expect(stats.maintenanceTasks).not.toContain('playbook-decay-detection');
115
+ expect(stats.maintenanceTasks).not.toContain('playbook-efficacy-audit');
116
+ expect(stats.maintenanceTasks).not.toContain('playbook-lifecycle-review');
117
+ });
118
+
119
+ it('decay detection should skip when no playbooks exist', async () => {
120
+ pipeline = createUnifiedPipeline(memory, {
121
+ batch: { learning: { minTrajectories: 100 }, energy: { countThreshold: 100 } },
122
+ features: { healing: false },
123
+ }, persistence);
124
+ await pipeline.init();
125
+
126
+ const result = await pipeline.runMaintenance({ force: true });
127
+
128
+ expect(result.ran).toBe(true);
129
+ const decayTask = result.taskResults.find(t => t.taskName === 'playbook-decay-detection');
130
+ expect(decayTask).toBeDefined();
131
+ expect(decayTask!.success).toBe(true);
132
+ expect((decayTask!.details as Record<string, unknown>).skipped).toBe(true);
133
+ });
134
+
135
+ it('decay detection should run with playbooks and annotations', async () => {
136
+ // Add playbooks
137
+ const pb = makePlaybook({ name: 'import-fixer', successCount: 10, failureCount: 5 });
138
+ await memory.playbooks.add(pb);
139
+
140
+ pipeline = createUnifiedPipeline(memory, {
141
+ batch: { learning: { minTrajectories: 100 }, energy: { countThreshold: 100 } },
142
+ features: { healing: false },
143
+ efficacy: { minPlaybooks: 1, minAnnotations: 0, lifecycleReviewFrequency: 3 },
144
+ }, persistence);
145
+ await pipeline.init();
146
+
147
+ const result = await pipeline.runMaintenance({ force: true });
148
+
149
+ const decayTask = result.taskResults.find(t => t.taskName === 'playbook-decay-detection');
150
+ expect(decayTask).toBeDefined();
151
+ expect(decayTask!.success).toBe(true);
152
+ const details = decayTask!.details as Record<string, unknown>;
153
+ expect(details.skipped).toBeUndefined();
154
+ expect(typeof details.healthyCount).toBe('number');
155
+ });
156
+
157
+ it('efficacy audit should skip when no decay results found flagged playbooks', async () => {
158
+ const pb = makePlaybook({ name: 'stable-playbook', confidence: 0.9 });
159
+ await memory.playbooks.add(pb);
160
+
161
+ pipeline = createUnifiedPipeline(memory, {
162
+ batch: { learning: { minTrajectories: 100 }, energy: { countThreshold: 100 } },
163
+ features: { healing: false },
164
+ efficacy: { minPlaybooks: 1, minAnnotations: 0, lifecycleReviewFrequency: 3 },
165
+ }, persistence);
166
+ await pipeline.init();
167
+
168
+ const result = await pipeline.runMaintenance({ force: true });
169
+
170
+ const auditTask = result.taskResults.find(t => t.taskName === 'playbook-efficacy-audit');
171
+ expect(auditTask).toBeDefined();
172
+ expect(auditTask!.success).toBe(true);
173
+ const details = auditTask!.details as Record<string, unknown>;
174
+ // Should be skipped because decay detection found no flagged playbooks
175
+ expect(details.skipped).toBe(true);
176
+ });
177
+
178
+ it('lifecycle review should respect frequency setting', async () => {
179
+ const pb = makePlaybook({ name: 'lifecycle-test' });
180
+ await memory.playbooks.add(pb);
181
+
182
+ pipeline = createUnifiedPipeline(memory, {
183
+ batch: { learning: { minTrajectories: 100 }, energy: { countThreshold: 100 } },
184
+ features: { healing: false },
185
+ efficacy: { minPlaybooks: 1, minAnnotations: 0, lifecycleReviewFrequency: 2 },
186
+ }, persistence);
187
+ await pipeline.init();
188
+
189
+ // First maintenance (cycle 0) — should run (0 % 2 === 0)
190
+ const result1 = await pipeline.runMaintenance({ force: true });
191
+ const lifecycleTask1 = result1.taskResults.find(t => t.taskName === 'playbook-lifecycle-review');
192
+ expect(lifecycleTask1).toBeDefined();
193
+ const details1 = lifecycleTask1!.details as Record<string, unknown>;
194
+ expect(details1.totalPlaybooks).toBeDefined();
195
+
196
+ // Second maintenance (cycle 1) — should skip (1 % 2 !== 0)
197
+ const result2 = await pipeline.runMaintenance({ force: true });
198
+ const lifecycleTask2 = result2.taskResults.find(t => t.taskName === 'playbook-lifecycle-review');
199
+ expect(lifecycleTask2).toBeDefined();
200
+ const details2 = lifecycleTask2!.details as Record<string, unknown>;
201
+ expect(details2.skipped).toBe(true);
202
+
203
+ // Third maintenance (cycle 2) — should run again (2 % 2 === 0)
204
+ const result3 = await pipeline.runMaintenance({ force: true });
205
+ const lifecycleTask3 = result3.taskResults.find(t => t.taskName === 'playbook-lifecycle-review');
206
+ expect(lifecycleTask3).toBeDefined();
207
+ const details3 = lifecycleTask3!.details as Record<string, unknown>;
208
+ expect(details3.totalPlaybooks).toBeDefined();
209
+ });
210
+
211
+ it('lifecycle review returns portfolio snapshot data', async () => {
212
+ await memory.playbooks.add(makePlaybook({ name: 'pb-1', confidence: 0.9 }));
213
+ await memory.playbooks.add(makePlaybook({ name: 'pb-2', confidence: 0.4, domain: 'python' }));
214
+
215
+ pipeline = createUnifiedPipeline(memory, {
216
+ batch: { learning: { minTrajectories: 100 }, energy: { countThreshold: 100 } },
217
+ features: { healing: false },
218
+ efficacy: { minPlaybooks: 1, minAnnotations: 0, lifecycleReviewFrequency: 1 },
219
+ }, persistence);
220
+ await pipeline.init();
221
+
222
+ const result = await pipeline.runMaintenance({ force: true });
223
+
224
+ const lifecycleTask = result.taskResults.find(t => t.taskName === 'playbook-lifecycle-review');
225
+ expect(lifecycleTask).toBeDefined();
226
+ const details = lifecycleTask!.details as Record<string, unknown>;
227
+ expect(details.totalPlaybooks).toBe(2);
228
+ expect(details.snapshot).toBeDefined();
229
+ const snapshot = details.snapshot as Record<string, unknown>;
230
+ expect(snapshot.confidenceBands).toBeDefined();
231
+ });
232
+ });