cognitive-core 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (972) hide show
  1. package/.claude/settings.json +88 -0
  2. package/.claude/settings.local.json +11 -0
  3. package/.entire/settings.json +4 -0
  4. package/CLAUDE.md +233 -0
  5. package/README.md +841 -255
  6. package/dist/atlas.d.ts +150 -12
  7. package/dist/atlas.d.ts.map +1 -1
  8. package/dist/atlas.js +391 -31
  9. package/dist/atlas.js.map +1 -1
  10. package/dist/bin/cli-utils.d.ts +37 -0
  11. package/dist/bin/cli-utils.d.ts.map +1 -0
  12. package/dist/bin/cli-utils.js +176 -0
  13. package/dist/bin/cli-utils.js.map +1 -0
  14. package/dist/bin/cognitive-core.d.ts +2 -12
  15. package/dist/bin/cognitive-core.d.ts.map +1 -1
  16. package/dist/bin/cognitive-core.js +76 -351
  17. package/dist/bin/cognitive-core.js.map +1 -1
  18. package/dist/bin/commands/kb.d.ts +6 -0
  19. package/dist/bin/commands/kb.d.ts.map +1 -0
  20. package/dist/bin/commands/kb.js +240 -0
  21. package/dist/bin/commands/kb.js.map +1 -0
  22. package/dist/bin/commands/learn.d.ts +6 -0
  23. package/dist/bin/commands/learn.d.ts.map +1 -0
  24. package/dist/bin/commands/learn.js +91 -0
  25. package/dist/bin/commands/learn.js.map +1 -0
  26. package/dist/bin/commands/legacy.d.ts +12 -0
  27. package/dist/bin/commands/legacy.d.ts.map +1 -0
  28. package/dist/bin/commands/legacy.js +142 -0
  29. package/dist/bin/commands/legacy.js.map +1 -0
  30. package/dist/bin/commands/run.d.ts +3 -0
  31. package/dist/bin/commands/run.d.ts.map +1 -0
  32. package/dist/bin/commands/run.js +99 -0
  33. package/dist/bin/commands/run.js.map +1 -0
  34. package/dist/bin/commands/sessions.d.ts +9 -0
  35. package/dist/bin/commands/sessions.d.ts.map +1 -0
  36. package/dist/bin/commands/sessions.js +183 -0
  37. package/dist/bin/commands/sessions.js.map +1 -0
  38. package/dist/bin/commands/skills.d.ts +6 -0
  39. package/dist/bin/commands/skills.d.ts.map +1 -0
  40. package/dist/bin/commands/skills.js +135 -0
  41. package/dist/bin/commands/skills.js.map +1 -0
  42. package/dist/embeddings/index.d.ts +1 -0
  43. package/dist/embeddings/index.d.ts.map +1 -1
  44. package/dist/embeddings/index.js +2 -0
  45. package/dist/embeddings/index.js.map +1 -1
  46. package/dist/embeddings/inverted-index.d.ts +47 -0
  47. package/dist/embeddings/inverted-index.d.ts.map +1 -0
  48. package/dist/embeddings/inverted-index.js +122 -0
  49. package/dist/embeddings/inverted-index.js.map +1 -0
  50. package/dist/embeddings/manager.d.ts +3 -1
  51. package/dist/embeddings/manager.d.ts.map +1 -1
  52. package/dist/embeddings/manager.js +12 -7
  53. package/dist/embeddings/manager.js.map +1 -1
  54. package/dist/embeddings/provider.d.ts.map +1 -1
  55. package/dist/embeddings/provider.js +6 -3
  56. package/dist/embeddings/provider.js.map +1 -1
  57. package/dist/embeddings/vector-store.d.ts +7 -3
  58. package/dist/embeddings/vector-store.d.ts.map +1 -1
  59. package/dist/embeddings/vector-store.js +22 -6
  60. package/dist/embeddings/vector-store.js.map +1 -1
  61. package/dist/factory.d.ts +11 -12
  62. package/dist/factory.d.ts.map +1 -1
  63. package/dist/factory.js +20 -7
  64. package/dist/factory.js.map +1 -1
  65. package/dist/index.d.ts +11 -8
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +71 -8
  68. package/dist/index.js.map +1 -1
  69. package/dist/learning/analyzer.d.ts.map +1 -1
  70. package/dist/learning/analyzer.js +17 -35
  71. package/dist/learning/analyzer.js.map +1 -1
  72. package/dist/learning/energy-evaluator.d.ts +128 -0
  73. package/dist/learning/energy-evaluator.d.ts.map +1 -0
  74. package/dist/learning/energy-evaluator.js +175 -0
  75. package/dist/learning/energy-evaluator.js.map +1 -0
  76. package/dist/learning/healing-orchestrator.d.ts +182 -0
  77. package/dist/learning/healing-orchestrator.d.ts.map +1 -0
  78. package/dist/learning/healing-orchestrator.js +250 -0
  79. package/dist/learning/healing-orchestrator.js.map +1 -0
  80. package/dist/learning/index.d.ts +11 -2
  81. package/dist/learning/index.d.ts.map +1 -1
  82. package/dist/learning/index.js +20 -3
  83. package/dist/learning/index.js.map +1 -1
  84. package/dist/learning/instant-loop.d.ts +87 -0
  85. package/dist/learning/instant-loop.d.ts.map +1 -0
  86. package/dist/learning/instant-loop.js +264 -0
  87. package/dist/learning/instant-loop.js.map +1 -0
  88. package/dist/learning/knowledge-extractor.d.ts +56 -0
  89. package/dist/learning/knowledge-extractor.d.ts.map +1 -0
  90. package/dist/learning/knowledge-extractor.js +336 -0
  91. package/dist/learning/knowledge-extractor.js.map +1 -0
  92. package/dist/learning/loop-coordinator.d.ts +61 -0
  93. package/dist/learning/loop-coordinator.d.ts.map +1 -0
  94. package/dist/learning/loop-coordinator.js +96 -0
  95. package/dist/learning/loop-coordinator.js.map +1 -0
  96. package/dist/learning/maintenance-scheduler.d.ts +141 -0
  97. package/dist/learning/maintenance-scheduler.d.ts.map +1 -0
  98. package/dist/learning/maintenance-scheduler.js +186 -0
  99. package/dist/learning/maintenance-scheduler.js.map +1 -0
  100. package/dist/learning/meta-learner.d.ts +7 -0
  101. package/dist/learning/meta-learner.d.ts.map +1 -1
  102. package/dist/learning/meta-learner.js +47 -21
  103. package/dist/learning/meta-learner.js.map +1 -1
  104. package/dist/learning/pipeline.d.ts +55 -4
  105. package/dist/learning/pipeline.d.ts.map +1 -1
  106. package/dist/learning/pipeline.js +134 -16
  107. package/dist/learning/pipeline.js.map +1 -1
  108. package/dist/learning/reflexion-generator.d.ts +64 -0
  109. package/dist/learning/reflexion-generator.d.ts.map +1 -0
  110. package/dist/learning/reflexion-generator.js +194 -0
  111. package/dist/learning/reflexion-generator.js.map +1 -0
  112. package/dist/learning/team-ingester.d.ts +152 -0
  113. package/dist/learning/team-ingester.d.ts.map +1 -0
  114. package/dist/learning/team-ingester.js +333 -0
  115. package/dist/learning/team-ingester.js.map +1 -0
  116. package/dist/learning/team-meta-learner.d.ts +50 -0
  117. package/dist/learning/team-meta-learner.d.ts.map +1 -0
  118. package/dist/learning/team-meta-learner.js +417 -0
  119. package/dist/learning/team-meta-learner.js.map +1 -0
  120. package/dist/learning/team-pipeline.d.ts +76 -0
  121. package/dist/learning/team-pipeline.d.ts.map +1 -0
  122. package/dist/learning/team-pipeline.js +266 -0
  123. package/dist/learning/team-pipeline.js.map +1 -0
  124. package/dist/learning/trajectory-sources/dataclaw.d.ts +41 -0
  125. package/dist/learning/trajectory-sources/dataclaw.d.ts.map +1 -0
  126. package/dist/learning/trajectory-sources/dataclaw.js +330 -0
  127. package/dist/learning/trajectory-sources/dataclaw.js.map +1 -0
  128. package/dist/learning/trajectory-sources/entire.d.ts +31 -0
  129. package/dist/learning/trajectory-sources/entire.d.ts.map +1 -0
  130. package/dist/learning/trajectory-sources/entire.js +189 -0
  131. package/dist/learning/trajectory-sources/entire.js.map +1 -0
  132. package/dist/learning/trajectory-sources/file.d.ts +23 -0
  133. package/dist/learning/trajectory-sources/file.d.ts.map +1 -0
  134. package/dist/learning/trajectory-sources/file.js +101 -0
  135. package/dist/learning/trajectory-sources/file.js.map +1 -0
  136. package/dist/learning/trajectory-sources/huggingface.d.ts +36 -0
  137. package/dist/learning/trajectory-sources/huggingface.d.ts.map +1 -0
  138. package/dist/learning/trajectory-sources/huggingface.js +157 -0
  139. package/dist/learning/trajectory-sources/huggingface.js.map +1 -0
  140. package/dist/learning/trajectory-sources/in-memory.d.ts +21 -0
  141. package/dist/learning/trajectory-sources/in-memory.d.ts.map +1 -0
  142. package/dist/learning/trajectory-sources/in-memory.js +43 -0
  143. package/dist/learning/trajectory-sources/in-memory.js.map +1 -0
  144. package/dist/learning/trajectory-sources/index.d.ts +7 -0
  145. package/dist/learning/trajectory-sources/index.d.ts.map +1 -0
  146. package/dist/learning/trajectory-sources/index.js +7 -0
  147. package/dist/learning/trajectory-sources/index.js.map +1 -0
  148. package/dist/learning/trajectory-sources/pipeline.d.ts +24 -0
  149. package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -0
  150. package/dist/learning/trajectory-sources/pipeline.js +47 -0
  151. package/dist/learning/trajectory-sources/pipeline.js.map +1 -0
  152. package/dist/learning/unified-pipeline.d.ts +281 -0
  153. package/dist/learning/unified-pipeline.d.ts.map +1 -0
  154. package/dist/learning/unified-pipeline.js +637 -0
  155. package/dist/learning/unified-pipeline.js.map +1 -0
  156. package/dist/memory/candidate-retrieval.d.ts +43 -0
  157. package/dist/memory/candidate-retrieval.d.ts.map +1 -0
  158. package/dist/memory/candidate-retrieval.js +41 -0
  159. package/dist/memory/candidate-retrieval.js.map +1 -0
  160. package/dist/memory/causal-store.d.ts +97 -0
  161. package/dist/memory/causal-store.d.ts.map +1 -0
  162. package/dist/memory/causal-store.js +209 -0
  163. package/dist/memory/causal-store.js.map +1 -0
  164. package/dist/memory/coherence.d.ts +71 -0
  165. package/dist/memory/coherence.d.ts.map +1 -0
  166. package/dist/memory/coherence.js +176 -0
  167. package/dist/memory/coherence.js.map +1 -0
  168. package/dist/memory/experience.d.ts +39 -6
  169. package/dist/memory/experience.d.ts.map +1 -1
  170. package/dist/memory/experience.js +193 -49
  171. package/dist/memory/experience.js.map +1 -1
  172. package/dist/memory/graph-layers/base.d.ts +29 -0
  173. package/dist/memory/graph-layers/base.d.ts.map +1 -0
  174. package/dist/memory/graph-layers/base.js +143 -0
  175. package/dist/memory/graph-layers/base.js.map +1 -0
  176. package/dist/memory/graph-layers/causal.d.ts +14 -0
  177. package/dist/memory/graph-layers/causal.d.ts.map +1 -0
  178. package/dist/memory/graph-layers/causal.js +14 -0
  179. package/dist/memory/graph-layers/causal.js.map +1 -0
  180. package/dist/memory/graph-layers/entity.d.ts +14 -0
  181. package/dist/memory/graph-layers/entity.d.ts.map +1 -0
  182. package/dist/memory/graph-layers/entity.js +14 -0
  183. package/dist/memory/graph-layers/entity.js.map +1 -0
  184. package/dist/memory/graph-layers/index.d.ts +6 -0
  185. package/dist/memory/graph-layers/index.d.ts.map +1 -0
  186. package/dist/memory/graph-layers/index.js +6 -0
  187. package/dist/memory/graph-layers/index.js.map +1 -0
  188. package/dist/memory/graph-layers/semantic.d.ts +14 -0
  189. package/dist/memory/graph-layers/semantic.d.ts.map +1 -0
  190. package/dist/memory/graph-layers/semantic.js +14 -0
  191. package/dist/memory/graph-layers/semantic.js.map +1 -0
  192. package/dist/memory/graph-layers/temporal.d.ts +14 -0
  193. package/dist/memory/graph-layers/temporal.d.ts.map +1 -0
  194. package/dist/memory/graph-layers/temporal.js +14 -0
  195. package/dist/memory/graph-layers/temporal.js.map +1 -0
  196. package/dist/memory/index.d.ts +15 -0
  197. package/dist/memory/index.d.ts.map +1 -1
  198. package/dist/memory/index.js +22 -0
  199. package/dist/memory/index.js.map +1 -1
  200. package/dist/memory/knowledge-bank.d.ts +234 -0
  201. package/dist/memory/knowledge-bank.d.ts.map +1 -0
  202. package/dist/memory/knowledge-bank.js +1048 -0
  203. package/dist/memory/knowledge-bank.js.map +1 -0
  204. package/dist/memory/knowledge-defrag.d.ts +49 -0
  205. package/dist/memory/knowledge-defrag.d.ts.map +1 -0
  206. package/dist/memory/knowledge-defrag.js +257 -0
  207. package/dist/memory/knowledge-defrag.js.map +1 -0
  208. package/dist/memory/knowledge-graph.d.ts +41 -0
  209. package/dist/memory/knowledge-graph.d.ts.map +1 -0
  210. package/dist/memory/knowledge-graph.js +273 -0
  211. package/dist/memory/knowledge-graph.js.map +1 -0
  212. package/dist/memory/meta.d.ts +7 -8
  213. package/dist/memory/meta.d.ts.map +1 -1
  214. package/dist/memory/meta.js +73 -79
  215. package/dist/memory/meta.js.map +1 -1
  216. package/dist/memory/playbook.d.ts +26 -9
  217. package/dist/memory/playbook.d.ts.map +1 -1
  218. package/dist/memory/playbook.js +198 -74
  219. package/dist/memory/playbook.js.map +1 -1
  220. package/dist/memory/reasoning-bank.d.ts +130 -0
  221. package/dist/memory/reasoning-bank.d.ts.map +1 -0
  222. package/dist/memory/reasoning-bank.js +342 -0
  223. package/dist/memory/reasoning-bank.js.map +1 -0
  224. package/dist/memory/reflexion.d.ts +59 -0
  225. package/dist/memory/reflexion.d.ts.map +1 -0
  226. package/dist/memory/reflexion.js +96 -0
  227. package/dist/memory/reflexion.js.map +1 -0
  228. package/dist/memory/search-provider.d.ts +31 -0
  229. package/dist/memory/search-provider.d.ts.map +1 -0
  230. package/dist/memory/search-provider.js +2 -0
  231. package/dist/memory/search-provider.js.map +1 -0
  232. package/dist/memory/search-providers/index.d.ts +3 -0
  233. package/dist/memory/search-providers/index.d.ts.map +1 -0
  234. package/dist/memory/search-providers/index.js +3 -0
  235. package/dist/memory/search-providers/index.js.map +1 -0
  236. package/dist/memory/search-providers/minimem.d.ts +43 -0
  237. package/dist/memory/search-providers/minimem.d.ts.map +1 -0
  238. package/dist/memory/search-providers/minimem.js +56 -0
  239. package/dist/memory/search-providers/minimem.js.map +1 -0
  240. package/dist/memory/search-providers/text-similarity.d.ts +15 -0
  241. package/dist/memory/search-providers/text-similarity.d.ts.map +1 -0
  242. package/dist/memory/search-providers/text-similarity.js +21 -0
  243. package/dist/memory/search-providers/text-similarity.js.map +1 -0
  244. package/dist/memory/skill-exporter.d.ts +75 -0
  245. package/dist/memory/skill-exporter.d.ts.map +1 -0
  246. package/dist/memory/skill-exporter.js +248 -0
  247. package/dist/memory/skill-exporter.js.map +1 -0
  248. package/dist/memory/system.d.ts +20 -3
  249. package/dist/memory/system.d.ts.map +1 -1
  250. package/dist/memory/system.js +61 -11
  251. package/dist/memory/system.js.map +1 -1
  252. package/dist/memory/team-experience.d.ts +298 -0
  253. package/dist/memory/team-experience.d.ts.map +1 -0
  254. package/dist/memory/team-experience.js +355 -0
  255. package/dist/memory/team-experience.js.map +1 -0
  256. package/dist/memory/temporal-compressor.d.ts +126 -0
  257. package/dist/memory/temporal-compressor.d.ts.map +1 -0
  258. package/dist/memory/temporal-compressor.js +335 -0
  259. package/dist/memory/temporal-compressor.js.map +1 -0
  260. package/dist/persistence/index.d.ts +11 -0
  261. package/dist/persistence/index.d.ts.map +1 -0
  262. package/dist/persistence/index.js +11 -0
  263. package/dist/persistence/index.js.map +1 -0
  264. package/dist/persistence/migrator.d.ts +40 -0
  265. package/dist/persistence/migrator.d.ts.map +1 -0
  266. package/dist/persistence/migrator.js +238 -0
  267. package/dist/persistence/migrator.js.map +1 -0
  268. package/dist/persistence/serializers.d.ts +45 -0
  269. package/dist/persistence/serializers.d.ts.map +1 -0
  270. package/dist/persistence/serializers.js +80 -0
  271. package/dist/persistence/serializers.js.map +1 -0
  272. package/dist/persistence/sqlite-persistence.d.ts +228 -0
  273. package/dist/persistence/sqlite-persistence.d.ts.map +1 -0
  274. package/dist/persistence/sqlite-persistence.js +588 -0
  275. package/dist/persistence/sqlite-persistence.js.map +1 -0
  276. package/dist/runtime/backends/acp-protocol.d.ts +49 -0
  277. package/dist/runtime/backends/acp-protocol.d.ts.map +1 -0
  278. package/dist/runtime/backends/acp-protocol.js +166 -0
  279. package/dist/runtime/backends/acp-protocol.js.map +1 -0
  280. package/dist/runtime/backends/acp.d.ts +26 -26
  281. package/dist/runtime/backends/acp.d.ts.map +1 -1
  282. package/dist/runtime/backends/acp.js +32 -156
  283. package/dist/runtime/backends/acp.js.map +1 -1
  284. package/dist/runtime/backends/index.d.ts +3 -1
  285. package/dist/runtime/backends/index.d.ts.map +1 -1
  286. package/dist/runtime/backends/index.js +3 -1
  287. package/dist/runtime/backends/index.js.map +1 -1
  288. package/dist/runtime/backends/macro-agent.d.ts +104 -0
  289. package/dist/runtime/backends/macro-agent.d.ts.map +1 -0
  290. package/dist/runtime/backends/macro-agent.js +107 -0
  291. package/dist/runtime/backends/macro-agent.js.map +1 -0
  292. package/dist/runtime/compute-provider.d.ts +87 -0
  293. package/dist/runtime/compute-provider.d.ts.map +1 -0
  294. package/dist/runtime/compute-provider.js +87 -0
  295. package/dist/runtime/compute-provider.js.map +1 -0
  296. package/dist/runtime/flows/learning.d.ts +10 -12
  297. package/dist/runtime/flows/learning.d.ts.map +1 -1
  298. package/dist/runtime/flows/learning.js +10 -23
  299. package/dist/runtime/flows/learning.js.map +1 -1
  300. package/dist/runtime/index.d.ts +3 -2
  301. package/dist/runtime/index.d.ts.map +1 -1
  302. package/dist/runtime/index.js +3 -1
  303. package/dist/runtime/index.js.map +1 -1
  304. package/dist/runtime/manager.d.ts +37 -4
  305. package/dist/runtime/manager.d.ts.map +1 -1
  306. package/dist/runtime/manager.js +139 -20
  307. package/dist/runtime/manager.js.map +1 -1
  308. package/dist/runtime/types.d.ts +38 -0
  309. package/dist/runtime/types.d.ts.map +1 -1
  310. package/dist/search/evaluator.d.ts +7 -0
  311. package/dist/search/evaluator.d.ts.map +1 -1
  312. package/dist/search/evaluator.js +24 -4
  313. package/dist/search/evaluator.js.map +1 -1
  314. package/dist/search/index.d.ts +2 -0
  315. package/dist/search/index.d.ts.map +1 -1
  316. package/dist/search/index.js +4 -0
  317. package/dist/search/index.js.map +1 -1
  318. package/dist/search/moe-gate.d.ts +124 -0
  319. package/dist/search/moe-gate.d.ts.map +1 -0
  320. package/dist/search/moe-gate.js +234 -0
  321. package/dist/search/moe-gate.js.map +1 -0
  322. package/dist/search/refinement-loop.d.ts +17 -0
  323. package/dist/search/refinement-loop.d.ts.map +1 -1
  324. package/dist/search/refinement-loop.js +77 -6
  325. package/dist/search/refinement-loop.js.map +1 -1
  326. package/dist/search/refinement-types.d.ts +2 -2
  327. package/dist/search/router.d.ts +32 -2
  328. package/dist/search/router.d.ts.map +1 -1
  329. package/dist/search/router.js +87 -4
  330. package/dist/search/router.js.map +1 -1
  331. package/dist/search/team-router.d.ts +91 -0
  332. package/dist/search/team-router.d.ts.map +1 -0
  333. package/dist/search/team-router.js +315 -0
  334. package/dist/search/team-router.js.map +1 -0
  335. package/dist/session-bank/git-reader.d.ts +44 -0
  336. package/dist/session-bank/git-reader.d.ts.map +1 -0
  337. package/dist/session-bank/git-reader.js +172 -0
  338. package/dist/session-bank/git-reader.js.map +1 -0
  339. package/dist/session-bank/index.d.ts +5 -0
  340. package/dist/session-bank/index.d.ts.map +1 -0
  341. package/dist/session-bank/index.js +4 -0
  342. package/dist/session-bank/index.js.map +1 -0
  343. package/dist/session-bank/parser.d.ts +50 -0
  344. package/dist/session-bank/parser.d.ts.map +1 -0
  345. package/dist/session-bank/parser.js +338 -0
  346. package/dist/session-bank/parser.js.map +1 -0
  347. package/dist/session-bank/session-bank.d.ts +40 -0
  348. package/dist/session-bank/session-bank.d.ts.map +1 -0
  349. package/dist/session-bank/session-bank.js +347 -0
  350. package/dist/session-bank/session-bank.js.map +1 -0
  351. package/dist/session-bank/types.d.ts +132 -0
  352. package/dist/session-bank/types.d.ts.map +1 -0
  353. package/dist/session-bank/types.js +7 -0
  354. package/dist/session-bank/types.js.map +1 -0
  355. package/dist/surfacing/index.d.ts +4 -0
  356. package/dist/surfacing/index.d.ts.map +1 -1
  357. package/dist/surfacing/index.js +3 -0
  358. package/dist/surfacing/index.js.map +1 -1
  359. package/dist/surfacing/publisher.d.ts +22 -0
  360. package/dist/surfacing/publisher.d.ts.map +1 -0
  361. package/dist/surfacing/publisher.js +9 -0
  362. package/dist/surfacing/publisher.js.map +1 -0
  363. package/dist/surfacing/skill-library.d.ts +12 -0
  364. package/dist/surfacing/skill-library.d.ts.map +1 -1
  365. package/dist/surfacing/skill-library.js +26 -0
  366. package/dist/surfacing/skill-library.js.map +1 -1
  367. package/dist/surfacing/skill-publisher.d.ts +43 -0
  368. package/dist/surfacing/skill-publisher.d.ts.map +1 -0
  369. package/dist/surfacing/skill-publisher.js +169 -0
  370. package/dist/surfacing/skill-publisher.js.map +1 -0
  371. package/dist/surfacing/sqlite-storage-adapter.d.ts +42 -0
  372. package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -0
  373. package/dist/surfacing/sqlite-storage-adapter.js +199 -0
  374. package/dist/surfacing/sqlite-storage-adapter.js.map +1 -0
  375. package/dist/surfacing/team-skill-library.d.ts +180 -0
  376. package/dist/surfacing/team-skill-library.d.ts.map +1 -0
  377. package/dist/surfacing/team-skill-library.js +384 -0
  378. package/dist/surfacing/team-skill-library.js.map +1 -0
  379. package/dist/types/config.d.ts +1318 -44
  380. package/dist/types/config.d.ts.map +1 -1
  381. package/dist/types/config.js +243 -0
  382. package/dist/types/config.js.map +1 -1
  383. package/dist/types/dataclaw.d.ts +286 -0
  384. package/dist/types/dataclaw.d.ts.map +1 -0
  385. package/dist/types/dataclaw.js +84 -0
  386. package/dist/types/dataclaw.js.map +1 -0
  387. package/dist/types/index.d.ts +9 -2
  388. package/dist/types/index.d.ts.map +1 -1
  389. package/dist/types/index.js +13 -1
  390. package/dist/types/index.js.map +1 -1
  391. package/dist/types/knowledge-graph.d.ts +148 -0
  392. package/dist/types/knowledge-graph.d.ts.map +1 -0
  393. package/dist/types/knowledge-graph.js +40 -0
  394. package/dist/types/knowledge-graph.js.map +1 -0
  395. package/dist/types/knowledge.d.ts +280 -0
  396. package/dist/types/knowledge.d.ts.map +1 -0
  397. package/dist/types/knowledge.js +191 -0
  398. package/dist/types/knowledge.js.map +1 -0
  399. package/dist/types/memory.d.ts +52 -0
  400. package/dist/types/memory.d.ts.map +1 -1
  401. package/dist/types/memory.js +13 -0
  402. package/dist/types/memory.js.map +1 -1
  403. package/dist/types/playbook.d.ts +4 -0
  404. package/dist/types/playbook.d.ts.map +1 -1
  405. package/dist/types/playbook.js.map +1 -1
  406. package/dist/types/team-meta.d.ts +160 -0
  407. package/dist/types/team-meta.d.ts.map +1 -0
  408. package/dist/types/team-meta.js +42 -0
  409. package/dist/types/team-meta.js.map +1 -0
  410. package/dist/types/team-playbook.d.ts +276 -0
  411. package/dist/types/team-playbook.d.ts.map +1 -0
  412. package/dist/types/team-playbook.js +85 -0
  413. package/dist/types/team-playbook.js.map +1 -0
  414. package/dist/types/team-trajectory.d.ts +305 -0
  415. package/dist/types/team-trajectory.d.ts.map +1 -0
  416. package/dist/types/team-trajectory.js +304 -0
  417. package/dist/types/team-trajectory.js.map +1 -0
  418. package/dist/types/trajectory-source.d.ts +39 -0
  419. package/dist/types/trajectory-source.d.ts.map +1 -0
  420. package/dist/types/trajectory-source.js +2 -0
  421. package/dist/types/trajectory-source.js.map +1 -0
  422. package/dist/utils/error-classifier.d.ts +30 -0
  423. package/dist/utils/error-classifier.d.ts.map +1 -0
  424. package/dist/utils/error-classifier.js +85 -0
  425. package/dist/utils/error-classifier.js.map +1 -0
  426. package/dist/utils/frontmatter.d.ts +34 -0
  427. package/dist/utils/frontmatter.d.ts.map +1 -0
  428. package/dist/utils/frontmatter.js +93 -0
  429. package/dist/utils/frontmatter.js.map +1 -0
  430. package/dist/utils/index.d.ts +4 -0
  431. package/dist/utils/index.d.ts.map +1 -1
  432. package/dist/utils/index.js +4 -0
  433. package/dist/utils/index.js.map +1 -1
  434. package/dist/utils/partitioned-store.d.ts +93 -0
  435. package/dist/utils/partitioned-store.d.ts.map +1 -0
  436. package/dist/utils/partitioned-store.js +251 -0
  437. package/dist/utils/partitioned-store.js.map +1 -0
  438. package/dist/utils/trajectory-helpers.d.ts +39 -0
  439. package/dist/utils/trajectory-helpers.d.ts.map +1 -0
  440. package/dist/utils/trajectory-helpers.js +57 -0
  441. package/dist/utils/trajectory-helpers.js.map +1 -0
  442. package/dist/workspace/index.d.ts +6 -0
  443. package/dist/workspace/index.d.ts.map +1 -0
  444. package/dist/workspace/index.js +11 -0
  445. package/dist/workspace/index.js.map +1 -0
  446. package/dist/workspace/runner.d.ts +49 -0
  447. package/dist/workspace/runner.d.ts.map +1 -0
  448. package/dist/workspace/runner.js +219 -0
  449. package/dist/workspace/runner.js.map +1 -0
  450. package/dist/workspace/skill-converter.d.ts +18 -0
  451. package/dist/workspace/skill-converter.d.ts.map +1 -0
  452. package/dist/workspace/skill-converter.js +257 -0
  453. package/dist/workspace/skill-converter.js.map +1 -0
  454. package/dist/workspace/templates/index.d.ts +11 -0
  455. package/dist/workspace/templates/index.d.ts.map +1 -0
  456. package/dist/workspace/templates/index.js +21 -0
  457. package/dist/workspace/templates/index.js.map +1 -0
  458. package/dist/workspace/templates/knowledge-defrag.d.ts +25 -0
  459. package/dist/workspace/templates/knowledge-defrag.d.ts.map +1 -0
  460. package/dist/workspace/templates/knowledge-defrag.js +154 -0
  461. package/dist/workspace/templates/knowledge-defrag.js.map +1 -0
  462. package/dist/workspace/templates/knowledge-extraction.d.ts +25 -0
  463. package/dist/workspace/templates/knowledge-extraction.d.ts.map +1 -0
  464. package/dist/workspace/templates/knowledge-extraction.js +246 -0
  465. package/dist/workspace/templates/knowledge-extraction.js.map +1 -0
  466. package/dist/workspace/templates/meta-reflection.d.ts +47 -0
  467. package/dist/workspace/templates/meta-reflection.d.ts.map +1 -0
  468. package/dist/workspace/templates/meta-reflection.js +135 -0
  469. package/dist/workspace/templates/meta-reflection.js.map +1 -0
  470. package/dist/workspace/templates/playbook-extraction.d.ts +20 -0
  471. package/dist/workspace/templates/playbook-extraction.d.ts.map +1 -0
  472. package/dist/workspace/templates/playbook-extraction.js +189 -0
  473. package/dist/workspace/templates/playbook-extraction.js.map +1 -0
  474. package/dist/workspace/templates/refinement-analysis.d.ts +31 -0
  475. package/dist/workspace/templates/refinement-analysis.d.ts.map +1 -0
  476. package/dist/workspace/templates/refinement-analysis.js +107 -0
  477. package/dist/workspace/templates/refinement-analysis.js.map +1 -0
  478. package/dist/workspace/templates/solution-evaluation.d.ts +21 -0
  479. package/dist/workspace/templates/solution-evaluation.d.ts.map +1 -0
  480. package/dist/workspace/templates/solution-evaluation.js +131 -0
  481. package/dist/workspace/templates/solution-evaluation.js.map +1 -0
  482. package/dist/workspace/templates/team-playbook-extraction.d.ts +44 -0
  483. package/dist/workspace/templates/team-playbook-extraction.d.ts.map +1 -0
  484. package/dist/workspace/templates/team-playbook-extraction.js +497 -0
  485. package/dist/workspace/templates/team-playbook-extraction.js.map +1 -0
  486. package/dist/workspace/templates/team-trajectory-analysis.d.ts +19 -0
  487. package/dist/workspace/templates/team-trajectory-analysis.d.ts.map +1 -0
  488. package/dist/workspace/templates/team-trajectory-analysis.js +442 -0
  489. package/dist/workspace/templates/team-trajectory-analysis.js.map +1 -0
  490. package/dist/workspace/templates/trajectory-analysis.d.ts +19 -0
  491. package/dist/workspace/templates/trajectory-analysis.d.ts.map +1 -0
  492. package/dist/workspace/templates/trajectory-analysis.js +170 -0
  493. package/dist/workspace/templates/trajectory-analysis.js.map +1 -0
  494. package/dist/workspace/templates/usage-inference.d.ts +19 -0
  495. package/dist/workspace/templates/usage-inference.d.ts.map +1 -0
  496. package/dist/workspace/templates/usage-inference.js +125 -0
  497. package/dist/workspace/templates/usage-inference.js.map +1 -0
  498. package/dist/workspace/types.d.ts +152 -0
  499. package/dist/workspace/types.d.ts.map +1 -0
  500. package/dist/workspace/types.js +17 -0
  501. package/dist/workspace/types.js.map +1 -0
  502. package/docs/DESIGN-agentic-workspace.md +2057 -0
  503. package/docs/DESIGN-semantic-memory-knowledge-bank.md +1789 -0
  504. package/docs/DESIGN-session-bank.md +1134 -0
  505. package/docs/DESIGN-team-extraction-pipeline.md +1369 -0
  506. package/docs/PROPOSAL-team-aware-learning.md +1080 -0
  507. package/docs/RESEARCH-semantic-memory-knowledge-structures.md +517 -0
  508. package/docs/RESEARCH-team-trajectory-learning.md +553 -0
  509. package/gaps.md +204 -0
  510. package/package.json +27 -7
  511. package/references/agent-workspace/CLAUDE.md +74 -0
  512. package/references/agent-workspace/README.md +587 -0
  513. package/references/agent-workspace/media/banner.png +0 -0
  514. package/references/agent-workspace/package-lock.json +2061 -0
  515. package/references/agent-workspace/package.json +54 -0
  516. package/references/agent-workspace/src/handle.ts +122 -0
  517. package/references/agent-workspace/src/index.ts +32 -0
  518. package/references/agent-workspace/src/manager.ts +102 -0
  519. package/references/agent-workspace/src/readers/json.ts +71 -0
  520. package/references/agent-workspace/src/readers/markdown.ts +37 -0
  521. package/references/agent-workspace/src/readers/raw.ts +27 -0
  522. package/references/agent-workspace/src/types.ts +68 -0
  523. package/references/agent-workspace/src/validation.ts +93 -0
  524. package/references/agent-workspace/src/writers/json.ts +17 -0
  525. package/references/agent-workspace/src/writers/markdown.ts +27 -0
  526. package/references/agent-workspace/src/writers/raw.ts +22 -0
  527. package/references/agent-workspace/tests/errors.test.ts +652 -0
  528. package/references/agent-workspace/tests/handle.test.ts +144 -0
  529. package/references/agent-workspace/tests/manager.test.ts +124 -0
  530. package/references/agent-workspace/tests/readers.test.ts +205 -0
  531. package/references/agent-workspace/tests/validation.test.ts +196 -0
  532. package/references/agent-workspace/tests/writers.test.ts +108 -0
  533. package/references/agent-workspace/tsconfig.json +20 -0
  534. package/references/agent-workspace/tsup.config.ts +9 -0
  535. package/references/minimem/.claude/settings.json +7 -0
  536. package/references/minimem/.sudocode/issues.jsonl +18 -0
  537. package/references/minimem/.sudocode/specs.jsonl +1 -0
  538. package/references/minimem/CLAUDE.md +310 -0
  539. package/references/minimem/README.md +556 -0
  540. package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
  541. package/references/minimem/claude-plugin/.mcp.json +7 -0
  542. package/references/minimem/claude-plugin/README.md +158 -0
  543. package/references/minimem/claude-plugin/commands/recall.md +47 -0
  544. package/references/minimem/claude-plugin/commands/remember.md +41 -0
  545. package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
  546. package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
  547. package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
  548. package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
  549. package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
  550. package/references/minimem/package-lock.json +5373 -0
  551. package/references/minimem/package.json +60 -0
  552. package/references/minimem/scripts/postbuild.js +35 -0
  553. package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
  554. package/references/minimem/src/__tests__/errors.test.ts +265 -0
  555. package/references/minimem/src/__tests__/helpers.ts +199 -0
  556. package/references/minimem/src/__tests__/internal.test.ts +407 -0
  557. package/references/minimem/src/__tests__/knowledge.test.ts +287 -0
  558. package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
  559. package/references/minimem/src/__tests__/session.test.ts +190 -0
  560. package/references/minimem/src/cli/__tests__/commands.test.ts +759 -0
  561. package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
  562. package/references/minimem/src/cli/commands/append.ts +76 -0
  563. package/references/minimem/src/cli/commands/config.ts +262 -0
  564. package/references/minimem/src/cli/commands/conflicts.ts +413 -0
  565. package/references/minimem/src/cli/commands/daemon.ts +169 -0
  566. package/references/minimem/src/cli/commands/index.ts +12 -0
  567. package/references/minimem/src/cli/commands/init.ts +88 -0
  568. package/references/minimem/src/cli/commands/mcp.ts +177 -0
  569. package/references/minimem/src/cli/commands/push-pull.ts +213 -0
  570. package/references/minimem/src/cli/commands/search.ts +158 -0
  571. package/references/minimem/src/cli/commands/status.ts +84 -0
  572. package/references/minimem/src/cli/commands/sync-init.ts +290 -0
  573. package/references/minimem/src/cli/commands/sync.ts +70 -0
  574. package/references/minimem/src/cli/commands/upsert.ts +197 -0
  575. package/references/minimem/src/cli/config.ts +584 -0
  576. package/references/minimem/src/cli/index.ts +264 -0
  577. package/references/minimem/src/cli/shared.ts +161 -0
  578. package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
  579. package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
  580. package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
  581. package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
  582. package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
  583. package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
  584. package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
  585. package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
  586. package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
  587. package/references/minimem/src/cli/sync/central.ts +292 -0
  588. package/references/minimem/src/cli/sync/conflicts.ts +204 -0
  589. package/references/minimem/src/cli/sync/daemon.ts +407 -0
  590. package/references/minimem/src/cli/sync/detection.ts +138 -0
  591. package/references/minimem/src/cli/sync/index.ts +107 -0
  592. package/references/minimem/src/cli/sync/operations.ts +373 -0
  593. package/references/minimem/src/cli/sync/registry.ts +279 -0
  594. package/references/minimem/src/cli/sync/state.ts +355 -0
  595. package/references/minimem/src/cli/sync/validation.ts +206 -0
  596. package/references/minimem/src/cli/sync/watcher.ts +234 -0
  597. package/references/minimem/src/cli/version.ts +34 -0
  598. package/references/minimem/src/core/index.ts +9 -0
  599. package/references/minimem/src/core/indexer.ts +628 -0
  600. package/references/minimem/src/core/searcher.ts +221 -0
  601. package/references/minimem/src/db/schema.ts +183 -0
  602. package/references/minimem/src/db/sqlite-vec.ts +24 -0
  603. package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
  604. package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
  605. package/references/minimem/src/embeddings/batch-openai.ts +409 -0
  606. package/references/minimem/src/embeddings/embeddings.ts +434 -0
  607. package/references/minimem/src/index.ts +109 -0
  608. package/references/minimem/src/internal.ts +299 -0
  609. package/references/minimem/src/minimem.ts +1276 -0
  610. package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
  611. package/references/minimem/src/search/graph.ts +234 -0
  612. package/references/minimem/src/search/hybrid.ts +151 -0
  613. package/references/minimem/src/search/search.ts +256 -0
  614. package/references/minimem/src/server/__tests__/mcp.test.ts +341 -0
  615. package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
  616. package/references/minimem/src/server/mcp.ts +326 -0
  617. package/references/minimem/src/server/tools.ts +720 -0
  618. package/references/minimem/src/session.ts +460 -0
  619. package/references/minimem/tsconfig.json +19 -0
  620. package/references/minimem/tsup.config.ts +26 -0
  621. package/references/minimem/vitest.config.ts +24 -0
  622. package/references/sessionlog/.husky/pre-commit +1 -0
  623. package/references/sessionlog/.lintstagedrc.json +4 -0
  624. package/references/sessionlog/.prettierignore +4 -0
  625. package/references/sessionlog/.prettierrc.json +11 -0
  626. package/references/sessionlog/LICENSE +21 -0
  627. package/references/sessionlog/README.md +453 -0
  628. package/references/sessionlog/eslint.config.js +58 -0
  629. package/references/sessionlog/package-lock.json +3672 -0
  630. package/references/sessionlog/package.json +65 -0
  631. package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
  632. package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
  633. package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
  634. package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
  635. package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
  636. package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
  637. package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
  638. package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
  639. package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
  640. package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
  641. package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
  642. package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
  643. package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
  644. package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
  645. package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
  646. package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
  647. package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
  648. package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
  649. package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
  650. package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
  651. package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
  652. package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
  653. package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
  654. package/references/sessionlog/src/__tests__/types.test.ts +166 -0
  655. package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
  656. package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
  657. package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
  658. package/references/sessionlog/src/agent/agents/claude-code.ts +1089 -0
  659. package/references/sessionlog/src/agent/agents/cursor.ts +361 -0
  660. package/references/sessionlog/src/agent/agents/gemini-cli.ts +632 -0
  661. package/references/sessionlog/src/agent/agents/opencode.ts +540 -0
  662. package/references/sessionlog/src/agent/registry.ts +143 -0
  663. package/references/sessionlog/src/agent/session-types.ts +113 -0
  664. package/references/sessionlog/src/agent/types.ts +220 -0
  665. package/references/sessionlog/src/cli.ts +597 -0
  666. package/references/sessionlog/src/commands/clean.ts +133 -0
  667. package/references/sessionlog/src/commands/disable.ts +84 -0
  668. package/references/sessionlog/src/commands/doctor.ts +145 -0
  669. package/references/sessionlog/src/commands/enable.ts +202 -0
  670. package/references/sessionlog/src/commands/explain.ts +261 -0
  671. package/references/sessionlog/src/commands/reset.ts +105 -0
  672. package/references/sessionlog/src/commands/resume.ts +180 -0
  673. package/references/sessionlog/src/commands/rewind.ts +195 -0
  674. package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
  675. package/references/sessionlog/src/commands/status.ts +172 -0
  676. package/references/sessionlog/src/config.ts +165 -0
  677. package/references/sessionlog/src/events/event-log.ts +126 -0
  678. package/references/sessionlog/src/git-operations.ts +558 -0
  679. package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
  680. package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
  681. package/references/sessionlog/src/index.ts +650 -0
  682. package/references/sessionlog/src/security/redaction.ts +283 -0
  683. package/references/sessionlog/src/session/state-machine.ts +452 -0
  684. package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
  685. package/references/sessionlog/src/store/native-store.ts +173 -0
  686. package/references/sessionlog/src/store/provider-types.ts +99 -0
  687. package/references/sessionlog/src/store/session-store.ts +266 -0
  688. package/references/sessionlog/src/strategy/attribution.ts +296 -0
  689. package/references/sessionlog/src/strategy/common.ts +207 -0
  690. package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
  691. package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
  692. package/references/sessionlog/src/strategy/types.ts +279 -0
  693. package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
  694. package/references/sessionlog/src/summarize/summarize.ts +432 -0
  695. package/references/sessionlog/src/types.ts +508 -0
  696. package/references/sessionlog/src/utils/chunk-files.ts +49 -0
  697. package/references/sessionlog/src/utils/commit-message.ts +65 -0
  698. package/references/sessionlog/src/utils/detect-agent.ts +36 -0
  699. package/references/sessionlog/src/utils/hook-managers.ts +125 -0
  700. package/references/sessionlog/src/utils/ide-tags.ts +32 -0
  701. package/references/sessionlog/src/utils/paths.ts +79 -0
  702. package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
  703. package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
  704. package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
  705. package/references/sessionlog/src/utils/string-utils.ts +46 -0
  706. package/references/sessionlog/src/utils/todo-extract.ts +188 -0
  707. package/references/sessionlog/src/utils/trailers.ts +187 -0
  708. package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
  709. package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
  710. package/references/sessionlog/src/utils/tree-ops.ts +219 -0
  711. package/references/sessionlog/src/utils/tty.ts +72 -0
  712. package/references/sessionlog/src/utils/validation.ts +65 -0
  713. package/references/sessionlog/src/utils/worktree.ts +58 -0
  714. package/references/sessionlog/src/wire-types.ts +59 -0
  715. package/references/sessionlog/templates/setup-env.sh +153 -0
  716. package/references/sessionlog/tsconfig.json +18 -0
  717. package/references/sessionlog/vitest.config.ts +12 -0
  718. package/references/skill-tree/.claude/settings.json +6 -0
  719. package/references/skill-tree/.sudocode/issues.jsonl +19 -0
  720. package/references/skill-tree/.sudocode/specs.jsonl +3 -0
  721. package/references/skill-tree/CLAUDE.md +126 -0
  722. package/references/skill-tree/README.md +372 -0
  723. package/references/skill-tree/docs/GAPS_v1.md +221 -0
  724. package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
  725. package/references/skill-tree/docs/TODOS.md +91 -0
  726. package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
  727. package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
  728. package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
  729. package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
  730. package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
  731. package/references/skill-tree/docs/scraper/README.md +170 -0
  732. package/references/skill-tree/examples/basic-usage.ts +164 -0
  733. package/references/skill-tree/package-lock.json +1852 -0
  734. package/references/skill-tree/package.json +66 -0
  735. package/references/skill-tree/scraper/README.md +123 -0
  736. package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
  737. package/references/skill-tree/scraper/docs/PLAN.md +336 -0
  738. package/references/skill-tree/scraper/drizzle.config.ts +10 -0
  739. package/references/skill-tree/scraper/package-lock.json +6329 -0
  740. package/references/skill-tree/scraper/package.json +68 -0
  741. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
  742. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
  743. package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
  744. package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
  745. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
  746. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
  747. package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
  748. package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
  749. package/references/skill-tree/scraper/tsup.config.ts +14 -0
  750. package/references/skill-tree/scraper/vitest.config.ts +17 -0
  751. package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
  752. package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
  753. package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
  754. package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
  755. package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
  756. package/references/skill-tree/test/run-all.ts +106 -0
  757. package/references/skill-tree/test/utils.ts +128 -0
  758. package/references/skill-tree/vitest.config.ts +16 -0
  759. package/src/atlas.ts +583 -41
  760. package/src/bin/cli-utils.ts +220 -0
  761. package/src/bin/cognitive-core.ts +84 -392
  762. package/src/bin/commands/kb.ts +266 -0
  763. package/src/bin/commands/learn.ts +100 -0
  764. package/src/bin/commands/legacy.ts +182 -0
  765. package/src/bin/commands/run.ts +113 -0
  766. package/src/bin/commands/sessions.ts +221 -0
  767. package/src/bin/commands/skills.ts +146 -0
  768. package/src/embeddings/index.ts +3 -0
  769. package/src/embeddings/inverted-index.ts +134 -0
  770. package/src/embeddings/manager.ts +13 -8
  771. package/src/embeddings/provider.ts +10 -3
  772. package/src/embeddings/vector-store.ts +21 -9
  773. package/src/factory.ts +33 -16
  774. package/src/index.ts +231 -9
  775. package/src/learning/analyzer.ts +21 -37
  776. package/src/learning/energy-evaluator.ts +282 -0
  777. package/src/learning/healing-orchestrator.ts +383 -0
  778. package/src/learning/index.ts +104 -13
  779. package/src/learning/instant-loop.ts +357 -0
  780. package/src/learning/knowledge-extractor.ts +470 -0
  781. package/src/learning/maintenance-scheduler.ts +271 -0
  782. package/src/learning/meta-learner.ts +59 -23
  783. package/src/learning/reflexion-generator.ts +273 -0
  784. package/src/learning/team-ingester.ts +499 -0
  785. package/src/learning/team-meta-learner.ts +558 -0
  786. package/src/learning/team-pipeline.ts +364 -0
  787. package/src/learning/trajectory-sources/dataclaw.ts +403 -0
  788. package/src/learning/trajectory-sources/entire.ts +251 -0
  789. package/src/learning/trajectory-sources/file.ts +136 -0
  790. package/src/learning/trajectory-sources/huggingface.ts +248 -0
  791. package/src/learning/trajectory-sources/in-memory.ts +61 -0
  792. package/src/learning/trajectory-sources/index.ts +15 -0
  793. package/src/learning/trajectory-sources/pipeline.ts +69 -0
  794. package/src/learning/unified-pipeline.ts +921 -0
  795. package/src/memory/candidate-retrieval.ts +71 -0
  796. package/src/memory/causal-store.ts +273 -0
  797. package/src/memory/coherence.ts +252 -0
  798. package/src/memory/experience.ts +217 -50
  799. package/src/memory/graph-layers/base.ts +184 -0
  800. package/src/memory/graph-layers/causal.ts +16 -0
  801. package/src/memory/graph-layers/entity.ts +16 -0
  802. package/src/memory/graph-layers/index.ts +5 -0
  803. package/src/memory/graph-layers/semantic.ts +16 -0
  804. package/src/memory/graph-layers/temporal.ts +16 -0
  805. package/src/memory/index.ts +88 -0
  806. package/src/memory/knowledge-bank.ts +1317 -0
  807. package/src/memory/knowledge-defrag.ts +329 -0
  808. package/src/memory/knowledge-graph.ts +361 -0
  809. package/src/memory/meta.ts +78 -96
  810. package/src/memory/playbook.ts +239 -75
  811. package/src/memory/reasoning-bank.ts +458 -0
  812. package/src/memory/reflexion.ts +122 -0
  813. package/src/memory/search-provider.ts +35 -0
  814. package/src/memory/search-providers/index.ts +3 -0
  815. package/src/memory/search-providers/minimem.ts +84 -0
  816. package/src/memory/search-providers/text-similarity.ts +35 -0
  817. package/src/memory/skill-exporter.ts +357 -0
  818. package/src/memory/system.ts +80 -11
  819. package/src/memory/team-experience.ts +604 -0
  820. package/src/memory/temporal-compressor.ts +409 -0
  821. package/src/persistence/index.ts +37 -0
  822. package/src/persistence/migrator.ts +298 -0
  823. package/src/persistence/serializers.ts +79 -0
  824. package/src/persistence/sqlite-persistence.ts +925 -0
  825. package/src/runtime/backends/acp-protocol.ts +231 -0
  826. package/src/runtime/backends/acp.ts +57 -196
  827. package/src/runtime/backends/index.ts +14 -0
  828. package/src/runtime/backends/macro-agent.ts +177 -0
  829. package/src/runtime/compute-provider.ts +206 -0
  830. package/src/runtime/flows/learning.ts +25 -42
  831. package/src/runtime/index.ts +22 -0
  832. package/src/runtime/manager.ts +167 -23
  833. package/src/runtime/types.ts +41 -0
  834. package/src/search/evaluator.ts +29 -4
  835. package/src/search/index.ts +19 -0
  836. package/src/search/moe-gate.ts +304 -0
  837. package/src/search/refinement-loop.ts +106 -12
  838. package/src/search/router.ts +111 -4
  839. package/src/search/team-router.ts +459 -0
  840. package/src/session-bank/git-reader.ts +200 -0
  841. package/src/session-bank/index.ts +26 -0
  842. package/src/session-bank/parser.ts +548 -0
  843. package/src/session-bank/session-bank.ts +485 -0
  844. package/src/session-bank/types.ts +176 -0
  845. package/src/surfacing/index.ts +23 -0
  846. package/src/surfacing/publisher.ts +23 -0
  847. package/src/surfacing/skill-library.ts +31 -0
  848. package/src/surfacing/skill-publisher.ts +191 -0
  849. package/src/surfacing/sqlite-storage-adapter.ts +285 -0
  850. package/src/surfacing/team-skill-library.ts +610 -0
  851. package/src/types/config.ts +282 -0
  852. package/src/types/dataclaw.ts +99 -0
  853. package/src/types/huggingface-transformers.d.ts +12 -0
  854. package/src/types/index.ts +159 -0
  855. package/src/types/knowledge-graph.ts +246 -0
  856. package/src/types/knowledge.ts +388 -0
  857. package/src/types/memory.ts +30 -0
  858. package/src/types/playbook.ts +4 -0
  859. package/src/types/team-meta.ts +212 -0
  860. package/src/types/team-playbook.ts +384 -0
  861. package/src/types/team-trajectory.ts +673 -0
  862. package/src/types/trajectory-source.ts +47 -0
  863. package/src/utils/error-classifier.ts +113 -0
  864. package/src/utils/frontmatter.ts +118 -0
  865. package/src/utils/index.ts +25 -0
  866. package/src/utils/partitioned-store.ts +299 -0
  867. package/src/utils/trajectory-helpers.ts +79 -0
  868. package/src/workspace/index.ts +48 -0
  869. package/src/workspace/runner.ts +281 -0
  870. package/src/workspace/skill-converter.ts +288 -0
  871. package/src/workspace/templates/index.ts +64 -0
  872. package/src/workspace/templates/knowledge-defrag.ts +223 -0
  873. package/src/workspace/templates/knowledge-extraction.ts +337 -0
  874. package/src/workspace/templates/meta-reflection.ts +208 -0
  875. package/src/workspace/templates/playbook-extraction.ts +240 -0
  876. package/src/workspace/templates/refinement-analysis.ts +162 -0
  877. package/src/workspace/templates/solution-evaluation.ts +199 -0
  878. package/src/workspace/templates/team-playbook-extraction.ts +631 -0
  879. package/src/workspace/templates/team-trajectory-analysis.ts +564 -0
  880. package/src/workspace/templates/trajectory-analysis.ts +234 -0
  881. package/src/workspace/templates/usage-inference.ts +163 -0
  882. package/src/workspace/types.ts +241 -0
  883. package/tests/atlas-knowledge.test.ts +165 -0
  884. package/tests/embeddings/inverted-index.test.ts +138 -0
  885. package/tests/feature-toggles.test.ts +275 -0
  886. package/tests/gap-fixes.test.ts +1116 -0
  887. package/tests/integration/cli-e2e.test.ts +621 -0
  888. package/tests/integration/dataclaw-e2e.test.ts +559 -0
  889. package/tests/integration/e2e.test.ts +412 -4
  890. package/tests/integration/entire-e2e.test.ts +376 -0
  891. package/tests/integration/huggingface-e2e.test.ts +627 -0
  892. package/tests/integration/persistence-e2e.test.ts +741 -0
  893. package/tests/integration/phase-e2e.test.ts +1143 -0
  894. package/tests/integration/session-bank.test.ts +231 -0
  895. package/tests/integration/sessionlog-e2e.test.ts +329 -0
  896. package/tests/integration/skill-tree-wiring.test.ts +152 -0
  897. package/tests/integration/unified-pipeline-e2e.test.ts +634 -0
  898. package/tests/learning/analyzer.test.ts +1 -1
  899. package/tests/learning/dataclaw-trajectory-source.test.ts +642 -0
  900. package/tests/learning/energy-evaluator.test.ts +180 -0
  901. package/tests/learning/entire-trajectory-source.test.ts +380 -0
  902. package/tests/learning/healing-orchestrator.test.ts +269 -0
  903. package/tests/learning/huggingface-trajectory-source.test.ts +817 -0
  904. package/tests/learning/instant-loop.test.ts +243 -0
  905. package/tests/learning/knowledge-extractor.test.ts +491 -0
  906. package/tests/learning/maintenance-scheduler.test.ts +191 -0
  907. package/tests/learning/reflexion-generator.test.ts +411 -0
  908. package/tests/learning/team-ingester.test.ts +349 -0
  909. package/tests/learning/team-meta-learner.test.ts +618 -0
  910. package/tests/learning/team-pipeline.test.ts +334 -0
  911. package/tests/learning/trajectory-sources.test.ts +320 -0
  912. package/tests/learning/unified-pipeline.test.ts +322 -0
  913. package/tests/mcp/playbook-server.test.ts +6 -1
  914. package/tests/memory/causal-store.test.ts +276 -0
  915. package/tests/memory/coherence.test.ts +232 -0
  916. package/tests/memory/experience.test.ts +8 -3
  917. package/tests/memory/graph-layers/semantic.test.ts +219 -0
  918. package/tests/memory/knowledge-bank-extraction.test.ts +558 -0
  919. package/tests/memory/knowledge-bank.test.ts +705 -0
  920. package/tests/memory/knowledge-defrag.test.ts +366 -0
  921. package/tests/memory/knowledge-evolution.test.ts +563 -0
  922. package/tests/memory/knowledge-graph.test.ts +492 -0
  923. package/tests/memory/knowledge-inbox.test.ts +258 -0
  924. package/tests/memory/knowledge-minimem.test.ts +251 -0
  925. package/tests/memory/playbook.test.ts +307 -1
  926. package/tests/memory/provenance.test.ts +11 -2
  927. package/tests/memory/reasoning-bank.test.ts +239 -0
  928. package/tests/memory/reflexion.test.ts +166 -0
  929. package/tests/memory/skill-exporter.test.ts +475 -0
  930. package/tests/memory/system.test.ts +6 -1
  931. package/tests/memory/team-experience.test.ts +411 -0
  932. package/tests/memory/temporal-compressor.test.ts +318 -0
  933. package/tests/persistence/migrator.test.ts +1009 -0
  934. package/tests/persistence/sqlite-persistence.test.ts +635 -0
  935. package/tests/runtime/agent-manager.test.ts +7 -2
  936. package/tests/runtime/compute-provider.test.ts +288 -0
  937. package/tests/runtime/delegate.test.ts +354 -0
  938. package/tests/runtime/macro-agent-backend.test.ts +266 -0
  939. package/tests/search/moe-gate.test.ts +250 -0
  940. package/tests/search/refinement-loop.test.ts +11 -2
  941. package/tests/search/router.test.ts +81 -2
  942. package/tests/search/team-router.test.ts +376 -0
  943. package/tests/session-bank/fixtures/multi-tool-session/full.jsonl +12 -0
  944. package/tests/session-bank/fixtures/multi-tool-session/metadata.json +28 -0
  945. package/tests/session-bank/fixtures/root-metadata.json +18 -0
  946. package/tests/session-bank/fixtures/sessionlog-root-metadata.json +16 -0
  947. package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +6 -0
  948. package/tests/session-bank/fixtures/sessionlog-session/metadata.json +55 -0
  949. package/tests/session-bank/fixtures/simple-session/full.jsonl +6 -0
  950. package/tests/session-bank/fixtures/simple-session/metadata.json +38 -0
  951. package/tests/session-bank/git-reader.test.ts +232 -0
  952. package/tests/session-bank/parser.test.ts +453 -0
  953. package/tests/session-bank/session-bank.test.ts +546 -0
  954. package/tests/surfacing/skill-library.test.ts +6 -1
  955. package/tests/surfacing/skill-publisher.test.ts +364 -0
  956. package/tests/surfacing/sqlite-storage-adapter.test.ts +206 -0
  957. package/tests/surfacing/team-skill-library.test.ts +444 -0
  958. package/tests/types/team-meta.test.ts +147 -0
  959. package/tests/types/team-playbook.test.ts +246 -0
  960. package/tests/types/team-trajectory.test.ts +557 -0
  961. package/tests/utils/frontmatter.test.ts +208 -0
  962. package/tests/utils/partitioned-store.test.ts +230 -0
  963. package/tests/workspace/full-flow.test.ts +845 -0
  964. package/tests/workspace/manager.test.ts +215 -0
  965. package/tests/workspace/runner.test.ts +336 -0
  966. package/tests/workspace/skill-converter.test.ts +205 -0
  967. package/tests/workspace/templates/knowledge-extraction.test.ts +235 -0
  968. package/tests/workspace/templates/team-playbook-extraction.test.ts +341 -0
  969. package/tests/workspace/templates/team-trajectory-analysis.test.ts +417 -0
  970. package/src/learning/llm-extractor.ts +0 -542
  971. package/src/learning/pipeline.ts +0 -244
  972. package/tests/learning/pipeline.test.ts +0 -176
@@ -0,0 +1,1009 @@
1
+ /**
2
+ * Tests for JsonToSqliteMigrator — one-time migration from JSON files to SQLite.
3
+ *
4
+ * Creates real JSON file fixtures on disk to simulate the old storage layout,
5
+ * then runs the migrator against them and verifies the data lands in SQLite.
6
+ */
7
+
8
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
9
+ import { mkdtempSync, rmSync, mkdirSync, writeFileSync, existsSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { tmpdir } from 'node:os';
12
+ import { SqlitePersistence, createSqlitePersistence } from '../../src/persistence/sqlite-persistence.js';
13
+ import { JsonToSqliteMigrator, runMigration } from '../../src/persistence/migrator.js';
14
+ import type { MigrationResult } from '../../src/persistence/migrator.js';
15
+
16
+ // ============================================================================
17
+ // JSON fixture helpers
18
+ // ============================================================================
19
+
20
+ /** Write a single JSON object to a file inside a collection directory. */
21
+ function writeJsonFixture(baseDir: string, collection: string, filename: string, data: unknown): void {
22
+ const dir = join(baseDir, collection);
23
+ if (!existsSync(dir)) {
24
+ mkdirSync(dir, { recursive: true });
25
+ }
26
+ writeFileSync(join(dir, filename), JSON.stringify(data), 'utf-8');
27
+ }
28
+
29
+ /** Write a JSON file into a partitioned subdirectory (collection/partition/filename). */
30
+ function writePartitionedFixture(
31
+ baseDir: string,
32
+ collection: string,
33
+ partition: string,
34
+ filename: string,
35
+ data: unknown,
36
+ ): void {
37
+ const dir = join(baseDir, collection, partition);
38
+ if (!existsSync(dir)) {
39
+ mkdirSync(dir, { recursive: true });
40
+ }
41
+ writeFileSync(join(dir, filename), JSON.stringify(data), 'utf-8');
42
+ }
43
+
44
+ // ============================================================================
45
+ // Fixture data factories — raw JSON objects as they would be stored on disk
46
+ // ============================================================================
47
+
48
+ function makeExperienceJson(overrides: Record<string, unknown> = {}): Record<string, unknown> {
49
+ return {
50
+ id: 'exp-1',
51
+ taskInput: 'Fix the login bug',
52
+ solutionOutput: 'Updated auth middleware',
53
+ feedback: 'Works well',
54
+ success: true,
55
+ domain: 'code',
56
+ trajectoryId: 'traj-1',
57
+ usageCount: 2,
58
+ accessScore: 0.5,
59
+ retrievalCount: 1,
60
+ tier: 'hot',
61
+ metadata: { tool: 'grep' },
62
+ createdAt: '2024-01-15T00:00:00.000Z',
63
+ lastAccessedAt: '2024-02-01T00:00:00.000Z',
64
+ ...overrides,
65
+ };
66
+ }
67
+
68
+ function makePlaybookJson(overrides: Record<string, unknown> = {}): Record<string, unknown> {
69
+ return {
70
+ id: 'pb-1',
71
+ name: 'Error Handling Strategy',
72
+ applicability: {
73
+ situations: ['error handling'],
74
+ triggers: ['try-catch needed'],
75
+ antiPatterns: ['silent catch'],
76
+ domains: ['code'],
77
+ },
78
+ guidance: {
79
+ strategy: 'Use structured error handling',
80
+ tactics: ['validate inputs', 'log errors'],
81
+ },
82
+ verification: {
83
+ successIndicators: ['no unhandled errors'],
84
+ failureIndicators: ['silent failures'],
85
+ },
86
+ evolution: {
87
+ version: '1.0.0',
88
+ createdFrom: ['traj-1'],
89
+ failures: [],
90
+ refinements: [],
91
+ successCount: 3,
92
+ failureCount: 1,
93
+ lastUsed: '2024-03-01T00:00:00.000Z',
94
+ },
95
+ confidence: 0.75,
96
+ complexity: 'moderate',
97
+ estimatedEffort: 3,
98
+ createdAt: '2024-01-01T00:00:00.000Z',
99
+ updatedAt: '2024-01-02T00:00:00.000Z',
100
+ ...overrides,
101
+ };
102
+ }
103
+
104
+ function makeReflexionJson(overrides: Record<string, unknown> = {}): Record<string, unknown> {
105
+ return {
106
+ id: 'ref-1',
107
+ trajectoryId: 'traj-1',
108
+ taskSummary: 'Fixed auth bug',
109
+ outcome: 'success',
110
+ selfCritique: 'Could have been faster',
111
+ keyInsights: ['check middleware first'],
112
+ strategyAssessment: 'good approach',
113
+ suggestedPlaybookUpdates: ['update error-handling playbook'],
114
+ domain: 'code',
115
+ createdAt: '2024-01-01T00:00:00.000Z',
116
+ ...overrides,
117
+ };
118
+ }
119
+
120
+ function makeMetaObservationJson(overrides: Record<string, unknown> = {}): Record<string, unknown> {
121
+ return {
122
+ id: 'obs-1',
123
+ trajectoryId: 'traj-1',
124
+ routing: { decision: 'adapt', confidence: 0.8, reasoning: 'similar past experience' },
125
+ memoryUsage: { experiencesRetrieved: 3, playbooksApplied: ['pb-1'], retrievalQuality: 'helpful' },
126
+ execution: { decompositionUsed: false, refinementIterations: 1, backtrackingOccurred: false, toolsUsed: ['grep'] },
127
+ outcome: { success: true, quality: 'good', effortActual: 5, effortEstimate: 8 },
128
+ lessons: { whatWorked: ['experience retrieval'], whatFailed: [], suggestions: [] },
129
+ timestamp: '2024-01-01T00:00:00.000Z',
130
+ ...overrides,
131
+ };
132
+ }
133
+
134
+ function makeMetaStrategyJson(overrides: Record<string, unknown> = {}): Record<string, unknown> {
135
+ return {
136
+ id: 'strat-1',
137
+ name: 'Experience-heavy retrieval',
138
+ condition: { taskCharacteristics: ['familiar domain'], memoryState: ['many experiences'] },
139
+ adjustment: {
140
+ routingBias: { adapt: 0.2 },
141
+ retrievalModification: 'expand query',
142
+ executionHint: 'prefer decomposition',
143
+ },
144
+ applicationCount: 5,
145
+ successRate: 0.8,
146
+ createdAt: '2024-01-01T00:00:00.000Z',
147
+ updatedAt: '2024-01-02T00:00:00.000Z',
148
+ ...overrides,
149
+ };
150
+ }
151
+
152
+ function makeCausalEdgeJson(overrides: Record<string, unknown> = {}): Record<string, unknown> {
153
+ return {
154
+ id: 'edge-1',
155
+ cause: 'missing validation',
156
+ effect: 'runtime error',
157
+ confidence: 0.9,
158
+ domain: 'code',
159
+ sourceTrajectoryIds: ['traj-1', 'traj-2'],
160
+ observedCount: 3,
161
+ createdAt: '2024-01-01T00:00:00.000Z',
162
+ updatedAt: '2024-01-02T00:00:00.000Z',
163
+ ...overrides,
164
+ };
165
+ }
166
+
167
+ // ============================================================================
168
+ // Tests
169
+ // ============================================================================
170
+
171
+ describe('JsonToSqliteMigrator', () => {
172
+ let persistence: SqlitePersistence;
173
+ let tmpDir: string;
174
+
175
+ beforeEach(async () => {
176
+ tmpDir = mkdtempSync(join(tmpdir(), 'migrator-test-'));
177
+ persistence = createSqlitePersistence({ baseDir: tmpDir });
178
+ await persistence.init();
179
+ });
180
+
181
+ afterEach(() => {
182
+ persistence.close();
183
+ rmSync(tmpDir, { recursive: true, force: true });
184
+ });
185
+
186
+ // --------------------------------------------------------------------------
187
+ // Experience migration
188
+ // --------------------------------------------------------------------------
189
+
190
+ describe('experience migration', () => {
191
+ it('should migrate a single experience from a JSON file', async () => {
192
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson());
193
+
194
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
195
+ const result = await migrator.migrate();
196
+
197
+ expect(result.migrated).toBe(true);
198
+ expect(result.counts.experiences).toBe(1);
199
+
200
+ const row = persistence.getExperience('exp-1');
201
+ expect(row).toBeDefined();
202
+ expect(row!.task_input).toBe('Fix the login bug');
203
+ expect(row!.solution_output).toBe('Updated auth middleware');
204
+ expect(row!.success).toBe(1);
205
+ expect(row!.domain).toBe('code');
206
+ expect(row!.trajectory_id).toBe('traj-1');
207
+ expect(row!.usage_count).toBe(2);
208
+ expect(row!.tier).toBe('hot');
209
+ });
210
+
211
+ it('should migrate multiple experiences', async () => {
212
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson({ id: 'exp-1' }));
213
+ writeJsonFixture(tmpDir, 'experiences', 'exp-2.json', makeExperienceJson({ id: 'exp-2', domain: 'data' }));
214
+ writeJsonFixture(tmpDir, 'experiences', 'exp-3.json', makeExperienceJson({ id: 'exp-3', success: false }));
215
+
216
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
217
+ const result = await migrator.migrate();
218
+
219
+ expect(result.counts.experiences).toBe(3);
220
+ expect(persistence.getExperienceCount()).toBe(3);
221
+ });
222
+
223
+ it('should migrate experiences from partitioned subdirectories', async () => {
224
+ writePartitionedFixture(tmpDir, 'experiences', 'code', 'exp-1.json', makeExperienceJson({ id: 'exp-1' }));
225
+ writePartitionedFixture(tmpDir, 'experiences', 'data', 'exp-2.json', makeExperienceJson({ id: 'exp-2', domain: 'data' }));
226
+
227
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
228
+ const result = await migrator.migrate();
229
+
230
+ expect(result.counts.experiences).toBe(2);
231
+ expect(persistence.getExperience('exp-1')).toBeDefined();
232
+ expect(persistence.getExperience('exp-2')).toBeDefined();
233
+ });
234
+
235
+ it('should handle experiences with missing optional fields', async () => {
236
+ // Minimal experience — no embedding, no lastAccessedAt, no compressed, no metadata
237
+ const minimal = {
238
+ id: 'exp-min',
239
+ taskInput: 'task',
240
+ solutionOutput: 'solution',
241
+ feedback: 'ok',
242
+ success: true,
243
+ domain: 'general',
244
+ trajectoryId: 'traj-99',
245
+ createdAt: '2024-06-01T00:00:00.000Z',
246
+ };
247
+ writeJsonFixture(tmpDir, 'experiences', 'exp-min.json', minimal);
248
+
249
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
250
+ const result = await migrator.migrate();
251
+
252
+ expect(result.counts.experiences).toBe(1);
253
+ const row = persistence.getExperience('exp-min');
254
+ expect(row).toBeDefined();
255
+ expect(row!.usage_count).toBe(0);
256
+ expect(row!.access_score).toBe(0);
257
+ expect(row!.tier).toBe('hot');
258
+ });
259
+
260
+ it('should handle experiences with embeddings', async () => {
261
+ const embedding = [0.1, 0.2, 0.3];
262
+ writeJsonFixture(tmpDir, 'experiences', 'exp-emb.json', makeExperienceJson({ id: 'exp-emb', embedding }));
263
+
264
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
265
+ await migrator.migrate();
266
+
267
+ const row = persistence.getExperience('exp-emb');
268
+ expect(row).toBeDefined();
269
+ expect(row!.embedding).toBeDefined();
270
+ expect(row!.embedding).toBeInstanceOf(Buffer);
271
+ });
272
+ });
273
+
274
+ // --------------------------------------------------------------------------
275
+ // Playbook migration
276
+ // --------------------------------------------------------------------------
277
+
278
+ describe('playbook migration', () => {
279
+ it('should migrate a single playbook from a JSON file', async () => {
280
+ writeJsonFixture(tmpDir, 'playbooks', 'pb-1.json', makePlaybookJson());
281
+
282
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
283
+ const result = await migrator.migrate();
284
+
285
+ expect(result.migrated).toBe(true);
286
+ expect(result.counts.playbooks).toBe(1);
287
+
288
+ const row = persistence.getPlaybook('pb-1');
289
+ expect(row).toBeDefined();
290
+ expect(row!.name).toBe('Error Handling Strategy');
291
+ expect(row!.confidence).toBe(0.75);
292
+ expect(row!.complexity).toBe('moderate');
293
+ expect(row!.primary_domain).toBe('code');
294
+ expect(row!.success_count).toBe(3);
295
+ expect(row!.failure_count).toBe(1);
296
+ expect(row!.version).toBe('1.0.0');
297
+ });
298
+
299
+ it('should migrate multiple playbooks', async () => {
300
+ writeJsonFixture(tmpDir, 'playbooks', 'pb-1.json', makePlaybookJson({ id: 'pb-1' }));
301
+ writeJsonFixture(tmpDir, 'playbooks', 'pb-2.json', makePlaybookJson({ id: 'pb-2', name: 'Another' }));
302
+
303
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
304
+ const result = await migrator.migrate();
305
+
306
+ expect(result.counts.playbooks).toBe(2);
307
+ expect(persistence.getPlaybookCount()).toBe(2);
308
+ });
309
+
310
+ it('should preserve playbook JSON sub-fields', async () => {
311
+ writeJsonFixture(tmpDir, 'playbooks', 'pb-1.json', makePlaybookJson());
312
+
313
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
314
+ await migrator.migrate();
315
+
316
+ const row = persistence.getPlaybook('pb-1');
317
+ const applicability = JSON.parse(row!.applicability);
318
+ expect(applicability.situations).toContain('error handling');
319
+ expect(applicability.domains).toContain('code');
320
+
321
+ const guidance = JSON.parse(row!.guidance);
322
+ expect(guidance.strategy).toBe('Use structured error handling');
323
+ expect(guidance.tactics).toEqual(['validate inputs', 'log errors']);
324
+ });
325
+
326
+ it('should handle playbooks with provenance', async () => {
327
+ const withProvenance = makePlaybookJson({
328
+ id: 'pb-prov',
329
+ provenance: {
330
+ origin: 'curated',
331
+ sourceFile: 'playbooks/test.json',
332
+ recordedAt: '2024-05-01T00:00:00.000Z',
333
+ },
334
+ });
335
+ writeJsonFixture(tmpDir, 'playbooks', 'pb-prov.json', withProvenance);
336
+
337
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
338
+ await migrator.migrate();
339
+
340
+ const row = persistence.getPlaybook('pb-prov');
341
+ expect(row).toBeDefined();
342
+ expect(row!.origin).toBe('curated');
343
+ expect(row!.provenance).toBeDefined();
344
+ const provenance = JSON.parse(row!.provenance!);
345
+ expect(provenance.origin).toBe('curated');
346
+ expect(provenance.sourceFile).toBe('playbooks/test.json');
347
+ });
348
+
349
+ it('should handle playbooks with missing optional evolution fields', async () => {
350
+ const minimal = makePlaybookJson({
351
+ id: 'pb-min',
352
+ evolution: {},
353
+ });
354
+ writeJsonFixture(tmpDir, 'playbooks', 'pb-min.json', minimal);
355
+
356
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
357
+ await migrator.migrate();
358
+
359
+ const row = persistence.getPlaybook('pb-min');
360
+ expect(row).toBeDefined();
361
+ expect(row!.version).toBe('1.0.0');
362
+ expect(row!.success_count).toBe(0);
363
+ expect(row!.failure_count).toBe(0);
364
+ });
365
+
366
+ it('should migrate playbooks from partitioned subdirectories', async () => {
367
+ writePartitionedFixture(tmpDir, 'playbooks', 'code', 'pb-1.json', makePlaybookJson({ id: 'pb-1' }));
368
+ writePartitionedFixture(tmpDir, 'playbooks', 'data', 'pb-2.json', makePlaybookJson({ id: 'pb-2' }));
369
+
370
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
371
+ const result = await migrator.migrate();
372
+
373
+ expect(result.counts.playbooks).toBe(2);
374
+ });
375
+ });
376
+
377
+ // --------------------------------------------------------------------------
378
+ // Reflexion episode migration
379
+ // --------------------------------------------------------------------------
380
+
381
+ describe('reflexion episode migration', () => {
382
+ it('should migrate a reflexion episode from a JSON file', async () => {
383
+ writeJsonFixture(tmpDir, 'reflexion-episodes', 'ref-1.json', makeReflexionJson());
384
+
385
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
386
+ const result = await migrator.migrate();
387
+
388
+ expect(result.migrated).toBe(true);
389
+ expect(result.counts.reflexionEpisodes).toBe(1);
390
+
391
+ const row = persistence.getReflexionEpisode('ref-1');
392
+ expect(row).toBeDefined();
393
+ expect(row!.outcome).toBe('success');
394
+ expect(row!.domain).toBe('code');
395
+ expect(row!.task_summary).toBe('Fixed auth bug');
396
+ expect(row!.self_critique).toBe('Could have been faster');
397
+ });
398
+
399
+ it('should migrate multiple reflexion episodes', async () => {
400
+ writeJsonFixture(tmpDir, 'reflexion-episodes', 'ref-1.json', makeReflexionJson({ id: 'ref-1' }));
401
+ writeJsonFixture(tmpDir, 'reflexion-episodes', 'ref-2.json', makeReflexionJson({ id: 'ref-2', outcome: 'failure' }));
402
+ writeJsonFixture(tmpDir, 'reflexion-episodes', 'ref-3.json', makeReflexionJson({ id: 'ref-3', outcome: 'partial' }));
403
+
404
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
405
+ const result = await migrator.migrate();
406
+
407
+ expect(result.counts.reflexionEpisodes).toBe(3);
408
+ });
409
+
410
+ it('should preserve key insights and suggested updates as JSON arrays', async () => {
411
+ writeJsonFixture(tmpDir, 'reflexion-episodes', 'ref-1.json', makeReflexionJson());
412
+
413
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
414
+ await migrator.migrate();
415
+
416
+ const row = persistence.getReflexionEpisode('ref-1');
417
+ const keyInsights = JSON.parse(row!.key_insights);
418
+ expect(keyInsights).toEqual(['check middleware first']);
419
+
420
+ const suggestedUpdates = JSON.parse(row!.suggested_playbook_updates);
421
+ expect(suggestedUpdates).toEqual(['update error-handling playbook']);
422
+ });
423
+
424
+ it('should handle reflexion episodes with missing optional arrays', async () => {
425
+ const minimal = {
426
+ id: 'ref-min',
427
+ trajectoryId: 'traj-99',
428
+ taskSummary: 'Did a thing',
429
+ outcome: 'success',
430
+ selfCritique: 'ok',
431
+ strategyAssessment: 'fine',
432
+ domain: 'general',
433
+ createdAt: '2024-06-01T00:00:00.000Z',
434
+ };
435
+ writeJsonFixture(tmpDir, 'reflexion-episodes', 'ref-min.json', minimal);
436
+
437
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
438
+ const result = await migrator.migrate();
439
+
440
+ expect(result.counts.reflexionEpisodes).toBe(1);
441
+ const row = persistence.getReflexionEpisode('ref-min');
442
+ expect(row).toBeDefined();
443
+ const keyInsights = JSON.parse(row!.key_insights);
444
+ expect(keyInsights).toEqual([]);
445
+ });
446
+ });
447
+
448
+ // --------------------------------------------------------------------------
449
+ // Meta observation migration
450
+ // --------------------------------------------------------------------------
451
+
452
+ describe('meta observation migration', () => {
453
+ it('should migrate a meta observation from a JSON file', async () => {
454
+ writeJsonFixture(tmpDir, 'meta-observations', 'obs-1.json', makeMetaObservationJson());
455
+
456
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
457
+ const result = await migrator.migrate();
458
+
459
+ expect(result.migrated).toBe(true);
460
+ expect(result.counts.metaObservations).toBe(1);
461
+
462
+ const row = persistence.getMetaObservation('obs-1');
463
+ expect(row).toBeDefined();
464
+ expect(row!.routing_decision).toBe('adapt');
465
+ expect(row!.outcome_success).toBe(1);
466
+ expect(row!.trajectory_id).toBe('traj-1');
467
+ });
468
+
469
+ it('should migrate multiple meta observations', async () => {
470
+ writeJsonFixture(tmpDir, 'meta-observations', 'obs-1.json', makeMetaObservationJson({ id: 'obs-1' }));
471
+ writeJsonFixture(tmpDir, 'meta-observations', 'obs-2.json', makeMetaObservationJson({
472
+ id: 'obs-2',
473
+ routing: { decision: 'direct', confidence: 0.5, reasoning: 'test' },
474
+ }));
475
+
476
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
477
+ const result = await migrator.migrate();
478
+
479
+ expect(result.counts.metaObservations).toBe(2);
480
+ });
481
+
482
+ it('should preserve routing and outcome JSON sub-objects', async () => {
483
+ writeJsonFixture(tmpDir, 'meta-observations', 'obs-1.json', makeMetaObservationJson());
484
+
485
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
486
+ await migrator.migrate();
487
+
488
+ const row = persistence.getMetaObservation('obs-1');
489
+ const routing = JSON.parse(row!.routing);
490
+ expect(routing.decision).toBe('adapt');
491
+ expect(routing.confidence).toBe(0.8);
492
+
493
+ const outcome = JSON.parse(row!.outcome);
494
+ expect(outcome.success).toBe(true);
495
+ expect(outcome.quality).toBe('good');
496
+ });
497
+
498
+ it('should handle meta observations with missing optional fields', async () => {
499
+ const minimal = {
500
+ id: 'obs-min',
501
+ trajectoryId: 'traj-99',
502
+ routing: { decision: 'fallback', confidence: 0.3, reasoning: 'no data' },
503
+ outcome: { success: false, quality: 'poor', effortActual: 10, effortEstimate: 2 },
504
+ timestamp: '2024-06-01T00:00:00.000Z',
505
+ };
506
+ writeJsonFixture(tmpDir, 'meta-observations', 'obs-min.json', minimal);
507
+
508
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
509
+ const result = await migrator.migrate();
510
+
511
+ expect(result.counts.metaObservations).toBe(1);
512
+ const row = persistence.getMetaObservation('obs-min');
513
+ expect(row).toBeDefined();
514
+ expect(row!.routing_decision).toBe('fallback');
515
+ expect(row!.outcome_success).toBe(0);
516
+ });
517
+ });
518
+
519
+ // --------------------------------------------------------------------------
520
+ // Meta strategy migration
521
+ // --------------------------------------------------------------------------
522
+
523
+ describe('meta strategy migration', () => {
524
+ it('should migrate a meta strategy from a JSON file', async () => {
525
+ writeJsonFixture(tmpDir, 'meta-strategies', 'strat-1.json', makeMetaStrategyJson());
526
+
527
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
528
+ const result = await migrator.migrate();
529
+
530
+ expect(result.migrated).toBe(true);
531
+ expect(result.counts.metaStrategies).toBe(1);
532
+
533
+ const row = persistence.getMetaStrategy('strat-1');
534
+ expect(row).toBeDefined();
535
+ expect(row!.name).toBe('Experience-heavy retrieval');
536
+ expect(row!.application_count).toBe(5);
537
+ expect(row!.success_rate).toBe(0.8);
538
+ });
539
+
540
+ it('should migrate multiple meta strategies', async () => {
541
+ writeJsonFixture(tmpDir, 'meta-strategies', 'strat-1.json', makeMetaStrategyJson({ id: 'strat-1', name: 'Strategy A' }));
542
+ writeJsonFixture(tmpDir, 'meta-strategies', 'strat-2.json', makeMetaStrategyJson({ id: 'strat-2', name: 'Strategy B' }));
543
+
544
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
545
+ const result = await migrator.migrate();
546
+
547
+ expect(result.counts.metaStrategies).toBe(2);
548
+ });
549
+
550
+ it('should preserve condition and adjustment JSON sub-objects', async () => {
551
+ writeJsonFixture(tmpDir, 'meta-strategies', 'strat-1.json', makeMetaStrategyJson());
552
+
553
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
554
+ await migrator.migrate();
555
+
556
+ const row = persistence.getMetaStrategy('strat-1');
557
+ const condition = JSON.parse(row!.condition);
558
+ expect(condition.taskCharacteristics).toContain('familiar domain');
559
+
560
+ const adjustment = JSON.parse(row!.adjustment);
561
+ expect(adjustment.routingBias.adapt).toBe(0.2);
562
+ expect(adjustment.executionHint).toBe('prefer decomposition');
563
+ });
564
+
565
+ it('should handle meta strategies with missing optional fields', async () => {
566
+ const minimal = {
567
+ id: 'strat-min',
568
+ name: 'Minimal Strategy',
569
+ condition: { taskCharacteristics: [], memoryState: [] },
570
+ adjustment: { routingBias: {}, retrievalModification: '', executionHint: '' },
571
+ createdAt: '2024-06-01T00:00:00.000Z',
572
+ updatedAt: '2024-06-01T00:00:00.000Z',
573
+ };
574
+ writeJsonFixture(tmpDir, 'meta-strategies', 'strat-min.json', minimal);
575
+
576
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
577
+ const result = await migrator.migrate();
578
+
579
+ expect(result.counts.metaStrategies).toBe(1);
580
+ const row = persistence.getMetaStrategy('strat-min');
581
+ expect(row).toBeDefined();
582
+ expect(row!.application_count).toBe(0);
583
+ expect(row!.success_rate).toBe(0);
584
+ });
585
+ });
586
+
587
+ // --------------------------------------------------------------------------
588
+ // Causal edge migration
589
+ // --------------------------------------------------------------------------
590
+
591
+ describe('causal edge migration', () => {
592
+ it('should migrate a causal edge from a JSON file', async () => {
593
+ writeJsonFixture(tmpDir, 'causal-edges', 'edge-1.json', makeCausalEdgeJson());
594
+
595
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
596
+ const result = await migrator.migrate();
597
+
598
+ expect(result.migrated).toBe(true);
599
+ expect(result.counts.causalEdges).toBe(1);
600
+
601
+ const row = persistence.getCausalEdge('edge-1');
602
+ expect(row).toBeDefined();
603
+ expect(row!.cause).toBe('missing validation');
604
+ expect(row!.effect).toBe('runtime error');
605
+ expect(row!.confidence).toBe(0.9);
606
+ expect(row!.domain).toBe('code');
607
+ expect(row!.observed_count).toBe(3);
608
+ expect(JSON.parse(row!.source_trajectory_ids)).toEqual(['traj-1', 'traj-2']);
609
+ });
610
+
611
+ it('should migrate multiple causal edges', async () => {
612
+ writeJsonFixture(tmpDir, 'causal-edges', 'edge-1.json', makeCausalEdgeJson({ id: 'edge-1' }));
613
+ writeJsonFixture(tmpDir, 'causal-edges', 'edge-2.json', makeCausalEdgeJson({ id: 'edge-2', cause: 'wrong API call', effect: '404 error' }));
614
+
615
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
616
+ const result = await migrator.migrate();
617
+
618
+ expect(result.counts.causalEdges).toBe(2);
619
+ });
620
+
621
+ it('should handle causal edges with missing optional fields', async () => {
622
+ const minimal = {
623
+ id: 'edge-min',
624
+ cause: 'X',
625
+ effect: 'Y',
626
+ confidence: 0.5,
627
+ domain: 'general',
628
+ createdAt: '2024-06-01T00:00:00.000Z',
629
+ updatedAt: '2024-06-01T00:00:00.000Z',
630
+ };
631
+ writeJsonFixture(tmpDir, 'causal-edges', 'edge-min.json', minimal);
632
+
633
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
634
+ const result = await migrator.migrate();
635
+
636
+ expect(result.counts.causalEdges).toBe(1);
637
+ const row = persistence.getCausalEdge('edge-min');
638
+ expect(row).toBeDefined();
639
+ expect(row!.observed_count).toBe(1);
640
+ expect(JSON.parse(row!.source_trajectory_ids)).toEqual([]);
641
+ });
642
+ });
643
+
644
+ // --------------------------------------------------------------------------
645
+ // Schema version tracking
646
+ // --------------------------------------------------------------------------
647
+
648
+ describe('schema version tracking', () => {
649
+ it('should set schema version to 1 after migration', async () => {
650
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson());
651
+
652
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
653
+ await migrator.migrate();
654
+
655
+ expect(persistence.getSchemaVersion()).toBe(1);
656
+ });
657
+
658
+ it('should set schema version to 1 even when no data exists', async () => {
659
+ // No JSON fixture files at all — all counts should be 0
660
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
661
+ const result = await migrator.migrate();
662
+
663
+ expect(result.migrated).toBe(true);
664
+ expect(result.counts.experiences).toBe(0);
665
+ expect(result.counts.playbooks).toBe(0);
666
+ expect(result.counts.reflexionEpisodes).toBe(0);
667
+ expect(result.counts.causalEdges).toBe(0);
668
+ expect(result.counts.metaObservations).toBe(0);
669
+ expect(result.counts.metaStrategies).toBe(0);
670
+ expect(persistence.getSchemaVersion()).toBe(1);
671
+ });
672
+
673
+ it('should not run migration when schema version is already >= 1', async () => {
674
+ persistence.setSchemaVersion(1);
675
+
676
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson());
677
+
678
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
679
+ const result = await migrator.migrate();
680
+
681
+ expect(result.migrated).toBe(false);
682
+ expect(result.counts).toEqual({});
683
+ expect(persistence.getExperienceCount()).toBe(0); // Nothing was migrated
684
+ });
685
+
686
+ it('should not run migration when schema version is higher than 1', async () => {
687
+ persistence.setSchemaVersion(5);
688
+
689
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson());
690
+
691
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
692
+ const result = await migrator.migrate();
693
+
694
+ expect(result.migrated).toBe(false);
695
+ expect(result.counts).toEqual({});
696
+ });
697
+ });
698
+
699
+ // --------------------------------------------------------------------------
700
+ // Idempotency
701
+ // --------------------------------------------------------------------------
702
+
703
+ describe('idempotency', () => {
704
+ it('should not duplicate data when migration runs twice', async () => {
705
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson());
706
+ writeJsonFixture(tmpDir, 'playbooks', 'pb-1.json', makePlaybookJson());
707
+ writeJsonFixture(tmpDir, 'reflexion-episodes', 'ref-1.json', makeReflexionJson());
708
+
709
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
710
+
711
+ const result1 = await migrator.migrate();
712
+ expect(result1.migrated).toBe(true);
713
+ expect(result1.counts.experiences).toBe(1);
714
+
715
+ // Second run — version is now 1, so migration should be skipped
716
+ const result2 = await migrator.migrate();
717
+ expect(result2.migrated).toBe(false);
718
+ expect(result2.counts).toEqual({});
719
+
720
+ // Data should not be duplicated
721
+ expect(persistence.getExperienceCount()).toBe(1);
722
+ expect(persistence.getPlaybookCount()).toBe(1);
723
+ });
724
+
725
+ it('should be idempotent via the runMigration helper', async () => {
726
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson());
727
+
728
+ const result1 = await runMigration(persistence, tmpDir);
729
+ expect(result1.migrated).toBe(true);
730
+
731
+ const result2 = await runMigration(persistence, tmpDir);
732
+ expect(result2.migrated).toBe(false);
733
+
734
+ expect(persistence.getExperienceCount()).toBe(1);
735
+ });
736
+ });
737
+
738
+ // --------------------------------------------------------------------------
739
+ // Empty/missing directories
740
+ // --------------------------------------------------------------------------
741
+
742
+ describe('empty and missing directories', () => {
743
+ it('should handle completely missing collection directories gracefully', async () => {
744
+ // tmpDir exists but has no collection subdirectories
745
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
746
+ const result = await migrator.migrate();
747
+
748
+ expect(result.migrated).toBe(true);
749
+ expect(result.counts.experiences).toBe(0);
750
+ expect(result.counts.playbooks).toBe(0);
751
+ expect(result.counts.reflexionEpisodes).toBe(0);
752
+ expect(result.counts.causalEdges).toBe(0);
753
+ expect(result.counts.metaObservations).toBe(0);
754
+ expect(result.counts.metaStrategies).toBe(0);
755
+ });
756
+
757
+ it('should handle empty collection directories', async () => {
758
+ // Create empty directories
759
+ mkdirSync(join(tmpDir, 'experiences'), { recursive: true });
760
+ mkdirSync(join(tmpDir, 'playbooks'), { recursive: true });
761
+ mkdirSync(join(tmpDir, 'reflexion-episodes'), { recursive: true });
762
+
763
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
764
+ const result = await migrator.migrate();
765
+
766
+ expect(result.migrated).toBe(true);
767
+ expect(result.counts.experiences).toBe(0);
768
+ expect(result.counts.playbooks).toBe(0);
769
+ expect(result.counts.reflexionEpisodes).toBe(0);
770
+ });
771
+
772
+ it('should handle a non-existent base directory', async () => {
773
+ const nonExistent = join(tmpDir, 'does-not-exist');
774
+
775
+ const migrator = new JsonToSqliteMigrator(persistence, nonExistent);
776
+ const result = await migrator.migrate();
777
+
778
+ expect(result.migrated).toBe(true);
779
+ expect(result.counts.experiences).toBe(0);
780
+ });
781
+
782
+ it('should skip directories that contain only _index.json or _global metadata files', async () => {
783
+ const dir = join(tmpDir, 'experiences');
784
+ mkdirSync(dir, { recursive: true });
785
+ writeFileSync(join(dir, '_index.json'), JSON.stringify({}), 'utf-8');
786
+ writeFileSync(join(dir, '_global.json'), JSON.stringify({}), 'utf-8');
787
+
788
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
789
+ const result = await migrator.migrate();
790
+
791
+ // Files starting with _ are skipped by collectJsonFiles
792
+ expect(result.counts.experiences).toBe(0);
793
+ });
794
+
795
+ it('should skip malformed JSON files without crashing', async () => {
796
+ const dir = join(tmpDir, 'experiences');
797
+ mkdirSync(dir, { recursive: true });
798
+ writeFileSync(join(dir, 'bad.json'), 'this is not valid json{{{', 'utf-8');
799
+ writeJsonFixture(tmpDir, 'experiences', 'exp-good.json', makeExperienceJson({ id: 'exp-good' }));
800
+
801
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
802
+ const result = await migrator.migrate();
803
+
804
+ // The good file should still be migrated; the bad one is silently skipped
805
+ expect(result.counts.experiences).toBe(1);
806
+ expect(persistence.getExperience('exp-good')).toBeDefined();
807
+ });
808
+
809
+ it('should skip non-JSON files in the directory', async () => {
810
+ const dir = join(tmpDir, 'experiences');
811
+ mkdirSync(dir, { recursive: true });
812
+ writeFileSync(join(dir, 'readme.txt'), 'not a json file', 'utf-8');
813
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson());
814
+
815
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
816
+ const result = await migrator.migrate();
817
+
818
+ expect(result.counts.experiences).toBe(1);
819
+ });
820
+ });
821
+
822
+ // --------------------------------------------------------------------------
823
+ // Backup directory renaming (.migrated/ suffix)
824
+ // --------------------------------------------------------------------------
825
+
826
+ describe('backup directory renaming', () => {
827
+ it('should rename the collection directory to .migrated after successful migration', async () => {
828
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson());
829
+
830
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
831
+ await migrator.migrate();
832
+
833
+ expect(existsSync(join(tmpDir, 'experiences'))).toBe(false);
834
+ expect(existsSync(join(tmpDir, 'experiences.migrated'))).toBe(true);
835
+ });
836
+
837
+ it('should rename all collection directories that had data', async () => {
838
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson());
839
+ writeJsonFixture(tmpDir, 'playbooks', 'pb-1.json', makePlaybookJson());
840
+ writeJsonFixture(tmpDir, 'reflexion-episodes', 'ref-1.json', makeReflexionJson());
841
+ writeJsonFixture(tmpDir, 'causal-edges', 'edge-1.json', makeCausalEdgeJson());
842
+ writeJsonFixture(tmpDir, 'meta-observations', 'obs-1.json', makeMetaObservationJson());
843
+ writeJsonFixture(tmpDir, 'meta-strategies', 'strat-1.json', makeMetaStrategyJson());
844
+
845
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
846
+ await migrator.migrate();
847
+
848
+ expect(existsSync(join(tmpDir, 'experiences.migrated'))).toBe(true);
849
+ expect(existsSync(join(tmpDir, 'playbooks.migrated'))).toBe(true);
850
+ expect(existsSync(join(tmpDir, 'reflexion-episodes.migrated'))).toBe(true);
851
+ expect(existsSync(join(tmpDir, 'causal-edges.migrated'))).toBe(true);
852
+ expect(existsSync(join(tmpDir, 'meta-observations.migrated'))).toBe(true);
853
+ expect(existsSync(join(tmpDir, 'meta-strategies.migrated'))).toBe(true);
854
+ });
855
+
856
+ it('should not rename directories that had no JSON files', async () => {
857
+ // Create empty directory
858
+ mkdirSync(join(tmpDir, 'experiences'), { recursive: true });
859
+
860
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
861
+ await migrator.migrate();
862
+
863
+ // Empty dir — collectJsonFiles returns [], migrateCollection returns 0 early
864
+ // The rename only happens after successful inserts, not for empty dirs
865
+ expect(existsSync(join(tmpDir, 'experiences'))).toBe(true);
866
+ expect(existsSync(join(tmpDir, 'experiences.migrated'))).toBe(false);
867
+ });
868
+
869
+ it('should not fail if the .migrated backup directory already exists', async () => {
870
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson());
871
+
872
+ // Pre-create the .migrated directory
873
+ mkdirSync(join(tmpDir, 'experiences.migrated'), { recursive: true });
874
+
875
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
876
+ const result = await migrator.migrate();
877
+
878
+ // Migration should still succeed — the rename is skipped if backup already exists
879
+ expect(result.migrated).toBe(true);
880
+ expect(result.counts.experiences).toBe(1);
881
+
882
+ // The original directory should still exist since renaming was skipped
883
+ expect(existsSync(join(tmpDir, 'experiences'))).toBe(true);
884
+ });
885
+
886
+ it('should not rename directories that do not exist', async () => {
887
+ // No fixture directories created at all
888
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
889
+ await migrator.migrate();
890
+
891
+ // No .migrated directories should be created
892
+ expect(existsSync(join(tmpDir, 'experiences.migrated'))).toBe(false);
893
+ expect(existsSync(join(tmpDir, 'playbooks.migrated'))).toBe(false);
894
+ });
895
+ });
896
+
897
+ // --------------------------------------------------------------------------
898
+ // Full end-to-end migration (all collections at once)
899
+ // --------------------------------------------------------------------------
900
+
901
+ describe('full migration across all collections', () => {
902
+ it('should migrate all collection types in a single run', async () => {
903
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson({ id: 'exp-1' }));
904
+ writeJsonFixture(tmpDir, 'experiences', 'exp-2.json', makeExperienceJson({ id: 'exp-2' }));
905
+ writeJsonFixture(tmpDir, 'playbooks', 'pb-1.json', makePlaybookJson({ id: 'pb-1' }));
906
+ writeJsonFixture(tmpDir, 'reflexion-episodes', 'ref-1.json', makeReflexionJson({ id: 'ref-1' }));
907
+ writeJsonFixture(tmpDir, 'causal-edges', 'edge-1.json', makeCausalEdgeJson({ id: 'edge-1' }));
908
+ writeJsonFixture(tmpDir, 'meta-observations', 'obs-1.json', makeMetaObservationJson({ id: 'obs-1' }));
909
+ writeJsonFixture(tmpDir, 'meta-strategies', 'strat-1.json', makeMetaStrategyJson({ id: 'strat-1' }));
910
+
911
+ const result = await runMigration(persistence, tmpDir);
912
+
913
+ expect(result.migrated).toBe(true);
914
+ expect(result.counts).toEqual({
915
+ experiences: 2,
916
+ playbooks: 1,
917
+ reflexionEpisodes: 1,
918
+ causalEdges: 1,
919
+ metaObservations: 1,
920
+ metaStrategies: 1,
921
+ });
922
+
923
+ expect(persistence.getExperienceCount()).toBe(2);
924
+ expect(persistence.getPlaybookCount()).toBe(1);
925
+ expect(persistence.getSchemaVersion()).toBe(1);
926
+ });
927
+
928
+ it('should handle a mix of flat and partitioned files across collections', async () => {
929
+ // Flat files
930
+ writeJsonFixture(tmpDir, 'experiences', 'exp-flat.json', makeExperienceJson({ id: 'exp-flat' }));
931
+ // Partitioned files
932
+ writePartitionedFixture(tmpDir, 'experiences', 'code', 'exp-part.json', makeExperienceJson({ id: 'exp-part' }));
933
+ // Another collection flat
934
+ writeJsonFixture(tmpDir, 'causal-edges', 'edge-1.json', makeCausalEdgeJson({ id: 'edge-1' }));
935
+
936
+ const result = await runMigration(persistence, tmpDir);
937
+
938
+ expect(result.migrated).toBe(true);
939
+ expect(result.counts.experiences).toBe(2);
940
+ expect(result.counts.causalEdges).toBe(1);
941
+ });
942
+ });
943
+
944
+ // --------------------------------------------------------------------------
945
+ // runMigration helper
946
+ // --------------------------------------------------------------------------
947
+
948
+ describe('runMigration helper', () => {
949
+ it('should create a migrator and run migration', async () => {
950
+ writeJsonFixture(tmpDir, 'experiences', 'exp-1.json', makeExperienceJson());
951
+
952
+ const result = await runMigration(persistence, tmpDir);
953
+
954
+ expect(result.migrated).toBe(true);
955
+ expect(result.counts.experiences).toBe(1);
956
+ expect(persistence.getSchemaVersion()).toBe(1);
957
+ });
958
+ });
959
+
960
+ // --------------------------------------------------------------------------
961
+ // Batch size behavior (the migrator uses BATCH_SIZE = 100)
962
+ // --------------------------------------------------------------------------
963
+
964
+ describe('batch processing', () => {
965
+ it('should migrate more than 100 items correctly (exercises batch boundary)', async () => {
966
+ // Create 150 experience files to cross the BATCH_SIZE (100) boundary
967
+ for (let i = 0; i < 150; i++) {
968
+ writeJsonFixture(
969
+ tmpDir,
970
+ 'experiences',
971
+ `exp-${i}.json`,
972
+ makeExperienceJson({ id: `exp-${i}` }),
973
+ );
974
+ }
975
+
976
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
977
+ const result = await migrator.migrate();
978
+
979
+ expect(result.counts.experiences).toBe(150);
980
+ expect(persistence.getExperienceCount()).toBe(150);
981
+ });
982
+ });
983
+
984
+ // --------------------------------------------------------------------------
985
+ // Edge cases: insert failures for individual items
986
+ // --------------------------------------------------------------------------
987
+
988
+ describe('individual item insert failures', () => {
989
+ it('should skip items that fail to insert and continue with the rest', async () => {
990
+ // Write a valid experience and one with an id that would cause issues
991
+ writeJsonFixture(tmpDir, 'experiences', 'exp-good.json', makeExperienceJson({ id: 'exp-good' }));
992
+ // Write a file with data that will parse but is missing required fields
993
+ // (the inserter catches and skips insert errors)
994
+ writeJsonFixture(tmpDir, 'experiences', 'exp-bad.json', {
995
+ // Missing required fields like taskInput, solutionOutput, etc.
996
+ id: null,
997
+ });
998
+
999
+ const migrator = new JsonToSqliteMigrator(persistence, tmpDir);
1000
+ const result = await migrator.migrate();
1001
+
1002
+ // At least the good one should succeed; the bad one's count depends on
1003
+ // whether the coercion helper throws or produces something insertable.
1004
+ // The migrator catches insert errors, so overall migration succeeds.
1005
+ expect(result.migrated).toBe(true);
1006
+ expect(persistence.getExperience('exp-good')).toBeDefined();
1007
+ });
1008
+ });
1009
+ });