cognitive-core 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/.claude/settings.json +111 -2
  2. package/.sessionlog/settings.json +4 -0
  3. package/CLAUDE.md +233 -0
  4. package/README.md +370 -54
  5. package/dist/atlas.d.ts +10 -10
  6. package/dist/atlas.d.ts.map +1 -1
  7. package/dist/atlas.js +79 -48
  8. package/dist/atlas.js.map +1 -1
  9. package/dist/bin/cli-utils.d.ts +37 -0
  10. package/dist/bin/cli-utils.d.ts.map +1 -0
  11. package/dist/bin/cli-utils.js +176 -0
  12. package/dist/bin/cli-utils.js.map +1 -0
  13. package/dist/bin/cognitive-core.d.ts +2 -12
  14. package/dist/bin/cognitive-core.d.ts.map +1 -1
  15. package/dist/bin/cognitive-core.js +76 -351
  16. package/dist/bin/cognitive-core.js.map +1 -1
  17. package/dist/bin/commands/kb.d.ts +6 -0
  18. package/dist/bin/commands/kb.d.ts.map +1 -0
  19. package/dist/bin/commands/kb.js +240 -0
  20. package/dist/bin/commands/kb.js.map +1 -0
  21. package/dist/bin/commands/learn.d.ts +6 -0
  22. package/dist/bin/commands/learn.d.ts.map +1 -0
  23. package/dist/bin/commands/learn.js +91 -0
  24. package/dist/bin/commands/learn.js.map +1 -0
  25. package/dist/bin/commands/legacy.d.ts +12 -0
  26. package/dist/bin/commands/legacy.d.ts.map +1 -0
  27. package/dist/bin/commands/legacy.js +142 -0
  28. package/dist/bin/commands/legacy.js.map +1 -0
  29. package/dist/bin/commands/run.d.ts +3 -0
  30. package/dist/bin/commands/run.d.ts.map +1 -0
  31. package/dist/bin/commands/run.js +99 -0
  32. package/dist/bin/commands/run.js.map +1 -0
  33. package/dist/bin/commands/sessions.d.ts +9 -0
  34. package/dist/bin/commands/sessions.d.ts.map +1 -0
  35. package/dist/bin/commands/sessions.js +183 -0
  36. package/dist/bin/commands/sessions.js.map +1 -0
  37. package/dist/bin/commands/skills.d.ts +6 -0
  38. package/dist/bin/commands/skills.d.ts.map +1 -0
  39. package/dist/bin/commands/skills.js +135 -0
  40. package/dist/bin/commands/skills.js.map +1 -0
  41. package/dist/embeddings/index.d.ts +1 -0
  42. package/dist/embeddings/index.d.ts.map +1 -1
  43. package/dist/embeddings/index.js +2 -0
  44. package/dist/embeddings/index.js.map +1 -1
  45. package/dist/embeddings/inverted-index.d.ts +47 -0
  46. package/dist/embeddings/inverted-index.d.ts.map +1 -0
  47. package/dist/embeddings/inverted-index.js +122 -0
  48. package/dist/embeddings/inverted-index.js.map +1 -0
  49. package/dist/embeddings/manager.d.ts +3 -1
  50. package/dist/embeddings/manager.d.ts.map +1 -1
  51. package/dist/embeddings/manager.js +12 -7
  52. package/dist/embeddings/manager.js.map +1 -1
  53. package/dist/embeddings/vector-store.d.ts +7 -3
  54. package/dist/embeddings/vector-store.d.ts.map +1 -1
  55. package/dist/embeddings/vector-store.js +22 -6
  56. package/dist/embeddings/vector-store.js.map +1 -1
  57. package/dist/factory.d.ts +11 -12
  58. package/dist/factory.d.ts.map +1 -1
  59. package/dist/factory.js +20 -7
  60. package/dist/factory.js.map +1 -1
  61. package/dist/index.d.ts +8 -7
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +42 -6
  64. package/dist/index.js.map +1 -1
  65. package/dist/learning/analyzer.d.ts.map +1 -1
  66. package/dist/learning/analyzer.js +17 -35
  67. package/dist/learning/analyzer.js.map +1 -1
  68. package/dist/learning/energy-evaluator.d.ts +128 -0
  69. package/dist/learning/energy-evaluator.d.ts.map +1 -0
  70. package/dist/learning/energy-evaluator.js +175 -0
  71. package/dist/learning/energy-evaluator.js.map +1 -0
  72. package/dist/learning/healing-orchestrator.d.ts +182 -0
  73. package/dist/learning/healing-orchestrator.d.ts.map +1 -0
  74. package/dist/learning/healing-orchestrator.js +250 -0
  75. package/dist/learning/healing-orchestrator.js.map +1 -0
  76. package/dist/learning/index.d.ts +7 -2
  77. package/dist/learning/index.d.ts.map +1 -1
  78. package/dist/learning/index.js +13 -2
  79. package/dist/learning/index.js.map +1 -1
  80. package/dist/learning/instant-loop.d.ts +87 -0
  81. package/dist/learning/instant-loop.d.ts.map +1 -0
  82. package/dist/learning/instant-loop.js +264 -0
  83. package/dist/learning/instant-loop.js.map +1 -0
  84. package/dist/learning/loop-coordinator.d.ts +61 -0
  85. package/dist/learning/loop-coordinator.d.ts.map +1 -0
  86. package/dist/learning/loop-coordinator.js +96 -0
  87. package/dist/learning/loop-coordinator.js.map +1 -0
  88. package/dist/learning/maintenance-scheduler.d.ts +141 -0
  89. package/dist/learning/maintenance-scheduler.d.ts.map +1 -0
  90. package/dist/learning/maintenance-scheduler.js +186 -0
  91. package/dist/learning/maintenance-scheduler.js.map +1 -0
  92. package/dist/learning/meta-learner.d.ts.map +1 -1
  93. package/dist/learning/meta-learner.js +4 -21
  94. package/dist/learning/meta-learner.js.map +1 -1
  95. package/dist/learning/pipeline.d.ts +31 -4
  96. package/dist/learning/pipeline.d.ts.map +1 -1
  97. package/dist/learning/pipeline.js +64 -12
  98. package/dist/learning/pipeline.js.map +1 -1
  99. package/dist/learning/reflexion-generator.d.ts +64 -0
  100. package/dist/learning/reflexion-generator.d.ts.map +1 -0
  101. package/dist/learning/reflexion-generator.js +194 -0
  102. package/dist/learning/reflexion-generator.js.map +1 -0
  103. package/dist/learning/trajectory-sources/entire.d.ts +8 -5
  104. package/dist/learning/trajectory-sources/entire.d.ts.map +1 -1
  105. package/dist/learning/trajectory-sources/entire.js +13 -6
  106. package/dist/learning/trajectory-sources/entire.js.map +1 -1
  107. package/dist/learning/trajectory-sources/index.d.ts +1 -1
  108. package/dist/learning/trajectory-sources/index.d.ts.map +1 -1
  109. package/dist/learning/trajectory-sources/index.js +1 -1
  110. package/dist/learning/trajectory-sources/index.js.map +1 -1
  111. package/dist/learning/trajectory-sources/pipeline.d.ts +4 -4
  112. package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -1
  113. package/dist/learning/trajectory-sources/pipeline.js +2 -2
  114. package/dist/learning/trajectory-sources/pipeline.js.map +1 -1
  115. package/dist/learning/unified-pipeline.d.ts +311 -0
  116. package/dist/learning/unified-pipeline.d.ts.map +1 -0
  117. package/dist/learning/unified-pipeline.js +844 -0
  118. package/dist/learning/unified-pipeline.js.map +1 -0
  119. package/dist/memory/candidate-retrieval.d.ts +43 -0
  120. package/dist/memory/candidate-retrieval.d.ts.map +1 -0
  121. package/dist/memory/candidate-retrieval.js +43 -0
  122. package/dist/memory/candidate-retrieval.js.map +1 -0
  123. package/dist/memory/causal-store.d.ts +97 -0
  124. package/dist/memory/causal-store.d.ts.map +1 -0
  125. package/dist/memory/causal-store.js +209 -0
  126. package/dist/memory/causal-store.js.map +1 -0
  127. package/dist/memory/coherence.d.ts +71 -0
  128. package/dist/memory/coherence.d.ts.map +1 -0
  129. package/dist/memory/coherence.js +176 -0
  130. package/dist/memory/coherence.js.map +1 -0
  131. package/dist/memory/experience.d.ts +39 -6
  132. package/dist/memory/experience.d.ts.map +1 -1
  133. package/dist/memory/experience.js +193 -49
  134. package/dist/memory/experience.js.map +1 -1
  135. package/dist/memory/index.d.ts +7 -0
  136. package/dist/memory/index.d.ts.map +1 -1
  137. package/dist/memory/index.js +12 -0
  138. package/dist/memory/index.js.map +1 -1
  139. package/dist/memory/knowledge-bank.d.ts +14 -0
  140. package/dist/memory/knowledge-bank.d.ts.map +1 -1
  141. package/dist/memory/knowledge-bank.js +45 -0
  142. package/dist/memory/knowledge-bank.js.map +1 -1
  143. package/dist/memory/meta.d.ts +7 -8
  144. package/dist/memory/meta.d.ts.map +1 -1
  145. package/dist/memory/meta.js +73 -79
  146. package/dist/memory/meta.js.map +1 -1
  147. package/dist/memory/playbook.d.ts +26 -9
  148. package/dist/memory/playbook.d.ts.map +1 -1
  149. package/dist/memory/playbook.js +198 -74
  150. package/dist/memory/playbook.js.map +1 -1
  151. package/dist/memory/reasoning-bank.d.ts +130 -0
  152. package/dist/memory/reasoning-bank.d.ts.map +1 -0
  153. package/dist/memory/reasoning-bank.js +342 -0
  154. package/dist/memory/reasoning-bank.js.map +1 -0
  155. package/dist/memory/reflexion.d.ts +59 -0
  156. package/dist/memory/reflexion.d.ts.map +1 -0
  157. package/dist/memory/reflexion.js +96 -0
  158. package/dist/memory/reflexion.js.map +1 -0
  159. package/dist/memory/system.d.ts +7 -2
  160. package/dist/memory/system.d.ts.map +1 -1
  161. package/dist/memory/system.js +19 -7
  162. package/dist/memory/system.js.map +1 -1
  163. package/dist/memory/temporal-compressor.d.ts +126 -0
  164. package/dist/memory/temporal-compressor.d.ts.map +1 -0
  165. package/dist/memory/temporal-compressor.js +335 -0
  166. package/dist/memory/temporal-compressor.js.map +1 -0
  167. package/dist/persistence/index.d.ts +11 -0
  168. package/dist/persistence/index.d.ts.map +1 -0
  169. package/dist/persistence/index.js +11 -0
  170. package/dist/persistence/index.js.map +1 -0
  171. package/dist/persistence/migrator.d.ts +40 -0
  172. package/dist/persistence/migrator.d.ts.map +1 -0
  173. package/dist/persistence/migrator.js +238 -0
  174. package/dist/persistence/migrator.js.map +1 -0
  175. package/dist/persistence/serializers.d.ts +45 -0
  176. package/dist/persistence/serializers.d.ts.map +1 -0
  177. package/dist/persistence/serializers.js +80 -0
  178. package/dist/persistence/serializers.js.map +1 -0
  179. package/dist/persistence/sqlite-persistence.d.ts +228 -0
  180. package/dist/persistence/sqlite-persistence.d.ts.map +1 -0
  181. package/dist/persistence/sqlite-persistence.js +588 -0
  182. package/dist/persistence/sqlite-persistence.js.map +1 -0
  183. package/dist/runtime/flows/learning.d.ts +10 -12
  184. package/dist/runtime/flows/learning.d.ts.map +1 -1
  185. package/dist/runtime/flows/learning.js +10 -23
  186. package/dist/runtime/flows/learning.js.map +1 -1
  187. package/dist/search/index.d.ts +1 -0
  188. package/dist/search/index.d.ts.map +1 -1
  189. package/dist/search/index.js +2 -0
  190. package/dist/search/index.js.map +1 -1
  191. package/dist/search/moe-gate.d.ts +124 -0
  192. package/dist/search/moe-gate.d.ts.map +1 -0
  193. package/dist/search/moe-gate.js +234 -0
  194. package/dist/search/moe-gate.js.map +1 -0
  195. package/dist/search/router.d.ts +32 -2
  196. package/dist/search/router.d.ts.map +1 -1
  197. package/dist/search/router.js +87 -4
  198. package/dist/search/router.js.map +1 -1
  199. package/dist/session-bank/git-reader.d.ts +9 -4
  200. package/dist/session-bank/git-reader.d.ts.map +1 -1
  201. package/dist/session-bank/git-reader.js +22 -15
  202. package/dist/session-bank/git-reader.js.map +1 -1
  203. package/dist/session-bank/index.d.ts +2 -2
  204. package/dist/session-bank/index.d.ts.map +1 -1
  205. package/dist/session-bank/index.js +2 -2
  206. package/dist/session-bank/index.js.map +1 -1
  207. package/dist/session-bank/parser.d.ts +16 -5
  208. package/dist/session-bank/parser.d.ts.map +1 -1
  209. package/dist/session-bank/parser.js +187 -80
  210. package/dist/session-bank/parser.js.map +1 -1
  211. package/dist/session-bank/session-bank.d.ts +5 -0
  212. package/dist/session-bank/session-bank.d.ts.map +1 -1
  213. package/dist/session-bank/session-bank.js +30 -9
  214. package/dist/session-bank/session-bank.js.map +1 -1
  215. package/dist/session-bank/types.d.ts +4 -1
  216. package/dist/session-bank/types.d.ts.map +1 -1
  217. package/dist/session-bank/types.js +3 -3
  218. package/dist/session-bank/types.js.map +1 -1
  219. package/dist/surfacing/skill-publisher.d.ts.map +1 -1
  220. package/dist/surfacing/skill-publisher.js +15 -43
  221. package/dist/surfacing/skill-publisher.js.map +1 -1
  222. package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -1
  223. package/dist/surfacing/sqlite-storage-adapter.js +13 -21
  224. package/dist/surfacing/sqlite-storage-adapter.js.map +1 -1
  225. package/dist/types/config.d.ts +100 -0
  226. package/dist/types/config.d.ts.map +1 -1
  227. package/dist/types/config.js +27 -0
  228. package/dist/types/config.js.map +1 -1
  229. package/dist/types/index.d.ts +2 -2
  230. package/dist/types/index.d.ts.map +1 -1
  231. package/dist/types/index.js +1 -1
  232. package/dist/types/index.js.map +1 -1
  233. package/dist/types/memory.d.ts +52 -0
  234. package/dist/types/memory.d.ts.map +1 -1
  235. package/dist/types/memory.js +13 -0
  236. package/dist/types/memory.js.map +1 -1
  237. package/dist/types/playbook.d.ts +4 -0
  238. package/dist/types/playbook.d.ts.map +1 -1
  239. package/dist/types/playbook.js.map +1 -1
  240. package/dist/utils/error-classifier.d.ts +30 -0
  241. package/dist/utils/error-classifier.d.ts.map +1 -0
  242. package/dist/utils/error-classifier.js +85 -0
  243. package/dist/utils/error-classifier.js.map +1 -0
  244. package/dist/utils/index.d.ts +3 -0
  245. package/dist/utils/index.d.ts.map +1 -1
  246. package/dist/utils/index.js +3 -0
  247. package/dist/utils/index.js.map +1 -1
  248. package/dist/utils/partitioned-store.d.ts +93 -0
  249. package/dist/utils/partitioned-store.d.ts.map +1 -0
  250. package/dist/utils/partitioned-store.js +251 -0
  251. package/dist/utils/partitioned-store.js.map +1 -0
  252. package/dist/utils/trajectory-helpers.d.ts +39 -0
  253. package/dist/utils/trajectory-helpers.d.ts.map +1 -0
  254. package/dist/utils/trajectory-helpers.js +57 -0
  255. package/dist/utils/trajectory-helpers.js.map +1 -0
  256. package/dist/workspace/efficacy-toolkit.d.ts +164 -0
  257. package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
  258. package/dist/workspace/efficacy-toolkit.js +281 -0
  259. package/dist/workspace/efficacy-toolkit.js.map +1 -0
  260. package/dist/workspace/index.d.ts +2 -1
  261. package/dist/workspace/index.d.ts.map +1 -1
  262. package/dist/workspace/index.js +3 -1
  263. package/dist/workspace/index.js.map +1 -1
  264. package/dist/workspace/runner.d.ts +3 -4
  265. package/dist/workspace/runner.d.ts.map +1 -1
  266. package/dist/workspace/runner.js.map +1 -1
  267. package/dist/workspace/templates/index.d.ts +3 -0
  268. package/dist/workspace/templates/index.d.ts.map +1 -1
  269. package/dist/workspace/templates/index.js +6 -0
  270. package/dist/workspace/templates/index.js.map +1 -1
  271. package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
  272. package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
  273. package/dist/workspace/templates/playbook-decay-detection.js +197 -0
  274. package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
  275. package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
  276. package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
  277. package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
  278. package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
  279. package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
  280. package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
  281. package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
  282. package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
  283. package/dist/workspace/types.d.ts +9 -2
  284. package/dist/workspace/types.d.ts.map +1 -1
  285. package/dist/workspace/types.js.map +1 -1
  286. package/package.json +12 -4
  287. package/references/sessionlog/.husky/pre-commit +1 -0
  288. package/references/sessionlog/.lintstagedrc.json +4 -0
  289. package/references/sessionlog/.prettierignore +4 -0
  290. package/references/sessionlog/.prettierrc.json +11 -0
  291. package/references/sessionlog/LICENSE +21 -0
  292. package/references/sessionlog/README.md +453 -0
  293. package/references/sessionlog/eslint.config.js +58 -0
  294. package/references/sessionlog/package-lock.json +3672 -0
  295. package/references/sessionlog/package.json +65 -0
  296. package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
  297. package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
  298. package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
  299. package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
  300. package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
  301. package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
  302. package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
  303. package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
  304. package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
  305. package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
  306. package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
  307. package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
  308. package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
  309. package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
  310. package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
  311. package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
  312. package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
  313. package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
  314. package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
  315. package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
  316. package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
  317. package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
  318. package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
  319. package/references/sessionlog/src/__tests__/types.test.ts +166 -0
  320. package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
  321. package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
  322. package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
  323. package/references/sessionlog/src/agent/agents/claude-code.ts +1089 -0
  324. package/references/sessionlog/src/agent/agents/cursor.ts +361 -0
  325. package/references/sessionlog/src/agent/agents/gemini-cli.ts +632 -0
  326. package/references/sessionlog/src/agent/agents/opencode.ts +540 -0
  327. package/references/sessionlog/src/agent/registry.ts +143 -0
  328. package/references/sessionlog/src/agent/session-types.ts +113 -0
  329. package/references/sessionlog/src/agent/types.ts +220 -0
  330. package/references/sessionlog/src/cli.ts +597 -0
  331. package/references/sessionlog/src/commands/clean.ts +133 -0
  332. package/references/sessionlog/src/commands/disable.ts +84 -0
  333. package/references/sessionlog/src/commands/doctor.ts +145 -0
  334. package/references/sessionlog/src/commands/enable.ts +202 -0
  335. package/references/sessionlog/src/commands/explain.ts +261 -0
  336. package/references/sessionlog/src/commands/reset.ts +105 -0
  337. package/references/sessionlog/src/commands/resume.ts +180 -0
  338. package/references/sessionlog/src/commands/rewind.ts +195 -0
  339. package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
  340. package/references/sessionlog/src/commands/status.ts +172 -0
  341. package/references/sessionlog/src/config.ts +165 -0
  342. package/references/sessionlog/src/events/event-log.ts +126 -0
  343. package/references/sessionlog/src/git-operations.ts +558 -0
  344. package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
  345. package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
  346. package/references/sessionlog/src/index.ts +650 -0
  347. package/references/sessionlog/src/security/redaction.ts +283 -0
  348. package/references/sessionlog/src/session/state-machine.ts +452 -0
  349. package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
  350. package/references/sessionlog/src/store/native-store.ts +173 -0
  351. package/references/sessionlog/src/store/provider-types.ts +99 -0
  352. package/references/sessionlog/src/store/session-store.ts +266 -0
  353. package/references/sessionlog/src/strategy/attribution.ts +296 -0
  354. package/references/sessionlog/src/strategy/common.ts +207 -0
  355. package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
  356. package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
  357. package/references/sessionlog/src/strategy/types.ts +279 -0
  358. package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
  359. package/references/sessionlog/src/summarize/summarize.ts +432 -0
  360. package/references/sessionlog/src/types.ts +508 -0
  361. package/references/sessionlog/src/utils/chunk-files.ts +49 -0
  362. package/references/sessionlog/src/utils/commit-message.ts +65 -0
  363. package/references/sessionlog/src/utils/detect-agent.ts +36 -0
  364. package/references/sessionlog/src/utils/hook-managers.ts +125 -0
  365. package/references/sessionlog/src/utils/ide-tags.ts +32 -0
  366. package/references/sessionlog/src/utils/paths.ts +79 -0
  367. package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
  368. package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
  369. package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
  370. package/references/sessionlog/src/utils/string-utils.ts +46 -0
  371. package/references/sessionlog/src/utils/todo-extract.ts +188 -0
  372. package/references/sessionlog/src/utils/trailers.ts +187 -0
  373. package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
  374. package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
  375. package/references/sessionlog/src/utils/tree-ops.ts +219 -0
  376. package/references/sessionlog/src/utils/tty.ts +72 -0
  377. package/references/sessionlog/src/utils/validation.ts +65 -0
  378. package/references/sessionlog/src/utils/worktree.ts +58 -0
  379. package/references/sessionlog/src/wire-types.ts +59 -0
  380. package/references/sessionlog/templates/setup-env.sh +153 -0
  381. package/references/sessionlog/tsconfig.json +18 -0
  382. package/references/sessionlog/vitest.config.ts +12 -0
  383. package/references/skill-tree/.sudocode/issues.jsonl +8 -0
  384. package/references/skill-tree/.sudocode/specs.jsonl +2 -0
  385. package/references/skill-tree/CLAUDE.md +56 -80
  386. package/references/skill-tree/README.md +188 -140
  387. package/references/skill-tree/examples/basic-usage.ts +95 -121
  388. package/references/skill-tree/package-lock.json +369 -26
  389. package/references/skill-tree/package.json +1 -1
  390. package/src/atlas.ts +97 -67
  391. package/src/bin/cli-utils.ts +220 -0
  392. package/src/bin/cognitive-core.ts +84 -392
  393. package/src/bin/commands/kb.ts +266 -0
  394. package/src/bin/commands/learn.ts +100 -0
  395. package/src/bin/commands/legacy.ts +182 -0
  396. package/src/bin/commands/run.ts +113 -0
  397. package/src/bin/commands/sessions.ts +221 -0
  398. package/src/bin/commands/skills.ts +146 -0
  399. package/src/embeddings/index.ts +3 -0
  400. package/src/embeddings/inverted-index.ts +134 -0
  401. package/src/embeddings/manager.ts +13 -8
  402. package/src/embeddings/vector-store.ts +21 -9
  403. package/src/factory.ts +33 -16
  404. package/src/index.ts +136 -9
  405. package/src/learning/analyzer.ts +21 -37
  406. package/src/learning/energy-evaluator.ts +282 -0
  407. package/src/learning/healing-orchestrator.ts +383 -0
  408. package/src/learning/index.ts +66 -9
  409. package/src/learning/instant-loop.ts +357 -0
  410. package/src/learning/maintenance-scheduler.ts +271 -0
  411. package/src/learning/meta-learner.ts +5 -23
  412. package/src/learning/reflexion-generator.ts +273 -0
  413. package/src/learning/trajectory-sources/entire.ts +24 -13
  414. package/src/learning/trajectory-sources/index.ts +2 -2
  415. package/src/learning/trajectory-sources/pipeline.ts +5 -5
  416. package/src/learning/unified-pipeline.ts +1191 -0
  417. package/src/memory/candidate-retrieval.ts +72 -0
  418. package/src/memory/causal-store.ts +273 -0
  419. package/src/memory/coherence.ts +252 -0
  420. package/src/memory/experience.ts +217 -50
  421. package/src/memory/index.ts +43 -0
  422. package/src/memory/knowledge-bank.ts +57 -0
  423. package/src/memory/meta.ts +78 -96
  424. package/src/memory/playbook.ts +239 -75
  425. package/src/memory/reasoning-bank.ts +458 -0
  426. package/src/memory/reflexion.ts +122 -0
  427. package/src/memory/system.ts +21 -5
  428. package/src/memory/temporal-compressor.ts +409 -0
  429. package/src/persistence/index.ts +37 -0
  430. package/src/persistence/migrator.ts +298 -0
  431. package/src/persistence/serializers.ts +79 -0
  432. package/src/persistence/sqlite-persistence.ts +925 -0
  433. package/src/runtime/flows/learning.ts +25 -42
  434. package/src/search/index.ts +10 -0
  435. package/src/search/moe-gate.ts +304 -0
  436. package/src/search/router.ts +111 -4
  437. package/src/session-bank/git-reader.ts +29 -19
  438. package/src/session-bank/index.ts +4 -2
  439. package/src/session-bank/parser.ts +280 -98
  440. package/src/session-bank/session-bank.ts +33 -12
  441. package/src/session-bank/types.ts +8 -5
  442. package/src/surfacing/skill-publisher.ts +17 -49
  443. package/src/surfacing/sqlite-storage-adapter.ts +16 -32
  444. package/src/types/config.ts +30 -0
  445. package/src/types/index.ts +3 -0
  446. package/src/types/memory.ts +30 -0
  447. package/src/types/playbook.ts +4 -0
  448. package/src/utils/error-classifier.ts +113 -0
  449. package/src/utils/index.ts +18 -0
  450. package/src/utils/partitioned-store.ts +299 -0
  451. package/src/utils/trajectory-helpers.ts +79 -0
  452. package/src/workspace/efficacy-toolkit.ts +496 -0
  453. package/src/workspace/index.ts +29 -0
  454. package/src/workspace/runner.ts +3 -3
  455. package/src/workspace/templates/index.ts +24 -0
  456. package/src/workspace/templates/playbook-decay-detection.ts +272 -0
  457. package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
  458. package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
  459. package/src/workspace/types.ts +10 -2
  460. package/tests/embeddings/inverted-index.test.ts +138 -0
  461. package/tests/feature-toggles.test.ts +275 -0
  462. package/tests/fixtures/behavioral-trajectories.ts +210 -0
  463. package/tests/gap-fixes.test.ts +17 -4
  464. package/tests/integration/cli-e2e.test.ts +621 -0
  465. package/tests/integration/e2e.test.ts +6 -5
  466. package/tests/integration/entire-e2e.test.ts +314 -125
  467. package/tests/integration/persistence-e2e.test.ts +741 -0
  468. package/tests/integration/phase-e2e.test.ts +1143 -0
  469. package/tests/integration/pipeline-data-correctness.test.ts +794 -0
  470. package/tests/integration/session-bank.test.ts +20 -14
  471. package/tests/integration/sessionlog-e2e.test.ts +329 -0
  472. package/tests/integration/unified-pipeline-e2e.test.ts +634 -0
  473. package/tests/learning/analyzer.test.ts +1 -1
  474. package/tests/learning/energy-evaluator.test.ts +180 -0
  475. package/tests/learning/entire-trajectory-source.test.ts +25 -25
  476. package/tests/learning/healing-orchestrator.test.ts +269 -0
  477. package/tests/learning/instant-loop.test.ts +243 -0
  478. package/tests/learning/maintenance-scheduler.test.ts +191 -0
  479. package/tests/learning/meta-learner.test.ts +418 -0
  480. package/tests/learning/pipeline-memory-updates.test.ts +721 -0
  481. package/tests/learning/reflexion-generator.test.ts +411 -0
  482. package/tests/learning/trajectory-sources.test.ts +12 -4
  483. package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
  484. package/tests/learning/unified-pipeline.test.ts +322 -0
  485. package/tests/mcp/playbook-server.test.ts +6 -1
  486. package/tests/memory/candidate-retrieval.test.ts +167 -0
  487. package/tests/memory/causal-store.test.ts +276 -0
  488. package/tests/memory/coherence.test.ts +232 -0
  489. package/tests/memory/experience.test.ts +8 -3
  490. package/tests/memory/meta.test.ts +399 -0
  491. package/tests/memory/playbook.test.ts +307 -1
  492. package/tests/memory/provenance.test.ts +11 -2
  493. package/tests/memory/reasoning-bank.test.ts +239 -0
  494. package/tests/memory/reflexion.test.ts +166 -0
  495. package/tests/memory/skill-exporter.test.ts +6 -1
  496. package/tests/memory/system.test.ts +6 -1
  497. package/tests/memory/temporal-compressor.test.ts +318 -0
  498. package/tests/persistence/migrator.test.ts +1009 -0
  499. package/tests/persistence/sqlite-persistence.test.ts +635 -0
  500. package/tests/runtime/agent-manager.test.ts +6 -1
  501. package/tests/runtime/delegate.test.ts +6 -1
  502. package/tests/search/evaluator.test.ts +257 -0
  503. package/tests/search/moe-gate.test.ts +250 -0
  504. package/tests/search/refinement-loop.test.ts +11 -2
  505. package/tests/search/router.test.ts +81 -2
  506. package/tests/search/verification-runner.test.ts +357 -0
  507. package/tests/session-bank/fixtures/sessionlog-root-metadata.json +16 -0
  508. package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +6 -0
  509. package/tests/session-bank/fixtures/sessionlog-session/metadata.json +55 -0
  510. package/tests/session-bank/git-reader.test.ts +13 -13
  511. package/tests/session-bank/parser.test.ts +135 -3
  512. package/tests/session-bank/session-bank.test.ts +1 -1
  513. package/tests/surfacing/skill-library.test.ts +6 -1
  514. package/tests/surfacing/skill-publisher.test.ts +24 -58
  515. package/tests/surfacing/sqlite-storage-adapter.test.ts +11 -23
  516. package/tests/utils/error-classifier.test.ts +149 -0
  517. package/tests/utils/partitioned-store.test.ts +230 -0
  518. package/tests/utils/trajectory-helpers.test.ts +163 -0
  519. package/tests/workspace/efficacy-toolkit.test.ts +404 -0
  520. package/tests/workspace/full-flow.test.ts +10 -4
  521. package/tests/workspace/runner.test.ts +10 -4
  522. package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
  523. package/docs/DESIGN-workspace-migration.md +0 -1079
  524. package/docs/PLAN-agentic-workspace-implementation.md +0 -717
  525. package/docs/PLAN-graph-migration.md +0 -299
  526. package/docs/PLAN-session-bank-implementation.md +0 -474
  527. package/src/learning/pipeline.ts +0 -323
  528. package/tests/learning/pipeline.test.ts +0 -176
@@ -1,6 +1,10 @@
1
1
  import type { Task } from '../../types/index.js';
2
2
  import type { MemorySystem } from '../../memory/system.js';
3
- import type { LearningPipeline, ProcessResult, BatchResult } from '../../learning/index.js';
3
+ import type {
4
+ UnifiedLearningPipeline,
5
+ ImmediateResult,
6
+ UnifiedBatchResult,
7
+ } from '../../learning/unified-pipeline.js';
4
8
  import type { AgentManager } from '../manager.js';
5
9
  import type { AgentResult, AgentSession, AgentObserverCallbacks } from '../types.js';
6
10
 
@@ -10,9 +14,7 @@ import type { AgentResult, AgentSession, AgentObserverCallbacks } from '../types
10
14
  export interface LearningFlowConfig {
11
15
  /** Agent type to use for execution */
12
16
  agentType: string;
13
- /** Minimum trajectories before running batch learning */
14
- batchThreshold?: number;
15
- /** Whether to auto-run batch learning when threshold is reached */
17
+ /** Whether to auto-run batch learning when energy threshold is reached */
16
18
  autoBatch?: boolean;
17
19
  /** Observer callbacks for real-time monitoring */
18
20
  observer?: AgentObserverCallbacks;
@@ -24,10 +26,10 @@ export interface LearningFlowConfig {
24
26
  export interface LearningFlowResult {
25
27
  /** The agent result */
26
28
  agentResult: AgentResult;
27
- /** Processing result from learning pipeline */
28
- processResult: ProcessResult;
29
- /** Batch result if batch learning was triggered */
30
- batchResult?: BatchResult;
29
+ /** Processing result from learning pipeline (immediate phase) */
30
+ immediateResult: ImmediateResult;
31
+ /** Batch result if batch learning was triggered (included in immediateResult) */
32
+ batchResult?: UnifiedBatchResult;
31
33
  }
32
34
 
33
35
  /**
@@ -41,19 +43,18 @@ export interface LearningFlowResult {
41
43
  */
42
44
  export class LearningFlow {
43
45
  private manager: AgentManager;
44
- private pipeline: LearningPipeline;
46
+ private pipeline: UnifiedLearningPipeline;
45
47
  private config: LearningFlowConfig;
46
48
 
47
49
  constructor(
48
50
  manager: AgentManager,
49
- pipeline: LearningPipeline,
51
+ pipeline: UnifiedLearningPipeline,
50
52
  _memory: MemorySystem,
51
53
  config: LearningFlowConfig
52
54
  ) {
53
55
  this.manager = manager;
54
56
  this.pipeline = pipeline;
55
57
  this.config = {
56
- batchThreshold: 10,
57
58
  autoBatch: true,
58
59
  ...config,
59
60
  };
@@ -75,24 +76,15 @@ export class LearningFlow {
75
76
  captureToolCalls: true,
76
77
  });
77
78
 
78
- // 2. Process trajectory through learning pipeline
79
- const processResult = await this.pipeline.processTrajectory(
79
+ // 2. Process trajectory through unified pipeline (immediate + optional batch)
80
+ const immediateResult = await this.pipeline.processTrajectory(
80
81
  agentResult.trajectory
81
82
  );
82
83
 
83
- // 3. Run batch learning if threshold reached
84
- let batchResult: BatchResult | undefined;
85
- if (
86
- this.config.autoBatch &&
87
- this.pipeline.getAccumulatedCount() >= (this.config.batchThreshold ?? 10)
88
- ) {
89
- batchResult = await this.pipeline.runBatchLearning();
90
- }
91
-
92
84
  return {
93
85
  agentResult,
94
- processResult,
95
- batchResult,
86
+ immediateResult,
87
+ batchResult: immediateResult.batchResult,
96
88
  };
97
89
  }
98
90
 
@@ -119,17 +111,8 @@ export class LearningFlow {
119
111
  // Extract trajectory from session
120
112
  const trajectory = await this.manager.observeAndLearn(session, task);
121
113
 
122
- // Process through learning pipeline
123
- const processResult = await this.pipeline.processTrajectory(trajectory);
124
-
125
- // Check for batch learning
126
- let batchResult: BatchResult | undefined;
127
- if (
128
- this.config.autoBatch &&
129
- this.pipeline.getAccumulatedCount() >= (this.config.batchThreshold ?? 10)
130
- ) {
131
- batchResult = await this.pipeline.runBatchLearning();
132
- }
114
+ // Process through unified pipeline
115
+ const immediateResult = await this.pipeline.processTrajectory(trajectory);
133
116
 
134
117
  return {
135
118
  agentResult: {
@@ -144,16 +127,16 @@ export class LearningFlow {
144
127
  messageCount: session.messages.length,
145
128
  },
146
129
  },
147
- processResult,
148
- batchResult,
130
+ immediateResult,
131
+ batchResult: immediateResult.batchResult,
149
132
  };
150
133
  }
151
134
 
152
135
  /**
153
136
  * Force batch learning
154
137
  */
155
- async runBatchLearning(): Promise<BatchResult> {
156
- return this.pipeline.runBatchLearning();
138
+ async runBatchLearning(): Promise<UnifiedBatchResult> {
139
+ return this.pipeline.runBatch();
157
140
  }
158
141
 
159
142
  /**
@@ -161,11 +144,11 @@ export class LearningFlow {
161
144
  */
162
145
  getStats(): {
163
146
  pendingTrajectories: number;
164
- batchThreshold: number;
147
+ pipelineStats: ReturnType<UnifiedLearningPipeline['getStats']>;
165
148
  } {
166
149
  return {
167
150
  pendingTrajectories: this.pipeline.getAccumulatedCount(),
168
- batchThreshold: this.config.batchThreshold ?? 10,
151
+ pipelineStats: this.pipeline.getStats(),
169
152
  };
170
153
  }
171
154
  }
@@ -175,7 +158,7 @@ export class LearningFlow {
175
158
  */
176
159
  export function createLearningFlow(
177
160
  manager: AgentManager,
178
- pipeline: LearningPipeline,
161
+ pipeline: UnifiedLearningPipeline,
179
162
  memory: MemorySystem,
180
163
  config: LearningFlowConfig
181
164
  ): LearningFlow {
@@ -4,6 +4,16 @@ export {
4
4
  type RoutingDecision,
5
5
  } from './router.js';
6
6
 
7
+ // MoE-inspired routing gate
8
+ export {
9
+ MoEGate,
10
+ createMoEGate,
11
+ extractTaskFeatures,
12
+ MOE_FEATURE_SIZE,
13
+ MOE_STRATEGIES,
14
+ type MoEGateState,
15
+ } from './moe-gate.js';
16
+
7
17
  export {
8
18
  DirectSolver,
9
19
  createSolver,
@@ -0,0 +1,304 @@
1
+ /**
2
+ * MoEGate — Mixture-of-Experts inspired gating for task routing.
3
+ *
4
+ * Learns per-domain weight vectors over routing strategies from outcome
5
+ * feedback. Replaces threshold-based strategy selection with a learned
6
+ * linear gate:
7
+ *
8
+ * gate(features) = softmax(W · features)
9
+ *
10
+ * where W is a weight matrix (one row per strategy), and features are
11
+ * extracted from the task + memory state.
12
+ *
13
+ * Online gradient update:
14
+ * w[chosen] += learningRate * reward * features
15
+ * w[others] -= learningRate * (1 - reward) * features / (numStrategies - 1)
16
+ *
17
+ * Cold start: uniform weights → falls back to existing threshold logic.
18
+ */
19
+
20
+ /**
21
+ * Serialized gate state for persistence
22
+ */
23
+ export interface MoEGateState {
24
+ strategies: string[];
25
+ featureSize: number;
26
+ globalWeights: number[][];
27
+ domainWeights: Record<string, number[][]>;
28
+ updateCount: number;
29
+ }
30
+
31
+ /**
32
+ * MoE-inspired gating function over routing strategies
33
+ */
34
+ export class MoEGate {
35
+ private strategies: string[];
36
+ private featureSize: number;
37
+ private globalWeights: number[][];
38
+ private domainWeights: Map<string, number[][]> = new Map();
39
+ private updateCount = 0;
40
+
41
+ constructor(strategies: string[], featureSize: number) {
42
+ this.strategies = strategies;
43
+ this.featureSize = featureSize;
44
+
45
+ // Initialize global weights to small random values (near-uniform gate)
46
+ this.globalWeights = strategies.map(() =>
47
+ Array.from({ length: featureSize }, () => (Math.random() - 0.5) * 0.01)
48
+ );
49
+ }
50
+
51
+ /**
52
+ * Compute gate weights for a task given its feature vector.
53
+ * Returns a map of strategy → probability.
54
+ */
55
+ gate(features: number[], domain?: string): Map<string, number> {
56
+ const weights = this.getWeights(domain);
57
+ const logits = this.computeLogits(weights, features);
58
+ const probs = this.softmax(logits);
59
+
60
+ const result = new Map<string, number>();
61
+ for (let i = 0; i < this.strategies.length; i++) {
62
+ result.set(this.strategies[i], probs[i]);
63
+ }
64
+ return result;
65
+ }
66
+
67
+ /**
68
+ * Select the best strategy (argmax of gate output).
69
+ */
70
+ selectStrategy(features: number[], domain?: string): string {
71
+ const gateOutput = this.gate(features, domain);
72
+
73
+ let bestStrategy = this.strategies[0];
74
+ let bestProb = -1;
75
+ for (const [strategy, prob] of gateOutput) {
76
+ if (prob > bestProb) {
77
+ bestProb = prob;
78
+ bestStrategy = strategy;
79
+ }
80
+ }
81
+
82
+ return bestStrategy;
83
+ }
84
+
85
+ /**
86
+ * Update weights from outcome feedback (online gradient).
87
+ *
88
+ * Positive reward → increase weight for chosen strategy's features.
89
+ * Negative reward → decrease weight.
90
+ */
91
+ update(
92
+ features: number[],
93
+ chosenStrategy: string,
94
+ reward: number,
95
+ learningRate = 0.01,
96
+ domain?: string
97
+ ): void {
98
+ const chosenIdx = this.strategies.indexOf(chosenStrategy);
99
+ if (chosenIdx === -1) return;
100
+
101
+ // Update global weights
102
+ this.updateWeightMatrix(this.globalWeights, features, chosenIdx, reward, learningRate);
103
+
104
+ // Update domain-specific weights if domain provided
105
+ if (domain) {
106
+ if (!this.domainWeights.has(domain)) {
107
+ // Initialize domain weights as copy of global
108
+ this.domainWeights.set(
109
+ domain,
110
+ this.globalWeights.map((row) => [...row])
111
+ );
112
+ }
113
+ const domainW = this.domainWeights.get(domain)!;
114
+ this.updateWeightMatrix(domainW, features, chosenIdx, reward, learningRate);
115
+ }
116
+
117
+ this.updateCount++;
118
+ }
119
+
120
+ /**
121
+ * Whether the gate has been trained (has seen any updates).
122
+ */
123
+ get isTrained(): boolean {
124
+ return this.updateCount > 0;
125
+ }
126
+
127
+ /**
128
+ * Number of updates the gate has seen.
129
+ */
130
+ get totalUpdates(): number {
131
+ return this.updateCount;
132
+ }
133
+
134
+ /**
135
+ * Serialize for persistence.
136
+ */
137
+ toJSON(): MoEGateState {
138
+ const domainWeights: Record<string, number[][]> = {};
139
+ for (const [domain, weights] of this.domainWeights) {
140
+ domainWeights[domain] = weights;
141
+ }
142
+
143
+ return {
144
+ strategies: this.strategies,
145
+ featureSize: this.featureSize,
146
+ globalWeights: this.globalWeights,
147
+ domainWeights,
148
+ updateCount: this.updateCount,
149
+ };
150
+ }
151
+
152
+ /**
153
+ * Deserialize from persisted state.
154
+ */
155
+ static fromJSON(data: MoEGateState): MoEGate {
156
+ const gate = new MoEGate(data.strategies, data.featureSize);
157
+ gate.globalWeights = data.globalWeights;
158
+ gate.updateCount = data.updateCount;
159
+
160
+ for (const [domain, weights] of Object.entries(data.domainWeights)) {
161
+ gate.domainWeights.set(domain, weights);
162
+ }
163
+
164
+ return gate;
165
+ }
166
+
167
+ // === Internal ===
168
+
169
+ /**
170
+ * Get the weight matrix for a domain (with fallback to global).
171
+ */
172
+ private getWeights(domain?: string): number[][] {
173
+ if (domain && this.domainWeights.has(domain)) {
174
+ return this.domainWeights.get(domain)!;
175
+ }
176
+ return this.globalWeights;
177
+ }
178
+
179
+ /**
180
+ * Compute logits = W · features for each strategy.
181
+ */
182
+ private computeLogits(weights: number[][], features: number[]): number[] {
183
+ return weights.map((row) => {
184
+ let sum = 0;
185
+ for (let j = 0; j < Math.min(row.length, features.length); j++) {
186
+ sum += row[j] * features[j];
187
+ }
188
+ return sum;
189
+ });
190
+ }
191
+
192
+ /**
193
+ * Softmax with numerical stability (subtract max).
194
+ */
195
+ private softmax(logits: number[]): number[] {
196
+ const max = Math.max(...logits);
197
+ const exps = logits.map((l) => Math.exp(l - max));
198
+ const sum = exps.reduce((a, b) => a + b, 0);
199
+ return exps.map((e) => e / sum);
200
+ }
201
+
202
+ /**
203
+ * Online gradient update on a weight matrix.
204
+ *
205
+ * Uses centered reward (reward - 0.5) so that:
206
+ * reward=1 → positive update for chosen, negative for others
207
+ * reward=0 → negative update for chosen, positive for others
208
+ */
209
+ private updateWeightMatrix(
210
+ weights: number[][],
211
+ features: number[],
212
+ chosenIdx: number,
213
+ reward: number,
214
+ learningRate: number
215
+ ): void {
216
+ const numStrategies = this.strategies.length;
217
+ const centered = reward - 0.5; // range: [-0.5, 0.5]
218
+
219
+ for (let i = 0; i < numStrategies; i++) {
220
+ for (let j = 0; j < this.featureSize; j++) {
221
+ if (i === chosenIdx) {
222
+ // Positive reward → boost chosen; negative → penalize chosen
223
+ weights[i][j] += learningRate * centered * features[j];
224
+ } else {
225
+ // Opposite direction for unchosen strategies
226
+ weights[i][j] -=
227
+ learningRate * centered * features[j] / (numStrategies - 1);
228
+ }
229
+ }
230
+ }
231
+ }
232
+ }
233
+
234
+ /**
235
+ * Extract feature vector from a task and memory context for the MoE gate.
236
+ *
237
+ * Features (8 dimensions):
238
+ * 0: task description length (normalized)
239
+ * 1: domain familiarity (experience count, normalized)
240
+ * 2: best experience match score
241
+ * 3: best playbook match score
242
+ * 4: best playbook confidence
243
+ * 5: is bug fix (0/1)
244
+ * 6: is new feature (0/1)
245
+ * 7: task complexity proxy (word count, normalized)
246
+ */
247
+ export function extractTaskFeatures(
248
+ taskDescription: string,
249
+ memoryContext: {
250
+ experiences: Array<{ score: number }>;
251
+ playbooks: Array<{ score: number; playbook: { confidence: number } }>;
252
+ },
253
+ experienceCountInDomain = 0
254
+ ): number[] {
255
+ const desc = taskDescription.toLowerCase();
256
+
257
+ const bestExpScore = memoryContext.experiences.length > 0
258
+ ? Math.max(...memoryContext.experiences.map((e) => e.score))
259
+ : 0;
260
+
261
+ const bestPlaybookScore = memoryContext.playbooks.length > 0
262
+ ? Math.max(...memoryContext.playbooks.map((p) => p.score))
263
+ : 0;
264
+
265
+ const bestPlaybookConfidence = memoryContext.playbooks.length > 0
266
+ ? Math.max(...memoryContext.playbooks.map((p) => p.playbook.confidence))
267
+ : 0;
268
+
269
+ const isBugFix =
270
+ desc.includes('bug') || desc.includes('fix') || desc.includes('error')
271
+ ? 1
272
+ : 0;
273
+
274
+ const isNewFeature =
275
+ desc.includes('implement') || desc.includes('create') || desc.includes('add')
276
+ ? 1
277
+ : 0;
278
+
279
+ const wordCount = taskDescription.split(/\s+/).length;
280
+
281
+ return [
282
+ Math.min(taskDescription.length / 1000, 1), // [0] length, normalized
283
+ Math.min(experienceCountInDomain / 100, 1), // [1] domain familiarity
284
+ bestExpScore, // [2] best experience match
285
+ bestPlaybookScore, // [3] best playbook match
286
+ bestPlaybookConfidence, // [4] best playbook confidence
287
+ isBugFix, // [5] bug fix indicator
288
+ isNewFeature, // [6] new feature indicator
289
+ Math.min(wordCount / 100, 1), // [7] complexity proxy
290
+ ];
291
+ }
292
+
293
+ /** Default feature size for the MoE gate */
294
+ export const MOE_FEATURE_SIZE = 8;
295
+
296
+ /** Default strategies for the MoE gate */
297
+ export const MOE_STRATEGIES = ['direct', 'adapt', 'explore', 'fallback'] as const;
298
+
299
+ /**
300
+ * Create a MoEGate with default settings
301
+ */
302
+ export function createMoEGate(): MoEGate {
303
+ return new MoEGate([...MOE_STRATEGIES], MOE_FEATURE_SIZE);
304
+ }
@@ -1,6 +1,13 @@
1
1
  import type { Task, RouterConfig } from '../types/index.js';
2
2
  import type { MemorySystem, MemoryQueryResultV2 } from '../memory/system.js';
3
3
  import type { MetaLearner } from '../learning/meta-learner.js';
4
+ import type { SqlitePersistence } from '../persistence/index.js';
5
+ import {
6
+ MoEGate,
7
+ extractTaskFeatures,
8
+ createMoEGate,
9
+ type MoEGateState,
10
+ } from './moe-gate.js';
4
11
 
5
12
  /**
6
13
  * Routing decision with context
@@ -29,11 +36,15 @@ export class TaskRouter {
29
36
  private memory: MemorySystem;
30
37
  private config: RouterConfig;
31
38
  private metaLearner?: MetaLearner;
39
+ private moeGate: MoEGate;
40
+ private persistence?: SqlitePersistence;
41
+ private gateUpdatesSinceLastPersist = 0;
32
42
 
33
43
  constructor(
34
44
  memory: MemorySystem,
35
45
  config?: Partial<RouterConfig>,
36
- metaLearner?: MetaLearner
46
+ metaLearner?: MetaLearner,
47
+ persistence?: SqlitePersistence
37
48
  ) {
38
49
  this.memory = memory;
39
50
  this.config = {
@@ -42,6 +53,16 @@ export class TaskRouter {
42
53
  defaultStrategy: config?.defaultStrategy ?? 'direct',
43
54
  };
44
55
  this.metaLearner = metaLearner;
56
+ this.persistence = persistence;
57
+ this.moeGate = createMoEGate();
58
+
59
+ // Load persisted gate state if available
60
+ if (persistence?.isInitialized) {
61
+ const saved = persistence.getSystemState<MoEGateState>('moe_gate');
62
+ if (saved) {
63
+ this.moeGate = MoEGate.fromJSON(saved);
64
+ }
65
+ }
45
66
  }
46
67
 
47
68
  /**
@@ -61,9 +82,30 @@ export class TaskRouter {
61
82
  domains: task.domain ? [task.domain] : undefined,
62
83
  });
63
84
 
64
- // Compute base routing from playbook memory
85
+ // Compute base routing from playbook memory (threshold heuristics)
65
86
  let decision = this.computeBaseRouting(memoryContext);
66
87
 
88
+ // If MoE gate is trained, use it to override the base strategy
89
+ if (this.moeGate.isTrained) {
90
+ try {
91
+ const features = extractTaskFeatures(
92
+ task.description,
93
+ memoryContext,
94
+ );
95
+ const gateStrategy = this.moeGate.selectStrategy(features, task.domain);
96
+ if (this.isValidStrategy(gateStrategy)) {
97
+ decision.strategy = gateStrategy as RoutingDecision['strategy'];
98
+ decision.reasoning = `MoE gate selected strategy (${this.moeGate.totalUpdates} updates). ${decision.reasoning}`;
99
+ decision.appliedMetaStrategies = [
100
+ ...(decision.appliedMetaStrategies ?? []),
101
+ 'moe-gate',
102
+ ];
103
+ }
104
+ } catch {
105
+ // Gate failed — continue with base routing
106
+ }
107
+ }
108
+
67
109
  // Apply meta-learning adjustments if available
68
110
  if (this.metaLearner) {
69
111
  const taskCharacteristics = this.extractTaskCharacteristics(task);
@@ -241,12 +283,76 @@ export class TaskRouter {
241
283
  return state;
242
284
  }
243
285
 
286
+ /**
287
+ * Update MoE gate weights after a trajectory completes.
288
+ * reward: 1 = success, 0.5 = partial, 0 = failure
289
+ */
290
+ updateGate(
291
+ task: Task,
292
+ memoryContext: MemoryQueryResultV2,
293
+ chosenStrategy: string,
294
+ reward: number
295
+ ): void {
296
+ const features = extractTaskFeatures(task.description, memoryContext);
297
+ this.moeGate.update(features, chosenStrategy, reward, 0.01, task.domain);
298
+
299
+ // Persist gate state every 10 updates
300
+ this.gateUpdatesSinceLastPersist++;
301
+ if (this.persistence && this.gateUpdatesSinceLastPersist >= 10) {
302
+ this.persistence.setSystemState('moe_gate', this.moeGate.toJSON());
303
+ this.gateUpdatesSinceLastPersist = 0;
304
+ }
305
+ }
306
+
307
+ /**
308
+ * Flush gate state to persistence (e.g., on shutdown).
309
+ */
310
+ persistGateState(): void {
311
+ if (this.persistence && this.moeGate.isTrained) {
312
+ this.persistence.setSystemState('moe_gate', this.moeGate.toJSON());
313
+ this.gateUpdatesSinceLastPersist = 0;
314
+ }
315
+ }
316
+
317
+ /**
318
+ * Load persisted gate state. Call after persistence is initialized.
319
+ */
320
+ loadPersistedState(): void {
321
+ if (this.persistence?.isInitialized) {
322
+ const saved = this.persistence.getSystemState<MoEGateState>('moe_gate');
323
+ if (saved) {
324
+ this.moeGate = MoEGate.fromJSON(saved);
325
+ }
326
+ }
327
+ }
328
+
329
+ /**
330
+ * Get the MoE gate (for persistence or inspection).
331
+ */
332
+ getMoEGate(): MoEGate {
333
+ return this.moeGate;
334
+ }
335
+
336
+ /**
337
+ * Load MoE gate state from persisted data.
338
+ */
339
+ loadGateState(state: MoEGateState): void {
340
+ this.moeGate = MoEGate.fromJSON(state);
341
+ }
342
+
244
343
  /**
245
344
  * Update configuration
246
345
  */
247
346
  updateConfig(config: Partial<RouterConfig>): void {
248
347
  this.config = { ...this.config, ...config };
249
348
  }
349
+
350
+ /**
351
+ * Check if a string is a valid routing strategy.
352
+ */
353
+ private isValidStrategy(s: string): boolean {
354
+ return ['direct', 'adapt', 'explore', 'fallback'].includes(s);
355
+ }
250
356
  }
251
357
 
252
358
  /**
@@ -255,7 +361,8 @@ export class TaskRouter {
255
361
  export function createRouter(
256
362
  memory: MemorySystem,
257
363
  config?: Partial<RouterConfig>,
258
- metaLearner?: MetaLearner
364
+ metaLearner?: MetaLearner,
365
+ persistence?: SqlitePersistence
259
366
  ): TaskRouter {
260
- return new TaskRouter(memory, config, metaLearner);
367
+ return new TaskRouter(memory, config, metaLearner, persistence);
261
368
  }