cognitive-core 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/CLAUDE.md +233 -0
  2. package/README.md +370 -54
  3. package/dist/atlas.d.ts +10 -10
  4. package/dist/atlas.d.ts.map +1 -1
  5. package/dist/atlas.js +79 -48
  6. package/dist/atlas.js.map +1 -1
  7. package/dist/bin/cli-utils.d.ts +37 -0
  8. package/dist/bin/cli-utils.d.ts.map +1 -0
  9. package/dist/bin/cli-utils.js +176 -0
  10. package/dist/bin/cli-utils.js.map +1 -0
  11. package/dist/bin/cognitive-core.d.ts +2 -12
  12. package/dist/bin/cognitive-core.d.ts.map +1 -1
  13. package/dist/bin/cognitive-core.js +76 -351
  14. package/dist/bin/cognitive-core.js.map +1 -1
  15. package/dist/bin/commands/kb.d.ts +6 -0
  16. package/dist/bin/commands/kb.d.ts.map +1 -0
  17. package/dist/bin/commands/kb.js +240 -0
  18. package/dist/bin/commands/kb.js.map +1 -0
  19. package/dist/bin/commands/learn.d.ts +6 -0
  20. package/dist/bin/commands/learn.d.ts.map +1 -0
  21. package/dist/bin/commands/learn.js +91 -0
  22. package/dist/bin/commands/learn.js.map +1 -0
  23. package/dist/bin/commands/legacy.d.ts +12 -0
  24. package/dist/bin/commands/legacy.d.ts.map +1 -0
  25. package/dist/bin/commands/legacy.js +142 -0
  26. package/dist/bin/commands/legacy.js.map +1 -0
  27. package/dist/bin/commands/run.d.ts +3 -0
  28. package/dist/bin/commands/run.d.ts.map +1 -0
  29. package/dist/bin/commands/run.js +99 -0
  30. package/dist/bin/commands/run.js.map +1 -0
  31. package/dist/bin/commands/sessions.d.ts +9 -0
  32. package/dist/bin/commands/sessions.d.ts.map +1 -0
  33. package/dist/bin/commands/sessions.js +183 -0
  34. package/dist/bin/commands/sessions.js.map +1 -0
  35. package/dist/bin/commands/skills.d.ts +6 -0
  36. package/dist/bin/commands/skills.d.ts.map +1 -0
  37. package/dist/bin/commands/skills.js +135 -0
  38. package/dist/bin/commands/skills.js.map +1 -0
  39. package/dist/embeddings/index.d.ts +1 -0
  40. package/dist/embeddings/index.d.ts.map +1 -1
  41. package/dist/embeddings/index.js +2 -0
  42. package/dist/embeddings/index.js.map +1 -1
  43. package/dist/embeddings/inverted-index.d.ts +47 -0
  44. package/dist/embeddings/inverted-index.d.ts.map +1 -0
  45. package/dist/embeddings/inverted-index.js +122 -0
  46. package/dist/embeddings/inverted-index.js.map +1 -0
  47. package/dist/embeddings/manager.d.ts +3 -1
  48. package/dist/embeddings/manager.d.ts.map +1 -1
  49. package/dist/embeddings/manager.js +12 -7
  50. package/dist/embeddings/manager.js.map +1 -1
  51. package/dist/embeddings/vector-store.d.ts +7 -3
  52. package/dist/embeddings/vector-store.d.ts.map +1 -1
  53. package/dist/embeddings/vector-store.js +22 -6
  54. package/dist/embeddings/vector-store.js.map +1 -1
  55. package/dist/factory.d.ts +11 -12
  56. package/dist/factory.d.ts.map +1 -1
  57. package/dist/factory.js +20 -7
  58. package/dist/factory.js.map +1 -1
  59. package/dist/index.d.ts +7 -6
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +37 -5
  62. package/dist/index.js.map +1 -1
  63. package/dist/learning/analyzer.d.ts.map +1 -1
  64. package/dist/learning/analyzer.js +17 -35
  65. package/dist/learning/analyzer.js.map +1 -1
  66. package/dist/learning/energy-evaluator.d.ts +128 -0
  67. package/dist/learning/energy-evaluator.d.ts.map +1 -0
  68. package/dist/learning/energy-evaluator.js +175 -0
  69. package/dist/learning/energy-evaluator.js.map +1 -0
  70. package/dist/learning/healing-orchestrator.d.ts +182 -0
  71. package/dist/learning/healing-orchestrator.d.ts.map +1 -0
  72. package/dist/learning/healing-orchestrator.js +250 -0
  73. package/dist/learning/healing-orchestrator.js.map +1 -0
  74. package/dist/learning/index.d.ts +7 -2
  75. package/dist/learning/index.d.ts.map +1 -1
  76. package/dist/learning/index.js +13 -2
  77. package/dist/learning/index.js.map +1 -1
  78. package/dist/learning/instant-loop.d.ts +87 -0
  79. package/dist/learning/instant-loop.d.ts.map +1 -0
  80. package/dist/learning/instant-loop.js +264 -0
  81. package/dist/learning/instant-loop.js.map +1 -0
  82. package/dist/learning/loop-coordinator.d.ts +61 -0
  83. package/dist/learning/loop-coordinator.d.ts.map +1 -0
  84. package/dist/learning/loop-coordinator.js +96 -0
  85. package/dist/learning/loop-coordinator.js.map +1 -0
  86. package/dist/learning/maintenance-scheduler.d.ts +141 -0
  87. package/dist/learning/maintenance-scheduler.d.ts.map +1 -0
  88. package/dist/learning/maintenance-scheduler.js +186 -0
  89. package/dist/learning/maintenance-scheduler.js.map +1 -0
  90. package/dist/learning/meta-learner.d.ts.map +1 -1
  91. package/dist/learning/meta-learner.js +4 -21
  92. package/dist/learning/meta-learner.js.map +1 -1
  93. package/dist/learning/pipeline.d.ts +31 -4
  94. package/dist/learning/pipeline.d.ts.map +1 -1
  95. package/dist/learning/pipeline.js +64 -12
  96. package/dist/learning/pipeline.js.map +1 -1
  97. package/dist/learning/reflexion-generator.d.ts +64 -0
  98. package/dist/learning/reflexion-generator.d.ts.map +1 -0
  99. package/dist/learning/reflexion-generator.js +194 -0
  100. package/dist/learning/reflexion-generator.js.map +1 -0
  101. package/dist/learning/trajectory-sources/entire.d.ts +8 -5
  102. package/dist/learning/trajectory-sources/entire.d.ts.map +1 -1
  103. package/dist/learning/trajectory-sources/entire.js +13 -6
  104. package/dist/learning/trajectory-sources/entire.js.map +1 -1
  105. package/dist/learning/trajectory-sources/index.d.ts +1 -1
  106. package/dist/learning/trajectory-sources/index.d.ts.map +1 -1
  107. package/dist/learning/trajectory-sources/index.js +1 -1
  108. package/dist/learning/trajectory-sources/index.js.map +1 -1
  109. package/dist/learning/trajectory-sources/pipeline.d.ts +4 -4
  110. package/dist/learning/trajectory-sources/pipeline.d.ts.map +1 -1
  111. package/dist/learning/trajectory-sources/pipeline.js +2 -2
  112. package/dist/learning/trajectory-sources/pipeline.js.map +1 -1
  113. package/dist/learning/unified-pipeline.d.ts +281 -0
  114. package/dist/learning/unified-pipeline.d.ts.map +1 -0
  115. package/dist/learning/unified-pipeline.js +637 -0
  116. package/dist/learning/unified-pipeline.js.map +1 -0
  117. package/dist/memory/candidate-retrieval.d.ts +43 -0
  118. package/dist/memory/candidate-retrieval.d.ts.map +1 -0
  119. package/dist/memory/candidate-retrieval.js +41 -0
  120. package/dist/memory/candidate-retrieval.js.map +1 -0
  121. package/dist/memory/causal-store.d.ts +97 -0
  122. package/dist/memory/causal-store.d.ts.map +1 -0
  123. package/dist/memory/causal-store.js +209 -0
  124. package/dist/memory/causal-store.js.map +1 -0
  125. package/dist/memory/coherence.d.ts +71 -0
  126. package/dist/memory/coherence.d.ts.map +1 -0
  127. package/dist/memory/coherence.js +176 -0
  128. package/dist/memory/coherence.js.map +1 -0
  129. package/dist/memory/experience.d.ts +39 -6
  130. package/dist/memory/experience.d.ts.map +1 -1
  131. package/dist/memory/experience.js +193 -49
  132. package/dist/memory/experience.js.map +1 -1
  133. package/dist/memory/index.d.ts +7 -0
  134. package/dist/memory/index.d.ts.map +1 -1
  135. package/dist/memory/index.js +12 -0
  136. package/dist/memory/index.js.map +1 -1
  137. package/dist/memory/knowledge-bank.d.ts +14 -0
  138. package/dist/memory/knowledge-bank.d.ts.map +1 -1
  139. package/dist/memory/knowledge-bank.js +45 -0
  140. package/dist/memory/knowledge-bank.js.map +1 -1
  141. package/dist/memory/meta.d.ts +7 -8
  142. package/dist/memory/meta.d.ts.map +1 -1
  143. package/dist/memory/meta.js +73 -79
  144. package/dist/memory/meta.js.map +1 -1
  145. package/dist/memory/playbook.d.ts +26 -9
  146. package/dist/memory/playbook.d.ts.map +1 -1
  147. package/dist/memory/playbook.js +198 -74
  148. package/dist/memory/playbook.js.map +1 -1
  149. package/dist/memory/reasoning-bank.d.ts +130 -0
  150. package/dist/memory/reasoning-bank.d.ts.map +1 -0
  151. package/dist/memory/reasoning-bank.js +342 -0
  152. package/dist/memory/reasoning-bank.js.map +1 -0
  153. package/dist/memory/reflexion.d.ts +59 -0
  154. package/dist/memory/reflexion.d.ts.map +1 -0
  155. package/dist/memory/reflexion.js +96 -0
  156. package/dist/memory/reflexion.js.map +1 -0
  157. package/dist/memory/system.d.ts +7 -2
  158. package/dist/memory/system.d.ts.map +1 -1
  159. package/dist/memory/system.js +19 -7
  160. package/dist/memory/system.js.map +1 -1
  161. package/dist/memory/temporal-compressor.d.ts +126 -0
  162. package/dist/memory/temporal-compressor.d.ts.map +1 -0
  163. package/dist/memory/temporal-compressor.js +335 -0
  164. package/dist/memory/temporal-compressor.js.map +1 -0
  165. package/dist/persistence/index.d.ts +11 -0
  166. package/dist/persistence/index.d.ts.map +1 -0
  167. package/dist/persistence/index.js +11 -0
  168. package/dist/persistence/index.js.map +1 -0
  169. package/dist/persistence/migrator.d.ts +40 -0
  170. package/dist/persistence/migrator.d.ts.map +1 -0
  171. package/dist/persistence/migrator.js +238 -0
  172. package/dist/persistence/migrator.js.map +1 -0
  173. package/dist/persistence/serializers.d.ts +45 -0
  174. package/dist/persistence/serializers.d.ts.map +1 -0
  175. package/dist/persistence/serializers.js +80 -0
  176. package/dist/persistence/serializers.js.map +1 -0
  177. package/dist/persistence/sqlite-persistence.d.ts +228 -0
  178. package/dist/persistence/sqlite-persistence.d.ts.map +1 -0
  179. package/dist/persistence/sqlite-persistence.js +588 -0
  180. package/dist/persistence/sqlite-persistence.js.map +1 -0
  181. package/dist/runtime/flows/learning.d.ts +10 -12
  182. package/dist/runtime/flows/learning.d.ts.map +1 -1
  183. package/dist/runtime/flows/learning.js +10 -23
  184. package/dist/runtime/flows/learning.js.map +1 -1
  185. package/dist/search/index.d.ts +1 -0
  186. package/dist/search/index.d.ts.map +1 -1
  187. package/dist/search/index.js +2 -0
  188. package/dist/search/index.js.map +1 -1
  189. package/dist/search/moe-gate.d.ts +124 -0
  190. package/dist/search/moe-gate.d.ts.map +1 -0
  191. package/dist/search/moe-gate.js +234 -0
  192. package/dist/search/moe-gate.js.map +1 -0
  193. package/dist/search/router.d.ts +32 -2
  194. package/dist/search/router.d.ts.map +1 -1
  195. package/dist/search/router.js +87 -4
  196. package/dist/search/router.js.map +1 -1
  197. package/dist/session-bank/git-reader.d.ts +9 -4
  198. package/dist/session-bank/git-reader.d.ts.map +1 -1
  199. package/dist/session-bank/git-reader.js +22 -15
  200. package/dist/session-bank/git-reader.js.map +1 -1
  201. package/dist/session-bank/index.d.ts +2 -2
  202. package/dist/session-bank/index.d.ts.map +1 -1
  203. package/dist/session-bank/index.js +2 -2
  204. package/dist/session-bank/index.js.map +1 -1
  205. package/dist/session-bank/parser.d.ts +16 -5
  206. package/dist/session-bank/parser.d.ts.map +1 -1
  207. package/dist/session-bank/parser.js +187 -80
  208. package/dist/session-bank/parser.js.map +1 -1
  209. package/dist/session-bank/session-bank.d.ts +5 -0
  210. package/dist/session-bank/session-bank.d.ts.map +1 -1
  211. package/dist/session-bank/session-bank.js +30 -9
  212. package/dist/session-bank/session-bank.js.map +1 -1
  213. package/dist/session-bank/types.d.ts +4 -1
  214. package/dist/session-bank/types.d.ts.map +1 -1
  215. package/dist/session-bank/types.js +3 -3
  216. package/dist/session-bank/types.js.map +1 -1
  217. package/dist/surfacing/skill-publisher.d.ts.map +1 -1
  218. package/dist/surfacing/skill-publisher.js +15 -43
  219. package/dist/surfacing/skill-publisher.js.map +1 -1
  220. package/dist/surfacing/sqlite-storage-adapter.d.ts.map +1 -1
  221. package/dist/surfacing/sqlite-storage-adapter.js +13 -21
  222. package/dist/surfacing/sqlite-storage-adapter.js.map +1 -1
  223. package/dist/types/config.d.ts +100 -0
  224. package/dist/types/config.d.ts.map +1 -1
  225. package/dist/types/config.js +27 -0
  226. package/dist/types/config.js.map +1 -1
  227. package/dist/types/index.d.ts +2 -2
  228. package/dist/types/index.d.ts.map +1 -1
  229. package/dist/types/index.js +1 -1
  230. package/dist/types/index.js.map +1 -1
  231. package/dist/types/memory.d.ts +52 -0
  232. package/dist/types/memory.d.ts.map +1 -1
  233. package/dist/types/memory.js +13 -0
  234. package/dist/types/memory.js.map +1 -1
  235. package/dist/types/playbook.d.ts +4 -0
  236. package/dist/types/playbook.d.ts.map +1 -1
  237. package/dist/types/playbook.js.map +1 -1
  238. package/dist/utils/error-classifier.d.ts +30 -0
  239. package/dist/utils/error-classifier.d.ts.map +1 -0
  240. package/dist/utils/error-classifier.js +85 -0
  241. package/dist/utils/error-classifier.js.map +1 -0
  242. package/dist/utils/index.d.ts +3 -0
  243. package/dist/utils/index.d.ts.map +1 -1
  244. package/dist/utils/index.js +3 -0
  245. package/dist/utils/index.js.map +1 -1
  246. package/dist/utils/partitioned-store.d.ts +93 -0
  247. package/dist/utils/partitioned-store.d.ts.map +1 -0
  248. package/dist/utils/partitioned-store.js +251 -0
  249. package/dist/utils/partitioned-store.js.map +1 -0
  250. package/dist/utils/trajectory-helpers.d.ts +39 -0
  251. package/dist/utils/trajectory-helpers.d.ts.map +1 -0
  252. package/dist/utils/trajectory-helpers.js +57 -0
  253. package/dist/utils/trajectory-helpers.js.map +1 -0
  254. package/dist/workspace/runner.d.ts +3 -4
  255. package/dist/workspace/runner.d.ts.map +1 -1
  256. package/dist/workspace/runner.js.map +1 -1
  257. package/dist/workspace/types.d.ts +9 -2
  258. package/dist/workspace/types.d.ts.map +1 -1
  259. package/dist/workspace/types.js.map +1 -1
  260. package/package.json +6 -4
  261. package/references/sessionlog/.husky/pre-commit +1 -0
  262. package/references/sessionlog/.lintstagedrc.json +4 -0
  263. package/references/sessionlog/.prettierignore +4 -0
  264. package/references/sessionlog/.prettierrc.json +11 -0
  265. package/references/sessionlog/LICENSE +21 -0
  266. package/references/sessionlog/README.md +453 -0
  267. package/references/sessionlog/eslint.config.js +58 -0
  268. package/references/sessionlog/package-lock.json +3672 -0
  269. package/references/sessionlog/package.json +65 -0
  270. package/references/sessionlog/src/__tests__/agent-hooks.test.ts +570 -0
  271. package/references/sessionlog/src/__tests__/agent-registry.test.ts +127 -0
  272. package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +225 -0
  273. package/references/sessionlog/src/__tests__/claude-generator.test.ts +46 -0
  274. package/references/sessionlog/src/__tests__/commit-msg.test.ts +86 -0
  275. package/references/sessionlog/src/__tests__/cursor-agent.test.ts +224 -0
  276. package/references/sessionlog/src/__tests__/e2e-live.test.ts +890 -0
  277. package/references/sessionlog/src/__tests__/event-log.test.ts +183 -0
  278. package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +105 -0
  279. package/references/sessionlog/src/__tests__/gemini-agent.test.ts +375 -0
  280. package/references/sessionlog/src/__tests__/git-hooks.test.ts +78 -0
  281. package/references/sessionlog/src/__tests__/hook-managers.test.ts +121 -0
  282. package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +759 -0
  283. package/references/sessionlog/src/__tests__/opencode-agent.test.ts +338 -0
  284. package/references/sessionlog/src/__tests__/redaction.test.ts +136 -0
  285. package/references/sessionlog/src/__tests__/session-repo.test.ts +353 -0
  286. package/references/sessionlog/src/__tests__/session-store.test.ts +166 -0
  287. package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +466 -0
  288. package/references/sessionlog/src/__tests__/skill-live.test.ts +461 -0
  289. package/references/sessionlog/src/__tests__/summarize.test.ts +348 -0
  290. package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +610 -0
  291. package/references/sessionlog/src/__tests__/task-plan-live.test.ts +632 -0
  292. package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +121 -0
  293. package/references/sessionlog/src/__tests__/types.test.ts +166 -0
  294. package/references/sessionlog/src/__tests__/utils.test.ts +333 -0
  295. package/references/sessionlog/src/__tests__/validation.test.ts +103 -0
  296. package/references/sessionlog/src/__tests__/worktree.test.ts +57 -0
  297. package/references/sessionlog/src/agent/agents/claude-code.ts +1089 -0
  298. package/references/sessionlog/src/agent/agents/cursor.ts +361 -0
  299. package/references/sessionlog/src/agent/agents/gemini-cli.ts +632 -0
  300. package/references/sessionlog/src/agent/agents/opencode.ts +540 -0
  301. package/references/sessionlog/src/agent/registry.ts +143 -0
  302. package/references/sessionlog/src/agent/session-types.ts +113 -0
  303. package/references/sessionlog/src/agent/types.ts +220 -0
  304. package/references/sessionlog/src/cli.ts +597 -0
  305. package/references/sessionlog/src/commands/clean.ts +133 -0
  306. package/references/sessionlog/src/commands/disable.ts +84 -0
  307. package/references/sessionlog/src/commands/doctor.ts +145 -0
  308. package/references/sessionlog/src/commands/enable.ts +202 -0
  309. package/references/sessionlog/src/commands/explain.ts +261 -0
  310. package/references/sessionlog/src/commands/reset.ts +105 -0
  311. package/references/sessionlog/src/commands/resume.ts +180 -0
  312. package/references/sessionlog/src/commands/rewind.ts +195 -0
  313. package/references/sessionlog/src/commands/setup-ccweb.ts +275 -0
  314. package/references/sessionlog/src/commands/status.ts +172 -0
  315. package/references/sessionlog/src/config.ts +165 -0
  316. package/references/sessionlog/src/events/event-log.ts +126 -0
  317. package/references/sessionlog/src/git-operations.ts +558 -0
  318. package/references/sessionlog/src/hooks/git-hooks.ts +165 -0
  319. package/references/sessionlog/src/hooks/lifecycle.ts +391 -0
  320. package/references/sessionlog/src/index.ts +650 -0
  321. package/references/sessionlog/src/security/redaction.ts +283 -0
  322. package/references/sessionlog/src/session/state-machine.ts +452 -0
  323. package/references/sessionlog/src/store/checkpoint-store.ts +509 -0
  324. package/references/sessionlog/src/store/native-store.ts +173 -0
  325. package/references/sessionlog/src/store/provider-types.ts +99 -0
  326. package/references/sessionlog/src/store/session-store.ts +266 -0
  327. package/references/sessionlog/src/strategy/attribution.ts +296 -0
  328. package/references/sessionlog/src/strategy/common.ts +207 -0
  329. package/references/sessionlog/src/strategy/content-overlap.ts +228 -0
  330. package/references/sessionlog/src/strategy/manual-commit.ts +988 -0
  331. package/references/sessionlog/src/strategy/types.ts +279 -0
  332. package/references/sessionlog/src/summarize/claude-generator.ts +115 -0
  333. package/references/sessionlog/src/summarize/summarize.ts +432 -0
  334. package/references/sessionlog/src/types.ts +508 -0
  335. package/references/sessionlog/src/utils/chunk-files.ts +49 -0
  336. package/references/sessionlog/src/utils/commit-message.ts +65 -0
  337. package/references/sessionlog/src/utils/detect-agent.ts +36 -0
  338. package/references/sessionlog/src/utils/hook-managers.ts +125 -0
  339. package/references/sessionlog/src/utils/ide-tags.ts +32 -0
  340. package/references/sessionlog/src/utils/paths.ts +79 -0
  341. package/references/sessionlog/src/utils/preview-rewind.ts +80 -0
  342. package/references/sessionlog/src/utils/rewind-conflict.ts +121 -0
  343. package/references/sessionlog/src/utils/shadow-branch.ts +109 -0
  344. package/references/sessionlog/src/utils/string-utils.ts +46 -0
  345. package/references/sessionlog/src/utils/todo-extract.ts +188 -0
  346. package/references/sessionlog/src/utils/trailers.ts +187 -0
  347. package/references/sessionlog/src/utils/transcript-parse.ts +177 -0
  348. package/references/sessionlog/src/utils/transcript-timestamp.ts +59 -0
  349. package/references/sessionlog/src/utils/tree-ops.ts +219 -0
  350. package/references/sessionlog/src/utils/tty.ts +72 -0
  351. package/references/sessionlog/src/utils/validation.ts +65 -0
  352. package/references/sessionlog/src/utils/worktree.ts +58 -0
  353. package/references/sessionlog/src/wire-types.ts +59 -0
  354. package/references/sessionlog/templates/setup-env.sh +153 -0
  355. package/references/sessionlog/tsconfig.json +18 -0
  356. package/references/sessionlog/vitest.config.ts +12 -0
  357. package/references/skill-tree/.sudocode/issues.jsonl +8 -0
  358. package/references/skill-tree/.sudocode/specs.jsonl +2 -0
  359. package/references/skill-tree/CLAUDE.md +56 -80
  360. package/references/skill-tree/README.md +188 -140
  361. package/references/skill-tree/examples/basic-usage.ts +95 -121
  362. package/references/skill-tree/package-lock.json +369 -26
  363. package/references/skill-tree/package.json +1 -1
  364. package/src/atlas.ts +97 -67
  365. package/src/bin/cli-utils.ts +220 -0
  366. package/src/bin/cognitive-core.ts +84 -392
  367. package/src/bin/commands/kb.ts +266 -0
  368. package/src/bin/commands/learn.ts +100 -0
  369. package/src/bin/commands/legacy.ts +182 -0
  370. package/src/bin/commands/run.ts +113 -0
  371. package/src/bin/commands/sessions.ts +221 -0
  372. package/src/bin/commands/skills.ts +146 -0
  373. package/src/embeddings/index.ts +3 -0
  374. package/src/embeddings/inverted-index.ts +134 -0
  375. package/src/embeddings/manager.ts +13 -8
  376. package/src/embeddings/vector-store.ts +21 -9
  377. package/src/factory.ts +33 -16
  378. package/src/index.ts +109 -9
  379. package/src/learning/analyzer.ts +21 -37
  380. package/src/learning/energy-evaluator.ts +282 -0
  381. package/src/learning/healing-orchestrator.ts +383 -0
  382. package/src/learning/index.ts +65 -9
  383. package/src/learning/instant-loop.ts +357 -0
  384. package/src/learning/maintenance-scheduler.ts +271 -0
  385. package/src/learning/meta-learner.ts +5 -23
  386. package/src/learning/reflexion-generator.ts +273 -0
  387. package/src/learning/trajectory-sources/entire.ts +24 -13
  388. package/src/learning/trajectory-sources/index.ts +2 -2
  389. package/src/learning/trajectory-sources/pipeline.ts +5 -5
  390. package/src/learning/unified-pipeline.ts +921 -0
  391. package/src/memory/candidate-retrieval.ts +71 -0
  392. package/src/memory/causal-store.ts +273 -0
  393. package/src/memory/coherence.ts +252 -0
  394. package/src/memory/experience.ts +217 -50
  395. package/src/memory/index.ts +43 -0
  396. package/src/memory/knowledge-bank.ts +57 -0
  397. package/src/memory/meta.ts +78 -96
  398. package/src/memory/playbook.ts +239 -75
  399. package/src/memory/reasoning-bank.ts +458 -0
  400. package/src/memory/reflexion.ts +122 -0
  401. package/src/memory/system.ts +21 -5
  402. package/src/memory/temporal-compressor.ts +409 -0
  403. package/src/persistence/index.ts +37 -0
  404. package/src/persistence/migrator.ts +298 -0
  405. package/src/persistence/serializers.ts +79 -0
  406. package/src/persistence/sqlite-persistence.ts +925 -0
  407. package/src/runtime/flows/learning.ts +25 -42
  408. package/src/search/index.ts +10 -0
  409. package/src/search/moe-gate.ts +304 -0
  410. package/src/search/router.ts +111 -4
  411. package/src/session-bank/git-reader.ts +29 -19
  412. package/src/session-bank/index.ts +4 -2
  413. package/src/session-bank/parser.ts +280 -98
  414. package/src/session-bank/session-bank.ts +33 -12
  415. package/src/session-bank/types.ts +8 -5
  416. package/src/surfacing/skill-publisher.ts +17 -49
  417. package/src/surfacing/sqlite-storage-adapter.ts +16 -32
  418. package/src/types/config.ts +30 -0
  419. package/src/types/index.ts +3 -0
  420. package/src/types/memory.ts +30 -0
  421. package/src/types/playbook.ts +4 -0
  422. package/src/utils/error-classifier.ts +113 -0
  423. package/src/utils/index.ts +18 -0
  424. package/src/utils/partitioned-store.ts +299 -0
  425. package/src/utils/trajectory-helpers.ts +79 -0
  426. package/src/workspace/runner.ts +3 -3
  427. package/src/workspace/types.ts +10 -2
  428. package/tests/embeddings/inverted-index.test.ts +138 -0
  429. package/tests/feature-toggles.test.ts +275 -0
  430. package/tests/gap-fixes.test.ts +17 -4
  431. package/tests/integration/cli-e2e.test.ts +621 -0
  432. package/tests/integration/e2e.test.ts +6 -5
  433. package/tests/integration/entire-e2e.test.ts +314 -125
  434. package/tests/integration/persistence-e2e.test.ts +741 -0
  435. package/tests/integration/phase-e2e.test.ts +1143 -0
  436. package/tests/integration/session-bank.test.ts +20 -14
  437. package/tests/integration/sessionlog-e2e.test.ts +329 -0
  438. package/tests/integration/unified-pipeline-e2e.test.ts +634 -0
  439. package/tests/learning/analyzer.test.ts +1 -1
  440. package/tests/learning/energy-evaluator.test.ts +180 -0
  441. package/tests/learning/entire-trajectory-source.test.ts +25 -25
  442. package/tests/learning/healing-orchestrator.test.ts +269 -0
  443. package/tests/learning/instant-loop.test.ts +243 -0
  444. package/tests/learning/maintenance-scheduler.test.ts +191 -0
  445. package/tests/learning/reflexion-generator.test.ts +411 -0
  446. package/tests/learning/trajectory-sources.test.ts +12 -4
  447. package/tests/learning/unified-pipeline.test.ts +322 -0
  448. package/tests/mcp/playbook-server.test.ts +6 -1
  449. package/tests/memory/causal-store.test.ts +276 -0
  450. package/tests/memory/coherence.test.ts +232 -0
  451. package/tests/memory/experience.test.ts +8 -3
  452. package/tests/memory/playbook.test.ts +307 -1
  453. package/tests/memory/provenance.test.ts +11 -2
  454. package/tests/memory/reasoning-bank.test.ts +239 -0
  455. package/tests/memory/reflexion.test.ts +166 -0
  456. package/tests/memory/skill-exporter.test.ts +6 -1
  457. package/tests/memory/system.test.ts +6 -1
  458. package/tests/memory/temporal-compressor.test.ts +318 -0
  459. package/tests/persistence/migrator.test.ts +1009 -0
  460. package/tests/persistence/sqlite-persistence.test.ts +635 -0
  461. package/tests/runtime/agent-manager.test.ts +6 -1
  462. package/tests/runtime/delegate.test.ts +6 -1
  463. package/tests/search/moe-gate.test.ts +250 -0
  464. package/tests/search/refinement-loop.test.ts +11 -2
  465. package/tests/search/router.test.ts +81 -2
  466. package/tests/session-bank/fixtures/sessionlog-root-metadata.json +16 -0
  467. package/tests/session-bank/fixtures/sessionlog-session/full.jsonl +6 -0
  468. package/tests/session-bank/fixtures/sessionlog-session/metadata.json +55 -0
  469. package/tests/session-bank/git-reader.test.ts +13 -13
  470. package/tests/session-bank/parser.test.ts +135 -3
  471. package/tests/session-bank/session-bank.test.ts +1 -1
  472. package/tests/surfacing/skill-library.test.ts +6 -1
  473. package/tests/surfacing/skill-publisher.test.ts +24 -58
  474. package/tests/surfacing/sqlite-storage-adapter.test.ts +11 -23
  475. package/tests/utils/partitioned-store.test.ts +230 -0
  476. package/tests/workspace/full-flow.test.ts +10 -4
  477. package/tests/workspace/runner.test.ts +10 -4
  478. package/docs/DESIGN-workspace-migration.md +0 -1079
  479. package/docs/PLAN-agentic-workspace-implementation.md +0 -717
  480. package/docs/PLAN-graph-migration.md +0 -299
  481. package/docs/PLAN-session-bank-implementation.md +0 -474
  482. package/src/learning/pipeline.ts +0 -323
  483. package/tests/learning/pipeline.test.ts +0 -176
@@ -0,0 +1,250 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import {
3
+ MoEGate,
4
+ extractTaskFeatures,
5
+ MOE_FEATURE_SIZE,
6
+ MOE_STRATEGIES,
7
+ } from '../../src/search/moe-gate.js';
8
+
9
+ describe('MoEGate', () => {
10
+ const strategies = [...MOE_STRATEGIES];
11
+ const featureSize = MOE_FEATURE_SIZE;
12
+
13
+ describe('gate produces valid probability distribution', () => {
14
+ it('should produce probabilities that sum to 1', () => {
15
+ const gate = new MoEGate(strategies, featureSize);
16
+ const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
17
+
18
+ const probs = gate.gate(features);
19
+
20
+ let sum = 0;
21
+ for (const [, prob] of probs) {
22
+ expect(prob).toBeGreaterThanOrEqual(0);
23
+ expect(prob).toBeLessThanOrEqual(1);
24
+ sum += prob;
25
+ }
26
+ expect(sum).toBeCloseTo(1.0, 5);
27
+ });
28
+
29
+ it('should produce one weight per strategy', () => {
30
+ const gate = new MoEGate(strategies, featureSize);
31
+ const features = Array(featureSize).fill(0.5);
32
+
33
+ const probs = gate.gate(features);
34
+ expect(probs.size).toBe(strategies.length);
35
+
36
+ for (const strategy of strategies) {
37
+ expect(probs.has(strategy)).toBe(true);
38
+ }
39
+ });
40
+ });
41
+
42
+ describe('cold start produces uniform weights', () => {
43
+ it('should produce near-uniform weights before any updates', () => {
44
+ const gate = new MoEGate(strategies, featureSize);
45
+ const features = Array(featureSize).fill(0.5);
46
+
47
+ const probs = gate.gate(features);
48
+
49
+ const expected = 1 / strategies.length;
50
+ for (const [, prob] of probs) {
51
+ // Near-uniform (within 10% of expected)
52
+ expect(Math.abs(prob - expected)).toBeLessThan(0.1);
53
+ }
54
+ });
55
+
56
+ it('should not be marked as trained initially', () => {
57
+ const gate = new MoEGate(strategies, featureSize);
58
+ expect(gate.isTrained).toBe(false);
59
+ expect(gate.totalUpdates).toBe(0);
60
+ });
61
+ });
62
+
63
+ describe('update shifts weights toward successful strategy', () => {
64
+ it('should increase probability of rewarded strategy', () => {
65
+ const gate = new MoEGate(strategies, featureSize);
66
+ const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
67
+
68
+ const before = gate.gate(features).get('direct')!;
69
+
70
+ // Repeatedly reward 'direct' strategy
71
+ for (let i = 0; i < 50; i++) {
72
+ gate.update(features, 'direct', 1.0, 0.05);
73
+ }
74
+
75
+ const after = gate.gate(features).get('direct')!;
76
+ expect(after).toBeGreaterThan(before);
77
+ });
78
+
79
+ it('should decrease probability of failing strategy', () => {
80
+ const gate = new MoEGate(strategies, featureSize);
81
+ const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
82
+
83
+ // First train 'explore' to have high weight
84
+ for (let i = 0; i < 20; i++) {
85
+ gate.update(features, 'explore', 1.0, 0.05);
86
+ }
87
+ const beforeFail = gate.gate(features).get('explore')!;
88
+
89
+ // Then penalize 'explore' (reward=0)
90
+ for (let i = 0; i < 30; i++) {
91
+ gate.update(features, 'explore', 0.0, 0.05);
92
+ }
93
+ const afterFail = gate.gate(features).get('explore')!;
94
+
95
+ expect(afterFail).toBeLessThan(beforeFail);
96
+ });
97
+
98
+ it('should be marked as trained after updates', () => {
99
+ const gate = new MoEGate(strategies, featureSize);
100
+ gate.update(Array(featureSize).fill(0.5), 'direct', 1.0);
101
+ expect(gate.isTrained).toBe(true);
102
+ expect(gate.totalUpdates).toBe(1);
103
+ });
104
+ });
105
+
106
+ describe('repeated updates converge', () => {
107
+ it('should converge on the consistently rewarded strategy', () => {
108
+ const gate = new MoEGate(strategies, featureSize);
109
+ const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
110
+
111
+ // Consistently reward 'adapt'
112
+ for (let i = 0; i < 100; i++) {
113
+ gate.update(features, 'adapt', 1.0, 0.02);
114
+ }
115
+
116
+ const selected = gate.selectStrategy(features);
117
+ expect(selected).toBe('adapt');
118
+ });
119
+ });
120
+
121
+ describe('domain-specific weights', () => {
122
+ it('should learn different strategies for different domains', () => {
123
+ const gate = new MoEGate(strategies, featureSize);
124
+ const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
125
+
126
+ // TypeScript domain prefers 'direct'
127
+ for (let i = 0; i < 50; i++) {
128
+ gate.update(features, 'direct', 1.0, 0.05, 'typescript');
129
+ }
130
+
131
+ // Devops domain prefers 'explore'
132
+ for (let i = 0; i < 50; i++) {
133
+ gate.update(features, 'explore', 1.0, 0.05, 'devops');
134
+ }
135
+
136
+ const tsStrategy = gate.selectStrategy(features, 'typescript');
137
+ const devopsStrategy = gate.selectStrategy(features, 'devops');
138
+
139
+ expect(tsStrategy).toBe('direct');
140
+ expect(devopsStrategy).toBe('explore');
141
+ });
142
+ });
143
+
144
+ describe('serialization round-trips correctly', () => {
145
+ it('should produce identical gate output after serialization', () => {
146
+ const gate = new MoEGate(strategies, featureSize);
147
+ const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
148
+
149
+ // Train it
150
+ for (let i = 0; i < 20; i++) {
151
+ gate.update(features, 'adapt', 1.0, 0.05);
152
+ gate.update(features, 'direct', 0.5, 0.05, 'typescript');
153
+ }
154
+
155
+ // Serialize and deserialize
156
+ const json = gate.toJSON();
157
+ const restored = MoEGate.fromJSON(json);
158
+
159
+ // Compare outputs
160
+ const originalProbs = gate.gate(features);
161
+ const restoredProbs = restored.gate(features);
162
+
163
+ for (const strategy of strategies) {
164
+ expect(restoredProbs.get(strategy)).toBeCloseTo(
165
+ originalProbs.get(strategy)!,
166
+ 10
167
+ );
168
+ }
169
+
170
+ expect(restored.isTrained).toBe(gate.isTrained);
171
+ expect(restored.totalUpdates).toBe(gate.totalUpdates);
172
+ });
173
+
174
+ it('should preserve domain weights across serialization', () => {
175
+ const gate = new MoEGate(strategies, featureSize);
176
+ const features = [0.5, 0.3, 0.8, 0.6, 0.9, 1, 0, 0.2];
177
+
178
+ for (let i = 0; i < 30; i++) {
179
+ gate.update(features, 'direct', 1.0, 0.05, 'typescript');
180
+ }
181
+
182
+ const json = gate.toJSON();
183
+ const restored = MoEGate.fromJSON(json);
184
+
185
+ const originalTs = gate.gate(features, 'typescript');
186
+ const restoredTs = restored.gate(features, 'typescript');
187
+
188
+ for (const strategy of strategies) {
189
+ expect(restoredTs.get(strategy)).toBeCloseTo(
190
+ originalTs.get(strategy)!,
191
+ 10
192
+ );
193
+ }
194
+ });
195
+ });
196
+ });
197
+
198
+ describe('extractTaskFeatures', () => {
199
+ it('should produce feature vector of correct size', () => {
200
+ const features = extractTaskFeatures(
201
+ 'Fix TypeScript type error in user module',
202
+ { experiences: [], playbooks: [] },
203
+ );
204
+
205
+ expect(features).toHaveLength(MOE_FEATURE_SIZE);
206
+ });
207
+
208
+ it('should set bug fix indicator for bug-related tasks', () => {
209
+ const features = extractTaskFeatures(
210
+ 'Fix the authentication bug in login flow',
211
+ { experiences: [], playbooks: [] },
212
+ );
213
+
214
+ expect(features[5]).toBe(1); // isBugFix
215
+ });
216
+
217
+ it('should set new feature indicator for implementation tasks', () => {
218
+ const features = extractTaskFeatures(
219
+ 'Implement user profile page with avatar upload',
220
+ { experiences: [], playbooks: [] },
221
+ );
222
+
223
+ expect(features[6]).toBe(1); // isNewFeature
224
+ });
225
+
226
+ it('should reflect memory context scores', () => {
227
+ const features = extractTaskFeatures(
228
+ 'Test task',
229
+ {
230
+ experiences: [{ score: 0.85 }],
231
+ playbooks: [{ score: 0.9, playbook: { confidence: 0.95 } }],
232
+ },
233
+ );
234
+
235
+ expect(features[2]).toBe(0.85); // best experience match
236
+ expect(features[3]).toBe(0.9); // best playbook match
237
+ expect(features[4]).toBe(0.95); // best playbook confidence
238
+ });
239
+
240
+ it('should handle empty memory context', () => {
241
+ const features = extractTaskFeatures(
242
+ 'Novel task',
243
+ { experiences: [], playbooks: [] },
244
+ );
245
+
246
+ expect(features[2]).toBe(0); // no experiences
247
+ expect(features[3]).toBe(0); // no playbooks
248
+ expect(features[4]).toBe(0); // no playbook confidence
249
+ });
250
+ });
@@ -13,6 +13,7 @@ import type { AgentSpawnConfig } from '../../src/runtime/types.js';
13
13
  import { mkdtemp, rm } from 'node:fs/promises';
14
14
  import { join } from 'node:path';
15
15
  import { tmpdir } from 'node:os';
16
+ import { createSqlitePersistence } from '../../src/persistence/index.js';
16
17
 
17
18
  describe('RefinementLoop', () => {
18
19
  let tempDir: string;
@@ -20,6 +21,7 @@ describe('RefinementLoop', () => {
20
21
  let agentManager: AgentManager;
21
22
  let mockBackend: MockBackend;
22
23
  let refinementLoop: RefinementLoop;
24
+ let persistence: any;
23
25
 
24
26
  const createTestTask = () => createTask({
25
27
  domain: 'test',
@@ -48,7 +50,9 @@ describe('RefinementLoop', () => {
48
50
 
49
51
  beforeEach(async () => {
50
52
  tempDir = await mkdtemp(join(tmpdir(), 'refinement-loop-test-'));
51
- memory = createMemorySystem(tempDir);
53
+ persistence = createSqlitePersistence({ baseDir: tempDir });
54
+ await persistence.init();
55
+ memory = createMemorySystem(persistence, tempDir);
52
56
  await memory.init();
53
57
 
54
58
  agentManager = createAgentManager(memory);
@@ -67,6 +71,7 @@ describe('RefinementLoop', () => {
67
71
 
68
72
  afterEach(async () => {
69
73
  await memory.close();
74
+ persistence.close();
70
75
  await rm(tempDir, { recursive: true, force: true });
71
76
  });
72
77
 
@@ -432,10 +437,13 @@ describe('createRefinementLoop', () => {
432
437
  let tempDir: string;
433
438
  let memory: MemorySystem;
434
439
  let agentManager: AgentManager;
440
+ let persistence: any;
435
441
 
436
442
  beforeEach(async () => {
437
443
  tempDir = await mkdtemp(join(tmpdir(), 'create-refinement-test-'));
438
- memory = createMemorySystem(tempDir);
444
+ persistence = createSqlitePersistence({ baseDir: tempDir });
445
+ await persistence.init();
446
+ memory = createMemorySystem(persistence, tempDir);
439
447
  await memory.init();
440
448
  agentManager = createAgentManager(memory);
441
449
  agentManager.registerBackend(createMockBackend());
@@ -443,6 +451,7 @@ describe('createRefinementLoop', () => {
443
451
 
444
452
  afterEach(async () => {
445
453
  await memory.close();
454
+ persistence.close();
446
455
  await rm(tempDir, { recursive: true, force: true });
447
456
  });
448
457
 
@@ -7,21 +7,26 @@ import type { MetaLearner } from '../../src/learning/meta-learner.js';
7
7
  import { mkdtemp, rm } from 'node:fs/promises';
8
8
  import { join } from 'node:path';
9
9
  import { tmpdir } from 'node:os';
10
+ import { createSqlitePersistence } from '../../src/persistence/index.js';
10
11
 
11
12
  describe('TaskRouter', () => {
12
13
  let tempDir: string;
13
14
  let memory: MemorySystem;
14
15
  let router: TaskRouter;
16
+ let persistence: any;
15
17
 
16
18
  beforeEach(async () => {
17
19
  tempDir = await mkdtemp(join(tmpdir(), 'router-test-'));
18
- memory = createMemorySystem(tempDir);
20
+ persistence = createSqlitePersistence({ baseDir: tempDir });
21
+ await persistence.init();
22
+ memory = createMemorySystem(persistence, tempDir);
19
23
  await memory.init();
20
24
  router = createRouter(memory);
21
25
  });
22
26
 
23
27
  afterEach(async () => {
24
28
  await memory.close();
29
+ persistence.close();
25
30
  await rm(tempDir, { recursive: true, force: true });
26
31
  });
27
32
 
@@ -351,6 +356,76 @@ describe('TaskRouter', () => {
351
356
  });
352
357
  });
353
358
 
359
+ describe('MoE gate integration', () => {
360
+ it('should still select reasonable strategies with uninitialized gate', async () => {
361
+ const task = createTask({
362
+ domain: 'test',
363
+ description: 'A completely new task with no memory',
364
+ });
365
+
366
+ const decision = await router.route(task);
367
+
368
+ // Gate is untrained, should fall back to threshold heuristics
369
+ expect(decision.strategy).toBe('fallback');
370
+ expect(decision.appliedMetaStrategies).toBeUndefined();
371
+ });
372
+
373
+ it('should update gate after trajectory completion', async () => {
374
+ const task = createTask({
375
+ domain: 'typescript',
376
+ description: 'Fix TypeScript error in module',
377
+ });
378
+
379
+ const decision = await router.route(task);
380
+
381
+ // Update gate with outcome
382
+ router.updateGate(task, decision.memoryContext, decision.strategy, 1.0);
383
+
384
+ // Gate should now be trained
385
+ expect(router.getMoEGate().isTrained).toBe(true);
386
+ expect(router.getMoEGate().totalUpdates).toBe(1);
387
+ });
388
+
389
+ it('should use trained gate for routing when updates exist', async () => {
390
+ const features_task = createTask({
391
+ domain: 'typescript',
392
+ description: 'Fix TypeScript type error in user handler module',
393
+ });
394
+
395
+ // Train the gate heavily toward 'adapt' for this feature profile
396
+ const memoryContext = { experiences: [], playbooks: [] };
397
+ for (let i = 0; i < 50; i++) {
398
+ router.updateGate(features_task, memoryContext, 'adapt', 1.0);
399
+ }
400
+
401
+ const decision = await router.route(features_task);
402
+
403
+ // With a trained gate, the applied strategies should include 'moe-gate'
404
+ expect(decision.appliedMetaStrategies).toContain('moe-gate');
405
+ });
406
+
407
+ it('should persist and restore gate state', () => {
408
+ const task = createTask({
409
+ domain: 'test',
410
+ description: 'Persistence test task',
411
+ });
412
+ const memoryContext = { experiences: [], playbooks: [] };
413
+
414
+ // Train
415
+ router.updateGate(task, memoryContext, 'direct', 1.0);
416
+
417
+ // Serialize
418
+ const state = router.getMoEGate().toJSON();
419
+
420
+ // Load into fresh router
421
+ const router2 = createRouter(memory);
422
+ router2.loadGateState(state);
423
+
424
+ expect(router2.getMoEGate().isTrained).toBe(true);
425
+ expect(router2.getMoEGate().totalUpdates).toBe(1);
426
+ });
427
+ });
428
+
354
429
  describe('task characteristics extraction', () => {
355
430
  it('should identify bug fix tasks', async () => {
356
431
  const task = createTask({
@@ -387,15 +462,19 @@ describe('TaskRouter', () => {
387
462
  describe('createRouter', () => {
388
463
  let tempDir: string;
389
464
  let memory: MemorySystem;
465
+ let persistence: any;
390
466
 
391
467
  beforeEach(async () => {
392
468
  tempDir = await mkdtemp(join(tmpdir(), 'create-router-test-'));
393
- memory = createMemorySystem(tempDir);
469
+ persistence = createSqlitePersistence({ baseDir: tempDir });
470
+ await persistence.init();
471
+ memory = createMemorySystem(persistence, tempDir);
394
472
  await memory.init();
395
473
  });
396
474
 
397
475
  afterEach(async () => {
398
476
  await memory.close();
477
+ persistence.close();
399
478
  await rm(tempDir, { recursive: true, force: true });
400
479
  });
401
480
 
@@ -0,0 +1,16 @@
1
+ {
2
+ "cliVersion": "opentasks-sessionlog",
3
+ "checkpointID": "c4d5e6f7a8b9",
4
+ "strategy": "manual-commit",
5
+ "branch": "main",
6
+ "checkpointsCount": 3,
7
+ "filesTouched": ["src/api.ts", "tests/api.test.ts"],
8
+ "sessions": [
9
+ {
10
+ "metadata": "1/metadata.json",
11
+ "transcript": "1/full.jsonl",
12
+ "context": "1/context.md",
13
+ "prompt": "1/prompt.txt"
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,6 @@
1
+ {"type":"user","uuid":"msg-sl-001","message":{"content":"Add input validation to the API endpoint using Zod"}}
2
+ {"type":"assistant","uuid":"msg-sl-002","message":{"content":[{"type":"text","text":"I'll examine the API endpoint first."},{"type":"tool_use","id":"tool-sl-001","name":"Read","input":{"file_path":"/src/api.ts"}}]}}
3
+ {"type":"user","uuid":"msg-sl-003","message":{"content":[{"type":"tool_result","tool_use_id":"tool-sl-001","content":"export function handler(req, res) {\n const body = req.body;\n // TODO: validate\n res.json({ ok: true });\n}"}]}}
4
+ {"type":"assistant","uuid":"msg-sl-004","message":{"content":[{"type":"text","text":"I'll add Zod validation."},{"type":"tool_use","id":"tool-sl-002","name":"Edit","input":{"file_path":"/src/api.ts","old_string":"const body = req.body;","new_string":"const body = schema.parse(req.body);"}}]}}
5
+ {"type":"user","uuid":"msg-sl-005","message":{"content":[{"type":"tool_result","tool_use_id":"tool-sl-002","content":"File edited successfully"}]}}
6
+ {"type":"assistant","uuid":"msg-sl-006","message":{"content":[{"type":"text","text":"Validation added. The endpoint now validates input using the Zod schema before processing."}]}}
@@ -0,0 +1,55 @@
1
+ {
2
+ "cliVersion": "opentasks-sessionlog",
3
+ "checkpointID": "c4d5e6f7a8b9",
4
+ "sessionID": "2026-02-15-aabbccdd-1122-3344-5566-778899aabbcc",
5
+ "strategy": "manual-commit",
6
+ "createdAt": "2026-02-15T09:00:00Z",
7
+ "branch": "main",
8
+ "filesTouched": ["src/api.ts", "tests/api.test.ts"],
9
+ "agent": "Claude Code",
10
+ "turnID": "turn-001",
11
+ "isTask": false,
12
+ "checkpointTranscriptStart": 0,
13
+ "tokenUsage": {
14
+ "inputTokens": 20000,
15
+ "cacheCreationTokens": 3000,
16
+ "cacheReadTokens": 6000,
17
+ "outputTokens": 4000,
18
+ "apiCallCount": 10,
19
+ "subagentTokens": {
20
+ "inputTokens": 2000,
21
+ "cacheCreationTokens": 0,
22
+ "cacheReadTokens": 0,
23
+ "outputTokens": 800,
24
+ "apiCallCount": 3
25
+ }
26
+ },
27
+ "summary": {
28
+ "intent": "Add validation to the API endpoint",
29
+ "outcome": "Added input validation with Zod schema",
30
+ "learnings": {
31
+ "repo": ["API routes use Zod for validation"],
32
+ "code": [
33
+ {
34
+ "path": "src/api.ts",
35
+ "line": 15,
36
+ "finding": "Zod schema must be defined before route handler"
37
+ }
38
+ ],
39
+ "workflow": ["Run API tests with --reporter=verbose flag"]
40
+ },
41
+ "friction": ["Had to look up Zod coercion syntax"],
42
+ "openItems": ["Add validation for the PUT endpoint too"]
43
+ },
44
+ "initialAttribution": {
45
+ "calculatedAt": "2026-02-15T09:30:00Z",
46
+ "agentLines": 30,
47
+ "humanAdded": 3,
48
+ "humanModified": 1,
49
+ "humanRemoved": 0,
50
+ "totalCommitted": 34,
51
+ "agentPercentage": 0.88
52
+ },
53
+ "tasks": {},
54
+ "skillsUsed": []
55
+ }
@@ -3,7 +3,7 @@ import { mkdtemp, rm, readFile } from 'node:fs/promises';
3
3
  import { tmpdir } from 'node:os';
4
4
  import { join } from 'node:path';
5
5
  import { execFileSync } from 'node:child_process';
6
- import { EntireGitReader } from '../../src/session-bank/git-reader.js';
6
+ import { CheckpointGitReader } from '../../src/session-bank/git-reader.js';
7
7
 
8
8
  const FIXTURES = join(import.meta.dirname, 'fixtures');
9
9
 
@@ -126,14 +126,14 @@ async function createFixtureRepo(): Promise<string> {
126
126
  const orphanCommit = commitTree(tmpDir, rootTree, 'checkpoint data');
127
127
  git(tmpDir, [
128
128
  'update-ref',
129
- 'refs/heads/entire/checkpoints/v1',
129
+ 'refs/heads/sessionlog/checkpoints/v1',
130
130
  orphanCommit,
131
131
  ]);
132
132
 
133
133
  return tmpDir;
134
134
  }
135
135
 
136
- describe('EntireGitReader', () => {
136
+ describe('CheckpointGitReader', () => {
137
137
  let tmpDir: string;
138
138
 
139
139
  beforeEach(async () => {
@@ -145,12 +145,12 @@ describe('EntireGitReader', () => {
145
145
  });
146
146
 
147
147
  it('should detect that the orphan branch exists', async () => {
148
- const reader = new EntireGitReader({ repoPath: tmpDir });
148
+ const reader = new CheckpointGitReader({ repoPath: tmpDir });
149
149
  expect(await reader.branchExists()).toBe(true);
150
150
  });
151
151
 
152
152
  it('should return false for non-existent branch', async () => {
153
- const reader = new EntireGitReader({
153
+ const reader = new CheckpointGitReader({
154
154
  repoPath: tmpDir,
155
155
  branch: 'nonexistent/branch',
156
156
  });
@@ -158,7 +158,7 @@ describe('EntireGitReader', () => {
158
158
  });
159
159
 
160
160
  it('should list checkpoint paths', async () => {
161
- const reader = new EntireGitReader({ repoPath: tmpDir });
161
+ const reader = new CheckpointGitReader({ repoPath: tmpDir });
162
162
  const checkpoints = await reader.listCheckpoints();
163
163
 
164
164
  expect(checkpoints).toHaveLength(1);
@@ -166,7 +166,7 @@ describe('EntireGitReader', () => {
166
166
  });
167
167
 
168
168
  it('should list session indices', async () => {
169
- const reader = new EntireGitReader({ repoPath: tmpDir });
169
+ const reader = new CheckpointGitReader({ repoPath: tmpDir });
170
170
  const sessions = await reader.listSessions('a3/b2c4d5e6f7');
171
171
 
172
172
  expect(sessions).toHaveLength(1);
@@ -174,7 +174,7 @@ describe('EntireGitReader', () => {
174
174
  });
175
175
 
176
176
  it('should read a file from the orphan branch', async () => {
177
- const reader = new EntireGitReader({ repoPath: tmpDir });
177
+ const reader = new CheckpointGitReader({ repoPath: tmpDir });
178
178
  const content = await reader.readFile(
179
179
  'a3/b2c4d5e6f7/0/metadata.json',
180
180
  );
@@ -185,7 +185,7 @@ describe('EntireGitReader', () => {
185
185
  });
186
186
 
187
187
  it('should batch-read multiple files', async () => {
188
- const reader = new EntireGitReader({ repoPath: tmpDir });
188
+ const reader = new CheckpointGitReader({ repoPath: tmpDir });
189
189
  const files = await reader.readFiles([
190
190
  'a3/b2c4d5e6f7/0/metadata.json',
191
191
  'a3/b2c4d5e6f7/0/full.jsonl',
@@ -199,13 +199,13 @@ describe('EntireGitReader', () => {
199
199
  });
200
200
 
201
201
  it('should return null for missing files', async () => {
202
- const reader = new EntireGitReader({ repoPath: tmpDir });
202
+ const reader = new CheckpointGitReader({ repoPath: tmpDir });
203
203
  const content = await reader.readFileOrNull('does/not/exist');
204
204
  expect(content).toBeNull();
205
205
  });
206
206
 
207
207
  it('should get the orphan branch HEAD SHA', async () => {
208
- const reader = new EntireGitReader({ repoPath: tmpDir });
208
+ const reader = new CheckpointGitReader({ repoPath: tmpDir });
209
209
  const sha = await reader.getBranchHead();
210
210
 
211
211
  expect(sha).toBeDefined();
@@ -213,7 +213,7 @@ describe('EntireGitReader', () => {
213
213
  });
214
214
 
215
215
  it('should return null for HEAD of non-existent branch', async () => {
216
- const reader = new EntireGitReader({
216
+ const reader = new CheckpointGitReader({
217
217
  repoPath: tmpDir,
218
218
  branch: 'nope',
219
219
  });
@@ -222,7 +222,7 @@ describe('EntireGitReader', () => {
222
222
  });
223
223
 
224
224
  it('should return empty checkpoints for non-existent branch', async () => {
225
- const reader = new EntireGitReader({
225
+ const reader = new CheckpointGitReader({
226
226
  repoPath: tmpDir,
227
227
  branch: 'nope',
228
228
  });