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
@@ -1,22 +1,28 @@
1
1
  import { execFile } from 'node:child_process';
2
2
 
3
- // ─── EntireGitReader ────────────────────────────────────────────────
4
- // Low-level git plumbing for reading from the Entire orphan branch
5
- // without checking it out. Uses only git commands, no fs access.
3
+ // ─── CheckpointGitReader ────────────────────────────────────────────
4
+ // Low-level git plumbing for reading from SessionLog checkpoint orphan
5
+ // branches without checking them out.
6
+ // Uses only git commands, no fs access.
6
7
  // ─────────────────────────────────────────────────────────────────────
7
8
 
8
9
  export interface GitReaderOptions {
9
10
  repoPath: string;
10
11
  branch?: string;
12
+ /** Trailer keys to search for checkpoint IDs in commit messages.
13
+ * Defaults to ['Sessionlog-Checkpoint']. */
14
+ trailerKeys?: string[];
11
15
  }
12
16
 
13
- export class EntireGitReader {
14
- private repoPath: string;
15
- private branch: string;
17
+ export class CheckpointGitReader {
18
+ readonly repoPath: string;
19
+ readonly branch: string;
20
+ private trailerKeys: string[];
16
21
 
17
22
  constructor(options: GitReaderOptions) {
18
23
  this.repoPath = options.repoPath;
19
- this.branch = options.branch ?? 'entire/checkpoints/v1';
24
+ this.branch = options.branch ?? 'sessionlog/checkpoints/v1';
25
+ this.trailerKeys = options.trailerKeys ?? ['Sessionlog-Checkpoint'];
20
26
  }
21
27
 
22
28
  /** Check if the orphan branch exists in this repo */
@@ -151,22 +157,26 @@ export class EntireGitReader {
151
157
  }
152
158
 
153
159
  /**
154
- * Find the Entire-Checkpoint trailer value for a given commit.
160
+ * Find a checkpoint trailer value for a given commit.
161
+ * Tries each configured trailer key in order.
155
162
  * Returns the checkpoint ID or null.
156
163
  */
157
164
  async getCheckpointTrailer(commitSha: string): Promise<string | null> {
158
- try {
159
- const output = await this.git([
160
- 'log',
161
- '--format=%(trailers:key=Entire-Checkpoint,valueonly)',
162
- commitSha,
163
- '-1',
164
- ]);
165
- const value = output.trim();
166
- return value || null;
167
- } catch {
168
- return null;
165
+ for (const key of this.trailerKeys) {
166
+ try {
167
+ const output = await this.git([
168
+ 'log',
169
+ `--format=%(trailers:key=${key},valueonly)`,
170
+ commitSha,
171
+ '-1',
172
+ ]);
173
+ const value = output.trim();
174
+ if (value) return value;
175
+ } catch {
176
+ // Try next key
177
+ }
169
178
  }
179
+ return null;
170
180
  }
171
181
 
172
182
  // ── Private ──────────────────────────────────────────────────
@@ -1,7 +1,9 @@
1
1
  export { SessionBank } from './session-bank.js';
2
- export { EntireGitReader, type GitReaderOptions } from './git-reader.js';
2
+ export { CheckpointGitReader, type GitReaderOptions } from './git-reader.js';
3
3
  export {
4
- EntireTranscriptParser,
4
+ CheckpointParser,
5
+ detectFormat,
6
+ type CheckpointFormat,
5
7
  type ParsedMetadata,
6
8
  } from './parser.js';
7
9
  export type {
@@ -9,9 +9,22 @@ import type {
9
9
  CheckpointRef,
10
10
  } from './types.js';
11
11
 
12
+ // ─── Format Detection ──────────────────────────────────────────────
13
+
14
+ export type CheckpointFormat = 'entire' | 'sessionlog' | 'unknown';
15
+
16
+ /** Auto-detect whether raw metadata JSON is Entire CLI or SessionLog format. */
17
+ export function detectFormat(raw: Record<string, unknown>): CheckpointFormat {
18
+ if ('checkpointID' in raw) return 'sessionlog';
19
+ if ('checkpoint_id' in raw) return 'entire';
20
+ if (raw.cliVersion === 'opentasks-sessionlog') return 'sessionlog';
21
+ if (typeof raw.cli_version === 'string') return 'entire';
22
+ return 'unknown';
23
+ }
24
+
12
25
  // ─── Raw Entire JSON shapes (snake_case, matching Go structs) ───────
13
26
 
14
- interface RawMetadata {
27
+ interface RawEntireMetadata {
15
28
  cli_version?: string;
16
29
  checkpoint_id?: string;
17
30
  session_id?: string;
@@ -23,21 +36,21 @@ interface RawMetadata {
23
36
  is_task?: boolean;
24
37
  tool_use_id?: string;
25
38
  checkpoint_transcript_start?: number;
26
- token_usage?: RawTokenUsage;
27
- summary?: RawSummary;
28
- initial_attribution?: RawAttribution;
39
+ token_usage?: RawEntireTokenUsage;
40
+ summary?: RawEntireSummary;
41
+ initial_attribution?: RawEntireAttribution;
29
42
  }
30
43
 
31
- interface RawTokenUsage {
44
+ interface RawEntireTokenUsage {
32
45
  input_tokens?: number;
33
46
  cache_creation_tokens?: number;
34
47
  cache_read_tokens?: number;
35
48
  output_tokens?: number;
36
49
  api_call_count?: number;
37
- subagent_usage?: RawTokenUsage[];
50
+ subagent_usage?: RawEntireTokenUsage[];
38
51
  }
39
52
 
40
- interface RawSummary {
53
+ interface RawEntireSummary {
41
54
  intent?: string;
42
55
  outcome?: string;
43
56
  learnings?: {
@@ -49,7 +62,7 @@ interface RawSummary {
49
62
  open_items?: string[];
50
63
  }
51
64
 
52
- interface RawAttribution {
65
+ interface RawEntireAttribution {
53
66
  agent_lines_added?: number;
54
67
  human_additions?: number;
55
68
  human_modifications?: number;
@@ -58,6 +71,62 @@ interface RawAttribution {
58
71
  agent_contribution?: number;
59
72
  }
60
73
 
74
+ // ─── Raw SessionLog JSON shapes (camelCase) ─────────────────────────
75
+
76
+ interface RawSessionLogMetadata {
77
+ cliVersion?: string;
78
+ checkpointID?: string;
79
+ sessionID?: string;
80
+ strategy?: string;
81
+ createdAt?: string;
82
+ branch?: string;
83
+ filesTouched?: string[];
84
+ agent?: string;
85
+ turnID?: string;
86
+ isTask?: boolean;
87
+ toolUseID?: string;
88
+ checkpointTranscriptStart?: number;
89
+ tokenUsage?: RawSessionLogTokenUsage;
90
+ summary?: RawSessionLogSummary;
91
+ initialAttribution?: RawSessionLogAttribution;
92
+ tasks?: Record<string, unknown>;
93
+ planEntries?: unknown[];
94
+ skillsUsed?: unknown[];
95
+ }
96
+
97
+ interface RawSessionLogTokenUsage {
98
+ inputTokens?: number;
99
+ cacheCreationTokens?: number;
100
+ cacheReadTokens?: number;
101
+ outputTokens?: number;
102
+ apiCallCount?: number;
103
+ subagentTokens?: RawSessionLogTokenUsage;
104
+ }
105
+
106
+ interface RawSessionLogSummary {
107
+ intent?: string;
108
+ outcome?: string;
109
+ learnings?: {
110
+ repo?: string[];
111
+ code?: Array<{ path: string; line?: number; endLine?: number; finding: string }>;
112
+ workflow?: string[];
113
+ };
114
+ friction?: string[];
115
+ openItems?: string[];
116
+ }
117
+
118
+ interface RawSessionLogAttribution {
119
+ calculatedAt?: string;
120
+ agentLines?: number;
121
+ humanAdded?: number;
122
+ humanModified?: number;
123
+ humanRemoved?: number;
124
+ totalCommitted?: number;
125
+ agentPercentage?: number;
126
+ }
127
+
128
+ // ─── Shared raw types for transcript parsing ────────────────────────
129
+
61
130
  interface RawTranscriptLine {
62
131
  type?: string;
63
132
  uuid?: string;
@@ -65,7 +134,7 @@ interface RawTranscriptLine {
65
134
  role?: string;
66
135
  content?: string | RawContentBlock[];
67
136
  };
68
- // Real Entire CLI uses these for tool_result lines
137
+ // Entire CLI uses these for top-level tool_result lines
69
138
  tool_use_id?: string;
70
139
  content?: string | RawContentBlock[];
71
140
  is_error?: boolean;
@@ -84,6 +153,7 @@ interface RawContentBlock {
84
153
  }
85
154
 
86
155
  interface RawCheckpointSummary {
156
+ // Entire format (snake_case)
87
157
  sessions?: Array<{
88
158
  metadata?: string;
89
159
  transcript?: string;
@@ -91,6 +161,9 @@ interface RawCheckpointSummary {
91
161
  content_hash?: string;
92
162
  prompt?: string;
93
163
  }>;
164
+ // SessionLog format may also use camelCase — same structure
165
+ checkpointID?: string;
166
+ checkpointsCount?: number;
94
167
  }
95
168
 
96
169
  // ─── Parser ─────────────────────────────────────────────────────────
@@ -102,9 +175,10 @@ export interface ParsedMetadata {
102
175
  summary?: SessionSummary;
103
176
  tokenUsage: TokenUsage;
104
177
  attribution?: Attribution;
178
+ format: CheckpointFormat;
105
179
  }
106
180
 
107
- export class EntireTranscriptParser {
181
+ export class CheckpointParser {
108
182
  /**
109
183
  * Parse a full session from its component files.
110
184
  */
@@ -113,6 +187,7 @@ export class EntireTranscriptParser {
113
187
  transcriptJsonl: string,
114
188
  checkpointPath: string,
115
189
  sessionIndex: string,
190
+ sourceBranch?: string,
116
191
  ): SessionRecord {
117
192
  const parsed = this.parseMetadata(metadataJson);
118
193
  const transcript = this.parseTranscript(transcriptJsonl);
@@ -126,7 +201,7 @@ export class EntireTranscriptParser {
126
201
  tokenUsage: parsed.tokenUsage,
127
202
  attribution: parsed.attribution,
128
203
  source: {
129
- branch: 'entire/checkpoints/v1',
204
+ branch: sourceBranch ?? 'sessionlog/checkpoints/v1',
130
205
  checkpointPath,
131
206
  sessionIndex,
132
207
  },
@@ -135,39 +210,22 @@ export class EntireTranscriptParser {
135
210
 
136
211
  /**
137
212
  * Parse per-session metadata.json (fast path — no transcript).
213
+ * Auto-detects Entire (snake_case) vs SessionLog (camelCase) format.
138
214
  */
139
215
  parseMetadata(metadataJson: string): ParsedMetadata {
140
- const raw: RawMetadata = JSON.parse(metadataJson);
141
-
142
- const tokenUsage = this.parseTokenUsage(raw.token_usage);
143
- const summary = raw.summary ? this.parseSummary(raw.summary) : undefined;
144
- const attribution = raw.initial_attribution
145
- ? this.parseAttribution(raw.initial_attribution)
146
- : undefined;
216
+ const raw = JSON.parse(metadataJson) as Record<string, unknown>;
217
+ const format = detectFormat(raw);
147
218
 
148
- return {
149
- sessionId: raw.session_id ?? '',
150
- checkpointId: raw.checkpoint_id ?? '',
151
- metadata: {
152
- cliVersion: raw.cli_version ?? '',
153
- strategy: raw.strategy === 'auto-commit' ? 'auto-commit' : 'manual-commit',
154
- createdAt: raw.created_at ? new Date(raw.created_at) : new Date(0),
155
- branch: raw.branch ?? '',
156
- agent: raw.agent ?? '',
157
- filesTouched: raw.files_touched ?? [],
158
- isTask: raw.is_task ?? false,
159
- toolUseId: raw.tool_use_id,
160
- checkpointTranscriptStart: raw.checkpoint_transcript_start ?? 0,
161
- },
162
- summary,
163
- tokenUsage,
164
- attribution,
165
- };
219
+ if (format === 'sessionlog') {
220
+ return this.parseSessionLogMetadata(raw as unknown as RawSessionLogMetadata);
221
+ }
222
+ return this.parseEntireMetadata(raw as unknown as RawEntireMetadata);
166
223
  }
167
224
 
168
225
  /**
169
226
  * Parse a JSONL transcript into structured messages.
170
227
  * Tolerant of malformed lines — skips them silently.
228
+ * Handles both Entire ("human") and SessionLog ("user") role types.
171
229
  */
172
230
  parseTranscript(jsonlContent: string): TranscriptMessage[] {
173
231
  const messages: TranscriptMessage[] = [];
@@ -216,21 +274,204 @@ export class EntireTranscriptParser {
216
274
  };
217
275
  }
218
276
 
219
- // ── Private helpers ──────────────────────────────────────────
277
+ // ── Entire format parsing (snake_case) ────────────────────────
278
+
279
+ private parseEntireMetadata(raw: RawEntireMetadata): ParsedMetadata {
280
+ const tokenUsage = this.parseEntireTokenUsage(raw.token_usage);
281
+ const summary = raw.summary ? this.parseEntireSummary(raw.summary) : undefined;
282
+ const attribution = raw.initial_attribution
283
+ ? this.parseEntireAttribution(raw.initial_attribution)
284
+ : undefined;
285
+
286
+ return {
287
+ sessionId: raw.session_id ?? '',
288
+ checkpointId: raw.checkpoint_id ?? '',
289
+ metadata: {
290
+ cliVersion: raw.cli_version ?? '',
291
+ strategy: raw.strategy === 'auto-commit' ? 'auto-commit' : 'manual-commit',
292
+ createdAt: raw.created_at ? new Date(raw.created_at) : new Date(0),
293
+ branch: raw.branch ?? '',
294
+ agent: raw.agent ?? '',
295
+ filesTouched: raw.files_touched ?? [],
296
+ isTask: raw.is_task ?? false,
297
+ toolUseId: raw.tool_use_id,
298
+ checkpointTranscriptStart: raw.checkpoint_transcript_start ?? 0,
299
+ },
300
+ summary,
301
+ tokenUsage,
302
+ attribution,
303
+ format: 'entire',
304
+ };
305
+ }
306
+
307
+ private parseEntireTokenUsage(raw?: RawEntireTokenUsage): TokenUsage {
308
+ if (!raw) {
309
+ return {
310
+ inputTokens: 0,
311
+ cacheCreationTokens: 0,
312
+ cacheReadTokens: 0,
313
+ outputTokens: 0,
314
+ apiCallCount: 0,
315
+ total: 0,
316
+ };
317
+ }
318
+
319
+ const inputTokens = raw.input_tokens ?? 0;
320
+ const cacheCreationTokens = raw.cache_creation_tokens ?? 0;
321
+ const cacheReadTokens = raw.cache_read_tokens ?? 0;
322
+ const outputTokens = raw.output_tokens ?? 0;
323
+ const apiCallCount = raw.api_call_count ?? 0;
324
+
325
+ const subagentUsage = raw.subagent_usage?.map((s) =>
326
+ this.parseEntireTokenUsage(s),
327
+ );
328
+
329
+ return {
330
+ inputTokens,
331
+ cacheCreationTokens,
332
+ cacheReadTokens,
333
+ outputTokens,
334
+ apiCallCount,
335
+ subagentUsage,
336
+ total: inputTokens + cacheCreationTokens + cacheReadTokens + outputTokens,
337
+ };
338
+ }
339
+
340
+ private parseEntireSummary(raw: RawEntireSummary): SessionSummary {
341
+ return {
342
+ intent: raw.intent ?? '',
343
+ outcome: raw.outcome ?? '',
344
+ learnings: {
345
+ repoPatterns: raw.learnings?.repo_patterns ?? [],
346
+ codeFindings: raw.learnings?.code_findings ?? [],
347
+ workflowPractices: raw.learnings?.workflow_practices ?? [],
348
+ },
349
+ frictionPoints: raw.friction_points ?? [],
350
+ openItems: raw.open_items ?? [],
351
+ };
352
+ }
353
+
354
+ private parseEntireAttribution(raw: RawEntireAttribution): Attribution {
355
+ return {
356
+ agentLinesAdded: raw.agent_lines_added ?? 0,
357
+ humanAdditions: raw.human_additions ?? 0,
358
+ humanModifications: raw.human_modifications ?? 0,
359
+ humanRemovals: raw.human_removals ?? 0,
360
+ totalCommittedLines: raw.total_committed_lines ?? 0,
361
+ agentContribution: raw.agent_contribution ?? 0,
362
+ };
363
+ }
364
+
365
+ // ── SessionLog format parsing (camelCase) ─────────────────────
366
+
367
+ private parseSessionLogMetadata(raw: RawSessionLogMetadata): ParsedMetadata {
368
+ const tokenUsage = this.parseSessionLogTokenUsage(raw.tokenUsage);
369
+ const summary = raw.summary ? this.parseSessionLogSummary(raw.summary) : undefined;
370
+ const attribution = raw.initialAttribution
371
+ ? this.parseSessionLogAttribution(raw.initialAttribution)
372
+ : undefined;
373
+
374
+ return {
375
+ sessionId: raw.sessionID ?? '',
376
+ checkpointId: raw.checkpointID ?? '',
377
+ metadata: {
378
+ cliVersion: raw.cliVersion ?? '',
379
+ strategy: raw.strategy === 'auto-commit' ? 'auto-commit' : 'manual-commit',
380
+ createdAt: raw.createdAt ? new Date(raw.createdAt) : new Date(0),
381
+ branch: raw.branch ?? '',
382
+ agent: raw.agent ?? '',
383
+ filesTouched: raw.filesTouched ?? [],
384
+ isTask: raw.isTask ?? false,
385
+ toolUseId: raw.toolUseID,
386
+ checkpointTranscriptStart: raw.checkpointTranscriptStart ?? 0,
387
+ },
388
+ summary,
389
+ tokenUsage,
390
+ attribution,
391
+ format: 'sessionlog',
392
+ };
393
+ }
394
+
395
+ private parseSessionLogTokenUsage(raw?: RawSessionLogTokenUsage): TokenUsage {
396
+ if (!raw) {
397
+ return {
398
+ inputTokens: 0,
399
+ cacheCreationTokens: 0,
400
+ cacheReadTokens: 0,
401
+ outputTokens: 0,
402
+ apiCallCount: 0,
403
+ total: 0,
404
+ };
405
+ }
406
+
407
+ const inputTokens = raw.inputTokens ?? 0;
408
+ const cacheCreationTokens = raw.cacheCreationTokens ?? 0;
409
+ const cacheReadTokens = raw.cacheReadTokens ?? 0;
410
+ const outputTokens = raw.outputTokens ?? 0;
411
+ const apiCallCount = raw.apiCallCount ?? 0;
412
+
413
+ // SessionLog uses single subagentTokens object; wrap in array for compatibility
414
+ const subagentUsage = raw.subagentTokens
415
+ ? [this.parseSessionLogTokenUsage(raw.subagentTokens)]
416
+ : undefined;
417
+
418
+ return {
419
+ inputTokens,
420
+ cacheCreationTokens,
421
+ cacheReadTokens,
422
+ outputTokens,
423
+ apiCallCount,
424
+ subagentUsage,
425
+ total: inputTokens + cacheCreationTokens + cacheReadTokens + outputTokens,
426
+ };
427
+ }
428
+
429
+ private parseSessionLogSummary(raw: RawSessionLogSummary): SessionSummary {
430
+ // SessionLog uses learnings.code as CodeLearning[] — normalize to string[]
431
+ const codeFindings = (raw.learnings?.code ?? []).map((cl) => {
432
+ const loc = cl.line ? `${cl.path}:${cl.line}` : cl.path;
433
+ return `${loc} - ${cl.finding}`;
434
+ });
435
+
436
+ return {
437
+ intent: raw.intent ?? '',
438
+ outcome: raw.outcome ?? '',
439
+ learnings: {
440
+ repoPatterns: raw.learnings?.repo ?? [],
441
+ codeFindings,
442
+ workflowPractices: raw.learnings?.workflow ?? [],
443
+ },
444
+ frictionPoints: raw.friction ?? [],
445
+ openItems: raw.openItems ?? [],
446
+ };
447
+ }
448
+
449
+ private parseSessionLogAttribution(raw: RawSessionLogAttribution): Attribution {
450
+ return {
451
+ agentLinesAdded: raw.agentLines ?? 0,
452
+ humanAdditions: raw.humanAdded ?? 0,
453
+ humanModifications: raw.humanModified ?? 0,
454
+ humanRemovals: raw.humanRemoved ?? 0,
455
+ totalCommittedLines: raw.totalCommitted ?? 0,
456
+ agentContribution: raw.agentPercentage ?? 0,
457
+ };
458
+ }
459
+
460
+ // ── Transcript parsing (shared — works for both formats) ──────
220
461
 
221
462
  private parseTranscriptLine(
222
463
  raw: RawTranscriptLine,
223
464
  lineIndex: number,
224
465
  ): TranscriptMessage | null {
225
466
  // Map Entire CLI's "human" → "user", keep "assistant" as-is.
226
- // Also support the role field nested under message.role.
467
+ // SessionLog always uses "user". Both handled here.
227
468
  let role: 'user' | 'assistant';
228
469
  if (raw.type === 'user' || raw.type === 'human') {
229
470
  role = 'user';
230
471
  } else if (raw.type === 'assistant') {
231
472
  role = 'assistant';
232
473
  } else if (raw.type === 'tool_result') {
233
- // Real Entire CLI emits tool_result as a top-level JSONL line.
474
+ // Entire CLI emits tool_result as a top-level JSONL line.
234
475
  // Wrap it as a user message containing a tool_result block.
235
476
  const toolResultBlock: ContentBlock = {
236
477
  type: 'tool_result',
@@ -255,7 +496,6 @@ export class EntireTranscriptParser {
255
496
  return null;
256
497
  }
257
498
 
258
- // UUID may not be present in real Entire CLI output
259
499
  const uuid = raw.uuid ?? `line-${lineIndex}`;
260
500
 
261
501
  const rawContent = raw.message?.content;
@@ -297,64 +537,6 @@ export class EntireTranscriptParser {
297
537
  }
298
538
  }
299
539
 
300
- private parseTokenUsage(raw?: RawTokenUsage): TokenUsage {
301
- if (!raw) {
302
- return {
303
- inputTokens: 0,
304
- cacheCreationTokens: 0,
305
- cacheReadTokens: 0,
306
- outputTokens: 0,
307
- apiCallCount: 0,
308
- total: 0,
309
- };
310
- }
311
-
312
- const inputTokens = raw.input_tokens ?? 0;
313
- const cacheCreationTokens = raw.cache_creation_tokens ?? 0;
314
- const cacheReadTokens = raw.cache_read_tokens ?? 0;
315
- const outputTokens = raw.output_tokens ?? 0;
316
- const apiCallCount = raw.api_call_count ?? 0;
317
-
318
- const subagentUsage = raw.subagent_usage?.map((s) =>
319
- this.parseTokenUsage(s),
320
- );
321
-
322
- return {
323
- inputTokens,
324
- cacheCreationTokens,
325
- cacheReadTokens,
326
- outputTokens,
327
- apiCallCount,
328
- subagentUsage,
329
- total: inputTokens + cacheCreationTokens + cacheReadTokens + outputTokens,
330
- };
331
- }
332
-
333
- private parseSummary(raw: RawSummary): SessionSummary {
334
- return {
335
- intent: raw.intent ?? '',
336
- outcome: raw.outcome ?? '',
337
- learnings: {
338
- repoPatterns: raw.learnings?.repo_patterns ?? [],
339
- codeFindings: raw.learnings?.code_findings ?? [],
340
- workflowPractices: raw.learnings?.workflow_practices ?? [],
341
- },
342
- frictionPoints: raw.friction_points ?? [],
343
- openItems: raw.open_items ?? [],
344
- };
345
- }
346
-
347
- private parseAttribution(raw: RawAttribution): Attribution {
348
- return {
349
- agentLinesAdded: raw.agent_lines_added ?? 0,
350
- humanAdditions: raw.human_additions ?? 0,
351
- humanModifications: raw.human_modifications ?? 0,
352
- humanRemovals: raw.human_removals ?? 0,
353
- totalCommittedLines: raw.total_committed_lines ?? 0,
354
- agentContribution: raw.agent_contribution ?? 0,
355
- };
356
- }
357
-
358
540
  private checkpointIdFromPath(path: string): string {
359
541
  // Path is "<shard>/<rest>" → checkpoint ID is shard + rest
360
542
  const parts = path.split('/');
@@ -1,7 +1,7 @@
1
1
  import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
- import { EntireGitReader } from './git-reader.js';
4
- import { EntireTranscriptParser } from './parser.js';
3
+ import { CheckpointGitReader } from './git-reader.js';
4
+ import { CheckpointParser } from './parser.js';
5
5
  import type {
6
6
  SessionRecord,
7
7
  CheckpointRef,
@@ -12,10 +12,12 @@ import type {
12
12
  } from './types.js';
13
13
 
14
14
  // ─── SessionBank ────────────────────────────────────────────────────
15
- // Main facade for reading Entire CLI checkpoint data from the
16
- // orphan branch. Read-only — never writes to the orphan branch.
15
+ // Main facade for reading SessionLog checkpoint data from orphan
16
+ // branches. Read-only.
17
17
  // ─────────────────────────────────────────────────────────────────────
18
18
 
19
+ const DEFAULT_BRANCH = 'sessionlog/checkpoints/v1';
20
+
19
21
  interface CachedSession {
20
22
  record: SessionRecord;
21
23
  hasTranscript: boolean;
@@ -27,13 +29,16 @@ interface ProcessingState {
27
29
  }
28
30
 
29
31
  export class SessionBank {
30
- private reader: EntireGitReader;
31
- private parser: EntireTranscriptParser;
32
+ private reader: CheckpointGitReader;
33
+ private parser: CheckpointParser;
32
34
  private stateDir: string;
33
35
  private cacheEnabled: boolean;
36
+ private repoPath: string;
37
+ private explicitBranch: string | undefined;
34
38
 
35
39
  private available = false;
36
40
  private initialized = false;
41
+ private detectedBranch: string = '';
37
42
 
38
43
  // Cache
39
44
  private cachedBranchHead: string | null = null;
@@ -47,19 +52,29 @@ export class SessionBank {
47
52
  };
48
53
 
49
54
  constructor(options?: SessionBankOptions) {
50
- const repoPath = options?.repoPath ?? process.cwd();
51
- const branch = options?.branch ?? 'entire/checkpoints/v1';
52
- this.stateDir = options?.stateDir ?? join(repoPath, '.atlas', 'session-bank');
55
+ this.repoPath = options?.repoPath ?? process.cwd();
56
+ this.explicitBranch = options?.branch;
57
+ this.stateDir = options?.stateDir ?? join(this.repoPath, '.atlas', 'session-bank');
53
58
  this.cacheEnabled = options?.cache ?? true;
54
59
 
55
- this.reader = new EntireGitReader({ repoPath, branch });
56
- this.parser = new EntireTranscriptParser();
60
+ // Initial reader with explicit or default branch
61
+ const branch = this.explicitBranch ?? DEFAULT_BRANCH;
62
+ this.reader = new CheckpointGitReader({
63
+ repoPath: this.repoPath,
64
+ branch,
65
+ trailerKeys: options?.trailerKeys,
66
+ });
67
+ this.parser = new CheckpointParser();
57
68
  }
58
69
 
59
70
  // ── Lifecycle ──────────────────────────────────────────────────
60
71
 
61
72
  async init(): Promise<void> {
62
73
  this.available = await this.reader.branchExists();
74
+ if (this.available) {
75
+ this.detectedBranch = this.reader.branch;
76
+ }
77
+
63
78
  await this.loadProcessingState();
64
79
  if (this.available) {
65
80
  this.cachedBranchHead = await this.reader.getBranchHead();
@@ -71,6 +86,11 @@ export class SessionBank {
71
86
  return this.available;
72
87
  }
73
88
 
89
+ /** The orphan branch name that was detected or configured. */
90
+ getBranch(): string {
91
+ return this.detectedBranch;
92
+ }
93
+
74
94
  async close(): Promise<void> {
75
95
  await this.saveProcessingState();
76
96
  }
@@ -140,7 +160,7 @@ export class SessionBank {
140
160
  tokenUsage: parsed.tokenUsage,
141
161
  attribution: parsed.attribution,
142
162
  source: {
143
- branch: 'entire/checkpoints/v1',
163
+ branch: this.detectedBranch,
144
164
  checkpointPath: ref.path,
145
165
  sessionIndex: idx,
146
166
  },
@@ -245,6 +265,7 @@ export class SessionBank {
245
265
  transcriptJsonl ?? '',
246
266
  path,
247
267
  idx,
268
+ this.detectedBranch,
248
269
  );
249
270
  sessions.push(record);
250
271
  } catch {