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,187 +1,376 @@
1
1
  /**
2
- * End-to-end integration test: SessionBank + EntireTrajectorySource
3
- * against REAL Entire CLI checkpoint data on the orphan branch.
2
+ * End-to-end integration test: SessionBank with both Entire CLI and
3
+ * SessionLog checkpoint formats, including auto-detection.
4
4
  *
5
- * This test reads data captured by the actual Entire CLI v0.4.6
6
- * (not fixtures) from the `entire/checkpoints/v1` orphan branch.
5
+ * Creates temp git repos with orphan branches containing fixture data.
7
6
  */
8
7
  import { describe, it, expect, beforeAll, afterAll } from 'vitest';
8
+ import { mkdtemp, rm, readFile } from 'node:fs/promises';
9
+ import { tmpdir } from 'node:os';
10
+ import { join } from 'node:path';
11
+ import { execFileSync } from 'node:child_process';
9
12
  import { SessionBank } from '../../src/session-bank/session-bank';
10
- import { EntireTrajectorySource } from '../../src/learning/trajectory-sources/entire';
13
+ import { SessionTrajectorySource } from '../../src/learning/trajectory-sources/entire';
11
14
 
12
- describe('Entire CLI E2E Integration', () => {
13
- let bank: SessionBank;
14
- let source: EntireTrajectorySource;
15
+ const FIXTURES = join(import.meta.dirname, '..', 'session-bank', 'fixtures');
16
+
17
+ function git(cwd: string, args: string[]): string {
18
+ return execFileSync('git', ['-c', 'commit.gpgsign=false', ...args], {
19
+ cwd,
20
+ encoding: 'utf-8',
21
+ env: {
22
+ ...process.env,
23
+ GIT_AUTHOR_NAME: 'Test',
24
+ GIT_AUTHOR_EMAIL: 'test@test.com',
25
+ GIT_COMMITTER_NAME: 'Test',
26
+ GIT_COMMITTER_EMAIL: 'test@test.com',
27
+ },
28
+ }).trim();
29
+ }
30
+
31
+ function hashObject(cwd: string, content: string): string {
32
+ return execFileSync('git', ['hash-object', '-w', '--stdin'], {
33
+ cwd,
34
+ input: content,
35
+ encoding: 'utf-8',
36
+ }).trim();
37
+ }
38
+
39
+ function mktree(cwd: string, entries: string): string {
40
+ return execFileSync('git', ['mktree'], {
41
+ cwd,
42
+ input: entries,
43
+ encoding: 'utf-8',
44
+ }).trim();
45
+ }
46
+
47
+ function commitTree(cwd: string, treeHash: string, message: string): string {
48
+ return execFileSync(
49
+ 'git',
50
+ ['-c', 'commit.gpgsign=false', 'commit-tree', treeHash, '-m', message],
51
+ {
52
+ cwd,
53
+ encoding: 'utf-8',
54
+ env: {
55
+ ...process.env,
56
+ GIT_AUTHOR_NAME: 'Test',
57
+ GIT_AUTHOR_EMAIL: 'test@test.com',
58
+ GIT_COMMITTER_NAME: 'Test',
59
+ GIT_COMMITTER_EMAIL: 'test@test.com',
60
+ },
61
+ },
62
+ ).trim();
63
+ }
64
+
65
+ /** Create an orphan branch with fixture data. */
66
+ async function addOrphanBranch(
67
+ tmpDir: string,
68
+ branchName: string,
69
+ opts: {
70
+ metadataFixture: string; // path relative to FIXTURES
71
+ transcriptFixture: string;
72
+ rootMetaFixture: string;
73
+ shard: string; // e.g. "a3"
74
+ rest: string; // e.g. "b2c4d5e6f7"
75
+ sessionIndex: string; // e.g. "0" or "1"
76
+ },
77
+ ): Promise<void> {
78
+ const metaContent = await readFile(
79
+ join(FIXTURES, ...opts.metadataFixture.split('/')),
80
+ 'utf-8',
81
+ );
82
+ const transcriptContent = await readFile(
83
+ join(FIXTURES, ...opts.transcriptFixture.split('/')),
84
+ 'utf-8',
85
+ );
86
+ const rootMetaContent = await readFile(
87
+ join(FIXTURES, opts.rootMetaFixture),
88
+ 'utf-8',
89
+ );
90
+
91
+ const filler = hashObject(tmpDir, 'filler');
92
+ const metaHash = hashObject(tmpDir, metaContent);
93
+ const transHash = hashObject(tmpDir, transcriptContent);
94
+ const rootMetaHash = hashObject(tmpDir, rootMetaContent);
95
+
96
+ const sessionTree = mktree(
97
+ tmpDir,
98
+ [
99
+ `100644 blob ${filler}\tcontent_hash.txt`,
100
+ `100644 blob ${filler}\tcontext.md`,
101
+ `100644 blob ${transHash}\tfull.jsonl`,
102
+ `100644 blob ${metaHash}\tmetadata.json`,
103
+ `100644 blob ${filler}\tprompt.txt`,
104
+ ].join('\n') + '\n',
105
+ );
106
+
107
+ const checkpointTree = mktree(
108
+ tmpDir,
109
+ [
110
+ `040000 tree ${sessionTree}\t${opts.sessionIndex}`,
111
+ `100644 blob ${rootMetaHash}\tmetadata.json`,
112
+ ].join('\n') + '\n',
113
+ );
114
+
115
+ const shardTree = mktree(
116
+ tmpDir,
117
+ `040000 tree ${checkpointTree}\t${opts.rest}\n`,
118
+ );
119
+
120
+ const rootTree = mktree(tmpDir, `040000 tree ${shardTree}\t${opts.shard}\n`);
121
+
122
+ const orphanCommit = commitTree(tmpDir, rootTree, `checkpoint on ${branchName}`);
123
+ git(tmpDir, ['update-ref', `refs/heads/${branchName}`, orphanCommit]);
124
+ }
125
+
126
+ describe('Session Bank E2E', () => {
127
+ let tmpDir: string;
15
128
 
16
129
  beforeAll(async () => {
17
- bank = new SessionBank({
18
- repoPath: process.cwd(),
19
- branch: 'entire/checkpoints/v1',
20
- stateDir: '/tmp/atlas-e2e-test-state',
21
- cache: true,
130
+ tmpDir = await mkdtemp(join(tmpdir(), 'e2e-session-bank-'));
131
+
132
+ // Initialize repo
133
+ git(tmpDir, ['init']);
134
+ const emptyTree = git(tmpDir, ['hash-object', '-t', 'tree', '/dev/null']);
135
+ const mainCommit = commitTree(tmpDir, emptyTree, 'initial');
136
+ git(tmpDir, ['update-ref', 'refs/heads/master', mainCommit]);
137
+
138
+ // Create Entire-format orphan branch
139
+ await addOrphanBranch(tmpDir, 'entire/checkpoints/v1', {
140
+ metadataFixture: 'simple-session/metadata.json',
141
+ transcriptFixture: 'simple-session/full.jsonl',
142
+ rootMetaFixture: 'root-metadata.json',
143
+ shard: 'a3',
144
+ rest: 'b2c4d5e6f7',
145
+ sessionIndex: '0',
22
146
  });
23
147
 
24
- await bank.init();
25
- source = new EntireTrajectorySource(bank);
148
+ // Create SessionLog-format orphan branch
149
+ await addOrphanBranch(tmpDir, 'sessionlog/checkpoints/v1', {
150
+ metadataFixture: 'sessionlog-session/metadata.json',
151
+ transcriptFixture: 'sessionlog-session/full.jsonl',
152
+ rootMetaFixture: 'sessionlog-root-metadata.json',
153
+ shard: 'c4',
154
+ rest: 'd5e6f7a8b9',
155
+ sessionIndex: '1',
156
+ });
26
157
  });
27
158
 
28
159
  afterAll(async () => {
29
- if (bank) {
30
- await bank.close();
31
- }
160
+ if (tmpDir) await rm(tmpDir, { recursive: true, force: true });
32
161
  });
33
162
 
34
- describe('SessionBank against real Entire data', () => {
35
- it('should detect the orphan branch exists', () => {
36
- expect(bank.isAvailable()).toBe(true);
37
- });
163
+ // ─── Entire CLI format ──────────────────────────────────────
38
164
 
39
- it('should list checkpoints from real data', async () => {
40
- const checkpoints = await bank.listCheckpoints();
41
- expect(checkpoints.length).toBeGreaterThanOrEqual(1);
165
+ describe('Entire CLI format (explicit branch)', () => {
166
+ it('should discover sessions from Entire branch', async () => {
167
+ const bank = new SessionBank({
168
+ repoPath: tmpDir,
169
+ branch: 'entire/checkpoints/v1',
170
+ stateDir: join(tmpDir, '.state-entire'),
171
+ });
172
+ await bank.init();
42
173
 
43
- const checkpoint = checkpoints[0];
44
- expect(checkpoint.checkpointId).toBeTruthy();
45
- expect(checkpoint.path).toBeTruthy();
46
- expect(checkpoint.sessionCount).toBeGreaterThanOrEqual(1);
47
- });
174
+ expect(bank.isAvailable()).toBe(true);
175
+ expect(bank.getBranch()).toBe('entire/checkpoints/v1');
48
176
 
49
- it('should discover sessions with metadata', async () => {
50
177
  const sessions = await bank.discover();
51
178
  expect(sessions.length).toBeGreaterThanOrEqual(1);
179
+ expect(sessions[0].sessionId).toContain('2026-01-08');
180
+ expect(sessions[0].metadata.agent).toBe('Claude Code');
52
181
 
53
- const session = sessions[0];
54
- expect(session.sessionId).toBe('test-session-e2e');
55
- expect(session.metadata.agent).toBe('Claude Code');
56
- expect(session.metadata.strategy).toBe('manual-commit');
57
- expect(session.metadata.filesTouched).toContain('src/e2e-test-marker.ts');
58
- expect(session.metadata.branch).toBe('claude/session-bank-design-41pv3');
182
+ await bank.close();
59
183
  });
60
184
 
61
- it('should query sessions and load transcripts', async () => {
185
+ it('should query and load Entire transcripts', async () => {
186
+ const bank = new SessionBank({
187
+ repoPath: tmpDir,
188
+ branch: 'entire/checkpoints/v1',
189
+ stateDir: join(tmpDir, '.state-entire-q'),
190
+ });
191
+ await bank.init();
192
+
62
193
  const result = await bank.query();
63
194
  expect(result.sessions.length).toBeGreaterThanOrEqual(1);
64
- expect(result.total).toBeGreaterThanOrEqual(1);
65
-
66
- const session = result.sessions[0];
67
- // Transcript should be loaded with actual messages
68
- expect(session.transcript).toBeDefined();
69
- expect(session.transcript.length).toBeGreaterThan(0);
195
+ expect(result.sessions[0].transcript.length).toBeGreaterThan(0);
70
196
 
71
- // Check we have user messages (from "human" type in Entire JSONL)
72
- const userMessages = session.transcript.filter(
73
- (m) => m.role === 'user'
197
+ const userMessages = result.sessions[0].transcript.filter(
198
+ (m) => m.role === 'user',
74
199
  );
75
200
  expect(userMessages.length).toBeGreaterThan(0);
76
201
 
77
- // Check we have assistant messages
78
- const assistantMessages = session.transcript.filter(
79
- (m) => m.role === 'assistant'
80
- );
81
- expect(assistantMessages.length).toBeGreaterThan(0);
202
+ await bank.close();
82
203
  });
83
204
 
84
- it('should filter sessions by branch', async () => {
85
- const result = await bank.query({
86
- branch: 'claude/session-bank-design-41pv3',
205
+ it('should synthesize Entire sessions into trajectories', async () => {
206
+ const bank = new SessionBank({
207
+ repoPath: tmpDir,
208
+ branch: 'entire/checkpoints/v1',
209
+ stateDir: join(tmpDir, '.state-entire-t'),
87
210
  });
88
- expect(result.sessions.length).toBeGreaterThanOrEqual(1);
211
+ await bank.init();
89
212
 
90
- const noResults = await bank.query({
91
- branch: 'nonexistent-branch',
92
- });
93
- expect(noResults.sessions.length).toBe(0);
213
+ const source = new SessionTrajectorySource(bank);
214
+ const items = await source.load();
215
+ expect(items.length).toBeGreaterThanOrEqual(1);
216
+
217
+ const { trajectory } = items[0];
218
+ expect(trajectory.id).toContain('sessionlog-');
219
+ expect(trajectory.metadata.source).toBe('sessionlog');
220
+ expect(trajectory.task.description).toBeTruthy();
221
+ expect(trajectory.steps.length).toBeGreaterThan(0);
222
+
223
+ await bank.close();
94
224
  });
225
+ });
226
+
227
+ // ─── SessionLog format ──────────────────────────────────────
95
228
 
96
- it('should search across transcript content', async () => {
97
- const result = await bank.query({
98
- search: 'hello world',
229
+ describe('SessionLog format (explicit branch)', () => {
230
+ it('should discover sessions from SessionLog branch', async () => {
231
+ const bank = new SessionBank({
232
+ repoPath: tmpDir,
233
+ branch: 'sessionlog/checkpoints/v1',
234
+ stateDir: join(tmpDir, '.state-sl'),
99
235
  });
100
- expect(result.sessions.length).toBeGreaterThanOrEqual(1);
101
- });
236
+ await bank.init();
102
237
 
103
- it('should count sessions', async () => {
104
- const count = await bank.count();
105
- expect(count).toBeGreaterThanOrEqual(1);
106
- });
238
+ expect(bank.isAvailable()).toBe(true);
239
+ expect(bank.getBranch()).toBe('sessionlog/checkpoints/v1');
240
+
241
+ const sessions = await bank.discover();
242
+ expect(sessions.length).toBeGreaterThanOrEqual(1);
243
+ expect(sessions[0].sessionId).toContain('2026-02-15');
244
+ expect(sessions[0].metadata.agent).toBe('Claude Code');
107
245
 
108
- it('should find session by ID', async () => {
109
- const session = await bank.getBySessionId('test-session-e2e');
110
- expect(session).toBeDefined();
111
- expect(session!.sessionId).toBe('test-session-e2e');
246
+ await bank.close();
112
247
  });
113
- });
114
248
 
115
- describe('EntireTrajectorySource against real data', () => {
116
- it('should count available trajectories', async () => {
117
- const count = await source.count();
118
- expect(count).toBeGreaterThanOrEqual(1);
249
+ it('should query and load SessionLog transcripts', async () => {
250
+ const bank = new SessionBank({
251
+ repoPath: tmpDir,
252
+ branch: 'sessionlog/checkpoints/v1',
253
+ stateDir: join(tmpDir, '.state-sl-q'),
254
+ });
255
+ await bank.init();
256
+
257
+ const result = await bank.query();
258
+ expect(result.sessions.length).toBeGreaterThanOrEqual(1);
259
+ expect(result.sessions[0].transcript.length).toBeGreaterThan(0);
260
+
261
+ await bank.close();
119
262
  });
120
263
 
121
- it('should load and synthesize trajectories from real data', async () => {
264
+ it('should synthesize SessionLog sessions into trajectories', async () => {
265
+ const bank = new SessionBank({
266
+ repoPath: tmpDir,
267
+ branch: 'sessionlog/checkpoints/v1',
268
+ stateDir: join(tmpDir, '.state-sl-t'),
269
+ });
270
+ await bank.init();
271
+
272
+ const source = new SessionTrajectorySource(bank);
122
273
  const items = await source.load();
123
274
  expect(items.length).toBeGreaterThanOrEqual(1);
124
275
 
125
- // load() returns TrajectoryWithAnalysis[]
126
276
  const { trajectory } = items[0];
127
- expect(trajectory.id).toContain('entire-');
128
- expect(trajectory.task).toBeDefined();
277
+ expect(trajectory.id).toContain('sessionlog-');
278
+ expect(trajectory.metadata.source).toBe('sessionlog');
129
279
  expect(trajectory.task.description).toBeTruthy();
130
- expect(trajectory.steps).toBeDefined();
131
- expect(trajectory.outcome).toBeDefined();
132
- expect(trajectory.metadata).toBeDefined();
133
-
134
- // Metadata should have Entire provenance
135
- expect(trajectory.metadata?.source).toBe('entire');
136
- expect(trajectory.metadata?.checkpointId).toBeTruthy();
137
- expect(trajectory.metadata?.sessionId).toBe('test-session-e2e');
280
+
281
+ await bank.close();
138
282
  });
283
+ });
139
284
 
140
- it('should extract steps from real tool_use blocks', async () => {
141
- const items = await source.load();
142
- const { trajectory } = items[0];
285
+ // ─── Default branch ─────────────────────────────────────────
143
286
 
144
- // Our transcript had a Write tool_use
145
- const writeStep = trajectory.steps.find(
146
- (s) => s.action && s.action.includes('Write')
147
- );
148
- expect(writeStep).toBeDefined();
149
- expect(writeStep!.action).toContain('Write');
150
- });
287
+ describe('default branch', () => {
288
+ it('should use sessionlog/checkpoints/v1 by default', async () => {
289
+ const bank = new SessionBank({
290
+ repoPath: tmpDir,
291
+ stateDir: join(tmpDir, '.state-default'),
292
+ });
293
+ await bank.init();
151
294
 
152
- it('should infer domain from files touched', async () => {
153
- const items = await source.load();
154
- const { trajectory } = items[0];
295
+ expect(bank.isAvailable()).toBe(true);
296
+ expect(bank.getBranch()).toBe('sessionlog/checkpoints/v1');
297
+
298
+ const sessions = await bank.discover();
299
+ expect(sessions.length).toBeGreaterThanOrEqual(1);
300
+ expect(sessions[0].sessionId).toContain('2026-02-15');
155
301
 
156
- // Files touched include .ts files, so domain should be typescript
157
- expect(trajectory.task.domain).toBe('typescript');
302
+ await bank.close();
158
303
  });
159
304
 
160
- it('should determine outcome from real data', async () => {
161
- const items = await source.load();
162
- const { trajectory } = items[0];
305
+ it('should report unavailable when default branch missing', async () => {
306
+ // Create a repo with only an Entire branch (no sessionlog)
307
+ const noSl = await mkdtemp(join(tmpdir(), 'e2e-no-sl-'));
308
+ git(noSl, ['init']);
309
+ const emptyTree = git(noSl, [
310
+ 'hash-object',
311
+ '-t',
312
+ 'tree',
313
+ '/dev/null',
314
+ ]);
315
+ const mainCommit = commitTree(noSl, emptyTree, 'initial');
316
+ git(noSl, ['update-ref', 'refs/heads/master', mainCommit]);
317
+
318
+ await addOrphanBranch(noSl, 'entire/checkpoints/v1', {
319
+ metadataFixture: 'simple-session/metadata.json',
320
+ transcriptFixture: 'simple-session/full.jsonl',
321
+ rootMetaFixture: 'root-metadata.json',
322
+ shard: 'a3',
323
+ rest: 'b2c4d5e6f7',
324
+ sessionIndex: '0',
325
+ });
326
+
327
+ // No explicit branch — defaults to sessionlog, which doesn't exist
328
+ const bank = new SessionBank({
329
+ repoPath: noSl,
330
+ stateDir: join(noSl, '.state'),
331
+ });
332
+ await bank.init();
163
333
 
164
- expect(trajectory.outcome.success).toBeDefined();
165
- expect(typeof trajectory.outcome.success).toBe('boolean');
334
+ expect(bank.isAvailable()).toBe(false);
335
+
336
+ await bank.close();
337
+ await rm(noSl, { recursive: true, force: true });
166
338
  });
167
339
 
168
- it('should produce valid Trajectory shape', async () => {
169
- const items = await source.load();
170
- const { trajectory } = items[0];
340
+ it('should use explicit entire branch when configured', async () => {
341
+ // Same repo explicitly request Entire branch
342
+ const entireOnly = await mkdtemp(join(tmpdir(), 'e2e-entire-explicit-'));
343
+ git(entireOnly, ['init']);
344
+ const emptyTree = git(entireOnly, [
345
+ 'hash-object',
346
+ '-t',
347
+ 'tree',
348
+ '/dev/null',
349
+ ]);
350
+ const mainCommit = commitTree(entireOnly, emptyTree, 'initial');
351
+ git(entireOnly, ['update-ref', 'refs/heads/master', mainCommit]);
352
+
353
+ await addOrphanBranch(entireOnly, 'entire/checkpoints/v1', {
354
+ metadataFixture: 'simple-session/metadata.json',
355
+ transcriptFixture: 'simple-session/full.jsonl',
356
+ rootMetaFixture: 'root-metadata.json',
357
+ shard: 'a3',
358
+ rest: 'b2c4d5e6f7',
359
+ sessionIndex: '0',
360
+ });
171
361
 
172
- expect(trajectory).toMatchObject({
173
- id: expect.stringContaining('entire-'),
174
- task: expect.objectContaining({
175
- domain: expect.any(String),
176
- description: expect.any(String),
177
- }),
178
- outcome: expect.objectContaining({
179
- success: expect.any(Boolean),
180
- }),
181
- metadata: expect.objectContaining({
182
- source: 'entire',
183
- }),
362
+ const bank = new SessionBank({
363
+ repoPath: entireOnly,
364
+ branch: 'entire/checkpoints/v1',
365
+ stateDir: join(entireOnly, '.state'),
184
366
  });
367
+ await bank.init();
368
+
369
+ expect(bank.isAvailable()).toBe(true);
370
+ expect(bank.getBranch()).toBe('entire/checkpoints/v1');
371
+
372
+ await bank.close();
373
+ await rm(entireOnly, { recursive: true, force: true });
185
374
  });
186
375
  });
187
376
  });