cognitive-core 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/.claude/settings.json +111 -2
  2. package/.sessionlog/settings.json +4 -0
  3. package/CLAUDE.md +233 -0
  4. package/README.md +370 -54
  5. package/dist/atlas.d.ts +10 -10
  6. package/dist/atlas.d.ts.map +1 -1
  7. package/dist/atlas.js +79 -48
  8. package/dist/atlas.js.map +1 -1
  9. package/dist/bin/cli-utils.d.ts +37 -0
  10. package/dist/bin/cli-utils.d.ts.map +1 -0
  11. package/dist/bin/cli-utils.js +176 -0
  12. package/dist/bin/cli-utils.js.map +1 -0
  13. package/dist/bin/cognitive-core.d.ts +2 -12
  14. package/dist/bin/cognitive-core.d.ts.map +1 -1
  15. package/dist/bin/cognitive-core.js +76 -351
  16. package/dist/bin/cognitive-core.js.map +1 -1
  17. package/dist/bin/commands/kb.d.ts +6 -0
  18. package/dist/bin/commands/kb.d.ts.map +1 -0
  19. package/dist/bin/commands/kb.js +240 -0
  20. package/dist/bin/commands/kb.js.map +1 -0
  21. package/dist/bin/commands/learn.d.ts +6 -0
  22. package/dist/bin/commands/learn.d.ts.map +1 -0
  23. package/dist/bin/commands/learn.js +91 -0
  24. package/dist/bin/commands/learn.js.map +1 -0
  25. package/dist/bin/commands/legacy.d.ts +12 -0
  26. package/dist/bin/commands/legacy.d.ts.map +1 -0
  27. package/dist/bin/commands/legacy.js +142 -0
  28. package/dist/bin/commands/legacy.js.map +1 -0
  29. package/dist/bin/commands/run.d.ts +3 -0
  30. package/dist/bin/commands/run.d.ts.map +1 -0
  31. package/dist/bin/commands/run.js +99 -0
  32. package/dist/bin/commands/run.js.map +1 -0
  33. package/dist/bin/commands/sessions.d.ts +9 -0
  34. package/dist/bin/commands/sessions.d.ts.map +1 -0
  35. package/dist/bin/commands/sessions.js +183 -0
  36. package/dist/bin/commands/sessions.js.map +1 -0
  37. package/dist/bin/commands/skills.d.ts +6 -0
  38. package/dist/bin/commands/skills.d.ts.map +1 -0
  39. package/dist/bin/commands/skills.js +135 -0
  40. package/dist/bin/commands/skills.js.map +1 -0
  41. package/dist/embeddings/index.d.ts +1 -0
  42. package/dist/embeddings/index.d.ts.map +1 -1
  43. package/dist/embeddings/index.js +2 -0
  44. package/dist/embeddings/index.js.map +1 -1
  45. package/dist/embeddings/inverted-index.d.ts +47 -0
  46. package/dist/embeddings/inverted-index.d.ts.map +1 -0
  47. package/dist/embeddings/inverted-index.js +122 -0
  48. package/dist/embeddings/inverted-index.js.map +1 -0
  49. package/dist/embeddings/manager.d.ts +3 -1
  50. package/dist/embeddings/manager.d.ts.map +1 -1
  51. package/dist/embeddings/manager.js +12 -7
  52. package/dist/embeddings/manager.js.map +1 -1
  53. package/dist/embeddings/vector-store.d.ts +7 -3
  54. package/dist/embeddings/vector-store.d.ts.map +1 -1
  55. package/dist/embeddings/vector-store.js +22 -6
  56. package/dist/embeddings/vector-store.js.map +1 -1
  57. package/dist/factory.d.ts +11 -12
  58. package/dist/factory.d.ts.map +1 -1
  59. package/dist/factory.js +20 -7
  60. package/dist/factory.js.map +1 -1
  61. package/dist/index.d.ts +8 -7
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +42 -6
  64. package/dist/index.js.map +1 -1
  65. package/dist/learning/analyzer.d.ts.map +1 -1
  66. package/dist/learning/analyzer.js +17 -35
  67. package/dist/learning/analyzer.js.map +1 -1
  68. package/dist/learning/energy-evaluator.d.ts +128 -0
  69. package/dist/learning/energy-evaluator.d.ts.map +1 -0
  70. package/dist/learning/energy-evaluator.js +175 -0
  71. package/dist/learning/energy-evaluator.js.map +1 -0
  72. package/dist/learning/healing-orchestrator.d.ts +182 -0
  73. package/dist/learning/healing-orchestrator.d.ts.map +1 -0
  74. package/dist/learning/healing-orchestrator.js +250 -0
  75. package/dist/learning/healing-orchestrator.js.map +1 -0
  76. package/dist/learning/index.d.ts +7 -2
  77. package/dist/learning/index.d.ts.map +1 -1
  78. package/dist/learning/index.js +13 -2
  79. package/dist/learning/index.js.map +1 -1
  80. package/dist/learning/instant-loop.d.ts +87 -0
  81. package/dist/learning/instant-loop.d.ts.map +1 -0
  82. package/dist/learning/instant-loop.js +264 -0
  83. package/dist/learning/instant-loop.js.map +1 -0
  84. package/dist/learning/loop-coordinator.d.ts +61 -0
  85. package/dist/learning/loop-coordinator.d.ts.map +1 -0
  86. package/dist/learning/loop-coordinator.js +96 -0
  87. package/dist/learning/loop-coordinator.js.map +1 -0
  88. package/dist/learning/maintenance-scheduler.d.ts +141 -0
  89. package/dist/learning/maintenance-scheduler.d.ts.map +1 -0
  90. package/dist/learning/maintenance-scheduler.js +186 -0
  91. package/dist/learning/maintenance-scheduler.js.map +1 -0
  92. package/dist/learning/meta-learner.d.ts.map +1 -1
  93. package/dist/learning/meta-learner.js +4 -21
  94. package/dist/learning/meta-learner.js.map +1 -1
  95. package/dist/learning/pipeline.d.ts +31 -4
  96. package/dist/learning/pipeline.d.ts.map +1 -1
  97. package/dist/learning/pipeline.js +64 -12
  98. package/dist/learning/pipeline.js.map +1 -1
  99. package/dist/learning/reflexion-generator.d.ts +64 -0
  100. package/dist/learning/reflexion-generator.d.ts.map +1 -0
  101. package/dist/learning/reflexion-generator.js +194 -0
  102. package/dist/learning/reflexion-generator.js.map +1 -0
  103. package/dist/learning/trajectory-sources/entire.d.ts +8 -5
  104. package/dist/learning/trajectory-sources/entire.d.ts.map +1 -1
  105. package/dist/learning/trajectory-sources/entire.js +13 -6
  106. package/dist/learning/trajectory-sources/entire.js.map +1 -1
  107. package/dist/learning/trajectory-sources/index.d.ts +1 -1
  108. package/dist/learning/trajectory-sources/index.d.ts.map +1 -1
  109. package/dist/learning/trajectory-sources/index.js +1 -1
  110. package/dist/learning/trajectory-sources/index.js.map +1 -1
  111. package/dist/learning/trajectory-sources/pipeline.d.ts +4 -4
  112. package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -1
  113. package/dist/learning/trajectory-sources/pipeline.js +2 -2
  114. package/dist/learning/trajectory-sources/pipeline.js.map +1 -1
  115. package/dist/learning/unified-pipeline.d.ts +311 -0
  116. package/dist/learning/unified-pipeline.d.ts.map +1 -0
  117. package/dist/learning/unified-pipeline.js +844 -0
  118. package/dist/learning/unified-pipeline.js.map +1 -0
  119. package/dist/memory/candidate-retrieval.d.ts +43 -0
  120. package/dist/memory/candidate-retrieval.d.ts.map +1 -0
  121. package/dist/memory/candidate-retrieval.js +43 -0
  122. package/dist/memory/candidate-retrieval.js.map +1 -0
  123. package/dist/memory/causal-store.d.ts +97 -0
  124. package/dist/memory/causal-store.d.ts.map +1 -0
  125. package/dist/memory/causal-store.js +209 -0
  126. package/dist/memory/causal-store.js.map +1 -0
  127. package/dist/memory/coherence.d.ts +71 -0
  128. package/dist/memory/coherence.d.ts.map +1 -0
  129. package/dist/memory/coherence.js +176 -0
  130. package/dist/memory/coherence.js.map +1 -0
  131. package/dist/memory/experience.d.ts +39 -6
  132. package/dist/memory/experience.d.ts.map +1 -1
  133. package/dist/memory/experience.js +193 -49
  134. package/dist/memory/experience.js.map +1 -1
  135. package/dist/memory/index.d.ts +7 -0
  136. package/dist/memory/index.d.ts.map +1 -1
  137. package/dist/memory/index.js +12 -0
  138. package/dist/memory/index.js.map +1 -1
  139. package/dist/memory/knowledge-bank.d.ts +14 -0
  140. package/dist/memory/knowledge-bank.d.ts.map +1 -1
  141. package/dist/memory/knowledge-bank.js +45 -0
  142. package/dist/memory/knowledge-bank.js.map +1 -1
  143. package/dist/memory/meta.d.ts +7 -8
  144. package/dist/memory/meta.d.ts.map +1 -1
  145. package/dist/memory/meta.js +73 -79
  146. package/dist/memory/meta.js.map +1 -1
  147. package/dist/memory/playbook.d.ts +26 -9
  148. package/dist/memory/playbook.d.ts.map +1 -1
  149. package/dist/memory/playbook.js +198 -74
  150. package/dist/memory/playbook.js.map +1 -1
  151. package/dist/memory/reasoning-bank.d.ts +130 -0
  152. package/dist/memory/reasoning-bank.d.ts.map +1 -0
  153. package/dist/memory/reasoning-bank.js +342 -0
  154. package/dist/memory/reasoning-bank.js.map +1 -0
  155. package/dist/memory/reflexion.d.ts +59 -0
  156. package/dist/memory/reflexion.d.ts.map +1 -0
  157. package/dist/memory/reflexion.js +96 -0
  158. package/dist/memory/reflexion.js.map +1 -0
  159. package/dist/memory/system.d.ts +7 -2
  160. package/dist/memory/system.d.ts.map +1 -1
  161. package/dist/memory/system.js +19 -7
  162. package/dist/memory/system.js.map +1 -1
  163. package/dist/memory/temporal-compressor.d.ts +126 -0
  164. package/dist/memory/temporal-compressor.d.ts.map +1 -0
  165. package/dist/memory/temporal-compressor.js +335 -0
  166. package/dist/memory/temporal-compressor.js.map +1 -0
  167. package/dist/persistence/index.d.ts +11 -0
  168. package/dist/persistence/index.d.ts.map +1 -0
  169. package/dist/persistence/index.js +11 -0
  170. package/dist/persistence/index.js.map +1 -0
  171. package/dist/persistence/migrator.d.ts +40 -0
  172. package/dist/persistence/migrator.d.ts.map +1 -0
  173. package/dist/persistence/migrator.js +238 -0
  174. package/dist/persistence/migrator.js.map +1 -0
  175. package/dist/persistence/serializers.d.ts +45 -0
  176. package/dist/persistence/serializers.d.ts.map +1 -0
  177. package/dist/persistence/serializers.js +80 -0
  178. package/dist/persistence/serializers.js.map +1 -0
  179. package/dist/persistence/sqlite-persistence.d.ts +228 -0
  180. package/dist/persistence/sqlite-persistence.d.ts.map +1 -0
  181. package/dist/persistence/sqlite-persistence.js +588 -0
  182. package/dist/persistence/sqlite-persistence.js.map +1 -0
  183. package/dist/runtime/flows/learning.d.ts +10 -12
  184. package/dist/runtime/flows/learning.d.ts.map +1 -1
  185. package/dist/runtime/flows/learning.js +10 -23
  186. package/dist/runtime/flows/learning.js.map +1 -1
  187. package/dist/search/index.d.ts +1 -0
  188. package/dist/search/index.d.ts.map +1 -1
  189. package/dist/search/index.js +2 -0
  190. package/dist/search/index.js.map +1 -1
  191. package/dist/search/moe-gate.d.ts +124 -0
  192. package/dist/search/moe-gate.d.ts.map +1 -0
  193. package/dist/search/moe-gate.js +234 -0
  194. package/dist/search/moe-gate.js.map +1 -0
  195. package/dist/search/router.d.ts +32 -2
  196. package/dist/search/router.d.ts.map +1 -1
  197. package/dist/search/router.js +87 -4
  198. package/dist/search/router.js.map +1 -1
  199. package/dist/session-bank/git-reader.d.ts +9 -4
  200. package/dist/session-bank/git-reader.d.ts.map +1 -1
  201. package/dist/session-bank/git-reader.js +22 -15
  202. package/dist/session-bank/git-reader.js.map +1 -1
  203. package/dist/session-bank/index.d.ts +2 -2
  204. package/dist/session-bank/index.d.ts.map +1 -1
  205. package/dist/session-bank/index.js +2 -2
  206. package/dist/session-bank/index.js.map +1 -1
  207. package/dist/session-bank/parser.d.ts +16 -5
  208. package/dist/session-bank/parser.d.ts.map +1 -1
  209. package/dist/session-bank/parser.js +187 -80
  210. package/dist/session-bank/parser.js.map +1 -1
  211. package/dist/session-bank/session-bank.d.ts +5 -0
  212. package/dist/session-bank/session-bank.d.ts.map +1 -1
  213. package/dist/session-bank/session-bank.js +30 -9
  214. package/dist/session-bank/session-bank.js.map +1 -1
  215. package/dist/session-bank/types.d.ts +4 -1
  216. package/dist/session-bank/types.d.ts.map +1 -1
  217. package/dist/session-bank/types.js +3 -3
  218. package/dist/session-bank/types.js.map +1 -1
  219. package/dist/surfacing/skill-publisher.d.ts.map +1 -1
  220. package/dist/surfacing/skill-publisher.js +15 -43
  221. package/dist/surfacing/skill-publisher.js.map +1 -1
  222. package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -1
  223. package/dist/surfacing/sqlite-storage-adapter.js +13 -21
  224. package/dist/surfacing/sqlite-storage-adapter.js.map +1 -1
  225. package/dist/types/config.d.ts +100 -0
  226. package/dist/types/config.d.ts.map +1 -1
  227. package/dist/types/config.js +27 -0
  228. package/dist/types/config.js.map +1 -1
  229. package/dist/types/index.d.ts +2 -2
  230. package/dist/types/index.d.ts.map +1 -1
  231. package/dist/types/index.js +1 -1
  232. package/dist/types/index.js.map +1 -1
  233. package/dist/types/memory.d.ts +52 -0
  234. package/dist/types/memory.d.ts.map +1 -1
  235. package/dist/types/memory.js +13 -0
  236. package/dist/types/memory.js.map +1 -1
  237. package/dist/types/playbook.d.ts +4 -0
  238. package/dist/types/playbook.d.ts.map +1 -1
  239. package/dist/types/playbook.js.map +1 -1
  240. package/dist/utils/error-classifier.d.ts +30 -0
  241. package/dist/utils/error-classifier.d.ts.map +1 -0
  242. package/dist/utils/error-classifier.js +85 -0
  243. package/dist/utils/error-classifier.js.map +1 -0
  244. package/dist/utils/index.d.ts +3 -0
  245. package/dist/utils/index.d.ts.map +1 -1
  246. package/dist/utils/index.js +3 -0
  247. package/dist/utils/index.js.map +1 -1
  248. package/dist/utils/partitioned-store.d.ts +93 -0
  249. package/dist/utils/partitioned-store.d.ts.map +1 -0
  250. package/dist/utils/partitioned-store.js +251 -0
  251. package/dist/utils/partitioned-store.js.map +1 -0
  252. package/dist/utils/trajectory-helpers.d.ts +39 -0
  253. package/dist/utils/trajectory-helpers.d.ts.map +1 -0
  254. package/dist/utils/trajectory-helpers.js +57 -0
  255. package/dist/utils/trajectory-helpers.js.map +1 -0
  256. package/dist/workspace/efficacy-toolkit.d.ts +164 -0
  257. package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
  258. package/dist/workspace/efficacy-toolkit.js +281 -0
  259. package/dist/workspace/efficacy-toolkit.js.map +1 -0
  260. package/dist/workspace/index.d.ts +2 -1
  261. package/dist/workspace/index.d.ts.map +1 -1
  262. package/dist/workspace/index.js +3 -1
  263. package/dist/workspace/index.js.map +1 -1
  264. package/dist/workspace/runner.d.ts +3 -4
  265. package/dist/workspace/runner.d.ts.map +1 -1
  266. package/dist/workspace/runner.js.map +1 -1
  267. package/dist/workspace/templates/index.d.ts +3 -0
  268. package/dist/workspace/templates/index.d.ts.map +1 -1
  269. package/dist/workspace/templates/index.js +6 -0
  270. package/dist/workspace/templates/index.js.map +1 -1
  271. package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
  272. package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
  273. package/dist/workspace/templates/playbook-decay-detection.js +197 -0
  274. package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
  275. package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
  276. package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
  277. package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
  278. package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
  279. package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
  280. package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
  281. package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
  282. package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
  283. package/dist/workspace/types.d.ts +9 -2
  284. package/dist/workspace/types.d.ts.map +1 -1
  285. package/dist/workspace/types.js.map +1 -1
  286. package/package.json +12 -4
  287. package/references/sessionlog/.husky/pre-commit +1 -0
  288. package/references/sessionlog/.lintstagedrc.json +4 -0
  289. package/references/sessionlog/.prettierignore +4 -0
  290. package/references/sessionlog/.prettierrc.json +11 -0
  291. package/references/sessionlog/LICENSE +21 -0
  292. package/references/sessionlog/README.md +453 -0
  293. package/references/sessionlog/eslint.config.js +58 -0
  294. package/references/sessionlog/package-lock.json +3672 -0
  295. package/references/sessionlog/package.json +65 -0
  296. package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
  297. package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
  298. package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
  299. package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
  300. package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
  301. package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
  302. package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
  303. package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
  304. package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
  305. package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
  306. package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
  307. package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
  308. package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
  309. package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
  310. package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
  311. package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
  312. package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
  313. package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
  314. package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
  315. package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
  316. package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
  317. package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
  318. package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
  319. package/references/sessionlog/src/__tests__/types.test.ts +166 -0
  320. package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
  321. package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
  322. package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
  323. package/references/sessionlog/src/agent/agents/claude-code.ts +1089 -0
  324. package/references/sessionlog/src/agent/agents/cursor.ts +361 -0
  325. package/references/sessionlog/src/agent/agents/gemini-cli.ts +632 -0
  326. package/references/sessionlog/src/agent/agents/opencode.ts +540 -0
  327. package/references/sessionlog/src/agent/registry.ts +143 -0
  328. package/references/sessionlog/src/agent/session-types.ts +113 -0
  329. package/references/sessionlog/src/agent/types.ts +220 -0
  330. package/references/sessionlog/src/cli.ts +597 -0
  331. package/references/sessionlog/src/commands/clean.ts +133 -0
  332. package/references/sessionlog/src/commands/disable.ts +84 -0
  333. package/references/sessionlog/src/commands/doctor.ts +145 -0
  334. package/references/sessionlog/src/commands/enable.ts +202 -0
  335. package/references/sessionlog/src/commands/explain.ts +261 -0
  336. package/references/sessionlog/src/commands/reset.ts +105 -0
  337. package/references/sessionlog/src/commands/resume.ts +180 -0
  338. package/references/sessionlog/src/commands/rewind.ts +195 -0
  339. package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
  340. package/references/sessionlog/src/commands/status.ts +172 -0
  341. package/references/sessionlog/src/config.ts +165 -0
  342. package/references/sessionlog/src/events/event-log.ts +126 -0
  343. package/references/sessionlog/src/git-operations.ts +558 -0
  344. package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
  345. package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
  346. package/references/sessionlog/src/index.ts +650 -0
  347. package/references/sessionlog/src/security/redaction.ts +283 -0
  348. package/references/sessionlog/src/session/state-machine.ts +452 -0
  349. package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
  350. package/references/sessionlog/src/store/native-store.ts +173 -0
  351. package/references/sessionlog/src/store/provider-types.ts +99 -0
  352. package/references/sessionlog/src/store/session-store.ts +266 -0
  353. package/references/sessionlog/src/strategy/attribution.ts +296 -0
  354. package/references/sessionlog/src/strategy/common.ts +207 -0
  355. package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
  356. package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
  357. package/references/sessionlog/src/strategy/types.ts +279 -0
  358. package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
  359. package/references/sessionlog/src/summarize/summarize.ts +432 -0
  360. package/references/sessionlog/src/types.ts +508 -0
  361. package/references/sessionlog/src/utils/chunk-files.ts +49 -0
  362. package/references/sessionlog/src/utils/commit-message.ts +65 -0
  363. package/references/sessionlog/src/utils/detect-agent.ts +36 -0
  364. package/references/sessionlog/src/utils/hook-managers.ts +125 -0
  365. package/references/sessionlog/src/utils/ide-tags.ts +32 -0
  366. package/references/sessionlog/src/utils/paths.ts +79 -0
  367. package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
  368. package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
  369. package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
  370. package/references/sessionlog/src/utils/string-utils.ts +46 -0
  371. package/references/sessionlog/src/utils/todo-extract.ts +188 -0
  372. package/references/sessionlog/src/utils/trailers.ts +187 -0
  373. package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
  374. package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
  375. package/references/sessionlog/src/utils/tree-ops.ts +219 -0
  376. package/references/sessionlog/src/utils/tty.ts +72 -0
  377. package/references/sessionlog/src/utils/validation.ts +65 -0
  378. package/references/sessionlog/src/utils/worktree.ts +58 -0
  379. package/references/sessionlog/src/wire-types.ts +59 -0
  380. package/references/sessionlog/templates/setup-env.sh +153 -0
  381. package/references/sessionlog/tsconfig.json +18 -0
  382. package/references/sessionlog/vitest.config.ts +12 -0
  383. package/references/skill-tree/.sudocode/issues.jsonl +8 -0
  384. package/references/skill-tree/.sudocode/specs.jsonl +2 -0
  385. package/references/skill-tree/CLAUDE.md +56 -80
  386. package/references/skill-tree/README.md +188 -140
  387. package/references/skill-tree/examples/basic-usage.ts +95 -121
  388. package/references/skill-tree/package-lock.json +369 -26
  389. package/references/skill-tree/package.json +1 -1
  390. package/src/atlas.ts +97 -67
  391. package/src/bin/cli-utils.ts +220 -0
  392. package/src/bin/cognitive-core.ts +84 -392
  393. package/src/bin/commands/kb.ts +266 -0
  394. package/src/bin/commands/learn.ts +100 -0
  395. package/src/bin/commands/legacy.ts +182 -0
  396. package/src/bin/commands/run.ts +113 -0
  397. package/src/bin/commands/sessions.ts +221 -0
  398. package/src/bin/commands/skills.ts +146 -0
  399. package/src/embeddings/index.ts +3 -0
  400. package/src/embeddings/inverted-index.ts +134 -0
  401. package/src/embeddings/manager.ts +13 -8
  402. package/src/embeddings/vector-store.ts +21 -9
  403. package/src/factory.ts +33 -16
  404. package/src/index.ts +136 -9
  405. package/src/learning/analyzer.ts +21 -37
  406. package/src/learning/energy-evaluator.ts +282 -0
  407. package/src/learning/healing-orchestrator.ts +383 -0
  408. package/src/learning/index.ts +66 -9
  409. package/src/learning/instant-loop.ts +357 -0
  410. package/src/learning/maintenance-scheduler.ts +271 -0
  411. package/src/learning/meta-learner.ts +5 -23
  412. package/src/learning/reflexion-generator.ts +273 -0
  413. package/src/learning/trajectory-sources/entire.ts +24 -13
  414. package/src/learning/trajectory-sources/index.ts +2 -2
  415. package/src/learning/trajectory-sources/pipeline.ts +5 -5
  416. package/src/learning/unified-pipeline.ts +1191 -0
  417. package/src/memory/candidate-retrieval.ts +72 -0
  418. package/src/memory/causal-store.ts +273 -0
  419. package/src/memory/coherence.ts +252 -0
  420. package/src/memory/experience.ts +217 -50
  421. package/src/memory/index.ts +43 -0
  422. package/src/memory/knowledge-bank.ts +57 -0
  423. package/src/memory/meta.ts +78 -96
  424. package/src/memory/playbook.ts +239 -75
  425. package/src/memory/reasoning-bank.ts +458 -0
  426. package/src/memory/reflexion.ts +122 -0
  427. package/src/memory/system.ts +21 -5
  428. package/src/memory/temporal-compressor.ts +409 -0
  429. package/src/persistence/index.ts +37 -0
  430. package/src/persistence/migrator.ts +298 -0
  431. package/src/persistence/serializers.ts +79 -0
  432. package/src/persistence/sqlite-persistence.ts +925 -0
  433. package/src/runtime/flows/learning.ts +25 -42
  434. package/src/search/index.ts +10 -0
  435. package/src/search/moe-gate.ts +304 -0
  436. package/src/search/router.ts +111 -4
  437. package/src/session-bank/git-reader.ts +29 -19
  438. package/src/session-bank/index.ts +4 -2
  439. package/src/session-bank/parser.ts +280 -98
  440. package/src/session-bank/session-bank.ts +33 -12
  441. package/src/session-bank/types.ts +8 -5
  442. package/src/surfacing/skill-publisher.ts +17 -49
  443. package/src/surfacing/sqlite-storage-adapter.ts +16 -32
  444. package/src/types/config.ts +30 -0
  445. package/src/types/index.ts +3 -0
  446. package/src/types/memory.ts +30 -0
  447. package/src/types/playbook.ts +4 -0
  448. package/src/utils/error-classifier.ts +113 -0
  449. package/src/utils/index.ts +18 -0
  450. package/src/utils/partitioned-store.ts +299 -0
  451. package/src/utils/trajectory-helpers.ts +79 -0
  452. package/src/workspace/efficacy-toolkit.ts +496 -0
  453. package/src/workspace/index.ts +29 -0
  454. package/src/workspace/runner.ts +3 -3
  455. package/src/workspace/templates/index.ts +24 -0
  456. package/src/workspace/templates/playbook-decay-detection.ts +272 -0
  457. package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
  458. package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
  459. package/src/workspace/types.ts +10 -2
  460. package/tests/embeddings/inverted-index.test.ts +138 -0
  461. package/tests/feature-toggles.test.ts +275 -0
  462. package/tests/fixtures/behavioral-trajectories.ts +210 -0
  463. package/tests/gap-fixes.test.ts +17 -4
  464. package/tests/integration/cli-e2e.test.ts +621 -0
  465. package/tests/integration/e2e.test.ts +6 -5
  466. package/tests/integration/entire-e2e.test.ts +314 -125
  467. package/tests/integration/persistence-e2e.test.ts +741 -0
  468. package/tests/integration/phase-e2e.test.ts +1143 -0
  469. package/tests/integration/pipeline-data-correctness.test.ts +794 -0
  470. package/tests/integration/session-bank.test.ts +20 -14
  471. package/tests/integration/sessionlog-e2e.test.ts +329 -0
  472. package/tests/integration/unified-pipeline-e2e.test.ts +634 -0
  473. package/tests/learning/analyzer.test.ts +1 -1
  474. package/tests/learning/energy-evaluator.test.ts +180 -0
  475. package/tests/learning/entire-trajectory-source.test.ts +25 -25
  476. package/tests/learning/healing-orchestrator.test.ts +269 -0
  477. package/tests/learning/instant-loop.test.ts +243 -0
  478. package/tests/learning/maintenance-scheduler.test.ts +191 -0
  479. package/tests/learning/meta-learner.test.ts +418 -0
  480. package/tests/learning/pipeline-memory-updates.test.ts +721 -0
  481. package/tests/learning/reflexion-generator.test.ts +411 -0
  482. package/tests/learning/trajectory-sources.test.ts +12 -4
  483. package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
  484. package/tests/learning/unified-pipeline.test.ts +322 -0
  485. package/tests/mcp/playbook-server.test.ts +6 -1
  486. package/tests/memory/candidate-retrieval.test.ts +167 -0
  487. package/tests/memory/causal-store.test.ts +276 -0
  488. package/tests/memory/coherence.test.ts +232 -0
  489. package/tests/memory/experience.test.ts +8 -3
  490. package/tests/memory/meta.test.ts +399 -0
  491. package/tests/memory/playbook.test.ts +307 -1
  492. package/tests/memory/provenance.test.ts +11 -2
  493. package/tests/memory/reasoning-bank.test.ts +239 -0
  494. package/tests/memory/reflexion.test.ts +166 -0
  495. package/tests/memory/skill-exporter.test.ts +6 -1
  496. package/tests/memory/system.test.ts +6 -1
  497. package/tests/memory/temporal-compressor.test.ts +318 -0
  498. package/tests/persistence/migrator.test.ts +1009 -0
  499. package/tests/persistence/sqlite-persistence.test.ts +635 -0
  500. package/tests/runtime/agent-manager.test.ts +6 -1
  501. package/tests/runtime/delegate.test.ts +6 -1
  502. package/tests/search/evaluator.test.ts +257 -0
  503. package/tests/search/moe-gate.test.ts +250 -0
  504. package/tests/search/refinement-loop.test.ts +11 -2
  505. package/tests/search/router.test.ts +81 -2
  506. package/tests/search/verification-runner.test.ts +357 -0
  507. package/tests/session-bank/fixtures/sessionlog-root-metadata.json +16 -0
  508. package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +6 -0
  509. package/tests/session-bank/fixtures/sessionlog-session/metadata.json +55 -0
  510. package/tests/session-bank/git-reader.test.ts +13 -13
  511. package/tests/session-bank/parser.test.ts +135 -3
  512. package/tests/session-bank/session-bank.test.ts +1 -1
  513. package/tests/surfacing/skill-library.test.ts +6 -1
  514. package/tests/surfacing/skill-publisher.test.ts +24 -58
  515. package/tests/surfacing/sqlite-storage-adapter.test.ts +11 -23
  516. package/tests/utils/error-classifier.test.ts +149 -0
  517. package/tests/utils/partitioned-store.test.ts +230 -0
  518. package/tests/utils/trajectory-helpers.test.ts +163 -0
  519. package/tests/workspace/efficacy-toolkit.test.ts +404 -0
  520. package/tests/workspace/full-flow.test.ts +10 -4
  521. package/tests/workspace/runner.test.ts +10 -4
  522. package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
  523. package/docs/DESIGN-workspace-migration.md +0 -1079
  524. package/docs/PLAN-agentic-workspace-implementation.md +0 -717
  525. package/docs/PLAN-graph-migration.md +0 -299
  526. package/docs/PLAN-session-bank-implementation.md +0 -474
  527. package/src/learning/pipeline.ts +0 -323
  528. package/tests/learning/pipeline.test.ts +0 -176
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Session bank CLI commands.
3
+ *
4
+ * SessionBank is standalone — it reads SessionLog checkpoint data from
5
+ * orphan branches and does NOT depend on Atlas.
6
+ */
7
+
8
+ import { join } from 'node:path';
9
+ import { SessionBank } from '../../session-bank/session-bank.js';
10
+ import type { SessionQuery, SessionRecord } from '../../session-bank/types.js';
11
+ import type { CLIOptions } from '../cli-utils.js';
12
+ import { outputJson, resolveStorageDir } from '../cli-utils.js';
13
+
14
+ // ─── Local Lifecycle Wrapper ──────────────────────────────────────────
15
+
16
+ async function withSessionBank<T>(
17
+ options: CLIOptions,
18
+ fn: (bank: SessionBank) => Promise<T>,
19
+ ): Promise<T> {
20
+ const stateDir = join(options.dir || resolveStorageDir(), 'session-bank');
21
+ const bank = new SessionBank({
22
+ repoPath: options.repo || process.cwd(),
23
+ stateDir,
24
+ });
25
+ try {
26
+ await bank.init();
27
+ if (!bank.isAvailable()) {
28
+ throw new Error(
29
+ 'SessionLog not available. No checkpoint branch found in this repository.',
30
+ );
31
+ }
32
+ return await fn(bank);
33
+ } finally {
34
+ await bank.close();
35
+ }
36
+ }
37
+
38
+ // ─── Formatters ───────────────────────────────────────────────────────
39
+
40
+ function formatSessionLine(s: SessionRecord): string {
41
+ const date = s.metadata.createdAt.toISOString().slice(0, 19).replace('T', ' ');
42
+ const files = s.metadata.filesTouched.length;
43
+ const agent = s.metadata.agent || 'unknown';
44
+ const branch = s.metadata.branch || '-';
45
+ return [
46
+ ` ${s.sessionId}`,
47
+ ` Checkpoint: ${s.checkpointId}`,
48
+ ` Date: ${date}`,
49
+ ` Branch: ${branch}`,
50
+ ` Agent: ${agent}`,
51
+ ` Files: ${files}`,
52
+ ].join('\n');
53
+ }
54
+
55
+ // ─── Subcommands ──────────────────────────────────────────────────────
56
+
57
+ async function sessionsList(options: CLIOptions): Promise<void> {
58
+ await withSessionBank(options, async (bank) => {
59
+ let sessions = await bank.discover();
60
+
61
+ // Sort newest first
62
+ sessions.sort(
63
+ (a, b) => b.metadata.createdAt.getTime() - a.metadata.createdAt.getTime(),
64
+ );
65
+
66
+ // Apply limit
67
+ if (options.limit && options.limit > 0) {
68
+ sessions = sessions.slice(0, options.limit);
69
+ }
70
+
71
+ if (options.format === 'json') {
72
+ const summaries = sessions.map((s) => ({
73
+ sessionId: s.sessionId,
74
+ checkpointId: s.checkpointId,
75
+ createdAt: s.metadata.createdAt.toISOString(),
76
+ branch: s.metadata.branch,
77
+ agent: s.metadata.agent,
78
+ filesCount: s.metadata.filesTouched.length,
79
+ hasSummary: s.summary !== undefined,
80
+ }));
81
+ outputJson(summaries);
82
+ return;
83
+ }
84
+
85
+ if (sessions.length === 0) {
86
+ console.log('No sessions found.');
87
+ return;
88
+ }
89
+
90
+ console.log(`Found ${sessions.length} session(s):\n`);
91
+ for (const s of sessions) {
92
+ console.log(formatSessionLine(s));
93
+ console.log('');
94
+ }
95
+ });
96
+ }
97
+
98
+ async function sessionsGet(
99
+ sessionId: string,
100
+ options: CLIOptions,
101
+ ): Promise<void> {
102
+ await withSessionBank(options, async (bank) => {
103
+ const record = await bank.getBySessionId(sessionId);
104
+
105
+ if (!record) {
106
+ throw new Error(`Session not found: ${sessionId}`);
107
+ }
108
+
109
+ if (options.format === 'json') {
110
+ outputJson(record);
111
+ return;
112
+ }
113
+
114
+ const date = record.metadata.createdAt.toISOString().slice(0, 19).replace('T', ' ');
115
+ console.log(`Session: ${record.sessionId}`);
116
+ console.log(`Checkpoint: ${record.checkpointId}`);
117
+ console.log(`Date: ${date}`);
118
+ console.log(`Branch: ${record.metadata.branch}`);
119
+ console.log(`Agent: ${record.metadata.agent}`);
120
+ console.log(`Strategy: ${record.metadata.strategy}`);
121
+ console.log(`Files touched: ${record.metadata.filesTouched.length}`);
122
+ console.log(`Transcript messages: ${record.transcript.length}`);
123
+
124
+ if (record.summary) {
125
+ console.log('');
126
+ console.log('Summary:');
127
+ console.log(` Intent: ${record.summary.intent}`);
128
+ console.log(` Outcome: ${record.summary.outcome}`);
129
+ }
130
+
131
+ if (record.tokenUsage) {
132
+ console.log('');
133
+ console.log('Token usage:');
134
+ console.log(` Input: ${record.tokenUsage.inputTokens}`);
135
+ console.log(` Output: ${record.tokenUsage.outputTokens}`);
136
+ console.log(` Total: ${record.tokenUsage.total}`);
137
+ }
138
+ });
139
+ }
140
+
141
+ async function sessionsQuery(options: CLIOptions): Promise<void> {
142
+ await withSessionBank(options, async (bank) => {
143
+ const query: SessionQuery = {};
144
+
145
+ if (options.agent) query.agent = options.agent;
146
+ if (options.since) query.since = new Date(options.since);
147
+ if (options.before) query.before = new Date(options.before);
148
+ if (options.limit) query.limit = options.limit;
149
+ if (options.branch) query.branch = options.branch;
150
+
151
+ const result = await bank.query(query);
152
+
153
+ if (options.format === 'json') {
154
+ const summaries = result.sessions.map((s) => ({
155
+ sessionId: s.sessionId,
156
+ checkpointId: s.checkpointId,
157
+ createdAt: s.metadata.createdAt.toISOString(),
158
+ branch: s.metadata.branch,
159
+ agent: s.metadata.agent,
160
+ filesCount: s.metadata.filesTouched.length,
161
+ hasSummary: s.summary !== undefined,
162
+ }));
163
+ outputJson({ sessions: summaries, total: result.total });
164
+ return;
165
+ }
166
+
167
+ if (result.sessions.length === 0) {
168
+ console.log('No sessions match the query.');
169
+ return;
170
+ }
171
+
172
+ console.log(`${result.sessions.length} of ${result.total} session(s):\n`);
173
+ for (const s of result.sessions) {
174
+ console.log(formatSessionLine(s));
175
+ console.log('');
176
+ }
177
+ });
178
+ }
179
+
180
+ // ─── Dispatcher ───────────────────────────────────────────────────────
181
+
182
+ export async function sessionsCommand(
183
+ command: string,
184
+ positional: string[],
185
+ options: CLIOptions,
186
+ ): Promise<void> {
187
+ switch (command) {
188
+ case 'list':
189
+ await sessionsList(options);
190
+ break;
191
+
192
+ case 'get':
193
+ if (!positional[0]) {
194
+ console.error('Usage: cogcore sessions get <session-id>');
195
+ process.exit(1);
196
+ }
197
+ await sessionsGet(positional[0], options);
198
+ break;
199
+
200
+ case 'query':
201
+ await sessionsQuery(options);
202
+ break;
203
+
204
+ default:
205
+ console.log(`
206
+ Sessions — interact with SessionLog checkpoint data
207
+
208
+ Usage:
209
+ cogcore sessions list [--limit <n>] [--json]
210
+ cogcore sessions get <session-id> [--json]
211
+ cogcore sessions query [--agent <name>] [--branch <branch>]
212
+ [--since <date>] [--before <date>]
213
+ [--limit <n>] [--json]
214
+ `);
215
+ if (command) {
216
+ console.error(`Unknown sessions subcommand: ${command}`);
217
+ process.exit(1);
218
+ }
219
+ break;
220
+ }
221
+ }
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Skills CLI commands — list, stats, refresh.
3
+ */
4
+
5
+ import { getPlaybookSuccessRate } from '../../types/playbook.js';
6
+ import {
7
+ type CLIOptions,
8
+ withAtlas,
9
+ requireSkillLibrary,
10
+ } from '../cli-utils.js';
11
+
12
+ export async function skillsCommand(
13
+ command: string,
14
+ _positional: string[],
15
+ options: CLIOptions,
16
+ ): Promise<void> {
17
+ switch (command) {
18
+ case 'list':
19
+ return skillsList(options);
20
+ case 'stats':
21
+ return skillsStats(options);
22
+ case 'refresh':
23
+ return skillsRefresh(options);
24
+ default:
25
+ if (command) {
26
+ console.error(`Unknown skills command: ${command}`);
27
+ }
28
+ console.log('Usage: cogcore skills <command>\n');
29
+ console.log('Commands:');
30
+ console.log(' list List skills (--tier core|domain)');
31
+ console.log(' stats Show skill library statistics');
32
+ console.log(' refresh Refresh skill tiers');
33
+ process.exit(command ? 1 : 0);
34
+ }
35
+ }
36
+
37
+ async function skillsList(options: CLIOptions): Promise<void> {
38
+ await withAtlas(options, async (atlas) => {
39
+ const lib = requireSkillLibrary(atlas);
40
+
41
+ let playbooks;
42
+ if (options.tier === 'core') {
43
+ playbooks = lib.getCoreSkills();
44
+ } else if (options.tier === 'domain') {
45
+ playbooks = [];
46
+ for (const domain of lib.getDomains()) {
47
+ playbooks.push(...lib.getDomainSkills(domain));
48
+ }
49
+ } else {
50
+ playbooks = [...lib.getCoreSkills()];
51
+ for (const domain of lib.getDomains()) {
52
+ for (const pb of lib.getDomainSkills(domain)) {
53
+ if (!playbooks.some((p) => p.id === pb.id)) {
54
+ playbooks.push(pb);
55
+ }
56
+ }
57
+ }
58
+ }
59
+
60
+ const coreIds = new Set(lib.getCoreSkills().map((c) => c.id));
61
+
62
+ if (options.format === 'json') {
63
+ const results = playbooks.map((pb) => ({
64
+ id: pb.id,
65
+ name: pb.name,
66
+ confidence: pb.confidence,
67
+ domains: pb.applicability.domains,
68
+ tier: coreIds.has(pb.id) ? 'core' : 'domain',
69
+ successRate: getPlaybookSuccessRate(pb),
70
+ }));
71
+ console.log(JSON.stringify(results, null, 2));
72
+ } else {
73
+ if (playbooks.length === 0) {
74
+ console.log('No skills found.');
75
+ return;
76
+ }
77
+ console.log(`Found ${playbooks.length} skill(s):\n`);
78
+ for (const pb of playbooks) {
79
+ const tier = coreIds.has(pb.id) ? 'core' : 'domain';
80
+ const confidence = Math.round(pb.confidence * 100);
81
+ const successRate = Math.round(getPlaybookSuccessRate(pb) * 100);
82
+ const domains = pb.applicability.domains.join(', ');
83
+ console.log(` ${pb.id} ${pb.name}`);
84
+ console.log(` Tier: ${tier} Confidence: ${confidence}% Success: ${successRate}% Domains: ${domains}`);
85
+ }
86
+ }
87
+ });
88
+ }
89
+
90
+ async function skillsStats(options: CLIOptions): Promise<void> {
91
+ await withAtlas(options, async (atlas) => {
92
+ const lib = requireSkillLibrary(atlas);
93
+ const stats = lib.getStats();
94
+
95
+ if (options.format === 'json') {
96
+ console.log(JSON.stringify(stats, null, 2));
97
+ } else {
98
+ console.log('Skill Library Stats:\n');
99
+ console.log(` Core skills: ${stats.coreSkillCount}`);
100
+ const domainEntries = Object.entries(stats.domainSkillCounts);
101
+ if (domainEntries.length > 0) {
102
+ console.log(' Domain skills:');
103
+ for (const [domain, count] of domainEntries) {
104
+ console.log(` ${domain}: ${count}`);
105
+ }
106
+ } else {
107
+ console.log(' Domain skills: (none)');
108
+ }
109
+ console.log(` Last refresh: ${stats.lastRefresh?.toISOString() ?? 'never'}`);
110
+ const failureEntries = Object.entries(stats.consecutiveFailures);
111
+ if (failureEntries.length > 0) {
112
+ console.log(' Consecutive failures:');
113
+ for (const [id, count] of failureEntries) {
114
+ console.log(` ${id}: ${count}`);
115
+ }
116
+ }
117
+ }
118
+ });
119
+ }
120
+
121
+ async function skillsRefresh(options: CLIOptions): Promise<void> {
122
+ await withAtlas(options, async (atlas) => {
123
+ const lib = requireSkillLibrary(atlas);
124
+ const result = await lib.refreshTiers();
125
+
126
+ if (options.format === 'json') {
127
+ console.log(JSON.stringify(result, null, 2));
128
+ } else {
129
+ console.log('Tier refresh complete.\n');
130
+ if (result.promoted.length > 0) {
131
+ console.log(` Promoted: ${result.promoted.join(', ')}`);
132
+ }
133
+ if (result.demoted.length > 0) {
134
+ console.log(` Demoted: ${result.demoted.join(', ')}`);
135
+ }
136
+ console.log(` Core count: ${result.coreCount}`);
137
+ const domainEntries = Object.entries(result.domainCounts);
138
+ if (domainEntries.length > 0) {
139
+ console.log(' Domain counts:');
140
+ for (const [domain, count] of domainEntries) {
141
+ console.log(` ${domain}: ${count}`);
142
+ }
143
+ }
144
+ }
145
+ });
146
+ }
@@ -30,6 +30,9 @@ export {
30
30
  type VectorSearchResult,
31
31
  } from './vector-store.js';
32
32
 
33
+ // Inverted index (candidate narrowing)
34
+ export { InvertedIndex } from './inverted-index.js';
35
+
33
36
  // Embedding manager (main interface)
34
37
  export {
35
38
  EmbeddingManager,
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Inverted Index
3
+ *
4
+ * Lightweight inverted index mapping tokens → document IDs for fast candidate
5
+ * narrowing. Used as an acceleration structure before expensive similarity
6
+ * scoring — not a replacement for scoring.
7
+ *
8
+ * Reuses the same tokenization approach as BM25Index (lowercase, split on
9
+ * whitespace/punctuation, filter stopwords).
10
+ */
11
+
12
+ /**
13
+ * Inverted index for fast candidate set narrowing
14
+ */
15
+ export class InvertedIndex {
16
+ private postings: Map<string, Set<string>> = new Map();
17
+ private docTokens: Map<string, string[]> = new Map();
18
+
19
+ /**
20
+ * Add a document to the index
21
+ */
22
+ add(id: string, content: string): void {
23
+ // Remove existing entry if updating
24
+ if (this.docTokens.has(id)) {
25
+ this.remove(id);
26
+ }
27
+
28
+ const tokens = this.tokenize(content);
29
+ this.docTokens.set(id, tokens);
30
+
31
+ for (const token of tokens) {
32
+ let posting = this.postings.get(token);
33
+ if (!posting) {
34
+ posting = new Set();
35
+ this.postings.set(token, posting);
36
+ }
37
+ posting.add(id);
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Remove a document from the index
43
+ */
44
+ remove(id: string): boolean {
45
+ const tokens = this.docTokens.get(id);
46
+ if (!tokens) return false;
47
+
48
+ for (const token of tokens) {
49
+ const posting = this.postings.get(token);
50
+ if (posting) {
51
+ posting.delete(id);
52
+ if (posting.size === 0) {
53
+ this.postings.delete(token);
54
+ }
55
+ }
56
+ }
57
+
58
+ this.docTokens.delete(id);
59
+ return true;
60
+ }
61
+
62
+ /**
63
+ * Check if a document exists in the index
64
+ */
65
+ has(id: string): boolean {
66
+ return this.docTokens.has(id);
67
+ }
68
+
69
+ /**
70
+ * Get candidate document IDs for a query, ranked by number of matching tokens.
71
+ * Returns at most maxCandidates results.
72
+ */
73
+ getCandidates(query: string, maxCandidates = 50): string[] {
74
+ const queryTokens = this.tokenize(query);
75
+ if (queryTokens.length === 0) return [];
76
+
77
+ // Count matching tokens per document
78
+ const scores = new Map<string, number>();
79
+
80
+ for (const token of queryTokens) {
81
+ const posting = this.postings.get(token);
82
+ if (!posting) continue;
83
+ for (const id of posting) {
84
+ scores.set(id, (scores.get(id) ?? 0) + 1);
85
+ }
86
+ }
87
+
88
+ // Sort by match count descending, take top maxCandidates
89
+ return Array.from(scores.entries())
90
+ .sort((a, b) => b[1] - a[1])
91
+ .slice(0, maxCandidates)
92
+ .map(([id]) => id);
93
+ }
94
+
95
+ /**
96
+ * Get the number of documents in the index
97
+ */
98
+ size(): number {
99
+ return this.docTokens.size;
100
+ }
101
+
102
+ /**
103
+ * Clear the entire index
104
+ */
105
+ clear(): void {
106
+ this.postings.clear();
107
+ this.docTokens.clear();
108
+ }
109
+
110
+ /**
111
+ * Tokenize text — lowercase, split on non-word chars, filter stopwords and short tokens
112
+ */
113
+ private tokenize(text: string): string[] {
114
+ return text
115
+ .toLowerCase()
116
+ .replace(/[^\w\s]/g, ' ')
117
+ .split(/\s+/)
118
+ .filter((t) => t.length > 1)
119
+ .filter((t) => !STOP_WORDS.has(t));
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Common English stop words (same set as BM25Index)
125
+ */
126
+ const STOP_WORDS = new Set([
127
+ 'a', 'an', 'and', 'are', 'as', 'at', 'be', 'by', 'for', 'from',
128
+ 'has', 'he', 'in', 'is', 'it', 'its', 'of', 'on', 'or', 'that',
129
+ 'the', 'to', 'was', 'were', 'will', 'with', 'this', 'but', 'they',
130
+ 'have', 'had', 'what', 'when', 'where', 'who', 'which', 'why', 'how',
131
+ 'all', 'each', 'every', 'both', 'few', 'more', 'most', 'other', 'some',
132
+ 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too',
133
+ 'very', 'can', 'just', 'should', 'now',
134
+ ]);
@@ -20,7 +20,9 @@ export interface SearchResult {
20
20
  export interface EmbeddingManagerOptions {
21
21
  /** Embedding provider (null for BM25-only mode) */
22
22
  provider?: EmbeddingProvider | null;
23
- /** Path to sqlite-vec database file */
23
+ /** Shared DB connection from SqlitePersistence (preferred) */
24
+ db?: import('better-sqlite3').Database;
25
+ /** Path to sqlite-vec database file (legacy: separate DB file) */
24
26
  vectorStorePath?: string;
25
27
  /** Embedding dimension (required if provider is set) */
26
28
  dimension?: number;
@@ -42,15 +44,18 @@ export class EmbeddingManager {
42
44
 
43
45
  constructor(options: EmbeddingManagerOptions) {
44
46
  this.provider = options.provider ?? null;
45
- this.useVectorSearch = this.provider !== null && !!options.vectorStorePath;
47
+ this.useVectorSearch = this.provider !== null && !!(options.vectorStorePath || options.db);
46
48
 
47
- // Initialize vector store if we have a provider and path
48
- if (this.useVectorSearch && options.vectorStorePath) {
49
+ // Initialize vector store if we have a provider and a DB source
50
+ if (this.useVectorSearch) {
49
51
  const dimension = options.dimension ?? this.provider!.dimension;
50
- this.vectorStore = new SqliteVectorStore({
51
- dbPath: options.vectorStorePath,
52
- dimension,
53
- });
52
+ if (options.db) {
53
+ this.vectorStore = new SqliteVectorStore({ db: options.db, dimension });
54
+ } else if (options.vectorStorePath) {
55
+ this.vectorStore = new SqliteVectorStore({ dbPath: options.vectorStorePath, dimension });
56
+ } else {
57
+ this.vectorStore = null;
58
+ }
54
59
  } else {
55
60
  this.vectorStore = null;
56
61
  }
@@ -24,20 +24,29 @@ export class SqliteVectorStore {
24
24
  private dimension: number;
25
25
  private tableName: string;
26
26
  private initialized: boolean = false;
27
+ private ownsDb: boolean;
27
28
 
28
29
  constructor(options: {
29
- dbPath: string;
30
+ db?: Database.Database; // Shared DB connection (preferred)
31
+ dbPath?: string; // Legacy: opens own connection
30
32
  dimension: number;
31
33
  tableName?: string;
32
34
  }) {
33
35
  this.dimension = options.dimension;
34
36
  this.tableName = options.tableName ?? 'atlas_embeddings';
35
37
 
36
- // Create or open the database
37
- this.db = new Database(options.dbPath);
38
-
39
- // Load the sqlite-vec extension
40
- sqliteVec.load(this.db);
38
+ if (options.db) {
39
+ this.db = options.db;
40
+ this.ownsDb = false;
41
+ // sqlite-vec may already be loaded on shared connection
42
+ try { sqliteVec.load(this.db); } catch { /* already loaded */ }
43
+ } else if (options.dbPath) {
44
+ this.db = new Database(options.dbPath);
45
+ this.ownsDb = true;
46
+ sqliteVec.load(this.db);
47
+ } else {
48
+ throw new Error('Either db or dbPath must be provided');
49
+ }
41
50
 
42
51
  this.initialize();
43
52
  }
@@ -312,10 +321,12 @@ export class SqliteVectorStore {
312
321
  }
313
322
 
314
323
  /**
315
- * Close the database connection
324
+ * Close the database connection (only if this instance owns it)
316
325
  */
317
326
  close(): void {
318
- this.db.close();
327
+ if (this.ownsDb) {
328
+ this.db.close();
329
+ }
319
330
  }
320
331
 
321
332
  /**
@@ -345,7 +356,8 @@ export class SqliteVectorStore {
345
356
  * Create a new vector store
346
357
  */
347
358
  export function createVectorStore(options: {
348
- dbPath: string;
359
+ db?: Database.Database;
360
+ dbPath?: string;
349
361
  dimension: number;
350
362
  tableName?: string;
351
363
  }): SqliteVectorStore {